/ Hex Artifact Content
Login

Artifact 554368a941e89bf556d653d72eac4ceb8c5a30ef:


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 44 45 53 43 20 4c 49 4d 49 54 20 31 22 2c  ) DESC LIMIT 1",
35c0: 0a 0a 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68  ../* Estimate th
35d0: 65 20 75 70 70 65 72 20 6c 69 6d 69 74 20 6f 6e  e upper limit on
35e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
35f0: 65 61 66 20 6e 6f 64 65 73 20 69 6e 20 61 20 6e  eaf nodes in a n
3600: 65 77 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 63 72  ew segment.** cr
3610: 65 61 74 65 64 20 62 79 20 6d 65 72 67 69 6e 67  eated by merging
3620: 20 74 68 65 20 6f 6c 64 65 73 74 20 3a 32 20 73   the oldest :2 s
3630: 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 61 62 73  egments from abs
3640: 6f 6c 75 74 65 20 6c 65 76 65 6c 20 3a 31 2e 20  olute level :1. 
3650: 53 65 65 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  See .** function
3660: 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 63 72   sqlite3Fts3Incr
3670: 6d 65 72 67 65 28 29 20 66 6f 72 20 64 65 74 61  merge() for deta
3680: 69 6c 73 2e 20 20 2a 2f 0a 2f 2a 20 32 39 20 2a  ils.  */./* 29 *
3690: 2f 20 22 53 45 4c 45 43 54 20 32 20 2a 20 74 6f  / "SELECT 2 * to
36a0: 74 61 6c 28 31 20 2b 20 6c 65 61 76 65 73 5f 65  tal(1 + leaves_e
36b0: 6e 64 5f 62 6c 6f 63 6b 20 2d 20 73 74 61 72 74  nd_block - start
36c0: 5f 62 6c 6f 63 6b 29 20 22 0a 20 20 20 20 20 20  _block) ".      
36d0: 20 20 20 22 20 20 46 52 4f 4d 20 25 51 2e 27 25     "  FROM %Q.'%
36e0: 71 5f 73 65 67 64 69 72 27 20 57 48 45 52 45 20  q_segdir' WHERE 
36f0: 6c 65 76 65 6c 20 3d 20 3f 20 41 4e 44 20 69 64  level = ? AND id
3700: 78 20 3c 20 3f 22 2c 0a 0a 2f 2a 20 53 51 4c 5f  x < ?",../* SQL_
3710: 44 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 45 4e  DELETE_SEGDIR_EN
3720: 54 52 59 0a 2a 2a 20 20 20 44 65 6c 65 74 65 20  TRY.**   Delete 
3730: 74 68 65 20 25 5f 73 65 67 64 69 72 20 65 6e 74  the %_segdir ent
3740: 72 79 20 6f 6e 20 61 62 73 6f 6c 75 74 65 20 6c  ry on absolute l
3750: 65 76 65 6c 20 3a 31 20 77 69 74 68 20 69 6e 64  evel :1 with ind
3760: 65 78 20 3a 32 2e 20 20 2a 2f 0a 2f 2a 20 33 30  ex :2.  */./* 30
3770: 20 2a 2f 20 22 44 45 4c 45 54 45 20 46 52 4f 4d   */ "DELETE FROM
3780: 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20   %Q.'%q_segdir' 
3790: 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f 20  WHERE level = ? 
37a0: 41 4e 44 20 69 64 78 20 3d 20 3f 22 2c 0a 0a 2f  AND idx = ?",../
37b0: 2a 20 53 51 4c 5f 53 48 49 46 54 5f 53 45 47 44  * SQL_SHIFT_SEGD
37c0: 49 52 5f 45 4e 54 52 59 0a 2a 2a 20 20 20 4d 6f  IR_ENTRY.**   Mo
37d0: 64 69 66 79 20 74 68 65 20 69 64 78 20 76 61 6c  dify the idx val
37e0: 75 65 20 66 6f 72 20 74 68 65 20 73 65 67 6d 65  ue for the segme
37f0: 6e 74 20 77 69 74 68 20 69 64 78 3d 3a 33 20 6f  nt with idx=:3 o
3800: 6e 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c  n absolute level
3810: 20 3a 32 0a 2a 2a 20 20 20 74 6f 20 3a 31 2e 20   :2.**   to :1. 
3820: 20 2a 2f 0a 2f 2a 20 33 31 20 2a 2f 20 22 55 50   */./* 31 */ "UP
3830: 44 41 54 45 20 25 51 2e 27 25 71 5f 73 65 67 64  DATE %Q.'%q_segd
3840: 69 72 27 20 53 45 54 20 69 64 78 20 3d 20 3f 20  ir' SET idx = ? 
3850: 57 48 45 52 45 20 6c 65 76 65 6c 3d 3f 20 41 4e  WHERE level=? AN
3860: 44 20 69 64 78 3d 3f 22 2c 0a 0a 2f 2a 20 53 51  D idx=?",../* SQ
3870: 4c 5f 53 45 4c 45 43 54 5f 53 45 47 44 49 52 0a  L_SELECT_SEGDIR.
3880: 2a 2a 20 20 20 52 65 61 64 20 61 20 73 69 6e 67  **   Read a sing
3890: 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  le entry from th
38a0: 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65  e %_segdir table
38b0: 2e 20 54 68 65 20 65 6e 74 72 79 20 66 72 6f 6d  . The entry from
38c0: 20 61 62 73 6f 6c 75 74 65 20 0a 2a 2a 20 20 20   absolute .**   
38d0: 6c 65 76 65 6c 20 3a 31 20 77 69 74 68 20 69 6e  level :1 with in
38e0: 64 65 78 20 76 61 6c 75 65 20 3a 32 2e 20 20 2a  dex value :2.  *
38f0: 2f 0a 2f 2a 20 33 32 20 2a 2f 20 20 22 53 45 4c  /./* 32 */  "SEL
3900: 45 43 54 20 69 64 78 2c 20 73 74 61 72 74 5f 62  ECT idx, start_b
3910: 6c 6f 63 6b 2c 20 6c 65 61 76 65 73 5f 65 6e 64  lock, leaves_end
3920: 5f 62 6c 6f 63 6b 2c 20 65 6e 64 5f 62 6c 6f 63  _block, end_bloc
3930: 6b 2c 20 72 6f 6f 74 20 22 0a 20 20 20 20 20 20  k, root ".      
3940: 20 20 20 20 20 20 22 46 52 4f 4d 20 25 51 2e 27        "FROM %Q.'
3950: 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52 45  %q_segdir' WHERE
3960: 20 6c 65 76 65 6c 20 3d 20 3f 20 41 4e 44 20 69   level = ? AND i
3970: 64 78 20 3d 20 3f 22 2c 0a 0a 2f 2a 20 53 51 4c  dx = ?",../* SQL
3980: 5f 43 48 4f 4d 50 5f 53 45 47 44 49 52 0a 2a 2a  _CHOMP_SEGDIR.**
3990: 20 20 20 55 70 64 61 74 65 20 74 68 65 20 73 74     Update the st
39a0: 61 72 74 5f 62 6c 6f 63 6b 20 28 3a 31 29 20 61  art_block (:1) a
39b0: 6e 64 20 72 6f 6f 74 20 28 3a 32 29 20 66 69 65  nd root (:2) fie
39c0: 6c 64 73 20 6f 66 20 74 68 65 20 25 5f 73 65 67  lds of the %_seg
39d0: 64 69 72 0a 2a 2a 20 20 20 65 6e 74 72 79 20 6c  dir.**   entry l
39e0: 6f 63 61 74 65 64 20 6f 6e 20 61 62 73 6f 6c 75  ocated on absolu
39f0: 74 65 20 6c 65 76 65 6c 20 3a 33 20 77 69 74 68  te level :3 with
3a00: 20 69 6e 64 65 78 20 3a 34 2e 20 20 2a 2f 0a 2f   index :4.  */./
3a10: 2a 20 33 33 20 2a 2f 20 20 22 55 50 44 41 54 45  * 33 */  "UPDATE
3a20: 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20   %Q.'%q_segdir' 
3a30: 53 45 54 20 73 74 61 72 74 5f 62 6c 6f 63 6b 20  SET start_block 
3a40: 3d 20 3f 2c 20 72 6f 6f 74 20 3d 20 3f 22 0a 20  = ?, root = ?". 
3a50: 20 20 20 20 20 20 20 20 20 20 20 22 57 48 45 52             "WHER
3a60: 45 20 6c 65 76 65 6c 20 3d 20 3f 20 41 4e 44 20  E level = ? AND 
3a70: 69 64 78 20 3d 20 3f 22 2c 0a 0a 2f 2a 20 53 51  idx = ?",../* SQ
3a80: 4c 5f 53 45 47 4d 45 4e 54 5f 49 53 5f 41 50 50  L_SEGMENT_IS_APP
3a90: 45 4e 44 41 42 4c 45 0a 2a 2a 20 20 20 52 65 74  ENDABLE.**   Ret
3aa0: 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  urn a single row
3ab0: 20 69 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20   if the segment 
3ac0: 77 69 74 68 20 65 6e 64 5f 62 6c 6f 63 6b 3d 3f  with end_block=?
3ad0: 20 69 73 20 61 70 70 65 6e 64 61 62 6c 65 2e 20   is appendable. 
3ae0: 4f 72 0a 2a 2a 20 20 20 6e 6f 20 72 6f 77 73 20  Or.**   no rows 
3af0: 6f 74 68 65 72 77 69 73 65 2e 20 20 2a 2f 0a 2f  otherwise.  */./
3b00: 2a 20 33 34 20 2a 2f 20 20 22 53 45 4c 45 43 54  * 34 */  "SELECT
3b10: 20 31 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73   1 FROM %Q.'%q_s
3b20: 65 67 6d 65 6e 74 73 27 20 57 48 45 52 45 20 62  egments' WHERE b
3b30: 6c 6f 63 6b 69 64 3d 3f 20 41 4e 44 20 62 6c 6f  lockid=? AND blo
3b40: 63 6b 20 49 53 20 4e 55 4c 4c 22 2c 0a 0a 2f 2a  ck IS NULL",../*
3b50: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 49 4e 44 45   SQL_SELECT_INDE
3b60: 58 45 53 0a 2a 2a 20 20 20 52 65 74 75 72 6e 20  XES.**   Return 
3b70: 74 68 65 20 6c 69 73 74 20 6f 66 20 76 61 6c 69  the list of vali
3b80: 64 20 73 65 67 6d 65 6e 74 20 69 6e 64 65 78 65  d segment indexe
3b90: 73 20 66 6f 72 20 61 62 73 6f 6c 75 74 65 20 6c  s for absolute l
3ba0: 65 76 65 6c 20 3f 20 20 2a 2f 0a 2f 2a 20 33 35  evel ?  */./* 35
3bb0: 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 69 64 78   */  "SELECT idx
3bc0: 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67   FROM %Q.'%q_seg
3bd0: 64 69 72 27 20 57 48 45 52 45 20 6c 65 76 65 6c  dir' WHERE level
3be0: 3d 3f 20 4f 52 44 45 52 20 42 59 20 31 20 41 53  =? ORDER BY 1 AS
3bf0: 43 22 2c 0a 0a 2f 2a 20 53 51 4c 5f 53 45 4c 45  C",../* SQL_SELE
3c00: 43 54 5f 4d 58 4c 45 56 45 4c 0a 2a 2a 20 20 20  CT_MXLEVEL.**   
3c10: 52 65 74 75 72 6e 20 74 68 65 20 6c 61 72 67 65  Return the large
3c20: 73 74 20 72 65 6c 61 74 69 76 65 20 6c 65 76 65  st relative leve
3c30: 6c 20 69 6e 20 74 68 65 20 46 54 53 20 69 6e 64  l in the FTS ind
3c40: 65 78 20 6f 72 20 69 6e 64 65 78 65 73 2e 20 20  ex or indexes.  
3c50: 2a 2f 0a 2f 2a 20 33 36 20 2a 2f 20 20 22 53 45  */./* 36 */  "SE
3c60: 4c 45 43 54 20 6d 61 78 28 20 6c 65 76 65 6c 20  LECT max( level 
3c70: 25 25 20 31 30 32 34 20 29 20 46 52 4f 4d 20 25  %% 1024 ) FROM %
3c80: 51 2e 27 25 71 5f 73 65 67 64 69 72 27 22 0a 20  Q.'%q_segdir'". 
3c90: 20 7d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   };.  int rc = S
3ca0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69  QLITE_OK;.  sqli
3cb0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
3cc0: 0a 0a 20 20 61 73 73 65 72 74 28 20 53 69 7a 65  ..  assert( Size
3cd0: 6f 66 41 72 72 61 79 28 61 7a 53 71 6c 29 3d 3d  ofArray(azSql)==
3ce0: 53 69 7a 65 6f 66 41 72 72 61 79 28 70 2d 3e 61  SizeofArray(p->a
3cf0: 53 74 6d 74 29 20 29 3b 0a 20 20 61 73 73 65 72  Stmt) );.  asser
3d00: 74 28 20 65 53 74 6d 74 3c 53 69 7a 65 6f 66 41  t( eStmt<SizeofA
3d10: 72 72 61 79 28 61 7a 53 71 6c 29 20 26 26 20 65  rray(azSql) && e
3d20: 53 74 6d 74 3e 3d 30 20 29 3b 0a 20 20 0a 20 20  Stmt>=0 );.  .  
3d30: 70 53 74 6d 74 20 3d 20 70 2d 3e 61 53 74 6d 74  pStmt = p->aStmt
3d40: 5b 65 53 74 6d 74 5d 3b 0a 20 20 69 66 28 20 21  [eStmt];.  if( !
3d50: 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 63 68 61  pStmt ){.    cha
3d60: 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 69 66 28  r *zSql;.    if(
3d70: 20 65 53 74 6d 74 3d 3d 53 51 4c 5f 43 4f 4e 54   eStmt==SQL_CONT
3d80: 45 4e 54 5f 49 4e 53 45 52 54 20 29 7b 0a 20 20  ENT_INSERT ){.  
3d90: 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
3da0: 65 33 5f 6d 70 72 69 6e 74 66 28 61 7a 53 71 6c  e3_mprintf(azSql
3db0: 5b 65 53 74 6d 74 5d 2c 20 70 2d 3e 7a 44 62 2c  [eStmt], p->zDb,
3dc0: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70 2d 3e 7a 57   p->zName, p->zW
3dd0: 72 69 74 65 45 78 70 72 6c 69 73 74 29 3b 0a 20  riteExprlist);. 
3de0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74     }else if( eSt
3df0: 6d 74 3d 3d 53 51 4c 5f 53 45 4c 45 43 54 5f 43  mt==SQL_SELECT_C
3e00: 4f 4e 54 45 4e 54 5f 42 59 5f 52 4f 57 49 44 20  ONTENT_BY_ROWID 
3e10: 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  ){.      zSql = 
3e20: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
3e30: 61 7a 53 71 6c 5b 65 53 74 6d 74 5d 2c 20 70 2d  azSql[eStmt], p-
3e40: 3e 7a 52 65 61 64 45 78 70 72 6c 69 73 74 29 3b  >zReadExprlist);
3e50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3e60: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
3e70: 5f 6d 70 72 69 6e 74 66 28 61 7a 53 71 6c 5b 65  _mprintf(azSql[e
3e80: 53 74 6d 74 5d 2c 20 70 2d 3e 7a 44 62 2c 20 70  Stmt], p->zDb, p
3e90: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
3ea0: 20 20 20 20 69 66 28 20 21 7a 53 71 6c 20 29 7b      if( !zSql ){
3eb0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
3ec0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
3ed0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
3ee0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
3ef0: 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
3f00: 2d 31 2c 20 26 70 53 74 6d 74 2c 20 4e 55 4c 4c  -1, &pStmt, NULL
3f10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3f20: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
3f30: 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
3f40: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d  QLITE_OK || pStm
3f50: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d  t==0 );.      p-
3f60: 3e 61 53 74 6d 74 5b 65 53 74 6d 74 5d 20 3d 20  >aStmt[eStmt] = 
3f70: 70 53 74 6d 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pStmt;.    }.  }
3f80: 0a 20 20 69 66 28 20 61 70 56 61 6c 20 29 7b 0a  .  if( apVal ){.
3f90: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
3fa0: 6e 74 20 6e 50 61 72 61 6d 20 3d 20 73 71 6c 69  nt nParam = sqli
3fb0: 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
3fc0: 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  er_count(pStmt);
3fd0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
3fe0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
3ff0: 3c 6e 50 61 72 61 6d 3b 20 69 2b 2b 29 7b 0a 20  <nParam; i++){. 
4000: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
4010: 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 53 74  3_bind_value(pSt
4020: 6d 74 2c 20 69 2b 31 2c 20 61 70 56 61 6c 5b 69  mt, i+1, apVal[i
4030: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ]);.    }.  }.  
4040: 2a 70 70 20 3d 20 70 53 74 6d 74 3b 0a 20 20 72  *pp = pStmt;.  r
4050: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74  eturn rc;.}...st
4060: 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 6c  atic int fts3Sel
4070: 65 63 74 44 6f 63 73 69 7a 65 28 0a 20 20 46 74  ectDocsize(.  Ft
4080: 73 33 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20  s3Table *pTab,  
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
40a0: 20 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64   FTS3 table hand
40b0: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
40c0: 69 6e 74 36 34 20 69 44 6f 63 69 64 2c 20 20 20  int64 iDocid,   
40d0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 69 64          /* Docid
40e0: 20 74 6f 20 62 69 6e 64 20 66 6f 72 20 53 51 4c   to bind for SQL
40f0: 5f 53 45 4c 45 43 54 5f 44 4f 43 53 49 5a 45 20  _SELECT_DOCSIZE 
4100: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
4110: 74 20 2a 2a 70 70 53 74 6d 74 20 20 20 20 20 20  t **ppStmt      
4120: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 74 61       /* OUT: Sta
4130: 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f  tement handle */
4140: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
4150: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20  mt *pStmt = 0;  
4160: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65        /* Stateme
4170: 6e 74 20 72 65 71 75 65 73 74 65 64 20 66 72 6f  nt requested fro
4180: 6d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 29 20  m fts3SqlStmt() 
4190: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 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 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
41c0: 6f 64 65 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66  ode */..  rc = f
41d0: 74 73 33 53 71 6c 53 74 6d 74 28 70 54 61 62 2c  ts3SqlStmt(pTab,
41e0: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 44 4f 43 53   SQL_SELECT_DOCS
41f0: 49 5a 45 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  IZE, &pStmt, 0);
4200: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
4210: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
4220: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
4230: 53 74 6d 74 2c 20 31 2c 20 69 44 6f 63 69 64 29  Stmt, 1, iDocid)
4240: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
4250: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
4260: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
4270: 54 45 5f 52 4f 57 20 7c 7c 20 73 71 6c 69 74 65  TE_ROW || sqlite
4280: 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53  3_column_type(pS
4290: 74 6d 74 2c 20 30 29 21 3d 53 51 4c 49 54 45 5f  tmt, 0)!=SQLITE_
42a0: 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 72 63  BLOB ){.      rc
42b0: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
42c0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69  (pStmt);.      i
42d0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
42e0: 20 29 20 72 63 20 3d 20 46 54 53 5f 43 4f 52 52   ) rc = FTS_CORR
42f0: 55 50 54 5f 56 54 41 42 3b 0a 20 20 20 20 20 20  UPT_VTAB;.      
4300: 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  pStmt = 0;.    }
4310: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
4320: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
4330: 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 53 74 6d 74  }.  }..  *ppStmt
4340: 20 3d 20 70 53 74 6d 74 3b 0a 20 20 72 65 74 75   = pStmt;.  retu
4350: 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71  rn rc;.}..int sq
4360: 6c 69 74 65 33 46 74 73 33 53 65 6c 65 63 74 44  lite3Fts3SelectD
4370: 6f 63 74 6f 74 61 6c 28 0a 20 20 46 74 73 33 54  octotal(.  Fts3T
4380: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
4390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74             /* Ft
43a0: 73 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  s3 table handle 
43b0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
43c0: 74 20 2a 2a 70 70 53 74 6d 74 20 20 20 20 20 20  t **ppStmt      
43d0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 74 61       /* OUT: Sta
43e0: 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f  tement handle */
43f0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
4400: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
4410: 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20   int rc;.  rc = 
4420: 66 74 73 33 53 71 6c 53 74 6d 74 28 70 54 61 62  fts3SqlStmt(pTab
4430: 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 54 41  , SQL_SELECT_STA
4440: 54 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  T, &pStmt, 0);. 
4450: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4460: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
4470: 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74  3_bind_int(pStmt
4480: 2c 20 31 2c 20 46 54 53 5f 53 54 41 54 5f 44 4f  , 1, FTS_STAT_DO
4490: 43 54 4f 54 41 4c 29 3b 0a 20 20 20 20 69 66 28  CTOTAL);.    if(
44a0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
44b0: 74 6d 74 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)!=SQLITE_ROW
44c0: 0a 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33  .     || sqlite3
44d0: 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74  _column_type(pSt
44e0: 6d 74 2c 20 30 29 21 3d 53 51 4c 49 54 45 5f 42  mt, 0)!=SQLITE_B
44f0: 4c 4f 42 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  LOB.    ){.     
4500: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
4510: 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  set(pStmt);.    
4520: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4530: 5f 4f 4b 20 29 20 72 63 20 3d 20 46 54 53 5f 43  _OK ) rc = FTS_C
4540: 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 20  ORRUPT_VTAB;.   
4550: 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20     pStmt = 0;.  
4560: 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70 53 74 6d    }.  }.  *ppStm
4570: 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 72 65 74  t = pStmt;.  ret
4580: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73  urn rc;.}..int s
4590: 71 6c 69 74 65 33 46 74 73 33 53 65 6c 65 63 74  qlite3Fts3Select
45a0: 44 6f 63 73 69 7a 65 28 0a 20 20 46 74 73 33 54  Docsize(.  Fts3T
45b0: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
45c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74             /* Ft
45d0: 73 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  s3 table handle 
45e0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
45f0: 36 34 20 69 44 6f 63 69 64 2c 20 20 20 20 20 20  64 iDocid,      
4600: 20 20 20 20 20 2f 2a 20 44 6f 63 69 64 20 74 6f       /* Docid to
4610: 20 72 65 61 64 20 73 69 7a 65 20 64 61 74 61 20   read size data 
4620: 66 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  for */.  sqlite3
4630: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 20 20  _stmt **ppStmt  
4640: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
4650: 20 53 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   Statement handl
4660: 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  e */.){.  return
4670: 20 66 74 73 33 53 65 6c 65 63 74 44 6f 63 73 69   fts3SelectDocsi
4680: 7a 65 28 70 54 61 62 2c 20 69 44 6f 63 69 64 2c  ze(pTab, iDocid,
4690: 20 70 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a   ppStmt);.}../*.
46a0: 2a 2a 20 53 69 6d 69 6c 61 72 20 74 6f 20 66 74  ** Similar to ft
46b0: 73 33 53 71 6c 53 74 6d 74 28 29 2e 20 45 78 63  s3SqlStmt(). Exc
46c0: 65 70 74 2c 20 61 66 74 65 72 20 62 69 6e 64 69  ept, after bindi
46d0: 6e 67 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  ng the parameter
46e0: 73 20 69 6e 0a 2a 2a 20 61 72 72 61 79 20 61 70  s in.** array ap
46f0: 56 61 6c 5b 5d 20 74 6f 20 74 68 65 20 53 51 4c  Val[] to the SQL
4700: 20 73 74 61 74 65 6d 65 6e 74 20 69 64 65 6e 74   statement ident
4710: 69 66 69 65 64 20 62 79 20 65 53 74 6d 74 2c 20  ified by eStmt, 
4720: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  the statement.**
4730: 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 2a 2a   is executed..**
4740: 0a 2a 2a 20 52 65 74 75 72 6e 73 20 53 51 4c 49  .** Returns SQLI
4750: 54 45 5f 4f 4b 20 69 66 20 74 68 65 20 73 74 61  TE_OK if the sta
4760: 74 65 6d 65 6e 74 20 69 73 20 73 75 63 63 65 73  tement is succes
4770: 73 66 75 6c 6c 79 20 65 78 65 63 75 74 65 64 2c  sfully executed,
4780: 20 6f 72 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65   or an.** SQLite
4790: 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
47a0: 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
47b0: 20 76 6f 69 64 20 66 74 73 33 53 71 6c 45 78 65   void fts3SqlExe
47c0: 63 28 0a 20 20 69 6e 74 20 2a 70 52 43 2c 20 20  c(.  int *pRC,  
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
47e0: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
47f0: 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
4800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
4810: 65 20 46 54 53 33 20 74 61 62 6c 65 20 2a 2f 0a  e FTS3 table */.
4820: 20 20 69 6e 74 20 65 53 74 6d 74 2c 20 20 20 20    int eStmt,    
4830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
4840: 64 65 78 20 6f 66 20 73 74 61 74 65 6d 65 6e 74  dex of statement
4850: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 2a 2f 0a   to evaluate */.
4860: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
4870: 2a 2a 61 70 56 61 6c 20 20 20 20 2f 2a 20 50 61  **apVal    /* Pa
4880: 72 61 6d 65 74 65 72 73 20 74 6f 20 62 69 6e 64  rameters to bind
4890: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
48a0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
48b0: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 2a 70  int rc;.  if( *p
48c0: 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 72  RC ) return;.  r
48d0: 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
48e0: 70 2c 20 65 53 74 6d 74 2c 20 26 70 53 74 6d 74  p, eStmt, &pStmt
48f0: 2c 20 61 70 56 61 6c 29 3b 20 0a 20 20 69 66 28  , apVal); .  if(
4900: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
4910: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
4920: 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 72  ep(pStmt);.    r
4930: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
4940: 74 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20  t(pStmt);.  }.  
4950: 2a 70 52 43 20 3d 20 72 63 3b 0a 7d 0a 0a 0a 2f  *pRC = rc;.}.../
4960: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4970: 6f 6e 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  on ensures that 
4980: 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f  the caller has o
4990: 62 74 61 69 6e 65 64 20 61 20 73 68 61 72 65 64  btained a shared
49a0: 2d 63 61 63 68 65 0a 2a 2a 20 74 61 62 6c 65 2d  -cache.** table-
49b0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 25 5f 63 6f  lock on the %_co
49c0: 6e 74 65 6e 74 20 74 61 62 6c 65 2e 20 54 68 69  ntent table. Thi
49d0: 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  s is required be
49e0: 66 6f 72 65 20 72 65 61 64 69 6e 67 0a 2a 2a 20  fore reading.** 
49f0: 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 66 74  data from the ft
4a00: 73 33 20 74 61 62 6c 65 2e 20 49 66 20 74 68 69  s3 table. If thi
4a10: 73 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 61 63  s lock is not ac
4a20: 71 75 69 72 65 64 20 66 69 72 73 74 2c 20 74 68  quired first, th
4a30: 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  en.** the caller
4a40: 20 6d 61 79 20 65 6e 64 20 75 70 20 68 6f 6c 64   may end up hold
4a50: 69 6e 67 20 72 65 61 64 2d 6c 6f 63 6b 73 20 6f  ing read-locks o
4a60: 6e 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73  n the %_segments
4a70: 20 61 6e 64 20 25 5f 73 65 67 64 69 72 0a 2a 2a   and %_segdir.**
4a80: 20 74 61 62 6c 65 73 2c 20 62 75 74 20 6e 6f 20   tables, but no 
4a90: 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  read-lock on the
4aa0: 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65   %_content table
4ab0: 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
4ac0: 73 20 0a 2a 2a 20 61 20 73 65 63 6f 6e 64 20 63  s .** a second c
4ad0: 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62  onnection will b
4ae0: 65 20 61 62 6c 65 20 74 6f 20 77 72 69 74 65 20  e able to write 
4af0: 74 6f 20 74 68 65 20 66 74 73 33 20 74 61 62 6c  to the fts3 tabl
4b00: 65 2c 20 62 75 74 0a 2a 2a 20 61 74 74 65 6d 70  e, but.** attemp
4b10: 74 69 6e 67 20 74 6f 20 63 6f 6d 6d 69 74 20 74  ting to commit t
4b20: 68 6f 73 65 20 77 72 69 74 65 73 20 6d 69 67 68  hose writes migh
4b30: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
4b40: 4c 4f 43 4b 45 44 20 6f 72 0a 2a 2a 20 53 51 4c  LOCKED or.** SQL
4b50: 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
4b60: 44 43 41 43 48 45 20 28 62 65 63 61 75 73 65 20  DCACHE (because 
4b70: 74 68 65 20 63 6f 6d 6d 69 74 20 61 74 74 65 6d  the commit attem
4b80: 70 74 73 20 74 6f 20 6f 62 74 61 69 6e 20 0a 2a  pts to obtain .*
4b90: 2a 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 6f 6e  * write-locks on
4ba0: 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20   the %_segments 
4bb0: 61 6e 64 20 25 5f 73 65 67 64 69 72 20 2a 2a 20  and %_segdir ** 
4bc0: 74 61 62 6c 65 73 29 2e 20 0a 2a 2a 0a 2a 2a 20  tables). .**.** 
4bd0: 57 65 20 74 72 79 20 74 6f 20 61 76 6f 69 64 20  We try to avoid 
4be0: 74 68 69 73 20 62 65 63 61 75 73 65 20 69 66 20  this because if 
4bf0: 46 54 53 33 20 72 65 74 75 72 6e 73 20 61 6e 79  FTS3 returns any
4c00: 20 65 72 72 6f 72 20 77 68 65 6e 20 63 6f 6d 6d   error when comm
4c10: 69 74 74 69 6e 67 0a 2a 2a 20 61 20 74 72 61 6e  itting.** a tran
4c20: 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 77 68 6f  saction, the who
4c30: 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  le transaction w
4c40: 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ill be rolled ba
4c50: 63 6b 2e 20 41 6e 64 20 74 68 69 73 20 69 73 0a  ck. And this is.
4c60: 2a 2a 20 6e 6f 74 20 77 68 61 74 20 75 73 65 72  ** not what user
4c70: 73 20 65 78 70 65 63 74 20 77 68 65 6e 20 74 68  s expect when th
4c80: 65 79 20 67 65 74 20 53 51 4c 49 54 45 5f 4c 4f  ey get SQLITE_LO
4c90: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
4ca0: 2e 20 49 74 20 63 61 6e 0a 2a 2a 20 73 74 69 6c  . It can.** stil
4cb0: 6c 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  l happen if the 
4cc0: 75 73 65 72 20 72 65 61 64 73 20 64 61 74 61 20  user reads data 
4cd0: 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68  directly from th
4ce0: 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 6f 72 0a  e %_segments or.
4cf0: 2a 2a 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c  ** %_segdir tabl
4d00: 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 67 6f  es instead of go
4d10: 69 6e 67 20 74 68 72 6f 75 67 68 20 46 54 53 33  ing through FTS3
4d20: 20 74 68 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 54   though..**.** T
4d30: 68 69 73 20 72 65 61 73 6f 6e 69 6e 67 20 64 6f  his reasoning do
4d40: 65 73 20 6e 6f 74 20 61 70 70 6c 79 20 74 6f 20  es not apply to 
4d50: 61 20 63 6f 6e 74 65 6e 74 3d 78 78 78 20 74 61  a content=xxx ta
4d60: 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
4d70: 74 65 33 46 74 73 33 52 65 61 64 4c 6f 63 6b 28  te3Fts3ReadLock(
4d80: 46 74 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20  Fts3Table *p){. 
4d90: 20 69 6e 74 20 72 63 3b 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: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
4dc0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
4dd0: 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  t *pStmt;       
4de0: 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e       /* Statemen
4df0: 74 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e  t used to obtain
4e00: 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 69 66 28 20   lock */..  if( 
4e10: 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d  p->zContentTbl==
4e20: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  0 ){.    rc = ft
4e30: 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
4e40: 5f 53 45 4c 45 43 54 5f 43 4f 4e 54 45 4e 54 5f  _SELECT_CONTENT_
4e50: 42 59 5f 52 4f 57 49 44 2c 20 26 70 53 74 6d 74  BY_ROWID, &pStmt
4e60: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
4e70: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
4e80: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
4e90: 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 31 29  d_null(pStmt, 1)
4ea0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
4eb0: 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20  step(pStmt);.   
4ec0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
4ed0: 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
4ee0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
4ef0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
4f00: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
4f10: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 54 53 20  c;.}../*.** FTS 
4f20: 6d 61 69 6e 74 61 69 6e 73 20 61 20 73 65 70 61  maintains a sepa
4f30: 72 61 74 65 20 69 6e 64 65 78 65 73 20 66 6f 72  rate indexes for
4f40: 20 65 61 63 68 20 6c 61 6e 67 75 61 67 65 2d 69   each language-i
4f50: 64 20 28 61 20 33 32 2d 62 69 74 20 69 6e 74 65  d (a 32-bit inte
4f60: 67 65 72 29 2e 0a 2a 2a 20 57 69 74 68 69 6e 20  ger)..** Within 
4f70: 65 61 63 68 20 6c 61 6e 67 75 61 67 65 20 69 64  each language id
4f80: 2c 20 61 20 73 65 70 61 72 61 74 65 20 69 6e 64  , a separate ind
4f90: 65 78 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64  ex is maintained
4fa0: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a   to store the.**
4fb0: 20 64 6f 63 75 6d 65 6e 74 20 74 65 72 6d 73 2c   document terms,
4fc0: 20 61 6e 64 20 65 61 63 68 20 63 6f 6e 66 69 67   and each config
4fd0: 75 72 65 64 20 70 72 65 66 69 78 20 73 69 7a 65  ured prefix size
4fe0: 20 28 63 6f 6e 66 69 67 75 72 65 64 20 74 68 65   (configured the
4ff0: 20 46 54 53 20 0a 2a 2a 20 22 70 72 65 66 69 78   FTS .** "prefix
5000: 3d 22 20 6f 70 74 69 6f 6e 29 2e 20 41 6e 64 20  =" option). And 
5010: 65 61 63 68 20 69 6e 64 65 78 20 63 6f 6e 73 69  each index consi
5020: 73 74 73 20 6f 66 20 6d 75 6c 74 69 70 6c 65 20  sts of multiple 
5030: 6c 65 76 65 6c 73 20 28 22 72 65 6c 61 74 69 76  levels ("relativ
5040: 65 0a 2a 2a 20 6c 65 76 65 6c 73 22 29 2e 0a 2a  e.** levels")..*
5050: 2a 0a 2a 2a 20 41 6c 6c 20 74 68 72 65 65 20 6f  *.** All three o
5060: 66 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 28  f these values (
5070: 74 68 65 20 6c 61 6e 67 75 61 67 65 20 69 64 2c  the language id,
5080: 20 74 68 65 20 73 70 65 63 69 66 69 63 20 69 6e   the specific in
5090: 64 65 78 20 61 6e 64 20 74 68 65 0a 2a 2a 20 6c  dex and the.** l
50a0: 65 76 65 6c 20 77 69 74 68 69 6e 20 74 68 65 20  evel within the 
50b0: 69 6e 64 65 78 29 20 61 72 65 20 65 6e 63 6f 64  index) are encod
50c0: 65 64 20 69 6e 20 36 34 2d 62 69 74 20 69 6e 74  ed in 64-bit int
50d0: 65 67 65 72 20 76 61 6c 75 65 73 20 73 74 6f 72  eger values stor
50e0: 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 25 5f 73  ed.** in the %_s
50f0: 65 67 64 69 72 20 74 61 62 6c 65 20 6f 6e 20 64  egdir table on d
5100: 69 73 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69  isk. This functi
5110: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  on is used to co
5120: 6e 76 65 72 74 20 74 68 72 65 65 0a 2a 2a 20 73  nvert three.** s
5130: 65 70 61 72 61 74 65 20 63 6f 6d 70 6f 6e 65 6e  eparate componen
5140: 74 20 76 61 6c 75 65 73 20 69 6e 74 6f 20 74 68  t values into th
5150: 65 20 73 69 6e 67 6c 65 20 36 34 2d 62 69 74 20  e single 64-bit 
5160: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 74 68  integer value th
5170: 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65  at.** can be use
5180: 64 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 25  d to query the %
5190: 5f 73 65 67 64 69 72 20 74 61 62 6c 65 2e 0a 2a  _segdir table..*
51a0: 2a 0a 2a 2a 20 53 70 65 63 69 66 69 63 61 6c 6c  *.** Specificall
51b0: 79 2c 20 65 61 63 68 20 6c 61 6e 67 75 61 67 65  y, each language
51c0: 2d 69 64 2f 69 6e 64 65 78 20 63 6f 6d 62 69 6e  -id/index combin
51d0: 61 74 69 6f 6e 20 69 73 20 61 6c 6c 6f 63 61 74  ation is allocat
51e0: 65 64 20 31 30 32 34 20 0a 2a 2a 20 36 34 2d 62  ed 1024 .** 64-b
51f0: 69 74 20 69 6e 74 65 67 65 72 20 6c 65 76 65 6c  it integer level
5200: 20 76 61 6c 75 65 73 20 28 22 61 62 73 6f 6c 75   values ("absolu
5210: 74 65 20 6c 65 76 65 6c 73 22 29 2e 20 54 68 65  te levels"). The
5220: 20 6d 61 69 6e 20 74 65 72 6d 73 20 69 6e 64 65   main terms inde
5230: 78 0a 2a 2a 20 66 6f 72 20 6c 61 6e 67 75 61 67  x.** for languag
5240: 65 2d 69 64 20 30 20 69 73 20 61 6c 6c 6f 63 61  e-id 0 is alloca
5250: 74 65 20 76 61 6c 75 65 73 20 30 2d 31 30 32 33  te values 0-1023
5260: 2e 20 54 68 65 20 66 69 72 73 74 20 70 72 65 66  . The first pref
5270: 69 78 20 69 6e 64 65 78 0a 2a 2a 20 28 69 66 20  ix index.** (if 
5280: 61 6e 79 29 20 66 6f 72 20 6c 61 6e 67 75 61 67  any) for languag
5290: 65 2d 69 64 20 30 20 69 73 20 61 6c 6c 6f 63 61  e-id 0 is alloca
52a0: 74 65 64 20 76 61 6c 75 65 73 20 31 30 32 34 2d  ted values 1024-
52b0: 32 30 34 37 2e 20 41 6e 64 20 73 6f 20 6f 6e 2e  2047. And so on.
52c0: 0a 2a 2a 20 4c 61 6e 67 75 61 67 65 20 31 20 69  .** Language 1 i
52d0: 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6c 6f 63  ndexes are alloc
52e0: 61 74 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ated immediately
52f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 61 6e 67 75   following langu
5300: 61 67 65 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 2c  age 0..**.** So,
5310: 20 66 6f 72 20 61 20 73 79 73 74 65 6d 20 77 69   for a system wi
5320: 74 68 20 6e 50 72 65 66 69 78 20 70 72 65 66 69  th nPrefix prefi
5330: 78 20 69 6e 64 65 78 65 73 20 63 6f 6e 66 69 67  x indexes config
5340: 75 72 65 64 2c 20 74 68 65 20 62 6c 6f 63 6b 20  ured, the block 
5350: 6f 66 0a 2a 2a 20 61 62 73 6f 6c 75 74 65 20 6c  of.** absolute l
5360: 65 76 65 6c 73 20 74 68 61 74 20 63 6f 72 72 65  evels that corre
5370: 73 70 6f 6e 64 73 20 74 6f 20 6c 61 6e 67 75 61  sponds to langua
5380: 67 65 2d 69 64 20 69 4c 61 6e 67 69 64 20 61 6e  ge-id iLangid an
5390: 64 20 69 6e 64 65 78 20 0a 2a 2a 20 69 49 6e 64  d index .** iInd
53a0: 65 78 20 73 74 61 72 74 73 20 61 74 20 61 62 73  ex starts at abs
53b0: 6f 6c 75 74 65 20 6c 65 76 65 6c 20 28 28 69 4c  olute level ((iL
53c0: 61 6e 67 69 64 20 2a 20 28 6e 50 72 65 66 69 78  angid * (nPrefix
53d0: 2b 31 29 20 2b 20 69 49 6e 64 65 78 29 20 2a 20  +1) + iIndex) * 
53e0: 31 30 32 34 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  1024)..*/.static
53f0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 67   sqlite3_int64 g
5400: 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28  etAbsoluteLevel(
5410: 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
5420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5430: 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65     /* FTS3 table
5440: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
5450: 20 69 4c 61 6e 67 69 64 2c 20 20 20 20 20 20 20   iLangid,       
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5470: 4c 61 6e 67 75 61 67 65 20 69 64 20 2a 2f 0a 20  Language id */. 
5480: 20 69 6e 74 20 69 49 6e 64 65 78 2c 20 20 20 20   int iIndex,    
5490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54a0: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e   /* Index in p->
54b0: 61 49 6e 64 65 78 5b 5d 20 2a 2f 0a 20 20 69 6e  aIndex[] */.  in
54c0: 74 20 69 4c 65 76 65 6c 20 20 20 20 20 20 20 20  t iLevel        
54d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
54e0: 20 4c 65 76 65 6c 20 6f 66 20 73 65 67 6d 65 6e   Level of segmen
54f0: 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
5500: 65 33 5f 69 6e 74 36 34 20 69 42 61 73 65 3b 20  e3_int64 iBase; 
5510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
5520: 72 73 74 20 61 62 73 6f 6c 75 74 65 20 6c 65 76  rst absolute lev
5530: 65 6c 20 66 6f 72 20 69 4c 61 6e 67 69 64 2f 69  el for iLangid/i
5540: 49 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72  Index */.  asser
5550: 74 28 20 69 4c 61 6e 67 69 64 3e 3d 30 20 29 3b  t( iLangid>=0 );
5560: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 49  .  assert( p->nI
5570: 6e 64 65 78 3e 30 20 29 3b 0a 20 20 61 73 73 65  ndex>0 );.  asse
5580: 72 74 28 20 69 49 6e 64 65 78 3e 3d 30 20 26 26  rt( iIndex>=0 &&
5590: 20 69 49 6e 64 65 78 3c 70 2d 3e 6e 49 6e 64 65   iIndex<p->nInde
55a0: 78 20 29 3b 0a 0a 20 20 69 42 61 73 65 20 3d 20  x );..  iBase = 
55b0: 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  ((sqlite3_int64)
55c0: 69 4c 61 6e 67 69 64 20 2a 20 70 2d 3e 6e 49 6e  iLangid * p->nIn
55d0: 64 65 78 20 2b 20 69 49 6e 64 65 78 29 20 2a 20  dex + iIndex) * 
55e0: 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c  FTS3_SEGDIR_MAXL
55f0: 45 56 45 4c 3b 0a 20 20 72 65 74 75 72 6e 20 69  EVEL;.  return i
5600: 42 61 73 65 20 2b 20 69 4c 65 76 65 6c 3b 0a 7d  Base + iLevel;.}
5610: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 70 53  ../*.** Set *ppS
5620: 74 6d 74 20 74 6f 20 61 20 73 74 61 74 65 6d 65  tmt to a stateme
5630: 6e 74 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6d  nt handle that m
5640: 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 69 74  ay be used to it
5650: 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a  erate through.**
5660: 20 61 6c 6c 20 72 6f 77 73 20 69 6e 20 74 68 65   all rows in the
5670: 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 2c   %_segdir table,
5680: 20 66 72 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20   from oldest to 
5690: 6e 65 77 65 73 74 2e 20 49 66 20 73 75 63 63 65  newest. If succe
56a0: 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e  ssful,.** return
56b0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
56c0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
56d0: 68 69 6c 65 20 70 72 65 70 61 72 69 6e 67 20 74  hile preparing t
56e0: 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 0a 2a  he statement, .*
56f0: 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  * return an SQLi
5700: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
5710: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  *.** There is on
5720: 6c 79 20 65 76 65 72 20 6f 6e 65 20 69 6e 73 74  ly ever one inst
5730: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 53 51 4c  ance of this SQL
5740: 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 70 69   statement compi
5750: 6c 65 64 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20  led for.** each 
5760: 46 54 53 33 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  FTS3 table..**.*
5770: 2a 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * The statement 
5780: 72 65 74 75 72 6e 73 20 74 68 65 20 66 6f 6c 6c  returns the foll
5790: 6f 77 69 6e 67 20 63 6f 6c 75 6d 6e 73 20 66 72  owing columns fr
57a0: 6f 6d 20 74 68 65 20 25 5f 73 65 67 64 69 72 20  om the %_segdir 
57b0: 74 61 62 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 30  table:.**.**   0
57c0: 3a 20 69 64 78 0a 2a 2a 20 20 20 31 3a 20 73 74  : idx.**   1: st
57d0: 61 72 74 5f 62 6c 6f 63 6b 0a 2a 2a 20 20 20 32  art_block.**   2
57e0: 3a 20 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f  : leaves_end_blo
57f0: 63 6b 0a 2a 2a 20 20 20 33 3a 20 65 6e 64 5f 62  ck.**   3: end_b
5800: 6c 6f 63 6b 0a 2a 2a 20 20 20 34 3a 20 72 6f 6f  lock.**   4: roo
5810: 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  t.*/.int sqlite3
5820: 46 74 73 33 41 6c 6c 53 65 67 64 69 72 73 28 0a  Fts3AllSegdirs(.
5830: 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5850: 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20    /* FTS3 table 
5860: 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64  */.  int iLangid
5870: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5880: 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65       /* Language
5890: 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a   being queried *
58a0: 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 2c 20  /.  int iIndex, 
58b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58c0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72      /* Index for
58d0: 20 70 2d 3e 61 49 6e 64 65 78 5b 5d 20 2a 2f 0a   p->aIndex[] */.
58e0: 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20    int iLevel,   
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5900: 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 73 65    /* Level to se
5910: 6c 65 63 74 20 28 72 65 6c 61 74 69 76 65 20 6c  lect (relative l
5920: 65 76 65 6c 29 20 2a 2f 0a 20 20 73 71 6c 69 74  evel) */.  sqlit
5930: 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74  e3_stmt **ppStmt
5940: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
5950: 54 3a 20 43 6f 6d 70 69 6c 65 64 20 73 74 61 74  T: Compiled stat
5960: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ement */.){.  in
5970: 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
5980: 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
5990: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 76  ..  assert( iLev
59a0: 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53  el==FTS3_SEGCURS
59b0: 4f 52 5f 41 4c 4c 20 7c 7c 20 69 4c 65 76 65 6c  OR_ALL || iLevel
59c0: 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
59d0: 20 69 4c 65 76 65 6c 3c 46 54 53 33 5f 53 45 47   iLevel<FTS3_SEG
59e0: 44 49 52 5f 4d 41 58 4c 45 56 45 4c 20 29 3b 0a  DIR_MAXLEVEL );.
59f0: 20 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78    assert( iIndex
5a00: 3e 3d 30 20 26 26 20 69 49 6e 64 65 78 3c 70 2d  >=0 && iIndex<p-
5a10: 3e 6e 49 6e 64 65 78 20 29 3b 0a 0a 20 20 69 66  >nIndex );..  if
5a20: 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20  ( iLevel<0 ){.  
5a30: 20 20 2f 2a 20 22 53 45 4c 45 43 54 20 2a 20 46    /* "SELECT * F
5a40: 52 4f 4d 20 25 5f 73 65 67 64 69 72 20 57 48 45  ROM %_segdir WHE
5a50: 52 45 20 6c 65 76 65 6c 20 42 45 54 57 45 45 4e  RE level BETWEEN
5a60: 20 3f 20 41 4e 44 20 3f 20 4f 52 44 45 52 20 42   ? AND ? ORDER B
5a70: 59 20 2e 2e 2e 22 20 2a 2f 0a 20 20 20 20 72 63  Y ..." */.    rc
5a80: 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
5a90: 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c 45 56  , SQL_SELECT_LEV
5aa0: 45 4c 5f 52 41 4e 47 45 2c 20 26 70 53 74 6d 74  EL_RANGE, &pStmt
5ab0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
5ac0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a  ==SQLITE_OK ){ .
5ad0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
5ae0: 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  nd_int64(pStmt, 
5af0: 31 2c 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65  1, getAbsoluteLe
5b00: 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20  vel(p, iLangid, 
5b10: 69 49 6e 64 65 78 2c 20 30 29 29 3b 0a 20 20 20  iIndex, 0));.   
5b20: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
5b30: 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 32 2c 20  int64(pStmt, 2, 
5b40: 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 41 62  .          getAb
5b50: 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69  soluteLevel(p, i
5b60: 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20  Langid, iIndex, 
5b70: 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c  FTS3_SEGDIR_MAXL
5b80: 45 56 45 4c 2d 31 29 0a 20 20 20 20 20 20 29 3b  EVEL-1).      );
5b90: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
5ba0: 20 20 20 20 2f 2a 20 22 53 45 4c 45 43 54 20 2a      /* "SELECT *
5bb0: 20 46 52 4f 4d 20 25 5f 73 65 67 64 69 72 20 57   FROM %_segdir W
5bc0: 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f 20 4f  HERE level = ? O
5bd0: 52 44 45 52 20 42 59 20 2e 2e 2e 22 20 2a 2f 0a  RDER BY ..." */.
5be0: 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c      rc = fts3Sql
5bf0: 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45  Stmt(p, SQL_SELE
5c00: 43 54 5f 4c 45 56 45 4c 2c 20 26 70 53 74 6d 74  CT_LEVEL, &pStmt
5c10: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
5c20: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a  ==SQLITE_OK ){ .
5c30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
5c40: 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  nd_int64(pStmt, 
5c50: 31 2c 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65  1, getAbsoluteLe
5c60: 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20  vel(p, iLangid, 
5c70: 69 49 6e 64 65 78 2c 69 4c 65 76 65 6c 29 29 3b  iIndex,iLevel));
5c80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70  .    }.  }.  *pp
5c90: 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20  Stmt = pStmt;.  
5ca0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
5cb0: 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 73 69  *.** Append a si
5cc0: 6e 67 6c 65 20 76 61 72 69 6e 74 20 74 6f 20 61  ngle varint to a
5cd0: 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 62 75 66   PendingList buf
5ce0: 66 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  fer. SQLITE_OK i
5cf0: 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 66  s returned.** if
5d00: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
5d10: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
5d20: 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
5d30: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
5d40: 69 6f 6e 20 61 6c 73 6f 20 73 65 72 76 65 73 20  ion also serves 
5d50: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  to allocate the 
5d60: 50 65 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75  PendingList stru
5d70: 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 2a 2a  cture itself..**
5d80: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f   For example, to
5d90: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 50 65   create a new Pe
5da0: 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63 74  ndingList struct
5db0: 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ure containing t
5dc0: 77 6f 0a 2a 2a 20 76 61 72 69 6e 74 73 3a 0a 2a  wo.** varints:.*
5dd0: 2a 0a 2a 2a 20 20 20 50 65 6e 64 69 6e 67 4c 69  *.**   PendingLi
5de0: 73 74 20 2a 70 20 3d 20 30 3b 0a 2a 2a 20 20 20  st *p = 0;.**   
5df0: 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41  fts3PendingListA
5e00: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2c 20  ppendVarint(&p, 
5e10: 31 29 3b 0a 2a 2a 20 20 20 66 74 73 33 50 65 6e  1);.**   fts3Pen
5e20: 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61  dingListAppendVa
5e30: 72 69 6e 74 28 26 70 2c 20 32 29 3b 0a 2a 2f 0a  rint(&p, 2);.*/.
5e40: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 50  static int fts3P
5e50: 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64  endingListAppend
5e60: 56 61 72 69 6e 74 28 0a 20 20 50 65 6e 64 69 6e  Varint(.  Pendin
5e70: 67 4c 69 73 74 20 2a 2a 70 70 2c 20 20 20 20 20  gList **pp,     
5e80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
5e90: 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20  OUT: Pointer to 
5ea0: 50 65 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75  PendingList stru
5eb0: 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ct */.  sqlite3_
5ec0: 69 6e 74 36 34 20 69 20 20 20 20 20 20 20 20 20  int64 i         
5ed0: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
5ee0: 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 64 61   to append to da
5ef0: 74 61 20 2a 2f 0a 29 7b 0a 20 20 50 65 6e 64 69  ta */.){.  Pendi
5f00: 6e 67 4c 69 73 74 20 2a 70 20 3d 20 2a 70 70 3b  ngList *p = *pp;
5f10: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
5f20: 6f 72 20 67 72 6f 77 20 74 68 65 20 50 65 6e 64  or grow the Pend
5f30: 69 6e 67 4c 69 73 74 20 61 73 20 72 65 71 75 69  ingList as requi
5f40: 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 21 70  red. */.  if( !p
5f50: 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69   ){.    p = sqli
5f60: 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
5f70: 66 28 2a 70 29 20 2b 20 31 30 30 29 3b 0a 20 20  f(*p) + 100);.  
5f80: 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
5f90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5fa0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
5fb0: 20 70 2d 3e 6e 53 70 61 63 65 20 3d 20 31 30 30   p->nSpace = 100
5fc0: 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74 61 20 3d  ;.    p->aData =
5fd0: 20 28 63 68 61 72 20 2a 29 26 70 5b 31 5d 3b 0a   (char *)&p[1];.
5fe0: 20 20 20 20 70 2d 3e 6e 44 61 74 61 20 3d 20 30      p->nData = 0
5ff0: 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28  ;.  }.  else if(
6000: 20 70 2d 3e 6e 44 61 74 61 2b 46 54 53 33 5f 56   p->nData+FTS3_V
6010: 41 52 49 4e 54 5f 4d 41 58 2b 31 3e 70 2d 3e 6e  ARINT_MAX+1>p->n
6020: 53 70 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74  Space ){.    int
6030: 20 6e 4e 65 77 20 3d 20 70 2d 3e 6e 53 70 61 63   nNew = p->nSpac
6040: 65 20 2a 20 32 3b 0a 20 20 20 20 70 20 3d 20 73  e * 2;.    p = s
6050: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
6060: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 6e  , sizeof(*p) + n
6070: 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 21 70  New);.    if( !p
6080: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6090: 33 5f 66 72 65 65 28 2a 70 70 29 3b 0a 20 20 20  3_free(*pp);.   
60a0: 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 20 20     *pp = 0;.    
60b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
60c0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
60d0: 20 70 2d 3e 6e 53 70 61 63 65 20 3d 20 6e 4e 65   p->nSpace = nNe
60e0: 77 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74 61 20  w;.    p->aData 
60f0: 3d 20 28 63 68 61 72 20 2a 29 26 70 5b 31 5d 3b  = (char *)&p[1];
6100: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e  .  }..  /* Appen
6110: 64 20 74 68 65 20 6e 65 77 20 73 65 72 69 61 6c  d the new serial
6120: 69 7a 65 64 20 76 61 72 69 6e 74 20 74 6f 20 74  ized varint to t
6130: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69  he end of the li
6140: 73 74 2e 20 2a 2f 0a 20 20 70 2d 3e 6e 44 61 74  st. */.  p->nDat
6150: 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  a += sqlite3Fts3
6160: 50 75 74 56 61 72 69 6e 74 28 26 70 2d 3e 61 44  PutVarint(&p->aD
6170: 61 74 61 5b 70 2d 3e 6e 44 61 74 61 5d 2c 20 69  ata[p->nData], i
6180: 29 3b 0a 20 20 70 2d 3e 61 44 61 74 61 5b 70 2d  );.  p->aData[p-
6190: 3e 6e 44 61 74 61 5d 20 3d 20 27 5c 30 27 3b 0a  >nData] = '\0';.
61a0: 20 20 2a 70 70 20 3d 20 70 3b 0a 20 20 72 65 74    *pp = p;.  ret
61b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
61c0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 64 6f  ../*.** Add a do
61d0: 63 69 64 2f 63 6f 6c 75 6d 6e 2f 70 6f 73 69 74  cid/column/posit
61e0: 69 6f 6e 20 65 6e 74 72 79 20 74 6f 20 61 20 50  ion entry to a P
61f0: 65 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63  endingList struc
6200: 74 75 72 65 2e 20 4e 6f 6e 2d 7a 65 72 6f 0a 2a  ture. Non-zero.*
6210: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
6220: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 69   the structure i
6230: 73 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  s sqlite3_reallo
6240: 63 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  ced as part of a
6250: 64 64 69 6e 67 0a 2a 2a 20 74 68 65 20 65 6e 74  dding.** the ent
6260: 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 7a  ry. Otherwise, z
6270: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ero..**.** If an
6280: 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
6290: 73 2c 20 2a 70 52 63 20 69 73 20 73 65 74 20 74  s, *pRc is set t
62a0: 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 62  o SQLITE_NOMEM b
62b0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
62c0: 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 61 6c 77 61  .** Zero is alwa
62d0: 79 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74  ys returned in t
62e0: 68 69 73 20 63 61 73 65 2e 20 4f 74 68 65 72 77  his case. Otherw
62f0: 69 73 65 2c 20 69 66 20 6e 6f 20 4f 4f 4d 20 65  ise, if no OOM e
6300: 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
6310: 69 74 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  it is set to SQL
6320: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
6330: 63 20 69 6e 74 20 66 74 73 33 50 65 6e 64 69 6e  c int fts3Pendin
6340: 67 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50  gListAppend(.  P
6350: 65 6e 64 69 6e 67 4c 69 73 74 20 2a 2a 70 70 2c  endingList **pp,
6360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6370: 2a 20 49 4e 2f 4f 55 54 3a 20 50 65 6e 64 69 6e  * IN/OUT: Pendin
6380: 67 4c 69 73 74 20 73 74 72 75 63 74 75 72 65 20  gList structure 
6390: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
63a0: 36 34 20 69 44 6f 63 69 64 2c 20 20 20 20 20 20  64 iDocid,      
63b0: 20 20 20 20 20 2f 2a 20 44 6f 63 69 64 20 66 6f       /* Docid fo
63c0: 72 20 65 6e 74 72 79 20 74 6f 20 61 64 64 20 2a  r entry to add *
63d0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
63e0: 34 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  4 iCol,         
63f0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 66 6f      /* Column fo
6400: 72 20 65 6e 74 72 79 20 74 6f 20 61 64 64 20 2a  r entry to add *
6410: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
6420: 34 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20  4 iPos,         
6430: 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20      /* Position 
6440: 6f 66 20 74 65 72 6d 20 66 6f 72 20 65 6e 74 72  of term for entr
6450: 79 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69 6e  y to add */.  in
6460: 74 20 2a 70 52 63 20 20 20 20 20 20 20 20 20 20  t *pRc          
6470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6480: 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 63 6f 64   OUT: Return cod
6490: 65 20 2a 2f 0a 29 7b 0a 20 20 50 65 6e 64 69 6e  e */.){.  Pendin
64a0: 67 4c 69 73 74 20 2a 70 20 3d 20 2a 70 70 3b 0a  gList *p = *pp;.
64b0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
64c0: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
64d0: 20 21 70 20 7c 7c 20 70 2d 3e 69 4c 61 73 74 44   !p || p->iLastD
64e0: 6f 63 69 64 3c 3d 69 44 6f 63 69 64 20 29 3b 0a  ocid<=iDocid );.
64f0: 0a 20 20 69 66 28 20 21 70 20 7c 7c 20 70 2d 3e  .  if( !p || p->
6500: 69 4c 61 73 74 44 6f 63 69 64 21 3d 69 44 6f 63  iLastDocid!=iDoc
6510: 69 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  id ){.    sqlite
6520: 33 5f 69 6e 74 36 34 20 69 44 65 6c 74 61 20 3d  3_int64 iDelta =
6530: 20 69 44 6f 63 69 64 20 2d 20 28 70 20 3f 20 70   iDocid - (p ? p
6540: 2d 3e 69 4c 61 73 74 44 6f 63 69 64 20 3a 20 30  ->iLastDocid : 0
6550: 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
6560: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
6570: 3e 6e 44 61 74 61 3c 70 2d 3e 6e 53 70 61 63 65  >nData<p->nSpace
6580: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
6590: 28 20 70 2d 3e 61 44 61 74 61 5b 70 2d 3e 6e 44  ( p->aData[p->nD
65a0: 61 74 61 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ata]==0 );.     
65b0: 20 70 2d 3e 6e 44 61 74 61 2b 2b 3b 0a 20 20 20   p->nData++;.   
65c0: 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54   }.    if( SQLIT
65d0: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 66 74 73 33  E_OK!=(rc = fts3
65e0: 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e  PendingListAppen
65f0: 64 56 61 72 69 6e 74 28 26 70 2c 20 69 44 65 6c  dVarint(&p, iDel
6600: 74 61 29 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ta)) ){.      go
6610: 74 6f 20 70 65 6e 64 69 6e 67 6c 69 73 74 61 70  to pendinglistap
6620: 70 65 6e 64 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  pend_out;.    }.
6630: 20 20 20 20 70 2d 3e 69 4c 61 73 74 43 6f 6c 20      p->iLastCol 
6640: 3d 20 2d 31 3b 0a 20 20 20 20 70 2d 3e 69 4c 61  = -1;.    p->iLa
6650: 73 74 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20 70  stPos = 0;.    p
6660: 2d 3e 69 4c 61 73 74 44 6f 63 69 64 20 3d 20 69  ->iLastDocid = i
6670: 44 6f 63 69 64 3b 0a 20 20 7d 0a 20 20 69 66 28  Docid;.  }.  if(
6680: 20 69 43 6f 6c 3e 30 20 26 26 20 70 2d 3e 69 4c   iCol>0 && p->iL
6690: 61 73 74 43 6f 6c 21 3d 69 43 6f 6c 20 29 7b 0a  astCol!=iCol ){.
66a0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
66b0: 4b 21 3d 28 72 63 20 3d 20 66 74 73 33 50 65 6e  K!=(rc = fts3Pen
66c0: 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61  dingListAppendVa
66d0: 72 69 6e 74 28 26 70 2c 20 31 29 29 0a 20 20 20  rint(&p, 1)).   
66e0: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
66f0: 28 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e  (rc = fts3Pendin
6700: 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e  gListAppendVarin
6710: 74 28 26 70 2c 20 69 43 6f 6c 29 29 0a 20 20 20  t(&p, iCol)).   
6720: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
6730: 65 6e 64 69 6e 67 6c 69 73 74 61 70 70 65 6e 64  endinglistappend
6740: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
6750: 70 2d 3e 69 4c 61 73 74 43 6f 6c 20 3d 20 69 43  p->iLastCol = iC
6760: 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 4c 61 73 74  ol;.    p->iLast
6770: 50 6f 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  Pos = 0;.  }.  i
6780: 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20  f( iCol>=0 ){.  
6790: 20 20 61 73 73 65 72 74 28 20 69 50 6f 73 3e 70    assert( iPos>p
67a0: 2d 3e 69 4c 61 73 74 50 6f 73 20 7c 7c 20 28 69  ->iLastPos || (i
67b0: 50 6f 73 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 61  Pos==0 && p->iLa
67c0: 73 74 50 6f 73 3d 3d 30 29 20 29 3b 0a 20 20 20  stPos==0) );.   
67d0: 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e   rc = fts3Pendin
67e0: 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e  gListAppendVarin
67f0: 74 28 26 70 2c 20 32 2b 69 50 6f 73 2d 70 2d 3e  t(&p, 2+iPos-p->
6800: 69 4c 61 73 74 50 6f 73 29 3b 0a 20 20 20 20 69  iLastPos);.    i
6810: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6820: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 61   ){.      p->iLa
6830: 73 74 50 6f 73 20 3d 20 69 50 6f 73 3b 0a 20 20  stPos = iPos;.  
6840: 20 20 7d 0a 20 20 7d 0a 0a 20 70 65 6e 64 69 6e    }.  }.. pendin
6850: 67 6c 69 73 74 61 70 70 65 6e 64 5f 6f 75 74 3a  glistappend_out:
6860: 0a 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20  .  *pRc = rc;.  
6870: 69 66 28 20 70 21 3d 2a 70 70 20 29 7b 0a 20 20  if( p!=*pp ){.  
6880: 20 20 2a 70 70 20 3d 20 70 3b 0a 20 20 20 20 72    *pp = p;.    r
6890: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
68a0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
68b0: 2a 20 46 72 65 65 20 61 20 50 65 6e 64 69 6e 67  * Free a Pending
68c0: 4c 69 73 74 20 6f 62 6a 65 63 74 20 61 6c 6c 6f  List object allo
68d0: 63 61 74 65 64 20 62 79 20 66 74 73 33 50 65 6e  cated by fts3Pen
68e0: 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 28 29  dingListAppend()
68f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6900: 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74   fts3PendingList
6910: 44 65 6c 65 74 65 28 50 65 6e 64 69 6e 67 4c 69  Delete(PendingLi
6920: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71  st *pList){.  sq
6930: 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 69 73 74  lite3_free(pList
6940: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  );.}../*.** Add 
6950: 61 6e 20 65 6e 74 72 79 20 74 6f 20 6f 6e 65 20  an entry to one 
6960: 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74  of the pending-t
6970: 65 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65 73  erms hash tables
6980: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6990: 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73  fts3PendingTerms
69a0: 41 64 64 4f 6e 65 28 0a 20 20 46 74 73 33 54 61  AddOne(.  Fts3Ta
69b0: 62 6c 65 20 2a 70 2c 0a 20 20 69 6e 74 20 69 43  ble *p,.  int iC
69c0: 6f 6c 2c 0a 20 20 69 6e 74 20 69 50 6f 73 2c 0a  ol,.  int iPos,.
69d0: 20 20 46 74 73 33 48 61 73 68 20 2a 70 48 61 73    Fts3Hash *pHas
69e0: 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
69f0: 20 20 2f 2a 20 50 65 6e 64 69 6e 67 20 74 65 72    /* Pending ter
6a00: 6d 73 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f  ms hash table to
6a10: 20 61 64 64 20 65 6e 74 72 79 20 74 6f 20 2a 2f   add entry to */
6a20: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6a30: 54 6f 6b 65 6e 2c 0a 20 20 69 6e 74 20 6e 54 6f  Token,.  int nTo
6a40: 6b 65 6e 0a 29 7b 0a 20 20 50 65 6e 64 69 6e 67  ken.){.  Pending
6a50: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 69  List *pList;.  i
6a60: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6a70: 4b 3b 0a 0a 20 20 70 4c 69 73 74 20 3d 20 28 50  K;..  pList = (P
6a80: 65 6e 64 69 6e 67 4c 69 73 74 20 2a 29 66 74 73  endingList *)fts
6a90: 33 48 61 73 68 46 69 6e 64 28 70 48 61 73 68 2c  3HashFind(pHash,
6aa0: 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29   zToken, nToken)
6ab0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
6ac0: 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67  .    p->nPending
6ad0: 44 61 74 61 20 2d 3d 20 28 70 4c 69 73 74 2d 3e  Data -= (pList->
6ae0: 6e 44 61 74 61 20 2b 20 6e 54 6f 6b 65 6e 20 2b  nData + nToken +
6af0: 20 73 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68   sizeof(Fts3Hash
6b00: 45 6c 65 6d 29 29 3b 0a 20 20 7d 0a 20 20 69 66  Elem));.  }.  if
6b10: 28 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73  ( fts3PendingLis
6b20: 74 41 70 70 65 6e 64 28 26 70 4c 69 73 74 2c 20  tAppend(&pList, 
6b30: 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 2c 20 69  p->iPrevDocid, i
6b40: 43 6f 6c 2c 20 69 50 6f 73 2c 20 26 72 63 29 20  Col, iPos, &rc) 
6b50: 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  ){.    if( pList
6b60: 3d 3d 66 74 73 33 48 61 73 68 49 6e 73 65 72 74  ==fts3HashInsert
6b70: 28 70 48 61 73 68 2c 20 7a 54 6f 6b 65 6e 2c 20  (pHash, zToken, 
6b80: 6e 54 6f 6b 65 6e 2c 20 70 4c 69 73 74 29 20 29  nToken, pList) )
6b90: 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f  {.      /* Mallo
6ba0: 63 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 69  c failed while i
6bb0: 6e 73 65 72 74 69 6e 67 20 74 68 65 20 6e 65 77  nserting the new
6bc0: 20 65 6e 74 72 79 2e 20 54 68 69 73 20 63 61 6e   entry. This can
6bd0: 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20   only .      ** 
6be0: 68 61 70 70 65 6e 20 69 66 20 74 68 65 72 65 20  happen if there 
6bf0: 77 61 73 20 6e 6f 20 70 72 65 76 69 6f 75 73 20  was no previous 
6c00: 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74  entry for this t
6c10: 6f 6b 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  oken..      */. 
6c20: 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d       assert( 0==
6c30: 66 74 73 33 48 61 73 68 46 69 6e 64 28 70 48 61  fts3HashFind(pHa
6c40: 73 68 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  sh, zToken, nTok
6c50: 65 6e 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  en) );.      sql
6c60: 69 74 65 33 5f 66 72 65 65 28 70 4c 69 73 74 29  ite3_free(pList)
6c70: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
6c80: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
6c90: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
6ca0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6cb0: 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20  p->nPendingData 
6cc0: 2b 3d 20 28 70 4c 69 73 74 2d 3e 6e 44 61 74 61  += (pList->nData
6cd0: 20 2b 20 6e 54 6f 6b 65 6e 20 2b 20 73 69 7a 65   + nToken + size
6ce0: 6f 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d 29  of(Fts3HashElem)
6cf0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
6d00: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 6b  rc;.}../*.** Tok
6d10: 65 6e 69 7a 65 20 74 68 65 20 6e 75 6c 2d 74 65  enize the nul-te
6d20: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
6d30: 7a 54 65 78 74 20 61 6e 64 20 61 64 64 20 61 6c  zText and add al
6d40: 6c 20 74 6f 6b 65 6e 73 20 74 6f 20 74 68 65 0a  l tokens to the.
6d50: 2a 2a 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73  ** pending-terms
6d60: 20 68 61 73 68 2d 74 61 62 6c 65 2e 20 54 68 65   hash-table. The
6d70: 20 64 6f 63 69 64 20 75 73 65 64 20 69 73 20 74   docid used is t
6d80: 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 73 74  hat currently st
6d90: 6f 72 65 64 20 69 6e 0a 2a 2a 20 70 2d 3e 69 50  ored in.** p->iP
6da0: 72 65 76 44 6f 63 69 64 2c 20 61 6e 64 20 74 68  revDocid, and th
6db0: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 73 70 65 63  e column is spec
6dc0: 69 66 69 65 64 20 62 79 20 61 72 67 75 6d 65 6e  ified by argumen
6dd0: 74 20 69 43 6f 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  t iCol..**.** If
6de0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
6df0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
6e00: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ed. Otherwise, a
6e10: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
6e20: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
6e30: 6e 74 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65  nt fts3PendingTe
6e40: 72 6d 73 41 64 64 28 0a 20 20 46 74 73 33 54 61  rmsAdd(.  Fts3Ta
6e50: 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
6e60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
6e70: 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 74 65  le into which te
6e80: 78 74 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72  xt will be inser
6e90: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61  ted */.  int iLa
6ea0: 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  ngid,           
6eb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67           /* Lang
6ec0: 75 61 67 65 20 69 64 20 74 6f 20 75 73 65 20 2a  uage id to use *
6ed0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
6ee0: 7a 54 65 78 74 2c 20 20 20 20 20 20 20 20 20 20  zText,          
6ef0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 64      /* Text of d
6f00: 6f 63 75 6d 65 6e 74 20 74 6f 20 62 65 20 69 6e  ocument to be in
6f10: 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  serted */.  int 
6f20: 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  iCol,           
6f30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
6f40: 6f 6c 75 6d 6e 20 69 6e 74 6f 20 77 68 69 63 68  olumn into which
6f50: 20 74 65 78 74 20 69 73 20 62 65 69 6e 67 20 69   text is being i
6f60: 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 75 33 32  nserted */.  u32
6f70: 20 2a 70 6e 57 6f 72 64 20 20 20 20 20 20 20 20   *pnWord        
6f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6f90: 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 74  OUT: Number of t
6fa0: 6f 6b 65 6e 73 20 69 6e 73 65 72 74 65 64 20 2a  okens inserted *
6fb0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
6fc0: 20 69 6e 74 20 69 53 74 61 72 74 3b 0a 20 20 69   int iStart;.  i
6fd0: 6e 74 20 69 45 6e 64 3b 0a 20 20 69 6e 74 20 69  nt iEnd;.  int i
6fe0: 50 6f 73 3b 0a 20 20 69 6e 74 20 6e 57 6f 72 64  Pos;.  int nWord
6ff0: 20 3d 20 30 3b 0a 0a 20 20 63 68 61 72 20 63 6f   = 0;..  char co
7000: 6e 73 74 20 2a 7a 54 6f 6b 65 6e 3b 0a 20 20 69  nst *zToken;.  i
7010: 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 0a 20 20 73 71  nt nToken;..  sq
7020: 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 20  lite3_tokenizer 
7030: 2a 70 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 70 2d  *pTokenizer = p-
7040: 3e 70 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 73  >pTokenizer;.  s
7050: 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
7060: 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73 74 20 2a 70  _module const *p
7070: 4d 6f 64 75 6c 65 20 3d 20 70 54 6f 6b 65 6e 69  Module = pTokeni
7080: 7a 65 72 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20  zer->pModule;.  
7090: 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65  sqlite3_tokenize
70a0: 72 5f 63 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a  r_cursor *pCsr;.
70b0: 20 20 69 6e 74 20 28 2a 78 4e 65 78 74 29 28 73    int (*xNext)(s
70c0: 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
70d0: 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72  _cursor *pCursor
70e0: 2c 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ,.      const ch
70f0: 61 72 2a 2a 2c 69 6e 74 2a 2c 69 6e 74 2a 2c 69  ar**,int*,int*,i
7100: 6e 74 2a 2c 69 6e 74 2a 29 3b 0a 0a 20 20 61 73  nt*,int*);..  as
7110: 73 65 72 74 28 20 70 54 6f 6b 65 6e 69 7a 65 72  sert( pTokenizer
7120: 20 26 26 20 70 4d 6f 64 75 6c 65 20 29 3b 0a 0a   && pModule );..
7130: 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72    /* If the user
7140: 20 68 61 73 20 69 6e 73 65 72 74 65 64 20 61 20   has inserted a 
7150: 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68 69 73  NULL value, this
7160: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
7170: 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a   called with.  *
7180: 2a 20 7a 54 65 78 74 3d 3d 30 2e 20 49 6e 20 74  * zText==0. In t
7190: 68 69 73 20 63 61 73 65 2c 20 61 64 64 20 7a 65  his case, add ze
71a0: 72 6f 20 74 6f 6b 65 6e 20 65 6e 74 72 69 65 73  ro token entries
71b0: 20 74 6f 20 74 68 65 20 68 61 73 68 20 74 61 62   to the hash tab
71c0: 6c 65 20 61 6e 64 20 0a 20 20 2a 2a 20 72 65 74  le and .  ** ret
71d0: 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20  urn early. */.  
71e0: 69 66 28 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a  if( zText==0 ){.
71f0: 20 20 20 20 2a 70 6e 57 6f 72 64 20 3d 20 30 3b      *pnWord = 0;
7200: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7210: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63  TE_OK;.  }..  rc
7220: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 4f 70   = sqlite3Fts3Op
7230: 65 6e 54 6f 6b 65 6e 69 7a 65 72 28 70 54 6f 6b  enTokenizer(pTok
7240: 65 6e 69 7a 65 72 2c 20 69 4c 61 6e 67 69 64 2c  enizer, iLangid,
7250: 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26 70 43 73   zText, -1, &pCs
7260: 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
7270: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
7280: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
7290: 20 78 4e 65 78 74 20 3d 20 70 4d 6f 64 75 6c 65   xNext = pModule
72a0: 2d 3e 78 4e 65 78 74 3b 0a 20 20 77 68 69 6c 65  ->xNext;.  while
72b0: 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 0a  ( SQLITE_OK==rc.
72c0: 20 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f        && SQLITE_
72d0: 4f 4b 3d 3d 28 72 63 20 3d 20 78 4e 65 78 74 28  OK==(rc = xNext(
72e0: 70 43 73 72 2c 20 26 7a 54 6f 6b 65 6e 2c 20 26  pCsr, &zToken, &
72f0: 6e 54 6f 6b 65 6e 2c 20 26 69 53 74 61 72 74 2c  nToken, &iStart,
7300: 20 26 69 45 6e 64 2c 20 26 69 50 6f 73 29 29 0a   &iEnd, &iPos)).
7310: 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a    ){.    int i;.
7320: 20 20 20 20 69 66 28 20 69 50 6f 73 3e 3d 6e 57      if( iPos>=nW
7330: 6f 72 64 20 29 20 6e 57 6f 72 64 20 3d 20 69 50  ord ) nWord = iP
7340: 6f 73 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f  os+1;..    /* Po
7350: 73 69 74 69 6f 6e 73 20 63 61 6e 6e 6f 74 20 62  sitions cannot b
7360: 65 20 6e 65 67 61 74 69 76 65 3b 20 77 65 20 75  e negative; we u
7370: 73 65 20 2d 31 20 61 73 20 61 20 74 65 72 6d 69  se -1 as a termi
7380: 6e 61 74 6f 72 20 69 6e 74 65 72 6e 61 6c 6c 79  nator internally
7390: 2e 0a 20 20 20 20 2a 2a 20 54 6f 6b 65 6e 73 20  ..    ** Tokens 
73a0: 6d 75 73 74 20 68 61 76 65 20 61 20 6e 6f 6e 2d  must have a non-
73b0: 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 0a 20 20 20  zero length..   
73c0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 6f 73   */.    if( iPos
73d0: 3c 30 20 7c 7c 20 21 7a 54 6f 6b 65 6e 20 7c 7c  <0 || !zToken ||
73e0: 20 6e 54 6f 6b 65 6e 3c 3d 30 20 29 7b 0a 20 20   nToken<=0 ){.  
73f0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
7400: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
7410: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
7420: 2a 20 41 64 64 20 74 68 65 20 74 65 72 6d 20 74  * Add the term t
7430: 6f 20 74 68 65 20 74 65 72 6d 73 20 69 6e 64 65  o the terms inde
7440: 78 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74  x */.    rc = ft
7450: 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 41 64  s3PendingTermsAd
7460: 64 4f 6e 65 28 0a 20 20 20 20 20 20 20 20 70 2c  dOne(.        p,
7470: 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 26 70 2d   iCol, iPos, &p-
7480: 3e 61 49 6e 64 65 78 5b 30 5d 2e 68 50 65 6e 64  >aIndex[0].hPend
7490: 69 6e 67 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f  ing, zToken, nTo
74a0: 6b 65 6e 0a 20 20 20 20 29 3b 0a 20 20 20 20 0a  ken.    );.    .
74b0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74      /* Add the t
74c0: 65 72 6d 20 74 6f 20 65 61 63 68 20 6f 66 20 74  erm to each of t
74d0: 68 65 20 70 72 65 66 69 78 20 69 6e 64 65 78 65  he prefix indexe
74e0: 73 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  s that it is not
74f0: 20 74 6f 6f 20 0a 20 20 20 20 2a 2a 20 73 68 6f   too .    ** sho
7500: 72 74 20 66 6f 72 2e 20 2a 2f 0a 20 20 20 20 66  rt for. */.    f
7510: 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49  or(i=1; rc==SQLI
7520: 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 49  TE_OK && i<p->nI
7530: 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ndex; i++){.    
7540: 20 20 73 74 72 75 63 74 20 46 74 73 33 49 6e 64    struct Fts3Ind
7550: 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 26 70 2d  ex *pIndex = &p-
7560: 3e 61 49 6e 64 65 78 5b 69 5d 3b 0a 20 20 20 20  >aIndex[i];.    
7570: 20 20 69 66 28 20 6e 54 6f 6b 65 6e 3c 70 49 6e    if( nToken<pIn
7580: 64 65 78 2d 3e 6e 50 72 65 66 69 78 20 29 20 63  dex->nPrefix ) c
7590: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 72  ontinue;.      r
75a0: 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54  c = fts3PendingT
75b0: 65 72 6d 73 41 64 64 4f 6e 65 28 0a 20 20 20 20  ermsAddOne(.    
75c0: 20 20 20 20 20 20 70 2c 20 69 43 6f 6c 2c 20 69        p, iCol, i
75d0: 50 6f 73 2c 20 26 70 49 6e 64 65 78 2d 3e 68 50  Pos, &pIndex->hP
75e0: 65 6e 64 69 6e 67 2c 20 7a 54 6f 6b 65 6e 2c 20  ending, zToken, 
75f0: 70 49 6e 64 65 78 2d 3e 6e 50 72 65 66 69 78 0a  pIndex->nPrefix.
7600: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
7610: 20 7d 0a 0a 20 20 70 4d 6f 64 75 6c 65 2d 3e 78   }..  pModule->x
7620: 43 6c 6f 73 65 28 70 43 73 72 29 3b 0a 20 20 2a  Close(pCsr);.  *
7630: 70 6e 57 6f 72 64 20 3d 20 6e 57 6f 72 64 3b 0a  pnWord = nWord;.
7640: 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
7650: 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49  LITE_DONE ? SQLI
7660: 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a  TE_OK : rc);.}..
7670: 2f 2a 20 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74  /* .** Calling t
7680: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64  his function ind
7690: 69 63 61 74 65 73 20 74 68 61 74 20 73 75 62 73  icates that subs
76a0: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
76b0: 0a 2a 2a 20 66 74 73 33 50 65 6e 64 69 6e 67 54  .** fts3PendingT
76c0: 65 72 6d 73 41 64 64 28 29 20 61 72 65 20 74 6f  ermsAdd() are to
76d0: 20 61 64 64 20 74 65 72 6d 2f 70 6f 73 69 74 69   add term/positi
76e0: 6f 6e 2d 6c 69 73 74 20 70 61 69 72 73 20 66 6f  on-list pairs fo
76f0: 72 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  r the.** content
7700: 73 20 6f 66 20 74 68 65 20 64 6f 63 75 6d 65 6e  s of the documen
7710: 74 20 77 69 74 68 20 64 6f 63 69 64 20 69 44 6f  t with docid iDo
7720: 63 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  cid..*/.static i
7730: 6e 74 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65  nt fts3PendingTe
7740: 72 6d 73 44 6f 63 69 64 28 0a 20 20 46 74 73 33  rmsDocid(.  Fts3
7750: 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
7760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
7770: 75 6c 6c 2d 74 65 78 74 20 74 61 62 6c 65 20 68  ull-text table h
7780: 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  andle */.  int i
7790: 4c 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20  Langid,         
77a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
77b0: 6e 67 75 61 67 65 20 69 64 20 6f 66 20 72 6f 77  nguage id of row
77c0: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a   being written *
77d0: 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  /.  sqlite_int64
77e0: 20 69 44 6f 63 69 64 20 20 20 20 20 20 20 20 20   iDocid         
77f0: 20 20 20 20 2f 2a 20 44 6f 63 69 64 20 6f 66 20      /* Docid of 
7800: 72 6f 77 20 62 65 69 6e 67 20 77 72 69 74 74 65  row being writte
7810: 6e 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  n */.){.  assert
7820: 28 20 69 4c 61 6e 67 69 64 3e 3d 30 20 29 3b 0a  ( iLangid>=0 );.
7830: 0a 20 20 2f 2a 20 54 4f 44 4f 28 73 68 65 73 73  .  /* TODO(shess
7840: 29 20 45 78 70 6c 6f 72 65 20 77 68 65 74 68 65  ) Explore whethe
7850: 72 20 70 61 72 74 69 61 6c 6c 79 20 66 6c 75 73  r partially flus
7860: 68 69 6e 67 20 74 68 65 20 62 75 66 66 65 72 20  hing the buffer 
7870: 6f 6e 0a 20 20 2a 2a 20 66 6f 72 63 65 64 2d 66  on.  ** forced-f
7880: 6c 75 73 68 20 77 6f 75 6c 64 20 70 72 6f 76 69  lush would provi
7890: 64 65 20 62 65 74 74 65 72 20 70 65 72 66 6f 72  de better perfor
78a0: 6d 61 6e 63 65 2e 20 20 49 20 73 75 73 70 65 63  mance.  I suspec
78b0: 74 20 74 68 61 74 20 69 66 0a 20 20 2a 2a 20 77  t that if.  ** w
78c0: 65 20 6f 72 64 65 72 65 64 20 74 68 65 20 64 6f  e ordered the do
78d0: 63 6c 69 73 74 73 20 62 79 20 73 69 7a 65 20 61  clists by size a
78e0: 6e 64 20 66 6c 75 73 68 65 64 20 74 68 65 20 6c  nd flushed the l
78f0: 61 72 67 65 73 74 20 75 6e 74 69 6c 20 74 68 65  argest until the
7900: 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 77 61 73  .  ** buffer was
7910: 20 68 61 6c 66 20 65 6d 70 74 79 2c 20 74 68 61   half empty, tha
7920: 74 20 77 6f 75 6c 64 20 6c 65 74 20 74 68 65 20  t would let the 
7930: 6c 65 73 73 20 66 72 65 71 75 65 6e 74 20 74 65  less frequent te
7940: 72 6d 73 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74  rms.  ** generat
7950: 65 20 6c 6f 6e 67 65 72 20 64 6f 63 6c 69 73 74  e longer doclist
7960: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44  s..  */.  if( iD
7970: 6f 63 69 64 3c 3d 70 2d 3e 69 50 72 65 76 44 6f  ocid<=p->iPrevDo
7980: 63 69 64 20 0a 20 20 20 7c 7c 20 70 2d 3e 69 50  cid .   || p->iP
7990: 72 65 76 4c 61 6e 67 69 64 21 3d 69 4c 61 6e 67  revLangid!=iLang
79a0: 69 64 0a 20 20 20 7c 7c 20 70 2d 3e 6e 50 65 6e  id.   || p->nPen
79b0: 64 69 6e 67 44 61 74 61 3e 70 2d 3e 6e 4d 61 78  dingData>p->nMax
79c0: 50 65 6e 64 69 6e 67 44 61 74 61 20 0a 20 20 29  PendingData .  )
79d0: 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
79e0: 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e  qlite3Fts3Pendin
79f0: 67 54 65 72 6d 73 46 6c 75 73 68 28 70 29 3b 0a  gTermsFlush(p);.
7a00: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
7a10: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
7a20: 63 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 50 72 65  c;.  }.  p->iPre
7a30: 76 44 6f 63 69 64 20 3d 20 69 44 6f 63 69 64 3b  vDocid = iDocid;
7a40: 0a 20 20 70 2d 3e 69 50 72 65 76 4c 61 6e 67 69  .  p->iPrevLangi
7a50: 64 20 3d 20 69 4c 61 6e 67 69 64 3b 0a 20 20 72  d = iLangid;.  r
7a60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7a70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  .}../*.** Discar
7a80: 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
7a90: 66 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65  f the pending-te
7aa0: 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65 73 2e  rms hash tables.
7ab0: 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
7ac0: 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d  3Fts3PendingTerm
7ad0: 73 43 6c 65 61 72 28 46 74 73 33 54 61 62 6c 65  sClear(Fts3Table
7ae0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
7af0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
7b00: 49 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  Index; i++){.   
7b10: 20 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 70   Fts3HashElem *p
7b20: 45 6c 65 6d 3b 0a 20 20 20 20 46 74 73 33 48 61  Elem;.    Fts3Ha
7b30: 73 68 20 2a 70 48 61 73 68 20 3d 20 26 70 2d 3e  sh *pHash = &p->
7b40: 61 49 6e 64 65 78 5b 69 5d 2e 68 50 65 6e 64 69  aIndex[i].hPendi
7b50: 6e 67 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65  ng;.    for(pEle
7b60: 6d 3d 66 74 73 33 48 61 73 68 46 69 72 73 74 28  m=fts3HashFirst(
7b70: 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  pHash); pElem; p
7b80: 45 6c 65 6d 3d 66 74 73 33 48 61 73 68 4e 65 78  Elem=fts3HashNex
7b90: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20  t(pElem)){.     
7ba0: 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70 4c   PendingList *pL
7bb0: 69 73 74 20 3d 20 28 50 65 6e 64 69 6e 67 4c 69  ist = (PendingLi
7bc0: 73 74 20 2a 29 66 74 73 33 48 61 73 68 44 61 74  st *)fts3HashDat
7bd0: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20  a(pElem);.      
7be0: 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 44  fts3PendingListD
7bf0: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
7c00: 20 20 7d 0a 20 20 20 20 66 74 73 33 48 61 73 68    }.    fts3Hash
7c10: 43 6c 65 61 72 28 70 48 61 73 68 29 3b 0a 20 20  Clear(pHash);.  
7c20: 7d 0a 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44  }.  p->nPendingD
7c30: 61 74 61 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ata = 0;.}../*.*
7c40: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
7c50: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
7c60: 20 78 55 70 64 61 74 65 28 29 20 6d 65 74 68 6f   xUpdate() metho
7c70: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20  d as part of an 
7c80: 49 4e 53 45 52 54 0a 2a 2a 20 6f 70 65 72 61 74  INSERT.** operat
7c90: 69 6f 6e 2e 20 49 74 20 61 64 64 73 20 65 6e 74  ion. It adds ent
7ca0: 72 69 65 73 20 66 6f 72 20 65 61 63 68 20 74 65  ries for each te
7cb0: 72 6d 20 69 6e 20 74 68 65 20 6e 65 77 20 72 65  rm in the new re
7cc0: 63 6f 72 64 20 74 6f 20 74 68 65 0a 2a 2a 20 70  cord to the.** p
7cd0: 65 6e 64 69 6e 67 54 65 72 6d 73 20 68 61 73 68  endingTerms hash
7ce0: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 72   table..**.** Ar
7cf0: 67 75 6d 65 6e 74 20 61 70 56 61 6c 20 69 73 20  gument apVal is 
7d00: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
7d10: 73 69 6d 69 6c 61 72 6c 79 20 6e 61 6d 65 64 20  similarly named 
7d20: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
7d30: 74 6f 0a 2a 2a 20 66 74 73 33 49 6e 73 65 72 74  to.** fts3Insert
7d40: 44 61 74 61 28 29 2e 20 50 61 72 61 6d 65 74 65  Data(). Paramete
7d50: 72 20 69 44 6f 63 69 64 20 69 73 20 74 68 65 20  r iDocid is the 
7d60: 64 6f 63 69 64 20 6f 66 20 74 68 65 20 6e 65 77  docid of the new
7d70: 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
7d80: 69 6e 74 20 66 74 73 33 49 6e 73 65 72 74 54 65  int fts3InsertTe
7d90: 72 6d 73 28 0a 20 20 46 74 73 33 54 61 62 6c 65  rms(.  Fts3Table
7da0: 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 4c 61 6e   *p, .  int iLan
7db0: 67 69 64 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  gid, .  sqlite3_
7dc0: 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20 0a  value **apVal, .
7dd0: 20 20 75 33 32 20 2a 61 53 7a 0a 29 7b 0a 20 20    u32 *aSz.){.  
7de0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
7df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e00: 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
7e10: 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
7e20: 32 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  2; i<p->nColumn+
7e30: 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  2; i++){.    con
7e40: 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d  st char *zText =
7e50: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
7e60: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
7e70: 74 28 61 70 56 61 6c 5b 69 5d 29 3b 0a 20 20 20  t(apVal[i]);.   
7e80: 20 69 6e 74 20 72 63 20 3d 20 66 74 73 33 50 65   int rc = fts3Pe
7e90: 6e 64 69 6e 67 54 65 72 6d 73 41 64 64 28 70 2c  ndingTermsAdd(p,
7ea0: 20 69 4c 61 6e 67 69 64 2c 20 7a 54 65 78 74 2c   iLangid, zText,
7eb0: 20 69 2d 32 2c 20 26 61 53 7a 5b 69 2d 32 5d 29   i-2, &aSz[i-2])
7ec0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
7ed0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
7ee0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
7ef0: 7d 0a 20 20 20 20 61 53 7a 5b 70 2d 3e 6e 43 6f  }.    aSz[p->nCo
7f00: 6c 75 6d 6e 5d 20 2b 3d 20 73 71 6c 69 74 65 33  lumn] += sqlite3
7f10: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 70 56  _value_bytes(apV
7f20: 61 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65  al[i]);.  }.  re
7f30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7f40: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
7f50: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
7f60: 20 62 79 20 74 68 65 20 78 55 70 64 61 74 65 28   by the xUpdate(
7f70: 29 20 6d 65 74 68 6f 64 20 66 6f 72 20 61 6e 20  ) method for an 
7f80: 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e  INSERT operation
7f90: 2e 0a 2a 2a 20 54 68 65 20 61 70 56 61 6c 20 70  ..** The apVal p
7fa0: 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73  arameter is pass
7fb0: 65 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ed a copy of the
7fc0: 20 61 70 56 61 6c 20 61 72 67 75 6d 65 6e 74 20   apVal argument 
7fd0: 70 61 73 73 65 64 20 62 79 0a 2a 2a 20 53 51 4c  passed by.** SQL
7fe0: 69 74 65 20 74 6f 20 74 68 65 20 78 55 70 64 61  ite to the xUpda
7ff0: 74 65 28 29 20 6d 65 74 68 6f 64 2e 20 69 2e 65  te() method. i.e
8000: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 70 56 61 6c 5b  :.**.**   apVal[
8010: 30 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0]              
8020: 20 20 4e 6f 74 20 75 73 65 64 20 66 6f 72 20 49    Not used for I
8030: 4e 53 45 52 54 2e 0a 2a 2a 20 20 20 61 70 56 61  NSERT..**   apVa
8040: 6c 5b 31 5d 20 20 20 20 20 20 20 20 20 20 20 20  l[1]            
8050: 20 20 20 20 72 6f 77 69 64 0a 2a 2a 20 20 20 61      rowid.**   a
8060: 70 56 61 6c 5b 32 5d 20 20 20 20 20 20 20 20 20  pVal[2]         
8070: 20 20 20 20 20 20 20 4c 65 66 74 2d 6d 6f 73 74         Left-most
8080: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 63 6f   user-defined co
8090: 6c 75 6d 6e 0a 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a  lumn.**   ....**
80a0: 20 20 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c     apVal[p->nCol
80b0: 75 6d 6e 2b 31 5d 20 20 20 20 20 52 69 67 68 74  umn+1]     Right
80c0: 2d 6d 6f 73 74 20 75 73 65 72 2d 64 65 66 69 6e  -most user-defin
80d0: 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 61  ed column.**   a
80e0: 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  pVal[p->nColumn+
80f0: 32 5d 20 20 20 20 20 48 69 64 64 65 6e 20 63 6f  2]     Hidden co
8100: 6c 75 6d 6e 20 77 69 74 68 20 73 61 6d 65 20 6e  lumn with same n
8110: 61 6d 65 20 61 73 20 74 61 62 6c 65 0a 2a 2a 20  ame as table.** 
8120: 20 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75    apVal[p->nColu
8130: 6d 6e 2b 33 5d 20 20 20 20 20 48 69 64 64 65 6e  mn+3]     Hidden
8140: 20 22 64 6f 63 69 64 22 20 63 6f 6c 75 6d 6e 20   "docid" column 
8150: 28 61 6c 69 61 73 20 66 6f 72 20 72 6f 77 69 64  (alias for rowid
8160: 29 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 70 2d 3e  ).**   apVal[p->
8170: 6e 43 6f 6c 75 6d 6e 2b 34 5d 20 20 20 20 20 48  nColumn+4]     H
8180: 69 64 64 65 6e 20 6c 61 6e 67 75 61 67 65 69 64  idden languageid
8190: 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69   column.*/.stati
81a0: 63 20 69 6e 74 20 66 74 73 33 49 6e 73 65 72 74  c int fts3Insert
81b0: 44 61 74 61 28 0a 20 20 46 74 73 33 54 61 62 6c  Data(.  Fts3Tabl
81c0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
81d0: 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 2d          /* Full-
81e0: 74 65 78 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  text table */.  
81f0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
8200: 61 70 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20  apVal,          
8210: 2f 2a 20 41 72 72 61 79 20 6f 66 20 76 61 6c 75  /* Array of valu
8220: 65 73 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a  es to insert */.
8230: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
8240: 2a 70 69 44 6f 63 69 64 20 20 20 20 20 20 20 20  *piDocid        
8250: 20 20 2f 2a 20 4f 55 54 3a 20 44 6f 63 69 64 20    /* OUT: Docid 
8260: 66 6f 72 20 72 6f 77 20 6a 75 73 74 20 69 6e 73  for row just ins
8270: 65 72 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  erted */.){.  in
8280: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
8290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
82a0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
82b0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
82c0: 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 3b 20  pContentInsert; 
82d0: 20 20 2f 2a 20 49 4e 53 45 52 54 20 49 4e 54 4f    /* INSERT INTO
82e0: 20 25 5f 63 6f 6e 74 65 6e 74 20 56 41 4c 55 45   %_content VALUE
82f0: 53 28 2e 2e 2e 29 20 2a 2f 0a 0a 20 20 69 66 28  S(...) */..  if(
8300: 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 20   p->zContentTbl 
8310: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
8320: 61 6c 75 65 20 2a 70 52 6f 77 69 64 20 3d 20 61  alue *pRowid = a
8330: 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  pVal[p->nColumn+
8340: 33 5d 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  3];.    if( sqli
8350: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70  te3_value_type(p
8360: 52 6f 77 69 64 29 3d 3d 53 51 4c 49 54 45 5f 4e  Rowid)==SQLITE_N
8370: 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 52 6f  ULL ){.      pRo
8380: 77 69 64 20 3d 20 61 70 56 61 6c 5b 31 5d 3b 0a  wid = apVal[1];.
8390: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
83a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
83b0: 28 70 52 6f 77 69 64 29 21 3d 53 51 4c 49 54 45  (pRowid)!=SQLITE
83c0: 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
83d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
83e0: 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20  CONSTRAINT;.    
83f0: 7d 0a 20 20 20 20 2a 70 69 44 6f 63 69 64 20 3d  }.    *piDocid =
8400: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
8410: 6e 74 36 34 28 70 52 6f 77 69 64 29 3b 0a 20 20  nt64(pRowid);.  
8420: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8430: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  OK;.  }..  /* Lo
8440: 63 61 74 65 20 74 68 65 20 73 74 61 74 65 6d 65  cate the stateme
8450: 6e 74 20 68 61 6e 64 6c 65 20 75 73 65 64 20 74  nt handle used t
8460: 6f 20 69 6e 73 65 72 74 20 64 61 74 61 20 69 6e  o insert data in
8470: 74 6f 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74  to the %_content
8480: 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65  .  ** table. The
8490: 20 53 51 4c 20 66 6f 72 20 74 68 69 73 20 73 74   SQL for this st
84a0: 61 74 65 6d 65 6e 74 20 69 73 3a 0a 20 20 2a 2a  atement is:.  **
84b0: 0a 20 20 2a 2a 20 20 20 49 4e 53 45 52 54 20 49  .  **   INSERT I
84c0: 4e 54 4f 20 25 5f 63 6f 6e 74 65 6e 74 20 56 41  NTO %_content VA
84d0: 4c 55 45 53 28 3f 2c 20 3f 2c 20 3f 2c 20 2e 2e  LUES(?, ?, ?, ..
84e0: 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  .).  **.  ** The
84f0: 20 73 74 61 74 65 6d 65 6e 74 20 66 65 61 74 75   statement featu
8500: 72 65 73 20 4e 20 27 3f 27 20 76 61 72 69 61 62  res N '?' variab
8510: 6c 65 73 2c 20 77 68 65 72 65 20 4e 20 69 73 20  les, where N is 
8520: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73  the number of us
8530: 65 72 0a 20 20 2a 2a 20 64 65 66 69 6e 65 64 20  er.  ** defined 
8540: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 46  columns in the F
8550: 54 53 33 20 74 61 62 6c 65 2c 20 70 6c 75 73 20  TS3 table, plus 
8560: 6f 6e 65 20 66 6f 72 20 74 68 65 20 64 6f 63 69  one for the doci
8570: 64 20 66 69 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20  d field..  */.  
8580: 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
8590: 28 70 2c 20 53 51 4c 5f 43 4f 4e 54 45 4e 54 5f  (p, SQL_CONTENT_
85a0: 49 4e 53 45 52 54 2c 20 26 70 43 6f 6e 74 65 6e  INSERT, &pConten
85b0: 74 49 6e 73 65 72 74 2c 20 26 61 70 56 61 6c 5b  tInsert, &apVal[
85c0: 31 5d 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  1]);.  if( rc==S
85d0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 7a  QLITE_OK && p->z
85e0: 4c 61 6e 67 75 61 67 65 69 64 20 29 7b 0a 20 20  Languageid ){.  
85f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
8600: 69 6e 64 5f 69 6e 74 28 0a 20 20 20 20 20 20 20  ind_int(.       
8610: 20 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 2c   pContentInsert,
8620: 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 2c 20 0a   p->nColumn+2, .
8630: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
8640: 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b  value_int(apVal[
8650: 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 34 5d 29 0a 20  p->nColumn+4]). 
8660: 20 20 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20     );.  }.  if( 
8670: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
8680: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
8690: 20 54 68 65 72 65 20 69 73 20 61 20 71 75 69 72   There is a quir
86a0: 6b 20 68 65 72 65 2e 20 54 68 65 20 75 73 65 72  k here. The user
86b0: 73 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  s INSERT stateme
86c0: 6e 74 20 6d 61 79 20 68 61 76 65 20 73 70 65 63  nt may have spec
86d0: 69 66 69 65 64 0a 20 20 2a 2a 20 61 20 76 61 6c  ified.  ** a val
86e0: 75 65 20 66 6f 72 20 74 68 65 20 22 72 6f 77 69  ue for the "rowi
86f0: 64 22 20 66 69 65 6c 64 2c 20 66 6f 72 20 74 68  d" field, for th
8700: 65 20 22 64 6f 63 69 64 22 20 66 69 65 6c 64 2c  e "docid" field,
8710: 20 6f 72 20 66 6f 72 20 62 6f 74 68 2e 0a 20 20   or for both..  
8720: 2a 2a 20 57 68 69 63 68 20 69 73 20 61 20 70 72  ** Which is a pr
8730: 6f 62 6c 65 6d 2c 20 73 69 6e 63 65 20 22 72 6f  oblem, since "ro
8740: 77 69 64 22 20 61 6e 64 20 22 64 6f 63 69 64 22  wid" and "docid"
8750: 20 61 72 65 20 61 6c 69 61 73 65 73 20 66 6f 72   are aliases for
8760: 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 76   the.  ** same v
8770: 61 6c 75 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c  alue. For exampl
8780: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 49  e:.  **.  **   I
8790: 4e 53 45 52 54 20 49 4e 54 4f 20 66 74 73 33 74  NSERT INTO fts3t
87a0: 62 6c 28 72 6f 77 69 64 2c 20 64 6f 63 69 64 29  bl(rowid, docid)
87b0: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
87c0: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 46 54 53 33   **.  ** In FTS3
87d0: 2c 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72  , this is an err
87e0: 6f 72 2e 20 49 74 20 69 73 20 61 6e 20 65 72 72  or. It is an err
87f0: 6f 72 20 74 6f 20 73 70 65 63 69 66 79 20 6e 6f  or to specify no
8800: 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 73 0a 20 20  n-NULL values.  
8810: 2a 2a 20 66 6f 72 20 62 6f 74 68 20 64 6f 63 69  ** for both doci
8820: 64 20 61 6e 64 20 73 6f 6d 65 20 6f 74 68 65 72  d and some other
8830: 20 72 6f 77 69 64 20 61 6c 69 61 73 2e 0a 20 20   rowid alias..  
8840: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
8850: 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61  NULL!=sqlite3_va
8860: 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 33  lue_type(apVal[3
8870: 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 29 20 29 7b  +p->nColumn]) ){
8880: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
8890: 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61  NULL==sqlite3_va
88a0: 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 30  lue_type(apVal[0
88b0: 5d 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54  ]).     && SQLIT
88c0: 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f  E_NULL!=sqlite3_
88d0: 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c  value_type(apVal
88e0: 5b 31 5d 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  [1]).    ){.    
88f0: 20 20 2f 2a 20 41 20 72 6f 77 69 64 2f 64 6f 63    /* A rowid/doc
8900: 69 64 20 63 6f 6e 66 6c 69 63 74 2e 20 2a 2f 0a  id conflict. */.
8910: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8920: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
8930: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
8940: 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 43 6f  3_bind_value(pCo
8950: 6e 74 65 6e 74 49 6e 73 65 72 74 2c 20 31 2c 20  ntentInsert, 1, 
8960: 61 70 56 61 6c 5b 33 2b 70 2d 3e 6e 43 6f 6c 75  apVal[3+p->nColu
8970: 6d 6e 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  mn]);.    if( rc
8980: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
8990: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
89a0: 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 73  /* Execute the s
89b0: 74 61 74 65 6d 65 6e 74 20 74 6f 20 69 6e 73 65  tatement to inse
89c0: 72 74 20 74 68 65 20 72 65 63 6f 72 64 2e 20 53  rt the record. S
89d0: 65 74 20 2a 70 69 44 6f 63 69 64 20 74 6f 20 74  et *piDocid to t
89e0: 68 65 20 0a 20 20 2a 2a 20 6e 65 77 20 64 6f 63  he .  ** new doc
89f0: 69 64 20 76 61 6c 75 65 2e 20 0a 20 20 2a 2f 0a  id value. .  */.
8a00: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
8a10: 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 29 3b 0a  ContentInsert);.
8a20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
8a30: 65 73 65 74 28 70 43 6f 6e 74 65 6e 74 49 6e 73  eset(pContentIns
8a40: 65 72 74 29 3b 0a 0a 20 20 2a 70 69 44 6f 63 69  ert);..  *piDoci
8a50: 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  d = sqlite3_last
8a60: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 70 2d  _insert_rowid(p-
8a70: 3e 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  >db);.  return r
8a80: 63 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  c;.}..../*.** Re
8a90: 6d 6f 76 65 20 61 6c 6c 20 64 61 74 61 20 66 72  move all data fr
8aa0: 6f 6d 20 74 68 65 20 46 54 53 33 20 74 61 62 6c  om the FTS3 tabl
8ab0: 65 2e 20 43 6c 65 61 72 20 74 68 65 20 68 61 73  e. Clear the has
8ac0: 68 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  h table containi
8ad0: 6e 67 0a 2a 2a 20 70 65 6e 64 69 6e 67 20 74 65  ng.** pending te
8ae0: 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rms..*/.static i
8af0: 6e 74 20 66 74 73 33 44 65 6c 65 74 65 41 6c 6c  nt fts3DeleteAll
8b00: 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 69  (Fts3Table *p, i
8b10: 6e 74 20 62 43 6f 6e 74 65 6e 74 29 7b 0a 20 20  nt bContent){.  
8b20: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
8b30: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
8b40: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
8b50: 2f 0a 0a 20 20 2f 2a 20 44 69 73 63 61 72 64 20  /..  /* Discard 
8b60: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
8b70: 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d  the pending-term
8b80: 73 20 68 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f  s hash table. */
8b90: 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 50 65  .  sqlite3Fts3Pe
8ba0: 6e 64 69 6e 67 54 65 72 6d 73 43 6c 65 61 72 28  ndingTermsClear(
8bb0: 70 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  p);..  /* Delete
8bc0: 20 65 76 65 72 79 74 68 69 6e 67 20 66 72 6f 6d   everything from
8bd0: 20 74 68 65 20 73 68 61 64 6f 77 20 74 61 62 6c   the shadow tabl
8be0: 65 73 2e 20 45 78 63 65 70 74 2c 20 6c 65 61 76  es. Except, leav
8bf0: 65 20 25 5f 63 6f 6e 74 65 6e 74 20 61 73 0a 20  e %_content as. 
8c00: 20 2a 2a 20 69 73 20 69 66 20 62 43 6f 6e 74 65   ** is if bConte
8c10: 6e 74 20 69 73 20 66 61 6c 73 65 2e 20 20 2a 2f  nt is false.  */
8c20: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 43  .  assert( p->zC
8c30: 6f 6e 74 65 6e 74 54 62 6c 3d 3d 30 20 7c 7c 20  ontentTbl==0 || 
8c40: 62 43 6f 6e 74 65 6e 74 3d 3d 30 20 29 3b 0a 20  bContent==0 );. 
8c50: 20 69 66 28 20 62 43 6f 6e 74 65 6e 74 20 29 20   if( bContent ) 
8c60: 66 74 73 33 53 71 6c 45 78 65 63 28 26 72 63 2c  fts3SqlExec(&rc,
8c70: 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41   p, SQL_DELETE_A
8c80: 4c 4c 5f 43 4f 4e 54 45 4e 54 2c 20 30 29 3b 0a  LL_CONTENT, 0);.
8c90: 20 20 66 74 73 33 53 71 6c 45 78 65 63 28 26 72    fts3SqlExec(&r
8ca0: 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45  c, p, SQL_DELETE
8cb0: 5f 41 4c 4c 5f 53 45 47 4d 45 4e 54 53 2c 20 30  _ALL_SEGMENTS, 0
8cc0: 29 3b 0a 20 20 66 74 73 33 53 71 6c 45 78 65 63  );.  fts3SqlExec
8cd0: 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c  (&rc, p, SQL_DEL
8ce0: 45 54 45 5f 41 4c 4c 5f 53 45 47 44 49 52 2c 20  ETE_ALL_SEGDIR, 
8cf0: 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 62 48 61  0);.  if( p->bHa
8d00: 73 44 6f 63 73 69 7a 65 20 29 7b 0a 20 20 20 20  sDocsize ){.    
8d10: 66 74 73 33 53 71 6c 45 78 65 63 28 26 72 63 2c  fts3SqlExec(&rc,
8d20: 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41   p, SQL_DELETE_A
8d30: 4c 4c 5f 44 4f 43 53 49 5a 45 2c 20 30 29 3b 0a  LL_DOCSIZE, 0);.
8d40: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 62 48 61    }.  if( p->bHa
8d50: 73 53 74 61 74 20 29 7b 0a 20 20 20 20 66 74 73  sStat ){.    fts
8d60: 33 53 71 6c 45 78 65 63 28 26 72 63 2c 20 70 2c  3SqlExec(&rc, p,
8d70: 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f   SQL_DELETE_ALL_
8d80: 53 54 41 54 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  STAT, 0);.  }.  
8d90: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
8da0: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
8db0: 74 20 6c 61 6e 67 69 64 46 72 6f 6d 53 65 6c 65  t langidFromSele
8dc0: 63 74 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  ct(Fts3Table *p,
8dd0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
8de0: 53 65 6c 65 63 74 29 7b 0a 20 20 69 6e 74 20 69  Select){.  int i
8df0: 4c 61 6e 67 69 64 20 3d 20 30 3b 0a 20 20 69 66  Langid = 0;.  if
8e00: 28 20 70 2d 3e 7a 4c 61 6e 67 75 61 67 65 69 64  ( p->zLanguageid
8e10: 20 29 20 69 4c 61 6e 67 69 64 20 3d 20 73 71 6c   ) iLangid = sql
8e20: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
8e30: 70 53 65 6c 65 63 74 2c 20 70 2d 3e 6e 43 6f 6c  pSelect, p->nCol
8e40: 75 6d 6e 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e  umn+1);.  return
8e50: 20 69 4c 61 6e 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a   iLangid;.}../*.
8e60: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 65 6c 65  ** The first ele
8e70: 6d 65 6e 74 20 69 6e 20 74 68 65 20 61 70 56 61  ment in the apVa
8e80: 6c 5b 5d 20 61 72 72 61 79 20 69 73 20 61 73 73  l[] array is ass
8e90: 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  umed to contain 
8ea0: 74 68 65 20 64 6f 63 69 64 0a 2a 2a 20 28 61 6e  the docid.** (an
8eb0: 20 69 6e 74 65 67 65 72 29 20 6f 66 20 61 20 72   integer) of a r
8ec0: 6f 77 20 61 62 6f 75 74 20 74 6f 20 62 65 20 64  ow about to be d
8ed0: 65 6c 65 74 65 64 2e 20 52 65 6d 6f 76 65 20 61  eleted. Remove a
8ee0: 6c 6c 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68  ll terms from th
8ef0: 65 0a 2a 2a 20 66 75 6c 6c 2d 74 65 78 74 20 69  e.** full-text i
8f00: 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
8f10: 76 6f 69 64 20 66 74 73 33 44 65 6c 65 74 65 54  void fts3DeleteT
8f20: 65 72 6d 73 28 20 0a 20 20 69 6e 74 20 2a 70 52  erms( .  int *pR
8f30: 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C,              
8f40: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
8f50: 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  */.  Fts3Table *
8f60: 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
8f70: 54 68 65 20 46 54 53 20 74 61 62 6c 65 20 74 6f  The FTS table to
8f80: 20 64 65 6c 65 74 65 20 66 72 6f 6d 20 2a 2f 0a   delete from */.
8f90: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
8fa0: 2a 70 52 6f 77 69 64 2c 20 20 2f 2a 20 54 68 65  *pRowid,  /* The
8fb0: 20 64 6f 63 69 64 20 74 6f 20 62 65 20 64 65 6c   docid to be del
8fc0: 65 74 65 64 20 2a 2f 0a 20 20 75 33 32 20 2a 61  eted */.  u32 *a
8fd0: 53 7a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Sz              
8fe0: 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 64 65    /* Sizes of de
8ff0: 6c 65 74 65 64 20 64 6f 63 75 6d 65 6e 74 20 77  leted document w
9000: 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29  ritten here */.)
9010: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
9020: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c  lite3_stmt *pSel
9030: 65 63 74 3b 0a 0a 20 20 69 66 28 20 2a 70 52 43  ect;..  if( *pRC
9040: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 72 63 20   ) return;.  rc 
9050: 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
9060: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 43 4f 4e 54   SQL_SELECT_CONT
9070: 45 4e 54 5f 42 59 5f 52 4f 57 49 44 2c 20 26 70  ENT_BY_ROWID, &p
9080: 53 65 6c 65 63 74 2c 20 26 70 52 6f 77 69 64 29  Select, &pRowid)
9090: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
90a0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
90b0: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
90c0: 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63  ite3_step(pSelec
90d0: 74 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  t) ){.      int 
90e0: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 61  i;.      int iLa
90f0: 6e 67 69 64 20 3d 20 6c 61 6e 67 69 64 46 72 6f  ngid = langidFro
9100: 6d 53 65 6c 65 63 74 28 70 2c 20 70 53 65 6c 65  mSelect(p, pSele
9110: 63 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ct);.      rc = 
9120: 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73  fts3PendingTerms
9130: 44 6f 63 69 64 28 70 2c 20 69 4c 61 6e 67 69 64  Docid(p, iLangid
9140: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
9150: 5f 69 6e 74 36 34 28 70 53 65 6c 65 63 74 2c 20  _int64(pSelect, 
9160: 30 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  0));.      for(i
9170: 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =1; rc==SQLITE_O
9180: 4b 20 26 26 20 69 3c 3d 70 2d 3e 6e 43 6f 6c 75  K && i<=p->nColu
9190: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
91a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
91b0: 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ext = (const cha
91c0: 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r *)sqlite3_colu
91d0: 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65 63 74 2c  mn_text(pSelect,
91e0: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20   i);.        rc 
91f0: 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72  = fts3PendingTer
9200: 6d 73 41 64 64 28 70 2c 20 69 4c 61 6e 67 69 64  msAdd(p, iLangid
9210: 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26 61 53  , zText, -1, &aS
9220: 7a 5b 69 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20  z[i-1]);.       
9230: 20 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d   aSz[p->nColumn]
9240: 20 2b 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   += sqlite3_colu
9250: 6d 6e 5f 62 79 74 65 73 28 70 53 65 6c 65 63 74  mn_bytes(pSelect
9260: 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , i);.      }.  
9270: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
9280: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
9290: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
92a0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
92b0: 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
92c0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
92d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63    }.    }.    rc
92e0: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
92f0: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 65 6c  (pSelect);.  }el
9300: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
9310: 72 65 73 65 74 28 70 53 65 6c 65 63 74 29 3b 0a  reset(pSelect);.
9320: 20 20 7d 0a 20 20 2a 70 52 43 20 3d 20 72 63 3b    }.  *pRC = rc;
9330: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72  .}../*.** Forwar
9340: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 6f  d declaration to
9350: 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65   account for the
9360: 20 63 69 72 63 75 6c 61 72 20 64 65 70 65 6e 64   circular depend
9370: 65 6e 63 79 20 62 65 74 77 65 65 6e 0a 2a 2a 20  ency between.** 
9380: 66 75 6e 63 74 69 6f 6e 73 20 66 74 73 33 53 65  functions fts3Se
9390: 67 6d 65 6e 74 4d 65 72 67 65 28 29 20 61 6e 64  gmentMerge() and
93a0: 20 66 74 73 33 41 6c 6c 6f 63 61 74 65 53 65 67   fts3AllocateSeg
93b0: 64 69 72 49 64 78 28 29 2e 0a 2a 2f 0a 73 74 61  dirIdx()..*/.sta
93c0: 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 6d  tic int fts3Segm
93d0: 65 6e 74 4d 65 72 67 65 28 46 74 73 33 54 61 62  entMerge(Fts3Tab
93e0: 6c 65 20 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20  le *, int, int, 
93f0: 69 6e 74 29 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  int);../* .** Th
9400: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
9410: 63 61 74 65 73 20 61 20 6e 65 77 20 6c 65 76 65  cates a new leve
9420: 6c 20 69 4c 65 76 65 6c 20 69 6e 64 65 78 20 69  l iLevel index i
9430: 6e 20 74 68 65 20 73 65 67 64 69 72 20 74 61 62  n the segdir tab
9440: 6c 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20  le..** Usually, 
9450: 69 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6c 6f  indexes are allo
9460: 63 61 74 65 64 20 77 69 74 68 69 6e 20 61 20 6c  cated within a l
9470: 65 76 65 6c 20 73 65 71 75 65 6e 74 69 61 6c 6c  evel sequentiall
9480: 79 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 77 69  y starting.** wi
9490: 74 68 20 30 2c 20 73 6f 20 74 68 65 20 61 6c 6c  th 0, so the all
94a0: 6f 63 61 74 65 64 20 69 6e 64 65 78 20 69 73 20  ocated index is 
94b0: 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68 61 6e  one greater than
94c0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
94d0: 6e 65 64 0a 2a 2a 20 62 79 3a 0a 2a 2a 0a 2a 2a  ned.** by:.**.**
94e0: 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 69 64     SELECT max(id
94f0: 78 29 20 46 52 4f 4d 20 25 5f 73 65 67 64 69 72  x) FROM %_segdir
9500: 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3a   WHERE level = :
9510: 69 4c 65 76 65 6c 0a 2a 2a 0a 2a 2a 20 48 6f 77  iLevel.**.** How
9520: 65 76 65 72 2c 20 69 66 20 74 68 65 72 65 20 61  ever, if there a
9530: 72 65 20 61 6c 72 65 61 64 79 20 46 54 53 33 5f  re already FTS3_
9540: 4d 45 52 47 45 5f 43 4f 55 4e 54 20 69 6e 64 65  MERGE_COUNT inde
9550: 78 65 73 20 61 74 20 74 68 65 20 72 65 71 75 65  xes at the reque
9560: 73 74 65 64 0a 2a 2a 20 6c 65 76 65 6c 2c 20 74  sted.** level, t
9570: 68 65 79 20 61 72 65 20 6d 65 72 67 65 64 20 69  hey are merged i
9580: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6c 65 76  nto a single lev
9590: 65 6c 20 28 69 4c 65 76 65 6c 2b 31 29 20 73 65  el (iLevel+1) se
95a0: 67 6d 65 6e 74 20 61 6e 64 20 74 68 65 20 0a 2a  gment and the .*
95b0: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65  * allocated inde
95c0: 78 20 69 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66  x is 0..**.** If
95d0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 69   successful, *pi
95e0: 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  Idx is set to th
95f0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65  e allocated inde
9600: 78 20 73 6c 6f 74 20 61 6e 64 20 53 51 4c 49 54  x slot and SQLIT
9610: 45 5f 4f 4b 0a 2a 2a 20 72 65 74 75 72 6e 65 64  E_OK.** returned
9620: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
9630: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
9640: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
9650: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
9660: 33 41 6c 6c 6f 63 61 74 65 53 65 67 64 69 72 49  3AllocateSegdirI
9670: 64 78 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  dx(.  Fts3Table 
9680: 2a 70 2c 20 0a 20 20 69 6e 74 20 69 4c 61 6e 67  *p, .  int iLang
9690: 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
96a0: 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61         /* Langua
96b0: 67 65 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69  ge id */.  int i
96c0: 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20  Index,          
96d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
96e0: 64 65 78 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65  dex for p->aInde
96f0: 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  x */.  int iLeve
9700: 6c 2c 20 0a 20 20 69 6e 74 20 2a 70 69 49 64 78  l, .  int *piIdx
9710: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 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 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
9740: 43 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Code */.  sqlite
9750: 33 5f 73 74 6d 74 20 2a 70 4e 65 78 74 49 64 78  3_stmt *pNextIdx
9760: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65  ;         /* Que
9770: 72 79 20 66 6f 72 20 6e 65 78 74 20 69 64 78 20  ry for next idx 
9780: 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20  at level iLevel 
9790: 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 78 74 20 3d  */.  int iNext =
97a0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
97b0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
97c0: 66 20 71 75 65 72 79 20 70 4e 65 78 74 49 64 78  f query pNextIdx
97d0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
97e0: 4c 61 6e 67 69 64 3e 3d 30 20 29 3b 0a 20 20 61  Langid>=0 );.  a
97f0: 73 73 65 72 74 28 20 70 2d 3e 6e 49 6e 64 65 78  ssert( p->nIndex
9800: 3e 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  >=1 );..  /* Set
9810: 20 76 61 72 69 61 62 6c 65 20 69 4e 65 78 74 20   variable iNext 
9820: 74 6f 20 74 68 65 20 6e 65 78 74 20 61 76 61 69  to the next avai
9830: 6c 61 62 6c 65 20 73 65 67 64 69 72 20 69 6e 64  lable segdir ind
9840: 65 78 20 61 74 20 6c 65 76 65 6c 20 69 4c 65 76  ex at level iLev
9850: 65 6c 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74  el. */.  rc = ft
9860: 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
9870: 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54 5f 49 4e  _NEXT_SEGMENT_IN
9880: 44 45 58 2c 20 26 70 4e 65 78 74 49 64 78 2c 20  DEX, &pNextIdx, 
9890: 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
98a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
98b0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
98c0: 34 28 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74  4(.        pNext
98d0: 49 64 78 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c  Idx, 1, getAbsol
98e0: 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e  uteLevel(p, iLan
98f0: 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65  gid, iIndex, iLe
9900: 76 65 6c 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  vel).    );.    
9910: 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
9920: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 4e 65  sqlite3_step(pNe
9930: 78 74 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20  xtIdx) ){.      
9940: 69 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 5f  iNext = sqlite3_
9950: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 4e 65 78 74  column_int(pNext
9960: 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  Idx, 0);.    }. 
9970: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
9980: 72 65 73 65 74 28 70 4e 65 78 74 49 64 78 29 3b  reset(pNextIdx);
9990: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
99a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
99b0: 20 2f 2a 20 49 66 20 69 4e 65 78 74 20 69 73 20   /* If iNext is 
99c0: 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54  FTS3_MERGE_COUNT
99d0: 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
99e0: 74 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 69  t level iLevel i
99f0: 73 20 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a  s already.    **
9a00: 20 66 75 6c 6c 2c 20 6d 65 72 67 65 20 61 6c 6c   full, merge all
9a10: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6c 65 76   segments in lev
9a20: 65 6c 20 69 4c 65 76 65 6c 20 69 6e 74 6f 20 61  el iLevel into a
9a30: 20 73 69 6e 67 6c 65 20 69 4c 65 76 65 6c 2b 31   single iLevel+1
9a40: 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20  .    ** segment 
9a50: 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 28 6e 65  and allocate (ne
9a60: 77 6c 79 20 66 72 65 65 64 29 20 69 6e 64 65 78  wly freed) index
9a70: 20 30 20 61 74 20 6c 65 76 65 6c 20 69 4c 65 76   0 at level iLev
9a80: 65 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  el. Otherwise,. 
9a90: 20 20 20 2a 2a 20 69 66 20 69 4e 65 78 74 20 69     ** if iNext i
9aa0: 73 20 6c 65 73 73 20 74 68 61 6e 20 46 54 53 33  s less than FTS3
9ab0: 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 2c 20 61 6c  _MERGE_COUNT, al
9ac0: 6c 6f 63 61 74 65 20 69 6e 64 65 78 20 69 4e 65  locate index iNe
9ad0: 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  xt..    */.    i
9ae0: 66 28 20 69 4e 65 78 74 3e 3d 46 54 53 33 5f 4d  f( iNext>=FTS3_M
9af0: 45 52 47 45 5f 43 4f 55 4e 54 20 29 7b 0a 20 20  ERGE_COUNT ){.  
9b00: 20 20 20 20 66 74 73 33 4c 6f 67 4d 65 72 67 65      fts3LogMerge
9b10: 28 31 36 2c 20 67 65 74 41 62 73 6f 6c 75 74 65  (16, getAbsolute
9b20: 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64  Level(p, iLangid
9b30: 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c  , iIndex, iLevel
9b40: 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  ));.      rc = f
9b50: 74 73 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28  ts3SegmentMerge(
9b60: 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64  p, iLangid, iInd
9b70: 65 78 2c 20 69 4c 65 76 65 6c 29 3b 0a 20 20 20  ex, iLevel);.   
9b80: 20 20 20 2a 70 69 49 64 78 20 3d 20 30 3b 0a 20     *piIdx = 0;. 
9b90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9ba0: 2a 70 69 49 64 78 20 3d 20 69 4e 65 78 74 3b 0a  *piIdx = iNext;.
9bb0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
9bc0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
9bd0: 20 54 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20   The %_segments 
9be0: 74 61 62 6c 65 20 69 73 20 64 65 63 6c 61 72 65  table is declare
9bf0: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
9c00: 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42  .**   CREATE TAB
9c10: 4c 45 20 25 5f 73 65 67 6d 65 6e 74 73 28 62 6c  LE %_segments(bl
9c20: 6f 63 6b 69 64 20 49 4e 54 45 47 45 52 20 50 52  ockid INTEGER PR
9c30: 49 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b  IMARY KEY, block
9c40: 20 42 4c 4f 42 29 0a 2a 2a 0a 2a 2a 20 54 68 69   BLOB).**.** Thi
9c50: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73  s function reads
9c60: 20 64 61 74 61 20 66 72 6f 6d 20 61 20 73 69 6e   data from a sin
9c70: 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 25  gle row of the %
9c80: 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 2e  _segments table.
9c90: 20 54 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63   The.** specific
9ca0: 20 72 6f 77 20 69 73 20 69 64 65 6e 74 69 66 69   row is identifi
9cb0: 65 64 20 62 79 20 74 68 65 20 69 42 6c 6f 63 6b  ed by the iBlock
9cc0: 69 64 20 70 61 72 61 6d 65 74 65 72 2e 20 49 66  id parameter. If
9cd0: 20 70 61 42 6c 6f 62 20 69 73 20 6e 6f 74 0a 2a   paBlob is not.*
9ce0: 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 61 20 62  * NULL, then a b
9cf0: 75 66 66 65 72 20 69 73 20 61 6c 6c 6f 63 61 74  uffer is allocat
9d00: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
9d10: 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f  _malloc() and po
9d20: 70 75 6c 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  pulated.** with 
9d30: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
9d40: 74 68 65 20 62 6c 6f 62 20 73 74 6f 72 65 64 20  the blob stored 
9d50: 69 6e 20 74 68 65 20 22 62 6c 6f 63 6b 22 20 63  in the "block" c
9d60: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 0a 2a 2a  olumn of the .**
9d70: 20 69 64 65 6e 74 69 66 69 65 64 20 74 61 62 6c   identified tabl
9d80: 65 20 72 6f 77 20 69 73 2e 20 57 68 65 74 68 65  e row is. Whethe
9d90: 72 20 6f 72 20 6e 6f 74 20 70 61 42 6c 6f 62 20  r or not paBlob 
9da0: 69 73 20 4e 55 4c 4c 2c 20 2a 70 6e 42 6c 6f 62  is NULL, *pnBlob
9db0: 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f 20 74 68   is set.** to th
9dc0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c  e size of the bl
9dd0: 6f 62 20 69 6e 20 62 79 74 65 73 20 62 65 66 6f  ob in bytes befo
9de0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
9df0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
9e00: 6f 63 63 75 72 73 2c 20 6f 72 20 74 68 65 20 74  occurs, or the t
9e10: 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f  able does not co
9e20: 6e 74 61 69 6e 20 74 68 65 20 73 70 65 63 69 66  ntain the specif
9e30: 69 65 64 20 72 6f 77 2c 0a 2a 2a 20 61 6e 20 53  ied row,.** an S
9e40: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
9e50: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
9e60: 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
9e70: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
9e80: 49 66 0a 2a 2a 20 70 61 42 6c 6f 62 20 69 73 20  If.** paBlob is 
9e90: 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  non-NULL, then i
9ea0: 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
9eb0: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
9ec0: 61 6c 6c 65 72 20 74 6f 0a 2a 2a 20 65 76 65 6e  aller to.** even
9ed0: 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68 65 20  tually free the 
9ee0: 72 65 74 75 72 6e 65 64 20 62 75 66 66 65 72 2e  returned buffer.
9ef0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
9f00: 74 69 6f 6e 20 6d 61 79 20 6c 65 61 76 65 20 61  tion may leave a
9f10: 6e 20 6f 70 65 6e 20 73 71 6c 69 74 65 33 5f 62  n open sqlite3_b
9f20: 6c 6f 62 2a 20 68 61 6e 64 6c 65 20 69 6e 20 74  lob* handle in t
9f30: 68 65 0a 2a 2a 20 46 74 73 33 54 61 62 6c 65 2e  he.** Fts3Table.
9f40: 70 53 65 67 6d 65 6e 74 73 20 76 61 72 69 61 62  pSegments variab
9f50: 6c 65 2e 20 54 68 69 73 20 68 61 6e 64 6c 65 20  le. This handle 
9f60: 69 73 20 72 65 75 73 65 64 20 62 79 20 73 75 62  is reused by sub
9f70: 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 0a 2a 2a  sequent calls.**
9f80: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
9f90: 6e 2e 20 54 68 65 20 68 61 6e 64 6c 65 20 6d 61  n. The handle ma
9fa0: 79 20 62 65 20 63 6c 6f 73 65 64 20 62 79 20 63  y be closed by c
9fb0: 61 6c 6c 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71  alling the.** sq
9fc0: 6c 69 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74  lite3Fts3Segment
9fd0: 73 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f  sClose() functio
9fe0: 6e 2e 20 52 65 75 73 69 6e 67 20 61 20 62 6c 6f  n. Reusing a blo
9ff0: 62 20 68 61 6e 64 6c 65 20 69 73 20 61 20 68 61  b handle is a ha
a000: 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e  ndy.** performan
a010: 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2c 20  ce improvement, 
a020: 62 75 74 20 74 68 65 20 62 6c 6f 62 20 68 61 6e  but the blob han
a030: 64 6c 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  dle should alway
a040: 73 20 62 65 20 63 6c 6f 73 65 64 0a 2a 2a 20 62  s be closed.** b
a050: 65 66 6f 72 65 20 63 6f 6e 74 72 6f 6c 20 69 73  efore control is
a060: 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
a070: 20 75 73 65 72 20 28 74 6f 20 70 72 65 76 65 6e   user (to preven
a080: 74 20 61 20 6c 6f 63 6b 20 62 65 69 6e 67 20 68  t a lock being h
a090: 65 6c 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61  eld.** on the da
a0a0: 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
a0b0: 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 65 63 65  longer than nece
a0c0: 73 73 61 72 79 29 2e 20 54 68 75 73 2c 20 61 6e  ssary). Thus, an
a0d0: 79 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a  y virtual table.
a0e0: 2a 2a 20 6d 65 74 68 6f 64 20 28 78 46 69 6c 74  ** method (xFilt
a0f0: 65 72 20 65 74 63 2e 29 20 74 68 61 74 20 6d 61  er etc.) that ma
a100: 79 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e  y directly or in
a110: 64 69 72 65 63 74 6c 79 20 63 61 6c 6c 20 74 68  directly call th
a120: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d  is function.** m
a130: 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  ust call sqlite3
a140: 46 74 73 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73  Fts3SegmentsClos
a150: 65 28 29 20 62 65 66 6f 72 65 20 72 65 74 75 72  e() before retur
a160: 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
a170: 69 74 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63  ite3Fts3ReadBloc
a180: 6b 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  k(.  Fts3Table *
a190: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
a1a0: 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62       /* FTS3 tab
a1b0: 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73  le handle */.  s
a1c0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 42 6c  qlite3_int64 iBl
a1d0: 6f 63 6b 69 64 2c 20 20 20 20 20 20 20 20 20 2f  ockid,         /
a1e0: 2a 20 41 63 63 65 73 73 20 74 68 65 20 72 6f 77  * Access the row
a1f0: 20 77 69 74 68 20 62 6c 6f 63 6b 69 64 3d 24 69   with blockid=$i
a200: 42 6c 6f 63 6b 69 64 20 2a 2f 0a 20 20 63 68 61  Blockid */.  cha
a210: 72 20 2a 2a 70 61 42 6c 6f 62 2c 20 20 20 20 20  r **paBlob,     
a220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a230: 4f 55 54 3a 20 42 6c 6f 62 20 64 61 74 61 20 69  OUT: Blob data i
a240: 6e 20 6d 61 6c 6c 6f 63 27 64 20 62 75 66 66 65  n malloc'd buffe
a250: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 6c  r */.  int *pnBl
a260: 6f 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ob,             
a270: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
a280: 69 7a 65 20 6f 66 20 62 6c 6f 62 20 64 61 74 61  ize of blob data
a290: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 61   */.  int *pnLoa
a2a0: 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
a2b0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42 79        /* OUT: By
a2c0: 74 65 73 20 61 63 74 75 61 6c 6c 79 20 6c 6f 61  tes actually loa
a2d0: 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ded */.){.  int 
a2e0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
a2f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
a300: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
a310: 20 2f 2a 20 70 6e 42 6c 6f 62 20 6d 75 73 74 20   /* pnBlob must 
a320: 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 70 61 42  be non-NULL. paB
a330: 6c 6f 62 20 6d 61 79 20 62 65 20 4e 55 4c 4c 20  lob may be NULL 
a340: 6f 72 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 2a 2f 0a  or non-NULL. */.
a350: 20 20 61 73 73 65 72 74 28 20 70 6e 42 6c 6f 62    assert( pnBlob
a360: 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 53   );..  if( p->pS
a370: 65 67 6d 65 6e 74 73 20 29 7b 0a 20 20 20 20 72  egments ){.    r
a380: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
a390: 5f 72 65 6f 70 65 6e 28 70 2d 3e 70 53 65 67 6d  _reopen(p->pSegm
a3a0: 65 6e 74 73 2c 20 69 42 6c 6f 63 6b 69 64 29 3b  ents, iBlockid);
a3b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
a3c0: 28 20 30 3d 3d 70 2d 3e 7a 53 65 67 6d 65 6e 74  ( 0==p->zSegment
a3d0: 73 54 62 6c 20 29 7b 0a 20 20 20 20 20 20 70 2d  sTbl ){.      p-
a3e0: 3e 7a 53 65 67 6d 65 6e 74 73 54 62 6c 20 3d 20  >zSegmentsTbl = 
a3f0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
a400: 22 25 73 5f 73 65 67 6d 65 6e 74 73 22 2c 20 70  "%s_segments", p
a410: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
a420: 69 66 28 20 30 3d 3d 70 2d 3e 7a 53 65 67 6d 65  if( 0==p->zSegme
a430: 6e 74 73 54 62 6c 20 29 20 72 65 74 75 72 6e 20  ntsTbl ) return 
a440: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
a450: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
a460: 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 0a  ite3_blob_open(.
a470: 20 20 20 20 20 20 20 70 2d 3e 64 62 2c 20 70 2d         p->db, p-
a480: 3e 7a 44 62 2c 20 70 2d 3e 7a 53 65 67 6d 65 6e  >zDb, p->zSegmen
a490: 74 73 54 62 6c 2c 20 22 62 6c 6f 63 6b 22 2c 20  tsTbl, "block", 
a4a0: 69 42 6c 6f 63 6b 69 64 2c 20 30 2c 20 26 70 2d  iBlockid, 0, &p-
a4b0: 3e 70 53 65 67 6d 65 6e 74 73 0a 20 20 20 20 29  >pSegments.    )
a4c0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
a4d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a4e0: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 71    int nByte = sq
a4f0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73  lite3_blob_bytes
a500: 28 70 2d 3e 70 53 65 67 6d 65 6e 74 73 29 3b 0a  (p->pSegments);.
a510: 20 20 20 20 2a 70 6e 42 6c 6f 62 20 3d 20 6e 42      *pnBlob = nB
a520: 79 74 65 3b 0a 20 20 20 20 69 66 28 20 70 61 42  yte;.    if( paB
a530: 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 63 68 61  lob ){.      cha
a540: 72 20 2a 61 42 79 74 65 20 3d 20 73 71 6c 69 74  r *aByte = sqlit
a550: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 20  e3_malloc(nByte 
a560: 2b 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44  + FTS3_NODE_PADD
a570: 49 4e 47 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ING);.      if( 
a580: 21 61 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  !aByte ){.      
a590: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
a5a0: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  MEM;.      }else
a5b0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 6e  {.        if( pn
a5c0: 4c 6f 61 64 20 26 26 20 6e 42 79 74 65 3e 28 46  Load && nByte>(F
a5d0: 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 5f 54  TS3_NODE_CHUNK_T
a5e0: 48 52 45 53 48 4f 4c 44 29 20 29 7b 0a 20 20 20  HRESHOLD) ){.   
a5f0: 20 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 46         nByte = F
a600: 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 53 49  TS3_NODE_CHUNKSI
a610: 5a 45 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  ZE;.          *p
a620: 6e 4c 6f 61 64 20 3d 20 6e 42 79 74 65 3b 0a 20  nLoad = nByte;. 
a630: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a640: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
a650: 6f 62 5f 72 65 61 64 28 70 2d 3e 70 53 65 67 6d  ob_read(p->pSegm
a660: 65 6e 74 73 2c 20 61 42 79 74 65 2c 20 6e 42 79  ents, aByte, nBy
a670: 74 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  te, 0);.        
a680: 6d 65 6d 73 65 74 28 26 61 42 79 74 65 5b 6e 42  memset(&aByte[nB
a690: 79 74 65 5d 2c 20 30 2c 20 46 54 53 33 5f 4e 4f  yte], 0, FTS3_NO
a6a0: 44 45 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 20  DE_PADDING);.   
a6b0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
a6c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
a6d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
a6e0: 28 61 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20  (aByte);.       
a6f0: 20 20 20 61 42 79 74 65 20 3d 20 30 3b 0a 20 20     aByte = 0;.  
a700: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a710: 20 20 20 20 20 20 2a 70 61 42 6c 6f 62 20 3d 20        *paBlob = 
a720: 61 42 79 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  aByte;.    }.  }
a730: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
a740: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68  ../*.** Close th
a750: 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 61 74  e blob handle at
a760: 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73 2c 20 69   p->pSegments, i
a770: 66 20 69 74 20 69 73 20 6f 70 65 6e 2e 20 53 65  f it is open. Se
a780: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
a790: 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 46  .** the sqlite3F
a7a0: 74 73 33 52 65 61 64 42 6c 6f 63 6b 28 29 20 66  ts3ReadBlock() f
a7b0: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 65 74 61  unction for deta
a7c0: 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ils..*/.void sql
a7d0: 69 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73  ite3Fts3Segments
a7e0: 43 6c 6f 73 65 28 46 74 73 33 54 61 62 6c 65 20  Close(Fts3Table 
a7f0: 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62  *p){.  sqlite3_b
a800: 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d 3e 70 53 65  lob_close(p->pSe
a810: 67 6d 65 6e 74 73 29 3b 0a 20 20 70 2d 3e 70 53  gments);.  p->pS
a820: 65 67 6d 65 6e 74 73 20 3d 20 30 3b 0a 7d 0a 20  egments = 0;.}. 
a830: 20 20 20 0a 73 74 61 74 69 63 20 69 6e 74 20 66     .static int f
a840: 74 73 33 53 65 67 52 65 61 64 65 72 49 6e 63 72  ts3SegReaderIncr
a850: 52 65 61 64 28 46 74 73 33 53 65 67 52 65 61 64  Read(Fts3SegRead
a860: 65 72 20 2a 70 52 65 61 64 65 72 29 7b 0a 20 20  er *pReader){.  
a870: 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20  int nRead;      
a880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a890: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
a8a0: 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20  es to read */.  
a8b0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
a8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8d0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
a8e0: 2f 0a 0a 20 20 6e 52 65 61 64 20 3d 20 4d 49 4e  /..  nRead = MIN
a8f0: 28 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 20  (pReader->nNode 
a900: 2d 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75  - pReader->nPopu
a910: 6c 61 74 65 2c 20 46 54 53 33 5f 4e 4f 44 45 5f  late, FTS3_NODE_
a920: 43 48 55 4e 4b 53 49 5a 45 29 3b 0a 20 20 72 63  CHUNKSIZE);.  rc
a930: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
a940: 72 65 61 64 28 0a 20 20 20 20 20 20 70 52 65 61  read(.      pRea
a950: 64 65 72 2d 3e 70 42 6c 6f 62 2c 20 0a 20 20 20  der->pBlob, .   
a960: 20 20 20 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f     &pReader->aNo
a970: 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70  de[pReader->nPop
a980: 75 6c 61 74 65 5d 2c 0a 20 20 20 20 20 20 6e 52  ulate],.      nR
a990: 65 61 64 2c 0a 20 20 20 20 20 20 70 52 65 61 64  ead,.      pRead
a9a0: 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 0a 20 20  er->nPopulate.  
a9b0: 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
a9c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
a9d0: 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74  Reader->nPopulat
a9e0: 65 20 2b 3d 20 6e 52 65 61 64 3b 0a 20 20 20 20  e += nRead;.    
a9f0: 6d 65 6d 73 65 74 28 26 70 52 65 61 64 65 72 2d  memset(&pReader-
aa00: 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e  >aNode[pReader->
aa10: 6e 50 6f 70 75 6c 61 74 65 5d 2c 20 30 2c 20 46  nPopulate], 0, F
aa20: 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49 4e 47  TS3_NODE_PADDING
aa30: 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 61 64  );.    if( pRead
aa40: 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 3d 3d 70  er->nPopulate==p
aa50: 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 20 29 7b  Reader->nNode ){
aa60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
aa70: 6c 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61 64 65  lob_close(pReade
aa80: 72 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 20 20 20  r->pBlob);.     
aa90: 20 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 20   pReader->pBlob 
aaa0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 52 65 61 64  = 0;.      pRead
aab0: 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 20 3d 20  er->nPopulate = 
aac0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
aad0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
aae0: 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 52  tic int fts3SegR
aaf0: 65 61 64 65 72 52 65 71 75 69 72 65 28 46 74 73  eaderRequire(Fts
ab00: 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 65 61  3SegReader *pRea
ab10: 64 65 72 2c 20 63 68 61 72 20 2a 70 46 72 6f 6d  der, char *pFrom
ab20: 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20  , int nByte){.  
ab30: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
ab40: 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  OK;.  assert( !p
ab50: 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 20 0a 20  Reader->pBlob . 
ab60: 20 20 20 20 20 20 7c 7c 20 28 70 46 72 6f 6d 3e        || (pFrom>
ab70: 3d 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20  =pReader->aNode 
ab80: 26 26 20 70 46 72 6f 6d 3c 26 70 52 65 61 64 65  && pFrom<&pReade
ab90: 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65 72  r->aNode[pReader
aba0: 2d 3e 6e 4e 6f 64 65 5d 29 0a 20 20 29 3b 0a 20  ->nNode]).  );. 
abb0: 20 77 68 69 6c 65 28 20 70 52 65 61 64 65 72 2d   while( pReader-
abc0: 3e 70 42 6c 6f 62 20 26 26 20 72 63 3d 3d 53 51  >pBlob && rc==SQ
abd0: 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20 26 26  LITE_OK .     &&
abe0: 20 20 28 70 46 72 6f 6d 20 2d 20 70 52 65 61 64    (pFrom - pRead
abf0: 65 72 2d 3e 61 4e 6f 64 65 20 2b 20 6e 42 79 74  er->aNode + nByt
ac00: 65 29 3e 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70  e)>pReader->nPop
ac10: 75 6c 61 74 65 0a 20 20 29 7b 0a 20 20 20 20 72  ulate.  ){.    r
ac20: 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65  c = fts3SegReade
ac30: 72 49 6e 63 72 52 65 61 64 28 70 52 65 61 64 65  rIncrRead(pReade
ac40: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
ac50: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
ac60: 74 20 61 6e 20 46 74 73 33 53 65 67 52 65 61 64  t an Fts3SegRead
ac70: 65 72 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69  er cursor to poi
ac80: 6e 74 20 61 74 20 45 4f 46 2e 0a 2a 2f 0a 73 74  nt at EOF..*/.st
ac90: 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 53 65  atic void fts3Se
aca0: 67 52 65 61 64 65 72 53 65 74 45 6f 66 28 46 74  gReaderSetEof(Ft
acb0: 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65  s3SegReader *pSe
acc0: 67 29 7b 0a 20 20 69 66 28 20 21 66 74 73 33 53  g){.  if( !fts3S
acd0: 65 67 52 65 61 64 65 72 49 73 52 6f 6f 74 4f 6e  egReaderIsRootOn
ace0: 6c 79 28 70 53 65 67 29 20 29 7b 0a 20 20 20 20  ly(pSeg) ){.    
acf0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65  sqlite3_free(pSe
ad00: 67 2d 3e 61 4e 6f 64 65 29 3b 0a 20 20 20 20 73  g->aNode);.    s
ad10: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73  qlite3_blob_clos
ad20: 65 28 70 53 65 67 2d 3e 70 42 6c 6f 62 29 3b 0a  e(pSeg->pBlob);.
ad30: 20 20 20 20 70 53 65 67 2d 3e 70 42 6c 6f 62 20      pSeg->pBlob 
ad40: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 53 65 67 2d  = 0;.  }.  pSeg-
ad50: 3e 61 4e 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a 2f  >aNode = 0;.}../
ad60: 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74  *.** Move the it
ad70: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
ad80: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
ad90: 65 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ent to the next 
ada0: 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 73  term in the.** s
adb0: 65 67 6d 65 6e 74 2e 20 49 66 20 73 75 63 63 65  egment. If succe
adc0: 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
add0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
ade0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 78   there is no nex
adf0: 74 20 74 65 72 6d 2c 0a 2a 2a 20 53 51 4c 49 54  t term,.** SQLIT
ae00: 45 5f 44 4f 4e 45 2e 20 4f 74 68 65 72 77 69 73  E_DONE. Otherwis
ae10: 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  e, an SQLite err
ae20: 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
ae30: 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65  ic int fts3SegRe
ae40: 61 64 65 72 4e 65 78 74 28 0a 20 20 46 74 73 33  aderNext(.  Fts3
ae50: 54 61 62 6c 65 20 2a 70 2c 20 0a 20 20 46 74 73  Table *p, .  Fts
ae60: 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 65 61  3SegReader *pRea
ae70: 64 65 72 2c 0a 20 20 69 6e 74 20 62 49 6e 63 72  der,.  int bIncr
ae80: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 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 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
aeb0: 63 6f 64 65 20 6f 66 20 76 61 72 69 6f 75 73 20  code of various 
aec0: 73 75 62 2d 72 6f 75 74 69 6e 65 73 20 2a 2f 0a  sub-routines */.
aed0: 20 20 63 68 61 72 20 2a 70 4e 65 78 74 3b 20 20    char *pNext;  
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aef0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 76 61 72 69    /* Cursor vari
af00: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  able */.  int nP
af10: 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20  refix;          
af20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
af30: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
af40: 74 65 72 6d 20 70 72 65 66 69 78 20 2a 2f 0a 20  term prefix */. 
af50: 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 20 20 20   int nSuffix;   
af60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
af80: 74 65 73 20 69 6e 20 74 65 72 6d 20 73 75 66 66  tes in term suff
af90: 69 78 20 2a 2f 0a 0a 20 20 69 66 28 20 21 70 52  ix */..  if( !pR
afa0: 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20  eader->aDoclist 
afb0: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
afc0: 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 3b 0a 20  Reader->aNode;. 
afd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 78   }else{.    pNex
afe0: 74 20 3d 20 26 70 52 65 61 64 65 72 2d 3e 61 44  t = &pReader->aD
aff0: 6f 63 6c 69 73 74 5b 70 52 65 61 64 65 72 2d 3e  oclist[pReader->
b000: 6e 44 6f 63 6c 69 73 74 5d 3b 0a 20 20 7d 0a 0a  nDoclist];.  }..
b010: 20 20 69 66 28 20 21 70 4e 65 78 74 20 7c 7c 20    if( !pNext || 
b020: 70 4e 65 78 74 3e 3d 26 70 52 65 61 64 65 72 2d  pNext>=&pReader-
b030: 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e  >aNode[pReader->
b040: 6e 4e 6f 64 65 5d 20 29 7b 0a 0a 20 20 20 20 69  nNode] ){..    i
b050: 66 28 20 66 74 73 33 53 65 67 52 65 61 64 65 72  f( fts3SegReader
b060: 49 73 50 65 6e 64 69 6e 67 28 70 52 65 61 64 65  IsPending(pReade
b070: 72 29 20 29 7b 0a 20 20 20 20 20 20 46 74 73 33  r) ){.      Fts3
b080: 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 20  HashElem *pElem 
b090: 3d 20 2a 28 70 52 65 61 64 65 72 2d 3e 70 70 4e  = *(pReader->ppN
b0a0: 65 78 74 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20  extElem);.      
b0b0: 69 66 28 20 70 45 6c 65 6d 3d 3d 30 20 29 7b 0a  if( pElem==0 ){.
b0c0: 20 20 20 20 20 20 20 20 70 52 65 61 64 65 72 2d          pReader-
b0d0: 3e 61 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >aNode = 0;.    
b0e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b0f0: 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70 4c   PendingList *pL
b100: 69 73 74 20 3d 20 28 50 65 6e 64 69 6e 67 4c 69  ist = (PendingLi
b110: 73 74 20 2a 29 66 74 73 33 48 61 73 68 44 61 74  st *)fts3HashDat
b120: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20  a(pElem);.      
b130: 20 20 70 52 65 61 64 65 72 2d 3e 7a 54 65 72 6d    pReader->zTerm
b140: 20 3d 20 28 63 68 61 72 20 2a 29 66 74 73 33 48   = (char *)fts3H
b150: 61 73 68 4b 65 79 28 70 45 6c 65 6d 29 3b 0a 20  ashKey(pElem);. 
b160: 20 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e         pReader->
b170: 6e 54 65 72 6d 20 3d 20 66 74 73 33 48 61 73 68  nTerm = fts3Hash
b180: 4b 65 79 73 69 7a 65 28 70 45 6c 65 6d 29 3b 0a  Keysize(pElem);.
b190: 20 20 20 20 20 20 20 20 70 52 65 61 64 65 72 2d          pReader-
b1a0: 3e 6e 4e 6f 64 65 20 3d 20 70 52 65 61 64 65 72  >nNode = pReader
b1b0: 2d 3e 6e 44 6f 63 6c 69 73 74 20 3d 20 70 4c 69  ->nDoclist = pLi
b1c0: 73 74 2d 3e 6e 44 61 74 61 20 2b 20 31 3b 0a 20  st->nData + 1;. 
b1d0: 20 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e         pReader->
b1e0: 61 4e 6f 64 65 20 3d 20 70 52 65 61 64 65 72 2d  aNode = pReader-
b1f0: 3e 61 44 6f 63 6c 69 73 74 20 3d 20 70 4c 69 73  >aDoclist = pLis
b200: 74 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  t->aData;.      
b210: 20 20 70 52 65 61 64 65 72 2d 3e 70 70 4e 65 78    pReader->ppNex
b220: 74 45 6c 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20  tElem++;.       
b230: 20 61 73 73 65 72 74 28 20 70 52 65 61 64 65 72   assert( pReader
b240: 2d 3e 61 4e 6f 64 65 20 29 3b 0a 20 20 20 20 20  ->aNode );.     
b250: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
b260: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
b270: 0a 0a 20 20 20 20 66 74 73 33 53 65 67 52 65 61  ..    fts3SegRea
b280: 64 65 72 53 65 74 45 6f 66 28 70 52 65 61 64 65  derSetEof(pReade
b290: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 69  r);..    /* If i
b2a0: 43 75 72 72 65 6e 74 42 6c 6f 63 6b 3e 3d 69 4c  CurrentBlock>=iL
b2b0: 65 61 66 45 6e 64 42 6c 6f 63 6b 2c 20 74 68 69  eafEndBlock, thi
b2c0: 73 20 69 73 20 61 6e 20 45 4f 46 20 63 6f 6e 64  s is an EOF cond
b2d0: 69 74 69 6f 6e 2e 20 41 6c 6c 20 6c 65 61 66 20  ition. All leaf 
b2e0: 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 73 20 68  .    ** blocks h
b2f0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
b300: 20 74 72 61 76 65 72 73 65 64 2e 20 20 2a 2f 0a   traversed.  */.
b310: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 61      assert( pRea
b320: 64 65 72 2d 3e 69 43 75 72 72 65 6e 74 42 6c 6f  der->iCurrentBlo
b330: 63 6b 3c 3d 70 52 65 61 64 65 72 2d 3e 69 4c 65  ck<=pReader->iLe
b340: 61 66 45 6e 64 42 6c 6f 63 6b 20 29 3b 0a 20 20  afEndBlock );.  
b350: 20 20 69 66 28 20 70 52 65 61 64 65 72 2d 3e 69    if( pReader->i
b360: 43 75 72 72 65 6e 74 42 6c 6f 63 6b 3e 3d 70 52  CurrentBlock>=pR
b370: 65 61 64 65 72 2d 3e 69 4c 65 61 66 45 6e 64 42  eader->iLeafEndB
b380: 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65  lock ){.      re
b390: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
b3a0: 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
b3b0: 73 71 6c 69 74 65 33 46 74 73 33 52 65 61 64 42  sqlite3Fts3ReadB
b3c0: 6c 6f 63 6b 28 0a 20 20 20 20 20 20 20 20 70 2c  lock(.        p,
b3d0: 20 2b 2b 70 52 65 61 64 65 72 2d 3e 69 43 75 72   ++pReader->iCur
b3e0: 72 65 6e 74 42 6c 6f 63 6b 2c 20 26 70 52 65 61  rentBlock, &pRea
b3f0: 64 65 72 2d 3e 61 4e 6f 64 65 2c 20 26 70 52 65  der->aNode, &pRe
b400: 61 64 65 72 2d 3e 6e 4e 6f 64 65 2c 20 0a 20 20  ader->nNode, .  
b410: 20 20 20 20 20 20 28 62 49 6e 63 72 20 3f 20 26        (bIncr ? &
b420: 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61  pReader->nPopula
b430: 74 65 20 3a 20 30 29 0a 20 20 20 20 29 3b 0a 20  te : 0).    );. 
b440: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
b450: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
b460: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  ;.    assert( pR
b470: 65 61 64 65 72 2d 3e 70 42 6c 6f 62 3d 3d 30 20  eader->pBlob==0 
b480: 29 3b 0a 20 20 20 20 69 66 28 20 62 49 6e 63 72  );.    if( bIncr
b490: 20 26 26 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f   && pReader->nPo
b4a0: 70 75 6c 61 74 65 3c 70 52 65 61 64 65 72 2d 3e  pulate<pReader->
b4b0: 6e 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 70  nNode ){.      p
b4c0: 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 20 3d 20  Reader->pBlob = 
b4d0: 70 2d 3e 70 53 65 67 6d 65 6e 74 73 3b 0a 20 20  p->pSegments;.  
b4e0: 20 20 20 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73      p->pSegments
b4f0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
b500: 70 4e 65 78 74 20 3d 20 70 52 65 61 64 65 72 2d  pNext = pReader-
b510: 3e 61 4e 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 61  >aNode;.  }..  a
b520: 73 73 65 72 74 28 20 21 66 74 73 33 53 65 67 52  ssert( !fts3SegR
b530: 65 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28 70  eaderIsPending(p
b540: 52 65 61 64 65 72 29 20 29 3b 0a 0a 20 20 72 63  Reader) );..  rc
b550: 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72   = fts3SegReader
b560: 52 65 71 75 69 72 65 28 70 52 65 61 64 65 72 2c  Require(pReader,
b570: 20 70 4e 65 78 74 2c 20 46 54 53 33 5f 56 41 52   pNext, FTS3_VAR
b580: 49 4e 54 5f 4d 41 58 2a 32 29 3b 0a 20 20 69 66  INT_MAX*2);.  if
b590: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b5a0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 0a  ) return rc;.  .
b5b0: 20 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20    /* Because of 
b5c0: 74 68 65 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41  the FTS3_NODE_PA
b5d0: 44 44 49 4e 47 20 62 79 74 65 73 20 6f 66 20 70  DDING bytes of p
b5e0: 61 64 64 69 6e 67 2c 20 74 68 65 20 66 6f 6c 6c  adding, the foll
b5f0: 6f 77 69 6e 67 20 69 73 20 0a 20 20 2a 2a 20 73  owing is .  ** s
b600: 61 66 65 20 28 6e 6f 20 72 69 73 6b 20 6f 66 20  afe (no risk of 
b610: 6f 76 65 72 72 65 61 64 29 20 65 76 65 6e 20 69  overread) even i
b620: 66 20 74 68 65 20 6e 6f 64 65 20 64 61 74 61 20  f the node data 
b630: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 2a 2f  is corrupted. */
b640: 0a 20 20 70 4e 65 78 74 20 2b 3d 20 73 71 6c 69  .  pNext += sqli
b650: 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74  te3Fts3GetVarint
b660: 33 32 28 70 4e 65 78 74 2c 20 26 6e 50 72 65 66  32(pNext, &nPref
b670: 69 78 29 3b 0a 20 20 70 4e 65 78 74 20 2b 3d 20  ix);.  pNext += 
b680: 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61  sqlite3Fts3GetVa
b690: 72 69 6e 74 33 32 28 70 4e 65 78 74 2c 20 26 6e  rint32(pNext, &n
b6a0: 53 75 66 66 69 78 29 3b 0a 20 20 69 66 28 20 6e  Suffix);.  if( n
b6b0: 50 72 65 66 69 78 3c 30 20 7c 7c 20 6e 53 75 66  Prefix<0 || nSuf
b6c0: 66 69 78 3c 3d 30 20 0a 20 20 20 7c 7c 20 26 70  fix<=0 .   || &p
b6d0: 4e 65 78 74 5b 6e 53 75 66 66 69 78 5d 3e 26 70  Next[nSuffix]>&p
b6e0: 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52  Reader->aNode[pR
b6f0: 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 5d 20 0a 20  eader->nNode] . 
b700: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 46   ){.    return F
b710: 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b  TS_CORRUPT_VTAB;
b720: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 50 72 65  .  }..  if( nPre
b730: 66 69 78 2b 6e 53 75 66 66 69 78 3e 70 52 65 61  fix+nSuffix>pRea
b740: 64 65 72 2d 3e 6e 54 65 72 6d 41 6c 6c 6f 63 20  der->nTermAlloc 
b750: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 20  ){.    int nNew 
b760: 3d 20 28 6e 50 72 65 66 69 78 2b 6e 53 75 66 66  = (nPrefix+nSuff
b770: 69 78 29 2a 32 3b 0a 20 20 20 20 63 68 61 72 20  ix)*2;.    char 
b780: 2a 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f  *zNew = sqlite3_
b790: 72 65 61 6c 6c 6f 63 28 70 52 65 61 64 65 72 2d  realloc(pReader-
b7a0: 3e 7a 54 65 72 6d 2c 20 6e 4e 65 77 29 3b 0a 20  >zTerm, nNew);. 
b7b0: 20 20 20 69 66 28 20 21 7a 4e 65 77 20 29 7b 0a     if( !zNew ){.
b7c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b7d0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
b7e0: 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e 7a 54  .    pReader->zT
b7f0: 65 72 6d 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20  erm = zNew;.    
b800: 70 52 65 61 64 65 72 2d 3e 6e 54 65 72 6d 41 6c  pReader->nTermAl
b810: 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 7d 0a  loc = nNew;.  }.
b820: 0a 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52  .  rc = fts3SegR
b830: 65 61 64 65 72 52 65 71 75 69 72 65 28 70 52 65  eaderRequire(pRe
b840: 61 64 65 72 2c 20 70 4e 65 78 74 2c 20 6e 53 75  ader, pNext, nSu
b850: 66 66 69 78 2b 46 54 53 33 5f 56 41 52 49 4e 54  ffix+FTS3_VARINT
b860: 5f 4d 41 58 29 3b 0a 20 20 69 66 28 20 72 63 21  _MAX);.  if( rc!
b870: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
b880: 75 72 6e 20 72 63 3b 0a 0a 20 20 6d 65 6d 63 70  urn rc;..  memcp
b890: 79 28 26 70 52 65 61 64 65 72 2d 3e 7a 54 65 72  y(&pReader->zTer
b8a0: 6d 5b 6e 50 72 65 66 69 78 5d 2c 20 70 4e 65 78  m[nPrefix], pNex
b8b0: 74 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 70  t, nSuffix);.  p
b8c0: 52 65 61 64 65 72 2d 3e 6e 54 65 72 6d 20 3d 20  Reader->nTerm = 
b8d0: 6e 50 72 65 66 69 78 2b 6e 53 75 66 66 69 78 3b  nPrefix+nSuffix;
b8e0: 0a 20 20 70 4e 65 78 74 20 2b 3d 20 6e 53 75 66  .  pNext += nSuf
b8f0: 66 69 78 3b 0a 20 20 70 4e 65 78 74 20 2b 3d 20  fix;.  pNext += 
b900: 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61  sqlite3Fts3GetVa
b910: 72 69 6e 74 33 32 28 70 4e 65 78 74 2c 20 26 70  rint32(pNext, &p
b920: 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74  Reader->nDoclist
b930: 29 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 61 44  );.  pReader->aD
b940: 6f 63 6c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a  oclist = pNext;.
b950: 20 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73    pReader->pOffs
b960: 65 74 4c 69 73 74 20 3d 20 30 3b 0a 0a 20 20 2f  etList = 0;..  /
b970: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
b980: 20 64 6f 63 6c 69 73 74 20 64 6f 65 73 20 6e 6f   doclist does no
b990: 74 20 61 70 70 65 61 72 20 74 6f 20 65 78 74 65  t appear to exte
b9a0: 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  nd past the end 
b9b0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 62 2d 74 72  of the.  ** b-tr
b9c0: 65 65 20 6e 6f 64 65 2e 20 41 6e 64 20 74 68 61  ee node. And tha
b9d0: 74 20 74 68 65 20 66 69 6e 61 6c 20 62 79 74 65  t the final byte
b9e0: 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20   of the doclist 
b9f0: 69 73 20 30 78 30 30 2e 20 49 66 20 65 69 74 68  is 0x00. If eith
ba00: 65 72 20 0a 20 20 2a 2a 20 6f 66 20 74 68 65 73  er .  ** of thes
ba10: 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20  e statements is 
ba20: 75 6e 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  untrue, then the
ba30: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
ba40: 69 73 20 63 6f 72 72 75 70 74 2e 0a 20 20 2a 2f  is corrupt..  */
ba50: 0a 20 20 69 66 28 20 26 70 52 65 61 64 65 72 2d  .  if( &pReader-
ba60: 3e 61 44 6f 63 6c 69 73 74 5b 70 52 65 61 64 65  >aDoclist[pReade
ba70: 72 2d 3e 6e 44 6f 63 6c 69 73 74 5d 3e 26 70 52  r->nDoclist]>&pR
ba80: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65  eader->aNode[pRe
ba90: 61 64 65 72 2d 3e 6e 4e 6f 64 65 5d 20 0a 20 20  ader->nNode] .  
baa0: 20 7c 7c 20 28 70 52 65 61 64 65 72 2d 3e 6e 50   || (pReader->nP
bab0: 6f 70 75 6c 61 74 65 3d 3d 30 20 26 26 20 70 52  opulate==0 && pR
bac0: 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b  eader->aDoclist[
bad0: 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73  pReader->nDoclis
bae0: 74 2d 31 5d 29 0a 20 20 29 7b 0a 20 20 20 20 72  t-1]).  ){.    r
baf0: 65 74 75 72 6e 20 46 54 53 5f 43 4f 52 52 55 50  eturn FTS_CORRUP
bb00: 54 5f 56 54 41 42 3b 0a 20 20 7d 0a 20 20 72 65  T_VTAB;.  }.  re
bb10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
bb20: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
bb30: 20 53 65 67 52 65 61 64 65 72 20 74 6f 20 70 6f   SegReader to po
bb40: 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  int to the first
bb50: 20 64 6f 63 69 64 20 69 6e 20 74 68 65 20 64 6f   docid in the do
bb60: 63 6c 69 73 74 20 61 73 73 6f 63 69 61 74 65 64  clist associated
bb70: 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 63 75 72  .** with the cur
bb80: 72 65 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74  rent term..*/.st
bb90: 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67  atic int fts3Seg
bba0: 52 65 61 64 65 72 46 69 72 73 74 44 6f 63 69 64  ReaderFirstDocid
bbb0: 28 46 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62  (Fts3Table *pTab
bbc0: 2c 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20  , Fts3SegReader 
bbd0: 2a 70 52 65 61 64 65 72 29 7b 0a 20 20 69 6e 74  *pReader){.  int
bbe0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
bbf0: 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 61 64  .  assert( pRead
bc00: 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20 29 3b 0a  er->aDoclist );.
bc10: 20 20 61 73 73 65 72 74 28 20 21 70 52 65 61 64    assert( !pRead
bc20: 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20  er->pOffsetList 
bc30: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 62  );.  if( pTab->b
bc40: 44 65 73 63 49 64 78 20 26 26 20 66 74 73 33 53  DescIdx && fts3S
bc50: 65 67 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e  egReaderIsPendin
bc60: 67 28 70 52 65 61 64 65 72 29 20 29 7b 0a 20 20  g(pReader) ){.  
bc70: 20 20 75 38 20 62 45 6f 66 20 3d 20 30 3b 0a 20    u8 bEof = 0;. 
bc80: 20 20 20 70 52 65 61 64 65 72 2d 3e 69 44 6f 63     pReader->iDoc
bc90: 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 52 65 61  id = 0;.    pRea
bca0: 64 65 72 2d 3e 6e 4f 66 66 73 65 74 4c 69 73 74  der->nOffsetList
bcb0: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
bcc0: 33 46 74 73 33 44 6f 63 6c 69 73 74 50 72 65 76  3Fts3DoclistPrev
bcd0: 28 30 2c 0a 20 20 20 20 20 20 20 20 70 52 65 61  (0,.        pRea
bce0: 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 70  der->aDoclist, p
bcf0: 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74  Reader->nDoclist
bd00: 2c 20 26 70 52 65 61 64 65 72 2d 3e 70 4f 66 66  , &pReader->pOff
bd10: 73 65 74 4c 69 73 74 2c 20 0a 20 20 20 20 20 20  setList, .      
bd20: 20 20 26 70 52 65 61 64 65 72 2d 3e 69 44 6f 63    &pReader->iDoc
bd30: 69 64 2c 20 26 70 52 65 61 64 65 72 2d 3e 6e 4f  id, &pReader->nO
bd40: 66 66 73 65 74 4c 69 73 74 2c 20 26 62 45 6f 66  ffsetList, &bEof
bd50: 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .    );.  }else{
bd60: 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65  .    rc = fts3Se
bd70: 67 52 65 61 64 65 72 52 65 71 75 69 72 65 28 70  gReaderRequire(p
bd80: 52 65 61 64 65 72 2c 20 70 52 65 61 64 65 72 2d  Reader, pReader-
bd90: 3e 61 44 6f 63 6c 69 73 74 2c 20 46 54 53 33 5f  >aDoclist, FTS3_
bda0: 56 41 52 49 4e 54 5f 4d 41 58 29 3b 0a 20 20 20  VARINT_MAX);.   
bdb0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
bdc0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
bdd0: 6e 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47  n = sqlite3Fts3G
bde0: 65 74 56 61 72 69 6e 74 28 70 52 65 61 64 65 72  etVarint(pReader
bdf0: 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 26 70 52 65  ->aDoclist, &pRe
be00: 61 64 65 72 2d 3e 69 44 6f 63 69 64 29 3b 0a 20  ader->iDocid);. 
be10: 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 4f       pReader->pO
be20: 66 66 73 65 74 4c 69 73 74 20 3d 20 26 70 52 65  ffsetList = &pRe
be30: 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b 6e  ader->aDoclist[n
be40: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  ];.    }.  }.  r
be50: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
be60: 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 53  ** Advance the S
be70: 65 67 52 65 61 64 65 72 20 74 6f 20 70 6f 69 6e  egReader to poin
be80: 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 6f  t to the next do
be90: 63 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69  cid in the docli
bea0: 73 74 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  st.** associated
beb0: 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e   with the curren
bec0: 74 20 74 65 72 6d 2e 0a 2a 2a 20 0a 2a 2a 20 49  t term..** .** I
bed0: 66 20 61 72 67 75 6d 65 6e 74 73 20 70 70 4f 66  f arguments ppOf
bee0: 66 73 65 74 4c 69 73 74 20 61 6e 64 20 70 6e 4f  fsetList and pnO
bef0: 66 66 73 65 74 4c 69 73 74 20 61 72 65 20 6e 6f  ffsetList are no
bf00: 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 0a 2a 2a  t NULL, then .**
bf10: 20 2a 70 70 4f 66 66 73 65 74 4c 69 73 74 20 69   *ppOffsetList i
bf20: 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
bf30: 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75  o the first colu
bf40: 6d 6e 2d 6f 66 66 73 65 74 20 6c 69 73 74 0a 2a  mn-offset list.*
bf50: 2a 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74  * in the doclist
bf60: 20 65 6e 74 72 79 20 28 69 2e 65 2e 20 69 6d 6d   entry (i.e. imm
bf70: 65 64 69 61 74 65 6c 79 20 70 61 73 74 20 74 68  ediately past th
bf80: 65 20 64 6f 63 69 64 20 76 61 72 69 6e 74 29 2e  e docid varint).
bf90: 0a 2a 2a 20 2a 70 6e 4f 66 66 73 65 74 4c 69 73  .** *pnOffsetLis
bfa0: 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
bfb0: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 65  length of the se
bfc0: 74 20 6f 66 20 63 6f 6c 75 6d 6e 2d 6f 66 66 73  t of column-offs
bfd0: 65 74 0a 2a 2a 20 6c 69 73 74 73 2c 20 6e 6f 74  et.** lists, not
bfe0: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e   including the n
bff0: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79  ul-terminator by
c000: 74 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  te. For example:
c010: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
c020: 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 78 74  ts3SegReaderNext
c030: 44 6f 63 69 64 28 0a 20 20 46 74 73 33 54 61 62  Docid(.  Fts3Tab
c040: 6c 65 20 2a 70 54 61 62 2c 0a 20 20 46 74 73 33  le *pTab,.  Fts3
c050: 53 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64  SegReader *pRead
c060: 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  er,         /* R
c070: 65 61 64 65 72 20 74 6f 20 61 64 76 61 6e 63 65  eader to advance
c080: 20 74 6f 20 6e 65 78 74 20 64 6f 63 69 64 20 2a   to next docid *
c090: 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 4f 66 66  /.  char **ppOff
c0a0: 73 65 74 4c 69 73 74 2c 20 20 20 20 20 20 20 20  setList,        
c0b0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e      /* OUT: Poin
c0c0: 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 70  ter to current p
c0d0: 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 2a 2f 0a  osition-list */.
c0e0: 20 20 69 6e 74 20 2a 70 6e 4f 66 66 73 65 74 4c    int *pnOffsetL
c0f0: 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ist             
c100: 20 20 2f 2a 20 4f 55 54 3a 20 4c 65 6e 67 74 68    /* OUT: Length
c110: 20 6f 66 20 2a 70 70 4f 66 66 73 65 74 4c 69 73   of *ppOffsetLis
c120: 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b  t in bytes */.){
c130: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
c140: 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 70  TE_OK;.  char *p
c150: 20 3d 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66   = pReader->pOff
c160: 73 65 74 4c 69 73 74 3b 0a 20 20 63 68 61 72 20  setList;.  char 
c170: 63 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  c = 0;..  assert
c180: 28 20 70 20 29 3b 0a 0a 20 20 69 66 28 20 70 54  ( p );..  if( pT
c190: 61 62 2d 3e 62 44 65 73 63 49 64 78 20 26 26 20  ab->bDescIdx && 
c1a0: 66 74 73 33 53 65 67 52 65 61 64 65 72 49 73 50  fts3SegReaderIsP
c1b0: 65 6e 64 69 6e 67 28 70 52 65 61 64 65 72 29 20  ending(pReader) 
c1c0: 29 7b 0a 20 20 20 20 2f 2a 20 41 20 70 65 6e 64  ){.    /* A pend
c1d0: 69 6e 67 2d 74 65 72 6d 73 20 73 65 67 2d 72 65  ing-terms seg-re
c1e0: 61 64 65 72 20 66 6f 72 20 61 6e 20 46 54 53 34  ader for an FTS4
c1f0: 20 74 61 62 6c 65 20 74 68 61 74 20 75 73 65 73   table that uses
c200: 20 6f 72 64 65 72 3d 64 65 73 63 2e 0a 20 20 20   order=desc..   
c210: 20 2a 2a 20 50 65 6e 64 69 6e 67 2d 74 65 72 6d   ** Pending-term
c220: 73 20 64 6f 63 6c 69 73 74 73 20 61 72 65 20 61  s doclists are a
c230: 6c 77 61 79 73 20 62 75 69 6c 74 20 75 70 20 69  lways built up i
c240: 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
c250: 72 2c 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20  r, so.    ** we 
c260: 68 61 76 65 20 74 6f 20 69 74 65 72 61 74 65 20  have to iterate 
c270: 74 68 72 6f 75 67 68 20 74 68 65 6d 20 62 61 63  through them bac
c280: 6b 77 61 72 64 73 20 68 65 72 65 2e 20 2a 2f 0a  kwards here. */.
c290: 20 20 20 20 75 38 20 62 45 6f 66 20 3d 20 30 3b      u8 bEof = 0;
c2a0: 0a 20 20 20 20 69 66 28 20 70 70 4f 66 66 73 65  .    if( ppOffse
c2b0: 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 2a  tList ){.      *
c2c0: 70 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 70  ppOffsetList = p
c2d0: 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c  Reader->pOffsetL
c2e0: 69 73 74 3b 0a 20 20 20 20 20 20 2a 70 6e 4f 66  ist;.      *pnOf
c2f0: 66 73 65 74 4c 69 73 74 20 3d 20 70 52 65 61 64  fsetList = pRead
c300: 65 72 2d 3e 6e 4f 66 66 73 65 74 4c 69 73 74 20  er->nOffsetList 
c310: 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  - 1;.    }.    s
c320: 71 6c 69 74 65 33 46 74 73 33 44 6f 63 6c 69 73  qlite3Fts3Doclis
c330: 74 50 72 65 76 28 30 2c 0a 20 20 20 20 20 20 20  tPrev(0,.       
c340: 20 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69   pReader->aDocli
c350: 73 74 2c 20 70 52 65 61 64 65 72 2d 3e 6e 44 6f  st, pReader->nDo
c360: 63 6c 69 73 74 2c 20 26 70 2c 20 26 70 52 65 61  clist, &p, &pRea
c370: 64 65 72 2d 3e 69 44 6f 63 69 64 2c 0a 20 20 20  der->iDocid,.   
c380: 20 20 20 20 20 26 70 52 65 61 64 65 72 2d 3e 6e       &pReader->n
c390: 4f 66 66 73 65 74 4c 69 73 74 2c 20 26 62 45 6f  OffsetList, &bEo
c3a0: 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  f.    );.    if(
c3b0: 20 62 45 6f 66 20 29 7b 0a 20 20 20 20 20 20 70   bEof ){.      p
c3c0: 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c  Reader->pOffsetL
c3d0: 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ist = 0;.    }el
c3e0: 73 65 7b 0a 20 20 20 20 20 20 70 52 65 61 64 65  se{.      pReade
c3f0: 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d  r->pOffsetList =
c400: 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   p;.    }.  }els
c410: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 45 6e  e{.    char *pEn
c420: 64 20 3d 20 26 70 52 65 61 64 65 72 2d 3e 61 44  d = &pReader->aD
c430: 6f 63 6c 69 73 74 5b 70 52 65 61 64 65 72 2d 3e  oclist[pReader->
c440: 6e 44 6f 63 6c 69 73 74 5d 3b 0a 0a 20 20 20 20  nDoclist];..    
c450: 2f 2a 20 50 6f 69 6e 74 65 72 20 70 20 63 75 72  /* Pointer p cur
c460: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 61 74  rently points at
c470: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
c480: 6f 66 20 61 6e 20 6f 66 66 73 65 74 20 6c 69 73  of an offset lis
c490: 74 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f  t. The.    ** fo
c4a0: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 61 64  llowing block ad
c4b0: 76 61 6e 63 65 73 20 69 74 20 74 6f 20 70 6f 69  vances it to poi
c4c0: 6e 74 20 6f 6e 65 20 62 79 74 65 20 70 61 73 74  nt one byte past
c4d0: 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20   the end of.    
c4e0: 2a 2a 20 74 68 65 20 73 61 6d 65 20 6f 66 66 73  ** the same offs
c4f0: 65 74 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20  et list. */.    
c500: 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 0a 20  while( 1 ){.  . 
c510: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c       /* The foll
c520: 6f 77 69 6e 67 20 6c 69 6e 65 20 6f 66 20 63 6f  owing line of co
c530: 64 65 20 28 61 6e 64 20 74 68 65 20 22 70 2b 2b  de (and the "p++
c540: 22 20 62 65 6c 6f 77 20 74 68 65 20 77 68 69 6c  " below the whil
c550: 65 28 29 20 6c 6f 6f 70 29 20 69 73 0a 20 20 20  e() loop) is.   
c560: 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61     ** normally a
c570: 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69  ll that is requi
c580: 72 65 64 20 74 6f 20 6d 6f 76 65 20 70 6f 69 6e  red to move poin
c590: 74 65 72 20 70 20 74 6f 20 74 68 65 20 64 65 73  ter p to the des
c5a0: 69 72 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 70  ired .      ** p
c5b0: 6f 73 69 74 69 6f 6e 2e 20 54 68 65 20 65 78 63  osition. The exc
c5c0: 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 69  eption is if thi
c5d0: 73 20 6e 6f 64 65 20 69 73 20 62 65 69 6e 67 20  s node is being 
c5e0: 6c 6f 61 64 65 64 20 66 72 6f 6d 20 64 69 73 6b  loaded from disk
c5f0: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d  .      ** increm
c600: 65 6e 74 61 6c 6c 79 20 61 6e 64 20 70 6f 69 6e  entally and poin
c610: 74 65 72 20 22 70 22 20 6e 6f 77 20 70 6f 69 6e  ter "p" now poin
c620: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
c630: 62 79 74 65 20 70 61 73 73 65 64 0a 20 20 20 20  byte passed.    
c640: 20 20 2a 2a 20 74 68 65 20 70 6f 70 75 6c 61 74    ** the populat
c650: 65 64 20 70 61 72 74 20 6f 66 20 70 52 65 61 64  ed part of pRead
c660: 65 72 2d 3e 61 4e 6f 64 65 5b 5d 2e 0a 20 20 20  er->aNode[]..   
c670: 20 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c     */.      whil
c680: 65 28 20 2a 70 20 7c 20 63 20 29 20 63 20 3d 20  e( *p | c ) c = 
c690: 2a 70 2b 2b 20 26 20 30 78 38 30 3b 0a 20 20 20  *p++ & 0x80;.   
c6a0: 20 20 20 61 73 73 65 72 74 28 20 2a 70 3d 3d 30     assert( *p==0
c6b0: 20 29 3b 0a 20 20 0a 20 20 20 20 20 20 69 66 28   );.  .      if(
c6c0: 20 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 3d   pReader->pBlob=
c6d0: 3d 30 20 7c 7c 20 70 3c 26 70 52 65 61 64 65 72  =0 || p<&pReader
c6e0: 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d  ->aNode[pReader-
c6f0: 3e 6e 50 6f 70 75 6c 61 74 65 5d 20 29 20 62 72  >nPopulate] ) br
c700: 65 61 6b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  eak;.      rc = 
c710: 66 74 73 33 53 65 67 52 65 61 64 65 72 49 6e 63  fts3SegReaderInc
c720: 72 52 65 61 64 28 70 52 65 61 64 65 72 29 3b 0a  rRead(pReader);.
c730: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
c740: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
c750: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
c760: 2b 2b 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66  ++;.  .    /* If
c770: 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c   required, popul
c780: 61 74 65 20 74 68 65 20 6f 75 74 70 75 74 20 76  ate the output v
c790: 61 72 69 61 62 6c 65 73 20 77 69 74 68 20 61 20  ariables with a 
c7a0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 64 20 74  pointer to and t
c7b0: 68 65 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f  he.    ** size o
c7c0: 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f  f the previous o
c7d0: 66 66 73 65 74 2d 6c 69 73 74 2e 0a 20 20 20 20  ffset-list..    
c7e0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 70 4f 66 66  */.    if( ppOff
c7f0: 73 65 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  setList ){.     
c800: 20 2a 70 70 4f 66 66 73 65 74 4c 69 73 74 20 3d   *ppOffsetList =
c810: 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65   pReader->pOffse
c820: 74 4c 69 73 74 3b 0a 20 20 20 20 20 20 2a 70 6e  tList;.      *pn
c830: 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 28 69 6e  OffsetList = (in
c840: 74 29 28 70 20 2d 20 70 52 65 61 64 65 72 2d 3e  t)(p - pReader->
c850: 70 4f 66 66 73 65 74 4c 69 73 74 20 2d 20 31 29  pOffsetList - 1)
c860: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 68 69  ;.    }..    whi
c870: 6c 65 28 20 70 3c 70 45 6e 64 20 26 26 20 2a 70  le( p<pEnd && *p
c880: 3d 3d 30 20 29 20 70 2b 2b 3b 0a 20 20 0a 20 20  ==0 ) p++;.  .  
c890: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
c8a0: 65 20 6e 6f 20 6d 6f 72 65 20 65 6e 74 72 69 65  e no more entrie
c8b0: 73 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74  s in the doclist
c8c0: 2c 20 73 65 74 20 70 4f 66 66 73 65 74 4c 69 73  , set pOffsetLis
c8d0: 74 20 74 6f 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c  t to.    ** NULL
c8e0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74  . Otherwise, set
c8f0: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 2e 69   Fts3SegReader.i
c900: 44 6f 63 69 64 20 74 6f 20 74 68 65 20 6e 65 78  Docid to the nex
c910: 74 20 64 6f 63 69 64 20 61 6e 64 0a 20 20 20 20  t docid and.    
c920: 2a 2a 20 46 74 73 33 53 65 67 52 65 61 64 65 72  ** Fts3SegReader
c930: 2e 70 4f 66 66 73 65 74 4c 69 73 74 20 74 6f 20  .pOffsetList to 
c940: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 78  point to the nex
c950: 74 20 6f 66 66 73 65 74 20 6c 69 73 74 20 62 65  t offset list be
c960: 66 6f 72 65 0a 20 20 20 20 2a 2a 20 72 65 74 75  fore.    ** retu
c970: 72 6e 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20  rning..    */.  
c980: 20 20 69 66 28 20 70 3e 3d 70 45 6e 64 20 29 7b    if( p>=pEnd ){
c990: 0a 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e  .      pReader->
c9a0: 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 30 3b  pOffsetList = 0;
c9b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c9c0: 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65    rc = fts3SegRe
c9d0: 61 64 65 72 52 65 71 75 69 72 65 28 70 52 65 61  aderRequire(pRea
c9e0: 64 65 72 2c 20 70 2c 20 46 54 53 33 5f 56 41 52  der, p, FTS3_VAR
c9f0: 49 4e 54 5f 4d 41 58 29 3b 0a 20 20 20 20 20 20  INT_MAX);.      
ca00: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
ca10: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
ca20: 69 74 65 33 5f 69 6e 74 36 34 20 69 44 65 6c 74  ite3_int64 iDelt
ca30: 61 3b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64  a;.        pRead
ca40: 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20  er->pOffsetList 
ca50: 3d 20 70 20 2b 20 73 71 6c 69 74 65 33 46 74 73  = p + sqlite3Fts
ca60: 33 47 65 74 56 61 72 69 6e 74 28 70 2c 20 26 69  3GetVarint(p, &i
ca70: 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20  Delta);.        
ca80: 69 66 28 20 70 54 61 62 2d 3e 62 44 65 73 63 49  if( pTab->bDescI
ca90: 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  dx ){.          
caa0: 70 52 65 61 64 65 72 2d 3e 69 44 6f 63 69 64 20  pReader->iDocid 
cab0: 2d 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  -= iDelta;.     
cac0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cad0: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 69 44 6f      pReader->iDo
cae0: 63 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20  cid += iDelta;. 
caf0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
cb00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
cb10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
cb20: 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  }...int sqlite3F
cb30: 74 73 33 4d 73 72 4f 76 66 6c 28 0a 20 20 46 74  ts3MsrOvfl(.  Ft
cb40: 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20  s3Cursor *pCsr, 
cb50: 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52  .  Fts3MultiSegR
cb60: 65 61 64 65 72 20 2a 70 4d 73 72 2c 0a 20 20 69  eader *pMsr,.  i
cb70: 6e 74 20 2a 70 6e 4f 76 66 6c 0a 29 7b 0a 20 20  nt *pnOvfl.){.  
cb80: 46 74 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 28  Fts3Table *p = (
cb90: 46 74 73 33 54 61 62 6c 65 2a 29 70 43 73 72 2d  Fts3Table*)pCsr-
cba0: 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a 20 20 69  >base.pVtab;.  i
cbb0: 6e 74 20 6e 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  nt nOvfl = 0;.  
cbc0: 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 72 63  int ii;.  int rc
cbd0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
cbe0: 69 6e 74 20 70 67 73 7a 20 3d 20 70 2d 3e 6e 50  int pgsz = p->nP
cbf0: 67 73 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  gsz;..  assert( 
cc00: 70 2d 3e 62 48 61 73 53 74 61 74 20 29 3b 0a 20  p->bHasStat );. 
cc10: 20 61 73 73 65 72 74 28 20 70 67 73 7a 3e 30 20   assert( pgsz>0 
cc20: 29 3b 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  );..  for(ii=0; 
cc30: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
cc40: 20 69 69 3c 70 4d 73 72 2d 3e 6e 53 65 67 6d 65   ii<pMsr->nSegme
cc50: 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 46  nt; ii++){.    F
cc60: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 52  ts3SegReader *pR
cc70: 65 61 64 65 72 20 3d 20 70 4d 73 72 2d 3e 61 70  eader = pMsr->ap
cc80: 53 65 67 6d 65 6e 74 5b 69 69 5d 3b 0a 20 20 20  Segment[ii];.   
cc90: 20 69 66 28 20 21 66 74 73 33 53 65 67 52 65 61   if( !fts3SegRea
cca0: 64 65 72 49 73 50 65 6e 64 69 6e 67 28 70 52 65  derIsPending(pRe
ccb0: 61 64 65 72 29 20 0a 20 20 20 20 20 26 26 20 21  ader) .     && !
ccc0: 66 74 73 33 53 65 67 52 65 61 64 65 72 49 73 52  fts3SegReaderIsR
ccd0: 6f 6f 74 4f 6e 6c 79 28 70 52 65 61 64 65 72 29  ootOnly(pReader)
cce0: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73   .    ){.      s
ccf0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6a 6a 3b  qlite3_int64 jj;
cd00: 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 70 52  .      for(jj=pR
cd10: 65 61 64 65 72 2d 3e 69 53 74 61 72 74 42 6c 6f  eader->iStartBlo
cd20: 63 6b 3b 20 6a 6a 3c 3d 70 52 65 61 64 65 72 2d  ck; jj<=pReader-
cd30: 3e 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 3b 20  >iLeafEndBlock; 
cd40: 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  jj++){.        i
cd50: 6e 74 20 6e 42 6c 6f 62 3b 0a 20 20 20 20 20 20  nt nBlob;.      
cd60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
cd70: 73 33 52 65 61 64 42 6c 6f 63 6b 28 70 2c 20 6a  s3ReadBlock(p, j
cd80: 6a 2c 20 30 2c 20 26 6e 42 6c 6f 62 2c 20 30 29  j, 0, &nBlob, 0)
cd90: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
cda0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72  !=SQLITE_OK ) br
cdb0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  eak;.        if(
cdc0: 20 28 6e 42 6c 6f 62 2b 33 35 29 3e 70 67 73 7a   (nBlob+35)>pgsz
cdd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f   ){.          nO
cde0: 76 66 6c 20 2b 3d 20 28 6e 42 6c 6f 62 20 2b 20  vfl += (nBlob + 
cdf0: 33 34 29 2f 70 67 73 7a 3b 0a 20 20 20 20 20 20  34)/pgsz;.      
ce00: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ce10: 7d 0a 20 20 7d 0a 20 20 2a 70 6e 4f 76 66 6c 20  }.  }.  *pnOvfl 
ce20: 3d 20 6e 4f 76 66 6c 3b 0a 20 20 72 65 74 75 72  = nOvfl;.  retur
ce30: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
ce40: 72 65 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 69  ree all allocati
ce50: 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ons associated w
ce60: 69 74 68 20 74 68 65 20 69 74 65 72 61 74 6f 72  ith the iterator
ce70: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 0a   passed as the .
ce80: 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ** second argume
ce90: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
cea0: 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72  te3Fts3SegReader
ceb0: 46 72 65 65 28 46 74 73 33 53 65 67 52 65 61 64  Free(Fts3SegRead
cec0: 65 72 20 2a 70 52 65 61 64 65 72 29 7b 0a 20 20  er *pReader){.  
ced0: 69 66 28 20 70 52 65 61 64 65 72 20 26 26 20 21  if( pReader && !
cee0: 66 74 73 33 53 65 67 52 65 61 64 65 72 49 73 50  fts3SegReaderIsP
cef0: 65 6e 64 69 6e 67 28 70 52 65 61 64 65 72 29 20  ending(pReader) 
cf00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
cf10: 72 65 65 28 70 52 65 61 64 65 72 2d 3e 7a 54 65  ree(pReader->zTe
cf20: 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 21 66 74  rm);.    if( !ft
cf30: 73 33 53 65 67 52 65 61 64 65 72 49 73 52 6f 6f  s3SegReaderIsRoo
cf40: 74 4f 6e 6c 79 28 70 52 65 61 64 65 72 29 20 29  tOnly(pReader) )
cf50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
cf60: 66 72 65 65 28 70 52 65 61 64 65 72 2d 3e 61 4e  free(pReader->aN
cf70: 6f 64 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ode);.      sqli
cf80: 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70  te3_blob_close(p
cf90: 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 29 3b 0a  Reader->pBlob);.
cfa0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
cfb0: 74 65 33 5f 66 72 65 65 28 70 52 65 61 64 65 72  te3_free(pReader
cfc0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  );.}../*.** Allo
cfd0: 63 61 74 65 20 61 20 6e 65 77 20 53 65 67 52 65  cate a new SegRe
cfe0: 61 64 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ader object..*/.
cff0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 53  int sqlite3Fts3S
d000: 65 67 52 65 61 64 65 72 4e 65 77 28 0a 20 20 69  egReaderNew(.  i
d010: 6e 74 20 69 41 67 65 2c 20 20 20 20 20 20 20 20  nt iAge,        
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d030: 2a 20 53 65 67 6d 65 6e 74 20 22 61 67 65 22 2e  * Segment "age".
d040: 20 2a 2f 0a 20 20 69 6e 74 20 62 4c 6f 6f 6b 75   */.  int bLooku
d050: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
d060: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
d070: 72 20 61 20 6c 6f 6f 6b 75 70 20 6f 6e 6c 79 20  r a lookup only 
d080: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
d090: 36 34 20 69 53 74 61 72 74 4c 65 61 66 2c 20 20  64 iStartLeaf,  
d0a0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 65       /* First le
d0b0: 61 66 20 74 6f 20 74 72 61 76 65 72 73 65 20 2a  af to traverse *
d0c0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
d0d0: 34 20 69 45 6e 64 4c 65 61 66 2c 20 20 20 20 20  4 iEndLeaf,     
d0e0: 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6c 65 61      /* Final lea
d0f0: 66 20 74 6f 20 74 72 61 76 65 72 73 65 20 2a 2f  f to traverse */
d100: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
d110: 20 69 45 6e 64 42 6c 6f 63 6b 2c 20 20 20 20 20   iEndBlock,     
d120: 20 20 20 2f 2a 20 46 69 6e 61 6c 20 62 6c 6f 63     /* Final bloc
d130: 6b 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  k of segment */.
d140: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52    const char *zR
d150: 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  oot,            
d160: 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
d170: 61 69 6e 69 6e 67 20 72 6f 6f 74 20 6e 6f 64 65  aining root node
d180: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f 74 2c   */.  int nRoot,
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1a0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
d1b0: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
d1c0: 6e 67 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a  ng root node */.
d1d0: 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
d1e0: 2a 2a 70 70 52 65 61 64 65 72 20 20 20 20 20 20  **ppReader      
d1f0: 20 20 2f 2a 20 4f 55 54 3a 20 41 6c 6c 6f 63 61    /* OUT: Alloca
d200: 74 65 64 20 46 74 73 33 53 65 67 52 65 61 64 65  ted Fts3SegReade
d210: 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 53 65  r */.){.  Fts3Se
d220: 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 65 72  gReader *pReader
d230: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77  ;         /* New
d240: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 53 65 67  ly allocated Seg
d250: 52 65 61 64 65 72 20 6f 62 6a 65 63 74 20 2a 2f  Reader object */
d260: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20  .  int nExtra = 
d270: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
d280: 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
d290: 6c 6c 6f 63 61 74 65 20 73 65 67 6d 65 6e 74 20  llocate segment 
d2a0: 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 0a 20 20  root node */..  
d2b0: 61 73 73 65 72 74 28 20 69 53 74 61 72 74 4c 65  assert( iStartLe
d2c0: 61 66 3c 3d 69 45 6e 64 4c 65 61 66 20 29 3b 0a  af<=iEndLeaf );.
d2d0: 20 20 69 66 28 20 69 53 74 61 72 74 4c 65 61 66    if( iStartLeaf
d2e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 45 78 74 72  ==0 ){.    nExtr
d2f0: 61 20 3d 20 6e 52 6f 6f 74 20 2b 20 46 54 53 33  a = nRoot + FTS3
d300: 5f 4e 4f 44 45 5f 50 41 44 44 49 4e 47 3b 0a 20  _NODE_PADDING;. 
d310: 20 7d 0a 0a 20 20 70 52 65 61 64 65 72 20 3d 20   }..  pReader = 
d320: 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a  (Fts3SegReader *
d330: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
d340: 73 69 7a 65 6f 66 28 46 74 73 33 53 65 67 52 65  sizeof(Fts3SegRe
d350: 61 64 65 72 29 20 2b 20 6e 45 78 74 72 61 29 3b  ader) + nExtra);
d360: 0a 20 20 69 66 28 20 21 70 52 65 61 64 65 72 20  .  if( !pReader 
d370: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
d380: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
d390: 20 20 6d 65 6d 73 65 74 28 70 52 65 61 64 65 72    memset(pReader
d3a0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 33  , 0, sizeof(Fts3
d3b0: 53 65 67 52 65 61 64 65 72 29 29 3b 0a 20 20 70  SegReader));.  p
d3c0: 52 65 61 64 65 72 2d 3e 69 49 64 78 20 3d 20 69  Reader->iIdx = i
d3d0: 41 67 65 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e  Age;.  pReader->
d3e0: 62 4c 6f 6f 6b 75 70 20 3d 20 62 4c 6f 6f 6b 75  bLookup = bLooku
d3f0: 70 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 69 53  p;.  pReader->iS
d400: 74 61 72 74 42 6c 6f 63 6b 20 3d 20 69 53 74 61  tartBlock = iSta
d410: 72 74 4c 65 61 66 3b 0a 20 20 70 52 65 61 64 65  rtLeaf;.  pReade
d420: 72 2d 3e 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b  r->iLeafEndBlock
d430: 20 3d 20 69 45 6e 64 4c 65 61 66 3b 0a 20 20 70   = iEndLeaf;.  p
d440: 52 65 61 64 65 72 2d 3e 69 45 6e 64 42 6c 6f 63  Reader->iEndBloc
d450: 6b 20 3d 20 69 45 6e 64 42 6c 6f 63 6b 3b 0a 0a  k = iEndBlock;..
d460: 20 20 69 66 28 20 6e 45 78 74 72 61 20 29 7b 0a    if( nExtra ){.
d470: 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72      /* The entir
d480: 65 20 73 65 67 6d 65 6e 74 20 69 73 20 73 74 6f  e segment is sto
d490: 72 65 64 20 69 6e 20 74 68 65 20 72 6f 6f 74 20  red in the root 
d4a0: 6e 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 70 52 65  node. */.    pRe
d4b0: 61 64 65 72 2d 3e 61 4e 6f 64 65 20 3d 20 28 63  ader->aNode = (c
d4c0: 68 61 72 20 2a 29 26 70 52 65 61 64 65 72 5b 31  har *)&pReader[1
d4d0: 5d 3b 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e  ];.    pReader->
d4e0: 6e 4e 6f 64 65 20 3d 20 6e 52 6f 6f 74 3b 0a 20  nNode = nRoot;. 
d4f0: 20 20 20 6d 65 6d 63 70 79 28 70 52 65 61 64 65     memcpy(pReade
d500: 72 2d 3e 61 4e 6f 64 65 2c 20 7a 52 6f 6f 74 2c  r->aNode, zRoot,
d510: 20 6e 52 6f 6f 74 29 3b 0a 20 20 20 20 6d 65 6d   nRoot);.    mem
d520: 73 65 74 28 26 70 52 65 61 64 65 72 2d 3e 61 4e  set(&pReader->aN
d530: 6f 64 65 5b 6e 52 6f 6f 74 5d 2c 20 30 2c 20 46  ode[nRoot], 0, F
d540: 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49 4e 47  TS3_NODE_PADDING
d550: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
d560: 70 52 65 61 64 65 72 2d 3e 69 43 75 72 72 65 6e  pReader->iCurren
d570: 74 42 6c 6f 63 6b 20 3d 20 69 53 74 61 72 74 4c  tBlock = iStartL
d580: 65 61 66 2d 31 3b 0a 20 20 7d 0a 20 20 2a 70 70  eaf-1;.  }.  *pp
d590: 52 65 61 64 65 72 20 3d 20 70 52 65 61 64 65 72  Reader = pReader
d5a0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
d5b0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
d5c0: 68 69 73 20 69 73 20 61 20 63 6f 6d 70 61 72 69  his is a compari
d5d0: 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 75 73 65  son function use
d5e0: 64 20 61 73 20 61 20 71 73 6f 72 74 28 29 20 63  d as a qsort() c
d5f0: 61 6c 6c 62 61 63 6b 20 77 68 65 6e 20 73 6f 72  allback when sor
d600: 74 69 6e 67 0a 2a 2a 20 61 6e 20 61 72 72 61 79  ting.** an array
d610: 20 6f 66 20 70 65 6e 64 69 6e 67 20 74 65 72 6d   of pending term
d620: 73 20 62 79 20 74 65 72 6d 2e 20 54 68 69 73 20  s by term. This 
d630: 6f 63 63 75 72 73 20 61 73 20 70 61 72 74 20 6f  occurs as part o
d640: 66 20 66 6c 75 73 68 69 6e 67 0a 2a 2a 20 74 68  f flushing.** th
d650: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
d660: 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20  e pending-terms 
d670: 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 74 68  hash table to th
d680: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  e database..*/.s
d690: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 43 6f  tatic int fts3Co
d6a0: 6d 70 61 72 65 45 6c 65 6d 42 79 54 65 72 6d 28  mpareElemByTerm(
d6b0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 6c 68 73 2c  const void *lhs,
d6c0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 72 68 73   const void *rhs
d6d0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 31 20 3d 20  ){.  char *z1 = 
d6e0: 66 74 73 33 48 61 73 68 4b 65 79 28 2a 28 46 74  fts3HashKey(*(Ft
d6f0: 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29 6c 68  s3HashElem **)lh
d700: 73 29 3b 0a 20 20 63 68 61 72 20 2a 7a 32 20 3d  s);.  char *z2 =
d710: 20 66 74 73 33 48 61 73 68 4b 65 79 28 2a 28 46   fts3HashKey(*(F
d720: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29 72  ts3HashElem **)r
d730: 68 73 29 3b 0a 20 20 69 6e 74 20 6e 31 20 3d 20  hs);.  int n1 = 
d740: 66 74 73 33 48 61 73 68 4b 65 79 73 69 7a 65 28  fts3HashKeysize(
d750: 2a 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a  *(Fts3HashElem *
d760: 2a 29 6c 68 73 29 3b 0a 20 20 69 6e 74 20 6e 32  *)lhs);.  int n2
d770: 20 3d 20 66 74 73 33 48 61 73 68 4b 65 79 73 69   = fts3HashKeysi
d780: 7a 65 28 2a 28 46 74 73 33 48 61 73 68 45 6c 65  ze(*(Fts3HashEle
d790: 6d 20 2a 2a 29 72 68 73 29 3b 0a 0a 20 20 69 6e  m **)rhs);..  in
d7a0: 74 20 6e 20 3d 20 28 6e 31 3c 6e 32 20 3f 20 6e  t n = (n1<n2 ? n
d7b0: 31 20 3a 20 6e 32 29 3b 0a 20 20 69 6e 74 20 63  1 : n2);.  int c
d7c0: 20 3d 20 6d 65 6d 63 6d 70 28 7a 31 2c 20 7a 32   = memcmp(z1, z2
d7d0: 2c 20 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d 30  , n);.  if( c==0
d7e0: 20 29 7b 0a 20 20 20 20 63 20 3d 20 6e 31 20 2d   ){.    c = n1 -
d7f0: 20 6e 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   n2;.  }.  retur
d800: 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n c;.}../*.** Th
d810: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
d820: 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
d830: 61 6e 20 46 74 73 33 53 65 67 52 65 61 64 65 72  an Fts3SegReader
d840: 20 74 68 61 74 20 69 74 65 72 61 74 65 73 20 74   that iterates t
d850: 68 72 6f 75 67 68 0a 2a 2a 20 61 20 73 75 62 73  hrough.** a subs
d860: 65 74 20 6f 66 20 74 68 65 20 74 65 72 6d 73 20  et of the terms 
d870: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 46 74  stored in the Ft
d880: 73 33 54 61 62 6c 65 2e 70 65 6e 64 69 6e 67 54  s3Table.pendingT
d890: 65 72 6d 73 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a  erms array..**.*
d8a0: 2a 20 49 66 20 74 68 65 20 69 73 50 72 65 66 69  * If the isPrefi
d8b0: 78 49 74 65 72 20 70 61 72 61 6d 65 74 65 72 20  xIter parameter 
d8c0: 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  is zero, then th
d8d0: 65 20 72 65 74 75 72 6e 65 64 20 53 65 67 52 65  e returned SegRe
d8e0: 61 64 65 72 20 69 74 65 72 61 74 65 73 0a 2a 2a  ader iterates.**
d8f0: 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 74 65   through each te
d900: 72 6d 20 69 6e 20 74 68 65 20 70 65 6e 64 69 6e  rm in the pendin
d910: 67 2d 74 65 72 6d 73 20 74 61 62 6c 65 2e 20 4f  g-terms table. O
d920: 72 2c 20 69 66 20 69 73 50 72 65 66 69 78 49 74  r, if isPrefixIt
d930: 65 72 20 69 73 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  er is.** non-zer
d940: 6f 2c 20 69 74 20 69 74 65 72 61 74 65 73 20 74  o, it iterates t
d950: 68 72 6f 75 67 68 20 65 61 63 68 20 74 65 72 6d  hrough each term
d960: 20 61 6e 64 20 69 74 73 20 70 72 65 66 69 78 65   and its prefixe
d970: 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s. For example, 
d980: 69 66 0a 2a 2a 20 74 68 65 20 70 65 6e 64 69 6e  if.** the pendin
d990: 67 20 74 65 72 6d 73 20 68 61 73 68 20 74 61 62  g terms hash tab
d9a0: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
d9b0: 74 65 72 6d 73 20 22 73 71 6c 69 74 65 22 2c 20  terms "sqlite", 
d9c0: 22 6d 79 73 71 6c 22 20 61 6e 64 0a 2a 2a 20 22  "mysql" and.** "
d9d0: 66 69 72 65 62 69 72 64 22 2c 20 74 68 65 6e 20  firebird", then 
d9e0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 76 69 73  the iterator vis
d9f0: 69 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  its the followin
da00: 67 20 27 74 65 72 6d 73 27 20 28 69 6e 20 74 68  g 'terms' (in th
da10: 65 20 6f 72 64 65 72 0a 2a 2a 20 73 68 6f 77 6e  e order.** shown
da20: 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 66 20 66 69 20  ):.**.**   f fi 
da30: 66 69 72 20 66 69 72 65 20 66 69 72 65 62 20 66  fir fire fireb f
da40: 69 72 65 62 69 20 66 69 72 65 62 69 72 20 66 69  irebi firebir fi
da50: 72 65 62 69 72 64 0a 2a 2a 20 20 20 6d 20 6d 79  rebird.**   m my
da60: 20 6d 79 73 20 6d 79 73 71 20 6d 79 73 71 6c 0a   mys mysq mysql.
da70: 2a 2a 20 20 20 73 20 73 71 20 73 71 6c 20 73 71  **   s sq sql sq
da80: 6c 69 20 73 71 6c 69 74 20 73 71 6c 69 74 65 0a  li sqlit sqlite.
da90: 2a 2a 0a 2a 2a 20 57 68 65 72 65 61 73 20 69 66  **.** Whereas if
daa0: 20 69 73 50 72 65 66 69 78 49 74 65 72 20 69 73   isPrefixIter is
dab0: 20 7a 65 72 6f 2c 20 74 68 65 20 74 65 72 6d 73   zero, the terms
dac0: 20 76 69 73 69 74 65 64 20 61 72 65 3a 0a 2a 2a   visited are:.**
dad0: 0a 2a 2a 20 20 20 66 69 72 65 62 69 72 64 20 6d  .**   firebird m
dae0: 79 73 71 6c 20 73 71 6c 69 74 65 0a 2a 2f 0a 69  ysql sqlite.*/.i
daf0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 53 65  nt sqlite3Fts3Se
db00: 67 52 65 61 64 65 72 50 65 6e 64 69 6e 67 28 0a  gReaderPending(.
db10: 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db30: 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
db40: 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  le handle */.  i
db50: 6e 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20 20  nt iIndex,      
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
db70: 2a 20 49 6e 64 65 78 20 66 6f 72 20 70 2d 3e 61  * Index for p->a
db80: 49 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74  Index */.  const
db90: 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20   char *zTerm,   
dba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
dbb0: 72 6d 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72  rm to search for
dbc0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c   */.  int nTerm,
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbe0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
dbf0: 20 62 75 66 66 65 72 20 7a 54 65 72 6d 20 2a 2f   buffer zTerm */
dc00: 0a 20 20 69 6e 74 20 62 50 72 65 66 69 78 2c 20  .  int bPrefix, 
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc20: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
dc30: 20 70 72 65 66 69 78 20 69 74 65 72 61 74 6f 72   prefix iterator
dc40: 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 52 65 61   */.  Fts3SegRea
dc50: 64 65 72 20 2a 2a 70 70 52 65 61 64 65 72 20 20  der **ppReader  
dc60: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65        /* OUT: Se
dc70: 67 52 65 61 64 65 72 20 66 6f 72 20 70 65 6e 64  gReader for pend
dc80: 69 6e 67 2d 74 65 72 6d 73 20 2a 2f 0a 29 7b 0a  ing-terms */.){.
dc90: 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
dca0: 2a 70 52 65 61 64 65 72 20 3d 20 30 3b 20 20 20  *pReader = 0;   
dcb0: 20 20 2f 2a 20 46 74 73 33 53 65 67 52 65 61 64    /* Fts3SegRead
dcc0: 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74  er object to ret
dcd0: 75 72 6e 20 2a 2f 0a 20 20 46 74 73 33 48 61 73  urn */.  Fts3Has
dce0: 68 45 6c 65 6d 20 2a 70 45 3b 20 20 20 20 20 20  hElem *pE;      
dcf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
dd00: 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
dd10: 0a 20 20 46 74 73 33 48 61 73 68 45 6c 65 6d 20  .  Fts3HashElem 
dd20: 2a 2a 61 45 6c 65 6d 20 3d 20 30 3b 20 20 20 20  **aElem = 0;    
dd30: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74     /* Array of t
dd40: 65 72 6d 20 68 61 73 68 20 65 6e 74 72 69 65 73  erm hash entries
dd50: 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 69 6e   to scan */.  in
dd60: 74 20 6e 45 6c 65 6d 20 3d 20 30 3b 20 20 20 20  t nElem = 0;    
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dd80: 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61   Size of array a
dd90: 74 20 61 45 6c 65 6d 20 2a 2f 0a 20 20 69 6e 74  t aElem */.  int
dda0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ddc0: 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
ddd0: 20 46 74 73 33 48 61 73 68 20 2a 70 48 61 73 68   Fts3Hash *pHash
dde0: 3b 0a 0a 20 20 70 48 61 73 68 20 3d 20 26 70 2d  ;..  pHash = &p-
ddf0: 3e 61 49 6e 64 65 78 5b 69 49 6e 64 65 78 5d 2e  >aIndex[iIndex].
de00: 68 50 65 6e 64 69 6e 67 3b 0a 20 20 69 66 28 20  hPending;.  if( 
de10: 62 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20 69  bPrefix ){.    i
de20: 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 20 20  nt nAlloc = 0;  
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
de40: 53 69 7a 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65  Size of allocate
de50: 64 20 61 72 72 61 79 20 61 74 20 61 45 6c 65 6d  d array at aElem
de60: 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 70 45 3d   */..    for(pE=
de70: 66 74 73 33 48 61 73 68 46 69 72 73 74 28 70 48  fts3HashFirst(pH
de80: 61 73 68 29 3b 20 70 45 3b 20 70 45 3d 66 74 73  ash); pE; pE=fts
de90: 33 48 61 73 68 4e 65 78 74 28 70 45 29 29 7b 0a  3HashNext(pE)){.
dea0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4b 65 79        char *zKey
deb0: 20 3d 20 28 63 68 61 72 20 2a 29 66 74 73 33 48   = (char *)fts3H
dec0: 61 73 68 4b 65 79 28 70 45 29 3b 0a 20 20 20 20  ashKey(pE);.    
ded0: 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 66 74 73    int nKey = fts
dee0: 33 48 61 73 68 4b 65 79 73 69 7a 65 28 70 45 29  3HashKeysize(pE)
def0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 54 65 72  ;.      if( nTer
df00: 6d 3d 3d 30 20 7c 7c 20 28 6e 4b 65 79 3e 3d 6e  m==0 || (nKey>=n
df10: 54 65 72 6d 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  Term && 0==memcm
df20: 70 28 7a 4b 65 79 2c 20 7a 54 65 72 6d 2c 20 6e  p(zKey, zTerm, n
df30: 54 65 72 6d 29 29 20 29 7b 0a 20 20 20 20 20 20  Term)) ){.      
df40: 20 20 69 66 28 20 6e 45 6c 65 6d 3d 3d 6e 41 6c    if( nElem==nAl
df50: 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  loc ){.         
df60: 20 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a   Fts3HashElem **
df70: 61 45 6c 65 6d 32 3b 0a 20 20 20 20 20 20 20 20  aElem2;.        
df80: 20 20 6e 41 6c 6c 6f 63 20 2b 3d 20 31 36 3b 0a    nAlloc += 16;.
df90: 20 20 20 20 20 20 20 20 20 20 61 45 6c 65 6d 32            aElem2
dfa0: 20 3d 20 28 46 74 73 33 48 61 73 68 45 6c 65 6d   = (Fts3HashElem
dfb0: 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c   **)sqlite3_real
dfc0: 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20 20  loc(.           
dfd0: 20 20 20 61 45 6c 65 6d 2c 20 6e 41 6c 6c 6f 63     aElem, nAlloc
dfe0: 2a 73 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68  *sizeof(Fts3Hash
dff0: 45 6c 65 6d 20 2a 29 0a 20 20 20 20 20 20 20 20  Elem *).        
e000: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69    );.          i
e010: 66 28 20 21 61 45 6c 65 6d 32 20 29 7b 0a 20 20  f( !aElem2 ){.  
e020: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
e030: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
e040: 20 20 20 20 20 20 20 20 20 6e 45 6c 65 6d 20 3d           nElem =
e050: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
e060: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
e070: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 45 6c   }.          aEl
e080: 65 6d 20 3d 20 61 45 6c 65 6d 32 3b 0a 20 20 20  em = aElem2;.   
e090: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
e0a0: 61 45 6c 65 6d 5b 6e 45 6c 65 6d 2b 2b 5d 20 3d  aElem[nElem++] =
e0b0: 20 70 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   pE;.      }.   
e0c0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6d 6f   }..    /* If mo
e0d0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 65 72 6d  re than one term
e0e0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 70 72 65   matches the pre
e0f0: 66 69 78 2c 20 73 6f 72 74 20 74 68 65 20 46 74  fix, sort the Ft
e100: 73 33 48 61 73 68 45 6c 65 6d 0a 20 20 20 20 2a  s3HashElem.    *
e110: 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 65 72  * objects in ter
e120: 6d 20 6f 72 64 65 72 20 75 73 69 6e 67 20 71 73  m order using qs
e130: 6f 72 74 28 29 2e 20 54 68 69 73 20 75 73 65 73  ort(). This uses
e140: 20 74 68 65 20 73 61 6d 65 20 63 6f 6d 70 61 72   the same compar
e150: 69 73 6f 6e 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ison.    ** call
e160: 62 61 63 6b 20 61 73 20 69 73 20 75 73 65 64 20  back as is used 
e170: 77 68 65 6e 20 66 6c 75 73 68 69 6e 67 20 74 65  when flushing te
e180: 72 6d 73 20 74 6f 20 64 69 73 6b 2e 0a 20 20 20  rms to disk..   
e190: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 6c 65   */.    if( nEle
e1a0: 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20 71 73 6f  m>1 ){.      qso
e1b0: 72 74 28 61 45 6c 65 6d 2c 20 6e 45 6c 65 6d 2c  rt(aElem, nElem,
e1c0: 20 73 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68   sizeof(Fts3Hash
e1d0: 45 6c 65 6d 20 2a 29 2c 20 66 74 73 33 43 6f 6d  Elem *), fts3Com
e1e0: 70 61 72 65 45 6c 65 6d 42 79 54 65 72 6d 29 3b  pareElemByTerm);
e1f0: 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b  .    }..  }else{
e200: 0a 20 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72  .    /* The quer
e210: 79 20 69 73 20 61 20 73 69 6d 70 6c 65 20 74 65  y is a simple te
e220: 72 6d 20 6c 6f 6f 6b 75 70 20 74 68 61 74 20 6d  rm lookup that m
e230: 61 74 63 68 65 73 20 61 74 20 6d 6f 73 74 20 6f  atches at most o
e240: 6e 65 20 74 65 72 6d 20 69 6e 0a 20 20 20 20 2a  ne term in.    *
e250: 2a 20 74 68 65 20 69 6e 64 65 78 2e 20 41 6c 6c  * the index. All
e260: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
e270: 64 20 69 73 20 61 20 73 74 72 61 69 67 68 74 20  d is a straight 
e280: 68 61 73 68 2d 6c 6f 6f 6b 75 70 2e 20 0a 20 20  hash-lookup. .  
e290: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 65 63 61    **.    ** Beca
e2a0: 75 73 65 20 74 68 65 20 73 74 61 63 6b 20 61 64  use the stack ad
e2b0: 64 72 65 73 73 20 6f 66 20 70 45 20 6d 61 79 20  dress of pE may 
e2c0: 62 65 20 61 63 63 65 73 73 65 64 20 76 69 61 20  be accessed via 
e2d0: 74 68 65 20 61 45 6c 65 6d 20 70 6f 69 6e 74 65  the aElem pointe
e2e0: 72 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2c 20  r.    ** below, 
e2f0: 74 68 65 20 22 46 74 73 33 48 61 73 68 45 6c 65  the "Fts3HashEle
e300: 6d 20 2a 70 45 22 20 6d 75 73 74 20 62 65 20 64  m *pE" must be d
e310: 65 63 6c 61 72 65 64 20 73 6f 20 74 68 61 74 20  eclared so that 
e320: 69 74 20 69 73 20 76 61 6c 69 64 0a 20 20 20 20  it is valid.    
e330: 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 65  ** within this e
e340: 6e 74 69 72 65 20 66 75 6e 63 74 69 6f 6e 2c 20  ntire function, 
e350: 6e 6f 74 20 6a 75 73 74 20 74 68 69 73 20 22 65  not just this "e
e360: 6c 73 65 7b 2e 2e 2e 7d 22 20 62 6c 6f 63 6b 2e  lse{...}" block.
e370: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 45 20 3d  .    */.    pE =
e380: 20 66 74 73 33 48 61 73 68 46 69 6e 64 45 6c 65   fts3HashFindEle
e390: 6d 28 70 48 61 73 68 2c 20 7a 54 65 72 6d 2c 20  m(pHash, zTerm, 
e3a0: 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20  nTerm);.    if( 
e3b0: 70 45 20 29 7b 0a 20 20 20 20 20 20 61 45 6c 65  pE ){.      aEle
e3c0: 6d 20 3d 20 26 70 45 3b 0a 20 20 20 20 20 20 6e  m = &pE;.      n
e3d0: 45 6c 65 6d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Elem = 1;.    }.
e3e0: 20 20 7d 0a 0a 20 20 69 66 28 20 6e 45 6c 65 6d    }..  if( nElem
e3f0: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42  >0 ){.    int nB
e400: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73  yte = sizeof(Fts
e410: 33 53 65 67 52 65 61 64 65 72 29 20 2b 20 28 6e  3SegReader) + (n
e420: 45 6c 65 6d 2b 31 29 2a 73 69 7a 65 6f 66 28 46  Elem+1)*sizeof(F
e430: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 29 3b 0a  ts3HashElem *);.
e440: 20 20 20 20 70 52 65 61 64 65 72 20 3d 20 28 46      pReader = (F
e450: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 29 73  ts3SegReader *)s
e460: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42  qlite3_malloc(nB
e470: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  yte);.    if( !p
e480: 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20  Reader ){.      
e490: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
e4a0: 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
e4b0: 20 20 20 20 6d 65 6d 73 65 74 28 70 52 65 61 64      memset(pRead
e4c0: 65 72 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20  er, 0, nByte);. 
e4d0: 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 69 49       pReader->iI
e4e0: 64 78 20 3d 20 30 78 37 46 46 46 46 46 46 46 3b  dx = 0x7FFFFFFF;
e4f0: 0a 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e  .      pReader->
e500: 70 70 4e 65 78 74 45 6c 65 6d 20 3d 20 28 46 74  ppNextElem = (Ft
e510: 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29 26 70  s3HashElem **)&p
e520: 52 65 61 64 65 72 5b 31 5d 3b 0a 20 20 20 20 20  Reader[1];.     
e530: 20 6d 65 6d 63 70 79 28 70 52 65 61 64 65 72 2d   memcpy(pReader-
e540: 3e 70 70 4e 65 78 74 45 6c 65 6d 2c 20 61 45 6c  >ppNextElem, aEl
e550: 65 6d 2c 20 6e 45 6c 65 6d 2a 73 69 7a 65 6f 66  em, nElem*sizeof
e560: 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 29  (Fts3HashElem *)
e570: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
e580: 69 66 28 20 62 50 72 65 66 69 78 20 29 7b 0a 20  if( bPrefix ){. 
e590: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
e5a0: 61 45 6c 65 6d 29 3b 0a 20 20 7d 0a 20 20 2a 70  aElem);.  }.  *p
e5b0: 70 52 65 61 64 65 72 20 3d 20 70 52 65 61 64 65  pReader = pReade
e5c0: 72 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  r;.  return rc;.
e5d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
e5e0: 20 74 68 65 20 65 6e 74 72 69 65 73 20 70 6f 69   the entries poi
e5f0: 6e 74 65 64 20 74 6f 20 62 79 20 74 77 6f 20 46  nted to by two F
e600: 74 73 33 53 65 67 52 65 61 64 65 72 20 73 74 72  ts3SegReader str
e610: 75 63 74 75 72 65 73 2e 20 0a 2a 2a 20 43 6f 6d  uctures. .** Com
e620: 70 61 72 69 73 6f 6e 20 69 73 20 61 73 20 66 6f  parison is as fo
e630: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  llows:.**.**   1
e640: 29 20 45 4f 46 20 69 73 20 67 72 65 61 74 65 72  ) EOF is greater
e650: 20 74 68 61 6e 20 6e 6f 74 20 45 4f 46 2e 0a 2a   than not EOF..*
e660: 2a 0a 2a 2a 20 20 20 32 29 20 54 68 65 20 63 75  *.**   2) The cu
e670: 72 72 65 6e 74 20 74 65 72 6d 73 20 28 69 66 20  rrent terms (if 
e680: 61 6e 79 29 20 61 72 65 20 63 6f 6d 70 61 72 65  any) are compare
e690: 64 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29  d using memcmp()
e6a0: 2e 20 49 66 20 6f 6e 65 0a 2a 2a 20 20 20 20 20  . If one.**     
e6b0: 20 74 65 72 6d 20 69 73 20 61 20 70 72 65 66 69   term is a prefi
e6c0: 78 20 6f 66 20 61 6e 6f 74 68 65 72 2c 20 74 68  x of another, th
e6d0: 65 20 6c 6f 6e 67 65 72 20 74 65 72 6d 20 69 73  e longer term is
e6e0: 20 63 6f 6e 73 69 64 65 72 65 64 20 74 68 65 0a   considered the.
e6f0: 2a 2a 20 20 20 20 20 20 6c 61 72 67 65 72 2e 0a  **      larger..
e700: 2a 2a 0a 2a 2a 20 20 20 33 29 20 42 79 20 73 65  **.**   3) By se
e710: 67 6d 65 6e 74 20 61 67 65 2e 20 41 6e 20 6f 6c  gment age. An ol
e720: 64 65 72 20 73 65 67 6d 65 6e 74 20 69 73 20 63  der segment is c
e730: 6f 6e 73 69 64 65 72 65 64 20 6c 61 72 67 65 72  onsidered larger
e740: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e750: 66 74 73 33 53 65 67 52 65 61 64 65 72 43 6d 70  fts3SegReaderCmp
e760: 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a  (Fts3SegReader *
e770: 70 4c 68 73 2c 20 46 74 73 33 53 65 67 52 65 61  pLhs, Fts3SegRea
e780: 64 65 72 20 2a 70 52 68 73 29 7b 0a 20 20 69 6e  der *pRhs){.  in
e790: 74 20 72 63 3b 0a 20 20 69 66 28 20 70 4c 68 73  t rc;.  if( pLhs
e7a0: 2d 3e 61 4e 6f 64 65 20 26 26 20 70 52 68 73 2d  ->aNode && pRhs-
e7b0: 3e 61 4e 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  >aNode ){.    in
e7c0: 74 20 72 63 32 20 3d 20 70 4c 68 73 2d 3e 6e 54  t rc2 = pLhs->nT
e7d0: 65 72 6d 20 2d 20 70 52 68 73 2d 3e 6e 54 65 72  erm - pRhs->nTer
e7e0: 6d 3b 0a 20 20 20 20 69 66 28 20 72 63 32 3c 30  m;.    if( rc2<0
e7f0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   ){.      rc = m
e800: 65 6d 63 6d 70 28 70 4c 68 73 2d 3e 7a 54 65 72  emcmp(pLhs->zTer
e810: 6d 2c 20 70 52 68 73 2d 3e 7a 54 65 72 6d 2c 20  m, pRhs->zTerm, 
e820: 70 4c 68 73 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20  pLhs->nTerm);.  
e830: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
e840: 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 68 73 2d  c = memcmp(pLhs-
e850: 3e 7a 54 65 72 6d 2c 20 70 52 68 73 2d 3e 7a 54  >zTerm, pRhs->zT
e860: 65 72 6d 2c 20 70 52 68 73 2d 3e 6e 54 65 72 6d  erm, pRhs->nTerm
e870: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
e880: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc==0 ){.      
e890: 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
e8a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
e8b0: 3d 20 28 70 4c 68 73 2d 3e 61 4e 6f 64 65 3d 3d  = (pLhs->aNode==
e8c0: 30 29 20 2d 20 28 70 52 68 73 2d 3e 61 4e 6f 64  0) - (pRhs->aNod
e8d0: 65 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  e==0);.  }.  if(
e8e0: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63   rc==0 ){.    rc
e8f0: 20 3d 20 70 52 68 73 2d 3e 69 49 64 78 20 2d 20   = pRhs->iIdx - 
e900: 70 4c 68 73 2d 3e 69 49 64 78 3b 0a 20 20 7d 0a  pLhs->iIdx;.  }.
e910: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20    assert( rc!=0 
e920: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
e930: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 64 69 66 66 65  }../*.** A diffe
e940: 72 65 6e 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20  rent comparison 
e950: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 53 65 67  function for Seg
e960: 52 65 61 64 65 72 20 73 74 72 75 63 74 75 72 65  Reader structure
e970: 73 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 76 65  s. In this.** ve
e980: 72 73 69 6f 6e 2c 20 69 74 20 69 73 20 61 73 73  rsion, it is ass
e990: 75 6d 65 64 20 74 68 61 74 20 65 61 63 68 20 53  umed that each S
e9a0: 65 67 52 65 61 64 65 72 20 70 6f 69 6e 74 73 20  egReader points 
e9b0: 74 6f 20 61 6e 20 65 6e 74 72 79 20 69 6e 0a 2a  to an entry in.*
e9c0: 2a 20 61 20 64 6f 63 6c 69 73 74 20 66 6f 72 20  * a doclist for 
e9d0: 69 64 65 6e 74 69 63 61 6c 20 74 65 72 6d 73 2e  identical terms.
e9e0: 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d   Comparison is m
e9f0: 61 64 65 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ade as follows:.
ea00: 2a 2a 0a 2a 2a 20 20 20 31 29 20 45 4f 46 20 28  **.**   1) EOF (
ea10: 65 6e 64 20 6f 66 20 64 6f 63 6c 69 73 74 20 69  end of doclist i
ea20: 6e 20 74 68 69 73 20 63 61 73 65 29 20 69 73 20  n this case) is 
ea30: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e 6f 74  greater than not
ea40: 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29   EOF..**.**   2)
ea50: 20 42 79 20 63 75 72 72 65 6e 74 20 64 6f 63 69   By current doci
ea60: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 29 20 42 79  d..**.**   3) By
ea70: 20 73 65 67 6d 65 6e 74 20 61 67 65 2e 20 41 6e   segment age. An
ea80: 20 6f 6c 64 65 72 20 73 65 67 6d 65 6e 74 20 69   older segment i
ea90: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 6c 61 72  s considered lar
eaa0: 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ger..*/.static i
eab0: 6e 74 20 66 74 73 33 53 65 67 52 65 61 64 65 72  nt fts3SegReader
eac0: 44 6f 63 6c 69 73 74 43 6d 70 28 46 74 73 33 53  DoclistCmp(Fts3S
ead0: 65 67 52 65 61 64 65 72 20 2a 70 4c 68 73 2c 20  egReader *pLhs, 
eae0: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
eaf0: 52 68 73 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Rhs){.  int rc =
eb00: 20 28 70 4c 68 73 2d 3e 70 4f 66 66 73 65 74 4c   (pLhs->pOffsetL
eb10: 69 73 74 3d 3d 30 29 2d 28 70 52 68 73 2d 3e 70  ist==0)-(pRhs->p
eb20: 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30 29 3b 0a  OffsetList==0);.
eb30: 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
eb40: 20 20 20 69 66 28 20 70 4c 68 73 2d 3e 69 44 6f     if( pLhs->iDo
eb50: 63 69 64 3d 3d 70 52 68 73 2d 3e 69 44 6f 63 69  cid==pRhs->iDoci
eb60: 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
eb70: 70 52 68 73 2d 3e 69 49 64 78 20 2d 20 70 4c 68  pRhs->iIdx - pLh
eb80: 73 2d 3e 69 49 64 78 3b 0a 20 20 20 20 7d 65 6c  s->iIdx;.    }el
eb90: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28  se{.      rc = (
eba0: 70 4c 68 73 2d 3e 69 44 6f 63 69 64 20 3e 20 70  pLhs->iDocid > p
ebb0: 52 68 73 2d 3e 69 44 6f 63 69 64 29 20 3f 20 31  Rhs->iDocid) ? 1
ebc0: 20 3a 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d   : -1;.    }.  }
ebd0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 68 73 2d  .  assert( pLhs-
ebe0: 3e 61 4e 6f 64 65 20 26 26 20 70 52 68 73 2d 3e  >aNode && pRhs->
ebf0: 61 4e 6f 64 65 20 29 3b 0a 20 20 72 65 74 75 72  aNode );.  retur
ec00: 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69  n rc;.}.static i
ec10: 6e 74 20 66 74 73 33 53 65 67 52 65 61 64 65 72  nt fts3SegReader
ec20: 44 6f 63 6c 69 73 74 43 6d 70 52 65 76 28 46 74  DoclistCmpRev(Ft
ec30: 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 4c 68  s3SegReader *pLh
ec40: 73 2c 20 46 74 73 33 53 65 67 52 65 61 64 65 72  s, Fts3SegReader
ec50: 20 2a 70 52 68 73 29 7b 0a 20 20 69 6e 74 20 72   *pRhs){.  int r
ec60: 63 20 3d 20 28 70 4c 68 73 2d 3e 70 4f 66 66 73  c = (pLhs->pOffs
ec70: 65 74 4c 69 73 74 3d 3d 30 29 2d 28 70 52 68 73  etList==0)-(pRhs
ec80: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30  ->pOffsetList==0
ec90: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  );.  if( rc==0 )
eca0: 7b 0a 20 20 20 20 69 66 28 20 70 4c 68 73 2d 3e  {.    if( pLhs->
ecb0: 69 44 6f 63 69 64 3d 3d 70 52 68 73 2d 3e 69 44  iDocid==pRhs->iD
ecc0: 6f 63 69 64 20 29 7b 0a 20 20 20 20 20 20 72 63  ocid ){.      rc
ecd0: 20 3d 20 70 52 68 73 2d 3e 69 49 64 78 20 2d 20   = pRhs->iIdx - 
ece0: 70 4c 68 73 2d 3e 69 49 64 78 3b 0a 20 20 20 20  pLhs->iIdx;.    
ecf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
ed00: 3d 20 28 70 4c 68 73 2d 3e 69 44 6f 63 69 64 20  = (pLhs->iDocid 
ed10: 3c 20 70 52 68 73 2d 3e 69 44 6f 63 69 64 29 20  < pRhs->iDocid) 
ed20: 3f 20 31 20 3a 20 2d 31 3b 0a 20 20 20 20 7d 0a  ? 1 : -1;.    }.
ed30: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c    }.  assert( pL
ed40: 68 73 2d 3e 61 4e 6f 64 65 20 26 26 20 70 52 68  hs->aNode && pRh
ed50: 73 2d 3e 61 4e 6f 64 65 20 29 3b 0a 20 20 72 65  s->aNode );.  re
ed60: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
ed70: 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 65  * Compare the te
ed80: 72 6d 20 74 68 61 74 20 74 68 65 20 46 74 73 33  rm that the Fts3
ed90: 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74  SegReader object
eda0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
edb0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  irst argument.**
edc0: 20 70 6f 69 6e 74 73 20 74 6f 20 77 69 74 68 20   points to with 
edd0: 74 68 65 20 74 65 72 6d 20 73 70 65 63 69 66 69  the term specifi
ede0: 65 64 20 62 79 20 61 72 67 75 6d 65 6e 74 73 20  ed by arguments 
edf0: 7a 54 65 72 6d 20 61 6e 64 20 6e 54 65 72 6d 2e  zTerm and nTerm.
ee00: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
ee10: 53 65 67 20 69 74 65 72 61 74 6f 72 20 69 73 20  Seg iterator is 
ee20: 61 6c 72 65 61 64 79 20 61 74 20 45 4f 46 2c 20  already at EOF, 
ee30: 72 65 74 75 72 6e 20 30 2e 20 4f 74 68 65 72 77  return 0. Otherw
ee40: 69 73 65 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 2d  ise, return.** -
ee50: 76 65 20 69 66 20 74 68 65 20 70 53 65 67 20 74  ve if the pSeg t
ee60: 65 72 6d 20 69 73 20 6c 65 73 73 20 74 68 61 6e  erm is less than
ee70: 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2c 20 30 20   zTerm/nTerm, 0 
ee80: 69 66 20 74 68 65 20 74 77 6f 20 74 65 72 6d 73  if the two terms
ee90: 20 61 72 65 0a 2a 2a 20 65 71 75 61 6c 2c 20 6f   are.** equal, o
eea0: 72 20 2b 76 65 20 69 66 20 74 68 65 20 70 53 65  r +ve if the pSe
eeb0: 67 20 74 65 72 6d 20 69 73 20 67 72 65 61 74 65  g term is greate
eec0: 72 20 74 68 61 6e 20 7a 54 65 72 6d 2f 6e 54 65  r than zTerm/nTe
eed0: 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rm..*/.static in
eee0: 74 20 66 74 73 33 53 65 67 52 65 61 64 65 72 54  t fts3SegReaderT
eef0: 65 72 6d 43 6d 70 28 0a 20 20 46 74 73 33 53 65  ermCmp(.  Fts3Se
ef00: 67 52 65 61 64 65 72 20 2a 70 53 65 67 2c 20 20  gReader *pSeg,  
ef10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67            /* Seg
ef20: 6d 65 6e 74 20 72 65 61 64 65 72 20 6f 62 6a 65  ment reader obje
ef30: 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
ef40: 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20  ar *zTerm,      
ef50: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20          /* Term 
ef60: 74 6f 20 63 6f 6d 70 61 72 65 20 74 6f 20 2a 2f  to compare to */
ef70: 0a 20 20 69 6e 74 20 6e 54 65 72 6d 20 20 20 20  .  int nTerm    
ef80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef90: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65     /* Size of te
efa0: 72 6d 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65  rm zTerm in byte
efb0: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 65  s */.){.  int re
efc0: 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53 65  s = 0;.  if( pSe
efd0: 67 2d 3e 61 4e 6f 64 65 20 29 7b 0a 20 20 20 20  g->aNode ){.    
efe0: 69 66 28 20 70 53 65 67 2d 3e 6e 54 65 72 6d 3e  if( pSeg->nTerm>
eff0: 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 72  nTerm ){.      r
f000: 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 53 65 67  es = memcmp(pSeg
f010: 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20  ->zTerm, zTerm, 
f020: 6e 54 65 72 6d 29 3b 0a 20 20 20 20 7d 65 6c 73  nTerm);.    }els
f030: 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6d  e{.      res = m
f040: 65 6d 63 6d 70 28 70 53 65 67 2d 3e 7a 54 65 72  emcmp(pSeg->zTer
f050: 6d 2c 20 7a 54 65 72 6d 2c 20 70 53 65 67 2d 3e  m, zTerm, pSeg->
f060: 6e 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  nTerm);.    }.  
f070: 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
f080: 20 20 20 20 20 20 72 65 73 20 3d 20 70 53 65 67        res = pSeg
f090: 2d 3e 6e 54 65 72 6d 2d 6e 54 65 72 6d 3b 0a 20  ->nTerm-nTerm;. 
f0a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
f0b0: 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
f0c0: 41 72 67 75 6d 65 6e 74 20 61 70 53 65 67 6d 65  Argument apSegme
f0d0: 6e 74 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f  nt is an array o
f0e0: 66 20 6e 53 65 67 6d 65 6e 74 20 65 6c 65 6d 65  f nSegment eleme
f0f0: 6e 74 73 2e 20 49 74 20 69 73 20 6b 6e 6f 77 6e  nts. It is known
f100: 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 66 69 6e   that.** the fin
f110: 61 6c 20 28 6e 53 65 67 6d 65 6e 74 2d 6e 53 75  al (nSegment-nSu
f120: 73 70 65 63 74 29 20 6d 65 6d 62 65 72 73 20 61  spect) members a
f130: 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 73 6f  re already in so
f140: 72 74 65 64 20 6f 72 64 65 72 0a 2a 2a 20 28 61  rted order.** (a
f150: 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
f160: 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
f170: 69 6f 6e 20 70 72 6f 76 69 64 65 64 29 2e 20 54  ion provided). T
f180: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 75  his function shu
f190: 66 66 6c 65 73 0a 2a 2a 20 74 68 65 20 61 72 72  ffles.** the arr
f1a0: 61 79 20 61 72 6f 75 6e 64 20 75 6e 74 69 6c 20  ay around until 
f1b0: 61 6c 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20  all entries are 
f1c0: 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2e  in sorted order.
f1d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f1e0: 66 74 73 33 53 65 67 52 65 61 64 65 72 53 6f 72  fts3SegReaderSor
f1f0: 74 28 0a 20 20 46 74 73 33 53 65 67 52 65 61 64  t(.  Fts3SegRead
f200: 65 72 20 2a 2a 61 70 53 65 67 6d 65 6e 74 2c 20  er **apSegment, 
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f220: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 74 6f 20      /* Array to 
f230: 73 6f 72 74 20 65 6e 74 72 69 65 73 20 6f 66 20  sort entries of 
f240: 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e  */.  int nSegmen
f250: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f270: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
f280: 70 53 65 67 6d 65 6e 74 20 61 72 72 61 79 20 2a  pSegment array *
f290: 2f 0a 20 20 69 6e 74 20 6e 53 75 73 70 65 63 74  /.  int nSuspect
f2a0: 2c 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 20                  
f2c0: 20 20 20 2f 2a 20 55 6e 73 6f 72 74 65 64 20 65     /* Unsorted e
f2d0: 6e 74 72 79 20 63 6f 75 6e 74 20 2a 2f 0a 20 20  ntry count */.  
f2e0: 69 6e 74 20 28 2a 78 43 6d 70 29 28 46 74 73 33  int (*xCmp)(Fts3
f2f0: 53 65 67 52 65 61 64 65 72 20 2a 2c 20 46 74 73  SegReader *, Fts
f300: 33 53 65 67 52 65 61 64 65 72 20 2a 29 20 20 2f  3SegReader *)  /
f310: 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  * Comparison fun
f320: 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ction */.){.  in
f330: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
f340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f350: 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
f360: 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
f370: 20 6e 53 75 73 70 65 63 74 3c 3d 6e 53 65 67 6d   nSuspect<=nSegm
f380: 65 6e 74 20 29 3b 0a 0a 20 20 69 66 28 20 6e 53  ent );..  if( nS
f390: 75 73 70 65 63 74 3d 3d 6e 53 65 67 6d 65 6e 74  uspect==nSegment
f3a0: 20 29 20 6e 53 75 73 70 65 63 74 2d 2d 3b 0a 20   ) nSuspect--;. 
f3b0: 20 66 6f 72 28 69 3d 6e 53 75 73 70 65 63 74 2d   for(i=nSuspect-
f3c0: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
f3d0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 66 6f     int j;.    fo
f3e0: 72 28 6a 3d 69 3b 20 6a 3c 28 6e 53 65 67 6d 65  r(j=i; j<(nSegme
f3f0: 6e 74 2d 31 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nt-1); j++){.   
f400: 20 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72     Fts3SegReader
f410: 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20 20 69 66   *pTmp;.      if
f420: 28 20 78 43 6d 70 28 61 70 53 65 67 6d 65 6e 74  ( xCmp(apSegment
f430: 5b 6a 5d 2c 20 61 70 53 65 67 6d 65 6e 74 5b 6a  [j], apSegment[j
f440: 2b 31 5d 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a  +1])<0 ) break;.
f450: 20 20 20 20 20 20 70 54 6d 70 20 3d 20 61 70 53        pTmp = apS
f460: 65 67 6d 65 6e 74 5b 6a 2b 31 5d 3b 0a 20 20 20  egment[j+1];.   
f470: 20 20 20 61 70 53 65 67 6d 65 6e 74 5b 6a 2b 31     apSegment[j+1
f480: 5d 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d  ] = apSegment[j]
f490: 3b 0a 20 20 20 20 20 20 61 70 53 65 67 6d 65 6e  ;.      apSegmen
f4a0: 74 5b 6a 5d 20 3d 20 70 54 6d 70 3b 0a 20 20 20  t[j] = pTmp;.   
f4b0: 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20   }.  }..#ifndef 
f4c0: 4e 44 45 42 55 47 0a 20 20 2f 2a 20 43 68 65 63  NDEBUG.  /* Chec
f4d0: 6b 20 74 68 61 74 20 74 68 65 20 6c 69 73 74 20  k that the list 
f4e0: 72 65 61 6c 6c 79 20 69 73 20 73 6f 72 74 65 64  really is sorted
f4f0: 20 6e 6f 77 2e 20 2a 2f 0a 20 20 66 6f 72 28 69   now. */.  for(i
f500: 3d 30 3b 20 69 3c 28 6e 53 75 73 70 65 63 74 2d  =0; i<(nSuspect-
f510: 31 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  1); i++){.    as
f520: 73 65 72 74 28 20 78 43 6d 70 28 61 70 53 65 67  sert( xCmp(apSeg
f530: 6d 65 6e 74 5b 69 5d 2c 20 61 70 53 65 67 6d 65  ment[i], apSegme
f540: 6e 74 5b 69 2b 31 5d 29 3c 30 20 29 3b 0a 20 20  nt[i+1])<0 );.  
f550: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a  }.#endif.}../* .
f560: 2a 2a 20 49 6e 73 65 72 74 20 61 20 72 65 63 6f  ** Insert a reco
f570: 72 64 20 69 6e 74 6f 20 74 68 65 20 25 5f 73 65  rd into the %_se
f580: 67 6d 65 6e 74 73 20 74 61 62 6c 65 2e 0a 2a 2f  gments table..*/
f590: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
f5a0: 57 72 69 74 65 53 65 67 6d 65 6e 74 28 0a 20 20  WriteSegment(.  
f5b0: 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
f5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5d0: 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  /* Virtual table
f5e0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c   handle */.  sql
f5f0: 69 74 65 33 5f 69 6e 74 36 34 20 69 42 6c 6f 63  ite3_int64 iBloc
f600: 6b 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  k,           /* 
f610: 42 6c 6f 63 6b 20 69 64 20 66 6f 72 20 6e 65 77  Block id for new
f620: 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 63 68 61 72   block */.  char
f630: 20 2a 7a 2c 20 20 20 20 20 20 20 20 20 20 20 20   *z,            
f640: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
f650: 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
f660: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 62 6c 6f 63   containing bloc
f670: 6b 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  k data */.  int 
f680: 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
f690: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
f6a0: 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 7a 20  ize of buffer z 
f6b0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20  in bytes */.){. 
f6c0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
f6d0: 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Stmt;.  int rc =
f6e0: 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
f6f0: 53 51 4c 5f 49 4e 53 45 52 54 5f 53 45 47 4d 45  SQL_INSERT_SEGME
f700: 4e 54 53 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  NTS, &pStmt, 0);
f710: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
f720: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
f730: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
f740: 53 74 6d 74 2c 20 31 2c 20 69 42 6c 6f 63 6b 29  Stmt, 1, iBlock)
f750: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
f760: 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 32  nd_blob(pStmt, 2
f770: 2c 20 7a 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53  , z, n, SQLITE_S
f780: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
f790: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
f7a0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f7b0: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
f7c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
f7d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  .}../*.** Find t
f7e0: 68 65 20 6c 61 72 67 65 73 74 20 72 65 6c 61 74  he largest relat
f7f0: 69 76 65 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72  ive level number
f800: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 49   in the table. I
f810: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
f820: 74 0a 2a 2a 20 2a 70 6e 4d 61 78 20 74 6f 20 74  t.** *pnMax to t
f830: 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20 72 65  his value and re
f840: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
f850: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e  Otherwise, if an
f860: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a   error occurs,.*
f870: 2a 20 73 65 74 20 2a 70 6e 4d 61 78 20 74 6f 20  * set *pnMax to 
f880: 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  zero and return 
f890: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
f8a0: 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  code..*/.int sql
f8b0: 69 74 65 33 46 74 73 33 4d 61 78 4c 65 76 65 6c  ite3Fts3MaxLevel
f8c0: 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 69  (Fts3Table *p, i
f8d0: 6e 74 20 2a 70 6e 4d 61 78 29 7b 0a 20 20 69 6e  nt *pnMax){.  in
f8e0: 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d 78 4c 65  t rc;.  int mxLe
f8f0: 76 65 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  vel = 0;.  sqlit
f900: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
f910: 20 30 3b 0a 0a 20 20 72 63 20 3d 20 66 74 73 33   0;..  rc = fts3
f920: 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53  SqlStmt(p, SQL_S
f930: 45 4c 45 43 54 5f 4d 58 4c 45 56 45 4c 2c 20 26  ELECT_MXLEVEL, &
f940: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
f950: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f960: 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  {.    if( SQLITE
f970: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
f980: 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
f990: 20 20 20 6d 78 4c 65 76 65 6c 20 3d 20 73 71 6c     mxLevel = sql
f9a0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
f9b0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d  pStmt, 0);.    }
f9c0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f9d0: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
f9e0: 20 20 7d 0a 20 20 2a 70 6e 4d 61 78 20 3d 20 6d    }.  *pnMax = m
f9f0: 78 4c 65 76 65 6c 3b 0a 20 20 72 65 74 75 72 6e  xLevel;.  return
fa00: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 49   rc;.}../* .** I
fa10: 6e 73 65 72 74 20 61 20 72 65 63 6f 72 64 20 69  nsert a record i
fa20: 6e 74 6f 20 74 68 65 20 25 5f 73 65 67 64 69 72  nto the %_segdir
fa30: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
fa40: 63 20 69 6e 74 20 66 74 73 33 57 72 69 74 65 53  c int fts3WriteS
fa50: 65 67 64 69 72 28 0a 20 20 46 74 73 33 54 61 62  egdir(.  Fts3Tab
fa60: 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
fa70: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74           /* Virt
fa80: 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  ual table handle
fa90: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
faa0: 74 36 34 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  t64 iLevel,     
fab0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66        /* Value f
fac0: 6f 72 20 22 6c 65 76 65 6c 22 20 66 69 65 6c 64  or "level" field
fad0: 20 28 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c   (absolute level
fae0: 29 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c  ) */.  int iIdx,
faf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb00: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
fb10: 66 6f 72 20 22 69 64 78 22 20 66 69 65 6c 64 20  for "idx" field 
fb20: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
fb30: 36 34 20 69 53 74 61 72 74 42 6c 6f 63 6b 2c 20  64 iStartBlock, 
fb40: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
fb50: 72 20 22 73 74 61 72 74 5f 62 6c 6f 63 6b 22 20  r "start_block" 
fb60: 66 69 65 6c 64 20 2a 2f 0a 20 20 73 71 6c 69 74  field */.  sqlit
fb70: 65 33 5f 69 6e 74 36 34 20 69 4c 65 61 66 45 6e  e3_int64 iLeafEn
fb80: 64 42 6c 6f 63 6b 2c 20 20 20 20 2f 2a 20 56 61  dBlock,    /* Va
fb90: 6c 75 65 20 66 6f 72 20 22 6c 65 61 76 65 73 5f  lue for "leaves_
fba0: 65 6e 64 5f 62 6c 6f 63 6b 22 20 66 69 65 6c 64  end_block" field
fbb0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
fbc0: 74 36 34 20 69 45 6e 64 42 6c 6f 63 6b 2c 20 20  t64 iEndBlock,  
fbd0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66        /* Value f
fbe0: 6f 72 20 22 65 6e 64 5f 62 6c 6f 63 6b 22 20 66  or "end_block" f
fbf0: 69 65 6c 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ield */.  char *
fc00: 7a 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20  zRoot,          
fc10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f            /* Blo
fc20: 62 20 76 61 6c 75 65 20 66 6f 72 20 22 72 6f 6f  b value for "roo
fc30: 74 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e  t" field */.  in
fc40: 74 20 6e 52 6f 6f 74 20 20 20 20 20 20 20 20 20  t nRoot         
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fc60: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
fc70: 20 69 6e 20 62 75 66 66 65 72 20 7a 52 6f 6f 74   in buffer zRoot
fc80: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
fc90: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
fca0: 69 6e 74 20 72 63 20 3d 20 66 74 73 33 53 71 6c  int rc = fts3Sql
fcb0: 53 74 6d 74 28 70 2c 20 53 51 4c 5f 49 4e 53 45  Stmt(p, SQL_INSE
fcc0: 52 54 5f 53 45 47 44 49 52 2c 20 26 70 53 74 6d  RT_SEGDIR, &pStm
fcd0: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  t, 0);.  if( rc=
fce0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
fcf0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
fd00: 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 69  nt64(pStmt, 1, i
fd10: 4c 65 76 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69  Level);.    sqli
fd20: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74  te3_bind_int(pSt
fd30: 6d 74 2c 20 32 2c 20 69 49 64 78 29 3b 0a 20 20  mt, 2, iIdx);.  
fd40: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
fd50: 6e 74 36 34 28 70 53 74 6d 74 2c 20 33 2c 20 69  nt64(pStmt, 3, i
fd60: 53 74 61 72 74 42 6c 6f 63 6b 29 3b 0a 20 20 20  StartBlock);.   
fd70: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
fd80: 74 36 34 28 70 53 74 6d 74 2c 20 34 2c 20 69 4c  t64(pStmt, 4, iL
fd90: 65 61 66 45 6e 64 42 6c 6f 63 6b 29 3b 0a 20 20  eafEndBlock);.  
fda0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
fdb0: 6e 74 36 34 28 70 53 74 6d 74 2c 20 35 2c 20 69  nt64(pStmt, 5, i
fdc0: 45 6e 64 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 73  EndBlock);.    s
fdd0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
fde0: 28 70 53 74 6d 74 2c 20 36 2c 20 7a 52 6f 6f 74  (pStmt, 6, zRoot
fdf0: 2c 20 6e 52 6f 6f 74 2c 20 53 51 4c 49 54 45 5f  , nRoot, SQLITE_
fe00: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c  STATIC);.    sql
fe10: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
fe20: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
fe30: 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
fe40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
fe50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
fe60: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
fe70: 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20  e common prefix 
fe80: 28 69 66 20 61 6e 79 29 20 73 68 61 72 65 64 20  (if any) shared 
fe90: 62 79 20 7a 50 72 65 76 20 61 6e 64 0a 2a 2a 20  by zPrev and.** 
fea0: 7a 4e 65 78 74 2c 20 69 6e 20 62 79 74 65 73 2e  zNext, in bytes.
feb0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 0a 2a   For example, .*
fec0: 2a 0a 2a 2a 20 20 20 66 74 73 33 50 72 65 66 69  *.**   fts3Prefi
fed0: 78 43 6f 6d 70 72 65 73 73 28 22 61 62 63 22 2c  xCompress("abc",
fee0: 20 33 2c 20 22 61 62 63 64 65 66 22 2c 20 36 29   3, "abcdef", 6)
fef0: 20 20 20 2f 2f 20 72 65 74 75 72 6e 73 20 33 0a     // returns 3.
ff00: 2a 2a 20 20 20 66 74 73 33 50 72 65 66 69 78 43  **   fts3PrefixC
ff10: 6f 6d 70 72 65 73 73 28 22 61 62 58 22 2c 20 33  ompress("abX", 3
ff20: 2c 20 22 61 62 63 64 65 66 22 2c 20 36 29 20 20  , "abcdef", 6)  
ff30: 20 2f 2f 20 72 65 74 75 72 6e 73 20 32 0a 2a 2a   // returns 2.**
ff40: 20 20 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d     fts3PrefixCom
ff50: 70 72 65 73 73 28 22 61 62 58 22 2c 20 33 2c 20  press("abX", 3, 
ff60: 22 58 62 63 64 65 66 22 2c 20 36 29 20 20 20 2f  "Xbcdef", 6)   /
ff70: 2f 20 72 65 74 75 72 6e 73 20 30 0a 2a 2f 0a 73  / returns 0.*/.s
ff80: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 50 72  tatic int fts3Pr
ff90: 65 66 69 78 43 6f 6d 70 72 65 73 73 28 0a 20 20  efixCompress(.  
ffa0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65  const char *zPre
ffb0: 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v,              
ffc0: 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
ffd0: 6e 69 6e 67 20 70 72 65 76 69 6f 75 73 20 74 65  ning previous te
ffe0: 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65  rm */.  int nPre
fff0: 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v,              
10000 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10010 6f 66 20 62 75 66 66 65 72 20 7a 50 72 65 76 20  of buffer zPrev 
10020 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 6f  in bytes */.  co
10030 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 78 74 2c  nst char *zNext,
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10050 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
10060 6e 67 20 6e 65 78 74 20 74 65 72 6d 20 2a 2f 0a  ng next term */.
10070 20 20 69 6e 74 20 6e 4e 65 78 74 20 20 20 20 20    int nNext     
10080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10090 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
100a0 66 65 72 20 7a 4e 65 78 74 20 69 6e 20 62 79 74  fer zNext in byt
100b0 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  es */.){.  int n
100c0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
100d0 45 54 45 52 28 6e 4e 65 78 74 29 3b 0a 20 20 66  ETER(nNext);.  f
100e0 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 50 72 65 76 20  or(n=0; n<nPrev 
100f0 26 26 20 7a 50 72 65 76 5b 6e 5d 3d 3d 7a 4e 65  && zPrev[n]==zNe
10100 78 74 5b 6e 5d 3b 20 6e 2b 2b 29 3b 0a 20 20 72  xt[n]; n++);.  r
10110 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
10120 2a 20 41 64 64 20 74 65 72 6d 20 7a 54 65 72 6d  * Add term zTerm
10130 20 74 6f 20 74 68 65 20 53 65 67 6d 65 6e 74 4e   to the SegmentN
10140 6f 64 65 2e 20 49 74 20 69 73 20 67 75 61 72 61  ode. It is guara
10150 6e 74 65 65 64 20 74 68 61 74 20 7a 54 65 72 6d  nteed that zTerm
10160 20 69 73 20 6c 61 72 67 65 72 0a 2a 2a 20 28 61   is larger.** (a
10170 63 63 6f 72 64 69 6e 67 20 74 6f 20 6d 65 6d 63  ccording to memc
10180 6d 70 29 20 74 68 61 6e 20 74 68 65 20 70 72 65  mp) than the pre
10190 76 69 6f 75 73 20 74 65 72 6d 2e 0a 2a 2f 0a 73  vious term..*/.s
101a0 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 4e 6f  tatic int fts3No
101b0 64 65 41 64 64 54 65 72 6d 28 0a 20 20 46 74 73  deAddTerm(.  Fts
101c0 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
101d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
101e0 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  Virtual table ha
101f0 6e 64 6c 65 20 2a 2f 0a 20 20 53 65 67 6d 65 6e  ndle */.  Segmen
10200 74 4e 6f 64 65 20 2a 2a 70 70 54 72 65 65 2c 20  tNode **ppTree, 
10210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
10220 4f 55 54 3a 20 53 65 67 6d 65 6e 74 4e 6f 64 65  OUT: SegmentNode
10230 20 68 61 6e 64 6c 65 20 2a 2f 20 0a 20 20 69 6e   handle */ .  in
10240 74 20 69 73 43 6f 70 79 54 65 72 6d 2c 20 20 20  t isCopyTerm,   
10250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10260 20 54 72 75 65 20 69 66 20 7a 54 65 72 6d 2f 6e   True if zTerm/n
10270 54 65 72 6d 20 69 73 20 74 72 61 6e 73 69 65 6e  Term is transien
10280 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
10290 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20  r *zTerm,       
102a0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
102b0 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74  r to buffer cont
102c0 61 69 6e 69 6e 67 20 74 65 72 6d 20 2a 2f 0a 20  aining term */. 
102d0 20 69 6e 74 20 6e 54 65 72 6d 20 20 20 20 20 20   int nTerm      
102e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102f0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d   /* Size of term
10300 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a   in bytes */.){.
10310 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70    SegmentNode *p
10320 54 72 65 65 20 3d 20 2a 70 70 54 72 65 65 3b 0a  Tree = *ppTree;.
10330 20 20 69 6e 74 20 72 63 3b 0a 20 20 53 65 67 6d    int rc;.  Segm
10340 65 6e 74 4e 6f 64 65 20 2a 70 4e 65 77 3b 0a 0a  entNode *pNew;..
10350 20 20 2f 2a 20 46 69 72 73 74 20 74 72 79 20 74    /* First try t
10360 6f 20 61 70 70 65 6e 64 20 74 68 65 20 74 65 72  o append the ter
10370 6d 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  m to the current
10380 20 6e 6f 64 65 2e 20 52 65 74 75 72 6e 20 65 61   node. Return ea
10390 72 6c 79 20 69 66 20 0a 20 20 2a 2a 20 74 68 69  rly if .  ** thi
103a0 73 20 69 73 20 70 6f 73 73 69 62 6c 65 2e 0a 20  s is possible.. 
103b0 20 2a 2f 0a 20 20 69 66 28 20 70 54 72 65 65 20   */.  if( pTree 
103c0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 44 61 74 61  ){.    int nData
103d0 20 3d 20 70 54 72 65 65 2d 3e 6e 44 61 74 61 3b   = pTree->nData;
103e0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
103f0 73 69 7a 65 20 6f 66 20 6e 6f 64 65 20 69 6e 20  size of node in 
10400 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74  bytes */.    int
10410 20 6e 52 65 71 20 3d 20 6e 44 61 74 61 3b 20 20   nReq = nData;  
10420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10430 71 75 69 72 65 64 20 73 70 61 63 65 20 61 66 74  quired space aft
10440 65 72 20 61 64 64 69 6e 67 20 7a 54 65 72 6d 20  er adding zTerm 
10450 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 72 65 66  */.    int nPref
10460 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ix;             
10470 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10480 66 20 62 79 74 65 73 20 6f 66 20 70 72 65 66 69  f bytes of prefi
10490 78 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 2a 2f  x compression */
104a0 0a 20 20 20 20 69 6e 74 20 6e 53 75 66 66 69 78  .    int nSuffix
104b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
104c0 20 20 20 2f 2a 20 53 75 66 66 69 78 20 6c 65 6e     /* Suffix len
104d0 67 74 68 20 2a 2f 0a 0a 20 20 20 20 6e 50 72 65  gth */..    nPre
104e0 66 69 78 20 3d 20 66 74 73 33 50 72 65 66 69 78  fix = fts3Prefix
104f0 43 6f 6d 70 72 65 73 73 28 70 54 72 65 65 2d 3e  Compress(pTree->
10500 7a 54 65 72 6d 2c 20 70 54 72 65 65 2d 3e 6e 54  zTerm, pTree->nT
10510 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  erm, zTerm, nTer
10520 6d 29 3b 0a 20 20 20 20 6e 53 75 66 66 69 78 20  m);.    nSuffix 
10530 3d 20 6e 54 65 72 6d 2d 6e 50 72 65 66 69 78 3b  = nTerm-nPrefix;
10540 0a 0a 20 20 20 20 6e 52 65 71 20 2b 3d 20 73 71  ..    nReq += sq
10550 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c  lite3Fts3VarintL
10560 65 6e 28 6e 50 72 65 66 69 78 29 2b 73 71 6c 69  en(nPrefix)+sqli
10570 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e  te3Fts3VarintLen
10580 28 6e 53 75 66 66 69 78 29 2b 6e 53 75 66 66 69  (nSuffix)+nSuffi
10590 78 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 71 3c  x;.    if( nReq<
105a0 3d 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 7c 7c  =p->nNodeSize ||
105b0 20 21 70 54 72 65 65 2d 3e 7a 54 65 72 6d 20 29   !pTree->zTerm )
105c0 7b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 52 65  {..      if( nRe
105d0 71 3e 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 29  q>p->nNodeSize )
105e0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  {.        /* An 
105f0 75 6e 75 73 75 61 6c 20 63 61 73 65 3a 20 74 68  unusual case: th
10600 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
10610 74 65 72 6d 20 74 6f 20 62 65 20 61 64 64 65 64  term to be added
10620 20 74 6f 20 74 68 65 20 6e 6f 64 65 0a 20 20 20   to the node.   
10630 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20       ** and the 
10640 73 74 61 74 69 63 20 6e 6f 64 65 20 62 75 66 66  static node buff
10650 65 72 20 28 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65  er (p->nNodeSize
10660 20 62 79 74 65 73 29 20 69 73 20 6e 6f 74 20 6c   bytes) is not l
10670 61 72 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  arge.        ** 
10680 65 6e 6f 75 67 68 2e 20 55 73 65 20 61 20 73 65  enough. Use a se
10690 70 61 72 61 74 65 6c 79 20 6d 61 6c 6c 6f 63 65  parately malloce
106a0 64 20 62 75 66 66 65 72 20 69 6e 73 74 65 61 64  d buffer instead
106b0 20 54 68 69 73 20 77 61 73 74 65 73 0a 20 20 20   This wastes.   
106c0 20 20 20 20 20 2a 2a 20 70 2d 3e 6e 4e 6f 64 65       ** p->nNode
106d0 53 69 7a 65 20 62 79 74 65 73 2c 20 62 75 74 20  Size bytes, but 
106e0 73 69 6e 63 65 20 74 68 69 73 20 73 63 65 6e 61  since this scena
106f0 72 69 6f 20 6f 6e 6c 79 20 63 6f 6d 65 73 20 61  rio only comes a
10700 62 6f 75 74 20 77 68 65 6e 0a 20 20 20 20 20 20  bout when.      
10710 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
10720 65 20 63 6f 6e 74 61 69 6e 20 74 77 6f 20 74 65  e contain two te
10730 72 6d 73 20 74 68 61 74 20 73 68 61 72 65 20 61  rms that share a
10740 20 70 72 65 66 69 78 20 6f 66 20 61 6c 6d 6f 73   prefix of almos
10750 74 20 32 4b 42 2c 20 0a 20 20 20 20 20 20 20 20  t 2KB, .        
10760 2a 2a 20 74 68 69 73 20 69 73 20 6e 6f 74 20 65  ** this is not e
10770 78 70 65 63 74 65 64 20 74 6f 20 62 65 20 61 20  xpected to be a 
10780 73 65 72 69 6f 75 73 20 70 72 6f 62 6c 65 6d 2e  serious problem.
10790 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20   .        */.   
107a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
107b0 65 65 2d 3e 61 44 61 74 61 3d 3d 28 63 68 61 72  ee->aData==(char
107c0 20 2a 29 26 70 54 72 65 65 5b 31 5d 20 29 3b 0a   *)&pTree[1] );.
107d0 20 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e 61          pTree->a
107e0 44 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29 73  Data = (char *)s
107f0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 52  qlite3_malloc(nR
10800 65 71 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  eq);.        if(
10810 20 21 70 54 72 65 65 2d 3e 61 44 61 74 61 20 29   !pTree->aData )
10820 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
10830 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
10840 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10850 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54   }..      if( pT
10860 72 65 65 2d 3e 7a 54 65 72 6d 20 29 7b 0a 20 20  ree->zTerm ){.  
10870 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
10880 73 20 6e 6f 20 70 72 65 66 69 78 2d 6c 65 6e 67  s no prefix-leng
10890 74 68 20 66 69 65 6c 64 20 66 6f 72 20 66 69 72  th field for fir
108a0 73 74 20 74 65 72 6d 20 69 6e 20 61 20 6e 6f 64  st term in a nod
108b0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 44 61  e */.        nDa
108c0 74 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  ta += sqlite3Fts
108d0 33 50 75 74 56 61 72 69 6e 74 28 26 70 54 72 65  3PutVarint(&pTre
108e0 65 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c  e->aData[nData],
108f0 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 20 20 20   nPrefix);.     
10900 20 7d 0a 0a 20 20 20 20 20 20 6e 44 61 74 61 20   }..      nData 
10910 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75  += sqlite3Fts3Pu
10920 74 56 61 72 69 6e 74 28 26 70 54 72 65 65 2d 3e  tVarint(&pTree->
10930 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 6e 53  aData[nData], nS
10940 75 66 66 69 78 29 3b 0a 20 20 20 20 20 20 6d 65  uffix);.      me
10950 6d 63 70 79 28 26 70 54 72 65 65 2d 3e 61 44 61  mcpy(&pTree->aDa
10960 74 61 5b 6e 44 61 74 61 5d 2c 20 26 7a 54 65 72  ta[nData], &zTer
10970 6d 5b 6e 50 72 65 66 69 78 5d 2c 20 6e 53 75 66  m[nPrefix], nSuf
10980 66 69 78 29 3b 0a 20 20 20 20 20 20 70 54 72 65  fix);.      pTre
10990 65 2d 3e 6e 44 61 74 61 20 3d 20 6e 44 61 74 61  e->nData = nData
109a0 20 2b 20 6e 53 75 66 66 69 78 3b 0a 20 20 20 20   + nSuffix;.    
109b0 20 20 70 54 72 65 65 2d 3e 6e 45 6e 74 72 79 2b    pTree->nEntry+
109c0 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 73  +;..      if( is
109d0 43 6f 70 79 54 65 72 6d 20 29 7b 0a 20 20 20 20  CopyTerm ){.    
109e0 20 20 20 20 69 66 28 20 70 54 72 65 65 2d 3e 6e      if( pTree->n
109f0 4d 61 6c 6c 6f 63 3c 6e 54 65 72 6d 20 29 7b 0a  Malloc<nTerm ){.
10a00 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
10a10 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72  zNew = sqlite3_r
10a20 65 61 6c 6c 6f 63 28 70 54 72 65 65 2d 3e 7a 4d  ealloc(pTree->zM
10a30 61 6c 6c 6f 63 2c 20 6e 54 65 72 6d 2a 32 29 3b  alloc, nTerm*2);
10a40 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
10a50 7a 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  zNew ){.        
10a60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10a70 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
10a80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
10a90 54 72 65 65 2d 3e 6e 4d 61 6c 6c 6f 63 20 3d 20  Tree->nMalloc = 
10aa0 6e 54 65 72 6d 2a 32 3b 0a 20 20 20 20 20 20 20  nTerm*2;.       
10ab0 20 20 20 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f     pTree->zMallo
10ac0 63 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20 20 20  c = zNew;.      
10ad0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 65    }.        pTre
10ae0 65 2d 3e 7a 54 65 72 6d 20 3d 20 70 54 72 65 65  e->zTerm = pTree
10af0 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20 20  ->zMalloc;.     
10b00 20 20 20 6d 65 6d 63 70 79 28 70 54 72 65 65 2d     memcpy(pTree-
10b10 3e 7a 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e  >zTerm, zTerm, n
10b20 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 70  Term);.        p
10b30 54 72 65 65 2d 3e 6e 54 65 72 6d 20 3d 20 6e 54  Tree->nTerm = nT
10b40 65 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  erm;.      }else
10b50 7b 0a 20 20 20 20 20 20 20 20 70 54 72 65 65 2d  {.        pTree-
10b60 3e 7a 54 65 72 6d 20 3d 20 28 63 68 61 72 20 2a  >zTerm = (char *
10b70 29 7a 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  )zTerm;.        
10b80 70 54 72 65 65 2d 3e 6e 54 65 72 6d 20 3d 20 6e  pTree->nTerm = n
10b90 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Term;.      }.  
10ba0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10bb0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
10bc0 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
10bd0 20 66 6c 6f 77 73 20 74 6f 20 68 65 72 65 2c 20   flows to here, 
10be0 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69  it was not possi
10bf0 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 7a 54  ble to append zT
10c00 65 72 6d 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  erm to the.  ** 
10c10 63 75 72 72 65 6e 74 20 6e 6f 64 65 2e 20 43 72  current node. Cr
10c20 65 61 74 65 20 61 20 6e 65 77 20 6e 6f 64 65 20  eate a new node 
10c30 28 61 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67  (a right-sibling
10c40 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
10c50 6e 6f 64 65 29 2e 0a 20 20 2a 2a 20 49 66 20 74  node)..  ** If t
10c60 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
10c70 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 74 72 65   node in the tre
10c80 65 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20 61  e, the term is a
10c90 64 64 65 64 20 74 6f 20 69 74 2e 0a 20 20 2a 2a  dded to it..  **
10ca0 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
10cb0 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74   the term is not
10cc0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6e 65   added to the ne
10cd0 77 20 6e 6f 64 65 2c 20 69 74 20 69 73 20 6c 65  w node, it is le
10ce0 66 74 20 65 6d 70 74 79 20 66 6f 72 0a 20 20 2a  ft empty for.  *
10cf0 2a 20 6e 6f 77 2e 20 49 6e 73 74 65 61 64 2c 20  * now. Instead, 
10d00 74 68 65 20 74 65 72 6d 20 69 73 20 69 6e 73 65  the term is inse
10d10 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 70 61  rted into the pa
10d20 72 65 6e 74 20 6f 66 20 70 54 72 65 65 2e 20 49  rent of pTree. I
10d30 66 20 70 54 72 65 65 20 0a 20 20 2a 2a 20 68 61  f pTree .  ** ha
10d40 73 20 6e 6f 20 70 61 72 65 6e 74 2c 20 6f 6e 65  s no parent, one
10d50 20 69 73 20 63 72 65 61 74 65 64 20 68 65 72 65   is created here
10d60 2e 0a 20 20 2a 2f 0a 20 20 70 4e 65 77 20 3d 20  ..  */.  pNew = 
10d70 28 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 29 73  (SegmentNode *)s
10d80 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
10d90 7a 65 6f 66 28 53 65 67 6d 65 6e 74 4e 6f 64 65  zeof(SegmentNode
10da0 29 20 2b 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65  ) + p->nNodeSize
10db0 29 3b 0a 20 20 69 66 28 20 21 70 4e 65 77 20 29  );.  if( !pNew )
10dc0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
10dd0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
10de0 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
10df0 20 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e 74 4e   sizeof(SegmentN
10e00 6f 64 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e  ode));.  pNew->n
10e10 44 61 74 61 20 3d 20 31 20 2b 20 46 54 53 33 5f  Data = 1 + FTS3_
10e20 56 41 52 49 4e 54 5f 4d 41 58 3b 0a 20 20 70 4e  VARINT_MAX;.  pN
10e30 65 77 2d 3e 61 44 61 74 61 20 3d 20 28 63 68 61  ew->aData = (cha
10e40 72 20 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 0a 20  r *)&pNew[1];.. 
10e50 20 69 66 28 20 70 54 72 65 65 20 29 7b 0a 20 20   if( pTree ){.  
10e60 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70    SegmentNode *p
10e70 50 61 72 65 6e 74 20 3d 20 70 54 72 65 65 2d 3e  Parent = pTree->
10e80 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 72 63 20  pParent;.    rc 
10e90 3d 20 66 74 73 33 4e 6f 64 65 41 64 64 54 65 72  = fts3NodeAddTer
10ea0 6d 28 70 2c 20 26 70 50 61 72 65 6e 74 2c 20 69  m(p, &pParent, i
10eb0 73 43 6f 70 79 54 65 72 6d 2c 20 7a 54 65 72 6d  sCopyTerm, zTerm
10ec0 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66  , nTerm);.    if
10ed0 28 20 70 54 72 65 65 2d 3e 70 50 61 72 65 6e 74  ( pTree->pParent
10ee0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 54 72  ==0 ){.      pTr
10ef0 65 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50  ee->pParent = pP
10f00 61 72 65 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20  arent;.    }.   
10f10 20 70 54 72 65 65 2d 3e 70 52 69 67 68 74 20 3d   pTree->pRight =
10f20 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 2d   pNew;.    pNew-
10f30 3e 70 4c 65 66 74 6d 6f 73 74 20 3d 20 70 54 72  >pLeftmost = pTr
10f40 65 65 2d 3e 70 4c 65 66 74 6d 6f 73 74 3b 0a 20  ee->pLeftmost;. 
10f50 20 20 20 70 4e 65 77 2d 3e 70 50 61 72 65 6e 74     pNew->pParent
10f60 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20   = pParent;.    
10f70 70 4e 65 77 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20  pNew->zMalloc = 
10f80 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a  pTree->zMalloc;.
10f90 20 20 20 20 70 4e 65 77 2d 3e 6e 4d 61 6c 6c 6f      pNew->nMallo
10fa0 63 20 3d 20 70 54 72 65 65 2d 3e 6e 4d 61 6c 6c  c = pTree->nMall
10fb0 6f 63 3b 0a 20 20 20 20 70 54 72 65 65 2d 3e 7a  oc;.    pTree->z
10fc0 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 65  Malloc = 0;.  }e
10fd0 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  lse{.    pNew->p
10fe0 4c 65 66 74 6d 6f 73 74 20 3d 20 70 4e 65 77 3b  Leftmost = pNew;
10ff0 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 4e 6f  .    rc = fts3No
11000 64 65 41 64 64 54 65 72 6d 28 70 2c 20 26 70 4e  deAddTerm(p, &pN
11010 65 77 2c 20 69 73 43 6f 70 79 54 65 72 6d 2c 20  ew, isCopyTerm, 
11020 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 20 0a  zTerm, nTerm); .
11030 20 20 7d 0a 0a 20 20 2a 70 70 54 72 65 65 20 3d    }..  *ppTree =
11040 20 70 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20   pNew;.  return 
11050 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c  rc;.}../*.** Hel
11060 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  per function for
11070 20 66 74 73 33 4e 6f 64 65 57 72 69 74 65 28 29   fts3NodeWrite()
11080 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11090 66 74 73 33 54 72 65 65 46 69 6e 69 73 68 4e 6f  fts3TreeFinishNo
110a0 64 65 28 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64  de(.  SegmentNod
110b0 65 20 2a 70 54 72 65 65 2c 20 0a 20 20 69 6e 74  e *pTree, .  int
110c0 20 69 48 65 69 67 68 74 2c 20 0a 20 20 73 71 6c   iHeight, .  sql
110d0 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 65 66 74  ite3_int64 iLeft
110e0 43 68 69 6c 64 0a 29 7b 0a 20 20 69 6e 74 20 6e  Child.){.  int n
110f0 53 74 61 72 74 3b 0a 20 20 61 73 73 65 72 74 28  Start;.  assert(
11100 20 69 48 65 69 67 68 74 3e 3d 31 20 26 26 20 69   iHeight>=1 && i
11110 48 65 69 67 68 74 3c 31 32 38 20 29 3b 0a 20 20  Height<128 );.  
11120 6e 53 74 61 72 74 20 3d 20 46 54 53 33 5f 56 41  nStart = FTS3_VA
11130 52 49 4e 54 5f 4d 41 58 20 2d 20 73 71 6c 69 74  RINT_MAX - sqlit
11140 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28  e3Fts3VarintLen(
11150 69 4c 65 66 74 43 68 69 6c 64 29 3b 0a 20 20 70  iLeftChild);.  p
11160 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e 53 74 61  Tree->aData[nSta
11170 72 74 5d 20 3d 20 28 63 68 61 72 29 69 48 65 69  rt] = (char)iHei
11180 67 68 74 3b 0a 20 20 73 71 6c 69 74 65 33 46 74  ght;.  sqlite3Ft
11190 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 54 72  s3PutVarint(&pTr
111a0 65 65 2d 3e 61 44 61 74 61 5b 6e 53 74 61 72 74  ee->aData[nStart
111b0 2b 31 5d 2c 20 69 4c 65 66 74 43 68 69 6c 64 29  +1], iLeftChild)
111c0 3b 0a 20 20 72 65 74 75 72 6e 20 6e 53 74 61 72  ;.  return nStar
111d0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
111e0 65 20 74 68 65 20 62 75 66 66 65 72 20 66 6f 72  e the buffer for
111f0 20 74 68 65 20 73 65 67 6d 65 6e 74 20 6e 6f 64   the segment nod
11200 65 20 70 54 72 65 65 20 61 6e 64 20 61 6c 6c 20  e pTree and all 
11210 6f 66 20 69 74 73 20 70 65 65 72 73 20 74 6f 20  of its peers to 
11220 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  the.** database.
11230 20 54 68 65 6e 20 63 61 6c 6c 20 74 68 69 73 20   Then call this 
11240 66 75 6e 63 74 69 6f 6e 20 72 65 63 75 72 73 69  function recursi
11250 76 65 6c 79 20 74 6f 20 77 72 69 74 65 20 74 68  vely to write th
11260 65 20 70 61 72 65 6e 74 20 6f 66 20 0a 2a 2a 20  e parent of .** 
11270 70 54 72 65 65 20 61 6e 64 20 69 74 73 20 70 65  pTree and its pe
11280 65 72 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ers to the datab
11290 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65  ase. .**.** Exce
112a0 70 74 2c 20 69 66 20 70 54 72 65 65 20 69 73 20  pt, if pTree is 
112b0 61 20 72 6f 6f 74 20 6e 6f 64 65 2c 20 64 6f 20  a root node, do 
112c0 6e 6f 74 20 77 72 69 74 65 20 69 74 20 74 6f 20  not write it to 
112d0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 6e  the database. In
112e0 73 74 65 61 64 2c 0a 2a 2a 20 73 65 74 20 6f 75  stead,.** set ou
112f0 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 2a  tput variables *
11300 70 61 52 6f 6f 74 20 61 6e 64 20 2a 70 6e 52 6f  paRoot and *pnRo
11310 6f 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ot to contain th
11320 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 0a 2a 2a 0a  e root node..**.
11330 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
11340 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
11350 65 74 75 72 6e 65 64 20 61 6e 64 20 6f 75 74 70  eturned and outp
11360 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70 69 4c  ut variable *piL
11370 61 73 74 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  ast is.** set to
11380 20 74 68 65 20 6c 61 72 67 65 73 74 20 62 6c 6f   the largest blo
11390 63 6b 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20  ckid written to 
113a0 74 68 65 20 64 61 74 61 62 61 73 65 20 28 6f 72  the database (or
113b0 20 7a 65 72 6f 20 69 66 20 6e 6f 0a 2a 2a 20 62   zero if no.** b
113c0 6c 6f 63 6b 73 20 77 65 72 65 20 77 72 69 74 74  locks were writt
113d0 65 6e 20 74 6f 20 74 68 65 20 64 62 29 2e 20 4f  en to the db). O
113e0 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c  therwise, an SQL
113f0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
11400 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  s .** returned..
11410 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
11420 73 33 4e 6f 64 65 57 72 69 74 65 28 0a 20 20 46  s3NodeWrite(.  F
11430 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
11440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11450 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * Virtual table 
11460 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 65 67 6d  handle */.  Segm
11470 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65 2c 20  entNode *pTree, 
11480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
11490 65 67 6d 65 6e 74 4e 6f 64 65 20 68 61 6e 64 6c  egmentNode handl
114a0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 48 65 69 67  e */.  int iHeig
114b0 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ht,             
114c0 20 20 20 20 20 20 20 2f 2a 20 48 65 69 67 68 74         /* Height
114d0 20 6f 66 20 74 68 69 73 20 6e 6f 64 65 20 69 6e   of this node in
114e0 20 74 72 65 65 20 2a 2f 0a 20 20 73 71 6c 69 74   tree */.  sqlit
114f0 65 33 5f 69 6e 74 36 34 20 69 4c 65 61 66 2c 20  e3_int64 iLeaf, 
11500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c             /* Bl
11510 6f 63 6b 20 69 64 20 6f 66 20 66 69 72 73 74 20  ock id of first 
11520 6c 65 61 66 20 6e 6f 64 65 20 2a 2f 0a 20 20 73  leaf node */.  s
11530 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 46 72  qlite3_int64 iFr
11540 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ee,            /
11550 2a 20 42 6c 6f 63 6b 20 69 64 20 6f 66 20 6e 65  * Block id of ne
11560 78 74 20 66 72 65 65 20 73 6c 6f 74 20 69 6e 20  xt free slot in 
11570 25 5f 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  %_segments */.  
11580 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
11590 69 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20 20  iLast,          
115a0 2f 2a 20 4f 55 54 3a 20 42 6c 6f 63 6b 20 69 64  /* OUT: Block id
115b0 20 6f 66 20 6c 61 73 74 20 65 6e 74 72 79 20 77   of last entry w
115c0 72 69 74 74 65 6e 20 2a 2f 0a 20 20 63 68 61 72  ritten */.  char
115d0 20 2a 2a 70 61 52 6f 6f 74 2c 20 20 20 20 20 20   **paRoot,      
115e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
115f0 55 54 3a 20 44 61 74 61 20 66 6f 72 20 72 6f 6f  UT: Data for roo
11600 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  t node */.  int 
11610 2a 70 6e 52 6f 6f 74 20 20 20 20 20 20 20 20 20  *pnRoot         
11620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
11630 55 54 3a 20 53 69 7a 65 20 6f 66 20 72 6f 6f 74  UT: Size of root
11640 20 6e 6f 64 65 20 69 6e 20 62 79 74 65 73 20 2a   node in bytes *
11650 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
11660 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
11670 28 20 21 70 54 72 65 65 2d 3e 70 50 61 72 65 6e  ( !pTree->pParen
11680 74 20 29 7b 0a 20 20 20 20 2f 2a 20 52 6f 6f 74  t ){.    /* Root
11690 20 6e 6f 64 65 20 6f 66 20 74 68 65 20 74 72 65   node of the tre
116a0 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53  e. */.    int nS
116b0 74 61 72 74 20 3d 20 66 74 73 33 54 72 65 65 46  tart = fts3TreeF
116c0 69 6e 69 73 68 4e 6f 64 65 28 70 54 72 65 65 2c  inishNode(pTree,
116d0 20 69 48 65 69 67 68 74 2c 20 69 4c 65 61 66 29   iHeight, iLeaf)
116e0 3b 0a 20 20 20 20 2a 70 69 4c 61 73 74 20 3d 20  ;.    *piLast = 
116f0 69 46 72 65 65 2d 31 3b 0a 20 20 20 20 2a 70 6e  iFree-1;.    *pn
11700 52 6f 6f 74 20 3d 20 70 54 72 65 65 2d 3e 6e 44  Root = pTree->nD
11710 61 74 61 20 2d 20 6e 53 74 61 72 74 3b 0a 20 20  ata - nStart;.  
11720 20 20 2a 70 61 52 6f 6f 74 20 3d 20 26 70 54 72    *paRoot = &pTr
11730 65 65 2d 3e 61 44 61 74 61 5b 6e 53 74 61 72 74  ee->aData[nStart
11740 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
11750 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 49 74  SegmentNode *pIt
11760 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  er;.    sqlite3_
11770 69 6e 74 36 34 20 69 4e 65 78 74 46 72 65 65 20  int64 iNextFree 
11780 3d 20 69 46 72 65 65 3b 0a 20 20 20 20 73 71 6c  = iFree;.    sql
11790 69 74 65 33 5f 69 6e 74 36 34 20 69 4e 65 78 74  ite3_int64 iNext
117a0 4c 65 61 66 20 3d 20 69 4c 65 61 66 3b 0a 20 20  Leaf = iLeaf;.  
117b0 20 20 66 6f 72 28 70 49 74 65 72 3d 70 54 72 65    for(pIter=pTre
117c0 65 2d 3e 70 4c 65 66 74 6d 6f 73 74 3b 20 70 49  e->pLeftmost; pI
117d0 74 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ter && rc==SQLIT
117e0 45 5f 4f 4b 3b 20 70 49 74 65 72 3d 70 49 74 65  E_OK; pIter=pIte
117f0 72 2d 3e 70 52 69 67 68 74 29 7b 0a 20 20 20 20  r->pRight){.    
11800 20 20 69 6e 74 20 6e 53 74 61 72 74 20 3d 20 66    int nStart = f
11810 74 73 33 54 72 65 65 46 69 6e 69 73 68 4e 6f 64  ts3TreeFinishNod
11820 65 28 70 49 74 65 72 2c 20 69 48 65 69 67 68 74  e(pIter, iHeight
11830 2c 20 69 4e 65 78 74 4c 65 61 66 29 3b 0a 20 20  , iNextLeaf);.  
11840 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d      int nWrite =
11850 20 70 49 74 65 72 2d 3e 6e 44 61 74 61 20 2d 20   pIter->nData - 
11860 6e 53 74 61 72 74 3b 0a 20 20 0a 20 20 20 20 20  nStart;.  .     
11870 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65 53   rc = fts3WriteS
11880 65 67 6d 65 6e 74 28 70 2c 20 69 4e 65 78 74 46  egment(p, iNextF
11890 72 65 65 2c 20 26 70 49 74 65 72 2d 3e 61 44 61  ree, &pIter->aDa
118a0 74 61 5b 6e 53 74 61 72 74 5d 2c 20 6e 57 72 69  ta[nStart], nWri
118b0 74 65 29 3b 0a 20 20 20 20 20 20 69 4e 65 78 74  te);.      iNext
118c0 46 72 65 65 2b 2b 3b 0a 20 20 20 20 20 20 69 4e  Free++;.      iN
118d0 65 78 74 4c 65 61 66 20 2b 3d 20 28 70 49 74 65  extLeaf += (pIte
118e0 72 2d 3e 6e 45 6e 74 72 79 2b 31 29 3b 0a 20 20  r->nEntry+1);.  
118f0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
11900 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11910 20 20 20 61 73 73 65 72 74 28 20 69 4e 65 78 74     assert( iNext
11920 4c 65 61 66 3d 3d 69 46 72 65 65 20 29 3b 0a 20  Leaf==iFree );. 
11930 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 4e 6f       rc = fts3No
11940 64 65 57 72 69 74 65 28 0a 20 20 20 20 20 20 20  deWrite(.       
11950 20 20 20 70 2c 20 70 54 72 65 65 2d 3e 70 50 61     p, pTree->pPa
11960 72 65 6e 74 2c 20 69 48 65 69 67 68 74 2b 31 2c  rent, iHeight+1,
11970 20 69 46 72 65 65 2c 20 69 4e 65 78 74 46 72 65   iFree, iNextFre
11980 65 2c 20 70 69 4c 61 73 74 2c 20 70 61 52 6f 6f  e, piLast, paRoo
11990 74 2c 20 70 6e 52 6f 6f 74 0a 20 20 20 20 20 20  t, pnRoot.      
119a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
119b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
119c0 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d  .** Free all mem
119d0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ory allocations 
119e0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
119f0 74 68 65 20 74 72 65 65 20 70 54 72 65 65 2e 0a  the tree pTree..
11a00 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
11a10 74 73 33 4e 6f 64 65 46 72 65 65 28 53 65 67 6d  ts3NodeFree(Segm
11a20 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65 29 7b  entNode *pTree){
11a30 0a 20 20 69 66 28 20 70 54 72 65 65 20 29 7b 0a  .  if( pTree ){.
11a40 20 20 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20      SegmentNode 
11a50 2a 70 20 3d 20 70 54 72 65 65 2d 3e 70 4c 65 66  *p = pTree->pLef
11a60 74 6d 6f 73 74 3b 0a 20 20 20 20 66 74 73 33 4e  tmost;.    fts3N
11a70 6f 64 65 46 72 65 65 28 70 2d 3e 70 50 61 72 65  odeFree(p->pPare
11a80 6e 74 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  nt);.    while( 
11a90 70 20 29 7b 0a 20 20 20 20 20 20 53 65 67 6d 65  p ){.      Segme
11aa0 6e 74 4e 6f 64 65 20 2a 70 52 69 67 68 74 20 3d  ntNode *pRight =
11ab0 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20   p->pRight;.    
11ac0 20 20 69 66 28 20 70 2d 3e 61 44 61 74 61 21 3d    if( p->aData!=
11ad0 28 63 68 61 72 20 2a 29 26 70 5b 31 5d 20 29 7b  (char *)&p[1] ){
11ae0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11af0 5f 66 72 65 65 28 70 2d 3e 61 44 61 74 61 29 3b  _free(p->aData);
11b00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
11b10 73 73 65 72 74 28 20 70 52 69 67 68 74 3d 3d 30  ssert( pRight==0
11b20 20 7c 7c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 3d 3d   || p->zMalloc==
11b30 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
11b40 65 33 5f 66 72 65 65 28 70 2d 3e 7a 4d 61 6c 6c  e3_free(p->zMall
11b50 6f 63 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  oc);.      sqlit
11b60 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
11b70 20 20 70 20 3d 20 70 52 69 67 68 74 3b 0a 20 20    p = pRight;.  
11b80 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
11b90 20 41 64 64 20 61 20 74 65 72 6d 20 74 6f 20 74   Add a term to t
11ba0 68 65 20 73 65 67 6d 65 6e 74 20 62 65 69 6e 67  he segment being
11bb0 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
11bc0 74 68 65 20 53 65 67 6d 65 6e 74 57 72 69 74 65  the SegmentWrite
11bd0 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 2a 70 70 57  r object.** *ppW
11be0 72 69 74 65 72 2e 20 57 68 65 6e 20 61 64 64 69  riter. When addi
11bf0 6e 67 20 74 68 65 20 66 69 72 73 74 20 74 65 72  ng the first ter
11c00 6d 20 74 6f 20 61 20 73 65 67 6d 65 6e 74 2c 20  m to a segment, 
11c10 2a 70 70 57 72 69 74 65 72 20 73 68 6f 75 6c 64  *ppWriter should
11c20 0a 2a 2a 20 62 65 20 70 61 73 73 65 64 20 4e 55  .** be passed NU
11c30 4c 4c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  LL. This functio
11c40 6e 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74 65 20  n will allocate 
11c50 61 20 6e 65 77 20 53 65 67 6d 65 6e 74 57 72 69  a new SegmentWri
11c60 74 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e  ter object.** an
11c70 64 20 72 65 74 75 72 6e 20 69 74 20 76 69 61 20  d return it via 
11c80 74 68 65 20 69 6e 70 75 74 2f 6f 75 74 70 75 74  the input/output
11c90 20 76 61 72 69 61 62 6c 65 20 2a 70 70 57 72 69   variable *ppWri
11ca0 74 65 72 20 69 6e 20 74 68 69 73 20 63 61 73 65  ter in this case
11cb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
11cc0 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
11cd0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
11ce0 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69  herwise, an SQLi
11cf0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
11d00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
11d10 33 53 65 67 57 72 69 74 65 72 41 64 64 28 0a 20  3SegWriterAdd(. 
11d20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
11d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d40 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
11d50 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 65  e handle */.  Se
11d60 67 6d 65 6e 74 57 72 69 74 65 72 20 2a 2a 70 70  gmentWriter **pp
11d70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 2f 2a  Writer,       /*
11d80 20 49 4e 2f 4f 55 54 3a 20 53 65 67 6d 65 6e 74   IN/OUT: Segment
11d90 57 72 69 74 65 72 20 68 61 6e 64 6c 65 20 2a 2f  Writer handle */
11da0 20 0a 20 20 69 6e 74 20 69 73 43 6f 70 79 54 65   .  int isCopyTe
11db0 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
11dc0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 62      /* True if b
11dd0 75 66 66 65 72 20 7a 54 65 72 6d 20 6d 75 73 74  uffer zTerm must
11de0 20 62 65 20 63 6f 70 69 65 64 20 2a 2f 0a 20 20   be copied */.  
11df0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72  const char *zTer
11e00 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
11e10 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
11e20 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
11e30 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  term */.  int nT
11e40 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
11e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
11e60 65 20 6f 66 20 74 65 72 6d 20 69 6e 20 62 79 74  e of term in byt
11e70 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  es */.  const ch
11e80 61 72 20 2a 61 44 6f 63 6c 69 73 74 2c 20 20 20  ar *aDoclist,   
11e90 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
11ea0 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e  er to buffer con
11eb0 74 61 69 6e 69 6e 67 20 64 6f 63 6c 69 73 74 20  taining doclist 
11ec0 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73  */.  int nDoclis
11ed0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
11ee0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
11ef0 64 6f 63 6c 69 73 74 20 69 6e 20 62 79 74 65 73  doclist in bytes
11f00 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 72   */.){.  int nPr
11f10 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20  efix;           
11f20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
11f30 20 6f 66 20 74 65 72 6d 20 70 72 65 66 69 78 20   of term prefix 
11f40 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
11f50 74 20 6e 53 75 66 66 69 78 3b 20 20 20 20 20 20  t nSuffix;      
11f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11f70 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 73 75   Size of term su
11f80 66 66 69 78 20 69 6e 20 62 79 74 65 73 20 2a 2f  ffix in bytes */
11f90 0a 20 20 69 6e 74 20 6e 52 65 71 3b 20 20 20 20  .  int nReq;    
11fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fb0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11fc0 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 6f  bytes required o
11fd0 6e 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 20  n leaf page */. 
11fe0 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20 20 53 65   int nData;.  Se
11ff0 67 6d 65 6e 74 57 72 69 74 65 72 20 2a 70 57 72  gmentWriter *pWr
12000 69 74 65 72 20 3d 20 2a 70 70 57 72 69 74 65 72  iter = *ppWriter
12010 3b 0a 0a 20 20 69 66 28 20 21 70 57 72 69 74 65  ;..  if( !pWrite
12020 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  r ){.    int rc;
12030 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
12040 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 20 20 2f  t *pStmt;..    /
12050 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 53  * Allocate the S
12060 65 67 6d 65 6e 74 57 72 69 74 65 72 20 73 74 72  egmentWriter str
12070 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 70 57  ucture */.    pW
12080 72 69 74 65 72 20 3d 20 28 53 65 67 6d 65 6e 74  riter = (Segment
12090 57 72 69 74 65 72 20 2a 29 73 71 6c 69 74 65 33  Writer *)sqlite3
120a0 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 53  _malloc(sizeof(S
120b0 65 67 6d 65 6e 74 57 72 69 74 65 72 29 29 3b 0a  egmentWriter));.
120c0 20 20 20 20 69 66 28 20 21 70 57 72 69 74 65 72      if( !pWriter
120d0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
120e0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d 73  _NOMEM;.    mems
120f0 65 74 28 70 57 72 69 74 65 72 2c 20 30 2c 20 73  et(pWriter, 0, s
12100 69 7a 65 6f 66 28 53 65 67 6d 65 6e 74 57 72 69  izeof(SegmentWri
12110 74 65 72 29 29 3b 0a 20 20 20 20 2a 70 70 57 72  ter));.    *ppWr
12120 69 74 65 72 20 3d 20 70 57 72 69 74 65 72 3b 0a  iter = pWriter;.
12130 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  .    /* Allocate
12140 20 61 20 62 75 66 66 65 72 20 69 6e 20 77 68 69   a buffer in whi
12150 63 68 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65  ch to accumulate
12160 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 70 57 72   data */.    pWr
12170 69 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 28 63  iter->aData = (c
12180 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
12190 6c 6c 6f 63 28 70 2d 3e 6e 4e 6f 64 65 53 69 7a  lloc(p->nNodeSiz
121a0 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 57 72  e);.    if( !pWr
121b0 69 74 65 72 2d 3e 61 44 61 74 61 20 29 20 72 65  iter->aData ) re
121c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
121d0 4d 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  M;.    pWriter->
121e0 6e 53 69 7a 65 20 3d 20 70 2d 3e 6e 4e 6f 64 65  nSize = p->nNode
121f0 53 69 7a 65 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  Size;..    /* Fi
12200 6e 64 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  nd the next free
12210 20 62 6c 6f 63 6b 69 64 20 69 6e 20 74 68 65 20   blockid in the 
12220 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65  %_segments table
12230 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73   */.    rc = fts
12240 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
12250 4e 45 58 54 5f 53 45 47 4d 45 4e 54 53 5f 49 44  NEXT_SEGMENTS_ID
12260 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
12270 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12280 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
12290 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
122a0 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
122b0 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
122c0 20 20 70 57 72 69 74 65 72 2d 3e 69 46 72 65 65    pWriter->iFree
122d0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
122e0 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 30  n_int64(pStmt, 0
122f0 29 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72  );.      pWriter
12300 2d 3e 69 46 69 72 73 74 20 3d 20 70 57 72 69 74  ->iFirst = pWrit
12310 65 72 2d 3e 69 46 72 65 65 3b 0a 20 20 20 20 7d  er->iFree;.    }
12320 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12330 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
12340 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12350 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
12360 63 3b 0a 20 20 7d 0a 20 20 6e 44 61 74 61 20 3d  c;.  }.  nData =
12370 20 70 57 72 69 74 65 72 2d 3e 6e 44 61 74 61 3b   pWriter->nData;
12380 0a 0a 20 20 6e 50 72 65 66 69 78 20 3d 20 66 74  ..  nPrefix = ft
12390 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73  s3PrefixCompress
123a0 28 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d 2c  (pWriter->zTerm,
123b0 20 70 57 72 69 74 65 72 2d 3e 6e 54 65 72 6d 2c   pWriter->nTerm,
123c0 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   zTerm, nTerm);.
123d0 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72    nSuffix = nTer
123e0 6d 2d 6e 50 72 65 66 69 78 3b 0a 0a 20 20 2f 2a  m-nPrefix;..  /*
123f0 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
12400 6d 61 6e 79 20 62 79 74 65 73 20 61 72 65 20 72  many bytes are r
12410 65 71 75 69 72 65 64 20 62 79 20 74 68 69 73 20  equired by this 
12420 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20 6e  new entry */.  n
12430 52 65 71 20 3d 20 73 71 6c 69 74 65 33 46 74 73  Req = sqlite3Fts
12440 33 56 61 72 69 6e 74 4c 65 6e 28 6e 50 72 65 66  3VarintLen(nPref
12450 69 78 29 20 2b 20 20 20 20 2f 2a 20 76 61 72 69  ix) +    /* vari
12460 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72  nt containing pr
12470 65 66 69 78 20 73 69 7a 65 20 2a 2f 0a 20 20 20  efix size */.   
12480 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69   sqlite3Fts3Vari
12490 6e 74 4c 65 6e 28 6e 53 75 66 66 69 78 29 20 2b  ntLen(nSuffix) +
124a0 20 20 20 20 20 20 20 20 20 2f 2a 20 76 61 72 69           /* vari
124b0 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 75  nt containing su
124c0 66 66 69 78 20 73 69 7a 65 20 2a 2f 0a 20 20 20  ffix size */.   
124d0 20 6e 53 75 66 66 69 78 20 2b 20 20 20 20 20 20   nSuffix +      
124e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d           /* Term
12500 20 73 75 66 66 69 78 20 2a 2f 0a 20 20 20 20 73   suffix */.    s
12510 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e 74  qlite3Fts3Varint
12520 4c 65 6e 28 6e 44 6f 63 6c 69 73 74 29 20 2b 20  Len(nDoclist) + 
12530 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
12540 66 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 20  f doclist */.   
12550 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20   nDoclist;      
12560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12570 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c           /* Docl
12580 69 73 74 20 64 61 74 61 20 2a 2f 0a 0a 20 20 69  ist data */..  i
12590 66 28 20 6e 44 61 74 61 3e 30 20 26 26 20 6e 44  f( nData>0 && nD
125a0 61 74 61 2b 6e 52 65 71 3e 70 2d 3e 6e 4e 6f 64  ata+nReq>p->nNod
125b0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e 74  eSize ){.    int
125c0 20 72 63 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65   rc;..    /* The
125d0 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 6e 6f   current leaf no
125e0 64 65 20 69 73 20 66 75 6c 6c 2e 20 57 72 69 74  de is full. Writ
125f0 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20  e it out to the 
12600 64 61 74 61 62 61 73 65 2e 20 2a 2f 0a 20 20 20  database. */.   
12610 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65 53   rc = fts3WriteS
12620 65 67 6d 65 6e 74 28 70 2c 20 70 57 72 69 74 65  egment(p, pWrite
12630 72 2d 3e 69 46 72 65 65 2b 2b 2c 20 70 57 72 69  r->iFree++, pWri
12640 74 65 72 2d 3e 61 44 61 74 61 2c 20 6e 44 61 74  ter->aData, nDat
12650 61 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  a);.    if( rc!=
12660 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
12670 72 6e 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6e 4c  rn rc;.    p->nL
12680 65 61 66 41 64 64 2b 2b 3b 0a 0a 20 20 20 20 2f  eafAdd++;..    /
12690 2a 20 41 64 64 20 74 68 65 20 63 75 72 72 65 6e  * Add the curren
126a0 74 20 74 65 72 6d 20 74 6f 20 74 68 65 20 69 6e  t term to the in
126b0 74 65 72 69 6f 72 20 6e 6f 64 65 20 74 72 65 65  terior node tree
126c0 2e 20 54 68 65 20 74 65 72 6d 20 61 64 64 65 64  . The term added
126d0 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 69   to.    ** the i
126e0 6e 74 65 72 69 6f 72 20 74 72 65 65 20 6d 75 73  nterior tree mus
126f0 74 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t:.    **.    **
12700 20 20 20 61 29 20 62 65 20 67 72 65 61 74 65 72     a) be greater
12710 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73   than the larges
12720 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 6c 65  t term on the le
12730 61 66 20 6e 6f 64 65 20 6a 75 73 74 20 77 72 69  af node just wri
12740 74 74 65 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20  tten.    **     
12750 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
12760 20 28 73 74 69 6c 6c 20 61 76 61 69 6c 61 62 6c   (still availabl
12770 65 20 69 6e 20 70 57 72 69 74 65 72 2d 3e 7a 54  e in pWriter->zT
12780 65 72 6d 29 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  erm), and.    **
12790 0a 20 20 20 20 2a 2a 20 20 20 62 29 20 62 65 20  .    **   b) be 
127a0 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
127b0 61 6c 20 74 6f 20 74 68 65 20 74 65 72 6d 20 61  al to the term a
127c0 62 6f 75 74 20 74 6f 20 62 65 20 61 64 64 65 64  bout to be added
127d0 20 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20   to the new.    
127e0 2a 2a 20 20 20 20 20 20 6c 65 61 66 20 6e 6f 64  **      leaf nod
127f0 65 20 28 7a 54 65 72 6d 2f 6e 54 65 72 6d 29 2e  e (zTerm/nTerm).
12800 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
12810 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
12820 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 70 72  t must be the pr
12830 65 66 69 78 20 6f 66 20 7a 54 65 72 6d 20 31 20  efix of zTerm 1 
12840 62 79 74 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e  byte longer than
12850 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6d 6d  .    ** the comm
12860 6f 6e 20 70 72 65 66 69 78 20 28 69 66 20 61 6e  on prefix (if an
12870 79 29 20 6f 66 20 7a 54 65 72 6d 20 61 6e 64 20  y) of zTerm and 
12880 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d 2e 0a  pWriter->zTerm..
12890 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
128a0 74 28 20 6e 50 72 65 66 69 78 3c 6e 54 65 72 6d  t( nPrefix<nTerm
128b0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   );.    rc = fts
128c0 33 4e 6f 64 65 41 64 64 54 65 72 6d 28 70 2c 20  3NodeAddTerm(p, 
128d0 26 70 57 72 69 74 65 72 2d 3e 70 54 72 65 65 2c  &pWriter->pTree,
128e0 20 69 73 43 6f 70 79 54 65 72 6d 2c 20 7a 54 65   isCopyTerm, zTe
128f0 72 6d 2c 20 6e 50 72 65 66 69 78 2b 31 29 3b 0a  rm, nPrefix+1);.
12900 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12910 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
12920 63 3b 0a 0a 20 20 20 20 6e 44 61 74 61 20 3d 20  c;..    nData = 
12930 30 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  0;.    pWriter->
12940 6e 54 65 72 6d 20 3d 20 30 3b 0a 0a 20 20 20 20  nTerm = 0;..    
12950 6e 50 72 65 66 69 78 20 3d 20 30 3b 0a 20 20 20  nPrefix = 0;.   
12960 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d   nSuffix = nTerm
12970 3b 0a 20 20 20 20 6e 52 65 71 20 3d 20 31 20 2b  ;.    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 20 20 20 20 2f 2a                /*
129a0 20 76 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e 69   varint containi
129b0 6e 67 20 70 72 65 66 69 78 20 73 69 7a 65 20 2a  ng prefix size *
129c0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  /.      sqlite3F
129d0 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 54 65  ts3VarintLen(nTe
129e0 72 6d 29 20 2b 20 20 20 20 20 20 20 20 20 2f 2a  rm) +         /*
129f0 20 76 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e 69   varint containi
12a00 6e 67 20 73 75 66 66 69 78 20 73 69 7a 65 20 2a  ng suffix size *
12a10 2f 0a 20 20 20 20 20 20 6e 54 65 72 6d 20 2b 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 20 20 20 20 2f 2a                /*
12a40 20 54 65 72 6d 20 73 75 66 66 69 78 20 2a 2f 0a   Term suffix */.
12a50 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
12a60 33 56 61 72 69 6e 74 4c 65 6e 28 6e 44 6f 63 6c  3VarintLen(nDocl
12a70 69 73 74 29 20 2b 20 20 20 20 20 20 2f 2a 20 53  ist) +      /* S
12a80 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 2a  ize of doclist *
12a90 2f 0a 20 20 20 20 20 20 6e 44 6f 63 6c 69 73 74  /.      nDoclist
12aa0 3b 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 20 20 20 20 2f 2a                /*
12ac0 20 44 6f 63 6c 69 73 74 20 64 61 74 61 20 2a 2f   Doclist data */
12ad0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
12ae0 65 20 62 75 66 66 65 72 20 63 75 72 72 65 6e 74  e buffer current
12af0 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 69 73 20  ly allocated is 
12b00 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68  too small for th
12b10 69 73 20 65 6e 74 72 79 2c 20 72 65 61 6c 6c 6f  is entry, reallo
12b20 63 0a 20 20 2a 2a 20 74 68 65 20 62 75 66 66 65  c.  ** the buffe
12b30 72 20 74 6f 20 6d 61 6b 65 20 69 74 20 6c 61 72  r to make it lar
12b40 67 65 20 65 6e 6f 75 67 68 2e 0a 20 20 2a 2f 0a  ge enough..  */.
12b50 20 20 69 66 28 20 6e 52 65 71 3e 70 57 72 69 74    if( nReq>pWrit
12b60 65 72 2d 3e 6e 53 69 7a 65 20 29 7b 0a 20 20 20  er->nSize ){.   
12b70 20 63 68 61 72 20 2a 61 4e 65 77 20 3d 20 73 71   char *aNew = sq
12b80 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 57  lite3_realloc(pW
12b90 72 69 74 65 72 2d 3e 61 44 61 74 61 2c 20 6e 52  riter->aData, nR
12ba0 65 71 29 3b 0a 20 20 20 20 69 66 28 20 21 61 4e  eq);.    if( !aN
12bb0 65 77 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ew ) return SQLI
12bc0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 57  TE_NOMEM;.    pW
12bd0 72 69 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 61  riter->aData = a
12be0 4e 65 77 3b 0a 20 20 20 20 70 57 72 69 74 65 72  New;.    pWriter
12bf0 2d 3e 6e 53 69 7a 65 20 3d 20 6e 52 65 71 3b 0a  ->nSize = nReq;.
12c00 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 44    }.  assert( nD
12c10 61 74 61 2b 6e 52 65 71 3c 3d 70 57 72 69 74 65  ata+nReq<=pWrite
12c20 72 2d 3e 6e 53 69 7a 65 20 29 3b 0a 0a 20 20 2f  r->nSize );..  /
12c30 2a 20 41 70 70 65 6e 64 20 74 68 65 20 70 72 65  * Append the pre
12c40 66 69 78 2d 63 6f 6d 70 72 65 73 73 65 64 20 74  fix-compressed t
12c50 65 72 6d 20 61 6e 64 20 64 6f 63 6c 69 73 74 20  erm and doclist 
12c60 74 6f 20 74 68 65 20 62 75 66 66 65 72 2e 20 2a  to the buffer. *
12c70 2f 0a 20 20 6e 44 61 74 61 20 2b 3d 20 73 71 6c  /.  nData += sql
12c80 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e  ite3Fts3PutVarin
12c90 74 28 26 70 57 72 69 74 65 72 2d 3e 61 44 61 74  t(&pWriter->aDat
12ca0 61 5b 6e 44 61 74 61 5d 2c 20 6e 50 72 65 66 69  a[nData], nPrefi
12cb0 78 29 3b 0a 20 20 6e 44 61 74 61 20 2b 3d 20 73  x);.  nData += s
12cc0 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72  qlite3Fts3PutVar
12cd0 69 6e 74 28 26 70 57 72 69 74 65 72 2d 3e 61 44  int(&pWriter->aD
12ce0 61 74 61 5b 6e 44 61 74 61 5d 2c 20 6e 53 75 66  ata[nData], nSuf
12cf0 66 69 78 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  fix);.  memcpy(&
12d00 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 5b 6e  pWriter->aData[n
12d10 44 61 74 61 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50  Data], &zTerm[nP
12d20 72 65 66 69 78 5d 2c 20 6e 53 75 66 66 69 78 29  refix], nSuffix)
12d30 3b 0a 20 20 6e 44 61 74 61 20 2b 3d 20 6e 53 75  ;.  nData += nSu
12d40 66 66 69 78 3b 0a 20 20 6e 44 61 74 61 20 2b 3d  ffix;.  nData +=
12d50 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56   sqlite3Fts3PutV
12d60 61 72 69 6e 74 28 26 70 57 72 69 74 65 72 2d 3e  arint(&pWriter->
12d70 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 6e 44  aData[nData], nD
12d80 6f 63 6c 69 73 74 29 3b 0a 20 20 6d 65 6d 63 70  oclist);.  memcp
12d90 79 28 26 70 57 72 69 74 65 72 2d 3e 61 44 61 74  y(&pWriter->aDat
12da0 61 5b 6e 44 61 74 61 5d 2c 20 61 44 6f 63 6c 69  a[nData], aDocli
12db0 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20  st, nDoclist);. 
12dc0 20 70 57 72 69 74 65 72 2d 3e 6e 44 61 74 61 20   pWriter->nData 
12dd0 3d 20 6e 44 61 74 61 20 2b 20 6e 44 6f 63 6c 69  = nData + nDocli
12de0 73 74 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74  st;..  /* Save t
12df0 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20  he current term 
12e00 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 62  so that it can b
12e10 65 20 75 73 65 64 20 74 6f 20 70 72 65 66 69 78  e used to prefix
12e20 2d 63 6f 6d 70 72 65 73 73 20 74 68 65 20 6e 65  -compress the ne
12e30 78 74 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20  xt..  ** If the 
12e40 69 73 43 6f 70 79 54 65 72 6d 20 70 61 72 61 6d  isCopyTerm param
12e50 65 74 65 72 20 69 73 20 74 72 75 65 2c 20 74 68  eter is true, th
12e60 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  en the buffer po
12e70 69 6e 74 65 64 20 74 6f 20 62 79 0a 20 20 2a 2a  inted to by.  **
12e80 20 7a 54 65 72 6d 20 69 73 20 74 72 61 6e 73 69   zTerm is transi
12e90 65 6e 74 2c 20 73 6f 20 74 61 6b 65 20 61 20 63  ent, so take a c
12ea0 6f 70 79 20 6f 66 20 74 68 65 20 74 65 72 6d 20  opy of the term 
12eb0 64 61 74 61 2e 20 4f 74 68 65 72 77 69 73 65 2c  data. Otherwise,
12ec0 20 6a 75 73 74 0a 20 20 2a 2a 20 73 74 6f 72 65   just.  ** store
12ed0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70   a copy of the p
12ee0 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  ointer..  */.  i
12ef0 66 28 20 69 73 43 6f 70 79 54 65 72 6d 20 29 7b  f( isCopyTerm ){
12f00 0a 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3e 70  .    if( nTerm>p
12f10 57 72 69 74 65 72 2d 3e 6e 4d 61 6c 6c 6f 63 20  Writer->nMalloc 
12f20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
12f30 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  New = sqlite3_re
12f40 61 6c 6c 6f 63 28 70 57 72 69 74 65 72 2d 3e 7a  alloc(pWriter->z
12f50 4d 61 6c 6c 6f 63 2c 20 6e 54 65 72 6d 2a 32 29  Malloc, nTerm*2)
12f60 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4e 65  ;.      if( !zNe
12f70 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  w ){.        ret
12f80 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
12f90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12fa0 70 57 72 69 74 65 72 2d 3e 6e 4d 61 6c 6c 6f 63  pWriter->nMalloc
12fb0 20 3d 20 6e 54 65 72 6d 2a 32 3b 0a 20 20 20 20   = nTerm*2;.    
12fc0 20 20 70 57 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c    pWriter->zMall
12fd0 6f 63 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20 20  oc = zNew;.     
12fe0 20 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d 20   pWriter->zTerm 
12ff0 3d 20 7a 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20  = zNew;.    }.  
13000 20 20 61 73 73 65 72 74 28 20 70 57 72 69 74 65    assert( pWrite
13010 72 2d 3e 7a 54 65 72 6d 3d 3d 70 57 72 69 74 65  r->zTerm==pWrite
13020 72 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 3b 0a 20 20  r->zMalloc );.  
13030 20 20 6d 65 6d 63 70 79 28 70 57 72 69 74 65 72    memcpy(pWriter
13040 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20  ->zTerm, zTerm, 
13050 6e 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b  nTerm);.  }else{
13060 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 7a 54  .    pWriter->zT
13070 65 72 6d 20 3d 20 28 63 68 61 72 20 2a 29 7a 54  erm = (char *)zT
13080 65 72 6d 3b 0a 20 20 7d 0a 20 20 70 57 72 69 74  erm;.  }.  pWrit
13090 65 72 2d 3e 6e 54 65 72 6d 20 3d 20 6e 54 65 72  er->nTerm = nTer
130a0 6d 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m;..  return SQL
130b0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
130c0 20 46 6c 75 73 68 20 61 6c 6c 20 64 61 74 61 20   Flush all data 
130d0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
130e0 74 68 65 20 53 65 67 6d 65 6e 74 57 72 69 74 65  the SegmentWrite
130f0 72 20 6f 62 6a 65 63 74 20 70 57 72 69 74 65 72  r object pWriter
13100 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
13110 61 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ase. This functi
13120 6f 6e 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  on must be calle
13130 64 20 61 66 74 65 72 20 61 6c 6c 20 74 65 72 6d  d after all term
13140 73 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65  s have been adde
13150 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73 65 67 6d  d.** to the segm
13160 65 6e 74 20 75 73 69 6e 67 20 66 74 73 33 53 65  ent using fts3Se
13170 67 57 72 69 74 65 72 41 64 64 28 29 2e 20 49 66  gWriterAdd(). If
13180 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
13190 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a 20 72 65 74  ITE_OK is.** ret
131a0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
131b0 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
131c0 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
131d0 63 20 69 6e 74 20 66 74 73 33 53 65 67 57 72 69  c int fts3SegWri
131e0 74 65 72 46 6c 75 73 68 28 0a 20 20 46 74 73 33  terFlush(.  Fts3
131f0 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
13200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
13210 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
13220 64 6c 65 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74  dle */.  Segment
13230 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
13240 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d           /* Segm
13250 65 6e 74 57 72 69 74 65 72 20 74 6f 20 66 6c 75  entWriter to flu
13260 73 68 20 74 6f 20 74 68 65 20 64 62 20 2a 2f 0a  sh to the db */.
13270 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
13280 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20  iLevel,         
13290 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 27    /* Value for '
132a0 6c 65 76 65 6c 27 20 63 6f 6c 75 6d 6e 20 6f 66  level' column of
132b0 20 25 5f 73 65 67 64 69 72 20 2a 2f 0a 20 20 69   %_segdir */.  i
132c0 6e 74 20 69 49 64 78 20 20 20 20 20 20 20 20 20  nt iIdx         
132d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
132e0 2a 20 56 61 6c 75 65 20 66 6f 72 20 27 69 64 78  * Value for 'idx
132f0 27 20 63 6f 6c 75 6d 6e 20 6f 66 20 25 5f 73 65  ' column of %_se
13300 67 64 69 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  gdir */.){.  int
13310 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
13320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13330 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
13340 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 70 54   if( pWriter->pT
13350 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ree ){.    sqlit
13360 65 33 5f 69 6e 74 36 34 20 69 4c 61 73 74 20 3d  e3_int64 iLast =
13370 20 30 3b 20 20 20 20 20 20 2f 2a 20 4c 61 72 67   0;      /* Larg
13380 65 73 74 20 62 6c 6f 63 6b 20 69 64 20 77 72 69  est block id wri
13390 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65  tten to database
133a0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
133b0 69 6e 74 36 34 20 69 4c 61 73 74 4c 65 61 66 3b  int64 iLastLeaf;
133c0 20 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74        /* Largest
133d0 20 6c 65 61 66 20 62 6c 6f 63 6b 20 69 64 20 77   leaf block id w
133e0 72 69 74 74 65 6e 20 74 6f 20 64 62 20 2a 2f 0a  ritten to db */.
133f0 20 20 20 20 63 68 61 72 20 2a 7a 52 6f 6f 74 20      char *zRoot 
13400 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20  = NULL;         
13410 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
13420 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
13430 67 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20  g root node */. 
13440 20 20 20 69 6e 74 20 6e 52 6f 6f 74 20 3d 20 30     int nRoot = 0
13450 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13460 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66   /* Size of buff
13470 65 72 20 7a 52 6f 6f 74 20 2a 2f 0a 0a 20 20 20  er zRoot */..   
13480 20 69 4c 61 73 74 4c 65 61 66 20 3d 20 70 57 72   iLastLeaf = pWr
13490 69 74 65 72 2d 3e 69 46 72 65 65 3b 0a 20 20 20  iter->iFree;.   
134a0 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65 53   rc = fts3WriteS
134b0 65 67 6d 65 6e 74 28 70 2c 20 70 57 72 69 74 65  egment(p, pWrite
134c0 72 2d 3e 69 46 72 65 65 2b 2b 2c 20 70 57 72 69  r->iFree++, pWri
134d0 74 65 72 2d 3e 61 44 61 74 61 2c 20 70 57 72 69  ter->aData, pWri
134e0 74 65 72 2d 3e 6e 44 61 74 61 29 3b 0a 20 20 20  ter->nData);.   
134f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13500 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
13510 20 66 74 73 33 4e 6f 64 65 57 72 69 74 65 28 70   fts3NodeWrite(p
13520 2c 20 70 57 72 69 74 65 72 2d 3e 70 54 72 65 65  , pWriter->pTree
13530 2c 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20 70  , 1,.          p
13540 57 72 69 74 65 72 2d 3e 69 46 69 72 73 74 2c 20  Writer->iFirst, 
13550 70 57 72 69 74 65 72 2d 3e 69 46 72 65 65 2c 20  pWriter->iFree, 
13560 26 69 4c 61 73 74 2c 20 26 7a 52 6f 6f 74 2c 20  &iLast, &zRoot, 
13570 26 6e 52 6f 6f 74 29 3b 0a 20 20 20 20 7d 0a 20  &nRoot);.    }. 
13580 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13590 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
135a0 20 3d 20 66 74 73 33 57 72 69 74 65 53 65 67 64   = fts3WriteSegd
135b0 69 72 28 0a 20 20 20 20 20 20 20 20 20 20 70 2c  ir(.          p,
135c0 20 69 4c 65 76 65 6c 2c 20 69 49 64 78 2c 20 70   iLevel, iIdx, p
135d0 57 72 69 74 65 72 2d 3e 69 46 69 72 73 74 2c 20  Writer->iFirst, 
135e0 69 4c 61 73 74 4c 65 61 66 2c 20 69 4c 61 73 74  iLastLeaf, iLast
135f0 2c 20 7a 52 6f 6f 74 2c 20 6e 52 6f 6f 74 29 3b  , zRoot, nRoot);
13600 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
13610 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72      /* The entir
13620 65 20 74 72 65 65 20 66 69 74 73 20 6f 6e 20 74  e tree fits on t
13630 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 57 72  he root node. Wr
13640 69 74 65 20 69 74 20 74 6f 20 74 68 65 20 73 65  ite it to the se
13650 67 64 69 72 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  gdir table. */. 
13660 20 20 20 72 63 20 3d 20 66 74 73 33 57 72 69 74     rc = fts3Writ
13670 65 53 65 67 64 69 72 28 0a 20 20 20 20 20 20 20  eSegdir(.       
13680 20 70 2c 20 69 4c 65 76 65 6c 2c 20 69 49 64 78   p, iLevel, iIdx
13690 2c 20 30 2c 20 30 2c 20 30 2c 20 70 57 72 69 74  , 0, 0, 0, pWrit
136a0 65 72 2d 3e 61 44 61 74 61 2c 20 70 57 72 69 74  er->aData, pWrit
136b0 65 72 2d 3e 6e 44 61 74 61 29 3b 0a 20 20 7d 0a  er->nData);.  }.
136c0 20 20 70 2d 3e 6e 4c 65 61 66 41 64 64 2b 2b 3b    p->nLeafAdd++;
136d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
136e0 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
136f0 6c 6c 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62  ll memory held b
13700 79 20 74 68 65 20 53 65 67 6d 65 6e 74 57 72 69  y the SegmentWri
13710 74 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ter object passe
13720 64 20 61 73 20 74 68 65 20 0a 2a 2a 20 66 69 72  d as the .** fir
13730 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  st argument..*/.
13740 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
13750 53 65 67 57 72 69 74 65 72 46 72 65 65 28 53 65  SegWriterFree(Se
13760 67 6d 65 6e 74 57 72 69 74 65 72 20 2a 70 57 72  gmentWriter *pWr
13770 69 74 65 72 29 7b 0a 20 20 69 66 28 20 70 57 72  iter){.  if( pWr
13780 69 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  iter ){.    sqli
13790 74 65 33 5f 66 72 65 65 28 70 57 72 69 74 65 72  te3_free(pWriter
137a0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 73 71  ->aData);.    sq
137b0 6c 69 74 65 33 5f 66 72 65 65 28 70 57 72 69 74  lite3_free(pWrit
137c0 65 72 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20  er->zMalloc);.  
137d0 20 20 66 74 73 33 4e 6f 64 65 46 72 65 65 28 70    fts3NodeFree(p
137e0 57 72 69 74 65 72 2d 3e 70 54 72 65 65 29 3b 0a  Writer->pTree);.
137f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13800 28 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 7d  (pWriter);.  }.}
13810 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
13820 74 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61  t value in the a
13830 70 56 61 6c 5b 5d 20 61 72 72 61 79 20 69 73 20  pVal[] array is 
13840 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61  assumed to conta
13850 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a  in an integer..*
13860 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
13870 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20 65  tests if there e
13880 78 69 73 74 20 61 6e 79 20 64 6f 63 75 6d 65 6e  xist any documen
13890 74 73 20 77 69 74 68 20 64 6f 63 69 64 20 76 61  ts with docid va
138a0 6c 75 65 73 20 74 68 61 74 0a 2a 2a 20 61 72 65  lues that.** are
138b0 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
138c0 74 68 61 74 20 69 6e 74 65 67 65 72 2e 20 69 2e  that integer. i.
138d0 65 2e 20 69 66 20 64 65 6c 65 74 69 6e 67 20 74  e. if deleting t
138e0 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68  he document with
138f0 20 64 6f 63 69 64 0a 2a 2a 20 70 52 6f 77 69 64   docid.** pRowid
13900 20 77 6f 75 6c 64 20 6d 65 61 6e 20 74 68 65 20   would mean the 
13910 46 54 53 33 20 74 61 62 6c 65 20 77 65 72 65 20  FTS3 table were 
13920 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  empty..**.** If 
13930 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 69 73  successful, *pis
13940 45 6d 70 74 79 20 69 73 20 73 65 74 20 74 6f 20  Empty is set to 
13950 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62 6c  true if the tabl
13960 65 20 69 73 20 65 6d 70 74 79 20 65 78 63 65 70  e is empty excep
13970 74 20 66 6f 72 0a 2a 2a 20 64 6f 63 75 6d 65 6e  t for.** documen
13980 74 20 70 52 6f 77 69 64 2c 20 6f 72 20 66 61 6c  t pRowid, or fal
13990 73 65 20 6f 74 68 65 72 77 69 73 65 2c 20 61 6e  se otherwise, an
139a0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  d SQLITE_OK is r
139b0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 0a 2a  eturned. If an.*
139c0 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  * error occurs, 
139d0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
139e0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
139f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13a00 66 74 73 33 49 73 45 6d 70 74 79 28 46 74 73 33  fts3IsEmpty(Fts3
13a10 54 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74 65  Table *p, sqlite
13a20 33 5f 76 61 6c 75 65 20 2a 70 52 6f 77 69 64 2c  3_value *pRowid,
13a30 20 69 6e 74 20 2a 70 69 73 45 6d 70 74 79 29 7b   int *pisEmpty){
13a40 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
13a50 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63  *pStmt;.  int rc
13a60 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 43 6f 6e 74  ;.  if( p->zCont
13a70 65 6e 74 54 62 6c 20 29 7b 0a 20 20 20 20 2f 2a  entTbl ){.    /*
13a80 20 49 66 20 75 73 69 6e 67 20 74 68 65 20 63 6f   If using the co
13a90 6e 74 65 6e 74 3d 78 78 78 20 6f 70 74 69 6f 6e  ntent=xxx option
13aa0 2c 20 61 73 73 75 6d 65 20 74 68 65 20 74 61 62  , assume the tab
13ab0 6c 65 20 69 73 20 6e 65 76 65 72 20 65 6d 70 74  le is never empt
13ac0 79 20 2a 2f 0a 20 20 20 20 2a 70 69 73 45 6d 70  y */.    *pisEmp
13ad0 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  ty = 0;.    rc =
13ae0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
13af0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  lse{.    rc = ft
13b00 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
13b10 5f 49 53 5f 45 4d 50 54 59 2c 20 26 70 53 74 6d  _IS_EMPTY, &pStm
13b20 74 2c 20 26 70 52 6f 77 69 64 29 3b 0a 20 20 20  t, &pRowid);.   
13b30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13b40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
13b50 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
13b60 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
13b70 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 69 73 45  ){.        *pisE
13b80 6d 70 74 79 20 3d 20 73 71 6c 69 74 65 33 5f 63  mpty = sqlite3_c
13b90 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
13ba0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
13bb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
13bc0 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
13bd0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
13be0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
13bf0 74 20 2a 70 6e 4d 61 78 20 74 6f 20 74 68 65 20  t *pnMax to the 
13c00 6c 61 72 67 65 73 74 20 73 65 67 6d 65 6e 74 20  largest segment 
13c10 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 64 61 74  level in the dat
13c20 61 62 61 73 65 20 66 6f 72 20 74 68 65 20 69 6e  abase for the in
13c30 64 65 78 0a 2a 2a 20 69 49 6e 64 65 78 2e 0a 2a  dex.** iIndex..*
13c40 2a 0a 2a 2a 20 53 65 67 6d 65 6e 74 20 6c 65 76  *.** Segment lev
13c50 65 6c 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  els are stored i
13c60 6e 20 74 68 65 20 27 6c 65 76 65 6c 27 20 63 6f  n the 'level' co
13c70 6c 75 6d 6e 20 6f 66 20 74 68 65 20 25 5f 73 65  lumn of the %_se
13c80 67 64 69 72 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  gdir table..**.*
13c90 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
13ca0 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
13cb0 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  , or an SQLite e
13cc0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6e 6f 74  rror code if not
13cd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13ce0 66 74 73 33 53 65 67 6d 65 6e 74 4d 61 78 4c 65  fts3SegmentMaxLe
13cf0 76 65 6c 28 0a 20 20 46 74 73 33 54 61 62 6c 65  vel(.  Fts3Table
13d00 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 4c 61 6e   *p, .  int iLan
13d10 67 69 64 2c 0a 20 20 69 6e 74 20 69 49 6e 64 65  gid,.  int iInde
13d20 78 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  x, .  sqlite3_in
13d30 74 36 34 20 2a 70 6e 4d 61 78 0a 29 7b 0a 20 20  t64 *pnMax.){.  
13d40 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
13d50 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  tmt;.  int rc;. 
13d60 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 3e   assert( iIndex>
13d70 3d 30 20 26 26 20 69 49 6e 64 65 78 3c 70 2d 3e  =0 && iIndex<p->
13d80 6e 49 6e 64 65 78 20 29 3b 0a 0a 20 20 2f 2a 20  nIndex );..  /* 
13d90 53 65 74 20 70 53 74 6d 74 20 74 6f 20 74 68 65  Set pStmt to the
13da0 20 63 6f 6d 70 69 6c 65 64 20 76 65 72 73 69 6f   compiled versio
13db0 6e 20 6f 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  n of:.  **.  ** 
13dc0 20 20 53 45 4c 45 43 54 20 6d 61 78 28 6c 65 76    SELECT max(lev
13dd0 65 6c 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  el) FROM %Q.'%q_
13de0 73 65 67 64 69 72 27 20 57 48 45 52 45 20 6c 65  segdir' WHERE le
13df0 76 65 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e  vel BETWEEN ? AN
13e00 44 20 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 31  D ?.  **.  ** (1
13e10 30 32 34 20 69 73 20 61 63 74 75 61 6c 6c 79 20  024 is actually 
13e20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 61 63  the value of mac
13e30 72 6f 20 46 54 53 33 5f 53 45 47 44 49 52 5f 50  ro FTS3_SEGDIR_P
13e40 52 45 46 49 58 4c 45 56 45 4c 5f 53 54 52 29 2e  REFIXLEVEL_STR).
13e50 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73  .  */.  rc = fts
13e60 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
13e70 53 45 4c 45 43 54 5f 53 45 47 44 49 52 5f 4d 41  SELECT_SEGDIR_MA
13e80 58 5f 4c 45 56 45 4c 2c 20 26 70 53 74 6d 74 2c  X_LEVEL, &pStmt,
13e90 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
13ea0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
13eb0 6e 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  n rc;.  sqlite3_
13ec0 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
13ed0 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c 75 74 65  , 1, getAbsolute
13ee0 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64  Level(p, iLangid
13ef0 2c 20 69 49 6e 64 65 78 2c 20 30 29 29 3b 0a 20  , iIndex, 0));. 
13f00 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
13f10 74 36 34 28 70 53 74 6d 74 2c 20 32 2c 20 0a 20  t64(pStmt, 2, . 
13f20 20 20 20 20 20 67 65 74 41 62 73 6f 6c 75 74 65       getAbsolute
13f30 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64  Level(p, iLangid
13f40 2c 20 69 49 6e 64 65 78 2c 20 46 54 53 33 5f 53  , iIndex, FTS3_S
13f50 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 2d 31  EGDIR_MAXLEVEL-1
13f60 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  ).  );.  if( SQL
13f70 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
13f80 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
13f90 20 20 20 20 2a 70 6e 4d 61 78 20 3d 20 73 71 6c      *pnMax = sql
13fa0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
13fb0 34 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d  4(pStmt, 0);.  }
13fc0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
13fd0 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
13fe0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
13ff0 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 74  all entries in t
14000 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61  he %_segments ta
14010 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
14020 69 74 68 20 74 68 65 20 73 65 67 6d 65 6e 74 0a  ith the segment.
14030 2a 2a 20 6f 70 65 6e 65 64 20 77 69 74 68 20 73  ** opened with s
14040 65 67 2d 72 65 61 64 65 72 20 70 53 65 67 2e 20  eg-reader pSeg. 
14050 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
14060 65 73 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68  es not affect th
14070 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66  e contents.** of
14080 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61   the %_segdir ta
14090 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
140a0 6e 74 20 66 74 73 33 44 65 6c 65 74 65 53 65 67  nt fts3DeleteSeg
140b0 6d 65 6e 74 28 0a 20 20 46 74 73 33 54 61 62 6c  ment(.  Fts3Tabl
140c0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
140d0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20 74          /* FTS t
140e0 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
140f0 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
14100 70 53 65 67 20 20 20 20 20 20 20 20 20 20 20 20  pSeg            
14110 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 64   /* Segment to d
14120 65 6c 65 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  elete */.){.  in
14130 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14140 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
14150 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
14160 20 20 69 66 28 20 70 53 65 67 2d 3e 69 53 74 61    if( pSeg->iSta
14170 72 74 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73  rtBlock ){.    s
14180 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65  qlite3_stmt *pDe
14190 6c 65 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  lete;        /* 
141a0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  SQL statement to
141b0 20 64 65 6c 65 74 65 20 72 6f 77 73 20 2a 2f 0a   delete rows */.
141c0 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c      rc = fts3Sql
141d0 53 74 6d 74 28 70 2c 20 53 51 4c 5f 44 45 4c 45  Stmt(p, SQL_DELE
141e0 54 45 5f 53 45 47 4d 45 4e 54 53 5f 52 41 4e 47  TE_SEGMENTS_RANG
141f0 45 2c 20 26 70 44 65 6c 65 74 65 2c 20 30 29 3b  E, &pDelete, 0);
14200 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
14210 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14220 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
14230 36 34 28 70 44 65 6c 65 74 65 2c 20 31 2c 20 70  64(pDelete, 1, p
14240 53 65 67 2d 3e 69 53 74 61 72 74 42 6c 6f 63 6b  Seg->iStartBlock
14250 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14260 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c  _bind_int64(pDel
14270 65 74 65 2c 20 32 2c 20 70 53 65 67 2d 3e 69 45  ete, 2, pSeg->iE
14280 6e 64 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  ndBlock);.      
14290 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 44 65  sqlite3_step(pDe
142a0 6c 65 74 65 29 3b 0a 20 20 20 20 20 20 72 63 20  lete);.      rc 
142b0 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
142c0 70 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 7d 0a  pDelete);.    }.
142d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
142e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
142f0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
14300 61 66 74 65 72 20 6d 65 72 67 69 6e 67 20 6d 75  after merging mu
14310 6c 74 69 70 6c 65 20 73 65 67 6d 65 6e 74 73 20  ltiple segments 
14320 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6c 61  into a single la
14330 72 67 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 74  rge.** segment t
14340 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6f 6c 64  o delete the old
14350 2c 20 6e 6f 77 20 72 65 64 75 6e 64 61 6e 74 2c  , now redundant,
14360 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 73   segment b-trees
14370 2e 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 0a  . Specifically,.
14380 2a 2a 20 69 74 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  ** it:.** .**   
14390 31 29 20 44 65 6c 65 74 65 73 20 61 6c 6c 20 25  1) Deletes all %
143a0 5f 73 65 67 6d 65 6e 74 73 20 65 6e 74 72 69 65  _segments entrie
143b0 73 20 66 6f 72 20 74 68 65 20 73 65 67 6d 65 6e  s for the segmen
143c0 74 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ts associated wi
143d0 74 68 20 0a 2a 2a 20 20 20 20 20 20 65 61 63 68  th .**      each
143e0 20 6f 66 20 74 68 65 20 53 65 67 52 65 61 64 65   of the SegReade
143f0 72 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65  r objects in the
14400 20 61 72 72 61 79 20 70 61 73 73 65 64 20 61 73   array passed as
14410 20 74 68 65 20 74 68 69 72 64 20 0a 2a 2a 20 20   the third .**  
14420 20 20 20 20 61 72 67 75 6d 65 6e 74 2c 20 61 6e      argument, an
14430 64 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 64 65 6c  d.**.**   2) del
14440 65 74 65 73 20 61 6c 6c 20 25 5f 73 65 67 64 69  etes all %_segdi
14450 72 20 65 6e 74 72 69 65 73 20 77 69 74 68 20 6c  r entries with l
14460 65 76 65 6c 20 69 4c 65 76 65 6c 2c 20 6f 72 20  evel iLevel, or 
14470 61 6c 6c 20 25 5f 73 65 67 64 69 72 0a 2a 2a 20  all %_segdir.** 
14480 20 20 20 20 20 65 6e 74 72 69 65 73 20 72 65 67       entries reg
14490 61 72 64 6c 65 73 73 20 6f 66 20 6c 65 76 65 6c  ardless of level
144a0 20 69 66 20 28 69 4c 65 76 65 6c 3c 30 29 2e 0a   if (iLevel<0)..
144b0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
144c0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
144d0 75 63 63 65 73 73 66 75 6c 2c 20 6f 74 68 65 72  uccessful, other
144e0 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65  wise an SQLite e
144f0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
14500 61 74 69 63 20 69 6e 74 20 66 74 73 33 44 65 6c  atic int fts3Del
14510 65 74 65 53 65 67 64 69 72 28 0a 20 20 46 74 73  eteSegdir(.  Fts
14520 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
14530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14540 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  Virtual table ha
14550 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ndle */.  int iL
14560 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20 20  angid,          
14570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e            /* Lan
14580 67 75 61 67 65 20 69 64 20 2a 2f 0a 20 20 69 6e  guage id */.  in
14590 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20 20 20  t iIndex,       
145a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
145b0 20 49 6e 64 65 78 20 66 6f 72 20 70 2d 3e 61 49   Index for p->aI
145c0 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ndex */.  int iL
145d0 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  evel,           
145e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76            /* Lev
145f0 65 6c 20 6f 66 20 25 5f 73 65 67 64 69 72 20 65  el of %_segdir e
14600 6e 74 72 69 65 73 20 74 6f 20 64 65 6c 65 74 65  ntries to delete
14610 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 52 65 61   */.  Fts3SegRea
14620 64 65 72 20 2a 2a 61 70 53 65 67 6d 65 6e 74 2c  der **apSegment,
14630 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
14640 66 20 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65  f SegReader obje
14650 63 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  cts */.  int nRe
14660 61 64 65 72 20 20 20 20 20 20 20 20 20 20 20 20  ader            
14670 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
14680 20 6f 66 20 61 72 72 61 79 20 61 70 53 65 67 6d   of array apSegm
14690 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
146a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
146b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
146c0 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
146d0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
146e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146f0 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
14700 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
14710 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74 65 20  3_stmt *pDelete 
14720 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 51 4c  = 0;      /* SQL
14730 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 64 65   statement to de
14740 6c 65 74 65 20 72 6f 77 73 20 2a 2f 0a 0a 20 20  lete rows */..  
14750 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
14760 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 52 65 61  ITE_OK && i<nRea
14770 64 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  der; i++){.    r
14780 63 20 3d 20 66 74 73 33 44 65 6c 65 74 65 53 65  c = fts3DeleteSe
14790 67 6d 65 6e 74 28 70 2c 20 61 70 53 65 67 6d 65  gment(p, apSegme
147a0 6e 74 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66  nt[i]);.  }.  if
147b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
147c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
147d0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
147e0 20 69 4c 65 76 65 6c 3e 3d 30 20 7c 7c 20 69 4c   iLevel>=0 || iL
147f0 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55  evel==FTS3_SEGCU
14800 52 53 4f 52 5f 41 4c 4c 20 29 3b 0a 20 20 69 66  RSOR_ALL );.  if
14810 28 20 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53  ( iLevel==FTS3_S
14820 45 47 43 55 52 53 4f 52 5f 41 4c 4c 20 29 7b 0a  EGCURSOR_ALL ){.
14830 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c      rc = fts3Sql
14840 53 74 6d 74 28 70 2c 20 53 51 4c 5f 44 45 4c 45  Stmt(p, SQL_DELE
14850 54 45 5f 53 45 47 44 49 52 5f 52 41 4e 47 45 2c  TE_SEGDIR_RANGE,
14860 20 26 70 44 65 6c 65 74 65 2c 20 30 29 3b 0a 20   &pDelete, 0);. 
14870 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14880 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
14890 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
148a0 28 70 44 65 6c 65 74 65 2c 20 31 2c 20 67 65 74  (pDelete, 1, get
148b0 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c  AbsoluteLevel(p,
148c0 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78   iLangid, iIndex
148d0 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  , 0));.      sql
148e0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
148f0 70 44 65 6c 65 74 65 2c 20 32 2c 20 0a 20 20 20  pDelete, 2, .   
14900 20 20 20 20 20 20 20 67 65 74 41 62 73 6f 6c 75         getAbsolu
14910 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67  teLevel(p, iLang
14920 69 64 2c 20 69 49 6e 64 65 78 2c 20 46 54 53 33  id, iIndex, FTS3
14930 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c  _SEGDIR_MAXLEVEL
14940 2d 31 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  -1).      );.   
14950 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
14960 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
14970 28 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53  (p, SQL_DELETE_S
14980 45 47 44 49 52 5f 4c 45 56 45 4c 2c 20 26 70 44  EGDIR_LEVEL, &pD
14990 65 6c 65 74 65 2c 20 30 29 3b 0a 20 20 20 20 69  elete, 0);.    i
149a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
149b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
149c0 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 0a 20 20  3_bind_int64(.  
149d0 20 20 20 20 20 20 20 20 70 44 65 6c 65 74 65 2c          pDelete,
149e0 20 31 2c 20 67 65 74 41 62 73 6f 6c 75 74 65 4c   1, getAbsoluteL
149f0 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c  evel(p, iLangid,
14a00 20 69 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 29   iIndex, iLevel)
14a10 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
14a20 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
14a30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14a40 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 44 65  sqlite3_step(pDe
14a50 6c 65 74 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  lete);.    rc = 
14a60 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 44  sqlite3_reset(pD
14a70 65 6c 65 74 65 29 3b 0a 20 20 7d 0a 0a 20 20 72  elete);.  }..  r
14a80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14a90 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  ** When this fun
14aa0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
14ab0 20 62 75 66 66 65 72 20 2a 70 70 4c 69 73 74 20   buffer *ppList 
14ac0 28 73 69 7a 65 20 2a 70 6e 4c 69 73 74 20 62 79  (size *pnList by
14ad0 74 65 73 29 20 63 6f 6e 74 61 69 6e 73 20 0a 2a  tes) contains .*
14ae0 2a 20 61 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  * a position lis
14af0 74 20 74 68 61 74 20 6d 61 79 20 28 6f 72 20 6d  t that may (or m
14b00 61 79 20 6e 6f 74 29 20 66 65 61 74 75 72 65 20  ay not) feature 
14b10 6d 75 6c 74 69 70 6c 65 20 63 6f 6c 75 6d 6e 73  multiple columns
14b20 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
14b30 6f 6e 20 61 64 6a 75 73 74 73 20 74 68 65 20 70  on adjusts the p
14b40 6f 69 6e 74 65 72 20 2a 70 70 4c 69 73 74 20 61  ointer *ppList a
14b50 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 20 2a 70  nd the length *p
14b60 6e 4c 69 73 74 20 73 6f 20 74 68 61 74 20 74 68  nList so that th
14b70 65 79 0a 2a 2a 20 69 64 65 6e 74 69 66 79 20 74  ey.** identify t
14b80 68 65 20 73 75 62 73 65 74 20 6f 66 20 74 68 65  he subset of the
14b90 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 74   position list t
14ba0 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
14bb0 74 6f 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 0a  to column iCol..
14bc0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
14bd0 72 65 20 6e 6f 20 65 6e 74 72 69 65 73 20 69 6e  re no entries in
14be0 20 74 68 65 20 69 6e 70 75 74 20 70 6f 73 69 74   the input posit
14bf0 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 63 6f 6c  ion list for col
14c00 75 6d 6e 20 69 43 6f 6c 2c 20 74 68 65 6e 0a 2a  umn iCol, then.*
14c10 2a 20 2a 70 6e 4c 69 73 74 20 69 73 20 73 65 74  * *pnList is set
14c20 20 74 6f 20 7a 65 72 6f 20 62 65 66 6f 72 65 20   to zero before 
14c30 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
14c40 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 43 6f  atic void fts3Co
14c50 6c 75 6d 6e 46 69 6c 74 65 72 28 0a 20 20 69 6e  lumnFilter(.  in
14c60 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  t iCol,         
14c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14c80 20 43 6f 6c 75 6d 6e 20 74 6f 20 66 69 6c 74 65   Column to filte
14c90 72 20 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  r on */.  char *
14ca0 2a 70 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20  *ppList,        
14cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
14cc0 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20  OUT: Pointer to 
14cd0 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  position list */
14ce0 0a 20 20 69 6e 74 20 2a 70 6e 4c 69 73 74 20 20  .  int *pnList  
14cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d00 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 69     /* IN/OUT: Si
14d10 7a 65 20 6f 66 20 62 75 66 66 65 72 20 2a 70 70  ze of buffer *pp
14d20 4c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  List in bytes */
14d30 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 4c 69 73  .){.  char *pLis
14d40 74 20 3d 20 2a 70 70 4c 69 73 74 3b 0a 20 20 69  t = *ppList;.  i
14d50 6e 74 20 6e 4c 69 73 74 20 3d 20 2a 70 6e 4c 69  nt nList = *pnLi
14d60 73 74 3b 0a 20 20 63 68 61 72 20 2a 70 45 6e 64  st;.  char *pEnd
14d70 20 3d 20 26 70 4c 69 73 74 5b 6e 4c 69 73 74 5d   = &pList[nList]
14d80 3b 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74  ;.  int iCurrent
14d90 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 70 20   = 0;.  char *p 
14da0 3d 20 70 4c 69 73 74 3b 0a 0a 20 20 61 73 73 65  = pList;..  asse
14db0 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20  rt( iCol>=0 );. 
14dc0 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
14dd0 20 63 68 61 72 20 63 20 3d 20 30 3b 0a 20 20 20   char c = 0;.   
14de0 20 77 68 69 6c 65 28 20 70 3c 70 45 6e 64 20 26   while( p<pEnd &
14df0 26 20 28 63 20 7c 20 2a 70 29 26 30 78 46 45 20  & (c | *p)&0xFE 
14e00 29 20 63 20 3d 20 2a 70 2b 2b 20 26 20 30 78 38  ) c = *p++ & 0x8
14e10 30 3b 0a 20 20 0a 20 20 20 20 69 66 28 20 69 43  0;.  .    if( iC
14e20 6f 6c 3d 3d 69 43 75 72 72 65 6e 74 20 29 7b 0a  ol==iCurrent ){.
14e30 20 20 20 20 20 20 6e 4c 69 73 74 20 3d 20 28 69        nList = (i
14e40 6e 74 29 28 70 20 2d 20 70 4c 69 73 74 29 3b 0a  nt)(p - pList);.
14e50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14e60 20 7d 0a 0a 20 20 20 20 6e 4c 69 73 74 20 2d 3d   }..    nList -=
14e70 20 28 69 6e 74 29 28 70 20 2d 20 70 4c 69 73 74   (int)(p - pList
14e80 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  );.    pList = p
14e90 3b 0a 20 20 20 20 69 66 28 20 6e 4c 69 73 74 3d  ;.    if( nList=
14ea0 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61  =0 ){.      brea
14eb0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d  k;.    }.    p =
14ec0 20 26 70 4c 69 73 74 5b 31 5d 3b 0a 20 20 20 20   &pList[1];.    
14ed0 70 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  p += sqlite3Fts3
14ee0 47 65 74 56 61 72 69 6e 74 33 32 28 70 2c 20 26  GetVarint32(p, &
14ef0 69 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 0a  iCurrent);.  }..
14f00 20 20 2a 70 70 4c 69 73 74 20 3d 20 70 4c 69 73    *ppList = pLis
14f10 74 3b 0a 20 20 2a 70 6e 4c 69 73 74 20 3d 20 6e  t;.  *pnList = n
14f20 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  List;.}../*.** C
14f30 61 63 68 65 20 64 61 74 61 20 69 6e 20 74 68 65  ache data in the
14f40 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61   Fts3MultiSegRea
14f50 64 65 72 2e 61 42 75 66 66 65 72 5b 5d 20 62 75  der.aBuffer[] bu
14f60 66 66 65 72 20 28 6f 76 65 72 77 72 69 74 69 6e  ffer (overwritin
14f70 67 20 61 6e 79 0a 2a 2a 20 65 78 69 73 74 69 6e  g any.** existin
14f80 67 20 64 61 74 61 29 2e 20 47 72 6f 77 20 74 68  g data). Grow th
14f90 65 20 62 75 66 66 65 72 20 69 66 20 72 65 71 75  e buffer if requ
14fa0 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ired..**.** If s
14fb0 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
14fc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68  n SQLITE_OK. Oth
14fd0 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 4f 4f  erwise, if an OO
14fe0 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  M error is encou
14ff0 6e 74 65 72 65 64 0a 2a 2a 20 74 72 79 69 6e 67  ntered.** trying
15000 20 74 6f 20 72 65 73 69 7a 65 20 74 68 65 20 62   to resize the b
15010 75 66 66 65 72 2c 20 72 65 74 75 72 6e 20 53 51  uffer, return SQ
15020 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73  LITE_NOMEM..*/.s
15030 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 4d 73  tatic int fts3Ms
15040 72 42 75 66 66 65 72 44 61 74 61 28 0a 20 20 46  rBufferData(.  F
15050 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
15060 72 20 2a 70 4d 73 72 2c 20 20 20 20 20 20 20 2f  r *pMsr,       /
15070 2a 20 4d 75 6c 74 69 2d 73 65 67 6d 65 6e 74 2d  * Multi-segment-
15080 72 65 61 64 65 72 20 68 61 6e 64 6c 65 20 2a 2f  reader handle */
15090 0a 20 20 63 68 61 72 20 2a 70 4c 69 73 74 2c 0a  .  char *pList,.
150a0 20 20 69 6e 74 20 6e 4c 69 73 74 0a 29 7b 0a 20    int nList.){. 
150b0 20 69 66 28 20 6e 4c 69 73 74 3e 70 4d 73 72 2d   if( nList>pMsr-
150c0 3e 6e 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20  >nBuffer ){.    
150d0 63 68 61 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20  char *pNew;.    
150e0 70 4d 73 72 2d 3e 6e 42 75 66 66 65 72 20 3d 20  pMsr->nBuffer = 
150f0 6e 4c 69 73 74 2a 32 3b 0a 20 20 20 20 70 4e 65  nList*2;.    pNe
15100 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  w = (char *)sqli
15110 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4d 73 72  te3_realloc(pMsr
15120 2d 3e 61 42 75 66 66 65 72 2c 20 70 4d 73 72 2d  ->aBuffer, pMsr-
15130 3e 6e 42 75 66 66 65 72 29 3b 0a 20 20 20 20 69  >nBuffer);.    i
15140 66 28 20 21 70 4e 65 77 20 29 20 72 65 74 75 72  f( !pNew ) retur
15150 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
15160 20 20 20 20 70 4d 73 72 2d 3e 61 42 75 66 66 65      pMsr->aBuffe
15170 72 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20  r = pNew;.  }.. 
15180 20 6d 65 6d 63 70 79 28 70 4d 73 72 2d 3e 61 42   memcpy(pMsr->aB
15190 75 66 66 65 72 2c 20 70 4c 69 73 74 2c 20 6e 4c  uffer, pList, nL
151a0 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ist);.  return S
151b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74  QLITE_OK;.}..int
151c0 20 73 71 6c 69 74 65 33 46 74 73 33 4d 73 72 49   sqlite3Fts3MsrI
151d0 6e 63 72 4e 65 78 74 28 0a 20 20 46 74 73 33 54  ncrNext(.  Fts3T
151e0 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
151f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69             /* Vi
15200 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64  rtual table hand
15210 6c 65 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74  le */.  Fts3Mult
15220 69 53 65 67 52 65 61 64 65 72 20 2a 70 4d 73 72  iSegReader *pMsr
15230 2c 20 20 20 20 20 20 20 2f 2a 20 4d 75 6c 74 69  ,       /* Multi
15240 2d 73 65 67 6d 65 6e 74 2d 72 65 61 64 65 72 20  -segment-reader 
15250 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69  handle */.  sqli
15260 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 44 6f 63  te3_int64 *piDoc
15270 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  id,         /* O
15280 55 54 3a 20 44 6f 63 69 64 20 76 61 6c 75 65 20  UT: Docid value 
15290 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 61 50 6f  */.  char **paPo
152a0 73 6c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  slist,          
152b0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69       /* OUT: Poi
152c0 6e 74 65 72 20 74 6f 20 70 6f 73 69 74 69 6f 6e  nter to position
152d0 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a   list */.  int *
152e0 70 6e 50 6f 73 6c 69 73 74 20 20 20 20 20 20 20  pnPoslist       
152f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
15300 54 3a 20 53 69 7a 65 20 6f 66 20 70 6f 73 69 74  T: Size of posit
15310 69 6f 6e 20 6c 69 73 74 20 69 6e 20 62 79 74 65  ion list in byte
15320 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4d  s */.){.  int nM
15330 65 72 67 65 20 3d 20 70 4d 73 72 2d 3e 6e 41 64  erge = pMsr->nAd
15340 76 61 6e 63 65 3b 0a 20 20 46 74 73 33 53 65 67  vance;.  Fts3Seg
15350 52 65 61 64 65 72 20 2a 2a 61 70 53 65 67 6d 65  Reader **apSegme
15360 6e 74 20 3d 20 70 4d 73 72 2d 3e 61 70 53 65 67  nt = pMsr->apSeg
15370 6d 65 6e 74 3b 0a 20 20 69 6e 74 20 28 2a 78 43  ment;.  int (*xC
15380 6d 70 29 28 46 74 73 33 53 65 67 52 65 61 64 65  mp)(Fts3SegReade
15390 72 20 2a 2c 20 46 74 73 33 53 65 67 52 65 61 64  r *, Fts3SegRead
153a0 65 72 20 2a 29 20 3d 20 28 0a 20 20 20 20 70 2d  er *) = (.    p-
153b0 3e 62 44 65 73 63 49 64 78 20 3f 20 66 74 73 33  >bDescIdx ? fts3
153c0 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74  SegReaderDoclist
153d0 43 6d 70 52 65 76 20 3a 20 66 74 73 33 53 65 67  CmpRev : fts3Seg
153e0 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70  ReaderDoclistCmp
153f0 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 6e 4d 65  .  );..  if( nMe
15400 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  rge==0 ){.    *p
15410 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b 0a 20 20  aPoslist = 0;.  
15420 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15430 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  OK;.  }..  while
15440 28 20 31 20 29 7b 0a 20 20 20 20 46 74 73 33 53  ( 1 ){.    Fts3S
15450 65 67 52 65 61 64 65 72 20 2a 70 53 65 67 3b 0a  egReader *pSeg;.
15460 20 20 20 20 70 53 65 67 20 3d 20 70 4d 73 72 2d      pSeg = pMsr-
15470 3e 61 70 53 65 67 6d 65 6e 74 5b 30 5d 3b 0a 0a  >apSegment[0];..
15480 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4f      if( pSeg->pO
15490 66 66 73 65 74 4c 69 73 74 3d 3d 30 20 29 7b 0a  ffsetList==0 ){.
154a0 20 20 20 20 20 20 2a 70 61 50 6f 73 6c 69 73 74        *paPoslist
154b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
154c0 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
154d0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
154e0 20 20 63 68 61 72 20 2a 70 4c 69 73 74 3b 0a 20    char *pList;. 
154f0 20 20 20 20 20 69 6e 74 20 6e 4c 69 73 74 3b 0a       int nList;.
15500 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
15510 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
15520 20 69 44 6f 63 69 64 20 3d 20 61 70 53 65 67 6d   iDocid = apSegm
15530 65 6e 74 5b 30 5d 2d 3e 69 44 6f 63 69 64 3b 0a  ent[0]->iDocid;.
15540 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33  .      rc = fts3
15550 53 65 67 52 65 61 64 65 72 4e 65 78 74 44 6f 63  SegReaderNextDoc
15560 69 64 28 70 2c 20 61 70 53 65 67 6d 65 6e 74 5b  id(p, apSegment[
15570 30 5d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69  0], &pList, &nLi
15580 73 74 29 3b 0a 20 20 20 20 20 20 6a 20 3d 20 31  st);.      j = 1
15590 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 72  ;.      while( r
155a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20  c==SQLITE_OK .  
155b0 20 20 20 20 20 20 26 26 20 6a 3c 6e 4d 65 72 67        && j<nMerg
155c0 65 0a 20 20 20 20 20 20 20 20 26 26 20 61 70 53  e.        && apS
155d0 65 67 6d 65 6e 74 5b 6a 5d 2d 3e 70 4f 66 66 73  egment[j]->pOffs
155e0 65 74 4c 69 73 74 0a 20 20 20 20 20 20 20 20 26  etList.        &
155f0 26 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2d 3e  & apSegment[j]->
15600 69 44 6f 63 69 64 3d 3d 69 44 6f 63 69 64 0a 20  iDocid==iDocid. 
15610 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
15620 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64  rc = fts3SegRead
15630 65 72 4e 65 78 74 44 6f 63 69 64 28 70 2c 20 61  erNextDocid(p, a
15640 70 53 65 67 6d 65 6e 74 5b 6a 5d 2c 20 30 2c 20  pSegment[j], 0, 
15650 30 29 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b  0);.        j++;
15660 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
15670 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15680 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
15690 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65      fts3SegReade
156a0 72 53 6f 72 74 28 70 4d 73 72 2d 3e 61 70 53 65  rSort(pMsr->apSe
156b0 67 6d 65 6e 74 2c 20 6e 4d 65 72 67 65 2c 20 6a  gment, nMerge, j
156c0 2c 20 78 43 6d 70 29 3b 0a 0a 20 20 20 20 20 20  , xCmp);..      
156d0 69 66 28 20 70 4d 73 72 2d 3e 69 43 6f 6c 46 69  if( pMsr->iColFi
156e0 6c 74 65 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20  lter>=0 ){.     
156f0 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e 46 69 6c     fts3ColumnFil
15700 74 65 72 28 70 4d 73 72 2d 3e 69 43 6f 6c 46 69  ter(pMsr->iColFi
15710 6c 74 65 72 2c 20 26 70 4c 69 73 74 2c 20 26 6e  lter, &pList, &n
15720 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  List);.      }..
15730 20 20 20 20 20 20 69 66 28 20 6e 4c 69 73 74 3e        if( nList>
15740 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
15750 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49 73   fts3SegReaderIs
15760 50 65 6e 64 69 6e 67 28 61 70 53 65 67 6d 65 6e  Pending(apSegmen
15770 74 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  t[0]) ){.       
15780 20 20 20 72 63 20 3d 20 66 74 73 33 4d 73 72 42     rc = fts3MsrB
15790 75 66 66 65 72 44 61 74 61 28 70 4d 73 72 2c 20  ufferData(pMsr, 
157a0 70 4c 69 73 74 2c 20 6e 4c 69 73 74 2b 31 29 3b  pList, nList+1);
157b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
157c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
157d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
157e0 20 20 20 20 2a 70 61 50 6f 73 6c 69 73 74 20 3d      *paPoslist =
157f0 20 70 4d 73 72 2d 3e 61 42 75 66 66 65 72 3b 0a   pMsr->aBuffer;.
15800 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
15810 28 20 28 70 4d 73 72 2d 3e 61 42 75 66 66 65 72  ( (pMsr->aBuffer
15820 5b 6e 4c 69 73 74 5d 20 26 20 30 78 46 45 29 3d  [nList] & 0xFE)=
15830 3d 30 78 30 30 20 29 3b 0a 20 20 20 20 20 20 20  =0x00 );.       
15840 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15850 20 20 2a 70 61 50 6f 73 6c 69 73 74 20 3d 20 70    *paPoslist = p
15860 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  List;.        }.
15870 20 20 20 20 20 20 20 20 2a 70 69 44 6f 63 69 64          *piDocid
15880 20 3d 20 69 44 6f 63 69 64 3b 0a 20 20 20 20 20   = iDocid;.     
15890 20 20 20 2a 70 6e 50 6f 73 6c 69 73 74 20 3d 20     *pnPoslist = 
158a0 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 62  nList;.        b
158b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
158c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
158d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
158e0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53  static int fts3S
158f0 65 67 52 65 61 64 65 72 53 74 61 72 74 28 0a 20  egReaderStart(. 
15900 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
15910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15920 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
15930 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74  e handle */.  Ft
15940 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
15950 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 2f 2a   *pCsr,       /*
15960 20 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a   Cursor object *
15970 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
15980 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  zTerm,          
15990 20 20 20 20 2f 2a 20 54 65 72 6d 20 73 65 61 72      /* Term sear
159a0 63 68 65 64 20 66 6f 72 20 28 6f 72 20 4e 55 4c  ched for (or NUL
159b0 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72  L) */.  int nTer
159c0 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
159d0 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
159e0 68 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62 79  h of zTerm in by
159f0 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tes */.){.  int 
15a00 69 3b 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d 20  i;.  int nSeg = 
15a10 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a  pCsr->nSegment;.
15a20 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46 74 73  .  /* If the Fts
15a30 33 53 65 67 46 69 6c 74 65 72 20 64 65 66 69 6e  3SegFilter defin
15a40 65 73 20 61 20 73 70 65 63 69 66 69 63 20 74 65  es a specific te
15a50 72 6d 20 28 6f 72 20 74 65 72 6d 20 70 72 65 66  rm (or term pref
15a60 69 78 29 20 74 6f 20 73 65 61 72 63 68 20 0a 20  ix) to search . 
15a70 20 2a 2a 20 66 6f 72 2c 20 74 68 65 6e 20 61 64   ** for, then ad
15a80 76 61 6e 63 65 20 65 61 63 68 20 73 65 67 6d 65  vance each segme
15a90 6e 74 20 69 74 65 72 61 74 6f 72 20 75 6e 74 69  nt iterator unti
15aa0 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  l it points to a
15ab0 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 65 71   term of.  ** eq
15ac0 75 61 6c 20 6f 72 20 67 72 65 61 74 65 72 20 76  ual or greater v
15ad0 61 6c 75 65 20 74 68 61 6e 20 74 68 65 20 73 70  alue than the sp
15ae0 65 63 69 66 69 65 64 20 74 65 72 6d 2e 20 54 68  ecified term. Th
15af0 69 73 20 70 72 65 76 65 6e 74 73 20 6d 61 6e 79  is prevents many
15b00 0a 20 20 2a 2a 20 75 6e 6e 65 63 65 73 73 61 72  .  ** unnecessar
15b10 79 20 6d 65 72 67 65 2f 73 6f 72 74 20 6f 70 65  y merge/sort ope
15b20 72 61 74 69 6f 6e 73 20 66 6f 72 20 74 68 65 20  rations for the 
15b30 63 61 73 65 20 77 68 65 72 65 20 73 69 6e 67 6c  case where singl
15b40 65 20 73 65 67 6d 65 6e 74 0a 20 20 2a 2a 20 62  e segment.  ** b
15b50 2d 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73  -tree leaf nodes
15b60 20 63 6f 6e 74 61 69 6e 20 6d 6f 72 65 20 74 68   contain more th
15b70 61 6e 20 6f 6e 65 20 74 65 72 6d 2e 0a 20 20 2a  an one term..  *
15b80 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 43 73  /.  for(i=0; pCs
15b90 72 2d 3e 62 52 65 73 74 61 72 74 3d 3d 30 20 26  r->bRestart==0 &
15ba0 26 20 69 3c 70 43 73 72 2d 3e 6e 53 65 67 6d 65  & i<pCsr->nSegme
15bb0 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  nt; i++){.    in
15bc0 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 46  t res = 0;.    F
15bd0 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 53  ts3SegReader *pS
15be0 65 67 20 3d 20 70 43 73 72 2d 3e 61 70 53 65 67  eg = pCsr->apSeg
15bf0 6d 65 6e 74 5b 69 5d 3b 0a 20 20 20 20 64 6f 20  ment[i];.    do 
15c00 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  {.      int rc =
15c10 20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e 65   fts3SegReaderNe
15c20 78 74 28 70 2c 20 70 53 65 67 2c 20 30 29 3b 0a  xt(p, pSeg, 0);.
15c30 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
15c40 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
15c50 20 72 63 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28   rc;.    }while(
15c60 20 7a 54 65 72 6d 20 26 26 20 28 72 65 73 20 3d   zTerm && (res =
15c70 20 66 74 73 33 53 65 67 52 65 61 64 65 72 54 65   fts3SegReaderTe
15c80 72 6d 43 6d 70 28 70 53 65 67 2c 20 7a 54 65 72  rmCmp(pSeg, zTer
15c90 6d 2c 20 6e 54 65 72 6d 29 29 3c 30 20 29 3b 0a  m, nTerm))<0 );.
15ca0 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 62  .    if( pSeg->b
15cb0 4c 6f 6f 6b 75 70 20 26 26 20 72 65 73 21 3d 30  Lookup && res!=0
15cc0 20 29 7b 0a 20 20 20 20 20 20 66 74 73 33 53 65   ){.      fts3Se
15cd0 67 52 65 61 64 65 72 53 65 74 45 6f 66 28 70 53  gReaderSetEof(pS
15ce0 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eg);.    }.  }. 
15cf0 20 66 74 73 33 53 65 67 52 65 61 64 65 72 53 6f   fts3SegReaderSo
15d00 72 74 28 70 43 73 72 2d 3e 61 70 53 65 67 6d 65  rt(pCsr->apSegme
15d10 6e 74 2c 20 6e 53 65 67 2c 20 6e 53 65 67 2c 20  nt, nSeg, nSeg, 
15d20 66 74 73 33 53 65 67 52 65 61 64 65 72 43 6d 70  fts3SegReaderCmp
15d30 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  );..  return SQL
15d40 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73  ITE_OK;.}..int s
15d50 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61  qlite3Fts3SegRea
15d60 64 65 72 53 74 61 72 74 28 0a 20 20 46 74 73 33  derStart(.  Fts3
15d70 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
15d80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
15d90 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
15da0 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c  dle */.  Fts3Mul
15db0 74 69 53 65 67 52 65 61 64 65 72 20 2a 70 43 73  tiSegReader *pCs
15dc0 72 2c 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73  r,       /* Curs
15dd0 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  or object */.  F
15de0 74 73 33 53 65 67 46 69 6c 74 65 72 20 2a 70 46  ts3SegFilter *pF
15df0 69 6c 74 65 72 20 20 20 20 20 20 20 20 20 20 2f  ilter          /
15e00 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 6f  * Restrictions o
15e10 6e 20 72 61 6e 67 65 20 6f 66 20 69 74 65 72 61  n range of itera
15e20 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 70 43 73  tion */.){.  pCs
15e30 72 2d 3e 70 46 69 6c 74 65 72 20 3d 20 70 46 69  r->pFilter = pFi
15e40 6c 74 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 66  lter;.  return f
15e50 74 73 33 53 65 67 52 65 61 64 65 72 53 74 61 72  ts3SegReaderStar
15e60 74 28 70 2c 20 70 43 73 72 2c 20 70 46 69 6c 74  t(p, pCsr, pFilt
15e70 65 72 2d 3e 7a 54 65 72 6d 2c 20 70 46 69 6c 74  er->zTerm, pFilt
15e80 65 72 2d 3e 6e 54 65 72 6d 29 3b 0a 7d 0a 0a 69  er->nTerm);.}..i
15e90 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 4d 73  nt sqlite3Fts3Ms
15ea0 72 49 6e 63 72 53 74 61 72 74 28 0a 20 20 46 74  rIncrStart(.  Ft
15eb0 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
15ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15ed0 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68   Virtual table h
15ee0 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 4d  andle */.  Fts3M
15ef0 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70  ultiSegReader *p
15f00 43 73 72 2c 20 20 20 20 20 20 20 2f 2a 20 43 75  Csr,       /* Cu
15f10 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  rsor object */. 
15f20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20   int iCol,      
15f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f40 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 6d 61   /* Column to ma
15f50 74 63 68 20 6f 6e 2e 20 2a 2f 0a 20 20 63 6f 6e  tch on. */.  con
15f60 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20  st char *zTerm, 
15f70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15f80 54 65 72 6d 20 74 6f 20 69 74 65 72 61 74 65 20  Term to iterate 
15f90 74 68 72 6f 75 67 68 20 61 20 64 6f 63 6c 69 73  through a doclis
15fa0 74 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  t for */.  int n
15fb0 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
15fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
15fd0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
15fe0 20 7a 54 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69   zTerm */.){.  i
15ff0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nt i;.  int rc;.
16000 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d    int nSegment =
16010 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b   pCsr->nSegment;
16020 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70 29 28 46  .  int (*xCmp)(F
16030 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2c 20  ts3SegReader *, 
16040 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 29  Fts3SegReader *)
16050 20 3d 20 28 0a 20 20 20 20 70 2d 3e 62 44 65 73   = (.    p->bDes
16060 63 49 64 78 20 3f 20 66 74 73 33 53 65 67 52 65  cIdx ? fts3SegRe
16070 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 52 65  aderDoclistCmpRe
16080 76 20 3a 20 66 74 73 33 53 65 67 52 65 61 64 65  v : fts3SegReade
16090 72 44 6f 63 6c 69 73 74 43 6d 70 0a 20 20 29 3b  rDoclistCmp.  );
160a0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72  ..  assert( pCsr
160b0 2d 3e 70 46 69 6c 74 65 72 3d 3d 30 20 29 3b 0a  ->pFilter==0 );.
160c0 20 20 61 73 73 65 72 74 28 20 7a 54 65 72 6d 20    assert( zTerm 
160d0 26 26 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20  && nTerm>0 );.. 
160e0 20 2f 2a 20 41 64 76 61 6e 63 65 20 65 61 63 68   /* Advance each
160f0 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f   segment iterato
16100 72 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74  r until it point
16110 73 20 74 6f 20 74 68 65 20 74 65 72 6d 20 7a 54  s to the term zT
16120 65 72 6d 2f 6e 54 65 72 6d 2e 20 2a 2f 0a 20 20  erm/nTerm. */.  
16130 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64  rc = fts3SegRead
16140 65 72 53 74 61 72 74 28 70 2c 20 70 43 73 72 2c  erStart(p, pCsr,
16150 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   zTerm, nTerm);.
16160 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16170 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
16180 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65  ..  /* Determine
16190 20 68 6f 77 20 6d 61 6e 79 20 6f 66 20 74 68 65   how many of the
161a0 20 73 65 67 6d 65 6e 74 73 20 61 63 74 75 61 6c   segments actual
161b0 6c 79 20 70 6f 69 6e 74 20 74 6f 20 7a 54 65 72  ly point to zTer
161c0 6d 2f 6e 54 65 72 6d 2e 20 2a 2f 0a 20 20 66 6f  m/nTerm. */.  fo
161d0 72 28 69 3d 30 3b 20 69 3c 6e 53 65 67 6d 65 6e  r(i=0; i<nSegmen
161e0 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73  t; i++){.    Fts
161f0 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67  3SegReader *pSeg
16200 20 3d 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65   = pCsr->apSegme
16210 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 21  nt[i];.    if( !
16220 70 53 65 67 2d 3e 61 4e 6f 64 65 20 7c 7c 20 66  pSeg->aNode || f
16230 74 73 33 53 65 67 52 65 61 64 65 72 54 65 72 6d  ts3SegReaderTerm
16240 43 6d 70 28 70 53 65 67 2c 20 7a 54 65 72 6d 2c  Cmp(pSeg, zTerm,
16250 20 6e 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 20   nTerm) ){.     
16260 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
16270 7d 0a 20 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e  }.  pCsr->nAdvan
16280 63 65 20 3d 20 69 3b 0a 0a 20 20 2f 2a 20 41 64  ce = i;..  /* Ad
16290 76 61 6e 63 65 20 65 61 63 68 20 6f 66 20 74 68  vance each of th
162a0 65 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 70 6f  e segments to po
162b0 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  int to the first
162c0 20 64 6f 63 69 64 2e 20 2a 2f 0a 20 20 66 6f 72   docid. */.  for
162d0 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 41  (i=0; i<pCsr->nA
162e0 64 76 61 6e 63 65 3b 20 69 2b 2b 29 7b 0a 20 20  dvance; i++){.  
162f0 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65    rc = fts3SegRe
16300 61 64 65 72 46 69 72 73 74 44 6f 63 69 64 28 70  aderFirstDocid(p
16310 2c 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e  , pCsr->apSegmen
16320 74 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  t[i]);.    if( r
16330 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
16340 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
16350 66 74 73 33 53 65 67 52 65 61 64 65 72 53 6f 72  fts3SegReaderSor
16360 74 28 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e  t(pCsr->apSegmen
16370 74 2c 20 69 2c 20 69 2c 20 78 43 6d 70 29 3b 0a  t, i, i, xCmp);.
16380 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3c  .  assert( iCol<
16390 30 20 7c 7c 20 69 43 6f 6c 3c 70 2d 3e 6e 43 6f  0 || iCol<p->nCo
163a0 6c 75 6d 6e 20 29 3b 0a 20 20 70 43 73 72 2d 3e  lumn );.  pCsr->
163b0 69 43 6f 6c 46 69 6c 74 65 72 20 3d 20 69 43 6f  iColFilter = iCo
163c0 6c 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  l;..  return SQL
163d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
163e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
163f0 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 4d 75  s called on a Mu
16400 6c 74 69 53 65 67 52 65 61 64 65 72 20 74 68 61  ltiSegReader tha
16410 74 20 68 61 73 20 62 65 65 6e 20 73 74 61 72 74  t has been start
16420 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  ed using.** sqli
16430 74 65 33 46 74 73 33 4d 73 72 49 6e 63 72 53 74  te3Fts3MsrIncrSt
16440 61 72 74 28 29 2e 20 4f 6e 65 20 6f 72 20 6d 6f  art(). One or mo
16450 72 65 20 63 61 6c 6c 73 20 74 6f 20 4d 73 72 49  re calls to MsrI
16460 6e 63 72 4e 65 78 74 28 29 20 6d 61 79 20 61 6c  ncrNext() may al
16470 73 6f 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  so.** have been 
16480 6d 61 64 65 2e 20 43 61 6c 6c 69 6e 67 20 74 68  made. Calling th
16490 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 75 74 73  is function puts
164a0 20 74 68 65 20 4d 75 6c 74 69 53 65 67 52 65 61   the MultiSegRea
164b0 64 65 72 20 69 6e 20 73 75 63 68 0a 2a 2a 20 61  der in such.** a
164c0 20 73 74 61 74 65 20 74 68 61 74 20 69 66 20 74   state that if t
164d0 68 65 20 6e 65 78 74 20 74 77 6f 20 63 61 6c 6c  he next two call
164e0 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 73  s are:.**.**   s
164f0 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61  qlite3Fts3SegRea
16500 64 65 72 53 74 61 72 74 28 29 0a 2a 2a 20 20 20  derStart().**   
16510 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
16520 61 64 65 72 53 74 65 70 28 29 0a 2a 2a 0a 2a 2a  aderStep().**.**
16530 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65   then the entire
16540 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 65   doclist for the
16550 20 74 65 72 6d 20 69 73 20 61 76 61 69 6c 61 62   term is availab
16560 6c 65 20 69 6e 20 0a 2a 2a 20 4d 75 6c 74 69 53  le in .** MultiS
16570 65 67 52 65 61 64 65 72 2e 61 44 6f 63 6c 69 73  egReader.aDoclis
16580 74 2f 6e 44 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 69  t/nDoclist..*/.i
16590 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 4d 73  nt sqlite3Fts3Ms
165a0 72 49 6e 63 72 52 65 73 74 61 72 74 28 46 74 73  rIncrRestart(Fts
165b0 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20  3MultiSegReader 
165c0 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74 20 69 3b  *pCsr){.  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 20 20 20 20 2f 2a 20 55 73 65            /* Use
165f0 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
16600 6f 75 67 68 20 73 65 67 6d 65 6e 74 2d 72 65 61  ough segment-rea
16610 64 65 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ders */..  asser
16620 74 28 20 70 43 73 72 2d 3e 7a 54 65 72 6d 3d 3d  t( pCsr->zTerm==
16630 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
16640 43 73 72 2d 3e 6e 54 65 72 6d 3d 3d 30 20 29 3b  Csr->nTerm==0 );
16650 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d  .  assert( pCsr-
16660 3e 61 44 6f 63 6c 69 73 74 3d 3d 30 20 29 3b 0a  >aDoclist==0 );.
16670 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
16680 6e 44 6f 63 6c 69 73 74 3d 3d 30 20 29 3b 0a 0a  nDoclist==0 );..
16690 20 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65    pCsr->nAdvance
166a0 20 3d 20 30 3b 0a 20 20 70 43 73 72 2d 3e 62 52   = 0;.  pCsr->bR
166b0 65 73 74 61 72 74 20 3d 20 31 3b 0a 20 20 66 6f  estart = 1;.  fo
166c0 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e  r(i=0; i<pCsr->n
166d0 53 65 67 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20  Segment; i++){. 
166e0 20 20 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65     pCsr->apSegme
166f0 6e 74 5b 69 5d 2d 3e 70 4f 66 66 73 65 74 4c 69  nt[i]->pOffsetLi
16700 73 74 20 3d 20 30 3b 0a 20 20 20 20 70 43 73 72  st = 0;.    pCsr
16710 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69 5d 2d 3e  ->apSegment[i]->
16720 6e 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 30 3b  nOffsetList = 0;
16730 0a 20 20 20 20 70 43 73 72 2d 3e 61 70 53 65 67  .    pCsr->apSeg
16740 6d 65 6e 74 5b 69 5d 2d 3e 69 44 6f 63 69 64 20  ment[i]->iDocid 
16750 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 0;.  }..  retu
16760 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
16770 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
16780 33 53 65 67 52 65 61 64 65 72 53 74 65 70 28 0a  3SegReaderStep(.
16790 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
167a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167b0 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
167c0 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46  le handle */.  F
167d0 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
167e0 72 20 2a 70 43 73 72 20 20 20 20 20 20 20 20 2f  r *pCsr        /
167f0 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  * Cursor object 
16800 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
16810 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
16820 6e 74 20 69 73 49 67 6e 6f 72 65 45 6d 70 74 79  nt isIgnoreEmpty
16830 20 3d 20 20 28 70 43 73 72 2d 3e 70 46 69 6c 74   =  (pCsr->pFilt
16840 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 33  er->flags & FTS3
16850 5f 53 45 47 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f  _SEGMENT_IGNORE_
16860 45 4d 50 54 59 29 3b 0a 20 20 69 6e 74 20 69 73  EMPTY);.  int is
16870 52 65 71 75 69 72 65 50 6f 73 20 3d 20 20 20 28  RequirePos =   (
16880 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e 66  pCsr->pFilter->f
16890 6c 61 67 73 20 26 20 46 54 53 33 5f 53 45 47 4d  lags & FTS3_SEGM
168a0 45 4e 54 5f 52 45 51 55 49 52 45 5f 50 4f 53 29  ENT_REQUIRE_POS)
168b0 3b 0a 20 20 69 6e 74 20 69 73 43 6f 6c 46 69 6c  ;.  int isColFil
168c0 74 65 72 20 3d 20 20 20 20 28 70 43 73 72 2d 3e  ter =    (pCsr->
168d0 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26  pFilter->flags &
168e0 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 43 4f   FTS3_SEGMENT_CO
168f0 4c 55 4d 4e 5f 46 49 4c 54 45 52 29 3b 0a 20 20  LUMN_FILTER);.  
16900 69 6e 74 20 69 73 50 72 65 66 69 78 20 3d 20 20  int isPrefix =  
16910 20 20 20 20 20 28 70 43 73 72 2d 3e 70 46 69 6c       (pCsr->pFil
16920 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
16930 33 5f 53 45 47 4d 45 4e 54 5f 50 52 45 46 49 58  3_SEGMENT_PREFIX
16940 29 3b 0a 20 20 69 6e 74 20 69 73 53 63 61 6e 20  );.  int isScan 
16950 3d 20 20 20 20 20 20 20 20 20 28 70 43 73 72 2d  =         (pCsr-
16960 3e 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20  >pFilter->flags 
16970 26 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 53  & FTS3_SEGMENT_S
16980 43 41 4e 29 3b 0a 20 20 69 6e 74 20 69 73 46 69  CAN);.  int isFi
16990 72 73 74 20 3d 20 20 20 20 20 20 20 20 28 70 43  rst =        (pC
169a0 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e 66 6c 61  sr->pFilter->fla
169b0 67 73 20 26 20 46 54 53 33 5f 53 45 47 4d 45 4e  gs & FTS3_SEGMEN
169c0 54 5f 46 49 52 53 54 29 3b 0a 0a 20 20 46 74 73  T_FIRST);..  Fts
169d0 33 53 65 67 52 65 61 64 65 72 20 2a 2a 61 70 53  3SegReader **apS
169e0 65 67 6d 65 6e 74 20 3d 20 70 43 73 72 2d 3e 61  egment = pCsr->a
169f0 70 53 65 67 6d 65 6e 74 3b 0a 20 20 69 6e 74 20  pSegment;.  int 
16a00 6e 53 65 67 6d 65 6e 74 20 3d 20 70 43 73 72 2d  nSegment = pCsr-
16a10 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 46 74 73  >nSegment;.  Fts
16a20 33 53 65 67 46 69 6c 74 65 72 20 2a 70 46 69 6c  3SegFilter *pFil
16a30 74 65 72 20 3d 20 70 43 73 72 2d 3e 70 46 69 6c  ter = pCsr->pFil
16a40 74 65 72 3b 0a 20 20 69 6e 74 20 28 2a 78 43 6d  ter;.  int (*xCm
16a50 70 29 28 46 74 73 33 53 65 67 52 65 61 64 65 72  p)(Fts3SegReader
16a60 20 2a 2c 20 46 74 73 33 53 65 67 52 65 61 64 65   *, Fts3SegReade
16a70 72 20 2a 29 20 3d 20 28 0a 20 20 20 20 70 2d 3e  r *) = (.    p->
16a80 62 44 65 73 63 49 64 78 20 3f 20 66 74 73 33 53  bDescIdx ? fts3S
16a90 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43  egReaderDoclistC
16aa0 6d 70 52 65 76 20 3a 20 66 74 73 33 53 65 67 52  mpRev : fts3SegR
16ab0 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 0a  eaderDoclistCmp.
16ac0 20 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 73 72    );..  if( pCsr
16ad0 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 30 20 29 20  ->nSegment==0 ) 
16ae0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16af0 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 6e  ;..  do {.    in
16b00 74 20 6e 4d 65 72 67 65 3b 0a 20 20 20 20 69 6e  t nMerge;.    in
16b10 74 20 69 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41  t i;.  .    /* A
16b20 64 76 61 6e 63 65 20 74 68 65 20 66 69 72 73 74  dvance the first
16b30 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65 20   pCsr->nAdvance 
16b40 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 61  entries in the a
16b50 70 53 65 67 6d 65 6e 74 5b 5d 20 61 72 72 61 79  pSegment[] array
16b60 0a 20 20 20 20 2a 2a 20 66 6f 72 77 61 72 64 2e  .    ** forward.
16b70 20 54 68 65 6e 20 73 6f 72 74 20 74 68 65 20 6c   Then sort the l
16b80 69 73 74 20 69 6e 20 6f 72 64 65 72 20 6f 66 20  ist in order of 
16b90 63 75 72 72 65 6e 74 20 74 65 72 6d 20 61 67 61  current term aga
16ba0 69 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20  in.  .    */.   
16bb0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72   for(i=0; i<pCsr
16bc0 2d 3e 6e 41 64 76 61 6e 63 65 3b 20 69 2b 2b 29  ->nAdvance; i++)
16bd0 7b 0a 20 20 20 20 20 20 46 74 73 33 53 65 67 52  {.      Fts3SegR
16be0 65 61 64 65 72 20 2a 70 53 65 67 20 3d 20 61 70  eader *pSeg = ap
16bf0 53 65 67 6d 65 6e 74 5b 69 5d 3b 0a 20 20 20 20  Segment[i];.    
16c00 20 20 69 66 28 20 70 53 65 67 2d 3e 62 4c 6f 6f    if( pSeg->bLoo
16c10 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 20 20 66  kup ){.        f
16c20 74 73 33 53 65 67 52 65 61 64 65 72 53 65 74 45  ts3SegReaderSetE
16c30 6f 66 28 70 53 65 67 29 3b 0a 20 20 20 20 20 20  of(pSeg);.      
16c40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
16c50 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65  c = fts3SegReade
16c60 72 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 30  rNext(p, pSeg, 0
16c70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
16c80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16c90 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
16ca0 20 20 20 20 7d 0a 20 20 20 20 66 74 73 33 53 65      }.    fts3Se
16cb0 67 52 65 61 64 65 72 53 6f 72 74 28 61 70 53 65  gReaderSort(apSe
16cc0 67 6d 65 6e 74 2c 20 6e 53 65 67 6d 65 6e 74 2c  gment, nSegment,
16cd0 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65 2c   pCsr->nAdvance,
16ce0 20 66 74 73 33 53 65 67 52 65 61 64 65 72 43 6d   fts3SegReaderCm
16cf0 70 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 6e 41  p);.    pCsr->nA
16d00 64 76 61 6e 63 65 20 3d 20 30 3b 0a 0a 20 20 20  dvance = 0;..   
16d10 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 73   /* If all the s
16d20 65 67 2d 72 65 61 64 65 72 73 20 61 72 65 20 61  eg-readers are a
16d30 74 20 45 4f 46 2c 20 77 65 27 72 65 20 66 69 6e  t EOF, we're fin
16d40 69 73 68 65 64 2e 20 72 65 74 75 72 6e 20 53 51  ished. return SQ
16d50 4c 49 54 45 5f 4f 4b 2e 20 2a 2f 0a 20 20 20 20  LITE_OK. */.    
16d60 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
16d70 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 69 66 28  TE_OK );.    if(
16d80 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 61   apSegment[0]->a
16d90 4e 6f 64 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Node==0 ) break;
16da0 0a 0a 20 20 20 20 70 43 73 72 2d 3e 6e 54 65 72  ..    pCsr->nTer
16db0 6d 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d  m = apSegment[0]
16dc0 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 70 43 73  ->nTerm;.    pCs
16dd0 72 2d 3e 7a 54 65 72 6d 20 3d 20 61 70 53 65 67  r->zTerm = apSeg
16de0 6d 65 6e 74 5b 30 5d 2d 3e 7a 54 65 72 6d 3b 0a  ment[0]->zTerm;.
16df0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
16e00 69 73 20 61 20 70 72 65 66 69 78 2d 73 65 61 72  is a prefix-sear
16e10 63 68 2c 20 61 6e 64 20 69 66 20 74 68 65 20 74  ch, and if the t
16e20 65 72 6d 20 74 68 61 74 20 61 70 53 65 67 6d 65  erm that apSegme
16e30 6e 74 5b 30 5d 20 70 6f 69 6e 74 73 0a 20 20 20  nt[0] points.   
16e40 20 2a 2a 20 74 6f 20 64 6f 65 73 20 6e 6f 74 20   ** to does not 
16e50 73 68 61 72 65 20 61 20 73 75 66 66 69 78 20 77  share a suffix w
16e60 69 74 68 20 70 46 69 6c 74 65 72 2d 3e 7a 54 65  ith pFilter->zTe
16e70 72 6d 2f 6e 54 65 72 6d 2c 20 74 68 65 6e 20 61  rm/nTerm, then a
16e80 6c 6c 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69  ll .    ** requi
16e90 72 65 64 20 63 61 6c 6c 62 61 63 6b 73 20 68 61  red callbacks ha
16ea0 76 65 20 62 65 65 6e 20 6d 61 64 65 2e 20 49 6e  ve been made. In
16eb0 20 74 68 69 73 20 63 61 73 65 20 65 78 69 74 20   this case exit 
16ec0 65 61 72 6c 79 2e 0a 20 20 20 20 2a 2a 0a 20 20  early..    **.  
16ed0 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20    ** Similarly, 
16ee0 69 66 20 74 68 69 73 20 69 73 20 61 20 73 65 61  if this is a sea
16ef0 72 63 68 20 66 6f 72 20 61 6e 20 65 78 61 63 74  rch for an exact
16f00 20 6d 61 74 63 68 2c 20 61 6e 64 20 74 68 65 20   match, and the 
16f10 66 69 72 73 74 20 74 65 72 6d 0a 20 20 20 20 2a  first term.    *
16f20 2a 20 6f 66 20 73 65 67 6d 65 6e 74 20 61 70 53  * of segment apS
16f30 65 67 6d 65 6e 74 5b 30 5d 20 69 73 20 6e 6f 74  egment[0] is not
16f40 20 61 20 6d 61 74 63 68 2c 20 65 78 69 74 20 65   a match, exit e
16f50 61 72 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  arly..    */.   
16f60 20 69 66 28 20 70 46 69 6c 74 65 72 2d 3e 7a 54   if( pFilter->zT
16f70 65 72 6d 20 26 26 20 21 69 73 53 63 61 6e 20 29  erm && !isScan )
16f80 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 73 72  {.      if( pCsr
16f90 2d 3e 6e 54 65 72 6d 3c 70 46 69 6c 74 65 72 2d  ->nTerm<pFilter-
16fa0 3e 6e 54 65 72 6d 20 0a 20 20 20 20 20 20 20 7c  >nTerm .       |
16fb0 7c 20 28 21 69 73 50 72 65 66 69 78 20 26 26 20  | (!isPrefix && 
16fc0 70 43 73 72 2d 3e 6e 54 65 72 6d 3e 70 46 69 6c  pCsr->nTerm>pFil
16fd0 74 65 72 2d 3e 6e 54 65 72 6d 29 0a 20 20 20 20  ter->nTerm).    
16fe0 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 43 73     || memcmp(pCs
16ff0 72 2d 3e 7a 54 65 72 6d 2c 20 70 46 69 6c 74 65  r->zTerm, pFilte
17000 72 2d 3e 7a 54 65 72 6d 2c 20 70 46 69 6c 74 65  r->zTerm, pFilte
17010 72 2d 3e 6e 54 65 72 6d 29 20 0a 20 20 20 20 20  r->nTerm) .     
17020 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
17030 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
17040 0a 0a 20 20 20 20 6e 4d 65 72 67 65 20 3d 20 31  ..    nMerge = 1
17050 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 4d 65  ;.    while( nMe
17060 72 67 65 3c 6e 53 65 67 6d 65 6e 74 20 0a 20 20  rge<nSegment .  
17070 20 20 20 20 20 20 26 26 20 61 70 53 65 67 6d 65        && apSegme
17080 6e 74 5b 6e 4d 65 72 67 65 5d 2d 3e 61 4e 6f 64  nt[nMerge]->aNod
17090 65 0a 20 20 20 20 20 20 20 20 26 26 20 61 70 53  e.        && apS
170a0 65 67 6d 65 6e 74 5b 6e 4d 65 72 67 65 5d 2d 3e  egment[nMerge]->
170b0 6e 54 65 72 6d 3d 3d 70 43 73 72 2d 3e 6e 54 65  nTerm==pCsr->nTe
170c0 72 6d 20 0a 20 20 20 20 20 20 20 20 26 26 20 30  rm .        && 0
170d0 3d 3d 6d 65 6d 63 6d 70 28 70 43 73 72 2d 3e 7a  ==memcmp(pCsr->z
170e0 54 65 72 6d 2c 20 61 70 53 65 67 6d 65 6e 74 5b  Term, apSegment[
170f0 6e 4d 65 72 67 65 5d 2d 3e 7a 54 65 72 6d 2c 20  nMerge]->zTerm, 
17100 70 43 73 72 2d 3e 6e 54 65 72 6d 29 0a 20 20 20  pCsr->nTerm).   
17110 20 29 7b 0a 20 20 20 20 20 20 6e 4d 65 72 67 65   ){.      nMerge
17120 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  ++;.    }..    a
17130 73 73 65 72 74 28 20 69 73 49 67 6e 6f 72 65 45  ssert( isIgnoreE
17140 6d 70 74 79 20 7c 7c 20 28 69 73 52 65 71 75 69  mpty || (isRequi
17150 72 65 50 6f 73 20 26 26 20 21 69 73 43 6f 6c 46  rePos && !isColF
17160 69 6c 74 65 72 29 20 29 3b 0a 20 20 20 20 69 66  ilter) );.    if
17170 28 20 6e 4d 65 72 67 65 3d 3d 31 20 0a 20 20 20  ( nMerge==1 .   
17180 20 20 26 26 20 21 69 73 49 67 6e 6f 72 65 45 6d    && !isIgnoreEm
17190 70 74 79 20 0a 20 20 20 20 20 26 26 20 21 69 73  pty .     && !is
171a0 46 69 72 73 74 20 0a 20 20 20 20 20 26 26 20 28  First .     && (
171b0 70 2d 3e 62 44 65 73 63 49 64 78 3d 3d 30 20 7c  p->bDescIdx==0 |
171c0 7c 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49  | fts3SegReaderI
171d0 73 50 65 6e 64 69 6e 67 28 61 70 53 65 67 6d 65  sPending(apSegme
171e0 6e 74 5b 30 5d 29 3d 3d 30 29 0a 20 20 20 20 29  nt[0])==0).    )
171f0 7b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 6e 44  {.      pCsr->nD
17200 6f 63 6c 69 73 74 20 3d 20 61 70 53 65 67 6d 65  oclist = apSegme
17210 6e 74 5b 30 5d 2d 3e 6e 44 6f 63 6c 69 73 74 3b  nt[0]->nDoclist;
17220 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 33 53  .      if( fts3S
17230 65 67 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e  egReaderIsPendin
17240 67 28 61 70 53 65 67 6d 65 6e 74 5b 30 5d 29 20  g(apSegment[0]) 
17250 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
17260 66 74 73 33 4d 73 72 42 75 66 66 65 72 44 61 74  fts3MsrBufferDat
17270 61 28 70 43 73 72 2c 20 61 70 53 65 67 6d 65 6e  a(pCsr, apSegmen
17280 74 5b 30 5d 2d 3e 61 44 6f 63 6c 69 73 74 2c 20  t[0]->aDoclist, 
17290 70 43 73 72 2d 3e 6e 44 6f 63 6c 69 73 74 29 3b  pCsr->nDoclist);
172a0 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 61  .        pCsr->a
172b0 44 6f 63 6c 69 73 74 20 3d 20 70 43 73 72 2d 3e  Doclist = pCsr->
172c0 61 42 75 66 66 65 72 3b 0a 20 20 20 20 20 20 7d  aBuffer;.      }
172d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
172e0 73 72 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20 61  sr->aDoclist = a
172f0 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 61 44 6f  pSegment[0]->aDo
17300 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  clist;.      }. 
17310 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
17320 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51  ITE_OK ) rc = SQ
17330 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 20 20 7d 65  LITE_ROW;.    }e
17340 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
17350 44 6f 63 6c 69 73 74 20 3d 20 30 3b 20 20 20 20  Doclist = 0;    
17360 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
17370 66 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 20  f doclist */.   
17380 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
17390 20 69 50 72 65 76 20 3d 20 30 3b 20 20 20 20 2f   iPrev = 0;    /
173a0 2a 20 50 72 65 76 69 6f 75 73 20 64 6f 63 69 64  * Previous docid
173b0 20 73 74 6f 72 65 64 20 69 6e 20 64 6f 63 6c 69   stored in docli
173c0 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  st */..      /* 
173d0 54 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d  The current term
173e0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6e 4d   of the first nM
173f0 65 72 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  erge entries in 
17400 74 68 65 20 61 72 72 61 79 0a 20 20 20 20 20 20  the array.      
17410 2a 2a 20 6f 66 20 46 74 73 33 53 65 67 52 65 61  ** of Fts3SegRea
17420 64 65 72 20 6f 62 6a 65 63 74 73 20 69 73 20 74  der objects is t
17430 68 65 20 73 61 6d 65 2e 20 54 68 65 20 64 6f 63  he same. The doc
17440 6c 69 73 74 73 20 6d 75 73 74 20 62 65 20 6d 65  lists must be me
17450 72 67 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 6e  rged.      ** an
17460 64 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  d a single term 
17470 72 65 74 75 72 6e 65 64 20 77 69 74 68 20 74 68  returned with th
17480 65 20 6d 65 72 67 65 64 20 64 6f 63 6c 69 73 74  e merged doclist
17490 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
174a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4d 65 72   for(i=0; i<nMer
174b0 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
174c0 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72 46    fts3SegReaderF
174d0 69 72 73 74 44 6f 63 69 64 28 70 2c 20 61 70 53  irstDocid(p, apS
174e0 65 67 6d 65 6e 74 5b 69 5d 29 3b 0a 20 20 20 20  egment[i]);.    
174f0 20 20 7d 0a 20 20 20 20 20 20 66 74 73 33 53 65    }.      fts3Se
17500 67 52 65 61 64 65 72 53 6f 72 74 28 61 70 53 65  gReaderSort(apSe
17510 67 6d 65 6e 74 2c 20 6e 4d 65 72 67 65 2c 20 6e  gment, nMerge, n
17520 4d 65 72 67 65 2c 20 78 43 6d 70 29 3b 0a 20 20  Merge, xCmp);.  
17530 20 20 20 20 77 68 69 6c 65 28 20 61 70 53 65 67      while( apSeg
17540 6d 65 6e 74 5b 30 5d 2d 3e 70 4f 66 66 73 65 74  ment[0]->pOffset
17550 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
17560 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
17570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
17580 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
17590 74 68 61 74 20 73 68 61 72 65 20 61 20 64 6f 63  that share a doc
175a0 69 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68  id */.        ch
175b0 61 72 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 20  ar *pList;.     
175c0 20 20 20 69 6e 74 20 6e 4c 69 73 74 3b 0a 20 20     int nList;.  
175d0 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b        int nByte;
175e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
175f0 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 20 3d 20  _int64 iDocid = 
17600 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 69 44  apSegment[0]->iD
17610 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20 66 74  ocid;.        ft
17620 73 33 53 65 67 52 65 61 64 65 72 4e 65 78 74 44  s3SegReaderNextD
17630 6f 63 69 64 28 70 2c 20 61 70 53 65 67 6d 65 6e  ocid(p, apSegmen
17640 74 5b 30 5d 2c 20 26 70 4c 69 73 74 2c 20 26 6e  t[0], &pList, &n
17650 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 6a  List);.        j
17660 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68   = 1;.        wh
17670 69 6c 65 28 20 6a 3c 6e 4d 65 72 67 65 0a 20 20  ile( j<nMerge.  
17680 20 20 20 20 20 20 20 20 20 20 26 26 20 61 70 53            && apS
17690 65 67 6d 65 6e 74 5b 6a 5d 2d 3e 70 4f 66 66 73  egment[j]->pOffs
176a0 65 74 4c 69 73 74 0a 20 20 20 20 20 20 20 20 20  etList.         
176b0 20 20 20 26 26 20 61 70 53 65 67 6d 65 6e 74 5b     && apSegment[
176c0 6a 5d 2d 3e 69 44 6f 63 69 64 3d 3d 69 44 6f 63  j]->iDocid==iDoc
176d0 69 64 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  id.        ){.  
176e0 20 20 20 20 20 20 20 20 66 74 73 33 53 65 67 52          fts3SegR
176f0 65 61 64 65 72 4e 65 78 74 44 6f 63 69 64 28 70  eaderNextDocid(p
17700 2c 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2c 20  , apSegment[j], 
17710 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
17720 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a   j++;.        }.
17730 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 43  .        if( isC
17740 6f 6c 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20  olFilter ){.    
17750 20 20 20 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e        fts3Column
17760 46 69 6c 74 65 72 28 70 46 69 6c 74 65 72 2d 3e  Filter(pFilter->
17770 69 43 6f 6c 2c 20 26 70 4c 69 73 74 2c 20 26 6e  iCol, &pList, &n
17780 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  List);.        }
17790 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69  ..        if( !i
177a0 73 49 67 6e 6f 72 65 45 6d 70 74 79 20 7c 7c 20  sIgnoreEmpty || 
177b0 6e 4c 69 73 74 3e 30 20 29 7b 0a 0a 20 20 20 20  nList>0 ){..    
177c0 20 20 20 20 20 20 2f 2a 20 43 61 6c 63 75 6c 61        /* Calcula
177d0 74 65 20 74 68 65 20 27 64 6f 63 69 64 27 20 64  te the 'docid' d
177e0 65 6c 74 61 20 76 61 6c 75 65 20 74 6f 20 77 72  elta value to wr
177f0 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6d 65 72  ite into the mer
17800 67 65 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ged .          *
17810 2a 20 64 6f 63 6c 69 73 74 2e 20 2a 2f 0a 20 20  * doclist. */.  
17820 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
17830 69 6e 74 36 34 20 69 44 65 6c 74 61 3b 0a 20 20  int64 iDelta;.  
17840 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62          if( p->b
17850 44 65 73 63 49 64 78 20 26 26 20 6e 44 6f 63 6c  DescIdx && nDocl
17860 69 73 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ist>0 ){.       
17870 20 20 20 20 20 69 44 65 6c 74 61 20 3d 20 69 50       iDelta = iP
17880 72 65 76 20 2d 20 69 44 6f 63 69 64 3b 0a 20 20  rev - iDocid;.  
17890 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
178a0 20 20 20 20 20 20 20 20 20 20 20 69 44 65 6c 74             iDelt
178b0 61 20 3d 20 69 44 6f 63 69 64 20 2d 20 69 50 72  a = iDocid - iPr
178c0 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ev;.          }.
178d0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
178e0 28 20 69 44 65 6c 74 61 3e 30 20 7c 7c 20 28 6e  ( iDelta>0 || (n
178f0 44 6f 63 6c 69 73 74 3d 3d 30 20 26 26 20 69 44  Doclist==0 && iD
17900 65 6c 74 61 3d 3d 69 44 6f 63 69 64 29 20 29 3b  elta==iDocid) );
17910 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
17920 74 28 20 6e 44 6f 63 6c 69 73 74 3e 30 20 7c 7c  t( nDoclist>0 ||
17930 20 69 44 65 6c 74 61 3d 3d 69 44 6f 63 69 64 20   iDelta==iDocid 
17940 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6e 42  );..          nB
17950 79 74 65 20 3d 20 73 71 6c 69 74 65 33 46 74 73  yte = sqlite3Fts
17960 33 56 61 72 69 6e 74 4c 65 6e 28 69 44 65 6c 74  3VarintLen(iDelt
17970 61 29 20 2b 20 28 69 73 52 65 71 75 69 72 65 50  a) + (isRequireP
17980 6f 73 3f 6e 4c 69 73 74 2b 31 3a 30 29 3b 0a 20  os?nList+1:0);. 
17990 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 44 6f           if( nDo
179a0 63 6c 69 73 74 2b 6e 42 79 74 65 3e 70 43 73 72  clist+nByte>pCsr
179b0 2d 3e 6e 42 75 66 66 65 72 20 29 7b 0a 20 20 20  ->nBuffer ){.   
179c0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 61           char *a
179d0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20  New;.           
179e0 20 70 43 73 72 2d 3e 6e 42 75 66 66 65 72 20 3d   pCsr->nBuffer =
179f0 20 28 6e 44 6f 63 6c 69 73 74 2b 6e 42 79 74 65   (nDoclist+nByte
17a00 29 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  )*2;.           
17a10 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   aNew = sqlite3_
17a20 72 65 61 6c 6c 6f 63 28 70 43 73 72 2d 3e 61 42  realloc(pCsr->aB
17a30 75 66 66 65 72 2c 20 70 43 73 72 2d 3e 6e 42 75  uffer, pCsr->nBu
17a40 66 66 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ffer);.         
17a50 20 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a     if( !aNew ){.
17a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
17a70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
17a80 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  M;.            }
17a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 73  .            pCs
17aa0 72 2d 3e 61 42 75 66 66 65 72 20 3d 20 61 4e 65  r->aBuffer = aNe
17ab0 77 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  w;.          }..
17ac0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73            if( is
17ad0 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20 20  First ){.       
17ae0 20 20 20 20 20 63 68 61 72 20 2a 61 20 3d 20 26       char *a = &
17af0 70 43 73 72 2d 3e 61 42 75 66 66 65 72 5b 6e 44  pCsr->aBuffer[nD
17b00 6f 63 6c 69 73 74 5d 3b 0a 20 20 20 20 20 20 20  oclist];.       
17b10 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65 3b       int nWrite;
17b20 0a 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20  .           .   
17b30 20 20 20 20 20 20 20 20 20 6e 57 72 69 74 65 20           nWrite 
17b40 3d 20 73 71 6c 69 74 65 33 46 74 73 33 46 69 72  = sqlite3Fts3Fir
17b50 73 74 46 69 6c 74 65 72 28 69 44 65 6c 74 61 2c  stFilter(iDelta,
17b60 20 70 4c 69 73 74 2c 20 6e 4c 69 73 74 2c 20 61   pList, nList, a
17b70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
17b80 66 28 20 6e 57 72 69 74 65 20 29 7b 0a 20 20 20  f( nWrite ){.   
17b90 20 20 20 20 20 20 20 20 20 20 20 69 50 72 65 76             iPrev
17ba0 20 3d 20 69 44 6f 63 69 64 3b 0a 20 20 20 20 20   = iDocid;.     
17bb0 20 20 20 20 20 20 20 20 20 6e 44 6f 63 6c 69 73           nDoclis
17bc0 74 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20  t += nWrite;.   
17bd0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17be0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17bf0 20 20 20 20 20 20 20 20 6e 44 6f 63 6c 69 73 74          nDoclist
17c00 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50   += sqlite3Fts3P
17c10 75 74 56 61 72 69 6e 74 28 26 70 43 73 72 2d 3e  utVarint(&pCsr->
17c20 61 42 75 66 66 65 72 5b 6e 44 6f 63 6c 69 73 74  aBuffer[nDoclist
17c30 5d 2c 20 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  ], iDelta);.    
17c40 20 20 20 20 20 20 20 20 69 50 72 65 76 20 3d 20          iPrev = 
17c50 69 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20  iDocid;.        
17c60 20 20 20 20 69 66 28 20 69 73 52 65 71 75 69 72      if( isRequir
17c70 65 50 6f 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ePos ){.        
17c80 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 43        memcpy(&pC
17c90 73 72 2d 3e 61 42 75 66 66 65 72 5b 6e 44 6f 63  sr->aBuffer[nDoc
17ca0 6c 69 73 74 5d 2c 20 70 4c 69 73 74 2c 20 6e 4c  list], pList, nL
17cb0 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ist);.          
17cc0 20 20 20 20 6e 44 6f 63 6c 69 73 74 20 2b 3d 20      nDoclist += 
17cd0 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20  nList;.         
17ce0 20 20 20 20 20 70 43 73 72 2d 3e 61 42 75 66 66       pCsr->aBuff
17cf0 65 72 5b 6e 44 6f 63 6c 69 73 74 2b 2b 5d 20 3d  er[nDoclist++] =
17d00 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 20   '\0';.         
17d10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
17d20 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
17d30 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65      fts3SegReade
17d40 72 53 6f 72 74 28 61 70 53 65 67 6d 65 6e 74 2c  rSort(apSegment,
17d50 20 6e 4d 65 72 67 65 2c 20 6a 2c 20 78 43 6d 70   nMerge, j, xCmp
17d60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17d70 20 69 66 28 20 6e 44 6f 63 6c 69 73 74 3e 30 20   if( nDoclist>0 
17d80 29 7b 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d  ){.        pCsr-
17d90 3e 61 44 6f 63 6c 69 73 74 20 3d 20 70 43 73 72  >aDoclist = pCsr
17da0 2d 3e 61 42 75 66 66 65 72 3b 0a 20 20 20 20 20  ->aBuffer;.     
17db0 20 20 20 70 43 73 72 2d 3e 6e 44 6f 63 6c 69 73     pCsr->nDoclis
17dc0 74 20 3d 20 6e 44 6f 63 6c 69 73 74 3b 0a 20 20  t = nDoclist;.  
17dd0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
17de0 45 5f 52 4f 57 3b 0a 20 20 20 20 20 20 7d 0a 20  E_ROW;.      }. 
17df0 20 20 20 7d 0a 20 20 20 20 70 43 73 72 2d 3e 6e     }.    pCsr->n
17e00 41 64 76 61 6e 63 65 20 3d 20 6e 4d 65 72 67 65  Advance = nMerge
17e10 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  ;.  }while( rc==
17e20 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
17e30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 76  return rc;.}...v
17e40 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 33 53  oid sqlite3Fts3S
17e50 65 67 52 65 61 64 65 72 46 69 6e 69 73 68 28 0a  egReaderFinish(.
17e60 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65    Fts3MultiSegRe
17e70 61 64 65 72 20 2a 70 43 73 72 20 20 20 20 20 20  ader *pCsr      
17e80 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65 63   /* Cursor objec
17e90 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 43  t */.){.  if( pC
17ea0 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  sr ){.    int i;
17eb0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
17ec0 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 20  pCsr->nSegment; 
17ed0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
17ee0 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72  te3Fts3SegReader
17ef0 46 72 65 65 28 70 43 73 72 2d 3e 61 70 53 65 67  Free(pCsr->apSeg
17f00 6d 65 6e 74 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  ment[i]);.    }.
17f10 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
17f20 28 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74  (pCsr->apSegment
17f30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
17f40 72 65 65 28 70 43 73 72 2d 3e 61 42 75 66 66 65  ree(pCsr->aBuffe
17f50 72 29 3b 0a 0a 20 20 20 20 70 43 73 72 2d 3e 6e  r);..    pCsr->n
17f60 53 65 67 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20  Segment = 0;.   
17f70 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74   pCsr->apSegment
17f80 20 3d 20 30 3b 0a 20 20 20 20 70 43 73 72 2d 3e   = 0;.    pCsr->
17f90 61 42 75 66 66 65 72 20 3d 20 30 3b 0a 20 20 7d  aBuffer = 0;.  }
17fa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20  .}../*.** Merge 
17fb0 61 6c 6c 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c  all level iLevel
17fc0 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 65   segments in the
17fd0 20 64 61 74 61 62 61 73 65 20 69 6e 74 6f 20 61   database into a
17fe0 20 73 69 6e 67 6c 65 20 0a 2a 2a 20 69 4c 65 76   single .** iLev
17ff0 65 6c 2b 31 20 73 65 67 6d 65 6e 74 2e 20 4f 72  el+1 segment. Or
18000 2c 20 69 66 20 69 4c 65 76 65 6c 3c 30 2c 20 6d  , if iLevel<0, m
18010 65 72 67 65 20 61 6c 6c 20 73 65 67 6d 65 6e 74  erge all segment
18020 73 20 69 6e 74 6f 20 61 0a 2a 2a 20 73 69 6e 67  s into a.** sing
18030 6c 65 20 73 65 67 6d 65 6e 74 20 77 69 74 68 20  le segment with 
18040 61 20 6c 65 76 65 6c 20 65 71 75 61 6c 20 74 6f  a level equal to
18050 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79   the numerically
18060 20 6c 61 72 67 65 73 74 20 6c 65 76 65 6c 20 0a   largest level .
18070 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 72 65  ** currently pre
18080 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61  sent in the data
18090 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  base..**.** If t
180a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
180b0 63 61 6c 6c 65 64 20 77 69 74 68 20 69 4c 65 76  called with iLev
180c0 65 6c 3c 30 2c 20 62 75 74 20 74 68 65 72 65 20  el<0, but there 
180d0 69 73 20 6f 6e 6c 79 20 6f 6e 65 0a 2a 2a 20 73  is only one.** s
180e0 65 67 6d 65 6e 74 20 69 6e 20 74 68 65 20 64 61  egment in the da
180f0 74 61 62 61 73 65 2c 20 53 51 4c 49 54 45 5f 44  tabase, SQLITE_D
18100 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 20  ONE is returned 
18110 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 2a 2a  immediately. .**
18120 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 73   Otherwise, if s
18130 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
18140 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
18150 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
18160 63 75 72 73 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c  curs, .** an SQL
18170 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
18180 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
18190 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65  tatic int fts3Se
181a0 67 6d 65 6e 74 4d 65 72 67 65 28 0a 20 20 46 74  gmentMerge(.  Ft
181b0 73 33 54 61 62 6c 65 20 2a 70 2c 20 0a 20 20 69  s3Table *p, .  i
181c0 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20 20 20 20  nt iLangid,     
181d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
181e0 2a 20 4c 61 6e 67 75 61 67 65 20 69 64 20 74 6f  * Language id to
181f0 20 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74 20   merge */.  int 
18200 69 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20  iIndex,         
18210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
18220 6e 64 65 78 20 69 6e 20 70 2d 3e 61 49 6e 64 65  ndex in p->aInde
18230 78 5b 5d 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a  x[] to merge */.
18240 20 20 69 6e 74 20 69 4c 65 76 65 6c 20 20 20 20    int iLevel    
18250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18260 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 6d 65    /* Level to me
18270 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  rge */.){.  int 
18280 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
18290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
182a0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
182b0 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 20 20 20  int iIdx = 0;   
182c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182d0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 77 20  /* Index of new 
182e0 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c  segment */.  sql
182f0 69 74 65 33 5f 69 6e 74 36 34 20 69 4e 65 77 4c  ite3_int64 iNewL
18300 65 76 65 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20  evel = 0;    /* 
18310 4c 65 76 65 6c 2f 69 6e 64 65 78 20 74 6f 20 63  Level/index to c
18320 72 65 61 74 65 20 6e 65 77 20 73 65 67 6d 65 6e  reate new segmen
18330 74 20 61 74 20 2a 2f 0a 20 20 53 65 67 6d 65 6e  t at */.  Segmen
18340 74 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  tWriter *pWriter
18350 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 55 73 65   = 0;     /* Use
18360 64 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e  d to write the n
18370 65 77 2c 20 6d 65 72 67 65 64 2c 20 73 65 67 6d  ew, merged, segm
18380 65 6e 74 20 2a 2f 0a 20 20 46 74 73 33 53 65 67  ent */.  Fts3Seg
18390 46 69 6c 74 65 72 20 66 69 6c 74 65 72 3b 20 20  Filter filter;  
183a0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d           /* Segm
183b0 65 6e 74 20 74 65 72 6d 20 66 69 6c 74 65 72 20  ent term filter 
183c0 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20 20 46  condition */.  F
183d0 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
183e0 72 20 63 73 72 3b 20 20 20 20 20 20 20 20 20 2f  r csr;         /
183f0 2a 20 43 75 72 73 6f 72 20 74 6f 20 69 74 65 72  * Cursor to iter
18400 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65  ate through leve
18410 6c 28 73 29 20 2a 2f 0a 20 20 69 6e 74 20 62 49  l(s) */.  int bI
18420 67 6e 6f 72 65 45 6d 70 74 79 20 3d 20 30 3b 20  gnoreEmpty = 0; 
18430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
18440 65 20 74 6f 20 69 67 6e 6f 72 65 20 65 6d 70 74  e to ignore empt
18450 79 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20  y segments */.. 
18460 20 61 73 73 65 72 74 28 20 69 4c 65 76 65 6c 3d   assert( iLevel=
18470 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f  =FTS3_SEGCURSOR_
18480 41 4c 4c 0a 20 20 20 20 20 20 20 7c 7c 20 69 4c  ALL.       || iL
18490 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55  evel==FTS3_SEGCU
184a0 52 53 4f 52 5f 50 45 4e 44 49 4e 47 0a 20 20 20  RSOR_PENDING.   
184b0 20 20 20 20 7c 7c 20 69 4c 65 76 65 6c 3e 3d 30      || iLevel>=0
184c0 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
184d0 69 4c 65 76 65 6c 3c 46 54 53 33 5f 53 45 47 44  iLevel<FTS3_SEGD
184e0 49 52 5f 4d 41 58 4c 45 56 45 4c 20 29 3b 0a 20  IR_MAXLEVEL );. 
184f0 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 3e   assert( iIndex>
18500 3d 30 20 26 26 20 69 49 6e 64 65 78 3c 70 2d 3e  =0 && iIndex<p->
18510 6e 49 6e 64 65 78 20 29 3b 0a 0a 20 20 72 63 20  nIndex );..  rc 
18520 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  = sqlite3Fts3Seg
18530 52 65 61 64 65 72 43 75 72 73 6f 72 28 70 2c 20  ReaderCursor(p, 
18540 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c  iLangid, iIndex,
18550 20 69 4c 65 76 65 6c 2c 20 30 2c 20 30 2c 20 31   iLevel, 0, 0, 1
18560 2c 20 30 2c 20 26 63 73 72 29 3b 0a 20 20 69 66  , 0, &csr);.  if
18570 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18580 7c 7c 20 63 73 72 2e 6e 53 65 67 6d 65 6e 74 3d  || csr.nSegment=
18590 3d 30 20 29 20 67 6f 74 6f 20 66 69 6e 69 73 68  =0 ) goto finish
185a0 65 64 3b 0a 0a 20 20 69 66 28 20 69 4c 65 76 65  ed;..  if( iLeve
185b0 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f  l==FTS3_SEGCURSO
185c0 52 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 2f 2a 20  R_ALL ){.    /* 
185d0 54 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20  This call is to 
185e0 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d 65 6e  merge all segmen
185f0 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ts in the databa
18600 73 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 0a 20  se to a single. 
18610 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 2e 20 54     ** segment. T
18620 68 65 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  he level of the 
18630 6e 65 77 20 73 65 67 6d 65 6e 74 20 69 73 20 65  new segment is e
18640 71 75 61 6c 20 74 6f 20 74 68 65 20 74 68 65 20  qual to the the 
18650 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 20  numerically .   
18660 20 2a 2a 20 67 72 65 61 74 65 73 74 20 73 65 67   ** greatest seg
18670 6d 65 6e 74 20 6c 65 76 65 6c 20 63 75 72 72 65  ment level curre
18680 6e 74 6c 79 20 70 72 65 73 65 6e 74 20 69 6e 20  ntly present in 
18690 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72  the database for
186a0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 6e 64   this.    ** ind
186b0 65 78 2e 20 54 68 65 20 69 64 78 20 6f 66 20 74  ex. The idx of t
186c0 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 69  he new segment i
186d0 73 20 61 6c 77 61 79 73 20 30 2e 20 20 2a 2f 0a  s always 0.  */.
186e0 20 20 20 20 69 66 28 20 63 73 72 2e 6e 53 65 67      if( csr.nSeg
186f0 6d 65 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20  ment==1 ){.     
18700 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
18710 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 69  E;.      goto fi
18720 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20  nished;.    }.  
18730 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 6d 65    rc = fts3Segme
18740 6e 74 4d 61 78 4c 65 76 65 6c 28 70 2c 20 69 4c  ntMaxLevel(p, iL
18750 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 26  angid, iIndex, &
18760 69 4e 65 77 4c 65 76 65 6c 29 3b 0a 20 20 20 20  iNewLevel);.    
18770 62 49 67 6e 6f 72 65 45 6d 70 74 79 20 3d 20 31  bIgnoreEmpty = 1
18780 3b 0a 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  ;..  }else if( i
18790 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43  Level==FTS3_SEGC
187a0 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 20 29 7b  URSOR_PENDING ){
187b0 0a 20 20 20 20 69 4e 65 77 4c 65 76 65 6c 20 3d  .    iNewLevel =
187c0 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65   getAbsoluteLeve
187d0 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49  l(p, iLangid, iI
187e0 6e 64 65 78 2c 20 30 29 3b 0a 20 20 20 20 72 63  ndex, 0);.    rc
187f0 20 3d 20 66 74 73 33 41 6c 6c 6f 63 61 74 65 53   = fts3AllocateS
18800 65 67 64 69 72 49 64 78 28 70 2c 20 69 4c 61 6e  egdirIdx(p, iLan
18810 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 30 2c 20  gid, iIndex, 0, 
18820 26 69 49 64 78 29 3b 0a 20 20 7d 65 6c 73 65 7b  &iIdx);.  }else{
18830 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c  .    /* This cal
18840 6c 20 69 73 20 74 6f 20 6d 65 72 67 65 20 61 6c  l is to merge al
18850 6c 20 73 65 67 6d 65 6e 74 73 20 61 74 20 6c 65  l segments at le
18860 76 65 6c 20 69 4c 65 76 65 6c 2e 20 66 69 6e 64  vel iLevel. find
18870 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   the next.    **
18880 20 61 76 61 69 6c 61 62 6c 65 20 73 65 67 6d 65   available segme
18890 6e 74 20 69 6e 64 65 78 20 61 74 20 6c 65 76 65  nt index at leve
188a0 6c 20 69 4c 65 76 65 6c 2b 31 2e 20 54 68 65 20  l iLevel+1. The 
188b0 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 66  call to.    ** f
188c0 74 73 33 41 6c 6c 6f 63 61 74 65 53 65 67 64 69  ts3AllocateSegdi
188d0 72 49 64 78 28 29 20 77 69 6c 6c 20 6d 65 72 67  rIdx() will merg
188e0 65 20 74 68 65 20 73 65 67 6d 65 6e 74 73 20 61  e the segments a
188f0 74 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2b 31  t level iLevel+1
18900 20 74 6f 20 0a 20 20 20 20 2a 2a 20 61 20 73 69   to .    ** a si
18910 6e 67 6c 65 20 69 4c 65 76 65 6c 2b 32 20 73 65  ngle iLevel+2 se
18920 67 6d 65 6e 74 20 69 66 20 6e 65 63 65 73 73 61  gment if necessa
18930 72 79 2e 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ry.  */.    rc =
18940 20 66 74 73 33 41 6c 6c 6f 63 61 74 65 53 65 67   fts3AllocateSeg
18950 64 69 72 49 64 78 28 70 2c 20 69 4c 61 6e 67 69  dirIdx(p, iLangi
18960 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65 76 65  d, iIndex, iLeve
18970 6c 2b 31 2c 20 26 69 49 64 78 29 3b 0a 20 20 20  l+1, &iIdx);.   
18980 20 69 4e 65 77 4c 65 76 65 6c 20 3d 20 67 65 74   iNewLevel = get
18990 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c  AbsoluteLevel(p,
189a0 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78   iLangid, iIndex
189b0 2c 20 69 4c 65 76 65 6c 2b 31 29 3b 0a 20 20 7d  , iLevel+1);.  }
189c0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
189d0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69  E_OK ) goto fini
189e0 73 68 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20  shed;.  assert( 
189f0 63 73 72 2e 6e 53 65 67 6d 65 6e 74 3e 30 20 29  csr.nSegment>0 )
18a00 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4e 65 77  ;.  assert( iNew
18a10 4c 65 76 65 6c 3e 3d 67 65 74 41 62 73 6f 6c 75  Level>=getAbsolu
18a20 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67  teLevel(p, iLang
18a30 69 64 2c 20 69 49 6e 64 65 78 2c 20 30 29 20 29  id, iIndex, 0) )
18a40 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4e 65 77  ;.  assert( iNew
18a50 4c 65 76 65 6c 3c 67 65 74 41 62 73 6f 6c 75 74  Level<getAbsolut
18a60 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69  eLevel(p, iLangi
18a70 64 2c 20 69 49 6e 64 65 78 2c 46 54 53 33 5f 53  d, iIndex,FTS3_S
18a80 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 29 20  EGDIR_MAXLEVEL) 
18a90 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69  );..  memset(&fi
18aa0 6c 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  lter, 0, sizeof(
18ab0 46 74 73 33 53 65 67 46 69 6c 74 65 72 29 29 3b  Fts3SegFilter));
18ac0 0a 20 20 66 69 6c 74 65 72 2e 66 6c 61 67 73 20  .  filter.flags 
18ad0 3d 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 52  = FTS3_SEGMENT_R
18ae0 45 51 55 49 52 45 5f 50 4f 53 3b 0a 20 20 66 69  EQUIRE_POS;.  fi
18af0 6c 74 65 72 2e 66 6c 61 67 73 20 7c 3d 20 28 62  lter.flags |= (b
18b00 49 67 6e 6f 72 65 45 6d 70 74 79 20 3f 20 46 54  IgnoreEmpty ? FT
18b10 53 33 5f 53 45 47 4d 45 4e 54 5f 49 47 4e 4f 52  S3_SEGMENT_IGNOR
18b20 45 5f 45 4d 50 54 59 20 3a 20 30 29 3b 0a 0a 20  E_EMPTY : 0);.. 
18b30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
18b40 33 53 65 67 52 65 61 64 65 72 53 74 61 72 74 28  3SegReaderStart(
18b50 70 2c 20 26 63 73 72 2c 20 26 66 69 6c 74 65 72  p, &csr, &filter
18b60 29 3b 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49  );.  while( SQLI
18b70 54 45 5f 4f 4b 3d 3d 72 63 20 29 7b 0a 20 20 20  TE_OK==rc ){.   
18b80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
18b90 33 53 65 67 52 65 61 64 65 72 53 74 65 70 28 70  3SegReaderStep(p
18ba0 2c 20 26 63 73 72 29 3b 0a 20 20 20 20 69 66 28  , &csr);.    if(
18bb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20   rc!=SQLITE_ROW 
18bc0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 72 63 20  ) break;.    rc 
18bd0 3d 20 66 74 73 33 53 65 67 57 72 69 74 65 72 41  = fts3SegWriterA
18be0 64 64 28 70 2c 20 26 70 57 72 69 74 65 72 2c 20  dd(p, &pWriter, 
18bf0 31 2c 20 0a 20 20 20 20 20 20 20 20 63 73 72 2e  1, .        csr.
18c00 7a 54 65 72 6d 2c 20 63 73 72 2e 6e 54 65 72 6d  zTerm, csr.nTerm
18c10 2c 20 63 73 72 2e 61 44 6f 63 6c 69 73 74 2c 20  , csr.aDoclist, 
18c20 63 73 72 2e 6e 44 6f 63 6c 69 73 74 29 3b 0a 20  csr.nDoclist);. 
18c30 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
18c40 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69  ITE_OK ) goto fi
18c50 6e 69 73 68 65 64 3b 0a 20 20 61 73 73 65 72 74  nished;.  assert
18c60 28 20 70 57 72 69 74 65 72 20 29 3b 0a 0a 20 20  ( pWriter );..  
18c70 69 66 28 20 69 4c 65 76 65 6c 21 3d 46 54 53 33  if( iLevel!=FTS3
18c80 5f 53 45 47 43 55 52 53 4f 52 5f 50 45 4e 44 49  _SEGCURSOR_PENDI
18c90 4e 47 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  NG ){.    rc = f
18ca0 74 73 33 44 65 6c 65 74 65 53 65 67 64 69 72 28  ts3DeleteSegdir(
18cb0 0a 20 20 20 20 20 20 20 20 70 2c 20 69 4c 61 6e  .        p, iLan
18cc0 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65  gid, iIndex, iLe
18cd0 76 65 6c 2c 20 63 73 72 2e 61 70 53 65 67 6d 65  vel, csr.apSegme
18ce0 6e 74 2c 20 63 73 72 2e 6e 53 65 67 6d 65 6e 74  nt, csr.nSegment
18cf0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
18d00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
18d10 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20  goto finished;. 
18d20 20 7d 0a 20 20 72 63 20 3d 20 66 74 73 33 53 65   }.  rc = fts3Se
18d30 67 57 72 69 74 65 72 46 6c 75 73 68 28 70 2c 20  gWriterFlush(p, 
18d40 70 57 72 69 74 65 72 2c 20 69 4e 65 77 4c 65 76  pWriter, iNewLev
18d50 65 6c 2c 20 69 49 64 78 29 3b 0a 0a 20 66 69 6e  el, iIdx);.. fin
18d60 69 73 68 65 64 3a 0a 20 20 66 74 73 33 53 65 67  ished:.  fts3Seg
18d70 57 72 69 74 65 72 46 72 65 65 28 70 57 72 69 74  WriterFree(pWrit
18d80 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74  er);.  sqlite3Ft
18d90 73 33 53 65 67 52 65 61 64 65 72 46 69 6e 69 73  s3SegReaderFinis
18da0 68 28 26 63 73 72 29 3b 0a 20 20 72 65 74 75 72  h(&csr);.  retur
18db0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 20 0a 2a 2a  n rc;.}.../* .**
18dc0 20 46 6c 75 73 68 20 74 68 65 20 63 6f 6e 74 65   Flush the conte
18dd0 6e 74 73 20 6f 66 20 70 65 6e 64 69 6e 67 54 65  nts of pendingTe
18de0 72 6d 73 20 74 6f 20 6c 65 76 65 6c 20 30 20 73  rms to level 0 s
18df0 65 67 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20  egments..*/.int 
18e00 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69  sqlite3Fts3Pendi
18e10 6e 67 54 65 72 6d 73 46 6c 75 73 68 28 46 74 73  ngTermsFlush(Fts
18e20 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e  3Table *p){.  in
18e30 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
18e40 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20  ;.  int i;.     
18e50 20 20 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72     .  for(i=0; r
18e60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
18e70 69 3c 70 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b  i<p->nIndex; i++
18e80 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  ){.    rc = fts3
18e90 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 70 2c 20  SegmentMerge(p, 
18ea0 70 2d 3e 69 50 72 65 76 4c 61 6e 67 69 64 2c 20  p->iPrevLangid, 
18eb0 69 2c 20 46 54 53 33 5f 53 45 47 43 55 52 53 4f  i, FTS3_SEGCURSO
18ec0 52 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 20 20  R_PENDING);.    
18ed0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
18ee0 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ONE ) rc = SQLIT
18ef0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  E_OK;.  }.  sqli
18f00 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65  te3Fts3PendingTe
18f10 72 6d 73 43 6c 65 61 72 28 70 29 3b 0a 0a 20 20  rmsClear(p);..  
18f20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  /* Determine the
18f30 20 61 75 74 6f 2d 69 6e 63 72 2d 6d 65 72 67 65   auto-incr-merge
18f40 20 73 65 74 74 69 6e 67 20 69 66 20 75 6e 6b 6e   setting if unkn
18f50 6f 77 6e 2e 20 20 49 66 20 65 6e 61 62 6c 65 64  own.  If enabled
18f60 2c 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 20  ,.  ** estimate 
18f70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  the number of le
18f80 61 66 20 62 6c 6f 63 6b 73 20 6f 66 20 63 6f 6e  af blocks of con
18f90 74 65 6e 74 20 74 6f 20 62 65 20 77 72 69 74 74  tent to be writt
18fa0 65 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  en.  */.  if( rc
18fb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
18fc0 2d 3e 62 48 61 73 53 74 61 74 0a 20 20 20 26 26  ->bHasStat.   &&
18fd0 20 70 2d 3e 62 41 75 74 6f 69 6e 63 72 6d 65 72   p->bAutoincrmer
18fe0 67 65 3d 3d 30 78 66 66 20 26 26 20 70 2d 3e 6e  ge==0xff && p->n
18ff0 4c 65 61 66 41 64 64 3e 30 0a 20 20 29 7b 0a 20  LeafAdd>0.  ){. 
19000 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
19010 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  *pStmt = 0;.    
19020 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
19030 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53  (p, SQL_SELECT_S
19040 54 41 54 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  TAT, &pStmt, 0);
19050 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
19060 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19070 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
19080 28 70 53 74 6d 74 2c 20 31 2c 20 46 54 53 5f 53  (pStmt, 1, FTS_S
19090 54 41 54 5f 41 55 54 4f 49 4e 43 52 4d 45 52 47  TAT_AUTOINCRMERG
190a0 45 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  E);.      rc = s
190b0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
190c0 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 62 41 75  t);.      p->bAu
190d0 74 6f 69 6e 63 72 6d 65 72 67 65 20 3d 20 28 72  toincrmerge = (r
190e0 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 26 26  c==SQLITE_ROW &&
190f0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
19100 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a  int(pStmt, 0));.
19110 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19120 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
19130 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
19140 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19150 20 45 6e 63 6f 64 65 20 4e 20 69 6e 74 65 67 65   Encode N intege
19160 72 73 20 61 73 20 76 61 72 69 6e 74 73 20 69 6e  rs as varints in
19170 74 6f 20 61 20 62 6c 6f 62 2e 0a 2a 2f 0a 73 74  to a blob..*/.st
19180 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 45 6e  atic void fts3En
19190 63 6f 64 65 49 6e 74 41 72 72 61 79 28 0a 20 20  codeIntArray(.  
191a0 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20  int N,          
191b0 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
191c0 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74 6f 20   of integers to 
191d0 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20  encode */.  u32 
191e0 2a 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *a,            /
191f0 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 76 61  * The integer va
19200 6c 75 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lues */.  char *
19210 7a 42 75 66 2c 20 20 20 20 20 20 20 20 2f 2a 20  zBuf,        /* 
19220 57 72 69 74 65 20 74 68 65 20 42 4c 4f 42 20 68  Write the BLOB h
19230 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e  ere */.  int *pN
19240 42 75 66 20 20 20 20 20 20 20 20 20 2f 2a 20 57  Buf         /* W
19250 72 69 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 62  rite number of b
19260 79 74 65 73 20 69 66 20 7a 42 75 66 5b 5d 20 75  ytes if zBuf[] u
19270 73 65 64 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  sed here */.){. 
19280 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72   int i, j;.  for
19290 28 69 3d 6a 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b  (i=j=0; i<N; i++
192a0 29 7b 0a 20 20 20 20 6a 20 2b 3d 20 73 71 6c 69  ){.    j += sqli
192b0 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74  te3Fts3PutVarint
192c0 28 26 7a 42 75 66 5b 6a 5d 2c 20 28 73 71 6c 69  (&zBuf[j], (sqli
192d0 74 65 33 5f 69 6e 74 36 34 29 61 5b 69 5d 29 3b  te3_int64)a[i]);
192e0 0a 20 20 7d 0a 20 20 2a 70 4e 42 75 66 20 3d 20  .  }.  *pNBuf = 
192f0 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  j;.}../*.** Deco
19300 64 65 20 61 20 62 6c 6f 62 20 6f 66 20 76 61 72  de a blob of var
19310 69 6e 74 73 20 69 6e 74 6f 20 4e 20 69 6e 74 65  ints into N inte
19320 67 65 72 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  gers.*/.static v
19330 6f 69 64 20 66 74 73 33 44 65 63 6f 64 65 49 6e  oid fts3DecodeIn
19340 74 41 72 72 61 79 28 0a 20 20 69 6e 74 20 4e 2c  tArray(.  int N,
19350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19360 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  The number of in
19370 74 65 67 65 72 73 20 74 6f 20 64 65 63 6f 64 65  tegers to decode
19380 20 2a 2f 0a 20 20 75 33 32 20 2a 61 2c 20 20 20   */.  u32 *a,   
19390 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
193a0 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  e the integer va
193b0 6c 75 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lues */.  const 
193c0 63 68 61 72 20 2a 7a 42 75 66 2c 20 20 2f 2a 20  char *zBuf,  /* 
193d0 54 68 65 20 42 4c 4f 42 20 63 6f 6e 74 61 69 6e  The BLOB contain
193e0 69 6e 67 20 74 68 65 20 76 61 72 69 6e 74 73 20  ing the varints 
193f0 2a 2f 0a 20 20 69 6e 74 20 6e 42 75 66 20 20 20  */.  int nBuf   
19400 20 20 20 20 20 20 20 20 2f 2a 20 73 69 7a 65 20          /* size 
19410 6f 66 20 74 68 65 20 42 4c 4f 42 20 2a 2f 0a 29  of the BLOB */.)
19420 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
19430 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
19440 28 6e 42 75 66 29 3b 0a 20 20 66 6f 72 28 69 3d  (nBuf);.  for(i=
19450 6a 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a  j=0; i<N; i++){.
19460 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
19470 34 20 78 3b 0a 20 20 20 20 6a 20 2b 3d 20 73 71  4 x;.    j += sq
19480 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
19490 6e 74 28 26 7a 42 75 66 5b 6a 5d 2c 20 26 78 29  nt(&zBuf[j], &x)
194a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 6a 3c 3d  ;.    assert(j<=
194b0 6e 42 75 66 29 3b 0a 20 20 20 20 61 5b 69 5d 20  nBuf);.    a[i] 
194c0 3d 20 28 75 33 32 29 28 78 20 26 20 30 78 66 66  = (u32)(x & 0xff
194d0 66 66 66 66 66 66 29 3b 0a 20 20 7d 0a 7d 0a 0a  ffffff);.  }.}..
194e0 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 74 68 65  /*.** Insert the
194f0 20 73 69 7a 65 73 20 28 69 6e 20 74 6f 6b 65 6e   sizes (in token
19500 73 29 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  s) for each colu
19510 6d 6e 20 6f 66 20 74 68 65 20 64 6f 63 75 6d 65  mn of the docume
19520 6e 74 0a 2a 2a 20 77 69 74 68 20 64 6f 63 69 64  nt.** with docid
19530 20 65 71 75 61 6c 20 74 6f 20 70 2d 3e 69 50 72   equal to p->iPr
19540 65 76 44 6f 63 69 64 2e 20 20 54 68 65 20 73 69  evDocid.  The si
19550 7a 65 73 20 61 72 65 20 65 6e 63 6f 64 65 64 20  zes are encoded 
19560 61 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 6f 66 20  as.** a blob of 
19570 76 61 72 69 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  varints..*/.stat
19580 69 63 20 76 6f 69 64 20 66 74 73 33 49 6e 73 65  ic void fts3Inse
19590 72 74 44 6f 63 73 69 7a 65 28 0a 20 20 69 6e 74  rtDocsize(.  int
195a0 20 2a 70 52 43 2c 20 20 20 20 20 20 20 20 20 20   *pRC,          
195b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
195c0 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
195d0 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
195e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195f0 20 2f 2a 20 54 61 62 6c 65 20 69 6e 74 6f 20 77   /* Table into w
19600 68 69 63 68 20 74 6f 20 69 6e 73 65 72 74 20 2a  hich to insert *
19610 2f 0a 20 20 75 33 32 20 2a 61 53 7a 20 20 20 20  /.  u32 *aSz    
19620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19630 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20      /* Sizes of 
19640 65 61 63 68 20 63 6f 6c 75 6d 6e 2c 20 69 6e 20  each column, in 
19650 74 6f 6b 65 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63  tokens */.){.  c
19660 68 61 72 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20  har *pBlob;     
19670 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42          /* The B
19680 4c 4f 42 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  LOB encoding of 
19690 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 73 69 7a  the document siz
196a0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62  e */.  int nBlob
196b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
196c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
196d0 65 73 20 69 6e 20 74 68 65 20 42 4c 4f 42 20 2a  es in the BLOB *
196e0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
196f0 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20   *pStmt;     /* 
19700 53 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74  Statement used t
19710 6f 20 69 6e 73 65 72 74 20 74 68 65 20 65 6e 63  o insert the enc
19720 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72  oding */.  int r
19730 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
19740 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
19750 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74  de from subfunct
19760 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a  ions */..  if( *
19770 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pRC ) return;.  
19780 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  pBlob = sqlite3_
19790 6d 61 6c 6c 6f 63 28 20 31 30 2a 70 2d 3e 6e 43  malloc( 10*p->nC
197a0 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28 20 70  olumn );.  if( p
197b0 42 6c 6f 62 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  Blob==0 ){.    *
197c0 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  pRC = SQLITE_NOM
197d0 45 4d 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  EM;.    return;.
197e0 20 20 7d 0a 20 20 66 74 73 33 45 6e 63 6f 64 65    }.  fts3Encode
197f0 49 6e 74 41 72 72 61 79 28 70 2d 3e 6e 43 6f 6c  IntArray(p->nCol
19800 75 6d 6e 2c 20 61 53 7a 2c 20 70 42 6c 6f 62 2c  umn, aSz, pBlob,
19810 20 26 6e 42 6c 6f 62 29 3b 0a 20 20 72 63 20 3d   &nBlob);.  rc =
19820 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
19830 53 51 4c 5f 52 45 50 4c 41 43 45 5f 44 4f 43 53  SQL_REPLACE_DOCS
19840 49 5a 45 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  IZE, &pStmt, 0);
19850 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
19860 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
19870 6c 6f 62 29 3b 0a 20 20 20 20 2a 70 52 43 20 3d  lob);.    *pRC =
19880 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
19890 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62  .  }.  sqlite3_b
198a0 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  ind_int64(pStmt,
198b0 20 31 2c 20 70 2d 3e 69 50 72 65 76 44 6f 63 69   1, p->iPrevDoci
198c0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69  d);.  sqlite3_bi
198d0 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 32  nd_blob(pStmt, 2
198e0 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20  , pBlob, nBlob, 
198f0 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20  sqlite3_free);. 
19900 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
19910 74 6d 74 29 3b 0a 20 20 2a 70 52 43 20 3d 20 73  tmt);.  *pRC = s
19920 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
19930 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  mt);.}../*.** Re
19940 63 6f 72 64 20 30 20 6f 66 20 74 68 65 20 25 5f  cord 0 of the %_
19950 73 74 61 74 20 74 61 62 6c 65 20 63 6f 6e 74 61  stat table conta
19960 69 6e 73 20 61 20 62 6c 6f 62 20 63 6f 6e 73 69  ins a blob consi
19970 73 74 69 6e 67 20 6f 66 20 4e 20 76 61 72 69 6e  sting of N varin
19980 74 73 2c 0a 2a 2a 20 77 68 65 72 65 20 4e 20 69  ts,.** where N i
19990 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
199a0 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 6f 6c  user defined col
199b0 75 6d 6e 73 20 69 6e 20 74 68 65 20 66 74 73 33  umns in the fts3
199c0 20 74 61 62 6c 65 20 70 6c 75 73 0a 2a 2a 20 74   table plus.** t
199d0 77 6f 2e 20 49 66 20 6e 43 6f 6c 20 69 73 20 74  wo. If nCol is t
199e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 65  he number of use
199f0 72 20 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e  r defined column
19a00 73 2c 20 74 68 65 6e 20 76 61 6c 75 65 73 20 6f  s, then values o
19a10 66 20 74 68 65 20 0a 2a 2a 20 76 61 72 69 6e 74  f the .** varint
19a20 73 20 61 72 65 20 73 65 74 20 61 73 20 66 6f 6c  s are set as fol
19a30 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 56 61  lows:.**.**   Va
19a40 72 69 6e 74 20 30 3a 20 20 20 20 20 20 20 54 6f  rint 0:       To
19a50 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  tal number of ro
19a60 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ws in the table.
19a70 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 6e 74 20  .**.**   Varint 
19a80 31 2e 2e 6e 43 6f 6c 3a 20 46 6f 72 20 65 61 63  1..nCol: For eac
19a90 68 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 74 6f  h column, the to
19aa0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f  tal number of to
19ab0 6b 65 6e 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a  kens stored in.*
19ac0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
19ad0 20 20 20 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66      the column f
19ae0 6f 72 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74  or all rows of t
19af0 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
19b00 20 20 56 61 72 69 6e 74 20 31 2b 6e 43 6f 6c 3a    Varint 1+nCol:
19b10 20 20 54 68 65 20 74 6f 74 61 6c 20 73 69 7a 65    The total size
19b20 2c 20 69 6e 20 62 79 74 65 73 2c 20 6f 66 20 61  , in bytes, of a
19b30 6c 6c 20 74 65 78 74 20 76 61 6c 75 65 73 20 69  ll text values i
19b40 6e 20 61 6c 6c 0a 2a 2a 20 20 20 20 20 20 20 20  n all.**        
19b50 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d             colum
19b60 6e 73 20 6f 66 20 61 6c 6c 20 72 6f 77 73 20 6f  ns of all rows o
19b70 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  f the table..**.
19b80 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
19b90 74 73 33 55 70 64 61 74 65 44 6f 63 54 6f 74 61  ts3UpdateDocTota
19ba0 6c 73 28 0a 20 20 69 6e 74 20 2a 70 52 43 2c 20  ls(.  int *pRC, 
19bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73        /* The res
19bd0 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  ult code */.  Ft
19be0 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
19bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19c00 20 54 61 62 6c 65 20 62 65 69 6e 67 20 75 70 64   Table being upd
19c10 61 74 65 64 20 2a 2f 0a 20 20 75 33 32 20 2a 61  ated */.  u32 *a
19c20 53 7a 49 6e 73 2c 20 20 20 20 20 20 20 20 20 20  SzIns,          
19c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
19c40 65 20 69 6e 63 72 65 61 73 65 73 20 2a 2f 0a 20  e increases */. 
19c50 20 75 33 32 20 2a 61 53 7a 44 65 6c 2c 20 20 20   u32 *aSzDel,   
19c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c70 20 2f 2a 20 53 69 7a 65 20 64 65 63 72 65 61 73   /* Size decreas
19c80 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 6e  es */.  int nChn
19c90 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
19ca0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67          /* Chang
19cb0 65 20 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  e in the number 
19cc0 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 2a 2f 0a  of documents */.
19cd0 29 7b 0a 20 20 63 68 61 72 20 2a 70 42 6c 6f 62  ){.  char *pBlob
19ce0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
19cf0 20 53 74 6f 72 61 67 65 20 66 6f 72 20 42 4c 4f   Storage for BLO
19d00 42 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 25  B written into %
19d10 5f 73 74 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  _stat */.  int n
19d20 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20  Blob;           
19d30 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 42      /* Size of B
19d40 4c 4f 42 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  LOB written into
19d50 20 25 5f 73 74 61 74 20 2a 2f 0a 20 20 75 33 32   %_stat */.  u32
19d60 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20 20   *a;            
19d70 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
19d80 66 20 69 6e 74 65 67 65 72 73 20 74 68 61 74 20  f integers that 
19d90 62 65 63 6f 6d 65 73 20 74 68 65 20 42 4c 4f 42  becomes the BLOB
19da0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
19db0 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f  mt *pStmt;     /
19dc0 2a 20 53 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  * Statement for 
19dd0 72 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74  reading and writ
19de0 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ing */.  int i; 
19df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e00 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
19e10 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  r */.  int rc;  
19e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e30 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
19e40 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
19e50 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20 69 6e 74   */..  const int
19e60 20 6e 53 74 61 74 20 3d 20 70 2d 3e 6e 43 6f 6c   nStat = p->nCol
19e70 75 6d 6e 2b 32 3b 0a 0a 20 20 69 66 28 20 2a 70  umn+2;..  if( *p
19e80 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  RC ) return;.  a
19e90 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
19ea0 63 28 20 28 73 69 7a 65 6f 66 28 75 33 32 29 2b  c( (sizeof(u32)+
19eb0 31 30 29 2a 6e 53 74 61 74 20 29 3b 0a 20 20 69  10)*nStat );.  i
19ec0 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  f( a==0 ){.    *
19ed0 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  pRC = SQLITE_NOM
19ee0 45 4d 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  EM;.    return;.
19ef0 20 20 7d 0a 20 20 70 42 6c 6f 62 20 3d 20 28 63    }.  pBlob = (c
19f00 68 61 72 2a 29 26 61 5b 6e 53 74 61 74 5d 3b 0a  har*)&a[nStat];.
19f10 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
19f20 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54  mt(p, SQL_SELECT
19f30 5f 53 54 41 54 2c 20 26 70 53 74 6d 74 2c 20 30  _STAT, &pStmt, 0
19f40 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
19f50 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
19f60 61 29 3b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72  a);.    *pRC = r
19f70 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
19f80 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e   }.  sqlite3_bin
19f90 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 2c 20  d_int(pStmt, 1, 
19fa0 46 54 53 5f 53 54 41 54 5f 44 4f 43 54 4f 54 41  FTS_STAT_DOCTOTA
19fb0 4c 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  L);.  if( sqlite
19fc0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
19fd0 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
19fe0 20 66 74 73 33 44 65 63 6f 64 65 49 6e 74 41 72   fts3DecodeIntAr
19ff0 72 61 79 28 6e 53 74 61 74 2c 20 61 2c 0a 20 20  ray(nStat, a,.  
1a000 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
1a010 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74  olumn_blob(pStmt
1a020 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 73  , 0),.         s
1a030 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
1a040 74 65 73 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a  tes(pStmt, 0));.
1a050 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
1a060 73 65 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66  set(a, 0, sizeof
1a070 28 75 33 32 29 2a 28 6e 53 74 61 74 29 20 29 3b  (u32)*(nStat) );
1a080 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72  .  }.  sqlite3_r
1a090 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69  eset(pStmt);.  i
1a0a0 66 28 20 6e 43 68 6e 67 3c 30 20 26 26 20 61 5b  f( nChng<0 && a[
1a0b0 30 5d 3c 28 75 33 32 29 28 2d 6e 43 68 6e 67 29  0]<(u32)(-nChng)
1a0c0 20 29 7b 0a 20 20 20 20 61 5b 30 5d 20 3d 20 30   ){.    a[0] = 0
1a0d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
1a0e0 5b 30 5d 20 2b 3d 20 6e 43 68 6e 67 3b 0a 20 20  [0] += nChng;.  
1a0f0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
1a100 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 3b 20 69 2b 2b  ->nColumn+1; i++
1a110 29 7b 0a 20 20 20 20 75 33 32 20 78 20 3d 20 61  ){.    u32 x = a
1a120 5b 69 2b 31 5d 3b 0a 20 20 20 20 69 66 28 20 78  [i+1];.    if( x
1a130 2b 61 53 7a 49 6e 73 5b 69 5d 20 3c 20 61 53 7a  +aSzIns[i] < aSz
1a140 44 65 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  Del[i] ){.      
1a150 78 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  x = 0;.    }else
1a160 7b 0a 20 20 20 20 20 20 78 20 3d 20 78 20 2b 20  {.      x = x + 
1a170 61 53 7a 49 6e 73 5b 69 5d 20 2d 20 61 53 7a 44  aSzIns[i] - aSzD
1a180 65 6c 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  el[i];.    }.   
1a190 20 61 5b 69 2b 31 5d 20 3d 20 78 3b 0a 20 20 7d   a[i+1] = x;.  }
1a1a0 0a 20 20 66 74 73 33 45 6e 63 6f 64 65 49 6e 74  .  fts3EncodeInt
1a1b0 41 72 72 61 79 28 6e 53 74 61 74 2c 20 61 2c 20  Array(nStat, a, 
1a1c0 70 42 6c 6f 62 2c 20 26 6e 42 6c 6f 62 29 3b 0a  pBlob, &nBlob);.
1a1d0 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
1a1e0 6d 74 28 70 2c 20 53 51 4c 5f 52 45 50 4c 41 43  mt(p, SQL_REPLAC
1a1f0 45 5f 53 54 41 54 2c 20 26 70 53 74 6d 74 2c 20  E_STAT, &pStmt, 
1a200 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  0);.  if( rc ){.
1a210 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1a220 28 61 29 3b 0a 20 20 20 20 2a 70 52 43 20 3d 20  (a);.    *pRC = 
1a230 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
1a240 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62 69    }.  sqlite3_bi
1a250 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 2c  nd_int(pStmt, 1,
1a260 20 46 54 53 5f 53 54 41 54 5f 44 4f 43 54 4f 54   FTS_STAT_DOCTOT
1a270 41 4c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  AL);.  sqlite3_b
1a280 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  ind_blob(pStmt, 
1a290 32 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c  2, pBlob, nBlob,
1a2a0 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
1a2b0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  .  sqlite3_step(
1a2c0 70 53 74 6d 74 29 3b 0a 20 20 2a 70 52 43 20 3d  pStmt);.  *pRC =
1a2d0 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
1a2e0 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  Stmt);.  sqlite3
1a2f0 5f 66 72 65 65 28 61 29 3b 0a 7d 0a 0a 2f 2a 0a  _free(a);.}../*.
1a300 2a 2a 20 4d 65 72 67 65 20 74 68 65 20 65 6e 74  ** Merge the ent
1a310 69 72 65 20 64 61 74 61 62 61 73 65 20 73 6f 20  ire database so 
1a320 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6f 6e  that there is on
1a330 65 20 73 65 67 6d 65 6e 74 20 66 6f 72 20 65 61  e segment for ea
1a340 63 68 20 0a 2a 2a 20 69 49 6e 64 65 78 2f 69 4c  ch .** iIndex/iL
1a350 61 6e 67 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f  angid combinatio
1a360 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1a370 20 66 74 73 33 44 6f 4f 70 74 69 6d 69 7a 65 28   fts3DoOptimize(
1a380 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 69 6e  Fts3Table *p, in
1a390 74 20 62 52 65 74 75 72 6e 44 6f 6e 65 29 7b 0a  t bReturnDone){.
1a3a0 20 20 69 6e 74 20 62 53 65 65 6e 44 6f 6e 65 20    int bSeenDone 
1a3b0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
1a3c0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1a3d0 41 6c 6c 4c 61 6e 67 69 64 20 3d 20 30 3b 0a 0a  AllLangid = 0;..
1a3e0 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
1a3f0 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54  mt(p, SQL_SELECT
1a400 5f 41 4c 4c 5f 4c 41 4e 47 49 44 2c 20 26 70 41  _ALL_LANGID, &pA
1a410 6c 6c 4c 61 6e 67 69 64 2c 20 30 29 3b 0a 20 20  llLangid, 0);.  
1a420 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a430 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  K ){.    int rc2
1a440 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
1a450 6e 64 5f 69 6e 74 28 70 41 6c 6c 4c 61 6e 67 69  nd_int(pAllLangi
1a460 64 2c 20 31 2c 20 70 2d 3e 6e 49 6e 64 65 78 29  d, 1, p->nIndex)
1a470 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c  ;.    while( sql
1a480 69 74 65 33 5f 73 74 65 70 28 70 41 6c 6c 4c 61  ite3_step(pAllLa
1a490 6e 67 69 64 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  ngid)==SQLITE_RO
1a4a0 57 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  W ){.      int i
1a4b0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 61 6e  ;.      int iLan
1a4c0 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  gid = sqlite3_co
1a4d0 6c 75 6d 6e 5f 69 6e 74 28 70 41 6c 6c 4c 61 6e  lumn_int(pAllLan
1a4e0 67 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 66  gid, 0);.      f
1a4f0 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
1a500 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 49  TE_OK && i<p->nI
1a510 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ndex; i++){.    
1a520 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67      rc = fts3Seg
1a530 6d 65 6e 74 4d 65 72 67 65 28 70 2c 20 69 4c 61  mentMerge(p, iLa
1a540 6e 67 69 64 2c 20 69 2c 20 46 54 53 33 5f 53 45  ngid, i, FTS3_SE
1a550 47 43 55 52 53 4f 52 5f 41 4c 4c 29 3b 0a 20 20  GCURSOR_ALL);.  
1a560 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1a570 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
1a580 20 20 20 20 20 20 20 62 53 65 65 6e 44 6f 6e 65         bSeenDone
1a590 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
1a5a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1a5b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a5c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 32 20  }.    }.    rc2 
1a5d0 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
1a5e0 70 41 6c 6c 4c 61 6e 67 69 64 29 3b 0a 20 20 20  pAllLangid);.   
1a5f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a600 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
1a610 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 46 74 73   }..  sqlite3Fts
1a620 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28 70  3SegmentsClose(p
1a630 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33  );.  sqlite3Fts3
1a640 50 65 6e 64 69 6e 67 54 65 72 6d 73 43 6c 65 61  PendingTermsClea
1a650 72 28 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  r(p);..  return 
1a660 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  (rc==SQLITE_OK &
1a670 26 20 62 52 65 74 75 72 6e 44 6f 6e 65 20 26 26  & bReturnDone &&
1a680 20 62 53 65 65 6e 44 6f 6e 65 29 20 3f 20 53 51   bSeenDone) ? SQ
1a690 4c 49 54 45 5f 44 4f 4e 45 20 3a 20 72 63 3b 0a  LITE_DONE : rc;.
1a6a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1a6b0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1a6c0 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 65   when the user e
1a6d0 78 65 63 75 74 65 73 20 74 68 65 20 66 6f 6c 6c  xecutes the foll
1a6e0 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 3a  owing statement:
1a6f0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 4e 53 45 52  .**.**     INSER
1a700 54 20 49 4e 54 4f 20 3c 74 62 6c 3e 28 3c 74 62  T INTO <tbl>(<tb
1a710 6c 3e 29 20 56 41 4c 55 45 53 28 27 72 65 62 75  l>) VALUES('rebu
1a720 69 6c 64 27 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ild');.**.** The
1a730 20 65 6e 74 69 72 65 20 46 54 53 20 69 6e 64 65   entire FTS inde
1a740 78 20 69 73 20 64 69 73 63 61 72 64 65 64 20 61  x is discarded a
1a750 6e 64 20 72 65 62 75 69 6c 74 2e 20 49 66 20 74  nd rebuilt. If t
1a760 68 65 20 74 61 62 6c 65 20 69 73 20 6f 6e 65 20  he table is one 
1a770 0a 2a 2a 20 63 72 65 61 74 65 64 20 75 73 69 6e  .** created usin
1a780 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 3d 78 78  g the content=xx
1a790 78 20 6f 70 74 69 6f 6e 2c 20 74 68 65 6e 20 74  x option, then t
1a7a0 68 65 20 6e 65 77 20 69 6e 64 65 78 20 69 73 20  he new index is 
1a7b0 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20  based on.** the 
1a7c0 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73  current contents
1a7d0 20 6f 66 20 74 68 65 20 78 78 78 20 74 61 62 6c   of the xxx tabl
1a7e0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
1a7f0 20 69 73 20 72 65 62 75 69 6c 74 20 62 61 73 65   is rebuilt base
1a800 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f 6e 74  d.** on the cont
1a810 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 63 6f  ents of the %_co
1a820 6e 74 65 6e 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a  ntent table..*/.
1a830 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 44  static int fts3D
1a840 6f 52 65 62 75 69 6c 64 28 46 74 73 33 54 61 62  oRebuild(Fts3Tab
1a850 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  le *p){.  int rc
1a860 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1a880 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20 20 72  urn Code */..  r
1a890 63 20 3d 20 66 74 73 33 44 65 6c 65 74 65 41 6c  c = fts3DeleteAl
1a8a0 6c 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  l(p, 0);.  if( r
1a8b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a8c0 20 20 20 20 75 33 32 20 2a 61 53 7a 20 3d 20 30      u32 *aSz = 0
1a8d0 3b 0a 20 20 20 20 75 33 32 20 2a 61 53 7a 49 6e  ;.    u32 *aSzIn
1a8e0 73 20 3d 20 30 3b 0a 20 20 20 20 75 33 32 20 2a  s = 0;.    u32 *
1a8f0 61 53 7a 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20  aSzDel = 0;.    
1a900 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1a910 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  tmt = 0;.    int
1a920 20 6e 45 6e 74 72 79 20 3d 20 30 3b 0a 0a 20 20   nEntry = 0;..  
1a930 20 20 2f 2a 20 43 6f 6d 70 6f 73 65 20 61 6e 64    /* Compose and
1a940 20 70 72 65 70 61 72 65 20 61 6e 20 53 51 4c 20   prepare an SQL 
1a950 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 6c 6f 6f  statement to loo
1a960 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f  p through the co
1a970 6e 74 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20  ntent table */. 
1a980 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20     char *zSql = 
1a990 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1a9a0 22 53 45 4c 45 43 54 20 25 73 22 20 2c 20 70 2d  "SELECT %s" , p-
1a9b0 3e 7a 52 65 61 64 45 78 70 72 6c 69 73 74 29 3b  >zReadExprlist);
1a9c0 0a 20 20 20 20 69 66 28 20 21 7a 53 71 6c 20 29  .    if( !zSql )
1a9d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1a9e0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
1a9f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1aa00 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1aa10 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
1aa20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
1aa30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1aa40 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  ree(zSql);.    }
1aa50 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
1aa60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1aa70 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a   int nByte = siz
1aa80 65 6f 66 28 75 33 32 29 20 2a 20 28 70 2d 3e 6e  eof(u32) * (p->n
1aa90 43 6f 6c 75 6d 6e 2b 31 29 2a 33 3b 0a 20 20 20  Column+1)*3;.   
1aaa0 20 20 20 61 53 7a 20 3d 20 28 75 33 32 20 2a 29     aSz = (u32 *)
1aab0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
1aac0 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
1aad0 20 61 53 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20   aSz==0 ){.     
1aae0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1aaf0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  OMEM;.      }els
1ab00 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
1ab10 74 28 61 53 7a 2c 20 30 2c 20 6e 42 79 74 65 29  t(aSz, 0, nByte)
1ab20 3b 0a 20 20 20 20 20 20 20 20 61 53 7a 49 6e 73  ;.        aSzIns
1ab30 20 3d 20 26 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75   = &aSz[p->nColu
1ab40 6d 6e 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61  mn+1];.        a
1ab50 53 7a 44 65 6c 20 3d 20 26 61 53 7a 49 6e 73 5b  SzDel = &aSzIns[
1ab60 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 5d 3b 0a 20  p->nColumn+1];. 
1ab70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1ab80 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
1ab90 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
1aba0 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
1abb0 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
1abc0 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20     int iCol;.   
1abd0 20 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 20 3d     int iLangid =
1abe0 20 6c 61 6e 67 69 64 46 72 6f 6d 53 65 6c 65 63   langidFromSelec
1abf0 74 28 70 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20  t(p, pStmt);.   
1ac00 20 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64     rc = fts3Pend
1ac10 69 6e 67 54 65 72 6d 73 44 6f 63 69 64 28 70 2c  ingTermsDocid(p,
1ac20 20 69 4c 61 6e 67 69 64 2c 20 73 71 6c 69 74 65   iLangid, sqlite
1ac30 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
1ac40 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 20 20 20  Stmt, 0));.     
1ac50 20 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d   aSz[p->nColumn]
1ac60 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
1ac70 69 43 6f 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  iCol=0; rc==SQLI
1ac80 54 45 5f 4f 4b 20 26 26 20 69 43 6f 6c 3c 70 2d  TE_OK && iCol<p-
1ac90 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 43 6f 6c 2b 2b  >nColumn; iCol++
1aca0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
1acb0 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73   char *z = (cons
1acc0 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74 65  t char *) sqlite
1acd0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
1ace0 74 6d 74 2c 20 69 43 6f 6c 2b 31 29 3b 0a 20 20  tmt, iCol+1);.  
1acf0 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 50        rc = fts3P
1ad00 65 6e 64 69 6e 67 54 65 72 6d 73 41 64 64 28 70  endingTermsAdd(p
1ad10 2c 20 69 4c 61 6e 67 69 64 2c 20 7a 2c 20 69 43  , iLangid, z, iC
1ad20 6f 6c 2c 20 26 61 53 7a 5b 69 43 6f 6c 5d 29 3b  ol, &aSz[iCol]);
1ad30 0a 20 20 20 20 20 20 20 20 61 53 7a 5b 70 2d 3e  .        aSz[p->
1ad40 6e 43 6f 6c 75 6d 6e 5d 20 2b 3d 20 73 71 6c 69  nColumn] += sqli
1ad50 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
1ad60 28 70 53 74 6d 74 2c 20 69 43 6f 6c 2b 31 29 3b  (pStmt, iCol+1);
1ad70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1ad80 66 28 20 70 2d 3e 62 48 61 73 44 6f 63 73 69 7a  f( p->bHasDocsiz
1ad90 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  e ){.        fts
1ada0 33 49 6e 73 65 72 74 44 6f 63 73 69 7a 65 28 26  3InsertDocsize(&
1adb0 72 63 2c 20 70 2c 20 61 53 7a 29 3b 0a 20 20 20  rc, p, aSz);.   
1adc0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
1add0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1ade0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1adf0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
1ae00 0a 20 20 20 20 20 20 20 20 70 53 74 6d 74 20 3d  .        pStmt =
1ae10 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
1ae20 0a 20 20 20 20 20 20 20 20 6e 45 6e 74 72 79 2b  .        nEntry+
1ae30 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  +;.        for(i
1ae40 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 3d 70 2d 3e  Col=0; iCol<=p->
1ae50 6e 43 6f 6c 75 6d 6e 3b 20 69 43 6f 6c 2b 2b 29  nColumn; iCol++)
1ae60 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53 7a 49  {.          aSzI
1ae70 6e 73 5b 69 43 6f 6c 5d 20 2b 3d 20 61 53 7a 5b  ns[iCol] += aSz[
1ae80 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20 7d  iCol];.        }
1ae90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1aea0 20 20 20 69 66 28 20 70 2d 3e 62 48 61 73 53 74     if( p->bHasSt
1aeb0 61 74 20 29 7b 0a 20 20 20 20 20 20 66 74 73 33  at ){.      fts3
1aec0 55 70 64 61 74 65 44 6f 63 54 6f 74 61 6c 73 28  UpdateDocTotals(
1aed0 26 72 63 2c 20 70 2c 20 61 53 7a 49 6e 73 2c 20  &rc, p, aSzIns, 
1aee0 61 53 7a 44 65 6c 2c 20 6e 45 6e 74 72 79 29 3b  aSzDel, nEntry);
1aef0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1af00 65 33 5f 66 72 65 65 28 61 53 7a 29 3b 0a 0a 20  e3_free(aSz);.. 
1af10 20 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a     if( pStmt ){.
1af20 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20        int rc2 = 
1af30 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
1af40 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69  (pStmt);.      i
1af50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1af60 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1af70 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc2;.      }.  
1af80 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
1af90 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1afa0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 70  This function op
1afb0 65 6e 73 20 61 20 63 75 72 73 6f 72 20 75 73 65  ens a cursor use
1afc0 64 20 74 6f 20 72 65 61 64 20 74 68 65 20 69 6e  d to read the in
1afd0 70 75 74 20 64 61 74 61 20 66 6f 72 20 61 6e 20  put data for an 
1afe0 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  .** incremental 
1aff0 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e  merge operation.
1b000 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69   Specifically, i
1b010 74 20 6f 70 65 6e 73 20 61 20 63 75 72 73 6f 72  t opens a cursor
1b020 20 74 6f 20 73 63 61 6e 0a 2a 2a 20 74 68 65 20   to scan.** the 
1b030 6f 6c 64 65 73 74 20 6e 53 65 67 20 73 65 67 6d  oldest nSeg segm
1b040 65 6e 74 73 20 28 69 64 78 3d 30 20 74 68 72 6f  ents (idx=0 thro
1b050 75 67 68 20 69 64 78 3d 28 6e 53 65 67 2d 31 29  ugh idx=(nSeg-1)
1b060 29 20 69 6e 20 61 62 73 6f 6c 75 74 65 20 0a 2a  ) in absolute .*
1b070 2a 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65  * level iAbsLeve
1b080 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
1b090 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 43 73   fts3IncrmergeCs
1b0a0 72 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  r(.  Fts3Table *
1b0b0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1b0c0 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62       /* FTS3 tab
1b0d0 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73  le handle */.  s
1b0e0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 41 62  qlite3_int64 iAb
1b0f0 73 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 2f  sLevel,        /
1b100 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c  * Absolute level
1b110 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
1b120 74 20 6e 53 65 67 2c 20 20 20 20 20 20 20 20 20  t nSeg,         
1b130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b140 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   Number of segme
1b150 6e 74 73 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a  nts to merge */.
1b160 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65    Fts3MultiSegRe
1b170 61 64 65 72 20 2a 70 43 73 72 20 20 20 20 20 20  ader *pCsr      
1b180 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65    /* Cursor obje
1b190 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a  ct to populate *
1b1a0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
1b1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1c0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1b1d0 20 43 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   Code */.  sqlit
1b1e0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
1b1f0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74   0;        /* St
1b200 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20  atement used to 
1b210 72 65 61 64 20 25 5f 73 65 67 64 69 72 20 65 6e  read %_segdir en
1b220 74 72 79 20 2a 2f 20 20 0a 20 20 69 6e 74 20 6e  try */  .  int n
1b230 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
1b240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
1b250 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 74  tes allocated at
1b260 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74   pCsr->apSegment
1b270 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  [] */..  /* Allo
1b280 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
1b290 68 65 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52  he Fts3MultiSegR
1b2a0 65 61 64 65 72 2e 61 43 73 72 5b 5d 20 61 72 72  eader.aCsr[] arr
1b2b0 61 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 70  ay */.  memset(p
1b2c0 43 73 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  Csr, 0, sizeof(*
1b2d0 70 43 73 72 29 29 3b 0a 20 20 6e 42 79 74 65 20  pCsr));.  nByte 
1b2e0 3d 20 73 69 7a 65 6f 66 28 46 74 73 33 53 65 67  = sizeof(Fts3Seg
1b2f0 52 65 61 64 65 72 20 2a 29 20 2a 20 6e 53 65 67  Reader *) * nSeg
1b300 3b 0a 20 20 70 43 73 72 2d 3e 61 70 53 65 67 6d  ;.  pCsr->apSegm
1b310 65 6e 74 20 3d 20 28 46 74 73 33 53 65 67 52 65  ent = (Fts3SegRe
1b320 61 64 65 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f  ader **)sqlite3_
1b330 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 0a  malloc(nByte);..
1b340 20 20 69 66 28 20 70 43 73 72 2d 3e 61 70 53 65    if( pCsr->apSe
1b350 67 6d 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  gment==0 ){.    
1b360 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1b370 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
1b380 6d 65 6d 73 65 74 28 70 43 73 72 2d 3e 61 70 53  memset(pCsr->apS
1b390 65 67 6d 65 6e 74 2c 20 30 2c 20 6e 42 79 74 65  egment, 0, nByte
1b3a0 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  );.    rc = fts3
1b3b0 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53  SqlStmt(p, SQL_S
1b3c0 45 4c 45 43 54 5f 4c 45 56 45 4c 2c 20 26 70 53  ELECT_LEVEL, &pS
1b3d0 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  tmt, 0);.  }.  i
1b3e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b3f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
1b400 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20     int rc2;.    
1b410 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
1b420 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 69 41 62  64(pStmt, 1, iAb
1b430 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20 61 73 73  sLevel);.    ass
1b440 65 72 74 28 20 70 43 73 72 2d 3e 6e 53 65 67 6d  ert( pCsr->nSegm
1b450 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f  ent==0 );.    fo
1b460 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
1b470 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 5f  E_OK && sqlite3_
1b480 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
1b490 49 54 45 5f 52 4f 57 20 26 26 20 69 3c 6e 53 65  ITE_ROW && i<nSe
1b4a0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  g; i++){.      r
1b4b0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53  c = sqlite3Fts3S
1b4c0 65 67 52 65 61 64 65 72 4e 65 77 28 69 2c 20 30  egReaderNew(i, 0
1b4d0 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ,.          sqli
1b4e0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
1b4f0 28 70 53 74 6d 74 2c 20 31 29 2c 20 20 20 20 20  (pStmt, 1),     
1b500 20 20 20 2f 2a 20 73 65 67 64 69 72 2e 73 74 61     /* segdir.sta
1b510 72 74 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  rt_block */.    
1b520 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
1b530 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
1b540 2c 20 32 29 2c 20 20 20 20 20 20 20 20 2f 2a 20  , 2),        /* 
1b550 73 65 67 64 69 72 2e 6c 65 61 76 65 73 5f 65 6e  segdir.leaves_en
1b560 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  d_block */.     
1b570 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
1b580 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
1b590 20 33 29 2c 20 20 20 20 20 20 20 20 2f 2a 20 73   3),        /* s
1b5a0 65 67 64 69 72 2e 65 6e 64 5f 62 6c 6f 63 6b 20  egdir.end_block 
1b5b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
1b5c0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
1b5d0 28 70 53 74 6d 74 2c 20 34 29 2c 20 20 20 20 20  (pStmt, 4),     
1b5e0 20 20 20 20 2f 2a 20 73 65 67 64 69 72 2e 72 6f      /* segdir.ro
1b5f0 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ot */.          
1b600 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1b610 79 74 65 73 28 70 53 74 6d 74 2c 20 34 29 2c 20  ytes(pStmt, 4), 
1b620 20 20 20 20 20 20 20 2f 2a 20 73 65 67 64 69 72         /* segdir
1b630 2e 72 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20  .root */.       
1b640 20 20 20 26 70 43 73 72 2d 3e 61 70 53 65 67 6d     &pCsr->apSegm
1b650 65 6e 74 5b 69 5d 0a 20 20 20 20 20 20 29 3b 0a  ent[i].      );.
1b660 20 20 20 20 20 20 70 43 73 72 2d 3e 6e 53 65 67        pCsr->nSeg
1b670 6d 65 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  ment++;.    }.  
1b680 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
1b690 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
1b6a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b6b0 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
1b6c0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1b6d0 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72  ;.}..typedef str
1b6e0 75 63 74 20 49 6e 63 72 6d 65 72 67 65 57 72 69  uct IncrmergeWri
1b6f0 74 65 72 20 49 6e 63 72 6d 65 72 67 65 57 72 69  ter IncrmergeWri
1b700 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
1b710 75 63 74 20 4e 6f 64 65 57 72 69 74 65 72 20 4e  uct NodeWriter N
1b720 6f 64 65 57 72 69 74 65 72 3b 0a 74 79 70 65 64  odeWriter;.typed
1b730 65 66 20 73 74 72 75 63 74 20 42 6c 6f 62 20 42  ef struct Blob B
1b740 6c 6f 62 3b 0a 74 79 70 65 64 65 66 20 73 74 72  lob;.typedef str
1b750 75 63 74 20 4e 6f 64 65 52 65 61 64 65 72 20 4e  uct NodeReader N
1b760 6f 64 65 52 65 61 64 65 72 3b 0a 0a 2f 2a 0a 2a  odeReader;../*.*
1b770 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
1b780 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
1b790 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64  tructure is used
1b7a0 20 61 73 20 61 20 64 79 6e 61 6d 69 63 20 62 75   as a dynamic bu
1b7b0 66 66 65 72 0a 2a 2a 20 74 6f 20 62 75 69 6c 64  ffer.** to build
1b7c0 20 75 70 20 6e 6f 64 65 73 20 6f 72 20 6f 74 68   up nodes or oth
1b7d0 65 72 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61  er blobs of data
1b7e0 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66   in..**.** The f
1b7f0 75 6e 63 74 69 6f 6e 20 62 6c 6f 62 47 72 6f 77  unction blobGrow
1b800 42 75 66 66 65 72 28 29 20 69 73 20 75 73 65 64  Buffer() is used
1b810 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 61   to extend the a
1b820 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  llocation..*/.st
1b830 72 75 63 74 20 42 6c 6f 62 20 7b 0a 20 20 63 68  ruct Blob {.  ch
1b840 61 72 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20  ar *a;          
1b850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b860 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 6c 6c 6f   Pointer to allo
1b870 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  cation */.  int 
1b880 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1b890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1b8a0 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 62  umber of valid b
1b8b0 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20  ytes of data in 
1b8c0 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c  a[] */.  int nAl
1b8d0 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  loc;            
1b8e0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
1b8f0 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 5b  cated size of a[
1b900 5d 20 28 6e 41 6c 6c 6f 63 3e 3d 6e 29 20 2a 2f  ] (nAlloc>=n) */
1b910 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .};../*.** This 
1b920 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65  structure is use
1b930 64 20 74 6f 20 62 75 69 6c 64 20 75 70 20 62 75  d to build up bu
1b940 66 66 65 72 73 20 63 6f 6e 74 61 69 6e 69 6e 67  ffers containing
1b950 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20   segment b-tree 
1b960 0a 2a 2a 20 6e 6f 64 65 73 20 28 62 6c 6f 63 6b  .** nodes (block
1b970 73 29 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4e 6f  s)..*/.struct No
1b980 64 65 57 72 69 74 65 72 20 7b 0a 20 20 73 71 6c  deWriter {.  sql
1b990 69 74 65 33 5f 69 6e 74 36 34 20 69 42 6c 6f 63  ite3_int64 iBloc
1b9a0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  k;           /* 
1b9b0 43 75 72 72 65 6e 74 20 62 6c 6f 63 6b 20 69 64  Current block id
1b9c0 20 2a 2f 0a 20 20 42 6c 6f 62 20 6b 65 79 3b 20   */.  Blob key; 
1b9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9e0 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 6b 65        /* Last ke
1b9f0 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
1ba00 20 63 75 72 72 65 6e 74 20 62 6c 6f 63 6b 20 2a   current block *
1ba10 2f 0a 20 20 42 6c 6f 62 20 62 6c 6f 63 6b 3b 20  /.  Blob block; 
1ba20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba30 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62      /* Current b
1ba40 6c 6f 63 6b 20 69 6d 61 67 65 20 2a 2f 0a 7d 3b  lock image */.};
1ba50 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63  ../*.** An objec
1ba60 74 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 63  t of this type c
1ba70 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 74 61 74  ontains the stat
1ba80 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 72  e required to cr
1ba90 65 61 74 65 20 6f 72 20 61 70 70 65 6e 64 0a 2a  eate or append.*
1baa0 2a 20 74 6f 20 61 6e 20 61 70 70 65 6e 64 61 62  * to an appendab
1bab0 6c 65 20 62 2d 74 72 65 65 20 73 65 67 6d 65 6e  le b-tree segmen
1bac0 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 49 6e 63  t..*/.struct Inc
1bad0 72 6d 65 72 67 65 57 72 69 74 65 72 20 7b 0a 20  rmergeWriter {. 
1bae0 20 69 6e 74 20 6e 4c 65 61 66 45 73 74 3b 20 20   int nLeafEst;  
1baf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb00 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61   /* Space alloca
1bb10 74 65 64 20 66 6f 72 20 6c 65 61 66 20 62 6c 6f  ted for leaf blo
1bb20 63 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 57 6f  cks */.  int nWo
1bb30 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
1bb40 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1bb50 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73  er of leaf pages
1bb60 20 66 6c 75 73 68 65 64 20 2a 2f 0a 20 20 73 71   flushed */.  sq
1bb70 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 41 62 73  lite3_int64 iAbs
1bb80 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a  Level;        /*
1bb90 20 41 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20   Absolute level 
1bba0 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  of input segment
1bbb0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 3b  s */.  int iIdx;
1bbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbd0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1bbe0 6f 66 20 2a 6f 75 74 70 75 74 2a 20 73 65 67 6d  of *output* segm
1bbf0 65 6e 74 20 69 6e 20 69 41 62 73 4c 65 76 65 6c  ent in iAbsLevel
1bc00 2b 31 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  +1 */.  sqlite3_
1bc10 69 6e 74 36 34 20 69 53 74 61 72 74 3b 20 20 20  int64 iStart;   
1bc20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b          /* Block
1bc30 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 72 73 74   number of first
1bc40 20 61 6c 6c 6f 63 61 74 65 64 20 62 6c 6f 63 6b   allocated block
1bc50 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
1bc60 74 36 34 20 69 45 6e 64 3b 20 20 20 20 20 20 20  t64 iEnd;       
1bc70 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 6e        /* Block n
1bc80 75 6d 62 65 72 20 6f 66 20 6c 61 73 74 20 61 6c  umber of last al
1bc90 6c 6f 63 61 74 65 64 20 62 6c 6f 63 6b 20 2a 2f  located block */
1bca0 0a 20 20 4e 6f 64 65 57 72 69 74 65 72 20 61 4e  .  NodeWriter aN
1bcb0 6f 64 65 57 72 69 74 65 72 5b 46 54 53 5f 4d 41  odeWriter[FTS_MA
1bcc0 58 5f 41 50 50 45 4e 44 41 42 4c 45 5f 48 45 49  X_APPENDABLE_HEI
1bcd0 47 48 54 5d 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  GHT];.};../*.** 
1bce0 41 6e 20 6f 62 6a 65 63 74 20 6f 66 20 74 68 65  An object of the
1bcf0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20   following type 
1bd00 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
1bd10 64 61 74 61 20 66 72 6f 6d 20 61 20 73 69 6e 67  data from a sing
1bd20 6c 65 0a 2a 2a 20 46 54 53 20 73 65 67 6d 65 6e  le.** FTS segmen
1bd30 74 20 6e 6f 64 65 2e 20 53 65 65 20 74 68 65 20  t node. See the 
1bd40 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
1bd50 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 6e  ons:.**.**     n
1bd60 6f 64 65 52 65 61 64 65 72 49 6e 69 74 28 29 0a  odeReaderInit().
1bd70 2a 2a 20 20 20 20 20 6e 6f 64 65 52 65 61 64 65  **     nodeReade
1bd80 72 4e 65 78 74 28 29 0a 2a 2a 20 20 20 20 20 6e  rNext().**     n
1bd90 6f 64 65 52 65 61 64 65 72 52 65 6c 65 61 73 65  odeReaderRelease
1bda0 28 29 0a 2a 2f 0a 73 74 72 75 63 74 20 4e 6f 64  ().*/.struct Nod
1bdb0 65 52 65 61 64 65 72 20 7b 0a 20 20 63 6f 6e 73  eReader {.  cons
1bdc0 74 20 63 68 61 72 20 2a 61 4e 6f 64 65 3b 0a 20  t char *aNode;. 
1bdd0 20 69 6e 74 20 6e 4e 6f 64 65 3b 0a 20 20 69 6e   int nNode;.  in
1bde0 74 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20  t iOff;         
1bdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1be00 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74 20   Current offset 
1be10 77 69 74 68 69 6e 20 61 4e 6f 64 65 5b 5d 20 2a  within aNode[] *
1be20 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 76  /..  /* Output v
1be30 61 72 69 61 62 6c 65 73 2e 20 43 6f 6e 74 61 69  ariables. Contai
1be40 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ning the current
1be50 20 6e 6f 64 65 20 65 6e 74 72 79 2e 20 2a 2f 0a   node entry. */.
1be60 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1be70 69 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20  iChild;         
1be80 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1be90 63 68 69 6c 64 20 6e 6f 64 65 20 2a 2f 0a 20 20  child node */.  
1bea0 42 6c 6f 62 20 74 65 72 6d 3b 20 20 20 20 20 20  Blob term;      
1beb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bec0 2f 2a 20 43 75 72 72 65 6e 74 20 74 65 72 6d 20  /* Current term 
1bed0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1bee0 2a 61 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20  *aDoclist;      
1bef0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1bf00 74 6f 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20  to doclist */.  
1bf10 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20  int nDoclist;   
1bf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf30 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69  /* Size of docli
1bf40 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 7d  st in bytes */.}
1bf50 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 52 63  ;../*.** If *pRc
1bf60 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f   is not SQLITE_O
1bf70 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
1bf80 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
1bf90 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
1bfa0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
1bfb0 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61  the allocation a
1bfc0 74 20 70 42 6c 6f 62 2d 3e 61 20 69 73 20 6e 6f  t pBlob->a is no
1bfd0 74 20 61 6c 72 65 61 64 79 20 61 74 20 6c 65 61  t already at lea
1bfe0 73 74 20 6e 4d 69 6e 0a 2a 2a 20 62 79 74 65 73  st nMin.** bytes
1bff0 20 69 6e 20 73 69 7a 65 2c 20 65 78 74 65 6e 64   in size, extend
1c000 20 28 72 65 61 6c 6c 6f 63 29 20 69 74 20 74 6f   (realloc) it to
1c010 20 62 65 20 73 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66   be so..**.** If
1c020 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63   an OOM error oc
1c030 63 75 72 73 2c 20 73 65 74 20 2a 70 52 63 20 74  curs, set *pRc t
1c040 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61  o SQLITE_NOMEM a
1c050 6e 64 20 6c 65 61 76 65 20 70 42 6c 6f 62 2d 3e  nd leave pBlob->
1c060 61 0a 2a 2a 20 75 6e 6d 6f 64 69 66 69 65 64 2e  a.** unmodified.
1c070 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1c080 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 75  he allocation su
1c090 63 63 65 65 64 73 2c 20 75 70 64 61 74 65 20 70  cceeds, update p
1c0a0 42 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63 0a 2a 2a 20  Blob->nAlloc.** 
1c0b0 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20 6e  to reflect the n
1c0c0 65 77 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70  ew size of the p
1c0d0 42 6c 6f 62 2d 3e 61 5b 5d 20 62 75 66 66 65 72  Blob->a[] buffer
1c0e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1c0f0 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28   blobGrowBuffer(
1c100 42 6c 6f 62 20 2a 70 42 6c 6f 62 2c 20 69 6e 74  Blob *pBlob, int
1c110 20 6e 4d 69 6e 2c 20 69 6e 74 20 2a 70 52 63 29   nMin, int *pRc)
1c120 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51  {.  if( *pRc==SQ
1c130 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 4d 69 6e 3e  LITE_OK && nMin>
1c140 70 42 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  pBlob->nAlloc ){
1c150 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20  .    int nAlloc 
1c160 3d 20 6e 4d 69 6e 3b 0a 20 20 20 20 63 68 61 72  = nMin;.    char
1c170 20 2a 61 20 3d 20 28 63 68 61 72 20 2a 29 73 71   *a = (char *)sq
1c180 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 42  lite3_realloc(pB
1c190 6c 6f 62 2d 3e 61 2c 20 6e 41 6c 6c 6f 63 29 3b  lob->a, nAlloc);
1c1a0 0a 20 20 20 20 69 66 28 20 61 20 29 7b 0a 20 20  .    if( a ){.  
1c1b0 20 20 20 20 70 42 6c 6f 62 2d 3e 6e 41 6c 6c 6f      pBlob->nAllo
1c1c0 63 20 3d 20 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20  c = nAlloc;.    
1c1d0 20 20 70 42 6c 6f 62 2d 3e 61 20 3d 20 61 3b 0a    pBlob->a = a;.
1c1e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c1f0 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e   *pRc = SQLITE_N
1c200 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
1c210 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
1c220 20 74 6f 20 61 64 76 61 6e 63 65 20 74 68 65 20   to advance the 
1c230 6e 6f 64 65 2d 72 65 61 64 65 72 20 6f 62 6a 65  node-reader obje
1c240 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
1c250 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1c260 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 78 74 20 65  to.** the next e
1c270 6e 74 72 79 20 6f 6e 20 74 68 65 20 6e 6f 64 65  ntry on the node
1c280 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  . .**.** Return 
1c290 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
1c2a0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1c2b0 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69   (SQLITE_NOMEM i
1c2c0 73 20 70 6f 73 73 69 62 6c 65 29 2e 20 0a 2a 2a  s possible). .**
1c2d0 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72   Otherwise retur
1c2e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  n SQLITE_OK. If 
1c2f0 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 78 74  there is no next
1c300 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 6e 6f   entry on the no
1c310 64 65 0a 2a 2a 20 28 65 2e 67 2e 20 62 65 63 61  de.** (e.g. beca
1c320 75 73 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  use the current 
1c330 65 6e 74 72 79 20 69 73 20 74 68 65 20 6c 61 73  entry is the las
1c340 74 29 20 73 65 74 20 4e 6f 64 65 52 65 61 64 65  t) set NodeReade
1c350 72 2d 3e 61 4e 6f 64 65 20 74 6f 0a 2a 2a 20 4e  r->aNode to.** N
1c360 55 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ULL to indicate 
1c370 45 4f 46 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  EOF. Otherwise, 
1c380 70 6f 70 75 6c 61 74 65 20 74 68 65 20 4e 6f 64  populate the Nod
1c390 65 52 65 61 64 65 72 20 73 74 72 75 63 74 75 72  eReader structur
1c3a0 65 20 6f 75 74 70 75 74 20 0a 2a 2a 20 76 61 72  e output .** var
1c3b0 69 61 62 6c 65 73 20 66 6f 72 20 74 68 65 20 6e  iables for the n
1c3c0 65 77 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61  ew entry..*/.sta
1c3d0 74 69 63 20 69 6e 74 20 6e 6f 64 65 52 65 61 64  tic int nodeRead
1c3e0 65 72 4e 65 78 74 28 4e 6f 64 65 52 65 61 64 65  erNext(NodeReade
1c3f0 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 62 46 69  r *p){.  int bFi
1c400 72 73 74 20 3d 20 28 70 2d 3e 74 65 72 6d 2e 6e  rst = (p->term.n
1c410 3d 3d 30 29 3b 20 20 20 20 2f 2a 20 54 72 75 65  ==0);    /* True
1c420 20 66 6f 72 20 66 69 72 73 74 20 74 65 72 6d 20   for first term 
1c430 6f 6e 20 74 68 65 20 6e 6f 64 65 20 2a 2f 0a 20  on the node */. 
1c440 20 69 6e 74 20 6e 50 72 65 66 69 78 20 3d 20 30   int nPrefix = 0
1c450 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c460 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 63 6f 70   /* Bytes to cop
1c470 79 20 66 72 6f 6d 20 70 72 65 76 69 6f 75 73 20  y from previous 
1c480 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  term */.  int nS
1c490 75 66 66 69 78 20 3d 20 30 3b 20 20 20 20 20 20  uffix = 0;      
1c4a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
1c4b0 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  es to append to 
1c4c0 74 68 65 20 70 72 65 66 69 78 20 2a 2f 0a 20 20  the prefix */.  
1c4d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1c4e0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
1c4f0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1c500 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  /..  assert( p->
1c510 61 4e 6f 64 65 20 29 3b 0a 20 20 69 66 28 20 70  aNode );.  if( p
1c520 2d 3e 69 43 68 69 6c 64 20 26 26 20 62 46 69 72  ->iChild && bFir
1c530 73 74 3d 3d 30 20 29 20 70 2d 3e 69 43 68 69 6c  st==0 ) p->iChil
1c540 64 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4f  d++;.  if( p->iO
1c550 66 66 3e 3d 70 2d 3e 6e 4e 6f 64 65 20 29 7b 0a  ff>=p->nNode ){.
1c560 20 20 20 20 2f 2a 20 45 4f 46 20 2a 2f 0a 20 20      /* EOF */.  
1c570 20 20 70 2d 3e 61 4e 6f 64 65 20 3d 20 30 3b 0a    p->aNode = 0;.
1c580 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
1c590 20 62 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20   bFirst==0 ){.  
1c5a0 20 20 20 20 70 2d 3e 69 4f 66 66 20 2b 3d 20 73      p->iOff += s
1c5b0 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
1c5c0 69 6e 74 33 32 28 26 70 2d 3e 61 4e 6f 64 65 5b  int32(&p->aNode[
1c5d0 70 2d 3e 69 4f 66 66 5d 2c 20 26 6e 50 72 65 66  p->iOff], &nPref
1c5e0 69 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ix);.    }.    p
1c5f0 2d 3e 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65  ->iOff += sqlite
1c600 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 33 32  3Fts3GetVarint32
1c610 28 26 70 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f  (&p->aNode[p->iO
1c620 66 66 5d 2c 20 26 6e 53 75 66 66 69 78 29 3b 0a  ff], &nSuffix);.
1c630 0a 20 20 20 20 62 6c 6f 62 47 72 6f 77 42 75 66  .    blobGrowBuf
1c640 66 65 72 28 26 70 2d 3e 74 65 72 6d 2c 20 6e 50  fer(&p->term, nP
1c650 72 65 66 69 78 2b 6e 53 75 66 66 69 78 2c 20 26  refix+nSuffix, &
1c660 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  rc);.    if( rc=
1c670 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c680 20 20 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 74      memcpy(&p->t
1c690 65 72 6d 2e 61 5b 6e 50 72 65 66 69 78 5d 2c 20  erm.a[nPrefix], 
1c6a0 26 70 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f 66  &p->aNode[p->iOf
1c6b0 66 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20  f], nSuffix);.  
1c6c0 20 20 20 20 70 2d 3e 74 65 72 6d 2e 6e 20 3d 20      p->term.n = 
1c6d0 6e 50 72 65 66 69 78 2b 6e 53 75 66 66 69 78 3b  nPrefix+nSuffix;
1c6e0 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 20 2b  .      p->iOff +
1c6f0 3d 20 6e 53 75 66 66 69 78 3b 0a 20 20 20 20 20  = nSuffix;.     
1c700 20 69 66 28 20 70 2d 3e 69 43 68 69 6c 64 3d 3d   if( p->iChild==
1c710 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
1c720 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46  iOff += sqlite3F
1c730 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts3GetVarint32(&
1c740 70 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f 66 66  p->aNode[p->iOff
1c750 5d 2c 20 26 70 2d 3e 6e 44 6f 63 6c 69 73 74 29  ], &p->nDoclist)
1c760 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 44 6f  ;.        p->aDo
1c770 63 6c 69 73 74 20 3d 20 26 70 2d 3e 61 4e 6f 64  clist = &p->aNod
1c780 65 5b 70 2d 3e 69 4f 66 66 5d 3b 0a 20 20 20 20  e[p->iOff];.    
1c790 20 20 20 20 70 2d 3e 69 4f 66 66 20 2b 3d 20 70      p->iOff += p
1c7a0 2d 3e 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20  ->nDoclist;.    
1c7b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1c7c0 20 61 73 73 65 72 74 28 20 70 2d 3e 69 4f 66 66   assert( p->iOff
1c7d0 3c 3d 70 2d 3e 6e 4e 6f 64 65 20 29 3b 0a 0a 20  <=p->nNode );.. 
1c7e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1c7f0 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c  *.** Release all
1c800 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63   dynamic resourc
1c810 65 73 20 68 65 6c 64 20 62 79 20 6e 6f 64 65 2d  es held by node-
1c820 72 65 61 64 65 72 20 6f 62 6a 65 63 74 20 2a 70  reader object *p
1c830 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1c840 20 6e 6f 64 65 52 65 61 64 65 72 52 65 6c 65 61   nodeReaderRelea
1c850 73 65 28 4e 6f 64 65 52 65 61 64 65 72 20 2a 70  se(NodeReader *p
1c860 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ){.  sqlite3_fre
1c870 65 28 70 2d 3e 74 65 72 6d 2e 61 29 3b 0a 7d 0a  e(p->term.a);.}.
1c880 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
1c890 65 20 61 20 6e 6f 64 65 2d 72 65 61 64 65 72 20  e a node-reader 
1c8a0 6f 62 6a 65 63 74 20 74 6f 20 72 65 61 64 20 74  object to read t
1c8b0 68 65 20 6e 6f 64 65 20 69 6e 20 62 75 66 66 65  he node in buffe
1c8c0 72 20 61 4e 6f 64 65 2f 6e 4e 6f 64 65 2e 0a 2a  r aNode/nNode..*
1c8d0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
1c8e0 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
1c8f0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
1c900 65 20 4e 6f 64 65 52 65 61 64 65 72 20 6f 62 6a  e NodeReader obj
1c910 65 63 74 20 73 65 74 20 74 6f 20 0a 2a 2a 20 70  ect set to .** p
1c920 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73  oint to the firs
1c930 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 6e  t entry on the n
1c940 6f 64 65 20 28 69 66 20 61 6e 79 29 2e 20 4f 74  ode (if any). Ot
1c950 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69  herwise, an SQLi
1c960 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  te.** error code
1c970 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1c980 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 64 65  .static int node
1c990 52 65 61 64 65 72 49 6e 69 74 28 4e 6f 64 65 52  ReaderInit(NodeR
1c9a0 65 61 64 65 72 20 2a 70 2c 20 63 6f 6e 73 74 20  eader *p, const 
1c9b0 63 68 61 72 20 2a 61 4e 6f 64 65 2c 20 69 6e 74  char *aNode, int
1c9c0 20 6e 4e 6f 64 65 29 7b 0a 20 20 6d 65 6d 73 65   nNode){.  memse
1c9d0 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4e  t(p, 0, sizeof(N
1c9e0 6f 64 65 52 65 61 64 65 72 29 29 3b 0a 20 20 70  odeReader));.  p
1c9f0 2d 3e 61 4e 6f 64 65 20 3d 20 61 4e 6f 64 65 3b  ->aNode = aNode;
1ca00 0a 20 20 70 2d 3e 6e 4e 6f 64 65 20 3d 20 6e 4e  .  p->nNode = nN
1ca10 6f 64 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  ode;..  /* Figur
1ca20 65 20 6f 75 74 20 69 66 20 74 68 69 73 20 69 73  e out if this is
1ca30 20 61 20 6c 65 61 66 20 6f 72 20 61 6e 20 69 6e   a leaf or an in
1ca40 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 20 2a 2f 0a  ternal node. */.
1ca50 20 20 69 66 28 20 70 2d 3e 61 4e 6f 64 65 5b 30    if( p->aNode[0
1ca60 5d 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 69  ] ){.    /* An i
1ca70 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 20 2a 2f  nternal node. */
1ca80 0a 20 20 20 20 70 2d 3e 69 4f 66 66 20 3d 20 31  .    p->iOff = 1
1ca90 20 2b 20 73 71 6c 69 74 65 33 46 74 73 33 47 65   + sqlite3Fts3Ge
1caa0 74 56 61 72 69 6e 74 28 26 70 2d 3e 61 4e 6f 64  tVarint(&p->aNod
1cab0 65 5b 31 5d 2c 20 26 70 2d 3e 69 43 68 69 6c 64  e[1], &p->iChild
1cac0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1cad0 70 2d 3e 69 4f 66 66 20 3d 20 31 3b 0a 20 20 7d  p->iOff = 1;.  }
1cae0 0a 0a 20 20 72 65 74 75 72 6e 20 6e 6f 64 65 52  ..  return nodeR
1caf0 65 61 64 65 72 4e 65 78 74 28 70 29 3b 0a 7d 0a  eaderNext(p);.}.
1cb00 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1cb10 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
1cb20 68 69 6c 65 20 77 72 69 74 69 6e 67 20 61 6e 20  hile writing an 
1cb30 46 54 53 20 73 65 67 6d 65 6e 74 20 65 61 63 68  FTS segment each
1cb40 20 74 69 6d 65 20 61 20 6c 65 61 66 20 6f 0a 2a   time a leaf o.*
1cb50 2a 20 6e 6f 64 65 20 69 73 20 66 69 6e 69 73 68  * node is finish
1cb60 65 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20 74  ed and written t
1cb70 6f 20 64 69 73 6b 2e 20 54 68 65 20 6b 65 79 20  o disk. The key 
1cb80 28 7a 54 65 72 6d 2f 6e 54 65 72 6d 29 20 69 73  (zTerm/nTerm) is
1cb90 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
1cba0 6f 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  o be greater tha
1cbb0 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  n the largest ke
1cbc0 79 20 6f 6e 20 74 68 65 20 6e 6f 64 65 20 6a 75  y on the node ju
1cbd0 73 74 20 77 72 69 74 74 65 6e 2c 20 62 75 74 20  st written, but 
1cbe0 73 6d 61 6c 6c 65 72 0a 2a 2a 20 74 68 61 6e 20  smaller.** than 
1cbf0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
1cc00 66 69 72 73 74 20 6b 65 79 20 74 68 61 74 20 77  first key that w
1cc10 69 6c 6c 20 62 65 20 77 72 69 74 74 65 6e 20 74  ill be written t
1cc20 6f 20 74 68 65 20 6e 65 78 74 20 6c 65 61 66 0a  o the next leaf.
1cc30 2a 2a 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  ** node..**.** T
1cc40 68 65 20 62 6c 6f 63 6b 20 69 64 20 6f 66 20 74  he block id of t
1cc50 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 6a 75 73  he leaf node jus
1cc60 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  t written to dis
1cc70 6b 20 6d 61 79 20 62 65 20 66 6f 75 6e 64 20 69  k may be found i
1cc80 6e 0a 2a 2a 20 28 70 57 72 69 74 65 72 2d 3e 61  n.** (pWriter->a
1cc90 4e 6f 64 65 57 72 69 74 65 72 5b 30 5d 2e 69 42  NodeWriter[0].iB
1cca0 6c 6f 63 6b 29 20 77 68 65 6e 20 74 68 69 73 20  lock) when this 
1ccb0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1ccc0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1ccd0 74 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 50  t fts3IncrmergeP
1cce0 75 73 68 28 0a 20 20 46 74 73 33 54 61 62 6c 65  ush(.  Fts3Table
1ccf0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1cd00 20 20 20 20 20 20 20 2f 2a 20 46 74 73 33 20 74         /* Fts3 t
1cd10 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
1cd20 20 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72   IncrmergeWriter
1cd30 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20 20   *pWriter,      
1cd40 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63   /* Writer objec
1cd50 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
1cd60 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20  r *zTerm,       
1cd70 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74         /* Term t
1cd80 6f 20 77 72 69 74 65 20 74 6f 20 69 6e 74 65 72  o write to inter
1cd90 6e 61 6c 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e  nal node */.  in
1cda0 74 20 6e 54 65 72 6d 20 20 20 20 20 20 20 20 20  t nTerm         
1cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cdc0 20 42 79 74 65 73 20 61 74 20 7a 54 65 72 6d 20   Bytes at zTerm 
1cdd0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
1cde0 69 6e 74 36 34 20 69 50 74 72 20 3d 20 70 57 72  int64 iPtr = pWr
1cdf0 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65  iter->aNodeWrite
1ce00 72 5b 30 5d 2e 69 42 6c 6f 63 6b 3b 0a 20 20 69  r[0].iBlock;.  i
1ce10 6e 74 20 69 4c 61 79 65 72 3b 0a 0a 20 20 61 73  nt iLayer;..  as
1ce20 73 65 72 74 28 20 6e 54 65 72 6d 3e 30 20 29 3b  sert( nTerm>0 );
1ce30 0a 20 20 66 6f 72 28 69 4c 61 79 65 72 3d 31 3b  .  for(iLayer=1;
1ce40 20 41 4c 57 41 59 53 28 69 4c 61 79 65 72 3c 46   ALWAYS(iLayer<F
1ce50 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c  TS_MAX_APPENDABL
1ce60 45 5f 48 45 49 47 48 54 29 3b 20 69 4c 61 79 65  E_HEIGHT); iLaye
1ce70 72 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r++){.    sqlite
1ce80 33 5f 69 6e 74 36 34 20 69 4e 65 78 74 50 74 72  3_int64 iNextPtr
1ce90 20 3d 20 30 3b 0a 20 20 20 20 4e 6f 64 65 57 72   = 0;.    NodeWr
1cea0 69 74 65 72 20 2a 70 4e 6f 64 65 20 3d 20 26 70  iter *pNode = &p
1ceb0 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69  Writer->aNodeWri
1cec0 74 65 72 5b 69 4c 61 79 65 72 5d 3b 0a 20 20 20  ter[iLayer];.   
1ced0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1cee0 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 6e 50 72  _OK;.    int nPr
1cef0 65 66 69 78 3b 0a 20 20 20 20 69 6e 74 20 6e 53  efix;.    int nS
1cf00 75 66 66 69 78 3b 0a 20 20 20 20 69 6e 74 20 6e  uffix;.    int n
1cf10 53 70 61 63 65 3b 0a 0a 20 20 20 20 2f 2a 20 46  Space;..    /* F
1cf20 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75  igure out how mu
1cf30 63 68 20 73 70 61 63 65 20 74 68 65 20 6b 65 79  ch space the key
1cf40 20 77 69 6c 6c 20 63 6f 6e 73 75 6d 65 20 69 66   will consume if
1cf50 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 20 74   it is written t
1cf60 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  o.    ** the cur
1cf70 72 65 6e 74 20 6e 6f 64 65 20 6f 66 20 6c 61 79  rent node of lay
1cf80 65 72 20 69 4c 61 79 65 72 2e 20 44 75 65 20 74  er iLayer. Due t
1cf90 6f 20 74 68 65 20 70 72 65 66 69 78 20 63 6f 6d  o the prefix com
1cfa0 70 72 65 73 73 69 6f 6e 2c 20 0a 20 20 20 20 2a  pression, .    *
1cfb0 2a 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75  * the space requ
1cfc0 69 72 65 64 20 63 68 61 6e 67 65 73 20 64 65 70  ired changes dep
1cfd0 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 20  ending on which 
1cfe0 6e 6f 64 65 20 74 68 65 20 6b 65 79 20 69 73 20  node the key is 
1cff0 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 61 64 64  to.    ** be add
1d000 65 64 20 74 6f 2e 20 20 2a 2f 0a 20 20 20 20 6e  ed to.  */.    n
1d010 50 72 65 66 69 78 20 3d 20 66 74 73 33 50 72 65  Prefix = fts3Pre
1d020 66 69 78 43 6f 6d 70 72 65 73 73 28 70 4e 6f 64  fixCompress(pNod
1d030 65 2d 3e 6b 65 79 2e 61 2c 20 70 4e 6f 64 65 2d  e->key.a, pNode-
1d040 3e 6b 65 79 2e 6e 2c 20 7a 54 65 72 6d 2c 20 6e  >key.n, zTerm, n
1d050 54 65 72 6d 29 3b 0a 20 20 20 20 6e 53 75 66 66  Term);.    nSuff
1d060 69 78 20 3d 20 6e 54 65 72 6d 20 2d 20 6e 50 72  ix = nTerm - nPr
1d070 65 66 69 78 3b 0a 20 20 20 20 6e 53 70 61 63 65  efix;.    nSpace
1d080 20 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56    = sqlite3Fts3V
1d090 61 72 69 6e 74 4c 65 6e 28 6e 50 72 65 66 69 78  arintLen(nPrefix
1d0a0 29 3b 0a 20 20 20 20 6e 53 70 61 63 65 20 2b 3d  );.    nSpace +=
1d0b0 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69   sqlite3Fts3Vari
1d0c0 6e 74 4c 65 6e 28 6e 53 75 66 66 69 78 29 20 2b  ntLen(nSuffix) +
1d0d0 20 6e 53 75 66 66 69 78 3b 0a 0a 20 20 20 20 69   nSuffix;..    i
1d0e0 66 28 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 3d  f( pNode->key.n=
1d0f0 3d 30 20 7c 7c 20 28 70 4e 6f 64 65 2d 3e 62 6c  =0 || (pNode->bl
1d100 6f 63 6b 2e 6e 20 2b 20 6e 53 70 61 63 65 29 3c  ock.n + nSpace)<
1d110 3d 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 29 7b  =p->nNodeSize ){
1d120 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68   .      /* If th
1d130 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 20 6f  e current node o
1d140 66 20 6c 61 79 65 72 20 69 4c 61 79 65 72 20 63  f layer iLayer c
1d150 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 6b 65 79  ontains zero key
1d160 73 2c 20 6f 72 20 69 66 20 61 64 64 69 6e 67 0a  s, or if adding.
1d170 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6b 65 79        ** the key
1d180 20 74 6f 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20   to it will not 
1d190 63 61 75 73 65 20 69 74 20 74 6f 20 67 72 6f 77  cause it to grow
1d1a0 20 74 6f 20 6c 61 72 67 65 72 20 74 68 61 6e 20   to larger than 
1d1b0 6e 4e 6f 64 65 53 69 7a 65 20 0a 20 20 20 20 20  nNodeSize .     
1d1c0 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a   ** bytes in siz
1d1d0 65 2c 20 77 72 69 74 65 20 74 68 65 20 6b 65 79  e, write the key
1d1e0 20 68 65 72 65 2e 20 20 2a 2f 0a 0a 20 20 20 20   here.  */..    
1d1f0 20 20 42 6c 6f 62 20 2a 70 42 6c 6b 20 3d 20 26    Blob *pBlk = &
1d200 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 3b 0a 20 20  pNode->block;.  
1d210 20 20 20 20 69 66 28 20 70 42 6c 6b 2d 3e 6e 3d      if( pBlk->n=
1d220 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 6c  =0 ){.        bl
1d230 6f 62 47 72 6f 77 42 75 66 66 65 72 28 70 42 6c  obGrowBuffer(pBl
1d240 6b 2c 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 2c  k, p->nNodeSize,
1d250 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69   &rc);.        i
1d260 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d270 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 42   ){.          pB
1d280 6c 6b 2d 3e 61 5b 30 5d 20 3d 20 28 63 68 61 72  lk->a[0] = (char
1d290 29 69 4c 61 79 65 72 3b 0a 20 20 20 20 20 20 20  )iLayer;.       
1d2a0 20 20 20 70 42 6c 6b 2d 3e 6e 20 3d 20 31 20 2b     pBlk->n = 1 +
1d2b0 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56   sqlite3Fts3PutV
1d2c0 61 72 69 6e 74 28 26 70 42 6c 6b 2d 3e 61 5b 31  arint(&pBlk->a[1
1d2d0 5d 2c 20 69 50 74 72 29 3b 0a 20 20 20 20 20 20  ], iPtr);.      
1d2e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1d2f0 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 72    blobGrowBuffer
1d300 28 70 42 6c 6b 2c 20 70 42 6c 6b 2d 3e 6e 20 2b  (pBlk, pBlk->n +
1d310 20 6e 53 70 61 63 65 2c 20 26 72 63 29 3b 0a 20   nSpace, &rc);. 
1d320 20 20 20 20 20 62 6c 6f 62 47 72 6f 77 42 75 66       blobGrowBuf
1d330 66 65 72 28 26 70 4e 6f 64 65 2d 3e 6b 65 79 2c  fer(&pNode->key,
1d340 20 6e 54 65 72 6d 2c 20 26 72 63 29 3b 0a 0a 20   nTerm, &rc);.. 
1d350 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1d360 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d370 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 6b 65 79    if( pNode->key
1d380 2e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  .n ){.          
1d390 70 42 6c 6b 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  pBlk->n += sqlit
1d3a0 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28  e3Fts3PutVarint(
1d3b0 26 70 42 6c 6b 2d 3e 61 5b 70 42 6c 6b 2d 3e 6e  &pBlk->a[pBlk->n
1d3c0 5d 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 20  ], nPrefix);.   
1d3d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1d3e0 42 6c 6b 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65  Blk->n += sqlite
1d3f0 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26  3Fts3PutVarint(&
1d400 70 42 6c 6b 2d 3e 61 5b 70 42 6c 6b 2d 3e 6e 5d  pBlk->a[pBlk->n]
1d410 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 20 20  , nSuffix);.    
1d420 20 20 20 20 6d 65 6d 63 70 79 28 26 70 42 6c 6b      memcpy(&pBlk
1d430 2d 3e 61 5b 70 42 6c 6b 2d 3e 6e 5d 2c 20 26 7a  ->a[pBlk->n], &z
1d440 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 2c 20 6e  Term[nPrefix], n
1d450 53 75 66 66 69 78 29 3b 0a 20 20 20 20 20 20 20  Suffix);.       
1d460 20 70 42 6c 6b 2d 3e 6e 20 2b 3d 20 6e 53 75 66   pBlk->n += nSuf
1d470 66 69 78 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65  fix;..        me
1d480 6d 63 70 79 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e  mcpy(pNode->key.
1d490 61 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29  a, zTerm, nTerm)
1d4a0 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d  ;.        pNode-
1d4b0 3e 6b 65 79 2e 6e 20 3d 20 6e 54 65 72 6d 3b 0a  >key.n = nTerm;.
1d4c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1d4d0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65  e{.      /* Othe
1d4e0 72 77 69 73 65 2c 20 66 6c 75 73 68 20 74 68 65  rwise, flush the
1d4f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64   the current nod
1d500 65 20 6f 66 20 6c 61 79 65 72 20 69 4c 61 79 65  e of layer iLaye
1d510 72 20 74 6f 20 64 69 73 6b 2e 0a 20 20 20 20 20  r to disk..     
1d520 20 2a 2a 20 54 68 65 6e 20 61 6c 6c 6f 63 61 74   ** Then allocat
1d530 65 20 61 20 6e 65 77 2c 20 65 6d 70 74 79 20 73  e a new, empty s
1d540 69 62 6c 69 6e 67 20 6e 6f 64 65 2e 20 54 68 65  ibling node. The
1d550 20 6b 65 79 20 77 69 6c 6c 20 62 65 20 77 72 69   key will be wri
1d560 74 74 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tten.      ** in
1d570 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  to the parent of
1d580 20 74 68 69 73 20 6e 6f 64 65 2e 20 2a 2f 0a 20   this node. */. 
1d590 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 57 72       rc = fts3Wr
1d5a0 69 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 4e  iteSegment(p, pN
1d5b0 6f 64 65 2d 3e 69 42 6c 6f 63 6b 2c 20 70 4e 6f  ode->iBlock, pNo
1d5c0 64 65 2d 3e 62 6c 6f 63 6b 2e 61 2c 20 70 4e 6f  de->block.a, pNo
1d5d0 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 29 3b 0a 0a 20  de->block.n);.. 
1d5e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 6f       assert( pNo
1d5f0 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 41 6c 6c 6f 63  de->block.nAlloc
1d600 3e 3d 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 29  >=p->nNodeSize )
1d610 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 62  ;.      pNode->b
1d620 6c 6f 63 6b 2e 61 5b 30 5d 20 3d 20 28 63 68 61  lock.a[0] = (cha
1d630 72 29 69 4c 61 79 65 72 3b 0a 20 20 20 20 20 20  r)iLayer;.      
1d640 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 20 3d  pNode->block.n =
1d650 20 31 20 2b 20 73 71 6c 69 74 65 33 46 74 73 33   1 + sqlite3Fts3
1d660 50 75 74 56 61 72 69 6e 74 28 26 70 4e 6f 64 65  PutVarint(&pNode
1d670 2d 3e 62 6c 6f 63 6b 2e 61 5b 31 5d 2c 20 69 50  ->block.a[1], iP
1d680 74 72 2b 31 29 3b 0a 0a 20 20 20 20 20 20 69 4e  tr+1);..      iN
1d690 65 78 74 50 74 72 20 3d 20 70 4e 6f 64 65 2d 3e  extPtr = pNode->
1d6a0 69 42 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 70 4e  iBlock;.      pN
1d6b0 6f 64 65 2d 3e 69 42 6c 6f 63 6b 2b 2b 3b 0a 20  ode->iBlock++;. 
1d6c0 20 20 20 20 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e       pNode->key.
1d6d0 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 0;.    }..  
1d6e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d6f0 5f 4f 4b 20 7c 7c 20 69 4e 65 78 74 50 74 72 3d  _OK || iNextPtr=
1d700 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
1d710 20 20 20 20 69 50 74 72 20 3d 20 69 4e 65 78 74      iPtr = iNext
1d720 50 74 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  Ptr;.  }..  asse
1d730 72 74 28 20 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rt( 0 );.}../*.*
1d740 2a 20 41 70 70 65 6e 64 20 61 20 74 65 72 6d 20  * Append a term 
1d750 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29  and (optionally)
1d760 20 64 6f 63 6c 69 73 74 20 74 6f 20 74 68 65 20   doclist to the 
1d770 46 54 53 20 73 65 67 6d 65 6e 74 20 6e 6f 64 65  FTS segment node
1d780 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 73 74   currently.** st
1d790 6f 72 65 64 20 69 6e 20 62 6c 6f 62 20 2a 70 4e  ored in blob *pN
1d7a0 6f 64 65 2e 20 54 68 65 20 6e 6f 64 65 20 6e 65  ode. The node ne
1d7b0 65 64 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  ed not contain a
1d7c0 6e 79 20 74 65 72 6d 73 2c 20 62 75 74 20 74 68  ny terms, but th
1d7d0 65 0a 2a 2a 20 68 65 61 64 65 72 20 6d 75 73 74  e.** header must
1d7e0 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f   be written befo
1d7f0 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
1d800 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
1d810 2a 20 41 20 6e 6f 64 65 20 68 65 61 64 65 72 20  * A node header 
1d820 69 73 20 61 20 73 69 6e 67 6c 65 20 30 78 30 30  is a single 0x00
1d830 20 62 79 74 65 20 66 6f 72 20 61 20 6c 65 61 66   byte for a leaf
1d840 20 6e 6f 64 65 2c 20 6f 72 20 61 20 68 65 69 67   node, or a heig
1d850 68 74 20 76 61 72 69 6e 74 0a 2a 2a 20 66 6f 6c  ht varint.** fol
1d860 6c 6f 77 65 64 20 62 79 20 74 68 65 20 6c 65 66  lowed by the lef
1d870 74 2d 68 61 6e 64 2d 63 68 69 6c 64 20 76 61 72  t-hand-child var
1d880 69 6e 74 20 66 6f 72 20 61 6e 20 69 6e 74 65 72  int for an inter
1d890 6e 61 6c 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  nal node..**.** 
1d8a0 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61  The term to be a
1d8b0 70 70 65 6e 64 65 64 20 69 73 20 70 61 73 73 65  ppended is passe
1d8c0 64 20 76 69 61 20 61 72 67 75 6d 65 6e 74 73 20  d via arguments 
1d8d0 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 46 6f 72  zTerm/nTerm. For
1d8e0 20 61 20 0a 2a 2a 20 6c 65 61 66 20 6e 6f 64 65   a .** leaf node
1d8f0 2c 20 74 68 65 20 64 6f 63 6c 69 73 74 20 69 73  , the doclist is
1d900 20 70 61 73 73 65 64 20 61 73 20 61 44 6f 63 6c   passed as aDocl
1d910 69 73 74 2f 6e 44 6f 63 6c 69 73 74 2e 20 46 6f  ist/nDoclist. Fo
1d920 72 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a  r an internal.**
1d930 20 6e 6f 64 65 2c 20 62 6f 74 68 20 61 44 6f 63   node, both aDoc
1d940 6c 69 73 74 20 61 6e 64 20 6e 44 6f 63 6c 69 73  list and nDoclis
1d950 74 20 6d 75 73 74 20 62 65 20 70 61 73 73 65 64  t must be passed
1d960 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65   0..**.** If the
1d970 20 73 69 7a 65 20 6f 66 20 74 68 65 20 76 61 6c   size of the val
1d980 75 65 20 69 6e 20 62 6c 6f 62 20 70 50 72 65 76  ue in blob pPrev
1d990 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   is zero, then t
1d9a0 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
1d9b0 0a 2a 2a 20 74 65 72 6d 20 77 72 69 74 74 65 6e  .** term written
1d9c0 20 74 6f 20 74 68 65 20 6e 6f 64 65 2e 20 4f 74   to the node. Ot
1d9d0 68 65 72 77 69 73 65 2c 20 70 50 72 65 76 20 63  herwise, pPrev c
1d9e0 6f 6e 74 61 69 6e 73 20 61 20 63 6f 70 79 20 6f  ontains a copy o
1d9f0 66 20 74 68 65 20 0a 2a 2a 20 70 72 65 76 69 6f  f the .** previo
1da00 75 73 20 74 65 72 6d 2e 20 42 65 66 6f 72 65 20  us term. Before 
1da10 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
1da20 74 75 72 6e 73 2c 20 69 74 20 69 73 20 75 70 64  turns, it is upd
1da30 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ated to contain 
1da40 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 7a 54 65  a.** copy of zTe
1da50 72 6d 2f 6e 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  rm/nTerm..**.** 
1da60 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
1da70 61 74 20 74 68 65 20 62 75 66 66 65 72 20 61 73  at the buffer as
1da80 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 4e  sociated with pN
1da90 6f 64 65 20 69 73 20 61 6c 72 65 61 64 79 20 6c  ode is already l
1daa0 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 74  arge.** enough t
1dab0 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68  o accommodate th
1dac0 65 20 6e 65 77 20 65 6e 74 72 79 2e 20 54 68 65  e new entry. The
1dad0 20 62 75 66 66 65 72 20 61 73 73 6f 63 69 61 74   buffer associat
1dae0 65 64 20 77 69 74 68 20 70 50 72 65 76 0a 2a 2a  ed with pPrev.**
1daf0 20 69 73 20 65 78 74 65 6e 64 65 64 20 62 79 20   is extended by 
1db00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66  this function if
1db10 20 72 65 71 75 72 69 72 65 64 2e 0a 2a 2a 0a 2a   requrired..**.*
1db20 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 28 69  * If an error (i
1db30 2e 65 2e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f  .e. OOM conditio
1db40 6e 29 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51  n) occurs, an SQ
1db50 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
1db60 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20  is.** returned. 
1db70 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
1db80 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
1db90 69 6e 74 20 66 74 73 33 41 70 70 65 6e 64 54 6f  int fts3AppendTo
1dba0 4e 6f 64 65 28 0a 20 20 42 6c 6f 62 20 2a 70 4e  Node(.  Blob *pN
1dbb0 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
1dbc0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
1dbd0 6e 74 20 6e 6f 64 65 20 69 6d 61 67 65 20 74 6f  nt node image to
1dbe0 20 61 70 70 65 6e 64 20 74 6f 20 2a 2f 0a 20 20   append to */.  
1dbf0 42 6c 6f 62 20 2a 70 50 72 65 76 2c 20 20 20 20  Blob *pPrev,    
1dc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc10 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
1dc20 6e 69 6e 67 20 70 72 65 76 69 6f 75 73 20 74 65  ning previous te
1dc30 72 6d 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  rm written */.  
1dc40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72  const char *zTer
1dc50 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
1dc60 2f 2a 20 4e 65 77 20 74 65 72 6d 20 74 6f 20 77  /* New term to w
1dc70 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  rite */.  int nT
1dc80 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
1dc90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1dca0 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62 79  e of zTerm in by
1dcb0 74 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  tes */.  const c
1dcc0 68 61 72 20 2a 61 44 6f 63 6c 69 73 74 2c 20 20  har *aDoclist,  
1dcd0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c           /* Docl
1dce0 69 73 74 20 28 6f 72 20 4e 55 4c 4c 29 20 74 6f  ist (or NULL) to
1dcf0 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20   write */.  int 
1dd00 6e 44 6f 63 6c 69 73 74 20 20 20 20 20 20 20 20  nDoclist        
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1dd20 69 7a 65 20 6f 66 20 61 44 6f 63 6c 69 73 74 20  ize of aDoclist 
1dd30 69 6e 20 62 79 74 65 73 20 2a 2f 20 0a 29 7b 0a  in bytes */ .){.
1dd40 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1dd50 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
1dd60 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1dd70 20 2a 2f 0a 20 20 69 6e 74 20 62 46 69 72 73 74   */.  int bFirst
1dd80 20 3d 20 28 70 50 72 65 76 2d 3e 6e 3d 3d 30 29   = (pPrev->n==0)
1dd90 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
1dda0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
1ddb0 73 74 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20  st term written 
1ddc0 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78  */.  int nPrefix
1ddd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dde0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1ddf0 74 65 72 6d 20 70 72 65 66 69 78 20 69 6e 20 62  term prefix in b
1de00 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  ytes */.  int nS
1de10 75 66 66 69 78 3b 20 20 20 20 20 20 20 20 20 20  uffix;          
1de20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1de30 65 20 6f 66 20 74 65 72 6d 20 73 75 66 66 69 78  e of term suffix
1de40 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20   in bytes */..  
1de50 2f 2a 20 4e 6f 64 65 20 6d 75 73 74 20 68 61 76  /* Node must hav
1de60 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  e already been s
1de70 74 61 72 74 65 64 2e 20 54 68 65 72 65 20 6d 75  tarted. There mu
1de80 73 74 20 62 65 20 61 20 64 6f 63 6c 69 73 74 20  st be a doclist 
1de90 66 6f 72 20 61 0a 20 20 2a 2a 20 6c 65 61 66 20  for a.  ** leaf 
1dea0 6e 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20  node, and there 
1deb0 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 20 64 6f  must not be a do
1dec0 63 6c 69 73 74 20 66 6f 72 20 61 6e 20 69 6e 74  clist for an int
1ded0 65 72 6e 61 6c 20 6e 6f 64 65 2e 20 20 2a 2f 0a  ernal node.  */.
1dee0 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d    assert( pNode-
1def0 3e 6e 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  >n>0 );.  assert
1df00 28 20 28 70 4e 6f 64 65 2d 3e 61 5b 30 5d 3d 3d  ( (pNode->a[0]==
1df10 27 5c 30 27 29 3d 3d 28 61 44 6f 63 6c 69 73 74  '\0')==(aDoclist
1df20 21 3d 30 29 20 29 3b 0a 0a 20 20 62 6c 6f 62 47  !=0) );..  blobG
1df30 72 6f 77 42 75 66 66 65 72 28 70 50 72 65 76 2c  rowBuffer(pPrev,
1df40 20 6e 54 65 72 6d 2c 20 26 72 63 29 3b 0a 20 20   nTerm, &rc);.  
1df50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1df60 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
1df70 20 20 6e 50 72 65 66 69 78 20 3d 20 66 74 73 33    nPrefix = fts3
1df80 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70  PrefixCompress(p
1df90 50 72 65 76 2d 3e 61 2c 20 70 50 72 65 76 2d 3e  Prev->a, pPrev->
1dfa0 6e 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29  n, zTerm, nTerm)
1dfb0 3b 0a 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54  ;.  nSuffix = nT
1dfc0 65 72 6d 20 2d 20 6e 50 72 65 66 69 78 3b 0a 20  erm - nPrefix;. 
1dfd0 20 6d 65 6d 63 70 79 28 70 50 72 65 76 2d 3e 61   memcpy(pPrev->a
1dfe0 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b  , zTerm, nTerm);
1dff0 0a 20 20 70 50 72 65 76 2d 3e 6e 20 3d 20 6e 54  .  pPrev->n = nT
1e000 65 72 6d 3b 0a 0a 20 20 69 66 28 20 62 46 69 72  erm;..  if( bFir
1e010 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 6f  st==0 ){.    pNo
1e020 64 65 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33  de->n += sqlite3
1e030 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70  Fts3PutVarint(&p
1e040 4e 6f 64 65 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e  Node->a[pNode->n
1e050 5d 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 7d  ], nPrefix);.  }
1e060 0a 20 20 70 4e 6f 64 65 2d 3e 6e 20 2b 3d 20 73  .  pNode->n += s
1e070 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72  qlite3Fts3PutVar
1e080 69 6e 74 28 26 70 4e 6f 64 65 2d 3e 61 5b 70 4e  int(&pNode->a[pN
1e090 6f 64 65 2d 3e 6e 5d 2c 20 6e 53 75 66 66 69 78  ode->n], nSuffix
1e0a0 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 4e 6f  );.  memcpy(&pNo
1e0b0 64 65 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d 2c  de->a[pNode->n],
1e0c0 20 26 7a 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d   &zTerm[nPrefix]
1e0d0 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 70 4e  , nSuffix);.  pN
1e0e0 6f 64 65 2d 3e 6e 20 2b 3d 20 6e 53 75 66 66 69  ode->n += nSuffi
1e0f0 78 3b 0a 0a 20 20 69 66 28 20 61 44 6f 63 6c 69  x;..  if( aDocli
1e100 73 74 20 29 7b 0a 20 20 20 20 70 4e 6f 64 65 2d  st ){.    pNode-
1e110 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  >n += sqlite3Fts
1e120 33 50 75 74 56 61 72 69 6e 74 28 26 70 4e 6f 64  3PutVarint(&pNod
1e130 65 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d 2c 20  e->a[pNode->n], 
1e140 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 6d  nDoclist);.    m
1e150 65 6d 63 70 79 28 26 70 4e 6f 64 65 2d 3e 61 5b  emcpy(&pNode->a[
1e160 70 4e 6f 64 65 2d 3e 6e 5d 2c 20 61 44 6f 63 6c  pNode->n], aDocl
1e170 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a  ist, nDoclist);.
1e180 20 20 20 20 70 4e 6f 64 65 2d 3e 6e 20 2b 3d 20      pNode->n += 
1e190 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20  nDoclist;.  }.. 
1e1a0 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e   assert( pNode->
1e1b0 6e 3c 3d 70 4e 6f 64 65 2d 3e 6e 41 6c 6c 6f 63  n<=pNode->nAlloc
1e1c0 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51   );..  return SQ
1e1d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1e1e0 2a 20 41 70 70 65 6e 64 20 74 68 65 20 63 75 72  * Append the cur
1e1f0 72 65 6e 74 20 74 65 72 6d 20 61 6e 64 20 64 6f  rent term and do
1e200 63 6c 69 73 74 20 70 6f 69 6e 74 65 64 20 74 6f  clist pointed to
1e210 20 62 79 20 63 75 72 73 6f 72 20 70 43 73 72 20   by cursor pCsr 
1e220 74 6f 20 74 68 65 0a 2a 2a 20 61 70 70 65 6e 64  to the.** append
1e230 61 62 6c 65 20 62 2d 74 72 65 65 20 73 65 67 6d  able b-tree segm
1e240 65 6e 74 20 6f 70 65 6e 65 64 20 66 6f 72 20 77  ent opened for w
1e250 72 69 74 69 6e 67 20 62 79 20 70 57 72 69 74 65  riting by pWrite
1e260 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
1e270 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
1e280 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
1e290 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1e2a0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
1e2b0 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e  tatic int fts3In
1e2c0 63 72 6d 65 72 67 65 41 70 70 65 6e 64 28 0a 20  crmergeAppend(. 
1e2d0 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
1e2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2f0 20 2f 2a 20 46 74 73 33 20 74 61 62 6c 65 20 68   /* Fts3 table h
1e300 61 6e 64 6c 65 20 2a 2f 0a 20 20 49 6e 63 72 6d  andle */.  Incrm
1e310 65 72 67 65 57 72 69 74 65 72 20 2a 70 57 72 69  ergeWriter *pWri
1e320 74 65 72 2c 20 20 20 20 20 20 20 2f 2a 20 57 72  ter,       /* Wr
1e330 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  iter object */. 
1e340 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61   Fts3MultiSegRea
1e350 64 65 72 20 2a 70 43 73 72 20 20 20 20 20 20 20  der *pCsr       
1e360 20 2f 2a 20 43 75 72 73 6f 72 20 63 6f 6e 74 61   /* Cursor conta
1e370 69 6e 69 6e 67 20 74 65 72 6d 20 61 6e 64 20 64  ining term and d
1e380 6f 63 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 63  oclist */.){.  c
1e390 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
1e3a0 20 3d 20 70 43 73 72 2d 3e 7a 54 65 72 6d 3b 0a   = pCsr->zTerm;.
1e3b0 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70 43    int nTerm = pC
1e3c0 73 72 2d 3e 6e 54 65 72 6d 3b 0a 20 20 63 6f 6e  sr->nTerm;.  con
1e3d0 73 74 20 63 68 61 72 20 2a 61 44 6f 63 6c 69 73  st char *aDoclis
1e3e0 74 20 3d 20 70 43 73 72 2d 3e 61 44 6f 63 6c 69  t = pCsr->aDocli
1e3f0 73 74 3b 0a 20 20 69 6e 74 20 6e 44 6f 63 6c 69  st;.  int nDocli
1e400 73 74 20 3d 20 70 43 73 72 2d 3e 6e 44 6f 63 6c  st = pCsr->nDocl
1e410 69 73 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ist;.  int rc = 
1e420 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
1e430 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1e440 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70  ode */.  int nSp
1e450 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
1e460 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
1e470 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 72  space in bytes r
1e480 65 71 75 69 72 65 64 20 6f 6e 20 6c 65 61 66 20  equired on leaf 
1e490 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78  */.  int nPrefix
1e4a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e4b0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 72     /* Size of pr
1e4c0 65 66 69 78 20 73 68 61 72 65 64 20 77 69 74 68  efix shared with
1e4d0 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 2a   previous term *
1e4e0 2f 0a 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b  /.  int nSuffix;
1e4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e500 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 75 66    /* Size of suf
1e510 66 69 78 20 28 6e 54 65 72 6d 20 2d 20 6e 50 72  fix (nTerm - nPr
1e520 65 66 69 78 29 20 2a 2f 0a 20 20 4e 6f 64 65 57  efix) */.  NodeW
1e530 72 69 74 65 72 20 2a 70 4c 65 61 66 3b 20 20 20  riter *pLeaf;   
1e540 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65           /* Obje
1e550 63 74 20 75 73 65 64 20 74 6f 20 77 72 69 74 65  ct used to write
1e560 20 6c 65 61 66 20 6e 6f 64 65 73 20 2a 2f 0a 0a   leaf nodes */..
1e570 20 20 70 4c 65 61 66 20 3d 20 26 70 57 72 69 74    pLeaf = &pWrit
1e580 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b  er->aNodeWriter[
1e590 30 5d 3b 0a 20 20 6e 50 72 65 66 69 78 20 3d 20  0];.  nPrefix = 
1e5a0 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65  fts3PrefixCompre
1e5b0 73 73 28 70 4c 65 61 66 2d 3e 6b 65 79 2e 61 2c  ss(pLeaf->key.a,
1e5c0 20 70 4c 65 61 66 2d 3e 6b 65 79 2e 6e 2c 20 7a   pLeaf->key.n, z
1e5d0 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20  Term, nTerm);.  
1e5e0 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d 20  nSuffix = nTerm 
1e5f0 2d 20 6e 50 72 65 66 69 78 3b 0a 0a 20 20 6e 53  - nPrefix;..  nS
1e600 70 61 63 65 20 20 3d 20 73 71 6c 69 74 65 33 46  pace  = sqlite3F
1e610 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 50 72  ts3VarintLen(nPr
1e620 65 66 69 78 29 3b 0a 20 20 6e 53 70 61 63 65 20  efix);.  nSpace 
1e630 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56 61  += sqlite3Fts3Va
1e640 72 69 6e 74 4c 65 6e 28 6e 53 75 66 66 69 78 29  rintLen(nSuffix)
1e650 20 2b 20 6e 53 75 66 66 69 78 3b 0a 20 20 6e 53   + nSuffix;.  nS
1e660 70 61 63 65 20 2b 3d 20 73 71 6c 69 74 65 33 46  pace += sqlite3F
1e670 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 44 6f  ts3VarintLen(nDo
1e680 63 6c 69 73 74 29 20 2b 20 6e 44 6f 63 6c 69 73  clist) + nDoclis
1e690 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  t;..  /* If the 
1e6a0 63 75 72 72 65 6e 74 20 62 6c 6f 63 6b 20 69 73  current block is
1e6b0 20 6e 6f 74 20 65 6d 70 74 79 2c 20 61 6e 64 20   not empty, and 
1e6c0 69 66 20 61 64 64 69 6e 67 20 74 68 69 73 20 74  if adding this t
1e6d0 65 72 6d 2f 64 6f 63 6c 69 73 74 0a 20 20 2a 2a  erm/doclist.  **
1e6e0 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
1e6f0 62 6c 6f 63 6b 20 77 6f 75 6c 64 20 6d 61 6b 65  block would make
1e700 20 69 74 20 6c 61 72 67 65 72 20 74 68 61 6e 20   it larger than 
1e710 46 74 73 33 54 61 62 6c 65 2e 6e 4e 6f 64 65 53  Fts3Table.nNodeS
1e720 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 2c 20  ize.  ** bytes, 
1e730 77 72 69 74 65 20 74 68 69 73 20 62 6c 6f 63 6b  write this block
1e740 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
1e750 62 61 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70  base. */.  if( p
1e760 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 3e 30 20  Leaf->block.n>0 
1e770 26 26 20 28 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b  && (pLeaf->block
1e780 2e 6e 20 2b 20 6e 53 70 61 63 65 29 3e 70 2d 3e  .n + nSpace)>p->
1e790 6e 4e 6f 64 65 53 69 7a 65 20 29 7b 0a 20 20 20  nNodeSize ){.   
1e7a0 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65 53   rc = fts3WriteS
1e7b0 65 67 6d 65 6e 74 28 70 2c 20 70 4c 65 61 66 2d  egment(p, pLeaf-
1e7c0 3e 69 42 6c 6f 63 6b 2c 20 70 4c 65 61 66 2d 3e  >iBlock, pLeaf->
1e7d0 62 6c 6f 63 6b 2e 61 2c 20 70 4c 65 61 66 2d 3e  block.a, pLeaf->
1e7e0 62 6c 6f 63 6b 2e 6e 29 3b 0a 20 20 20 20 70 57  block.n);.    pW
1e7f0 72 69 74 65 72 2d 3e 6e 57 6f 72 6b 2b 2b 3b 0a  riter->nWork++;.
1e800 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
1e810 63 75 72 72 65 6e 74 20 74 65 72 6d 20 74 6f 20  current term to 
1e820 74 68 65 20 70 61 72 65 6e 74 20 6e 6f 64 65 2e  the parent node.
1e830 20 54 68 65 20 74 65 72 6d 20 61 64 64 65 64 20   The term added 
1e840 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70  to the .    ** p
1e850 61 72 65 6e 74 20 6d 75 73 74 3a 0a 20 20 20 20  arent must:.    
1e860 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 61 29 20 62  **.    **   a) b
1e870 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  e greater than t
1e880 68 65 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20  he largest term 
1e890 6f 6e 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65  on the leaf node
1e8a0 20 6a 75 73 74 20 77 72 69 74 74 65 6e 0a 20 20   just written.  
1e8b0 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65    **      to the
1e8c0 20 64 61 74 61 62 61 73 65 20 28 73 74 69 6c 6c   database (still
1e8d0 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 4c   available in pL
1e8e0 65 61 66 2d 3e 6b 65 79 29 2c 20 61 6e 64 0a 20  eaf->key), and. 
1e8f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 62     **.    **   b
1e900 29 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f  ) be less than o
1e910 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74  r equal to the t
1e920 65 72 6d 20 61 62 6f 75 74 20 74 6f 20 62 65 20  erm about to be 
1e930 61 64 64 65 64 20 74 6f 20 74 68 65 20 6e 65 77  added to the new
1e940 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6c 65 61  .    **      lea
1e950 66 20 6e 6f 64 65 20 28 7a 54 65 72 6d 2f 6e 54  f node (zTerm/nT
1e960 65 72 6d 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  erm)..    **.   
1e970 20 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72   ** In other wor
1e980 64 73 2c 20 69 74 20 6d 75 73 74 20 62 65 20 74  ds, it must be t
1e990 68 65 20 70 72 65 66 69 78 20 6f 66 20 7a 54 65  he prefix of zTe
1e9a0 72 6d 20 31 20 62 79 74 65 20 6c 6f 6e 67 65 72  rm 1 byte longer
1e9b0 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65   than.    ** the
1e9c0 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 28   common prefix (
1e9d0 69 66 20 61 6e 79 29 20 6f 66 20 7a 54 65 72 6d  if any) of zTerm
1e9e0 20 61 6e 64 20 70 57 72 69 74 65 72 2d 3e 7a 54   and pWriter->zT
1e9f0 65 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  erm..    */.    
1ea00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ea10 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1ea20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 50 75 73  fts3IncrmergePus
1ea30 68 28 70 2c 20 70 57 72 69 74 65 72 2c 20 7a 54  h(p, pWriter, zT
1ea40 65 72 6d 2c 20 6e 50 72 65 66 69 78 2b 31 29 3b  erm, nPrefix+1);
1ea50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
1ea60 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
1ea70 78 74 20 6f 75 74 70 75 74 20 62 6c 6f 63 6b 20  xt output block 
1ea80 2a 2f 0a 20 20 20 20 70 4c 65 61 66 2d 3e 69 42  */.    pLeaf->iB
1ea90 6c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 70 4c 65 61  lock++;.    pLea
1eaa0 66 2d 3e 6b 65 79 2e 6e 20 3d 20 30 3b 0a 20 20  f->key.n = 0;.  
1eab0 20 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e    pLeaf->block.n
1eac0 20 3d 20 30 3b 0a 0a 20 20 20 20 6e 50 72 65 66   = 0;..    nPref
1ead0 69 78 20 3d 20 30 3b 0a 20 20 20 20 6e 53 75 66  ix = 0;.    nSuf
1eae0 66 69 78 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20  fix = nTerm;.   
1eaf0 20 6e 53 70 61 63 65 20 20 3d 20 31 3b 0a 20 20   nSpace  = 1;.  
1eb00 20 20 6e 53 70 61 63 65 20 2b 3d 20 73 71 6c 69    nSpace += sqli
1eb10 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e  te3Fts3VarintLen
1eb20 28 6e 53 75 66 66 69 78 29 20 2b 20 6e 53 75 66  (nSuffix) + nSuf
1eb30 66 69 78 3b 0a 20 20 20 20 6e 53 70 61 63 65 20  fix;.    nSpace 
1eb40 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56 61  += sqlite3Fts3Va
1eb50 72 69 6e 74 4c 65 6e 28 6e 44 6f 63 6c 69 73 74  rintLen(nDoclist
1eb60 29 20 2b 20 6e 44 6f 63 6c 69 73 74 3b 0a 20 20  ) + nDoclist;.  
1eb70 7d 0a 0a 20 20 62 6c 6f 62 47 72 6f 77 42 75 66  }..  blobGrowBuf
1eb80 66 65 72 28 26 70 4c 65 61 66 2d 3e 62 6c 6f 63  fer(&pLeaf->bloc
1eb90 6b 2c 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e  k, pLeaf->block.
1eba0 6e 20 2b 20 6e 53 70 61 63 65 2c 20 26 72 63 29  n + nSpace, &rc)
1ebb0 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
1ebc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
1ebd0 28 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e  ( pLeaf->block.n
1ebe0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  ==0 ){.      pLe
1ebf0 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 20 3d 20 31 3b  af->block.n = 1;
1ec00 0a 20 20 20 20 20 20 70 4c 65 61 66 2d 3e 62 6c  .      pLeaf->bl
1ec10 6f 63 6b 2e 61 5b 30 5d 20 3d 20 27 5c 30 27 3b  ock.a[0] = '\0';
1ec20 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1ec30 66 74 73 33 41 70 70 65 6e 64 54 6f 4e 6f 64 65  fts3AppendToNode
1ec40 28 0a 20 20 20 20 20 20 20 20 26 70 4c 65 61 66  (.        &pLeaf
1ec50 2d 3e 62 6c 6f 63 6b 2c 20 26 70 4c 65 61 66 2d  ->block, &pLeaf-
1ec60 3e 6b 65 79 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  >key, zTerm, nTe
1ec70 72 6d 2c 20 61 44 6f 63 6c 69 73 74 2c 20 6e 44  rm, aDoclist, nD
1ec80 6f 63 6c 69 73 74 0a 20 20 20 20 29 3b 0a 20 20  oclist.    );.  
1ec90 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1eca0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1ecb0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1ecc0 20 74 6f 20 72 65 6c 65 61 73 65 20 61 6c 6c 20   to release all 
1ecd0 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65  dynamic resource
1ece0 73 20 68 65 6c 64 20 62 79 20 74 68 65 0a 2a 2a  s held by the.**
1ecf0 20 6d 65 72 67 65 2d 77 72 69 74 65 72 20 6f 62   merge-writer ob
1ed00 6a 65 63 74 20 70 57 72 69 74 65 72 2c 20 61 6e  ject pWriter, an
1ed10 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 68 61  d if no error ha
1ed20 73 20 6f 63 63 75 72 72 65 64 2c 20 74 6f 20 66  s occurred, to f
1ed30 6c 75 73 68 0a 2a 2a 20 61 6c 6c 20 6f 75 74 73  lush.** all outs
1ed40 74 61 6e 64 69 6e 67 20 6e 6f 64 65 20 62 75 66  tanding node buf
1ed50 66 65 72 73 20 68 65 6c 64 20 62 79 20 70 57 72  fers held by pWr
1ed60 69 74 65 72 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  iter to disk..**
1ed70 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73 20 6e  .** If *pRc is n
1ed80 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65  ot SQLITE_OK whe
1ed90 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1eda0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  is called, then 
1edb0 6e 6f 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73  no attempt.** is
1edc0 20 6d 61 64 65 20 74 6f 20 77 72 69 74 65 20 61   made to write a
1edd0 6e 79 20 64 61 74 61 20 74 6f 20 64 69 73 6b 2e  ny data to disk.
1ede0 20 49 6e 73 74 65 61 64 2c 20 74 68 69 73 20 66   Instead, this f
1edf0 75 6e 63 74 69 6f 6e 20 73 65 72 76 65 73 20 6f  unction serves o
1ee00 6e 6c 79 0a 2a 2a 20 74 6f 20 72 65 6c 65 61 73  nly.** to releas
1ee10 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  e outstanding re
1ee20 73 6f 75 72 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f  sources..**.** O
1ee30 74 68 65 72 77 69 73 65 2c 20 69 66 20 2a 70 52  therwise, if *pR
1ee40 63 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 53  c is initially S
1ee50 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 61 6e 20  QLITE_OK and an 
1ee60 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
1ee70 6c 65 0a 2a 2a 20 66 6c 75 73 68 69 6e 67 20 62  le.** flushing b
1ee80 75 66 66 65 72 73 20 74 6f 20 64 69 73 6b 2c 20  uffers to disk, 
1ee90 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20 61  *pRc is set to a
1eea0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1eeb0 6f 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65  ode before.** re
1eec0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
1eed0 69 63 20 76 6f 69 64 20 66 74 73 33 49 6e 63 72  ic void fts3Incr
1eee0 6d 65 72 67 65 52 65 6c 65 61 73 65 28 0a 20 20  mergeRelease(.  
1eef0 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
1ef00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef10 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20 68 61  /* FTS3 table ha
1ef20 6e 64 6c 65 20 2a 2f 0a 20 20 49 6e 63 72 6d 65  ndle */.  Incrme
1ef30 72 67 65 57 72 69 74 65 72 20 2a 70 57 72 69 74  rgeWriter *pWrit
1ef40 65 72 2c 20 20 20 20 20 20 20 2f 2a 20 4d 65 72  er,       /* Mer
1ef50 67 65 2d 77 72 69 74 65 72 20 6f 62 6a 65 63 74  ge-writer object
1ef60 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63 20 20   */.  int *pRc  
1ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef80 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
1ef90 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 29   Error code */.)
1efa0 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 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 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
1efd0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6e  terate through n
1efe0 6f 6e 2d 72 6f 6f 74 20 6c 61 79 65 72 73 20 2a  on-root layers *
1eff0 2f 0a 20 20 69 6e 74 20 69 52 6f 6f 74 3b 20 20  /.  int iRoot;  
1f000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f010 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1f020 72 6f 6f 74 20 69 6e 20 70 57 72 69 74 65 72 2d  root in pWriter-
1f030 3e 61 4e 6f 64 65 57 72 69 74 65 72 20 2a 2f 0a  >aNodeWriter */.
1f040 20 20 4e 6f 64 65 57 72 69 74 65 72 20 2a 70 52    NodeWriter *pR
1f050 6f 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  oot;            
1f060 20 20 2f 2a 20 4e 6f 64 65 57 72 69 74 65 72 20    /* NodeWriter 
1f070 66 6f 72 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f  for root node */
1f080 0a 20 20 69 6e 74 20 72 63 20 3d 20 2a 70 52 63  .  int rc = *pRc
1f090 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f0a0 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
1f0b0 20 2a 2f 0a 0a 20 20 2f 2a 20 53 65 74 20 69 52   */..  /* Set iR
1f0c0 6f 6f 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  oot to the index
1f0d0 20 69 6e 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f   in pWriter->aNo
1f0e0 64 65 57 72 69 74 65 72 5b 5d 20 6f 66 20 74 68  deWriter[] of th
1f0f0 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  e output segment
1f100 20 0a 20 20 2a 2a 20 72 6f 6f 74 20 6e 6f 64 65   .  ** root node
1f110 2e 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74  . If the segment
1f120 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
1f130 6e 20 61 20 73 69 6e 67 6c 65 20 6c 65 61 66 20  n a single leaf 
1f140 6e 6f 64 65 2c 20 69 52 6f 6f 74 0a 20 20 2a 2a  node, iRoot.  **
1f150 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
1f160 30 2e 20 49 66 20 74 68 65 20 72 6f 6f 74 20 6e  0. If the root n
1f170 6f 64 65 20 69 73 20 74 68 65 20 70 61 72 65 6e  ode is the paren
1f180 74 20 6f 66 20 74 68 65 20 6c 65 61 76 65 73 2c  t of the leaves,
1f190 20 69 52 6f 6f 74 0a 20 20 2a 2a 20 77 69 6c 6c   iRoot.  ** will
1f1a0 20 62 65 20 31 2e 20 41 6e 64 20 73 6f 20 6f 6e   be 1. And so on
1f1b0 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 69 52 6f 6f  .  */.  for(iRoo
1f1c0 74 3d 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44  t=FTS_MAX_APPEND
1f1d0 41 42 4c 45 5f 48 45 49 47 48 54 2d 31 3b 20 69  ABLE_HEIGHT-1; i
1f1e0 52 6f 6f 74 3e 3d 30 3b 20 69 52 6f 6f 74 2d 2d  Root>=0; iRoot--
1f1f0 29 7b 0a 20 20 20 20 4e 6f 64 65 57 72 69 74 65  ){.    NodeWrite
1f200 72 20 2a 70 4e 6f 64 65 20 3d 20 26 70 57 72 69  r *pNode = &pWri
1f210 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72  ter->aNodeWriter
1f220 5b 69 52 6f 6f 74 5d 3b 0a 20 20 20 20 69 66 28  [iRoot];.    if(
1f230 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 3e   pNode->block.n>
1f240 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61  0 ) break;.    a
1f250 73 73 65 72 74 28 20 2a 70 52 63 20 7c 7c 20 70  ssert( *pRc || p
1f260 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 41 6c 6c  Node->block.nAll
1f270 6f 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  oc==0 );.    ass
1f280 65 72 74 28 20 2a 70 52 63 20 7c 7c 20 70 4e 6f  ert( *pRc || pNo
1f290 64 65 2d 3e 6b 65 79 2e 6e 41 6c 6c 6f 63 3d 3d  de->key.nAlloc==
1f2a0 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
1f2b0 5f 66 72 65 65 28 70 4e 6f 64 65 2d 3e 62 6c 6f  _free(pNode->blo
1f2c0 63 6b 2e 61 29 3b 0a 20 20 20 20 73 71 6c 69 74  ck.a);.    sqlit
1f2d0 65 33 5f 66 72 65 65 28 70 4e 6f 64 65 2d 3e 6b  e3_free(pNode->k
1f2e0 65 79 2e 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ey.a);.  }..  /*
1f2f0 20 45 6d 70 74 79 20 6f 75 74 70 75 74 20 73 65   Empty output se
1f300 67 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61  gment. This is a
1f310 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28   no-op. */.  if(
1f320 20 69 52 6f 6f 74 3c 30 20 29 20 72 65 74 75 72   iRoot<0 ) retur
1f330 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 6e 74  n;..  /* The ent
1f340 69 72 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65  ire output segme
1f350 6e 74 20 66 69 74 73 20 6f 6e 20 61 20 73 69 6e  nt fits on a sin
1f360 67 6c 65 20 6e 6f 64 65 2e 20 4e 6f 72 6d 61 6c  gle node. Normal
1f370 6c 79 2c 20 74 68 69 73 20 6d 65 61 6e 73 0a 20  ly, this means. 
1f380 20 2a 2a 20 74 68 65 20 6e 6f 64 65 20 77 6f 75   ** the node wou
1f390 6c 64 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ld be stored as 
1f3a0 61 20 62 6c 6f 62 20 69 6e 20 74 68 65 20 22 72  a blob in the "r
1f3b0 6f 6f 74 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  oot" column of t
1f3c0 68 65 20 25 5f 73 65 67 64 69 72 0a 20 20 2a 2a  he %_segdir.  **
1f3d0 20 74 61 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c   table. However,
1f3e0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 70 65 72   this is not per
1f3f0 6d 69 74 74 65 64 20 69 6e 20 74 68 69 73 20 63  mitted in this c
1f400 61 73 65 2e 20 54 68 65 20 70 72 6f 62 6c 65 6d  ase. The problem
1f410 20 69 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 73   is that .  ** s
1f420 70 61 63 65 20 68 61 73 20 61 6c 72 65 61 64 79  pace has already
1f430 20 62 65 65 6e 20 72 65 73 65 72 76 65 64 20 69   been reserved i
1f440 6e 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73  n the %_segments
1f450 20 74 61 62 6c 65 2c 20 61 6e 64 20 73 6f 20 74   table, and so t
1f460 68 65 20 0a 20 20 2a 2a 20 73 74 61 72 74 5f 62  he .  ** start_b
1f470 6c 6f 63 6b 20 61 6e 64 20 65 6e 64 5f 62 6c 6f  lock and end_blo
1f480 63 6b 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ck fields of the
1f490 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 20   %_segdir table 
1f4a0 6d 75 73 74 20 62 65 20 70 6f 70 75 6c 61 74 65  must be populate
1f4b0 64 2e 20 0a 20 20 2a 2a 20 41 6e 64 2c 20 62 79  d. .  ** And, by
1f4c0 20 64 65 73 69 67 6e 20 6f 72 20 62 79 20 61 63   design or by ac
1f4d0 63 69 64 65 6e 74 2c 20 72 65 6c 65 61 73 65 64  cident, released
1f4e0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 46 54 53   versions of FTS
1f4f0 20 63 61 6e 6e 6f 74 20 68 61 6e 64 6c 65 20 0a   cannot handle .
1f500 20 20 2a 2a 20 73 65 67 6d 65 6e 74 73 20 74 68    ** segments th
1f510 61 74 20 66 69 74 20 65 6e 74 69 72 65 6c 79 20  at fit entirely 
1f520 6f 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  on the root node
1f530 20 77 69 74 68 20 73 74 61 72 74 5f 62 6c 6f 63   with start_bloc
1f540 6b 21 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  k!=0..  **.  ** 
1f550 49 6e 73 74 65 61 64 2c 20 63 72 65 61 74 65 20  Instead, create 
1f560 61 20 73 79 6e 74 68 65 74 69 63 20 72 6f 6f 74  a synthetic root
1f570 20 6e 6f 64 65 20 74 68 61 74 20 63 6f 6e 74 61   node that conta
1f580 69 6e 73 20 6e 6f 74 68 69 6e 67 20 62 75 74 20  ins nothing but 
1f590 61 20 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20  a .  ** pointer 
1f5a0 74 6f 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f  to the single co
1f5b0 6e 74 65 6e 74 20 6e 6f 64 65 2e 20 53 6f 20 74  ntent node. So t
1f5c0 68 61 74 20 74 68 65 20 73 65 67 6d 65 6e 74 20  hat the segment 
1f5d0 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 20 20  consists of a.  
1f5e0 2a 2a 20 73 69 6e 67 6c 65 20 6c 65 61 66 20 61  ** single leaf a
1f5f0 6e 64 20 61 20 73 69 6e 67 6c 65 20 69 6e 74 65  nd a single inte
1f600 72 69 6f 72 20 28 72 6f 6f 74 29 20 6e 6f 64 65  rior (root) node
1f610 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 64 6f  ..  **.  ** Todo
1f620 3a 20 42 65 74 74 65 72 20 6d 69 67 68 74 20 62  : Better might b
1f630 65 20 74 6f 20 64 65 66 65 72 20 61 6c 6c 6f 63  e to defer alloc
1f640 61 74 69 6e 67 20 73 70 61 63 65 20 69 6e 20 74  ating space in t
1f650 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 0a 20  he %_segments . 
1f660 20 2a 2a 20 74 61 62 6c 65 20 75 6e 74 69 6c 20   ** table until 
1f670 77 65 20 61 72 65 20 73 75 72 65 20 69 74 20 69  we are sure it i
1f680 73 20 6e 65 65 64 65 64 2e 0a 20 20 2a 2f 0a 20  s needed..  */. 
1f690 20 69 66 28 20 69 52 6f 6f 74 3d 3d 30 20 29 7b   if( iRoot==0 ){
1f6a0 0a 20 20 20 20 42 6c 6f 62 20 2a 70 42 6c 6f 63  .    Blob *pBloc
1f6b0 6b 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 4e  k = &pWriter->aN
1f6c0 6f 64 65 57 72 69 74 65 72 5b 31 5d 2e 62 6c 6f  odeWriter[1].blo
1f6d0 63 6b 3b 0a 20 20 20 20 62 6c 6f 62 47 72 6f 77  ck;.    blobGrow
1f6e0 42 75 66 66 65 72 28 70 42 6c 6f 63 6b 2c 20 31  Buffer(pBlock, 1
1f6f0 20 2b 20 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d   + FTS3_VARINT_M
1f700 41 58 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66  AX, &rc);.    if
1f710 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f720 29 7b 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b 2d  ){.      pBlock-
1f730 3e 61 5b 30 5d 20 3d 20 30 78 30 31 3b 0a 20 20  >a[0] = 0x01;.  
1f740 20 20 20 20 70 42 6c 6f 63 6b 2d 3e 6e 20 3d 20      pBlock->n = 
1f750 31 20 2b 20 73 71 6c 69 74 65 33 46 74 73 33 50  1 + sqlite3Fts3P
1f760 75 74 56 61 72 69 6e 74 28 0a 20 20 20 20 20 20  utVarint(.      
1f770 20 20 20 20 26 70 42 6c 6f 63 6b 2d 3e 61 5b 31      &pBlock->a[1
1f780 5d 2c 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64  ], pWriter->aNod
1f790 65 57 72 69 74 65 72 5b 30 5d 2e 69 42 6c 6f 63  eWriter[0].iBloc
1f7a0 6b 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  k.      );.    }
1f7b0 0a 20 20 20 20 69 52 6f 6f 74 20 3d 20 31 3b 0a  .    iRoot = 1;.
1f7c0 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 26 70    }.  pRoot = &p
1f7d0 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69  Writer->aNodeWri
1f7e0 74 65 72 5b 69 52 6f 6f 74 5d 3b 0a 0a 20 20 2f  ter[iRoot];..  /
1f7f0 2a 20 46 6c 75 73 68 20 61 6c 6c 20 63 75 72 72  * Flush all curr
1f800 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e 64 69 6e  ently outstandin
1f810 67 20 6e 6f 64 65 73 20 74 6f 20 64 69 73 6b 2e  g nodes to disk.
1f820 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
1f830 3c 69 52 6f 6f 74 3b 20 69 2b 2b 29 7b 0a 20 20  <iRoot; i++){.  
1f840 20 20 4e 6f 64 65 57 72 69 74 65 72 20 2a 70 4e    NodeWriter *pN
1f850 6f 64 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  ode = &pWriter->
1f860 61 4e 6f 64 65 57 72 69 74 65 72 5b 69 5d 3b 0a  aNodeWriter[i];.
1f870 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 62      if( pNode->b
1f880 6c 6f 63 6b 2e 6e 3e 30 20 26 26 20 72 63 3d 3d  lock.n>0 && rc==
1f890 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f8a0 20 20 20 72 63 20 3d 20 66 74 73 33 57 72 69 74     rc = fts3Writ
1f8b0 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 4e 6f 64  eSegment(p, pNod
1f8c0 65 2d 3e 69 42 6c 6f 63 6b 2c 20 70 4e 6f 64 65  e->iBlock, pNode
1f8d0 2d 3e 62 6c 6f 63 6b 2e 61 2c 20 70 4e 6f 64 65  ->block.a, pNode
1f8e0 2d 3e 62 6c 6f 63 6b 2e 6e 29 3b 0a 20 20 20 20  ->block.n);.    
1f8f0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
1f900 65 65 28 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e  ee(pNode->block.
1f910 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  a);.    sqlite3_
1f920 66 72 65 65 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e  free(pNode->key.
1f930 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72  a);.  }..  /* Wr
1f940 69 74 65 20 74 68 65 20 25 5f 73 65 67 64 69 72  ite the %_segdir
1f950 20 72 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 69 66   record. */.  if
1f960 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f970 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  ){.    rc = fts3
1f980 57 72 69 74 65 53 65 67 64 69 72 28 70 2c 20 0a  WriteSegdir(p, .
1f990 20 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d          pWriter-
1f9a0 3e 69 41 62 73 4c 65 76 65 6c 2b 31 2c 20 20 20  >iAbsLevel+1,   
1f9b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c              /* l
1f9c0 65 76 65 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20  evel */.        
1f9d0 70 57 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 20  pWriter->iIdx,  
1f9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9f0 20 20 20 20 2f 2a 20 69 64 78 20 2a 2f 0a 20 20      /* idx */.  
1fa00 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69        pWriter->i
1fa10 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 20  Start,          
1fa20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 74 61            /* sta
1fa30 72 74 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  rt_block */.    
1fa40 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f      pWriter->aNo
1fa50 64 65 57 72 69 74 65 72 5b 30 5d 2e 69 42 6c 6f  deWriter[0].iBlo
1fa60 63 6b 2c 20 20 20 20 20 2f 2a 20 6c 65 61 76 65  ck,     /* leave
1fa70 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20  s_end_block */. 
1fa80 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e         pWriter->
1fa90 69 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  iEnd,           
1faa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 65 6e             /* en
1fab0 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  d_block */.     
1fac0 20 20 20 70 52 6f 6f 74 2d 3e 62 6c 6f 63 6b 2e     pRoot->block.
1fad0 61 2c 20 70 52 6f 6f 74 2d 3e 62 6c 6f 63 6b 2e  a, pRoot->block.
1fae0 6e 20 20 20 20 20 20 2f 2a 20 72 6f 6f 74 20 2a  n      /* root *
1faf0 2f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 73  /.    );.  }.  s
1fb00 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 6f 6f  qlite3_free(pRoo
1fb10 74 2d 3e 62 6c 6f 63 6b 2e 61 29 3b 0a 20 20 73  t->block.a);.  s
1fb20 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 6f 6f  qlite3_free(pRoo
1fb30 74 2d 3e 6b 65 79 2e 61 29 3b 0a 0a 20 20 2a 70  t->key.a);..  *p
1fb40 52 63 20 3d 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  Rc = rc;.}../*.*
1fb50 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 65  * Compare the te
1fb60 72 6d 20 69 6e 20 62 75 66 66 65 72 20 7a 4c 68  rm in buffer zLh
1fb70 73 20 28 73 69 7a 65 20 69 6e 20 62 79 74 65 73  s (size in bytes
1fb80 20 6e 4c 68 73 29 20 77 69 74 68 20 74 68 61 74   nLhs) with that
1fb90 20 69 6e 0a 2a 2a 20 7a 52 68 73 20 28 73 69 7a   in.** zRhs (siz
1fba0 65 20 69 6e 20 62 79 74 65 73 20 6e 52 68 73 29  e in bytes nRhs)
1fbb0 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 2e 20 49   using memcmp. I
1fbc0 66 20 6f 6e 65 20 74 65 72 6d 20 69 73 20 61 20  f one term is a 
1fbd0 70 72 65 66 69 78 20 6f 66 0a 2a 2a 20 74 68 65  prefix of.** the
1fbe0 20 6f 74 68 65 72 2c 20 69 74 20 69 73 20 63 6f   other, it is co
1fbf0 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 73  nsidered to be s
1fc00 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
1fc10 6f 74 68 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  other..**.** Ret
1fc20 75 72 6e 20 2d 76 65 20 69 66 20 7a 4c 68 73 20  urn -ve if zLhs 
1fc30 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
1fc40 7a 52 68 73 2c 20 30 20 69 66 20 69 74 20 69 73  zRhs, 0 if it is
1fc50 20 65 71 75 61 6c 2c 20 6f 72 20 2b 76 65 0a 2a   equal, or +ve.*
1fc60 2a 20 69 66 20 69 74 20 69 73 20 67 72 65 61 74  * if it is great
1fc70 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1fc80 74 20 66 74 73 33 54 65 72 6d 43 6d 70 28 0a 20  t fts3TermCmp(. 
1fc90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 68   const char *zLh
1fca0 73 2c 20 69 6e 74 20 6e 4c 68 73 2c 20 20 20 20  s, int nLhs,    
1fcb0 20 2f 2a 20 4c 48 53 20 6f 66 20 63 6f 6d 70 61   /* LHS of compa
1fcc0 72 69 73 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  rison */.  const
1fcd0 20 63 68 61 72 20 2a 7a 52 68 73 2c 20 69 6e 74   char *zRhs, int
1fce0 20 6e 52 68 73 20 20 20 20 20 20 2f 2a 20 52 48   nRhs      /* RH
1fcf0 53 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  S of comparison 
1fd00 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70  */.){.  int nCmp
1fd10 20 3d 20 4d 49 4e 28 6e 4c 68 73 2c 20 6e 52 68   = MIN(nLhs, nRh
1fd20 73 29 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a  s);.  int res;..
1fd30 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 7a    res = memcmp(z
1fd40 4c 68 73 2c 20 7a 52 68 73 2c 20 6e 43 6d 70 29  Lhs, zRhs, nCmp)
1fd50 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29  ;.  if( res==0 )
1fd60 20 72 65 73 20 3d 20 6e 4c 68 73 20 2d 20 6e 52   res = nLhs - nR
1fd70 68 73 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 65  hs;..  return re
1fd80 73 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 51 75 65  s;.}.../*.** Que
1fd90 72 79 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ry to see if the
1fda0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 25 5f   entry in the %_
1fdb0 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20 77  segments table w
1fdc0 69 74 68 20 62 6c 6f 63 6b 69 64 20 69 45 6e 64  ith blockid iEnd
1fdd0 20 69 73 20 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66   is .** NULL. If
1fde0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
1fdf0 20 61 6e 64 20 74 68 65 20 65 6e 74 72 79 20 69   and the entry i
1fe00 73 20 4e 55 4c 4c 2c 20 73 65 74 20 2a 70 62 52  s NULL, set *pbR
1fe10 65 73 20 31 20 62 65 66 6f 72 65 0a 2a 2a 20 72  es 1 before.** r
1fe20 65 74 75 72 6e 69 6e 67 2e 20 4f 74 68 65 72 77  eturning. Otherw
1fe30 69 73 65 2c 20 73 65 74 20 2a 70 62 52 65 73 20  ise, set *pbRes 
1fe40 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c  to 0. .**.** Or,
1fe50 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
1fe60 75 72 73 20 77 68 69 6c 65 20 71 75 65 72 79 69  urs while queryi
1fe70 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ng the database,
1fe80 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
1fe90 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  e .** error code
1fea0 2e 20 54 68 65 20 66 69 6e 61 6c 20 76 61 6c 75  . The final valu
1feb0 65 20 6f 66 20 2a 70 62 52 65 73 20 69 73 20 75  e of *pbRes is u
1fec0 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73  ndefined in this
1fed0 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   case..**.** Thi
1fee0 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  s is used to tes
1fef0 74 20 69 66 20 61 20 73 65 67 6d 65 6e 74 20 69  t if a segment i
1ff00 73 20 61 6e 20 22 61 70 70 65 6e 64 61 62 6c 65  s an "appendable
1ff10 22 20 73 65 67 6d 65 6e 74 2e 20 49 66 20 69 74  " segment. If it
1ff20 0a 2a 2a 20 69 73 2c 20 74 68 65 6e 20 61 20 4e  .** is, then a N
1ff30 55 4c 4c 20 65 6e 74 72 79 20 68 61 73 20 62 65  ULL entry has be
1ff40 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  en inserted into
1ff50 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20   the %_segments 
1ff60 74 61 62 6c 65 0a 2a 2a 20 77 69 74 68 20 62 6c  table.** with bl
1ff70 6f 63 6b 69 64 20 25 5f 73 65 67 64 69 72 2e 65  ockid %_segdir.e
1ff80 6e 64 5f 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61  nd_block..*/.sta
1ff90 74 69 63 20 69 6e 74 20 66 74 73 33 49 73 41 70  tic int fts3IsAp
1ffa0 70 65 6e 64 61 62 6c 65 28 46 74 73 33 54 61 62  pendable(Fts3Tab
1ffb0 6c 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69  le *p, sqlite3_i
1ffc0 6e 74 36 34 20 69 45 6e 64 2c 20 69 6e 74 20 2a  nt64 iEnd, int *
1ffd0 70 62 52 65 73 29 7b 0a 20 20 69 6e 74 20 62 52  pbRes){.  int bR
1ffe0 65 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  es = 0;         
1fff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
20000 75 6c 74 20 74 6f 20 73 65 74 20 2a 70 62 52 65  ult to set *pbRe
20010 73 20 74 6f 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s to */.  sqlite
20020 33 5f 73 74 6d 74 20 2a 70 43 68 65 63 6b 20 3d  3_stmt *pCheck =
20030 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61   0;       /* Sta
20040 74 65 6d 65 6e 74 20 74 6f 20 71 75 65 72 79 20  tement to query 
20050 64 61 74 61 62 61 73 65 20 77 69 74 68 20 2a 2f  database with */
20060 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
20070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20080 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
20090 65 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73  e */..  rc = fts
200a0 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
200b0 53 45 47 4d 45 4e 54 5f 49 53 5f 41 50 50 45 4e  SEGMENT_IS_APPEN
200c0 44 41 42 4c 45 2c 20 26 70 43 68 65 63 6b 2c 20  DABLE, &pCheck, 
200d0 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
200e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
200f0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
20100 34 28 70 43 68 65 63 6b 2c 20 31 2c 20 69 45 6e  4(pCheck, 1, iEn
20110 64 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  d);.    if( SQLI
20120 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
20130 73 74 65 70 28 70 43 68 65 63 6b 29 20 29 20 62  step(pCheck) ) b
20140 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 63 20  Res = 1;.    rc 
20150 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
20160 70 43 68 65 63 6b 29 3b 0a 20 20 7d 0a 20 20 0a  pCheck);.  }.  .
20170 20 20 2a 70 62 52 65 73 20 3d 20 62 52 65 73 3b    *pbRes = bRes;
20180 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20190 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
201a0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
201b0 68 65 6e 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  hen initializing
201c0 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d   an incremental-
201d0 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e  merge operation.
201e0 0a 2a 2a 20 49 74 20 63 68 65 63 6b 73 20 69 66  .** It checks if
201f0 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 73 65   the existing se
20200 67 6d 65 6e 74 20 77 69 74 68 20 69 6e 64 65 78  gment with index
20210 20 76 61 6c 75 65 20 69 49 64 78 20 61 74 20 61   value iIdx at a
20220 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 0a 2a  bsolute level .*
20230 2a 20 28 69 41 62 73 4c 65 76 65 6c 2b 31 29 20  * (iAbsLevel+1) 
20240 63 61 6e 20 62 65 20 61 70 70 65 6e 64 65 64 20  can be appended 
20250 74 6f 20 62 79 20 74 68 65 20 69 6e 63 72 65 6d  to by the increm
20260 65 6e 74 61 6c 20 6d 65 72 67 65 2e 20 49 66 20  ental merge. If 
20270 69 74 20 63 61 6e 2c 20 74 68 65 0a 2a 2a 20 6d  it can, the.** m
20280 65 72 67 65 2d 77 72 69 74 65 72 20 6f 62 6a 65  erge-writer obje
20290 63 74 20 2a 70 57 72 69 74 65 72 20 69 73 20 69  ct *pWriter is i
202a0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 77 72  nitialized to wr
202b0 69 74 65 20 74 6f 20 69 74 2e 0a 2a 2a 0a 2a 2a  ite to it..**.**
202c0 20 41 6e 20 65 78 69 73 74 69 6e 67 20 73 65 67   An existing seg
202d0 6d 65 6e 74 20 63 61 6e 20 62 65 20 61 70 70 65  ment can be appe
202e0 6e 64 65 64 20 74 6f 20 62 79 20 61 6e 20 69 6e  nded to by an in
202f0 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20  cremental merge 
20300 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 74  if:.**.**   * It
20310 20 77 61 73 20 69 6e 69 74 69 61 6c 6c 79 20 63   was initially c
20320 72 65 61 74 65 64 20 61 73 20 61 6e 20 61 70 70  reated as an app
20330 65 6e 64 61 62 6c 65 20 73 65 67 6d 65 6e 74 20  endable segment 
20340 28 77 69 74 68 20 61 6c 6c 20 72 65 71 75 69 72  (with all requir
20350 65 64 0a 2a 2a 20 20 20 20 20 73 70 61 63 65 20  ed.**     space 
20360 70 72 65 2d 61 6c 6c 6f 63 61 74 65 64 29 2c 20  pre-allocated), 
20370 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  and.**.**   * Th
20380 65 20 66 69 72 73 74 20 6b 65 79 20 72 65 61 64  e first key read
20390 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20   from the input 
203a0 28 61 72 67 75 6d 65 6e 74 73 20 7a 4b 65 79 20  (arguments zKey 
203b0 61 6e 64 20 6e 4b 65 79 29 20 69 73 20 0a 2a 2a  and nKey) is .**
203c0 20 20 20 20 20 67 72 65 61 74 65 72 20 74 68 61       greater tha
203d0 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  n the largest ke
203e0 79 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  y currently stor
203f0 65 64 20 69 6e 20 74 68 65 20 70 6f 74 65 6e 74  ed in the potent
20400 69 61 6c 0a 2a 2a 20 20 20 20 20 6f 75 74 70 75  ial.**     outpu
20410 74 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  t segment..*/.st
20420 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63  atic int fts3Inc
20430 72 6d 65 72 67 65 4c 6f 61 64 28 0a 20 20 46 74  rmergeLoad(.  Ft
20440 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
20450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20460 20 46 74 73 33 20 74 61 62 6c 65 20 68 61 6e 64   Fts3 table hand
20470 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
20480 69 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c 2c  int64 iAbsLevel,
20490 20 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c          /* Absol
204a0 75 74 65 20 6c 65 76 65 6c 20 6f 66 20 69 6e 70  ute level of inp
204b0 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  ut segments */. 
204c0 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20   int iIdx,      
204d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204e0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 61 6e   /* Index of can
204f0 64 69 64 61 74 65 20 6f 75 74 70 75 74 20 73 65  didate output se
20500 67 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  gment */.  const
20510 20 63 68 61 72 20 2a 7a 4b 65 79 2c 20 20 20 20   char *zKey,    
20520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
20530 72 73 74 20 6b 65 79 20 74 6f 20 77 72 69 74 65  rst key to write
20540 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20   */.  int nKey, 
20550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20560 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
20570 6f 66 20 62 79 74 65 73 20 69 6e 20 6e 4b 65 79  of bytes in nKey
20580 20 2a 2f 0a 20 20 49 6e 63 72 6d 65 72 67 65 57   */.  IncrmergeW
20590 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20 20  riter *pWriter  
205a0 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74        /* Populat
205b0 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f  e this object */
205c0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
205d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205e0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
205f0 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  code */.  sqlite
20600 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 20  3_stmt *pSelect 
20610 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 45 4c  = 0;      /* SEL
20620 45 43 54 20 74 6f 20 72 65 61 64 20 25 5f 73 65  ECT to read %_se
20630 67 64 69 72 20 65 6e 74 72 79 20 2a 2f 0a 0a 20  gdir entry */.. 
20640 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
20650 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f  t(p, SQL_SELECT_
20660 53 45 47 44 49 52 2c 20 26 70 53 65 6c 65 63 74  SEGDIR, &pSelect
20670 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
20680 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20690 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
206a0 53 74 61 72 74 20 3d 20 30 3b 20 20 20 20 20 2f  Start = 0;     /
206b0 2a 20 56 61 6c 75 65 20 6f 66 20 25 5f 73 65 67  * Value of %_seg
206c0 64 69 72 2e 73 74 61 72 74 5f 62 6c 6f 63 6b 20  dir.start_block 
206d0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  */.    sqlite3_i
206e0 6e 74 36 34 20 69 4c 65 61 66 45 6e 64 20 3d 20  nt64 iLeafEnd = 
206f0 30 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66  0;   /* Value of
20700 20 25 5f 73 65 67 64 69 72 2e 6c 65 61 76 65 73   %_segdir.leaves
20710 5f 65 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20  _end_block */.  
20720 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
20730 69 45 6e 64 20 3d 20 30 3b 20 20 20 20 20 20 20  iEnd = 0;       
20740 2f 2a 20 56 61 6c 75 65 20 6f 66 20 25 5f 73 65  /* Value of %_se
20750 67 64 69 72 2e 65 6e 64 5f 62 6c 6f 63 6b 20 2a  gdir.end_block *
20760 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
20770 20 2a 61 52 6f 6f 74 20 3d 20 30 3b 20 20 20 20   *aRoot = 0;    
20780 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
20790 6f 20 25 5f 73 65 67 64 69 72 2e 72 6f 6f 74 20  o %_segdir.root 
207a0 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 69 6e  buffer */.    in
207b0 74 20 6e 52 6f 6f 74 20 3d 20 30 3b 20 20 20 20  t nRoot = 0;    
207c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
207d0 69 7a 65 20 6f 66 20 61 52 6f 6f 74 5b 5d 20 69  ize of aRoot[] i
207e0 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69  n bytes */.    i
207f0 6e 74 20 72 63 32 3b 20 20 20 20 20 20 20 20 20  nt rc2;         
20800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20810 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
20820 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29   sqlite3_reset()
20830 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 41 70 70   */.    int bApp
20840 65 6e 64 61 62 6c 65 20 3d 20 30 3b 20 20 20 20  endable = 0;    
20850 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
20860 74 72 75 65 20 69 66 20 73 65 67 6d 65 6e 74 20  true if segment 
20870 69 73 20 61 70 70 65 6e 64 61 62 6c 65 20 2a 2f  is appendable */
20880 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
20890 65 20 25 5f 73 65 67 64 69 72 20 65 6e 74 72 79  e %_segdir entry
208a0 20 66 6f 72 20 69 6e 64 65 78 20 69 49 64 78 20   for index iIdx 
208b0 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 28  absolute level (
208c0 69 41 62 73 4c 65 76 65 6c 2b 31 29 20 2a 2f 0a  iAbsLevel+1) */.
208d0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
208e0 5f 69 6e 74 36 34 28 70 53 65 6c 65 63 74 2c 20  _int64(pSelect, 
208f0 31 2c 20 69 41 62 73 4c 65 76 65 6c 2b 31 29 3b  1, iAbsLevel+1);
20900 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
20910 64 5f 69 6e 74 28 70 53 65 6c 65 63 74 2c 20 32  d_int(pSelect, 2
20920 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 69 66 28  , iIdx);.    if(
20930 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
20940 65 6c 65 63 74 29 3d 3d 53 51 4c 49 54 45 5f 52  elect)==SQLITE_R
20950 4f 57 20 29 7b 0a 20 20 20 20 20 20 69 53 74 61  OW ){.      iSta
20960 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  rt = sqlite3_col
20970 75 6d 6e 5f 69 6e 74 36 34 28 70 53 65 6c 65 63  umn_int64(pSelec
20980 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 4c 65  t, 1);.      iLe
20990 61 66 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 5f  afEnd = sqlite3_
209a0 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 65  column_int64(pSe
209b0 6c 65 63 74 2c 20 32 29 3b 0a 20 20 20 20 20 20  lect, 2);.      
209c0 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 5f 63  iEnd = sqlite3_c
209d0 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 65 6c  olumn_int64(pSel
209e0 65 63 74 2c 20 33 29 3b 0a 20 20 20 20 20 20 6e  ect, 3);.      n
209f0 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f 63  Root = sqlite3_c
20a00 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 65 6c  olumn_bytes(pSel
20a10 65 63 74 2c 20 34 29 3b 0a 20 20 20 20 20 20 61  ect, 4);.      a
20a20 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f 63  Root = sqlite3_c
20a30 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 65 6c 65  olumn_blob(pSele
20a40 63 74 2c 20 34 29 3b 0a 20 20 20 20 7d 65 6c 73  ct, 4);.    }els
20a50 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
20a60 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
20a70 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  elect);.    }.. 
20a80 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
20a90 74 68 65 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20  the zero-length 
20aa0 6d 61 72 6b 65 72 20 69 6e 20 74 68 65 20 25 5f  marker in the %_
20ab0 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20 2a  segments table *
20ac0 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 49  /.    rc = fts3I
20ad0 73 41 70 70 65 6e 64 61 62 6c 65 28 70 2c 20 69  sAppendable(p, i
20ae0 45 6e 64 2c 20 26 62 41 70 70 65 6e 64 61 62 6c  End, &bAppendabl
20af0 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  e);..    /* Chec
20b00 6b 20 74 68 61 74 20 7a 4b 65 79 2f 6e 4b 65 79  k that zKey/nKey
20b10 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
20b20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20  the largest key 
20b30 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 2a 2f  the candidate */
20b40 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
20b50 49 54 45 5f 4f 4b 20 26 26 20 62 41 70 70 65 6e  ITE_OK && bAppen
20b60 64 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 63  dable ){.      c
20b70 68 61 72 20 2a 61 4c 65 61 66 20 3d 20 30 3b 0a  har *aLeaf = 0;.
20b80 20 20 20 20 20 20 69 6e 74 20 6e 4c 65 61 66 20        int nLeaf 
20b90 3d 20 30 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  = 0;..      rc =
20ba0 20 73 71 6c 69 74 65 33 46 74 73 33 52 65 61 64   sqlite3Fts3Read
20bb0 42 6c 6f 63 6b 28 70 2c 20 69 4c 65 61 66 45 6e  Block(p, iLeafEn
20bc0 64 2c 20 26 61 4c 65 61 66 2c 20 26 6e 4c 65 61  d, &aLeaf, &nLea
20bd0 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  f, 0);.      if(
20be0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20bf0 7b 0a 20 20 20 20 20 20 20 20 4e 6f 64 65 52 65  {.        NodeRe
20c00 61 64 65 72 20 72 65 61 64 65 72 3b 0a 20 20 20  ader reader;.   
20c10 20 20 20 20 20 66 6f 72 28 72 63 20 3d 20 6e 6f       for(rc = no
20c20 64 65 52 65 61 64 65 72 49 6e 69 74 28 26 72 65  deReaderInit(&re
20c30 61 64 65 72 2c 20 61 4c 65 61 66 2c 20 6e 4c 65  ader, aLeaf, nLe
20c40 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  af);.           
20c50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
20c60 26 20 72 65 61 64 65 72 2e 61 4e 6f 64 65 3b 0a  & reader.aNode;.
20c70 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
20c80 20 6e 6f 64 65 52 65 61 64 65 72 4e 65 78 74 28   nodeReaderNext(
20c90 26 72 65 61 64 65 72 29 0a 20 20 20 20 20 20 20  &reader).       
20ca0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
20cb0 73 65 72 74 28 20 72 65 61 64 65 72 2e 61 4e 6f  sert( reader.aNo
20cc0 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  de );.        }.
20cd0 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73 33          if( fts3
20ce0 54 65 72 6d 43 6d 70 28 7a 4b 65 79 2c 20 6e 4b  TermCmp(zKey, nK
20cf0 65 79 2c 20 72 65 61 64 65 72 2e 74 65 72 6d 2e  ey, reader.term.
20d00 61 2c 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 6e  a, reader.term.n
20d10 29 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )<=0 ){.        
20d20 20 20 62 41 70 70 65 6e 64 61 62 6c 65 20 3d 20    bAppendable = 
20d30 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
20d40 20 20 20 20 20 6e 6f 64 65 52 65 61 64 65 72 52       nodeReaderR
20d50 65 6c 65 61 73 65 28 26 72 65 61 64 65 72 29 3b  elease(&reader);
20d60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
20d70 71 6c 69 74 65 33 5f 66 72 65 65 28 61 4c 65 61  qlite3_free(aLea
20d80 66 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  f);.    }..    i
20d90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20da0 20 26 26 20 62 41 70 70 65 6e 64 61 62 6c 65 20   && bAppendable 
20db0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69  ){.      /* It i
20dc0 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 70  s possible to ap
20dd0 70 65 6e 64 20 74 6f 20 74 68 69 73 20 73 65 67  pend to this seg
20de0 6d 65 6e 74 2e 20 53 65 74 20 75 70 20 74 68 65  ment. Set up the
20df0 20 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72   IncrmergeWriter
20e00 0a 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74  .      ** object
20e10 20 74 6f 20 64 6f 20 73 6f 2e 20 20 2a 2f 0a 20   to do so.  */. 
20e20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
20e30 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
20e40 28 69 6e 74 29 61 52 6f 6f 74 5b 30 5d 3b 0a 20  (int)aRoot[0];. 
20e50 20 20 20 20 20 4e 6f 64 65 57 72 69 74 65 72 20       NodeWriter 
20e60 2a 70 4e 6f 64 65 3b 0a 0a 20 20 20 20 20 20 70  *pNode;..      p
20e70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74  Writer->nLeafEst
20e80 20 3d 20 28 28 69 45 6e 64 20 2d 20 69 53 74 61   = ((iEnd - iSta
20e90 72 74 29 20 2b 20 31 29 20 2f 20 46 54 53 5f 4d  rt) + 1) / FTS_M
20ea0 41 58 5f 41 50 50 45 4e 44 41 42 4c 45 5f 48 45  AX_APPENDABLE_HE
20eb0 49 47 48 54 3b 0a 20 20 20 20 20 20 70 57 72 69  IGHT;.      pWri
20ec0 74 65 72 2d 3e 69 53 74 61 72 74 20 3d 20 69 53  ter->iStart = iS
20ed0 74 61 72 74 3b 0a 20 20 20 20 20 20 70 57 72 69  tart;.      pWri
20ee0 74 65 72 2d 3e 69 45 6e 64 20 3d 20 69 45 6e 64  ter->iEnd = iEnd
20ef0 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d  ;.      pWriter-
20f00 3e 69 41 62 73 4c 65 76 65 6c 20 3d 20 69 41 62  >iAbsLevel = iAb
20f10 73 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20 70 57  sLevel;.      pW
20f20 72 69 74 65 72 2d 3e 69 49 64 78 20 3d 20 69 49  riter->iIdx = iI
20f30 64 78 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69  dx;..      for(i
20f40 3d 6e 48 65 69 67 68 74 2b 31 3b 20 69 3c 46 54  =nHeight+1; i<FT
20f50 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c 45  S_MAX_APPENDABLE
20f60 5f 48 45 49 47 48 54 3b 20 69 2b 2b 29 7b 0a 20  _HEIGHT; i++){. 
20f70 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e         pWriter->
20f80 61 4e 6f 64 65 57 72 69 74 65 72 5b 69 5d 2e 69  aNodeWriter[i].i
20f90 42 6c 6f 63 6b 20 3d 20 70 57 72 69 74 65 72 2d  Block = pWriter-
20fa0 3e 69 53 74 61 72 74 20 2b 20 69 2a 70 57 72 69  >iStart + i*pWri
20fb0 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74 3b 0a 20  ter->nLeafEst;. 
20fc0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 4e       }..      pN
20fd0 6f 64 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  ode = &pWriter->
20fe0 61 4e 6f 64 65 57 72 69 74 65 72 5b 6e 48 65 69  aNodeWriter[nHei
20ff0 67 68 74 5d 3b 0a 20 20 20 20 20 20 70 4e 6f 64  ght];.      pNod
21000 65 2d 3e 69 42 6c 6f 63 6b 20 3d 20 70 57 72 69  e->iBlock = pWri
21010 74 65 72 2d 3e 69 53 74 61 72 74 20 2b 20 70 57  ter->iStart + pW
21020 72 69 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74 2a  riter->nLeafEst*
21030 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 20 20 62  nHeight;.      b
21040 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28 26 70  lobGrowBuffer(&p
21050 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2c 20 4d 41 58  Node->block, MAX
21060 28 6e 52 6f 6f 74 2c 20 70 2d 3e 6e 4e 6f 64 65  (nRoot, p->nNode
21070 53 69 7a 65 29 2c 20 26 72 63 29 3b 0a 20 20 20  Size), &rc);.   
21080 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21090 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
210a0 6d 65 6d 63 70 79 28 70 4e 6f 64 65 2d 3e 62 6c  memcpy(pNode->bl
210b0 6f 63 6b 2e 61 2c 20 61 52 6f 6f 74 2c 20 6e 52  ock.a, aRoot, nR
210c0 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  oot);.        pN
210d0 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 20 3d 20 6e  ode->block.n = n
210e0 52 6f 6f 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Root;.      }.. 
210f0 20 20 20 20 20 66 6f 72 28 69 3d 6e 48 65 69 67       for(i=nHeig
21100 68 74 3b 20 69 3e 3d 30 20 26 26 20 72 63 3d 3d  ht; i>=0 && rc==
21110 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2d 2d 29 7b  SQLITE_OK; i--){
21120 0a 20 20 20 20 20 20 20 20 70 4e 6f 64 65 20 3d  .        pNode =
21130 20 26 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65   &pWriter->aNode
21140 57 72 69 74 65 72 5b 69 5d 3b 0a 20 20 20 20 20  Writer[i];.     
21150 20 20 20 4e 6f 64 65 52 65 61 64 65 72 20 72 65     NodeReader re
21160 61 64 65 72 3b 0a 0a 20 20 20 20 20 20 20 20 72  ader;..        r
21170 63 20 3d 20 6e 6f 64 65 52 65 61 64 65 72 49 6e  c = nodeReaderIn
21180 69 74 28 26 72 65 61 64 65 72 2c 20 70 4e 6f 64  it(&reader, pNod
21190 65 2d 3e 62 6c 6f 63 6b 2e 61 2c 20 70 4e 6f 64  e->block.a, pNod
211a0 65 2d 3e 62 6c 6f 63 6b 2e 6e 29 3b 0a 20 20 20  e->block.n);.   
211b0 20 20 20 20 20 77 68 69 6c 65 28 20 72 65 61 64       while( read
211c0 65 72 2e 61 4e 6f 64 65 20 26 26 20 72 63 3d 3d  er.aNode && rc==
211d0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
211e0 20 6e 6f 64 65 52 65 61 64 65 72 4e 65 78 74 28   nodeReaderNext(
211f0 26 72 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20  &reader);.      
21200 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 72    blobGrowBuffer
21210 28 26 70 4e 6f 64 65 2d 3e 6b 65 79 2c 20 72 65  (&pNode->key, re
21220 61 64 65 72 2e 74 65 72 6d 2e 6e 2c 20 26 72 63  ader.term.n, &rc
21230 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
21240 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21250 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
21260 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e 61 2c 20 72  (pNode->key.a, r
21270 65 61 64 65 72 2e 74 65 72 6d 2e 61 2c 20 72 65  eader.term.a, re
21280 61 64 65 72 2e 74 65 72 6d 2e 6e 29 3b 0a 20 20  ader.term.n);.  
21290 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 6b          pNode->k
212a0 65 79 2e 6e 20 3d 20 72 65 61 64 65 72 2e 74 65  ey.n = reader.te
212b0 72 6d 2e 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  rm.n;.          
212c0 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20  if( i>0 ){.     
212d0 20 20 20 20 20 20 20 63 68 61 72 20 2a 61 42 6c         char *aBl
212e0 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ock = 0;.       
212f0 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 63 6b 20       int nBlock 
21300 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
21310 20 70 4e 6f 64 65 20 3d 20 26 70 57 72 69 74 65   pNode = &pWrite
21320 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 69  r->aNodeWriter[i
21330 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -1];.           
21340 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b 20 3d   pNode->iBlock =
21350 20 72 65 61 64 65 72 2e 69 43 68 69 6c 64 3b 0a   reader.iChild;.
21360 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
21370 20 73 71 6c 69 74 65 33 46 74 73 33 52 65 61 64   sqlite3Fts3Read
21380 42 6c 6f 63 6b 28 70 2c 20 72 65 61 64 65 72 2e  Block(p, reader.
21390 69 43 68 69 6c 64 2c 20 26 61 42 6c 6f 63 6b 2c  iChild, &aBlock,
213a0 20 26 6e 42 6c 6f 63 6b 2c 20 30 29 3b 0a 20 20   &nBlock, 0);.  
213b0 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 47 72            blobGr
213c0 6f 77 42 75 66 66 65 72 28 26 70 4e 6f 64 65 2d  owBuffer(&pNode-
213d0 3e 62 6c 6f 63 6b 2c 20 4d 41 58 28 6e 42 6c 6f  >block, MAX(nBlo
213e0 63 6b 2c 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65  ck, p->nNodeSize
213f0 29 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  ), &rc);.       
21400 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
21410 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21420 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
21430 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 2c 20 61  Node->block.a, a
21440 42 6c 6f 63 6b 2c 20 6e 42 6c 6f 63 6b 29 3b 0a  Block, nBlock);.
21450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
21460 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 20 3d 20 6e  ode->block.n = n
21470 42 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 20  Block;.         
21480 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
21490 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 42   sqlite3_free(aB
214a0 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  lock);.         
214b0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
214c0 20 20 20 20 20 6e 6f 64 65 52 65 61 64 65 72 52       nodeReaderR
214d0 65 6c 65 61 73 65 28 26 72 65 61 64 65 72 29 3b  elease(&reader);
214e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
214f0 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
21500 33 5f 72 65 73 65 74 28 70 53 65 6c 65 63 74 29  3_reset(pSelect)
21510 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
21520 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
21530 63 32 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  c2;.  }..  retur
21540 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
21550 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6c 61 72  etermine the lar
21560 67 65 73 74 20 73 65 67 6d 65 6e 74 20 69 6e 64  gest segment ind
21570 65 78 20 76 61 6c 75 65 20 74 68 61 74 20 65 78  ex value that ex
21580 69 73 74 73 20 77 69 74 68 69 6e 20 61 62 73 6f  ists within abso
21590 6c 75 74 65 0a 2a 2a 20 6c 65 76 65 6c 20 69 41  lute.** level iA
215a0 62 73 4c 65 76 65 6c 2b 31 2e 20 49 66 20 6e 6f  bsLevel+1. If no
215b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
215c0 65 74 20 2a 70 69 49 64 78 20 74 6f 20 74 68 69  et *piIdx to thi
215d0 73 20 76 61 6c 75 65 20 70 6c 75 73 0a 2a 2a 20  s value plus.** 
215e0 6f 6e 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  one before retur
215f0 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  ning SQLITE_OK. 
21600 4f 72 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  Or, if there are
21610 20 6e 6f 20 73 65 67 6d 65 6e 74 73 20 61 74 20   no segments at 
21620 61 6c 6c 20 0a 2a 2a 20 77 69 74 68 69 6e 20 6c  all .** within l
21630 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c 2c 20  evel iAbsLevel, 
21640 73 65 74 20 2a 70 69 49 64 78 20 74 6f 20 7a 65  set *piIdx to ze
21650 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ro..**.** If an 
21660 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
21670 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
21680 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66  rror code. The f
21690 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 0a 2a 2a  inal value of.**
216a0 20 2a 70 69 49 64 78 20 69 73 20 75 6e 64 65 66   *piIdx is undef
216b0 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73  ined in this cas
216c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
216d0 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 4f 75   fts3IncrmergeOu
216e0 74 70 75 74 49 64 78 28 20 0a 20 20 46 74 73 33  tputIdx( .  Fts3
216f0 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
21700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
21710 54 53 20 54 61 62 6c 65 20 68 61 6e 64 6c 65 20  TS Table handle 
21720 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
21730 36 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20  64 iAbsLevel,   
21740 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65       /* Absolute
21750 20 69 6e 64 65 78 20 6f 66 20 69 6e 70 75 74 20   index of input 
21760 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e  segments */.  in
21770 74 20 2a 70 69 49 64 78 20 20 20 20 20 20 20 20  t *piIdx        
21780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21790 20 4f 55 54 3a 20 4e 65 78 74 20 66 72 65 65 20   OUT: Next free 
217a0 69 6e 64 65 78 20 61 74 20 69 41 62 73 4c 65 76  index at iAbsLev
217b0 65 6c 2b 31 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  el+1 */.){.  int
217c0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73   rc;.  sqlite3_s
217d0 74 6d 74 20 2a 70 4f 75 74 70 75 74 49 64 78 20  tmt *pOutputIdx 
217e0 3d 20 30 3b 20 20 20 2f 2a 20 53 51 4c 20 75 73  = 0;   /* SQL us
217f0 65 64 20 74 6f 20 66 69 6e 64 20 6f 75 74 70 75  ed to find outpu
21800 74 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 72 63  t index */..  rc
21810 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
21820 2c 20 53 51 4c 5f 4e 45 58 54 5f 53 45 47 4d 45  , SQL_NEXT_SEGME
21830 4e 54 5f 49 4e 44 45 58 2c 20 26 70 4f 75 74 70  NT_INDEX, &pOutp
21840 75 74 49 64 78 2c 20 30 29 3b 0a 20 20 69 66 28  utIdx, 0);.  if(
21850 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21860 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  {.    sqlite3_bi
21870 6e 64 5f 69 6e 74 36 34 28 70 4f 75 74 70 75 74  nd_int64(pOutput
21880 49 64 78 2c 20 31 2c 20 69 41 62 73 4c 65 76 65  Idx, 1, iAbsLeve
21890 6c 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l+1);.    sqlite
218a0 33 5f 73 74 65 70 28 70 4f 75 74 70 75 74 49 64  3_step(pOutputId
218b0 78 29 3b 0a 20 20 20 20 2a 70 69 49 64 78 20 3d  x);.    *piIdx =
218c0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
218d0 69 6e 74 28 70 4f 75 74 70 75 74 49 64 78 2c 20  int(pOutputIdx, 
218e0 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  0);.    rc = sql
218f0 69 74 65 33 5f 72 65 73 65 74 28 70 4f 75 74 70  ite3_reset(pOutp
21900 75 74 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 72  utIdx);.  }..  r
21910 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
21920 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20  .** Allocate an 
21930 61 70 70 65 6e 64 61 62 6c 65 20 6f 75 74 70 75  appendable outpu
21940 74 20 73 65 67 6d 65 6e 74 20 6f 6e 20 61 62 73  t segment on abs
21950 6f 6c 75 74 65 20 6c 65 76 65 6c 20 69 41 62 73  olute level iAbs
21960 4c 65 76 65 6c 2b 31 0a 2a 2a 20 77 69 74 68 20  Level+1.** with 
21970 69 64 78 20 76 61 6c 75 65 20 69 49 64 78 2e 0a  idx value iIdx..
21980 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 25 5f 73  **.** In the %_s
21990 65 67 64 69 72 20 74 61 62 6c 65 2c 20 61 20 73  egdir table, a s
219a0 65 67 6d 65 6e 74 20 69 73 20 64 65 66 69 6e 65  egment is define
219b0 64 20 62 79 20 74 68 65 20 76 61 6c 75 65 73 20  d by the values 
219c0 69 6e 20 74 68 72 65 65 0a 2a 2a 20 63 6f 6c 75  in three.** colu
219d0 6d 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  mns:.**.**     s
219e0 74 61 72 74 5f 62 6c 6f 63 6b 0a 2a 2a 20 20 20  tart_block.**   
219f0 20 20 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f    leaves_end_blo
21a00 63 6b 0a 2a 2a 20 20 20 20 20 65 6e 64 5f 62 6c  ck.**     end_bl
21a10 6f 63 6b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ock.**.** When a
21a20 6e 20 61 70 70 65 6e 64 61 62 6c 65 20 73 65 67  n appendable seg
21a30 6d 65 6e 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  ment is allocate
21a40 64 2c 20 69 74 20 69 73 20 65 73 74 69 6d 61 74  d, it is estimat
21a50 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 6d  ed that the.** m
21a60 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
21a70 20 6c 65 61 66 20 62 6c 6f 63 6b 73 20 74 68 61   leaf blocks tha
21a80 74 20 6d 61 79 20 62 65 20 72 65 71 75 69 72 65  t may be require
21a90 64 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  d is the sum of 
21aa0 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
21ab0 20 6c 65 61 66 20 62 6c 6f 63 6b 73 20 63 6f 6e   leaf blocks con
21ac0 73 75 6d 65 64 20 62 79 20 74 68 65 20 69 6e 70  sumed by the inp
21ad0 75 74 20 73 65 67 6d 65 6e 74 73 2c 20 70 6c 75  ut segments, plu
21ae0 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  s the number.** 
21af0 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  of input segment
21b00 73 2c 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79  s, multiplied by
21b10 20 74 77 6f 2e 20 54 68 69 73 20 76 61 6c 75 65   two. This value
21b20 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 73 74   is stored in st
21b30 61 63 6b 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65  ack .** variable
21b40 20 6e 4c 65 61 66 45 73 74 2e 0a 2a 2a 0a 2a 2a   nLeafEst..**.**
21b50 20 41 20 74 6f 74 61 6c 20 6f 66 20 31 36 2a 6e   A total of 16*n
21b60 4c 65 61 66 45 73 74 20 62 6c 6f 63 6b 73 20 61  LeafEst blocks a
21b70 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 77 68 65  re allocated whe
21b80 6e 20 61 6e 20 61 70 70 65 6e 64 61 62 6c 65 20  n an appendable 
21b90 73 65 67 6d 65 6e 74 0a 2a 2a 20 69 73 20 63 72  segment.** is cr
21ba0 65 61 74 65 64 20 28 28 31 20 2b 20 65 6e 64 5f  eated ((1 + end_
21bb0 62 6c 6f 63 6b 20 2d 20 73 74 61 72 74 5f 62 6c  block - start_bl
21bc0 6f 63 6b 29 3d 3d 31 36 2a 6e 4c 65 61 66 45 73  ock)==16*nLeafEs
21bd0 74 29 2e 20 54 68 65 20 63 6f 6e 74 69 67 75 6f  t). The contiguo
21be0 75 73 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 6c  us.** array of l
21bf0 65 61 66 20 6e 6f 64 65 73 20 73 74 61 72 74 73  eaf nodes starts
21c00 20 61 74 20 74 68 65 20 66 69 72 73 74 20 62 6c   at the first bl
21c10 6f 63 6b 20 61 6c 6c 6f 63 61 74 65 64 2e 20 54  ock allocated. T
21c20 68 65 20 61 72 72 61 79 0a 2a 2a 20 6f 66 20 69  he array.** of i
21c30 6e 74 65 72 69 6f 72 20 6e 6f 64 65 73 20 74 68  nterior nodes th
21c40 61 74 20 61 72 65 20 70 61 72 65 6e 74 73 20 6f  at are parents o
21c50 66 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 73  f the leaf nodes
21c60 20 73 74 61 72 74 20 61 74 20 62 6c 6f 63 6b 0a   start at block.
21c70 2a 2a 20 28 73 74 61 72 74 5f 62 6c 6f 63 6b 20  ** (start_block 
21c80 2b 20 28 31 20 2b 20 65 6e 64 5f 62 6c 6f 63 6b  + (1 + end_block
21c90 20 2d 20 73 74 61 72 74 5f 62 6c 6f 63 6b 29 20   - start_block) 
21ca0 2f 20 31 36 29 2e 20 41 6e 64 20 73 6f 20 6f 6e  / 16). And so on
21cb0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61  ..**.** In the a
21cc0 63 74 75 61 6c 20 63 6f 64 65 20 62 65 6c 6f 77  ctual code below
21cd0 2c 20 74 68 65 20 76 61 6c 75 65 20 22 31 36 22  , the value "16"
21ce0 20 69 73 20 72 65 70 6c 61 63 65 64 20 77 69 74   is replaced wit
21cf0 68 20 74 68 65 20 0a 2a 2a 20 70 72 65 2d 70 72  h the .** pre-pr
21d00 6f 63 65 73 73 6f 72 20 6d 61 63 72 6f 20 46 54  ocessor macro FT
21d10 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c 45  S_MAX_APPENDABLE
21d20 5f 48 45 49 47 48 54 2e 0a 2a 2f 0a 73 74 61 74  _HEIGHT..*/.stat
21d30 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72 6d  ic int fts3Incrm
21d40 65 72 67 65 57 72 69 74 65 72 28 20 0a 20 20 46  ergeWriter( .  F
21d50 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
21d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21d70 2a 20 46 74 73 33 20 74 61 62 6c 65 20 68 61 6e  * Fts3 table han
21d80 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dle */.  sqlite3
21d90 5f 69 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c  _int64 iAbsLevel
21da0 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f  ,        /* Abso
21db0 6c 75 74 65 20 6c 65 76 65 6c 20 6f 66 20 69 6e  lute level of in
21dc0 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  put segments */.
21dd0 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20    int iIdx,     
21de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21df0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65    /* Index of ne
21e00 77 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  w output segment
21e10 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53   */.  Fts3MultiS
21e20 65 67 52 65 61 64 65 72 20 2a 70 43 73 72 2c 20  egReader *pCsr, 
21e30 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
21e40 74 68 61 74 20 64 61 74 61 20 77 69 6c 6c 20 62  that data will b
21e50 65 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  e read from */. 
21e60 20 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72   IncrmergeWriter
21e70 20 2a 70 57 72 69 74 65 72 20 20 20 20 20 20 20   *pWriter       
21e80 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69   /* Populate thi
21e90 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  s object */.){. 
21ea0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
21eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ec0 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
21ed0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  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 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
21f00 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69   variable */.  i
21f10 6e 74 20 6e 4c 65 61 66 45 73 74 3b 20 20 20 20  nt nLeafEst;    
21f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21f30 2a 20 42 6c 6f 63 6b 73 20 61 6c 6c 6f 63 61 74  * Blocks allocat
21f40 65 64 20 66 6f 72 20 6c 65 61 66 20 6e 6f 64 65  ed for leaf node
21f50 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  s */.  sqlite3_s
21f60 74 6d 74 20 2a 70 4c 65 61 66 45 73 74 20 3d 20  tmt *pLeafEst = 
21f70 30 3b 20 20 20 20 20 2f 2a 20 53 51 4c 20 75 73  0;     /* SQL us
21f80 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
21f90 6e 4c 65 61 66 45 73 74 20 2a 2f 0a 20 20 73 71  nLeafEst */.  sq
21fa0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 46 69 72  lite3_stmt *pFir
21fb0 73 74 42 6c 6f 63 6b 20 3d 20 30 3b 20 20 2f 2a  stBlock = 0;  /*
21fc0 20 53 51 4c 20 75 73 65 64 20 74 6f 20 64 65 74   SQL used to det
21fd0 65 72 6d 69 6e 65 20 66 69 72 73 74 20 62 6c 6f  ermine first blo
21fe0 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 43 61 6c 63  ck */..  /* Calc
21ff0 75 6c 61 74 65 20 6e 4c 65 61 66 45 73 74 2e 20  ulate nLeafEst. 
22000 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71  */.  rc = fts3Sq
22010 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 4d 41 58  lStmt(p, SQL_MAX
22020 5f 4c 45 41 46 5f 4e 4f 44 45 5f 45 53 54 49 4d  _LEAF_NODE_ESTIM
22030 41 54 45 2c 20 26 70 4c 65 61 66 45 73 74 2c 20  ATE, &pLeafEst, 
22040 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
22050 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
22060 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
22070 34 28 70 4c 65 61 66 45 73 74 2c 20 31 2c 20 69  4(pLeafEst, 1, i
22080 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20 73  AbsLevel);.    s
22090 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
220a0 34 28 70 4c 65 61 66 45 73 74 2c 20 32 2c 20 70  4(pLeafEst, 2, p
220b0 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 29 3b 0a  Csr->nSegment);.
220c0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
220d0 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
220e0 28 70 4c 65 61 66 45 73 74 29 20 29 7b 0a 20 20  (pLeafEst) ){.  
220f0 20 20 20 20 6e 4c 65 61 66 45 73 74 20 3d 20 73      nLeafEst = s
22100 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
22110 74 28 70 4c 65 61 66 45 73 74 2c 20 30 29 3b 0a  t(pLeafEst, 0);.
22120 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
22130 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 4c 65  qlite3_reset(pLe
22140 61 66 45 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66  afEst);.  }.  if
22150 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22160 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
22170 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65  /* Calculate the
22180 20 66 69 72 73 74 20 62 6c 6f 63 6b 20 74 6f 20   first block to 
22190 75 73 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75  use in the outpu
221a0 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 72  t segment */.  r
221b0 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
221c0 70 2c 20 53 51 4c 5f 4e 45 58 54 5f 53 45 47 4d  p, SQL_NEXT_SEGM
221d0 45 4e 54 53 5f 49 44 2c 20 26 70 46 69 72 73 74  ENTS_ID, &pFirst
221e0 42 6c 6f 63 6b 2c 20 30 29 3b 0a 20 20 69 66 28  Block, 0);.  if(
221f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22200 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  {.    if( SQLITE
22210 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
22220 65 70 28 70 46 69 72 73 74 42 6c 6f 63 6b 29 20  ep(pFirstBlock) 
22230 29 7b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72  ){.      pWriter
22240 2d 3e 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74  ->iStart = sqlit
22250 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
22260 70 46 69 72 73 74 42 6c 6f 63 6b 2c 20 30 29 3b  pFirstBlock, 0);
22270 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e  .      pWriter->
22280 69 45 6e 64 20 3d 20 70 57 72 69 74 65 72 2d 3e  iEnd = pWriter->
22290 69 53 74 61 72 74 20 2d 20 31 3b 0a 20 20 20 20  iStart - 1;.    
222a0 20 20 70 57 72 69 74 65 72 2d 3e 69 45 6e 64 20    pWriter->iEnd 
222b0 2b 3d 20 6e 4c 65 61 66 45 73 74 20 2a 20 46 54  += nLeafEst * FT
222c0 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c 45  S_MAX_APPENDABLE
222d0 5f 48 45 49 47 48 54 3b 0a 20 20 20 20 7d 0a 20  _HEIGHT;.    }. 
222e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
222f0 72 65 73 65 74 28 70 46 69 72 73 74 42 6c 6f 63  reset(pFirstBloc
22300 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  k);.  }.  if( rc
22310 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
22320 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 49  turn rc;..  /* I
22330 6e 73 65 72 74 20 74 68 65 20 6d 61 72 6b 65 72  nsert the marker
22340 20 69 6e 20 74 68 65 20 25 5f 73 65 67 6d 65 6e   in the %_segmen
22350 74 73 20 74 61 62 6c 65 20 74 6f 20 6d 61 6b 65  ts table to make
22360 20 73 75 72 65 20 6e 6f 62 6f 64 79 20 74 72 69   sure nobody tri
22370 65 73 0a 20 20 2a 2a 20 74 6f 20 73 74 65 61 6c  es.  ** to steal
22380 20 74 68 65 20 73 70 61 63 65 20 6a 75 73 74 20   the space just 
22390 61 6c 6c 6f 63 61 74 65 64 2e 20 54 68 69 73 20  allocated. This 
223a0 69 73 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20  is also used to 
223b0 69 64 65 6e 74 69 66 79 20 0a 20 20 2a 2a 20 61  identify .  ** a
223c0 70 70 65 6e 64 61 62 6c 65 20 73 65 67 6d 65 6e  ppendable segmen
223d0 74 73 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66  ts.  */.  rc = f
223e0 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28  ts3WriteSegment(
223f0 70 2c 20 70 57 72 69 74 65 72 2d 3e 69 45 6e 64  p, pWriter->iEnd
22400 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
22410 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
22420 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 57 72  eturn rc;..  pWr
22430 69 74 65 72 2d 3e 69 41 62 73 4c 65 76 65 6c 20  iter->iAbsLevel 
22440 3d 20 69 41 62 73 4c 65 76 65 6c 3b 0a 20 20 70  = iAbsLevel;.  p
22450 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74  Writer->nLeafEst
22460 20 3d 20 6e 4c 65 61 66 45 73 74 3b 0a 20 20 70   = nLeafEst;.  p
22470 57 72 69 74 65 72 2d 3e 69 49 64 78 20 3d 20 69  Writer->iIdx = i
22480 49 64 78 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 75  Idx;..  /* Set u
22490 70 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 4e  p the array of N
224a0 6f 64 65 57 72 69 74 65 72 20 6f 62 6a 65 63 74  odeWriter object
224b0 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  s */.  for(i=0; 
224c0 69 3c 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44  i<FTS_MAX_APPEND
224d0 41 42 4c 45 5f 48 45 49 47 48 54 3b 20 69 2b 2b  ABLE_HEIGHT; i++
224e0 29 7b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  ){.    pWriter->
224f0 61 4e 6f 64 65 57 72 69 74 65 72 5b 69 5d 2e 69  aNodeWriter[i].i
22500 42 6c 6f 63 6b 20 3d 20 70 57 72 69 74 65 72 2d  Block = pWriter-
22510 3e 69 53 74 61 72 74 20 2b 20 69 2a 70 57 72 69  >iStart + i*pWri
22520 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74 3b 0a 20  ter->nLeafEst;. 
22530 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
22540 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
22550 52 65 6d 6f 76 65 20 61 6e 20 65 6e 74 72 79 20  Remove an entry 
22560 66 72 6f 6d 20 74 68 65 20 25 5f 73 65 67 64 69  from the %_segdi
22570 72 20 74 61 62 6c 65 2e 20 54 68 69 73 20 69 6e  r table. This in
22580 76 6f 6c 76 65 73 20 72 75 6e 6e 69 6e 67 20 74  volves running t
22590 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  he .** following
225a0 20 74 77 6f 20 73 74 61 74 65 6d 65 6e 74 73 3a   two statements:
225b0 0a 2a 2a 0a 2a 2a 20 20 20 44 45 4c 45 54 45 20  .**.**   DELETE 
225c0 46 52 4f 4d 20 25 5f 73 65 67 64 69 72 20 57 48  FROM %_segdir WH
225d0 45 52 45 20 6c 65 76 65 6c 20 3d 20 3a 69 41 62  ERE level = :iAb
225e0 73 4c 65 76 65 6c 20 41 4e 44 20 69 64 78 20 3d  sLevel AND idx =
225f0 20 3a 69 49 64 78 0a 2a 2a 20 20 20 55 50 44 41   :iIdx.**   UPDA
22600 54 45 20 25 5f 73 65 67 64 69 72 20 53 45 54 20  TE %_segdir SET 
22610 69 64 78 20 3d 20 69 64 78 20 2d 20 31 20 57 48  idx = idx - 1 WH
22620 45 52 45 20 6c 65 76 65 6c 20 3d 20 3a 69 41 62  ERE level = :iAb
22630 73 4c 65 76 65 6c 20 41 4e 44 20 69 64 78 20 3e  sLevel AND idx >
22640 20 3a 69 49 64 78 0a 2a 2a 0a 2a 2a 20 54 68 65   :iIdx.**.** The
22650 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
22660 74 20 72 65 6d 6f 76 65 73 20 74 68 65 20 73 70  t removes the sp
22670 65 63 69 66 69 63 20 25 5f 73 65 67 64 69 72 20  ecific %_segdir 
22680 6c 65 76 65 6c 2e 20 54 68 65 20 55 50 44 41 54  level. The UPDAT
22690 45 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  E .** statement 
226a0 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
226b0 20 72 65 6d 61 69 6e 69 6e 67 20 73 65 67 6d 65   remaining segme
226c0 6e 74 73 20 68 61 76 65 20 63 6f 6e 74 69 67 75  nts have contigu
226d0 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 0a  ously allocated.
226e0 2a 2a 20 69 64 78 20 76 61 6c 75 65 73 2e 0a 2a  ** idx values..*
226f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
22700 33 52 65 6d 6f 76 65 53 65 67 64 69 72 45 6e 74  3RemoveSegdirEnt
22710 72 79 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  ry(.  Fts3Table 
22720 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
22730 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61        /* FTS3 ta
22740 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
22750 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 41  sqlite3_int64 iA
22760 62 73 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20  bsLevel,        
22770 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65 76 65  /* Absolute leve
22780 6c 20 74 6f 20 64 65 6c 65 74 65 20 66 72 6f 6d  l to delete from
22790 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 20   */.  int iIdx  
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227b0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
227c0 66 20 25 5f 73 65 67 64 69 72 20 65 6e 74 72 79  f %_segdir entry
227d0 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 29 7b   to delete */.){
227e0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
227f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22800 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
22810 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
22820 74 6d 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30  tmt *pDelete = 0
22830 3b 20 20 20 20 20 20 2f 2a 20 44 45 4c 45 54 45  ;      /* DELETE
22840 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20   statement */.. 
22850 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
22860 74 28 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f  t(p, SQL_DELETE_
22870 53 45 47 44 49 52 5f 45 4e 54 52 59 2c 20 26 70  SEGDIR_ENTRY, &p
22880 44 65 6c 65 74 65 2c 20 30 29 3b 0a 20 20 69 66  Delete, 0);.  if
22890 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
228a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
228b0 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c 65 74  ind_int64(pDelet
228c0 65 2c 20 31 2c 20 69 41 62 73 4c 65 76 65 6c 29  e, 1, iAbsLevel)
228d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
228e0 6e 64 5f 69 6e 74 28 70 44 65 6c 65 74 65 2c 20  nd_int(pDelete, 
228f0 32 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 73 71  2, iIdx);.    sq
22900 6c 69 74 65 33 5f 73 74 65 70 28 70 44 65 6c 65  lite3_step(pDele
22910 74 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  te);.    rc = sq
22920 6c 69 74 65 33 5f 72 65 73 65 74 28 70 44 65 6c  lite3_reset(pDel
22930 65 74 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ete);.  }..  ret
22940 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22950 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67   One or more seg
22960 6d 65 6e 74 73 20 68 61 76 65 20 6a 75 73 74 20  ments have just 
22970 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f  been removed fro
22980 6d 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c  m absolute level
22990 20 69 41 62 73 4c 65 76 65 6c 2e 0a 2a 2a 20 55   iAbsLevel..** U
229a0 70 64 61 74 65 20 74 68 65 20 27 69 64 78 27 20  pdate the 'idx' 
229b0 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 72 65  values of the re
229c0 6d 61 69 6e 69 6e 67 20 73 65 67 6d 65 6e 74 73  maining segments
229d0 20 69 6e 20 74 68 65 20 6c 65 76 65 6c 20 73 6f   in the level so
229e0 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 69 64 78   that.** the idx
229f0 20 76 61 6c 75 65 73 20 61 72 65 20 61 20 63 6f   values are a co
22a00 6e 74 69 67 75 6f 75 73 20 73 65 71 75 65 6e 63  ntiguous sequenc
22a10 65 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20  e starting from 
22a20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
22a30 20 66 74 73 33 52 65 70 61 63 6b 53 65 67 64 69   fts3RepackSegdi
22a40 72 4c 65 76 65 6c 28 0a 20 20 46 74 73 33 54 61  rLevel(.  Fts3Ta
22a50 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
22a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
22a70 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  3 table handle *
22a80 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
22a90 34 20 69 41 62 73 4c 65 76 65 6c 20 20 20 20 20  4 iAbsLevel     
22aa0 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20      /* Absolute 
22ab0 6c 65 76 65 6c 20 74 6f 20 72 65 70 61 63 6b 20  level to repack 
22ac0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
22ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ae0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
22af0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
22b00 2a 61 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20  *aIdx = 0;      
22b10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
22b20 72 72 61 79 20 6f 66 20 72 65 6d 61 69 6e 69 6e  rray of remainin
22b30 67 20 69 64 78 20 76 61 6c 75 65 73 20 2a 2f 0a  g idx values */.
22b40 20 20 69 6e 74 20 6e 49 64 78 20 3d 20 30 3b 20    int nIdx = 0; 
22b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b60 20 20 2f 2a 20 56 61 6c 69 64 20 65 6e 74 72 69    /* Valid entri
22b70 65 73 20 69 6e 20 61 49 64 78 5b 5d 20 2a 2f 0a  es in aIdx[] */.
22b80 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30    int nAlloc = 0
22b90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22ba0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
22bb0 69 7a 65 20 6f 66 20 61 49 64 78 5b 5d 20 2a 2f  ize of aIdx[] */
22bc0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 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 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
22bf0 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  ariable */.  sql
22c00 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65  ite3_stmt *pSele
22c10 63 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  ct = 0;      /* 
22c20 53 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  Select statement
22c30 20 74 6f 20 72 65 61 64 20 69 64 78 20 76 61 6c   to read idx val
22c40 75 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ues */.  sqlite3
22c50 5f 73 74 6d 74 20 2a 70 55 70 64 61 74 65 20 3d  _stmt *pUpdate =
22c60 20 30 3b 20 20 20 20 20 20 2f 2a 20 55 70 64 61   0;      /* Upda
22c70 74 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  te statement to 
22c80 6d 6f 64 69 66 79 20 69 64 78 20 76 61 6c 75 65  modify idx value
22c90 73 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73  s */..  rc = fts
22ca0 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
22cb0 53 45 4c 45 43 54 5f 49 4e 44 45 58 45 53 2c 20  SELECT_INDEXES, 
22cc0 26 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  &pSelect, 0);.  
22cd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22ce0 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  K ){.    int rc2
22cf0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
22d00 6e 64 5f 69 6e 74 36 34 28 70 53 65 6c 65 63 74  nd_int64(pSelect
22d10 2c 20 31 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b  , 1, iAbsLevel);
22d20 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49  .    while( SQLI
22d30 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
22d40 73 74 65 70 28 70 53 65 6c 65 63 74 29 20 29 7b  step(pSelect) ){
22d50 0a 20 20 20 20 20 20 69 66 28 20 6e 49 64 78 3e  .      if( nIdx>
22d60 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  =nAlloc ){.     
22d70 20 20 20 69 6e 74 20 2a 61 4e 65 77 3b 0a 20 20     int *aNew;.  
22d80 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 2b 3d 20        nAlloc += 
22d90 31 36 3b 0a 20 20 20 20 20 20 20 20 61 4e 65 77  16;.        aNew
22da0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
22db0 6f 63 28 61 49 64 78 2c 20 6e 41 6c 6c 6f 63 2a  oc(aIdx, nAlloc*
22dc0 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20  sizeof(int));.  
22dd0 20 20 20 20 20 20 69 66 28 20 21 61 4e 65 77 20        if( !aNew 
22de0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
22df0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
22e00 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
22e10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22e20 20 20 20 61 49 64 78 20 3d 20 61 4e 65 77 3b 0a     aIdx = aNew;.
22e30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 49        }.      aI
22e40 64 78 5b 6e 49 64 78 2b 2b 5d 20 3d 20 73 71 6c  dx[nIdx++] = sql
22e50 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
22e60 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
22e70 20 7d 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c   }.    rc2 = sql
22e80 69 74 65 33 5f 72 65 73 65 74 28 70 53 65 6c 65  ite3_reset(pSele
22e90 63 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ct);.    if( rc=
22ea0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
22eb0 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 69 66  = rc2;.  }..  if
22ec0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22ed0 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  ){.    rc = fts3
22ee0 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53  SqlStmt(p, SQL_S
22ef0 48 49 46 54 5f 53 45 47 44 49 52 5f 45 4e 54 52  HIFT_SEGDIR_ENTR
22f00 59 2c 20 26 70 55 70 64 61 74 65 2c 20 30 29 3b  Y, &pUpdate, 0);
22f10 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
22f20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22f30 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
22f40 36 34 28 70 55 70 64 61 74 65 2c 20 32 2c 20 69  64(pUpdate, 2, i
22f50 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 0a  AbsLevel);.  }..
22f60 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 67    assert( p->bIg
22f70 6e 6f 72 65 53 61 76 65 70 6f 69 6e 74 3d 3d 30  noreSavepoint==0
22f80 20 29 3b 0a 20 20 70 2d 3e 62 49 67 6e 6f 72 65   );.  p->bIgnore
22f90 53 61 76 65 70 6f 69 6e 74 20 3d 20 31 3b 0a 20  Savepoint = 1;. 
22fa0 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
22fb0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 49 64  LITE_OK && i<nId
22fc0 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  x; i++){.    if(
22fd0 20 61 49 64 78 5b 69 5d 21 3d 69 20 29 7b 0a 20   aIdx[i]!=i ){. 
22fe0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
22ff0 64 5f 69 6e 74 28 70 55 70 64 61 74 65 2c 20 33  d_int(pUpdate, 3
23000 2c 20 61 49 64 78 5b 69 5d 29 3b 0a 20 20 20 20  , aIdx[i]);.    
23010 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
23020 6e 74 28 70 55 70 64 61 74 65 2c 20 31 2c 20 69  nt(pUpdate, 1, i
23030 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23040 5f 73 74 65 70 28 70 55 70 64 61 74 65 29 3b 0a  _step(pUpdate);.
23050 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
23060 65 33 5f 72 65 73 65 74 28 70 55 70 64 61 74 65  e3_reset(pUpdate
23070 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
23080 2d 3e 62 49 67 6e 6f 72 65 53 61 76 65 70 6f 69  ->bIgnoreSavepoi
23090 6e 74 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74  nt = 0;..  sqlit
230a0 65 33 5f 66 72 65 65 28 61 49 64 78 29 3b 0a 20  e3_free(aIdx);. 
230b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
230c0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 53  tatic void fts3S
230d0 74 61 72 74 4e 6f 64 65 28 42 6c 6f 62 20 2a 70  tartNode(Blob *p
230e0 4e 6f 64 65 2c 20 69 6e 74 20 69 48 65 69 67 68  Node, int iHeigh
230f0 74 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  t, sqlite3_int64
23100 20 69 43 68 69 6c 64 29 7b 0a 20 20 70 4e 6f 64   iChild){.  pNod
23110 65 2d 3e 61 5b 30 5d 20 3d 20 28 63 68 61 72 29  e->a[0] = (char)
23120 69 48 65 69 67 68 74 3b 0a 20 20 69 66 28 20 69  iHeight;.  if( i
23130 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 61 73 73  Child ){.    ass
23140 65 72 74 28 20 70 4e 6f 64 65 2d 3e 6e 41 6c 6c  ert( pNode->nAll
23150 6f 63 3e 3d 31 2b 73 71 6c 69 74 65 33 46 74 73  oc>=1+sqlite3Fts
23160 33 56 61 72 69 6e 74 4c 65 6e 28 69 43 68 69 6c  3VarintLen(iChil
23170 64 29 20 29 3b 0a 20 20 20 20 70 4e 6f 64 65 2d  d) );.    pNode-
23180 3e 6e 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  >n = 1 + sqlite3
23190 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70  Fts3PutVarint(&p
231a0 4e 6f 64 65 2d 3e 61 5b 31 5d 2c 20 69 43 68 69  Node->a[1], iChi
231b0 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ld);.  }else{.  
231c0 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d    assert( pNode-
231d0 3e 6e 41 6c 6c 6f 63 3e 3d 31 20 29 3b 0a 20 20  >nAlloc>=1 );.  
231e0 20 20 70 4e 6f 64 65 2d 3e 6e 20 3d 20 31 3b 0a    pNode->n = 1;.
231f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    }.}../*.** The
23200 20 66 69 72 73 74 20 74 77 6f 20 61 72 67 75 6d   first two argum
23210 65 6e 74 73 20 61 72 65 20 61 20 70 6f 69 6e 74  ents are a point
23220 65 72 20 74 6f 20 61 6e 64 20 74 68 65 20 73 69  er to and the si
23230 7a 65 20 6f 66 20 61 20 73 65 67 6d 65 6e 74 20  ze of a segment 
23240 62 2d 74 72 65 65 0a 2a 2a 20 6e 6f 64 65 2e 20  b-tree.** node. 
23250 54 68 65 20 6e 6f 64 65 20 6d 61 79 20 62 65 20  The node may be 
23260 61 20 6c 65 61 66 20 6f 72 20 61 6e 20 69 6e 74  a leaf or an int
23270 65 72 6e 61 6c 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a  ernal node..**.*
23280 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
23290 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 6e 6f  creates a new no
232a0 64 65 20 69 6d 61 67 65 20 69 6e 20 62 6c 6f 62  de image in blob
232b0 20 6f 62 6a 65 63 74 20 2a 70 4e 65 77 20 62 79   object *pNew by
232c0 20 63 6f 70 79 69 6e 67 0a 2a 2a 20 61 6c 6c 20   copying.** all 
232d0 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20 67  terms that are g
232e0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
232f0 71 75 61 6c 20 74 6f 20 7a 54 65 72 6d 2f 6e 54  qual to zTerm/nT
23300 65 72 6d 20 28 66 6f 72 20 6c 65 61 66 20 6e 6f  erm (for leaf no
23310 64 65 73 29 0a 2a 2a 20 6f 72 20 67 72 65 61 74  des).** or great
23320 65 72 20 74 68 61 6e 20 7a 54 65 72 6d 2f 6e 54  er than zTerm/nT
23330 65 72 6d 20 28 66 6f 72 20 69 6e 74 65 72 6e 61  erm (for interna
23340 6c 20 6e 6f 64 65 73 29 20 66 72 6f 6d 20 61 4e  l nodes) from aN
23350 6f 64 65 2f 6e 4e 6f 64 65 2e 0a 2a 2f 0a 73 74  ode/nNode..*/.st
23360 61 74 69 63 20 69 6e 74 20 66 74 73 33 54 72 75  atic int fts3Tru
23370 6e 63 61 74 65 4e 6f 64 65 28 0a 20 20 63 6f 6e  ncateNode(.  con
23380 73 74 20 63 68 61 72 20 2a 61 4e 6f 64 65 2c 20  st char *aNode, 
23390 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
233a0 43 75 72 72 65 6e 74 20 6e 6f 64 65 20 69 6d 61  Current node ima
233b0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 6f 64  ge */.  int nNod
233c0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
233d0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
233e0 6f 66 20 61 4e 6f 64 65 20 69 6e 20 62 79 74 65  of aNode in byte
233f0 73 20 2a 2f 0a 20 20 42 6c 6f 62 20 2a 70 4e 65  s */.  Blob *pNe
23400 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
23410 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57         /* OUT: W
23420 72 69 74 65 20 6e 65 77 20 6e 6f 64 65 20 69 6d  rite new node im
23430 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  age here */.  co
23440 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c  nst char *zTerm,
23450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23460 20 4f 6d 69 74 20 61 6c 6c 20 74 65 72 6d 73 20   Omit all terms 
23470 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69  smaller than thi
23480 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  s */.  int nTerm
23490 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
234a0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
234b0 66 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73  f zTerm in bytes
234c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
234d0 74 36 34 20 2a 70 69 42 6c 6f 63 6b 20 20 20 20  t64 *piBlock    
234e0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42 6c        /* OUT: Bl
234f0 6f 63 6b 20 6e 75 6d 62 65 72 20 69 6e 20 6e 65  ock number in ne
23500 78 74 20 6c 61 79 65 72 20 64 6f 77 6e 20 2a 2f  xt layer down */
23510 0a 29 7b 0a 20 20 4e 6f 64 65 52 65 61 64 65 72  .){.  NodeReader
23520 20 72 65 61 64 65 72 3b 20 20 20 20 20 20 20 20   reader;        
23530 20 20 20 20 20 20 2f 2a 20 52 65 61 64 65 72 20        /* Reader 
23540 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 42 6c 6f 62  object */.  Blob
23550 20 70 72 65 76 20 3d 20 7b 30 2c 20 30 2c 20 30   prev = {0, 0, 0
23560 7d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  };          /* P
23570 72 65 76 69 6f 75 73 20 74 65 72 6d 20 77 72 69  revious term wri
23580 74 74 65 6e 20 74 6f 20 6e 65 77 20 6e 6f 64 65  tten to new node
23590 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
235a0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
235b0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
235c0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 62 4c  code */.  int bL
235d0 65 61 66 20 3d 20 61 4e 6f 64 65 5b 30 5d 3d 3d  eaf = aNode[0]==
235e0 27 5c 30 27 3b 20 20 20 20 20 2f 2a 20 54 72 75  '\0';     /* Tru
235f0 65 20 66 6f 72 20 61 20 6c 65 61 66 20 6e 6f 64  e for a leaf nod
23600 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  e */..  /* Alloc
23610 61 74 65 20 72 65 71 75 69 72 65 64 20 6f 75 74  ate required out
23620 70 75 74 20 73 70 61 63 65 20 2a 2f 0a 20 20 62  put space */.  b
23630 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28 70 4e  lobGrowBuffer(pN
23640 65 77 2c 20 6e 4e 6f 64 65 2c 20 26 72 63 29 3b  ew, nNode, &rc);
23650 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
23660 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
23670 3b 0a 20 20 70 4e 65 77 2d 3e 6e 20 3d 20 30 3b  ;.  pNew->n = 0;
23680 0a 0a 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20  ..  /* Populate 
23690 6e 65 77 20 6e 6f 64 65 20 62 75 66 66 65 72 20  new node buffer 
236a0 2a 2f 0a 20 20 66 6f 72 28 72 63 20 3d 20 6e 6f  */.  for(rc = no
236b0 64 65 52 65 61 64 65 72 49 6e 69 74 28 26 72 65  deReaderInit(&re
236c0 61 64 65 72 2c 20 61 4e 6f 64 65 2c 20 6e 4e 6f  ader, aNode, nNo
236d0 64 65 29 3b 20 0a 20 20 20 20 20 20 72 63 3d 3d  de); .      rc==
236e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 61  SQLITE_OK && rea
236f0 64 65 72 2e 61 4e 6f 64 65 3b 20 0a 20 20 20 20  der.aNode; .    
23700 20 20 72 63 20 3d 20 6e 6f 64 65 52 65 61 64 65    rc = nodeReade
23710 72 4e 65 78 74 28 26 72 65 61 64 65 72 29 0a 20  rNext(&reader). 
23720 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4e 65 77   ){.    if( pNew
23730 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->n==0 ){.      
23740 69 6e 74 20 72 65 73 20 3d 20 66 74 73 33 54 65  int res = fts3Te
23750 72 6d 43 6d 70 28 72 65 61 64 65 72 2e 74 65 72  rmCmp(reader.ter
23760 6d 2e 61 2c 20 72 65 61 64 65 72 2e 74 65 72 6d  m.a, reader.term
23770 2e 6e 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  .n, zTerm, nTerm
23780 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73  );.      if( res
23790 3c 30 20 7c 7c 20 28 62 4c 65 61 66 3d 3d 30 20  <0 || (bLeaf==0 
237a0 26 26 20 72 65 73 3d 3d 30 29 20 29 20 63 6f 6e  && res==0) ) con
237b0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 74 73  tinue;.      fts
237c0 33 53 74 61 72 74 4e 6f 64 65 28 70 4e 65 77 2c  3StartNode(pNew,
237d0 20 28 69 6e 74 29 61 4e 6f 64 65 5b 30 5d 2c 20   (int)aNode[0], 
237e0 72 65 61 64 65 72 2e 69 43 68 69 6c 64 29 3b 0a  reader.iChild);.
237f0 20 20 20 20 20 20 2a 70 69 42 6c 6f 63 6b 20 3d        *piBlock =
23800 20 72 65 61 64 65 72 2e 69 43 68 69 6c 64 3b 0a   reader.iChild;.
23810 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 66      }.    rc = f
23820 74 73 33 41 70 70 65 6e 64 54 6f 4e 6f 64 65 28  ts3AppendToNode(
23830 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2c 20 26  .        pNew, &
23840 70 72 65 76 2c 20 72 65 61 64 65 72 2e 74 65 72  prev, reader.ter
23850 6d 2e 61 2c 20 72 65 61 64 65 72 2e 74 65 72 6d  m.a, reader.term
23860 2e 6e 2c 0a 20 20 20 20 20 20 20 20 72 65 61 64  .n,.        read
23870 65 72 2e 61 44 6f 63 6c 69 73 74 2c 20 72 65 61  er.aDoclist, rea
23880 64 65 72 2e 6e 44 6f 63 6c 69 73 74 0a 20 20 20  der.nDoclist.   
23890 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
238a0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61  SQLITE_OK ) brea
238b0 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65  k;.  }.  if( pNe
238c0 77 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66  w->n==0 ){.    f
238d0 74 73 33 53 74 61 72 74 4e 6f 64 65 28 70 4e 65  ts3StartNode(pNe
238e0 77 2c 20 28 69 6e 74 29 61 4e 6f 64 65 5b 30 5d  w, (int)aNode[0]
238f0 2c 20 72 65 61 64 65 72 2e 69 43 68 69 6c 64 29  , reader.iChild)
23900 3b 0a 20 20 20 20 2a 70 69 42 6c 6f 63 6b 20 3d  ;.    *piBlock =
23910 20 72 65 61 64 65 72 2e 69 43 68 69 6c 64 3b 0a   reader.iChild;.
23920 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e    }.  assert( pN
23930 65 77 2d 3e 6e 3c 3d 70 4e 65 77 2d 3e 6e 41 6c  ew->n<=pNew->nAl
23940 6c 6f 63 20 29 3b 0a 0a 20 20 6e 6f 64 65 52 65  loc );..  nodeRe
23950 61 64 65 72 52 65 6c 65 61 73 65 28 26 72 65 61  aderRelease(&rea
23960 64 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  der);.  sqlite3_
23970 66 72 65 65 28 70 72 65 76 2e 61 29 3b 0a 20 20  free(prev.a);.  
23980 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23990 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 74  .** Remove all t
239a0 65 72 6d 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  erms smaller tha
239b0 6e 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 20 66 72  n zTerm/nTerm fr
239c0 6f 6d 20 73 65 67 6d 65 6e 74 20 69 49 64 78 20  om segment iIdx 
239d0 69 6e 20 61 62 73 6f 6c 75 74 65 20 0a 2a 2a 20  in absolute .** 
239e0 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c 2e  level iAbsLevel.
239f0 20 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76   This may involv
23a00 65 20 64 65 6c 65 74 69 6e 67 20 65 6e 74 72 69  e deleting entri
23a10 65 73 20 66 72 6f 6d 20 74 68 65 20 25 5f 73 65  es from the %_se
23a20 67 6d 65 6e 74 73 0a 2a 2a 20 74 61 62 6c 65 2c  gments.** table,
23a30 20 61 6e 64 20 6d 6f 64 69 66 79 69 6e 67 20 65   and modifying e
23a40 78 69 73 74 69 6e 67 20 65 6e 74 72 69 65 73 20  xisting entries 
23a50 69 6e 20 62 6f 74 68 20 74 68 65 20 25 5f 73 65  in both the %_se
23a60 67 6d 65 6e 74 73 20 61 6e 64 20 25 5f 73 65 67  gments and %_seg
23a70 64 69 72 0a 2a 2a 20 74 61 62 6c 65 73 2e 0a 2a  dir.** tables..*
23a80 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
23a90 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
23aa0 65 20 73 65 67 6d 65 6e 74 20 69 73 20 75 70 64  e segment is upd
23ab0 61 74 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ated successfull
23ac0 79 2e 20 4f 72 20 61 6e 0a 2a 2a 20 53 51 4c 69  y. Or an.** SQLi
23ad0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  te error code ot
23ae0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
23af0 69 63 20 69 6e 74 20 66 74 73 33 54 72 75 6e 63  ic int fts3Trunc
23b00 61 74 65 53 65 67 6d 65 6e 74 28 0a 20 20 46 74  ateSegment(.  Ft
23b10 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
23b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23b30 20 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64   FTS3 table hand
23b40 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
23b50 69 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c 2c  int64 iAbsLevel,
23b60 20 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c          /* Absol
23b70 75 74 65 20 6c 65 76 65 6c 20 6f 66 20 73 65 67  ute level of seg
23b80 6d 65 6e 74 20 74 6f 20 6d 6f 64 69 66 79 20 2a  ment to modify *
23b90 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20  /.  int iIdx,   
23ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bb0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 77 69 74      /* Index wit
23bc0 68 69 6e 20 6c 65 76 65 6c 20 6f 66 20 73 65 67  hin level of seg
23bd0 6d 65 6e 74 20 74 6f 20 6d 6f 64 69 66 79 20 2a  ment to modify *
23be0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
23bf0 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  zTerm,          
23c00 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 65      /* Remove te
23c10 72 6d 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  rms smaller than
23c20 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e   this */.  int n
23c30 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
23c40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
23c50 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
23c60 62 75 66 66 65 72 20 7a 54 65 72 6d 20 2a 2f 0a  buffer zTerm */.
23c70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
23c80 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
23c90 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
23ca0 6f 64 65 20 2a 2f 0a 20 20 42 6c 6f 62 20 72 6f  ode */.  Blob ro
23cb0 6f 74 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20  ot = {0,0,0};   
23cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
23cd0 72 6f 6f 74 20 70 61 67 65 20 69 6d 61 67 65 20  root page image 
23ce0 2a 2f 0a 20 20 42 6c 6f 62 20 62 6c 6f 63 6b 20  */.  Blob block 
23cf0 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 20 20 20  = {0,0,0};      
23d00 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75       /* Buffer u
23d10 73 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65  sed for any othe
23d20 72 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 73 71 6c  r block */.  sql
23d30 69 74 65 33 5f 69 6e 74 36 34 20 69 42 6c 6f 63  ite3_int64 iBloc
23d40 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  k = 0;       /* 
23d50 42 6c 6f 63 6b 20 69 64 20 2a 2f 0a 20 20 73 71  Block id */.  sq
23d60 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4e 65 77  lite3_int64 iNew
23d70 53 74 61 72 74 20 3d 20 30 3b 20 20 20 20 2f 2a  Start = 0;    /*
23d80 20 4e 65 77 20 76 61 6c 75 65 20 66 6f 72 20 69   New value for i
23d90 53 74 61 72 74 42 6c 6f 63 6b 20 2a 2f 0a 20 20  StartBlock */.  
23da0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f  sqlite3_int64 iO
23db0 6c 64 53 74 61 72 74 20 3d 20 30 3b 20 20 20 20  ldStart = 0;    
23dc0 2f 2a 20 4f 6c 64 20 76 61 6c 75 65 20 66 6f 72  /* Old value for
23dd0 20 69 53 74 61 72 74 42 6c 6f 63 6b 20 2a 2f 0a   iStartBlock */.
23de0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
23df0 70 46 65 74 63 68 20 3d 20 30 3b 20 20 20 20 20  pFetch = 0;     
23e00 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75    /* Statement u
23e10 73 65 64 20 74 6f 20 66 65 74 63 68 20 73 65 67  sed to fetch seg
23e20 64 69 72 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66  dir */..  rc = f
23e30 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51  ts3SqlStmt(p, SQ
23e40 4c 5f 53 45 4c 45 43 54 5f 53 45 47 44 49 52 2c  L_SELECT_SEGDIR,
23e50 20 26 70 46 65 74 63 68 2c 20 30 29 3b 0a 20 20   &pFetch, 0);.  
23e60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23e70 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  K ){.    int rc2
23e80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23e90 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
23ea0 33 5f 72 65 73 65 74 28 29 20 72 65 74 75 72 6e  3_reset() return
23eb0 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 73 71 6c   code */.    sql
23ec0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
23ed0 70 46 65 74 63 68 2c 20 31 2c 20 69 41 62 73 4c  pFetch, 1, iAbsL
23ee0 65 76 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  evel);.    sqlit
23ef0 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 46 65 74  e3_bind_int(pFet
23f00 63 68 2c 20 32 2c 20 69 49 64 78 29 3b 0a 20 20  ch, 2, iIdx);.  
23f10 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
23f20 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
23f30 46 65 74 63 68 29 20 29 7b 0a 20 20 20 20 20 20  Fetch) ){.      
23f40 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 52 6f 6f  const char *aRoo
23f50 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  t = sqlite3_colu
23f60 6d 6e 5f 62 6c 6f 62 28 70 46 65 74 63 68 2c 20  mn_blob(pFetch, 
23f70 34 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 52  4);.      int nR
23f80 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  oot = sqlite3_co
23f90 6c 75 6d 6e 5f 62 79 74 65 73 28 70 46 65 74 63  lumn_bytes(pFetc
23fa0 68 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 4f 6c  h, 4);.      iOl
23fb0 64 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  dStart = sqlite3
23fc0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 46  _column_int64(pF
23fd0 65 74 63 68 2c 20 31 29 3b 0a 20 20 20 20 20 20  etch, 1);.      
23fe0 72 63 20 3d 20 66 74 73 33 54 72 75 6e 63 61 74  rc = fts3Truncat
23ff0 65 4e 6f 64 65 28 61 52 6f 6f 74 2c 20 6e 52 6f  eNode(aRoot, nRo
24000 6f 74 2c 20 26 72 6f 6f 74 2c 20 7a 54 65 72 6d  ot, &root, zTerm
24010 2c 20 6e 54 65 72 6d 2c 20 26 69 42 6c 6f 63 6b  , nTerm, &iBlock
24020 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 32  );.    }.    rc2
24030 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
24040 28 70 46 65 74 63 68 29 3b 0a 20 20 20 20 69 66  (pFetch);.    if
24050 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24060 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a  ) rc = rc2;.  }.
24070 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
24080 4c 49 54 45 5f 4f 4b 20 26 26 20 69 42 6c 6f 63  LITE_OK && iBloc
24090 6b 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 61  k ){.    char *a
240a0 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 69  Block = 0;.    i
240b0 6e 74 20 6e 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20  nt nBlock = 0;. 
240c0 20 20 20 69 4e 65 77 53 74 61 72 74 20 3d 20 69     iNewStart = i
240d0 42 6c 6f 63 6b 3b 0a 0a 20 20 20 20 72 63 20 3d  Block;..    rc =
240e0 20 73 71 6c 69 74 65 33 46 74 73 33 52 65 61 64   sqlite3Fts3Read
240f0 42 6c 6f 63 6b 28 70 2c 20 69 42 6c 6f 63 6b 2c  Block(p, iBlock,
24100 20 26 61 42 6c 6f 63 6b 2c 20 26 6e 42 6c 6f 63   &aBlock, &nBloc
24110 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  k, 0);.    if( r
24120 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
24130 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 54        rc = fts3T
24140 72 75 6e 63 61 74 65 4e 6f 64 65 28 61 42 6c 6f  runcateNode(aBlo
24150 63 6b 2c 20 6e 42 6c 6f 63 6b 2c 20 26 62 6c 6f  ck, nBlock, &blo
24160 63 6b 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  ck, zTerm, nTerm
24170 2c 20 26 69 42 6c 6f 63 6b 29 3b 0a 20 20 20 20  , &iBlock);.    
24180 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
24190 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
241a0 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65 53   rc = fts3WriteS
241b0 65 67 6d 65 6e 74 28 70 2c 20 69 4e 65 77 53 74  egment(p, iNewSt
241c0 61 72 74 2c 20 62 6c 6f 63 6b 2e 61 2c 20 62 6c  art, block.a, bl
241d0 6f 63 6b 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  ock.n);.    }.  
241e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
241f0 42 6c 6f 63 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Block);.  }..  /
24200 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65 77 53  * Variable iNewS
24210 74 61 72 74 20 6e 6f 77 20 63 6f 6e 74 61 69 6e  tart now contain
24220 73 20 74 68 65 20 66 69 72 73 74 20 76 61 6c 69  s the first vali
24230 64 20 6c 65 61 66 20 6e 6f 64 65 2e 20 2a 2f 0a  d leaf node. */.
24240 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24250 5f 4f 4b 20 26 26 20 69 4e 65 77 53 74 61 72 74  _OK && iNewStart
24260 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
24270 73 74 6d 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a  stmt *pDel = 0;.
24280 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c      rc = fts3Sql
24290 53 74 6d 74 28 70 2c 20 53 51 4c 5f 44 45 4c 45  Stmt(p, SQL_DELE
242a0 54 45 5f 53 45 47 4d 45 4e 54 53 5f 52 41 4e 47  TE_SEGMENTS_RANG
242b0 45 2c 20 26 70 44 65 6c 2c 20 30 29 3b 0a 20 20  E, &pDel, 0);.  
242c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
242d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
242e0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
242f0 70 44 65 6c 2c 20 31 2c 20 69 4f 6c 64 53 74 61  pDel, 1, iOldSta
24300 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rt);.      sqlit
24310 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 44  e3_bind_int64(pD
24320 65 6c 2c 20 32 2c 20 69 4e 65 77 53 74 61 72 74  el, 2, iNewStart
24330 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  -1);.      sqlit
24340 65 33 5f 73 74 65 70 28 70 44 65 6c 29 3b 0a 20  e3_step(pDel);. 
24350 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
24360 33 5f 72 65 73 65 74 28 70 44 65 6c 29 3b 0a 20  3_reset(pDel);. 
24370 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
24380 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24390 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
243a0 74 20 2a 70 43 68 6f 6d 70 20 3d 20 30 3b 0a 20  t *pChomp = 0;. 
243b0 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53     rc = fts3SqlS
243c0 74 6d 74 28 70 2c 20 53 51 4c 5f 43 48 4f 4d 50  tmt(p, SQL_CHOMP
243d0 5f 53 45 47 44 49 52 2c 20 26 70 43 68 6f 6d 70  _SEGDIR, &pChomp
243e0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
243f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24400 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
24410 64 5f 69 6e 74 36 34 28 70 43 68 6f 6d 70 2c 20  d_int64(pChomp, 
24420 31 2c 20 69 4e 65 77 53 74 61 72 74 29 3b 0a 20  1, iNewStart);. 
24430 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
24440 64 5f 62 6c 6f 62 28 70 43 68 6f 6d 70 2c 20 32  d_blob(pChomp, 2
24450 2c 20 72 6f 6f 74 2e 61 2c 20 72 6f 6f 74 2e 6e  , root.a, root.n
24460 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
24470 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
24480 62 69 6e 64 5f 69 6e 74 36 34 28 70 43 68 6f 6d  bind_int64(pChom
24490 70 2c 20 33 2c 20 69 41 62 73 4c 65 76 65 6c 29  p, 3, iAbsLevel)
244a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
244b0 62 69 6e 64 5f 69 6e 74 28 70 43 68 6f 6d 70 2c  bind_int(pChomp,
244c0 20 34 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 20   4, iIdx);.     
244d0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43   sqlite3_step(pC
244e0 68 6f 6d 70 29 3b 0a 20 20 20 20 20 20 72 63 20  homp);.      rc 
244f0 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
24500 70 43 68 6f 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  pChomp);.    }. 
24510 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   }..  sqlite3_fr
24520 65 65 28 72 6f 6f 74 2e 61 29 3b 0a 20 20 73 71  ee(root.a);.  sq
24530 6c 69 74 65 33 5f 66 72 65 65 28 62 6c 6f 63 6b  lite3_free(block
24540 2e 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  .a);.  return rc
24550 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
24560 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
24570 65 64 20 61 66 74 65 72 20 61 6e 20 69 6e 63 72  ed after an incr
24580 6d 65 6e 74 61 6c 2d 6d 65 72 67 65 20 6f 70 65  mental-merge ope
24590 72 61 74 69 6f 6e 20 68 61 73 20 72 75 6e 20 74  ration has run t
245a0 6f 0a 2a 2a 20 6d 65 72 67 65 20 28 6f 72 20 70  o.** merge (or p
245b0 61 72 74 69 61 6c 6c 79 20 6d 65 72 67 65 29 20  artially merge) 
245c0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d  two or more segm
245d0 65 6e 74 73 20 66 72 6f 6d 20 61 62 73 6f 6c 75  ents from absolu
245e0 74 65 20 6c 65 76 65 6c 0a 2a 2a 20 69 41 62 73  te level.** iAbs
245f0 4c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 45 61 63  Level..**.** Eac
24600 68 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 20  h input segment 
24610 69 73 20 65 69 74 68 65 72 20 72 65 6d 6f 76 65  is either remove
24620 64 20 66 72 6f 6d 20 74 68 65 20 64 62 20 63 6f  d from the db co
24630 6d 70 6c 65 74 65 6c 79 20 28 69 66 20 61 6c 6c  mpletely (if all
24640 20 6f 66 0a 2a 2a 20 69 74 73 20 64 61 74 61 20   of.** its data 
24650 77 61 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68  was copied to th
24660 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  e output segment
24670 20 62 79 20 74 68 65 20 69 6e 63 72 6d 65 72 67   by the incrmerg
24680 65 20 6f 70 65 72 61 74 69 6f 6e 29 0a 2a 2a 20  e operation).** 
24690 6f 72 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 70  or modified in p
246a0 6c 61 63 65 20 73 6f 20 74 68 61 74 20 69 74 20  lace so that it 
246b0 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f 6e 74 61 69  no longer contai
246c0 6e 73 20 74 68 6f 73 65 20 65 6e 74 72 69 65 73  ns those entries
246d0 20 74 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65   that.** have be
246e0 65 6e 20 64 75 70 6c 69 63 61 74 65 64 20 69 6e  en duplicated in
246f0 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d   the output segm
24700 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
24710 6e 74 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65  nt fts3Incrmerge
24720 43 68 6f 6d 70 28 0a 20 20 46 74 73 33 54 61 62  Chomp(.  Fts3Tab
24730 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
24740 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20           /* FTS 
24750 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
24760 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
24770 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 20 20  iAbsLevel,      
24780 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65    /* Absolute le
24790 76 65 6c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73  vel containing s
247a0 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73  egments */.  Fts
247b0 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20  3MultiSegReader 
247c0 2a 70 43 73 72 2c 20 20 20 20 20 20 20 2f 2a 20  *pCsr,       /* 
247d0 43 68 6f 6d 70 20 61 6c 6c 20 73 65 67 6d 65 6e  Chomp all segmen
247e0 74 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69  ts opened by thi
247f0 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e  s cursor */.  in
24800 74 20 2a 70 6e 52 65 6d 20 20 20 20 20 20 20 20  t *pnRem        
24810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24820 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   Number of segme
24830 6e 74 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 20  nts not deleted 
24840 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
24850 20 69 6e 74 20 6e 52 65 6d 20 3d 20 30 3b 0a 20   int nRem = 0;. 
24860 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24870 5f 4f 4b 3b 0a 0a 20 20 66 6f 72 28 69 3d 70 43  _OK;..  for(i=pC
24880 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 2d 31 3b 20  sr->nSegment-1; 
24890 69 3e 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49  i>=0 && rc==SQLI
248a0 54 45 5f 4f 4b 3b 20 69 2d 2d 29 7b 0a 20 20 20  TE_OK; i--){.   
248b0 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
248c0 70 53 65 67 20 3d 20 30 3b 0a 20 20 20 20 69 6e  pSeg = 0;.    in
248d0 74 20 6a 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  t j;..    /* Fin
248e0 64 20 74 68 65 20 46 74 73 33 53 65 67 52 65 61  d the Fts3SegRea
248f0 64 65 72 20 6f 62 6a 65 63 74 20 77 69 74 68 20  der object with 
24900 46 74 73 33 53 65 67 52 65 61 64 65 72 2e 69 49  Fts3SegReader.iI
24910 64 78 3d 3d 69 2e 20 49 74 20 69 73 20 68 69 64  dx==i. It is hid
24920 69 6e 67 0a 20 20 20 20 2a 2a 20 73 6f 6d 65 77  ing.    ** somew
24930 68 65 72 65 20 69 6e 20 74 68 65 20 70 43 73 72  here in the pCsr
24940 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 5d 20 61 72  ->apSegment[] ar
24950 72 61 79 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ray.  */.    for
24960 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70  (j=0; ALWAYS(j<p
24970 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 29 3b 20  Csr->nSegment); 
24980 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 65 67  j++){.      pSeg
24990 20 3d 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65   = pCsr->apSegme
249a0 6e 74 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28  nt[j];.      if(
249b0 20 70 53 65 67 2d 3e 69 49 64 78 3d 3d 69 20 29   pSeg->iIdx==i )
249c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
249d0 20 20 61 73 73 65 72 74 28 20 6a 3c 70 43 73 72    assert( j<pCsr
249e0 2d 3e 6e 53 65 67 6d 65 6e 74 20 26 26 20 70 53  ->nSegment && pS
249f0 65 67 2d 3e 69 49 64 78 3d 3d 69 20 29 3b 0a 0a  eg->iIdx==i );..
24a00 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 61 4e      if( pSeg->aN
24a10 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
24a20 2f 2a 20 53 65 67 2d 72 65 61 64 65 72 20 69 73  /* Seg-reader is
24a30 20 61 74 20 45 4f 46 2e 20 52 65 6d 6f 76 65 20   at EOF. Remove 
24a40 74 68 65 20 65 6e 74 69 72 65 20 69 6e 70 75 74  the entire input
24a50 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20   segment. */.   
24a60 20 20 20 72 63 20 3d 20 66 74 73 33 44 65 6c 65     rc = fts3Dele
24a70 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 53 65  teSegment(p, pSe
24a80 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
24a90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24aa0 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33         rc = fts3
24ab0 52 65 6d 6f 76 65 53 65 67 64 69 72 45 6e 74 72  RemoveSegdirEntr
24ac0 79 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 2c 20  y(p, iAbsLevel, 
24ad0 70 53 65 67 2d 3e 69 49 64 78 29 3b 0a 20 20 20  pSeg->iIdx);.   
24ae0 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 6e 52 65     }.      *pnRe
24af0 6d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  m = 0;.    }else
24b00 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  {.      /* The i
24b10 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65  ncremental merge
24b20 20 64 69 64 20 6e 6f 74 20 63 6f 70 79 20 61 6c   did not copy al
24b30 6c 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d 20  l the data from 
24b40 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 73  this .      ** s
24b50 65 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 75 70  egment to the up
24b60 70 65 72 20 6c 65 76 65 6c 2e 20 54 68 65 20 73  per level. The s
24b70 65 67 6d 65 6e 74 20 69 73 20 6d 6f 64 69 66 69  egment is modifi
24b80 65 64 20 69 6e 20 70 6c 61 63 65 0a 20 20 20 20  ed in place.    
24b90 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20    ** so that it 
24ba0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 6b 65 79 73  contains no keys
24bb0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 7a 54   smaller than zT
24bc0 65 72 6d 2f 6e 54 65 72 6d 2e 20 2a 2f 20 0a 20  erm/nTerm. */ . 
24bd0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
24be0 2a 7a 54 65 72 6d 20 3d 20 70 53 65 67 2d 3e 7a  *zTerm = pSeg->z
24bf0 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Term;.      int 
24c00 6e 54 65 72 6d 20 3d 20 70 53 65 67 2d 3e 6e 54  nTerm = pSeg->nT
24c10 65 72 6d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  erm;.      rc = 
24c20 66 74 73 33 54 72 75 6e 63 61 74 65 53 65 67 6d  fts3TruncateSegm
24c30 65 6e 74 28 70 2c 20 69 41 62 73 4c 65 76 65 6c  ent(p, iAbsLevel
24c40 2c 20 70 53 65 67 2d 3e 69 49 64 78 2c 20 7a 54  , pSeg->iIdx, zT
24c50 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20  erm, nTerm);.   
24c60 20 20 20 6e 52 65 6d 2b 2b 3b 0a 20 20 20 20 7d     nRem++;.    }
24c70 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
24c80 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 52 65  SQLITE_OK && nRe
24c90 6d 21 3d 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e  m!=pCsr->nSegmen
24ca0 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  t ){.    rc = ft
24cb0 73 33 52 65 70 61 63 6b 53 65 67 64 69 72 4c 65  s3RepackSegdirLe
24cc0 76 65 6c 28 70 2c 20 69 41 62 73 4c 65 76 65 6c  vel(p, iAbsLevel
24cd0 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 52 65 6d  );.  }..  *pnRem
24ce0 20 3d 20 6e 52 65 6d 3b 0a 20 20 72 65 74 75 72   = nRem;.  retur
24cf0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
24d00 74 6f 72 65 20 61 6e 20 69 6e 63 72 2d 6d 65 72  tore an incr-mer
24d10 67 65 20 68 69 6e 74 20 69 6e 20 74 68 65 20 64  ge hint in the d
24d20 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
24d30 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72 6d  ic int fts3Incrm
24d40 65 72 67 65 48 69 6e 74 53 74 6f 72 65 28 0a 20  ergeHintStore(. 
24d50 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
24d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d70 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20 68   /* FTS3 table h
24d80 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  andle */.  sqlit
24d90 65 33 5f 69 6e 74 36 34 20 69 41 62 73 4c 65 76  e3_int64 iAbsLev
24da0 65 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 62  el,        /* Ab
24db0 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 74 6f 20  solute level to 
24dc0 72 65 61 64 20 69 6e 70 75 74 20 64 61 74 61 20  read input data 
24dd0 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  from */.  int nM
24de0 65 72 67 65 20 20 20 20 20 20 20 20 20 20 20 20  erge            
24df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
24e00 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
24e10 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20  to merge */.){. 
24e20 20 63 68 61 72 20 61 42 6c 6f 62 5b 46 54 53 33   char aBlob[FTS3
24e30 5f 56 41 52 49 4e 54 5f 4d 41 58 20 2a 20 32 5d  _VARINT_MAX * 2]
24e40 3b 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d 20  ;.  int nBlob = 
24e50 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  0;.  int rc;.  s
24e60 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 52 65  qlite3_stmt *pRe
24e70 70 6c 61 63 65 20 3d 20 30 3b 0a 0a 20 20 61 73  place = 0;..  as
24e80 73 65 72 74 28 20 70 2d 3e 62 48 61 73 53 74 61  sert( p->bHasSta
24e90 74 20 29 3b 0a 20 20 6e 42 6c 6f 62 20 2b 3d 20  t );.  nBlob += 
24ea0 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
24eb0 72 69 6e 74 28 26 61 42 6c 6f 62 5b 6e 42 6c 6f  rint(&aBlob[nBlo
24ec0 62 5d 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a  b], iAbsLevel);.
24ed0 20 20 6e 42 6c 6f 62 20 2b 3d 20 73 71 6c 69 74    nBlob += sqlit
24ee0 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28  e3Fts3PutVarint(
24ef0 26 61 42 6c 6f 62 5b 6e 42 6c 6f 62 5d 2c 20 6e  &aBlob[nBlob], n
24f00 4d 65 72 67 65 29 3b 0a 0a 20 20 72 63 20 3d 20  Merge);..  rc = 
24f10 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
24f20 51 4c 5f 52 45 50 4c 41 43 45 5f 53 54 41 54 2c  QL_REPLACE_STAT,
24f30 20 26 70 52 65 70 6c 61 63 65 2c 20 30 29 3b 0a   &pReplace, 0);.
24f40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24f50 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
24f60 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 52 65 70  e3_bind_int(pRep
24f70 6c 61 63 65 2c 20 31 2c 20 46 54 53 5f 53 54 41  lace, 1, FTS_STA
24f80 54 5f 49 4e 43 52 4d 45 52 47 45 48 49 4e 54 29  T_INCRMERGEHINT)
24f90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
24fa0 6e 64 5f 62 6c 6f 62 28 70 52 65 70 6c 61 63 65  nd_blob(pReplace
24fb0 2c 20 32 2c 20 61 42 6c 6f 62 2c 20 6e 42 6c 6f  , 2, aBlob, nBlo
24fc0 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  b, SQLITE_TRANSI
24fd0 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
24fe0 33 5f 73 74 65 70 28 70 52 65 70 6c 61 63 65 29  3_step(pReplace)
24ff0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
25000 65 33 5f 72 65 73 65 74 28 70 52 65 70 6c 61 63  e3_reset(pReplac
25010 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  e);.  }..  retur
25020 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
25030 6f 61 64 20 61 6e 20 69 6e 63 72 2d 6d 65 72 67  oad an incr-merg
25040 65 20 68 69 6e 74 20 66 72 6f 6d 20 74 68 65 20  e hint from the 
25050 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
25060 54 68 65 20 69 6e 63 72 2d 6d 65 72 67 65 20 68  The incr-merge h
25070 69 6e 74 2c 20 69 66 20 6f 6e 65 20 65 78 69 73  int, if one exis
25080 74 73 2c 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ts, is stored in
25090 20 74 68 65 20 72 6f 77 69 64 3d 3d 31 20 72 6f   the rowid==1 ro
250a0 77 20 6f 66 0a 2a 2a 20 74 68 65 20 25 5f 73 74  w of.** the %_st
250b0 61 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  at table..*/.sta
250c0 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72  tic int fts3Incr
250d0 6d 65 72 67 65 48 69 6e 74 4c 6f 61 64 28 0a 20  mergeHintLoad(. 
250e0 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
250f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25100 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20 68   /* FTS3 table h
25110 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  andle */.  sqlit
25120 65 33 5f 69 6e 74 36 34 20 2a 70 69 41 62 73 4c  e3_int64 *piAbsL
25130 65 76 65 6c 2c 20 20 20 20 20 20 2f 2a 20 41 62  evel,      /* Ab
25140 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 74 6f 20  solute level to 
25150 72 65 61 64 20 69 6e 70 75 74 20 64 61 74 61 20  read input data 
25160 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  from */.  int *p
25170 6e 4d 65 72 67 65 20 20 20 20 20 20 20 20 20 20  nMerge          
25180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
25190 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
251a0 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20  to merge */.){. 
251b0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
251c0 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 69 6e  Select = 0;.  in
251d0 74 20 72 63 3b 0a 0a 20 20 2a 70 6e 4d 65 72 67  t rc;..  *pnMerg
251e0 65 20 3d 20 30 3b 0a 20 20 2a 70 69 41 62 73 4c  e = 0;.  *piAbsL
251f0 65 76 65 6c 20 3d 20 30 3b 0a 0a 20 20 72 63 20  evel = 0;..  rc 
25200 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
25210 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 54 41 54   SQL_SELECT_STAT
25220 2c 20 26 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  , &pSelect, 0);.
25230 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25240 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
25250 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 65 6c  e3_bind_int(pSel
25260 65 63 74 2c 20 31 2c 20 46 54 53 5f 53 54 41 54  ect, 1, FTS_STAT
25270 5f 49 4e 43 52 4d 45 52 47 45 48 49 4e 54 29 3b  _INCRMERGEHINT);
25280 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
25290 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
252a0 70 28 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  p(pSelect) ){.  
252b0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
252c0 61 48 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f  aHint = sqlite3_
252d0 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 65 6c  column_blob(pSel
252e0 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ect, 0);.      i
252f0 6e 74 20 6e 48 69 6e 74 20 3d 20 73 71 6c 69 74  nt nHint = sqlit
25300 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
25310 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
25320 20 20 20 69 66 28 20 61 48 69 6e 74 20 29 7b 0a     if( aHint ){.
25330 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
25340 20 20 20 20 20 20 20 63 68 61 72 20 61 42 6c 6f         char aBlo
25350 62 5b 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41  b[FTS3_VARINT_MA
25360 58 20 2a 20 32 5d 3b 0a 20 20 20 20 20 20 20 20  X * 2];.        
25370 6d 65 6d 63 70 79 28 61 42 6c 6f 62 2c 20 61 48  memcpy(aBlob, aH
25380 69 6e 74 2c 20 4d 41 58 28 73 69 7a 65 6f 66 28  int, MAX(sizeof(
25390 61 42 6c 6f 62 29 2c 20 6e 48 69 6e 74 29 29 3b  aBlob), nHint));
253a0 0a 20 20 20 20 20 20 20 20 69 20 3d 20 73 71 6c  .        i = sql
253b0 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e  ite3Fts3GetVarin
253c0 74 28 61 42 6c 6f 62 2c 20 70 69 41 62 73 4c 65  t(aBlob, piAbsLe
253d0 76 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  vel);.        sq
253e0 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
253f0 6e 74 33 32 28 26 61 42 6c 6f 62 5b 69 5d 2c 20  nt32(&aBlob[i], 
25400 70 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20  pnMerge);.      
25410 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  }.    }.    rc =
25420 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
25430 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 0a 20 20  Select);.  }..  
25440 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25450 0a 2a 2a 20 41 74 74 65 6d 70 74 20 61 6e 20 69  .** Attempt an i
25460 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65  ncremental merge
25470 20 74 68 61 74 20 77 72 69 74 65 73 20 6e 4d 65   that writes nMe
25480 72 67 65 20 6c 65 61 66 20 62 6c 6f 63 6b 73 2e  rge leaf blocks.
25490 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  .**.** Increment
254a0 61 6c 20 6d 65 72 67 65 73 20 68 61 70 70 65 6e  al merges happen
254b0 20 6e 4d 69 6e 20 73 65 67 6d 65 6e 74 73 20 61   nMin segments a
254c0 74 20 61 20 74 69 6d 65 2e 20 54 68 65 20 74 77  t a time. The tw
254d0 6f 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 74 6f  o.** segments to
254e0 20 62 65 20 6d 65 72 67 65 64 20 61 72 65 20 74   be merged are t
254f0 68 65 20 6e 4d 69 6e 20 6f 6c 64 65 73 74 20 73  he nMin oldest s
25500 65 67 6d 65 6e 74 73 20 28 74 68 65 20 6f 6e 65  egments (the one
25510 73 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 73 6d  s with.** the sm
25520 61 6c 6c 65 73 74 20 69 6e 64 65 78 65 73 29 20  allest indexes) 
25530 69 6e 20 74 68 65 20 68 69 67 68 65 73 74 20 6c  in the highest l
25540 65 76 65 6c 20 74 68 61 74 20 63 6f 6e 74 61 69  evel that contai
25550 6e 73 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 6e  ns at least.** n
25560 4d 69 6e 20 73 65 67 6d 65 6e 74 73 2e 20 4d 75  Min segments. Mu
25570 6c 74 69 70 6c 65 20 6d 65 72 67 65 73 20 6d 69  ltiple merges mi
25580 67 68 74 20 6f 63 63 75 72 20 69 6e 20 61 6e 20  ght occur in an 
25590 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
255a0 20 74 68 65 20 0a 2a 2a 20 71 75 6f 74 61 20 6f   the .** quota o
255b0 66 20 6e 4d 65 72 67 65 20 6c 65 61 66 20 62 6c  f nMerge leaf bl
255c0 6f 63 6b 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ocks..*/.int sql
255d0 69 74 65 33 46 74 73 33 49 6e 63 72 6d 65 72 67  ite3Fts3Incrmerg
255e0 65 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20  e(Fts3Table *p, 
255f0 69 6e 74 20 6e 4d 65 72 67 65 2c 20 69 6e 74 20  int nMerge, int 
25600 6e 4d 69 6e 29 7b 0a 20 20 69 6e 74 20 72 63 3b  nMin){.  int rc;
25610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25620 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
25630 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
25640 20 6e 52 65 6d 20 3d 20 6e 4d 65 72 67 65 3b 20   nRem = nMerge; 
25650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25660 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70  Number of leaf p
25670 61 67 65 73 20 79 65 74 20 74 6f 20 20 62 65 20  ages yet to  be 
25680 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74  written */.  int
25690 20 62 55 73 65 48 69 6e 74 20 3d 20 31 3b 20 20   bUseHint = 1;  
256a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
256b0 54 72 75 65 20 69 66 20 68 69 6e 74 20 68 61 73  True if hint has
256c0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 61 74   not yet been at
256d0 74 65 6d 70 74 65 64 20 2a 2f 0a 20 20 73 71 6c  tempted */.  sql
256e0 69 74 65 33 5f 69 6e 74 36 34 20 69 48 69 6e 74  ite3_int64 iHint
256f0 41 62 73 4c 65 76 65 6c 20 3d 20 30 3b 2f 2a 20  AbsLevel = 0;/* 
25700 48 69 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  Hint level */.  
25710 69 6e 74 20 6e 48 69 6e 74 53 65 67 20 3d 20 30  int nHintSeg = 0
25720 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25730 2f 2a 20 48 69 6e 74 20 6e 75 6d 62 65 72 20 6f  /* Hint number o
25740 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  f segments */.  
25750 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b 20 20 20  int nSeg = 0;   
25760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25770 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70  /* Number of inp
25780 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  ut segments */. 
25790 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
257a0 41 62 73 4c 65 76 65 6c 20 3d 20 30 3b 20 20 20  AbsLevel = 0;   
257b0 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65 76   /* Absolute lev
257c0 65 6c 20 6e 75 6d 62 65 72 20 74 6f 20 77 6f 72  el number to wor
257d0 6b 20 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72  k on */..  asser
257e0 74 28 20 6e 4d 69 6e 3e 3d 32 20 29 3b 0a 0a 20  t( nMin>=2 );.. 
257f0 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72 6d 65   rc = fts3Incrme
25800 72 67 65 48 69 6e 74 4c 6f 61 64 28 70 2c 20 26  rgeHintLoad(p, &
25810 69 48 69 6e 74 41 62 73 4c 65 76 65 6c 2c 20 26  iHintAbsLevel, &
25820 6e 48 69 6e 74 53 65 67 29 3b 0a 20 20 69 66 28  nHintSeg);.  if(
25830 20 6e 48 69 6e 74 53 65 67 3d 3d 30 20 29 20 62   nHintSeg==0 ) b
25840 55 73 65 48 69 6e 74 20 3d 20 30 3b 0a 0a 20 20  UseHint = 0;..  
25850 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
25860 45 5f 4f 4b 20 26 26 20 6e 52 65 6d 3e 30 20 29  E_OK && nRem>0 )
25870 7b 0a 20 20 20 20 46 74 73 33 4d 75 6c 74 69 53  {.    Fts3MultiS
25880 65 67 52 65 61 64 65 72 20 2a 70 43 73 72 3b 20  egReader *pCsr; 
25890 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
258a0 75 73 65 64 20 74 6f 20 72 65 61 64 20 69 6e 70  used to read inp
258b0 75 74 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 46  ut data */.    F
258c0 74 73 33 53 65 67 46 69 6c 74 65 72 20 2a 70 46  ts3SegFilter *pF
258d0 69 6c 74 65 72 3b 20 20 20 20 20 20 20 20 20 2f  ilter;         /
258e0 2a 20 46 69 6c 74 65 72 20 75 73 65 64 20 77 69  * Filter used wi
258f0 74 68 20 63 75 72 73 6f 72 20 70 43 73 72 20 2a  th cursor pCsr *
25900 2f 0a 20 20 20 20 49 6e 63 72 6d 65 72 67 65 57  /.    IncrmergeW
25910 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 3b 20  riter *pWriter; 
25920 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20        /* Writer 
25930 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 63 6f  object */.    co
25940 6e 73 74 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d  nst int nAlloc =
25950 20 73 69 7a 65 6f 66 28 2a 70 43 73 72 29 20 2b   sizeof(*pCsr) +
25960 20 73 69 7a 65 6f 66 28 2a 70 46 69 6c 74 65 72   sizeof(*pFilter
25970 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 57 72 69  ) + sizeof(*pWri
25980 74 65 72 29 3b 0a 0a 20 20 20 20 69 66 28 20 62  ter);..    if( b
25990 55 73 65 48 69 6e 74 20 29 7b 0a 20 20 20 20 20  UseHint ){.     
259a0 20 69 41 62 73 4c 65 76 65 6c 20 3d 20 69 48 69   iAbsLevel = iHi
259b0 6e 74 41 62 73 4c 65 76 65 6c 3b 0a 20 20 20 20  ntAbsLevel;.    
259c0 20 20 6e 53 65 67 20 3d 20 6e 48 69 6e 74 53 65    nSeg = nHintSe
259d0 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  g;.    }else{.  
259e0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
259f0 20 2a 70 46 69 6e 64 4c 65 76 65 6c 20 3d 20 30   *pFindLevel = 0
25a00 3b 20 2f 2a 20 53 51 4c 20 75 73 65 64 20 74 6f  ; /* SQL used to
25a10 20 64 65 74 65 72 6d 69 6e 65 20 69 41 62 73 4c   determine iAbsL
25a20 65 76 65 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  evel */..      /
25a30 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 69 63  * Determine whic
25a40 68 20 6c 65 76 65 6c 20 74 6f 20 6d 65 72 67 65  h level to merge
25a50 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 2e 20   segments from. 
25a60 41 6e 79 20 6c 65 76 65 6c 2c 20 66 72 6f 6d 20  Any level, from 
25a70 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 70 72 65  any.      ** pre
25a80 66 69 78 20 6f 72 20 6c 61 6e 67 75 61 67 65 20  fix or language 
25a90 69 6e 64 65 78 20 6d 61 79 20 62 65 20 73 65 6c  index may be sel
25aa0 65 63 74 65 64 2e 20 53 74 61 63 6b 20 76 61 72  ected. Stack var
25ab0 69 61 62 6c 65 20 69 41 62 73 4c 65 76 65 6c 20  iable iAbsLevel 
25ac0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74  .      ** is set
25ad0 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65   to the absolute
25ae0 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20 6f 66   level number of
25af0 20 74 68 65 20 6c 65 76 65 6c 20 74 6f 20 6d 65   the level to me
25b00 72 67 65 20 66 72 6f 6d 2e 20 20 2a 2f 0a 20 20  rge from.  */.  
25b10 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c      rc = fts3Sql
25b20 53 74 6d 74 28 70 2c 20 53 51 4c 5f 46 49 4e 44  Stmt(p, SQL_FIND
25b30 5f 4d 45 52 47 45 5f 4c 45 56 45 4c 2c 20 26 70  _MERGE_LEVEL, &p
25b40 46 69 6e 64 4c 65 76 65 6c 2c 20 30 29 3b 0a 20  FindLevel, 0);. 
25b50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
25b60 64 5f 69 6e 74 28 70 46 69 6e 64 4c 65 76 65 6c  d_int(pFindLevel
25b70 2c 20 31 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20  , 1, nMin);.    
25b80 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
25b90 65 70 28 70 46 69 6e 64 4c 65 76 65 6c 29 21 3d  ep(pFindLevel)!=
25ba0 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
25bb0 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61        /* There a
25bc0 72 65 20 6e 6f 20 6c 65 76 65 6c 73 20 77 69 74  re no levels wit
25bd0 68 20 6e 4d 69 6e 20 6f 72 20 6d 6f 72 65 20 73  h nMin or more s
25be0 65 67 6d 65 6e 74 73 2e 20 4f 72 20 61 6e 20 65  egments. Or an e
25bf0 72 72 6f 72 20 68 61 73 0a 20 20 20 20 20 20 20  rror has.       
25c00 20 20 2a 2a 20 6f 63 63 75 72 72 65 64 2e 20 45    ** occurred. E
25c10 69 74 68 65 72 20 77 61 79 2c 20 65 78 69 74 20  ither way, exit 
25c20 65 61 72 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 20  early.  */.     
25c30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
25c40 72 65 73 65 74 28 70 46 69 6e 64 4c 65 76 65 6c  reset(pFindLevel
25c50 29 3b 0a 20 20 20 20 20 20 20 20 69 41 62 73 4c  );.        iAbsL
25c60 65 76 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  evel = 0;.      
25c70 20 20 6e 53 65 67 20 3d 20 30 3b 0a 20 20 20 20    nSeg = 0;.    
25c80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
25c90 20 7d 0a 20 20 20 20 20 20 69 41 62 73 4c 65 76   }.      iAbsLev
25ca0 65 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  el = sqlite3_col
25cb0 75 6d 6e 5f 69 6e 74 36 34 28 70 46 69 6e 64 4c  umn_int64(pFindL
25cc0 65 76 65 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  evel, 0);.      
25cd0 6e 53 65 67 20 3d 20 6e 4d 69 6e 3b 0a 20 20 20  nSeg = nMin;.   
25ce0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74     sqlite3_reset
25cf0 28 70 46 69 6e 64 4c 65 76 65 6c 29 3b 0a 20 20  (pFindLevel);.  
25d00 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f    }..    /* Allo
25d10 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
25d20 68 65 20 63 75 72 73 6f 72 2c 20 66 69 6c 74 65  he cursor, filte
25d30 72 20 61 6e 64 20 77 72 69 74 65 72 20 6f 62 6a  r and writer obj
25d40 65 63 74 73 20 2a 2f 0a 20 20 20 20 70 57 72 69  ects */.    pWri
25d50 74 65 72 20 3d 20 28 49 6e 63 72 6d 65 72 67 65  ter = (Incrmerge
25d60 57 72 69 74 65 72 20 2a 29 73 71 6c 69 74 65 33  Writer *)sqlite3
25d70 5f 6d 61 6c 6c 6f 63 28 6e 41 6c 6c 6f 63 29 3b  _malloc(nAlloc);
25d80 0a 20 20 20 20 69 66 28 20 21 70 57 72 69 74 65  .    if( !pWrite
25d90 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  r ) return SQLIT
25da0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d  E_NOMEM;.    mem
25db0 73 65 74 28 70 57 72 69 74 65 72 2c 20 30 2c 20  set(pWriter, 0, 
25dc0 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 70 46 69  nAlloc);.    pFi
25dd0 6c 74 65 72 20 3d 20 28 46 74 73 33 53 65 67 46  lter = (Fts3SegF
25de0 69 6c 74 65 72 20 2a 29 26 70 57 72 69 74 65 72  ilter *)&pWriter
25df0 5b 31 5d 3b 0a 20 20 20 20 70 43 73 72 20 3d 20  [1];.    pCsr = 
25e00 28 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61  (Fts3MultiSegRea
25e10 64 65 72 20 2a 29 26 70 46 69 6c 74 65 72 5b 31  der *)&pFilter[1
25e20 5d 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  ];..    /* Open 
25e30 61 20 63 75 72 73 6f 72 20 74 6f 20 69 74 65 72  a cursor to iter
25e40 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
25e50 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
25e60 6f 6c 64 65 73 74 20 6e 53 65 67 20 0a 20 20 20  oldest nSeg .   
25e70 20 2a 2a 20 69 6e 64 65 78 65 73 20 6f 66 20 61   ** indexes of a
25e80 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 69 41  bsolute level iA
25e90 62 73 4c 65 76 65 6c 2e 20 49 66 20 74 68 69 73  bsLevel. If this
25ea0 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65   cursor is opene
25eb0 64 20 75 73 69 6e 67 20 0a 20 20 20 20 2a 2a 20  d using .    ** 
25ec0 74 68 65 20 27 68 69 6e 74 27 20 70 61 72 61 6d  the 'hint' param
25ed0 65 74 65 72 73 2c 20 69 74 20 69 73 20 70 6f 73  eters, it is pos
25ee0 73 69 62 6c 65 20 74 68 61 74 20 74 68 65 72 65  sible that there
25ef0 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 6e   are less than n
25f00 53 65 67 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65  Seg.    ** segme
25f10 6e 74 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  nts available in
25f20 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c   level iAbsLevel
25f30 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
25f40 6e 6f 20 77 6f 72 6b 20 69 73 0a 20 20 20 20 2a  no work is.    *
25f50 2a 20 64 6f 6e 65 20 6f 6e 20 69 41 62 73 4c 65  * done on iAbsLe
25f60 76 65 6c 20 2d 20 66 61 6c 6c 20 74 68 72 6f 75  vel - fall throu
25f70 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  gh to the next i
25f80 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
25f90 6c 6f 6f 70 20 0a 20 20 20 20 2a 2a 20 74 6f 20  loop .    ** to 
25fa0 73 74 61 72 74 20 77 6f 72 6b 20 6f 6e 20 73 6f  start work on so
25fb0 6d 65 20 6f 74 68 65 72 20 6c 65 76 65 6c 2e 20  me other level. 
25fc0 20 2a 2f 0a 20 20 20 20 70 46 69 6c 74 65 72 2d   */.    pFilter-
25fd0 3e 66 6c 61 67 73 20 3d 20 46 54 53 33 5f 53 45  >flags = FTS3_SE
25fe0 47 4d 45 4e 54 5f 52 45 51 55 49 52 45 5f 50 4f  GMENT_REQUIRE_PO
25ff0 53 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  S;.    rc = fts3
26000 49 6e 63 72 6d 65 72 67 65 43 73 72 28 70 2c 20  IncrmergeCsr(p, 
26010 69 41 62 73 4c 65 76 65 6c 2c 20 6e 53 65 67 2c  iAbsLevel, nSeg,
26020 20 70 43 73 72 29 3b 0a 20 20 20 20 69 66 28 20   pCsr);.    if( 
26030 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d  pCsr->nSegment==
26040 6e 53 65 67 20 26 26 20 53 51 4c 49 54 45 5f 4f  nSeg && SQLITE_O
26050 4b 3d 3d 72 63 0a 20 20 20 20 20 26 26 20 53 51  K==rc.     && SQ
26060 4c 49 54 45 5f 4f 4b 20 3d 3d 28 72 63 20 3d 20  LITE_OK ==(rc = 
26070 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
26080 61 64 65 72 53 74 61 72 74 28 70 2c 20 70 43 73  aderStart(p, pCs
26090 72 2c 20 70 46 69 6c 74 65 72 29 29 0a 20 20 20  r, pFilter)).   
260a0 20 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d    && SQLITE_ROW=
260b0 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  =(rc = sqlite3Ft
260c0 73 33 53 65 67 52 65 61 64 65 72 53 74 65 70 28  s3SegReaderStep(
260d0 70 2c 20 70 43 73 72 29 29 0a 20 20 20 20 29 7b  p, pCsr)).    ){
260e0 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20  .      int iIdx 
260f0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
26100 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 69 64     /* Largest id
26110 78 20 69 6e 20 6c 65 76 65 6c 20 28 69 41 62 73  x in level (iAbs
26120 4c 65 76 65 6c 2b 31 29 20 2a 2f 0a 20 20 20 20  Level+1) */.    
26130 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72 6d    rc = fts3Incrm
26140 65 72 67 65 4f 75 74 70 75 74 49 64 78 28 70 2c  ergeOutputIdx(p,
26150 20 69 41 62 73 4c 65 76 65 6c 2c 20 26 69 49 64   iAbsLevel, &iId
26160 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  x);.      if( rc
26170 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26180 20 20 20 20 20 20 20 69 66 28 20 62 55 73 65 48         if( bUseH
26190 69 6e 74 20 26 26 20 69 49 64 78 3e 30 20 29 7b  int && iIdx>0 ){
261a0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
261b0 20 63 68 61 72 20 2a 7a 4b 65 79 20 3d 20 70 43   char *zKey = pC
261c0 73 72 2d 3e 7a 54 65 72 6d 3b 0a 20 20 20 20 20  sr->zTerm;.     
261d0 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20       int nKey = 
261e0 70 43 73 72 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20  pCsr->nTerm;.   
261f0 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33         rc = fts3
26200 49 6e 63 72 6d 65 72 67 65 4c 6f 61 64 28 70 2c  IncrmergeLoad(p,
26210 20 69 41 62 73 4c 65 76 65 6c 2c 20 69 49 64 78   iAbsLevel, iIdx
26220 2d 31 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 2c 20  -1, zKey, nKey, 
26230 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20  pWriter);.      
26240 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26250 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72     rc = fts3Incr
26260 6d 65 72 67 65 57 72 69 74 65 72 28 70 2c 20 69  mergeWriter(p, i
26270 41 62 73 4c 65 76 65 6c 2c 20 69 49 64 78 2c 20  AbsLevel, iIdx, 
26280 70 43 73 72 2c 20 70 57 72 69 74 65 72 29 3b 0a  pCsr, pWriter);.
26290 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
262a0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  }..      if( rc=
262b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 57  =SQLITE_OK && pW
262c0 72 69 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74 20  riter->nLeafEst 
262d0 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 33 4c  ){.        fts3L
262e0 6f 67 4d 65 72 67 65 28 6e 53 65 67 2c 20 69 41  ogMerge(nSeg, iA
262f0 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20  bsLevel);.      
26300 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 20    do {.         
26310 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72 6d 65   rc = fts3Incrme
26320 72 67 65 41 70 70 65 6e 64 28 70 2c 20 70 57 72  rgeAppend(p, pWr
26330 69 74 65 72 2c 20 70 43 73 72 29 3b 0a 20 20 20  iter, pCsr);.   
26340 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
26350 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
26360 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
26370 61 64 65 72 53 74 65 70 28 70 2c 20 70 43 73 72  aderStep(p, pCsr
26380 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
26390 20 70 57 72 69 74 65 72 2d 3e 6e 57 6f 72 6b 3e   pWriter->nWork>
263a0 3d 6e 52 65 6d 20 26 26 20 72 63 3d 3d 53 51 4c  =nRem && rc==SQL
263b0 49 54 45 5f 52 4f 57 20 29 20 72 63 20 3d 20 53  ITE_ROW ) rc = S
263c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
263d0 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
263e0 4c 49 54 45 5f 52 4f 57 20 29 3b 0a 0a 20 20 20  LITE_ROW );..   
263f0 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 6f       /* Update o
26400 72 20 64 65 6c 65 74 65 20 74 68 65 20 69 6e 70  r delete the inp
26410 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  ut segments */. 
26420 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
26430 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26440 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20 28 31        nRem -= (1
26450 20 2b 20 70 57 72 69 74 65 72 2d 3e 6e 57 6f 72   + pWriter->nWor
26460 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  k);.          rc
26470 20 3d 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65   = fts3Incrmerge
26480 43 68 6f 6d 70 28 70 2c 20 69 41 62 73 4c 65 76  Chomp(p, iAbsLev
26490 65 6c 2c 20 70 43 73 72 2c 20 26 6e 53 65 67 29  el, pCsr, &nSeg)
264a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
264b0 20 20 7d 0a 0a 20 20 20 20 20 20 66 74 73 33 49    }..      fts3I
264c0 6e 63 72 6d 65 72 67 65 52 65 6c 65 61 73 65 28  ncrmergeRelease(
264d0 70 2c 20 70 57 72 69 74 65 72 2c 20 26 72 63 29  p, pWriter, &rc)
264e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
264f0 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
26500 72 46 69 6e 69 73 68 28 70 43 73 72 29 3b 0a 20  rFinish(pCsr);. 
26510 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
26520 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 62 55  pWriter);.    bU
26530 73 65 48 69 6e 74 20 3d 20 30 3b 0a 20 20 7d 0a  seHint = 0;.  }.
26540 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
26550 68 69 6e 74 20 76 61 6c 75 65 73 20 69 6e 74 6f  hint values into
26560 20 74 68 65 20 25 5f 73 74 61 74 20 74 61 62 6c   the %_stat tabl
26570 65 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 69  e for the next i
26580 6e 63 72 2d 6d 65 72 67 65 72 20 2a 2f 0a 20 20  ncr-merger */.  
26590 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
265a0 4b 20 26 26 20 28 69 41 62 73 4c 65 76 65 6c 21  K && (iAbsLevel!
265b0 3d 69 48 69 6e 74 41 62 73 4c 65 76 65 6c 20 7c  =iHintAbsLevel |
265c0 7c 20 6e 48 69 6e 74 53 65 67 21 3d 6e 53 65 67  | nHintSeg!=nSeg
265d0 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  ) ){.    rc = ft
265e0 73 33 49 6e 63 72 6d 65 72 67 65 48 69 6e 74 53  s3IncrmergeHintS
265f0 74 6f 72 65 28 70 2c 20 69 41 62 73 4c 65 76 65  tore(p, iAbsLeve
26600 6c 2c 20 6e 53 65 67 29 3b 0a 20 20 7d 0a 0a 20  l, nSeg);.  }.. 
26610 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
26620 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65  *.** Convert the
26630 20 74 65 78 74 20 62 65 67 69 6e 6e 69 6e 67 20   text beginning 
26640 61 74 20 2a 70 7a 20 69 6e 74 6f 20 61 6e 20 69  at *pz into an i
26650 6e 74 65 67 65 72 20 61 6e 64 20 72 65 74 75 72  nteger and retur
26660 6e 0a 2a 2a 20 69 74 73 20 76 61 6c 75 65 2e 20  n.** its value. 
26670 20 41 64 76 61 6e 63 65 20 2a 70 7a 20 74 6f 20   Advance *pz to 
26680 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72  point to the fir
26690 73 74 20 63 68 61 72 61 63 74 65 72 20 70 61 73  st character pas
266a0 74 0a 2a 2a 20 74 68 65 20 69 6e 74 65 67 65 72  t.** the integer
266b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
266c0 66 74 73 33 47 65 74 69 6e 74 28 63 6f 6e 73 74  fts3Getint(const
266d0 20 63 68 61 72 20 2a 2a 70 7a 29 7b 0a 20 20 63   char **pz){.  c
266e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 2a  onst char *z = *
266f0 70 7a 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b  pz;.  int i = 0;
26700 0a 20 20 77 68 69 6c 65 28 20 28 2a 7a 29 3e 3d  .  while( (*z)>=
26710 27 30 27 20 26 26 20 28 2a 7a 29 3c 3d 27 39 27  '0' && (*z)<='9'
26720 20 29 20 69 20 3d 20 31 30 2a 69 20 2b 20 2a 28   ) i = 10*i + *(
26730 7a 2b 2b 29 20 2d 20 27 30 27 3b 0a 20 20 2a 70  z++) - '0';.  *p
26740 7a 20 3d 20 7a 3b 0a 20 20 72 65 74 75 72 6e 20  z = z;.  return 
26750 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63  i;.}../*.** Proc
26760 65 73 73 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  ess statements o
26770 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
26780 2a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  *    INSERT INTO
26790 20 74 61 62 6c 65 28 74 61 62 6c 65 29 20 56 41   table(table) VA
267a0 4c 55 45 53 28 27 6d 65 72 67 65 3d 41 2c 42 27  LUES('merge=A,B'
267b0 29 3b 0a 2a 2a 0a 2a 2a 20 41 20 61 6e 64 20 42  );.**.** A and B
267c0 20 61 72 65 20 69 6e 74 65 67 65 72 73 20 74 68   are integers th
267d0 61 74 20 64 65 63 6f 64 65 20 74 6f 20 62 65 20  at decode to be 
267e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  the number of le
267f0 61 66 20 70 61 67 65 73 0a 2a 2a 20 77 72 69 74  af pages.** writ
26800 74 65 6e 20 66 6f 72 20 74 68 65 20 6d 65 72 67  ten for the merg
26810 65 2c 20 61 6e 64 20 74 68 65 20 6d 69 6e 69 6d  e, and the minim
26820 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67  um number of seg
26830 6d 65 6e 74 73 20 6f 6e 20 61 20 6c 65 76 65 6c  ments on a level
26840 0a 2a 2a 20 62 65 66 6f 72 65 20 69 74 20 77 69  .** before it wi
26850 6c 6c 20 62 65 20 73 65 6c 65 63 74 65 64 20 66  ll be selected f
26860 6f 72 20 61 20 6d 65 72 67 65 2c 20 72 65 73 70  or a merge, resp
26870 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 73 74 61  ectively..*/.sta
26880 74 69 63 20 69 6e 74 20 66 74 73 33 44 6f 49 6e  tic int fts3DoIn
26890 63 72 6d 65 72 67 65 28 0a 20 20 46 74 73 33 54  crmerge(.  Fts3T
268a0 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
268b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
268c0 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  S3 table handle 
268d0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
268e0 2a 7a 50 61 72 61 6d 20 20 20 20 20 20 20 20 20  *zParam         
268f0 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d       /* Nul-term
26900 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f  inated string co
26910 6e 74 61 69 6e 69 6e 67 20 22 41 2c 42 22 20 2a  ntaining "A,B" *
26920 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
26930 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 28 46 54 53   int nMin = (FTS
26940 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 20 2f 20  3_MERGE_COUNT / 
26950 32 29 3b 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65  2);.  int nMerge
26960 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68   = 0;.  const ch
26970 61 72 20 2a 7a 20 3d 20 7a 50 61 72 61 6d 3b 0a  ar *z = zParam;.
26980 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66  .  /* Read the f
26990 69 72 73 74 20 69 6e 74 65 67 65 72 20 76 61 6c  irst integer val
269a0 75 65 20 2a 2f 0a 20 20 6e 4d 65 72 67 65 20 3d  ue */.  nMerge =
269b0 20 66 74 73 33 47 65 74 69 6e 74 28 26 7a 29 3b   fts3Getint(&z);
269c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69  ..  /* If the fi
269d0 72 73 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75  rst integer valu
269e0 65 20 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79  e is followed by
269f0 20 61 20 27 2c 27 2c 20 20 72 65 61 64 20 74 68   a ',',  read th
26a00 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 69 6e  e second.  ** in
26a10 74 65 67 65 72 20 76 61 6c 75 65 2e 20 2a 2f 0a  teger value. */.
26a20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2c 27 20    if( z[0]==',' 
26a30 26 26 20 7a 5b 31 5d 21 3d 27 5c 30 27 20 29 7b  && z[1]!='\0' ){
26a40 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 6e 4d  .    z++;.    nM
26a50 69 6e 20 3d 20 66 74 73 33 47 65 74 69 6e 74 28  in = fts3Getint(
26a60 26 7a 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  &z);.  }..  if( 
26a70 7a 5b 30 5d 21 3d 27 5c 30 27 20 7c 7c 20 6e 4d  z[0]!='\0' || nM
26a80 69 6e 3c 32 20 29 7b 0a 20 20 20 20 72 63 20 3d  in<2 ){.    rc =
26a90 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
26aa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
26ab0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
26ac0 69 66 28 20 21 70 2d 3e 62 48 61 73 53 74 61 74  if( !p->bHasStat
26ad0 20 29 20 73 71 6c 69 74 65 33 46 74 73 33 43 72   ) sqlite3Fts3Cr
26ae0 65 61 74 65 53 74 61 74 54 61 62 6c 65 28 26 72  eateStatTable(&r
26af0 63 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 72  c, p);.    if( r
26b00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26b10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26b20 65 33 46 74 73 33 49 6e 63 72 6d 65 72 67 65 28  e3Fts3Incrmerge(
26b30 70 2c 20 6e 4d 65 72 67 65 2c 20 6e 4d 69 6e 29  p, nMerge, nMin)
26b40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
26b50 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73 43  te3Fts3SegmentsC
26b60 6c 6f 73 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  lose(p);.  }.  r
26b70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
26b80 2a 2a 20 50 72 6f 63 65 73 73 20 73 74 61 74 65  ** Process state
26b90 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72  ments of the for
26ba0 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49 4e 53 45  m:.**.**    INSE
26bb0 52 54 20 49 4e 54 4f 20 74 61 62 6c 65 28 74 61  RT INTO table(ta
26bc0 62 6c 65 29 20 56 41 4c 55 45 53 28 27 61 75 74  ble) VALUES('aut
26bd0 6f 6d 65 72 67 65 3d 58 27 29 3b 0a 2a 2a 0a 2a  omerge=X');.**.*
26be0 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 6e 20  * where X is an 
26bf0 69 6e 74 65 67 65 72 2e 20 20 58 3d 3d 30 20 6d  integer.  X==0 m
26c00 65 61 6e 73 20 74 6f 20 74 75 72 6e 20 61 75 74  eans to turn aut
26c10 6f 6d 65 72 67 65 20 6f 66 66 2e 20 20 58 21 3d  omerge off.  X!=
26c20 30 20 6d 65 61 6e 73 0a 2a 2a 20 74 75 72 6e 20  0 means.** turn 
26c30 69 74 20 6f 6e 2e 20 20 54 68 65 20 73 65 74 74  it on.  The sett
26c40 69 6e 67 20 69 73 20 70 65 72 73 69 73 74 65 6e  ing is persisten
26c50 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
26c60 20 66 74 73 33 44 6f 41 75 74 6f 69 6e 63 72 6d   fts3DoAutoincrm
26c70 65 72 67 65 28 0a 20 20 46 74 73 33 54 61 62 6c  erge(.  Fts3Tabl
26c80 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
26c90 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20          /* FTS3 
26ca0 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
26cb0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
26cc0 61 72 61 6d 20 20 20 20 20 20 20 20 20 20 20 20  aram            
26cd0 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61    /* Nul-termina
26ce0 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  ted string conta
26cf0 69 6e 69 6e 67 20 62 6f 6f 6c 65 61 6e 20 2a 2f  ining boolean */
26d00 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
26d10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69  QLITE_OK;.  sqli
26d20 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
26d30 3d 20 30 3b 0a 20 20 70 2d 3e 62 41 75 74 6f 69  = 0;.  p->bAutoi
26d40 6e 63 72 6d 65 72 67 65 20 3d 20 66 74 73 33 47  ncrmerge = fts3G
26d50 65 74 69 6e 74 28 26 7a 50 61 72 61 6d 29 21 3d  etint(&zParam)!=
26d60 30 3b 0a 20 20 69 66 28 20 21 70 2d 3e 62 48 61  0;.  if( !p->bHa
26d70 73 53 74 61 74 20 29 7b 0a 20 20 20 20 73 71 6c  sStat ){.    sql
26d80 69 74 65 33 46 74 73 33 43 72 65 61 74 65 53 74  ite3Fts3CreateSt
26d90 61 74 54 61 62 6c 65 28 26 72 63 2c 20 70 29 3b  atTable(&rc, p);
26da0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
26db0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72  turn rc;.  }.  r
26dc0 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
26dd0 70 2c 20 53 51 4c 5f 52 45 50 4c 41 43 45 5f 53  p, SQL_REPLACE_S
26de0 54 41 54 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  TAT, &pStmt, 0);
26df0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
26e00 72 6e 20 72 63 3b 3b 0a 20 20 73 71 6c 69 74 65  rn rc;;.  sqlite
26e10 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74  3_bind_int(pStmt
26e20 2c 20 31 2c 20 46 54 53 5f 53 54 41 54 5f 41 55  , 1, FTS_STAT_AU
26e30 54 4f 49 4e 43 52 4d 45 52 47 45 29 3b 0a 20 20  TOINCRMERGE);.  
26e40 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
26e50 28 70 53 74 6d 74 2c 20 32 2c 20 70 2d 3e 62 41  (pStmt, 2, p->bA
26e60 75 74 6f 69 6e 63 72 6d 65 72 67 65 29 3b 0a 20  utoincrmerge);. 
26e70 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
26e80 74 6d 74 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  tmt);.  rc = sql
26e90 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
26ea0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
26eb0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
26ec0 61 20 36 34 2d 62 69 74 20 63 68 65 63 6b 73 75  a 64-bit checksu
26ed0 6d 20 66 6f 72 20 74 68 65 20 46 54 53 20 69 6e  m for the FTS in
26ee0 64 65 78 20 65 6e 74 72 79 20 73 70 65 63 69 66  dex entry specif
26ef0 69 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 61 72  ied by the.** ar
26f00 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 69 73 20  guments to this 
26f10 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
26f20 74 69 63 20 69 36 34 20 66 74 73 33 43 68 65 63  tic i64 fts3Chec
26f30 6b 73 75 6d 45 6e 74 72 79 28 0a 20 20 63 6f 6e  ksumEntry(.  con
26f40 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20  st char *zTerm, 
26f50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26f60 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
26f70 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72  r containing ter
26f80 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  m */.  int nTerm
26f90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26fa0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
26fb0 66 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73  f zTerm in bytes
26fc0 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69   */.  int iLangi
26fd0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
26fe0 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67        /* Languag
26ff0 65 20 69 64 20 66 6f 72 20 63 75 72 72 65 6e 74  e id for current
27000 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49   row */.  int iI
27010 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
27020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
27030 65 78 20 28 30 2e 2e 46 74 73 33 54 61 62 6c 65  ex (0..Fts3Table
27040 2e 6e 49 6e 64 65 78 2d 31 29 20 2a 2f 0a 20 20  .nIndex-1) */.  
27050 69 36 34 20 69 44 6f 63 69 64 2c 20 20 20 20 20  i64 iDocid,     
27060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27070 2f 2a 20 44 6f 63 69 64 20 66 6f 72 20 63 75 72  /* Docid for cur
27080 72 65 6e 74 20 72 6f 77 2e 20 2a 2f 0a 20 20 69  rent row. */.  i
27090 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
270a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
270b0 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
270c0 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 20 20 20  */.  int iPos   
270d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270e0 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
270f0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
27100 20 20 69 36 34 20 72 65 74 20 3d 20 69 44 6f 63    i64 ret = iDoc
27110 69 64 3b 0a 0a 20 20 72 65 74 20 2b 3d 20 28 72  id;..  ret += (r
27120 65 74 3c 3c 33 29 20 2b 20 69 4c 61 6e 67 69 64  et<<3) + iLangid
27130 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c  ;.  ret += (ret<
27140 3c 33 29 20 2b 20 69 49 6e 64 65 78 3b 0a 20 20  <3) + iIndex;.  
27150 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20  ret += (ret<<3) 
27160 2b 20 69 43 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d  + iCol;.  ret +=
27170 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 50 6f 73   (ret<<3) + iPos
27180 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
27190 54 65 72 6d 3b 20 69 2b 2b 29 20 72 65 74 20 2b  Term; i++) ret +
271a0 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 7a 54 65  = (ret<<3) + zTe
271b0 72 6d 5b 69 5d 3b 0a 0a 20 20 72 65 74 75 72 6e  rm[i];..  return
271c0 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   ret;.}../*.** R
271d0 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d  eturn a checksum
271e0 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   of all entries 
271f0 69 6e 20 74 68 65 20 46 54 53 20 69 6e 64 65 78  in the FTS index
27200 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
27210 20 74 6f 0a 2a 2a 20 6c 61 6e 67 75 61 67 65 20   to.** language 
27220 69 64 20 69 4c 61 6e 67 69 64 2e 20 54 68 65 20  id iLangid. The 
27230 63 68 65 63 6b 73 75 6d 20 69 73 20 63 61 6c 63  checksum is calc
27240 75 6c 61 74 65 64 20 62 79 20 58 4f 52 69 6e 67  ulated by XORing
27250 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 0a 2a   the checksums.*
27260 2a 20 6f 66 20 65 61 63 68 20 69 6e 64 69 76 69  * of each indivi
27270 64 75 61 6c 20 65 6e 74 72 79 20 28 73 65 65 20  dual entry (see 
27280 66 74 73 33 43 68 65 63 6b 73 75 6d 45 6e 74 72  fts3ChecksumEntr
27290 79 28 29 29 20 74 6f 67 65 74 68 65 72 2e 0a 2a  y()) together..*
272a0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
272b0 75 6c 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ul, the checksum
272c0 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
272d0 65 64 20 61 6e 64 20 2a 70 52 63 20 73 65 74 20  ed and *pRc set 
272e0 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  to SQLITE_OK..**
272f0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
27300 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
27310 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20 61  *pRc is set to a
27320 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
27330 6f 64 65 2e 20 54 68 65 0a 2a 2a 20 72 65 74 75  ode. The.** retu
27340 72 6e 20 76 61 6c 75 65 20 69 73 20 75 6e 64 65  rn value is unde
27350 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  fined in this ca
27360 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36  se..*/.static i6
27370 34 20 66 74 73 33 43 68 65 63 6b 73 75 6d 49 6e  4 fts3ChecksumIn
27380 64 65 78 28 0a 20 20 46 74 73 33 54 61 62 6c 65  dex(.  Fts3Table
27390 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
273a0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74         /* FTS3 t
273b0 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
273c0 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20 20   int iLangid,   
273d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273e0 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64 20   /* Language id 
273f0 74 6f 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 20  to return cksum 
27400 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e  for */.  int iIn
27410 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  dex,            
27420 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
27430 78 20 74 6f 20 63 6b 73 75 6d 20 28 30 2e 2e 70  x to cksum (0..p
27440 2d 3e 6e 49 6e 64 65 78 2d 31 29 20 2a 2f 0a 20  ->nIndex-1) */. 
27450 20 69 6e 74 20 2a 70 52 63 20 20 20 20 20 20 20   int *pRc       
27460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27470 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20   /* OUT: Return 
27480 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  code */.){.  Fts
27490 33 53 65 67 46 69 6c 74 65 72 20 66 69 6c 74 65  3SegFilter filte
274a0 72 3b 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65  r;.  Fts3MultiSe
274b0 67 52 65 61 64 65 72 20 63 73 72 3b 0a 20 20 69  gReader csr;.  i
274c0 6e 74 20 72 63 3b 0a 20 20 69 36 34 20 63 6b 73  nt rc;.  i64 cks
274d0 75 6d 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  um = 0;..  asser
274e0 74 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  t( *pRc==SQLITE_
274f0 4f 4b 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  OK );..  memset(
27500 26 66 69 6c 74 65 72 2c 20 30 2c 20 73 69 7a 65  &filter, 0, size
27510 6f 66 28 66 69 6c 74 65 72 29 29 3b 0a 20 20 6d  of(filter));.  m
27520 65 6d 73 65 74 28 26 63 73 72 2c 20 30 2c 20 73  emset(&csr, 0, s
27530 69 7a 65 6f 66 28 63 73 72 29 29 3b 0a 20 20 66  izeof(csr));.  f
27540 69 6c 74 65 72 2e 66 6c 61 67 73 20 3d 20 20 46  ilter.flags =  F
27550 54 53 33 5f 53 45 47 4d 45 4e 54 5f 52 45 51 55  TS3_SEGMENT_REQU
27560 49 52 45 5f 50 4f 53 7c 46 54 53 33 5f 53 45 47  IRE_POS|FTS3_SEG
27570 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d 50 54  MENT_IGNORE_EMPT
27580 59 3b 0a 20 20 66 69 6c 74 65 72 2e 66 6c 61 67  Y;.  filter.flag
27590 73 20 7c 3d 20 46 54 53 33 5f 53 45 47 4d 45 4e  s |= FTS3_SEGMEN
275a0 54 5f 53 43 41 4e 3b 0a 0a 20 20 72 63 20 3d 20  T_SCAN;..  rc = 
275b0 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
275c0 61 64 65 72 43 75 72 73 6f 72 28 0a 20 20 20 20  aderCursor(.    
275d0 20 20 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49    p, iLangid, iI
275e0 6e 64 65 78 2c 20 46 54 53 33 5f 53 45 47 43 55  ndex, FTS3_SEGCU
275f0 52 53 4f 52 5f 41 4c 4c 2c 20 30 2c 20 30 2c 20  RSOR_ALL, 0, 0, 
27600 30 2c 20 31 2c 26 63 73 72 0a 20 20 29 3b 0a 20  0, 1,&csr.  );. 
27610 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27620 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
27630 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61  qlite3Fts3SegRea
27640 64 65 72 53 74 61 72 74 28 70 2c 20 26 63 73 72  derStart(p, &csr
27650 2c 20 26 66 69 6c 74 65 72 29 3b 0a 20 20 7d 0a  , &filter);.  }.
27660 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
27670 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 77 68 69 6c  E_OK ){.    whil
27680 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 28  e( SQLITE_ROW==(
27690 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
276a0 53 65 67 52 65 61 64 65 72 53 74 65 70 28 70 2c  SegReaderStep(p,
276b0 20 26 63 73 72 29 29 20 29 7b 0a 20 20 20 20 20   &csr)) ){.     
276c0 20 63 68 61 72 20 2a 70 43 73 72 20 3d 20 63 73   char *pCsr = cs
276d0 72 2e 61 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20  r.aDoclist;.    
276e0 20 20 63 68 61 72 20 2a 70 45 6e 64 20 3d 20 26    char *pEnd = &
276f0 70 43 73 72 5b 63 73 72 2e 6e 44 6f 63 6c 69 73  pCsr[csr.nDoclis
27700 74 5d 3b 0a 0a 20 20 20 20 20 20 69 36 34 20 69  t];..      i64 i
27710 44 6f 63 69 64 20 3d 20 30 3b 0a 20 20 20 20 20  Docid = 0;.     
27720 20 69 36 34 20 69 43 6f 6c 20 3d 20 30 3b 0a 20   i64 iCol = 0;. 
27730 20 20 20 20 20 69 36 34 20 69 50 6f 73 20 3d 20       i64 iPos = 
27740 30 3b 0a 0a 20 20 20 20 20 20 70 43 73 72 20 2b  0;..      pCsr +
27750 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74  = sqlite3Fts3Get
27760 56 61 72 69 6e 74 28 70 43 73 72 2c 20 26 69 44  Varint(pCsr, &iD
27770 6f 63 69 64 29 3b 0a 20 20 20 20 20 20 77 68 69  ocid);.      whi
27780 6c 65 28 20 70 43 73 72 3c 70 45 6e 64 20 29 7b  le( pCsr<pEnd ){
27790 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 56 61  .        i64 iVa
277a0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  l = 0;.        p
277b0 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  Csr += sqlite3Ft
277c0 73 33 47 65 74 56 61 72 69 6e 74 28 70 43 73 72  s3GetVarint(pCsr
277d0 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 20 20  , &iVal);.      
277e0 20 20 69 66 28 20 70 43 73 72 3c 70 45 6e 64 20    if( pCsr<pEnd 
277f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
27800 20 69 56 61 6c 3d 3d 30 20 7c 7c 20 69 56 61 6c   iVal==0 || iVal
27810 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==1 ){.         
27820 20 20 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 20     iCol = 0;.   
27830 20 20 20 20 20 20 20 20 20 69 50 6f 73 20 3d 20           iPos = 
27840 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
27850 66 28 20 69 56 61 6c 20 29 7b 0a 20 20 20 20 20  f( iVal ){.     
27860 20 20 20 20 20 20 20 20 20 70 43 73 72 20 2b 3d           pCsr +=
27870 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56   sqlite3Fts3GetV
27880 61 72 69 6e 74 28 70 43 73 72 2c 20 26 69 43 6f  arint(pCsr, &iCo
27890 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
278a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
278b0 20 20 20 20 20 70 43 73 72 20 2b 3d 20 73 71 6c       pCsr += sql
278c0 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e  ite3Fts3GetVarin
278d0 74 28 70 43 73 72 2c 20 26 69 56 61 6c 29 3b 0a  t(pCsr, &iVal);.
278e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 44                iD
278f0 6f 63 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20  ocid += iVal;.  
27900 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27910 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27920 20 20 20 20 20 20 20 20 20 69 50 6f 73 20 2b 3d           iPos +=
27930 20 28 69 56 61 6c 20 2d 20 32 29 3b 0a 20 20 20   (iVal - 2);.   
27940 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d           cksum =
27950 20 63 6b 73 75 6d 20 5e 20 66 74 73 33 43 68 65   cksum ^ fts3Che
27960 63 6b 73 75 6d 45 6e 74 72 79 28 0a 20 20 20 20  cksumEntry(.    
27970 20 20 20 20 20 20 20 20 20 20 20 20 63 73 72 2e              csr.
27980 7a 54 65 72 6d 2c 20 63 73 72 2e 6e 54 65 72 6d  zTerm, csr.nTerm
27990 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
279a0 78 2c 20 69 44 6f 63 69 64 2c 20 69 43 6f 6c 2c  x, iDocid, iCol,
279b0 20 69 50 6f 73 0a 20 20 20 20 20 20 20 20 20 20   iPos.          
279c0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d    );.          }
279d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
279e0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
279f0 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61  qlite3Fts3SegRea
27a00 64 65 72 46 69 6e 69 73 68 28 26 63 73 72 29 3b  derFinish(&csr);
27a10 0a 0a 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20  ..  *pRc = rc;. 
27a20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d   return cksum;.}
27a30 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66  ../*.** Check if
27a40 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
27a50 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 6d   the FTS index m
27a60 61 74 63 68 20 74 68 65 20 63 75 72 72 65 6e 74  atch the current
27a70 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
27a80 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c  .** content tabl
27a90 65 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  e. If no error o
27aa0 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 63 6f  ccurs and the co
27ab0 6e 74 65 6e 74 73 20 64 6f 20 6d 61 74 63 68 2c  ntents do match,
27ac0 20 73 65 74 20 2a 70 62 4f 6b 0a 2a 2a 20 74 6f   set *pbOk.** to
27ad0 20 74 72 75 65 20 61 6e 64 20 72 65 74 75 72 6e   true and return
27ae0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 72 20 69   SQLITE_OK. Or i
27af0 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 64  f the contents d
27b00 6f 20 6e 6f 74 20 6d 61 74 63 68 2c 20 73 65 74  o not match, set
27b10 20 2a 70 62 4f 6b 0a 2a 2a 20 74 6f 20 66 61 6c   *pbOk.** to fal
27b20 73 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  se before return
27b30 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
27b40 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65   error occurs (e
27b50 2e 67 2e 20 61 6e 20 4f 4f 4d 20 6f 72 20 49 4f  .g. an OOM or IO
27b60 20 65 72 72 6f 72 29 2c 20 72 65 74 75 72 6e 20   error), return 
27b70 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
27b80 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69  .** code. The fi
27b90 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 2a 70 62  nal value of *pb
27ba0 4f 6b 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  Ok is undefined 
27bb0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
27bc0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
27bd0 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 46  IntegrityCheck(F
27be0 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74  ts3Table *p, int
27bf0 20 2a 70 62 4f 6b 29 7b 0a 20 20 69 6e 74 20 72   *pbOk){.  int r
27c00 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
27c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
27c20 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
27c30 36 34 20 63 6b 73 75 6d 31 20 3d 20 30 3b 20 20  64 cksum1 = 0;  
27c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27c50 2a 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65 64  * Checksum based
27c60 20 6f 6e 20 46 54 53 20 69 6e 64 65 78 20 63 6f   on FTS index co
27c70 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 69 36 34 20  ntents */.  i64 
27c80 63 6b 73 75 6d 32 20 3d 20 30 3b 20 20 20 20 20  cksum2 = 0;     
27c90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
27ca0 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e  hecksum based on
27cb0 20 25 5f 63 6f 6e 74 65 6e 74 20 63 6f 6e 74 65   %_content conte
27cc0 6e 74 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nts */.  sqlite3
27cd0 5f 73 74 6d 74 20 2a 70 41 6c 6c 4c 61 6e 67 69  _stmt *pAllLangi
27ce0 64 20 3d 20 30 3b 20 20 20 2f 2a 20 53 74 61 74  d = 0;   /* Stat
27cf0 65 6d 65 6e 74 20 74 6f 20 72 65 74 75 72 6e 20  ement to return 
27d00 61 6c 6c 20 6c 61 6e 67 75 61 67 65 2d 69 64 73  all language-ids
27d10 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62   */..  /* This b
27d20 6c 6f 63 6b 20 63 61 6c 63 75 6c 61 74 65 73 20  lock calculates 
27d30 74 68 65 20 63 68 65 63 6b 73 75 6d 20 61 63 63  the checksum acc
27d40 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 46 54  ording to the FT
27d50 53 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 72 63  S index. */.  rc
27d60 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
27d70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 41 4c 4c  , SQL_SELECT_ALL
27d80 5f 4c 41 4e 47 49 44 2c 20 26 70 41 6c 6c 4c 61  _LANGID, &pAllLa
27d90 6e 67 69 64 2c 20 30 29 3b 0a 20 20 69 66 28 20  ngid, 0);.  if( 
27da0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27db0 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20  .    int rc2;.  
27dc0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
27dd0 6e 74 28 70 41 6c 6c 4c 61 6e 67 69 64 2c 20 31  nt(pAllLangid, 1
27de0 2c 20 70 2d 3e 6e 49 6e 64 65 78 29 3b 0a 20 20  , p->nIndex);.  
27df0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
27e00 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65  ITE_OK && sqlite
27e10 33 5f 73 74 65 70 28 70 41 6c 6c 4c 61 6e 67 69  3_step(pAllLangi
27e20 64 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  d)==SQLITE_ROW )
27e30 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 61 6e  {.      int iLan
27e40 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  gid = sqlite3_co
27e50 6c 75 6d 6e 5f 69 6e 74 28 70 41 6c 6c 4c 61 6e  lumn_int(pAllLan
27e60 67 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  gid, 0);.      i
27e70 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
27e80 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 6e 64 65 78  i=0; i<p->nIndex
27e90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
27ea0 63 6b 73 75 6d 31 20 3d 20 63 6b 73 75 6d 31 20  cksum1 = cksum1 
27eb0 5e 20 66 74 73 33 43 68 65 63 6b 73 75 6d 49 6e  ^ fts3ChecksumIn
27ec0 64 65 78 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20  dex(p, iLangid, 
27ed0 69 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d  i, &rc);.      }
27ee0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 32 20 3d  .    }.    rc2 =
27ef0 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
27f00 41 6c 6c 4c 61 6e 67 69 64 29 3b 0a 20 20 20 20  AllLangid);.    
27f10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27f20 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20  K ) rc = rc2;.  
27f30 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f  }..  /* This blo
27f40 63 6b 20 63 61 6c 63 75 6c 61 74 65 73 20 74 68  ck calculates th
27f50 65 20 63 68 65 63 6b 73 75 6d 20 61 63 63 6f 72  e checksum accor
27f60 64 69 6e 67 20 74 6f 20 74 68 65 20 25 5f 63 6f  ding to the %_co
27f70 6e 74 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20  ntent table */. 
27f80 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
27f90 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f  t(p, SQL_SELECT_
27fa0 41 4c 4c 5f 4c 41 4e 47 49 44 2c 20 26 70 41 6c  ALL_LANGID, &pAl
27fb0 6c 4c 61 6e 67 69 64 2c 20 30 29 3b 0a 20 20 69  lLangid, 0);.  i
27fc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27fd0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
27fe0 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65  tokenizer_module
27ff0 20 63 6f 6e 73 74 20 2a 70 4d 6f 64 75 6c 65 20   const *pModule 
28000 3d 20 70 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 2d  = p->pTokenizer-
28010 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 73 71  >pModule;.    sq
28020 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
28030 74 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  t = 0;.    char 
28040 2a 7a 53 71 6c 3b 0a 20 20 20 0a 20 20 20 20 7a  *zSql;.   .    z
28050 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
28060 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 25 73  rintf("SELECT %s
28070 22 20 2c 20 70 2d 3e 7a 52 65 61 64 45 78 70 72  " , p->zReadExpr
28080 6c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 21  list);.    if( !
28090 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  zSql ){.      rc
280a0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
280b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
280c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
280d0 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
280e0 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
280f0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 0);.      sql
28100 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
28110 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c  .    }..    whil
28120 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
28130 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
28140 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
28150 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34  mt) ){.      i64
28160 20 69 44 6f 63 69 64 20 3d 20 73 71 6c 69 74 65   iDocid = sqlite
28170 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
28180 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Stmt, 0);.      
28190 69 6e 74 20 69 4c 61 6e 67 20 3d 20 6c 61 6e 67  int iLang = lang
281a0 69 64 46 72 6f 6d 53 65 6c 65 63 74 28 70 2c 20  idFromSelect(p, 
281b0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 6e  pStmt);.      in
281c0 74 20 69 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 66  t iCol;..      f
281d0 6f 72 28 69 43 6f 6c 3d 30 3b 20 72 63 3d 3d 53  or(iCol=0; rc==S
281e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 43 6f 6c  QLITE_OK && iCol
281f0 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 43 6f  <p->nColumn; iCo
28200 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  l++){.        co
28210 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 20  nst char *zText 
28220 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
28230 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
28240 65 78 74 28 70 53 74 6d 74 2c 20 69 43 6f 6c 2b  ext(pStmt, iCol+
28250 31 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  1);.        int 
28260 6e 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33 5f  nText = sqlite3_
28270 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
28280 6d 74 2c 20 69 43 6f 6c 2b 31 29 3b 0a 20 20 20  mt, iCol+1);.   
28290 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b       sqlite3_tok
282a0 65 6e 69 7a 65 72 5f 63 75 72 73 6f 72 20 2a 70  enizer_cursor *p
282b0 54 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20  T = 0;..        
282c0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
282d0 4f 70 65 6e 54 6f 6b 65 6e 69 7a 65 72 28 70 2d  OpenTokenizer(p-
282e0 3e 70 54 6f 6b 65 6e 69 7a 65 72 2c 20 69 4c 61  >pTokenizer, iLa
282f0 6e 67 2c 20 7a 54 65 78 74 2c 20 6e 54 65 78 74  ng, zText, nText
28300 2c 20 26 70 54 29 3b 0a 20 20 20 20 20 20 20 20  , &pT);.        
28310 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
28320 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
28330 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54    char const *zT
28340 6f 6b 65 6e 3b 20 20 20 20 20 20 20 2f 2a 20 42  oken;       /* B
28350 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
28360 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20   token */.      
28370 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 20      int nToken; 
28380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28390 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
283a0 20 69 6e 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20   in token */.   
283b0 20 20 20 20 20 20 20 69 6e 74 20 69 44 75 6d 31         int iDum1
283c0 2c 20 69 44 75 6d 32 3b 20 20 20 20 20 20 20 20  , iDum2;        
283d0 20 2f 2a 20 44 75 6d 6d 79 20 76 61 72 69 61 62   /* Dummy variab
283e0 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  les */.         
283f0 20 69 6e 74 20 69 50 6f 73 3b 20 20 20 20 20 20   int iPos;      
28400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
28410 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20  sition of token 
28420 69 6e 20 7a 54 65 78 74 20 2a 2f 0a 0a 20 20 20  in zText */..   
28430 20 20 20 20 20 20 20 72 63 20 3d 20 70 4d 6f 64         rc = pMod
28440 75 6c 65 2d 3e 78 4e 65 78 74 28 70 54 2c 20 26  ule->xNext(pT, &
28450 7a 54 6f 6b 65 6e 2c 20 26 6e 54 6f 6b 65 6e 2c  zToken, &nToken,
28460 20 26 69 44 75 6d 31 2c 20 26 69 44 75 6d 32 2c   &iDum1, &iDum2,
28470 20 26 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20   &iPos);.       
28480 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
28490 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
284a0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
284b0 20 20 20 20 20 20 20 63 6b 73 75 6d 32 20 3d 20         cksum2 = 
284c0 63 6b 73 75 6d 32 20 5e 20 66 74 73 33 43 68 65  cksum2 ^ fts3Che
284d0 63 6b 73 75 6d 45 6e 74 72 79 28 0a 20 20 20 20  cksumEntry(.    
284e0 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 6b              zTok
284f0 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 69 4c 61 6e  en, nToken, iLan
28500 67 2c 20 30 2c 20 69 44 6f 63 69 64 2c 20 69 43  g, 0, iDocid, iC
28510 6f 6c 2c 20 69 50 6f 73 0a 20 20 20 20 20 20 20  ol, iPos.       
28520 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
28530 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70      for(i=1; i<p
28540 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a  ->nIndex; i++){.
28550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
28560 28 20 70 2d 3e 61 49 6e 64 65 78 5b 69 5d 2e 6e  ( p->aIndex[i].n
28570 50 72 65 66 69 78 3c 3d 6e 54 6f 6b 65 6e 20 29  Prefix<=nToken )
28580 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
28590 20 20 63 6b 73 75 6d 32 20 3d 20 63 6b 73 75 6d    cksum2 = cksum
285a0 32 20 5e 20 66 74 73 33 43 68 65 63 6b 73 75 6d  2 ^ fts3Checksum
285b0 45 6e 74 72 79 28 0a 20 20 20 20 20 20 20 20 20  Entry(.         
285c0 20 20 20 20 20 20 20 20 20 7a 54 6f 6b 65 6e 2c           zToken,
285d0 20 70 2d 3e 61 49 6e 64 65 78 5b 69 5d 2e 6e 50   p->aIndex[i].nP
285e0 72 65 66 69 78 2c 20 69 4c 61 6e 67 2c 20 69 2c  refix, iLang, i,
285f0 20 69 44 6f 63 69 64 2c 20 69 43 6f 6c 2c 20 69   iDocid, iCol, i
28600 50 6f 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  Pos.            
28610 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
28620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
28630 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
28640 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28650 20 20 20 69 66 28 20 70 54 20 29 20 70 4d 6f 64     if( pT ) pMod
28660 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 54 29 3b  ule->xClose(pT);
28670 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
28680 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72  =SQLITE_DONE ) r
28690 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
286a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
286b0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
286c0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 0a  ze(pStmt);.  }..
286d0 20 20 2a 70 62 4f 6b 20 3d 20 28 63 6b 73 75 6d    *pbOk = (cksum
286e0 31 3d 3d 63 6b 73 75 6d 32 29 3b 0a 20 20 72 65  1==cksum2);.  re
286f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
28700 2a 20 52 75 6e 20 74 68 65 20 69 6e 74 65 67 72  * Run the integr
28710 69 74 79 2d 63 68 65 63 6b 2e 20 49 66 20 6e 6f  ity-check. If no
28720 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e   error occurs an
28730 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  d the current co
28740 6e 74 65 6e 74 73 20 6f 66 0a 2a 2a 20 74 68 65  ntents of.** the
28750 20 46 54 53 20 69 6e 64 65 78 20 61 72 65 20 63   FTS index are c
28760 6f 72 72 65 63 74 2c 20 72 65 74 75 72 6e 20 53  orrect, return S
28770 51 4c 49 54 45 5f 4f 4b 2e 20 4f 72 2c 20 69 66  QLITE_OK. Or, if
28780 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
28790 20 74 68 65 0a 2a 2a 20 46 54 53 20 69 6e 64 65   the.** FTS inde
287a0 78 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 2c  x are incorrect,
287b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
287c0 4f 52 52 55 50 54 5f 56 54 41 42 2e 0a 2a 2a 0a  ORRUPT_VTAB..**.
287d0 2a 2a 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72  ** Or, if an err
287e0 6f 72 20 28 65 2e 67 2e 20 61 6e 20 4f 4f 4d 20  or (e.g. an OOM 
287f0 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 6f 63 63  or IO error) occ
28800 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 53  urs, return an S
28810 51 4c 69 74 65 20 0a 2a 2a 20 65 72 72 6f 72 20  QLite .** error 
28820 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  code..**.** The 
28830 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20  integrity-check 
28840 77 6f 72 6b 73 20 61 73 20 66 6f 6c 6c 6f 77 73  works as follows
28850 2e 20 46 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e  . For each token
28860 20 61 6e 64 20 69 6e 64 65 78 65 64 20 74 6f 6b   and indexed tok
28870 65 6e 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e 20  en.** prefix in 
28880 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 73 65 74  the document set
28890 2c 20 61 20 36 34 2d 62 69 74 20 63 68 65 63 6b  , a 64-bit check
288a0 73 75 6d 20 69 73 20 63 61 6c 63 75 6c 61 74 65  sum is calculate
288b0 64 20 28 62 79 20 63 6f 64 65 0a 2a 2a 20 69 6e  d (by code.** in
288c0 20 66 74 73 33 43 68 65 63 6b 73 75 6d 45 6e 74   fts3ChecksumEnt
288d0 72 79 28 29 29 20 62 61 73 65 64 20 6f 6e 20 74  ry()) based on t
288e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
288f0 0a 2a 2a 20 20 20 20 20 2b 20 54 68 65 20 69 6e  .**     + The in
28900 64 65 78 20 6e 75 6d 62 65 72 20 28 30 20 66 6f  dex number (0 fo
28910 72 20 74 68 65 20 6d 61 69 6e 20 69 6e 64 65 78  r the main index
28920 2c 20 31 20 66 6f 72 20 74 68 65 20 66 69 72 73  , 1 for the firs
28930 74 20 70 72 65 66 69 78 0a 2a 2a 20 20 20 20 20  t prefix.**     
28940 20 20 69 6e 64 65 78 20 65 74 63 2e 29 2c 0a 2a    index etc.),.*
28950 2a 20 20 20 20 20 2b 20 54 68 65 20 74 6f 6b 65  *     + The toke
28960 6e 20 28 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66  n (or token pref
28970 69 78 29 20 74 65 78 74 20 69 74 73 65 6c 66 2c  ix) text itself,
28980 20 0a 2a 2a 20 20 20 20 20 2b 20 54 68 65 20 6c   .**     + The l
28990 61 6e 67 75 61 67 65 2d 69 64 20 6f 66 20 74 68  anguage-id of th
289a0 65 20 72 6f 77 20 69 74 20 61 70 70 65 61 72 73  e row it appears
289b0 20 69 6e 2c 0a 2a 2a 20 20 20 20 20 2b 20 54 68   in,.**     + Th
289c0 65 20 64 6f 63 69 64 20 6f 66 20 74 68 65 20 72  e docid of the r
289d0 6f 77 20 69 74 20 61 70 70 65 61 72 73 20 69 6e  ow it appears in
289e0 2c 0a 2a 2a 20 20 20 20 20 2b 20 54 68 65 20 63  ,.**     + The c
289f0 6f 6c 75 6d 6e 20 69 74 20 61 70 70 65 61 72 73  olumn it appears
28a00 20 69 6e 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20   in, and.**     
28a10 2b 20 54 68 65 20 74 6f 6b 65 6e 73 20 70 6f 73  + The tokens pos
28a20 69 74 69 6f 6e 20 77 69 74 68 69 6e 20 74 68 61  ition within tha
28a30 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20  t column..**.** 
28a40 54 68 65 20 63 68 65 63 6b 73 75 6d 73 20 66 6f  The checksums fo
28a50 72 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  r all entries in
28a60 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20 58   the index are X
28a70 4f 52 65 64 20 74 6f 67 65 74 68 65 72 20 74 6f  ORed together to
28a80 20 63 72 65 61 74 65 0a 2a 2a 20 61 20 73 69 6e   create.** a sin
28a90 67 6c 65 20 63 68 65 63 6b 73 75 6d 20 66 6f 72  gle checksum for
28aa0 20 74 68 65 20 65 6e 74 69 72 65 20 69 6e 64 65   the entire inde
28ab0 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74  x..**.** The int
28ac0 65 67 72 69 74 79 2d 63 68 65 63 6b 20 63 6f 64  egrity-check cod
28ad0 65 20 63 61 6c 63 75 6c 61 74 65 73 20 74 68 65  e calculates the
28ae0 20 73 61 6d 65 20 63 68 65 63 6b 73 75 6d 20 69   same checksum i
28af0 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a 2a 0a 2a  n two ways:.**.*
28b00 2a 20 20 20 20 20 31 2e 20 42 79 20 73 63 61 6e  *     1. By scan
28b10 6e 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ning the content
28b20 73 20 6f 66 20 74 68 65 20 46 54 53 20 69 6e 64  s of the FTS ind
28b30 65 78 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20  ex, and .**     
28b40 32 2e 20 42 79 20 73 63 61 6e 6e 69 6e 67 20 61  2. By scanning a
28b50 6e 64 20 74 6f 6b 65 6e 69 7a 69 6e 67 20 74 68  nd tokenizing th
28b60 65 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e  e content table.
28b70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 77  .**.** If the tw
28b80 6f 20 63 68 65 63 6b 73 75 6d 73 20 61 72 65 20  o checksums are 
28b90 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 20 69  identical, the i
28ba0 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 69  ntegrity-check i
28bb0 73 20 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65  s deemed to have
28bc0 0a 2a 2a 20 70 61 73 73 65 64 2e 0a 2a 2f 0a 73  .** passed..*/.s
28bd0 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 44 6f  tatic int fts3Do
28be0 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 0a  IntegrityCheck(.
28bf0 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20 20    Fts3Table *p  
28c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c10 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20    /* FTS3 table 
28c20 68 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  handle */.){.  i
28c30 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 4f 6b  nt rc;.  int bOk
28c40 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 66 74 73   = 0;.  rc = fts
28c50 33 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28  3IntegrityCheck(
28c60 70 2c 20 26 62 4f 6b 29 3b 0a 20 20 69 66 28 20  p, &bOk);.  if( 
28c70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
28c80 20 62 4f 6b 3d 3d 30 20 29 20 72 63 20 3d 20 53   bOk==0 ) rc = S
28c90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54  QLITE_CORRUPT_VT
28ca0 41 42 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  AB;.  return rc;
28cb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65  .}../*.** Handle
28cc0 20 61 20 27 73 70 65 63 69 61 6c 27 20 49 4e 53   a 'special' INS
28cd0 45 52 54 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  ERT of the form:
28ce0 0a 2a 2a 0a 2a 2a 20 20 20 22 49 4e 53 45 52 54  .**.**   "INSERT
28cf0 20 49 4e 54 4f 20 74 62 6c 28 74 62 6c 29 20 56   INTO tbl(tbl) V
28d00 41 4c 55 45 53 28 3c 65 78 70 72 3e 29 22 0a 2a  ALUES(<expr>)".*
28d10 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 56  *.** Argument pV
28d20 61 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  al contains the 
28d30 72 65 73 75 6c 74 20 6f 66 20 3c 65 78 70 72 3e  result of <expr>
28d40 2e 20 43 75 72 72 65 6e 74 6c 79 20 74 68 65 20  . Currently the 
28d50 6f 6e 6c 79 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67  only .** meaning
28d60 66 75 6c 20 76 61 6c 75 65 20 74 6f 20 69 6e 73  ful value to ins
28d70 65 72 74 20 69 73 20 74 68 65 20 74 65 78 74 20  ert is the text 
28d80 27 6f 70 74 69 6d 69 7a 65 27 2e 0a 2a 2f 0a 73  'optimize'..*/.s
28d90 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 70  tatic int fts3Sp
28da0 65 63 69 61 6c 49 6e 73 65 72 74 28 46 74 73 33  ecialInsert(Fts3
28db0 54 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74 65  Table *p, sqlite
28dc0 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 29 7b 0a  3_value *pVal){.
28dd0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
28de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28df0 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
28e00 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
28e10 20 2a 7a 56 61 6c 20 3d 20 28 63 6f 6e 73 74 20   *zVal = (const 
28e20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76  char *)sqlite3_v
28e30 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 3b  alue_text(pVal);
28e40 0a 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71  .  int nVal = sq
28e50 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
28e60 73 28 70 56 61 6c 29 3b 0a 0a 20 20 69 66 28 20  s(pVal);..  if( 
28e70 21 7a 56 61 6c 20 29 7b 0a 20 20 20 20 72 65 74  !zVal ){.    ret
28e80 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
28e90 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56  ;.  }else if( nV
28ea0 61 6c 3d 3d 38 20 26 26 20 30 3d 3d 73 71 6c 69  al==8 && 0==sqli
28eb0 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61  te3_strnicmp(zVa
28ec0 6c 2c 20 22 6f 70 74 69 6d 69 7a 65 22 2c 20 38  l, "optimize", 8
28ed0 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  ) ){.    rc = ft
28ee0 73 33 44 6f 4f 70 74 69 6d 69 7a 65 28 70 2c 20  s3DoOptimize(p, 
28ef0 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  0);.  }else if( 
28f00 6e 56 61 6c 3d 3d 37 20 26 26 20 30 3d 3d 73 71  nVal==7 && 0==sq
28f10 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a  lite3_strnicmp(z
28f20 56 61 6c 2c 20 22 72 65 62 75 69 6c 64 22 2c 20  Val, "rebuild", 
28f30 37 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  7) ){.    rc = f
28f40 74 73 33 44 6f 52 65 62 75 69 6c 64 28 70 29 3b  ts3DoRebuild(p);
28f50 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 61  .  }else if( nVa
28f60 6c 3d 3d 31 35 20 26 26 20 30 3d 3d 73 71 6c 69  l==15 && 0==sqli
28f70 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61  te3_strnicmp(zVa
28f80 6c 2c 20 22 69 6e 74 65 67 72 69 74 79 2d 63 68  l, "integrity-ch
28f90 65 63 6b 22 2c 20 31 35 29 20 29 7b 0a 20 20 20  eck", 15) ){.   
28fa0 20 72 63 20 3d 20 66 74 73 33 44 6f 49 6e 74 65   rc = fts3DoInte
28fb0 67 72 69 74 79 43 68 65 63 6b 28 70 29 3b 0a 20  grityCheck(p);. 
28fc0 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 61 6c 3e   }else if( nVal>
28fd0 36 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f  6 && 0==sqlite3_
28fe0 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22  strnicmp(zVal, "
28ff0 6d 65 72 67 65 3d 22 2c 20 36 29 20 29 7b 0a 20  merge=", 6) ){. 
29000 20 20 20 72 63 20 3d 20 66 74 73 33 44 6f 49 6e     rc = fts3DoIn
29010 63 72 6d 65 72 67 65 28 70 2c 20 26 7a 56 61 6c  crmerge(p, &zVal
29020 5b 36 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  [6]);.  }else if
29030 28 20 6e 56 61 6c 3e 31 30 20 26 26 20 30 3d 3d  ( nVal>10 && 0==
29040 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
29050 28 7a 56 61 6c 2c 20 22 61 75 74 6f 6d 65 72 67  (zVal, "automerg
29060 65 3d 22 2c 20 31 30 29 20 29 7b 0a 20 20 20 20  e=", 10) ){.    
29070 72 63 20 3d 20 66 74 73 33 44 6f 41 75 74 6f 69  rc = fts3DoAutoi
29080 6e 63 72 6d 65 72 67 65 28 70 2c 20 26 7a 56 61  ncrmerge(p, &zVa
29090 6c 5b 31 30 5d 29 3b 0a 23 69 66 64 65 66 20 53  l[10]);.#ifdef S
290a0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7d 65 6c  QLITE_TEST.  }el
290b0 73 65 20 69 66 28 20 6e 56 61 6c 3e 39 20 26 26  se if( nVal>9 &&
290c0 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e   0==sqlite3_strn
290d0 69 63 6d 70 28 7a 56 61 6c 2c 20 22 6e 6f 64 65  icmp(zVal, "node
290e0 73 69 7a 65 3d 22 2c 20 39 29 20 29 7b 0a 20 20  size=", 9) ){.  
290f0 20 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 3d    p->nNodeSize =
29100 20 61 74 6f 69 28 26 7a 56 61 6c 5b 39 5d 29 3b   atoi(&zVal[9]);
29110 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
29120 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _OK;.  }else if(
29130 20 6e 56 61 6c 3e 31 31 20 26 26 20 30 3d 3d 73   nVal>11 && 0==s
29140 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
29150 7a 56 61 6c 2c 20 22 6d 61 78 70 65 6e 64 69 6e  zVal, "maxpendin
29160 67 3d 22 2c 20 39 29 20 29 7b 0a 20 20 20 20 70  g=", 9) ){.    p
29170 2d 3e 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61 74  ->nMaxPendingDat
29180 61 20 3d 20 61 74 6f 69 28 26 7a 56 61 6c 5b 31  a = atoi(&zVal[1
29190 31 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  1]);.    rc = SQ
291a0 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
291b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
291c0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
291d0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
291e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
291f0 65 20 61 6c 6c 20 63 61 63 68 65 64 20 64 65 66  e all cached def
29200 65 72 72 65 64 20 64 6f 63 6c 69 73 74 73 2e 20  erred doclists. 
29210 44 65 66 65 72 72 65 64 20 64 6f 63 6c 69 73 74  Deferred doclist
29220 73 20 61 72 65 20 63 61 63 68 65 64 0a 2a 2a 20  s are cached.** 
29230 28 61 6c 6c 6f 63 61 74 65 64 29 20 62 79 20 74  (allocated) by t
29240 68 65 20 73 71 6c 69 74 65 33 46 74 73 33 43 61  he sqlite3Fts3Ca
29250 63 68 65 44 65 66 65 72 72 65 64 44 6f 63 6c 69  cheDeferredDocli
29260 73 74 73 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  sts() function..
29270 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
29280 74 73 33 46 72 65 65 44 65 66 65 72 72 65 64 44  ts3FreeDeferredD
29290 6f 63 6c 69 73 74 73 28 46 74 73 33 43 75 72 73  oclists(Fts3Curs
292a0 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 46 74 73  or *pCsr){.  Fts
292b0 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a  3DeferredToken *
292c0 70 44 65 66 3b 0a 20 20 66 6f 72 28 70 44 65 66  pDef;.  for(pDef
292d0 3d 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64  =pCsr->pDeferred
292e0 3b 20 70 44 65 66 3b 20 70 44 65 66 3d 70 44 65  ; pDef; pDef=pDe
292f0 66 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 66  f->pNext){.    f
29300 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 44 65  ts3PendingListDe
29310 6c 65 74 65 28 70 44 65 66 2d 3e 70 4c 69 73 74  lete(pDef->pList
29320 29 3b 0a 20 20 20 20 70 44 65 66 2d 3e 70 4c 69  );.    pDef->pLi
29330 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  st = 0;.  }.}../
29340 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 65 6e  *.** Free all en
29350 74 72 69 65 73 20 69 6e 20 74 68 65 20 70 43 73  tries in the pCs
29360 72 2d 3e 70 44 65 66 66 65 72 65 64 20 6c 69 73  r->pDeffered lis
29370 74 2e 20 45 6e 74 72 69 65 73 20 61 72 65 20 61  t. Entries are a
29380 64 64 65 64 20 74 6f 20 0a 2a 2a 20 74 68 69 73  dded to .** this
29390 20 6c 69 73 74 20 75 73 69 6e 67 20 73 71 6c 69   list using sqli
293a0 74 65 33 46 74 73 33 44 65 66 65 72 54 6f 6b 65  te3Fts3DeferToke
293b0 6e 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  n()..*/.void sql
293c0 69 74 65 33 46 74 73 33 46 72 65 65 44 65 66 65  ite3Fts3FreeDefe
293d0 72 72 65 64 54 6f 6b 65 6e 73 28 46 74 73 33 43  rredTokens(Fts3C
293e0 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20  ursor *pCsr){.  
293f0 46 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65  Fts3DeferredToke
29400 6e 20 2a 70 44 65 66 3b 0a 20 20 46 74 73 33 44  n *pDef;.  Fts3D
29410 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70 4e  eferredToken *pN
29420 65 78 74 3b 0a 20 20 66 6f 72 28 70 44 65 66 3d  ext;.  for(pDef=
29430 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64 3b  pCsr->pDeferred;
29440 20 70 44 65 66 3b 20 70 44 65 66 3d 70 4e 65 78   pDef; pDef=pNex
29450 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
29460 70 44 65 66 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pDef->pNext;.   
29470 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74   fts3PendingList
29480 44 65 6c 65 74 65 28 70 44 65 66 2d 3e 70 4c 69  Delete(pDef->pLi
29490 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
294a0 5f 66 72 65 65 28 70 44 65 66 29 3b 0a 20 20 7d  _free(pDef);.  }
294b0 0a 20 20 70 43 73 72 2d 3e 70 44 65 66 65 72 72  .  pCsr->pDeferr
294c0 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ed = 0;.}../*.**
294d0 20 47 65 6e 65 72 61 74 65 20 64 65 66 65 72 72   Generate deferr
294e0 65 64 2d 64 6f 63 6c 69 73 74 73 20 66 6f 72 20  ed-doclists for 
294f0 61 6c 6c 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68  all tokens in th
29500 65 20 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65  e pCsr->pDeferre
29510 64 20 6c 69 73 74 0a 2a 2a 20 62 61 73 65 64 20  d list.** based 
29520 6f 6e 20 74 68 65 20 72 6f 77 20 74 68 61 74 20  on the row that 
29530 70 43 73 72 20 63 75 72 72 65 6e 74 6c 79 20 70  pCsr currently p
29540 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20  oints to..**.** 
29550 41 20 64 65 66 65 72 72 65 64 2d 64 6f 63 6c 69  A deferred-docli
29560 73 74 20 69 73 20 6c 69 6b 65 20 61 6e 79 20 6f  st is like any o
29570 74 68 65 72 20 64 6f 63 6c 69 73 74 20 77 69 74  ther doclist wit
29580 68 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 72  h position infor
29590 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 63 6c 75 64  mation.** includ
295a0 65 64 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  ed, except that 
295b0 69 74 20 6f 6e 6c 79 20 63 6f 6e 74 61 69 6e 73  it only contains
295c0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 20 73   entries for a s
295d0 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
295e0 0a 2a 2a 20 74 61 62 6c 65 2c 20 6e 6f 74 20 66  .** table, not f
295f0 6f 72 20 61 6c 6c 20 72 6f 77 73 2e 0a 2a 2f 0a  or all rows..*/.
29600 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 43  int sqlite3Fts3C
29610 61 63 68 65 44 65 66 65 72 72 65 64 44 6f 63 6c  acheDeferredDocl
29620 69 73 74 73 28 46 74 73 33 43 75 72 73 6f 72 20  ists(Fts3Cursor 
29630 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCsr){.  int rc
29640 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
29650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
29660 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 66  urn code */.  if
29670 28 20 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65  ( pCsr->pDeferre
29680 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20  d ){.    int i; 
29690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
296a0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
296b0 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
296c0 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  h table columns 
296d0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  */.    sqlite3_i
296e0 6e 74 36 34 20 69 44 6f 63 69 64 3b 20 20 20 20  nt64 iDocid;    
296f0 20 20 20 20 20 2f 2a 20 44 6f 63 69 64 20 6f 66       /* Docid of
29700 20 74 68 65 20 72 6f 77 20 70 43 73 72 20 70 6f   the row pCsr po
29710 69 6e 74 73 20 74 6f 20 2a 2f 0a 20 20 20 20 46  ints to */.    F
29720 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e  ts3DeferredToken
29730 20 2a 70 44 65 66 3b 20 20 20 20 20 20 2f 2a 20   *pDef;      /* 
29740 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
29750 74 68 72 6f 75 67 68 20 64 65 66 65 72 72 65 64  through deferred
29760 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20 0a 20 20   tokens */.  .  
29770 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20 3d    Fts3Table *p =
29780 20 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43   (Fts3Table *)pC
29790 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a  sr->base.pVtab;.
297a0 20 20 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65      sqlite3_toke
297b0 6e 69 7a 65 72 20 2a 70 54 20 3d 20 70 2d 3e 70  nizer *pT = p->p
297c0 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 20 20 73  Tokenizer;.    s
297d0 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
297e0 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73 74 20 2a 70  _module const *p
297f0 4d 6f 64 75 6c 65 20 3d 20 70 54 2d 3e 70 4d 6f  Module = pT->pMo
29800 64 75 6c 65 3b 0a 20 20 20 0a 20 20 20 20 61 73  dule;.   .    as
29810 73 65 72 74 28 20 70 43 73 72 2d 3e 69 73 52 65  sert( pCsr->isRe
29820 71 75 69 72 65 53 65 65 6b 3d 3d 30 20 29 3b 0a  quireSeek==0 );.
29830 20 20 20 20 69 44 6f 63 69 64 20 3d 20 73 71 6c      iDocid = sql
29840 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
29850 34 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20 30  4(pCsr->pStmt, 0
29860 29 3b 0a 20 20 0a 20 20 20 20 66 6f 72 28 69 3d  );.  .    for(i=
29870 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 20  0; i<p->nColumn 
29880 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
29890 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; i++){.      co
298a0 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 20  nst char *zText 
298b0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
298c0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
298d0 65 78 74 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c  ext(pCsr->pStmt,
298e0 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c   i+1);.      sql
298f0 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 63  ite3_tokenizer_c
29900 75 72 73 6f 72 20 2a 70 54 43 20 3d 20 30 3b 0a  ursor *pTC = 0;.
29910 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71    .      rc = sq
29920 6c 69 74 65 33 46 74 73 33 4f 70 65 6e 54 6f 6b  lite3Fts3OpenTok
29930 65 6e 69 7a 65 72 28 70 54 2c 20 70 43 73 72 2d  enizer(pT, pCsr-
29940 3e 69 4c 61 6e 67 69 64 2c 20 7a 54 65 78 74 2c  >iLangid, zText,
29950 20 2d 31 2c 20 26 70 54 43 29 3b 0a 20 20 20 20   -1, &pTC);.    
29960 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
29970 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29980 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54    char const *zT
29990 6f 6b 65 6e 3b 20 20 20 20 20 20 20 2f 2a 20 42  oken;       /* B
299a0 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
299b0 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20   token */.      
299c0 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 20 20 20    int nToken;   
299d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
299e0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
299f0 6e 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 20  n token */.     
29a00 20 20 20 69 6e 74 20 69 44 75 6d 31 2c 20 69 44     int iDum1, iD
29a10 75 6d 32 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  um2;         /* 
29a20 44 75 6d 6d 79 20 76 61 72 69 61 62 6c 65 73 20  Dummy variables 
29a30 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
29a40 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  Pos;            
29a50 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
29a60 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20 7a 54 65   of token in zTe
29a70 78 74 20 2a 2f 0a 20 20 0a 20 20 20 20 20 20 20  xt */.  .       
29a80 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78   rc = pModule->x
29a90 4e 65 78 74 28 70 54 43 2c 20 26 7a 54 6f 6b 65  Next(pTC, &zToke
29aa0 6e 2c 20 26 6e 54 6f 6b 65 6e 2c 20 26 69 44 75  n, &nToken, &iDu
29ab0 6d 31 2c 20 26 69 44 75 6d 32 2c 20 26 69 50 6f  m1, &iDum2, &iPo
29ac0 73 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  s);.        for(
29ad0 70 44 65 66 3d 70 43 73 72 2d 3e 70 44 65 66 65  pDef=pCsr->pDefe
29ae0 72 72 65 64 3b 20 70 44 65 66 20 26 26 20 72 63  rred; pDef && rc
29af0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 44 65  ==SQLITE_OK; pDe
29b00 66 3d 70 44 65 66 2d 3e 70 4e 65 78 74 29 7b 0a  f=pDef->pNext){.
29b10 20 20 20 20 20 20 20 20 20 20 46 74 73 33 50 68            Fts3Ph
29b20 72 61 73 65 54 6f 6b 65 6e 20 2a 70 50 54 20 3d  raseToken *pPT =
29b30 20 70 44 65 66 2d 3e 70 54 6f 6b 65 6e 3b 0a 20   pDef->pToken;. 
29b40 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44           if( (pD
29b50 65 66 2d 3e 69 43 6f 6c 3e 3d 70 2d 3e 6e 43 6f  ef->iCol>=p->nCo
29b60 6c 75 6d 6e 20 7c 7c 20 70 44 65 66 2d 3e 69 43  lumn || pDef->iC
29b70 6f 6c 3d 3d 69 29 0a 20 20 20 20 20 20 20 20 20  ol==i).         
29b80 20 20 26 26 20 28 70 50 54 2d 3e 62 46 69 72 73    && (pPT->bFirs
29b90 74 3d 3d 30 20 7c 7c 20 69 50 6f 73 3d 3d 30 29  t==0 || iPos==0)
29ba0 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
29bb0 70 50 54 2d 3e 6e 3d 3d 6e 54 6f 6b 65 6e 20 7c  pPT->n==nToken |
29bc0 7c 20 28 70 50 54 2d 3e 69 73 50 72 65 66 69 78  | (pPT->isPrefix
29bd0 20 26 26 20 70 50 54 2d 3e 6e 3c 6e 54 6f 6b 65   && pPT->n<nToke
29be0 6e 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 26  n)).           &
29bf0 26 20 28 30 3d 3d 6d 65 6d 63 6d 70 28 7a 54 6f  & (0==memcmp(zTo
29c00 6b 65 6e 2c 20 70 50 54 2d 3e 7a 2c 20 70 50 54  ken, pPT->z, pPT
29c10 2d 3e 6e 29 29 0a 20 20 20 20 20 20 20 20 20 20  ->n)).          
29c20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
29c30 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70  ts3PendingListAp
29c40 70 65 6e 64 28 26 70 44 65 66 2d 3e 70 4c 69 73  pend(&pDef->pLis
29c50 74 2c 20 69 44 6f 63 69 64 2c 20 69 2c 20 69 50  t, iDocid, i, iP
29c60 6f 73 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  os, &rc);.      
29c70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
29c80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
29c90 28 20 70 54 43 20 29 20 70 4d 6f 64 75 6c 65 2d  ( pTC ) pModule-
29ca0 3e 78 43 6c 6f 73 65 28 70 54 43 29 3b 0a 20 20  >xClose(pTC);.  
29cb0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
29cc0 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53  TE_DONE ) rc = S
29cd0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
29ce0 20 20 0a 20 20 20 20 66 6f 72 28 70 44 65 66 3d    .    for(pDef=
29cf0 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64 3b  pCsr->pDeferred;
29d00 20 70 44 65 66 20 26 26 20 72 63 3d 3d 53 51 4c   pDef && rc==SQL
29d10 49 54 45 5f 4f 4b 3b 20 70 44 65 66 3d 70 44 65  ITE_OK; pDef=pDe
29d20 66 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  f->pNext){.     
29d30 20 69 66 28 20 70 44 65 66 2d 3e 70 4c 69 73 74   if( pDef->pList
29d40 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
29d50 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74   fts3PendingList
29d60 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 44  AppendVarint(&pD
29d70 65 66 2d 3e 70 4c 69 73 74 2c 20 30 29 3b 0a 20  ef->pList, 0);. 
29d80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
29d90 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
29da0 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
29db0 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 4c 69  3DeferredTokenLi
29dc0 73 74 28 0a 20 20 46 74 73 33 44 65 66 65 72 72  st(.  Fts3Deferr
29dd0 65 64 54 6f 6b 65 6e 20 2a 70 2c 20 0a 20 20 63  edToken *p, .  c
29de0 68 61 72 20 2a 2a 70 70 44 61 74 61 2c 20 0a 20  har **ppData, . 
29df0 20 69 6e 74 20 2a 70 6e 44 61 74 61 0a 29 7b 0a   int *pnData.){.
29e00 20 20 63 68 61 72 20 2a 70 52 65 74 3b 0a 20 20    char *pRet;.  
29e10 69 6e 74 20 6e 53 6b 69 70 3b 0a 20 20 73 71 6c  int nSkip;.  sql
29e20 69 74 65 33 5f 69 6e 74 36 34 20 64 75 6d 6d 79  ite3_int64 dummy
29e30 3b 0a 0a 20 20 2a 70 70 44 61 74 61 20 3d 20 30  ;..  *ppData = 0
29e40 3b 0a 20 20 2a 70 6e 44 61 74 61 20 3d 20 30 3b  ;.  *pnData = 0;
29e50 0a 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 73 74  ..  if( p->pList
29e60 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
29e70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
29e80 0a 0a 20 20 70 52 65 74 20 3d 20 28 63 68 61 72  ..  pRet = (char
29e90 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
29ea0 63 28 70 2d 3e 70 4c 69 73 74 2d 3e 6e 44 61 74  c(p->pList->nDat
29eb0 61 29 3b 0a 20 20 69 66 28 20 21 70 52 65 74 20  a);.  if( !pRet 
29ec0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
29ed0 4e 4f 4d 45 4d 3b 0a 0a 20 20 6e 53 6b 69 70 20  NOMEM;..  nSkip 
29ee0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74  = sqlite3Fts3Get
29ef0 56 61 72 69 6e 74 28 70 2d 3e 70 4c 69 73 74 2d  Varint(p->pList-
29f00 3e 61 44 61 74 61 2c 20 26 64 75 6d 6d 79 29 3b  >aData, &dummy);
29f10 0a 20 20 2a 70 6e 44 61 74 61 20 3d 20 70 2d 3e  .  *pnData = p->
29f20 70 4c 69 73 74 2d 3e 6e 44 61 74 61 20 2d 20 6e  pList->nData - n
29f30 53 6b 69 70 3b 0a 20 20 2a 70 70 44 61 74 61 20  Skip;.  *ppData 
29f40 3d 20 70 52 65 74 3b 0a 20 20 0a 20 20 6d 65 6d  = pRet;.  .  mem
29f50 63 70 79 28 70 52 65 74 2c 20 26 70 2d 3e 70 4c  cpy(pRet, &p->pL
29f60 69 73 74 2d 3e 61 44 61 74 61 5b 6e 53 6b 69 70  ist->aData[nSkip
29f70 5d 2c 20 2a 70 6e 44 61 74 61 29 3b 0a 20 20 72  ], *pnData);.  r
29f80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
29f90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
29fa0 20 65 6e 74 72 79 20 66 6f 72 20 74 6f 6b 65 6e   entry for token
29fb0 20 70 54 6f 6b 65 6e 20 74 6f 20 74 68 65 20 70   pToken to the p
29fc0 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64 20 6c  Csr->pDeferred l
29fd0 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ist..*/.int sqli
29fe0 74 65 33 46 74 73 33 44 65 66 65 72 54 6f 6b 65  te3Fts3DeferToke
29ff0 6e 28 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20  n(.  Fts3Cursor 
2a000 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20 20  *pCsr,          
2a010 20 20 20 20 20 2f 2a 20 46 74 73 33 20 74 61 62       /* Fts3 tab
2a020 6c 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 46  le cursor */.  F
2a030 74 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a  ts3PhraseToken *
2a040 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 2f  pToken,        /
2a050 2a 20 54 6f 6b 65 6e 20 74 6f 20 64 65 66 65 72  * Token to defer
2a060 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20   */.  int iCol  
2a070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a080 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
2a090 74 68 61 74 20 74 6f 6b 65 6e 20 6d 75 73 74 20  that token must 
2a0a0 61 70 70 65 61 72 20 69 6e 20 28 6f 72 20 2d 31  appear in (or -1
2a0b0 29 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 44 65  ) */.){.  Fts3De
2a0c0 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70 44 65  ferredToken *pDe
2a0d0 66 65 72 72 65 64 3b 0a 20 20 70 44 65 66 65 72  ferred;.  pDefer
2a0e0 72 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  red = sqlite3_ma
2a0f0 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 44 65  lloc(sizeof(*pDe
2a100 66 65 72 72 65 64 29 29 3b 0a 20 20 69 66 28 20  ferred));.  if( 
2a110 21 70 44 65 66 65 72 72 65 64 20 29 7b 0a 20 20  !pDeferred ){.  
2a120 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a130 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d  NOMEM;.  }.  mem
2a140 73 65 74 28 70 44 65 66 65 72 72 65 64 2c 20 30  set(pDeferred, 0
2a150 2c 20 73 69 7a 65 6f 66 28 2a 70 44 65 66 65 72  , sizeof(*pDefer
2a160 72 65 64 29 29 3b 0a 20 20 70 44 65 66 65 72 72  red));.  pDeferr
2a170 65 64 2d 3e 70 54 6f 6b 65 6e 20 3d 20 70 54 6f  ed->pToken = pTo
2a180 6b 65 6e 3b 0a 20 20 70 44 65 66 65 72 72 65 64  ken;.  pDeferred
2a190 2d 3e 70 4e 65 78 74 20 3d 20 70 43 73 72 2d 3e  ->pNext = pCsr->
2a1a0 70 44 65 66 65 72 72 65 64 3b 20 0a 20 20 70 44  pDeferred; .  pD
2a1b0 65 66 65 72 72 65 64 2d 3e 69 43 6f 6c 20 3d 20  eferred->iCol = 
2a1c0 69 43 6f 6c 3b 0a 20 20 70 43 73 72 2d 3e 70 44  iCol;.  pCsr->pD
2a1d0 65 66 65 72 72 65 64 20 3d 20 70 44 65 66 65 72  eferred = pDefer
2a1e0 72 65 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  red;..  assert( 
2a1f0 70 54 6f 6b 65 6e 2d 3e 70 44 65 66 65 72 72 65  pToken->pDeferre
2a200 64 3d 3d 30 20 29 3b 0a 20 20 70 54 6f 6b 65 6e  d==0 );.  pToken
2a210 2d 3e 70 44 65 66 65 72 72 65 64 20 3d 20 70 44  ->pDeferred = pD
2a220 65 66 65 72 72 65 64 3b 0a 0a 20 20 72 65 74 75  eferred;..  retu
2a230 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2a240 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 76 61  ./*.** SQLite va
2a250 6c 75 65 20 70 52 6f 77 69 64 20 63 6f 6e 74 61  lue pRowid conta
2a260 69 6e 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66  ins the rowid of
2a270 20 61 20 72 6f 77 20 74 68 61 74 20 6d 61 79 20   a row that may 
2a280 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a  or may not be.**
2a290 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
2a2a0 46 54 53 33 20 74 61 62 6c 65 2e 20 49 66 20 69  FTS3 table. If i
2a2b0 74 20 69 73 2c 20 64 65 6c 65 74 65 20 69 74 20  t is, delete it 
2a2c0 61 6e 64 20 61 64 6a 75 73 74 20 74 68 65 20 63  and adjust the c
2a2d0 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 73 75  ontents.** of su
2a2e0 62 73 69 64 75 61 72 79 20 64 61 74 61 20 73 74  bsiduary data st
2a2f0 72 75 63 74 75 72 65 73 20 61 63 63 6f 72 64 69  ructures accordi
2a300 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ngly..*/.static 
2a310 69 6e 74 20 66 74 73 33 44 65 6c 65 74 65 42 79  int fts3DeleteBy
2a320 52 6f 77 69 64 28 0a 20 20 46 74 73 33 54 61 62  Rowid(.  Fts3Tab
2a330 6c 65 20 2a 70 2c 20 0a 20 20 73 71 6c 69 74 65  le *p, .  sqlite
2a340 33 5f 76 61 6c 75 65 20 2a 70 52 6f 77 69 64 2c  3_value *pRowid,
2a350 20 0a 20 20 69 6e 74 20 2a 70 6e 44 6f 63 2c 0a   .  int *pnDoc,.
2a360 20 20 75 33 32 20 2a 61 53 7a 44 65 6c 0a 29 7b    u32 *aSzDel.){
2a370 0a 20 20 69 6e 74 20 69 73 45 6d 70 74 79 20 3d  .  int isEmpty =
2a380 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 66   0;.  int rc = f
2a390 74 73 33 49 73 45 6d 70 74 79 28 70 2c 20 70 52  ts3IsEmpty(p, pR
2a3a0 6f 77 69 64 2c 20 26 69 73 45 6d 70 74 79 29 3b  owid, &isEmpty);
2a3b0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2a3c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
2a3d0 69 73 45 6d 70 74 79 20 29 7b 0a 20 20 20 20 20  isEmpty ){.     
2a3e0 20 2f 2a 20 44 65 6c 65 74 69 6e 67 20 74 68 69   /* Deleting thi
2a3f0 73 20 72 6f 77 20 6d 65 61 6e 73 20 74 68 65 20  s row means the 
2a400 77 68 6f 6c 65 20 74 61 62 6c 65 20 69 73 20 65  whole table is e
2a410 6d 70 74 79 2e 20 49 6e 20 74 68 69 73 20 63 61  mpty. In this ca
2a420 73 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 6c 65  se.      ** dele
2a430 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
2a440 6f 66 20 61 6c 6c 20 74 68 72 65 65 20 74 61 62  of all three tab
2a450 6c 65 73 20 61 6e 64 20 74 68 72 6f 77 20 61 77  les and throw aw
2a460 61 79 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20  ay any.      ** 
2a470 64 61 74 61 20 69 6e 20 74 68 65 20 70 65 6e 64  data in the pend
2a480 69 6e 67 54 65 72 6d 73 20 68 61 73 68 20 74 61  ingTerms hash ta
2a490 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 72  ble.  */.      r
2a4a0 63 20 3d 20 66 74 73 33 44 65 6c 65 74 65 41 6c  c = fts3DeleteAl
2a4b0 6c 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 2a  l(p, 1);.      *
2a4c0 70 6e 44 6f 63 20 3d 20 2a 70 6e 44 6f 63 20 2d  pnDoc = *pnDoc -
2a4d0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
2a4e0 20 20 20 20 20 66 74 73 33 44 65 6c 65 74 65 54       fts3DeleteT
2a4f0 65 72 6d 73 28 26 72 63 2c 20 70 2c 20 70 52 6f  erms(&rc, p, pRo
2a500 77 69 64 2c 20 61 53 7a 44 65 6c 29 3b 0a 20 20  wid, aSzDel);.  
2a510 20 20 20 20 69 66 28 20 70 2d 3e 7a 43 6f 6e 74      if( p->zCont
2a520 65 6e 74 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  entTbl==0 ){.   
2a530 20 20 20 20 20 66 74 73 33 53 71 6c 45 78 65 63       fts3SqlExec
2a540 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c  (&rc, p, SQL_DEL
2a550 45 54 45 5f 43 4f 4e 54 45 4e 54 2c 20 26 70 52  ETE_CONTENT, &pR
2a560 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 69  owid);.        i
2a570 66 28 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  f( sqlite3_chang
2a580 65 73 28 70 2d 3e 64 62 29 20 29 20 2a 70 6e 44  es(p->db) ) *pnD
2a590 6f 63 20 3d 20 2a 70 6e 44 6f 63 20 2d 20 31 3b  oc = *pnDoc - 1;
2a5a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2a5b0 20 20 20 20 20 20 2a 70 6e 44 6f 63 20 3d 20 2a        *pnDoc = *
2a5c0 70 6e 44 6f 63 20 2d 20 31 3b 0a 20 20 20 20 20  pnDoc - 1;.     
2a5d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
2a5e0 62 48 61 73 44 6f 63 73 69 7a 65 20 29 7b 0a 20  bHasDocsize ){. 
2a5f0 20 20 20 20 20 20 20 66 74 73 33 53 71 6c 45 78         fts3SqlEx
2a600 65 63 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44  ec(&rc, p, SQL_D
2a610 45 4c 45 54 45 5f 44 4f 43 53 49 5a 45 2c 20 26  ELETE_DOCSIZE, &
2a620 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d  pRowid);.      }
2a630 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
2a640 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2a650 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2a660 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 66 6f  does the work fo
2a670 72 20 74 68 65 20 78 55 70 64 61 74 65 20 6d 65  r the xUpdate me
2a680 74 68 6f 64 20 6f 66 20 46 54 53 33 20 76 69 72  thod of FTS3 vir
2a690 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65 73 2e 20  tual.** tables. 
2a6a0 54 68 65 20 73 63 68 65 6d 61 20 6f 66 20 74 68  The schema of th
2a6b0 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
2a6c0 62 65 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  being:.**.**    
2a6d0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 3c 74   CREATE TABLE <t
2a6e0 61 62 6c 65 20 6e 61 6d 65 3e 28 20 0a 2a 2a 20  able name>( .** 
2a6f0 20 20 20 20 20 20 3c 75 73 65 72 20 63 6f 6c 75        <user colu
2a700 6d 6e 73 3e 2c 0a 2a 2a 20 20 20 20 20 20 20 3c  mns>,.**       <
2a710 74 61 62 6c 65 20 6e 61 6d 65 3e 20 48 49 44 44  table name> HIDD
2a720 45 4e 2c 20 0a 2a 2a 20 20 20 20 20 20 20 64 6f  EN, .**       do
2a730 63 69 64 20 48 49 44 44 45 4e 2c 20 0a 2a 2a 20  cid HIDDEN, .** 
2a740 20 20 20 20 20 20 3c 6c 61 6e 67 69 64 3e 20 48        <langid> H
2a750 49 44 44 45 4e 0a 2a 2a 20 20 20 20 20 29 3b 0a  IDDEN.**     );.
2a760 2a 2a 0a 2a 2a 20 0a 2a 2f 0a 69 6e 74 20 73 71  **.** .*/.int sq
2a770 6c 69 74 65 33 46 74 73 33 55 70 64 61 74 65 4d  lite3Fts3UpdateM
2a780 65 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65 33  ethod(.  sqlite3
2a790 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20 20 20  _vtab *pVtab,   
2a7a0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33           /* FTS3
2a7b0 20 76 74 61 62 20 6f 62 6a 65 63 74 20 2a 2f 0a   vtab object */.
2a7c0 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20    int nArg,     
2a7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7e0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 67    /* Size of arg
2a7f0 75 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20  ument array */. 
2a800 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2a810 2a 61 70 56 61 6c 2c 20 20 20 20 20 20 20 20 20  *apVal,         
2a820 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67   /* Array of arg
2a830 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 71 6c 69  uments */.  sqli
2a840 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69 64  te_int64 *pRowid
2a850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2a860 55 54 3a 20 54 68 65 20 61 66 66 65 63 74 65 64  UT: The affected
2a870 20 28 6f 72 20 65 66 66 65 63 74 65 64 29 20 72   (or effected) r
2a880 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  owid */.){.  Fts
2a890 33 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73  3Table *p = (Fts
2a8a0 33 54 61 62 6c 65 20 2a 29 70 56 74 61 62 3b 0a  3Table *)pVtab;.
2a8b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2a8c0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2a8d0 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
2a8e0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 65 6d 6f   */.  int isRemo
2a8f0 76 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ve = 0;         
2a900 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2a910 72 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  r an UPDATE or D
2a920 45 4c 45 54 45 20 2a 2f 0a 20 20 75 33 32 20 2a  ELETE */.  u32 *
2a930 61 53 7a 49 6e 73 20 3d 20 30 3b 20 20 20 20 20  aSzIns = 0;     
2a940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2a950 7a 65 73 20 6f 66 20 69 6e 73 65 72 74 65 64 20  zes of inserted 
2a960 64 6f 63 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 75  documents */.  u
2a970 33 32 20 2a 61 53 7a 44 65 6c 3b 20 20 20 20 20  32 *aSzDel;     
2a980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a990 2a 20 53 69 7a 65 73 20 6f 66 20 64 65 6c 65 74  * Sizes of delet
2a9a0 65 64 20 64 6f 63 75 6d 65 6e 74 73 20 2a 2f 0a  ed documents */.
2a9b0 20 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b    int nChng = 0;
2a9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a9d0 20 20 2f 2a 20 4e 65 74 20 63 68 61 6e 67 65 20    /* Net change 
2a9e0 69 6e 20 6e 75 6d 62 65 72 20 6f 66 20 64 6f 63  in number of doc
2a9f0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  uments */.  int 
2aa00 62 49 6e 73 65 72 74 44 6f 6e 65 20 3d 20 30 3b  bInsertDone = 0;
2aa10 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
2aa20 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b 0a 20  Segments==0 );. 
2aa30 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20   assert( .      
2aa40 6e 41 72 67 3d 3d 31 20 20 20 20 20 20 20 20 20  nArg==1         
2aa50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2aa60 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73  ELETE operations
2aa70 20 2a 2f 0a 20 20 20 7c 7c 20 6e 41 72 67 3d 3d   */.   || nArg==
2aa80 28 32 20 2b 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20  (2 + p->nColumn 
2aa90 2b 20 33 29 20 20 2f 2a 20 49 4e 53 45 52 54 20  + 3)  /* INSERT 
2aaa0 6f 72 20 55 50 44 41 54 45 20 6f 70 65 72 61 74  or UPDATE operat
2aab0 69 6f 6e 73 20 2a 2f 0a 20 20 29 3b 0a 0a 20 20  ions */.  );..  
2aac0 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20 22  /* Check for a "
2aad0 73 70 65 63 69 61 6c 22 20 49 4e 53 45 52 54 20  special" INSERT 
2aae0 6f 70 65 72 61 74 69 6f 6e 2e 20 4f 6e 65 20 6f  operation. One o
2aaf0 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a  f the form:.  **
2ab00 0a 20 20 2a 2a 20 20 20 49 4e 53 45 52 54 20 49  .  **   INSERT I
2ab10 4e 54 4f 20 78 79 7a 28 78 79 7a 29 20 56 41 4c  NTO xyz(xyz) VAL
2ab20 55 45 53 28 27 63 6f 6d 6d 61 6e 64 27 29 3b 0a  UES('command');.
2ab30 20 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3e    */.  if( nArg>
2ab40 31 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  1 .   && sqlite3
2ab50 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61  _value_type(apVa
2ab60 6c 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55  l[0])==SQLITE_NU
2ab70 4c 4c 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65  LL .   && sqlite
2ab80 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56  3_value_type(apV
2ab90 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 5d  al[p->nColumn+2]
2aba0 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 0a  )!=SQLITE_NULL .
2abb0 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74    ){.    rc = ft
2abc0 73 33 53 70 65 63 69 61 6c 49 6e 73 65 72 74 28  s3SpecialInsert(
2abd0 70 2c 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c  p, apVal[p->nCol
2abe0 75 6d 6e 2b 32 5d 29 3b 0a 20 20 20 20 67 6f 74  umn+2]);.    got
2abf0 6f 20 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20 20  o update_out;.  
2ac00 7d 0a 0a 20 20 69 66 28 20 6e 41 72 67 3e 31 20  }..  if( nArg>1 
2ac10 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  && sqlite3_value
2ac20 5f 69 6e 74 28 61 70 56 61 6c 5b 32 20 2b 20 70  _int(apVal[2 + p
2ac30 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b 20 32 5d 29 3c  ->nColumn + 2])<
2ac40 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
2ac50 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
2ac60 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65  .    goto update
2ac70 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
2ac80 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 74  Allocate space t
2ac90 6f 20 68 6f 6c 64 20 74 68 65 20 63 68 61 6e 67  o hold the chang
2aca0 65 20 69 6e 20 64 6f 63 75 6d 65 6e 74 20 73 69  e in document si
2acb0 7a 65 73 20 2a 2f 0a 20 20 61 53 7a 49 6e 73 20  zes */.  aSzIns 
2acc0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
2acd0 28 20 73 69 7a 65 6f 66 28 61 53 7a 49 6e 73 5b  ( sizeof(aSzIns[
2ace0 30 5d 29 2a 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  0])*(p->nColumn+
2acf0 31 29 2a 32 20 29 3b 0a 20 20 69 66 28 20 61 53  1)*2 );.  if( aS
2ad00 7a 49 6e 73 3d 3d 30 20 29 7b 0a 20 20 20 20 72  zIns==0 ){.    r
2ad10 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2ad20 3b 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74  ;.    goto updat
2ad30 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 61 53 7a  e_out;.  }.  aSz
2ad40 44 65 6c 20 3d 20 26 61 53 7a 49 6e 73 5b 70 2d  Del = &aSzIns[p-
2ad50 3e 6e 43 6f 6c 75 6d 6e 2b 31 5d 3b 0a 20 20 6d  >nColumn+1];.  m
2ad60 65 6d 73 65 74 28 61 53 7a 49 6e 73 2c 20 30 2c  emset(aSzIns, 0,
2ad70 20 73 69 7a 65 6f 66 28 61 53 7a 49 6e 73 5b 30   sizeof(aSzIns[0
2ad80 5d 29 2a 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31  ])*(p->nColumn+1
2ad90 29 2a 32 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  )*2);..  /* If t
2ada0 68 69 73 20 69 73 20 61 6e 20 49 4e 53 45 52 54  his is an INSERT
2adb0 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 61   operation, or a
2adc0 6e 20 55 50 44 41 54 45 20 74 68 61 74 20 6d 6f  n UPDATE that mo
2add0 64 69 66 69 65 73 20 74 68 65 20 72 6f 77 69 64  difies the rowid
2ade0 0a 20 20 2a 2a 20 76 61 6c 75 65 2c 20 74 68 65  .  ** value, the
2adf0 6e 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  n this operation
2ae00 20 72 65 71 75 69 72 65 73 20 63 6f 6e 73 74 72   requires constr
2ae10 61 69 6e 74 20 68 61 6e 64 6c 69 6e 67 2e 0a 20  aint handling.. 
2ae20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
2ae30 6f 6e 2d 63 6f 6e 66 6c 69 63 74 20 6d 6f 64 65  on-conflict mode
2ae40 20 69 73 20 52 45 50 4c 41 43 45 2c 20 74 68 69   is REPLACE, thi
2ae50 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
2ae60 20 65 78 69 73 74 69 6e 67 20 72 6f 77 0a 20 20   existing row.  
2ae70 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 64 65 6c  ** should be del
2ae80 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  eted from the da
2ae90 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 69 6e  tabase before in
2aea0 73 65 72 74 69 6e 67 20 74 68 65 20 6e 65 77 20  serting the new 
2aeb0 72 6f 77 2e 20 4f 72 2c 0a 20 20 2a 2a 20 69 66  row. Or,.  ** if
2aec0 20 74 68 65 20 6f 6e 2d 63 6f 6e 66 6c 69 63 74   the on-conflict
2aed0 20 6d 6f 64 65 20 69 73 20 6f 74 68 65 72 20 74   mode is other t
2aee0 68 61 6e 20 52 45 50 4c 41 43 45 2c 20 74 68 65  han REPLACE, the
2aef0 6e 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6d 75  n this method mu
2af00 73 74 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74  st.  ** detect t
2af10 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6e 64 20  he conflict and 
2af20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2af30 4e 53 54 52 41 49 4e 54 20 62 65 66 6f 72 65 20  NSTRAINT before 
2af40 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 20 20 2a  beginning to.  *
2af50 2a 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74  * modify the dat
2af60 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  abase file..  */
2af70 0a 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26  .  if( nArg>1 &&
2af80 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d   p->zContentTbl=
2af90 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 6e  =0 ){.    /* Fin
2afa0 64 20 74 68 65 20 76 61 6c 75 65 20 6f 62 6a 65  d the value obje
2afb0 63 74 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  ct that holds th
2afc0 65 20 6e 65 77 20 72 6f 77 69 64 20 76 61 6c 75  e new rowid valu
2afd0 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
2afe0 33 5f 76 61 6c 75 65 20 2a 70 4e 65 77 52 6f 77  3_value *pNewRow
2aff0 69 64 20 3d 20 61 70 56 61 6c 5b 33 2b 70 2d 3e  id = apVal[3+p->
2b000 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 69 66  nColumn];.    if
2b010 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
2b020 74 79 70 65 28 70 4e 65 77 52 6f 77 69 64 29 3d  type(pNewRowid)=
2b030 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a  =SQLITE_NULL ){.
2b040 20 20 20 20 20 20 70 4e 65 77 52 6f 77 69 64 20        pNewRowid 
2b050 3d 20 61 70 56 61 6c 5b 31 5d 3b 0a 20 20 20 20  = apVal[1];.    
2b060 7d 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  }..    if( sqlit
2b070 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 4e  e3_value_type(pN
2b080 65 77 52 6f 77 69 64 29 21 3d 53 51 4c 49 54 45  ewRowid)!=SQLITE
2b090 5f 4e 55 4c 4c 20 26 26 20 28 20 0a 20 20 20 20  _NULL && ( .    
2b0a0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
2b0b0 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 30 5d 29  e_type(apVal[0])
2b0c0 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20 20  ==SQLITE_NULL.  
2b0d0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61     || sqlite3_va
2b0e0 6c 75 65 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b  lue_int64(apVal[
2b0f0 30 5d 29 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c  0])!=sqlite3_val
2b100 75 65 5f 69 6e 74 36 34 28 70 4e 65 77 52 6f 77  ue_int64(pNewRow
2b110 69 64 29 0a 20 20 20 20 29 29 7b 0a 20 20 20 20  id).    )){.    
2b120 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 77    /* The new row
2b130 69 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28  id is not NULL (
2b140 69 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  in this case the
2b150 20 72 6f 77 69 64 20 77 69 6c 6c 20 62 65 0a 20   rowid will be. 
2b160 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69       ** automati
2b170 63 61 6c 6c 79 20 61 73 73 69 67 6e 65 64 20 61  cally assigned a
2b180 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  nd there is no c
2b190 68 61 6e 63 65 20 6f 66 20 61 20 63 6f 6e 66 6c  hance of a confl
2b1a0 69 63 74 29 2c 20 61 6e 64 20 0a 20 20 20 20 20  ict), and .     
2b1b0 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
2b1c0 74 20 69 73 20 65 69 74 68 65 72 20 61 6e 20 49  t is either an I
2b1d0 4e 53 45 52 54 20 6f 72 20 61 6e 20 55 50 44 41  NSERT or an UPDA
2b1e0 54 45 20 74 68 61 74 20 6d 6f 64 69 66 69 65 73  TE that modifies
2b1f0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 6f   the.      ** ro
2b200 77 69 64 20 63 6f 6c 75 6d 6e 2e 20 53 6f 20 69  wid column. So i
2b210 66 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 6d  f the conflict m
2b220 6f 64 65 20 69 73 20 52 45 50 4c 41 43 45 2c 20  ode is REPLACE, 
2b230 74 68 65 6e 20 64 65 6c 65 74 65 20 61 6e 79 0a  then delete any.
2b240 20 20 20 20 20 20 2a 2a 20 65 78 69 73 74 69 6e        ** existin
2b250 67 20 72 6f 77 20 77 69 74 68 20 72 6f 77 69 64  g row with rowid
2b260 3d 70 4e 65 77 52 6f 77 69 64 2e 20 0a 20 20 20  =pNewRowid. .   
2b270 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f     **.      ** O
2b280 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 66 6c 69  r, if the confli
2b290 63 74 20 6d 6f 64 65 20 69 73 20 6e 6f 74 20 52  ct mode is not R
2b2a0 45 50 4c 41 43 45 2c 20 69 6e 73 65 72 74 20 74  EPLACE, insert t
2b2b0 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e  he new record in
2b2c0 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  to .      ** the
2b2d0 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65   %_content table
2b2e0 2e 20 49 66 20 77 65 20 68 69 74 20 74 68 65 20  . If we hit the 
2b2f0 64 75 70 6c 69 63 61 74 65 20 72 6f 77 69 64 20  duplicate rowid 
2b300 63 6f 6e 73 74 72 61 69 6e 74 20 28 6f 72 20 61  constraint (or a
2b310 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  ny.      ** othe
2b320 72 20 65 72 72 6f 72 29 20 77 68 69 6c 65 20 64  r error) while d
2b330 6f 69 6e 67 20 73 6f 2c 20 72 65 74 75 72 6e 20  oing so, return 
2b340 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20  immediately..   
2b350 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
2b360 68 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20 61  his branch may a
2b370 6c 73 6f 20 72 75 6e 20 69 66 20 70 4e 65 77 52  lso run if pNewR
2b380 6f 77 69 64 20 63 6f 6e 74 61 69 6e 73 20 61 20  owid contains a 
2b390 76 61 6c 75 65 20 74 68 61 74 20 63 61 6e 6e 6f  value that canno
2b3a0 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 6c 6f  t.      ** be lo
2b3b0 73 73 6c 65 73 73 6c 79 20 63 6f 6e 76 65 72 74  sslessly convert
2b3c0 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  ed to an integer
2b3d0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
2b3e0 74 68 65 20 65 76 65 6e 74 75 61 6c 20 0a 20 20  the eventual .  
2b3f0 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 66      ** call to f
2b400 74 73 33 49 6e 73 65 72 74 44 61 74 61 28 29 20  ts3InsertData() 
2b410 28 65 69 74 68 65 72 20 6a 75 73 74 20 62 65 6c  (either just bel
2b420 6f 77 20 6f 72 20 66 75 72 74 68 65 72 20 6f 6e  ow or further on
2b430 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a   in this.      *
2b440 2a 20 66 75 6e 63 74 69 6f 6e 29 20 77 69 6c 6c  * function) will
2b450 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
2b460 49 53 4d 41 54 43 48 2e 20 49 66 20 66 74 73 33  ISMATCH. If fts3
2b470 44 65 6c 65 74 65 42 79 52 6f 77 69 64 20 69 73  DeleteByRowid is
2b480 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 6f 6b   .      ** invok
2b490 65 64 2c 20 69 74 20 77 69 6c 6c 20 64 65 6c 65  ed, it will dele
2b4a0 74 65 20 7a 65 72 6f 20 72 6f 77 73 20 28 73 69  te zero rows (si
2b4b0 6e 63 65 20 6e 6f 20 72 6f 77 20 77 69 6c 6c 20  nce no row will 
2b4c0 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 64 6f  have.      ** do
2b4d0 63 69 64 3d 24 70 4e 65 77 52 6f 77 69 64 20 69  cid=$pNewRowid i
2b4e0 66 20 24 70 4e 65 77 52 6f 77 69 64 20 69 73 20  f $pNewRowid is 
2b4f0 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 76  not an integer v
2b500 61 6c 75 65 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  alue)..      */.
2b510 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2b520 33 5f 76 74 61 62 5f 6f 6e 5f 63 6f 6e 66 6c 69  3_vtab_on_confli
2b530 63 74 28 70 2d 3e 64 62 29 3d 3d 53 51 4c 49 54  ct(p->db)==SQLIT
2b540 45 5f 52 45 50 4c 41 43 45 20 29 7b 0a 20 20 20  E_REPLACE ){.   
2b550 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 65       rc = fts3De
2b560 6c 65 74 65 42 79 52 6f 77 69 64 28 70 2c 20 70  leteByRowid(p, p
2b570 4e 65 77 52 6f 77 69 64 2c 20 26 6e 43 68 6e 67  NewRowid, &nChng
2b580 2c 20 61 53 7a 44 65 6c 29 3b 0a 20 20 20 20 20  , aSzDel);.     
2b590 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2b5a0 72 63 20 3d 20 66 74 73 33 49 6e 73 65 72 74 44  rc = fts3InsertD
2b5b0 61 74 61 28 70 2c 20 61 70 56 61 6c 2c 20 70 52  ata(p, apVal, pR
2b5c0 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 62  owid);.        b
2b5d0 49 6e 73 65 72 74 44 6f 6e 65 20 3d 20 31 3b 0a  InsertDone = 1;.
2b5e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2b5f0 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
2b600 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
2b610 6f 20 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20 20  o update_out;.  
2b620 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
2b630 69 73 20 61 20 44 45 4c 45 54 45 20 6f 72 20 55  is a DELETE or U
2b640 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 2c  PDATE operation,
2b650 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 6c 64 20   remove the old 
2b660 72 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 69 66 28  record. */.  if(
2b670 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
2b680 79 70 65 28 61 70 56 61 6c 5b 30 5d 29 21 3d 53  ype(apVal[0])!=S
2b690 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20  QLITE_NULL ){.  
2b6a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2b6b0 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56  3_value_type(apV
2b6c0 61 6c 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 49  al[0])==SQLITE_I
2b6d0 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 72 63  NTEGER );.    rc
2b6e0 20 3d 20 66 74 73 33 44 65 6c 65 74 65 42 79 52   = fts3DeleteByR
2b6f0 6f 77 69 64 28 70 2c 20 61 70 56 61 6c 5b 30 5d  owid(p, apVal[0]
2b700 2c 20 26 6e 43 68 6e 67 2c 20 61 53 7a 44 65 6c  , &nChng, aSzDel
2b710 29 3b 0a 20 20 20 20 69 73 52 65 6d 6f 76 65 20  );.    isRemove 
2b720 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
2b730 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 49   If this is an I
2b740 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54 45 20  NSERT or UPDATE 
2b750 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 73 65 72  operation, inser
2b760 74 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  t the new record
2b770 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3e  . */.  if( nArg>
2b780 31 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  1 && rc==SQLITE_
2b790 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c  OK ){.    int iL
2b7a0 61 6e 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  angid = sqlite3_
2b7b0 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b  value_int(apVal[
2b7c0 32 20 2b 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b  2 + p->nColumn +
2b7d0 20 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 62 49   2]);.    if( bI
2b7e0 6e 73 65 72 74 44 6f 6e 65 3d 3d 30 20 29 7b 0a  nsertDone==0 ){.
2b7f0 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 49        rc = fts3I
2b800 6e 73 65 72 74 44 61 74 61 28 70 2c 20 61 70 56  nsertData(p, apV
2b810 61 6c 2c 20 70 52 6f 77 69 64 29 3b 0a 20 20 20  al, pRowid);.   
2b820 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b830 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20  E_CONSTRAINT && 
2b840 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d  p->zContentTbl==
2b850 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
2b860 3d 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 54  = FTS_CORRUPT_VT
2b870 41 42 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  AB;.      }.    
2b880 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2b890 4c 49 54 45 5f 4f 4b 20 26 26 20 28 21 69 73 52  LITE_OK && (!isR
2b8a0 65 6d 6f 76 65 20 7c 7c 20 2a 70 52 6f 77 69 64  emove || *pRowid
2b8b0 21 3d 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 20  !=p->iPrevDocid 
2b8c0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
2b8d0 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73  fts3PendingTerms
2b8e0 44 6f 63 69 64 28 70 2c 20 69 4c 61 6e 67 69 64  Docid(p, iLangid
2b8f0 2c 20 2a 70 52 6f 77 69 64 29 3b 0a 20 20 20 20  , *pRowid);.    
2b900 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2b910 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b920 20 61 73 73 65 72 74 28 20 70 2d 3e 69 50 72 65   assert( p->iPre
2b930 76 44 6f 63 69 64 3d 3d 2a 70 52 6f 77 69 64 20  vDocid==*pRowid 
2b940 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  );.      rc = ft
2b950 73 33 49 6e 73 65 72 74 54 65 72 6d 73 28 70 2c  s3InsertTerms(p,
2b960 20 69 4c 61 6e 67 69 64 2c 20 61 70 56 61 6c 2c   iLangid, apVal,
2b970 20 61 53 7a 49 6e 73 29 3b 0a 20 20 20 20 7d 0a   aSzIns);.    }.
2b980 20 20 20 20 69 66 28 20 70 2d 3e 62 48 61 73 44      if( p->bHasD
2b990 6f 63 73 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ocsize ){.      
2b9a0 66 74 73 33 49 6e 73 65 72 74 44 6f 63 73 69 7a  fts3InsertDocsiz
2b9b0 65 28 26 72 63 2c 20 70 2c 20 61 53 7a 49 6e 73  e(&rc, p, aSzIns
2b9c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 68  );.    }.    nCh
2b9d0 6e 67 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ng++;.  }..  if(
2b9e0 20 70 2d 3e 62 48 61 73 53 74 61 74 20 29 7b 0a   p->bHasStat ){.
2b9f0 20 20 20 20 66 74 73 33 55 70 64 61 74 65 44 6f      fts3UpdateDo
2ba00 63 54 6f 74 61 6c 73 28 26 72 63 2c 20 70 2c 20  cTotals(&rc, p, 
2ba10 61 53 7a 49 6e 73 2c 20 61 53 7a 44 65 6c 2c 20  aSzIns, aSzDel, 
2ba20 6e 43 68 6e 67 29 3b 0a 20 20 7d 0a 0a 20 75 70  nChng);.  }.. up
2ba30 64 61 74 65 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  date_out:.  sqli
2ba40 74 65 33 5f 66 72 65 65 28 61 53 7a 49 6e 73 29  te3_free(aSzIns)
2ba50 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 53  ;.  sqlite3Fts3S
2ba60 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28 70 29 3b  egmentsClose(p);
2ba70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ba80 0a 2f 2a 20 0a 2a 2a 20 46 6c 75 73 68 20 61 6e  ./* .** Flush an
2ba90 79 20 64 61 74 61 20 69 6e 20 74 68 65 20 70 65  y data in the pe
2baa0 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68  nding-terms hash
2bab0 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b 2e 20   table to disk. 
2bac0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a  If successful,.*
2bad0 2a 20 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d  * merge all segm
2bae0 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61  ents in the data
2baf0 62 61 73 65 20 28 69 6e 63 6c 75 64 69 6e 67 20  base (including 
2bb00 74 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 2c  the new segment,
2bb10 20 69 66 20 0a 2a 2a 20 74 68 65 72 65 20 77 61   if .** there wa
2bb20 73 20 61 6e 79 20 64 61 74 61 20 74 6f 20 66 6c  s any data to fl
2bb30 75 73 68 29 20 69 6e 74 6f 20 61 20 73 69 6e 67  ush) into a sing
2bb40 6c 65 20 73 65 67 6d 65 6e 74 2e 20 0a 2a 2f 0a  le segment. .*/.
2bb50 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 4f  int sqlite3Fts3O
2bb60 70 74 69 6d 69 7a 65 28 46 74 73 33 54 61 62 6c  ptimize(Fts3Tabl
2bb70 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
2bb80 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
2bb90 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 41 56  exec(p->db, "SAV
2bba0 45 50 4f 49 4e 54 20 66 74 73 33 22 2c 20 30 2c  EPOINT fts3", 0,
2bbb0 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   0, 0);.  if( rc
2bbc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2bbd0 20 20 20 72 63 20 3d 20 66 74 73 33 44 6f 4f 70     rc = fts3DoOp
2bbe0 74 69 6d 69 7a 65 28 70 2c 20 31 29 3b 0a 20 20  timize(p, 1);.  
2bbf0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2bc00 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
2bc10 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
2bc20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65  int rc2 = sqlite
2bc30 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 52  3_exec(p->db, "R
2bc40 45 4c 45 41 53 45 20 66 74 73 33 22 2c 20 30 2c  ELEASE fts3", 0,
2bc50 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
2bc60 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
2bc70 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20   ) rc = rc2;.   
2bc80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
2bc90 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
2bca0 2c 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 66  , "ROLLBACK TO f
2bcb0 74 73 33 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ts3", 0, 0, 0);.
2bcc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
2bcd0 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c 45 41  ec(p->db, "RELEA
2bce0 53 45 20 66 74 73 33 22 2c 20 30 2c 20 30 2c 20  SE fts3", 0, 0, 
2bcf0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
2bd00 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 6d 65  sqlite3Fts3Segme
2bd10 6e 74 73 43 6c 6f 73 65 28 70 29 3b 0a 20 20 72  ntsClose(p);.  r
2bd20 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e  eturn rc;.}..#en
2bd30 64 69 66 0a                                      dif.