/ Hex Artifact Content
Login

Artifact b90173c62460a215498b0da3046f5e429b3a66b0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 39 20 4f 63 74 20 32  /*.** 2009 Oct 2
0010: 33 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  3.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 69 73 20 70 61 72 74 20 6f 66   file is part of
0190: 20 74 68 65 20 53 51 4c 69 74 65 20 46 54 53 33   the SQLite FTS3
01a0: 20 65 78 74 65 6e 73 69 6f 6e 20 6d 6f 64 75 6c   extension modul
01b0: 65 2e 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c  e. Specifically,
01c0: 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 20 63 6f  .** this file co
01d0: 6e 74 61 69 6e 73 20 63 6f 64 65 20 74 6f 20 69  ntains code to i
01e0: 6e 73 65 72 74 2c 20 75 70 64 61 74 65 20 61 6e  nsert, update an
01f0: 64 20 64 65 6c 65 74 65 20 72 6f 77 73 20 66 72  d delete rows fr
0200: 6f 6d 20 46 54 53 33 0a 2a 2a 20 74 61 62 6c 65  om FTS3.** table
0210: 73 2e 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61  s. It also conta
0220: 69 6e 73 20 63 6f 64 65 20 74 6f 20 6d 65 72 67  ins code to merg
0230: 65 20 46 54 53 33 20 62 2d 74 72 65 65 20 73 65  e FTS3 b-tree se
0240: 67 6d 65 6e 74 73 2e 20 53 6f 6d 65 0a 2a 2a 20  gments. Some.** 
0250: 6f 66 20 74 68 65 20 73 75 62 2d 72 6f 75 74 69  of the sub-routi
0260: 6e 65 73 20 75 73 65 64 20 74 6f 20 6d 65 72 67  nes used to merg
0270: 65 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20 61  e segments are a
0280: 6c 73 6f 20 75 73 65 64 20 62 79 20 74 68 65 20  lso used by the 
0290: 71 75 65 72 79 20 0a 2a 2a 20 63 6f 64 65 20 69  query .** code i
02a0: 6e 20 66 74 73 33 2e 63 2e 0a 2a 2f 0a 0a 23 69  n fts3.c..*/..#i
02b0: 6e 63 6c 75 64 65 20 22 66 74 73 33 49 6e 74 2e  nclude "fts3Int.
02c0: 68 22 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  h".#if !defined(
02d0: 53 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20  SQLITE_CORE) || 
02e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
02f0: 4e 41 42 4c 45 5f 46 54 53 33 29 0a 0a 23 69 6e  NABLE_FTS3)..#in
0300: 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e  clude <string.h>
0310: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  .#include <asser
0320: 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  t.h>.#include <s
0330: 74 64 6c 69 62 2e 68 3e 0a 0a 0a 23 64 65 66 69  tdlib.h>...#defi
0340: 6e 65 20 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e  ne FTS_MAX_APPEN
0350: 44 41 42 4c 45 5f 48 45 49 47 48 54 20 31 36 0a  DABLE_HEIGHT 16.
0360: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 66 75 6c 6c  ./*.** When full
0370: 2d 74 65 78 74 20 69 6e 64 65 78 20 6e 6f 64 65  -text index node
0380: 73 20 61 72 65 20 6c 6f 61 64 65 64 20 66 72 6f  s are loaded fro
0390: 6d 20 64 69 73 6b 2c 20 74 68 65 20 62 75 66 66  m disk, the buff
03a0: 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20  er that they.** 
03b0: 61 72 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20  are loaded into 
03c0: 68 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  has the followin
03d0: 67 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  g number of byte
03e0: 73 20 6f 66 20 70 61 64 64 69 6e 67 20 61 74 20  s of padding at 
03f0: 74 68 65 20 65 6e 64 20 0a 2a 2a 20 6f 66 20 69  the end .** of i
0400: 74 2e 20 69 2e 65 2e 20 69 66 20 61 20 66 75 6c  t. i.e. if a ful
0410: 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 6e 6f 64  l-text index nod
0420: 65 20 69 73 20 39 30 30 20 62 79 74 65 73 20 69  e is 900 bytes i
0430: 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 61 20 62  n size, then a b
0440: 75 66 66 65 72 0a 2a 2a 20 6f 66 20 39 32 30 20  uffer.** of 920 
0450: 62 79 74 65 73 20 69 73 20 61 6c 6c 6f 63 61 74  bytes is allocat
0460: 65 64 20 66 6f 72 20 69 74 2e 0a 2a 2a 0a 2a 2a  ed for it..**.**
0470: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
0480: 20 69 66 20 77 65 20 68 61 76 65 20 61 20 70 6f   if we have a po
0490: 69 6e 74 65 72 20 69 6e 74 6f 20 61 20 62 75 66  inter into a buf
04a0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e  fer containing n
04b0: 6f 64 65 20 64 61 74 61 2c 0a 2a 2a 20 69 74 20  ode data,.** it 
04c0: 69 73 20 61 6c 77 61 79 73 20 73 61 66 65 20 74  is always safe t
04d0: 6f 20 72 65 61 64 20 75 70 20 74 6f 20 74 77 6f  o read up to two
04e0: 20 76 61 72 69 6e 74 73 20 66 72 6f 6d 20 69 74   varints from it
04f0: 20 77 69 74 68 6f 75 74 20 72 69 73 6b 69 6e 67   without risking
0500: 20 61 6e 0a 2a 2a 20 6f 76 65 72 72 65 61 64 2c   an.** overread,
0510: 20 65 76 65 6e 20 69 66 20 74 68 65 20 6e 6f 64   even if the nod
0520: 65 20 64 61 74 61 20 69 73 20 63 6f 72 72 75 70  e data is corrup
0530: 74 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ted..*/.#define 
0540: 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49 4e  FTS3_NODE_PADDIN
0550: 47 20 28 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d  G (FTS3_VARINT_M
0560: 41 58 2a 32 29 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64  AX*2)../*.** Und
0570: 65 72 20 63 65 72 74 61 69 6e 20 63 69 72 63 75  er certain circu
0580: 6d 73 74 61 6e 63 65 73 2c 20 62 2d 74 72 65 65  mstances, b-tree
0590: 20 6e 6f 64 65 73 20 28 64 6f 63 6c 69 73 74 73   nodes (doclists
05a0: 29 20 63 61 6e 20 62 65 20 6c 6f 61 64 65 64 20  ) can be loaded 
05b0: 69 6e 74 6f 0a 2a 2a 20 6d 65 6d 6f 72 79 20 69  into.** memory i
05c0: 6e 63 72 65 6d 65 6e 74 61 6c 6c 79 20 69 6e 73  ncrementally ins
05d0: 74 65 61 64 20 6f 66 20 61 6c 6c 20 61 74 20 6f  tead of all at o
05e0: 6e 63 65 2e 20 54 68 69 73 20 63 61 6e 20 62 65  nce. This can be
05f0: 20 61 20 62 69 67 20 70 65 72 66 6f 72 6d 61 6e   a big performan
0600: 63 65 0a 2a 2a 20 77 69 6e 20 28 72 65 64 75 63  ce.** win (reduc
0610: 65 64 20 49 4f 20 61 6e 64 20 43 50 55 29 20 69  ed IO and CPU) i
0620: 66 20 53 51 4c 69 74 65 20 73 74 6f 70 73 20 63  f SQLite stops c
0630: 61 6c 6c 69 6e 67 20 74 68 65 20 76 69 72 74 75  alling the virtu
0640: 61 6c 20 74 61 62 6c 65 20 78 4e 65 78 74 28 29  al table xNext()
0650: 0a 2a 2a 20 6d 65 74 68 6f 64 20 62 65 66 6f 72  .** method befor
0660: 65 20 72 65 74 72 69 65 76 69 6e 67 20 61 6c 6c  e retrieving all
0670: 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 28   query results (
0680: 61 73 20 6d 61 79 20 68 61 70 70 65 6e 2c 20 66  as may happen, f
0690: 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 69  or example,.** i
06a0: 66 20 61 20 71 75 65 72 79 20 68 61 73 20 61 20  f a query has a 
06b0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 29 2e 0a 2a  LIMIT clause)..*
06c0: 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 61 6c  *.** Incremental
06d0: 20 6c 6f 61 64 69 6e 67 20 69 73 20 75 73 65 64   loading is used
06e0: 20 66 6f 72 20 62 2d 74 72 65 65 20 6e 6f 64 65   for b-tree node
06f0: 73 20 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e  s FTS3_NODE_CHUN
0700: 4b 5f 54 48 52 45 53 48 4f 4c 44 20 0a 2a 2a 20  K_THRESHOLD .** 
0710: 62 79 74 65 73 20 61 6e 64 20 6c 61 72 67 65 72  bytes and larger
0720: 2e 20 4e 6f 64 65 73 20 61 72 65 20 6c 6f 61 64  . Nodes are load
0730: 65 64 20 69 6e 20 63 68 75 6e 6b 73 20 6f 66 20  ed in chunks of 
0740: 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 53  FTS3_NODE_CHUNKS
0750: 49 5a 45 20 62 79 74 65 73 2e 0a 2a 2a 20 54 68  IZE bytes..** Th
0760: 65 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  e code is writte
0770: 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 68 61  n so that the ha
0780: 72 64 20 6c 6f 77 65 72 2d 6c 69 6d 69 74 20 66  rd lower-limit f
0790: 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 73 65  or each of these
07a0: 20 76 61 6c 75 65 73 20 0a 2a 2a 20 69 73 20 31   values .** is 1
07b0: 2e 20 43 6c 65 61 72 6c 79 20 73 75 63 68 20 73  . Clearly such s
07c0: 6d 61 6c 6c 20 76 61 6c 75 65 73 20 77 6f 75 6c  mall values woul
07d0: 64 20 62 65 20 69 6e 65 66 66 69 63 69 65 6e 74  d be inefficient
07e0: 2c 20 62 75 74 20 63 61 6e 20 62 65 20 75 73 65  , but can be use
07f0: 66 75 6c 20 0a 2a 2a 20 66 6f 72 20 74 65 73 74  ful .** for test
0800: 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2a  ing purposes..**
0810: 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 6f 64 75  .** If this modu
0820: 6c 65 20 69 73 20 62 75 69 6c 74 20 77 69 74 68  le is built with
0830: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 64 65 66   SQLITE_TEST def
0840: 69 6e 65 64 2c 20 74 68 65 73 65 20 63 6f 6e 73  ined, these cons
0850: 74 61 6e 74 73 20 6d 61 79 0a 2a 2a 20 62 65 20  tants may.** be 
0860: 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75  overridden at ru
0870: 6e 74 69 6d 65 20 66 6f 72 20 74 65 73 74 69 6e  ntime for testin
0880: 67 20 70 75 72 70 6f 73 65 73 2e 20 46 69 6c 65  g purposes. File
0890: 20 66 74 73 33 5f 74 65 73 74 2e 63 20 63 6f 6e   fts3_test.c con
08a0: 74 61 69 6e 73 0a 2a 2a 20 61 20 54 63 6c 20 69  tains.** a Tcl i
08b0: 6e 74 65 72 66 61 63 65 20 74 6f 20 72 65 61 64  nterface to read
08c0: 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 76   and write the v
08d0: 61 6c 75 65 73 2e 0a 2a 2f 0a 23 69 66 64 65 66  alues..*/.#ifdef
08e0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
08f0: 20 74 65 73 74 5f 66 74 73 33 5f 6e 6f 64 65 5f   test_fts3_node_
0900: 63 68 75 6e 6b 73 69 7a 65 20 3d 20 28 34 2a 31  chunksize = (4*1
0910: 30 32 34 29 3b 0a 69 6e 74 20 74 65 73 74 5f 66  024);.int test_f
0920: 74 73 33 5f 6e 6f 64 65 5f 63 68 75 6e 6b 5f 74  ts3_node_chunk_t
0930: 68 72 65 73 68 6f 6c 64 20 3d 20 28 34 2a 31 30  hreshold = (4*10
0940: 32 34 29 2a 34 3b 0a 23 20 64 65 66 69 6e 65 20  24)*4;.# define 
0950: 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 53  FTS3_NODE_CHUNKS
0960: 49 5a 45 20 20 20 20 20 20 20 74 65 73 74 5f 66  IZE       test_f
0970: 74 73 33 5f 6e 6f 64 65 5f 63 68 75 6e 6b 73 69  ts3_node_chunksi
0980: 7a 65 0a 23 20 64 65 66 69 6e 65 20 46 54 53 33  ze.# define FTS3
0990: 5f 4e 4f 44 45 5f 43 48 55 4e 4b 5f 54 48 52 45  _NODE_CHUNK_THRE
09a0: 53 48 4f 4c 44 20 74 65 73 74 5f 66 74 73 33 5f  SHOLD test_fts3_
09b0: 6e 6f 64 65 5f 63 68 75 6e 6b 5f 74 68 72 65 73  node_chunk_thres
09c0: 68 6f 6c 64 0a 23 65 6c 73 65 0a 23 20 64 65 66  hold.#else.# def
09d0: 69 6e 65 20 46 54 53 33 5f 4e 4f 44 45 5f 43 48  ine FTS3_NODE_CH
09e0: 55 4e 4b 53 49 5a 45 20 28 34 2a 31 30 32 34 29  UNKSIZE (4*1024)
09f0: 20 0a 23 20 64 65 66 69 6e 65 20 46 54 53 33 5f   .# define FTS3_
0a00: 4e 4f 44 45 5f 43 48 55 4e 4b 5f 54 48 52 45 53  NODE_CHUNK_THRES
0a10: 48 4f 4c 44 20 28 46 54 53 33 5f 4e 4f 44 45 5f  HOLD (FTS3_NODE_
0a20: 43 48 55 4e 4b 53 49 5a 45 2a 34 29 0a 23 65 6e  CHUNKSIZE*4).#en
0a30: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  dif../*.** The t
0a40: 77 6f 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d  wo values that m
0a50: 61 79 20 62 65 20 6d 65 61 6e 69 6e 67 66 75 6c  ay be meaningful
0a60: 6c 79 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 20  ly bound to the 
0a70: 3a 31 20 70 61 72 61 6d 65 74 65 72 20 69 6e 0a  :1 parameter in.
0a80: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 53 51  ** statements SQ
0a90: 4c 5f 52 45 50 4c 41 43 45 5f 53 54 41 54 20 61  L_REPLACE_STAT a
0aa0: 6e 64 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 54  nd SQL_SELECT_ST
0ab0: 41 54 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46  AT..*/.#define F
0ac0: 54 53 5f 53 54 41 54 5f 44 4f 43 54 4f 54 41 4c  TS_STAT_DOCTOTAL
0ad0: 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20        0.#define 
0ae0: 46 54 53 5f 53 54 41 54 5f 49 4e 43 52 4d 45 52  FTS_STAT_INCRMER
0af0: 47 45 48 49 4e 54 20 31 0a 23 64 65 66 69 6e 65  GEHINT 1.#define
0b00: 20 46 54 53 5f 53 54 41 54 5f 41 55 54 4f 49 4e   FTS_STAT_AUTOIN
0b10: 43 52 4d 45 52 47 45 20 32 0a 0a 2f 2a 0a 2a 2a  CRMERGE 2../*.**
0b20: 20 49 66 20 46 54 53 5f 4c 4f 47 5f 4d 45 52 47   If FTS_LOG_MERG
0b30: 45 53 20 69 73 20 64 65 66 69 6e 65 64 2c 20 63  ES is defined, c
0b40: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  all sqlite3_log(
0b50: 29 20 74 6f 20 72 65 70 6f 72 74 20 65 61 63 68  ) to report each
0b60: 20 61 75 74 6f 6d 61 74 69 63 0a 2a 2a 20 61 6e   automatic.** an
0b70: 64 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  d incremental me
0b80: 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 20 74 68  rge operation th
0b90: 61 74 20 74 61 6b 65 73 20 70 6c 61 63 65 2e 20  at takes place. 
0ba0: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
0bb0: 20 0a 2a 2a 20 64 65 62 75 67 67 69 6e 67 20 46   .** debugging F
0bc0: 54 53 20 6f 6e 6c 79 2c 20 69 74 20 73 68 6f 75  TS only, it shou
0bd0: 6c 64 20 6e 6f 74 20 75 73 75 61 6c 6c 79 20 62  ld not usually b
0be0: 65 20 74 75 72 6e 65 64 20 6f 6e 20 69 6e 20 70  e turned on in p
0bf0: 72 6f 64 75 63 74 69 6f 6e 0a 2a 2a 20 73 79 73  roduction.** sys
0c00: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  tems..*/.#ifdef 
0c10: 46 54 53 33 5f 4c 4f 47 5f 4d 45 52 47 45 53 0a  FTS3_LOG_MERGES.
0c20: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
0c30: 4c 6f 67 4d 65 72 67 65 28 69 6e 74 20 6e 4d 65  LogMerge(int nMe
0c40: 72 67 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  rge, sqlite3_int
0c50: 36 34 20 69 41 62 73 4c 65 76 65 6c 29 7b 0a 20  64 iAbsLevel){. 
0c60: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
0c70: 49 54 45 5f 4f 4b 2c 20 22 25 64 2d 77 61 79 20  ITE_OK, "%d-way 
0c80: 6d 65 72 67 65 20 66 72 6f 6d 20 6c 65 76 65 6c  merge from level
0c90: 20 25 64 22 2c 20 6e 4d 65 72 67 65 2c 20 28 69   %d", nMerge, (i
0ca0: 6e 74 29 69 41 62 73 4c 65 76 65 6c 29 3b 0a 7d  nt)iAbsLevel);.}
0cb0: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 66  .#else.#define f
0cc0: 74 73 33 4c 6f 67 4d 65 72 67 65 28 78 2c 20 79  ts3LogMerge(x, y
0cd0: 29 0a 23 65 6e 64 69 66 0a 0a 0a 74 79 70 65 64  ).#endif...typed
0ce0: 65 66 20 73 74 72 75 63 74 20 50 65 6e 64 69 6e  ef struct Pendin
0cf0: 67 4c 69 73 74 20 50 65 6e 64 69 6e 67 4c 69 73  gList PendingLis
0d00: 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  t;.typedef struc
0d10: 74 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 53 65  t SegmentNode Se
0d20: 67 6d 65 6e 74 4e 6f 64 65 3b 0a 74 79 70 65 64  gmentNode;.typed
0d30: 65 66 20 73 74 72 75 63 74 20 53 65 67 6d 65 6e  ef struct Segmen
0d40: 74 57 72 69 74 65 72 20 53 65 67 6d 65 6e 74 57  tWriter SegmentW
0d50: 72 69 74 65 72 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  riter;../*.** An
0d60: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
0d70: 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 61 74 61 20   following data 
0d80: 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65  structure is use
0d90: 64 20 74 6f 20 62 75 69 6c 64 20 64 6f 63 6c 69  d to build docli
0da0: 73 74 73 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74  sts.** increment
0db0: 61 6c 6c 79 2e 20 53 65 65 20 66 75 6e 63 74 69  ally. See functi
0dc0: 6f 6e 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69  on fts3PendingLi
0dd0: 73 74 41 70 70 65 6e 64 28 29 20 66 6f 72 20 64  stAppend() for d
0de0: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 73 74 72 75 63  etails..*/.struc
0df0: 74 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 7b 0a  t PendingList {.
0e00: 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20 20 63    int nData;.  c
0e10: 68 61 72 20 2a 61 44 61 74 61 3b 0a 20 20 69 6e  har *aData;.  in
0e20: 74 20 6e 53 70 61 63 65 3b 0a 20 20 73 71 6c 69  t nSpace;.  sqli
0e30: 74 65 33 5f 69 6e 74 36 34 20 69 4c 61 73 74 44  te3_int64 iLastD
0e40: 6f 63 69 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ocid;.  sqlite3_
0e50: 69 6e 74 36 34 20 69 4c 61 73 74 43 6f 6c 3b 0a  int64 iLastCol;.
0e60: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
0e70: 69 4c 61 73 74 50 6f 73 3b 0a 7d 3b 0a 0a 0a 2f  iLastPos;.};.../
0e80: 2a 0a 2a 2a 20 45 61 63 68 20 63 75 72 73 6f 72  *.** Each cursor
0e90: 20 68 61 73 20 61 20 28 70 6f 73 73 69 62 6c 79   has a (possibly
0ea0: 20 65 6d 70 74 79 29 20 6c 69 6e 6b 65 64 20 6c   empty) linked l
0eb0: 69 73 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ist of the follo
0ec0: 77 69 6e 67 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f  wing objects..*/
0ed0: 0a 73 74 72 75 63 74 20 46 74 73 33 44 65 66 65  .struct Fts3Defe
0ee0: 72 72 65 64 54 6f 6b 65 6e 20 7b 0a 20 20 46 74  rredToken {.  Ft
0ef0: 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70  s3PhraseToken *p
0f00: 54 6f 6b 65 6e 3b 20 20 20 20 20 20 20 20 2f 2a  Token;        /*
0f10: 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 6f 72 72   Pointer to corr
0f20: 65 73 70 6f 6e 64 69 6e 67 20 65 78 70 72 20 74  esponding expr t
0f30: 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43  oken */.  int iC
0f40: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
0f50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
0f60: 75 6d 6e 20 74 6f 6b 65 6e 20 6d 75 73 74 20 6f  umn token must o
0f70: 63 63 75 72 20 69 6e 20 2a 2f 0a 20 20 46 74 73  ccur in */.  Fts
0f80: 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a  3DeferredToken *
0f90: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20  pNext;       /* 
0fa0: 4e 65 78 74 20 69 6e 20 6c 69 73 74 20 6f 66 20  Next in list of 
0fb0: 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 73 20  deferred tokens 
0fc0: 2a 2f 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73 74  */.  PendingList
0fd0: 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20   *pList;        
0fe0: 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20       /* Doclist 
0ff0: 69 73 20 61 73 73 65 6d 62 6c 65 64 20 68 65 72  is assembled her
1000: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  e */.};../*.** A
1010: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
1020: 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
1030: 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
1040: 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 72 6d  through the term
1050: 73 20 6f 6e 0a 2a 2a 20 61 20 63 6f 6e 74 69 67  s on.** a contig
1060: 75 6f 75 73 20 73 65 74 20 6f 66 20 73 65 67 6d  uous set of segm
1070: 65 6e 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20  ent b-tree leaf 
1080: 6e 6f 64 65 73 2e 20 41 6c 74 68 6f 75 67 68 20  nodes. Although 
1090: 74 68 65 20 64 65 74 61 69 6c 73 20 6f 66 0a 2a  the details of.*
10a0: 2a 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  * this structure
10b0: 20 61 72 65 20 6f 6e 6c 79 20 6d 61 6e 69 70 75   are only manipu
10c0: 6c 61 74 65 64 20 62 79 20 63 6f 64 65 20 69 6e  lated by code in
10d0: 20 74 68 69 73 20 66 69 6c 65 2c 20 6f 70 61 71   this file, opaq
10e0: 75 65 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 6f 66  ue handles.** of
10f0: 20 74 79 70 65 20 46 74 73 33 53 65 67 52 65 61   type Fts3SegRea
1100: 64 65 72 2a 20 61 72 65 20 61 6c 73 6f 20 75 73  der* are also us
1110: 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20 66 74  ed by code in ft
1120: 73 33 2e 63 20 74 6f 20 69 74 65 72 61 74 65 20  s3.c to iterate 
1130: 74 68 72 6f 75 67 68 0a 2a 2a 20 74 65 72 6d 73  through.** terms
1140: 20 77 68 65 6e 20 71 75 65 72 79 69 6e 67 20 74   when querying t
1150: 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  he full-text ind
1160: 65 78 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e  ex. See function
1170: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69 74  s:.**.**   sqlit
1180: 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 4e  e3Fts3SegReaderN
1190: 65 77 28 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ew().**   sqlite
11a0: 33 46 74 73 33 53 65 67 52 65 61 64 65 72 46 72  3Fts3SegReaderFr
11b0: 65 65 28 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ee().**   sqlite
11c0: 33 46 74 73 33 53 65 67 52 65 61 64 65 72 49 74  3Fts3SegReaderIt
11d0: 65 72 61 74 65 28 29 0a 2a 2a 0a 2a 2a 20 4d 65  erate().**.** Me
11e0: 74 68 6f 64 73 20 75 73 65 64 20 74 6f 20 6d 61  thods used to ma
11f0: 6e 69 70 75 6c 61 74 65 20 46 74 73 33 53 65 67  nipulate Fts3Seg
1200: 52 65 61 64 65 72 20 73 74 72 75 63 74 75 72 65  Reader structure
1210: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 66 74 73 33 53  s:.**.**   fts3S
1220: 65 67 52 65 61 64 65 72 4e 65 78 74 28 29 0a 2a  egReaderNext().*
1230: 2a 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65  *   fts3SegReade
1240: 72 46 69 72 73 74 44 6f 63 69 64 28 29 0a 2a 2a  rFirstDocid().**
1250: 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72     fts3SegReader
1260: 4e 65 78 74 44 6f 63 69 64 28 29 0a 2a 2f 0a 73  NextDocid().*/.s
1270: 74 72 75 63 74 20 46 74 73 33 53 65 67 52 65 61  truct Fts3SegRea
1280: 64 65 72 20 7b 0a 20 20 69 6e 74 20 69 49 64 78  der {.  int iIdx
1290: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12a0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
12b0: 20 77 69 74 68 69 6e 20 6c 65 76 65 6c 2c 20 6f   within level, o
12c0: 72 20 30 78 37 46 46 46 46 46 46 46 20 66 6f 72  r 0x7FFFFFFF for
12d0: 20 50 54 20 2a 2f 0a 20 20 75 38 20 62 4c 6f 6f   PT */.  u8 bLoo
12e0: 6b 75 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  kup;            
12f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1300: 20 66 6f 72 20 61 20 6c 6f 6f 6b 75 70 20 6f 6e   for a lookup on
1310: 6c 79 20 2a 2f 0a 20 20 75 38 20 72 6f 6f 74 4f  ly */.  u8 rootO
1320: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
1330: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1340: 66 6f 72 20 61 20 72 6f 6f 74 2d 6f 6e 6c 79 20  for a root-only 
1350: 72 65 61 64 65 72 20 2a 2f 0a 0a 20 20 73 71 6c  reader */..  sql
1360: 69 74 65 33 5f 69 6e 74 36 34 20 69 53 74 61 72  ite3_int64 iStar
1370: 74 42 6c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20  tBlock;      /* 
1380: 52 6f 77 69 64 20 6f 66 20 66 69 72 73 74 20 6c  Rowid of first l
1390: 65 61 66 20 62 6c 6f 63 6b 20 74 6f 20 74 72 61  eaf block to tra
13a0: 76 65 72 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  verse */.  sqlit
13b0: 65 33 5f 69 6e 74 36 34 20 69 4c 65 61 66 45 6e  e3_int64 iLeafEn
13c0: 64 42 6c 6f 63 6b 3b 20 20 20 20 2f 2a 20 52 6f  dBlock;    /* Ro
13d0: 77 69 64 20 6f 66 20 66 69 6e 61 6c 20 6c 65 61  wid of final lea
13e0: 66 20 62 6c 6f 63 6b 20 74 6f 20 74 72 61 76 65  f block to trave
13f0: 72 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rse */.  sqlite3
1400: 5f 69 6e 74 36 34 20 69 45 6e 64 42 6c 6f 63 6b  _int64 iEndBlock
1410: 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  ;        /* Rowi
1420: 64 20 6f 66 20 66 69 6e 61 6c 20 62 6c 6f 63 6b  d of final block
1430: 20 69 6e 20 73 65 67 6d 65 6e 74 20 28 6f 72 20   in segment (or 
1440: 30 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  0) */.  sqlite3_
1450: 69 6e 74 36 34 20 69 43 75 72 72 65 6e 74 42 6c  int64 iCurrentBl
1460: 6f 63 6b 3b 20 20 20 20 2f 2a 20 43 75 72 72 65  ock;    /* Curre
1470: 6e 74 20 6c 65 61 66 20 62 6c 6f 63 6b 20 28 6f  nt leaf block (o
1480: 72 20 30 29 20 2a 2f 0a 0a 20 20 63 68 61 72 20  r 0) */..  char 
1490: 2a 61 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  *aNode;         
14a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
14b0: 69 6e 74 65 72 20 74 6f 20 6e 6f 64 65 20 64 61  inter to node da
14c0: 74 61 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  ta (or NULL) */.
14d0: 20 20 69 6e 74 20 6e 4e 6f 64 65 3b 20 20 20 20    int nNode;    
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
1500: 66 65 72 20 61 74 20 61 4e 6f 64 65 20 28 6f 72  fer at aNode (or
1510: 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f   0) */.  int nPo
1520: 70 75 6c 61 74 65 3b 20 20 20 20 20 20 20 20 20  pulate;         
1530: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e           /* If >
1540: 30 2c 20 62 79 74 65 73 20 6f 66 20 62 75 66 66  0, bytes of buff
1550: 65 72 20 61 4e 6f 64 65 5b 5d 20 6c 6f 61 64 65  er aNode[] loade
1560: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62  d */.  sqlite3_b
1570: 6c 6f 62 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20  lob *pBlob;     
1580: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74         /* If not
1590: 20 4e 55 4c 4c 2c 20 62 6c 6f 62 20 68 61 6e 64   NULL, blob hand
15a0: 6c 65 20 74 6f 20 72 65 61 64 20 6e 6f 64 65 20  le to read node 
15b0: 2a 2f 0a 0a 20 20 46 74 73 33 48 61 73 68 45 6c  */..  Fts3HashEl
15c0: 65 6d 20 2a 2a 70 70 4e 65 78 74 45 6c 65 6d 3b  em **ppNextElem;
15d0: 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73  ..  /* Variables
15e0: 20 73 65 74 20 62 79 20 66 74 73 33 53 65 67 52   set by fts3SegR
15f0: 65 61 64 65 72 4e 65 78 74 28 29 2e 20 54 68 65  eaderNext(). The
1600: 73 65 20 6d 61 79 20 62 65 20 72 65 61 64 20 64  se may be read d
1610: 69 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20  irectly.  ** by 
1620: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65 79  the caller. They
1630: 20 61 72 65 20 76 61 6c 69 64 20 66 72 6f 6d 20   are valid from 
1640: 74 68 65 20 74 69 6d 65 20 53 65 67 6d 65 6e 74  the time Segment
1650: 52 65 61 64 65 72 4e 65 77 28 29 20 72 65 74 75  ReaderNew() retu
1660: 72 6e 73 0a 20 20 2a 2a 20 75 6e 74 69 6c 20 53  rns.  ** until S
1670: 65 67 6d 65 6e 74 52 65 61 64 65 72 4e 65 78 74  egmentReaderNext
1680: 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74  () returns somet
1690: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
16a0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 2a 2a 20 28  SQLITE_OK.  ** (
16b0: 69 2e 65 2e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  i.e. SQLITE_DONE
16c0: 29 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  )..  */.  int nT
16d0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
16e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
16f0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
1700: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a  current term */.
1710: 20 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20    char *zTerm;  
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1730: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1740: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a  current term */.
1750: 20 20 69 6e 74 20 6e 54 65 72 6d 41 6c 6c 6f 63    int nTermAlloc
1760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1770: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
1780: 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 62 75 66  ize of zTerm buf
1790: 66 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  fer */.  char *a
17a0: 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20  Doclist;        
17b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
17c0: 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 20 6f  ter to doclist o
17d0: 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  f current entry 
17e0: 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73  */.  int nDoclis
17f0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1800: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1810: 64 6f 63 6c 69 73 74 20 69 6e 20 63 75 72 72 65  doclist in curre
1820: 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 0a 20 20 2f  nt entry */..  /
1830: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1840: 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 75 73  variables are us
1850: 65 64 20 62 79 20 66 74 73 33 53 65 67 52 65 61  ed by fts3SegRea
1860: 64 65 72 4e 65 78 74 44 6f 63 69 64 28 29 20 74  derNextDocid() t
1870: 6f 20 69 74 65 72 61 74 65 20 0a 20 20 2a 2a 20  o iterate .  ** 
1880: 74 68 72 6f 75 67 68 20 74 68 65 20 63 75 72 72  through the curr
1890: 65 6e 74 20 64 6f 63 6c 69 73 74 20 28 61 44 6f  ent doclist (aDo
18a0: 63 6c 69 73 74 2f 6e 44 6f 63 6c 69 73 74 29 2e  clist/nDoclist).
18b0: 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 4f  .  */.  char *pO
18c0: 66 66 73 65 74 4c 69 73 74 3b 0a 20 20 69 6e 74  ffsetList;.  int
18d0: 20 6e 4f 66 66 73 65 74 4c 69 73 74 3b 20 20 20   nOffsetList;   
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18f0: 46 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20 70  For descending p
1900: 65 6e 64 69 6e 67 20 73 65 67 2d 72 65 61 64 65  ending seg-reade
1910: 72 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 71 6c  rs only */.  sql
1920: 69 74 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 69  ite3_int64 iDoci
1930: 64 3b 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 66  d;.};..#define f
1940: 74 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65  ts3SegReaderIsPe
1950: 6e 64 69 6e 67 28 70 29 20 28 28 70 29 2d 3e 70  nding(p) ((p)->p
1960: 70 4e 65 78 74 45 6c 65 6d 21 3d 30 29 0a 23 64  pNextElem!=0).#d
1970: 65 66 69 6e 65 20 66 74 73 33 53 65 67 52 65 61  efine fts3SegRea
1980: 64 65 72 49 73 52 6f 6f 74 4f 6e 6c 79 28 70 29  derIsRootOnly(p)
1990: 20 28 28 70 29 2d 3e 72 6f 6f 74 4f 6e 6c 79 21   ((p)->rootOnly!
19a0: 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  =0)../*.** An in
19b0: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
19c0: 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64  tructure is used
19d0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 73 65 67   to create a seg
19e0: 6d 65 6e 74 20 62 2d 74 72 65 65 20 69 6e 20 74  ment b-tree in t
19f0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  he.** database. 
1a00: 54 68 65 20 69 6e 74 65 72 6e 61 6c 20 64 65 74  The internal det
1a10: 61 69 6c 73 20 6f 66 20 74 68 69 73 20 74 79 70  ails of this typ
1a20: 65 20 61 72 65 20 6f 6e 6c 79 20 61 63 63 65 73  e are only acces
1a30: 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 66 6f  sed by the.** fo
1a40: 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
1a50: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 66 74 73 33 53  s:.**.**   fts3S
1a60: 65 67 57 72 69 74 65 72 41 64 64 28 29 0a 2a 2a  egWriterAdd().**
1a70: 20 20 20 66 74 73 33 53 65 67 57 72 69 74 65 72     fts3SegWriter
1a80: 46 6c 75 73 68 28 29 0a 2a 2a 20 20 20 66 74 73  Flush().**   fts
1a90: 33 53 65 67 57 72 69 74 65 72 46 72 65 65 28 29  3SegWriterFree()
1aa0: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 65 67 6d 65  .*/.struct Segme
1ab0: 6e 74 57 72 69 74 65 72 20 7b 0a 20 20 53 65 67  ntWriter {.  Seg
1ac0: 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65 3b  mentNode *pTree;
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ae0: 50 6f 69 6e 74 65 72 20 74 6f 20 69 6e 74 65 72  Pointer to inter
1af0: 69 6f 72 20 74 72 65 65 20 73 74 72 75 63 74 75  ior tree structu
1b00: 72 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  re */.  sqlite3_
1b10: 69 6e 74 36 34 20 69 46 69 72 73 74 3b 20 20 20  int64 iFirst;   
1b20: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1b30: 20 73 6c 6f 74 20 69 6e 20 25 5f 73 65 67 6d 65   slot in %_segme
1b40: 6e 74 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  nts written */. 
1b50: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1b60: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  Free;           
1b70: 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73 6c   /* Next free sl
1b80: 6f 74 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73  ot in %_segments
1b90: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 72   */.  char *zTer
1ba0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1bb0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1bc0: 20 74 6f 20 70 72 65 76 69 6f 75 73 20 74 65 72   to previous ter
1bd0: 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  m buffer */.  in
1be0: 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20  t nTerm;        
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c00: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1c10: 20 69 6e 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 69   in zTerm */.  i
1c20: 6e 74 20 6e 4d 61 6c 6c 6f 63 3b 20 20 20 20 20  nt nMalloc;     
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c40: 2a 20 53 69 7a 65 20 6f 66 20 6d 61 6c 6c 6f 63  * Size of malloc
1c50: 27 64 20 62 75 66 66 65 72 20 61 74 20 7a 4d 61  'd buffer at zMa
1c60: 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lloc */.  char *
1c70: 7a 4d 61 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20  zMalloc;        
1c80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6c            /* Mal
1c90: 6c 6f 63 27 64 20 73 70 61 63 65 20 28 70 6f 73  loc'd space (pos
1ca0: 73 69 62 6c 79 29 20 75 73 65 64 20 66 6f 72 20  sibly) used for 
1cb0: 7a 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e  zTerm */.  int n
1cc0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1cd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1ce0: 7a 65 20 6f 66 20 61 6c 6c 6f 63 61 74 69 6f 6e  ze of allocation
1cf0: 20 61 74 20 61 44 61 74 61 20 2a 2f 0a 20 20 69   at aData */.  i
1d00: 6e 74 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20  nt nData;       
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d20: 2a 20 42 79 74 65 73 20 6f 66 20 64 61 74 61 20  * Bytes of data 
1d30: 69 6e 20 61 44 61 74 61 20 2a 2f 0a 20 20 63 68  in aData */.  ch
1d40: 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20  ar *aData;      
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d60: 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 6c 6f 63   Pointer to bloc
1d70: 6b 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20  k from malloc() 
1d80: 2a 2f 0a 20 20 69 36 34 20 6e 4c 65 61 66 44 61  */.  i64 nLeafDa
1d90: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
1da0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1db0: 66 20 62 79 74 65 73 20 6f 66 20 6c 65 61 66 20  f bytes of leaf 
1dc0: 64 61 74 61 20 77 72 69 74 74 65 6e 20 2a 2f 0a  data written */.
1dd0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 79 70 65 20 53  };../*.** Type S
1de0: 65 67 6d 65 6e 74 4e 6f 64 65 20 69 73 20 75 73  egmentNode is us
1df0: 65 64 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77  ed by the follow
1e00: 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74 69  ing three functi
1e10: 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a  ons to create.**
1e20: 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 70 61   the interior pa
1e30: 72 74 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e  rt of the segmen
1e40: 74 20 62 2b 2d 74 72 65 65 20 73 74 72 75 63 74  t b+-tree struct
1e50: 75 72 65 73 20 28 65 76 65 72 79 74 68 69 6e 67  ures (everything
1e60: 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 65 20 6c   except.** the l
1e70: 65 61 66 20 6e 6f 64 65 73 29 2e 20 54 68 65 73  eaf nodes). Thes
1e80: 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  e functions and 
1e90: 74 79 70 65 20 61 72 65 20 6f 6e 6c 79 20 65 76  type are only ev
1ea0: 65 72 20 75 73 65 64 20 62 79 20 63 6f 64 65 0a  er used by code.
1eb0: 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 66 74  ** within the ft
1ec0: 73 33 53 65 67 57 72 69 74 65 72 58 58 58 28 29  s3SegWriterXXX()
1ed0: 20 66 61 6d 69 6c 79 20 6f 66 20 66 75 6e 63 74   family of funct
1ee0: 69 6f 6e 73 20 64 65 73 63 72 69 62 65 64 20 61  ions described a
1ef0: 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 66 74  bove..**.**   ft
1f00: 73 33 4e 6f 64 65 41 64 64 54 65 72 6d 28 29 0a  s3NodeAddTerm().
1f10: 2a 2a 20 20 20 66 74 73 33 4e 6f 64 65 57 72 69  **   fts3NodeWri
1f20: 74 65 28 29 0a 2a 2a 20 20 20 66 74 73 33 4e 6f  te().**   fts3No
1f30: 64 65 46 72 65 65 28 29 0a 2a 2a 0a 2a 2a 20 57  deFree().**.** W
1f40: 68 65 6e 20 61 20 62 2b 74 72 65 65 20 69 73 20  hen a b+tree is 
1f50: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
1f60: 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20  atabase (either 
1f70: 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61  as a result of a
1f80: 20 6d 65 72 67 65 0a 2a 2a 20 6f 72 20 74 68 65   merge.** or the
1f90: 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 74   pending-terms t
1fa0: 61 62 6c 65 20 62 65 69 6e 67 20 66 6c 75 73 68  able being flush
1fb0: 65 64 29 2c 20 6c 65 61 76 65 73 20 61 72 65 20  ed), leaves are 
1fc0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1fd0: 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
1fe0: 6c 65 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  le as soon as th
1ff0: 65 79 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c  ey are completel
2000: 79 20 70 6f 70 75 6c 61 74 65 64 2e 20 54 68 65  y populated. The
2010: 20 69 6e 74 65 72 69 6f 72 20 6f 66 0a 2a 2a 20   interior of.** 
2020: 74 68 65 20 74 72 65 65 20 69 73 20 61 73 73 65  the tree is asse
2030: 6d 62 6c 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  mbled in memory 
2040: 61 6e 64 20 77 72 69 74 74 65 6e 20 6f 75 74 20  and written out 
2050: 6f 6e 6c 79 20 6f 6e 63 65 20 61 6c 6c 20 6c 65  only once all le
2060: 61 76 65 73 20 68 61 76 65 0a 2a 2a 20 62 65 65  aves have.** bee
2070: 6e 20 70 6f 70 75 6c 61 74 65 64 20 61 6e 64 20  n populated and 
2080: 73 74 6f 72 65 64 2e 20 54 68 69 73 20 69 73 20  stored. This is 
2090: 4f 6b 2c 20 61 73 20 74 68 65 20 62 2b 2d 74 72  Ok, as the b+-tr
20a0: 65 65 20 66 61 6e 6f 75 74 20 69 73 20 75 73 75  ee fanout is usu
20b0: 61 6c 6c 79 0a 2a 2a 20 76 65 72 79 20 6c 61 72  ally.** very lar
20c0: 67 65 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ge, meaning that
20d0: 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6f 66   the interior of
20e0: 20 74 68 65 20 74 72 65 65 20 63 6f 6e 73 75 6d   the tree consum
20f0: 65 73 20 72 65 6c 61 74 69 76 65 6c 79 20 0a 2a  es relatively .*
2100: 2a 20 6c 69 74 74 6c 65 20 6d 65 6d 6f 72 79 2e  * little memory.
2110: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 65 67 6d 65  .*/.struct Segme
2120: 6e 74 4e 6f 64 65 20 7b 0a 20 20 53 65 67 6d 65  ntNode {.  Segme
2130: 6e 74 4e 6f 64 65 20 2a 70 50 61 72 65 6e 74 3b  ntNode *pParent;
2140: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2150: 72 65 6e 74 20 6e 6f 64 65 20 28 6f 72 20 4e 55  rent node (or NU
2160: 4c 4c 20 66 6f 72 20 72 6f 6f 74 20 6e 6f 64 65  LL for root node
2170: 29 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e 6f  ) */.  SegmentNo
2180: 64 65 20 2a 70 52 69 67 68 74 3b 20 20 20 20 20  de *pRight;     
2190: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
21a0: 72 20 74 6f 20 72 69 67 68 74 2d 73 69 62 6c 69  r to right-sibli
21b0: 6e 67 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e  ng */.  SegmentN
21c0: 6f 64 65 20 2a 70 4c 65 66 74 6d 6f 73 74 3b 20  ode *pLeftmost; 
21d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
21e0: 65 72 20 74 6f 20 6c 65 66 74 2d 6d 6f 73 74 20  er to left-most 
21f0: 6e 6f 64 65 20 6f 66 20 74 68 69 73 20 64 65 70  node of this dep
2200: 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6e 74  th */.  int nEnt
2210: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ry;             
2220: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2230: 72 20 6f 66 20 74 65 72 6d 73 20 77 72 69 74 74  r of terms writt
2240: 65 6e 20 74 6f 20 6e 6f 64 65 20 73 6f 20 66 61  en to node so fa
2250: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65  r */.  char *zTe
2260: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
2270: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
2280: 72 20 74 6f 20 70 72 65 76 69 6f 75 73 20 74 65  r to previous te
2290: 72 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  rm buffer */.  i
22a0: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
22d0: 73 20 69 6e 20 7a 54 65 72 6d 20 2a 2f 0a 20 20  s in zTerm */.  
22e0: 69 6e 74 20 6e 4d 61 6c 6c 6f 63 3b 20 20 20 20  int nMalloc;    
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 6c 6c 6f  /* Size of mallo
2310: 63 27 64 20 62 75 66 66 65 72 20 61 74 20 7a 4d  c'd buffer at zM
2320: 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20  alloc */.  char 
2330: 2a 7a 4d 61 6c 6c 6f 63 3b 20 20 20 20 20 20 20  *zMalloc;       
2340: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
2350: 6c 6c 6f 63 27 64 20 73 70 61 63 65 20 28 70 6f  lloc'd space (po
2360: 73 73 69 62 6c 79 29 20 75 73 65 64 20 66 6f 72  ssibly) used for
2370: 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20   zTerm */.  int 
2380: 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  nData;          
2390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
23a0: 79 74 65 73 20 6f 66 20 76 61 6c 69 64 20 64 61  ytes of valid da
23b0: 74 61 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63  ta so far */.  c
23c0: 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20  har *aData;     
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23e0: 2a 20 4e 6f 64 65 20 64 61 74 61 20 2a 2f 0a 7d  * Node data */.}
23f0: 3b 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 20 76  ;../*.** Valid v
2400: 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 73 65  alues for the se
2410: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
2420: 20 66 74 73 33 53 71 6c 53 74 6d 74 28 29 2e 0a   fts3SqlStmt()..
2430: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44  */.#define SQL_D
2440: 45 4c 45 54 45 5f 43 4f 4e 54 45 4e 54 20 20 20  ELETE_CONTENT   
2450: 20 20 20 20 20 20 20 20 20 20 30 0a 23 64 65 66            0.#def
2460: 69 6e 65 20 53 51 4c 5f 49 53 5f 45 4d 50 54 59  ine SQL_IS_EMPTY
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 53 51 4c     1.#define SQL
2490: 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 43 4f 4e 54  _DELETE_ALL_CONT
24a0: 45 4e 54 20 20 20 20 20 20 20 20 20 32 20 0a 23  ENT         2 .#
24b0: 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54  define SQL_DELET
24c0: 45 5f 41 4c 4c 5f 53 45 47 4d 45 4e 54 53 20 20  E_ALL_SEGMENTS  
24d0: 20 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20        3.#define 
24e0: 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 53  SQL_DELETE_ALL_S
24f0: 45 47 44 49 52 20 20 20 20 20 20 20 20 20 20 34  EGDIR          4
2500: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c  .#define SQL_DEL
2510: 45 54 45 5f 41 4c 4c 5f 44 4f 43 53 49 5a 45 20  ETE_ALL_DOCSIZE 
2520: 20 20 20 20 20 20 20 20 35 0a 23 64 65 66 69 6e          5.#defin
2530: 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c  e SQL_DELETE_ALL
2540: 5f 53 54 41 54 20 20 20 20 20 20 20 20 20 20 20  _STAT           
2550: 20 36 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53   6.#define SQL_S
2560: 45 4c 45 43 54 5f 43 4f 4e 54 45 4e 54 5f 42 59  ELECT_CONTENT_BY
2570: 5f 52 4f 57 49 44 20 20 20 20 37 0a 23 64 65 66  _ROWID    7.#def
2580: 69 6e 65 20 53 51 4c 5f 4e 45 58 54 5f 53 45 47  ine SQL_NEXT_SEG
2590: 4d 45 4e 54 5f 49 4e 44 45 58 20 20 20 20 20 20  MENT_INDEX      
25a0: 20 20 20 38 0a 23 64 65 66 69 6e 65 20 53 51 4c     8.#define SQL
25b0: 5f 49 4e 53 45 52 54 5f 53 45 47 4d 45 4e 54 53  _INSERT_SEGMENTS
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 39 0a 23 64              9.#d
25d0: 65 66 69 6e 65 20 53 51 4c 5f 4e 45 58 54 5f 53  efine SQL_NEXT_S
25e0: 45 47 4d 45 4e 54 53 5f 49 44 20 20 20 20 20 20  EGMENTS_ID      
25f0: 20 20 20 20 31 30 0a 23 64 65 66 69 6e 65 20 53      10.#define S
2600: 51 4c 5f 49 4e 53 45 52 54 5f 53 45 47 44 49 52  QL_INSERT_SEGDIR
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 31 0a               11.
2620: 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45  #define SQL_SELE
2630: 43 54 5f 4c 45 56 45 4c 20 20 20 20 20 20 20 20  CT_LEVEL        
2640: 20 20 20 20 20 20 31 32 0a 23 64 65 66 69 6e 65        12.#define
2650: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c 45 56 45   SQL_SELECT_LEVE
2660: 4c 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20 31  L_RANGE        1
2670: 33 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45  3.#define SQL_SE
2680: 4c 45 43 54 5f 4c 45 56 45 4c 5f 43 4f 55 4e 54  LECT_LEVEL_COUNT
2690: 20 20 20 20 20 20 20 20 31 34 0a 23 64 65 66 69          14.#defi
26a0: 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 45  ne SQL_SELECT_SE
26b0: 47 44 49 52 5f 4d 41 58 5f 4c 45 56 45 4c 20 20  GDIR_MAX_LEVEL  
26c0: 20 31 35 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f   15.#define SQL_
26d0: 44 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 4c 45  DELETE_SEGDIR_LE
26e0: 56 45 4c 20 20 20 20 20 20 20 31 36 0a 23 64 65  VEL       16.#de
26f0: 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f  fine SQL_DELETE_
2700: 53 45 47 4d 45 4e 54 53 5f 52 41 4e 47 45 20 20  SEGMENTS_RANGE  
2710: 20 20 20 31 37 0a 23 64 65 66 69 6e 65 20 53 51     17.#define SQ
2720: 4c 5f 43 4f 4e 54 45 4e 54 5f 49 4e 53 45 52 54  L_CONTENT_INSERT
2730: 20 20 20 20 20 20 20 20 20 20 20 20 31 38 0a 23              18.#
2740: 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54  define SQL_DELET
2750: 45 5f 44 4f 43 53 49 5a 45 20 20 20 20 20 20 20  E_DOCSIZE       
2760: 20 20 20 20 20 31 39 0a 23 64 65 66 69 6e 65 20       19.#define 
2770: 53 51 4c 5f 52 45 50 4c 41 43 45 5f 44 4f 43 53  SQL_REPLACE_DOCS
2780: 49 5a 45 20 20 20 20 20 20 20 20 20 20 20 32 30  IZE           20
2790: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c  .#define SQL_SEL
27a0: 45 43 54 5f 44 4f 43 53 49 5a 45 20 20 20 20 20  ECT_DOCSIZE     
27b0: 20 20 20 20 20 20 20 32 31 0a 23 64 65 66 69 6e         21.#defin
27c0: 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 54 41  e SQL_SELECT_STA
27d0: 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T               
27e0: 32 32 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 52  22.#define SQL_R
27f0: 45 50 4c 41 43 45 5f 53 54 41 54 20 20 20 20 20  EPLACE_STAT     
2800: 20 20 20 20 20 20 20 20 20 32 33 0a 0a 23 64 65           23..#de
2810: 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f  fine SQL_SELECT_
2820: 41 4c 4c 5f 50 52 45 46 49 58 5f 4c 45 56 45 4c  ALL_PREFIX_LEVEL
2830: 20 20 20 32 34 0a 23 64 65 66 69 6e 65 20 53 51     24.#define SQ
2840: 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 54 45 52  L_DELETE_ALL_TER
2850: 4d 53 5f 53 45 47 44 49 52 20 20 20 32 35 0a 23  MS_SEGDIR   25.#
2860: 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54  define SQL_DELET
2870: 45 5f 53 45 47 44 49 52 5f 52 41 4e 47 45 20 20  E_SEGDIR_RANGE  
2880: 20 20 20 20 20 32 36 0a 23 64 65 66 69 6e 65 20       26.#define 
2890: 53 51 4c 5f 53 45 4c 45 43 54 5f 41 4c 4c 5f 4c  SQL_SELECT_ALL_L
28a0: 41 4e 47 49 44 20 20 20 20 20 20 20 20 20 32 37  ANGID         27
28b0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 46 49 4e  .#define SQL_FIN
28c0: 44 5f 4d 45 52 47 45 5f 4c 45 56 45 4c 20 20 20  D_MERGE_LEVEL   
28d0: 20 20 20 20 20 20 20 32 38 0a 23 64 65 66 69 6e         28.#defin
28e0: 65 20 53 51 4c 5f 4d 41 58 5f 4c 45 41 46 5f 4e  e SQL_MAX_LEAF_N
28f0: 4f 44 45 5f 45 53 54 49 4d 41 54 45 20 20 20 20  ODE_ESTIMATE    
2900: 32 39 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44  29.#define SQL_D
2910: 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 45 4e 54  ELETE_SEGDIR_ENT
2920: 52 59 20 20 20 20 20 20 20 33 30 0a 23 64 65 66  RY       30.#def
2930: 69 6e 65 20 53 51 4c 5f 53 48 49 46 54 5f 53 45  ine SQL_SHIFT_SE
2940: 47 44 49 52 5f 45 4e 54 52 59 20 20 20 20 20 20  GDIR_ENTRY      
2950: 20 20 33 31 0a 23 64 65 66 69 6e 65 20 53 51 4c    31.#define SQL
2960: 5f 53 45 4c 45 43 54 5f 53 45 47 44 49 52 20 20  _SELECT_SEGDIR  
2970: 20 20 20 20 20 20 20 20 20 20 20 33 32 0a 23 64             32.#d
2980: 65 66 69 6e 65 20 53 51 4c 5f 43 48 4f 4d 50 5f  efine SQL_CHOMP_
2990: 53 45 47 44 49 52 20 20 20 20 20 20 20 20 20 20  SEGDIR          
29a0: 20 20 20 20 33 33 0a 23 64 65 66 69 6e 65 20 53      33.#define S
29b0: 51 4c 5f 53 45 47 4d 45 4e 54 5f 49 53 5f 41 50  QL_SEGMENT_IS_AP
29c0: 50 45 4e 44 41 42 4c 45 20 20 20 20 20 33 34 0a  PENDABLE     34.
29d0: 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45  #define SQL_SELE
29e0: 43 54 5f 49 4e 44 45 58 45 53 20 20 20 20 20 20  CT_INDEXES      
29f0: 20 20 20 20 20 20 33 35 0a 23 64 65 66 69 6e 65        35.#define
2a00: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4d 58 4c 45   SQL_SELECT_MXLE
2a10: 56 45 4c 20 20 20 20 20 20 20 20 20 20 20 20 33  VEL            3
2a20: 36 0a 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53  6..#define SQL_S
2a30: 45 4c 45 43 54 5f 4c 45 56 45 4c 5f 52 41 4e 47  ELECT_LEVEL_RANG
2a40: 45 32 20 20 20 20 20 20 20 33 37 0a 23 64 65 66  E2       37.#def
2a50: 69 6e 65 20 53 51 4c 5f 55 50 44 41 54 45 5f 4c  ine SQL_UPDATE_L
2a60: 45 56 45 4c 5f 49 44 58 20 20 20 20 20 20 20 20  EVEL_IDX        
2a70: 20 20 33 38 0a 23 64 65 66 69 6e 65 20 53 51 4c    38.#define SQL
2a80: 5f 55 50 44 41 54 45 5f 4c 45 56 45 4c 20 20 20  _UPDATE_LEVEL   
2a90: 20 20 20 20 20 20 20 20 20 20 20 33 39 0a 0a 2f             39../
2aa0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2ab0: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6f 62  on is used to ob
2ac0: 74 61 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 70  tain an SQLite p
2ad0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
2ae0: 74 20 68 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72 20  t handle.** for 
2af0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 64  the statement id
2b00: 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20  entified by the 
2b10: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
2b20: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a   If successful,.
2b30: 2a 2a 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  ** *pp is set to
2b40: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
2b50: 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20  tatement handle 
2b60: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
2b70: 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72  turned..** Other
2b80: 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20  wise, an SQLite 
2b90: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2ba0: 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69  turned and *pp i
2bb0: 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a  s set to 0..**.*
2bc0: 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 61 70  * If argument ap
2bd0: 56 61 6c 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  Val is not NULL,
2be0: 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 70 6f   then it must po
2bf0: 69 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20  int to an array 
2c00: 77 69 74 68 0a 2a 2a 20 61 74 20 6c 65 61 73 74  with.** at least
2c10: 20 61 73 20 6d 61 6e 79 20 65 6e 74 72 69 65 73   as many entries
2c20: 20 61 73 20 74 68 65 20 72 65 71 75 65 73 74 65   as the requeste
2c30: 64 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20  d statement has 
2c40: 62 6f 75 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65  bound .** parame
2c50: 74 65 72 73 2e 20 54 68 65 20 76 61 6c 75 65 73  ters. The values
2c60: 20 61 72 65 20 62 6f 75 6e 64 20 74 6f 20 74 68   are bound to th
2c70: 65 20 73 74 61 74 65 6d 65 6e 74 73 20 70 61 72  e statements par
2c80: 61 6d 65 74 65 72 73 20 62 65 66 6f 72 65 0a 2a  ameters before.*
2c90: 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  * returning..*/.
2ca0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53  static int fts3S
2cb0: 71 6c 53 74 6d 74 28 0a 20 20 46 74 73 33 54 61  qlStmt(.  Fts3Ta
2cc0: 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
2cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
2ce0: 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
2cf0: 65 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74 6d 74  e */.  int eStmt
2d00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d10: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
2d20: 20 74 68 65 20 53 51 4c 5f 58 58 58 20 63 6f 6e   the SQL_XXX con
2d30: 73 74 61 6e 74 73 20 61 62 6f 76 65 20 2a 2f 0a  stants above */.
2d40: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2d50: 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pp,            
2d60: 20 20 2f 2a 20 4f 55 54 3a 20 53 74 61 74 65 6d    /* OUT: Statem
2d70: 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ent handle */.  
2d80: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
2d90: 61 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20  apVal           
2da0: 2f 2a 20 56 61 6c 75 65 73 20 74 6f 20 62 69 6e  /* Values to bin
2db0: 64 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 20 2a  d to statement *
2dc0: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
2dd0: 72 20 2a 61 7a 53 71 6c 5b 5d 20 3d 20 7b 0a 2f  r *azSql[] = {./
2de0: 2a 20 30 20 20 2a 2f 20 20 22 44 45 4c 45 54 45  * 0  */  "DELETE
2df0: 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 63 6f 6e   FROM %Q.'%q_con
2e00: 74 65 6e 74 27 20 57 48 45 52 45 20 72 6f 77 69  tent' WHERE rowi
2e10: 64 20 3d 20 3f 22 2c 0a 2f 2a 20 31 20 20 2a 2f  d = ?",./* 1  */
2e20: 20 20 22 53 45 4c 45 43 54 20 4e 4f 54 20 45 58    "SELECT NOT EX
2e30: 49 53 54 53 28 53 45 4c 45 43 54 20 64 6f 63 69  ISTS(SELECT doci
2e40: 64 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 63 6f  d FROM %Q.'%q_co
2e50: 6e 74 65 6e 74 27 20 57 48 45 52 45 20 72 6f 77  ntent' WHERE row
2e60: 69 64 21 3d 3f 29 22 2c 0a 2f 2a 20 32 20 20 2a  id!=?)",./* 2  *
2e70: 2f 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  /  "DELETE FROM 
2e80: 25 51 2e 27 25 71 5f 63 6f 6e 74 65 6e 74 27 22  %Q.'%q_content'"
2e90: 2c 0a 2f 2a 20 33 20 20 2a 2f 20 20 22 44 45 4c  ,./* 3  */  "DEL
2ea0: 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  ETE FROM %Q.'%q_
2eb0: 73 65 67 6d 65 6e 74 73 27 22 2c 0a 2f 2a 20 34  segments'",./* 4
2ec0: 20 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46 52    */  "DELETE FR
2ed0: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72  OM %Q.'%q_segdir
2ee0: 27 22 2c 0a 2f 2a 20 35 20 20 2a 2f 20 20 22 44  '",./* 5  */  "D
2ef0: 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25  ELETE FROM %Q.'%
2f00: 71 5f 64 6f 63 73 69 7a 65 27 22 2c 0a 2f 2a 20  q_docsize'",./* 
2f10: 36 20 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46  6  */  "DELETE F
2f20: 52 4f 4d 20 25 51 2e 27 25 71 5f 73 74 61 74 27  ROM %Q.'%q_stat'
2f30: 22 2c 0a 2f 2a 20 37 20 20 2a 2f 20 20 22 53 45  ",./* 7  */  "SE
2f40: 4c 45 43 54 20 25 73 20 57 48 45 52 45 20 72 6f  LECT %s WHERE ro
2f50: 77 69 64 3d 3f 22 2c 0a 2f 2a 20 38 20 20 2a 2f  wid=?",./* 8  */
2f60: 20 20 22 53 45 4c 45 43 54 20 28 53 45 4c 45 43    "SELECT (SELEC
2f70: 54 20 6d 61 78 28 69 64 78 29 20 46 52 4f 4d 20  T max(idx) FROM 
2f80: 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57  %Q.'%q_segdir' W
2f90: 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f 29 20  HERE level = ?) 
2fa0: 2b 20 31 22 2c 0a 2f 2a 20 39 20 20 2a 2f 20 20  + 1",./* 9  */  
2fb0: 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 51  "REPLACE INTO %Q
2fc0: 2e 27 25 71 5f 73 65 67 6d 65 6e 74 73 27 28 62  .'%q_segments'(b
2fd0: 6c 6f 63 6b 69 64 2c 20 62 6c 6f 63 6b 29 20 56  lockid, block) V
2fe0: 41 4c 55 45 53 28 3f 2c 20 3f 29 22 2c 0a 2f 2a  ALUES(?, ?)",./*
2ff0: 20 31 30 20 2a 2f 20 20 22 53 45 4c 45 43 54 20   10 */  "SELECT 
3000: 63 6f 61 6c 65 73 63 65 28 28 53 45 4c 45 43 54  coalesce((SELECT
3010: 20 6d 61 78 28 62 6c 6f 63 6b 69 64 29 20 46 52   max(blockid) FR
3020: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 6d 65 6e  OM %Q.'%q_segmen
3030: 74 73 27 29 20 2b 20 31 2c 20 31 29 22 2c 0a 2f  ts') + 1, 1)",./
3040: 2a 20 31 31 20 2a 2f 20 20 22 52 45 50 4c 41 43  * 11 */  "REPLAC
3050: 45 20 49 4e 54 4f 20 25 51 2e 27 25 71 5f 73 65  E INTO %Q.'%q_se
3060: 67 64 69 72 27 20 56 41 4c 55 45 53 28 3f 2c 3f  gdir' VALUES(?,?
3070: 2c 3f 2c 3f 2c 3f 2c 3f 29 22 2c 0a 0a 20 20 20  ,?,?,?,?)",..   
3080: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
3090: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6f 72 64   segments in ord
30a0: 65 72 20 66 72 6f 6d 20 6f 6c 64 65 73 74 20 74  er from oldest t
30b0: 6f 20 6e 65 77 65 73 74 2e 2a 2f 20 0a 2f 2a 20  o newest.*/ ./* 
30c0: 31 32 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 69  12 */  "SELECT i
30d0: 64 78 2c 20 73 74 61 72 74 5f 62 6c 6f 63 6b 2c  dx, start_block,
30e0: 20 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63   leaves_end_bloc
30f0: 6b 2c 20 65 6e 64 5f 62 6c 6f 63 6b 2c 20 72 6f  k, end_block, ro
3100: 6f 74 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ot ".           
3110: 20 22 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65   "FROM %Q.'%q_se
3120: 67 64 69 72 27 20 57 48 45 52 45 20 6c 65 76 65  gdir' WHERE leve
3130: 6c 20 3d 20 3f 20 4f 52 44 45 52 20 42 59 20 69  l = ? ORDER BY i
3140: 64 78 20 41 53 43 22 2c 0a 2f 2a 20 31 33 20 2a  dx ASC",./* 13 *
3150: 2f 20 20 22 53 45 4c 45 43 54 20 69 64 78 2c 20  /  "SELECT idx, 
3160: 73 74 61 72 74 5f 62 6c 6f 63 6b 2c 20 6c 65 61  start_block, lea
3170: 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 2c 20 65  ves_end_block, e
3180: 6e 64 5f 62 6c 6f 63 6b 2c 20 72 6f 6f 74 20 22  nd_block, root "
3190: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 46 52  .            "FR
31a0: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72  OM %Q.'%q_segdir
31b0: 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20 42 45  ' WHERE level BE
31c0: 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 22 0a 20  TWEEN ? AND ?". 
31d0: 20 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45             "ORDE
31e0: 52 20 42 59 20 6c 65 76 65 6c 20 44 45 53 43 2c  R BY level DESC,
31f0: 20 69 64 78 20 41 53 43 22 2c 0a 0a 2f 2a 20 31   idx ASC",../* 1
3200: 34 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 63 6f  4 */  "SELECT co
3210: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 51 2e 27  unt(*) FROM %Q.'
3220: 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52 45  %q_segdir' WHERE
3230: 20 6c 65 76 65 6c 20 3d 20 3f 22 2c 0a 2f 2a 20   level = ?",./* 
3240: 31 35 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 6d  15 */  "SELECT m
3250: 61 78 28 6c 65 76 65 6c 29 20 46 52 4f 4d 20 25  ax(level) FROM %
3260: 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57 48  Q.'%q_segdir' WH
3270: 45 52 45 20 6c 65 76 65 6c 20 42 45 54 57 45 45  ERE level BETWEE
3280: 4e 20 3f 20 41 4e 44 20 3f 22 2c 0a 0a 2f 2a 20  N ? AND ?",../* 
3290: 31 36 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46  16 */  "DELETE F
32a0: 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69  ROM %Q.'%q_segdi
32b0: 72 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d  r' WHERE level =
32c0: 20 3f 22 2c 0a 2f 2a 20 31 37 20 2a 2f 20 20 22   ?",./* 17 */  "
32d0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 27  DELETE FROM %Q.'
32e0: 25 71 5f 73 65 67 6d 65 6e 74 73 27 20 57 48 45  %q_segments' WHE
32f0: 52 45 20 62 6c 6f 63 6b 69 64 20 42 45 54 57 45  RE blockid BETWE
3300: 45 4e 20 3f 20 41 4e 44 20 3f 22 2c 0a 2f 2a 20  EN ? AND ?",./* 
3310: 31 38 20 2a 2f 20 20 22 49 4e 53 45 52 54 20 49  18 */  "INSERT I
3320: 4e 54 4f 20 25 51 2e 27 25 71 5f 63 6f 6e 74 65  NTO %Q.'%q_conte
3330: 6e 74 27 20 56 41 4c 55 45 53 28 25 73 29 22 2c  nt' VALUES(%s)",
3340: 0a 2f 2a 20 31 39 20 2a 2f 20 20 22 44 45 4c 45  ./* 19 */  "DELE
3350: 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 64  TE FROM %Q.'%q_d
3360: 6f 63 73 69 7a 65 27 20 57 48 45 52 45 20 64 6f  ocsize' WHERE do
3370: 63 69 64 20 3d 20 3f 22 2c 0a 2f 2a 20 32 30 20  cid = ?",./* 20 
3380: 2a 2f 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54  */  "REPLACE INT
3390: 4f 20 25 51 2e 27 25 71 5f 64 6f 63 73 69 7a 65  O %Q.'%q_docsize
33a0: 27 20 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 0a  ' VALUES(?,?)",.
33b0: 2f 2a 20 32 31 20 2a 2f 20 20 22 53 45 4c 45 43  /* 21 */  "SELEC
33c0: 54 20 73 69 7a 65 20 46 52 4f 4d 20 25 51 2e 27  T size FROM %Q.'
33d0: 25 71 5f 64 6f 63 73 69 7a 65 27 20 57 48 45 52  %q_docsize' WHER
33e0: 45 20 64 6f 63 69 64 3d 3f 22 2c 0a 2f 2a 20 32  E docid=?",./* 2
33f0: 32 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 76 61  2 */  "SELECT va
3400: 6c 75 65 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  lue FROM %Q.'%q_
3410: 73 74 61 74 27 20 57 48 45 52 45 20 69 64 3d 3f  stat' WHERE id=?
3420: 22 2c 0a 2f 2a 20 32 33 20 2a 2f 20 20 22 52 45  ",./* 23 */  "RE
3430: 50 4c 41 43 45 20 49 4e 54 4f 20 25 51 2e 27 25  PLACE INTO %Q.'%
3440: 71 5f 73 74 61 74 27 20 56 41 4c 55 45 53 28 3f  q_stat' VALUES(?
3450: 2c 3f 29 22 2c 0a 2f 2a 20 32 34 20 2a 2f 20 20  ,?)",./* 24 */  
3460: 22 22 2c 0a 2f 2a 20 32 35 20 2a 2f 20 20 22 22  "",./* 25 */  ""
3470: 2c 0a 0a 2f 2a 20 32 36 20 2a 2f 20 22 44 45 4c  ,../* 26 */ "DEL
3480: 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  ETE FROM %Q.'%q_
3490: 73 65 67 64 69 72 27 20 57 48 45 52 45 20 6c 65  segdir' WHERE le
34a0: 76 65 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e  vel BETWEEN ? AN
34b0: 44 20 3f 22 2c 0a 2f 2a 20 32 37 20 2a 2f 20 22  D ?",./* 27 */ "
34c0: 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
34d0: 6c 65 76 65 6c 20 2f 20 28 31 30 32 34 20 2a 20  level / (1024 * 
34e0: 3f 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73  ?) FROM %Q.'%q_s
34f0: 65 67 64 69 72 27 22 2c 0a 0a 2f 2a 20 54 68 69  egdir'",../* Thi
3500: 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75  s statement is u
3510: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
3520: 20 77 68 69 63 68 20 6c 65 76 65 6c 20 74 6f 20   which level to 
3530: 72 65 61 64 20 74 68 65 20 69 6e 70 75 74 20 66  read the input f
3540: 72 6f 6d 0a 2a 2a 20 77 68 65 6e 20 70 65 72 66  rom.** when perf
3550: 6f 72 6d 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d  orming an increm
3560: 65 6e 74 61 6c 20 6d 65 72 67 65 2e 20 49 74 20  ental merge. It 
3570: 72 65 74 75 72 6e 73 20 74 68 65 20 61 62 73 6f  returns the abso
3580: 6c 75 74 65 20 6c 65 76 65 6c 20 6e 75 6d 62 65  lute level numbe
3590: 72 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 6c 64 65  r.** of the olde
35a0: 73 74 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20  st level in the 
35b0: 64 62 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  db that contains
35c0: 20 61 74 20 6c 65 61 73 74 20 3f 20 73 65 67 6d   at least ? segm
35d0: 65 6e 74 73 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20  ents. Or,.** if 
35e0: 6e 6f 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20  no level in the 
35f0: 46 54 53 20 69 6e 64 65 78 20 63 6f 6e 74 61 69  FTS index contai
3600: 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 3f 20 73  ns more than ? s
3610: 65 67 6d 65 6e 74 73 2c 20 74 68 65 20 73 74 61  egments, the sta
3620: 74 65 6d 65 6e 74 0a 2a 2a 20 72 65 74 75 72 6e  tement.** return
3630: 73 20 7a 65 72 6f 20 72 6f 77 73 2e 20 20 2a 2f  s zero rows.  */
3640: 0a 2f 2a 20 32 38 20 2a 2f 20 22 53 45 4c 45 43  ./* 28 */ "SELEC
3650: 54 20 6c 65 76 65 6c 20 46 52 4f 4d 20 25 51 2e  T level FROM %Q.
3660: 27 25 71 5f 73 65 67 64 69 72 27 20 47 52 4f 55  '%q_segdir' GROU
3670: 50 20 42 59 20 6c 65 76 65 6c 20 48 41 56 49 4e  P BY level HAVIN
3680: 47 20 63 6f 75 6e 74 28 2a 29 3e 3d 3f 22 0a 20  G count(*)>=?". 
3690: 20 20 20 20 20 20 20 20 22 20 20 4f 52 44 45 52          "  ORDER
36a0: 20 42 59 20 28 6c 65 76 65 6c 20 25 25 20 31 30   BY (level %% 10
36b0: 32 34 29 20 41 53 43 20 4c 49 4d 49 54 20 31 22  24) ASC LIMIT 1"
36c0: 2c 0a 0a 2f 2a 20 45 73 74 69 6d 61 74 65 20 74  ,../* Estimate t
36d0: 68 65 20 75 70 70 65 72 20 6c 69 6d 69 74 20 6f  he upper limit o
36e0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
36f0: 6c 65 61 66 20 6e 6f 64 65 73 20 69 6e 20 61 20  leaf nodes in a 
3700: 6e 65 77 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 63  new segment.** c
3710: 72 65 61 74 65 64 20 62 79 20 6d 65 72 67 69 6e  reated by mergin
3720: 67 20 74 68 65 20 6f 6c 64 65 73 74 20 3a 32 20  g the oldest :2 
3730: 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 61 62  segments from ab
3740: 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 3a 31 2e  solute level :1.
3750: 20 53 65 65 20 0a 2a 2a 20 66 75 6e 63 74 69 6f   See .** functio
3760: 6e 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 63  n sqlite3Fts3Inc
3770: 72 6d 65 72 67 65 28 29 20 66 6f 72 20 64 65 74  rmerge() for det
3780: 61 69 6c 73 2e 20 20 2a 2f 0a 2f 2a 20 32 39 20  ails.  */./* 29 
3790: 2a 2f 20 22 53 45 4c 45 43 54 20 32 20 2a 20 74  */ "SELECT 2 * t
37a0: 6f 74 61 6c 28 31 20 2b 20 6c 65 61 76 65 73 5f  otal(1 + leaves_
37b0: 65 6e 64 5f 62 6c 6f 63 6b 20 2d 20 73 74 61 72  end_block - star
37c0: 74 5f 62 6c 6f 63 6b 29 20 22 0a 20 20 20 20 20  t_block) ".     
37d0: 20 20 20 20 22 20 20 46 52 4f 4d 20 25 51 2e 27      "  FROM %Q.'
37e0: 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52 45  %q_segdir' WHERE
37f0: 20 6c 65 76 65 6c 20 3d 20 3f 20 41 4e 44 20 69   level = ? AND i
3800: 64 78 20 3c 20 3f 22 2c 0a 0a 2f 2a 20 53 51 4c  dx < ?",../* SQL
3810: 5f 44 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 45  _DELETE_SEGDIR_E
3820: 4e 54 52 59 0a 2a 2a 20 20 20 44 65 6c 65 74 65  NTRY.**   Delete
3830: 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 65 6e   the %_segdir en
3840: 74 72 79 20 6f 6e 20 61 62 73 6f 6c 75 74 65 20  try on absolute 
3850: 6c 65 76 65 6c 20 3a 31 20 77 69 74 68 20 69 6e  level :1 with in
3860: 64 65 78 20 3a 32 2e 20 20 2a 2f 0a 2f 2a 20 33  dex :2.  */./* 3
3870: 30 20 2a 2f 20 22 44 45 4c 45 54 45 20 46 52 4f  0 */ "DELETE FRO
3880: 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27  M %Q.'%q_segdir'
3890: 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f   WHERE level = ?
38a0: 20 41 4e 44 20 69 64 78 20 3d 20 3f 22 2c 0a 0a   AND idx = ?",..
38b0: 2f 2a 20 53 51 4c 5f 53 48 49 46 54 5f 53 45 47  /* SQL_SHIFT_SEG
38c0: 44 49 52 5f 45 4e 54 52 59 0a 2a 2a 20 20 20 4d  DIR_ENTRY.**   M
38d0: 6f 64 69 66 79 20 74 68 65 20 69 64 78 20 76 61  odify the idx va
38e0: 6c 75 65 20 66 6f 72 20 74 68 65 20 73 65 67 6d  lue for the segm
38f0: 65 6e 74 20 77 69 74 68 20 69 64 78 3d 3a 33 20  ent with idx=:3 
3900: 6f 6e 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65  on absolute leve
3910: 6c 20 3a 32 0a 2a 2a 20 20 20 74 6f 20 3a 31 2e  l :2.**   to :1.
3920: 20 20 2a 2f 0a 2f 2a 20 33 31 20 2a 2f 20 22 55    */./* 31 */ "U
3930: 50 44 41 54 45 20 25 51 2e 27 25 71 5f 73 65 67  PDATE %Q.'%q_seg
3940: 64 69 72 27 20 53 45 54 20 69 64 78 20 3d 20 3f  dir' SET idx = ?
3950: 20 57 48 45 52 45 20 6c 65 76 65 6c 3d 3f 20 41   WHERE level=? A
3960: 4e 44 20 69 64 78 3d 3f 22 2c 0a 0a 2f 2a 20 53  ND idx=?",../* S
3970: 51 4c 5f 53 45 4c 45 43 54 5f 53 45 47 44 49 52  QL_SELECT_SEGDIR
3980: 0a 2a 2a 20 20 20 52 65 61 64 20 61 20 73 69 6e  .**   Read a sin
3990: 67 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 74  gle entry from t
39a0: 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c  he %_segdir tabl
39b0: 65 2e 20 54 68 65 20 65 6e 74 72 79 20 66 72 6f  e. The entry fro
39c0: 6d 20 61 62 73 6f 6c 75 74 65 20 0a 2a 2a 20 20  m absolute .**  
39d0: 20 6c 65 76 65 6c 20 3a 31 20 77 69 74 68 20 69   level :1 with i
39e0: 6e 64 65 78 20 76 61 6c 75 65 20 3a 32 2e 20 20  ndex value :2.  
39f0: 2a 2f 0a 2f 2a 20 33 32 20 2a 2f 20 20 22 53 45  */./* 32 */  "SE
3a00: 4c 45 43 54 20 69 64 78 2c 20 73 74 61 72 74 5f  LECT idx, start_
3a10: 62 6c 6f 63 6b 2c 20 6c 65 61 76 65 73 5f 65 6e  block, leaves_en
3a20: 64 5f 62 6c 6f 63 6b 2c 20 65 6e 64 5f 62 6c 6f  d_block, end_blo
3a30: 63 6b 2c 20 72 6f 6f 74 20 22 0a 20 20 20 20 20  ck, root ".     
3a40: 20 20 20 20 20 20 20 22 46 52 4f 4d 20 25 51 2e         "FROM %Q.
3a50: 27 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52  '%q_segdir' 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 43 48 4f 4d 50 5f 53 45 47 44 49 52 0a 2a  L_CHOMP_SEGDIR.*
3a90: 2a 20 20 20 55 70 64 61 74 65 20 74 68 65 20 73  *   Update the s
3aa0: 74 61 72 74 5f 62 6c 6f 63 6b 20 28 3a 31 29 20  tart_block (:1) 
3ab0: 61 6e 64 20 72 6f 6f 74 20 28 3a 32 29 20 66 69  and root (:2) fi
3ac0: 65 6c 64 73 20 6f 66 20 74 68 65 20 25 5f 73 65  elds of the %_se
3ad0: 67 64 69 72 0a 2a 2a 20 20 20 65 6e 74 72 79 20  gdir.**   entry 
3ae0: 6c 6f 63 61 74 65 64 20 6f 6e 20 61 62 73 6f 6c  located on absol
3af0: 75 74 65 20 6c 65 76 65 6c 20 3a 33 20 77 69 74  ute level :3 wit
3b00: 68 20 69 6e 64 65 78 20 3a 34 2e 20 20 2a 2f 0a  h index :4.  */.
3b10: 2f 2a 20 33 33 20 2a 2f 20 20 22 55 50 44 41 54  /* 33 */  "UPDAT
3b20: 45 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27  E %Q.'%q_segdir'
3b30: 20 53 45 54 20 73 74 61 72 74 5f 62 6c 6f 63 6b   SET start_block
3b40: 20 3d 20 3f 2c 20 72 6f 6f 74 20 3d 20 3f 22 0a   = ?, root = ?".
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 22 57 48 45              "WHE
3b60: 52 45 20 6c 65 76 65 6c 20 3d 20 3f 20 41 4e 44  RE level = ? AND
3b70: 20 69 64 78 20 3d 20 3f 22 2c 0a 0a 2f 2a 20 53   idx = ?",../* S
3b80: 51 4c 5f 53 45 47 4d 45 4e 54 5f 49 53 5f 41 50  QL_SEGMENT_IS_AP
3b90: 50 45 4e 44 41 42 4c 45 0a 2a 2a 20 20 20 52 65  PENDABLE.**   Re
3ba0: 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f  turn a single ro
3bb0: 77 20 69 66 20 74 68 65 20 73 65 67 6d 65 6e 74  w if the segment
3bc0: 20 77 69 74 68 20 65 6e 64 5f 62 6c 6f 63 6b 3d   with end_block=
3bd0: 3f 20 69 73 20 61 70 70 65 6e 64 61 62 6c 65 2e  ? is appendable.
3be0: 20 4f 72 0a 2a 2a 20 20 20 6e 6f 20 72 6f 77 73   Or.**   no rows
3bf0: 20 6f 74 68 65 72 77 69 73 65 2e 20 20 2a 2f 0a   otherwise.  */.
3c00: 2f 2a 20 33 34 20 2a 2f 20 20 22 53 45 4c 45 43  /* 34 */  "SELEC
3c10: 54 20 31 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  T 1 FROM %Q.'%q_
3c20: 73 65 67 6d 65 6e 74 73 27 20 57 48 45 52 45 20  segments' WHERE 
3c30: 62 6c 6f 63 6b 69 64 3d 3f 20 41 4e 44 20 62 6c  blockid=? AND bl
3c40: 6f 63 6b 20 49 53 20 4e 55 4c 4c 22 2c 0a 0a 2f  ock IS NULL",../
3c50: 2a 20 53 51 4c 5f 53 45 4c 45 43 54 5f 49 4e 44  * SQL_SELECT_IND
3c60: 45 58 45 53 0a 2a 2a 20 20 20 52 65 74 75 72 6e  EXES.**   Return
3c70: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 76 61 6c   the list of val
3c80: 69 64 20 73 65 67 6d 65 6e 74 20 69 6e 64 65 78  id segment index
3c90: 65 73 20 66 6f 72 20 61 62 73 6f 6c 75 74 65 20  es for absolute 
3ca0: 6c 65 76 65 6c 20 3f 20 20 2a 2f 0a 2f 2a 20 33  level ?  */./* 3
3cb0: 35 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 69 64  5 */  "SELECT id
3cc0: 78 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65  x FROM %Q.'%q_se
3cd0: 67 64 69 72 27 20 57 48 45 52 45 20 6c 65 76 65  gdir' WHERE leve
3ce0: 6c 3d 3f 20 4f 52 44 45 52 20 42 59 20 31 20 41  l=? ORDER BY 1 A
3cf0: 53 43 22 2c 0a 0a 2f 2a 20 53 51 4c 5f 53 45 4c  SC",../* SQL_SEL
3d00: 45 43 54 5f 4d 58 4c 45 56 45 4c 0a 2a 2a 20 20  ECT_MXLEVEL.**  
3d10: 20 52 65 74 75 72 6e 20 74 68 65 20 6c 61 72 67   Return the larg
3d20: 65 73 74 20 72 65 6c 61 74 69 76 65 20 6c 65 76  est relative lev
3d30: 65 6c 20 69 6e 20 74 68 65 20 46 54 53 20 69 6e  el in the FTS in
3d40: 64 65 78 20 6f 72 20 69 6e 64 65 78 65 73 2e 20  dex or indexes. 
3d50: 20 2a 2f 0a 2f 2a 20 33 36 20 2a 2f 20 20 22 53   */./* 36 */  "S
3d60: 45 4c 45 43 54 20 6d 61 78 28 20 6c 65 76 65 6c  ELECT max( level
3d70: 20 25 25 20 31 30 32 34 20 29 20 46 52 4f 4d 20   %% 1024 ) FROM 
3d80: 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 22 2c  %Q.'%q_segdir'",
3d90: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ..          /* R
3da0: 65 74 75 72 6e 20 73 65 67 6d 65 6e 74 73 20 69  eturn segments i
3db0: 6e 20 6f 72 64 65 72 20 66 72 6f 6d 20 6f 6c 64  n order from old
3dc0: 65 73 74 20 74 6f 20 6e 65 77 65 73 74 2e 2a 2f  est to newest.*/
3dd0: 20 0a 2f 2a 20 33 37 20 2a 2f 20 20 22 53 45 4c   ./* 37 */  "SEL
3de0: 45 43 54 20 6c 65 76 65 6c 2c 20 69 64 78 2c 20  ECT level, idx, 
3df0: 65 6e 64 5f 62 6c 6f 63 6b 20 22 0a 20 20 20 20  end_block ".    
3e00: 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 25 51          "FROM %Q
3e10: 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57 48 45  .'%q_segdir' WHE
3e20: 52 45 20 6c 65 76 65 6c 20 42 45 54 57 45 45 4e  RE level BETWEEN
3e30: 20 3f 20 41 4e 44 20 3f 20 22 0a 20 20 20 20 20   ? AND ? ".     
3e40: 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59         "ORDER BY
3e50: 20 6c 65 76 65 6c 20 44 45 53 43 2c 20 69 64 78   level DESC, idx
3e60: 20 41 53 43 22 2c 0a 0a 20 20 20 20 20 20 20 20   ASC",..        
3e70: 20 20 2f 2a 20 55 70 64 61 74 65 20 73 74 61 74    /* Update stat
3e80: 65 6d 65 6e 74 73 20 75 73 65 64 20 77 68 69 6c  ements used whil
3e90: 65 20 70 72 6f 6d 6f 74 69 6e 67 20 73 65 67 6d  e promoting segm
3ea0: 65 6e 74 73 20 2a 2f 0a 2f 2a 20 33 38 20 2a 2f  ents */./* 38 */
3eb0: 20 20 22 55 50 44 41 54 45 20 4f 52 20 46 41 49    "UPDATE OR FAI
3ec0: 4c 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27  L %Q.'%q_segdir'
3ed0: 20 53 45 54 20 6c 65 76 65 6c 3d 2d 31 2c 69 64   SET level=-1,id
3ee0: 78 3d 3f 20 22 0a 20 20 20 20 20 20 20 20 20 20  x=? ".          
3ef0: 20 20 22 57 48 45 52 45 20 6c 65 76 65 6c 3d 3f    "WHERE level=?
3f00: 20 41 4e 44 20 69 64 78 3d 3f 22 2c 0a 2f 2a 20   AND idx=?",./* 
3f10: 33 39 20 2a 2f 20 20 22 55 50 44 41 54 45 20 4f  39 */  "UPDATE O
3f20: 52 20 46 41 49 4c 20 25 51 2e 27 25 71 5f 73 65  R FAIL %Q.'%q_se
3f30: 67 64 69 72 27 20 53 45 54 20 6c 65 76 65 6c 3d  gdir' SET level=
3f40: 3f 20 57 48 45 52 45 20 6c 65 76 65 6c 3d 2d 31  ? WHERE level=-1
3f50: 22 0a 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 72 63  "..  };.  int rc
3f60: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
3f70: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
3f80: 74 6d 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  tmt;..  assert( 
3f90: 53 69 7a 65 6f 66 41 72 72 61 79 28 61 7a 53 71  SizeofArray(azSq
3fa0: 6c 29 3d 3d 53 69 7a 65 6f 66 41 72 72 61 79 28  l)==SizeofArray(
3fb0: 70 2d 3e 61 53 74 6d 74 29 20 29 3b 0a 20 20 61  p->aStmt) );.  a
3fc0: 73 73 65 72 74 28 20 65 53 74 6d 74 3c 53 69 7a  ssert( eStmt<Siz
3fd0: 65 6f 66 41 72 72 61 79 28 61 7a 53 71 6c 29 20  eofArray(azSql) 
3fe0: 26 26 20 65 53 74 6d 74 3e 3d 30 20 29 3b 0a 20  && eStmt>=0 );. 
3ff0: 20 0a 20 20 70 53 74 6d 74 20 3d 20 70 2d 3e 61   .  pStmt = p->a
4000: 53 74 6d 74 5b 65 53 74 6d 74 5d 3b 0a 20 20 69  Stmt[eStmt];.  i
4010: 66 28 20 21 70 53 74 6d 74 20 29 7b 0a 20 20 20  f( !pStmt ){.   
4020: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20   char *zSql;.   
4030: 20 69 66 28 20 65 53 74 6d 74 3d 3d 53 51 4c 5f   if( eStmt==SQL_
4040: 43 4f 4e 54 45 4e 54 5f 49 4e 53 45 52 54 20 29  CONTENT_INSERT )
4050: 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73  {.      zSql = s
4060: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
4070: 7a 53 71 6c 5b 65 53 74 6d 74 5d 2c 20 70 2d 3e  zSql[eStmt], p->
4080: 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70  zDb, p->zName, p
4090: 2d 3e 7a 57 72 69 74 65 45 78 70 72 6c 69 73 74  ->zWriteExprlist
40a0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
40b0: 20 65 53 74 6d 74 3d 3d 53 51 4c 5f 53 45 4c 45   eStmt==SQL_SELE
40c0: 43 54 5f 43 4f 4e 54 45 4e 54 5f 42 59 5f 52 4f  CT_CONTENT_BY_RO
40d0: 57 49 44 20 29 7b 0a 20 20 20 20 20 20 7a 53 71  WID ){.      zSq
40e0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
40f0: 6e 74 66 28 61 7a 53 71 6c 5b 65 53 74 6d 74 5d  ntf(azSql[eStmt]
4100: 2c 20 70 2d 3e 7a 52 65 61 64 45 78 70 72 6c 69  , p->zReadExprli
4110: 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  st);.    }else{.
4120: 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
4130: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 7a 53  ite3_mprintf(azS
4140: 71 6c 5b 65 53 74 6d 74 5d 2c 20 70 2d 3e 7a 44  ql[eStmt], p->zD
4150: 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  b, p->zName);.  
4160: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a 53 71    }.    if( !zSq
4170: 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
4180: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
4190: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
41a0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
41b0: 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
41c0: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
41d0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
41e0: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
41f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
4200: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
4210: 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
4220: 20 20 70 2d 3e 61 53 74 6d 74 5b 65 53 74 6d 74    p->aStmt[eStmt
4230: 5d 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 7d  ] = pStmt;.    }
4240: 0a 20 20 7d 0a 20 20 69 66 28 20 61 70 56 61 6c  .  }.  if( apVal
4250: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
4260: 20 20 20 69 6e 74 20 6e 50 61 72 61 6d 20 3d 20     int nParam = 
4270: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
4280: 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74  ameter_count(pSt
4290: 6d 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  mt);.    for(i=0
42a0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
42b0: 26 26 20 69 3c 6e 50 61 72 61 6d 3b 20 69 2b 2b  && i<nParam; i++
42c0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
42d0: 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65  lite3_bind_value
42e0: 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61 70 56  (pStmt, i+1, apV
42f0: 61 6c 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  al[i]);.    }.  
4300: 7d 0a 20 20 2a 70 70 20 3d 20 70 53 74 6d 74 3b  }.  *pp = pStmt;
4310: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4320: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
4330: 33 53 65 6c 65 63 74 44 6f 63 73 69 7a 65 28 0a  3SelectDocsize(.
4340: 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 54 61    Fts3Table *pTa
4350: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
4360: 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20    /* FTS3 table 
4370: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69  handle */.  sqli
4380: 74 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64  te3_int64 iDocid
4390: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ,           /* D
43a0: 6f 63 69 64 20 74 6f 20 62 69 6e 64 20 66 6f 72  ocid to bind for
43b0: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 44 4f 43 53   SQL_SELECT_DOCS
43c0: 49 5a 45 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  IZE */.  sqlite3
43d0: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 20 20  _stmt **ppStmt  
43e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
43f0: 20 53 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   Statement handl
4400: 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
4410: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
4420: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61  0;        /* Sta
4430: 74 65 6d 65 6e 74 20 72 65 71 75 65 73 74 65 64  tement requested
4440: 20 66 72 6f 6d 20 66 74 73 33 53 71 6c 53 74 6d   from fts3SqlStm
4450: 74 28 29 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  t() */.  int rc;
4460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4470: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
4480: 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 72 63  rn code */..  rc
4490: 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
44a0: 54 61 62 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f  Tab, SQL_SELECT_
44b0: 44 4f 43 53 49 5a 45 2c 20 26 70 53 74 6d 74 2c  DOCSIZE, &pStmt,
44c0: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
44d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
44e0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
44f0: 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 69 44 6f  64(pStmt, 1, iDo
4500: 63 69 64 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  cid);.    rc = s
4510: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
4520: 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
4530: 53 51 4c 49 54 45 5f 52 4f 57 20 7c 7c 20 73 71  SQLITE_ROW || sq
4540: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
4550: 65 28 70 53 74 6d 74 2c 20 30 29 21 3d 53 51 4c  e(pStmt, 0)!=SQL
4560: 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20  ITE_BLOB ){.    
4570: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
4580: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  eset(pStmt);.   
4590: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
45a0: 45 5f 4f 4b 20 29 20 72 63 20 3d 20 46 54 53 5f  E_OK ) rc = FTS_
45b0: 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20  CORRUPT_VTAB;.  
45c0: 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20      pStmt = 0;. 
45d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
45e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
45f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70      }.  }..  *pp
4600: 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20  Stmt = pStmt;.  
4610: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e  return rc;.}..in
4620: 74 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 6c  t sqlite3Fts3Sel
4630: 65 63 74 44 6f 63 74 6f 74 61 6c 28 0a 20 20 46  ectDoctotal(.  F
4640: 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  ts3Table *pTab, 
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4660: 2a 20 46 74 73 33 20 74 61 62 6c 65 20 68 61 6e  * Fts3 table han
4670: 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dle */.  sqlite3
4680: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 20 20  _stmt **ppStmt  
4690: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
46a0: 20 53 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   Statement handl
46b0: 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
46c0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
46d0: 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72  0;.  int rc;.  r
46e0: 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
46f0: 70 54 61 62 2c 20 53 51 4c 5f 53 45 4c 45 43 54  pTab, SQL_SELECT
4700: 5f 53 54 41 54 2c 20 26 70 53 74 6d 74 2c 20 30  _STAT, &pStmt, 0
4710: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
4720: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
4730: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
4740: 53 74 6d 74 2c 20 31 2c 20 46 54 53 5f 53 54 41  Stmt, 1, FTS_STA
4750: 54 5f 44 4f 43 54 4f 54 41 4c 29 3b 0a 20 20 20  T_DOCTOTAL);.   
4760: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65   if( sqlite3_ste
4770: 70 28 70 53 74 6d 74 29 21 3d 53 51 4c 49 54 45  p(pStmt)!=SQLITE
4780: 5f 52 4f 57 0a 20 20 20 20 20 7c 7c 20 73 71 6c  _ROW.     || sql
4790: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
47a0: 28 70 53 74 6d 74 2c 20 30 29 21 3d 53 51 4c 49  (pStmt, 0)!=SQLI
47b0: 54 45 5f 42 4c 4f 42 0a 20 20 20 20 29 7b 0a 20  TE_BLOB.    ){. 
47c0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
47d0: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
47e0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
47f0: 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 46  LITE_OK ) rc = F
4800: 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b  TS_CORRUPT_VTAB;
4810: 0a 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20 30  .      pStmt = 0
4820: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
4830: 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20  pStmt = pStmt;. 
4840: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69   return rc;.}..i
4850: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 53 65  nt sqlite3Fts3Se
4860: 6c 65 63 74 44 6f 63 73 69 7a 65 28 0a 20 20 46  lectDocsize(.  F
4870: 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  ts3Table *pTab, 
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4890: 2a 20 46 74 73 33 20 74 61 62 6c 65 20 68 61 6e  * Fts3 table han
48a0: 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dle */.  sqlite3
48b0: 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 2c 20 20  _int64 iDocid,  
48c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 69           /* Doci
48d0: 64 20 74 6f 20 72 65 61 64 20 73 69 7a 65 20 64  d to read size d
48e0: 61 74 61 20 66 6f 72 20 2a 2f 0a 20 20 73 71 6c  ata for */.  sql
48f0: 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
4900: 6d 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mt           /* 
4910: 4f 55 54 3a 20 53 74 61 74 65 6d 65 6e 74 20 68  OUT: Statement h
4920: 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a 20 20 72 65  andle */.){.  re
4930: 74 75 72 6e 20 66 74 73 33 53 65 6c 65 63 74 44  turn fts3SelectD
4940: 6f 63 73 69 7a 65 28 70 54 61 62 2c 20 69 44 6f  ocsize(pTab, iDo
4950: 63 69 64 2c 20 70 70 53 74 6d 74 29 3b 0a 7d 0a  cid, ppStmt);.}.
4960: 0a 2f 2a 0a 2a 2a 20 53 69 6d 69 6c 61 72 20 74  ./*.** Similar t
4970: 6f 20 66 74 73 33 53 71 6c 53 74 6d 74 28 29 2e  o fts3SqlStmt().
4980: 20 45 78 63 65 70 74 2c 20 61 66 74 65 72 20 62   Except, after b
4990: 69 6e 64 69 6e 67 20 74 68 65 20 70 61 72 61 6d  inding the param
49a0: 65 74 65 72 73 20 69 6e 0a 2a 2a 20 61 72 72 61  eters in.** arra
49b0: 79 20 61 70 56 61 6c 5b 5d 20 74 6f 20 74 68 65  y apVal[] to the
49c0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
49d0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 65 53 74  dentified by eSt
49e0: 6d 74 2c 20 74 68 65 20 73 74 61 74 65 6d 65 6e  mt, the statemen
49f0: 74 0a 2a 2a 20 69 73 20 65 78 65 63 75 74 65 64  t.** is executed
4a00: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  ..**.** Returns 
4a10: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
4a20: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 75   statement is su
4a30: 63 63 65 73 73 66 75 6c 6c 79 20 65 78 65 63 75  ccessfully execu
4a40: 74 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 53 51  ted, or an.** SQ
4a50: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
4a60: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
4a70: 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 53 71  atic void fts3Sq
4a80: 6c 45 78 65 63 28 0a 20 20 69 6e 74 20 2a 70 52  lExec(.  int *pR
4a90: 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C,              
4aa0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
4ab0: 20 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c 65 20   */.  Fts3Table 
4ac0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
4ad0: 2a 20 54 68 65 20 46 54 53 33 20 74 61 62 6c 65  * The FTS3 table
4ae0: 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74 6d 74 2c   */.  int eStmt,
4af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4b00: 2a 20 49 6e 64 65 78 20 6f 66 20 73 74 61 74 65  * Index of state
4b10: 6d 65 6e 74 20 74 6f 20 65 76 61 6c 75 61 74 65  ment to evaluate
4b20: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
4b30: 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 2f  lue **apVal    /
4b40: 2a 20 50 61 72 61 6d 65 74 65 72 73 20 74 6f 20  * Parameters to 
4b50: 62 69 6e 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  bind */.){.  sql
4b60: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
4b70: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
4b80: 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
4b90: 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
4ba0: 74 6d 74 28 70 2c 20 65 53 74 6d 74 2c 20 26 70  tmt(p, eStmt, &p
4bb0: 53 74 6d 74 2c 20 61 70 56 61 6c 29 3b 20 0a 20  Stmt, apVal); . 
4bc0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4bd0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
4be0: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
4bf0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
4c00: 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
4c10: 7d 0a 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 7d  }.  *pRC = rc;.}
4c20: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
4c30: 6e 63 74 69 6f 6e 20 65 6e 73 75 72 65 73 20 74  nction ensures t
4c40: 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
4c50: 61 73 20 6f 62 74 61 69 6e 65 64 20 61 6e 20 65  as obtained an e
4c60: 78 63 6c 75 73 69 76 65 20 0a 2a 2a 20 73 68 61  xclusive .** sha
4c70: 72 65 64 2d 63 61 63 68 65 20 74 61 62 6c 65 2d  red-cache table-
4c80: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 25 5f 73 65  lock on the %_se
4c90: 67 64 69 72 20 74 61 62 6c 65 2e 20 54 68 69 73  gdir table. This
4ca0: 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66   is required bef
4cb0: 6f 72 65 20 0a 2a 2a 20 77 72 69 74 69 6e 67 20  ore .** writing 
4cc0: 64 61 74 61 20 74 6f 20 74 68 65 20 66 74 73 33  data to the fts3
4cd0: 20 74 61 62 6c 65 2e 20 49 66 20 74 68 69 73 20   table. If this 
4ce0: 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 61 63 71 75  lock is not acqu
4cf0: 69 72 65 64 20 66 69 72 73 74 2c 20 74 68 65 6e  ired first, then
4d00: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 6d  .** the caller m
4d10: 61 79 20 65 6e 64 20 75 70 20 61 74 74 65 6d 70  ay end up attemp
4d20: 74 69 6e 67 20 74 6f 20 74 61 6b 65 20 74 68 69  ting to take thi
4d30: 73 20 6c 6f 63 6b 20 61 73 20 70 61 72 74 20 6f  s lock as part o
4d40: 66 20 63 6f 6d 6d 69 74 74 69 6e 67 0a 2a 2a 20  f committing.** 
4d50: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63  a transaction, c
4d60: 61 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f  ausing SQLite to
4d70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
4d80: 4f 43 4b 45 44 20 6f 72 20 0a 2a 2a 20 4c 4f 43  OCKED or .** LOC
4d90: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 74  KED_SHAREDCACHEt
4da0: 6f 20 61 20 43 4f 4d 4d 49 54 20 63 6f 6d 6d 61  o a COMMIT comma
4db0: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  nd..**.** It is 
4dc0: 62 65 73 74 20 74 6f 20 61 76 6f 69 64 20 74 68  best to avoid th
4dd0: 69 73 20 62 65 63 61 75 73 65 20 69 66 20 46 54  is because if FT
4de0: 53 33 20 72 65 74 75 72 6e 73 20 61 6e 79 20 65  S3 returns any e
4df0: 72 72 6f 72 20 77 68 65 6e 20 0a 2a 2a 20 63 6f  rror when .** co
4e00: 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
4e10: 61 63 74 69 6f 6e 2c 20 74 68 65 20 77 68 6f 6c  action, the whol
4e20: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  e transaction wi
4e30: 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ll be rolled bac
4e40: 6b 2e 20 0a 2a 2a 20 41 6e 64 20 74 68 69 73 20  k. .** And this 
4e50: 69 73 20 6e 6f 74 20 77 68 61 74 20 75 73 65 72  is not what user
4e60: 73 20 65 78 70 65 63 74 20 77 68 65 6e 20 74 68  s expect when th
4e70: 65 79 20 67 65 74 20 53 51 4c 49 54 45 5f 4c 4f  ey get SQLITE_LO
4e80: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
4e90: 2e 20 0a 2a 2a 20 49 74 20 63 61 6e 20 73 74 69  . .** It can sti
4ea0: 6c 6c 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ll happen if the
4eb0: 20 75 73 65 72 20 6c 6f 63 6b 73 20 74 68 65 20   user locks the 
4ec0: 75 6e 64 65 72 6c 79 69 6e 67 20 74 61 62 6c 65  underlying table
4ed0: 73 20 64 69 72 65 63 74 6c 79 20 0a 2a 2a 20 69  s directly .** i
4ee0: 6e 73 74 65 61 64 20 6f 66 20 61 63 63 65 73 73  nstead of access
4ef0: 69 6e 67 20 74 68 65 6d 20 76 69 61 20 46 54 53  ing them via FTS
4f00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4f10: 66 74 73 33 57 72 69 74 65 6c 6f 63 6b 28 46 74  fts3Writelock(Ft
4f20: 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69  s3Table *p){.  i
4f30: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
4f40: 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70 2d 3e 6e  K;.  .  if( p->n
4f50: 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29  PendingData==0 )
4f60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
4f70: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 72  mt *pStmt;.    r
4f80: 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
4f90: 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45  p, SQL_DELETE_SE
4fa0: 47 44 49 52 5f 4c 45 56 45 4c 2c 20 26 70 53 74  GDIR_LEVEL, &pSt
4fb0: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mt, 0);.    if( 
4fc0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
4fd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
4fe0: 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20  ind_null(pStmt, 
4ff0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
5000: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
5010: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
5020: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
5030: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
5040: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5050: 20 46 54 53 20 6d 61 69 6e 74 61 69 6e 73 20 61   FTS maintains a
5060: 20 73 65 70 61 72 61 74 65 20 69 6e 64 65 78 65   separate indexe
5070: 73 20 66 6f 72 20 65 61 63 68 20 6c 61 6e 67 75  s for each langu
5080: 61 67 65 2d 69 64 20 28 61 20 33 32 2d 62 69 74  age-id (a 32-bit
5090: 20 69 6e 74 65 67 65 72 29 2e 0a 2a 2a 20 57 69   integer)..** Wi
50a0: 74 68 69 6e 20 65 61 63 68 20 6c 61 6e 67 75 61  thin each langua
50b0: 67 65 20 69 64 2c 20 61 20 73 65 70 61 72 61 74  ge id, a separat
50c0: 65 20 69 6e 64 65 78 20 69 73 20 6d 61 69 6e 74  e index is maint
50d0: 61 69 6e 65 64 20 74 6f 20 73 74 6f 72 65 20 74  ained to store t
50e0: 68 65 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 20 74  he.** document t
50f0: 65 72 6d 73 2c 20 61 6e 64 20 65 61 63 68 20 63  erms, and each c
5100: 6f 6e 66 69 67 75 72 65 64 20 70 72 65 66 69 78  onfigured prefix
5110: 20 73 69 7a 65 20 28 63 6f 6e 66 69 67 75 72 65   size (configure
5120: 64 20 74 68 65 20 46 54 53 20 0a 2a 2a 20 22 70  d the FTS .** "p
5130: 72 65 66 69 78 3d 22 20 6f 70 74 69 6f 6e 29 2e  refix=" option).
5140: 20 41 6e 64 20 65 61 63 68 20 69 6e 64 65 78 20   And each index 
5150: 63 6f 6e 73 69 73 74 73 20 6f 66 20 6d 75 6c 74  consists of mult
5160: 69 70 6c 65 20 6c 65 76 65 6c 73 20 28 22 72 65  iple levels ("re
5170: 6c 61 74 69 76 65 0a 2a 2a 20 6c 65 76 65 6c 73  lative.** levels
5180: 22 29 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 68  ")..**.** All th
5190: 72 65 65 20 6f 66 20 74 68 65 73 65 20 76 61 6c  ree of these val
51a0: 75 65 73 20 28 74 68 65 20 6c 61 6e 67 75 61 67  ues (the languag
51b0: 65 20 69 64 2c 20 74 68 65 20 73 70 65 63 69 66  e id, the specif
51c0: 69 63 20 69 6e 64 65 78 20 61 6e 64 20 74 68 65  ic index and the
51d0: 0a 2a 2a 20 6c 65 76 65 6c 20 77 69 74 68 69 6e  .** level within
51e0: 20 74 68 65 20 69 6e 64 65 78 29 20 61 72 65 20   the index) are 
51f0: 65 6e 63 6f 64 65 64 20 69 6e 20 36 34 2d 62 69  encoded in 64-bi
5200: 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73  t integer values
5210: 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68   stored.** in th
5220: 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65  e %_segdir table
5230: 20 6f 6e 20 64 69 73 6b 2e 20 54 68 69 73 20 66   on disk. This f
5240: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
5250: 74 6f 20 63 6f 6e 76 65 72 74 20 74 68 72 65 65  to convert three
5260: 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 63 6f 6d  .** separate com
5270: 70 6f 6e 65 6e 74 20 76 61 6c 75 65 73 20 69 6e  ponent values in
5280: 74 6f 20 74 68 65 20 73 69 6e 67 6c 65 20 36 34  to the single 64
5290: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c  -bit integer val
52a0: 75 65 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62  ue that.** can b
52b0: 65 20 75 73 65 64 20 74 6f 20 71 75 65 72 79 20  e used to query 
52c0: 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62  the %_segdir tab
52d0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66  le..**.** Specif
52e0: 69 63 61 6c 6c 79 2c 20 65 61 63 68 20 6c 61 6e  ically, each lan
52f0: 67 75 61 67 65 2d 69 64 2f 69 6e 64 65 78 20 63  guage-id/index c
5300: 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73 20 61 6c  ombination is al
5310: 6c 6f 63 61 74 65 64 20 31 30 32 34 20 0a 2a 2a  located 1024 .**
5320: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
5330: 6c 65 76 65 6c 20 76 61 6c 75 65 73 20 28 22 61  level values ("a
5340: 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 73 22 29  bsolute levels")
5350: 2e 20 54 68 65 20 6d 61 69 6e 20 74 65 72 6d 73  . The main terms
5360: 20 69 6e 64 65 78 0a 2a 2a 20 66 6f 72 20 6c 61   index.** for la
5370: 6e 67 75 61 67 65 2d 69 64 20 30 20 69 73 20 61  nguage-id 0 is a
5380: 6c 6c 6f 63 61 74 65 20 76 61 6c 75 65 73 20 30  llocate values 0
5390: 2d 31 30 32 33 2e 20 54 68 65 20 66 69 72 73 74  -1023. The first
53a0: 20 70 72 65 66 69 78 20 69 6e 64 65 78 0a 2a 2a   prefix index.**
53b0: 20 28 69 66 20 61 6e 79 29 20 66 6f 72 20 6c 61   (if any) for la
53c0: 6e 67 75 61 67 65 2d 69 64 20 30 20 69 73 20 61  nguage-id 0 is a
53d0: 6c 6c 6f 63 61 74 65 64 20 76 61 6c 75 65 73 20  llocated values 
53e0: 31 30 32 34 2d 32 30 34 37 2e 20 41 6e 64 20 73  1024-2047. And s
53f0: 6f 20 6f 6e 2e 0a 2a 2a 20 4c 61 6e 67 75 61 67  o on..** Languag
5400: 65 20 31 20 69 6e 64 65 78 65 73 20 61 72 65 20  e 1 indexes are 
5410: 61 6c 6c 6f 63 61 74 65 64 20 69 6d 6d 65 64 69  allocated immedi
5420: 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
5430: 6c 61 6e 67 75 61 67 65 20 30 2e 0a 2a 2a 0a 2a  language 0..**.*
5440: 2a 20 53 6f 2c 20 66 6f 72 20 61 20 73 79 73 74  * So, for a syst
5450: 65 6d 20 77 69 74 68 20 6e 50 72 65 66 69 78 20  em with nPrefix 
5460: 70 72 65 66 69 78 20 69 6e 64 65 78 65 73 20 63  prefix indexes c
5470: 6f 6e 66 69 67 75 72 65 64 2c 20 74 68 65 20 62  onfigured, the b
5480: 6c 6f 63 6b 20 6f 66 0a 2a 2a 20 61 62 73 6f 6c  lock of.** absol
5490: 75 74 65 20 6c 65 76 65 6c 73 20 74 68 61 74 20  ute levels that 
54a0: 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 6c  corresponds to l
54b0: 61 6e 67 75 61 67 65 2d 69 64 20 69 4c 61 6e 67  anguage-id iLang
54c0: 69 64 20 61 6e 64 20 69 6e 64 65 78 20 0a 2a 2a  id and index .**
54d0: 20 69 49 6e 64 65 78 20 73 74 61 72 74 73 20 61   iIndex starts a
54e0: 74 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c  t absolute level
54f0: 20 28 28 69 4c 61 6e 67 69 64 20 2a 20 28 6e 50   ((iLangid * (nP
5500: 72 65 66 69 78 2b 31 29 20 2b 20 69 49 6e 64 65  refix+1) + iInde
5510: 78 29 20 2a 20 31 30 32 34 29 2e 0a 2a 2f 0a 73  x) * 1024)..*/.s
5520: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e  tatic sqlite3_in
5530: 74 36 34 20 67 65 74 41 62 73 6f 6c 75 74 65 4c  t64 getAbsoluteL
5540: 65 76 65 6c 28 0a 20 20 46 74 73 33 54 61 62 6c  evel(.  Fts3Tabl
5550: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
5560: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20          /* FTS3 
5570: 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
5580: 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20    int iLangid,  
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55a0: 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64    /* Language id
55b0: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 78   */.  int iIndex
55c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
55d0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
55e0: 6e 20 70 2d 3e 61 49 6e 64 65 78 5b 5d 20 2a 2f  n p->aIndex[] */
55f0: 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 20 20 20  .  int iLevel   
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5610: 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 20 73     /* Level of s
5620: 65 67 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  egments */.){.  
5630: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 42  sqlite3_int64 iB
5640: 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
5650: 2f 2a 20 46 69 72 73 74 20 61 62 73 6f 6c 75 74  /* First absolut
5660: 65 20 6c 65 76 65 6c 20 66 6f 72 20 69 4c 61 6e  e level for iLan
5670: 67 69 64 2f 69 49 6e 64 65 78 20 2a 2f 0a 20 20  gid/iIndex */.  
5680: 61 73 73 65 72 74 28 20 69 4c 61 6e 67 69 64 3e  assert( iLangid>
5690: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
56a0: 70 2d 3e 6e 49 6e 64 65 78 3e 30 20 29 3b 0a 20  p->nIndex>0 );. 
56b0: 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 3e   assert( iIndex>
56c0: 3d 30 20 26 26 20 69 49 6e 64 65 78 3c 70 2d 3e  =0 && iIndex<p->
56d0: 6e 49 6e 64 65 78 20 29 3b 0a 0a 20 20 69 42 61  nIndex );..  iBa
56e0: 73 65 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69  se = ((sqlite3_i
56f0: 6e 74 36 34 29 69 4c 61 6e 67 69 64 20 2a 20 70  nt64)iLangid * p
5700: 2d 3e 6e 49 6e 64 65 78 20 2b 20 69 49 6e 64 65  ->nIndex + iInde
5710: 78 29 20 2a 20 46 54 53 33 5f 53 45 47 44 49 52  x) * FTS3_SEGDIR
5720: 5f 4d 41 58 4c 45 56 45 4c 3b 0a 20 20 72 65 74  _MAXLEVEL;.  ret
5730: 75 72 6e 20 69 42 61 73 65 20 2b 20 69 4c 65 76  urn iBase + iLev
5740: 65 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  el;.}../*.** Set
5750: 20 2a 70 70 53 74 6d 74 20 74 6f 20 61 20 73 74   *ppStmt to a st
5760: 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 74  atement handle t
5770: 68 61 74 20 6d 61 79 20 62 65 20 75 73 65 64 20  hat may be used 
5780: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
5790: 67 68 0a 2a 2a 20 61 6c 6c 20 72 6f 77 73 20 69  gh.** all rows i
57a0: 6e 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74  n the %_segdir t
57b0: 61 62 6c 65 2c 20 66 72 6f 6d 20 6f 6c 64 65 73  able, from oldes
57c0: 74 20 74 6f 20 6e 65 77 65 73 74 2e 20 49 66 20  t to newest. If 
57d0: 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72  successful,.** r
57e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
57f0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
5800: 75 72 73 20 77 68 69 6c 65 20 70 72 65 70 61 72  urs while prepar
5810: 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ing the statemen
5820: 74 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e  t, .** return an
5830: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
5840: 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  de..**.** There 
5850: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65  is only ever one
5860: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
5870: 73 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  s SQL statement 
5880: 63 6f 6d 70 69 6c 65 64 20 66 6f 72 0a 2a 2a 20  compiled for.** 
5890: 65 61 63 68 20 46 54 53 33 20 74 61 62 6c 65 2e  each FTS3 table.
58a0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 61 74 65  .**.** The state
58b0: 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 74 68 65  ment returns the
58c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6c 75 6d   following colum
58d0: 6e 73 20 66 72 6f 6d 20 74 68 65 20 25 5f 73 65  ns from the %_se
58e0: 67 64 69 72 20 74 61 62 6c 65 3a 0a 2a 2a 0a 2a  gdir table:.**.*
58f0: 2a 20 20 20 30 3a 20 69 64 78 0a 2a 2a 20 20 20  *   0: idx.**   
5900: 31 3a 20 73 74 61 72 74 5f 62 6c 6f 63 6b 0a 2a  1: start_block.*
5910: 2a 20 20 20 32 3a 20 6c 65 61 76 65 73 5f 65 6e  *   2: leaves_en
5920: 64 5f 62 6c 6f 63 6b 0a 2a 2a 20 20 20 33 3a 20  d_block.**   3: 
5930: 65 6e 64 5f 62 6c 6f 63 6b 0a 2a 2a 20 20 20 34  end_block.**   4
5940: 3a 20 72 6f 6f 74 0a 2a 2f 0a 69 6e 74 20 73 71  : root.*/.int sq
5950: 6c 69 74 65 33 46 74 73 33 41 6c 6c 53 65 67 64  lite3Fts3AllSegd
5960: 69 72 73 28 0a 20 20 46 74 73 33 54 61 62 6c 65  irs(.  Fts3Table
5970: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
5980: 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74         /* FTS3 t
5990: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  able */.  int iL
59a0: 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20 20  angid,          
59b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e            /* Lan
59c0: 67 75 61 67 65 20 62 65 69 6e 67 20 71 75 65 72  guage being quer
59d0: 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e  ied */.  int iIn
59e0: 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  dex,            
59f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
5a00: 78 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65 78 5b  x for p->aIndex[
5a10: 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  ] */.  int iLeve
5a20: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
5a30: 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20         /* Level 
5a40: 74 6f 20 73 65 6c 65 63 74 20 28 72 65 6c 61 74  to select (relat
5a50: 69 76 65 20 6c 65 76 65 6c 29 20 2a 2f 0a 20 20  ive level) */.  
5a60: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
5a70: 70 53 74 6d 74 20 20 20 20 20 20 20 20 20 20 20  pStmt           
5a80: 2f 2a 20 4f 55 54 3a 20 43 6f 6d 70 69 6c 65 64  /* OUT: Compiled
5a90: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b   statement */.){
5aa0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
5ab0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
5ac0: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
5ad0: 20 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45   iLevel==FTS3_SE
5ae0: 47 43 55 52 53 4f 52 5f 41 4c 4c 20 7c 7c 20 69  GCURSOR_ALL || i
5af0: 4c 65 76 65 6c 3e 3d 30 20 29 3b 0a 20 20 61 73  Level>=0 );.  as
5b00: 73 65 72 74 28 20 69 4c 65 76 65 6c 3c 46 54 53  sert( iLevel<FTS
5b10: 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45  3_SEGDIR_MAXLEVE
5b20: 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  L );.  assert( i
5b30: 49 6e 64 65 78 3e 3d 30 20 26 26 20 69 49 6e 64  Index>=0 && iInd
5b40: 65 78 3c 70 2d 3e 6e 49 6e 64 65 78 20 29 3b 0a  ex<p->nIndex );.
5b50: 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20  .  if( iLevel<0 
5b60: 29 7b 0a 20 20 20 20 2f 2a 20 22 53 45 4c 45 43  ){.    /* "SELEC
5b70: 54 20 2a 20 46 52 4f 4d 20 25 5f 73 65 67 64 69  T * FROM %_segdi
5b80: 72 20 57 48 45 52 45 20 6c 65 76 65 6c 20 42 45  r WHERE level BE
5b90: 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 20 4f 52  TWEEN ? AND ? OR
5ba0: 44 45 52 20 42 59 20 2e 2e 2e 22 20 2a 2f 0a 20  DER BY ..." */. 
5bb0: 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53     rc = fts3SqlS
5bc0: 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43  tmt(p, SQL_SELEC
5bd0: 54 5f 4c 45 56 45 4c 5f 52 41 4e 47 45 2c 20 26  T_LEVEL_RANGE, &
5be0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
5bf0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5c00: 20 29 7b 20 0a 20 20 20 20 20 20 73 71 6c 69 74   ){ .      sqlit
5c10: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
5c20: 74 6d 74 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c  tmt, 1, getAbsol
5c30: 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e  uteLevel(p, iLan
5c40: 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 30 29 29  gid, iIndex, 0))
5c50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
5c60: 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
5c70: 2c 20 32 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 2, .          
5c80: 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c  getAbsoluteLevel
5c90: 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e  (p, iLangid, iIn
5ca0: 64 65 78 2c 20 46 54 53 33 5f 53 45 47 44 49 52  dex, FTS3_SEGDIR
5cb0: 5f 4d 41 58 4c 45 56 45 4c 2d 31 29 0a 20 20 20  _MAXLEVEL-1).   
5cc0: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65     );.    }.  }e
5cd0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 22 53 45 4c  lse{.    /* "SEL
5ce0: 45 43 54 20 2a 20 46 52 4f 4d 20 25 5f 73 65 67  ECT * FROM %_seg
5cf0: 64 69 72 20 57 48 45 52 45 20 6c 65 76 65 6c 20  dir WHERE level 
5d00: 3d 20 3f 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e  = ? ORDER BY ...
5d10: 22 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74  " */.    rc = ft
5d20: 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
5d30: 5f 53 45 4c 45 43 54 5f 4c 45 56 45 4c 2c 20 26  _SELECT_LEVEL, &
5d40: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
5d50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5d60: 20 29 7b 20 0a 20 20 20 20 20 20 73 71 6c 69 74   ){ .      sqlit
5d70: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
5d80: 74 6d 74 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c  tmt, 1, getAbsol
5d90: 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e  uteLevel(p, iLan
5da0: 67 69 64 2c 20 69 49 6e 64 65 78 2c 69 4c 65 76  gid, iIndex,iLev
5db0: 65 6c 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  el));.    }.  }.
5dc0: 20 20 2a 70 70 53 74 6d 74 20 3d 20 70 53 74 6d    *ppStmt = pStm
5dd0: 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
5de0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  }.../*.** Append
5df0: 20 61 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74   a single varint
5e00: 20 74 6f 20 61 20 50 65 6e 64 69 6e 67 4c 69 73   to a PendingLis
5e10: 74 20 62 75 66 66 65 72 2e 20 53 51 4c 49 54 45  t buffer. SQLITE
5e20: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
5e30: 2a 2a 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ** if successful
5e40: 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  , or an SQLite e
5e50: 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
5e60: 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ise..**.** This 
5e70: 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 73 65  function also se
5e80: 72 76 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  rves to allocate
5e90: 20 74 68 65 20 50 65 6e 64 69 6e 67 4c 69 73 74   the PendingList
5ea0: 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c   structure itsel
5eb0: 66 2e 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  f..** For exampl
5ec0: 65 2c 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  e, to create a n
5ed0: 65 77 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 73  ew PendingList s
5ee0: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
5ef0: 69 6e 67 20 74 77 6f 0a 2a 2a 20 76 61 72 69 6e  ing two.** varin
5f00: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 65 6e 64  ts:.**.**   Pend
5f10: 69 6e 67 4c 69 73 74 20 2a 70 20 3d 20 30 3b 0a  ingList *p = 0;.
5f20: 2a 2a 20 20 20 66 74 73 33 50 65 6e 64 69 6e 67  **   fts3Pending
5f30: 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e 74  ListAppendVarint
5f40: 28 26 70 2c 20 31 29 3b 0a 2a 2a 20 20 20 66 74  (&p, 1);.**   ft
5f50: 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70  s3PendingListApp
5f60: 65 6e 64 56 61 72 69 6e 74 28 26 70 2c 20 32 29  endVarint(&p, 2)
5f70: 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.*/.static int 
5f80: 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41  fts3PendingListA
5f90: 70 70 65 6e 64 56 61 72 69 6e 74 28 0a 20 20 50  ppendVarint(.  P
5fa0: 65 6e 64 69 6e 67 4c 69 73 74 20 2a 2a 70 70 2c  endingList **pp,
5fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5fc0: 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65  * IN/OUT: Pointe
5fd0: 72 20 74 6f 20 50 65 6e 64 69 6e 67 4c 69 73 74  r to PendingList
5fe0: 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 73 71 6c   struct */.  sql
5ff0: 69 74 65 33 5f 69 6e 74 36 34 20 69 20 20 20 20  ite3_int64 i    
6000: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6010: 56 61 6c 75 65 20 74 6f 20 61 70 70 65 6e 64 20  Value to append 
6020: 74 6f 20 64 61 74 61 20 2a 2f 0a 29 7b 0a 20 20  to data */.){.  
6030: 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70 20 3d  PendingList *p =
6040: 20 2a 70 70 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f   *pp;..  /* Allo
6050: 63 61 74 65 20 6f 72 20 67 72 6f 77 20 74 68 65  cate or grow the
6060: 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 61 73 20   PendingList as 
6070: 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69  required. */.  i
6080: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 70 20 3d  f( !p ){.    p =
6090: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
60a0: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 31 30 30  sizeof(*p) + 100
60b0: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 20 29 7b  );.    if( !p ){
60c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
60d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
60e0: 7d 0a 20 20 20 20 70 2d 3e 6e 53 70 61 63 65 20  }.    p->nSpace 
60f0: 3d 20 31 30 30 3b 0a 20 20 20 20 70 2d 3e 61 44  = 100;.    p->aD
6100: 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29 26 70  ata = (char *)&p
6110: 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 6e 44 61 74  [1];.    p->nDat
6120: 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 65 6c 73  a = 0;.  }.  els
6130: 65 20 69 66 28 20 70 2d 3e 6e 44 61 74 61 2b 46  e if( p->nData+F
6140: 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 2b 31  TS3_VARINT_MAX+1
6150: 3e 70 2d 3e 6e 53 70 61 63 65 20 29 7b 0a 20 20  >p->nSpace ){.  
6160: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 2d 3e    int nNew = p->
6170: 6e 53 70 61 63 65 20 2a 20 32 3b 0a 20 20 20 20  nSpace * 2;.    
6180: 70 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  p = sqlite3_real
6190: 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 2a 70  loc(p, sizeof(*p
61a0: 29 20 2b 20 6e 4e 65 77 29 3b 0a 20 20 20 20 69  ) + nNew);.    i
61b0: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 20 20 73  f( !p ){.      s
61c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70 70 29  qlite3_free(*pp)
61d0: 3b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 30 3b  ;.      *pp = 0;
61e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
61f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
6200: 7d 0a 20 20 20 20 70 2d 3e 6e 53 70 61 63 65 20  }.    p->nSpace 
6210: 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 61  = nNew;.    p->a
6220: 44 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29 26  Data = (char *)&
6230: 70 5b 31 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  p[1];.  }..  /* 
6240: 41 70 70 65 6e 64 20 74 68 65 20 6e 65 77 20 73  Append the new s
6250: 65 72 69 61 6c 69 7a 65 64 20 76 61 72 69 6e 74  erialized varint
6260: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
6270: 68 65 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 70 2d  he list. */.  p-
6280: 3e 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69 74 65  >nData += sqlite
6290: 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26  3Fts3PutVarint(&
62a0: 70 2d 3e 61 44 61 74 61 5b 70 2d 3e 6e 44 61 74  p->aData[p->nDat
62b0: 61 5d 2c 20 69 29 3b 0a 20 20 70 2d 3e 61 44 61  a], i);.  p->aDa
62c0: 74 61 5b 70 2d 3e 6e 44 61 74 61 5d 20 3d 20 27  ta[p->nData] = '
62d0: 5c 30 27 3b 0a 20 20 2a 70 70 20 3d 20 70 3b 0a  \0';.  *pp = p;.
62e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
62f0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  OK;.}../*.** Add
6300: 20 61 20 64 6f 63 69 64 2f 63 6f 6c 75 6d 6e 2f   a docid/column/
6310: 70 6f 73 69 74 69 6f 6e 20 65 6e 74 72 79 20 74  position entry t
6320: 6f 20 61 20 50 65 6e 64 69 6e 67 4c 69 73 74 20  o a PendingList 
6330: 73 74 72 75 63 74 75 72 65 2e 20 4e 6f 6e 2d 7a  structure. Non-z
6340: 65 72 6f 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ero.** is return
6350: 65 64 20 69 66 20 74 68 65 20 73 74 72 75 63 74  ed if the struct
6360: 75 72 65 20 69 73 20 73 71 6c 69 74 65 33 5f 72  ure is sqlite3_r
6370: 65 61 6c 6c 6f 63 65 64 20 61 73 20 70 61 72 74  ealloced as part
6380: 20 6f 66 20 61 64 64 69 6e 67 0a 2a 2a 20 74 68   of adding.** th
6390: 65 20 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69  e entry. Otherwi
63a0: 73 65 2c 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  se, zero..**.** 
63b0: 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
63c0: 6f 63 63 75 72 73 2c 20 2a 70 52 63 20 69 73 20  occurs, *pRc is 
63d0: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f  set to SQLITE_NO
63e0: 4d 45 4d 20 62 65 66 6f 72 65 20 72 65 74 75 72  MEM before retur
63f0: 6e 69 6e 67 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73  ning..** Zero is
6400: 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 65 64   always returned
6410: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 4f   in this case. O
6420: 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20  therwise, if no 
6430: 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
6440: 2c 0a 2a 2a 20 69 74 20 69 73 20 73 65 74 20 74  ,.** it is set t
6450: 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  o SQLITE_OK..*/.
6460: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 50  static int fts3P
6470: 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64  endingListAppend
6480: 28 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73 74 20  (.  PendingList 
6490: 2a 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20  **pp,           
64a0: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50      /* IN/OUT: P
64b0: 65 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63  endingList struc
64c0: 74 75 72 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ture */.  sqlite
64d0: 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 2c 20  3_int64 iDocid, 
64e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63            /* Doc
64f0: 69 64 20 66 6f 72 20 65 6e 74 72 79 20 74 6f 20  id for entry to 
6500: 61 64 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  add */.  sqlite3
6510: 5f 69 6e 74 36 34 20 69 43 6f 6c 2c 20 20 20 20  _int64 iCol,    
6520: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
6530: 6d 6e 20 66 6f 72 20 65 6e 74 72 79 20 74 6f 20  mn for entry to 
6540: 61 64 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  add */.  sqlite3
6550: 5f 69 6e 74 36 34 20 69 50 6f 73 2c 20 20 20 20  _int64 iPos,    
6560: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69           /* Posi
6570: 74 69 6f 6e 20 6f 66 20 74 65 72 6d 20 66 6f 72  tion of term for
6580: 20 65 6e 74 72 79 20 74 6f 20 61 64 64 20 2a 2f   entry to add */
6590: 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20 20  .  int *pRc     
65a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65b0: 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72     /* OUT: Retur
65c0: 6e 20 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 50  n code */.){.  P
65d0: 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70 20 3d 20  endingList *p = 
65e0: 2a 70 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *pp;.  int rc = 
65f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
6600: 73 65 72 74 28 20 21 70 20 7c 7c 20 70 2d 3e 69  sert( !p || p->i
6610: 4c 61 73 74 44 6f 63 69 64 3c 3d 69 44 6f 63 69  LastDocid<=iDoci
6620: 64 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 20 7c  d );..  if( !p |
6630: 7c 20 70 2d 3e 69 4c 61 73 74 44 6f 63 69 64 21  | p->iLastDocid!
6640: 3d 69 44 6f 63 69 64 20 29 7b 0a 20 20 20 20 73  =iDocid ){.    s
6650: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 65  qlite3_int64 iDe
6660: 6c 74 61 20 3d 20 69 44 6f 63 69 64 20 2d 20 28  lta = iDocid - (
6670: 70 20 3f 20 70 2d 3e 69 4c 61 73 74 44 6f 63 69  p ? p->iLastDoci
6680: 64 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20  d : 0);.    if( 
6690: 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
66a0: 74 28 20 70 2d 3e 6e 44 61 74 61 3c 70 2d 3e 6e  t( p->nData<p->n
66b0: 53 70 61 63 65 20 29 3b 0a 20 20 20 20 20 20 61  Space );.      a
66c0: 73 73 65 72 74 28 20 70 2d 3e 61 44 61 74 61 5b  ssert( p->aData[
66d0: 70 2d 3e 6e 44 61 74 61 5d 3d 3d 30 20 29 3b 0a  p->nData]==0 );.
66e0: 20 20 20 20 20 20 70 2d 3e 6e 44 61 74 61 2b 2b        p->nData++
66f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6700: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
6710: 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74   fts3PendingList
6720: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2c  AppendVarint(&p,
6730: 20 69 44 65 6c 74 61 29 29 20 29 7b 0a 20 20 20   iDelta)) ){.   
6740: 20 20 20 67 6f 74 6f 20 70 65 6e 64 69 6e 67 6c     goto pendingl
6750: 69 73 74 61 70 70 65 6e 64 5f 6f 75 74 3b 0a 20  istappend_out;. 
6760: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 4c 61 73     }.    p->iLas
6770: 74 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 70  tCol = -1;.    p
6780: 2d 3e 69 4c 61 73 74 50 6f 73 20 3d 20 30 3b 0a  ->iLastPos = 0;.
6790: 20 20 20 20 70 2d 3e 69 4c 61 73 74 44 6f 63 69      p->iLastDoci
67a0: 64 20 3d 20 69 44 6f 63 69 64 3b 0a 20 20 7d 0a  d = iDocid;.  }.
67b0: 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 26 26 20    if( iCol>0 && 
67c0: 70 2d 3e 69 4c 61 73 74 43 6f 6c 21 3d 69 43 6f  p->iLastCol!=iCo
67d0: 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c  l ){.    if( SQL
67e0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 66 74  ITE_OK!=(rc = ft
67f0: 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70  s3PendingListApp
6800: 65 6e 64 56 61 72 69 6e 74 28 26 70 2c 20 31 29  endVarint(&p, 1)
6810: 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45  ).     || SQLITE
6820: 5f 4f 4b 21 3d 28 72 63 20 3d 20 66 74 73 33 50  _OK!=(rc = fts3P
6830: 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64  endingListAppend
6840: 56 61 72 69 6e 74 28 26 70 2c 20 69 43 6f 6c 29  Varint(&p, iCol)
6850: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
6860: 6f 74 6f 20 70 65 6e 64 69 6e 67 6c 69 73 74 61  oto pendinglista
6870: 70 70 65 6e 64 5f 6f 75 74 3b 0a 20 20 20 20 7d  ppend_out;.    }
6880: 0a 20 20 20 20 70 2d 3e 69 4c 61 73 74 43 6f 6c  .    p->iLastCol
6890: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e   = iCol;.    p->
68a0: 69 4c 61 73 74 50 6f 73 20 3d 20 30 3b 0a 20 20  iLastPos = 0;.  
68b0: 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20  }.  if( iCol>=0 
68c0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
68d0: 50 6f 73 3e 70 2d 3e 69 4c 61 73 74 50 6f 73 20  Pos>p->iLastPos 
68e0: 7c 7c 20 28 69 50 6f 73 3d 3d 30 20 26 26 20 70  || (iPos==0 && p
68f0: 2d 3e 69 4c 61 73 74 50 6f 73 3d 3d 30 29 20 29  ->iLastPos==0) )
6900: 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 50  ;.    rc = fts3P
6910: 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64  endingListAppend
6920: 56 61 72 69 6e 74 28 26 70 2c 20 32 2b 69 50 6f  Varint(&p, 2+iPo
6930: 73 2d 70 2d 3e 69 4c 61 73 74 50 6f 73 29 3b 0a  s-p->iLastPos);.
6940: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
6950: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
6960: 2d 3e 69 4c 61 73 74 50 6f 73 20 3d 20 69 50 6f  ->iLastPos = iPo
6970: 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 70  s;.    }.  }.. p
6980: 65 6e 64 69 6e 67 6c 69 73 74 61 70 70 65 6e 64  endinglistappend
6990: 5f 6f 75 74 3a 0a 20 20 2a 70 52 63 20 3d 20 72  _out:.  *pRc = r
69a0: 63 3b 0a 20 20 69 66 28 20 70 21 3d 2a 70 70 20  c;.  if( p!=*pp 
69b0: 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 3b 0a  ){.    *pp = p;.
69c0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
69d0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
69e0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 50 65  ./*.** Free a Pe
69f0: 6e 64 69 6e 67 4c 69 73 74 20 6f 62 6a 65 63 74  ndingList object
6a00: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 74   allocated by ft
6a10: 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70  s3PendingListApp
6a20: 65 6e 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  end()..*/.static
6a30: 20 76 6f 69 64 20 66 74 73 33 50 65 6e 64 69 6e   void fts3Pendin
6a40: 67 4c 69 73 74 44 65 6c 65 74 65 28 50 65 6e 64  gListDelete(Pend
6a50: 69 6e 67 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  ingList *pList){
6a60: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
6a70: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
6a80: 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   Add an entry to
6a90: 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 65 6e 64   one of the pend
6aa0: 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20 74  ing-terms hash t
6ab0: 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
6ac0: 20 69 6e 74 20 66 74 73 33 50 65 6e 64 69 6e 67   int fts3Pending
6ad0: 54 65 72 6d 73 41 64 64 4f 6e 65 28 0a 20 20 46  TermsAddOne(.  F
6ae0: 74 73 33 54 61 62 6c 65 20 2a 70 2c 0a 20 20 69  ts3Table *p,.  i
6af0: 6e 74 20 69 43 6f 6c 2c 0a 20 20 69 6e 74 20 69  nt iCol,.  int i
6b00: 50 6f 73 2c 0a 20 20 46 74 73 33 48 61 73 68 20  Pos,.  Fts3Hash 
6b10: 2a 70 48 61 73 68 2c 20 20 20 20 20 20 20 20 20  *pHash,         
6b20: 20 20 20 20 20 20 20 2f 2a 20 50 65 6e 64 69 6e         /* Pendin
6b30: 67 20 74 65 72 6d 73 20 68 61 73 68 20 74 61 62  g terms hash tab
6b40: 6c 65 20 74 6f 20 61 64 64 20 65 6e 74 72 79 20  le to add entry 
6b50: 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  to */.  const ch
6b60: 61 72 20 2a 7a 54 6f 6b 65 6e 2c 0a 20 20 69 6e  ar *zToken,.  in
6b70: 74 20 6e 54 6f 6b 65 6e 0a 29 7b 0a 20 20 50 65  t nToken.){.  Pe
6b80: 6e 64 69 6e 67 4c 69 73 74 20 2a 70 4c 69 73 74  ndingList *pList
6b90: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
6ba0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 4c 69 73 74  ITE_OK;..  pList
6bb0: 20 3d 20 28 50 65 6e 64 69 6e 67 4c 69 73 74 20   = (PendingList 
6bc0: 2a 29 66 74 73 33 48 61 73 68 46 69 6e 64 28 70  *)fts3HashFind(p
6bd0: 48 61 73 68 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54  Hash, zToken, nT
6be0: 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 70 4c 69  oken);.  if( pLi
6bf0: 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 50 65  st ){.    p->nPe
6c00: 6e 64 69 6e 67 44 61 74 61 20 2d 3d 20 28 70 4c  ndingData -= (pL
6c10: 69 73 74 2d 3e 6e 44 61 74 61 20 2b 20 6e 54 6f  ist->nData + nTo
6c20: 6b 65 6e 20 2b 20 73 69 7a 65 6f 66 28 46 74 73  ken + sizeof(Fts
6c30: 33 48 61 73 68 45 6c 65 6d 29 29 3b 0a 20 20 7d  3HashElem));.  }
6c40: 0a 20 20 69 66 28 20 66 74 73 33 50 65 6e 64 69  .  if( fts3Pendi
6c50: 6e 67 4c 69 73 74 41 70 70 65 6e 64 28 26 70 4c  ngListAppend(&pL
6c60: 69 73 74 2c 20 70 2d 3e 69 50 72 65 76 44 6f 63  ist, p->iPrevDoc
6c70: 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20  id, iCol, iPos, 
6c80: 26 72 63 29 20 29 7b 0a 20 20 20 20 69 66 28 20  &rc) ){.    if( 
6c90: 70 4c 69 73 74 3d 3d 66 74 73 33 48 61 73 68 49  pList==fts3HashI
6ca0: 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 54 6f  nsert(pHash, zTo
6cb0: 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 70 4c 69  ken, nToken, pLi
6cc0: 73 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  st) ){.      /* 
6cd0: 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 77 68  Malloc failed wh
6ce0: 69 6c 65 20 69 6e 73 65 72 74 69 6e 67 20 74 68  ile inserting th
6cf0: 65 20 6e 65 77 20 65 6e 74 72 79 2e 20 54 68 69  e new entry. Thi
6d00: 73 20 63 61 6e 20 6f 6e 6c 79 20 0a 20 20 20 20  s can only .    
6d10: 20 20 2a 2a 20 68 61 70 70 65 6e 20 69 66 20 74    ** happen if t
6d20: 68 65 72 65 20 77 61 73 20 6e 6f 20 70 72 65 76  here was no prev
6d30: 69 6f 75 73 20 65 6e 74 72 79 20 66 6f 72 20 74  ious entry for t
6d40: 68 69 73 20 74 6f 6b 65 6e 2e 0a 20 20 20 20 20  his token..     
6d50: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
6d60: 28 20 30 3d 3d 66 74 73 33 48 61 73 68 46 69 6e  ( 0==fts3HashFin
6d70: 64 28 70 48 61 73 68 2c 20 7a 54 6f 6b 65 6e 2c  d(pHash, zToken,
6d80: 20 6e 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20   nToken) );.    
6d90: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6da0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 63 20  List);.      rc 
6db0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
6dc0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
6dd0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6de0: 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67  .    p->nPending
6df0: 44 61 74 61 20 2b 3d 20 28 70 4c 69 73 74 2d 3e  Data += (pList->
6e00: 6e 44 61 74 61 20 2b 20 6e 54 6f 6b 65 6e 20 2b  nData + nToken +
6e10: 20 73 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68   sizeof(Fts3Hash
6e20: 45 6c 65 6d 29 29 3b 0a 20 20 7d 0a 20 20 72 65  Elem));.  }.  re
6e30: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
6e40: 2a 20 54 6f 6b 65 6e 69 7a 65 20 74 68 65 20 6e  * Tokenize the n
6e50: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
6e60: 72 69 6e 67 20 7a 54 65 78 74 20 61 6e 64 20 61  ring zText and a
6e70: 64 64 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 74 6f  dd all tokens to
6e80: 20 74 68 65 0a 2a 2a 20 70 65 6e 64 69 6e 67 2d   the.** pending-
6e90: 74 65 72 6d 73 20 68 61 73 68 2d 74 61 62 6c 65  terms hash-table
6ea0: 2e 20 54 68 65 20 64 6f 63 69 64 20 75 73 65 64  . The docid used
6eb0: 20 69 73 20 74 68 61 74 20 63 75 72 72 65 6e 74   is that current
6ec0: 6c 79 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ly stored in.** 
6ed0: 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 2c 20 61  p->iPrevDocid, a
6ee0: 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  nd the column is
6ef0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 61 72   specified by ar
6f00: 67 75 6d 65 6e 74 20 69 43 6f 6c 2e 0a 2a 2a 0a  gument iCol..**.
6f10: 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
6f20: 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
6f30: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
6f40: 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  se, an SQLite er
6f50: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
6f60: 74 69 63 20 69 6e 74 20 66 74 73 33 50 65 6e 64  tic int fts3Pend
6f70: 69 6e 67 54 65 72 6d 73 41 64 64 28 0a 20 20 46  ingTermsAdd(.  F
6f80: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
6f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6fa0: 2a 20 54 61 62 6c 65 20 69 6e 74 6f 20 77 68 69  * Table into whi
6fb0: 63 68 20 74 65 78 74 20 77 69 6c 6c 20 62 65 20  ch text will be 
6fc0: 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e  inserted */.  in
6fd0: 74 20 69 4c 61 6e 67 69 64 2c 20 20 20 20 20 20  t iLangid,      
6fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6ff0: 20 4c 61 6e 67 75 61 67 65 20 69 64 20 74 6f 20   Language id to 
7000: 75 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  use */.  const c
7010: 68 61 72 20 2a 7a 54 65 78 74 2c 20 20 20 20 20  har *zText,     
7020: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
7030: 20 6f 66 20 64 6f 63 75 6d 65 6e 74 20 74 6f 20   of document to 
7040: 62 65 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20  be inserted */. 
7050: 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20   int iCol,      
7060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7070: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 74 6f 20   /* Column into 
7080: 77 68 69 63 68 20 74 65 78 74 20 69 73 20 62 65  which text is be
7090: 69 6e 67 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a  ing inserted */.
70a0: 20 20 75 33 32 20 2a 70 6e 57 6f 72 64 20 20 20    u32 *pnWord   
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70c0: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 49 6e 63    /* IN/OUT: Inc
70d0: 72 2e 20 62 79 20 6e 75 6d 62 65 72 20 74 6f 6b  r. by number tok
70e0: 65 6e 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a  ens inserted */.
70f0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
7100: 6e 74 20 69 53 74 61 72 74 20 3d 20 30 3b 0a 20  nt iStart = 0;. 
7110: 20 69 6e 74 20 69 45 6e 64 20 3d 20 30 3b 0a 20   int iEnd = 0;. 
7120: 20 69 6e 74 20 69 50 6f 73 20 3d 20 30 3b 0a 20   int iPos = 0;. 
7130: 20 69 6e 74 20 6e 57 6f 72 64 20 3d 20 30 3b 0a   int nWord = 0;.
7140: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
7150: 54 6f 6b 65 6e 3b 0a 20 20 69 6e 74 20 6e 54 6f  Token;.  int nTo
7160: 6b 65 6e 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69  ken = 0;..  sqli
7170: 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a 70  te3_tokenizer *p
7180: 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 70 2d 3e 70  Tokenizer = p->p
7190: 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 73 71 6c  Tokenizer;.  sql
71a0: 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d  ite3_tokenizer_m
71b0: 6f 64 75 6c 65 20 63 6f 6e 73 74 20 2a 70 4d 6f  odule const *pMo
71c0: 64 75 6c 65 20 3d 20 70 54 6f 6b 65 6e 69 7a 65  dule = pTokenize
71d0: 72 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 73 71  r->pModule;.  sq
71e0: 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
71f0: 63 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20  cursor *pCsr;.  
7200: 69 6e 74 20 28 2a 78 4e 65 78 74 29 28 73 71 6c  int (*xNext)(sql
7210: 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 63  ite3_tokenizer_c
7220: 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c 0a  ursor *pCursor,.
7230: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
7240: 2a 2a 2c 69 6e 74 2a 2c 69 6e 74 2a 2c 69 6e 74  **,int*,int*,int
7250: 2a 2c 69 6e 74 2a 29 3b 0a 0a 20 20 61 73 73 65  *,int*);..  asse
7260: 72 74 28 20 70 54 6f 6b 65 6e 69 7a 65 72 20 26  rt( pTokenizer &
7270: 26 20 70 4d 6f 64 75 6c 65 20 29 3b 0a 0a 20 20  & pModule );..  
7280: 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68  /* If the user h
7290: 61 73 20 69 6e 73 65 72 74 65 64 20 61 20 4e 55  as inserted a NU
72a0: 4c 4c 20 76 61 6c 75 65 2c 20 74 68 69 73 20 66  LL value, this f
72b0: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63  unction may be c
72c0: 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20  alled with.  ** 
72d0: 7a 54 65 78 74 3d 3d 30 2e 20 49 6e 20 74 68 69  zText==0. In thi
72e0: 73 20 63 61 73 65 2c 20 61 64 64 20 7a 65 72 6f  s case, add zero
72f0: 20 74 6f 6b 65 6e 20 65 6e 74 72 69 65 73 20 74   token entries t
7300: 6f 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  o the hash table
7310: 20 61 6e 64 20 0a 20 20 2a 2a 20 72 65 74 75 72   and .  ** retur
7320: 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 69 66  n early. */.  if
7330: 28 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20  ( zText==0 ){.  
7340: 20 20 2a 70 6e 57 6f 72 64 20 3d 20 30 3b 0a 20    *pnWord = 0;. 
7350: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7360: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  _OK;.  }..  rc =
7370: 20 73 71 6c 69 74 65 33 46 74 73 33 4f 70 65 6e   sqlite3Fts3Open
7380: 54 6f 6b 65 6e 69 7a 65 72 28 70 54 6f 6b 65 6e  Tokenizer(pToken
7390: 69 7a 65 72 2c 20 69 4c 61 6e 67 69 64 2c 20 7a  izer, iLangid, z
73a0: 54 65 78 74 2c 20 2d 31 2c 20 26 70 43 73 72 29  Text, -1, &pCsr)
73b0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
73c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
73d0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 78  urn rc;.  }..  x
73e0: 4e 65 78 74 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e  Next = pModule->
73f0: 78 4e 65 78 74 3b 0a 20 20 77 68 69 6c 65 28 20  xNext;.  while( 
7400: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 0a 20 20  SQLITE_OK==rc.  
7410: 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b      && SQLITE_OK
7420: 3d 3d 28 72 63 20 3d 20 78 4e 65 78 74 28 70 43  ==(rc = xNext(pC
7430: 73 72 2c 20 26 7a 54 6f 6b 65 6e 2c 20 26 6e 54  sr, &zToken, &nT
7440: 6f 6b 65 6e 2c 20 26 69 53 74 61 72 74 2c 20 26  oken, &iStart, &
7450: 69 45 6e 64 2c 20 26 69 50 6f 73 29 29 0a 20 20  iEnd, &iPos)).  
7460: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
7470: 20 20 69 66 28 20 69 50 6f 73 3e 3d 6e 57 6f 72    if( iPos>=nWor
7480: 64 20 29 20 6e 57 6f 72 64 20 3d 20 69 50 6f 73  d ) nWord = iPos
7490: 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 73 69  +1;..    /* Posi
74a0: 74 69 6f 6e 73 20 63 61 6e 6e 6f 74 20 62 65 20  tions cannot be 
74b0: 6e 65 67 61 74 69 76 65 3b 20 77 65 20 75 73 65  negative; we use
74c0: 20 2d 31 20 61 73 20 61 20 74 65 72 6d 69 6e 61   -1 as a termina
74d0: 74 6f 72 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  tor internally..
74e0: 20 20 20 20 2a 2a 20 54 6f 6b 65 6e 73 20 6d 75      ** Tokens mu
74f0: 73 74 20 68 61 76 65 20 61 20 6e 6f 6e 2d 7a 65  st have a non-ze
7500: 72 6f 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 2a  ro length..    *
7510: 2f 0a 20 20 20 20 69 66 28 20 69 50 6f 73 3c 30  /.    if( iPos<0
7520: 20 7c 7c 20 21 7a 54 6f 6b 65 6e 20 7c 7c 20 6e   || !zToken || n
7530: 54 6f 6b 65 6e 3c 3d 30 20 29 7b 0a 20 20 20 20  Token<=0 ){.    
7540: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
7550: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
7560: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
7570: 41 64 64 20 74 68 65 20 74 65 72 6d 20 74 6f 20  Add the term to 
7580: 74 68 65 20 74 65 72 6d 73 20 69 6e 64 65 78 20  the terms index 
7590: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  */.    rc = fts3
75a0: 50 65 6e 64 69 6e 67 54 65 72 6d 73 41 64 64 4f  PendingTermsAddO
75b0: 6e 65 28 0a 20 20 20 20 20 20 20 20 70 2c 20 69  ne(.        p, i
75c0: 43 6f 6c 2c 20 69 50 6f 73 2c 20 26 70 2d 3e 61  Col, iPos, &p->a
75d0: 49 6e 64 65 78 5b 30 5d 2e 68 50 65 6e 64 69 6e  Index[0].hPendin
75e0: 67 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  g, zToken, nToke
75f0: 6e 0a 20 20 20 20 29 3b 0a 20 20 20 20 0a 20 20  n.    );.    .  
7600: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 65 72    /* Add the ter
7610: 6d 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65  m to each of the
7620: 20 70 72 65 66 69 78 20 69 6e 64 65 78 65 73 20   prefix indexes 
7630: 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 74  that it is not t
7640: 6f 6f 20 0a 20 20 20 20 2a 2a 20 73 68 6f 72 74  oo .    ** short
7650: 20 66 6f 72 2e 20 2a 2f 0a 20 20 20 20 66 6f 72   for. */.    for
7660: 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=1; rc==SQLITE
7670: 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 49 6e 64  _OK && i<p->nInd
7680: 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ex; i++){.      
7690: 73 74 72 75 63 74 20 46 74 73 33 49 6e 64 65 78  struct Fts3Index
76a0: 20 2a 70 49 6e 64 65 78 20 3d 20 26 70 2d 3e 61   *pIndex = &p->a
76b0: 49 6e 64 65 78 5b 69 5d 3b 0a 20 20 20 20 20 20  Index[i];.      
76c0: 69 66 28 20 6e 54 6f 6b 65 6e 3c 70 49 6e 64 65  if( nToken<pInde
76d0: 78 2d 3e 6e 50 72 65 66 69 78 20 29 20 63 6f 6e  x->nPrefix ) con
76e0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 72 63 20  tinue;.      rc 
76f0: 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72  = fts3PendingTer
7700: 6d 73 41 64 64 4f 6e 65 28 0a 20 20 20 20 20 20  msAddOne(.      
7710: 20 20 20 20 70 2c 20 69 43 6f 6c 2c 20 69 50 6f      p, iCol, iPo
7720: 73 2c 20 26 70 49 6e 64 65 78 2d 3e 68 50 65 6e  s, &pIndex->hPen
7730: 64 69 6e 67 2c 20 7a 54 6f 6b 65 6e 2c 20 70 49  ding, zToken, pI
7740: 6e 64 65 78 2d 3e 6e 50 72 65 66 69 78 0a 20 20  ndex->nPrefix.  
7750: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
7760: 0a 0a 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c  ..  pModule->xCl
7770: 6f 73 65 28 70 43 73 72 29 3b 0a 20 20 2a 70 6e  ose(pCsr);.  *pn
7780: 57 6f 72 64 20 2b 3d 20 6e 57 6f 72 64 3b 0a 20  Word += nWord;. 
7790: 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
77a0: 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54  ITE_DONE ? SQLIT
77b0: 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f  E_OK : rc);.}../
77c0: 2a 20 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68  * .** Calling th
77d0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69  is function indi
77e0: 63 61 74 65 73 20 74 68 61 74 20 73 75 62 73 65  cates that subse
77f0: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 0a  quent calls to .
7800: 2a 2a 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65  ** fts3PendingTe
7810: 72 6d 73 41 64 64 28 29 20 61 72 65 20 74 6f 20  rmsAdd() are to 
7820: 61 64 64 20 74 65 72 6d 2f 70 6f 73 69 74 69 6f  add term/positio
7830: 6e 2d 6c 69 73 74 20 70 61 69 72 73 20 66 6f 72  n-list pairs for
7840: 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
7850: 20 6f 66 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   of the document
7860: 20 77 69 74 68 20 64 6f 63 69 64 20 69 44 6f 63   with docid iDoc
7870: 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  id..*/.static in
7880: 74 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72  t fts3PendingTer
7890: 6d 73 44 6f 63 69 64 28 0a 20 20 46 74 73 33 54  msDocid(.  Fts3T
78a0: 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
78b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
78c0: 6c 6c 2d 74 65 78 74 20 74 61 62 6c 65 20 68 61  ll-text table ha
78d0: 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ndle */.  int iL
78e0: 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20 20  angid,          
78f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e            /* Lan
7900: 67 75 61 67 65 20 69 64 20 6f 66 20 72 6f 77 20  guage id of row 
7910: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f  being written */
7920: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
7930: 69 44 6f 63 69 64 20 20 20 20 20 20 20 20 20 20  iDocid          
7940: 20 20 20 2f 2a 20 44 6f 63 69 64 20 6f 66 20 72     /* Docid of r
7950: 6f 77 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ow being written
7960: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
7970: 20 69 4c 61 6e 67 69 64 3e 3d 30 20 29 3b 0a 0a   iLangid>=0 );..
7980: 20 20 2f 2a 20 54 4f 44 4f 28 73 68 65 73 73 29    /* TODO(shess)
7990: 20 45 78 70 6c 6f 72 65 20 77 68 65 74 68 65 72   Explore whether
79a0: 20 70 61 72 74 69 61 6c 6c 79 20 66 6c 75 73 68   partially flush
79b0: 69 6e 67 20 74 68 65 20 62 75 66 66 65 72 20 6f  ing the buffer o
79c0: 6e 0a 20 20 2a 2a 20 66 6f 72 63 65 64 2d 66 6c  n.  ** forced-fl
79d0: 75 73 68 20 77 6f 75 6c 64 20 70 72 6f 76 69 64  ush would provid
79e0: 65 20 62 65 74 74 65 72 20 70 65 72 66 6f 72 6d  e better perform
79f0: 61 6e 63 65 2e 20 20 49 20 73 75 73 70 65 63 74  ance.  I suspect
7a00: 20 74 68 61 74 20 69 66 0a 20 20 2a 2a 20 77 65   that if.  ** we
7a10: 20 6f 72 64 65 72 65 64 20 74 68 65 20 64 6f 63   ordered the doc
7a20: 6c 69 73 74 73 20 62 79 20 73 69 7a 65 20 61 6e  lists by size an
7a30: 64 20 66 6c 75 73 68 65 64 20 74 68 65 20 6c 61  d flushed the la
7a40: 72 67 65 73 74 20 75 6e 74 69 6c 20 74 68 65 0a  rgest until the.
7a50: 20 20 2a 2a 20 62 75 66 66 65 72 20 77 61 73 20    ** buffer was 
7a60: 68 61 6c 66 20 65 6d 70 74 79 2c 20 74 68 61 74  half empty, that
7a70: 20 77 6f 75 6c 64 20 6c 65 74 20 74 68 65 20 6c   would let the l
7a80: 65 73 73 20 66 72 65 71 75 65 6e 74 20 74 65 72  ess frequent ter
7a90: 6d 73 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 65  ms.  ** generate
7aa0: 20 6c 6f 6e 67 65 72 20 64 6f 63 6c 69 73 74 73   longer doclists
7ab0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44 6f  ..  */.  if( iDo
7ac0: 63 69 64 3c 3d 70 2d 3e 69 50 72 65 76 44 6f 63  cid<=p->iPrevDoc
7ad0: 69 64 20 0a 20 20 20 7c 7c 20 70 2d 3e 69 50 72  id .   || p->iPr
7ae0: 65 76 4c 61 6e 67 69 64 21 3d 69 4c 61 6e 67 69  evLangid!=iLangi
7af0: 64 0a 20 20 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64  d.   || p->nPend
7b00: 69 6e 67 44 61 74 61 3e 70 2d 3e 6e 4d 61 78 50  ingData>p->nMaxP
7b10: 65 6e 64 69 6e 67 44 61 74 61 20 0a 20 20 29 7b  endingData .  ){
7b20: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
7b30: 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67  lite3Fts3Pending
7b40: 54 65 72 6d 73 46 6c 75 73 68 28 70 29 3b 0a 20  TermsFlush(p);. 
7b50: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
7b60: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
7b70: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 50 72 65 76  ;.  }.  p->iPrev
7b80: 44 6f 63 69 64 20 3d 20 69 44 6f 63 69 64 3b 0a  Docid = iDocid;.
7b90: 20 20 70 2d 3e 69 50 72 65 76 4c 61 6e 67 69 64    p->iPrevLangid
7ba0: 20 3d 20 69 4c 61 6e 67 69 64 3b 0a 20 20 72 65   = iLangid;.  re
7bb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64  }../*.** Discard
7bd0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
7be0: 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72   the pending-ter
7bf0: 6d 73 20 68 61 73 68 20 74 61 62 6c 65 73 2e 20  ms hash tables. 
7c00: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7c10: 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73  Fts3PendingTerms
7c20: 43 6c 65 61 72 28 46 74 73 33 54 61 62 6c 65 20  Clear(Fts3Table 
7c30: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
7c40: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49  for(i=0; i<p->nI
7c50: 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ndex; i++){.    
7c60: 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 70 45  Fts3HashElem *pE
7c70: 6c 65 6d 3b 0a 20 20 20 20 46 74 73 33 48 61 73  lem;.    Fts3Has
7c80: 68 20 2a 70 48 61 73 68 20 3d 20 26 70 2d 3e 61  h *pHash = &p->a
7c90: 49 6e 64 65 78 5b 69 5d 2e 68 50 65 6e 64 69 6e  Index[i].hPendin
7ca0: 67 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d  g;.    for(pElem
7cb0: 3d 66 74 73 33 48 61 73 68 46 69 72 73 74 28 70  =fts3HashFirst(p
7cc0: 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
7cd0: 6c 65 6d 3d 66 74 73 33 48 61 73 68 4e 65 78 74  lem=fts3HashNext
7ce0: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20  (pElem)){.      
7cf0: 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70 4c 69  PendingList *pLi
7d00: 73 74 20 3d 20 28 50 65 6e 64 69 6e 67 4c 69 73  st = (PendingLis
7d10: 74 20 2a 29 66 74 73 33 48 61 73 68 44 61 74 61  t *)fts3HashData
7d20: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 66  (pElem);.      f
7d30: 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 44 65  ts3PendingListDe
7d40: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
7d50: 20 7d 0a 20 20 20 20 66 74 73 33 48 61 73 68 43   }.    fts3HashC
7d60: 6c 65 61 72 28 70 48 61 73 68 29 3b 0a 20 20 7d  lear(pHash);.  }
7d70: 0a 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61  .  p->nPendingDa
7d80: 74 61 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ta = 0;.}../*.**
7d90: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
7da0: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
7db0: 78 55 70 64 61 74 65 28 29 20 6d 65 74 68 6f 64  xUpdate() method
7dc0: 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 49   as part of an I
7dd0: 4e 53 45 52 54 0a 2a 2a 20 6f 70 65 72 61 74 69  NSERT.** operati
7de0: 6f 6e 2e 20 49 74 20 61 64 64 73 20 65 6e 74 72  on. It adds entr
7df0: 69 65 73 20 66 6f 72 20 65 61 63 68 20 74 65 72  ies for each ter
7e00: 6d 20 69 6e 20 74 68 65 20 6e 65 77 20 72 65 63  m in the new rec
7e10: 6f 72 64 20 74 6f 20 74 68 65 0a 2a 2a 20 70 65  ord to the.** pe
7e20: 6e 64 69 6e 67 54 65 72 6d 73 20 68 61 73 68 20  ndingTerms hash 
7e30: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  table..**.** Arg
7e40: 75 6d 65 6e 74 20 61 70 56 61 6c 20 69 73 20 74  ument apVal is t
7e50: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 73  he same as the s
7e60: 69 6d 69 6c 61 72 6c 79 20 6e 61 6d 65 64 20 61  imilarly named a
7e70: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
7e80: 6f 0a 2a 2a 20 66 74 73 33 49 6e 73 65 72 74 44  o.** fts3InsertD
7e90: 61 74 61 28 29 2e 20 50 61 72 61 6d 65 74 65 72  ata(). Parameter
7ea0: 20 69 44 6f 63 69 64 20 69 73 20 74 68 65 20 64   iDocid is the d
7eb0: 6f 63 69 64 20 6f 66 20 74 68 65 20 6e 65 77 20  ocid of the new 
7ec0: 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  row..*/.static i
7ed0: 6e 74 20 66 74 73 33 49 6e 73 65 72 74 54 65 72  nt fts3InsertTer
7ee0: 6d 73 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  ms(.  Fts3Table 
7ef0: 2a 70 2c 20 0a 20 20 69 6e 74 20 69 4c 61 6e 67  *p, .  int iLang
7f00: 69 64 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76  id, .  sqlite3_v
7f10: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20 0a 20  alue **apVal, . 
7f20: 20 75 33 32 20 2a 61 53 7a 0a 29 7b 0a 20 20 69   u32 *aSz.){.  i
7f30: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7f50: 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
7f60: 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 32  ble */.  for(i=2
7f70: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32  ; i<p->nColumn+2
7f80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
7f90: 69 43 6f 6c 20 3d 20 69 2d 32 3b 0a 20 20 20 20  iCol = i-2;.    
7fa0: 69 66 28 20 70 2d 3e 61 62 4e 6f 74 69 6e 64 65  if( p->abNotinde
7fb0: 78 65 64 5b 69 43 6f 6c 5d 3d 3d 30 20 29 7b 0a  xed[iCol]==0 ){.
7fc0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
7fd0: 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74   *zText = (const
7fe0: 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f   char *)sqlite3_
7ff0: 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
8000: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  [i]);.      int 
8010: 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67  rc = fts3Pending
8020: 54 65 72 6d 73 41 64 64 28 70 2c 20 69 4c 61 6e  TermsAdd(p, iLan
8030: 67 69 64 2c 20 7a 54 65 78 74 2c 20 69 43 6f 6c  gid, zText, iCol
8040: 2c 20 26 61 53 7a 5b 69 43 6f 6c 5d 29 3b 0a 20  , &aSz[iCol]);. 
8050: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
8060: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
8070: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
8080: 20 20 20 7d 0a 20 20 20 20 20 20 61 53 7a 5b 70     }.      aSz[p
8090: 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 2b 3d 20 73 71  ->nColumn] += sq
80a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
80b0: 73 28 61 70 56 61 6c 5b 69 5d 29 3b 0a 20 20 20  s(apVal[i]);.   
80c0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
80d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
80e0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
80f0: 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  n is called by t
8100: 68 65 20 78 55 70 64 61 74 65 28 29 20 6d 65 74  he xUpdate() met
8110: 68 6f 64 20 66 6f 72 20 61 6e 20 49 4e 53 45 52  hod for an INSER
8120: 54 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20  T operation..** 
8130: 54 68 65 20 61 70 56 61 6c 20 70 61 72 61 6d 65  The apVal parame
8140: 74 65 72 20 69 73 20 70 61 73 73 65 64 20 61 20  ter is passed a 
8150: 63 6f 70 79 20 6f 66 20 74 68 65 20 61 70 56 61  copy of the apVa
8160: 6c 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  l argument passe
8170: 64 20 62 79 0a 2a 2a 20 53 51 4c 69 74 65 20 74  d by.** SQLite t
8180: 6f 20 74 68 65 20 78 55 70 64 61 74 65 28 29 20  o the xUpdate() 
8190: 6d 65 74 68 6f 64 2e 20 69 2e 65 3a 0a 2a 2a 0a  method. i.e:.**.
81a0: 2a 2a 20 20 20 61 70 56 61 6c 5b 30 5d 20 20 20  **   apVal[0]   
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 6f 74               Not
81c0: 20 75 73 65 64 20 66 6f 72 20 49 4e 53 45 52 54   used for INSERT
81d0: 2e 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 31 5d 20  ..**   apVal[1] 
81e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
81f0: 6f 77 69 64 0a 2a 2a 20 20 20 61 70 56 61 6c 5b  owid.**   apVal[
8200: 32 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2]              
8210: 20 20 4c 65 66 74 2d 6d 6f 73 74 20 75 73 65 72    Left-most user
8220: 2d 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 0a  -defined column.
8230: 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 61 70  **   ....**   ap
8240: 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31  Val[p->nColumn+1
8250: 5d 20 20 20 20 20 52 69 67 68 74 2d 6d 6f 73 74  ]     Right-most
8260: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 63 6f   user-defined co
8270: 6c 75 6d 6e 0a 2a 2a 20 20 20 61 70 56 61 6c 5b  lumn.**   apVal[
8280: 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 5d 20 20 20  p->nColumn+2]   
8290: 20 20 48 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 20    Hidden column 
82a0: 77 69 74 68 20 73 61 6d 65 20 6e 61 6d 65 20 61  with same name a
82b0: 73 20 74 61 62 6c 65 0a 2a 2a 20 20 20 61 70 56  s table.**   apV
82c0: 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 33 5d  al[p->nColumn+3]
82d0: 20 20 20 20 20 48 69 64 64 65 6e 20 22 64 6f 63       Hidden "doc
82e0: 69 64 22 20 63 6f 6c 75 6d 6e 20 28 61 6c 69 61  id" column (alia
82f0: 73 20 66 6f 72 20 72 6f 77 69 64 29 0a 2a 2a 20  s for rowid).** 
8300: 20 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75    apVal[p->nColu
8310: 6d 6e 2b 34 5d 20 20 20 20 20 48 69 64 64 65 6e  mn+4]     Hidden
8320: 20 6c 61 6e 67 75 61 67 65 69 64 20 63 6f 6c 75   languageid colu
8330: 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  mn.*/.static int
8340: 20 66 74 73 33 49 6e 73 65 72 74 44 61 74 61 28   fts3InsertData(
8350: 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8370: 20 20 20 2f 2a 20 46 75 6c 6c 2d 74 65 78 74 20     /* Full-text 
8380: 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  table */.  sqlit
8390: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
83a0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72  ,          /* Ar
83b0: 72 61 79 20 6f 66 20 76 61 6c 75 65 73 20 74 6f  ray of values to
83c0: 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 73 71 6c   insert */.  sql
83d0: 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 44 6f  ite3_int64 *piDo
83e0: 63 69 64 20 20 20 20 20 20 20 20 20 20 2f 2a 20  cid          /* 
83f0: 4f 55 54 3a 20 44 6f 63 69 64 20 66 6f 72 20 72  OUT: Docid for r
8400: 6f 77 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64  ow just inserted
8410: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
8420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8430: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
8440: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn code */.  sql
8450: 69 74 65 33 5f 73 74 6d 74 20 2a 70 43 6f 6e 74  ite3_stmt *pCont
8460: 65 6e 74 49 6e 73 65 72 74 3b 20 20 20 2f 2a 20  entInsert;   /* 
8470: 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 5f 63 6f  INSERT INTO %_co
8480: 6e 74 65 6e 74 20 56 41 4c 55 45 53 28 2e 2e 2e  ntent VALUES(...
8490: 29 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 7a  ) */..  if( p->z
84a0: 43 6f 6e 74 65 6e 74 54 62 6c 20 29 7b 0a 20 20  ContentTbl ){.  
84b0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
84c0: 2a 70 52 6f 77 69 64 20 3d 20 61 70 56 61 6c 5b  *pRowid = apVal[
84d0: 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 33 5d 3b 0a 20  p->nColumn+3];. 
84e0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76     if( sqlite3_v
84f0: 61 6c 75 65 5f 74 79 70 65 28 70 52 6f 77 69 64  alue_type(pRowid
8500: 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  )==SQLITE_NULL )
8510: 7b 0a 20 20 20 20 20 20 70 52 6f 77 69 64 20 3d  {.      pRowid =
8520: 20 61 70 56 61 6c 5b 31 5d 3b 0a 20 20 20 20 7d   apVal[1];.    }
8530: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
8540: 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 52 6f 77  _value_type(pRow
8550: 69 64 29 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45  id)!=SQLITE_INTE
8560: 47 45 52 20 29 7b 0a 20 20 20 20 20 20 72 65 74  GER ){.      ret
8570: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  urn SQLITE_CONST
8580: 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 20  RAINT;.    }.   
8590: 20 2a 70 69 44 6f 63 69 64 20 3d 20 73 71 6c 69   *piDocid = sqli
85a0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
85b0: 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 72 65 74  pRowid);.    ret
85c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
85d0: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
85e0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61  the statement ha
85f0: 6e 64 6c 65 20 75 73 65 64 20 74 6f 20 69 6e 73  ndle used to ins
8600: 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68  ert data into th
8610: 65 20 25 5f 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a  e %_content.  **
8620: 20 74 61 62 6c 65 2e 20 54 68 65 20 53 51 4c 20   table. The SQL 
8630: 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 6d 65  for this stateme
8640: 6e 74 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nt is:.  **.  **
8650: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 25     INSERT INTO %
8660: 5f 63 6f 6e 74 65 6e 74 20 56 41 4c 55 45 53 28  _content VALUES(
8670: 3f 2c 20 3f 2c 20 3f 2c 20 2e 2e 2e 29 0a 20 20  ?, ?, ?, ...).  
8680: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 74 61 74  **.  ** The stat
8690: 65 6d 65 6e 74 20 66 65 61 74 75 72 65 73 20 4e  ement features N
86a0: 20 27 3f 27 20 76 61 72 69 61 62 6c 65 73 2c 20   '?' variables, 
86b0: 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e  where N is the n
86c0: 75 6d 62 65 72 20 6f 66 20 75 73 65 72 0a 20 20  umber of user.  
86d0: 2a 2a 20 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d  ** defined colum
86e0: 6e 73 20 69 6e 20 74 68 65 20 46 54 53 33 20 74  ns in the FTS3 t
86f0: 61 62 6c 65 2c 20 70 6c 75 73 20 6f 6e 65 20 66  able, plus one f
8700: 6f 72 20 74 68 65 20 64 6f 63 69 64 20 66 69 65  or the docid fie
8710: 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ld..  */.  rc = 
8720: 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
8730: 51 4c 5f 43 4f 4e 54 45 4e 54 5f 49 4e 53 45 52  QL_CONTENT_INSER
8740: 54 2c 20 26 70 43 6f 6e 74 65 6e 74 49 6e 73 65  T, &pContentInse
8750: 72 74 2c 20 26 61 70 56 61 6c 5b 31 5d 29 3b 0a  rt, &apVal[1]);.
8760: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
8770: 5f 4f 4b 20 26 26 20 70 2d 3e 7a 4c 61 6e 67 75  _OK && p->zLangu
8780: 61 67 65 69 64 20 29 7b 0a 20 20 20 20 72 63 20  ageid ){.    rc 
8790: 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69  = sqlite3_bind_i
87a0: 6e 74 28 0a 20 20 20 20 20 20 20 20 70 43 6f 6e  nt(.        pCon
87b0: 74 65 6e 74 49 6e 73 65 72 74 2c 20 70 2d 3e 6e  tentInsert, p->n
87c0: 43 6f 6c 75 6d 6e 2b 32 2c 20 0a 20 20 20 20 20  Column+2, .     
87d0: 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
87e0: 5f 69 6e 74 28 61 70 56 61 6c 5b 70 2d 3e 6e 43  _int(apVal[p->nC
87f0: 6f 6c 75 6d 6e 2b 34 5d 29 0a 20 20 20 20 29 3b  olumn+4]).    );
8800: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
8810: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
8820: 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 72  n rc;..  /* Ther
8830: 65 20 69 73 20 61 20 71 75 69 72 6b 20 68 65 72  e is a quirk her
8840: 65 2e 20 54 68 65 20 75 73 65 72 73 20 49 4e 53  e. The users INS
8850: 45 52 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 61  ERT statement ma
8860: 79 20 68 61 76 65 20 73 70 65 63 69 66 69 65 64  y have specified
8870: 0a 20 20 2a 2a 20 61 20 76 61 6c 75 65 20 66 6f  .  ** a value fo
8880: 72 20 74 68 65 20 22 72 6f 77 69 64 22 20 66 69  r the "rowid" fi
8890: 65 6c 64 2c 20 66 6f 72 20 74 68 65 20 22 64 6f  eld, for the "do
88a0: 63 69 64 22 20 66 69 65 6c 64 2c 20 6f 72 20 66  cid" field, or f
88b0: 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 20 57 68  or both..  ** Wh
88c0: 69 63 68 20 69 73 20 61 20 70 72 6f 62 6c 65 6d  ich is a problem
88d0: 2c 20 73 69 6e 63 65 20 22 72 6f 77 69 64 22 20  , since "rowid" 
88e0: 61 6e 64 20 22 64 6f 63 69 64 22 20 61 72 65 20  and "docid" are 
88f0: 61 6c 69 61 73 65 73 20 66 6f 72 20 74 68 65 0a  aliases for the.
8900: 20 20 2a 2a 20 73 61 6d 65 20 76 61 6c 75 65 2e    ** same value.
8910: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20   For example:.  
8920: 2a 2a 0a 20 20 2a 2a 20 20 20 49 4e 53 45 52 54  **.  **   INSERT
8930: 20 49 4e 54 4f 20 66 74 73 33 74 62 6c 28 72 6f   INTO fts3tbl(ro
8940: 77 69 64 2c 20 64 6f 63 69 64 29 20 56 41 4c 55  wid, docid) VALU
8950: 45 53 28 31 2c 20 32 29 3b 0a 20 20 2a 2a 0a 20  ES(1, 2);.  **. 
8960: 20 2a 2a 20 49 6e 20 46 54 53 33 2c 20 74 68 69   ** In FTS3, thi
8970: 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 49  s is an error. I
8980: 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f  t is an error to
8990: 20 73 70 65 63 69 66 79 20 6e 6f 6e 2d 4e 55 4c   specify non-NUL
89a0: 4c 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 66 6f  L values.  ** fo
89b0: 72 20 62 6f 74 68 20 64 6f 63 69 64 20 61 6e 64  r both docid and
89c0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 6f 77 69   some other rowi
89d0: 64 20 61 6c 69 61 73 2e 0a 20 20 2a 2f 0a 20 20  d alias..  */.  
89e0: 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21  if( SQLITE_NULL!
89f0: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  =sqlite3_value_t
8a00: 79 70 65 28 61 70 56 61 6c 5b 33 2b 70 2d 3e 6e  ype(apVal[3+p->n
8a10: 43 6f 6c 75 6d 6e 5d 29 20 29 7b 0a 20 20 20 20  Column]) ){.    
8a20: 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d  if( SQLITE_NULL=
8a30: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  =sqlite3_value_t
8a40: 79 70 65 28 61 70 56 61 6c 5b 30 5d 29 0a 20 20  ype(apVal[0]).  
8a50: 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4e 55 4c     && SQLITE_NUL
8a60: 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  L!=sqlite3_value
8a70: 5f 74 79 70 65 28 61 70 56 61 6c 5b 31 5d 29 0a  _type(apVal[1]).
8a80: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
8a90: 41 20 72 6f 77 69 64 2f 64 6f 63 69 64 20 63 6f  A rowid/docid co
8aa0: 6e 66 6c 69 63 74 2e 20 2a 2f 0a 20 20 20 20 20  nflict. */.     
8ab0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
8ac0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
8ad0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
8ae0: 64 5f 76 61 6c 75 65 28 70 43 6f 6e 74 65 6e 74  d_value(pContent
8af0: 49 6e 73 65 72 74 2c 20 31 2c 20 61 70 56 61 6c  Insert, 1, apVal
8b00: 5b 33 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 29 3b  [3+p->nColumn]);
8b10: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
8b20: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
8b30: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78  rc;.  }..  /* Ex
8b40: 65 63 75 74 65 20 74 68 65 20 73 74 61 74 65 6d  ecute the statem
8b50: 65 6e 74 20 74 6f 20 69 6e 73 65 72 74 20 74 68  ent to insert th
8b60: 65 20 72 65 63 6f 72 64 2e 20 53 65 74 20 2a 70  e record. Set *p
8b70: 69 44 6f 63 69 64 20 74 6f 20 74 68 65 20 0a 20  iDocid to the . 
8b80: 20 2a 2a 20 6e 65 77 20 64 6f 63 69 64 20 76 61   ** new docid va
8b90: 6c 75 65 2e 20 0a 20 20 2a 2f 0a 20 20 73 71 6c  lue. .  */.  sql
8ba0: 69 74 65 33 5f 73 74 65 70 28 70 43 6f 6e 74 65  ite3_step(pConte
8bb0: 6e 74 49 6e 73 65 72 74 29 3b 0a 20 20 72 63 20  ntInsert);.  rc 
8bc0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
8bd0: 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 29 3b  pContentInsert);
8be0: 0a 0a 20 20 2a 70 69 44 6f 63 69 64 20 3d 20 73  ..  *piDocid = s
8bf0: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
8c00: 72 74 5f 72 6f 77 69 64 28 70 2d 3e 64 62 29 3b  rt_rowid(p->db);
8c10: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
8c20: 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  .../*.** Remove 
8c30: 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  all data from th
8c40: 65 20 46 54 53 33 20 74 61 62 6c 65 2e 20 43 6c  e FTS3 table. Cl
8c50: 65 61 72 20 74 68 65 20 68 61 73 68 20 74 61 62  ear the hash tab
8c60: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a  le containing.**
8c70: 20 70 65 6e 64 69 6e 67 20 74 65 72 6d 73 2e 0a   pending terms..
8c80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
8c90: 73 33 44 65 6c 65 74 65 41 6c 6c 28 46 74 73 33  s3DeleteAll(Fts3
8ca0: 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 62 43  Table *p, int bC
8cb0: 6f 6e 74 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72  ontent){.  int r
8cc0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
8cd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
8ce0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
8cf0: 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 63  /* Discard the c
8d00: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
8d10: 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68 61 73  ending-terms has
8d20: 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71  h table. */.  sq
8d30: 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67  lite3Fts3Pending
8d40: 54 65 72 6d 73 43 6c 65 61 72 28 70 29 3b 0a 0a  TermsClear(p);..
8d50: 20 20 2f 2a 20 44 65 6c 65 74 65 20 65 76 65 72    /* Delete ever
8d60: 79 74 68 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  ything from the 
8d70: 73 68 61 64 6f 77 20 74 61 62 6c 65 73 2e 20 45  shadow tables. E
8d80: 78 63 65 70 74 2c 20 6c 65 61 76 65 20 25 5f 63  xcept, leave %_c
8d90: 6f 6e 74 65 6e 74 20 61 73 0a 20 20 2a 2a 20 69  ontent as.  ** i
8da0: 73 20 69 66 20 62 43 6f 6e 74 65 6e 74 20 69 73  s if bContent is
8db0: 20 66 61 6c 73 65 2e 20 20 2a 2f 0a 20 20 61 73   false.  */.  as
8dc0: 73 65 72 74 28 20 70 2d 3e 7a 43 6f 6e 74 65 6e  sert( p->zConten
8dd0: 74 54 62 6c 3d 3d 30 20 7c 7c 20 62 43 6f 6e 74  tTbl==0 || bCont
8de0: 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ent==0 );.  if( 
8df0: 62 43 6f 6e 74 65 6e 74 20 29 20 66 74 73 33 53  bContent ) fts3S
8e00: 71 6c 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53  qlExec(&rc, p, S
8e10: 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 43 4f  QL_DELETE_ALL_CO
8e20: 4e 54 45 4e 54 2c 20 30 29 3b 0a 20 20 66 74 73  NTENT, 0);.  fts
8e30: 33 53 71 6c 45 78 65 63 28 26 72 63 2c 20 70 2c  3SqlExec(&rc, p,
8e40: 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f   SQL_DELETE_ALL_
8e50: 53 45 47 4d 45 4e 54 53 2c 20 30 29 3b 0a 20 20  SEGMENTS, 0);.  
8e60: 66 74 73 33 53 71 6c 45 78 65 63 28 26 72 63 2c  fts3SqlExec(&rc,
8e70: 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41   p, SQL_DELETE_A
8e80: 4c 4c 5f 53 45 47 44 49 52 2c 20 30 29 3b 0a 20  LL_SEGDIR, 0);. 
8e90: 20 69 66 28 20 70 2d 3e 62 48 61 73 44 6f 63 73   if( p->bHasDocs
8ea0: 69 7a 65 20 29 7b 0a 20 20 20 20 66 74 73 33 53  ize ){.    fts3S
8eb0: 71 6c 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53  qlExec(&rc, p, S
8ec0: 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 44 4f  QL_DELETE_ALL_DO
8ed0: 43 53 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 20  CSIZE, 0);.  }. 
8ee0: 20 69 66 28 20 70 2d 3e 62 48 61 73 53 74 61 74   if( p->bHasStat
8ef0: 20 29 7b 0a 20 20 20 20 66 74 73 33 53 71 6c 45   ){.    fts3SqlE
8f00: 78 65 63 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f  xec(&rc, p, SQL_
8f10: 44 45 4c 45 54 45 5f 41 4c 4c 5f 53 54 41 54 2c  DELETE_ALL_STAT,
8f20: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
8f30: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  n rc;.}../*.**.*
8f40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 61 6e  /.static int lan
8f50: 67 69 64 46 72 6f 6d 53 65 6c 65 63 74 28 46 74  gidFromSelect(Ft
8f60: 73 33 54 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69  s3Table *p, sqli
8f70: 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63  te3_stmt *pSelec
8f80: 74 29 7b 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69  t){.  int iLangi
8f90: 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  d = 0;.  if( p->
8fa0: 7a 4c 61 6e 67 75 61 67 65 69 64 20 29 20 69 4c  zLanguageid ) iL
8fb0: 61 6e 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  angid = sqlite3_
8fc0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 65 6c 65  column_int(pSele
8fd0: 63 74 2c 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31  ct, p->nColumn+1
8fe0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 4c 61 6e  );.  return iLan
8ff0: 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  gid;.}../*.** Th
9000: 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20  e first element 
9010: 69 6e 20 74 68 65 20 61 70 56 61 6c 5b 5d 20 61  in the apVal[] a
9020: 72 72 61 79 20 69 73 20 61 73 73 75 6d 65 64 20  rray is assumed 
9030: 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 64  to contain the d
9040: 6f 63 69 64 0a 2a 2a 20 28 61 6e 20 69 6e 74 65  ocid.** (an inte
9050: 67 65 72 29 20 6f 66 20 61 20 72 6f 77 20 61 62  ger) of a row ab
9060: 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65  out to be delete
9070: 64 2e 20 52 65 6d 6f 76 65 20 61 6c 6c 20 74 65  d. Remove all te
9080: 72 6d 73 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  rms from the.** 
9090: 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e  full-text index.
90a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
90b0: 66 74 73 33 44 65 6c 65 74 65 54 65 72 6d 73 28  fts3DeleteTerms(
90c0: 20 0a 20 20 69 6e 74 20 2a 70 52 43 2c 20 20 20   .  int *pRC,   
90d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
90e0: 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
90f0: 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
9100: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46          /* The F
9110: 54 53 20 74 61 62 6c 65 20 74 6f 20 64 65 6c 65  TS table to dele
9120: 74 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 73 71 6c  te from */.  sql
9130: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 6f 77  ite3_value *pRow
9140: 69 64 2c 20 20 2f 2a 20 54 68 65 20 64 6f 63 69  id,  /* The doci
9150: 64 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  d to be deleted 
9160: 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a 2c 20 20  */.  u32 *aSz,  
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9180: 53 69 7a 65 73 20 6f 66 20 64 65 6c 65 74 65 64  Sizes of deleted
9190: 20 64 6f 63 75 6d 65 6e 74 20 77 72 69 74 74 65   document writte
91a0: 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  n here */.  int 
91b0: 2a 70 62 46 6f 75 6e 64 20 20 20 20 20 20 20 20  *pbFound        
91c0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20      /* OUT: Set 
91d0: 74 6f 20 74 72 75 65 20 69 66 20 72 6f 77 20 72  to true if row r
91e0: 65 61 6c 6c 79 20 64 6f 65 73 20 65 78 69 73 74  eally does exist
91f0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
9200: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
9210: 2a 70 53 65 6c 65 63 74 3b 0a 0a 20 20 61 73 73  *pSelect;..  ass
9220: 65 72 74 28 20 2a 70 62 46 6f 75 6e 64 3d 3d 30  ert( *pbFound==0
9230: 20 29 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29   );.  if( *pRC )
9240: 20 72 65 74 75 72 6e 3b 0a 20 20 72 63 20 3d 20   return;.  rc = 
9250: 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
9260: 51 4c 5f 53 45 4c 45 43 54 5f 43 4f 4e 54 45 4e  QL_SELECT_CONTEN
9270: 54 5f 42 59 5f 52 4f 57 49 44 2c 20 26 70 53 65  T_BY_ROWID, &pSe
9280: 6c 65 63 74 2c 20 26 70 52 6f 77 69 64 29 3b 0a  lect, &pRowid);.
9290: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
92a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 53  _OK ){.    if( S
92b0: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
92c0: 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29  e3_step(pSelect)
92d0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
92e0: 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 61 6e 67  .      int iLang
92f0: 69 64 20 3d 20 6c 61 6e 67 69 64 46 72 6f 6d 53  id = langidFromS
9300: 65 6c 65 63 74 28 70 2c 20 70 53 65 6c 65 63 74  elect(p, pSelect
9310: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  );.      rc = ft
9320: 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 44 6f  s3PendingTermsDo
9330: 63 69 64 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20  cid(p, iLangid, 
9340: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
9350: 6e 74 36 34 28 70 53 65 6c 65 63 74 2c 20 30 29  nt64(pSelect, 0)
9360: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  );.      for(i=1
9370: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
9380: 26 26 20 69 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e  && i<=p->nColumn
9390: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
93a0: 69 6e 74 20 69 43 6f 6c 20 3d 20 69 2d 31 3b 0a  int iCol = i-1;.
93b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
93c0: 62 4e 6f 74 69 6e 64 65 78 65 64 5b 69 43 6f 6c  bNotindexed[iCol
93d0: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
93e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
93f0: 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ext = (const cha
9400: 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r *)sqlite3_colu
9410: 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65 63 74 2c  mn_text(pSelect,
9420: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72   i);.          r
9430: 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54  c = fts3PendingT
9440: 65 72 6d 73 41 64 64 28 70 2c 20 69 4c 61 6e 67  ermsAdd(p, iLang
9450: 69 64 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26  id, zText, -1, &
9460: 61 53 7a 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20 20  aSz[iCol]);.    
9470: 20 20 20 20 20 20 61 53 7a 5b 70 2d 3e 6e 43 6f        aSz[p->nCo
9480: 6c 75 6d 6e 5d 20 2b 3d 20 73 71 6c 69 74 65 33  lumn] += sqlite3
9490: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
94a0: 65 6c 65 63 74 2c 20 69 29 3b 0a 20 20 20 20 20  elect, i);.     
94b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
94c0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
94d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
94e0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
94f0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
9500: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20  *pRC = rc;.     
9510: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
9520: 20 7d 0a 20 20 20 20 20 20 2a 70 62 46 6f 75 6e   }.      *pbFoun
9530: 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 1;.    }.   
9540: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
9550: 73 65 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  set(pSelect);.  
9560: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
9570: 65 33 5f 72 65 73 65 74 28 70 53 65 6c 65 63 74  e3_reset(pSelect
9580: 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 43 20 3d 20  );.  }.  *pRC = 
9590: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  rc;.}../*.** For
95a0: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
95b0: 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   to account for 
95c0: 74 68 65 20 63 69 72 63 75 6c 61 72 20 64 65 70  the circular dep
95d0: 65 6e 64 65 6e 63 79 20 62 65 74 77 65 65 6e 0a  endency between.
95e0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 66 74 73  ** functions fts
95f0: 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 29 20  3SegmentMerge() 
9600: 61 6e 64 20 66 74 73 33 41 6c 6c 6f 63 61 74 65  and fts3Allocate
9610: 53 65 67 64 69 72 49 64 78 28 29 2e 0a 2a 2f 0a  SegdirIdx()..*/.
9620: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53  static int fts3S
9630: 65 67 6d 65 6e 74 4d 65 72 67 65 28 46 74 73 33  egmentMerge(Fts3
9640: 54 61 62 6c 65 20 2a 2c 20 69 6e 74 2c 20 69 6e  Table *, int, in
9650: 74 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 20 0a 2a 2a  t, int);../* .**
9660: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
9670: 6c 6c 6f 63 61 74 65 73 20 61 20 6e 65 77 20 6c  llocates a new l
9680: 65 76 65 6c 20 69 4c 65 76 65 6c 20 69 6e 64 65  evel iLevel inde
9690: 78 20 69 6e 20 74 68 65 20 73 65 67 64 69 72 20  x in the segdir 
96a0: 74 61 62 6c 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c  table..** Usuall
96b0: 79 2c 20 69 6e 64 65 78 65 73 20 61 72 65 20 61  y, indexes are a
96c0: 6c 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20  llocated within 
96d0: 61 20 6c 65 76 65 6c 20 73 65 71 75 65 6e 74 69  a level sequenti
96e0: 61 6c 6c 79 20 73 74 61 72 74 69 6e 67 0a 2a 2a  ally starting.**
96f0: 20 77 69 74 68 20 30 2c 20 73 6f 20 74 68 65 20   with 0, so the 
9700: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78 20  allocated index 
9710: 69 73 20 6f 6e 65 20 67 72 65 61 74 65 72 20 74  is one greater t
9720: 68 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  han the value re
9730: 74 75 72 6e 65 64 0a 2a 2a 20 62 79 3a 0a 2a 2a  turned.** by:.**
9740: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78  .**   SELECT max
9750: 28 69 64 78 29 20 46 52 4f 4d 20 25 5f 73 65 67  (idx) FROM %_seg
9760: 64 69 72 20 57 48 45 52 45 20 6c 65 76 65 6c 20  dir WHERE level 
9770: 3d 20 3a 69 4c 65 76 65 6c 0a 2a 2a 0a 2a 2a 20  = :iLevel.**.** 
9780: 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 72  However, if ther
9790: 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 46 54  e are already FT
97a0: 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 20 69  S3_MERGE_COUNT i
97b0: 6e 64 65 78 65 73 20 61 74 20 74 68 65 20 72 65  ndexes at the re
97c0: 71 75 65 73 74 65 64 0a 2a 2a 20 6c 65 76 65 6c  quested.** level
97d0: 2c 20 74 68 65 79 20 61 72 65 20 6d 65 72 67 65  , they are merge
97e0: 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  d into a single 
97f0: 6c 65 76 65 6c 20 28 69 4c 65 76 65 6c 2b 31 29  level (iLevel+1)
9800: 20 73 65 67 6d 65 6e 74 20 61 6e 64 20 74 68 65   segment and the
9810: 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 69   .** allocated i
9820: 6e 64 65 78 20 69 73 20 30 2e 0a 2a 2a 0a 2a 2a  ndex is 0..**.**
9830: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
9840: 2a 70 69 49 64 78 20 69 73 20 73 65 74 20 74 6f  *piIdx is set to
9850: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 69   the allocated i
9860: 6e 64 65 78 20 73 6c 6f 74 20 61 6e 64 20 53 51  ndex slot and SQ
9870: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 72 65 74 75 72  LITE_OK.** retur
9880: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
9890: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
98a0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
98b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
98c0: 66 74 73 33 41 6c 6c 6f 63 61 74 65 53 65 67 64  fts3AllocateSegd
98d0: 69 72 49 64 78 28 0a 20 20 46 74 73 33 54 61 62  irIdx(.  Fts3Tab
98e0: 6c 65 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 4c  le *p, .  int iL
98f0: 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20 20  angid,          
9900: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e            /* Lan
9910: 67 75 61 67 65 20 69 64 20 2a 2f 0a 20 20 69 6e  guage id */.  in
9920: 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20 20 20  t iIndex,       
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9940: 20 49 6e 64 65 78 20 66 6f 72 20 70 2d 3e 61 49   Index for p->aI
9950: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ndex */.  int iL
9960: 65 76 65 6c 2c 20 0a 20 20 69 6e 74 20 2a 70 69  evel, .  int *pi
9970: 49 64 78 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Idx.){.  int rc;
9980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9990: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
99a0: 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn Code */.  sql
99b0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 4e 65 78 74  ite3_stmt *pNext
99c0: 49 64 78 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Idx;         /* 
99d0: 51 75 65 72 79 20 66 6f 72 20 6e 65 78 74 20 69  Query for next i
99e0: 64 78 20 61 74 20 6c 65 76 65 6c 20 69 4c 65 76  dx at level iLev
99f0: 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 78  el */.  int iNex
9a00: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
9a10: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
9a20: 74 20 6f 66 20 71 75 65 72 79 20 70 4e 65 78 74  t of query pNext
9a30: 49 64 78 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  Idx */..  assert
9a40: 28 20 69 4c 61 6e 67 69 64 3e 3d 30 20 29 3b 0a  ( iLangid>=0 );.
9a50: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 49 6e    assert( p->nIn
9a60: 64 65 78 3e 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20  dex>=1 );..  /* 
9a70: 53 65 74 20 76 61 72 69 61 62 6c 65 20 69 4e 65  Set variable iNe
9a80: 78 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 61  xt to the next a
9a90: 76 61 69 6c 61 62 6c 65 20 73 65 67 64 69 72 20  vailable segdir 
9aa0: 69 6e 64 65 78 20 61 74 20 6c 65 76 65 6c 20 69  index at level i
9ab0: 4c 65 76 65 6c 2e 20 2a 2f 0a 20 20 72 63 20 3d  Level. */.  rc =
9ac0: 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
9ad0: 53 51 4c 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54  SQL_NEXT_SEGMENT
9ae0: 5f 49 4e 44 45 58 2c 20 26 70 4e 65 78 74 49 64  _INDEX, &pNextId
9af0: 78 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  x, 0);.  if( rc=
9b00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9b10: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
9b20: 6e 74 36 34 28 0a 20 20 20 20 20 20 20 20 70 4e  nt64(.        pN
9b30: 65 78 74 49 64 78 2c 20 31 2c 20 67 65 74 41 62  extIdx, 1, getAb
9b40: 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69  soluteLevel(p, i
9b50: 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20  Langid, iIndex, 
9b60: 69 4c 65 76 65 6c 29 0a 20 20 20 20 29 3b 0a 20  iLevel).    );. 
9b70: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
9b80: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
9b90: 70 4e 65 78 74 49 64 78 29 20 29 7b 0a 20 20 20  pNextIdx) ){.   
9ba0: 20 20 20 69 4e 65 78 74 20 3d 20 73 71 6c 69 74     iNext = sqlit
9bb0: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 4e  e3_column_int(pN
9bc0: 65 78 74 49 64 78 2c 20 30 29 3b 0a 20 20 20 20  extIdx, 0);.    
9bd0: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
9be0: 65 33 5f 72 65 73 65 74 28 70 4e 65 78 74 49 64  e3_reset(pNextId
9bf0: 78 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  x);.  }..  if( r
9c00: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
9c10: 20 20 20 20 2f 2a 20 49 66 20 69 4e 65 78 74 20      /* If iNext 
9c20: 69 73 20 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f  is FTS3_MERGE_CO
9c30: 55 4e 54 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  UNT, indicating 
9c40: 74 68 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65  that level iLeve
9c50: 6c 20 69 73 20 61 6c 72 65 61 64 79 0a 20 20 20  l is already.   
9c60: 20 2a 2a 20 66 75 6c 6c 2c 20 6d 65 72 67 65 20   ** full, merge 
9c70: 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20  all segments in 
9c80: 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 69 6e 74  level iLevel int
9c90: 6f 20 61 20 73 69 6e 67 6c 65 20 69 4c 65 76 65  o a single iLeve
9ca0: 6c 2b 31 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65  l+1.    ** segme
9cb0: 6e 74 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20  nt and allocate 
9cc0: 28 6e 65 77 6c 79 20 66 72 65 65 64 29 20 69 6e  (newly freed) in
9cd0: 64 65 78 20 30 20 61 74 20 6c 65 76 65 6c 20 69  dex 0 at level i
9ce0: 4c 65 76 65 6c 2e 20 4f 74 68 65 72 77 69 73 65  Level. Otherwise
9cf0: 2c 0a 20 20 20 20 2a 2a 20 69 66 20 69 4e 65 78  ,.    ** if iNex
9d00: 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 46  t is less than F
9d10: 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 2c  TS3_MERGE_COUNT,
9d20: 20 61 6c 6c 6f 63 61 74 65 20 69 6e 64 65 78 20   allocate index 
9d30: 69 4e 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  iNext..    */.  
9d40: 20 20 69 66 28 20 69 4e 65 78 74 3e 3d 46 54 53    if( iNext>=FTS
9d50: 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 20 29 7b  3_MERGE_COUNT ){
9d60: 0a 20 20 20 20 20 20 66 74 73 33 4c 6f 67 4d 65  .      fts3LogMe
9d70: 72 67 65 28 31 36 2c 20 67 65 74 41 62 73 6f 6c  rge(16, getAbsol
9d80: 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e  uteLevel(p, iLan
9d90: 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65  gid, iIndex, iLe
9da0: 76 65 6c 29 29 3b 0a 20 20 20 20 20 20 72 63 20  vel));.      rc 
9db0: 3d 20 66 74 73 33 53 65 67 6d 65 6e 74 4d 65 72  = fts3SegmentMer
9dc0: 67 65 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69  ge(p, iLangid, i
9dd0: 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 29 3b 0a  Index, iLevel);.
9de0: 20 20 20 20 20 20 2a 70 69 49 64 78 20 3d 20 30        *piIdx = 0
9df0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9e00: 20 20 20 2a 70 69 49 64 78 20 3d 20 69 4e 65 78     *piIdx = iNex
9e10: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
9e20: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
9e30: 0a 2a 2a 20 54 68 65 20 25 5f 73 65 67 6d 65 6e  .** The %_segmen
9e40: 74 73 20 74 61 62 6c 65 20 69 73 20 64 65 63 6c  ts table is decl
9e50: 61 72 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ared as follows:
9e60: 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  .**.**   CREATE 
9e70: 54 41 42 4c 45 20 25 5f 73 65 67 6d 65 6e 74 73  TABLE %_segments
9e80: 28 62 6c 6f 63 6b 69 64 20 49 4e 54 45 47 45 52  (blockid INTEGER
9e90: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 6c   PRIMARY KEY, bl
9ea0: 6f 63 6b 20 42 4c 4f 42 29 0a 2a 2a 0a 2a 2a 20  ock BLOB).**.** 
9eb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
9ec0: 61 64 73 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ads data from a 
9ed0: 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
9ee0: 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62  e %_segments tab
9ef0: 6c 65 2e 20 54 68 65 0a 2a 2a 20 73 70 65 63 69  le. The.** speci
9f00: 66 69 63 20 72 6f 77 20 69 73 20 69 64 65 6e 74  fic row is ident
9f10: 69 66 69 65 64 20 62 79 20 74 68 65 20 69 42 6c  ified by the iBl
9f20: 6f 63 6b 69 64 20 70 61 72 61 6d 65 74 65 72 2e  ockid parameter.
9f30: 20 49 66 20 70 61 42 6c 6f 62 20 69 73 20 6e 6f   If paBlob is no
9f40: 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t.** NULL, then 
9f50: 61 20 62 75 66 66 65 72 20 69 73 20 61 6c 6c 6f  a buffer is allo
9f60: 63 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69  cated using sqli
9f70: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  te3_malloc() and
9f80: 20 70 6f 70 75 6c 61 74 65 64 0a 2a 2a 20 77 69   populated.** wi
9f90: 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  th the contents 
9fa0: 6f 66 20 74 68 65 20 62 6c 6f 62 20 73 74 6f 72  of the blob stor
9fb0: 65 64 20 69 6e 20 74 68 65 20 22 62 6c 6f 63 6b  ed in the "block
9fc0: 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  " column of the 
9fd0: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20 74  .** identified t
9fe0: 61 62 6c 65 20 72 6f 77 20 69 73 2e 20 57 68 65  able row is. Whe
9ff0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 42 6c  ther or not paBl
a000: 6f 62 20 69 73 20 4e 55 4c 4c 2c 20 2a 70 6e 42  ob is NULL, *pnB
a010: 6c 6f 62 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f  lob is set.** to
a020: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
a030: 20 62 6c 6f 62 20 69 6e 20 62 79 74 65 73 20 62   blob in bytes b
a040: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
a050: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
a060: 6f 72 20 6f 63 63 75 72 73 2c 20 6f 72 20 74 68  or occurs, or th
a070: 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74  e table does not
a080: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 70 65   contain the spe
a090: 63 69 66 69 65 64 20 72 6f 77 2c 0a 2a 2a 20 61  cified row,.** a
a0a0: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
a0b0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
a0c0: 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
a0d0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
a0e0: 64 2e 20 49 66 0a 2a 2a 20 70 61 42 6c 6f 62 20  d. If.** paBlob 
a0f0: 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
a100: 6e 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70  n it is the resp
a110: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
a120: 65 20 63 61 6c 6c 65 72 20 74 6f 0a 2a 2a 20 65  e caller to.** e
a130: 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74  ventually free t
a140: 68 65 20 72 65 74 75 72 6e 65 64 20 62 75 66 66  he returned buff
a150: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  er..**.** This f
a160: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6c 65 61 76  unction may leav
a170: 65 20 61 6e 20 6f 70 65 6e 20 73 71 6c 69 74 65  e an open sqlite
a180: 33 5f 62 6c 6f 62 2a 20 68 61 6e 64 6c 65 20 69  3_blob* handle i
a190: 6e 20 74 68 65 0a 2a 2a 20 46 74 73 33 54 61 62  n the.** Fts3Tab
a1a0: 6c 65 2e 70 53 65 67 6d 65 6e 74 73 20 76 61 72  le.pSegments var
a1b0: 69 61 62 6c 65 2e 20 54 68 69 73 20 68 61 6e 64  iable. This hand
a1c0: 6c 65 20 69 73 20 72 65 75 73 65 64 20 62 79 20  le is reused by 
a1d0: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
a1e0: 0a 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63  .** to this func
a1f0: 74 69 6f 6e 2e 20 54 68 65 20 68 61 6e 64 6c 65  tion. The handle
a200: 20 6d 61 79 20 62 65 20 63 6c 6f 73 65 64 20 62   may be closed b
a210: 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 0a 2a 2a  y calling the.**
a220: 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 6d   sqlite3Fts3Segm
a230: 65 6e 74 73 43 6c 6f 73 65 28 29 20 66 75 6e 63  entsClose() func
a240: 74 69 6f 6e 2e 20 52 65 75 73 69 6e 67 20 61 20  tion. Reusing a 
a250: 62 6c 6f 62 20 68 61 6e 64 6c 65 20 69 73 20 61  blob handle is a
a260: 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72   handy.** perfor
a270: 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e  mance improvemen
a280: 74 2c 20 62 75 74 20 74 68 65 20 62 6c 6f 62 20  t, but the blob 
a290: 68 61 6e 64 6c 65 20 73 68 6f 75 6c 64 20 61 6c  handle should al
a2a0: 77 61 79 73 20 62 65 20 63 6c 6f 73 65 64 0a 2a  ways be closed.*
a2b0: 2a 20 62 65 66 6f 72 65 20 63 6f 6e 74 72 6f 6c  * before control
a2c0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
a2d0: 74 68 65 20 75 73 65 72 20 28 74 6f 20 70 72 65  the user (to pre
a2e0: 76 65 6e 74 20 61 20 6c 6f 63 6b 20 62 65 69 6e  vent a lock bein
a2f0: 67 20 68 65 6c 64 0a 2a 2a 20 6f 6e 20 74 68 65  g held.** on the
a300: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
a310: 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e  or longer than n
a320: 65 63 65 73 73 61 72 79 29 2e 20 54 68 75 73 2c  ecessary). Thus,
a330: 20 61 6e 79 20 76 69 72 74 75 61 6c 20 74 61 62   any virtual tab
a340: 6c 65 0a 2a 2a 20 6d 65 74 68 6f 64 20 28 78 46  le.** method (xF
a350: 69 6c 74 65 72 20 65 74 63 2e 29 20 74 68 61 74  ilter etc.) that
a360: 20 6d 61 79 20 64 69 72 65 63 74 6c 79 20 6f 72   may directly or
a370: 20 69 6e 64 69 72 65 63 74 6c 79 20 63 61 6c 6c   indirectly call
a380: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
a390: 2a 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c 69  * must call sqli
a3a0: 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73 43  te3Fts3SegmentsC
a3b0: 6c 6f 73 65 28 29 20 62 65 66 6f 72 65 20 72 65  lose() before re
a3c0: 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
a3d0: 73 71 6c 69 74 65 33 46 74 73 33 52 65 61 64 42  sqlite3Fts3ReadB
a3e0: 6c 6f 63 6b 28 0a 20 20 46 74 73 33 54 61 62 6c  lock(.  Fts3Tabl
a3f0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
a400: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20          /* FTS3 
a410: 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
a420: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
a430: 69 42 6c 6f 63 6b 69 64 2c 20 20 20 20 20 20 20  iBlockid,       
a440: 20 20 2f 2a 20 41 63 63 65 73 73 20 74 68 65 20    /* Access the 
a450: 72 6f 77 20 77 69 74 68 20 62 6c 6f 63 6b 69 64  row with blockid
a460: 3d 24 69 42 6c 6f 63 6b 69 64 20 2a 2f 0a 20 20  =$iBlockid */.  
a470: 63 68 61 72 20 2a 2a 70 61 42 6c 6f 62 2c 20 20  char **paBlob,  
a480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a490: 2f 2a 20 4f 55 54 3a 20 42 6c 6f 62 20 64 61 74  /* OUT: Blob dat
a4a0: 61 20 69 6e 20 6d 61 6c 6c 6f 63 27 64 20 62 75  a in malloc'd bu
a4b0: 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ffer */.  int *p
a4c0: 6e 42 6c 6f 62 2c 20 20 20 20 20 20 20 20 20 20  nBlob,          
a4d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
a4e0: 3a 20 53 69 7a 65 20 6f 66 20 62 6c 6f 62 20 64  : Size of blob d
a4f0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ata */.  int *pn
a500: 4c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 20  Load            
a510: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
a520: 20 42 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   Bytes actually 
a530: 6c 6f 61 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 69  loaded */.){.  i
a540: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
a550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a560: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
a570: 0a 0a 20 20 2f 2a 20 70 6e 42 6c 6f 62 20 6d 75  ..  /* pnBlob mu
a580: 73 74 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20  st be non-NULL. 
a590: 70 61 42 6c 6f 62 20 6d 61 79 20 62 65 20 4e 55  paBlob may be NU
a5a0: 4c 4c 20 6f 72 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20  LL or non-NULL. 
a5b0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 6e 42  */.  assert( pnB
a5c0: 6c 6f 62 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d  lob );..  if( p-
a5d0: 3e 70 53 65 67 6d 65 6e 74 73 20 29 7b 0a 20 20  >pSegments ){.  
a5e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
a5f0: 6c 6f 62 5f 72 65 6f 70 65 6e 28 70 2d 3e 70 53  lob_reopen(p->pS
a600: 65 67 6d 65 6e 74 73 2c 20 69 42 6c 6f 63 6b 69  egments, iBlocki
a610: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
a620: 20 69 66 28 20 30 3d 3d 70 2d 3e 7a 53 65 67 6d   if( 0==p->zSegm
a630: 65 6e 74 73 54 62 6c 20 29 7b 0a 20 20 20 20 20  entsTbl ){.     
a640: 20 70 2d 3e 7a 53 65 67 6d 65 6e 74 73 54 62 6c   p->zSegmentsTbl
a650: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
a660: 74 66 28 22 25 73 5f 73 65 67 6d 65 6e 74 73 22  tf("%s_segments"
a670: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  , p->zName);.   
a680: 20 20 20 69 66 28 20 30 3d 3d 70 2d 3e 7a 53 65     if( 0==p->zSe
a690: 67 6d 65 6e 74 73 54 62 6c 20 29 20 72 65 74 75  gmentsTbl ) retu
a6a0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
a6b0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
a6c0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65  sqlite3_blob_ope
a6d0: 6e 28 0a 20 20 20 20 20 20 20 70 2d 3e 64 62 2c  n(.       p->db,
a6e0: 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 53 65 67   p->zDb, p->zSeg
a6f0: 6d 65 6e 74 73 54 62 6c 2c 20 22 62 6c 6f 63 6b  mentsTbl, "block
a700: 22 2c 20 69 42 6c 6f 63 6b 69 64 2c 20 30 2c 20  ", iBlockid, 0, 
a710: 26 70 2d 3e 70 53 65 67 6d 65 6e 74 73 0a 20 20  &p->pSegments.  
a720: 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20    );.  }..  if( 
a730: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
a740: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
a750: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79   sqlite3_blob_by
a760: 74 65 73 28 70 2d 3e 70 53 65 67 6d 65 6e 74 73  tes(p->pSegments
a770: 29 3b 0a 20 20 20 20 2a 70 6e 42 6c 6f 62 20 3d  );.    *pnBlob =
a780: 20 6e 42 79 74 65 3b 0a 20 20 20 20 69 66 28 20   nByte;.    if( 
a790: 70 61 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20  paBlob ){.      
a7a0: 63 68 61 72 20 2a 61 42 79 74 65 20 3d 20 73 71  char *aByte = sq
a7b0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79  lite3_malloc(nBy
a7c0: 74 65 20 2b 20 46 54 53 33 5f 4e 4f 44 45 5f 50  te + FTS3_NODE_P
a7d0: 41 44 44 49 4e 47 29 3b 0a 20 20 20 20 20 20 69  ADDING);.      i
a7e0: 66 28 20 21 61 42 79 74 65 20 29 7b 0a 20 20 20  f( !aByte ){.   
a7f0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
a800: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65  _NOMEM;.      }e
a810: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
a820: 20 70 6e 4c 6f 61 64 20 26 26 20 6e 42 79 74 65   pnLoad && nByte
a830: 3e 28 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e  >(FTS3_NODE_CHUN
a840: 4b 5f 54 48 52 45 53 48 4f 4c 44 29 20 29 7b 0a  K_THRESHOLD) ){.
a850: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 20            nByte 
a860: 3d 20 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e  = FTS3_NODE_CHUN
a870: 4b 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 20  KSIZE;.         
a880: 20 2a 70 6e 4c 6f 61 64 20 3d 20 6e 42 79 74 65   *pnLoad = nByte
a890: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a8a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a8b0: 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70 53  _blob_read(p->pS
a8c0: 65 67 6d 65 6e 74 73 2c 20 61 42 79 74 65 2c 20  egments, aByte, 
a8d0: 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 20 20 20  nByte, 0);.     
a8e0: 20 20 20 6d 65 6d 73 65 74 28 26 61 42 79 74 65     memset(&aByte
a8f0: 5b 6e 42 79 74 65 5d 2c 20 30 2c 20 46 54 53 33  [nByte], 0, FTS3
a900: 5f 4e 4f 44 45 5f 50 41 44 44 49 4e 47 29 3b 0a  _NODE_PADDING);.
a910: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
a920: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a930: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
a940: 72 65 65 28 61 42 79 74 65 29 3b 0a 20 20 20 20  ree(aByte);.    
a950: 20 20 20 20 20 20 61 42 79 74 65 20 3d 20 30 3b        aByte = 0;
a960: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a970: 20 7d 0a 20 20 20 20 20 20 2a 70 61 42 6c 6f 62   }.      *paBlob
a980: 20 3d 20 61 42 79 74 65 3b 0a 20 20 20 20 7d 0a   = aByte;.    }.
a990: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
a9a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
a9b0: 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65   the blob handle
a9c0: 20 61 74 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73   at p->pSegments
a9d0: 2c 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 2e  , if it is open.
a9e0: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62   See comments ab
a9f0: 6f 76 65 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74  ove.** the sqlit
aa00: 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28  e3Fts3ReadBlock(
aa10: 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64  ) function for d
aa20: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20  etails..*/.void 
aa30: 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 6d 65  sqlite3Fts3Segme
aa40: 6e 74 73 43 6c 6f 73 65 28 46 74 73 33 54 61 62  ntsClose(Fts3Tab
aa50: 6c 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  le *p){.  sqlite
aa60: 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d 3e  3_blob_close(p->
aa70: 70 53 65 67 6d 65 6e 74 73 29 3b 0a 20 20 70 2d  pSegments);.  p-
aa80: 3e 70 53 65 67 6d 65 6e 74 73 20 3d 20 30 3b 0a  >pSegments = 0;.
aa90: 7d 0a 20 20 20 20 0a 73 74 61 74 69 63 20 69 6e  }.    .static in
aaa0: 74 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49  t fts3SegReaderI
aab0: 6e 63 72 52 65 61 64 28 46 74 73 33 53 65 67 52  ncrRead(Fts3SegR
aac0: 65 61 64 65 72 20 2a 70 52 65 61 64 65 72 29 7b  eader *pReader){
aad0: 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20  .  int nRead;   
aae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aaf0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ab00: 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f  bytes to read */
ab10: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab30: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
ab40: 65 20 2a 2f 0a 0a 20 20 6e 52 65 61 64 20 3d 20  e */..  nRead = 
ab50: 4d 49 4e 28 70 52 65 61 64 65 72 2d 3e 6e 4e 6f  MIN(pReader->nNo
ab60: 64 65 20 2d 20 70 52 65 61 64 65 72 2d 3e 6e 50  de - pReader->nP
ab70: 6f 70 75 6c 61 74 65 2c 20 46 54 53 33 5f 4e 4f  opulate, FTS3_NO
ab80: 44 45 5f 43 48 55 4e 4b 53 49 5a 45 29 3b 0a 20  DE_CHUNKSIZE);. 
ab90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
aba0: 6f 62 5f 72 65 61 64 28 0a 20 20 20 20 20 20 70  ob_read(.      p
abb0: 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 2c 20 0a  Reader->pBlob, .
abc0: 20 20 20 20 20 20 26 70 52 65 61 64 65 72 2d 3e        &pReader->
abd0: 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e  aNode[pReader->n
abe0: 50 6f 70 75 6c 61 74 65 5d 2c 0a 20 20 20 20 20  Populate],.     
abf0: 20 6e 52 65 61 64 2c 0a 20 20 20 20 20 20 70 52   nRead,.      pR
ac00: 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65  eader->nPopulate
ac10: 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  .  );..  if( rc=
ac20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ac30: 20 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75    pReader->nPopu
ac40: 6c 61 74 65 20 2b 3d 20 6e 52 65 61 64 3b 0a 20  late += nRead;. 
ac50: 20 20 20 6d 65 6d 73 65 74 28 26 70 52 65 61 64     memset(&pRead
ac60: 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65  er->aNode[pReade
ac70: 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 5d 2c 20 30  r->nPopulate], 0
ac80: 2c 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44  , FTS3_NODE_PADD
ac90: 49 4e 47 29 3b 0a 20 20 20 20 69 66 28 20 70 52  ING);.    if( pR
aca0: 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65  eader->nPopulate
acb0: 3d 3d 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65  ==pReader->nNode
acc0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
acd0: 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 52 65  3_blob_close(pRe
ace0: 61 64 65 72 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20  ader->pBlob);.  
acf0: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 42 6c      pReader->pBl
ad00: 6f 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 52  ob = 0;.      pR
ad10: 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65  eader->nPopulate
ad20: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
ad30: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ad40: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53  static int fts3S
ad50: 65 67 52 65 61 64 65 72 52 65 71 75 69 72 65 28  egReaderRequire(
ad60: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
ad70: 52 65 61 64 65 72 2c 20 63 68 61 72 20 2a 70 46  Reader, char *pF
ad80: 72 6f 6d 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b  rom, int nByte){
ad90: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
ada0: 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
adb0: 20 21 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62   !pReader->pBlob
adc0: 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 46 72   .       || (pFr
add0: 6f 6d 3e 3d 70 52 65 61 64 65 72 2d 3e 61 4e 6f  om>=pReader->aNo
ade0: 64 65 20 26 26 20 70 46 72 6f 6d 3c 26 70 52 65  de && pFrom<&pRe
adf0: 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61  ader->aNode[pRea
ae00: 64 65 72 2d 3e 6e 4e 6f 64 65 5d 29 0a 20 20 29  der->nNode]).  )
ae10: 3b 0a 20 20 77 68 69 6c 65 28 20 70 52 65 61 64  ;.  while( pRead
ae20: 65 72 2d 3e 70 42 6c 6f 62 20 26 26 20 72 63 3d  er->pBlob && rc=
ae30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20  =SQLITE_OK .    
ae40: 20 26 26 20 20 28 70 46 72 6f 6d 20 2d 20 70 52   &&  (pFrom - pR
ae50: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20 2b 20 6e  eader->aNode + n
ae60: 42 79 74 65 29 3e 70 52 65 61 64 65 72 2d 3e 6e  Byte)>pReader->n
ae70: 50 6f 70 75 6c 61 74 65 0a 20 20 29 7b 0a 20 20  Populate.  ){.  
ae80: 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65    rc = fts3SegRe
ae90: 61 64 65 72 49 6e 63 72 52 65 61 64 28 70 52 65  aderIncrRead(pRe
aea0: 61 64 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ader);.  }.  ret
aeb0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
aec0: 20 53 65 74 20 61 6e 20 46 74 73 33 53 65 67 52   Set an Fts3SegR
aed0: 65 61 64 65 72 20 63 75 72 73 6f 72 20 74 6f 20  eader cursor to 
aee0: 70 6f 69 6e 74 20 61 74 20 45 4f 46 2e 0a 2a 2f  point at EOF..*/
aef0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
af00: 33 53 65 67 52 65 61 64 65 72 53 65 74 45 6f 66  3SegReaderSetEof
af10: 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a  (Fts3SegReader *
af20: 70 53 65 67 29 7b 0a 20 20 69 66 28 20 21 66 74  pSeg){.  if( !ft
af30: 73 33 53 65 67 52 65 61 64 65 72 49 73 52 6f 6f  s3SegReaderIsRoo
af40: 74 4f 6e 6c 79 28 70 53 65 67 29 20 29 7b 0a 20  tOnly(pSeg) ){. 
af50: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
af60: 70 53 65 67 2d 3e 61 4e 6f 64 65 29 3b 0a 20 20  pSeg->aNode);.  
af70: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63    sqlite3_blob_c
af80: 6c 6f 73 65 28 70 53 65 67 2d 3e 70 42 6c 6f 62  lose(pSeg->pBlob
af90: 29 3b 0a 20 20 20 20 70 53 65 67 2d 3e 70 42 6c  );.    pSeg->pBl
afa0: 6f 62 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 53  ob = 0;.  }.  pS
afb0: 65 67 2d 3e 61 4e 6f 64 65 20 3d 20 30 3b 0a 7d  eg->aNode = 0;.}
afc0: 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
afd0: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
afe0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
aff0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e 65  gument to the ne
b000: 78 74 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a  xt term in the.*
b010: 2a 20 73 65 67 6d 65 6e 74 2e 20 49 66 20 73 75  * segment. If su
b020: 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
b030: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
b040: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
b050: 6e 65 78 74 20 74 65 72 6d 2c 0a 2a 2a 20 53 51  next term,.** SQ
b060: 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 74 68 65 72  LITE_DONE. Other
b070: 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20  wise, an SQLite 
b080: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
b090: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65  tatic int fts3Se
b0a0: 67 52 65 61 64 65 72 4e 65 78 74 28 0a 20 20 46  gReaderNext(.  F
b0b0: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 0a 20 20  ts3Table *p, .  
b0c0: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
b0d0: 52 65 61 64 65 72 2c 0a 20 20 69 6e 74 20 62 49  Reader,.  int bI
b0e0: 6e 63 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ncr.){.  int rc;
b0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b100: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
b110: 72 6e 20 63 6f 64 65 20 6f 66 20 76 61 72 69 6f  rn code of vario
b120: 75 73 20 73 75 62 2d 72 6f 75 74 69 6e 65 73 20  us sub-routines 
b130: 2a 2f 0a 20 20 63 68 61 72 20 2a 70 4e 65 78 74  */.  char *pNext
b140: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b150: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 76       /* Cursor v
b160: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
b170: 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20 20   nPrefix;       
b180: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b190: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
b1a0: 69 6e 20 74 65 72 6d 20 70 72 65 66 69 78 20 2a  in term prefix *
b1b0: 2f 0a 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b  /.  int nSuffix;
b1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
b1e0: 20 62 79 74 65 73 20 69 6e 20 74 65 72 6d 20 73   bytes in term s
b1f0: 75 66 66 69 78 20 2a 2f 0a 0a 20 20 69 66 28 20  uffix */..  if( 
b200: 21 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69  !pReader->aDocli
b210: 73 74 20 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  st ){.    pNext 
b220: 3d 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65  = pReader->aNode
b230: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
b240: 4e 65 78 74 20 3d 20 26 70 52 65 61 64 65 72 2d  Next = &pReader-
b250: 3e 61 44 6f 63 6c 69 73 74 5b 70 52 65 61 64 65  >aDoclist[pReade
b260: 72 2d 3e 6e 44 6f 63 6c 69 73 74 5d 3b 0a 20 20  r->nDoclist];.  
b270: 7d 0a 0a 20 20 69 66 28 20 21 70 4e 65 78 74 20  }..  if( !pNext 
b280: 7c 7c 20 70 4e 65 78 74 3e 3d 26 70 52 65 61 64  || pNext>=&pRead
b290: 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65  er->aNode[pReade
b2a0: 72 2d 3e 6e 4e 6f 64 65 5d 20 29 7b 0a 0a 20 20  r->nNode] ){..  
b2b0: 20 20 69 66 28 20 66 74 73 33 53 65 67 52 65 61    if( fts3SegRea
b2c0: 64 65 72 49 73 50 65 6e 64 69 6e 67 28 70 52 65  derIsPending(pRe
b2d0: 61 64 65 72 29 20 29 7b 0a 20 20 20 20 20 20 46  ader) ){.      F
b2e0: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c  ts3HashElem *pEl
b2f0: 65 6d 20 3d 20 2a 28 70 52 65 61 64 65 72 2d 3e  em = *(pReader->
b300: 70 70 4e 65 78 74 45 6c 65 6d 29 3b 0a 20 20 20  ppNextElem);.   
b310: 20 20 20 69 66 28 20 70 45 6c 65 6d 3d 3d 30 20     if( pElem==0 
b320: 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64  ){.        pRead
b330: 65 72 2d 3e 61 4e 6f 64 65 20 3d 20 30 3b 0a 20  er->aNode = 0;. 
b340: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b350: 20 20 20 20 50 65 6e 64 69 6e 67 4c 69 73 74 20      PendingList 
b360: 2a 70 4c 69 73 74 20 3d 20 28 50 65 6e 64 69 6e  *pList = (Pendin
b370: 67 4c 69 73 74 20 2a 29 66 74 73 33 48 61 73 68  gList *)fts3Hash
b380: 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
b390: 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 7a 54       pReader->zT
b3a0: 65 72 6d 20 3d 20 28 63 68 61 72 20 2a 29 66 74  erm = (char *)ft
b3b0: 73 33 48 61 73 68 4b 65 79 28 70 45 6c 65 6d 29  s3HashKey(pElem)
b3c0: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64 65  ;.        pReade
b3d0: 72 2d 3e 6e 54 65 72 6d 20 3d 20 66 74 73 33 48  r->nTerm = fts3H
b3e0: 61 73 68 4b 65 79 73 69 7a 65 28 70 45 6c 65 6d  ashKeysize(pElem
b3f0: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64  );.        pRead
b400: 65 72 2d 3e 6e 4e 6f 64 65 20 3d 20 70 52 65 61  er->nNode = pRea
b410: 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 20 3d 20  der->nDoclist = 
b420: 70 4c 69 73 74 2d 3e 6e 44 61 74 61 20 2b 20 31  pList->nData + 1
b430: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64 65  ;.        pReade
b440: 72 2d 3e 61 4e 6f 64 65 20 3d 20 70 52 65 61 64  r->aNode = pRead
b450: 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20 70  er->aDoclist = p
b460: 4c 69 73 74 2d 3e 61 44 61 74 61 3b 0a 20 20 20  List->aData;.   
b470: 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 70       pReader->pp
b480: 4e 65 78 74 45 6c 65 6d 2b 2b 3b 0a 20 20 20 20  NextElem++;.    
b490: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 61      assert( pRea
b4a0: 64 65 72 2d 3e 61 4e 6f 64 65 20 29 3b 0a 20 20  der->aNode );.  
b4b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
b4c0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
b4d0: 20 20 7d 0a 0a 20 20 20 20 66 74 73 33 53 65 67    }..    fts3Seg
b4e0: 52 65 61 64 65 72 53 65 74 45 6f 66 28 70 52 65  ReaderSetEof(pRe
b4f0: 61 64 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ader);..    /* I
b500: 66 20 69 43 75 72 72 65 6e 74 42 6c 6f 63 6b 3e  f iCurrentBlock>
b510: 3d 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 2c 20  =iLeafEndBlock, 
b520: 74 68 69 73 20 69 73 20 61 6e 20 45 4f 46 20 63  this is an EOF c
b530: 6f 6e 64 69 74 69 6f 6e 2e 20 41 6c 6c 20 6c 65  ondition. All le
b540: 61 66 20 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  af .    ** block
b550: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
b560: 65 65 6e 20 74 72 61 76 65 72 73 65 64 2e 20 20  een traversed.  
b570: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
b580: 52 65 61 64 65 72 2d 3e 69 43 75 72 72 65 6e 74  Reader->iCurrent
b590: 42 6c 6f 63 6b 3c 3d 70 52 65 61 64 65 72 2d 3e  Block<=pReader->
b5a0: 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 20 29 3b  iLeafEndBlock );
b5b0: 0a 20 20 20 20 69 66 28 20 70 52 65 61 64 65 72  .    if( pReader
b5c0: 2d 3e 69 43 75 72 72 65 6e 74 42 6c 6f 63 6b 3e  ->iCurrentBlock>
b5d0: 3d 70 52 65 61 64 65 72 2d 3e 69 4c 65 61 66 45  =pReader->iLeafE
b5e0: 6e 64 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  ndBlock ){.     
b5f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b600: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  K;.    }..    rc
b610: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 52 65   = sqlite3Fts3Re
b620: 61 64 42 6c 6f 63 6b 28 0a 20 20 20 20 20 20 20  adBlock(.       
b630: 20 70 2c 20 2b 2b 70 52 65 61 64 65 72 2d 3e 69   p, ++pReader->i
b640: 43 75 72 72 65 6e 74 42 6c 6f 63 6b 2c 20 26 70  CurrentBlock, &p
b650: 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 2c 20 26  Reader->aNode, &
b660: 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 2c 20  pReader->nNode, 
b670: 0a 20 20 20 20 20 20 20 20 28 62 49 6e 63 72 20  .        (bIncr 
b680: 3f 20 26 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70  ? &pReader->nPop
b690: 75 6c 61 74 65 20 3a 20 30 29 0a 20 20 20 20 29  ulate : 0).    )
b6a0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
b6b0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
b6c0: 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28   rc;.    assert(
b6d0: 20 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 3d   pReader->pBlob=
b6e0: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 62 49  =0 );.    if( bI
b6f0: 6e 63 72 20 26 26 20 70 52 65 61 64 65 72 2d 3e  ncr && pReader->
b700: 6e 50 6f 70 75 6c 61 74 65 3c 70 52 65 61 64 65  nPopulate<pReade
b710: 72 2d 3e 6e 4e 6f 64 65 20 29 7b 0a 20 20 20 20  r->nNode ){.    
b720: 20 20 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62    pReader->pBlob
b730: 20 3d 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73 3b   = p->pSegments;
b740: 0a 20 20 20 20 20 20 70 2d 3e 70 53 65 67 6d 65  .      p->pSegme
b750: 6e 74 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  nts = 0;.    }. 
b760: 20 20 20 70 4e 65 78 74 20 3d 20 70 52 65 61 64     pNext = pRead
b770: 65 72 2d 3e 61 4e 6f 64 65 3b 0a 20 20 7d 0a 0a  er->aNode;.  }..
b780: 20 20 61 73 73 65 72 74 28 20 21 66 74 73 33 53    assert( !fts3S
b790: 65 67 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e  egReaderIsPendin
b7a0: 67 28 70 52 65 61 64 65 72 29 20 29 3b 0a 0a 20  g(pReader) );.. 
b7b0: 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61   rc = fts3SegRea
b7c0: 64 65 72 52 65 71 75 69 72 65 28 70 52 65 61 64  derRequire(pRead
b7d0: 65 72 2c 20 70 4e 65 78 74 2c 20 46 54 53 33 5f  er, pNext, FTS3_
b7e0: 56 41 52 49 4e 54 5f 4d 41 58 2a 32 29 3b 0a 20  VARINT_MAX*2);. 
b7f0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b800: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
b810: 20 20 0a 20 20 2f 2a 20 42 65 63 61 75 73 65 20    .  /* Because 
b820: 6f 66 20 74 68 65 20 46 54 53 33 5f 4e 4f 44 45  of the FTS3_NODE
b830: 5f 50 41 44 44 49 4e 47 20 62 79 74 65 73 20 6f  _PADDING bytes o
b840: 66 20 70 61 64 64 69 6e 67 2c 20 74 68 65 20 66  f padding, the f
b850: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 0a 20 20 2a  ollowing is .  *
b860: 2a 20 73 61 66 65 20 28 6e 6f 20 72 69 73 6b 20  * safe (no risk 
b870: 6f 66 20 6f 76 65 72 72 65 61 64 29 20 65 76 65  of overread) eve
b880: 6e 20 69 66 20 74 68 65 20 6e 6f 64 65 20 64 61  n if the node da
b890: 74 61 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e  ta is corrupted.
b8a0: 20 2a 2f 0a 20 20 70 4e 65 78 74 20 2b 3d 20 66   */.  pNext += f
b8b0: 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 70  ts3GetVarint32(p
b8c0: 4e 65 78 74 2c 20 26 6e 50 72 65 66 69 78 29 3b  Next, &nPrefix);
b8d0: 0a 20 20 70 4e 65 78 74 20 2b 3d 20 66 74 73 33  .  pNext += fts3
b8e0: 47 65 74 56 61 72 69 6e 74 33 32 28 70 4e 65 78  GetVarint32(pNex
b8f0: 74 2c 20 26 6e 53 75 66 66 69 78 29 3b 0a 20 20  t, &nSuffix);.  
b900: 69 66 28 20 6e 50 72 65 66 69 78 3c 30 20 7c 7c  if( nPrefix<0 ||
b910: 20 6e 53 75 66 66 69 78 3c 3d 30 20 0a 20 20 20   nSuffix<=0 .   
b920: 7c 7c 20 26 70 4e 65 78 74 5b 6e 53 75 66 66 69  || &pNext[nSuffi
b930: 78 5d 3e 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f  x]>&pReader->aNo
b940: 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64  de[pReader->nNod
b950: 65 5d 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  e] .  ){.    ret
b960: 75 72 6e 20 46 54 53 5f 43 4f 52 52 55 50 54 5f  urn FTS_CORRUPT_
b970: 56 54 41 42 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  VTAB;.  }..  if(
b980: 20 6e 50 72 65 66 69 78 2b 6e 53 75 66 66 69 78   nPrefix+nSuffix
b990: 3e 70 52 65 61 64 65 72 2d 3e 6e 54 65 72 6d 41  >pReader->nTermA
b9a0: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74 20  lloc ){.    int 
b9b0: 6e 4e 65 77 20 3d 20 28 6e 50 72 65 66 69 78 2b  nNew = (nPrefix+
b9c0: 6e 53 75 66 66 69 78 29 2a 32 3b 0a 20 20 20 20  nSuffix)*2;.    
b9d0: 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20 73 71 6c  char *zNew = sql
b9e0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 52 65  ite3_realloc(pRe
b9f0: 61 64 65 72 2d 3e 7a 54 65 72 6d 2c 20 6e 4e 65  ader->zTerm, nNe
ba00: 77 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4e 65  w);.    if( !zNe
ba10: 77 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  w ){.      retur
ba20: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
ba30: 20 20 20 20 7d 0a 20 20 20 20 70 52 65 61 64 65      }.    pReade
ba40: 72 2d 3e 7a 54 65 72 6d 20 3d 20 7a 4e 65 77 3b  r->zTerm = zNew;
ba50: 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 54  .    pReader->nT
ba60: 65 72 6d 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b  ermAlloc = nNew;
ba70: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 66 74 73  .  }..  rc = fts
ba80: 33 53 65 67 52 65 61 64 65 72 52 65 71 75 69 72  3SegReaderRequir
ba90: 65 28 70 52 65 61 64 65 72 2c 20 70 4e 65 78 74  e(pReader, pNext
baa0: 2c 20 6e 53 75 66 66 69 78 2b 46 54 53 33 5f 56  , nSuffix+FTS3_V
bab0: 41 52 49 4e 54 5f 4d 41 58 29 3b 0a 20 20 69 66  ARINT_MAX);.  if
bac0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
bad0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
bae0: 6d 65 6d 63 70 79 28 26 70 52 65 61 64 65 72 2d  memcpy(&pReader-
baf0: 3e 7a 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 2c  >zTerm[nPrefix],
bb00: 20 70 4e 65 78 74 2c 20 6e 53 75 66 66 69 78 29   pNext, nSuffix)
bb10: 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 6e 54 65  ;.  pReader->nTe
bb20: 72 6d 20 3d 20 6e 50 72 65 66 69 78 2b 6e 53 75  rm = nPrefix+nSu
bb30: 66 66 69 78 3b 0a 20 20 70 4e 65 78 74 20 2b 3d  ffix;.  pNext +=
bb40: 20 6e 53 75 66 66 69 78 3b 0a 20 20 70 4e 65 78   nSuffix;.  pNex
bb50: 74 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72 69  t += fts3GetVari
bb60: 6e 74 33 32 28 70 4e 65 78 74 2c 20 26 70 52 65  nt32(pNext, &pRe
bb70: 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 29 3b  ader->nDoclist);
bb80: 0a 20 20 70 52 65 61 64 65 72 2d 3e 61 44 6f 63  .  pReader->aDoc
bb90: 6c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20  list = pNext;.  
bba0: 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74  pReader->pOffset
bbb0: 4c 69 73 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  List = 0;..  /* 
bbc0: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 64  Check that the d
bbd0: 6f 63 6c 69 73 74 20 64 6f 65 73 20 6e 6f 74 20  oclist does not 
bbe0: 61 70 70 65 61 72 20 74 6f 20 65 78 74 65 6e 64  appear to extend
bbf0: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
bc00: 20 74 68 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65   the.  ** b-tree
bc10: 20 6e 6f 64 65 2e 20 41 6e 64 20 74 68 61 74 20   node. And that 
bc20: 74 68 65 20 66 69 6e 61 6c 20 62 79 74 65 20 6f  the final byte o
bc30: 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20 69 73  f the doclist is
bc40: 20 30 78 30 30 2e 20 49 66 20 65 69 74 68 65 72   0x00. If either
bc50: 20 0a 20 20 2a 2a 20 6f 66 20 74 68 65 73 65 20   .  ** of these 
bc60: 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 75 6e  statements is un
bc70: 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
bc80: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69 73  ata structure is
bc90: 20 63 6f 72 72 75 70 74 2e 0a 20 20 2a 2f 0a 20   corrupt..  */. 
bca0: 20 69 66 28 20 26 70 52 65 61 64 65 72 2d 3e 61   if( &pReader->a
bcb0: 44 6f 63 6c 69 73 74 5b 70 52 65 61 64 65 72 2d  Doclist[pReader-
bcc0: 3e 6e 44 6f 63 6c 69 73 74 5d 3e 26 70 52 65 61  >nDoclist]>&pRea
bcd0: 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64  der->aNode[pRead
bce0: 65 72 2d 3e 6e 4e 6f 64 65 5d 20 0a 20 20 20 7c  er->nNode] .   |
bcf0: 7c 20 28 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70  | (pReader->nPop
bd00: 75 6c 61 74 65 3d 3d 30 20 26 26 20 70 52 65 61  ulate==0 && pRea
bd10: 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b 70 52  der->aDoclist[pR
bd20: 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 2d  eader->nDoclist-
bd30: 31 5d 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  1]).  ){.    ret
bd40: 75 72 6e 20 46 54 53 5f 43 4f 52 52 55 50 54 5f  urn FTS_CORRUPT_
bd50: 56 54 41 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75  VTAB;.  }.  retu
bd60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
bd70: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 53  ./*.** Set the S
bd80: 65 67 52 65 61 64 65 72 20 74 6f 20 70 6f 69 6e  egReader to poin
bd90: 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 64  t to the first d
bda0: 6f 63 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c  ocid in the docl
bdb0: 69 73 74 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  ist associated.*
bdc0: 2a 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65  * with the curre
bdd0: 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74  nt term..*/.stat
bde0: 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65  ic int fts3SegRe
bdf0: 61 64 65 72 46 69 72 73 74 44 6f 63 69 64 28 46  aderFirstDocid(F
be00: 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  ts3Table *pTab, 
be10: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
be20: 52 65 61 64 65 72 29 7b 0a 20 20 69 6e 74 20 72  Reader){.  int r
be30: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
be40: 20 61 73 73 65 72 74 28 20 70 52 65 61 64 65 72   assert( pReader
be50: 2d 3e 61 44 6f 63 6c 69 73 74 20 29 3b 0a 20 20  ->aDoclist );.  
be60: 61 73 73 65 72 74 28 20 21 70 52 65 61 64 65 72  assert( !pReader
be70: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 29 3b  ->pOffsetList );
be80: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 62 44 65  .  if( pTab->bDe
be90: 73 63 49 64 78 20 26 26 20 66 74 73 33 53 65 67  scIdx && fts3Seg
bea0: 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28  ReaderIsPending(
beb0: 70 52 65 61 64 65 72 29 20 29 7b 0a 20 20 20 20  pReader) ){.    
bec0: 75 38 20 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20  u8 bEof = 0;.   
bed0: 20 70 52 65 61 64 65 72 2d 3e 69 44 6f 63 69 64   pReader->iDocid
bee0: 20 3d 20 30 3b 0a 20 20 20 20 70 52 65 61 64 65   = 0;.    pReade
bef0: 72 2d 3e 6e 4f 66 66 73 65 74 4c 69 73 74 20 3d  r->nOffsetList =
bf00: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46   0;.    sqlite3F
bf10: 74 73 33 44 6f 63 6c 69 73 74 50 72 65 76 28 30  ts3DoclistPrev(0
bf20: 2c 0a 20 20 20 20 20 20 20 20 70 52 65 61 64 65  ,.        pReade
bf30: 72 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 70 52 65  r->aDoclist, pRe
bf40: 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 2c 20  ader->nDoclist, 
bf50: 26 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65  &pReader->pOffse
bf60: 74 4c 69 73 74 2c 20 0a 20 20 20 20 20 20 20 20  tList, .        
bf70: 26 70 52 65 61 64 65 72 2d 3e 69 44 6f 63 69 64  &pReader->iDocid
bf80: 2c 20 26 70 52 65 61 64 65 72 2d 3e 6e 4f 66 66  , &pReader->nOff
bf90: 73 65 74 4c 69 73 74 2c 20 26 62 45 6f 66 0a 20  setList, &bEof. 
bfa0: 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20     );.  }else{. 
bfb0: 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52     rc = fts3SegR
bfc0: 65 61 64 65 72 52 65 71 75 69 72 65 28 70 52 65  eaderRequire(pRe
bfd0: 61 64 65 72 2c 20 70 52 65 61 64 65 72 2d 3e 61  ader, pReader->a
bfe0: 44 6f 63 6c 69 73 74 2c 20 46 54 53 33 5f 56 41  Doclist, FTS3_VA
bff0: 52 49 4e 54 5f 4d 41 58 29 3b 0a 20 20 20 20 69  RINT_MAX);.    i
c000: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c010: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20   ){.      int n 
c020: 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74  = sqlite3Fts3Get
c030: 56 61 72 69 6e 74 28 70 52 65 61 64 65 72 2d 3e  Varint(pReader->
c040: 61 44 6f 63 6c 69 73 74 2c 20 26 70 52 65 61 64  aDoclist, &pRead
c050: 65 72 2d 3e 69 44 6f 63 69 64 29 3b 0a 20 20 20  er->iDocid);.   
c060: 20 20 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66     pReader->pOff
c070: 73 65 74 4c 69 73 74 20 3d 20 26 70 52 65 61 64  setList = &pRead
c080: 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b 6e 5d 3b  er->aDoclist[n];
c090: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
c0a0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
c0b0: 20 41 64 76 61 6e 63 65 20 74 68 65 20 53 65 67   Advance the Seg
c0c0: 52 65 61 64 65 72 20 74 6f 20 70 6f 69 6e 74 20  Reader to point 
c0d0: 74 6f 20 74 68 65 20 6e 65 78 74 20 64 6f 63 69  to the next doci
c0e0: 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74  d in the doclist
c0f0: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77  .** associated w
c100: 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ith the current 
c110: 74 65 72 6d 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  term..** .** If 
c120: 61 72 67 75 6d 65 6e 74 73 20 70 70 4f 66 66 73  arguments ppOffs
c130: 65 74 4c 69 73 74 20 61 6e 64 20 70 6e 4f 66 66  etList and pnOff
c140: 73 65 74 4c 69 73 74 20 61 72 65 20 6e 6f 74 20  setList are not 
c150: 4e 55 4c 4c 2c 20 74 68 65 6e 20 0a 2a 2a 20 2a  NULL, then .** *
c160: 70 70 4f 66 66 73 65 74 4c 69 73 74 20 69 73 20  ppOffsetList is 
c170: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
c180: 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  the first column
c190: 2d 6f 66 66 73 65 74 20 6c 69 73 74 0a 2a 2a 20  -offset list.** 
c1a0: 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20 65  in the doclist e
c1b0: 6e 74 72 79 20 28 69 2e 65 2e 20 69 6d 6d 65 64  ntry (i.e. immed
c1c0: 69 61 74 65 6c 79 20 70 61 73 74 20 74 68 65 20  iately past the 
c1d0: 64 6f 63 69 64 20 76 61 72 69 6e 74 29 2e 0a 2a  docid varint)..*
c1e0: 2a 20 2a 70 6e 4f 66 66 73 65 74 4c 69 73 74 20  * *pnOffsetList 
c1f0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c 65  is set to the le
c200: 6e 67 74 68 20 6f 66 20 74 68 65 20 73 65 74 20  ngth of the set 
c210: 6f 66 20 63 6f 6c 75 6d 6e 2d 6f 66 66 73 65 74  of column-offset
c220: 0a 2a 2a 20 6c 69 73 74 73 2c 20 6e 6f 74 20 69  .** lists, not i
c230: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 75 6c  ncluding the nul
c240: 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
c250: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a  . For example:.*
c260: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
c270: 33 53 65 67 52 65 61 64 65 72 4e 65 78 74 44 6f  3SegReaderNextDo
c280: 63 69 64 28 0a 20 20 46 74 73 33 54 61 62 6c 65  cid(.  Fts3Table
c290: 20 2a 70 54 61 62 2c 0a 20 20 46 74 73 33 53 65   *pTab,.  Fts3Se
c2a0: 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 65 72  gReader *pReader
c2b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61  ,         /* Rea
c2c0: 64 65 72 20 74 6f 20 61 64 76 61 6e 63 65 20 74  der to advance t
c2d0: 6f 20 6e 65 78 74 20 64 6f 63 69 64 20 2a 2f 0a  o next docid */.
c2e0: 20 20 63 68 61 72 20 2a 2a 70 70 4f 66 66 73 65    char **ppOffse
c2f0: 74 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  tList,          
c300: 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65    /* OUT: Pointe
c310: 72 20 74 6f 20 63 75 72 72 65 6e 74 20 70 6f 73  r to current pos
c320: 69 74 69 6f 6e 2d 6c 69 73 74 20 2a 2f 0a 20 20  ition-list */.  
c330: 69 6e 74 20 2a 70 6e 4f 66 66 73 65 74 4c 69 73  int *pnOffsetLis
c340: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
c350: 2f 2a 20 4f 55 54 3a 20 4c 65 6e 67 74 68 20 6f  /* OUT: Length o
c360: 66 20 2a 70 70 4f 66 66 73 65 74 4c 69 73 74 20  f *ppOffsetList 
c370: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20  in bytes */.){. 
c380: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c390: 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 70 20 3d  _OK;.  char *p =
c3a0: 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65   pReader->pOffse
c3b0: 74 4c 69 73 74 3b 0a 20 20 63 68 61 72 20 63 20  tList;.  char c 
c3c0: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
c3d0: 70 20 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  p );..  if( pTab
c3e0: 2d 3e 62 44 65 73 63 49 64 78 20 26 26 20 66 74  ->bDescIdx && ft
c3f0: 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65 6e  s3SegReaderIsPen
c400: 64 69 6e 67 28 70 52 65 61 64 65 72 29 20 29 7b  ding(pReader) ){
c410: 0a 20 20 20 20 2f 2a 20 41 20 70 65 6e 64 69 6e  .    /* A pendin
c420: 67 2d 74 65 72 6d 73 20 73 65 67 2d 72 65 61 64  g-terms seg-read
c430: 65 72 20 66 6f 72 20 61 6e 20 46 54 53 34 20 74  er for an FTS4 t
c440: 61 62 6c 65 20 74 68 61 74 20 75 73 65 73 20 6f  able that uses o
c450: 72 64 65 72 3d 64 65 73 63 2e 0a 20 20 20 20 2a  rder=desc..    *
c460: 2a 20 50 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20  * Pending-terms 
c470: 64 6f 63 6c 69 73 74 73 20 61 72 65 20 61 6c 77  doclists are alw
c480: 61 79 73 20 62 75 69 6c 74 20 75 70 20 69 6e 20  ays built up in 
c490: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2c  ascending order,
c4a0: 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20 68 61   so.    ** we ha
c4b0: 76 65 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ve to iterate th
c4c0: 72 6f 75 67 68 20 74 68 65 6d 20 62 61 63 6b 77  rough them backw
c4d0: 61 72 64 73 20 68 65 72 65 2e 20 2a 2f 0a 20 20  ards here. */.  
c4e0: 20 20 75 38 20 62 45 6f 66 20 3d 20 30 3b 0a 20    u8 bEof = 0;. 
c4f0: 20 20 20 69 66 28 20 70 70 4f 66 66 73 65 74 4c     if( ppOffsetL
c500: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  ist ){.      *pp
c510: 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 70 52 65  OffsetList = pRe
c520: 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73  ader->pOffsetLis
c530: 74 3b 0a 20 20 20 20 20 20 2a 70 6e 4f 66 66 73  t;.      *pnOffs
c540: 65 74 4c 69 73 74 20 3d 20 70 52 65 61 64 65 72  etList = pReader
c550: 2d 3e 6e 4f 66 66 73 65 74 4c 69 73 74 20 2d 20  ->nOffsetList - 
c560: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  1;.    }.    sql
c570: 69 74 65 33 46 74 73 33 44 6f 63 6c 69 73 74 50  ite3Fts3DoclistP
c580: 72 65 76 28 30 2c 0a 20 20 20 20 20 20 20 20 70  rev(0,.        p
c590: 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74  Reader->aDoclist
c5a0: 2c 20 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c  , pReader->nDocl
c5b0: 69 73 74 2c 20 26 70 2c 20 26 70 52 65 61 64 65  ist, &p, &pReade
c5c0: 72 2d 3e 69 44 6f 63 69 64 2c 0a 20 20 20 20 20  r->iDocid,.     
c5d0: 20 20 20 26 70 52 65 61 64 65 72 2d 3e 6e 4f 66     &pReader->nOf
c5e0: 66 73 65 74 4c 69 73 74 2c 20 26 62 45 6f 66 0a  fsetList, &bEof.
c5f0: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 62      );.    if( b
c600: 45 6f 66 20 29 7b 0a 20 20 20 20 20 20 70 52 65  Eof ){.      pRe
c610: 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73  ader->pOffsetLis
c620: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
c630: 7b 0a 20 20 20 20 20 20 70 52 65 61 64 65 72 2d  {.      pReader-
c640: 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 70  >pOffsetList = p
c650: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
c660: 0a 20 20 20 20 63 68 61 72 20 2a 70 45 6e 64 20  .    char *pEnd 
c670: 3d 20 26 70 52 65 61 64 65 72 2d 3e 61 44 6f 63  = &pReader->aDoc
c680: 6c 69 73 74 5b 70 52 65 61 64 65 72 2d 3e 6e 44  list[pReader->nD
c690: 6f 63 6c 69 73 74 5d 3b 0a 0a 20 20 20 20 2f 2a  oclist];..    /*
c6a0: 20 50 6f 69 6e 74 65 72 20 70 20 63 75 72 72 65   Pointer p curre
c6b0: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 61 74 20 74  ntly points at t
c6c0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
c6d0: 20 61 6e 20 6f 66 66 73 65 74 20 6c 69 73 74 2e   an offset list.
c6e0: 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c   The.    ** foll
c6f0: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 61 64 76 61  owing block adva
c700: 6e 63 65 73 20 69 74 20 74 6f 20 70 6f 69 6e 74  nces it to point
c710: 20 6f 6e 65 20 62 79 74 65 20 70 61 73 74 20 74   one byte past t
c720: 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a 2a  he end of.    **
c730: 20 74 68 65 20 73 61 6d 65 20 6f 66 66 73 65 74   the same offset
c740: 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 77 68   list. */.    wh
c750: 69 6c 65 28 20 31 20 29 7b 0a 20 20 0a 20 20 20  ile( 1 ){.  .   
c760: 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
c770: 69 6e 67 20 6c 69 6e 65 20 6f 66 20 63 6f 64 65  ing line of code
c780: 20 28 61 6e 64 20 74 68 65 20 22 70 2b 2b 22 20   (and the "p++" 
c790: 62 65 6c 6f 77 20 74 68 65 20 77 68 69 6c 65 28  below the while(
c7a0: 29 20 6c 6f 6f 70 29 20 69 73 0a 20 20 20 20 20  ) loop) is.     
c7b0: 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 6c 6c   ** normally all
c7c0: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
c7d0: 64 20 74 6f 20 6d 6f 76 65 20 70 6f 69 6e 74 65  d to move pointe
c7e0: 72 20 70 20 74 6f 20 74 68 65 20 64 65 73 69 72  r p to the desir
c7f0: 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 70 6f 73  ed .      ** pos
c800: 69 74 69 6f 6e 2e 20 54 68 65 20 65 78 63 65 70  ition. The excep
c810: 74 69 6f 6e 20 69 73 20 69 66 20 74 68 69 73 20  tion is if this 
c820: 6e 6f 64 65 20 69 73 20 62 65 69 6e 67 20 6c 6f  node is being lo
c830: 61 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 0a 20  aded from disk. 
c840: 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e       ** incremen
c850: 74 61 6c 6c 79 20 61 6e 64 20 70 6f 69 6e 74 65  tally and pointe
c860: 72 20 22 70 22 20 6e 6f 77 20 70 6f 69 6e 74 73  r "p" now points
c870: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
c880: 74 65 20 70 61 73 74 0a 20 20 20 20 20 20 2a 2a  te past.      **
c890: 20 74 68 65 20 70 6f 70 75 6c 61 74 65 64 20 70   the populated p
c8a0: 61 72 74 20 6f 66 20 70 52 65 61 64 65 72 2d 3e  art of pReader->
c8b0: 61 4e 6f 64 65 5b 5d 2e 0a 20 20 20 20 20 20 2a  aNode[]..      *
c8c0: 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a  /.      while( *
c8d0: 70 20 7c 20 63 20 29 20 63 20 3d 20 2a 70 2b 2b  p | c ) c = *p++
c8e0: 20 26 20 30 78 38 30 3b 0a 20 20 20 20 20 20 61   & 0x80;.      a
c8f0: 73 73 65 72 74 28 20 2a 70 3d 3d 30 20 29 3b 0a  ssert( *p==0 );.
c900: 20 20 0a 20 20 20 20 20 20 69 66 28 20 70 52 65    .      if( pRe
c910: 61 64 65 72 2d 3e 70 42 6c 6f 62 3d 3d 30 20 7c  ader->pBlob==0 |
c920: 7c 20 70 3c 26 70 52 65 61 64 65 72 2d 3e 61 4e  | p<&pReader->aN
c930: 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e 50 6f  ode[pReader->nPo
c940: 70 75 6c 61 74 65 5d 20 29 20 62 72 65 61 6b 3b  pulate] ) break;
c950: 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33  .      rc = fts3
c960: 53 65 67 52 65 61 64 65 72 49 6e 63 72 52 65 61  SegReaderIncrRea
c970: 64 28 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20  d(pReader);.    
c980: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c990: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
c9a0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2b 2b 3b 0a  .    }.    p++;.
c9b0: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 72 65 71    .    /* If req
c9c0: 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20  uired, populate 
c9d0: 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
c9e0: 62 6c 65 73 20 77 69 74 68 20 61 20 70 6f 69 6e  bles with a poin
c9f0: 74 65 72 20 74 6f 20 61 6e 64 20 74 68 65 0a 20  ter to and the. 
ca00: 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68     ** size of th
ca10: 65 20 70 72 65 76 69 6f 75 73 20 6f 66 66 73 65  e previous offse
ca20: 74 2d 6c 69 73 74 2e 0a 20 20 20 20 2a 2f 0a 20  t-list..    */. 
ca30: 20 20 20 69 66 28 20 70 70 4f 66 66 73 65 74 4c     if( ppOffsetL
ca40: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  ist ){.      *pp
ca50: 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 70 52 65  OffsetList = pRe
ca60: 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73  ader->pOffsetLis
ca70: 74 3b 0a 20 20 20 20 20 20 2a 70 6e 4f 66 66 73  t;.      *pnOffs
ca80: 65 74 4c 69 73 74 20 3d 20 28 69 6e 74 29 28 70  etList = (int)(p
ca90: 20 2d 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66   - pReader->pOff
caa0: 73 65 74 4c 69 73 74 20 2d 20 31 29 3b 0a 20 20  setList - 1);.  
cab0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 73 74    }..    /* List
cac0: 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 65   may have been e
cad0: 64 69 74 65 64 20 69 6e 20 70 6c 61 63 65 20 62  dited in place b
cae0: 79 20 66 74 73 33 45 76 61 6c 4e 65 61 72 54 72  y fts3EvalNearTr
caf0: 69 6d 28 29 20 2a 2f 0a 20 20 20 20 77 68 69 6c  im() */.    whil
cb00: 65 28 20 70 3c 70 45 6e 64 20 26 26 20 2a 70 3d  e( p<pEnd && *p=
cb10: 3d 30 20 29 20 70 2b 2b 3b 0a 20 20 0a 20 20 20  =0 ) p++;.  .   
cb20: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
cb30: 20 6e 6f 20 6d 6f 72 65 20 65 6e 74 72 69 65 73   no more entries
cb40: 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 2c   in the doclist,
cb50: 20 73 65 74 20 70 4f 66 66 73 65 74 4c 69 73 74   set pOffsetList
cb60: 20 74 6f 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2e   to.    ** NULL.
cb70: 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20   Otherwise, set 
cb80: 46 74 73 33 53 65 67 52 65 61 64 65 72 2e 69 44  Fts3SegReader.iD
cb90: 6f 63 69 64 20 74 6f 20 74 68 65 20 6e 65 78 74  ocid to the next
cba0: 20 64 6f 63 69 64 20 61 6e 64 0a 20 20 20 20 2a   docid and.    *
cbb0: 2a 20 46 74 73 33 53 65 67 52 65 61 64 65 72 2e  * Fts3SegReader.
cbc0: 70 4f 66 66 73 65 74 4c 69 73 74 20 74 6f 20 70  pOffsetList to p
cbd0: 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74  oint to the next
cbe0: 20 6f 66 66 73 65 74 20 6c 69 73 74 20 62 65 66   offset list bef
cbf0: 6f 72 65 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  ore.    ** retur
cc00: 6e 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ning..    */.   
cc10: 20 69 66 28 20 70 3e 3d 70 45 6e 64 20 29 7b 0a   if( p>=pEnd ){.
cc20: 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70        pReader->p
cc30: 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 30 3b 0a  OffsetList = 0;.
cc40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cc50: 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61   rc = fts3SegRea
cc60: 64 65 72 52 65 71 75 69 72 65 28 70 52 65 61 64  derRequire(pRead
cc70: 65 72 2c 20 70 2c 20 46 54 53 33 5f 56 41 52 49  er, p, FTS3_VARI
cc80: 4e 54 5f 4d 41 58 29 3b 0a 20 20 20 20 20 20 69  NT_MAX);.      i
cc90: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
cca0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
ccb0: 74 65 33 5f 69 6e 74 36 34 20 69 44 65 6c 74 61  te3_int64 iDelta
ccc0: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64 65  ;.        pReade
ccd0: 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d  r->pOffsetList =
cce0: 20 70 20 2b 20 73 71 6c 69 74 65 33 46 74 73 33   p + sqlite3Fts3
ccf0: 47 65 74 56 61 72 69 6e 74 28 70 2c 20 26 69 44  GetVarint(p, &iD
cd00: 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69  elta);.        i
cd10: 66 28 20 70 54 61 62 2d 3e 62 44 65 73 63 49 64  f( pTab->bDescId
cd20: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  x ){.          p
cd30: 52 65 61 64 65 72 2d 3e 69 44 6f 63 69 64 20 2d  Reader->iDocid -
cd40: 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  = iDelta;.      
cd50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
cd60: 20 20 20 70 52 65 61 64 65 72 2d 3e 69 44 6f 63     pReader->iDoc
cd70: 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20  id += iDelta;.  
cd80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
cd90: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
cda0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
cdb0: 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ...int sqlite3Ft
cdc0: 73 33 4d 73 72 4f 76 66 6c 28 0a 20 20 46 74 73  s3MsrOvfl(.  Fts
cdd0: 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 0a  3Cursor *pCsr, .
cde0: 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65    Fts3MultiSegRe
cdf0: 61 64 65 72 20 2a 70 4d 73 72 2c 0a 20 20 69 6e  ader *pMsr,.  in
ce00: 74 20 2a 70 6e 4f 76 66 6c 0a 29 7b 0a 20 20 46  t *pnOvfl.){.  F
ce10: 74 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 28 46  ts3Table *p = (F
ce20: 74 73 33 54 61 62 6c 65 2a 29 70 43 73 72 2d 3e  ts3Table*)pCsr->
ce30: 62 61 73 65 2e 70 56 74 61 62 3b 0a 20 20 69 6e  base.pVtab;.  in
ce40: 74 20 6e 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69  t nOvfl = 0;.  i
ce50: 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 72 63 20  nt ii;.  int rc 
ce60: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
ce70: 6e 74 20 70 67 73 7a 20 3d 20 70 2d 3e 6e 50 67  nt pgsz = p->nPg
ce80: 73 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  sz;..  assert( p
ce90: 2d 3e 62 46 74 73 34 20 29 3b 0a 20 20 61 73 73  ->bFts4 );.  ass
cea0: 65 72 74 28 20 70 67 73 7a 3e 30 20 29 3b 0a 0a  ert( pgsz>0 );..
ceb0: 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d    for(ii=0; rc==
cec0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c  SQLITE_OK && ii<
ced0: 70 4d 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 20  pMsr->nSegment; 
cee0: 69 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 33 53  ii++){.    Fts3S
cef0: 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 65  egReader *pReade
cf00: 72 20 3d 20 70 4d 73 72 2d 3e 61 70 53 65 67 6d  r = pMsr->apSegm
cf10: 65 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28  ent[ii];.    if(
cf20: 20 21 66 74 73 33 53 65 67 52 65 61 64 65 72 49   !fts3SegReaderI
cf30: 73 50 65 6e 64 69 6e 67 28 70 52 65 61 64 65 72  sPending(pReader
cf40: 29 20 0a 20 20 20 20 20 26 26 20 21 66 74 73 33  ) .     && !fts3
cf50: 53 65 67 52 65 61 64 65 72 49 73 52 6f 6f 74 4f  SegReaderIsRootO
cf60: 6e 6c 79 28 70 52 65 61 64 65 72 29 20 0a 20 20  nly(pReader) .  
cf70: 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
cf80: 65 33 5f 69 6e 74 36 34 20 6a 6a 3b 0a 20 20 20  e3_int64 jj;.   
cf90: 20 20 20 66 6f 72 28 6a 6a 3d 70 52 65 61 64 65     for(jj=pReade
cfa0: 72 2d 3e 69 53 74 61 72 74 42 6c 6f 63 6b 3b 20  r->iStartBlock; 
cfb0: 6a 6a 3c 3d 70 52 65 61 64 65 72 2d 3e 69 4c 65  jj<=pReader->iLe
cfc0: 61 66 45 6e 64 42 6c 6f 63 6b 3b 20 6a 6a 2b 2b  afEndBlock; jj++
cfd0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
cfe0: 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 72 63  Blob;.        rc
cff0: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 52 65   = sqlite3Fts3Re
d000: 61 64 42 6c 6f 63 6b 28 70 2c 20 6a 6a 2c 20 30  adBlock(p, jj, 0
d010: 2c 20 26 6e 42 6c 6f 62 2c 20 30 29 3b 0a 20 20  , &nBlob, 0);.  
d020: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
d030: 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b  LITE_OK ) break;
d040: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6e 42  .        if( (nB
d050: 6c 6f 62 2b 33 35 29 3e 70 67 73 7a 20 29 7b 0a  lob+35)>pgsz ){.
d060: 20 20 20 20 20 20 20 20 20 20 6e 4f 76 66 6c 20            nOvfl 
d070: 2b 3d 20 28 6e 42 6c 6f 62 20 2b 20 33 34 29 2f  += (nBlob + 34)/
d080: 70 67 73 7a 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pgsz;.        }.
d090: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d0a0: 7d 0a 20 20 2a 70 6e 4f 76 66 6c 20 3d 20 6e 4f  }.  *pnOvfl = nO
d0b0: 76 66 6c 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  vfl;.  return rc
d0c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
d0d0: 61 6c 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  all allocations 
d0e0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
d0f0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  the iterator pas
d100: 73 65 64 20 61 73 20 74 68 65 20 0a 2a 2a 20 73  sed as the .** s
d110: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
d120: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
d130: 74 73 33 53 65 67 52 65 61 64 65 72 46 72 65 65  ts3SegReaderFree
d140: 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a  (Fts3SegReader *
d150: 70 52 65 61 64 65 72 29 7b 0a 20 20 69 66 28 20  pReader){.  if( 
d160: 70 52 65 61 64 65 72 20 26 26 20 21 66 74 73 33  pReader && !fts3
d170: 53 65 67 52 65 61 64 65 72 49 73 50 65 6e 64 69  SegReaderIsPendi
d180: 6e 67 28 70 52 65 61 64 65 72 29 20 29 7b 0a 20  ng(pReader) ){. 
d190: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
d1a0: 70 52 65 61 64 65 72 2d 3e 7a 54 65 72 6d 29 3b  pReader->zTerm);
d1b0: 0a 20 20 20 20 69 66 28 20 21 66 74 73 33 53 65  .    if( !fts3Se
d1c0: 67 52 65 61 64 65 72 49 73 52 6f 6f 74 4f 6e 6c  gReaderIsRootOnl
d1d0: 79 28 70 52 65 61 64 65 72 29 20 29 7b 0a 20 20  y(pReader) ){.  
d1e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
d1f0: 28 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 29  (pReader->aNode)
d200: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
d210: 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61 64  blob_close(pRead
d220: 65 72 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 20 20  er->pBlob);.    
d230: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
d240: 66 72 65 65 28 70 52 65 61 64 65 72 29 3b 0a 7d  free(pReader);.}
d250: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
d260: 20 61 20 6e 65 77 20 53 65 67 52 65 61 64 65 72   a new SegReader
d270: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74 20   object..*/.int 
d280: 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
d290: 61 64 65 72 4e 65 77 28 0a 20 20 69 6e 74 20 69  aderNew(.  int i
d2a0: 41 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  Age,            
d2b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
d2c0: 67 6d 65 6e 74 20 22 61 67 65 22 2e 20 2a 2f 0a  gment "age". */.
d2d0: 20 20 69 6e 74 20 62 4c 6f 6f 6b 75 70 2c 20 20    int bLookup,  
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2f0: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
d300: 6c 6f 6f 6b 75 70 20 6f 6e 6c 79 20 2a 2f 0a 20  lookup only */. 
d310: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
d320: 53 74 61 72 74 4c 65 61 66 2c 20 20 20 20 20 20  StartLeaf,      
d330: 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20 74   /* First leaf t
d340: 6f 20 74 72 61 76 65 72 73 65 20 2a 2f 0a 20 20  o traverse */.  
d350: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45  sqlite3_int64 iE
d360: 6e 64 4c 65 61 66 2c 20 20 20 20 20 20 20 20 20  ndLeaf,         
d370: 2f 2a 20 46 69 6e 61 6c 20 6c 65 61 66 20 74 6f  /* Final leaf to
d380: 20 74 72 61 76 65 72 73 65 20 2a 2f 0a 20 20 73   traverse */.  s
d390: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e  qlite3_int64 iEn
d3a0: 64 42 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 2f  dBlock,        /
d3b0: 2a 20 46 69 6e 61 6c 20 62 6c 6f 63 6b 20 6f 66  * Final block of
d3c0: 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f   segment */.  co
d3d0: 6e 73 74 20 63 68 61 72 20 2a 7a 52 6f 6f 74 2c  nst char *zRoot,
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d3f0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
d400: 6e 67 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a  ng root node */.
d410: 20 20 69 6e 74 20 6e 52 6f 6f 74 2c 20 20 20 20    int nRoot,    
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d430: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
d440: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 72  fer containing r
d450: 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 46 74  oot node */.  Ft
d460: 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a 70 70  s3SegReader **pp
d470: 52 65 61 64 65 72 20 20 20 20 20 20 20 20 2f 2a  Reader        /*
d480: 20 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 64 20   OUT: Allocated 
d490: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2f  Fts3SegReader */
d4a0: 0a 29 7b 0a 20 20 46 74 73 33 53 65 67 52 65 61  .){.  Fts3SegRea
d4b0: 64 65 72 20 2a 70 52 65 61 64 65 72 3b 20 20 20  der *pReader;   
d4c0: 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61        /* Newly a
d4d0: 6c 6c 6f 63 61 74 65 64 20 53 65 67 52 65 61 64  llocated SegRead
d4e0: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
d4f0: 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 20 20  nt nExtra = 0;  
d500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d510: 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
d520: 61 74 65 20 73 65 67 6d 65 6e 74 20 72 6f 6f 74  ate segment root
d530: 20 6e 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65   node */..  asse
d540: 72 74 28 20 69 53 74 61 72 74 4c 65 61 66 3c 3d  rt( iStartLeaf<=
d550: 69 45 6e 64 4c 65 61 66 20 29 3b 0a 20 20 69 66  iEndLeaf );.  if
d560: 28 20 69 53 74 61 72 74 4c 65 61 66 3d 3d 30 20  ( iStartLeaf==0 
d570: 29 7b 0a 20 20 20 20 6e 45 78 74 72 61 20 3d 20  ){.    nExtra = 
d580: 6e 52 6f 6f 74 20 2b 20 46 54 53 33 5f 4e 4f 44  nRoot + FTS3_NOD
d590: 45 5f 50 41 44 44 49 4e 47 3b 0a 20 20 7d 0a 0a  E_PADDING;.  }..
d5a0: 20 20 70 52 65 61 64 65 72 20 3d 20 28 46 74 73    pReader = (Fts
d5b0: 33 53 65 67 52 65 61 64 65 72 20 2a 29 73 71 6c  3SegReader *)sql
d5c0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
d5d0: 6f 66 28 46 74 73 33 53 65 67 52 65 61 64 65 72  of(Fts3SegReader
d5e0: 29 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69  ) + nExtra);.  i
d5f0: 66 28 20 21 70 52 65 61 64 65 72 20 29 7b 0a 20  f( !pReader ){. 
d600: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d610: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65  _NOMEM;.  }.  me
d620: 6d 73 65 74 28 70 52 65 61 64 65 72 2c 20 30 2c  mset(pReader, 0,
d630: 20 73 69 7a 65 6f 66 28 46 74 73 33 53 65 67 52   sizeof(Fts3SegR
d640: 65 61 64 65 72 29 29 3b 0a 20 20 70 52 65 61 64  eader));.  pRead
d650: 65 72 2d 3e 69 49 64 78 20 3d 20 69 41 67 65 3b  er->iIdx = iAge;
d660: 0a 20 20 70 52 65 61 64 65 72 2d 3e 62 4c 6f 6f  .  pReader->bLoo
d670: 6b 75 70 20 3d 20 62 4c 6f 6f 6b 75 70 21 3d 30  kup = bLookup!=0
d680: 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 69 53 74  ;.  pReader->iSt
d690: 61 72 74 42 6c 6f 63 6b 20 3d 20 69 53 74 61 72  artBlock = iStar
d6a0: 74 4c 65 61 66 3b 0a 20 20 70 52 65 61 64 65 72  tLeaf;.  pReader
d6b0: 2d 3e 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 20  ->iLeafEndBlock 
d6c0: 3d 20 69 45 6e 64 4c 65 61 66 3b 0a 20 20 70 52  = iEndLeaf;.  pR
d6d0: 65 61 64 65 72 2d 3e 69 45 6e 64 42 6c 6f 63 6b  eader->iEndBlock
d6e0: 20 3d 20 69 45 6e 64 42 6c 6f 63 6b 3b 0a 0a 20   = iEndBlock;.. 
d6f0: 20 69 66 28 20 6e 45 78 74 72 61 20 29 7b 0a 20   if( nExtra ){. 
d700: 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65     /* The entire
d710: 20 73 65 67 6d 65 6e 74 20 69 73 20 73 74 6f 72   segment is stor
d720: 65 64 20 69 6e 20 74 68 65 20 72 6f 6f 74 20 6e  ed in the root n
d730: 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 70 52 65 61  ode. */.    pRea
d740: 64 65 72 2d 3e 61 4e 6f 64 65 20 3d 20 28 63 68  der->aNode = (ch
d750: 61 72 20 2a 29 26 70 52 65 61 64 65 72 5b 31 5d  ar *)&pReader[1]
d760: 3b 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e 72  ;.    pReader->r
d770: 6f 6f 74 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20  ootOnly = 1;.   
d780: 20 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 20   pReader->nNode 
d790: 3d 20 6e 52 6f 6f 74 3b 0a 20 20 20 20 6d 65 6d  = nRoot;.    mem
d7a0: 63 70 79 28 70 52 65 61 64 65 72 2d 3e 61 4e 6f  cpy(pReader->aNo
d7b0: 64 65 2c 20 7a 52 6f 6f 74 2c 20 6e 52 6f 6f 74  de, zRoot, nRoot
d7c0: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70  );.    memset(&p
d7d0: 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 6e 52  Reader->aNode[nR
d7e0: 6f 6f 74 5d 2c 20 30 2c 20 46 54 53 33 5f 4e 4f  oot], 0, FTS3_NO
d7f0: 44 45 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 7d  DE_PADDING);.  }
d800: 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 61 64 65  else{.    pReade
d810: 72 2d 3e 69 43 75 72 72 65 6e 74 42 6c 6f 63 6b  r->iCurrentBlock
d820: 20 3d 20 69 53 74 61 72 74 4c 65 61 66 2d 31 3b   = iStartLeaf-1;
d830: 0a 20 20 7d 0a 20 20 2a 70 70 52 65 61 64 65 72  .  }.  *ppReader
d840: 20 3d 20 70 52 65 61 64 65 72 3b 0a 20 20 72 65   = pReader;.  re
d850: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d860: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
d870: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75   a comparison fu
d880: 6e 63 74 69 6f 6e 20 75 73 65 64 20 61 73 20 61  nction used as a
d890: 20 71 73 6f 72 74 28 29 20 63 61 6c 6c 62 61 63   qsort() callbac
d8a0: 6b 20 77 68 65 6e 20 73 6f 72 74 69 6e 67 0a 2a  k when sorting.*
d8b0: 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 65  * an array of pe
d8c0: 6e 64 69 6e 67 20 74 65 72 6d 73 20 62 79 20 74  nding terms by t
d8d0: 65 72 6d 2e 20 54 68 69 73 20 6f 63 63 75 72 73  erm. This occurs
d8e0: 20 61 73 20 70 61 72 74 20 6f 66 20 66 6c 75 73   as part of flus
d8f0: 68 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  hing.** the cont
d900: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 65 6e 64  ents of the pend
d910: 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20 74  ing-terms hash t
d920: 61 62 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61  able to the data
d930: 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
d940: 69 6e 74 20 66 74 73 33 43 6f 6d 70 61 72 65 45  int fts3CompareE
d950: 6c 65 6d 42 79 54 65 72 6d 28 63 6f 6e 73 74 20  lemByTerm(const 
d960: 76 6f 69 64 20 2a 6c 68 73 2c 20 63 6f 6e 73 74  void *lhs, const
d970: 20 76 6f 69 64 20 2a 72 68 73 29 7b 0a 20 20 63   void *rhs){.  c
d980: 68 61 72 20 2a 7a 31 20 3d 20 66 74 73 33 48 61  har *z1 = fts3Ha
d990: 73 68 4b 65 79 28 2a 28 46 74 73 33 48 61 73 68  shKey(*(Fts3Hash
d9a0: 45 6c 65 6d 20 2a 2a 29 6c 68 73 29 3b 0a 20 20  Elem **)lhs);.  
d9b0: 63 68 61 72 20 2a 7a 32 20 3d 20 66 74 73 33 48  char *z2 = fts3H
d9c0: 61 73 68 4b 65 79 28 2a 28 46 74 73 33 48 61 73  ashKey(*(Fts3Has
d9d0: 68 45 6c 65 6d 20 2a 2a 29 72 68 73 29 3b 0a 20  hElem **)rhs);. 
d9e0: 20 69 6e 74 20 6e 31 20 3d 20 66 74 73 33 48 61   int n1 = fts3Ha
d9f0: 73 68 4b 65 79 73 69 7a 65 28 2a 28 46 74 73 33  shKeysize(*(Fts3
da00: 48 61 73 68 45 6c 65 6d 20 2a 2a 29 6c 68 73 29  HashElem **)lhs)
da10: 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20 66 74 73  ;.  int n2 = fts
da20: 33 48 61 73 68 4b 65 79 73 69 7a 65 28 2a 28 46  3HashKeysize(*(F
da30: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29 72  ts3HashElem **)r
da40: 68 73 29 3b 0a 0a 20 20 69 6e 74 20 6e 20 3d 20  hs);..  int n = 
da50: 28 6e 31 3c 6e 32 20 3f 20 6e 31 20 3a 20 6e 32  (n1<n2 ? n1 : n2
da60: 29 3b 0a 20 20 69 6e 74 20 63 20 3d 20 6d 65 6d  );.  int c = mem
da70: 63 6d 70 28 7a 31 2c 20 7a 32 2c 20 6e 29 3b 0a  cmp(z1, z2, n);.
da80: 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
da90: 20 20 63 20 3d 20 6e 31 20 2d 20 6e 32 3b 0a 20    c = n1 - n2;. 
daa0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d   }.  return c;.}
dab0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
dac0: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
dad0: 20 61 6c 6c 6f 63 61 74 65 20 61 6e 20 46 74 73   allocate an Fts
dae0: 33 53 65 67 52 65 61 64 65 72 20 74 68 61 74 20  3SegReader that 
daf0: 69 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68  iterates through
db00: 0a 2a 2a 20 61 20 73 75 62 73 65 74 20 6f 66 20  .** a subset of 
db10: 74 68 65 20 74 65 72 6d 73 20 73 74 6f 72 65 64  the terms stored
db20: 20 69 6e 20 74 68 65 20 46 74 73 33 54 61 62 6c   in the Fts3Tabl
db30: 65 2e 70 65 6e 64 69 6e 67 54 65 72 6d 73 20 61  e.pendingTerms a
db40: 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rray..**.** If t
db50: 68 65 20 69 73 50 72 65 66 69 78 49 74 65 72 20  he isPrefixIter 
db60: 70 61 72 61 6d 65 74 65 72 20 69 73 20 7a 65 72  parameter is zer
db70: 6f 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  o, then the retu
db80: 72 6e 65 64 20 53 65 67 52 65 61 64 65 72 20 69  rned SegReader i
db90: 74 65 72 61 74 65 73 0a 2a 2a 20 74 68 72 6f 75  terates.** throu
dba0: 67 68 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20  gh each term in 
dbb0: 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d  the pending-term
dbc0: 73 20 74 61 62 6c 65 2e 20 4f 72 2c 20 69 66 20  s table. Or, if 
dbd0: 69 73 50 72 65 66 69 78 49 74 65 72 20 69 73 0a  isPrefixIter is.
dbe0: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20  ** non-zero, it 
dbf0: 69 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68  iterates through
dc00: 20 65 61 63 68 20 74 65 72 6d 20 61 6e 64 20 69   each term and i
dc10: 74 73 20 70 72 65 66 69 78 65 73 2e 20 46 6f 72  ts prefixes. For
dc20: 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20   example, if.** 
dc30: 74 68 65 20 70 65 6e 64 69 6e 67 20 74 65 72 6d  the pending term
dc40: 73 20 68 61 73 68 20 74 61 62 6c 65 20 63 6f 6e  s hash table con
dc50: 74 61 69 6e 73 20 74 68 65 20 74 65 72 6d 73 20  tains the terms 
dc60: 22 73 71 6c 69 74 65 22 2c 20 22 6d 79 73 71 6c  "sqlite", "mysql
dc70: 22 20 61 6e 64 0a 2a 2a 20 22 66 69 72 65 62 69  " and.** "firebi
dc80: 72 64 22 2c 20 74 68 65 6e 20 74 68 65 20 69 74  rd", then the it
dc90: 65 72 61 74 6f 72 20 76 69 73 69 74 73 20 74 68  erator visits th
dca0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 27 74 65 72  e following 'ter
dcb0: 6d 73 27 20 28 69 6e 20 74 68 65 20 6f 72 64 65  ms' (in the orde
dcc0: 72 0a 2a 2a 20 73 68 6f 77 6e 29 3a 0a 2a 2a 0a  r.** shown):.**.
dcd0: 2a 2a 20 20 20 66 20 66 69 20 66 69 72 20 66 69  **   f fi fir fi
dce0: 72 65 20 66 69 72 65 62 20 66 69 72 65 62 69 20  re fireb firebi 
dcf0: 66 69 72 65 62 69 72 20 66 69 72 65 62 69 72 64  firebir firebird
dd00: 0a 2a 2a 20 20 20 6d 20 6d 79 20 6d 79 73 20 6d  .**   m my mys m
dd10: 79 73 71 20 6d 79 73 71 6c 0a 2a 2a 20 20 20 73  ysq mysql.**   s
dd20: 20 73 71 20 73 71 6c 20 73 71 6c 69 20 73 71 6c   sq sql sqli sql
dd30: 69 74 20 73 71 6c 69 74 65 0a 2a 2a 0a 2a 2a 20  it sqlite.**.** 
dd40: 57 68 65 72 65 61 73 20 69 66 20 69 73 50 72 65  Whereas if isPre
dd50: 66 69 78 49 74 65 72 20 69 73 20 7a 65 72 6f 2c  fixIter is zero,
dd60: 20 74 68 65 20 74 65 72 6d 73 20 76 69 73 69 74   the terms visit
dd70: 65 64 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  ed are:.**.**   
dd80: 66 69 72 65 62 69 72 64 20 6d 79 73 71 6c 20 73  firebird mysql s
dd90: 71 6c 69 74 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c  qlite.*/.int sql
dda0: 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
ddb0: 72 50 65 6e 64 69 6e 67 28 0a 20 20 46 74 73 33  rPending(.  Fts3
ddc0: 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
dde0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
ddf0: 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e  dle */.  int iIn
de00: 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  dex,            
de10: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
de20: 78 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65 78 20  x for p->aIndex 
de30: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
de40: 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  *zTerm,         
de50: 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20       /* Term to 
de60: 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a 20 20  search for */.  
de70: 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 20  int nTerm,      
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de90: 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
dea0: 72 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  r zTerm */.  int
deb0: 20 62 50 72 65 66 69 78 2c 20 20 20 20 20 20 20   bPrefix,       
dec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ded0: 54 72 75 65 20 66 6f 72 20 61 20 70 72 65 66 69  True for a prefi
dee0: 78 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20  x iterator */.  
def0: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a  Fts3SegReader **
df00: 70 70 52 65 61 64 65 72 20 20 20 20 20 20 20 20  ppReader        
df10: 2f 2a 20 4f 55 54 3a 20 53 65 67 52 65 61 64 65  /* OUT: SegReade
df20: 72 20 66 6f 72 20 70 65 6e 64 69 6e 67 2d 74 65  r for pending-te
df30: 72 6d 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33  rms */.){.  Fts3
df40: 53 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64  SegReader *pRead
df50: 65 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46  er = 0;     /* F
df60: 74 73 33 53 65 67 52 65 61 64 65 72 20 6f 62 6a  ts3SegReader obj
df70: 65 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ect to return */
df80: 0a 20 20 46 74 73 33 48 61 73 68 45 6c 65 6d 20  .  Fts3HashElem 
df90: 2a 70 45 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pE;            
dfa0: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
dfb0: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 46 74 73  ariable */.  Fts
dfc0: 33 48 61 73 68 45 6c 65 6d 20 2a 2a 61 45 6c 65  3HashElem **aEle
dfd0: 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  m = 0;       /* 
dfe0: 41 72 72 61 79 20 6f 66 20 74 65 72 6d 20 68 61  Array of term ha
dff0: 73 68 20 65 6e 74 72 69 65 73 20 74 6f 20 73 63  sh entries to sc
e000: 61 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6c 65  an */.  int nEle
e010: 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  m = 0;          
e020: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
e030: 6f 66 20 61 72 72 61 79 20 61 74 20 61 45 6c 65  of array at aEle
e040: 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  m */.  int rc = 
e050: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
e060: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
e070: 20 43 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 48   Code */.  Fts3H
e080: 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 70  ash *pHash;..  p
e090: 48 61 73 68 20 3d 20 26 70 2d 3e 61 49 6e 64 65  Hash = &p->aInde
e0a0: 78 5b 69 49 6e 64 65 78 5d 2e 68 50 65 6e 64 69  x[iIndex].hPendi
e0b0: 6e 67 3b 0a 20 20 69 66 28 20 62 50 72 65 66 69  ng;.  if( bPrefi
e0c0: 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 6c  x ){.    int nAl
e0d0: 6c 6f 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20  loc = 0;        
e0e0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
e0f0: 66 20 61 6c 6c 6f 63 61 74 65 64 20 61 72 72 61  f allocated arra
e100: 79 20 61 74 20 61 45 6c 65 6d 20 2a 2f 0a 0a 20  y at aElem */.. 
e110: 20 20 20 66 6f 72 28 70 45 3d 66 74 73 33 48 61     for(pE=fts3Ha
e120: 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20  shFirst(pHash); 
e130: 70 45 3b 20 70 45 3d 66 74 73 33 48 61 73 68 4e  pE; pE=fts3HashN
e140: 65 78 74 28 70 45 29 29 7b 0a 20 20 20 20 20 20  ext(pE)){.      
e150: 63 68 61 72 20 2a 7a 4b 65 79 20 3d 20 28 63 68  char *zKey = (ch
e160: 61 72 20 2a 29 66 74 73 33 48 61 73 68 4b 65 79  ar *)fts3HashKey
e170: 28 70 45 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  (pE);.      int 
e180: 6e 4b 65 79 20 3d 20 66 74 73 33 48 61 73 68 4b  nKey = fts3HashK
e190: 65 79 73 69 7a 65 28 70 45 29 3b 0a 20 20 20 20  eysize(pE);.    
e1a0: 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d 30 20 7c    if( nTerm==0 |
e1b0: 7c 20 28 6e 4b 65 79 3e 3d 6e 54 65 72 6d 20 26  | (nKey>=nTerm &
e1c0: 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 4b 65 79  & 0==memcmp(zKey
e1d0: 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 29  , zTerm, nTerm))
e1e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
e1f0: 6e 45 6c 65 6d 3d 3d 6e 41 6c 6c 6f 63 20 29 7b  nElem==nAlloc ){
e200: 0a 20 20 20 20 20 20 20 20 20 20 46 74 73 33 48  .          Fts3H
e210: 61 73 68 45 6c 65 6d 20 2a 2a 61 45 6c 65 6d 32  ashElem **aElem2
e220: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 41 6c 6c  ;.          nAll
e230: 6f 63 20 2b 3d 20 31 36 3b 0a 20 20 20 20 20 20  oc += 16;.      
e240: 20 20 20 20 61 45 6c 65 6d 32 20 3d 20 28 46 74      aElem2 = (Ft
e250: 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29 73 71  s3HashElem **)sq
e260: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20  lite3_realloc(. 
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 45 6c               aEl
e280: 65 6d 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f  em, nAlloc*sizeo
e290: 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a  f(Fts3HashElem *
e2a0: 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ).          );. 
e2b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 61 45           if( !aE
e2c0: 6c 65 6d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  lem2 ){.        
e2d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e2e0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
e2f0: 20 20 20 6e 45 6c 65 6d 20 3d 20 30 3b 0a 20 20     nElem = 0;.  
e300: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
e310: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
e320: 20 20 20 20 20 20 20 61 45 6c 65 6d 20 3d 20 61         aElem = a
e330: 45 6c 65 6d 32 3b 0a 20 20 20 20 20 20 20 20 7d  Elem2;.        }
e340: 0a 0a 20 20 20 20 20 20 20 20 61 45 6c 65 6d 5b  ..        aElem[
e350: 6e 45 6c 65 6d 2b 2b 5d 20 3d 20 70 45 3b 0a 20  nElem++] = pE;. 
e360: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
e370: 20 20 2f 2a 20 49 66 20 6d 6f 72 65 20 74 68 61    /* If more tha
e380: 6e 20 6f 6e 65 20 74 65 72 6d 20 6d 61 74 63 68  n one term match
e390: 65 73 20 74 68 65 20 70 72 65 66 69 78 2c 20 73  es the prefix, s
e3a0: 6f 72 74 20 74 68 65 20 46 74 73 33 48 61 73 68  ort the Fts3Hash
e3b0: 45 6c 65 6d 0a 20 20 20 20 2a 2a 20 6f 62 6a 65  Elem.    ** obje
e3c0: 63 74 73 20 69 6e 20 74 65 72 6d 20 6f 72 64 65  cts in term orde
e3d0: 72 20 75 73 69 6e 67 20 71 73 6f 72 74 28 29 2e  r using qsort().
e3e0: 20 54 68 69 73 20 75 73 65 73 20 74 68 65 20 73   This uses the s
e3f0: 61 6d 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20  ame comparison. 
e400: 20 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 61     ** callback a
e410: 73 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 66  s is used when f
e420: 6c 75 73 68 69 6e 67 20 74 65 72 6d 73 20 74 6f  lushing terms to
e430: 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   disk..    */.  
e440: 20 20 69 66 28 20 6e 45 6c 65 6d 3e 31 20 29 7b    if( nElem>1 ){
e450: 0a 20 20 20 20 20 20 71 73 6f 72 74 28 61 45 6c  .      qsort(aEl
e460: 65 6d 2c 20 6e 45 6c 65 6d 2c 20 73 69 7a 65 6f  em, nElem, sizeo
e470: 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a  f(Fts3HashElem *
e480: 29 2c 20 66 74 73 33 43 6f 6d 70 61 72 65 45 6c  ), fts3CompareEl
e490: 65 6d 42 79 54 65 72 6d 29 3b 0a 20 20 20 20 7d  emByTerm);.    }
e4a0: 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ..  }else{.    /
e4b0: 2a 20 54 68 65 20 71 75 65 72 79 20 69 73 20 61  * The query is a
e4c0: 20 73 69 6d 70 6c 65 20 74 65 72 6d 20 6c 6f 6f   simple term loo
e4d0: 6b 75 70 20 74 68 61 74 20 6d 61 74 63 68 65 73  kup that matches
e4e0: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 74 65 72   at most one ter
e4f0: 6d 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  m in.    ** the 
e500: 69 6e 64 65 78 2e 20 41 6c 6c 20 74 68 61 74 20  index. All that 
e510: 69 73 20 72 65 71 75 69 72 65 64 20 69 73 20 61  is required is a
e520: 20 73 74 72 61 69 67 68 74 20 68 61 73 68 2d 6c   straight hash-l
e530: 6f 6f 6b 75 70 2e 20 0a 20 20 20 20 2a 2a 0a 20  ookup. .    **. 
e540: 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68     ** Because th
e550: 65 20 73 74 61 63 6b 20 61 64 64 72 65 73 73 20  e stack address 
e560: 6f 66 20 70 45 20 6d 61 79 20 62 65 20 61 63 63  of pE may be acc
e570: 65 73 73 65 64 20 76 69 61 20 74 68 65 20 61 45  essed via the aE
e580: 6c 65 6d 20 70 6f 69 6e 74 65 72 0a 20 20 20 20  lem pointer.    
e590: 2a 2a 20 62 65 6c 6f 77 2c 20 74 68 65 20 22 46  ** below, the "F
e5a0: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 70 45 22  ts3HashElem *pE"
e5b0: 20 6d 75 73 74 20 62 65 20 64 65 63 6c 61 72 65   must be declare
e5c0: 64 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20  d so that it is 
e5d0: 76 61 6c 69 64 0a 20 20 20 20 2a 2a 20 77 69 74  valid.    ** wit
e5e0: 68 69 6e 20 74 68 69 73 20 65 6e 74 69 72 65 20  hin this entire 
e5f0: 66 75 6e 63 74 69 6f 6e 2c 20 6e 6f 74 20 6a 75  function, not ju
e600: 73 74 20 74 68 69 73 20 22 65 6c 73 65 7b 2e 2e  st this "else{..
e610: 2e 7d 22 20 62 6c 6f 63 6b 2e 0a 20 20 20 20 2a  .}" block..    *
e620: 2f 0a 20 20 20 20 70 45 20 3d 20 66 74 73 33 48  /.    pE = fts3H
e630: 61 73 68 46 69 6e 64 45 6c 65 6d 28 70 48 61 73  ashFindElem(pHas
e640: 68 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29  h, zTerm, nTerm)
e650: 3b 0a 20 20 20 20 69 66 28 20 70 45 20 29 7b 0a  ;.    if( pE ){.
e660: 20 20 20 20 20 20 61 45 6c 65 6d 20 3d 20 26 70        aElem = &p
e670: 45 3b 0a 20 20 20 20 20 20 6e 45 6c 65 6d 20 3d  E;.      nElem =
e680: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
e690: 20 69 66 28 20 6e 45 6c 65 6d 3e 30 20 29 7b 0a   if( nElem>0 ){.
e6a0: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
e6b0: 73 69 7a 65 6f 66 28 46 74 73 33 53 65 67 52 65  sizeof(Fts3SegRe
e6c0: 61 64 65 72 29 20 2b 20 28 6e 45 6c 65 6d 2b 31  ader) + (nElem+1
e6d0: 29 2a 73 69 7a 65 6f 66 28 46 74 73 33 48 61 73  )*sizeof(Fts3Has
e6e0: 68 45 6c 65 6d 20 2a 29 3b 0a 20 20 20 20 70 52  hElem *);.    pR
e6f0: 65 61 64 65 72 20 3d 20 28 46 74 73 33 53 65 67  eader = (Fts3Seg
e700: 52 65 61 64 65 72 20 2a 29 73 71 6c 69 74 65 33  Reader *)sqlite3
e710: 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a  _malloc(nByte);.
e720: 20 20 20 20 69 66 28 20 21 70 52 65 61 64 65 72      if( !pReader
e730: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
e740: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
e750: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
e760: 6d 73 65 74 28 70 52 65 61 64 65 72 2c 20 30 2c  mset(pReader, 0,
e770: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70   nByte);.      p
e780: 52 65 61 64 65 72 2d 3e 69 49 64 78 20 3d 20 30  Reader->iIdx = 0
e790: 78 37 46 46 46 46 46 46 46 3b 0a 20 20 20 20 20  x7FFFFFFF;.     
e7a0: 20 70 52 65 61 64 65 72 2d 3e 70 70 4e 65 78 74   pReader->ppNext
e7b0: 45 6c 65 6d 20 3d 20 28 46 74 73 33 48 61 73 68  Elem = (Fts3Hash
e7c0: 45 6c 65 6d 20 2a 2a 29 26 70 52 65 61 64 65 72  Elem **)&pReader
e7d0: 5b 31 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  [1];.      memcp
e7e0: 79 28 70 52 65 61 64 65 72 2d 3e 70 70 4e 65 78  y(pReader->ppNex
e7f0: 74 45 6c 65 6d 2c 20 61 45 6c 65 6d 2c 20 6e 45  tElem, aElem, nE
e800: 6c 65 6d 2a 73 69 7a 65 6f 66 28 46 74 73 33 48  lem*sizeof(Fts3H
e810: 61 73 68 45 6c 65 6d 20 2a 29 29 3b 0a 20 20 20  ashElem *));.   
e820: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 50   }.  }..  if( bP
e830: 72 65 66 69 78 20 29 7b 0a 20 20 20 20 73 71 6c  refix ){.    sql
e840: 69 74 65 33 5f 66 72 65 65 28 61 45 6c 65 6d 29  ite3_free(aElem)
e850: 3b 0a 20 20 7d 0a 20 20 2a 70 70 52 65 61 64 65  ;.  }.  *ppReade
e860: 72 20 3d 20 70 52 65 61 64 65 72 3b 0a 20 20 72  r = pReader;.  r
e870: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
e880: 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 65  ** Compare the e
e890: 6e 74 72 69 65 73 20 70 6f 69 6e 74 65 64 20 74  ntries pointed t
e8a0: 6f 20 62 79 20 74 77 6f 20 46 74 73 33 53 65 67  o by two Fts3Seg
e8b0: 52 65 61 64 65 72 20 73 74 72 75 63 74 75 72 65  Reader structure
e8c0: 73 2e 20 0a 2a 2a 20 43 6f 6d 70 61 72 69 73 6f  s. .** Compariso
e8d0: 6e 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  n is as follows:
e8e0: 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 45 4f 46 20  .**.**   1) EOF 
e8f0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
e900: 6e 6f 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 20  not EOF..**.**  
e910: 20 32 29 20 54 68 65 20 63 75 72 72 65 6e 74 20   2) The current 
e920: 74 65 72 6d 73 20 28 69 66 20 61 6e 79 29 20 61  terms (if any) a
e930: 72 65 20 63 6f 6d 70 61 72 65 64 20 75 73 69 6e  re compared usin
e940: 67 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66 20 6f  g memcmp(). If o
e950: 6e 65 0a 2a 2a 20 20 20 20 20 20 74 65 72 6d 20  ne.**      term 
e960: 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 61  is a prefix of a
e970: 6e 6f 74 68 65 72 2c 20 74 68 65 20 6c 6f 6e 67  nother, the long
e980: 65 72 20 74 65 72 6d 20 69 73 20 63 6f 6e 73 69  er term is consi
e990: 64 65 72 65 64 20 74 68 65 0a 2a 2a 20 20 20 20  dered the.**    
e9a0: 20 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20    larger..**.** 
e9b0: 20 20 33 29 20 42 79 20 73 65 67 6d 65 6e 74 20    3) By segment 
e9c0: 61 67 65 2e 20 41 6e 20 6f 6c 64 65 72 20 73 65  age. An older se
e9d0: 67 6d 65 6e 74 20 69 73 20 63 6f 6e 73 69 64 65  gment is conside
e9e0: 72 65 64 20 6c 61 72 67 65 72 2e 0a 2a 2f 0a 73  red larger..*/.s
e9f0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65  tatic int fts3Se
ea00: 67 52 65 61 64 65 72 43 6d 70 28 46 74 73 33 53  gReaderCmp(Fts3S
ea10: 65 67 52 65 61 64 65 72 20 2a 70 4c 68 73 2c 20  egReader *pLhs, 
ea20: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
ea30: 52 68 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Rhs){.  int rc;.
ea40: 20 20 69 66 28 20 70 4c 68 73 2d 3e 61 4e 6f 64    if( pLhs->aNod
ea50: 65 20 26 26 20 70 52 68 73 2d 3e 61 4e 6f 64 65  e && pRhs->aNode
ea60: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20   ){.    int rc2 
ea70: 3d 20 70 4c 68 73 2d 3e 6e 54 65 72 6d 20 2d 20  = pLhs->nTerm - 
ea80: 70 52 68 73 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20  pRhs->nTerm;.   
ea90: 20 69 66 28 20 72 63 32 3c 30 20 29 7b 0a 20 20   if( rc2<0 ){.  
eaa0: 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28      rc = memcmp(
eab0: 70 4c 68 73 2d 3e 7a 54 65 72 6d 2c 20 70 52 68  pLhs->zTerm, pRh
eac0: 73 2d 3e 7a 54 65 72 6d 2c 20 70 4c 68 73 2d 3e  s->zTerm, pLhs->
ead0: 6e 54 65 72 6d 29 3b 0a 20 20 20 20 7d 65 6c 73  nTerm);.    }els
eae0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 65  e{.      rc = me
eaf0: 6d 63 6d 70 28 70 4c 68 73 2d 3e 7a 54 65 72 6d  mcmp(pLhs->zTerm
eb00: 2c 20 70 52 68 73 2d 3e 7a 54 65 72 6d 2c 20 70  , pRhs->zTerm, p
eb10: 52 68 73 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20  Rhs->nTerm);.   
eb20: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 30   }.    if( rc==0
eb30: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
eb40: 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  c2;.    }.  }els
eb50: 65 7b 0a 20 20 20 20 72 63 20 3d 20 28 70 4c 68  e{.    rc = (pLh
eb60: 73 2d 3e 61 4e 6f 64 65 3d 3d 30 29 20 2d 20 28  s->aNode==0) - (
eb70: 70 52 68 73 2d 3e 61 4e 6f 64 65 3d 3d 30 29 3b  pRhs->aNode==0);
eb80: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30  .  }.  if( rc==0
eb90: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 52 68   ){.    rc = pRh
eba0: 73 2d 3e 69 49 64 78 20 2d 20 70 4c 68 73 2d 3e  s->iIdx - pLhs->
ebb0: 69 49 64 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65  iIdx;.  }.  asse
ebc0: 72 74 28 20 72 63 21 3d 30 20 29 3b 0a 20 20 72  rt( rc!=0 );.  r
ebd0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
ebe0: 2a 2a 20 41 20 64 69 66 66 65 72 65 6e 74 20 63  ** A different c
ebf0: 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
ec00: 6f 6e 20 66 6f 72 20 53 65 67 52 65 61 64 65 72  on for SegReader
ec10: 20 73 74 72 75 63 74 75 72 65 73 2e 20 49 6e 20   structures. In 
ec20: 74 68 69 73 0a 2a 2a 20 76 65 72 73 69 6f 6e 2c  this.** version,
ec30: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
ec40: 68 61 74 20 65 61 63 68 20 53 65 67 52 65 61 64  hat each SegRead
ec50: 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  er points to an 
ec60: 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 61 20 64 6f  entry in.** a do
ec70: 63 6c 69 73 74 20 66 6f 72 20 69 64 65 6e 74 69  clist for identi
ec80: 63 61 6c 20 74 65 72 6d 73 2e 20 43 6f 6d 70 61  cal terms. Compa
ec90: 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 73  rison is made as
eca0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
ecb0: 20 20 31 29 20 45 4f 46 20 28 65 6e 64 20 6f 66    1) EOF (end of
ecc0: 20 64 6f 63 6c 69 73 74 20 69 6e 20 74 68 69 73   doclist in this
ecd0: 20 63 61 73 65 29 20 69 73 20 67 72 65 61 74 65   case) is greate
ece0: 72 20 74 68 61 6e 20 6e 6f 74 20 45 4f 46 2e 0a  r than not EOF..
ecf0: 2a 2a 0a 2a 2a 20 20 20 32 29 20 42 79 20 63 75  **.**   2) By cu
ed00: 72 72 65 6e 74 20 64 6f 63 69 64 2e 0a 2a 2a 0a  rrent docid..**.
ed10: 2a 2a 20 20 20 33 29 20 42 79 20 73 65 67 6d 65  **   3) By segme
ed20: 6e 74 20 61 67 65 2e 20 41 6e 20 6f 6c 64 65 72  nt age. An older
ed30: 20 73 65 67 6d 65 6e 74 20 69 73 20 63 6f 6e 73   segment is cons
ed40: 69 64 65 72 65 64 20 6c 61 72 67 65 72 2e 0a 2a  idered larger..*
ed50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
ed60: 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73  3SegReaderDoclis
ed70: 74 43 6d 70 28 46 74 73 33 53 65 67 52 65 61 64  tCmp(Fts3SegRead
ed80: 65 72 20 2a 70 4c 68 73 2c 20 46 74 73 33 53 65  er *pLhs, Fts3Se
ed90: 67 52 65 61 64 65 72 20 2a 70 52 68 73 29 7b 0a  gReader *pRhs){.
eda0: 20 20 69 6e 74 20 72 63 20 3d 20 28 70 4c 68 73    int rc = (pLhs
edb0: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30  ->pOffsetList==0
edc0: 29 2d 28 70 52 68 73 2d 3e 70 4f 66 66 73 65 74  )-(pRhs->pOffset
edd0: 4c 69 73 74 3d 3d 30 29 3b 0a 20 20 69 66 28 20  List==0);.  if( 
ede0: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  rc==0 ){.    if(
edf0: 20 70 4c 68 73 2d 3e 69 44 6f 63 69 64 3d 3d 70   pLhs->iDocid==p
ee00: 52 68 73 2d 3e 69 44 6f 63 69 64 20 29 7b 0a 20  Rhs->iDocid ){. 
ee10: 20 20 20 20 20 72 63 20 3d 20 70 52 68 73 2d 3e       rc = pRhs->
ee20: 69 49 64 78 20 2d 20 70 4c 68 73 2d 3e 69 49 64  iIdx - pLhs->iId
ee30: 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  x;.    }else{.  
ee40: 20 20 20 20 72 63 20 3d 20 28 70 4c 68 73 2d 3e      rc = (pLhs->
ee50: 69 44 6f 63 69 64 20 3e 20 70 52 68 73 2d 3e 69  iDocid > pRhs->i
ee60: 44 6f 63 69 64 29 20 3f 20 31 20 3a 20 2d 31 3b  Docid) ? 1 : -1;
ee70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
ee80: 65 72 74 28 20 70 4c 68 73 2d 3e 61 4e 6f 64 65  ert( pLhs->aNode
ee90: 20 26 26 20 70 52 68 73 2d 3e 61 4e 6f 64 65 20   && pRhs->aNode 
eea0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
eeb0: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  }.static int fts
eec0: 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73  3SegReaderDoclis
eed0: 74 43 6d 70 52 65 76 28 46 74 73 33 53 65 67 52  tCmpRev(Fts3SegR
eee0: 65 61 64 65 72 20 2a 70 4c 68 73 2c 20 46 74 73  eader *pLhs, Fts
eef0: 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 68 73  3SegReader *pRhs
ef00: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 28 70  ){.  int rc = (p
ef10: 4c 68 73 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74  Lhs->pOffsetList
ef20: 3d 3d 30 29 2d 28 70 52 68 73 2d 3e 70 4f 66 66  ==0)-(pRhs->pOff
ef30: 73 65 74 4c 69 73 74 3d 3d 30 29 3b 0a 20 20 69  setList==0);.  i
ef40: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
ef50: 69 66 28 20 70 4c 68 73 2d 3e 69 44 6f 63 69 64  if( pLhs->iDocid
ef60: 3d 3d 70 52 68 73 2d 3e 69 44 6f 63 69 64 20 29  ==pRhs->iDocid )
ef70: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 52 68  {.      rc = pRh
ef80: 73 2d 3e 69 49 64 78 20 2d 20 70 4c 68 73 2d 3e  s->iIdx - pLhs->
ef90: 69 49 64 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  iIdx;.    }else{
efa0: 0a 20 20 20 20 20 20 72 63 20 3d 20 28 70 4c 68  .      rc = (pLh
efb0: 73 2d 3e 69 44 6f 63 69 64 20 3c 20 70 52 68 73  s->iDocid < pRhs
efc0: 2d 3e 69 44 6f 63 69 64 29 20 3f 20 31 20 3a 20  ->iDocid) ? 1 : 
efd0: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  -1;.    }.  }.  
efe0: 61 73 73 65 72 74 28 20 70 4c 68 73 2d 3e 61 4e  assert( pLhs->aN
eff0: 6f 64 65 20 26 26 20 70 52 68 73 2d 3e 61 4e 6f  ode && pRhs->aNo
f000: 64 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  de );.  return r
f010: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  c;.}../*.** Comp
f020: 61 72 65 20 74 68 65 20 74 65 72 6d 20 74 68 61  are the term tha
f030: 74 20 74 68 65 20 46 74 73 33 53 65 67 52 65 61  t the Fts3SegRea
f040: 64 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  der object passe
f050: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
f060: 72 67 75 6d 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74  rgument.** point
f070: 73 20 74 6f 20 77 69 74 68 20 74 68 65 20 74 65  s to with the te
f080: 72 6d 20 73 70 65 63 69 66 69 65 64 20 62 79 20  rm specified by 
f090: 61 72 67 75 6d 65 6e 74 73 20 7a 54 65 72 6d 20  arguments zTerm 
f0a0: 61 6e 64 20 6e 54 65 72 6d 2e 20 0a 2a 2a 0a 2a  and nTerm. .**.*
f0b0: 2a 20 49 66 20 74 68 65 20 70 53 65 67 20 69 74  * If the pSeg it
f0c0: 65 72 61 74 6f 72 20 69 73 20 61 6c 72 65 61 64  erator is alread
f0d0: 79 20 61 74 20 45 4f 46 2c 20 72 65 74 75 72 6e  y at EOF, return
f0e0: 20 30 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72   0. Otherwise, r
f0f0: 65 74 75 72 6e 0a 2a 2a 20 2d 76 65 20 69 66 20  eturn.** -ve if 
f100: 74 68 65 20 70 53 65 67 20 74 65 72 6d 20 69 73  the pSeg term is
f110: 20 6c 65 73 73 20 74 68 61 6e 20 7a 54 65 72 6d   less than zTerm
f120: 2f 6e 54 65 72 6d 2c 20 30 20 69 66 20 74 68 65  /nTerm, 0 if the
f130: 20 74 77 6f 20 74 65 72 6d 73 20 61 72 65 0a 2a   two terms are.*
f140: 2a 20 65 71 75 61 6c 2c 20 6f 72 20 2b 76 65 20  * equal, or +ve 
f150: 69 66 20 74 68 65 20 70 53 65 67 20 74 65 72 6d  if the pSeg term
f160: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
f170: 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 0a 2a 2f   zTerm/nTerm..*/
f180: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
f190: 53 65 67 52 65 61 64 65 72 54 65 72 6d 43 6d 70  SegReaderTermCmp
f1a0: 28 0a 20 20 46 74 73 33 53 65 67 52 65 61 64 65  (.  Fts3SegReade
f1b0: 72 20 2a 70 53 65 67 2c 20 20 20 20 20 20 20 20  r *pSeg,        
f1c0: 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 72      /* Segment r
f1d0: 65 61 64 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  eader object */.
f1e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
f1f0: 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
f200: 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 63 6f 6d    /* Term to com
f210: 70 61 72 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  pare to */.  int
f220: 20 6e 54 65 72 6d 20 20 20 20 20 20 20 20 20 20   nTerm          
f230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f240: 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 7a 54 65  Size of term zTe
f250: 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29  rm in bytes */.)
f260: 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b  {.  int res = 0;
f270: 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 61 4e 6f  .  if( pSeg->aNo
f280: 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  de ){.    if( pS
f290: 65 67 2d 3e 6e 54 65 72 6d 3e 6e 54 65 72 6d 20  eg->nTerm>nTerm 
f2a0: 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6d  ){.      res = m
f2b0: 65 6d 63 6d 70 28 70 53 65 67 2d 3e 7a 54 65 72  emcmp(pSeg->zTer
f2c0: 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29  m, zTerm, nTerm)
f2d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f2e0: 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28     res = memcmp(
f2f0: 70 53 65 67 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65  pSeg->zTerm, zTe
f300: 72 6d 2c 20 70 53 65 67 2d 3e 6e 54 65 72 6d 29  rm, pSeg->nTerm)
f310: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f320: 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
f330: 72 65 73 20 3d 20 70 53 65 67 2d 3e 6e 54 65 72  res = pSeg->nTer
f340: 6d 2d 6e 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20  m-nTerm;.    }. 
f350: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b   }.  return res;
f360: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
f370: 6e 74 20 61 70 53 65 67 6d 65 6e 74 20 69 73 20  nt apSegment is 
f380: 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 53 65 67  an array of nSeg
f390: 6d 65 6e 74 20 65 6c 65 6d 65 6e 74 73 2e 20 49  ment elements. I
f3a0: 74 20 69 73 20 6b 6e 6f 77 6e 20 74 68 61 74 0a  t is known that.
f3b0: 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 28 6e 53  ** the final (nS
f3c0: 65 67 6d 65 6e 74 2d 6e 53 75 73 70 65 63 74 29  egment-nSuspect)
f3d0: 20 6d 65 6d 62 65 72 73 20 61 72 65 20 61 6c 72   members are alr
f3e0: 65 61 64 79 20 69 6e 20 73 6f 72 74 65 64 20 6f  eady in sorted o
f3f0: 72 64 65 72 0a 2a 2a 20 28 61 63 63 6f 72 64 69  rder.** (accordi
f400: 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 70 61 72  ng to the compar
f410: 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 72  ison function pr
f420: 6f 76 69 64 65 64 29 2e 20 54 68 69 73 20 66 75  ovided). This fu
f430: 6e 63 74 69 6f 6e 20 73 68 75 66 66 6c 65 73 0a  nction shuffles.
f440: 2a 2a 20 74 68 65 20 61 72 72 61 79 20 61 72 6f  ** the array aro
f450: 75 6e 64 20 75 6e 74 69 6c 20 61 6c 6c 20 65 6e  und until all en
f460: 74 72 69 65 73 20 61 72 65 20 69 6e 20 73 6f 72  tries are in sor
f470: 74 65 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ted order..*/.st
f480: 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 53 65  atic void fts3Se
f490: 67 52 65 61 64 65 72 53 6f 72 74 28 0a 20 20 46  gReaderSort(.  F
f4a0: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a 61  ts3SegReader **a
f4b0: 70 53 65 67 6d 65 6e 74 2c 20 20 20 20 20 20 20  pSegment,       
f4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f4d0: 20 41 72 72 61 79 20 74 6f 20 73 6f 72 74 20 65   Array to sort e
f4e0: 6e 74 72 69 65 73 20 6f 66 20 2a 2f 0a 20 20 69  ntries of */.  i
f4f0: 6e 74 20 6e 53 65 67 6d 65 6e 74 2c 20 20 20 20  nt nSegment,    
f500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f520: 20 53 69 7a 65 20 6f 66 20 61 70 53 65 67 6d 65   Size of apSegme
f530: 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  nt array */.  in
f540: 74 20 6e 53 75 73 70 65 63 74 2c 20 20 20 20 20  t nSuspect,     
f550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f570: 55 6e 73 6f 72 74 65 64 20 65 6e 74 72 79 20 63  Unsorted entry c
f580: 6f 75 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  ount */.  int (*
f590: 78 43 6d 70 29 28 46 74 73 33 53 65 67 52 65 61  xCmp)(Fts3SegRea
f5a0: 64 65 72 20 2a 2c 20 46 74 73 33 53 65 67 52 65  der *, Fts3SegRe
f5b0: 61 64 65 72 20 2a 29 20 20 2f 2a 20 43 6f 6d 70  ader *)  /* Comp
f5c0: 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
f5d0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
f600: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
f610: 0a 20 20 61 73 73 65 72 74 28 20 6e 53 75 73 70  .  assert( nSusp
f620: 65 63 74 3c 3d 6e 53 65 67 6d 65 6e 74 20 29 3b  ect<=nSegment );
f630: 0a 0a 20 20 69 66 28 20 6e 53 75 73 70 65 63 74  ..  if( nSuspect
f640: 3d 3d 6e 53 65 67 6d 65 6e 74 20 29 20 6e 53 75  ==nSegment ) nSu
f650: 73 70 65 63 74 2d 2d 3b 0a 20 20 66 6f 72 28 69  spect--;.  for(i
f660: 3d 6e 53 75 73 70 65 63 74 2d 31 3b 20 69 3e 3d  =nSuspect-1; i>=
f670: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
f680: 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b   j;.    for(j=i;
f690: 20 6a 3c 28 6e 53 65 67 6d 65 6e 74 2d 31 29 3b   j<(nSegment-1);
f6a0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73   j++){.      Fts
f6b0: 33 53 65 67 52 65 61 64 65 72 20 2a 70 54 6d 70  3SegReader *pTmp
f6c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 78 43 6d 70  ;.      if( xCmp
f6d0: 28 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2c 20 61  (apSegment[j], a
f6e0: 70 53 65 67 6d 65 6e 74 5b 6a 2b 31 5d 29 3c 30  pSegment[j+1])<0
f6f0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
f700: 70 54 6d 70 20 3d 20 61 70 53 65 67 6d 65 6e 74  pTmp = apSegment
f710: 5b 6a 2b 31 5d 3b 0a 20 20 20 20 20 20 61 70 53  [j+1];.      apS
f720: 65 67 6d 65 6e 74 5b 6a 2b 31 5d 20 3d 20 61 70  egment[j+1] = ap
f730: 53 65 67 6d 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20  Segment[j];.    
f740: 20 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 20 3d    apSegment[j] =
f750: 20 70 54 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 7d   pTmp;.    }.  }
f760: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
f770: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
f780: 20 74 68 65 20 6c 69 73 74 20 72 65 61 6c 6c 79   the list really
f790: 20 69 73 20 73 6f 72 74 65 64 20 6e 6f 77 2e 20   is sorted now. 
f7a0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
f7b0: 28 6e 53 75 73 70 65 63 74 2d 31 29 3b 20 69 2b  (nSuspect-1); i+
f7c0: 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
f7d0: 78 43 6d 70 28 61 70 53 65 67 6d 65 6e 74 5b 69  xCmp(apSegment[i
f7e0: 5d 2c 20 61 70 53 65 67 6d 65 6e 74 5b 69 2b 31  ], apSegment[i+1
f7f0: 5d 29 3c 30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ])<0 );.  }.#end
f800: 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 49 6e 73  if.}../* .** Ins
f810: 65 72 74 20 61 20 72 65 63 6f 72 64 20 69 6e 74  ert a record int
f820: 6f 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73  o the %_segments
f830: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
f840: 63 20 69 6e 74 20 66 74 73 33 57 72 69 74 65 53  c int fts3WriteS
f850: 65 67 6d 65 6e 74 28 0a 20 20 46 74 73 33 54 61  egment(.  Fts3Ta
f860: 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
f870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
f880: 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
f890: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
f8a0: 6e 74 36 34 20 69 42 6c 6f 63 6b 2c 20 20 20 20  nt64 iBlock,    
f8b0: 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20         /* Block 
f8c0: 69 64 20 66 6f 72 20 6e 65 77 20 62 6c 6f 63 6b  id for new block
f8d0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 2c 20 20   */.  char *z,  
f8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8f0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
f900: 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
f910: 69 6e 69 6e 67 20 62 6c 6f 63 6b 20 64 61 74 61  ining block data
f920: 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20 20 20   */.  int n     
f930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f940: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
f950: 20 62 75 66 66 65 72 20 7a 20 69 6e 20 62 79 74   buffer z in byt
f960: 65 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  es */.){.  sqlit
f970: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
f980: 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73 33 53    int rc = fts3S
f990: 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 49 4e  qlStmt(p, SQL_IN
f9a0: 53 45 52 54 5f 53 45 47 4d 45 4e 54 53 2c 20 26  SERT_SEGMENTS, &
f9b0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
f9c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f9d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  {.    sqlite3_bi
f9e0: 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  nd_int64(pStmt, 
f9f0: 31 2c 20 69 42 6c 6f 63 6b 29 3b 0a 20 20 20 20  1, iBlock);.    
fa00: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
fa10: 62 28 70 53 74 6d 74 2c 20 32 2c 20 7a 2c 20 6e  b(pStmt, 2, z, n
fa20: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
fa30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
fa40: 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 72  ep(pStmt);.    r
fa50: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
fa60: 74 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20  t(pStmt);.  }.  
fa70: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
fa80: 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 6c 61 72  .** Find the lar
fa90: 67 65 73 74 20 72 65 6c 61 74 69 76 65 20 6c 65  gest relative le
faa0: 76 65 6c 20 6e 75 6d 62 65 72 20 69 6e 20 74 68  vel number in th
fab0: 65 20 74 61 62 6c 65 2e 20 49 66 20 73 75 63 63  e table. If succ
fac0: 65 73 73 66 75 6c 2c 20 73 65 74 0a 2a 2a 20 2a  essful, set.** *
fad0: 70 6e 4d 61 78 20 74 6f 20 74 68 69 73 20 76 61  pnMax to this va
fae0: 6c 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53  lue and return S
faf0: 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77  QLITE_OK. Otherw
fb00: 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  ise, if an error
fb10: 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 65 74 20   occurs,.** set 
fb20: 2a 70 6e 4d 61 78 20 74 6f 20 7a 65 72 6f 20 61  *pnMax to zero a
fb30: 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  nd return an SQL
fb40: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
fb50: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
fb60: 73 33 4d 61 78 4c 65 76 65 6c 28 46 74 73 33 54  s3MaxLevel(Fts3T
fb70: 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  able *p, int *pn
fb80: 4d 61 78 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Max){.  int rc;.
fb90: 20 20 69 6e 74 20 6d 78 4c 65 76 65 6c 20 3d 20    int mxLevel = 
fba0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
fbb0: 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 0a 20  t *pStmt = 0;.. 
fbc0: 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
fbd0: 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f  t(p, SQL_SELECT_
fbe0: 4d 58 4c 45 56 45 4c 2c 20 26 70 53 74 6d 74 2c  MXLEVEL, &pStmt,
fbf0: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
fc00: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fc10: 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
fc20: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
fc30: 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 6d 78 4c  mt) ){.      mxL
fc40: 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  evel = sqlite3_c
fc50: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
fc60: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   0);.    }.    r
fc70: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
fc80: 74 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20  t(pStmt);.  }.  
fc90: 2a 70 6e 4d 61 78 20 3d 20 6d 78 4c 65 76 65 6c  *pnMax = mxLevel
fca0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
fcb0: 0a 0a 2f 2a 20 0a 2a 2a 20 49 6e 73 65 72 74 20  ../* .** Insert 
fcc0: 61 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  a record into th
fcd0: 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65  e %_segdir table
fce0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
fcf0: 66 74 73 33 57 72 69 74 65 53 65 67 64 69 72 28  fts3WriteSegdir(
fd00: 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
fd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd20: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
fd30: 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
fd40: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c  sqlite3_int64 iL
fd50: 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  evel,           
fd60: 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 6c 65  /* Value for "le
fd70: 76 65 6c 22 20 66 69 65 6c 64 20 28 61 62 73 6f  vel" field (abso
fd80: 6c 75 74 65 20 6c 65 76 65 6c 29 20 2a 2f 0a 20  lute level) */. 
fd90: 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20   int iIdx,      
fda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdb0: 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 69   /* Value for "i
fdc0: 64 78 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 73  dx" field */.  s
fdd0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 53 74  qlite3_int64 iSt
fde0: 61 72 74 42 6c 6f 63 6b 2c 20 20 20 20 20 20 2f  artBlock,      /
fdf0: 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 73 74 61  * Value for "sta
fe00: 72 74 5f 62 6c 6f 63 6b 22 20 66 69 65 6c 64 20  rt_block" field 
fe10: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
fe20: 36 34 20 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b  64 iLeafEndBlock
fe30: 2c 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f  ,    /* Value fo
fe40: 72 20 22 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c  r "leaves_end_bl
fe50: 6f 63 6b 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20  ock" field */.  
fe60: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45  sqlite3_int64 iE
fe70: 6e 64 42 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ndBlock,        
fe80: 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 65 6e  /* Value for "en
fe90: 64 5f 62 6c 6f 63 6b 22 20 66 69 65 6c 64 20 2a  d_block" field *
fea0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
feb0: 34 20 6e 4c 65 61 66 44 61 74 61 2c 20 20 20 20  4 nLeafData,    
fec0: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
fed0: 6c 65 61 66 20 64 61 74 61 20 69 6e 20 73 65 67  leaf data in seg
fee0: 6d 65 6e 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ment */.  char *
fef0: 7a 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20  zRoot,          
ff00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f            /* Blo
ff10: 62 20 76 61 6c 75 65 20 66 6f 72 20 22 72 6f 6f  b value for "roo
ff20: 74 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e  t" field */.  in
ff30: 74 20 6e 52 6f 6f 74 20 20 20 20 20 20 20 20 20  t nRoot         
ff40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ff50: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
ff60: 20 69 6e 20 62 75 66 66 65 72 20 7a 52 6f 6f 74   in buffer zRoot
ff70: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
ff80: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
ff90: 69 6e 74 20 72 63 20 3d 20 66 74 73 33 53 71 6c  int rc = fts3Sql
ffa0: 53 74 6d 74 28 70 2c 20 53 51 4c 5f 49 4e 53 45  Stmt(p, SQL_INSE
ffb0: 52 54 5f 53 45 47 44 49 52 2c 20 26 70 53 74 6d  RT_SEGDIR, &pStm
ffc0: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  t, 0);.  if( rc=
ffd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ffe0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
fff0: 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 69  nt64(pStmt, 1, i
10000 4c 65 76 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69  Level);.    sqli
10010 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74  te3_bind_int(pSt
10020 6d 74 2c 20 32 2c 20 69 49 64 78 29 3b 0a 20 20  mt, 2, iIdx);.  
10030 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
10040 6e 74 36 34 28 70 53 74 6d 74 2c 20 33 2c 20 69  nt64(pStmt, 3, i
10050 53 74 61 72 74 42 6c 6f 63 6b 29 3b 0a 20 20 20  StartBlock);.   
10060 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
10070 74 36 34 28 70 53 74 6d 74 2c 20 34 2c 20 69 4c  t64(pStmt, 4, iL
10080 65 61 66 45 6e 64 42 6c 6f 63 6b 29 3b 0a 20 20  eafEndBlock);.  
10090 20 20 69 66 28 20 6e 4c 65 61 66 44 61 74 61 3d    if( nLeafData=
100a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
100b0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
100c0 53 74 6d 74 2c 20 35 2c 20 69 45 6e 64 42 6c 6f  Stmt, 5, iEndBlo
100d0 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ck);.    }else{.
100e0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 6e 64        char *zEnd
100f0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
10100 74 66 28 22 25 6c 6c 64 20 25 6c 6c 64 22 2c 20  tf("%lld %lld", 
10110 69 45 6e 64 42 6c 6f 63 6b 2c 20 6e 4c 65 61 66  iEndBlock, nLeaf
10120 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28  Data);.      if(
10130 20 21 7a 45 6e 64 20 29 20 72 65 74 75 72 6e 20   !zEnd ) return 
10140 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
10150 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
10160 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 35 2c 20  _text(pStmt, 5, 
10170 7a 45 6e 64 2c 20 2d 31 2c 20 73 71 6c 69 74 65  zEnd, -1, sqlite
10180 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20  3_free);.    }. 
10190 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
101a0 62 6c 6f 62 28 70 53 74 6d 74 2c 20 36 2c 20 7a  blob(pStmt, 6, z
101b0 52 6f 6f 74 2c 20 6e 52 6f 6f 74 2c 20 53 51 4c  Root, nRoot, SQL
101c0 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
101d0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
101e0 74 6d 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  tmt);.    rc = s
101f0 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
10200 6d 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  mt);.  }.  retur
10210 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
10220 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
10230 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65  f the common pre
10240 66 69 78 20 28 69 66 20 61 6e 79 29 20 73 68 61  fix (if any) sha
10250 72 65 64 20 62 79 20 7a 50 72 65 76 20 61 6e 64  red by zPrev and
10260 0a 2a 2a 20 7a 4e 65 78 74 2c 20 69 6e 20 62 79  .** zNext, in by
10270 74 65 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  tes. For example
10280 2c 20 0a 2a 2a 0a 2a 2a 20 20 20 66 74 73 33 50  , .**.**   fts3P
10290 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 22 61  refixCompress("a
102a0 62 63 22 2c 20 33 2c 20 22 61 62 63 64 65 66 22  bc", 3, "abcdef"
102b0 2c 20 36 29 20 20 20 2f 2f 20 72 65 74 75 72 6e  , 6)   // return
102c0 73 20 33 0a 2a 2a 20 20 20 66 74 73 33 50 72 65  s 3.**   fts3Pre
102d0 66 69 78 43 6f 6d 70 72 65 73 73 28 22 61 62 58  fixCompress("abX
102e0 22 2c 20 33 2c 20 22 61 62 63 64 65 66 22 2c 20  ", 3, "abcdef", 
102f0 36 29 20 20 20 2f 2f 20 72 65 74 75 72 6e 73 20  6)   // returns 
10300 32 0a 2a 2a 20 20 20 66 74 73 33 50 72 65 66 69  2.**   fts3Prefi
10310 78 43 6f 6d 70 72 65 73 73 28 22 61 62 58 22 2c  xCompress("abX",
10320 20 33 2c 20 22 58 62 63 64 65 66 22 2c 20 36 29   3, "Xbcdef", 6)
10330 20 20 20 2f 2f 20 72 65 74 75 72 6e 73 20 30 0a     // returns 0.
10340 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
10350 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73  s3PrefixCompress
10360 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
10370 7a 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20  zPrev,          
10380 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
10390 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f 75  ntaining previou
103a0 73 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  s term */.  int 
103b0 6e 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20  nPrev,          
103c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
103d0 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 7a 50  ize of buffer zP
103e0 72 65 76 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  rev in bytes */.
103f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
10400 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ext,            
10410 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
10420 61 69 6e 69 6e 67 20 6e 65 78 74 20 74 65 72 6d  aining next term
10430 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 78 74 20   */.  int nNext 
10440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10450 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
10460 20 62 75 66 66 65 72 20 7a 4e 65 78 74 20 69 6e   buffer zNext in
10470 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69   bytes */.){.  i
10480 6e 74 20 6e 3b 0a 20 20 55 4e 55 53 45 44 5f 50  nt n;.  UNUSED_P
10490 41 52 41 4d 45 54 45 52 28 6e 4e 65 78 74 29 3b  ARAMETER(nNext);
104a0 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 50  .  for(n=0; n<nP
104b0 72 65 76 20 26 26 20 7a 50 72 65 76 5b 6e 5d 3d  rev && zPrev[n]=
104c0 3d 7a 4e 65 78 74 5b 6e 5d 3b 20 6e 2b 2b 29 3b  =zNext[n]; n++);
104d0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
104e0 2f 2a 0a 2a 2a 20 41 64 64 20 74 65 72 6d 20 7a  /*.** Add term z
104f0 54 65 72 6d 20 74 6f 20 74 68 65 20 53 65 67 6d  Term to the Segm
10500 65 6e 74 4e 6f 64 65 2e 20 49 74 20 69 73 20 67  entNode. It is g
10510 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 7a  uaranteed that z
10520 54 65 72 6d 20 69 73 20 6c 61 72 67 65 72 0a 2a  Term is larger.*
10530 2a 20 28 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  * (according to 
10540 6d 65 6d 63 6d 70 29 20 74 68 61 6e 20 74 68 65  memcmp) than the
10550 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 2e 0a   previous term..
10560 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
10570 73 33 4e 6f 64 65 41 64 64 54 65 72 6d 28 0a 20  s3NodeAddTerm(. 
10580 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
10590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105a0 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
105b0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 65  e handle */.  Se
105c0 67 6d 65 6e 74 4e 6f 64 65 20 2a 2a 70 70 54 72  gmentNode **ppTr
105d0 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ee,           /*
105e0 20 49 4e 2f 4f 55 54 3a 20 53 65 67 6d 65 6e 74   IN/OUT: Segment
105f0 4e 6f 64 65 20 68 61 6e 64 6c 65 20 2a 2f 20 0a  Node handle */ .
10600 20 20 69 6e 74 20 69 73 43 6f 70 79 54 65 72 6d    int isCopyTerm
10610 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10620 20 20 2f 2a 20 54 72 75 65 20 69 66 20 7a 54 65    /* True if zTe
10630 72 6d 2f 6e 54 65 72 6d 20 69 73 20 74 72 61 6e  rm/nTerm is tran
10640 73 69 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  sient */.  const
10650 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20   char *zTerm,   
10660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
10670 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
10680 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d 20  containing term 
10690 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 20 20  */.  int nTerm  
106a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106b0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
106c0 74 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f  term in bytes */
106d0 0a 29 7b 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64  .){.  SegmentNod
106e0 65 20 2a 70 54 72 65 65 20 3d 20 2a 70 70 54 72  e *pTree = *ppTr
106f0 65 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ee;.  int rc;.  
10700 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 4e 65  SegmentNode *pNe
10710 77 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 74  w;..  /* First t
10720 72 79 20 74 6f 20 61 70 70 65 6e 64 20 74 68 65  ry to append the
10730 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63 75 72   term to the cur
10740 72 65 6e 74 20 6e 6f 64 65 2e 20 52 65 74 75 72  rent node. Retur
10750 6e 20 65 61 72 6c 79 20 69 66 20 0a 20 20 2a 2a  n early if .  **
10760 20 74 68 69 73 20 69 73 20 70 6f 73 73 69 62 6c   this is possibl
10770 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  e..  */.  if( pT
10780 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ree ){.    int n
10790 44 61 74 61 20 3d 20 70 54 72 65 65 2d 3e 6e 44  Data = pTree->nD
107a0 61 74 61 3b 20 20 20 20 20 2f 2a 20 43 75 72 72  ata;     /* Curr
107b0 65 6e 74 20 73 69 7a 65 20 6f 66 20 6e 6f 64 65  ent size of node
107c0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
107d0 20 69 6e 74 20 6e 52 65 71 20 3d 20 6e 44 61 74   int nReq = nDat
107e0 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a;             /
107f0 2a 20 52 65 71 75 69 72 65 64 20 73 70 61 63 65  * Required space
10800 20 61 66 74 65 72 20 61 64 64 69 6e 67 20 7a 54   after adding zT
10810 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  erm */.    int n
10820 50 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20  Prefix;         
10830 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10840 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70  er of bytes of p
10850 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f  refix compressio
10860 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 75  n */.    int nSu
10870 66 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20  ffix;           
10880 20 20 20 20 20 20 20 2f 2a 20 53 75 66 66 69 78         /* Suffix
10890 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a 20 20 20 20   length */..    
108a0 6e 50 72 65 66 69 78 20 3d 20 66 74 73 33 50 72  nPrefix = fts3Pr
108b0 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70 54 72  efixCompress(pTr
108c0 65 65 2d 3e 7a 54 65 72 6d 2c 20 70 54 72 65 65  ee->zTerm, pTree
108d0 2d 3e 6e 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20  ->nTerm, zTerm, 
108e0 6e 54 65 72 6d 29 3b 0a 20 20 20 20 6e 53 75 66  nTerm);.    nSuf
108f0 66 69 78 20 3d 20 6e 54 65 72 6d 2d 6e 50 72 65  fix = nTerm-nPre
10900 66 69 78 3b 0a 0a 20 20 20 20 6e 52 65 71 20 2b  fix;..    nReq +
10910 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72  = sqlite3Fts3Var
10920 69 6e 74 4c 65 6e 28 6e 50 72 65 66 69 78 29 2b  intLen(nPrefix)+
10930 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e  sqlite3Fts3Varin
10940 74 4c 65 6e 28 6e 53 75 66 66 69 78 29 2b 6e 53  tLen(nSuffix)+nS
10950 75 66 66 69 78 3b 0a 20 20 20 20 69 66 28 20 6e  uffix;.    if( n
10960 52 65 71 3c 3d 70 2d 3e 6e 4e 6f 64 65 53 69 7a  Req<=p->nNodeSiz
10970 65 20 7c 7c 20 21 70 54 72 65 65 2d 3e 7a 54 65  e || !pTree->zTe
10980 72 6d 20 29 7b 0a 0a 20 20 20 20 20 20 69 66 28  rm ){..      if(
10990 20 6e 52 65 71 3e 70 2d 3e 6e 4e 6f 64 65 53 69   nReq>p->nNodeSi
109a0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ze ){.        /*
109b0 20 41 6e 20 75 6e 75 73 75 61 6c 20 63 61 73 65   An unusual case
109c0 3a 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  : this is the fi
109d0 72 73 74 20 74 65 72 6d 20 74 6f 20 62 65 20 61  rst term to be a
109e0 64 64 65 64 20 74 6f 20 74 68 65 20 6e 6f 64 65  dded to the node
109f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  .        ** and 
10a00 74 68 65 20 73 74 61 74 69 63 20 6e 6f 64 65 20  the static node 
10a10 62 75 66 66 65 72 20 28 70 2d 3e 6e 4e 6f 64 65  buffer (p->nNode
10a20 53 69 7a 65 20 62 79 74 65 73 29 20 69 73 20 6e  Size bytes) is n
10a30 6f 74 20 6c 61 72 67 65 0a 20 20 20 20 20 20 20  ot large.       
10a40 20 2a 2a 20 65 6e 6f 75 67 68 2e 20 55 73 65 20   ** enough. Use 
10a50 61 20 73 65 70 61 72 61 74 65 6c 79 20 6d 61 6c  a separately mal
10a60 6c 6f 63 65 64 20 62 75 66 66 65 72 20 69 6e 73  loced buffer ins
10a70 74 65 61 64 20 54 68 69 73 20 77 61 73 74 65 73  tead This wastes
10a80 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 2d 3e 6e  .        ** p->n
10a90 4e 6f 64 65 53 69 7a 65 20 62 79 74 65 73 2c 20  NodeSize bytes, 
10aa0 62 75 74 20 73 69 6e 63 65 20 74 68 69 73 20 73  but since this s
10ab0 63 65 6e 61 72 69 6f 20 6f 6e 6c 79 20 63 6f 6d  cenario only com
10ac0 65 73 20 61 62 6f 75 74 20 77 68 65 6e 0a 20 20  es about when.  
10ad0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
10ae0 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 20 74 77  abase contain tw
10af0 6f 20 74 65 72 6d 73 20 74 68 61 74 20 73 68 61  o terms that sha
10b00 72 65 20 61 20 70 72 65 66 69 78 20 6f 66 20 61  re a prefix of a
10b10 6c 6d 6f 73 74 20 32 4b 42 2c 20 0a 20 20 20 20  lmost 2KB, .    
10b20 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 6e      ** this is n
10b30 6f 74 20 65 78 70 65 63 74 65 64 20 74 6f 20 62  ot expected to b
10b40 65 20 61 20 73 65 72 69 6f 75 73 20 70 72 6f 62  e a serious prob
10b50 6c 65 6d 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f  lem. .        */
10b60 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
10b70 20 70 54 72 65 65 2d 3e 61 44 61 74 61 3d 3d 28   pTree->aData==(
10b80 63 68 61 72 20 2a 29 26 70 54 72 65 65 5b 31 5d  char *)&pTree[1]
10b90 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 72 65   );.        pTre
10ba0 65 2d 3e 61 44 61 74 61 20 3d 20 28 63 68 61 72  e->aData = (char
10bb0 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
10bc0 63 28 6e 52 65 71 29 3b 0a 20 20 20 20 20 20 20  c(nReq);.       
10bd0 20 69 66 28 20 21 70 54 72 65 65 2d 3e 61 44 61   if( !pTree->aDa
10be0 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ta ){.          
10bf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
10c00 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  MEM;.        }. 
10c10 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
10c20 28 20 70 54 72 65 65 2d 3e 7a 54 65 72 6d 20 29  ( pTree->zTerm )
10c30 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
10c40 72 65 20 69 73 20 6e 6f 20 70 72 65 66 69 78 2d  re is no prefix-
10c50 6c 65 6e 67 74 68 20 66 69 65 6c 64 20 66 6f 72  length field for
10c60 20 66 69 72 73 74 20 74 65 72 6d 20 69 6e 20 61   first term in a
10c70 20 6e 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20   node */.       
10c80 20 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69 74 65   nData += sqlite
10c90 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26  3Fts3PutVarint(&
10ca0 70 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e 44 61  pTree->aData[nDa
10cb0 74 61 5d 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20  ta], nPrefix);. 
10cc0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6e 44       }..      nD
10cd0 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ata += sqlite3Ft
10ce0 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 54 72  s3PutVarint(&pTr
10cf0 65 65 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d  ee->aData[nData]
10d00 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 20 20  , nSuffix);.    
10d10 20 20 6d 65 6d 63 70 79 28 26 70 54 72 65 65 2d    memcpy(&pTree-
10d20 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 26  >aData[nData], &
10d30 7a 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 2c 20  zTerm[nPrefix], 
10d40 6e 53 75 66 66 69 78 29 3b 0a 20 20 20 20 20 20  nSuffix);.      
10d50 70 54 72 65 65 2d 3e 6e 44 61 74 61 20 3d 20 6e  pTree->nData = n
10d60 44 61 74 61 20 2b 20 6e 53 75 66 66 69 78 3b 0a  Data + nSuffix;.
10d70 20 20 20 20 20 20 70 54 72 65 65 2d 3e 6e 45 6e        pTree->nEn
10d80 74 72 79 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66  try++;..      if
10d90 28 20 69 73 43 6f 70 79 54 65 72 6d 20 29 7b 0a  ( isCopyTerm ){.
10da0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 72 65          if( pTre
10db0 65 2d 3e 6e 4d 61 6c 6c 6f 63 3c 6e 54 65 72 6d  e->nMalloc<nTerm
10dc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68   ){.          ch
10dd0 61 72 20 2a 7a 4e 65 77 20 3d 20 73 71 6c 69 74  ar *zNew = sqlit
10de0 65 33 5f 72 65 61 6c 6c 6f 63 28 70 54 72 65 65  e3_realloc(pTree
10df0 2d 3e 7a 4d 61 6c 6c 6f 63 2c 20 6e 54 65 72 6d  ->zMalloc, nTerm
10e00 2a 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  *2);.          i
10e10 66 28 20 21 7a 4e 65 77 20 29 7b 0a 20 20 20 20  f( !zNew ){.    
10e20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
10e30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
10e40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10e50 20 20 20 70 54 72 65 65 2d 3e 6e 4d 61 6c 6c 6f     pTree->nMallo
10e60 63 20 3d 20 6e 54 65 72 6d 2a 32 3b 0a 20 20 20  c = nTerm*2;.   
10e70 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e 7a 4d         pTree->zM
10e80 61 6c 6c 6f 63 20 3d 20 7a 4e 65 77 3b 0a 20 20  alloc = zNew;.  
10e90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10ea0 70 54 72 65 65 2d 3e 7a 54 65 72 6d 20 3d 20 70  pTree->zTerm = p
10eb0 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20  Tree->zMalloc;. 
10ec0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54         memcpy(pT
10ed0 72 65 65 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65 72  ree->zTerm, zTer
10ee0 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20  m, nTerm);.     
10ef0 20 20 20 70 54 72 65 65 2d 3e 6e 54 65 72 6d 20     pTree->nTerm 
10f00 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = nTerm;.      }
10f10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54  else{.        pT
10f20 72 65 65 2d 3e 7a 54 65 72 6d 20 3d 20 28 63 68  ree->zTerm = (ch
10f30 61 72 20 2a 29 7a 54 65 72 6d 3b 0a 20 20 20 20  ar *)zTerm;.    
10f40 20 20 20 20 70 54 72 65 65 2d 3e 6e 54 65 72 6d      pTree->nTerm
10f50 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20   = nTerm;.      
10f60 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
10f70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
10f80 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e    }..  /* If con
10f90 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 68 65  trol flows to he
10fa0 72 65 2c 20 69 74 20 77 61 73 20 6e 6f 74 20 70  re, it was not p
10fb0 6f 73 73 69 62 6c 65 20 74 6f 20 61 70 70 65 6e  ossible to appen
10fc0 64 20 7a 54 65 72 6d 20 74 6f 20 74 68 65 0a 20  d zTerm to the. 
10fd0 20 2a 2a 20 63 75 72 72 65 6e 74 20 6e 6f 64 65   ** current node
10fe0 2e 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6e  . Create a new n
10ff0 6f 64 65 20 28 61 20 72 69 67 68 74 2d 73 69 62  ode (a right-sib
11000 6c 69 6e 67 20 6f 66 20 74 68 65 20 63 75 72 72  ling of the curr
11010 65 6e 74 20 6e 6f 64 65 29 2e 0a 20 20 2a 2a 20  ent node)..  ** 
11020 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
11030 69 72 73 74 20 6e 6f 64 65 20 69 6e 20 74 68 65  irst node in the
11040 20 74 72 65 65 2c 20 74 68 65 20 74 65 72 6d 20   tree, the term 
11050 69 73 20 61 64 64 65 64 20 74 6f 20 69 74 2e 0a  is added to it..
11060 20 20 2a 2a 0a 20 20 2a 2a 20 4f 74 68 65 72 77    **.  ** Otherw
11070 69 73 65 2c 20 74 68 65 20 74 65 72 6d 20 69 73  ise, the term is
11080 20 6e 6f 74 20 61 64 64 65 64 20 74 6f 20 74 68   not added to th
11090 65 20 6e 65 77 20 6e 6f 64 65 2c 20 69 74 20 69  e new node, it i
110a0 73 20 6c 65 66 74 20 65 6d 70 74 79 20 66 6f 72  s left empty for
110b0 0a 20 20 2a 2a 20 6e 6f 77 2e 20 49 6e 73 74 65  .  ** now. Inste
110c0 61 64 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20  ad, the term is 
110d0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
110e0 65 20 70 61 72 65 6e 74 20 6f 66 20 70 54 72 65  e parent of pTre
110f0 65 2e 20 49 66 20 70 54 72 65 65 20 0a 20 20 2a  e. If pTree .  *
11100 2a 20 68 61 73 20 6e 6f 20 70 61 72 65 6e 74 2c  * has no parent,
11110 20 6f 6e 65 20 69 73 20 63 72 65 61 74 65 64 20   one is created 
11120 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 4e 65  here..  */.  pNe
11130 77 20 3d 20 28 53 65 67 6d 65 6e 74 4e 6f 64 65  w = (SegmentNode
11140 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
11150 63 28 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e 74  c(sizeof(Segment
11160 4e 6f 64 65 29 20 2b 20 70 2d 3e 6e 4e 6f 64 65  Node) + p->nNode
11170 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 21 70 4e  Size);.  if( !pN
11180 65 77 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ew ){.    return
11190 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
111a0 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77   }.  memset(pNew
111b0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 65 67 6d  , 0, sizeof(Segm
111c0 65 6e 74 4e 6f 64 65 29 29 3b 0a 20 20 70 4e 65  entNode));.  pNe
111d0 77 2d 3e 6e 44 61 74 61 20 3d 20 31 20 2b 20 46  w->nData = 1 + F
111e0 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 3b 0a  TS3_VARINT_MAX;.
111f0 20 20 70 4e 65 77 2d 3e 61 44 61 74 61 20 3d 20    pNew->aData = 
11200 28 63 68 61 72 20 2a 29 26 70 4e 65 77 5b 31 5d  (char *)&pNew[1]
11210 3b 0a 0a 20 20 69 66 28 20 70 54 72 65 65 20 29  ;..  if( pTree )
11220 7b 0a 20 20 20 20 53 65 67 6d 65 6e 74 4e 6f 64  {.    SegmentNod
11230 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 54 72  e *pParent = pTr
11240 65 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20  ee->pParent;.   
11250 20 72 63 20 3d 20 66 74 73 33 4e 6f 64 65 41 64   rc = fts3NodeAd
11260 64 54 65 72 6d 28 70 2c 20 26 70 50 61 72 65 6e  dTerm(p, &pParen
11270 74 2c 20 69 73 43 6f 70 79 54 65 72 6d 2c 20 7a  t, isCopyTerm, z
11280 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20  Term, nTerm);.  
11290 20 20 69 66 28 20 70 54 72 65 65 2d 3e 70 50 61    if( pTree->pPa
112a0 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rent==0 ){.     
112b0 20 70 54 72 65 65 2d 3e 70 50 61 72 65 6e 74 20   pTree->pParent 
112c0 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 7d  = pParent;.    }
112d0 0a 20 20 20 20 70 54 72 65 65 2d 3e 70 52 69 67  .    pTree->pRig
112e0 68 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70  ht = pNew;.    p
112f0 4e 65 77 2d 3e 70 4c 65 66 74 6d 6f 73 74 20 3d  New->pLeftmost =
11300 20 70 54 72 65 65 2d 3e 70 4c 65 66 74 6d 6f 73   pTree->pLeftmos
11310 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 50 61  t;.    pNew->pPa
11320 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a  rent = pParent;.
11330 20 20 20 20 70 4e 65 77 2d 3e 7a 4d 61 6c 6c 6f      pNew->zMallo
11340 63 20 3d 20 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c  c = pTree->zMall
11350 6f 63 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4d  oc;.    pNew->nM
11360 61 6c 6c 6f 63 20 3d 20 70 54 72 65 65 2d 3e 6e  alloc = pTree->n
11370 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20 70 54 72 65  Malloc;.    pTre
11380 65 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  e->zMalloc = 0;.
11390 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
113a0 77 2d 3e 70 4c 65 66 74 6d 6f 73 74 20 3d 20 70  w->pLeftmost = p
113b0 4e 65 77 3b 0a 20 20 20 20 72 63 20 3d 20 66 74  New;.    rc = ft
113c0 73 33 4e 6f 64 65 41 64 64 54 65 72 6d 28 70 2c  s3NodeAddTerm(p,
113d0 20 26 70 4e 65 77 2c 20 69 73 43 6f 70 79 54 65   &pNew, isCopyTe
113e0 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  rm, zTerm, nTerm
113f0 29 3b 20 0a 20 20 7d 0a 0a 20 20 2a 70 70 54 72  ); .  }..  *ppTr
11400 65 65 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74  ee = pNew;.  ret
11410 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11420 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
11430 20 66 6f 72 20 66 74 73 33 4e 6f 64 65 57 72 69   for fts3NodeWri
11440 74 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  te()..*/.static 
11450 69 6e 74 20 66 74 73 33 54 72 65 65 46 69 6e 69  int fts3TreeFini
11460 73 68 4e 6f 64 65 28 0a 20 20 53 65 67 6d 65 6e  shNode(.  Segmen
11470 74 4e 6f 64 65 20 2a 70 54 72 65 65 2c 20 0a 20  tNode *pTree, . 
11480 20 69 6e 74 20 69 48 65 69 67 68 74 2c 20 0a 20   int iHeight, . 
11490 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
114a0 4c 65 66 74 43 68 69 6c 64 0a 29 7b 0a 20 20 69  LeftChild.){.  i
114b0 6e 74 20 6e 53 74 61 72 74 3b 0a 20 20 61 73 73  nt nStart;.  ass
114c0 65 72 74 28 20 69 48 65 69 67 68 74 3e 3d 31 20  ert( iHeight>=1 
114d0 26 26 20 69 48 65 69 67 68 74 3c 31 32 38 20 29  && iHeight<128 )
114e0 3b 0a 20 20 6e 53 74 61 72 74 20 3d 20 46 54 53  ;.  nStart = FTS
114f0 33 5f 56 41 52 49 4e 54 5f 4d 41 58 20 2d 20 73  3_VARINT_MAX - s
11500 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e 74  qlite3Fts3Varint
11510 4c 65 6e 28 69 4c 65 66 74 43 68 69 6c 64 29 3b  Len(iLeftChild);
11520 0a 20 20 70 54 72 65 65 2d 3e 61 44 61 74 61 5b  .  pTree->aData[
11530 6e 53 74 61 72 74 5d 20 3d 20 28 63 68 61 72 29  nStart] = (char)
11540 69 48 65 69 67 68 74 3b 0a 20 20 73 71 6c 69 74  iHeight;.  sqlit
11550 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28  e3Fts3PutVarint(
11560 26 70 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e 53  &pTree->aData[nS
11570 74 61 72 74 2b 31 5d 2c 20 69 4c 65 66 74 43 68  tart+1], iLeftCh
11580 69 6c 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  ild);.  return n
11590 53 74 61 72 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Start;.}../*.** 
115a0 57 72 69 74 65 20 74 68 65 20 62 75 66 66 65 72  Write the buffer
115b0 20 66 6f 72 20 74 68 65 20 73 65 67 6d 65 6e 74   for the segment
115c0 20 6e 6f 64 65 20 70 54 72 65 65 20 61 6e 64 20   node pTree and 
115d0 61 6c 6c 20 6f 66 20 69 74 73 20 70 65 65 72 73  all of its peers
115e0 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
115f0 61 73 65 2e 20 54 68 65 6e 20 63 61 6c 6c 20 74  ase. Then call t
11600 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 63  his function rec
11610 75 72 73 69 76 65 6c 79 20 74 6f 20 77 72 69 74  ursively to writ
11620 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  e the parent of 
11630 0a 2a 2a 20 70 54 72 65 65 20 61 6e 64 20 69 74  .** pTree and it
11640 73 20 70 65 65 72 73 20 74 6f 20 74 68 65 20 64  s peers to the d
11650 61 74 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20  atabase. .**.** 
11660 45 78 63 65 70 74 2c 20 69 66 20 70 54 72 65 65  Except, if pTree
11670 20 69 73 20 61 20 72 6f 6f 74 20 6e 6f 64 65 2c   is a root node,
11680 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74   do not write it
11690 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
116a0 2e 20 49 6e 73 74 65 61 64 2c 0a 2a 2a 20 73 65  . Instead,.** se
116b0 74 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  t output variabl
116c0 65 73 20 2a 70 61 52 6f 6f 74 20 61 6e 64 20 2a  es *paRoot and *
116d0 70 6e 52 6f 6f 74 20 74 6f 20 63 6f 6e 74 61 69  pnRoot to contai
116e0 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e  n the root node.
116f0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
11700 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
11710 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
11720 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20  output variable 
11730 2a 70 69 4c 61 73 74 20 69 73 0a 2a 2a 20 73 65  *piLast is.** se
11740 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73 74  t to the largest
11750 20 62 6c 6f 63 6b 69 64 20 77 72 69 74 74 65 6e   blockid written
11760 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
11770 20 28 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 0a   (or zero if no.
11780 2a 2a 20 62 6c 6f 63 6b 73 20 77 65 72 65 20 77  ** blocks were w
11790 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 62  ritten to the db
117a0 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  ). Otherwise, an
117b0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
117c0 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  de is .** return
117d0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
117e0 74 20 66 74 73 33 4e 6f 64 65 57 72 69 74 65 28  t fts3NodeWrite(
117f0 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
11800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11810 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
11820 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
11830 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72  SegmentNode *pTr
11840 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ee,             
11850 2f 2a 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 68  /* SegmentNode h
11860 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  andle */.  int i
11870 48 65 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  Height,         
11880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 65             /* He
11890 69 67 68 74 20 6f 66 20 74 68 69 73 20 6e 6f 64  ight of this nod
118a0 65 20 69 6e 20 74 72 65 65 20 2a 2f 0a 20 20 73  e in tree */.  s
118b0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 65  qlite3_int64 iLe
118c0 61 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  af,            /
118d0 2a 20 42 6c 6f 63 6b 20 69 64 20 6f 66 20 66 69  * Block id of fi
118e0 72 73 74 20 6c 65 61 66 20 6e 6f 64 65 20 2a 2f  rst leaf node */
118f0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
11900 20 69 46 72 65 65 2c 20 20 20 20 20 20 20 20 20   iFree,         
11910 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 69 64 20 6f     /* Block id o
11920 66 20 6e 65 78 74 20 66 72 65 65 20 73 6c 6f 74  f next free slot
11930 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73 20 2a   in %_segments *
11940 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
11950 34 20 2a 70 69 4c 61 73 74 2c 20 20 20 20 20 20  4 *piLast,      
11960 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42 6c 6f 63      /* OUT: Bloc
11970 6b 20 69 64 20 6f 66 20 6c 61 73 74 20 65 6e 74  k id of last ent
11980 72 79 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  ry written */.  
11990 63 68 61 72 20 2a 2a 70 61 52 6f 6f 74 2c 20 20  char **paRoot,  
119a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119b0 2f 2a 20 4f 55 54 3a 20 44 61 74 61 20 66 6f 72  /* OUT: Data for
119c0 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20   root node */.  
119d0 69 6e 74 20 2a 70 6e 52 6f 6f 74 20 20 20 20 20  int *pnRoot     
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119f0 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20  /* OUT: Size of 
11a00 72 6f 6f 74 20 6e 6f 64 65 20 69 6e 20 62 79 74  root node in byt
11a10 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  es */.){.  int r
11a20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
11a30 20 20 69 66 28 20 21 70 54 72 65 65 2d 3e 70 50    if( !pTree->pP
11a40 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  arent ){.    /* 
11a50 52 6f 6f 74 20 6e 6f 64 65 20 6f 66 20 74 68 65  Root node of the
11a60 20 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e   tree. */.    in
11a70 74 20 6e 53 74 61 72 74 20 3d 20 66 74 73 33 54  t nStart = fts3T
11a80 72 65 65 46 69 6e 69 73 68 4e 6f 64 65 28 70 54  reeFinishNode(pT
11a90 72 65 65 2c 20 69 48 65 69 67 68 74 2c 20 69 4c  ree, iHeight, iL
11aa0 65 61 66 29 3b 0a 20 20 20 20 2a 70 69 4c 61 73  eaf);.    *piLas
11ab0 74 20 3d 20 69 46 72 65 65 2d 31 3b 0a 20 20 20  t = iFree-1;.   
11ac0 20 2a 70 6e 52 6f 6f 74 20 3d 20 70 54 72 65 65   *pnRoot = pTree
11ad0 2d 3e 6e 44 61 74 61 20 2d 20 6e 53 74 61 72 74  ->nData - nStart
11ae0 3b 0a 20 20 20 20 2a 70 61 52 6f 6f 74 20 3d 20  ;.    *paRoot = 
11af0 26 70 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e 53  &pTree->aData[nS
11b00 74 61 72 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tart];.  }else{.
11b10 20 20 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20      SegmentNode 
11b20 2a 70 49 74 65 72 3b 0a 20 20 20 20 73 71 6c 69  *pIter;.    sqli
11b30 74 65 33 5f 69 6e 74 36 34 20 69 4e 65 78 74 46  te3_int64 iNextF
11b40 72 65 65 20 3d 20 69 46 72 65 65 3b 0a 20 20 20  ree = iFree;.   
11b50 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
11b60 4e 65 78 74 4c 65 61 66 20 3d 20 69 4c 65 61 66  NextLeaf = iLeaf
11b70 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d  ;.    for(pIter=
11b80 70 54 72 65 65 2d 3e 70 4c 65 66 74 6d 6f 73 74  pTree->pLeftmost
11b90 3b 20 70 49 74 65 72 20 26 26 20 72 63 3d 3d 53  ; pIter && rc==S
11ba0 51 4c 49 54 45 5f 4f 4b 3b 20 70 49 74 65 72 3d  QLITE_OK; pIter=
11bb0 70 49 74 65 72 2d 3e 70 52 69 67 68 74 29 7b 0a  pIter->pRight){.
11bc0 20 20 20 20 20 20 69 6e 74 20 6e 53 74 61 72 74        int nStart
11bd0 20 3d 20 66 74 73 33 54 72 65 65 46 69 6e 69 73   = fts3TreeFinis
11be0 68 4e 6f 64 65 28 70 49 74 65 72 2c 20 69 48 65  hNode(pIter, iHe
11bf0 69 67 68 74 2c 20 69 4e 65 78 74 4c 65 61 66 29  ight, iNextLeaf)
11c00 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69  ;.      int nWri
11c10 74 65 20 3d 20 70 49 74 65 72 2d 3e 6e 44 61 74  te = pIter->nDat
11c20 61 20 2d 20 6e 53 74 61 72 74 3b 0a 20 20 0a 20  a - nStart;.  . 
11c30 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 57 72       rc = fts3Wr
11c40 69 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 69 4e  iteSegment(p, iN
11c50 65 78 74 46 72 65 65 2c 20 26 70 49 74 65 72 2d  extFree, &pIter-
11c60 3e 61 44 61 74 61 5b 6e 53 74 61 72 74 5d 2c 20  >aData[nStart], 
11c70 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 69  nWrite);.      i
11c80 4e 65 78 74 46 72 65 65 2b 2b 3b 0a 20 20 20 20  NextFree++;.    
11c90 20 20 69 4e 65 78 74 4c 65 61 66 20 2b 3d 20 28    iNextLeaf += (
11ca0 70 49 74 65 72 2d 3e 6e 45 6e 74 72 79 2b 31 29  pIter->nEntry+1)
11cb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11cc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11cd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
11ce0 4e 65 78 74 4c 65 61 66 3d 3d 69 46 72 65 65 20  NextLeaf==iFree 
11cf0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  );.      rc = ft
11d00 73 33 4e 6f 64 65 57 72 69 74 65 28 0a 20 20 20  s3NodeWrite(.   
11d10 20 20 20 20 20 20 20 70 2c 20 70 54 72 65 65 2d         p, pTree-
11d20 3e 70 50 61 72 65 6e 74 2c 20 69 48 65 69 67 68  >pParent, iHeigh
11d30 74 2b 31 2c 20 69 46 72 65 65 2c 20 69 4e 65 78  t+1, iFree, iNex
11d40 74 46 72 65 65 2c 20 70 69 4c 61 73 74 2c 20 70  tFree, piLast, p
11d50 61 52 6f 6f 74 2c 20 70 6e 52 6f 6f 74 0a 20 20  aRoot, pnRoot.  
11d60 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
11d70 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
11d80 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
11d90 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
11da0 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ons associated w
11db0 69 74 68 20 74 68 65 20 74 72 65 65 20 70 54 72  ith the tree pTr
11dc0 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ee..*/.static vo
11dd0 69 64 20 66 74 73 33 4e 6f 64 65 46 72 65 65 28  id fts3NodeFree(
11de0 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72  SegmentNode *pTr
11df0 65 65 29 7b 0a 20 20 69 66 28 20 70 54 72 65 65  ee){.  if( pTree
11e00 20 29 7b 0a 20 20 20 20 53 65 67 6d 65 6e 74 4e   ){.    SegmentN
11e10 6f 64 65 20 2a 70 20 3d 20 70 54 72 65 65 2d 3e  ode *p = pTree->
11e20 70 4c 65 66 74 6d 6f 73 74 3b 0a 20 20 20 20 66  pLeftmost;.    f
11e30 74 73 33 4e 6f 64 65 46 72 65 65 28 70 2d 3e 70  ts3NodeFree(p->p
11e40 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 77 68 69  Parent);.    whi
11e50 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 20 20 53  le( p ){.      S
11e60 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 52 69 67  egmentNode *pRig
11e70 68 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a  ht = p->pRight;.
11e80 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 44 61        if( p->aDa
11e90 74 61 21 3d 28 63 68 61 72 20 2a 29 26 70 5b 31  ta!=(char *)&p[1
11ea0 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ] ){.        sql
11eb0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 44 61  ite3_free(p->aDa
11ec0 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ta);.      }.   
11ed0 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68     assert( pRigh
11ee0 74 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 4d 61 6c 6c  t==0 || p->zMall
11ef0 6f 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  oc==0 );.      s
11f00 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
11f10 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 73  Malloc);.      s
11f20 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
11f30 20 20 20 20 20 20 70 20 3d 20 70 52 69 67 68 74        p = pRight
11f40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
11f50 2a 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d 20  *.** Add a term 
11f60 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62  to the segment b
11f70 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
11f80 20 62 79 20 74 68 65 20 53 65 67 6d 65 6e 74 57   by the SegmentW
11f90 72 69 74 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20  riter object.** 
11fa0 2a 70 70 57 72 69 74 65 72 2e 20 57 68 65 6e 20  *ppWriter. When 
11fb0 61 64 64 69 6e 67 20 74 68 65 20 66 69 72 73 74  adding the first
11fc0 20 74 65 72 6d 20 74 6f 20 61 20 73 65 67 6d 65   term to a segme
11fd0 6e 74 2c 20 2a 70 70 57 72 69 74 65 72 20 73 68  nt, *ppWriter sh
11fe0 6f 75 6c 64 0a 2a 2a 20 62 65 20 70 61 73 73 65  ould.** be passe
11ff0 64 20 4e 55 4c 4c 2e 20 54 68 69 73 20 66 75 6e  d NULL. This fun
12000 63 74 69 6f 6e 20 77 69 6c 6c 20 61 6c 6c 6f 63  ction will alloc
12010 61 74 65 20 61 20 6e 65 77 20 53 65 67 6d 65 6e  ate a new Segmen
12020 74 57 72 69 74 65 72 20 6f 62 6a 65 63 74 0a 2a  tWriter object.*
12030 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74 20  * and return it 
12040 76 69 61 20 74 68 65 20 69 6e 70 75 74 2f 6f 75  via the input/ou
12050 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70  tput variable *p
12060 70 57 72 69 74 65 72 20 69 6e 20 74 68 69 73 20  pWriter in this 
12070 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  case..**.** If s
12080 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
12090 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
120a0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
120b0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
120c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
120d0 20 66 74 73 33 53 65 67 57 72 69 74 65 72 41 64   fts3SegWriterAd
120e0 64 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  d(.  Fts3Table *
120f0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
12100 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
12110 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
12120 20 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20    SegmentWriter 
12130 2a 2a 70 70 57 72 69 74 65 72 2c 20 20 20 20 20  **ppWriter,     
12140 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 65 67    /* IN/OUT: Seg
12150 6d 65 6e 74 57 72 69 74 65 72 20 68 61 6e 64 6c  mentWriter handl
12160 65 20 2a 2f 20 0a 20 20 69 6e 74 20 69 73 43 6f  e */ .  int isCo
12170 70 79 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  pyTerm,         
12180 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
12190 69 66 20 62 75 66 66 65 72 20 7a 54 65 72 6d 20  if buffer zTerm 
121a0 6d 75 73 74 20 62 65 20 63 6f 70 69 65 64 20 2a  must be copied *
121b0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
121c0 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  zTerm,          
121d0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
121e0 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
121f0 69 6e 67 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  ing term */.  in
12200 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 20 20 20  t nTerm,        
12210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12220 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e   Size of term in
12230 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 6f 6e 73   bytes */.  cons
12240 74 20 63 68 61 72 20 2a 61 44 6f 63 6c 69 73 74  t char *aDoclist
12250 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
12260 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
12270 20 63 6f 6e 74 61 69 6e 69 6e 67 20 64 6f 63 6c   containing docl
12280 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f  ist */.  int nDo
12290 63 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20  clist           
122a0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
122b0 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 62   of doclist in b
122c0 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ytes */.){.  int
122d0 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20 20   nPrefix;       
122e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
122f0 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 70 72 65  Size of term pre
12300 66 69 78 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  fix in bytes */.
12310 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 20 20    int nSuffix;  
12320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12330 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72    /* Size of ter
12340 6d 20 73 75 66 66 69 78 20 69 6e 20 62 79 74 65  m suffix in byte
12350 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 71 3b  s */.  int nReq;
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12370 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
12380 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
12390 65 64 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 20  ed on leaf page 
123a0 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a  */.  int nData;.
123b0 20 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20    SegmentWriter 
123c0 2a 70 57 72 69 74 65 72 20 3d 20 2a 70 70 57 72  *pWriter = *ppWr
123d0 69 74 65 72 3b 0a 0a 20 20 69 66 28 20 21 70 57  iter;..  if( !pW
123e0 72 69 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  riter ){.    int
123f0 20 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   rc;.    sqlite3
12400 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
12410 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74     /* Allocate t
12420 68 65 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72  he SegmentWriter
12430 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
12440 20 20 70 57 72 69 74 65 72 20 3d 20 28 53 65 67    pWriter = (Seg
12450 6d 65 6e 74 57 72 69 74 65 72 20 2a 29 73 71 6c  mentWriter *)sql
12460 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
12470 6f 66 28 53 65 67 6d 65 6e 74 57 72 69 74 65 72  of(SegmentWriter
12480 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 57 72  ));.    if( !pWr
12490 69 74 65 72 20 29 20 72 65 74 75 72 6e 20 53 51  iter ) return SQ
124a0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
124b0 6d 65 6d 73 65 74 28 70 57 72 69 74 65 72 2c 20  memset(pWriter, 
124c0 30 2c 20 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e  0, sizeof(Segmen
124d0 74 57 72 69 74 65 72 29 29 3b 0a 20 20 20 20 2a  tWriter));.    *
124e0 70 70 57 72 69 74 65 72 20 3d 20 70 57 72 69 74  ppWriter = pWrit
124f0 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f  er;..    /* Allo
12500 63 61 74 65 20 61 20 62 75 66 66 65 72 20 69 6e  cate a buffer in
12510 20 77 68 69 63 68 20 74 6f 20 61 63 63 75 6d 75   which to accumu
12520 6c 61 74 65 20 64 61 74 61 20 2a 2f 0a 20 20 20  late data */.   
12530 20 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 20   pWriter->aData 
12540 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
12550 33 5f 6d 61 6c 6c 6f 63 28 70 2d 3e 6e 4e 6f 64  3_malloc(p->nNod
12560 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  eSize);.    if( 
12570 21 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 20  !pWriter->aData 
12580 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
12590 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 57 72 69 74  NOMEM;.    pWrit
125a0 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 70 2d 3e 6e  er->nSize = p->n
125b0 4e 6f 64 65 53 69 7a 65 3b 0a 0a 20 20 20 20 2f  NodeSize;..    /
125c0 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20  * Find the next 
125d0 66 72 65 65 20 62 6c 6f 63 6b 69 64 20 69 6e 20  free blockid in 
125e0 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74  the %_segments t
125f0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d  able */.    rc =
12600 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
12610 53 51 4c 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54  SQL_NEXT_SEGMENT
12620 53 5f 49 44 2c 20 26 70 53 74 6d 74 2c 20 30 29  S_ID, &pStmt, 0)
12630 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12640 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
12650 20 72 63 3b 0a 20 20 20 20 69 66 28 20 53 51 4c   rc;.    if( SQL
12660 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
12670 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
12680 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69        pWriter->i
12690 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  Free = sqlite3_c
126a0 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d  olumn_int64(pStm
126b0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 57 72  t, 0);.      pWr
126c0 69 74 65 72 2d 3e 69 46 69 72 73 74 20 3d 20 70  iter->iFirst = p
126d0 57 72 69 74 65 72 2d 3e 69 46 72 65 65 3b 0a 20  Writer->iFree;. 
126e0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
126f0 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
12700 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
12710 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
12720 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6e 44 61  rn rc;.  }.  nDa
12730 74 61 20 3d 20 70 57 72 69 74 65 72 2d 3e 6e 44  ta = pWriter->nD
12740 61 74 61 3b 0a 0a 20 20 6e 50 72 65 66 69 78 20  ata;..  nPrefix 
12750 3d 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70  = fts3PrefixComp
12760 72 65 73 73 28 70 57 72 69 74 65 72 2d 3e 7a 54  ress(pWriter->zT
12770 65 72 6d 2c 20 70 57 72 69 74 65 72 2d 3e 6e 54  erm, pWriter->nT
12780 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  erm, zTerm, nTer
12790 6d 29 3b 0a 20 20 6e 53 75 66 66 69 78 20 3d 20  m);.  nSuffix = 
127a0 6e 54 65 72 6d 2d 6e 50 72 65 66 69 78 3b 0a 0a  nTerm-nPrefix;..
127b0 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
127c0 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 61  how many bytes a
127d0 72 65 20 72 65 71 75 69 72 65 64 20 62 79 20 74  re required by t
127e0 68 69 73 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  his new entry */
127f0 0a 20 20 6e 52 65 71 20 3d 20 73 71 6c 69 74 65  .  nReq = sqlite
12800 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e  3Fts3VarintLen(n
12810 50 72 65 66 69 78 29 20 2b 20 20 20 20 2f 2a 20  Prefix) +    /* 
12820 76 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e  varint containin
12830 67 20 70 72 65 66 69 78 20 73 69 7a 65 20 2a 2f  g prefix size */
12840 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33  .    sqlite3Fts3
12850 56 61 72 69 6e 74 4c 65 6e 28 6e 53 75 66 66 69  VarintLen(nSuffi
12860 78 29 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20  x) +         /* 
12870 76 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e  varint containin
12880 67 20 73 75 66 66 69 78 20 73 69 7a 65 20 2a 2f  g suffix size */
12890 0a 20 20 20 20 6e 53 75 66 66 69 78 20 2b 20 20  .    nSuffix +  
128a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
128c0 54 65 72 6d 20 73 75 66 66 69 78 20 2a 2f 0a 20  Term suffix */. 
128d0 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 56 61     sqlite3Fts3Va
128e0 72 69 6e 74 4c 65 6e 28 6e 44 6f 63 6c 69 73 74  rintLen(nDoclist
128f0 29 20 2b 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ) +        /* Si
12900 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 2a 2f  ze of doclist */
12910 0a 20 20 20 20 6e 44 6f 63 6c 69 73 74 3b 20 20  .    nDoclist;  
12920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12940 44 6f 63 6c 69 73 74 20 64 61 74 61 20 2a 2f 0a  Doclist data */.
12950 0a 20 20 69 66 28 20 6e 44 61 74 61 3e 30 20 26  .  if( nData>0 &
12960 26 20 6e 44 61 74 61 2b 6e 52 65 71 3e 70 2d 3e  & nData+nReq>p->
12970 6e 4e 6f 64 65 53 69 7a 65 20 29 7b 0a 20 20 20  nNodeSize ){.   
12980 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 2f 2a   int rc;..    /*
12990 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   The current lea
129a0 66 20 6e 6f 64 65 20 69 73 20 66 75 6c 6c 2e 20  f node is full. 
129b0 57 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20  Write it out to 
129c0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 2a 2f  the database. */
129d0 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 57 72  .    rc = fts3Wr
129e0 69 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 57  iteSegment(p, pW
129f0 72 69 74 65 72 2d 3e 69 46 72 65 65 2b 2b 2c 20  riter->iFree++, 
12a00 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 2c 20  pWriter->aData, 
12a10 6e 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  nData);.    if( 
12a20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
12a30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
12a40 2d 3e 6e 4c 65 61 66 41 64 64 2b 2b 3b 0a 0a 20  ->nLeafAdd++;.. 
12a50 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 63 75     /* Add the cu
12a60 72 72 65 6e 74 20 74 65 72 6d 20 74 6f 20 74 68  rrent term to th
12a70 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20  e interior node 
12a80 74 72 65 65 2e 20 54 68 65 20 74 65 72 6d 20 61  tree. The term a
12a90 64 64 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 74  dded to.    ** t
12aa0 68 65 20 69 6e 74 65 72 69 6f 72 20 74 72 65 65  he interior tree
12ab0 20 6d 75 73 74 3a 0a 20 20 20 20 2a 2a 0a 20 20   must:.    **.  
12ac0 20 20 2a 2a 20 20 20 61 29 20 62 65 20 67 72 65    **   a) be gre
12ad0 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61  ater than the la
12ae0 72 67 65 73 74 20 74 65 72 6d 20 6f 6e 20 74 68  rgest term on th
12af0 65 20 6c 65 61 66 20 6e 6f 64 65 20 6a 75 73 74  e leaf node just
12b00 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20   written.    ** 
12b10 20 20 20 20 20 74 6f 20 74 68 65 20 64 61 74 61       to the data
12b20 62 61 73 65 20 28 73 74 69 6c 6c 20 61 76 61 69  base (still avai
12b30 6c 61 62 6c 65 20 69 6e 20 70 57 72 69 74 65 72  lable in pWriter
12b40 2d 3e 7a 54 65 72 6d 29 2c 20 61 6e 64 0a 20 20  ->zTerm), and.  
12b50 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 62 29    **.    **   b)
12b60 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   be less than or
12b70 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 65   equal to the te
12b80 72 6d 20 61 62 6f 75 74 20 74 6f 20 62 65 20 61  rm about to be a
12b90 64 64 65 64 20 74 6f 20 74 68 65 20 6e 65 77 0a  dded to the new.
12ba0 20 20 20 20 2a 2a 20 20 20 20 20 20 6c 65 61 66      **      leaf
12bb0 20 6e 6f 64 65 20 28 7a 54 65 72 6d 2f 6e 54 65   node (zTerm/nTe
12bc0 72 6d 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  rm)..    **.    
12bd0 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
12be0 73 2c 20 69 74 20 6d 75 73 74 20 62 65 20 74 68  s, it must be th
12bf0 65 20 70 72 65 66 69 78 20 6f 66 20 7a 54 65 72  e prefix of zTer
12c00 6d 20 31 20 62 79 74 65 20 6c 6f 6e 67 65 72 20  m 1 byte longer 
12c10 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  than.    ** the 
12c20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 28 69  common prefix (i
12c30 66 20 61 6e 79 29 20 6f 66 20 7a 54 65 72 6d 20  f any) of zTerm 
12c40 61 6e 64 20 70 57 72 69 74 65 72 2d 3e 7a 54 65  and pWriter->zTe
12c50 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  rm..    */.    a
12c60 73 73 65 72 74 28 20 6e 50 72 65 66 69 78 3c 6e  ssert( nPrefix<n
12c70 54 65 72 6d 20 29 3b 0a 20 20 20 20 72 63 20 3d  Term );.    rc =
12c80 20 66 74 73 33 4e 6f 64 65 41 64 64 54 65 72 6d   fts3NodeAddTerm
12c90 28 70 2c 20 26 70 57 72 69 74 65 72 2d 3e 70 54  (p, &pWriter->pT
12ca0 72 65 65 2c 20 69 73 43 6f 70 79 54 65 72 6d 2c  ree, isCopyTerm,
12cb0 20 7a 54 65 72 6d 2c 20 6e 50 72 65 66 69 78 2b   zTerm, nPrefix+
12cc0 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  1);.    if( rc!=
12cd0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
12ce0 72 6e 20 72 63 3b 0a 0a 20 20 20 20 6e 44 61 74  rn rc;..    nDat
12cf0 61 20 3d 20 30 3b 0a 20 20 20 20 70 57 72 69 74  a = 0;.    pWrit
12d00 65 72 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 0a  er->nTerm = 0;..
12d10 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20 30 3b      nPrefix = 0;
12d20 0a 20 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e  .    nSuffix = n
12d30 54 65 72 6d 3b 0a 20 20 20 20 6e 52 65 71 20 3d  Term;.    nReq =
12d40 20 31 20 2b 20 20 20 20 20 20 20 20 20 20 20 20   1 +            
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d60 20 20 2f 2a 20 76 61 72 69 6e 74 20 63 6f 6e 74    /* varint cont
12d70 61 69 6e 69 6e 67 20 70 72 65 66 69 78 20 73 69  aining prefix si
12d80 7a 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ze */.      sqli
12d90 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e  te3Fts3VarintLen
12da0 28 6e 54 65 72 6d 29 20 2b 20 20 20 20 20 20 20  (nTerm) +       
12db0 20 20 2f 2a 20 76 61 72 69 6e 74 20 63 6f 6e 74    /* varint cont
12dc0 61 69 6e 69 6e 67 20 73 75 66 66 69 78 20 73 69  aining suffix si
12dd0 7a 65 20 2a 2f 0a 20 20 20 20 20 20 6e 54 65 72  ze */.      nTer
12de0 6d 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  m +             
12df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e00 20 20 2f 2a 20 54 65 72 6d 20 73 75 66 66 69 78    /* Term suffix
12e10 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
12e20 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e  3Fts3VarintLen(n
12e30 44 6f 63 6c 69 73 74 29 20 2b 20 20 20 20 20 20  Doclist) +      
12e40 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69  /* Size of docli
12e50 73 74 20 2a 2f 0a 20 20 20 20 20 20 6e 44 6f 63  st */.      nDoc
12e60 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  list;           
12e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e80 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 64 61 74    /* Doclist dat
12e90 61 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  a */.  }..  /* I
12ea0 6e 63 72 65 61 73 65 20 74 68 65 20 74 6f 74 61  ncrease the tota
12eb0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
12ec0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 61 63 63  s written to acc
12ed0 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 6e 65 77  ount for the new
12ee0 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 70 57 72   entry. */.  pWr
12ef0 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61 74 61 20  iter->nLeafData 
12f00 2b 3d 20 6e 52 65 71 3b 0a 0a 20 20 2f 2a 20 49  += nReq;..  /* I
12f10 66 20 74 68 65 20 62 75 66 66 65 72 20 63 75 72  f the buffer cur
12f20 72 65 6e 74 6c 79 20 61 6c 6c 6f 63 61 74 65 64  rently allocated
12f30 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f   is too small fo
12f40 72 20 74 68 69 73 20 65 6e 74 72 79 2c 20 72 65  r this entry, re
12f50 61 6c 6c 6f 63 0a 20 20 2a 2a 20 74 68 65 20 62  alloc.  ** the b
12f60 75 66 66 65 72 20 74 6f 20 6d 61 6b 65 20 69 74  uffer to make it
12f70 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2e 0a 20   large enough.. 
12f80 20 2a 2f 0a 20 20 69 66 28 20 6e 52 65 71 3e 70   */.  if( nReq>p
12f90 57 72 69 74 65 72 2d 3e 6e 53 69 7a 65 20 29 7b  Writer->nSize ){
12fa0 0a 20 20 20 20 63 68 61 72 20 2a 61 4e 65 77 20  .    char *aNew 
12fb0 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
12fc0 63 28 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61  c(pWriter->aData
12fd0 2c 20 6e 52 65 71 29 3b 0a 20 20 20 20 69 66 28  , nReq);.    if(
12fe0 20 21 61 4e 65 77 20 29 20 72 65 74 75 72 6e 20   !aNew ) return 
12ff0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
13000 20 20 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61    pWriter->aData
13010 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 70 57 72   = aNew;.    pWr
13020 69 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 6e 52  iter->nSize = nR
13030 65 71 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  eq;.  }.  assert
13040 28 20 6e 44 61 74 61 2b 6e 52 65 71 3c 3d 70 57  ( nData+nReq<=pW
13050 72 69 74 65 72 2d 3e 6e 53 69 7a 65 20 29 3b 0a  riter->nSize );.
13060 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65  .  /* Append the
13070 20 70 72 65 66 69 78 2d 63 6f 6d 70 72 65 73 73   prefix-compress
13080 65 64 20 74 65 72 6d 20 61 6e 64 20 64 6f 63 6c  ed term and docl
13090 69 73 74 20 74 6f 20 74 68 65 20 62 75 66 66 65  ist to the buffe
130a0 72 2e 20 2a 2f 0a 20 20 6e 44 61 74 61 20 2b 3d  r. */.  nData +=
130b0 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56   sqlite3Fts3PutV
130c0 61 72 69 6e 74 28 26 70 57 72 69 74 65 72 2d 3e  arint(&pWriter->
130d0 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 6e 50  aData[nData], nP
130e0 72 65 66 69 78 29 3b 0a 20 20 6e 44 61 74 61 20  refix);.  nData 
130f0 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75  += sqlite3Fts3Pu
13100 74 56 61 72 69 6e 74 28 26 70 57 72 69 74 65 72  tVarint(&pWriter
13110 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20  ->aData[nData], 
13120 6e 53 75 66 66 69 78 29 3b 0a 20 20 6d 65 6d 63  nSuffix);.  memc
13130 70 79 28 26 70 57 72 69 74 65 72 2d 3e 61 44 61  py(&pWriter->aDa
13140 74 61 5b 6e 44 61 74 61 5d 2c 20 26 7a 54 65 72  ta[nData], &zTer
13150 6d 5b 6e 50 72 65 66 69 78 5d 2c 20 6e 53 75 66  m[nPrefix], nSuf
13160 66 69 78 29 3b 0a 20 20 6e 44 61 74 61 20 2b 3d  fix);.  nData +=
13170 20 6e 53 75 66 66 69 78 3b 0a 20 20 6e 44 61 74   nSuffix;.  nDat
13180 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  a += sqlite3Fts3
13190 50 75 74 56 61 72 69 6e 74 28 26 70 57 72 69 74  PutVarint(&pWrit
131a0 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d  er->aData[nData]
131b0 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 6d  , nDoclist);.  m
131c0 65 6d 63 70 79 28 26 70 57 72 69 74 65 72 2d 3e  emcpy(&pWriter->
131d0 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 61 44  aData[nData], aD
131e0 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74  oclist, nDoclist
131f0 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 44  );.  pWriter->nD
13200 61 74 61 20 3d 20 6e 44 61 74 61 20 2b 20 6e 44  ata = nData + nD
13210 6f 63 6c 69 73 74 3b 0a 0a 20 20 2f 2a 20 53 61  oclist;..  /* Sa
13220 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ve the current t
13230 65 72 6d 20 73 6f 20 74 68 61 74 20 69 74 20 63  erm so that it c
13240 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70 72  an be used to pr
13250 65 66 69 78 2d 63 6f 6d 70 72 65 73 73 20 74 68  efix-compress th
13260 65 20 6e 65 78 74 2e 0a 20 20 2a 2a 20 49 66 20  e next..  ** If 
13270 74 68 65 20 69 73 43 6f 70 79 54 65 72 6d 20 70  the isCopyTerm p
13280 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65  arameter is true
13290 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66 66 65  , then the buffe
132a0 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a  r pointed to by.
132b0 20 20 2a 2a 20 7a 54 65 72 6d 20 69 73 20 74 72    ** zTerm is tr
132c0 61 6e 73 69 65 6e 74 2c 20 73 6f 20 74 61 6b 65  ansient, so take
132d0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 74   a copy of the t
132e0 65 72 6d 20 64 61 74 61 2e 20 4f 74 68 65 72 77  erm data. Otherw
132f0 69 73 65 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 73  ise, just.  ** s
13300 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20 74  tore a copy of t
13310 68 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f  he pointer..  */
13320 0a 20 20 69 66 28 20 69 73 43 6f 70 79 54 65 72  .  if( isCopyTer
13330 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 54 65  m ){.    if( nTe
13340 72 6d 3e 70 57 72 69 74 65 72 2d 3e 6e 4d 61 6c  rm>pWriter->nMal
13350 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 63 68 61  loc ){.      cha
13360 72 20 2a 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *zNew = sqlite
13370 33 5f 72 65 61 6c 6c 6f 63 28 70 57 72 69 74 65  3_realloc(pWrite
13380 72 2d 3e 7a 4d 61 6c 6c 6f 63 2c 20 6e 54 65 72  r->zMalloc, nTer
13390 6d 2a 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  m*2);.      if( 
133a0 21 7a 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20  !zNew ){.       
133b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
133c0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
133d0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 4d 61      pWriter->nMa
133e0 6c 6c 6f 63 20 3d 20 6e 54 65 72 6d 2a 32 3b 0a  lloc = nTerm*2;.
133f0 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 7a        pWriter->z
13400 4d 61 6c 6c 6f 63 20 3d 20 7a 4e 65 77 3b 0a 20  Malloc = zNew;. 
13410 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 7a 54       pWriter->zT
13420 65 72 6d 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20  erm = zNew;.    
13430 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  }.    assert( pW
13440 72 69 74 65 72 2d 3e 7a 54 65 72 6d 3d 3d 70 57  riter->zTerm==pW
13450 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c 6f 63 20 29  riter->zMalloc )
13460 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 57 72  ;.    memcpy(pWr
13470 69 74 65 72 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65  iter->zTerm, zTe
13480 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 7d 65  rm, nTerm);.  }e
13490 6c 73 65 7b 0a 20 20 20 20 70 57 72 69 74 65 72  lse{.    pWriter
134a0 2d 3e 7a 54 65 72 6d 20 3d 20 28 63 68 61 72 20  ->zTerm = (char 
134b0 2a 29 7a 54 65 72 6d 3b 0a 20 20 7d 0a 20 20 70  *)zTerm;.  }.  p
134c0 57 72 69 74 65 72 2d 3e 6e 54 65 72 6d 20 3d 20  Writer->nTerm = 
134d0 6e 54 65 72 6d 3b 0a 0a 20 20 72 65 74 75 72 6e  nTerm;..  return
134e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
134f0 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6c 6c 20 64  *.** Flush all d
13500 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
13510 69 74 68 20 74 68 65 20 53 65 67 6d 65 6e 74 57  ith the SegmentW
13520 72 69 74 65 72 20 6f 62 6a 65 63 74 20 70 57 72  riter object pWr
13530 69 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 64  iter to the.** d
13540 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 66 75  atabase. This fu
13550 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 63  nction must be c
13560 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6c 6c 20  alled after all 
13570 74 65 72 6d 73 20 68 61 76 65 20 62 65 65 6e 20  terms have been 
13580 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  added.** to the 
13590 73 65 67 6d 65 6e 74 20 75 73 69 6e 67 20 66 74  segment using ft
135a0 73 33 53 65 67 57 72 69 74 65 72 41 64 64 28 29  s3SegWriterAdd()
135b0 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
135c0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a   SQLITE_OK is.**
135d0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
135e0 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20  wise, an SQLite 
135f0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
13600 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65  tatic int fts3Se
13610 67 57 72 69 74 65 72 46 6c 75 73 68 28 0a 20 20  gWriterFlush(.  
13620 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
13630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13640 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  /* Virtual table
13650 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 65 67   handle */.  Seg
13660 6d 65 6e 74 57 72 69 74 65 72 20 2a 70 57 72 69  mentWriter *pWri
13670 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ter,         /* 
13680 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 74 6f  SegmentWriter to
13690 20 66 6c 75 73 68 20 74 6f 20 74 68 65 20 64 62   flush to the db
136a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
136b0 74 36 34 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  t64 iLevel,     
136c0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66        /* Value f
136d0 6f 72 20 27 6c 65 76 65 6c 27 20 63 6f 6c 75 6d  or 'level' colum
136e0 6e 20 6f 66 20 25 5f 73 65 67 64 69 72 20 2a 2f  n of %_segdir */
136f0 0a 20 20 69 6e 74 20 69 49 64 78 20 20 20 20 20  .  int iIdx     
13700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13710 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20     /* Value for 
13720 27 69 64 78 27 20 63 6f 6c 75 6d 6e 20 6f 66 20  'idx' column of 
13730 25 5f 73 65 67 64 69 72 20 2a 2f 0a 29 7b 0a 20  %_segdir */.){. 
13740 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
13750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13760 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
13770 2a 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  */.  if( pWriter
13780 2d 3e 70 54 72 65 65 20 29 7b 0a 20 20 20 20 73  ->pTree ){.    s
13790 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 61  qlite3_int64 iLa
137a0 73 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  st = 0;      /* 
137b0 4c 61 72 67 65 73 74 20 62 6c 6f 63 6b 20 69 64  Largest block id
137c0 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61   written to data
137d0 62 61 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  base */.    sqli
137e0 74 65 33 5f 69 6e 74 36 34 20 69 4c 61 73 74 4c  te3_int64 iLastL
137f0 65 61 66 3b 20 20 20 20 20 20 2f 2a 20 4c 61 72  eaf;      /* Lar
13800 67 65 73 74 20 6c 65 61 66 20 62 6c 6f 63 6b 20  gest leaf block 
13810 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20 64 62  id written to db
13820 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 52   */.    char *zR
13830 6f 6f 74 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20  oot = NULL;     
13840 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
13850 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
13860 69 6e 69 6e 67 20 72 6f 6f 74 20 6e 6f 64 65 20  ining root node 
13870 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 6f 6f 74  */.    int nRoot
13880 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
13890 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
138a0 62 75 66 66 65 72 20 7a 52 6f 6f 74 20 2a 2f 0a  buffer zRoot */.
138b0 0a 20 20 20 20 69 4c 61 73 74 4c 65 61 66 20 3d  .    iLastLeaf =
138c0 20 70 57 72 69 74 65 72 2d 3e 69 46 72 65 65 3b   pWriter->iFree;
138d0 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 57 72  .    rc = fts3Wr
138e0 69 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 57  iteSegment(p, pW
138f0 72 69 74 65 72 2d 3e 69 46 72 65 65 2b 2b 2c 20  riter->iFree++, 
13900 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 2c 20  pWriter->aData, 
13910 70 57 72 69 74 65 72 2d 3e 6e 44 61 74 61 29 3b  pWriter->nData);
13920 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
13930 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13940 72 63 20 3d 20 66 74 73 33 4e 6f 64 65 57 72 69  rc = fts3NodeWri
13950 74 65 28 70 2c 20 70 57 72 69 74 65 72 2d 3e 70  te(p, pWriter->p
13960 54 72 65 65 2c 20 31 2c 0a 20 20 20 20 20 20 20  Tree, 1,.       
13970 20 20 20 70 57 72 69 74 65 72 2d 3e 69 46 69 72     pWriter->iFir
13980 73 74 2c 20 70 57 72 69 74 65 72 2d 3e 69 46 72  st, pWriter->iFr
13990 65 65 2c 20 26 69 4c 61 73 74 2c 20 26 7a 52 6f  ee, &iLast, &zRo
139a0 6f 74 2c 20 26 6e 52 6f 6f 74 29 3b 0a 20 20 20  ot, &nRoot);.   
139b0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
139c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
139d0 20 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65    rc = fts3Write
139e0 53 65 67 64 69 72 28 70 2c 20 69 4c 65 76 65 6c  Segdir(p, iLevel
139f0 2c 20 69 49 64 78 2c 20 0a 20 20 20 20 20 20 20  , iIdx, .       
13a00 20 20 20 70 57 72 69 74 65 72 2d 3e 69 46 69 72     pWriter->iFir
13a10 73 74 2c 20 69 4c 61 73 74 4c 65 61 66 2c 20 69  st, iLastLeaf, i
13a20 4c 61 73 74 2c 20 70 57 72 69 74 65 72 2d 3e 6e  Last, pWriter->n
13a30 4c 65 61 66 44 61 74 61 2c 20 7a 52 6f 6f 74 2c  LeafData, zRoot,
13a40 20 6e 52 6f 6f 74 29 3b 0a 20 20 20 20 7d 0a 20   nRoot);.    }. 
13a50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
13a60 68 65 20 65 6e 74 69 72 65 20 74 72 65 65 20 66  he entire tree f
13a70 69 74 73 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20  its on the root 
13a80 6e 6f 64 65 2e 20 57 72 69 74 65 20 69 74 20 74  node. Write it t
13a90 6f 20 74 68 65 20 73 65 67 64 69 72 20 74 61 62  o the segdir tab
13aa0 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  le. */.    rc = 
13ab0 66 74 73 33 57 72 69 74 65 53 65 67 64 69 72 28  fts3WriteSegdir(
13ac0 70 2c 20 69 4c 65 76 65 6c 2c 20 69 49 64 78 2c  p, iLevel, iIdx,
13ad0 20 0a 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20   .        0, 0, 
13ae0 30 2c 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61  0, pWriter->nLea
13af0 66 44 61 74 61 2c 20 70 57 72 69 74 65 72 2d 3e  fData, pWriter->
13b00 61 44 61 74 61 2c 20 70 57 72 69 74 65 72 2d 3e  aData, pWriter->
13b10 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 70 2d  nData);.  }.  p-
13b20 3e 6e 4c 65 61 66 41 64 64 2b 2b 3b 0a 20 20 72  >nLeafAdd++;.  r
13b30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13b40 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6d  ** Release all m
13b50 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68  emory held by th
13b60 65 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20  e SegmentWriter 
13b70 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
13b80 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 61   the .** first a
13b90 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
13ba0 69 63 20 76 6f 69 64 20 66 74 73 33 53 65 67 57  ic void fts3SegW
13bb0 72 69 74 65 72 46 72 65 65 28 53 65 67 6d 65 6e  riterFree(Segmen
13bc0 74 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  tWriter *pWriter
13bd0 29 7b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  ){.  if( pWriter
13be0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
13bf0 66 72 65 65 28 70 57 72 69 74 65 72 2d 3e 61 44  free(pWriter->aD
13c00 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ata);.    sqlite
13c10 33 5f 66 72 65 65 28 70 57 72 69 74 65 72 2d 3e  3_free(pWriter->
13c20 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 66 74  zMalloc);.    ft
13c30 73 33 4e 6f 64 65 46 72 65 65 28 70 57 72 69 74  s3NodeFree(pWrit
13c40 65 72 2d 3e 70 54 72 65 65 29 3b 0a 20 20 20 20  er->pTree);.    
13c50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57 72  sqlite3_free(pWr
13c60 69 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  iter);.  }.}../*
13c70 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 76 61  .** The first va
13c80 6c 75 65 20 69 6e 20 74 68 65 20 61 70 56 61 6c  lue in the apVal
13c90 5b 5d 20 61 72 72 61 79 20 69 73 20 61 73 73 75  [] array is assu
13ca0 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61  med to contain a
13cb0 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 20 54 68  n integer..** Th
13cc0 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74  is function test
13cd0 73 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  s if there exist
13ce0 20 61 6e 79 20 64 6f 63 75 6d 65 6e 74 73 20 77   any documents w
13cf0 69 74 68 20 64 6f 63 69 64 20 76 61 6c 75 65 73  ith docid values
13d00 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 64 69 66   that.** are dif
13d10 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 61 74  ferent from that
13d20 20 69 6e 74 65 67 65 72 2e 20 69 2e 65 2e 20 69   integer. i.e. i
13d30 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 64  f deleting the d
13d40 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 64 6f 63  ocument with doc
13d50 69 64 0a 2a 2a 20 70 52 6f 77 69 64 20 77 6f 75  id.** pRowid wou
13d60 6c 64 20 6d 65 61 6e 20 74 68 65 20 46 54 53 33  ld mean the FTS3
13d70 20 74 61 62 6c 65 20 77 65 72 65 20 65 6d 70 74   table were empt
13d80 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  y..**.** If succ
13d90 65 73 73 66 75 6c 2c 20 2a 70 69 73 45 6d 70 74  essful, *pisEmpt
13da0 79 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  y is set to true
13db0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
13dc0 20 65 6d 70 74 79 20 65 78 63 65 70 74 20 66 6f   empty except fo
13dd0 72 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 20 70 52  r.** document pR
13de0 6f 77 69 64 2c 20 6f 72 20 66 61 6c 73 65 20 6f  owid, or false o
13df0 74 68 65 72 77 69 73 65 2c 20 61 6e 64 20 53 51  therwise, and SQ
13e00 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
13e10 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72  ned. If an.** er
13e20 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
13e30 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
13e40 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
13e50 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
13e60 49 73 45 6d 70 74 79 28 46 74 73 33 54 61 62 6c  IsEmpty(Fts3Tabl
13e70 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 61  e *p, sqlite3_va
13e80 6c 75 65 20 2a 70 52 6f 77 69 64 2c 20 69 6e 74  lue *pRowid, int
13e90 20 2a 70 69 73 45 6d 70 74 79 29 7b 0a 20 20 73   *pisEmpty){.  s
13ea0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
13eb0 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  mt;.  int rc;.  
13ec0 69 66 28 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54  if( p->zContentT
13ed0 62 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  bl ){.    /* If 
13ee0 75 73 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  using the conten
13ef0 74 3d 78 78 78 20 6f 70 74 69 6f 6e 2c 20 61 73  t=xxx option, as
13f00 73 75 6d 65 20 74 68 65 20 74 61 62 6c 65 20 69  sume the table i
13f10 73 20 6e 65 76 65 72 20 65 6d 70 74 79 20 2a 2f  s never empty */
13f20 0a 20 20 20 20 2a 70 69 73 45 6d 70 74 79 20 3d  .    *pisEmpty =
13f30 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   0;.    rc = SQL
13f40 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
13f50 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71  .    rc = fts3Sq
13f60 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 49 53 5f  lStmt(p, SQL_IS_
13f70 45 4d 50 54 59 2c 20 26 70 53 74 6d 74 2c 20 26  EMPTY, &pStmt, &
13f80 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28  pRowid);.    if(
13f90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
13fa0 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  {.      if( SQLI
13fb0 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
13fc0 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
13fd0 20 20 20 20 20 20 20 2a 70 69 73 45 6d 70 74 79         *pisEmpty
13fe0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
13ff0 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b  n_int(pStmt, 0);
14000 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
14010 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
14020 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a  t(pStmt);.    }.
14030 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
14040 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  .}../*.** Set *p
14050 6e 4d 61 78 20 74 6f 20 74 68 65 20 6c 61 72 67  nMax to the larg
14060 65 73 74 20 73 65 67 6d 65 6e 74 20 6c 65 76 65  est segment leve
14070 6c 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  l in the databas
14080 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a  e for the index.
14090 2a 2a 20 69 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  ** iIndex..**.**
140a0 20 53 65 67 6d 65 6e 74 20 6c 65 76 65 6c 73 20   Segment levels 
140b0 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
140c0 65 20 27 6c 65 76 65 6c 27 20 63 6f 6c 75 6d 6e  e 'level' column
140d0 20 6f 66 20 74 68 65 20 25 5f 73 65 67 64 69 72   of the %_segdir
140e0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   table..**.** Re
140f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
14100 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
14110 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
14120 20 63 6f 64 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f   code if not..*/
14130 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
14140 53 65 67 6d 65 6e 74 4d 61 78 4c 65 76 65 6c 28  SegmentMaxLevel(
14150 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
14160 20 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c   .  int iLangid,
14170 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 2c 20 0a  .  int iIndex, .
14180 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
14190 2a 70 6e 4d 61 78 0a 29 7b 0a 20 20 73 71 6c 69  *pnMax.){.  sqli
141a0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
141b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
141c0 65 72 74 28 20 69 49 6e 64 65 78 3e 3d 30 20 26  ert( iIndex>=0 &
141d0 26 20 69 49 6e 64 65 78 3c 70 2d 3e 6e 49 6e 64  & iIndex<p->nInd
141e0 65 78 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  ex );..  /* Set 
141f0 70 53 74 6d 74 20 74 6f 20 74 68 65 20 63 6f 6d  pStmt to the com
14200 70 69 6c 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  piled version of
14210 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45  :.  **.  **   SE
14220 4c 45 43 54 20 6d 61 78 28 6c 65 76 65 6c 29 20  LECT max(level) 
14230 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64  FROM %Q.'%q_segd
14240 69 72 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20  ir' WHERE level 
14250 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 0a  BETWEEN ? AND ?.
14260 20 20 2a 2a 0a 20 20 2a 2a 20 28 31 30 32 34 20    **.  ** (1024 
14270 69 73 20 61 63 74 75 61 6c 6c 79 20 74 68 65 20  is actually the 
14280 76 61 6c 75 65 20 6f 66 20 6d 61 63 72 6f 20 46  value of macro F
14290 54 53 33 5f 53 45 47 44 49 52 5f 50 52 45 46 49  TS3_SEGDIR_PREFI
142a0 58 4c 45 56 45 4c 5f 53 54 52 29 2e 0a 20 20 2a  XLEVEL_STR)..  *
142b0 2f 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  /.  rc = fts3Sql
142c0 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45  Stmt(p, SQL_SELE
142d0 43 54 5f 53 45 47 44 49 52 5f 4d 41 58 5f 4c 45  CT_SEGDIR_MAX_LE
142e0 56 45 4c 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  VEL, &pStmt, 0);
142f0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
14300 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
14310 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ;.  sqlite3_bind
14320 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 2c  _int64(pStmt, 1,
14330 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65   getAbsoluteLeve
14340 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49  l(p, iLangid, iI
14350 6e 64 65 78 2c 20 30 29 29 3b 0a 20 20 73 71 6c  ndex, 0));.  sql
14360 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
14370 70 53 74 6d 74 2c 20 32 2c 20 0a 20 20 20 20 20  pStmt, 2, .     
14380 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65   getAbsoluteLeve
14390 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49  l(p, iLangid, iI
143a0 6e 64 65 78 2c 20 46 54 53 33 5f 53 45 47 44 49  ndex, FTS3_SEGDI
143b0 52 5f 4d 41 58 4c 45 56 45 4c 2d 31 29 0a 20 20  R_MAXLEVEL-1).  
143c0 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
143d0 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
143e0 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
143f0 2a 70 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33  *pnMax = sqlite3
14400 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
14410 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  tmt, 0);.  }.  r
14420 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 72 65  eturn sqlite3_re
14430 73 65 74 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f  set(pStmt);.}../
14440 2a 0a 2a 2a 20 69 41 62 73 4c 65 76 65 6c 20 69  *.** iAbsLevel i
14450 73 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 6c 65  s an absolute le
14460 76 65 6c 20 74 68 61 74 20 6d 61 79 20 62 65 20  vel that may be 
14470 61 73 73 75 6d 65 64 20 74 6f 20 65 78 69 73 74  assumed to exist
14480 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 64   within.** the d
14490 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 66 75  atabase. This fu
144a0 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66  nction checks if
144b0 20 69 74 20 69 73 20 74 68 65 20 6c 61 72 67 65   it is the large
144c0 73 74 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 0a  st level number.
144d0 2a 2a 20 77 69 74 68 69 6e 20 69 74 73 20 69 6e  ** within its in
144e0 64 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f  dex. Assuming no
144f0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
14500 70 62 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20  pbMax is set to 
14510 31 20 69 66 0a 2a 2a 20 69 41 62 73 4c 65 76 65  1 if.** iAbsLeve
14520 6c 20 69 73 20 69 6e 64 65 65 64 20 74 68 65 20  l is indeed the 
14530 6c 61 72 67 65 73 74 20 6c 65 76 65 6c 2c 20 6f  largest level, o
14540 72 20 30 20 6f 74 68 65 72 77 69 73 65 2c 20 61  r 0 otherwise, a
14550 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  nd SQLITE_OK.** 
14560 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
14570 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
14580 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
14590 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
145a0 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 76 61 6c 75  he.** final valu
145b0 65 20 6f 66 20 2a 70 62 4d 61 78 20 69 73 20 75  e of *pbMax is u
145c0 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
145d0 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 6d  tic int fts3Segm
145e0 65 6e 74 49 73 4d 61 78 4c 65 76 65 6c 28 46 74  entIsMaxLevel(Ft
145f0 73 33 54 61 62 6c 65 20 2a 70 2c 20 69 36 34 20  s3Table *p, i64 
14600 69 41 62 73 4c 65 76 65 6c 2c 20 69 6e 74 20 2a  iAbsLevel, int *
14610 70 62 4d 61 78 29 7b 0a 0a 20 20 2f 2a 20 53 65  pbMax){..  /* Se
14620 74 20 70 53 74 6d 74 20 74 6f 20 74 68 65 20 63  t pStmt to the c
14630 6f 6d 70 69 6c 65 64 20 76 65 72 73 69 6f 6e 20  ompiled version 
14640 6f 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  of:.  **.  **   
14650 53 45 4c 45 43 54 20 6d 61 78 28 6c 65 76 65 6c  SELECT max(level
14660 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65  ) FROM %Q.'%q_se
14670 67 64 69 72 27 20 57 48 45 52 45 20 6c 65 76 65  gdir' WHERE leve
14680 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20  l BETWEEN ? AND 
14690 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 31 30 32  ?.  **.  ** (102
146a0 34 20 69 73 20 61 63 74 75 61 6c 6c 79 20 74 68  4 is actually th
146b0 65 20 76 61 6c 75 65 20 6f 66 20 6d 61 63 72 6f  e value of macro
146c0 20 46 54 53 33 5f 53 45 47 44 49 52 5f 50 52 45   FTS3_SEGDIR_PRE
146d0 46 49 58 4c 45 56 45 4c 5f 53 54 52 29 2e 0a 20  FIXLEVEL_STR).. 
146e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
146f0 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
14700 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
14710 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f  t(p, SQL_SELECT_
14720 53 45 47 44 49 52 5f 4d 41 58 5f 4c 45 56 45 4c  SEGDIR_MAX_LEVEL
14730 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
14740 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14750 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
14760 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
14770 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 69 41  t64(pStmt, 1, iA
14780 62 73 4c 65 76 65 6c 2b 31 29 3b 0a 20 20 73 71  bsLevel+1);.  sq
14790 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
147a0 28 70 53 74 6d 74 2c 20 32 2c 20 0a 20 20 20 20  (pStmt, 2, .    
147b0 20 20 28 28 69 41 62 73 4c 65 76 65 6c 2f 46 54    ((iAbsLevel/FT
147c0 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56  S3_SEGDIR_MAXLEV
147d0 45 4c 29 2b 31 29 20 2a 20 46 54 53 33 5f 53 45  EL)+1) * FTS3_SE
147e0 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 0a 20 20  GDIR_MAXLEVEL.  
147f0 29 3b 0a 0a 20 20 2a 70 62 4d 61 78 20 3d 20 30  );..  *pbMax = 0
14800 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52  ;.  if( SQLITE_R
14810 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
14820 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 2a  (pStmt) ){.    *
14830 70 62 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 5f  pbMax = sqlite3_
14840 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d  column_type(pStm
14850 74 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4e 55  t, 0)==SQLITE_NU
14860 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  LL;.  }.  return
14870 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
14880 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Stmt);.}../*.** 
14890 44 65 6c 65 74 65 20 61 6c 6c 20 65 6e 74 72 69  Delete all entri
148a0 65 73 20 69 6e 20 74 68 65 20 25 5f 73 65 67 6d  es in the %_segm
148b0 65 6e 74 73 20 74 61 62 6c 65 20 61 73 73 6f 63  ents table assoc
148c0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 73  iated with the s
148d0 65 67 6d 65 6e 74 0a 2a 2a 20 6f 70 65 6e 65 64  egment.** opened
148e0 20 77 69 74 68 20 73 65 67 2d 72 65 61 64 65 72   with seg-reader
148f0 20 70 53 65 67 2e 20 54 68 69 73 20 66 75 6e 63   pSeg. This func
14900 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 66  tion does not af
14910 66 65 63 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  fect the content
14920 73 0a 2a 2a 20 6f 66 20 74 68 65 20 25 5f 73 65  s.** of the %_se
14930 67 64 69 72 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  gdir table..*/.s
14940 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 44 65  tatic int fts3De
14950 6c 65 74 65 53 65 67 6d 65 6e 74 28 0a 20 20 46  leteSegment(.  F
14960 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
14970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14980 2a 20 46 54 53 20 74 61 62 6c 65 20 68 61 6e 64  * FTS table hand
14990 6c 65 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 52  le */.  Fts3SegR
149a0 65 61 64 65 72 20 2a 70 53 65 67 20 20 20 20 20  eader *pSeg     
149b0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65          /* Segme
149c0 6e 74 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  nt to delete */.
149d0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
149e0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
149f0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
14a00 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 65  ode */.  if( pSe
14a10 67 2d 3e 69 53 74 61 72 74 42 6c 6f 63 6b 20 29  g->iStartBlock )
14a20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
14a30 6d 74 20 2a 70 44 65 6c 65 74 65 3b 20 20 20 20  mt *pDelete;    
14a40 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65      /* SQL state
14a50 6d 65 6e 74 20 74 6f 20 64 65 6c 65 74 65 20 72  ment to delete r
14a60 6f 77 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ows */.    rc = 
14a70 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
14a80 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 4d 45 4e  QL_DELETE_SEGMEN
14a90 54 53 5f 52 41 4e 47 45 2c 20 26 70 44 65 6c 65  TS_RANGE, &pDele
14aa0 74 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  te, 0);.    if( 
14ab0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14ac0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
14ad0 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c 65 74  ind_int64(pDelet
14ae0 65 2c 20 31 2c 20 70 53 65 67 2d 3e 69 53 74 61  e, 1, pSeg->iSta
14af0 72 74 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  rtBlock);.      
14b00 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
14b10 36 34 28 70 44 65 6c 65 74 65 2c 20 32 2c 20 70  64(pDelete, 2, p
14b20 53 65 67 2d 3e 69 45 6e 64 42 6c 6f 63 6b 29 3b  Seg->iEndBlock);
14b30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
14b40 74 65 70 28 70 44 65 6c 65 74 65 29 3b 0a 20 20  tep(pDelete);.  
14b50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14b60 5f 72 65 73 65 74 28 70 44 65 6c 65 74 65 29 3b  _reset(pDelete);
14b70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
14b80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
14b90 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
14ba0 73 20 75 73 65 64 20 61 66 74 65 72 20 6d 65 72  s used after mer
14bb0 67 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 73 65  ging multiple se
14bc0 67 6d 65 6e 74 73 20 69 6e 74 6f 20 61 20 73 69  gments into a si
14bd0 6e 67 6c 65 20 6c 61 72 67 65 0a 2a 2a 20 73 65  ngle large.** se
14be0 67 6d 65 6e 74 20 74 6f 20 64 65 6c 65 74 65 20  gment to delete 
14bf0 74 68 65 20 6f 6c 64 2c 20 6e 6f 77 20 72 65 64  the old, now red
14c00 75 6e 64 61 6e 74 2c 20 73 65 67 6d 65 6e 74 20  undant, segment 
14c10 62 2d 74 72 65 65 73 2e 20 53 70 65 63 69 66 69  b-trees. Specifi
14c20 63 61 6c 6c 79 2c 0a 2a 2a 20 69 74 3a 0a 2a 2a  cally,.** it:.**
14c30 20 0a 2a 2a 20 20 20 31 29 20 44 65 6c 65 74 65   .**   1) Delete
14c40 73 20 61 6c 6c 20 25 5f 73 65 67 6d 65 6e 74 73  s all %_segments
14c50 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
14c60 20 73 65 67 6d 65 6e 74 73 20 61 73 73 6f 63 69   segments associ
14c70 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 20 20  ated with .**   
14c80 20 20 20 65 61 63 68 20 6f 66 20 74 68 65 20 53     each of the S
14c90 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74 73  egReader objects
14ca0 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 70 61   in the array pa
14cb0 73 73 65 64 20 61 73 20 74 68 65 20 74 68 69 72  ssed as the thir
14cc0 64 20 0a 2a 2a 20 20 20 20 20 20 61 72 67 75 6d  d .**      argum
14cd0 65 6e 74 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ent, and.**.**  
14ce0 20 32 29 20 64 65 6c 65 74 65 73 20 61 6c 6c 20   2) deletes all 
14cf0 25 5f 73 65 67 64 69 72 20 65 6e 74 72 69 65 73  %_segdir entries
14d00 20 77 69 74 68 20 6c 65 76 65 6c 20 69 4c 65 76   with level iLev
14d10 65 6c 2c 20 6f 72 20 61 6c 6c 20 25 5f 73 65 67  el, or all %_seg
14d20 64 69 72 0a 2a 2a 20 20 20 20 20 20 65 6e 74 72  dir.**      entr
14d30 69 65 73 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ies regardless o
14d40 66 20 6c 65 76 65 6c 20 69 66 20 28 69 4c 65 76  f level if (iLev
14d50 65 6c 3c 30 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  el<0)..**.** SQL
14d60 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
14d70 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ed if successful
14d80 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 53  , otherwise an S
14d90 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
14da0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14db0 66 74 73 33 44 65 6c 65 74 65 53 65 67 64 69 72  fts3DeleteSegdir
14dc0 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
14dd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14de0 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74      /* Virtual t
14df0 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
14e00 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20 20   int iLangid,   
14e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64 20   /* Language id 
14e30 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 2c  */.  int iIndex,
14e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e50 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f       /* Index fo
14e60 72 20 70 2d 3e 61 49 6e 64 65 78 20 2a 2f 0a 20  r p->aIndex */. 
14e70 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20   int iLevel,    
14e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e90 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 20 25 5f 73   /* Level of %_s
14ea0 65 67 64 69 72 20 65 6e 74 72 69 65 73 20 74 6f  egdir entries to
14eb0 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 46 74 73   delete */.  Fts
14ec0 33 53 65 67 52 65 61 64 65 72 20 2a 2a 61 70 53  3SegReader **apS
14ed0 65 67 6d 65 6e 74 2c 20 20 20 20 20 20 2f 2a 20  egment,      /* 
14ee0 41 72 72 61 79 20 6f 66 20 53 65 67 52 65 61 64  Array of SegRead
14ef0 65 72 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  er objects */.  
14f00 69 6e 74 20 6e 52 65 61 64 65 72 20 20 20 20 20  int nReader     
14f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79  /* Size of array
14f30 20 61 70 53 65 67 6d 65 6e 74 20 2a 2f 0a 29 7b   apSegment */.){
14f40 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14f50 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
14f60 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
14f70 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
14f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f90 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
14fa0 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
14fb0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
14fc0 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20  Delete = 0;     
14fd0 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   /* SQL statemen
14fe0 74 20 74 6f 20 64 65 6c 65 74 65 20 72 6f 77 73  t to delete rows
14ff0 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   */..  for(i=0; 
15000 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
15010 20 69 3c 6e 52 65 61 64 65 72 3b 20 69 2b 2b 29   i<nReader; i++)
15020 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 44  {.    rc = fts3D
15030 65 6c 65 74 65 53 65 67 6d 65 6e 74 28 70 2c 20  eleteSegment(p, 
15040 61 70 53 65 67 6d 65 6e 74 5b 69 5d 29 3b 0a 20  apSegment[i]);. 
15050 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
15060 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
15070 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
15080 61 73 73 65 72 74 28 20 69 4c 65 76 65 6c 3e 3d  assert( iLevel>=
15090 30 20 7c 7c 20 69 4c 65 76 65 6c 3d 3d 46 54 53  0 || iLevel==FTS
150a0 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c 20  3_SEGCURSOR_ALL 
150b0 29 3b 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3d  );.  if( iLevel=
150c0 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f  =FTS3_SEGCURSOR_
150d0 41 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ALL ){.    rc = 
150e0 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
150f0 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 44 49 52  QL_DELETE_SEGDIR
15100 5f 52 41 4e 47 45 2c 20 26 70 44 65 6c 65 74 65  _RANGE, &pDelete
15110 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
15120 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15130 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
15140 64 5f 69 6e 74 36 34 28 70 44 65 6c 65 74 65 2c  d_int64(pDelete,
15150 20 31 2c 20 67 65 74 41 62 73 6f 6c 75 74 65 4c   1, getAbsoluteL
15160 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c  evel(p, iLangid,
15170 20 69 49 6e 64 65 78 2c 20 30 29 29 3b 0a 20 20   iIndex, 0));.  
15180 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
15190 5f 69 6e 74 36 34 28 70 44 65 6c 65 74 65 2c 20  _int64(pDelete, 
151a0 32 2c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  2, .          ge
151b0 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70  tAbsoluteLevel(p
151c0 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
151d0 78 2c 20 46 54 53 33 5f 53 45 47 44 49 52 5f 4d  x, FTS3_SEGDIR_M
151e0 41 58 4c 45 56 45 4c 2d 31 29 0a 20 20 20 20 20  AXLEVEL-1).     
151f0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   );.    }.  }els
15200 65 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  e{.    rc = fts3
15210 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 44  SqlStmt(p, SQL_D
15220 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 4c 45 56  ELETE_SEGDIR_LEV
15230 45 4c 2c 20 26 70 44 65 6c 65 74 65 2c 20 30 29  EL, &pDelete, 0)
15240 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
15250 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15260 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
15270 74 36 34 28 0a 20 20 20 20 20 20 20 20 20 20 70  t64(.          p
15280 44 65 6c 65 74 65 2c 20 31 2c 20 67 65 74 41 62  Delete, 1, getAb
15290 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69  soluteLevel(p, i
152a0 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20  Langid, iIndex, 
152b0 69 4c 65 76 65 6c 29 0a 20 20 20 20 20 20 29 3b  iLevel).      );
152c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
152d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
152e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
152f0 74 65 70 28 70 44 65 6c 65 74 65 29 3b 0a 20 20  tep(pDelete);.  
15300 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
15310 65 73 65 74 28 70 44 65 6c 65 74 65 29 3b 0a 20  eset(pDelete);. 
15320 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
15330 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  .}../*.** When t
15340 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
15350 63 61 6c 6c 65 64 2c 20 62 75 66 66 65 72 20 2a  called, buffer *
15360 70 70 4c 69 73 74 20 28 73 69 7a 65 20 2a 70 6e  ppList (size *pn
15370 4c 69 73 74 20 62 79 74 65 73 29 20 63 6f 6e 74  List bytes) cont
15380 61 69 6e 73 20 0a 2a 2a 20 61 20 70 6f 73 69 74  ains .** a posit
15390 69 6f 6e 20 6c 69 73 74 20 74 68 61 74 20 6d 61  ion list that ma
153a0 79 20 28 6f 72 20 6d 61 79 20 6e 6f 74 29 20 66  y (or may not) f
153b0 65 61 74 75 72 65 20 6d 75 6c 74 69 70 6c 65 20  eature multiple 
153c0 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 0a 2a 2a  columns. This.**
153d0 20 66 75 6e 63 74 69 6f 6e 20 61 64 6a 75 73 74   function adjust
153e0 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 2a 70  s the pointer *p
153f0 70 4c 69 73 74 20 61 6e 64 20 74 68 65 20 6c 65  pList and the le
15400 6e 67 74 68 20 2a 70 6e 4c 69 73 74 20 73 6f 20  ngth *pnList so 
15410 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 69 64 65  that they.** ide
15420 6e 74 69 66 79 20 74 68 65 20 73 75 62 73 65 74  ntify the subset
15430 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   of the position
15440 20 6c 69 73 74 20 74 68 61 74 20 63 6f 72 72 65   list that corre
15450 73 70 6f 6e 64 73 20 74 6f 20 63 6f 6c 75 6d 6e  sponds to column
15460 20 69 43 6f 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   iCol..**.** If 
15470 74 68 65 72 65 20 61 72 65 20 6e 6f 20 65 6e 74  there are no ent
15480 72 69 65 73 20 69 6e 20 74 68 65 20 69 6e 70 75  ries in the inpu
15490 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  t position list 
154a0 66 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c  for column iCol,
154b0 20 74 68 65 6e 0a 2a 2a 20 2a 70 6e 4c 69 73 74   then.** *pnList
154c0 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20   is set to zero 
154d0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
154e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
154f0 65 74 65 72 20 62 5a 65 72 6f 20 69 73 20 6e 6f  eter bZero is no
15500 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  n-zero, then any
15510 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 70   part of the inp
15520 75 74 20 6c 69 73 74 20 66 6f 6c 6c 6f 77 69 6e  ut list followin
15530 67 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20  g.** the end of 
15540 74 68 65 20 6f 75 74 70 75 74 20 6c 69 73 74 20  the output list 
15550 69 73 20 7a 65 72 6f 65 64 20 62 65 66 6f 72 65  is zeroed before
15560 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
15570 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 43  tatic void fts3C
15580 6f 6c 75 6d 6e 46 69 6c 74 65 72 28 0a 20 20 69  olumnFilter(.  i
15590 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
155a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
155b0 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 66 69 6c 74  * Column to filt
155c0 65 72 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62  er on */.  int b
155d0 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Zero,           
155e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65             /* Ze
155f0 72 6f 20 6f 75 74 20 61 6e 79 74 68 69 6e 67 20  ro out anything 
15600 66 6f 6c 6c 6f 77 69 6e 67 20 2a 70 70 4c 69 73  following *ppLis
15610 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70  t */.  char **pp
15620 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
15630 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
15640 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73  : Pointer to pos
15650 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20  ition list */.  
15660 69 6e 74 20 2a 70 6e 4c 69 73 74 20 20 20 20 20  int *pnList     
15670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15680 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 69 7a 65 20  /* IN/OUT: Size 
15690 6f 66 20 62 75 66 66 65 72 20 2a 70 70 4c 69 73  of buffer *ppLis
156a0 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b  t in bytes */.){
156b0 0a 20 20 63 68 61 72 20 2a 70 4c 69 73 74 20 3d  .  char *pList =
156c0 20 2a 70 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20   *ppList;.  int 
156d0 6e 4c 69 73 74 20 3d 20 2a 70 6e 4c 69 73 74 3b  nList = *pnList;
156e0 0a 20 20 63 68 61 72 20 2a 70 45 6e 64 20 3d 20  .  char *pEnd = 
156f0 26 70 4c 69 73 74 5b 6e 4c 69 73 74 5d 3b 0a 20  &pList[nList];. 
15700 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20   int iCurrent = 
15710 30 3b 0a 20 20 63 68 61 72 20 2a 70 20 3d 20 70  0;.  char *p = p
15720 4c 69 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  List;..  assert(
15730 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 77 68   iCol>=0 );.  wh
15740 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 63 68  ile( 1 ){.    ch
15750 61 72 20 63 20 3d 20 30 3b 0a 20 20 20 20 77 68  ar c = 0;.    wh
15760 69 6c 65 28 20 70 3c 70 45 6e 64 20 26 26 20 28  ile( p<pEnd && (
15770 63 20 7c 20 2a 70 29 26 30 78 46 45 20 29 20 63  c | *p)&0xFE ) c
15780 20 3d 20 2a 70 2b 2b 20 26 20 30 78 38 30 3b 0a   = *p++ & 0x80;.
15790 20 20 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d    .    if( iCol=
157a0 3d 69 43 75 72 72 65 6e 74 20 29 7b 0a 20 20 20  =iCurrent ){.   
157b0 20 20 20 6e 4c 69 73 74 20 3d 20 28 69 6e 74 29     nList = (int)
157c0 28 70 20 2d 20 70 4c 69 73 74 29 3b 0a 20 20 20  (p - pList);.   
157d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
157e0 0a 20 20 20 20 6e 4c 69 73 74 20 2d 3d 20 28 69  .    nList -= (i
157f0 6e 74 29 28 70 20 2d 20 70 4c 69 73 74 29 3b 0a  nt)(p - pList);.
15800 20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20      pList = p;. 
15810 20 20 20 69 66 28 20 6e 4c 69 73 74 3d 3d 30 20     if( nList==0 
15820 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
15830 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 26 70      }.    p = &p
15840 4c 69 73 74 5b 31 5d 3b 0a 20 20 20 20 70 20 2b  List[1];.    p +
15850 3d 20 66 74 73 33 47 65 74 56 61 72 69 6e 74 33  = fts3GetVarint3
15860 32 28 70 2c 20 26 69 43 75 72 72 65 6e 74 29 3b  2(p, &iCurrent);
15870 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 5a 65 72  .  }..  if( bZer
15880 6f 20 26 26 20 26 70 4c 69 73 74 5b 6e 4c 69 73  o && &pList[nLis
15890 74 5d 21 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20  t]!=pEnd ){.    
158a0 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 5b 6e 4c  memset(&pList[nL
158b0 69 73 74 5d 2c 20 30 2c 20 70 45 6e 64 20 2d 20  ist], 0, pEnd - 
158c0 26 70 4c 69 73 74 5b 6e 4c 69 73 74 5d 29 3b 0a  &pList[nList]);.
158d0 20 20 7d 0a 20 20 2a 70 70 4c 69 73 74 20 3d 20    }.  *ppList = 
158e0 70 4c 69 73 74 3b 0a 20 20 2a 70 6e 4c 69 73 74  pList;.  *pnList
158f0 20 3d 20 6e 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a   = nList;.}../*.
15900 2a 2a 20 43 61 63 68 65 20 64 61 74 61 20 69 6e  ** Cache data in
15910 20 74 68 65 20 46 74 73 33 4d 75 6c 74 69 53 65   the Fts3MultiSe
15920 67 52 65 61 64 65 72 2e 61 42 75 66 66 65 72 5b  gReader.aBuffer[
15930 5d 20 62 75 66 66 65 72 20 28 6f 76 65 72 77 72  ] buffer (overwr
15940 69 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 65 78 69  iting any.** exi
15950 73 74 69 6e 67 20 64 61 74 61 29 2e 20 47 72 6f  sting data). Gro
15960 77 20 74 68 65 20 62 75 66 66 65 72 20 69 66 20  w the buffer if 
15970 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  required..**.** 
15980 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  If successful, r
15990 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
159a0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
159b0 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65  n OOM error is e
159c0 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2a 20 74 72  ncountered.** tr
159d0 79 69 6e 67 20 74 6f 20 72 65 73 69 7a 65 20 74  ying to resize t
159e0 68 65 20 62 75 66 66 65 72 2c 20 72 65 74 75 72  he buffer, retur
159f0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a  n SQLITE_NOMEM..
15a00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
15a10 73 33 4d 73 72 42 75 66 66 65 72 44 61 74 61 28  s3MsrBufferData(
15a20 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52  .  Fts3MultiSegR
15a30 65 61 64 65 72 20 2a 70 4d 73 72 2c 20 20 20 20  eader *pMsr,    
15a40 20 20 20 2f 2a 20 4d 75 6c 74 69 2d 73 65 67 6d     /* Multi-segm
15a50 65 6e 74 2d 72 65 61 64 65 72 20 68 61 6e 64 6c  ent-reader handl
15a60 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 4c 69  e */.  char *pLi
15a70 73 74 2c 0a 20 20 69 6e 74 20 6e 4c 69 73 74 0a  st,.  int nList.
15a80 29 7b 0a 20 20 69 66 28 20 6e 4c 69 73 74 3e 70  ){.  if( nList>p
15a90 4d 73 72 2d 3e 6e 42 75 66 66 65 72 20 29 7b 0a  Msr->nBuffer ){.
15aa0 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 3b 0a      char *pNew;.
15ab0 20 20 20 20 70 4d 73 72 2d 3e 6e 42 75 66 66 65      pMsr->nBuffe
15ac0 72 20 3d 20 6e 4c 69 73 74 2a 32 3b 0a 20 20 20  r = nList*2;.   
15ad0 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29   pNew = (char *)
15ae0 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
15af0 70 4d 73 72 2d 3e 61 42 75 66 66 65 72 2c 20 70  pMsr->aBuffer, p
15b00 4d 73 72 2d 3e 6e 42 75 66 66 65 72 29 3b 0a 20  Msr->nBuffer);. 
15b10 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 20 72     if( !pNew ) r
15b20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
15b30 45 4d 3b 0a 20 20 20 20 70 4d 73 72 2d 3e 61 42  EM;.    pMsr->aB
15b40 75 66 66 65 72 20 3d 20 70 4e 65 77 3b 0a 20 20  uffer = pNew;.  
15b50 7d 0a 0a 20 20 6d 65 6d 63 70 79 28 70 4d 73 72  }..  memcpy(pMsr
15b60 2d 3e 61 42 75 66 66 65 72 2c 20 70 4c 69 73 74  ->aBuffer, pList
15b70 2c 20 6e 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  , nList);.  retu
15b80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
15b90 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
15ba0 4d 73 72 49 6e 63 72 4e 65 78 74 28 0a 20 20 46  MsrIncrNext(.  F
15bb0 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
15bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15bd0 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * Virtual table 
15be0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33  handle */.  Fts3
15bf0 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a  MultiSegReader *
15c00 70 4d 73 72 2c 20 20 20 20 20 20 20 2f 2a 20 4d  pMsr,       /* M
15c10 75 6c 74 69 2d 73 65 67 6d 65 6e 74 2d 72 65 61  ulti-segment-rea
15c20 64 65 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  der handle */.  
15c30 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
15c40 69 44 6f 63 69 64 2c 20 20 20 20 20 20 20 20 20  iDocid,         
15c50 2f 2a 20 4f 55 54 3a 20 44 6f 63 69 64 20 76 61  /* OUT: Docid va
15c60 6c 75 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  lue */.  char **
15c70 70 61 50 6f 73 6c 69 73 74 2c 20 20 20 20 20 20  paPoslist,      
15c80 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
15c90 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73 69   Pointer to posi
15ca0 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 69  tion list */.  i
15cb0 6e 74 20 2a 70 6e 50 6f 73 6c 69 73 74 20 20 20  nt *pnPoslist   
15cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15cd0 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 70  * OUT: Size of p
15ce0 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 69 6e 20  osition list in 
15cf0 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  bytes */.){.  in
15d00 74 20 6e 4d 65 72 67 65 20 3d 20 70 4d 73 72 2d  t nMerge = pMsr-
15d10 3e 6e 41 64 76 61 6e 63 65 3b 0a 20 20 46 74 73  >nAdvance;.  Fts
15d20 33 53 65 67 52 65 61 64 65 72 20 2a 2a 61 70 53  3SegReader **apS
15d30 65 67 6d 65 6e 74 20 3d 20 70 4d 73 72 2d 3e 61  egment = pMsr->a
15d40 70 53 65 67 6d 65 6e 74 3b 0a 20 20 69 6e 74 20  pSegment;.  int 
15d50 28 2a 78 43 6d 70 29 28 46 74 73 33 53 65 67 52  (*xCmp)(Fts3SegR
15d60 65 61 64 65 72 20 2a 2c 20 46 74 73 33 53 65 67  eader *, Fts3Seg
15d70 52 65 61 64 65 72 20 2a 29 20 3d 20 28 0a 20 20  Reader *) = (.  
15d80 20 20 70 2d 3e 62 44 65 73 63 49 64 78 20 3f 20    p->bDescIdx ? 
15d90 66 74 73 33 53 65 67 52 65 61 64 65 72 44 6f 63  fts3SegReaderDoc
15da0 6c 69 73 74 43 6d 70 52 65 76 20 3a 20 66 74 73  listCmpRev : fts
15db0 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73  3SegReaderDoclis
15dc0 74 43 6d 70 0a 20 20 29 3b 0a 0a 20 20 69 66 28  tCmp.  );..  if(
15dd0 20 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20   nMerge==0 ){.  
15de0 20 20 2a 70 61 50 6f 73 6c 69 73 74 20 3d 20 30    *paPoslist = 0
15df0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
15e00 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 77  ITE_OK;.  }..  w
15e10 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 46  hile( 1 ){.    F
15e20 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 53  ts3SegReader *pS
15e30 65 67 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 70  eg;.    pSeg = p
15e40 4d 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 30  Msr->apSegment[0
15e50 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 65 67  ];..    if( pSeg
15e60 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30  ->pOffsetList==0
15e70 20 29 7b 0a 20 20 20 20 20 20 2a 70 61 50 6f 73   ){.      *paPos
15e80 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  list = 0;.      
15e90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  break;.    }else
15ea0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  {.      int rc;.
15eb0 20 20 20 20 20 20 63 68 61 72 20 2a 70 4c 69 73        char *pLis
15ec0 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69  t;.      int nLi
15ed0 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  st;.      int j;
15ee0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
15ef0 6e 74 36 34 20 69 44 6f 63 69 64 20 3d 20 61 70  nt64 iDocid = ap
15f00 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 69 44 6f 63  Segment[0]->iDoc
15f10 69 64 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20  id;..      rc = 
15f20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 78  fts3SegReaderNex
15f30 74 44 6f 63 69 64 28 70 2c 20 61 70 53 65 67 6d  tDocid(p, apSegm
15f40 65 6e 74 5b 30 5d 2c 20 26 70 4c 69 73 74 2c 20  ent[0], &pList, 
15f50 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 6a  &nList);.      j
15f60 20 3d 20 31 3b 0a 20 20 20 20 20 20 77 68 69 6c   = 1;.      whil
15f70 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
15f80 20 0a 20 20 20 20 20 20 20 20 26 26 20 6a 3c 6e   .        && j<n
15f90 4d 65 72 67 65 0a 20 20 20 20 20 20 20 20 26 26  Merge.        &&
15fa0 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2d 3e 70   apSegment[j]->p
15fb0 4f 66 66 73 65 74 4c 69 73 74 0a 20 20 20 20 20  OffsetList.     
15fc0 20 20 20 26 26 20 61 70 53 65 67 6d 65 6e 74 5b     && apSegment[
15fd0 6a 5d 2d 3e 69 44 6f 63 69 64 3d 3d 69 44 6f 63  j]->iDocid==iDoc
15fe0 69 64 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  id.      ){.    
15ff0 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67      rc = fts3Seg
16000 52 65 61 64 65 72 4e 65 78 74 44 6f 63 69 64 28  ReaderNextDocid(
16010 70 2c 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2c  p, apSegment[j],
16020 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
16030 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  j++;.      }.   
16040 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16050 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
16060 3b 0a 20 20 20 20 20 20 66 74 73 33 53 65 67 52  ;.      fts3SegR
16070 65 61 64 65 72 53 6f 72 74 28 70 4d 73 72 2d 3e  eaderSort(pMsr->
16080 61 70 53 65 67 6d 65 6e 74 2c 20 6e 4d 65 72 67  apSegment, nMerg
16090 65 2c 20 6a 2c 20 78 43 6d 70 29 3b 0a 0a 20 20  e, j, xCmp);..  
160a0 20 20 20 20 69 66 28 20 6e 4c 69 73 74 3e 30 20      if( nList>0 
160b0 26 26 20 66 74 73 33 53 65 67 52 65 61 64 65 72  && fts3SegReader
160c0 49 73 50 65 6e 64 69 6e 67 28 61 70 53 65 67 6d  IsPending(apSegm
160d0 65 6e 74 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  ent[0]) ){.     
160e0 20 20 20 72 63 20 3d 20 66 74 73 33 4d 73 72 42     rc = fts3MsrB
160f0 75 66 66 65 72 44 61 74 61 28 70 4d 73 72 2c 20  ufferData(pMsr, 
16100 70 4c 69 73 74 2c 20 6e 4c 69 73 74 2b 31 29 3b  pList, nList+1);
16110 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
16120 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
16130 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
16140 61 73 73 65 72 74 28 20 28 70 4d 73 72 2d 3e 61  assert( (pMsr->a
16150 42 75 66 66 65 72 5b 6e 4c 69 73 74 5d 20 26 20  Buffer[nList] & 
16160 30 78 46 45 29 3d 3d 30 78 30 30 20 29 3b 0a 20  0xFE)==0x00 );. 
16170 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70         pList = p
16180 4d 73 72 2d 3e 61 42 75 66 66 65 72 3b 0a 20 20  Msr->aBuffer;.  
16190 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
161a0 20 70 4d 73 72 2d 3e 69 43 6f 6c 46 69 6c 74 65   pMsr->iColFilte
161b0 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r>=0 ){.        
161c0 66 74 73 33 43 6f 6c 75 6d 6e 46 69 6c 74 65 72  fts3ColumnFilter
161d0 28 70 4d 73 72 2d 3e 69 43 6f 6c 46 69 6c 74 65  (pMsr->iColFilte
161e0 72 2c 20 31 2c 20 26 70 4c 69 73 74 2c 20 26 6e  r, 1, &pList, &n
161f0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  List);.      }..
16200 20 20 20 20 20 20 69 66 28 20 6e 4c 69 73 74 3e        if( nList>
16210 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 61  0 ){.        *pa
16220 50 6f 73 6c 69 73 74 20 3d 20 70 4c 69 73 74 3b  Poslist = pList;
16230 0a 20 20 20 20 20 20 20 20 2a 70 69 44 6f 63 69  .        *piDoci
16240 64 20 3d 20 69 44 6f 63 69 64 3b 0a 20 20 20 20  d = iDocid;.    
16250 20 20 20 20 2a 70 6e 50 6f 73 6c 69 73 74 20 3d      *pnPoslist =
16260 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20   nList;.        
16270 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
16280 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
16290 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
162a0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
162b0 53 65 67 52 65 61 64 65 72 53 74 61 72 74 28 0a  SegReaderStart(.
162c0 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
162d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162e0 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
162f0 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46  le handle */.  F
16300 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
16310 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 2f  r *pCsr,       /
16320 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  * Cursor object 
16330 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
16340 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  *zTerm,         
16350 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 73 65 61       /* Term sea
16360 72 63 68 65 64 20 66 6f 72 20 28 6f 72 20 4e 55  rched for (or NU
16370 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  LL) */.  int nTe
16380 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rm              
16390 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
163a0 74 68 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62  th of zTerm in b
163b0 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ytes */.){.  int
163c0 20 69 3b 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d   i;.  int nSeg =
163d0 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b   pCsr->nSegment;
163e0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46 74  ..  /* If the Ft
163f0 73 33 53 65 67 46 69 6c 74 65 72 20 64 65 66 69  s3SegFilter defi
16400 6e 65 73 20 61 20 73 70 65 63 69 66 69 63 20 74  nes a specific t
16410 65 72 6d 20 28 6f 72 20 74 65 72 6d 20 70 72 65  erm (or term pre
16420 66 69 78 29 20 74 6f 20 73 65 61 72 63 68 20 0a  fix) to search .
16430 20 20 2a 2a 20 66 6f 72 2c 20 74 68 65 6e 20 61    ** for, then a
16440 64 76 61 6e 63 65 20 65 61 63 68 20 73 65 67 6d  dvance each segm
16450 65 6e 74 20 69 74 65 72 61 74 6f 72 20 75 6e 74  ent iterator unt
16460 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  il it points to 
16470 61 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 65  a term of.  ** e
16480 71 75 61 6c 20 6f 72 20 67 72 65 61 74 65 72 20  qual or greater 
16490 76 61 6c 75 65 20 74 68 61 6e 20 74 68 65 20 73  value than the s
164a0 70 65 63 69 66 69 65 64 20 74 65 72 6d 2e 20 54  pecified term. T
164b0 68 69 73 20 70 72 65 76 65 6e 74 73 20 6d 61 6e  his prevents man
164c0 79 0a 20 20 2a 2a 20 75 6e 6e 65 63 65 73 73 61  y.  ** unnecessa
164d0 72 79 20 6d 65 72 67 65 2f 73 6f 72 74 20 6f 70  ry merge/sort op
164e0 65 72 61 74 69 6f 6e 73 20 66 6f 72 20 74 68 65  erations for the
164f0 20 63 61 73 65 20 77 68 65 72 65 20 73 69 6e 67   case where sing
16500 6c 65 20 73 65 67 6d 65 6e 74 0a 20 20 2a 2a 20  le segment.  ** 
16510 62 2d 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65  b-tree leaf node
16520 73 20 63 6f 6e 74 61 69 6e 20 6d 6f 72 65 20 74  s contain more t
16530 68 61 6e 20 6f 6e 65 20 74 65 72 6d 2e 0a 20 20  han one term..  
16540 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 43  */.  for(i=0; pC
16550 73 72 2d 3e 62 52 65 73 74 61 72 74 3d 3d 30 20  sr->bRestart==0 
16560 26 26 20 69 3c 70 43 73 72 2d 3e 6e 53 65 67 6d  && i<pCsr->nSegm
16570 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ent; i++){.    i
16580 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20  nt res = 0;.    
16590 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
165a0 53 65 67 20 3d 20 70 43 73 72 2d 3e 61 70 53 65  Seg = pCsr->apSe
165b0 67 6d 65 6e 74 5b 69 5d 3b 0a 20 20 20 20 64 6f  gment[i];.    do
165c0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20   {.      int rc 
165d0 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e  = fts3SegReaderN
165e0 65 78 74 28 70 2c 20 70 53 65 67 2c 20 30 29 3b  ext(p, pSeg, 0);
165f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
16600 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
16610 6e 20 72 63 3b 0a 20 20 20 20 7d 77 68 69 6c 65  n rc;.    }while
16620 28 20 7a 54 65 72 6d 20 26 26 20 28 72 65 73 20  ( zTerm && (res 
16630 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72 54  = fts3SegReaderT
16640 65 72 6d 43 6d 70 28 70 53 65 67 2c 20 7a 54 65  ermCmp(pSeg, zTe
16650 72 6d 2c 20 6e 54 65 72 6d 29 29 3c 30 20 29 3b  rm, nTerm))<0 );
16660 0a 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e  ..    if( pSeg->
16670 62 4c 6f 6f 6b 75 70 20 26 26 20 72 65 73 21 3d  bLookup && res!=
16680 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 33 53  0 ){.      fts3S
16690 65 67 52 65 61 64 65 72 53 65 74 45 6f 66 28 70  egReaderSetEof(p
166a0 53 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Seg);.    }.  }.
166b0 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72 53    fts3SegReaderS
166c0 6f 72 74 28 70 43 73 72 2d 3e 61 70 53 65 67 6d  ort(pCsr->apSegm
166d0 65 6e 74 2c 20 6e 53 65 67 2c 20 6e 53 65 67 2c  ent, nSeg, nSeg,
166e0 20 66 74 73 33 53 65 67 52 65 61 64 65 72 43 6d   fts3SegReaderCm
166f0 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  p);..  return SQ
16700 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20  LITE_OK;.}..int 
16710 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
16720 61 64 65 72 53 74 61 72 74 28 0a 20 20 46 74 73  aderStart(.  Fts
16730 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16750 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  Virtual table ha
16760 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 4d 75  ndle */.  Fts3Mu
16770 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70 43  ltiSegReader *pC
16780 73 72 2c 20 20 20 20 20 20 20 2f 2a 20 43 75 72  sr,       /* Cur
16790 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  sor object */.  
167a0 46 74 73 33 53 65 67 46 69 6c 74 65 72 20 2a 70  Fts3SegFilter *p
167b0 46 69 6c 74 65 72 20 20 20 20 20 20 20 20 20 20  Filter          
167c0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20  /* Restrictions 
167d0 6f 6e 20 72 61 6e 67 65 20 6f 66 20 69 74 65 72  on range of iter
167e0 61 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 70 43  ation */.){.  pC
167f0 73 72 2d 3e 70 46 69 6c 74 65 72 20 3d 20 70 46  sr->pFilter = pF
16800 69 6c 74 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  ilter;.  return 
16810 66 74 73 33 53 65 67 52 65 61 64 65 72 53 74 61  fts3SegReaderSta
16820 72 74 28 70 2c 20 70 43 73 72 2c 20 70 46 69 6c  rt(p, pCsr, pFil
16830 74 65 72 2d 3e 7a 54 65 72 6d 2c 20 70 46 69 6c  ter->zTerm, pFil
16840 74 65 72 2d 3e 6e 54 65 72 6d 29 3b 0a 7d 0a 0a  ter->nTerm);.}..
16850 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 4d  int sqlite3Fts3M
16860 73 72 49 6e 63 72 53 74 61 72 74 28 0a 20 20 46  srIncrStart(.  F
16870 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
16880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16890 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * Virtual table 
168a0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33  handle */.  Fts3
168b0 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a  MultiSegReader *
168c0 70 43 73 72 2c 20 20 20 20 20 20 20 2f 2a 20 43  pCsr,       /* C
168d0 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  ursor object */.
168e0 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20    int iCol,     
168f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16900 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 6d    /* Column to m
16910 61 74 63 68 20 6f 6e 2e 20 2a 2f 0a 20 20 63 6f  atch on. */.  co
16920 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c  nst char *zTerm,
16930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16940 20 54 65 72 6d 20 74 6f 20 69 74 65 72 61 74 65   Term to iterate
16950 20 74 68 72 6f 75 67 68 20 61 20 64 6f 63 6c 69   through a docli
16960 73 74 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  st for */.  int 
16970 6e 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20  nTerm           
16980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
16990 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
169a0 6e 20 7a 54 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20  n zTerm */.){.  
169b0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b  int i;.  int rc;
169c0 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20  .  int nSegment 
169d0 3d 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74  = pCsr->nSegment
169e0 3b 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70 29 28  ;.  int (*xCmp)(
169f0 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2c  Fts3SegReader *,
16a00 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
16a10 29 20 3d 20 28 0a 20 20 20 20 70 2d 3e 62 44 65  ) = (.    p->bDe
16a20 73 63 49 64 78 20 3f 20 66 74 73 33 53 65 67 52  scIdx ? fts3SegR
16a30 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 52  eaderDoclistCmpR
16a40 65 76 20 3a 20 66 74 73 33 53 65 67 52 65 61 64  ev : fts3SegRead
16a50 65 72 44 6f 63 6c 69 73 74 43 6d 70 0a 20 20 29  erDoclistCmp.  )
16a60 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 73  ;..  assert( pCs
16a70 72 2d 3e 70 46 69 6c 74 65 72 3d 3d 30 20 29 3b  r->pFilter==0 );
16a80 0a 20 20 61 73 73 65 72 74 28 20 7a 54 65 72 6d  .  assert( zTerm
16a90 20 26 26 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a   && nTerm>0 );..
16aa0 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 65 61 63    /* Advance eac
16ab0 68 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74  h segment iterat
16ac0 6f 72 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e  or until it poin
16ad0 74 73 20 74 6f 20 74 68 65 20 74 65 72 6d 20 7a  ts to the term z
16ae0 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 2a 2f 0a 20  Term/nTerm. */. 
16af0 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61   rc = fts3SegRea
16b00 64 65 72 53 74 61 72 74 28 70 2c 20 70 43 73 72  derStart(p, pCsr
16b10 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b  , zTerm, nTerm);
16b20 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
16b30 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
16b40 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e  ;..  /* Determin
16b50 65 20 68 6f 77 20 6d 61 6e 79 20 6f 66 20 74 68  e how many of th
16b60 65 20 73 65 67 6d 65 6e 74 73 20 61 63 74 75 61  e segments actua
16b70 6c 6c 79 20 70 6f 69 6e 74 20 74 6f 20 7a 54 65  lly point to zTe
16b80 72 6d 2f 6e 54 65 72 6d 2e 20 2a 2f 0a 20 20 66  rm/nTerm. */.  f
16b90 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 65 67 6d 65  or(i=0; i<nSegme
16ba0 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74  nt; i++){.    Ft
16bb0 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65  s3SegReader *pSe
16bc0 67 20 3d 20 70 43 73 72 2d 3e 61 70 53 65 67 6d  g = pCsr->apSegm
16bd0 65 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  ent[i];.    if( 
16be0 21 70 53 65 67 2d 3e 61 4e 6f 64 65 20 7c 7c 20  !pSeg->aNode || 
16bf0 66 74 73 33 53 65 67 52 65 61 64 65 72 54 65 72  fts3SegReaderTer
16c00 6d 43 6d 70 28 70 53 65 67 2c 20 7a 54 65 72 6d  mCmp(pSeg, zTerm
16c10 2c 20 6e 54 65 72 6d 29 20 29 7b 0a 20 20 20 20  , nTerm) ){.    
16c20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
16c30 20 7d 0a 20 20 70 43 73 72 2d 3e 6e 41 64 76 61   }.  pCsr->nAdva
16c40 6e 63 65 20 3d 20 69 3b 0a 0a 20 20 2f 2a 20 41  nce = i;..  /* A
16c50 64 76 61 6e 63 65 20 65 61 63 68 20 6f 66 20 74  dvance each of t
16c60 68 65 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 70  he segments to p
16c70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73  oint to the firs
16c80 74 20 64 6f 63 69 64 2e 20 2a 2f 0a 20 20 66 6f  t docid. */.  fo
16c90 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e  r(i=0; i<pCsr->n
16ca0 41 64 76 61 6e 63 65 3b 20 69 2b 2b 29 7b 0a 20  Advance; i++){. 
16cb0 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52     rc = fts3SegR
16cc0 65 61 64 65 72 46 69 72 73 74 44 6f 63 69 64 28  eaderFirstDocid(
16cd0 70 2c 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65  p, pCsr->apSegme
16ce0 6e 74 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  nt[i]);.    if( 
16cf0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
16d00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
16d10 20 66 74 73 33 53 65 67 52 65 61 64 65 72 53 6f   fts3SegReaderSo
16d20 72 74 28 70 43 73 72 2d 3e 61 70 53 65 67 6d 65  rt(pCsr->apSegme
16d30 6e 74 2c 20 69 2c 20 69 2c 20 78 43 6d 70 29 3b  nt, i, i, xCmp);
16d40 0a 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c  ..  assert( iCol
16d50 3c 30 20 7c 7c 20 69 43 6f 6c 3c 70 2d 3e 6e 43  <0 || iCol<p->nC
16d60 6f 6c 75 6d 6e 20 29 3b 0a 20 20 70 43 73 72 2d  olumn );.  pCsr-
16d70 3e 69 43 6f 6c 46 69 6c 74 65 72 20 3d 20 69 43  >iColFilter = iC
16d80 6f 6c 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  ol;..  return SQ
16d90 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
16da0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
16db0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 4d  is called on a M
16dc0 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 74 68  ultiSegReader th
16dd0 61 74 20 68 61 73 20 62 65 65 6e 20 73 74 61 72  at has been star
16de0 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c  ted using.** sql
16df0 69 74 65 33 46 74 73 33 4d 73 72 49 6e 63 72 53  ite3Fts3MsrIncrS
16e00 74 61 72 74 28 29 2e 20 4f 6e 65 20 6f 72 20 6d  tart(). One or m
16e10 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20 4d 73 72  ore calls to Msr
16e20 49 6e 63 72 4e 65 78 74 28 29 20 6d 61 79 20 61  IncrNext() may a
16e30 6c 73 6f 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e  lso.** have been
16e40 20 6d 61 64 65 2e 20 43 61 6c 6c 69 6e 67 20 74   made. Calling t
16e50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 75 74  his function put
16e60 73 20 74 68 65 20 4d 75 6c 74 69 53 65 67 52 65  s the MultiSegRe
16e70 61 64 65 72 20 69 6e 20 73 75 63 68 0a 2a 2a 20  ader in such.** 
16e80 61 20 73 74 61 74 65 20 74 68 61 74 20 69 66 20  a state that if 
16e90 74 68 65 20 6e 65 78 74 20 74 77 6f 20 63 61 6c  the next two cal
16ea0 6c 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  ls are:.**.**   
16eb0 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
16ec0 61 64 65 72 53 74 61 72 74 28 29 0a 2a 2a 20 20  aderStart().**  
16ed0 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
16ee0 65 61 64 65 72 53 74 65 70 28 29 0a 2a 2a 0a 2a  eaderStep().**.*
16ef0 2a 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72  * then the entir
16f00 65 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68  e doclist for th
16f10 65 20 74 65 72 6d 20 69 73 20 61 76 61 69 6c 61  e term is availa
16f20 62 6c 65 20 69 6e 20 0a 2a 2a 20 4d 75 6c 74 69  ble in .** Multi
16f30 53 65 67 52 65 61 64 65 72 2e 61 44 6f 63 6c 69  SegReader.aDocli
16f40 73 74 2f 6e 44 6f 63 6c 69 73 74 2e 0a 2a 2f 0a  st/nDoclist..*/.
16f50 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 4d  int sqlite3Fts3M
16f60 73 72 49 6e 63 72 52 65 73 74 61 72 74 28 46 74  srIncrRestart(Ft
16f70 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
16f80 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74 20 69   *pCsr){.  int i
16f90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16fa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
16fb0 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
16fc0 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 2d 72 65  rough segment-re
16fd0 61 64 65 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65  aders */..  asse
16fe0 72 74 28 20 70 43 73 72 2d 3e 7a 54 65 72 6d 3d  rt( pCsr->zTerm=
16ff0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
17000 70 43 73 72 2d 3e 6e 54 65 72 6d 3d 3d 30 20 29  pCsr->nTerm==0 )
17010 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72  ;.  assert( pCsr
17020 2d 3e 61 44 6f 63 6c 69 73 74 3d 3d 30 20 29 3b  ->aDoclist==0 );
17030 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d  .  assert( pCsr-
17040 3e 6e 44 6f 63 6c 69 73 74 3d 3d 30 20 29 3b 0a  >nDoclist==0 );.
17050 0a 20 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63  .  pCsr->nAdvanc
17060 65 20 3d 20 30 3b 0a 20 20 70 43 73 72 2d 3e 62  e = 0;.  pCsr->b
17070 52 65 73 74 61 72 74 20 3d 20 31 3b 0a 20 20 66  Restart = 1;.  f
17080 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e  or(i=0; i<pCsr->
17090 6e 53 65 67 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a  nSegment; i++){.
170a0 20 20 20 20 70 43 73 72 2d 3e 61 70 53 65 67 6d      pCsr->apSegm
170b0 65 6e 74 5b 69 5d 2d 3e 70 4f 66 66 73 65 74 4c  ent[i]->pOffsetL
170c0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 70 43 73  ist = 0;.    pCs
170d0 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69 5d 2d  r->apSegment[i]-
170e0 3e 6e 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 30  >nOffsetList = 0
170f0 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 70 53 65  ;.    pCsr->apSe
17100 67 6d 65 6e 74 5b 69 5d 2d 3e 69 44 6f 63 69 64  gment[i]->iDocid
17110 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   = 0;.  }..  ret
17120 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17130 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ...int sqlite3Ft
17140 73 33 53 65 67 52 65 61 64 65 72 53 74 65 70 28  s3SegReaderStep(
17150 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
17160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17170 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
17180 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
17190 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
171a0 65 72 20 2a 70 43 73 72 20 20 20 20 20 20 20 20  er *pCsr        
171b0 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65 63 74  /* Cursor object
171c0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
171d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
171e0 69 6e 74 20 69 73 49 67 6e 6f 72 65 45 6d 70 74  int isIgnoreEmpt
171f0 79 20 3d 20 20 28 70 43 73 72 2d 3e 70 46 69 6c  y =  (pCsr->pFil
17200 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
17210 33 5f 53 45 47 4d 45 4e 54 5f 49 47 4e 4f 52 45  3_SEGMENT_IGNORE
17220 5f 45 4d 50 54 59 29 3b 0a 20 20 69 6e 74 20 69  _EMPTY);.  int i
17230 73 52 65 71 75 69 72 65 50 6f 73 20 3d 20 20 20  sRequirePos =   
17240 28 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e  (pCsr->pFilter->
17250 66 6c 61 67 73 20 26 20 46 54 53 33 5f 53 45 47  flags & FTS3_SEG
17260 4d 45 4e 54 5f 52 45 51 55 49 52 45 5f 50 4f 53  MENT_REQUIRE_POS
17270 29 3b 0a 20 20 69 6e 74 20 69 73 43 6f 6c 46 69  );.  int isColFi
17280 6c 74 65 72 20 3d 20 20 20 20 28 70 43 73 72 2d  lter =    (pCsr-
17290 3e 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20  >pFilter->flags 
172a0 26 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 43  & FTS3_SEGMENT_C
172b0 4f 4c 55 4d 4e 5f 46 49 4c 54 45 52 29 3b 0a 20  OLUMN_FILTER);. 
172c0 20 69 6e 74 20 69 73 50 72 65 66 69 78 20 3d 20   int isPrefix = 
172d0 20 20 20 20 20 20 28 70 43 73 72 2d 3e 70 46 69        (pCsr->pFi
172e0 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  lter->flags & FT
172f0 53 33 5f 53 45 47 4d 45 4e 54 5f 50 52 45 46 49  S3_SEGMENT_PREFI
17300 58 29 3b 0a 20 20 69 6e 74 20 69 73 53 63 61 6e  X);.  int isScan
17310 20 3d 20 20 20 20 20 20 20 20 20 28 70 43 73 72   =         (pCsr
17320 2d 3e 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73  ->pFilter->flags
17330 20 26 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f   & FTS3_SEGMENT_
17340 53 43 41 4e 29 3b 0a 20 20 69 6e 74 20 69 73 46  SCAN);.  int isF
17350 69 72 73 74 20 3d 20 20 20 20 20 20 20 20 28 70  irst =        (p
17360 43 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e 66 6c  Csr->pFilter->fl
17370 61 67 73 20 26 20 46 54 53 33 5f 53 45 47 4d 45  ags & FTS3_SEGME
17380 4e 54 5f 46 49 52 53 54 29 3b 0a 0a 20 20 46 74  NT_FIRST);..  Ft
17390 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a 61 70  s3SegReader **ap
173a0 53 65 67 6d 65 6e 74 20 3d 20 70 43 73 72 2d 3e  Segment = pCsr->
173b0 61 70 53 65 67 6d 65 6e 74 3b 0a 20 20 69 6e 74  apSegment;.  int
173c0 20 6e 53 65 67 6d 65 6e 74 20 3d 20 70 43 73 72   nSegment = pCsr
173d0 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 46 74  ->nSegment;.  Ft
173e0 73 33 53 65 67 46 69 6c 74 65 72 20 2a 70 46 69  s3SegFilter *pFi
173f0 6c 74 65 72 20 3d 20 70 43 73 72 2d 3e 70 46 69  lter = pCsr->pFi
17400 6c 74 65 72 3b 0a 20 20 69 6e 74 20 28 2a 78 43  lter;.  int (*xC
17410 6d 70 29 28 46 74 73 33 53 65 67 52 65 61 64 65  mp)(Fts3SegReade
17420 72 20 2a 2c 20 46 74 73 33 53 65 67 52 65 61 64  r *, Fts3SegRead
17430 65 72 20 2a 29 20 3d 20 28 0a 20 20 20 20 70 2d  er *) = (.    p-
17440 3e 62 44 65 73 63 49 64 78 20 3f 20 66 74 73 33  >bDescIdx ? fts3
17450 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74  SegReaderDoclist
17460 43 6d 70 52 65 76 20 3a 20 66 74 73 33 53 65 67  CmpRev : fts3Seg
17470 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70  ReaderDoclistCmp
17480 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 73  .  );..  if( pCs
17490 72 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 30 20 29  r->nSegment==0 )
174a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
174b0 4b 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69  K;..  do {.    i
174c0 6e 74 20 6e 4d 65 72 67 65 3b 0a 20 20 20 20 69  nt nMerge;.    i
174d0 6e 74 20 69 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  nt i;.  .    /* 
174e0 41 64 76 61 6e 63 65 20 74 68 65 20 66 69 72 73  Advance the firs
174f0 74 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65  t pCsr->nAdvance
17500 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
17510 61 70 53 65 67 6d 65 6e 74 5b 5d 20 61 72 72 61  apSegment[] arra
17520 79 0a 20 20 20 20 2a 2a 20 66 6f 72 77 61 72 64  y.    ** forward
17530 2e 20 54 68 65 6e 20 73 6f 72 74 20 74 68 65 20  . Then sort the 
17540 6c 69 73 74 20 69 6e 20 6f 72 64 65 72 20 6f 66  list in order of
17550 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 61 67   current term ag
17560 61 69 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20  ain.  .    */.  
17570 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73    for(i=0; i<pCs
17580 72 2d 3e 6e 41 64 76 61 6e 63 65 3b 20 69 2b 2b  r->nAdvance; i++
17590 29 7b 0a 20 20 20 20 20 20 46 74 73 33 53 65 67  ){.      Fts3Seg
175a0 52 65 61 64 65 72 20 2a 70 53 65 67 20 3d 20 61  Reader *pSeg = a
175b0 70 53 65 67 6d 65 6e 74 5b 69 5d 3b 0a 20 20 20  pSegment[i];.   
175c0 20 20 20 69 66 28 20 70 53 65 67 2d 3e 62 4c 6f     if( pSeg->bLo
175d0 6f 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 20 20  okup ){.        
175e0 66 74 73 33 53 65 67 52 65 61 64 65 72 53 65 74  fts3SegReaderSet
175f0 45 6f 66 28 70 53 65 67 29 3b 0a 20 20 20 20 20  Eof(pSeg);.     
17600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17610 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64  rc = fts3SegRead
17620 65 72 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20  erNext(p, pSeg, 
17630 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
17640 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17650 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
17660 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 33 53  .    }.    fts3S
17670 65 67 52 65 61 64 65 72 53 6f 72 74 28 61 70 53  egReaderSort(apS
17680 65 67 6d 65 6e 74 2c 20 6e 53 65 67 6d 65 6e 74  egment, nSegment
17690 2c 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65  , pCsr->nAdvance
176a0 2c 20 66 74 73 33 53 65 67 52 65 61 64 65 72 43  , fts3SegReaderC
176b0 6d 70 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 6e  mp);.    pCsr->n
176c0 41 64 76 61 6e 63 65 20 3d 20 30 3b 0a 0a 20 20  Advance = 0;..  
176d0 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20    /* If all the 
176e0 73 65 67 2d 72 65 61 64 65 72 73 20 61 72 65 20  seg-readers are 
176f0 61 74 20 45 4f 46 2c 20 77 65 27 72 65 20 66 69  at EOF, we're fi
17700 6e 69 73 68 65 64 2e 20 72 65 74 75 72 6e 20 53  nished. return S
17710 51 4c 49 54 45 5f 4f 4b 2e 20 2a 2f 0a 20 20 20  QLITE_OK. */.   
17720 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
17730 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 69 66  ITE_OK );.    if
17740 28 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e  ( apSegment[0]->
17750 61 4e 6f 64 65 3d 3d 30 20 29 20 62 72 65 61 6b  aNode==0 ) break
17760 3b 0a 0a 20 20 20 20 70 43 73 72 2d 3e 6e 54 65  ;..    pCsr->nTe
17770 72 6d 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 30  rm = apSegment[0
17780 5d 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 70 43  ]->nTerm;.    pC
17790 73 72 2d 3e 7a 54 65 72 6d 20 3d 20 61 70 53 65  sr->zTerm = apSe
177a0 67 6d 65 6e 74 5b 30 5d 2d 3e 7a 54 65 72 6d 3b  gment[0]->zTerm;
177b0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
177c0 20 69 73 20 61 20 70 72 65 66 69 78 2d 73 65 61   is a prefix-sea
177d0 72 63 68 2c 20 61 6e 64 20 69 66 20 74 68 65 20  rch, and if the 
177e0 74 65 72 6d 20 74 68 61 74 20 61 70 53 65 67 6d  term that apSegm
177f0 65 6e 74 5b 30 5d 20 70 6f 69 6e 74 73 0a 20 20  ent[0] points.  
17800 20 20 2a 2a 20 74 6f 20 64 6f 65 73 20 6e 6f 74    ** to does not
17810 20 73 68 61 72 65 20 61 20 73 75 66 66 69 78 20   share a suffix 
17820 77 69 74 68 20 70 46 69 6c 74 65 72 2d 3e 7a 54  with pFilter->zT
17830 65 72 6d 2f 6e 54 65 72 6d 2c 20 74 68 65 6e 20  erm/nTerm, then 
17840 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 72 65 71 75  all .    ** requ
17850 69 72 65 64 20 63 61 6c 6c 62 61 63 6b 73 20 68  ired callbacks h
17860 61 76 65 20 62 65 65 6e 20 6d 61 64 65 2e 20 49  ave been made. I
17870 6e 20 74 68 69 73 20 63 61 73 65 20 65 78 69 74  n this case exit
17880 20 65 61 72 6c 79 2e 0a 20 20 20 20 2a 2a 0a 20   early..    **. 
17890 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c     ** Similarly,
178a0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73 65   if this is a se
178b0 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 61 63  arch for an exac
178c0 74 20 6d 61 74 63 68 2c 20 61 6e 64 20 74 68 65  t match, and the
178d0 20 66 69 72 73 74 20 74 65 72 6d 0a 20 20 20 20   first term.    
178e0 2a 2a 20 6f 66 20 73 65 67 6d 65 6e 74 20 61 70  ** of segment ap
178f0 53 65 67 6d 65 6e 74 5b 30 5d 20 69 73 20 6e 6f  Segment[0] is no
17900 74 20 61 20 6d 61 74 63 68 2c 20 65 78 69 74 20  t a match, exit 
17910 65 61 72 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  early..    */.  
17920 20 20 69 66 28 20 70 46 69 6c 74 65 72 2d 3e 7a    if( pFilter->z
17930 54 65 72 6d 20 26 26 20 21 69 73 53 63 61 6e 20  Term && !isScan 
17940 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 73  ){.      if( pCs
17950 72 2d 3e 6e 54 65 72 6d 3c 70 46 69 6c 74 65 72  r->nTerm<pFilter
17960 2d 3e 6e 54 65 72 6d 20 0a 20 20 20 20 20 20 20  ->nTerm .       
17970 7c 7c 20 28 21 69 73 50 72 65 66 69 78 20 26 26  || (!isPrefix &&
17980 20 70 43 73 72 2d 3e 6e 54 65 72 6d 3e 70 46 69   pCsr->nTerm>pFi
17990 6c 74 65 72 2d 3e 6e 54 65 72 6d 29 0a 20 20 20  lter->nTerm).   
179a0 20 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 43      || memcmp(pC
179b0 73 72 2d 3e 7a 54 65 72 6d 2c 20 70 46 69 6c 74  sr->zTerm, pFilt
179c0 65 72 2d 3e 7a 54 65 72 6d 2c 20 70 46 69 6c 74  er->zTerm, pFilt
179d0 65 72 2d 3e 6e 54 65 72 6d 29 20 0a 20 20 20 20  er->nTerm) .    
179e0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65    ){.        bre
179f0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
17a00 7d 0a 0a 20 20 20 20 6e 4d 65 72 67 65 20 3d 20  }..    nMerge = 
17a10 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 4d  1;.    while( nM
17a20 65 72 67 65 3c 6e 53 65 67 6d 65 6e 74 20 0a 20  erge<nSegment . 
17a30 20 20 20 20 20 20 20 26 26 20 61 70 53 65 67 6d         && apSegm
17a40 65 6e 74 5b 6e 4d 65 72 67 65 5d 2d 3e 61 4e 6f  ent[nMerge]->aNo
17a50 64 65 0a 20 20 20 20 20 20 20 20 26 26 20 61 70  de.        && ap
17a60 53 65 67 6d 65 6e 74 5b 6e 4d 65 72 67 65 5d 2d  Segment[nMerge]-
17a70 3e 6e 54 65 72 6d 3d 3d 70 43 73 72 2d 3e 6e 54  >nTerm==pCsr->nT
17a80 65 72 6d 20 0a 20 20 20 20 20 20 20 20 26 26 20  erm .        && 
17a90 30 3d 3d 6d 65 6d 63 6d 70 28 70 43 73 72 2d 3e  0==memcmp(pCsr->
17aa0 7a 54 65 72 6d 2c 20 61 70 53 65 67 6d 65 6e 74  zTerm, apSegment
17ab0 5b 6e 4d 65 72 67 65 5d 2d 3e 7a 54 65 72 6d 2c  [nMerge]->zTerm,
17ac0 20 70 43 73 72 2d 3e 6e 54 65 72 6d 29 0a 20 20   pCsr->nTerm).  
17ad0 20 20 29 7b 0a 20 20 20 20 20 20 6e 4d 65 72 67    ){.      nMerg
17ae0 65 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  e++;.    }..    
17af0 61 73 73 65 72 74 28 20 69 73 49 67 6e 6f 72 65  assert( isIgnore
17b00 45 6d 70 74 79 20 7c 7c 20 28 69 73 52 65 71 75  Empty || (isRequ
17b10 69 72 65 50 6f 73 20 26 26 20 21 69 73 43 6f 6c  irePos && !isCol
17b20 46 69 6c 74 65 72 29 20 29 3b 0a 20 20 20 20 69  Filter) );.    i
17b30 66 28 20 6e 4d 65 72 67 65 3d 3d 31 20 0a 20 20  f( nMerge==1 .  
17b40 20 20 20 26 26 20 21 69 73 49 67 6e 6f 72 65 45     && !isIgnoreE
17b50 6d 70 74 79 20 0a 20 20 20 20 20 26 26 20 21 69  mpty .     && !i
17b60 73 46 69 72 73 74 20 0a 20 20 20 20 20 26 26 20  sFirst .     && 
17b70 28 70 2d 3e 62 44 65 73 63 49 64 78 3d 3d 30 20  (p->bDescIdx==0 
17b80 7c 7c 20 66 74 73 33 53 65 67 52 65 61 64 65 72  || fts3SegReader
17b90 49 73 50 65 6e 64 69 6e 67 28 61 70 53 65 67 6d  IsPending(apSegm
17ba0 65 6e 74 5b 30 5d 29 3d 3d 30 29 0a 20 20 20 20  ent[0])==0).    
17bb0 29 7b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 6e  ){.      pCsr->n
17bc0 44 6f 63 6c 69 73 74 20 3d 20 61 70 53 65 67 6d  Doclist = apSegm
17bd0 65 6e 74 5b 30 5d 2d 3e 6e 44 6f 63 6c 69 73 74  ent[0]->nDoclist
17be0 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 33  ;.      if( fts3
17bf0 53 65 67 52 65 61 64 65 72 49 73 50 65 6e 64 69  SegReaderIsPendi
17c00 6e 67 28 61 70 53 65 67 6d 65 6e 74 5b 30 5d 29  ng(apSegment[0])
17c10 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
17c20 20 66 74 73 33 4d 73 72 42 75 66 66 65 72 44 61   fts3MsrBufferDa
17c30 74 61 28 70 43 73 72 2c 20 61 70 53 65 67 6d 65  ta(pCsr, apSegme
17c40 6e 74 5b 30 5d 2d 3e 61 44 6f 63 6c 69 73 74 2c  nt[0]->aDoclist,
17c50 20 70 43 73 72 2d 3e 6e 44 6f 63 6c 69 73 74 29   pCsr->nDoclist)
17c60 3b 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e  ;.        pCsr->
17c70 61 44 6f 63 6c 69 73 74 20 3d 20 70 43 73 72 2d  aDoclist = pCsr-
17c80 3e 61 42 75 66 66 65 72 3b 0a 20 20 20 20 20 20  >aBuffer;.      
17c90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
17ca0 43 73 72 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20  Csr->aDoclist = 
17cb0 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 61 44  apSegment[0]->aD
17cc0 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a  oclist;.      }.
17cd0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
17ce0 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53  LITE_OK ) rc = S
17cf0 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 20 20 7d  QLITE_ROW;.    }
17d00 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
17d10 6e 44 6f 63 6c 69 73 74 20 3d 20 30 3b 20 20 20  nDoclist = 0;   
17d20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
17d30 6f 66 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20  of doclist */.  
17d40 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
17d50 34 20 69 50 72 65 76 20 3d 20 30 3b 20 20 20 20  4 iPrev = 0;    
17d60 2f 2a 20 50 72 65 76 69 6f 75 73 20 64 6f 63 69  /* Previous doci
17d70 64 20 73 74 6f 72 65 64 20 69 6e 20 64 6f 63 6c  d stored in docl
17d80 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ist */..      /*
17d90 20 54 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   The current ter
17da0 6d 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6e  m of the first n
17db0 4d 65 72 67 65 20 65 6e 74 72 69 65 73 20 69 6e  Merge entries in
17dc0 20 74 68 65 20 61 72 72 61 79 0a 20 20 20 20 20   the array.     
17dd0 20 2a 2a 20 6f 66 20 46 74 73 33 53 65 67 52 65   ** of Fts3SegRe
17de0 61 64 65 72 20 6f 62 6a 65 63 74 73 20 69 73 20  ader objects is 
17df0 74 68 65 20 73 61 6d 65 2e 20 54 68 65 20 64 6f  the same. The do
17e00 63 6c 69 73 74 73 20 6d 75 73 74 20 62 65 20 6d  clists must be m
17e10 65 72 67 65 64 0a 20 20 20 20 20 20 2a 2a 20 61  erged.      ** a
17e20 6e 64 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d  nd a single term
17e30 20 72 65 74 75 72 6e 65 64 20 77 69 74 68 20 74   returned with t
17e40 68 65 20 6d 65 72 67 65 64 20 64 6f 63 6c 69 73  he merged doclis
17e50 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
17e60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4d 65    for(i=0; i<nMe
17e70 72 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rge; i++){.     
17e80 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72     fts3SegReader
17e90 46 69 72 73 74 44 6f 63 69 64 28 70 2c 20 61 70  FirstDocid(p, ap
17ea0 53 65 67 6d 65 6e 74 5b 69 5d 29 3b 0a 20 20 20  Segment[i]);.   
17eb0 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 33 53     }.      fts3S
17ec0 65 67 52 65 61 64 65 72 53 6f 72 74 28 61 70 53  egReaderSort(apS
17ed0 65 67 6d 65 6e 74 2c 20 6e 4d 65 72 67 65 2c 20  egment, nMerge, 
17ee0 6e 4d 65 72 67 65 2c 20 78 43 6d 70 29 3b 0a 20  nMerge, xCmp);. 
17ef0 20 20 20 20 20 77 68 69 6c 65 28 20 61 70 53 65       while( apSe
17f00 67 6d 65 6e 74 5b 30 5d 2d 3e 70 4f 66 66 73 65  gment[0]->pOffse
17f10 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  tList ){.       
17f20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
17f30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
17f40 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73  mber of segments
17f50 20 74 68 61 74 20 73 68 61 72 65 20 61 20 64 6f   that share a do
17f60 63 69 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  cid */.        c
17f70 68 61 72 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a  har *pList = 0;.
17f80 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 73          int nLis
17f90 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  t = 0;.        i
17fa0 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20  nt nByte;.      
17fb0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
17fc0 69 44 6f 63 69 64 20 3d 20 61 70 53 65 67 6d 65  iDocid = apSegme
17fd0 6e 74 5b 30 5d 2d 3e 69 44 6f 63 69 64 3b 0a 20  nt[0]->iDocid;. 
17fe0 20 20 20 20 20 20 20 66 74 73 33 53 65 67 52 65         fts3SegRe
17ff0 61 64 65 72 4e 65 78 74 44 6f 63 69 64 28 70 2c  aderNextDocid(p,
18000 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2c 20 26   apSegment[0], &
18010 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a  pList, &nList);.
18020 20 20 20 20 20 20 20 20 6a 20 3d 20 31 3b 0a 20          j = 1;. 
18030 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3c         while( j<
18040 6e 4d 65 72 67 65 0a 20 20 20 20 20 20 20 20 20  nMerge.         
18050 20 20 20 26 26 20 61 70 53 65 67 6d 65 6e 74 5b     && apSegment[
18060 6a 5d 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 0a  j]->pOffsetList.
18070 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 61              && a
18080 70 53 65 67 6d 65 6e 74 5b 6a 5d 2d 3e 69 44 6f  pSegment[j]->iDo
18090 63 69 64 3d 3d 69 44 6f 63 69 64 0a 20 20 20 20  cid==iDocid.    
180a0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
180b0 20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e 65   fts3SegReaderNe
180c0 78 74 44 6f 63 69 64 28 70 2c 20 61 70 53 65 67  xtDocid(p, apSeg
180d0 6d 65 6e 74 5b 6a 5d 2c 20 30 2c 20 30 29 3b 0a  ment[j], 0, 0);.
180e0 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
180f0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
18100 20 20 69 66 28 20 69 73 43 6f 6c 46 69 6c 74 65    if( isColFilte
18110 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  r ){.          f
18120 74 73 33 43 6f 6c 75 6d 6e 46 69 6c 74 65 72 28  ts3ColumnFilter(
18130 70 46 69 6c 74 65 72 2d 3e 69 43 6f 6c 2c 20 30  pFilter->iCol, 0
18140 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74  , &pList, &nList
18150 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
18160 20 20 20 20 20 20 69 66 28 20 21 69 73 49 67 6e        if( !isIgn
18170 6f 72 65 45 6d 70 74 79 20 7c 7c 20 6e 4c 69 73  oreEmpty || nLis
18180 74 3e 30 20 29 7b 0a 0a 20 20 20 20 20 20 20 20  t>0 ){..        
18190 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74    /* Calculate t
181a0 68 65 20 27 64 6f 63 69 64 27 20 64 65 6c 74 61  he 'docid' delta
181b0 20 76 61 6c 75 65 20 74 6f 20 77 72 69 74 65 20   value to write 
181c0 69 6e 74 6f 20 74 68 65 20 6d 65 72 67 65 64 20  into the merged 
181d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 6f  .          ** do
181e0 63 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20  clist. */.      
181f0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
18200 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  4 iDelta;.      
18210 20 20 20 20 69 66 28 20 70 2d 3e 62 44 65 73 63      if( p->bDesc
18220 49 64 78 20 26 26 20 6e 44 6f 63 6c 69 73 74 3e  Idx && nDoclist>
18230 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
18240 20 69 44 65 6c 74 61 20 3d 20 69 50 72 65 76 20   iDelta = iPrev 
18250 2d 20 69 44 6f 63 69 64 3b 0a 20 20 20 20 20 20  - iDocid;.      
18260 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18270 20 20 20 20 20 20 20 69 44 65 6c 74 61 20 3d 20         iDelta = 
18280 69 44 6f 63 69 64 20 2d 20 69 50 72 65 76 3b 0a  iDocid - iPrev;.
18290 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
182a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 44        assert( iD
182b0 65 6c 74 61 3e 30 20 7c 7c 20 28 6e 44 6f 63 6c  elta>0 || (nDocl
182c0 69 73 74 3d 3d 30 20 26 26 20 69 44 65 6c 74 61  ist==0 && iDelta
182d0 3d 3d 69 44 6f 63 69 64 29 20 29 3b 0a 20 20 20  ==iDocid) );.   
182e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
182f0 44 6f 63 6c 69 73 74 3e 30 20 7c 7c 20 69 44 65  Doclist>0 || iDe
18300 6c 74 61 3d 3d 69 44 6f 63 69 64 20 29 3b 0a 0a  lta==iDocid );..
18310 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 20            nByte 
18320 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72  = sqlite3Fts3Var
18330 69 6e 74 4c 65 6e 28 69 44 65 6c 74 61 29 20 2b  intLen(iDelta) +
18340 20 28 69 73 52 65 71 75 69 72 65 50 6f 73 3f 6e   (isRequirePos?n
18350 4c 69 73 74 2b 31 3a 30 29 3b 0a 20 20 20 20 20  List+1:0);.     
18360 20 20 20 20 20 69 66 28 20 6e 44 6f 63 6c 69 73       if( nDoclis
18370 74 2b 6e 42 79 74 65 3e 70 43 73 72 2d 3e 6e 42  t+nByte>pCsr->nB
18380 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20  uffer ){.       
18390 20 20 20 20 20 63 68 61 72 20 2a 61 4e 65 77 3b       char *aNew;
183a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 73  .            pCs
183b0 72 2d 3e 6e 42 75 66 66 65 72 20 3d 20 28 6e 44  r->nBuffer = (nD
183c0 6f 63 6c 69 73 74 2b 6e 42 79 74 65 29 2a 32 3b  oclist+nByte)*2;
183d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 4e 65  .            aNe
183e0 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
183f0 6c 6f 63 28 70 43 73 72 2d 3e 61 42 75 66 66 65  loc(pCsr->aBuffe
18400 72 2c 20 70 43 73 72 2d 3e 6e 42 75 66 66 65 72  r, pCsr->nBuffer
18410 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
18420 66 28 20 21 61 4e 65 77 20 29 7b 0a 20 20 20 20  f( !aNew ){.    
18430 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
18440 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
18450 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
18460 20 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 61           pCsr->a
18470 42 75 66 66 65 72 20 3d 20 61 4e 65 77 3b 0a 20  Buffer = aNew;. 
18480 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
18490 20 20 20 20 20 20 69 66 28 20 69 73 46 69 72 73        if( isFirs
184a0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
184b0 20 63 68 61 72 20 2a 61 20 3d 20 26 70 43 73 72   char *a = &pCsr
184c0 2d 3e 61 42 75 66 66 65 72 5b 6e 44 6f 63 6c 69  ->aBuffer[nDocli
184d0 73 74 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  st];.           
184e0 20 69 6e 74 20 6e 57 72 69 74 65 3b 0a 20 20 20   int nWrite;.   
184f0 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
18500 20 20 20 20 20 6e 57 72 69 74 65 20 3d 20 73 71       nWrite = sq
18510 6c 69 74 65 33 46 74 73 33 46 69 72 73 74 46 69  lite3Fts3FirstFi
18520 6c 74 65 72 28 69 44 65 6c 74 61 2c 20 70 4c 69  lter(iDelta, pLi
18530 73 74 2c 20 6e 4c 69 73 74 2c 20 61 29 3b 0a 20  st, nList, a);. 
18540 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e             if( n
18550 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 20  Write ){.       
18560 20 20 20 20 20 20 20 69 50 72 65 76 20 3d 20 69         iPrev = i
18570 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20 20  Docid;.         
18580 20 20 20 20 20 6e 44 6f 63 6c 69 73 74 20 2b 3d       nDoclist +=
18590 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20   nWrite;.       
185a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
185b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
185c0 20 20 20 20 6e 44 6f 63 6c 69 73 74 20 2b 3d 20      nDoclist += 
185d0 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
185e0 72 69 6e 74 28 26 70 43 73 72 2d 3e 61 42 75 66  rint(&pCsr->aBuf
185f0 66 65 72 5b 6e 44 6f 63 6c 69 73 74 5d 2c 20 69  fer[nDoclist], i
18600 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20  Delta);.        
18610 20 20 20 20 69 50 72 65 76 20 3d 20 69 44 6f 63      iPrev = iDoc
18620 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  id;.            
18630 69 66 28 20 69 73 52 65 71 75 69 72 65 50 6f 73  if( isRequirePos
18640 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
18650 20 20 6d 65 6d 63 70 79 28 26 70 43 73 72 2d 3e    memcpy(&pCsr->
18660 61 42 75 66 66 65 72 5b 6e 44 6f 63 6c 69 73 74  aBuffer[nDoclist
18670 5d 2c 20 70 4c 69 73 74 2c 20 6e 4c 69 73 74 29  ], pList, nList)
18680 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
18690 6e 44 6f 63 6c 69 73 74 20 2b 3d 20 6e 4c 69 73  nDoclist += nLis
186a0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
186b0 20 70 43 73 72 2d 3e 61 42 75 66 66 65 72 5b 6e   pCsr->aBuffer[n
186c0 44 6f 63 6c 69 73 74 2b 2b 5d 20 3d 20 27 5c 30  Doclist++] = '\0
186d0 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ';.            }
186e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
186f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
18700 66 74 73 33 53 65 67 52 65 61 64 65 72 53 6f 72  fts3SegReaderSor
18710 74 28 61 70 53 65 67 6d 65 6e 74 2c 20 6e 4d 65  t(apSegment, nMe
18720 72 67 65 2c 20 6a 2c 20 78 43 6d 70 29 3b 0a 20  rge, j, xCmp);. 
18730 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18740 20 6e 44 6f 63 6c 69 73 74 3e 30 20 29 7b 0a 20   nDoclist>0 ){. 
18750 20 20 20 20 20 20 20 70 43 73 72 2d 3e 61 44 6f         pCsr->aDo
18760 63 6c 69 73 74 20 3d 20 70 43 73 72 2d 3e 61 42  clist = pCsr->aB
18770 75 66 66 65 72 3b 0a 20 20 20 20 20 20 20 20 70  uffer;.        p
18780 43 73 72 2d 3e 6e 44 6f 63 6c 69 73 74 20 3d 20  Csr->nDoclist = 
18790 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20  nDoclist;.      
187a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f    rc = SQLITE_RO
187b0 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  W;.      }.    }
187c0 0a 20 20 20 20 70 43 73 72 2d 3e 6e 41 64 76 61  .    pCsr->nAdva
187d0 6e 63 65 20 3d 20 6e 4d 65 72 67 65 3b 0a 20 20  nce = nMerge;.  
187e0 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
187f0 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 72 65 74 75  TE_OK );..  retu
18800 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 76 6f 69 64 20  rn rc;.}...void 
18810 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
18820 61 64 65 72 46 69 6e 69 73 68 28 0a 20 20 46 74  aderFinish(.  Ft
18830 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
18840 20 2a 70 43 73 72 20 20 20 20 20 20 20 2f 2a 20   *pCsr       /* 
18850 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  Cursor object */
18860 0a 29 7b 0a 20 20 69 66 28 20 70 43 73 72 20 29  .){.  if( pCsr )
18870 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
18880 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72   for(i=0; i<pCsr
18890 2d 3e 6e 53 65 67 6d 65 6e 74 3b 20 69 2b 2b 29  ->nSegment; i++)
188a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  {.      sqlite3F
188b0 74 73 33 53 65 67 52 65 61 64 65 72 46 72 65 65  ts3SegReaderFree
188c0 28 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74  (pCsr->apSegment
188d0 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
188e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73  sqlite3_free(pCs
188f0 72 2d 3e 61 70 53 65 67 6d 65 6e 74 29 3b 0a 20  r->apSegment);. 
18900 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
18910 70 43 73 72 2d 3e 61 42 75 66 66 65 72 29 3b 0a  pCsr->aBuffer);.
18920 0a 20 20 20 20 70 43 73 72 2d 3e 6e 53 65 67 6d  .    pCsr->nSegm
18930 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 43 73  ent = 0;.    pCs
18940 72 2d 3e 61 70 53 65 67 6d 65 6e 74 20 3d 20 30  r->apSegment = 0
18950 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 42 75 66  ;.    pCsr->aBuf
18960 66 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  fer = 0;.  }.}..
18970 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65  /*.** Decode the
18980 20 22 65 6e 64 5f 62 6c 6f 63 6b 22 20 66 69 65   "end_block" fie
18990 6c 64 2c 20 73 65 6c 65 63 74 65 64 20 62 79 20  ld, selected by 
189a0 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20 6f 66 20 74  column iCol of t
189b0 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74  he SELECT .** st
189c0 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
189d0 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
189e0 6d 65 6e 74 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ment. .**.** The
189f0 20 22 65 6e 64 5f 62 6c 6f 63 6b 22 20 66 69 65   "end_block" fie
18a00 6c 64 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65  ld may contain e
18a10 69 74 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72  ither an integer
18a20 2c 20 6f 72 20 61 20 74 65 78 74 20 66 69 65 6c  , or a text fiel
18a30 64 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20  d.** containing 
18a40 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65  the text represe
18a50 6e 74 61 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6e  ntation of two n
18a60 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65  on-negative inte
18a70 67 65 72 73 20 73 65 70 61 72 61 74 65 64 20 0a  gers separated .
18a80 2a 2a 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72  ** by one or mor
18a90 65 20 73 70 61 63 65 20 28 30 78 32 30 29 20 63  e space (0x20) c
18aa0 68 61 72 61 63 74 65 72 73 2e 20 49 6e 20 74 68  haracters. In th
18ab0 65 20 66 69 72 73 74 20 63 61 73 65 2c 20 73 65  e first case, se
18ac0 74 20 2a 70 69 45 6e 64 42 6c 6f 63 6b 20 0a 2a  t *piEndBlock .*
18ad0 2a 20 74 6f 20 74 68 65 20 69 6e 74 65 67 65 72  * to the integer
18ae0 20 76 61 6c 75 65 20 61 6e 64 20 2a 70 6e 42 79   value and *pnBy
18af0 74 65 20 74 6f 20 7a 65 72 6f 20 62 65 66 6f 72  te to zero befor
18b00 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 49 6e 20  e returning. In 
18b10 74 68 65 20 73 65 63 6f 6e 64 2c 20 0a 2a 2a 20  the second, .** 
18b20 73 65 74 20 2a 70 69 45 6e 64 42 6c 6f 63 6b 20  set *piEndBlock 
18b30 74 6f 20 74 68 65 20 66 69 72 73 74 20 76 61 6c  to the first val
18b40 75 65 20 61 6e 64 20 2a 70 6e 42 79 74 65 20 74  ue and *pnByte t
18b50 6f 20 74 68 65 20 73 65 63 6f 6e 64 2e 0a 2a 2f  o the second..*/
18b60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
18b70 33 52 65 61 64 45 6e 64 42 6c 6f 63 6b 46 69 65  3ReadEndBlockFie
18b80 6c 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  ld(.  sqlite3_st
18b90 6d 74 20 2a 70 53 74 6d 74 2c 20 0a 20 20 69 6e  mt *pStmt, .  in
18ba0 74 20 69 43 6f 6c 2c 20 0a 20 20 69 36 34 20 2a  t iCol, .  i64 *
18bb0 70 69 45 6e 64 42 6c 6f 63 6b 2c 0a 20 20 69 36  piEndBlock,.  i6
18bc0 34 20 2a 70 6e 42 79 74 65 0a 29 7b 0a 20 20 63  4 *pnByte.){.  c
18bd0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
18be0 61 72 20 2a 7a 54 65 78 74 20 3d 20 73 71 6c 69  ar *zText = sqli
18bf0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
18c00 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20  pStmt, iCol);.  
18c10 69 66 28 20 7a 54 65 78 74 20 29 7b 0a 20 20 20  if( zText ){.   
18c20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
18c30 69 4d 75 6c 20 3d 20 31 3b 0a 20 20 20 20 69 36  iMul = 1;.    i6
18c40 34 20 69 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20  4 iVal = 0;.    
18c50 66 6f 72 28 69 3d 30 3b 20 7a 54 65 78 74 5b 69  for(i=0; zText[i
18c60 5d 3e 3d 27 30 27 20 26 26 20 7a 54 65 78 74 5b  ]>='0' && zText[
18c70 69 5d 3c 3d 27 39 27 3b 20 69 2b 2b 29 7b 0a 20  i]<='9'; i++){. 
18c80 20 20 20 20 20 69 56 61 6c 20 3d 20 69 56 61 6c       iVal = iVal
18c90 2a 31 30 20 2b 20 28 7a 54 65 78 74 5b 69 5d 20  *10 + (zText[i] 
18ca0 2d 20 27 30 27 29 3b 0a 20 20 20 20 7d 0a 20 20  - '0');.    }.  
18cb0 20 20 2a 70 69 45 6e 64 42 6c 6f 63 6b 20 3d 20    *piEndBlock = 
18cc0 69 56 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28  iVal;.    while(
18cd0 20 7a 54 65 78 74 5b 69 5d 3d 3d 27 20 27 20 29   zText[i]==' ' )
18ce0 20 69 2b 2b 3b 0a 20 20 20 20 69 56 61 6c 20 3d   i++;.    iVal =
18cf0 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 78   0;.    if( zTex
18d00 74 5b 69 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  t[i]=='-' ){.   
18d10 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 4d     i++;.      iM
18d20 75 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  ul = -1;.    }. 
18d30 20 20 20 66 6f 72 28 2f 2a 20 6e 6f 2d 6f 70 20     for(/* no-op 
18d40 2a 2f 3b 20 7a 54 65 78 74 5b 69 5d 3e 3d 27 30  */; zText[i]>='0
18d50 27 20 26 26 20 7a 54 65 78 74 5b 69 5d 3c 3d 27  ' && zText[i]<='
18d60 39 27 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  9'; i++){.      
18d70 69 56 61 6c 20 3d 20 69 56 61 6c 2a 31 30 20 2b  iVal = iVal*10 +
18d80 20 28 7a 54 65 78 74 5b 69 5d 20 2d 20 27 30 27   (zText[i] - '0'
18d90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e  );.    }.    *pn
18da0 42 79 74 65 20 3d 20 28 69 56 61 6c 20 2a 20 28  Byte = (iVal * (
18db0 69 36 34 29 69 4d 75 6c 29 3b 0a 20 20 7d 0a 7d  i64)iMul);.  }.}
18dc0 0a 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 65 67 6d 65  .../*.** A segme
18dd0 6e 74 20 6f 66 20 73 69 7a 65 20 6e 42 79 74 65  nt of size nByte
18de0 20 62 79 74 65 73 20 68 61 73 20 6a 75 73 74 20   bytes has just 
18df0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
18e00 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 0a 2a  absolute level.*
18e10 2a 20 69 41 62 73 4c 65 76 65 6c 2e 20 50 72 6f  * iAbsLevel. Pro
18e20 6d 6f 74 65 20 61 6e 79 20 73 65 67 6d 65 6e 74  mote any segment
18e30 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  s that should be
18e40 20 70 72 6f 6d 6f 74 65 64 20 61 73 20 61 20 72   promoted as a r
18e50 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  esult..*/.static
18e60 20 69 6e 74 20 66 74 73 33 50 72 6f 6d 6f 74 65   int fts3Promote
18e70 53 65 67 6d 65 6e 74 73 28 0a 20 20 46 74 73 33  Segments(.  Fts3
18e80 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
18e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
18ea0 54 53 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  TS table handle 
18eb0 2a 2f 0a 20 20 69 6e 74 20 69 41 62 73 4c 65 76  */.  int iAbsLev
18ec0 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
18ed0 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65       /* Absolute
18ee0 20 6c 65 76 65 6c 20 6a 75 73 74 20 75 70 64 61   level just upda
18ef0 74 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ted */.  sqlite3
18f00 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 20 20 20  _int64 nByte    
18f10 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
18f20 20 6f 66 20 6e 65 77 20 73 65 67 6d 65 6e 74 20   of new segment 
18f30 61 74 20 69 41 62 73 4c 65 76 65 6c 20 2a 2f 0a  at iAbsLevel */.
18f40 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
18f50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74  LITE_OK;.  sqlit
18f60 65 33 5f 73 74 6d 74 20 2a 70 52 61 6e 67 65 3b  e3_stmt *pRange;
18f70 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  ..  rc = fts3Sql
18f80 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45  Stmt(p, SQL_SELE
18f90 43 54 5f 4c 45 56 45 4c 5f 52 41 4e 47 45 32 2c  CT_LEVEL_RANGE2,
18fa0 20 26 70 52 61 6e 67 65 2c 20 30 29 3b 0a 0a 20   &pRange, 0);.. 
18fb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18fc0 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 4f  OK ){.    int bO
18fd0 6b 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  k = 0;.    int i
18fe0 4c 61 73 74 20 3d 20 28 69 41 62 73 4c 65 76 65  Last = (iAbsLeve
18ff0 6c 2f 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41  l/FTS3_SEGDIR_MA
19000 58 4c 45 56 45 4c 20 2b 20 31 29 20 2a 20 46 54  XLEVEL + 1) * FT
19010 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56  S3_SEGDIR_MAXLEV
19020 45 4c 20 2d 20 31 3b 0a 20 20 20 20 69 36 34 20  EL - 1;.    i64 
19030 6e 4c 69 6d 69 74 20 3d 20 28 6e 42 79 74 65 2a  nLimit = (nByte*
19040 33 29 2f 32 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f  3)/2;..    /* Lo
19050 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 65  op through all e
19060 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 25 5f  ntries in the %_
19070 73 65 67 64 69 72 20 74 61 62 6c 65 20 63 6f 72  segdir table cor
19080 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 0a 20  responding to . 
19090 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 73 20 69     ** segments i
190a0 6e 20 74 68 69 73 20 69 6e 64 65 78 20 6f 6e 20  n this index on 
190b0 6c 65 76 65 6c 73 20 67 72 65 61 74 65 72 20 74  levels greater t
190c0 68 61 6e 20 69 41 62 73 4c 65 76 65 6c 2e 20 49  han iAbsLevel. I
190d0 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a  f there is.    *
190e0 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 73  * at least one s
190f0 75 63 68 20 73 65 67 6d 65 6e 74 2c 20 61 6e 64  uch segment, and
19100 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
19110 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 61  to determine tha
19120 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 73 75  t all .    ** su
19130 63 68 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20  ch segments are 
19140 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6e 4c 69  smaller than nLi
19150 6d 69 74 20 62 79 74 65 73 20 69 6e 20 73 69 7a  mit bytes in siz
19160 65 2c 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20  e, they will be 
19170 0a 20 20 20 20 2a 2a 20 70 72 6f 6d 6f 74 65 64  .    ** promoted
19180 20 74 6f 20 6c 65 76 65 6c 20 69 41 62 73 4c 65   to level iAbsLe
19190 76 65 6c 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c  vel.  */.    sql
191a0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 52  ite3_bind_int(pR
191b0 61 6e 67 65 2c 20 31 2c 20 69 41 62 73 4c 65 76  ange, 1, iAbsLev
191c0 65 6c 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  el+1);.    sqlit
191d0 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 52 61 6e  e3_bind_int(pRan
191e0 67 65 2c 20 32 2c 20 69 4c 61 73 74 29 3b 0a 20  ge, 2, iLast);. 
191f0 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45     while( SQLITE
19200 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
19210 65 70 28 70 52 61 6e 67 65 29 20 29 7b 0a 20 20  ep(pRange) ){.  
19220 20 20 20 20 69 36 34 20 6e 53 69 7a 65 2c 20 64      i64 nSize, d
19230 75 6d 6d 79 3b 0a 20 20 20 20 20 20 66 74 73 33  ummy;.      fts3
19240 52 65 61 64 45 6e 64 42 6c 6f 63 6b 46 69 65 6c  ReadEndBlockFiel
19250 64 28 70 52 61 6e 67 65 2c 20 32 2c 20 26 64 75  d(pRange, 2, &du
19260 6d 6d 79 2c 20 26 6e 53 69 7a 65 29 3b 0a 20 20  mmy, &nSize);.  
19270 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d 30      if( nSize<=0
19280 20 7c 7c 20 6e 53 69 7a 65 3e 6e 4c 69 6d 69 74   || nSize>nLimit
19290 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
192a0 66 20 6e 53 69 7a 65 3d 3d 30 2c 20 74 68 65 6e  f nSize==0, then
192b0 20 74 68 65 20 25 5f 73 65 67 64 69 72 2e 65 6e   the %_segdir.en
192c0 64 5f 62 6c 6f 63 6b 20 66 69 65 6c 64 20 64 6f  d_block field do
192d0 65 73 20 6e 6f 74 20 6e 6f 74 20 0a 20 20 20 20  es not not .    
192e0 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 61      ** contain a
192f0 20 73 69 7a 65 20 76 61 6c 75 65 2e 20 54 68 69   size value. Thi
19300 73 20 68 61 70 70 65 6e 73 20 69 66 20 69 74 20  s happens if it 
19310 77 61 73 20 77 72 69 74 74 65 6e 20 62 79 20 61  was written by a
19320 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6c 64  n.        ** old
19330 20 76 65 72 73 69 6f 6e 20 6f 66 20 46 54 53 2e   version of FTS.
19340 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   In this case it
19350 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
19360 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 20 20   to determine.  
19370 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69 7a        ** the siz
19380 65 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74  e of the segment
19390 2c 20 61 6e 64 20 73 6f 20 73 65 67 6d 65 6e 74  , and so segment
193a0 20 70 72 6f 6d 6f 74 69 6f 6e 20 64 6f 65 73 20   promotion does 
193b0 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  not.        ** t
193c0 61 6b 65 20 70 6c 61 63 65 2e 20 20 2a 2f 0a 20  ake place.  */. 
193d0 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 30 3b 0a         bOk = 0;.
193e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
193f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 4f 6b       }.      bOk
19400 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
19410 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
19420 65 74 28 70 52 61 6e 67 65 29 3b 0a 0a 20 20 20  et(pRange);..   
19430 20 69 66 28 20 62 4f 6b 20 29 7b 0a 20 20 20 20   if( bOk ){.    
19440 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a    int iIdx = 0;.
19450 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
19460 6d 74 20 2a 70 55 70 64 61 74 65 31 3b 0a 20 20  mt *pUpdate1;.  
19470 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
19480 20 2a 70 55 70 64 61 74 65 32 3b 0a 0a 20 20 20   *pUpdate2;..   
19490 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
194a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
194b0 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
194c0 28 70 2c 20 53 51 4c 5f 55 50 44 41 54 45 5f 4c  (p, SQL_UPDATE_L
194d0 45 56 45 4c 5f 49 44 58 2c 20 26 70 55 70 64 61  EVEL_IDX, &pUpda
194e0 74 65 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  te1, 0);.      }
194f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
19500 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19510 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c      rc = fts3Sql
19520 53 74 6d 74 28 70 2c 20 53 51 4c 5f 55 50 44 41  Stmt(p, SQL_UPDA
19530 54 45 5f 4c 45 56 45 4c 2c 20 26 70 55 70 64 61  TE_LEVEL, &pUpda
19540 74 65 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  te2, 0);.      }
19550 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ..      if( rc==
19560 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20  SQLITE_OK ){..  
19570 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
19580 72 6f 75 67 68 20 61 6c 6c 20 25 5f 73 65 67 64  rough all %_segd
19590 69 72 20 65 6e 74 72 69 65 73 20 66 6f 72 20 73  ir entries for s
195a0 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20  egments in this 
195b0 69 6e 64 65 78 20 77 69 74 68 0a 20 20 20 20 20  index with.     
195c0 20 20 20 2a 2a 20 6c 65 76 65 6c 73 20 65 71 75     ** levels equ
195d0 61 6c 20 74 6f 20 6f 72 20 67 72 65 61 74 65 72  al to or greater
195e0 20 74 68 61 6e 20 69 41 62 73 4c 65 76 65 6c 2e   than iAbsLevel.
195f0 20 41 73 20 65 61 63 68 20 65 6e 74 72 79 20 69   As each entry i
19600 73 20 76 69 73 69 74 65 64 2c 0a 20 20 20 20 20  s visited,.     
19610 20 20 20 2a 2a 20 75 70 64 61 74 65 64 20 69 74     ** updated it
19620 20 74 6f 20 73 65 74 20 28 6c 65 76 65 6c 20 3d   to set (level =
19630 20 2d 31 29 20 61 6e 64 20 28 69 64 78 20 3d 20   -1) and (idx = 
19640 4e 29 2c 20 77 68 65 72 65 20 4e 20 69 73 20 30  N), where N is 0
19650 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 20   for the.       
19660 20 2a 2a 20 6f 6c 64 65 73 74 20 73 65 67 6d 65   ** oldest segme
19670 6e 74 20 69 6e 20 74 68 65 20 72 61 6e 67 65 2c  nt in the range,
19680 20 31 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20   1 for the next 
19690 6f 6c 64 65 73 74 2c 20 61 6e 64 20 73 6f 20 6f  oldest, and so o
196a0 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  n..        **.  
196b0 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65        ** In othe
196c0 72 20 77 6f 72 64 73 2c 20 6d 6f 76 65 20 61 6c  r words, move al
196d0 6c 20 73 65 67 6d 65 6e 74 73 20 62 65 69 6e 67  l segments being
196e0 20 70 72 6f 6d 6f 74 65 64 20 74 6f 20 6c 65 76   promoted to lev
196f0 65 6c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 2a  el -1,.        *
19700 2a 20 73 65 74 74 69 6e 67 20 74 68 65 20 22 69  * setting the "i
19710 64 78 22 20 66 69 65 6c 64 73 20 61 73 20 61 70  dx" fields as ap
19720 70 72 6f 70 72 69 61 74 65 20 74 6f 20 6b 65 65  propriate to kee
19730 70 20 74 68 65 6d 20 69 6e 20 74 68 65 20 73 61  p them in the sa
19740 6d 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  me.        ** or
19750 64 65 72 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74  der. The content
19760 73 20 6f 66 20 6c 65 76 65 6c 20 2d 31 20 28 77  s of level -1 (w
19770 68 69 63 68 20 69 73 20 6e 65 76 65 72 20 75 73  hich is never us
19780 65 64 2c 20 65 78 63 65 70 74 0a 20 20 20 20 20  ed, except.     
19790 20 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 6c     ** transientl
197a0 79 20 68 65 72 65 29 2c 20 77 69 6c 6c 20 62 65  y here), will be
197b0 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 6c   moved back to l
197c0 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c 20 62  evel iAbsLevel b
197d0 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20  elow.  */.      
197e0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
197f0 6e 74 28 70 52 61 6e 67 65 2c 20 31 2c 20 69 41  nt(pRange, 1, iA
19800 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20  bsLevel);.      
19810 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f    while( SQLITE_
19820 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
19830 70 28 70 52 61 6e 67 65 29 20 29 7b 0a 20 20 20  p(pRange) ){.   
19840 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
19850 69 6e 64 5f 69 6e 74 28 70 55 70 64 61 74 65 31  ind_int(pUpdate1
19860 2c 20 31 2c 20 69 49 64 78 2b 2b 29 3b 0a 20 20  , 1, iIdx++);.  
19870 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
19880 62 69 6e 64 5f 69 6e 74 28 70 55 70 64 61 74 65  bind_int(pUpdate
19890 31 2c 20 32 2c 20 73 71 6c 69 74 65 33 5f 63 6f  1, 2, sqlite3_co
198a0 6c 75 6d 6e 5f 69 6e 74 28 70 52 61 6e 67 65 2c  lumn_int(pRange,
198b0 20 30 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20   0));.          
198c0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
198d0 28 70 55 70 64 61 74 65 31 2c 20 33 2c 20 73 71  (pUpdate1, 3, sq
198e0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
198f0 28 70 52 61 6e 67 65 2c 20 31 29 29 3b 0a 20 20  (pRange, 1));.  
19900 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
19910 73 74 65 70 28 70 55 70 64 61 74 65 31 29 3b 0a  step(pUpdate1);.
19920 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
19930 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 55 70  qlite3_reset(pUp
19940 64 61 74 65 31 29 3b 0a 20 20 20 20 20 20 20 20  date1);.        
19950 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19960 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
19970 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74     sqlite3_reset
19980 28 70 52 61 6e 67 65 29 3b 0a 20 20 20 20 20 20  (pRange);.      
19990 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
199a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
199b0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
199c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
199d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
199e0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
199f0 28 70 52 61 6e 67 65 29 3b 0a 20 20 20 20 20 20  (pRange);.      
19a00 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65  }..      /* Move
19a10 20 6c 65 76 65 6c 20 2d 31 20 74 6f 20 6c 65 76   level -1 to lev
19a20 65 6c 20 69 41 62 73 4c 65 76 65 6c 20 2a 2f 0a  el iAbsLevel */.
19a30 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
19a40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19a50 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
19a60 69 6e 74 28 70 55 70 64 61 74 65 32 2c 20 31 2c  int(pUpdate2, 1,
19a70 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20   iAbsLevel);.   
19a80 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65       sqlite3_ste
19a90 70 28 70 55 70 64 61 74 65 32 29 3b 0a 20 20 20  p(pUpdate2);.   
19aa0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
19ab0 33 5f 72 65 73 65 74 28 70 55 70 64 61 74 65 32  3_reset(pUpdate2
19ac0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
19ad0 0a 20 20 7d 0a 0a 0a 20 20 72 65 74 75 72 6e 20  .  }...  return 
19ae0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72  rc;.}../*.** Mer
19af0 67 65 20 61 6c 6c 20 6c 65 76 65 6c 20 69 4c 65  ge all level iLe
19b00 76 65 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20  vel segments in 
19b10 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 74  the database int
19b20 6f 20 61 20 73 69 6e 67 6c 65 20 0a 2a 2a 20 69  o a single .** i
19b30 4c 65 76 65 6c 2b 31 20 73 65 67 6d 65 6e 74 2e  Level+1 segment.
19b40 20 4f 72 2c 20 69 66 20 69 4c 65 76 65 6c 3c 30   Or, if iLevel<0
19b50 2c 20 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d  , merge all segm
19b60 65 6e 74 73 20 69 6e 74 6f 20 61 0a 2a 2a 20 73  ents into a.** s
19b70 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 20 77 69  ingle segment wi
19b80 74 68 20 61 20 6c 65 76 65 6c 20 65 71 75 61 6c  th a level equal
19b90 20 74 6f 20 74 68 65 20 6e 75 6d 65 72 69 63 61   to the numerica
19ba0 6c 6c 79 20 6c 61 72 67 65 73 74 20 6c 65 76 65  lly largest leve
19bb0 6c 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  l .** currently 
19bc0 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64  present in the d
19bd0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
19be0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
19bf0 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 69  is called with i
19c00 4c 65 76 65 6c 3c 30 2c 20 62 75 74 20 74 68 65  Level<0, but the
19c10 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 0a 2a  re is only one.*
19c20 2a 20 73 65 67 6d 65 6e 74 20 69 6e 20 74 68 65  * segment in the
19c30 20 64 61 74 61 62 61 73 65 2c 20 53 51 4c 49 54   database, SQLIT
19c40 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
19c50 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  ed immediately. 
19c60 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
19c70 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  f successful, SQ
19c80 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
19c90 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ned. If an error
19ca0 20 6f 63 63 75 72 73 2c 20 0a 2a 2a 20 61 6e 20   occurs, .** an 
19cb0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
19cc0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
19cd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
19ce0 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 0a 20  3SegmentMerge(. 
19cf0 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 0a   Fts3Table *p, .
19d00 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20    int iLangid,  
19d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64    /* Language id
19d30 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 69   to merge */.  i
19d40 6e 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20 20  nt iIndex,      
19d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19d60 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 61 49  * Index in p->aI
19d70 6e 64 65 78 5b 5d 20 74 6f 20 6d 65 72 67 65 20  ndex[] to merge 
19d80 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 20  */.  int iLevel 
19d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19da0 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f       /* Level to
19db0 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69   merge */.){.  i
19dc0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
19dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19de0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
19df0 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b  .  int iIdx = 0;
19e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e10 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e     /* Index of n
19e20 65 77 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ew segment */.  
19e30 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4e  sqlite3_int64 iN
19e40 65 77 4c 65 76 65 6c 20 3d 20 30 3b 20 20 20 20  ewLevel = 0;    
19e50 2f 2a 20 4c 65 76 65 6c 2f 69 6e 64 65 78 20 74  /* Level/index t
19e60 6f 20 63 72 65 61 74 65 20 6e 65 77 20 73 65 67  o create new seg
19e70 6d 65 6e 74 20 61 74 20 2a 2f 0a 20 20 53 65 67  ment at */.  Seg
19e80 6d 65 6e 74 57 72 69 74 65 72 20 2a 70 57 72 69  mentWriter *pWri
19e90 74 65 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ter = 0;     /* 
19ea0 55 73 65 64 20 74 6f 20 77 72 69 74 65 20 74 68  Used to write th
19eb0 65 20 6e 65 77 2c 20 6d 65 72 67 65 64 2c 20 73  e new, merged, s
19ec0 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 33  egment */.  Fts3
19ed0 53 65 67 46 69 6c 74 65 72 20 66 69 6c 74 65 72  SegFilter filter
19ee0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
19ef0 65 67 6d 65 6e 74 20 74 65 72 6d 20 66 69 6c 74  egment term filt
19f00 65 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a  er condition */.
19f10 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65    Fts3MultiSegRe
19f20 61 64 65 72 20 63 73 72 3b 20 20 20 20 20 20 20  ader csr;       
19f30 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 69    /* Cursor to i
19f40 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c  terate through l
19f50 65 76 65 6c 28 73 29 20 2a 2f 0a 20 20 69 6e 74  evel(s) */.  int
19f60 20 62 49 67 6e 6f 72 65 45 6d 70 74 79 20 3d 20   bIgnoreEmpty = 
19f70 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
19f80 54 72 75 65 20 74 6f 20 69 67 6e 6f 72 65 20 65  True to ignore e
19f90 6d 70 74 79 20 73 65 67 6d 65 6e 74 73 20 2a 2f  mpty segments */
19fa0 0a 20 20 69 36 34 20 69 4d 61 78 4c 65 76 65 6c  .  i64 iMaxLevel
19fb0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
19fc0 20 20 20 2f 2a 20 4d 61 78 20 6c 65 76 65 6c 20     /* Max level 
19fd0 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20  number for this 
19fe0 69 6e 64 65 78 2f 6c 61 6e 67 69 64 20 2a 2f 0a  index/langid */.
19ff0 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 76 65  .  assert( iLeve
1a000 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f  l==FTS3_SEGCURSO
1a010 52 5f 41 4c 4c 0a 20 20 20 20 20 20 20 7c 7c 20  R_ALL.       || 
1a020 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47  iLevel==FTS3_SEG
1a030 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 0a 20  CURSOR_PENDING. 
1a040 20 20 20 20 20 20 7c 7c 20 69 4c 65 76 65 6c 3e        || iLevel>
1a050 3d 30 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  =0.  );.  assert
1a060 28 20 69 4c 65 76 65 6c 3c 46 54 53 33 5f 53 45  ( iLevel<FTS3_SE
1a070 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 20 29 3b  GDIR_MAXLEVEL );
1a080 0a 20 20 61 73 73 65 72 74 28 20 69 49 6e 64 65  .  assert( iInde
1a090 78 3e 3d 30 20 26 26 20 69 49 6e 64 65 78 3c 70  x>=0 && iIndex<p
1a0a0 2d 3e 6e 49 6e 64 65 78 20 29 3b 0a 0a 20 20 72  ->nIndex );..  r
1a0b0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53  c = sqlite3Fts3S
1a0c0 65 67 52 65 61 64 65 72 43 75 72 73 6f 72 28 70  egReaderCursor(p
1a0d0 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
1a0e0 78 2c 20 69 4c 65 76 65 6c 2c 20 30 2c 20 30 2c  x, iLevel, 0, 0,
1a0f0 20 31 2c 20 30 2c 20 26 63 73 72 29 3b 0a 20 20   1, 0, &csr);.  
1a100 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a110 4b 20 7c 7c 20 63 73 72 2e 6e 53 65 67 6d 65 6e  K || csr.nSegmen
1a120 74 3d 3d 30 20 29 20 67 6f 74 6f 20 66 69 6e 69  t==0 ) goto fini
1a130 73 68 65 64 3b 0a 0a 20 20 69 66 28 20 69 4c 65  shed;..  if( iLe
1a140 76 65 6c 21 3d 46 54 53 33 5f 53 45 47 43 55 52  vel!=FTS3_SEGCUR
1a150 53 4f 52 5f 50 45 4e 44 49 4e 47 20 29 7b 0a 20  SOR_PENDING ){. 
1a160 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 6d     rc = fts3Segm
1a170 65 6e 74 4d 61 78 4c 65 76 65 6c 28 70 2c 20 69  entMaxLevel(p, i
1a180 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20  Langid, iIndex, 
1a190 26 69 4d 61 78 4c 65 76 65 6c 29 3b 0a 20 20 20  &iMaxLevel);.   
1a1a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a1b0 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69 73 68  OK ) goto finish
1a1c0 65 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69  ed;.  }..  if( i
1a1d0 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43  Level==FTS3_SEGC
1a1e0 55 52 53 4f 52 5f 41 4c 4c 20 29 7b 0a 20 20 20  URSOR_ALL ){.   
1a1f0 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73   /* This call is
1a200 20 74 6f 20 6d 65 72 67 65 20 61 6c 6c 20 73 65   to merge all se
1a210 67 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61  gments in the da
1a220 74 61 62 61 73 65 20 74 6f 20 61 20 73 69 6e 67  tabase to a sing
1a230 6c 65 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e  le.    ** segmen
1a240 74 2e 20 54 68 65 20 6c 65 76 65 6c 20 6f 66 20  t. The level of 
1a250 74 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 20  the new segment 
1a260 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  is equal to the 
1a270 6e 75 6d 65 72 69 63 61 6c 6c 79 0a 20 20 20 20  numerically.    
1a280 2a 2a 20 67 72 65 61 74 65 73 74 20 73 65 67 6d  ** greatest segm
1a290 65 6e 74 20 6c 65 76 65 6c 20 63 75 72 72 65 6e  ent level curren
1a2a0 74 6c 79 20 70 72 65 73 65 6e 74 20 69 6e 20 74  tly present in t
1a2b0 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 20  he database for 
1a2c0 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 6e 64 65  this.    ** inde
1a2d0 78 2e 20 54 68 65 20 69 64 78 20 6f 66 20 74 68  x. The idx of th
1a2e0 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 69 73  e new segment is
1a2f0 20 61 6c 77 61 79 73 20 30 2e 20 20 2a 2f 0a 20   always 0.  */. 
1a300 20 20 20 69 66 28 20 63 73 72 2e 6e 53 65 67 6d     if( csr.nSegm
1a310 65 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ent==1 ){.      
1a320 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1a330 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e  ;.      goto fin
1a340 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ished;.    }.   
1a350 20 69 4e 65 77 4c 65 76 65 6c 20 3d 20 69 4d 61   iNewLevel = iMa
1a360 78 4c 65 76 65 6c 3b 0a 20 20 20 20 62 49 67 6e  xLevel;.    bIgn
1a370 6f 72 65 45 6d 70 74 79 20 3d 20 31 3b 0a 0a 20  oreEmpty = 1;.. 
1a380 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
1a390 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 6d  his call is to m
1a3a0 65 72 67 65 20 61 6c 6c 20 73 65 67 6d 65 6e 74  erge all segment
1a3b0 73 20 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65  s at level iLeve
1a3c0 6c 2e 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74  l. find the next
1a3d0 0a 20 20 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  .    ** availabl
1a3e0 65 20 73 65 67 6d 65 6e 74 20 69 6e 64 65 78 20  e segment index 
1a3f0 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2b  at level iLevel+
1a400 31 2e 20 54 68 65 20 63 61 6c 6c 20 74 6f 0a 20  1. The call to. 
1a410 20 20 20 2a 2a 20 66 74 73 33 41 6c 6c 6f 63 61     ** fts3Alloca
1a420 74 65 53 65 67 64 69 72 49 64 78 28 29 20 77 69  teSegdirIdx() wi
1a430 6c 6c 20 6d 65 72 67 65 20 74 68 65 20 73 65 67  ll merge the seg
1a440 6d 65 6e 74 73 20 61 74 20 6c 65 76 65 6c 20 69  ments at level i
1a450 4c 65 76 65 6c 2b 31 20 74 6f 20 0a 20 20 20 20  Level+1 to .    
1a460 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 4c 65 76  ** a single iLev
1a470 65 6c 2b 32 20 73 65 67 6d 65 6e 74 20 69 66 20  el+2 segment if 
1a480 6e 65 63 65 73 73 61 72 79 2e 20 20 2a 2f 0a 20  necessary.  */. 
1a490 20 20 20 61 73 73 65 72 74 28 20 46 54 53 33 5f     assert( FTS3_
1a4a0 53 45 47 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e  SEGCURSOR_PENDIN
1a4b0 47 3d 3d 2d 31 20 29 3b 0a 20 20 20 20 69 4e 65  G==-1 );.    iNe
1a4c0 77 4c 65 76 65 6c 20 3d 20 67 65 74 41 62 73 6f  wLevel = getAbso
1a4d0 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61  luteLevel(p, iLa
1a4e0 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c  ngid, iIndex, iL
1a4f0 65 76 65 6c 2b 31 29 3b 0a 20 20 20 20 72 63 20  evel+1);.    rc 
1a500 3d 20 66 74 73 33 41 6c 6c 6f 63 61 74 65 53 65  = fts3AllocateSe
1a510 67 64 69 72 49 64 78 28 70 2c 20 69 4c 61 6e 67  gdirIdx(p, iLang
1a520 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65 76  id, iIndex, iLev
1a530 65 6c 2b 31 2c 20 26 69 49 64 78 29 3b 0a 20 20  el+1, &iIdx);.  
1a540 20 20 62 49 67 6e 6f 72 65 45 6d 70 74 79 20 3d    bIgnoreEmpty =
1a550 20 28 69 4c 65 76 65 6c 21 3d 46 54 53 33 5f 53   (iLevel!=FTS3_S
1a560 45 47 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47  EGCURSOR_PENDING
1a570 29 20 26 26 20 28 69 4e 65 77 4c 65 76 65 6c 3e  ) && (iNewLevel>
1a580 69 4d 61 78 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a  iMaxLevel);.  }.
1a590 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a5a0 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69 73  _OK ) goto finis
1a5b0 68 65 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  hed;..  assert( 
1a5c0 63 73 72 2e 6e 53 65 67 6d 65 6e 74 3e 30 20 29  csr.nSegment>0 )
1a5d0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4e 65 77  ;.  assert( iNew
1a5e0 4c 65 76 65 6c 3e 3d 67 65 74 41 62 73 6f 6c 75  Level>=getAbsolu
1a5f0 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67  teLevel(p, iLang
1a600 69 64 2c 20 69 49 6e 64 65 78 2c 20 30 29 20 29  id, iIndex, 0) )
1a610 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4e 65 77  ;.  assert( iNew
1a620 4c 65 76 65 6c 3c 67 65 74 41 62 73 6f 6c 75 74  Level<getAbsolut
1a630 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69  eLevel(p, iLangi
1a640 64 2c 20 69 49 6e 64 65 78 2c 46 54 53 33 5f 53  d, iIndex,FTS3_S
1a650 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 29 20  EGDIR_MAXLEVEL) 
1a660 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69  );..  memset(&fi
1a670 6c 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  lter, 0, sizeof(
1a680 46 74 73 33 53 65 67 46 69 6c 74 65 72 29 29 3b  Fts3SegFilter));
1a690 0a 20 20 66 69 6c 74 65 72 2e 66 6c 61 67 73 20  .  filter.flags 
1a6a0 3d 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 52  = FTS3_SEGMENT_R
1a6b0 45 51 55 49 52 45 5f 50 4f 53 3b 0a 20 20 66 69  EQUIRE_POS;.  fi
1a6c0 6c 74 65 72 2e 66 6c 61 67 73 20 7c 3d 20 28 62  lter.flags |= (b
1a6d0 49 67 6e 6f 72 65 45 6d 70 74 79 20 3f 20 46 54  IgnoreEmpty ? FT
1a6e0 53 33 5f 53 45 47 4d 45 4e 54 5f 49 47 4e 4f 52  S3_SEGMENT_IGNOR
1a6f0 45 5f 45 4d 50 54 59 20 3a 20 30 29 3b 0a 0a 20  E_EMPTY : 0);.. 
1a700 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
1a710 33 53 65 67 52 65 61 64 65 72 53 74 61 72 74 28  3SegReaderStart(
1a720 70 2c 20 26 63 73 72 2c 20 26 66 69 6c 74 65 72  p, &csr, &filter
1a730 29 3b 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49  );.  while( SQLI
1a740 54 45 5f 4f 4b 3d 3d 72 63 20 29 7b 0a 20 20 20  TE_OK==rc ){.   
1a750 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
1a760 33 53 65 67 52 65 61 64 65 72 53 74 65 70 28 70  3SegReaderStep(p
1a770 2c 20 26 63 73 72 29 3b 0a 20 20 20 20 69 66 28  , &csr);.    if(
1a780 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20   rc!=SQLITE_ROW 
1a790 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 72 63 20  ) break;.    rc 
1a7a0 3d 20 66 74 73 33 53 65 67 57 72 69 74 65 72 41  = fts3SegWriterA
1a7b0 64 64 28 70 2c 20 26 70 57 72 69 74 65 72 2c 20  dd(p, &pWriter, 
1a7c0 31 2c 20 0a 20 20 20 20 20 20 20 20 63 73 72 2e  1, .        csr.
1a7d0 7a 54 65 72 6d 2c 20 63 73 72 2e 6e 54 65 72 6d  zTerm, csr.nTerm
1a7e0 2c 20 63 73 72 2e 61 44 6f 63 6c 69 73 74 2c 20  , csr.aDoclist, 
1a7f0 63 73 72 2e 6e 44 6f 63 6c 69 73 74 29 3b 0a 20  csr.nDoclist);. 
1a800 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
1a810 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69  ITE_OK ) goto fi
1a820 6e 69 73 68 65 64 3b 0a 20 20 61 73 73 65 72 74  nished;.  assert
1a830 28 20 70 57 72 69 74 65 72 20 7c 7c 20 62 49 67  ( pWriter || bIg
1a840 6e 6f 72 65 45 6d 70 74 79 20 29 3b 0a 0a 20 20  noreEmpty );..  
1a850 69 66 28 20 69 4c 65 76 65 6c 21 3d 46 54 53 33  if( iLevel!=FTS3
1a860 5f 53 45 47 43 55 52 53 4f 52 5f 50 45 4e 44 49  _SEGCURSOR_PENDI
1a870 4e 47 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  NG ){.    rc = f
1a880 74 73 33 44 65 6c 65 74 65 53 65 67 64 69 72 28  ts3DeleteSegdir(
1a890 0a 20 20 20 20 20 20 20 20 70 2c 20 69 4c 61 6e  .        p, iLan
1a8a0 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65  gid, iIndex, iLe
1a8b0 76 65 6c 2c 20 63 73 72 2e 61 70 53 65 67 6d 65  vel, csr.apSegme
1a8c0 6e 74 2c 20 63 73 72 2e 6e 53 65 67 6d 65 6e 74  nt, csr.nSegment
1a8d0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
1a8e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1a8f0 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20  goto finished;. 
1a900 20 7d 0a 20 20 69 66 28 20 70 57 72 69 74 65 72   }.  if( pWriter
1a910 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
1a920 33 53 65 67 57 72 69 74 65 72 46 6c 75 73 68 28  3SegWriterFlush(
1a930 70 2c 20 70 57 72 69 74 65 72 2c 20 69 4e 65 77  p, pWriter, iNew
1a940 4c 65 76 65 6c 2c 20 69 49 64 78 29 3b 0a 20 20  Level, iIdx);.  
1a950 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a960 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
1a970 20 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45   iLevel==FTS3_SE
1a980 47 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 20  GCURSOR_PENDING 
1a990 7c 7c 20 69 4e 65 77 4c 65 76 65 6c 3c 69 4d 61  || iNewLevel<iMa
1a9a0 78 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20 20 20  xLevel ){.      
1a9b0 20 20 72 63 20 3d 20 66 74 73 33 50 72 6f 6d 6f    rc = fts3Promo
1a9c0 74 65 53 65 67 6d 65 6e 74 73 28 70 2c 20 69 4e  teSegments(p, iN
1a9d0 65 77 4c 65 76 65 6c 2c 20 70 57 72 69 74 65 72  ewLevel, pWriter
1a9e0 2d 3e 6e 4c 65 61 66 44 61 74 61 29 3b 0a 20 20  ->nLeafData);.  
1a9f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1aa00 0a 20 66 69 6e 69 73 68 65 64 3a 0a 20 20 66 74  . finished:.  ft
1aa10 73 33 53 65 67 57 72 69 74 65 72 46 72 65 65 28  s3SegWriterFree(
1aa20 70 57 72 69 74 65 72 29 3b 0a 20 20 73 71 6c 69  pWriter);.  sqli
1aa30 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72  te3Fts3SegReader
1aa40 46 69 6e 69 73 68 28 26 63 73 72 29 3b 0a 20 20  Finish(&csr);.  
1aa50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1aa60 2a 20 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65 20  * .** Flush the 
1aa70 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 65 6e 64  contents of pend
1aa80 69 6e 67 54 65 72 6d 73 20 74 6f 20 6c 65 76 65  ingTerms to leve
1aa90 6c 20 30 20 73 65 67 6d 65 6e 74 73 2e 20 0a 2a  l 0 segments. .*
1aaa0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
1aab0 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 46 6c 75  3PendingTermsFlu
1aac0 73 68 28 46 74 73 33 54 61 62 6c 65 20 2a 70 29  sh(Fts3Table *p)
1aad0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1aae0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b  ITE_OK;.  int i;
1aaf0 0a 20 20 20 20 20 20 20 20 0a 20 20 66 6f 72 28  .        .  for(
1ab00 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
1ab10 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 49 6e 64 65  OK && i<p->nInde
1ab20 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20  x; i++){.    rc 
1ab30 3d 20 66 74 73 33 53 65 67 6d 65 6e 74 4d 65 72  = fts3SegmentMer
1ab40 67 65 28 70 2c 20 70 2d 3e 69 50 72 65 76 4c 61  ge(p, p->iPrevLa
1ab50 6e 67 69 64 2c 20 69 2c 20 46 54 53 33 5f 53 45  ngid, i, FTS3_SE
1ab60 47 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 29  GCURSOR_PENDING)
1ab70 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1ab80 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d  LITE_DONE ) rc =
1ab90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1aba0 20 20 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e    sqlite3Fts3Pen
1abb0 64 69 6e 67 54 65 72 6d 73 43 6c 65 61 72 28 70  dingTermsClear(p
1abc0 29 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69  );..  /* Determi
1abd0 6e 65 20 74 68 65 20 61 75 74 6f 2d 69 6e 63 72  ne the auto-incr
1abe0 2d 6d 65 72 67 65 20 73 65 74 74 69 6e 67 20 69  -merge setting i
1abf0 66 20 75 6e 6b 6e 6f 77 6e 2e 20 20 49 66 20 65  f unknown.  If e
1ac00 6e 61 62 6c 65 64 2c 0a 20 20 2a 2a 20 65 73 74  nabled,.  ** est
1ac10 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
1ac20 20 6f 66 20 6c 65 61 66 20 62 6c 6f 63 6b 73 20   of leaf blocks 
1ac30 6f 66 20 63 6f 6e 74 65 6e 74 20 74 6f 20 62 65  of content to be
1ac40 20 77 72 69 74 74 65 6e 0a 20 20 2a 2f 0a 20 20   written.  */.  
1ac50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ac60 4b 20 26 26 20 70 2d 3e 62 48 61 73 53 74 61 74  K && p->bHasStat
1ac70 0a 20 20 20 26 26 20 70 2d 3e 6e 41 75 74 6f 69  .   && p->nAutoi
1ac80 6e 63 72 6d 65 72 67 65 3d 3d 30 78 66 66 20 26  ncrmerge==0xff &
1ac90 26 20 70 2d 3e 6e 4c 65 61 66 41 64 64 3e 30 0a  & p->nLeafAdd>0.
1aca0 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
1acb0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
1acc0 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53  ;.    rc = fts3S
1acd0 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45  qlStmt(p, SQL_SE
1ace0 4c 45 43 54 5f 53 54 41 54 2c 20 26 70 53 74 6d  LECT_STAT, &pStm
1acf0 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  t, 0);.    if( r
1ad00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ad10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
1ad20 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 2c  nd_int(pStmt, 1,
1ad30 20 46 54 53 5f 53 54 41 54 5f 41 55 54 4f 49 4e   FTS_STAT_AUTOIN
1ad40 43 52 4d 45 52 47 45 29 3b 0a 20 20 20 20 20 20  CRMERGE);.      
1ad50 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
1ad60 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  p(pStmt);.      
1ad70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52  if( rc==SQLITE_R
1ad80 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  OW ){.        p-
1ad90 3e 6e 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 20  >nAutoincrmerge 
1ada0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
1adb0 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  _int(pStmt, 0);.
1adc0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e          if( p->n
1add0 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 3d 3d 31  Autoincrmerge==1
1ade0 20 29 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d   ) p->nAutoincrm
1adf0 65 72 67 65 20 3d 20 38 3b 0a 20 20 20 20 20 20  erge = 8;.      
1ae00 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
1ae10 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
1ae20 20 20 20 20 20 70 2d 3e 6e 41 75 74 6f 69 6e 63       p->nAutoinc
1ae30 72 6d 65 72 67 65 20 3d 20 30 3b 0a 20 20 20 20  rmerge = 0;.    
1ae40 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
1ae50 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
1ae60 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  mt);.    }.  }. 
1ae70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1ae80 2a 0a 2a 2a 20 45 6e 63 6f 64 65 20 4e 20 69 6e  *.** Encode N in
1ae90 74 65 67 65 72 73 20 61 73 20 76 61 72 69 6e 74  tegers as varint
1aea0 73 20 69 6e 74 6f 20 61 20 62 6c 6f 62 2e 0a 2a  s into a blob..*
1aeb0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1aec0 73 33 45 6e 63 6f 64 65 49 6e 74 41 72 72 61 79  s3EncodeIntArray
1aed0 28 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  (.  int N,      
1aee0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
1aef0 6d 62 65 72 20 6f 66 20 69 6e 74 65 67 65 72 73  mber of integers
1af00 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20   to encode */.  
1af10 75 33 32 20 2a 61 2c 20 20 20 20 20 20 20 20 20  u32 *a,         
1af20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65     /* The intege
1af30 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 63 68  r values */.  ch
1af40 61 72 20 2a 7a 42 75 66 2c 20 20 20 20 20 20 20  ar *zBuf,       
1af50 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 42 4c   /* Write the BL
1af60 4f 42 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  OB here */.  int
1af70 20 2a 70 4e 42 75 66 20 20 20 20 20 20 20 20 20   *pNBuf         
1af80 2f 2a 20 57 72 69 74 65 20 6e 75 6d 62 65 72 20  /* Write number 
1af90 6f 66 20 62 79 74 65 73 20 69 66 20 7a 42 75 66  of bytes if zBuf
1afa0 5b 5d 20 75 73 65 64 20 68 65 72 65 20 2a 2f 0a  [] used here */.
1afb0 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
1afc0 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 4e 3b   for(i=j=0; i<N;
1afd0 20 69 2b 2b 29 7b 0a 20 20 20 20 6a 20 2b 3d 20   i++){.    j += 
1afe0 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
1aff0 72 69 6e 74 28 26 7a 42 75 66 5b 6a 5d 2c 20 28  rint(&zBuf[j], (
1b000 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 61 5b  sqlite3_int64)a[
1b010 69 5d 29 3b 0a 20 20 7d 0a 20 20 2a 70 4e 42 75  i]);.  }.  *pNBu
1b020 66 20 3d 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f = j;.}../*.** 
1b030 44 65 63 6f 64 65 20 61 20 62 6c 6f 62 20 6f 66  Decode a blob of
1b040 20 76 61 72 69 6e 74 73 20 69 6e 74 6f 20 4e 20   varints into N 
1b050 69 6e 74 65 67 65 72 73 0a 2a 2f 0a 73 74 61 74  integers.*/.stat
1b060 69 63 20 76 6f 69 64 20 66 74 73 33 44 65 63 6f  ic void fts3Deco
1b070 64 65 49 6e 74 41 72 72 61 79 28 0a 20 20 69 6e  deIntArray(.  in
1b080 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t N,            
1b090 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
1b0a0 66 20 69 6e 74 65 67 65 72 73 20 74 6f 20 64 65  f integers to de
1b0b0 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 2a 61  code */.  u32 *a
1b0c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1b0d0 57 72 69 74 65 20 74 68 65 20 69 6e 74 65 67 65  Write the intege
1b0e0 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 63 6f  r values */.  co
1b0f0 6e 73 74 20 63 68 61 72 20 2a 7a 42 75 66 2c 20  nst char *zBuf, 
1b100 20 2f 2a 20 54 68 65 20 42 4c 4f 42 20 63 6f 6e   /* The BLOB con
1b110 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 72 69  taining the vari
1b120 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 75  nts */.  int nBu
1b130 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  f           /* s
1b140 69 7a 65 20 6f 66 20 74 68 65 20 42 4c 4f 42 20  ize of the BLOB 
1b150 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
1b160 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1b170 45 54 45 52 28 6e 42 75 66 29 3b 0a 20 20 66 6f  ETER(nBuf);.  fo
1b180 72 28 69 3d 6a 3d 30 3b 20 69 3c 4e 3b 20 69 2b  r(i=j=0; i<N; i+
1b190 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  +){.    sqlite3_
1b1a0 69 6e 74 36 34 20 78 3b 0a 20 20 20 20 6a 20 2b  int64 x;.    j +
1b1b0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74  = sqlite3Fts3Get
1b1c0 56 61 72 69 6e 74 28 26 7a 42 75 66 5b 6a 5d 2c  Varint(&zBuf[j],
1b1d0 20 26 78 29 3b 0a 20 20 20 20 61 73 73 65 72 74   &x);.    assert
1b1e0 28 6a 3c 3d 6e 42 75 66 29 3b 0a 20 20 20 20 61  (j<=nBuf);.    a
1b1f0 5b 69 5d 20 3d 20 28 75 33 32 29 28 78 20 26 20  [i] = (u32)(x & 
1b200 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d  0xffffffff);.  }
1b210 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
1b220 20 74 68 65 20 73 69 7a 65 73 20 28 69 6e 20 74   the sizes (in t
1b230 6f 6b 65 6e 73 29 20 66 6f 72 20 65 61 63 68 20  okens) for each 
1b240 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 64 6f  column of the do
1b250 63 75 6d 65 6e 74 0a 2a 2a 20 77 69 74 68 20 64  cument.** with d
1b260 6f 63 69 64 20 65 71 75 61 6c 20 74 6f 20 70 2d  ocid equal to p-
1b270 3e 69 50 72 65 76 44 6f 63 69 64 2e 20 20 54 68  >iPrevDocid.  Th
1b280 65 20 73 69 7a 65 73 20 61 72 65 20 65 6e 63 6f  e sizes are enco
1b290 64 65 64 20 61 73 0a 2a 2a 20 61 20 62 6c 6f 62  ded as.** a blob
1b2a0 20 6f 66 20 76 61 72 69 6e 74 73 2e 0a 2a 2f 0a   of varints..*/.
1b2b0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
1b2c0 49 6e 73 65 72 74 44 6f 63 73 69 7a 65 28 0a 20  InsertDocsize(. 
1b2d0 20 69 6e 74 20 2a 70 52 43 2c 20 20 20 20 20 20   int *pRC,      
1b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2f0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1b300 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  */.  Fts3Table *
1b310 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1b320 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 69 6e       /* Table in
1b330 74 6f 20 77 68 69 63 68 20 74 6f 20 69 6e 73 65  to which to inse
1b340 72 74 20 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a  rt */.  u32 *aSz
1b350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b360 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73          /* Sizes
1b370 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2c   of each column,
1b380 20 69 6e 20 74 6f 6b 65 6e 73 20 2a 2f 0a 29 7b   in tokens */.){
1b390 0a 20 20 63 68 61 72 20 2a 70 42 6c 6f 62 3b 20  .  char *pBlob; 
1b3a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b3b0 68 65 20 42 4c 4f 42 20 65 6e 63 6f 64 69 6e 67  he BLOB encoding
1b3c0 20 6f 66 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   of the document
1b3d0 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   size */.  int n
1b3e0 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20  Blob;           
1b3f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1b400 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 42 4c   bytes in the BL
1b410 4f 42 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  OB */.  sqlite3_
1b420 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
1b430 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 73   /* Statement us
1b440 65 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ed to insert the
1b450 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69   encoding */.  i
1b460 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1b470 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1b480 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66  t code from subf
1b490 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69  unctions */..  i
1b4a0 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
1b4b0 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69  ;.  pBlob = sqli
1b4c0 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 31 30 2a 70  te3_malloc( 10*p
1b4d0 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69  ->nColumn );.  i
1b4e0 66 28 20 70 42 6c 6f 62 3d 3d 30 20 29 7b 0a 20  f( pBlob==0 ){. 
1b4f0 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45     *pRC = SQLITE
1b500 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75  _NOMEM;.    retu
1b510 72 6e 3b 0a 20 20 7d 0a 20 20 66 74 73 33 45 6e  rn;.  }.  fts3En
1b520 63 6f 64 65 49 6e 74 41 72 72 61 79 28 70 2d 3e  codeIntArray(p->
1b530 6e 43 6f 6c 75 6d 6e 2c 20 61 53 7a 2c 20 70 42  nColumn, aSz, pB
1b540 6c 6f 62 2c 20 26 6e 42 6c 6f 62 29 3b 0a 20 20  lob, &nBlob);.  
1b550 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
1b560 28 70 2c 20 53 51 4c 5f 52 45 50 4c 41 43 45 5f  (p, SQL_REPLACE_
1b570 44 4f 43 53 49 5a 45 2c 20 26 70 53 74 6d 74 2c  DOCSIZE, &pStmt,
1b580 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b   0);.  if( rc ){
1b590 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1b5a0 65 28 70 42 6c 6f 62 29 3b 0a 20 20 20 20 2a 70  e(pBlob);.    *p
1b5b0 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74  RC = rc;.    ret
1b5c0 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
1b5d0 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
1b5e0 74 6d 74 2c 20 31 2c 20 70 2d 3e 69 50 72 65 76  tmt, 1, p->iPrev
1b5f0 44 6f 63 69 64 29 3b 0a 20 20 73 71 6c 69 74 65  Docid);.  sqlite
1b600 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d  3_bind_blob(pStm
1b610 74 2c 20 32 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c  t, 2, pBlob, nBl
1b620 6f 62 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ob, sqlite3_free
1b630 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65  );.  sqlite3_ste
1b640 70 28 70 53 74 6d 74 29 3b 0a 20 20 2a 70 52 43  p(pStmt);.  *pRC
1b650 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
1b660 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pStmt);.}../*.*
1b670 2a 20 52 65 63 6f 72 64 20 30 20 6f 66 20 74 68  * Record 0 of th
1b680 65 20 25 5f 73 74 61 74 20 74 61 62 6c 65 20 63  e %_stat table c
1b690 6f 6e 74 61 69 6e 73 20 61 20 62 6c 6f 62 20 63  ontains a blob c
1b6a0 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 4e 20 76  onsisting of N v
1b6b0 61 72 69 6e 74 73 2c 0a 2a 2a 20 77 68 65 72 65  arints,.** where
1b6c0 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
1b6d0 20 6f 66 20 75 73 65 72 20 64 65 66 69 6e 65 64   of user defined
1b6e0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
1b6f0 66 74 73 33 20 74 61 62 6c 65 20 70 6c 75 73 0a  fts3 table plus.
1b700 2a 2a 20 74 77 6f 2e 20 49 66 20 6e 43 6f 6c 20  ** two. If nCol 
1b710 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1b720 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 6f   user defined co
1b730 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 76 61 6c 75  lumns, then valu
1b740 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 76 61  es of the .** va
1b750 72 69 6e 74 73 20 61 72 65 20 73 65 74 20 61 73  rints are set as
1b760 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
1b770 20 20 56 61 72 69 6e 74 20 30 3a 20 20 20 20 20    Varint 0:     
1b780 20 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f    Total number o
1b790 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
1b7a0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72  ble..**.**   Var
1b7b0 69 6e 74 20 31 2e 2e 6e 43 6f 6c 3a 20 46 6f 72  int 1..nCol: For
1b7c0 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2c 20 74 68   each column, th
1b7d0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
1b7e0 66 20 74 6f 6b 65 6e 73 20 73 74 6f 72 65 64 20  f tokens stored 
1b7f0 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  in.**           
1b800 20 20 20 20 20 20 20 20 74 68 65 20 63 6f 6c 75          the colu
1b810 6d 6e 20 66 6f 72 20 61 6c 6c 20 72 6f 77 73 20  mn for all rows 
1b820 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  of the table..**
1b830 0a 2a 2a 20 20 20 56 61 72 69 6e 74 20 31 2b 6e  .**   Varint 1+n
1b840 43 6f 6c 3a 20 20 54 68 65 20 74 6f 74 61 6c 20  Col:  The total 
1b850 73 69 7a 65 2c 20 69 6e 20 62 79 74 65 73 2c 20  size, in bytes, 
1b860 6f 66 20 61 6c 6c 20 74 65 78 74 20 76 61 6c 75  of all text valu
1b870 65 73 20 69 6e 20 61 6c 6c 0a 2a 2a 20 20 20 20  es in all.**    
1b880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
1b890 6f 6c 75 6d 6e 73 20 6f 66 20 61 6c 6c 20 72 6f  olumns of all ro
1b8a0 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ws of the table.
1b8b0 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .**.*/.static vo
1b8c0 69 64 20 66 74 73 33 55 70 64 61 74 65 44 6f 63  id fts3UpdateDoc
1b8d0 54 6f 74 61 6c 73 28 0a 20 20 69 6e 74 20 2a 70  Totals(.  int *p
1b8e0 52 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  RC,             
1b8f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b900 20 72 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   result code */.
1b910 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
1b920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b930 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67    /* Table being
1b940 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 75 33   updated */.  u3
1b950 32 20 2a 61 53 7a 49 6e 73 2c 20 20 20 20 20 20  2 *aSzIns,      
1b960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b970 20 53 69 7a 65 20 69 6e 63 72 65 61 73 65 73 20   Size increases 
1b980 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a 44 65 6c  */.  u32 *aSzDel
1b990 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b9a0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 64 65 63       /* Size dec
1b9b0 72 65 61 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20  reases */.  int 
1b9c0 6e 43 68 6e 67 20 20 20 20 20 20 20 20 20 20 20  nChng           
1b9d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1b9e0 68 61 6e 67 65 20 69 6e 20 74 68 65 20 6e 75 6d  hange in the num
1b9f0 62 65 72 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73  ber of documents
1ba00 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70   */.){.  char *p
1ba10 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20  Blob;           
1ba20 20 20 2f 2a 20 53 74 6f 72 61 67 65 20 66 6f 72    /* Storage for
1ba30 20 42 4c 4f 42 20 77 72 69 74 74 65 6e 20 69 6e   BLOB written in
1ba40 74 6f 20 25 5f 73 74 61 74 20 2a 2f 0a 20 20 69  to %_stat */.  i
1ba50 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20  nt nBlob;       
1ba60 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1ba70 6f 66 20 42 4c 4f 42 20 77 72 69 74 74 65 6e 20  of BLOB written 
1ba80 69 6e 74 6f 20 25 5f 73 74 61 74 20 2a 2f 0a 20  into %_stat */. 
1ba90 20 75 33 32 20 2a 61 3b 20 20 20 20 20 20 20 20   u32 *a;        
1baa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
1bab0 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74  ay of integers t
1bac0 68 61 74 20 62 65 63 6f 6d 65 73 20 74 68 65 20  hat becomes the 
1bad0 42 4c 4f 42 20 2a 2f 0a 20 20 73 71 6c 69 74 65  BLOB */.  sqlite
1bae0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
1baf0 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
1bb00 66 6f 72 20 72 65 61 64 69 6e 67 20 61 6e 64 20  for reading and 
1bb10 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  writing */.  int
1bb20 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1bb30 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1bb40 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
1bb50 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1bb60 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
1bb70 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74  de from subfunct
1bb80 69 6f 6e 73 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74  ions */..  const
1bb90 20 69 6e 74 20 6e 53 74 61 74 20 3d 20 70 2d 3e   int nStat = p->
1bba0 6e 43 6f 6c 75 6d 6e 2b 32 3b 0a 0a 20 20 69 66  nColumn+2;..  if
1bbb0 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
1bbc0 0a 20 20 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  a = sqlite3_m
1bbd0 61 6c 6c 6f 63 28 20 28 73 69 7a 65 6f 66 28 75  alloc( (sizeof(u
1bbe0 33 32 29 2b 31 30 29 2a 6e 53 74 61 74 20 29 3b  32)+10)*nStat );
1bbf0 0a 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20  .  if( a==0 ){. 
1bc00 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45     *pRC = SQLITE
1bc10 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75  _NOMEM;.    retu
1bc20 72 6e 3b 0a 20 20 7d 0a 20 20 70 42 6c 6f 62 20  rn;.  }.  pBlob 
1bc30 3d 20 28 63 68 61 72 2a 29 26 61 5b 6e 53 74 61  = (char*)&a[nSta
1bc40 74 5d 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53  t];.  rc = fts3S
1bc50 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45  qlStmt(p, SQL_SE
1bc60 4c 45 43 54 5f 53 54 41 54 2c 20 26 70 53 74 6d  LECT_STAT, &pStm
1bc70 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  t, 0);.  if( rc 
1bc80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
1bc90 72 65 65 28 61 29 3b 0a 20 20 20 20 2a 70 52 43  ree(a);.    *pRC
1bca0 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
1bcb0 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
1bcc0 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c  _bind_int(pStmt,
1bcd0 20 31 2c 20 46 54 53 5f 53 54 41 54 5f 44 4f 43   1, FTS_STAT_DOC
1bce0 54 4f 54 41 4c 29 3b 0a 20 20 69 66 28 20 73 71  TOTAL);.  if( sq
1bcf0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
1bd00 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
1bd10 0a 20 20 20 20 66 74 73 33 44 65 63 6f 64 65 49  .    fts3DecodeI
1bd20 6e 74 41 72 72 61 79 28 6e 53 74 61 74 2c 20 61  ntArray(nStat, a
1bd30 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ,.         sqlit
1bd40 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
1bd50 53 74 6d 74 2c 20 30 29 2c 0a 20 20 20 20 20 20  Stmt, 0),.      
1bd60 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
1bd70 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 30  n_bytes(pStmt, 0
1bd80 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
1bd90 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 73 69   memset(a, 0, si
1bda0 7a 65 6f 66 28 75 33 32 29 2a 28 6e 53 74 61 74  zeof(u32)*(nStat
1bdb0 29 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ) );.  }.  rc = 
1bdc0 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
1bdd0 74 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  tmt);.  if( rc!=
1bde0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bdf0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29   sqlite3_free(a)
1be00 3b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  ;.    *pRC = rc;
1be10 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1be20 0a 20 20 69 66 28 20 6e 43 68 6e 67 3c 30 20 26  .  if( nChng<0 &
1be30 26 20 61 5b 30 5d 3c 28 75 33 32 29 28 2d 6e 43  & a[0]<(u32)(-nC
1be40 68 6e 67 29 20 29 7b 0a 20 20 20 20 61 5b 30 5d  hng) ){.    a[0]
1be50 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1be60 20 20 20 61 5b 30 5d 20 2b 3d 20 6e 43 68 6e 67     a[0] += nChng
1be70 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1be80 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 3b   i<p->nColumn+1;
1be90 20 69 2b 2b 29 7b 0a 20 20 20 20 75 33 32 20 78   i++){.    u32 x
1bea0 20 3d 20 61 5b 69 2b 31 5d 3b 0a 20 20 20 20 69   = a[i+1];.    i
1beb0 66 28 20 78 2b 61 53 7a 49 6e 73 5b 69 5d 20 3c  f( x+aSzIns[i] <
1bec0 20 61 53 7a 44 65 6c 5b 69 5d 20 29 7b 0a 20 20   aSzDel[i] ){.  
1bed0 20 20 20 20 78 20 3d 20 30 3b 0a 20 20 20 20 7d      x = 0;.    }
1bee0 65 6c 73 65 7b 0a 20 20 20 20 20 20 78 20 3d 20  else{.      x = 
1bef0 78 20 2b 20 61 53 7a 49 6e 73 5b 69 5d 20 2d 20  x + aSzIns[i] - 
1bf00 61 53 7a 44 65 6c 5b 69 5d 3b 0a 20 20 20 20 7d  aSzDel[i];.    }
1bf10 0a 20 20 20 20 61 5b 69 2b 31 5d 20 3d 20 78 3b  .    a[i+1] = x;
1bf20 0a 20 20 7d 0a 20 20 66 74 73 33 45 6e 63 6f 64  .  }.  fts3Encod
1bf30 65 49 6e 74 41 72 72 61 79 28 6e 53 74 61 74 2c  eIntArray(nStat,
1bf40 20 61 2c 20 70 42 6c 6f 62 2c 20 26 6e 42 6c 6f   a, pBlob, &nBlo
1bf50 62 29 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53  b);.  rc = fts3S
1bf60 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 52 45  qlStmt(p, SQL_RE
1bf70 50 4c 41 43 45 5f 53 54 41 54 2c 20 26 70 53 74  PLACE_STAT, &pSt
1bf80 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  mt, 0);.  if( rc
1bf90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1bfa0 66 72 65 65 28 61 29 3b 0a 20 20 20 20 2a 70 52  free(a);.    *pR
1bfb0 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  C = rc;.    retu
1bfc0 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
1bfd0 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74  3_bind_int(pStmt
1bfe0 2c 20 31 2c 20 46 54 53 5f 53 54 41 54 5f 44 4f  , 1, FTS_STAT_DO
1bff0 43 54 4f 54 41 4c 29 3b 0a 20 20 73 71 6c 69 74  CTOTAL);.  sqlit
1c000 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74  e3_bind_blob(pSt
1c010 6d 74 2c 20 32 2c 20 70 42 6c 6f 62 2c 20 6e 42  mt, 2, pBlob, nB
1c020 6c 6f 62 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  lob, SQLITE_STAT
1c030 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  IC);.  sqlite3_s
1c040 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 2a 70  tep(pStmt);.  *p
1c050 52 43 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  RC = sqlite3_res
1c060 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c  et(pStmt);.  sql
1c070 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 7d 0a  ite3_free(a);.}.
1c080 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 68 65  ./*.** Merge the
1c090 20 65 6e 74 69 72 65 20 64 61 74 61 62 61 73 65   entire database
1c0a0 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 69   so that there i
1c0b0 73 20 6f 6e 65 20 73 65 67 6d 65 6e 74 20 66 6f  s one segment fo
1c0c0 72 20 65 61 63 68 20 0a 2a 2a 20 69 49 6e 64 65  r each .** iInde
1c0d0 78 2f 69 4c 61 6e 67 69 64 20 63 6f 6d 62 69 6e  x/iLangid combin
1c0e0 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
1c0f0 20 69 6e 74 20 66 74 73 33 44 6f 4f 70 74 69 6d   int fts3DoOptim
1c100 69 7a 65 28 46 74 73 33 54 61 62 6c 65 20 2a 70  ize(Fts3Table *p
1c110 2c 20 69 6e 74 20 62 52 65 74 75 72 6e 44 6f 6e  , int bReturnDon
1c120 65 29 7b 0a 20 20 69 6e 74 20 62 53 65 65 6e 44  e){.  int bSeenD
1c130 6f 6e 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  one = 0;.  int r
1c140 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  c;.  sqlite3_stm
1c150 74 20 2a 70 41 6c 6c 4c 61 6e 67 69 64 20 3d 20  t *pAllLangid = 
1c160 30 3b 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53  0;..  rc = fts3S
1c170 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45  qlStmt(p, SQL_SE
1c180 4c 45 43 54 5f 41 4c 4c 5f 4c 41 4e 47 49 44 2c  LECT_ALL_LANGID,
1c190 20 26 70 41 6c 6c 4c 61 6e 67 69 64 2c 20 30 29   &pAllLangid, 0)
1c1a0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1c1b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
1c1c0 20 72 63 32 3b 0a 20 20 20 20 73 71 6c 69 74 65   rc2;.    sqlite
1c1d0 33 5f 62 69 6e 64 5f 69 6e 74 28 70 41 6c 6c 4c  3_bind_int(pAllL
1c1e0 61 6e 67 69 64 2c 20 31 2c 20 70 2d 3e 6e 49 6e  angid, 1, p->nIn
1c1f0 64 65 78 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  dex);.    while(
1c200 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 41   sqlite3_step(pA
1c210 6c 6c 4c 61 6e 67 69 64 29 3d 3d 53 51 4c 49 54  llLangid)==SQLIT
1c220 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 69  E_ROW ){.      i
1c230 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt i;.      int 
1c240 69 4c 61 6e 67 69 64 20 3d 20 73 71 6c 69 74 65  iLangid = sqlite
1c250 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 41 6c  3_column_int(pAl
1c260 6c 4c 61 6e 67 69 64 2c 20 30 29 3b 0a 20 20 20  lLangid, 0);.   
1c270 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
1c280 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70  SQLITE_OK && i<p
1c290 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a  ->nIndex; i++){.
1c2a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
1c2b0 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 70 2c  3SegmentMerge(p,
1c2c0 20 69 4c 61 6e 67 69 64 2c 20 69 2c 20 46 54 53   iLangid, i, FTS
1c2d0 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c 29  3_SEGCURSOR_ALL)
1c2e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1c2f0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
1c300 0a 20 20 20 20 20 20 20 20 20 20 62 53 65 65 6e  .          bSeen
1c310 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Done = 1;.      
1c320 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c330 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OK;.        }.  
1c340 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1c350 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  rc2 = sqlite3_re
1c360 73 65 74 28 70 41 6c 6c 4c 61 6e 67 69 64 29 3b  set(pAllLangid);
1c370 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1c380 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
1c390 32 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  2;.  }..  sqlite
1c3a0 33 46 74 73 33 53 65 67 6d 65 6e 74 73 43 6c 6f  3Fts3SegmentsClo
1c3b0 73 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  se(p);.  sqlite3
1c3c0 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73  Fts3PendingTerms
1c3d0 43 6c 65 61 72 28 70 29 3b 0a 0a 20 20 72 65 74  Clear(p);..  ret
1c3e0 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
1c3f0 4f 4b 20 26 26 20 62 52 65 74 75 72 6e 44 6f 6e  OK && bReturnDon
1c400 65 20 26 26 20 62 53 65 65 6e 44 6f 6e 65 29 20  e && bSeenDone) 
1c410 3f 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3a 20  ? SQLITE_DONE : 
1c420 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1c430 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1c440 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 75 73  lled when the us
1c450 65 72 20 65 78 65 63 75 74 65 73 20 74 68 65 20  er executes the 
1c460 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d  following statem
1c470 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49  ent:.**.**     I
1c480 4e 53 45 52 54 20 49 4e 54 4f 20 3c 74 62 6c 3e  NSERT INTO <tbl>
1c490 28 3c 74 62 6c 3e 29 20 56 41 4c 55 45 53 28 27  (<tbl>) VALUES('
1c4a0 72 65 62 75 69 6c 64 27 29 3b 0a 2a 2a 0a 2a 2a  rebuild');.**.**
1c4b0 20 54 68 65 20 65 6e 74 69 72 65 20 46 54 53 20   The entire FTS 
1c4c0 69 6e 64 65 78 20 69 73 20 64 69 73 63 61 72 64  index is discard
1c4d0 65 64 20 61 6e 64 20 72 65 62 75 69 6c 74 2e 20  ed and rebuilt. 
1c4e0 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  If the table is 
1c4f0 6f 6e 65 20 0a 2a 2a 20 63 72 65 61 74 65 64 20  one .** created 
1c500 75 73 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  using the conten
1c510 74 3d 78 78 78 20 6f 70 74 69 6f 6e 2c 20 74 68  t=xxx option, th
1c520 65 6e 20 74 68 65 20 6e 65 77 20 69 6e 64 65 78  en the new index
1c530 20 69 73 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20   is based on.** 
1c540 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
1c550 65 6e 74 73 20 6f 66 20 74 68 65 20 78 78 78 20  ents of the xxx 
1c560 74 61 62 6c 65 2e 20 4f 74 68 65 72 77 69 73 65  table. Otherwise
1c570 2c 20 69 74 20 69 73 20 72 65 62 75 69 6c 74 20  , it is rebuilt 
1c580 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20  based.** on the 
1c590 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1c5a0 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e  %_content table.
1c5b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1c5c0 74 73 33 44 6f 52 65 62 75 69 6c 64 28 46 74 73  ts3DoRebuild(Fts
1c5d0 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e  3Table *p){.  in
1c5e0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1c5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c600 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
1c610 0a 20 20 72 63 20 3d 20 66 74 73 33 44 65 6c 65  .  rc = fts3Dele
1c620 74 65 41 6c 6c 28 70 2c 20 30 29 3b 0a 20 20 69  teAll(p, 0);.  i
1c630 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c640 20 29 7b 0a 20 20 20 20 75 33 32 20 2a 61 53 7a   ){.    u32 *aSz
1c650 20 3d 20 30 3b 0a 20 20 20 20 75 33 32 20 2a 61   = 0;.    u32 *a
1c660 53 7a 49 6e 73 20 3d 20 30 3b 0a 20 20 20 20 75  SzIns = 0;.    u
1c670 33 32 20 2a 61 53 7a 44 65 6c 20 3d 20 30 3b 0a  32 *aSzDel = 0;.
1c680 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
1c690 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20   *pStmt = 0;.   
1c6a0 20 69 6e 74 20 6e 45 6e 74 72 79 20 3d 20 30 3b   int nEntry = 0;
1c6b0 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 65  ..    /* Compose
1c6c0 20 61 6e 64 20 70 72 65 70 61 72 65 20 61 6e 20   and prepare an 
1c6d0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  SQL statement to
1c6e0 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68   loop through th
1c6f0 65 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20  e content table 
1c700 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  */.    char *zSq
1c710 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
1c720 6e 74 66 28 22 53 45 4c 45 43 54 20 25 73 22 20  ntf("SELECT %s" 
1c730 2c 20 70 2d 3e 7a 52 65 61 64 45 78 70 72 6c 69  , p->zReadExprli
1c740 73 74 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 53  st);.    if( !zS
1c750 71 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ql ){.      rc =
1c760 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1c770 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c780 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
1c790 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
1c7a0 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
1c7b0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
1c7c0 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
1c7d0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
1c7e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c7f0 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
1c800 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2a 20 28   sizeof(u32) * (
1c810 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 2a 33 3b  p->nColumn+1)*3;
1c820 0a 20 20 20 20 20 20 61 53 7a 20 3d 20 28 75 33  .      aSz = (u3
1c830 32 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  2 *)sqlite3_mall
1c840 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  oc(nByte);.     
1c850 20 69 66 28 20 61 53 7a 3d 3d 30 20 29 7b 0a 20   if( aSz==0 ){. 
1c860 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1c870 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
1c880 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
1c890 65 6d 73 65 74 28 61 53 7a 2c 20 30 2c 20 6e 42  emset(aSz, 0, nB
1c8a0 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 61 53  yte);.        aS
1c8b0 7a 49 6e 73 20 3d 20 26 61 53 7a 5b 70 2d 3e 6e  zIns = &aSz[p->n
1c8c0 43 6f 6c 75 6d 6e 2b 31 5d 3b 0a 20 20 20 20 20  Column+1];.     
1c8d0 20 20 20 61 53 7a 44 65 6c 20 3d 20 26 61 53 7a     aSzDel = &aSz
1c8e0 49 6e 73 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31  Ins[p->nColumn+1
1c8f0 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
1c900 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ..    while( rc=
1c910 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51  =SQLITE_OK && SQ
1c920 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
1c930 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
1c940 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b  .      int iCol;
1c950 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 61 6e 67  .      int iLang
1c960 69 64 20 3d 20 6c 61 6e 67 69 64 46 72 6f 6d 53  id = langidFromS
1c970 65 6c 65 63 74 28 70 2c 20 70 53 74 6d 74 29 3b  elect(p, pStmt);
1c980 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33  .      rc = fts3
1c990 50 65 6e 64 69 6e 67 54 65 72 6d 73 44 6f 63 69  PendingTermsDoci
1c9a0 64 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 73 71  d(p, iLangid, sq
1c9b0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
1c9c0 36 34 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20  64(pStmt, 0));. 
1c9d0 20 20 20 20 20 6d 65 6d 73 65 74 28 61 53 7a 2c       memset(aSz,
1c9e0 20 30 2c 20 73 69 7a 65 6f 66 28 61 53 7a 5b 30   0, sizeof(aSz[0
1c9f0 5d 29 20 2a 20 28 70 2d 3e 6e 43 6f 6c 75 6d 6e  ]) * (p->nColumn
1ca00 2b 31 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  +1));.      for(
1ca10 69 43 6f 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  iCol=0; rc==SQLI
1ca20 54 45 5f 4f 4b 20 26 26 20 69 43 6f 6c 3c 70 2d  TE_OK && iCol<p-
1ca30 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 43 6f 6c 2b 2b  >nColumn; iCol++
1ca40 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1ca50 2d 3e 61 62 4e 6f 74 69 6e 64 65 78 65 64 5b 69  ->abNotindexed[i
1ca60 43 6f 6c 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Col]==0 ){.     
1ca70 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1ca80 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  *z = (const char
1ca90 20 2a 29 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   *) sqlite3_colu
1caa0 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  mn_text(pStmt, i
1cab0 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  Col+1);.        
1cac0 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69    rc = fts3Pendi
1cad0 6e 67 54 65 72 6d 73 41 64 64 28 70 2c 20 69 4c  ngTermsAdd(p, iL
1cae0 61 6e 67 69 64 2c 20 7a 2c 20 69 43 6f 6c 2c 20  angid, z, iCol, 
1caf0 26 61 53 7a 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20  &aSz[iCol]);.   
1cb00 20 20 20 20 20 20 20 61 53 7a 5b 70 2d 3e 6e 43         aSz[p->nC
1cb10 6f 6c 75 6d 6e 5d 20 2b 3d 20 73 71 6c 69 74 65  olumn] += sqlite
1cb20 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
1cb30 53 74 6d 74 2c 20 69 43 6f 6c 2b 31 29 3b 0a 20  Stmt, iCol+1);. 
1cb40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1cb50 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 48  .      if( p->bH
1cb60 61 73 44 6f 63 73 69 7a 65 20 29 7b 0a 20 20 20  asDocsize ){.   
1cb70 20 20 20 20 20 66 74 73 33 49 6e 73 65 72 74 44       fts3InsertD
1cb80 6f 63 73 69 7a 65 28 26 72 63 2c 20 70 2c 20 61  ocsize(&rc, p, a
1cb90 53 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Sz);.      }.   
1cba0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1cbb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1cbc0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
1cbd0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  (pStmt);.       
1cbe0 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20   pStmt = 0;.    
1cbf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1cc00 20 6e 45 6e 74 72 79 2b 2b 3b 0a 20 20 20 20 20   nEntry++;.     
1cc10 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
1cc20 43 6f 6c 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b  Col<=p->nColumn;
1cc30 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
1cc40 20 20 20 20 61 53 7a 49 6e 73 5b 69 43 6f 6c 5d      aSzIns[iCol]
1cc50 20 2b 3d 20 61 53 7a 5b 69 43 6f 6c 5d 3b 0a 20   += aSz[iCol];. 
1cc60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1cc70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1cc80 2d 3e 62 46 74 73 34 20 29 7b 0a 20 20 20 20 20  ->bFts4 ){.     
1cc90 20 66 74 73 33 55 70 64 61 74 65 44 6f 63 54 6f   fts3UpdateDocTo
1cca0 74 61 6c 73 28 26 72 63 2c 20 70 2c 20 61 53 7a  tals(&rc, p, aSz
1ccb0 49 6e 73 2c 20 61 53 7a 44 65 6c 2c 20 6e 45 6e  Ins, aSzDel, nEn
1ccc0 74 72 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  try);.    }.    
1ccd0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 53 7a  sqlite3_free(aSz
1cce0 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 74 6d  );..    if( pStm
1ccf0 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  t ){.      int r
1cd00 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  c2 = sqlite3_fin
1cd10 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
1cd20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1cd30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1cd40 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
1cd50 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1cd60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1cd70 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1cd80 6f 6e 20 6f 70 65 6e 73 20 61 20 63 75 72 73 6f  on opens a curso
1cd90 72 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 74  r used to read t
1cda0 68 65 20 69 6e 70 75 74 20 64 61 74 61 20 66 6f  he input data fo
1cdb0 72 20 61 6e 20 0a 2a 2a 20 69 6e 63 72 65 6d 65  r an .** increme
1cdc0 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65 72 61  ntal merge opera
1cdd0 74 69 6f 6e 2e 20 53 70 65 63 69 66 69 63 61 6c  tion. Specifical
1cde0 6c 79 2c 20 69 74 20 6f 70 65 6e 73 20 61 20 63  ly, it opens a c
1cdf0 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 0a 2a 2a  ursor to scan.**
1ce00 20 74 68 65 20 6f 6c 64 65 73 74 20 6e 53 65 67   the oldest nSeg
1ce10 20 73 65 67 6d 65 6e 74 73 20 28 69 64 78 3d 30   segments (idx=0
1ce20 20 74 68 72 6f 75 67 68 20 69 64 78 3d 28 6e 53   through idx=(nS
1ce30 65 67 2d 31 29 29 20 69 6e 20 61 62 73 6f 6c 75  eg-1)) in absolu
1ce40 74 65 20 0a 2a 2a 20 6c 65 76 65 6c 20 69 41 62  te .** level iAb
1ce50 73 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69  sLevel..*/.stati
1ce60 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72 6d 65  c int fts3Incrme
1ce70 72 67 65 43 73 72 28 0a 20 20 46 74 73 33 54 61  rgeCsr(.  Fts3Ta
1ce80 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
1ce90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
1cea0 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  3 table handle *
1ceb0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
1cec0 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20  4 iAbsLevel,    
1ced0 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20      /* Absolute 
1cee0 6c 65 76 65 6c 20 74 6f 20 6f 70 65 6e 20 2a 2f  level to open */
1cef0 0a 20 20 69 6e 74 20 6e 53 65 67 2c 20 20 20 20  .  int nSeg,    
1cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf10 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1cf20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72 67  segments to merg
1cf30 65 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69  e */.  Fts3Multi
1cf40 53 65 67 52 65 61 64 65 72 20 2a 70 43 73 72 20  SegReader *pCsr 
1cf50 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
1cf60 20 6f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c   object to popul
1cf70 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ate */.){.  int 
1cf80 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1cf90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1cfa0 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
1cfb0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1cfc0 74 6d 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tmt = 0;        
1cfd0 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 73 65  /* Statement use
1cfe0 64 20 74 6f 20 72 65 61 64 20 25 5f 73 65 67 64  d to read %_segd
1cff0 69 72 20 65 6e 74 72 79 20 2a 2f 20 20 0a 20 20  ir entry */  .  
1d000 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
1d010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d020 2f 2a 20 42 79 74 65 73 20 61 6c 6c 6f 63 61 74  /* Bytes allocat
1d030 65 64 20 61 74 20 70 43 73 72 2d 3e 61 70 53 65  ed at pCsr->apSe
1d040 67 6d 65 6e 74 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a  gment[] */..  /*
1d050 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
1d060 66 6f 72 20 74 68 65 20 46 74 73 33 4d 75 6c 74  for the Fts3Mult
1d070 69 53 65 67 52 65 61 64 65 72 2e 61 43 73 72 5b  iSegReader.aCsr[
1d080 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 6d 65 6d  ] array */.  mem
1d090 73 65 74 28 70 43 73 72 2c 20 30 2c 20 73 69 7a  set(pCsr, 0, siz
1d0a0 65 6f 66 28 2a 70 43 73 72 29 29 3b 0a 20 20 6e  eof(*pCsr));.  n
1d0b0 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74  Byte = sizeof(Ft
1d0c0 73 33 53 65 67 52 65 61 64 65 72 20 2a 29 20 2a  s3SegReader *) *
1d0d0 20 6e 53 65 67 3b 0a 20 20 70 43 73 72 2d 3e 61   nSeg;.  pCsr->a
1d0e0 70 53 65 67 6d 65 6e 74 20 3d 20 28 46 74 73 33  pSegment = (Fts3
1d0f0 53 65 67 52 65 61 64 65 72 20 2a 2a 29 73 71 6c  SegReader **)sql
1d100 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74  ite3_malloc(nByt
1d110 65 29 3b 0a 0a 20 20 69 66 28 20 70 43 73 72 2d  e);..  if( pCsr-
1d120 3e 61 70 53 65 67 6d 65 6e 74 3d 3d 30 20 29 7b  >apSegment==0 ){
1d130 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1d140 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
1d150 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 43 73 72  .    memset(pCsr
1d160 2d 3e 61 70 53 65 67 6d 65 6e 74 2c 20 30 2c 20  ->apSegment, 0, 
1d170 6e 42 79 74 65 29 3b 0a 20 20 20 20 72 63 20 3d  nByte);.    rc =
1d180 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
1d190 53 51 4c 5f 53 45 4c 45 43 54 5f 4c 45 56 45 4c  SQL_SELECT_LEVEL
1d1a0 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
1d1b0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1d1c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
1d1d0 20 69 3b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   i;.    int rc2;
1d1e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
1d1f0 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31  d_int64(pStmt, 1
1d200 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20  , iAbsLevel);.  
1d210 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
1d220 6e 53 65 67 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20  nSegment==0 );. 
1d230 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
1d240 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c  SQLITE_OK && sql
1d250 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
1d260 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 26 26 20  ==SQLITE_ROW && 
1d270 69 3c 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nSeg; i++){.  
1d280 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d290 46 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 77  Fts3SegReaderNew
1d2a0 28 69 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  (i, 0,.         
1d2b0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1d2c0 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 29 2c  int64(pStmt, 1),
1d2d0 20 20 20 20 20 20 20 20 2f 2a 20 73 65 67 64 69          /* segdi
1d2e0 72 2e 73 74 61 72 74 5f 62 6c 6f 63 6b 20 2a 2f  r.start_block */
1d2f0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1d300 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
1d310 70 53 74 6d 74 2c 20 32 29 2c 20 20 20 20 20 20  pStmt, 2),      
1d320 20 20 2f 2a 20 73 65 67 64 69 72 2e 6c 65 61 76    /* segdir.leav
1d330 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a  es_end_block */.
1d340 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1d350 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
1d360 53 74 6d 74 2c 20 33 29 2c 20 20 20 20 20 20 20  Stmt, 3),       
1d370 20 2f 2a 20 73 65 67 64 69 72 2e 65 6e 64 5f 62   /* segdir.end_b
1d380 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
1d390 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
1d3a0 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 34 29 2c  _blob(pStmt, 4),
1d3b0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 67 64           /* segd
1d3c0 69 72 2e 72 6f 6f 74 20 2a 2f 0a 20 20 20 20 20  ir.root */.     
1d3d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
1d3e0 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
1d3f0 20 34 29 2c 20 20 20 20 20 20 20 20 2f 2a 20 73   4),        /* s
1d400 65 67 64 69 72 2e 72 6f 6f 74 20 2a 2f 0a 20 20  egdir.root */.  
1d410 20 20 20 20 20 20 20 20 26 70 43 73 72 2d 3e 61          &pCsr->a
1d420 70 53 65 67 6d 65 6e 74 5b 69 5d 0a 20 20 20 20  pSegment[i].    
1d430 20 20 29 3b 0a 20 20 20 20 20 20 70 43 73 72 2d    );.      pCsr-
1d440 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 20 20 20  >nSegment++;.   
1d450 20 7d 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c   }.    rc2 = sql
1d460 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
1d470 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1d480 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
1d490 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  rc2;.  }..  retu
1d4a0 72 6e 20 72 63 3b 0a 7d 0a 0a 74 79 70 65 64 65  rn rc;.}..typede
1d4b0 66 20 73 74 72 75 63 74 20 49 6e 63 72 6d 65 72  f struct Incrmer
1d4c0 67 65 57 72 69 74 65 72 20 49 6e 63 72 6d 65 72  geWriter Incrmer
1d4d0 67 65 57 72 69 74 65 72 3b 0a 74 79 70 65 64 65  geWriter;.typede
1d4e0 66 20 73 74 72 75 63 74 20 4e 6f 64 65 57 72 69  f struct NodeWri
1d4f0 74 65 72 20 4e 6f 64 65 57 72 69 74 65 72 3b 0a  ter NodeWriter;.
1d500 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 42  typedef struct B
1d510 6c 6f 62 20 42 6c 6f 62 3b 0a 74 79 70 65 64 65  lob Blob;.typede
1d520 66 20 73 74 72 75 63 74 20 4e 6f 64 65 52 65 61  f struct NodeRea
1d530 64 65 72 20 4e 6f 64 65 52 65 61 64 65 72 3b 0a  der NodeReader;.
1d540 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
1d550 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
1d560 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
1d570 20 75 73 65 64 20 61 73 20 61 20 64 79 6e 61 6d   used as a dynam
1d580 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 74 6f 20  ic buffer.** to 
1d590 62 75 69 6c 64 20 75 70 20 6e 6f 64 65 73 20 6f  build up nodes o
1d5a0 72 20 6f 74 68 65 72 20 62 6c 6f 62 73 20 6f 66  r other blobs of
1d5b0 20 64 61 74 61 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20   data in..**.** 
1d5c0 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 62 6c 6f  The function blo
1d5d0 62 47 72 6f 77 42 75 66 66 65 72 28 29 20 69 73  bGrowBuffer() is
1d5e0 20 75 73 65 64 20 74 6f 20 65 78 74 65 6e 64 20   used to extend 
1d5f0 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a  the allocation..
1d600 2a 2f 0a 73 74 72 75 63 74 20 42 6c 6f 62 20 7b  */.struct Blob {
1d610 0a 20 20 63 68 61 72 20 2a 61 3b 20 20 20 20 20  .  char *a;     
1d620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d630 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
1d640 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   allocation */. 
1d650 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
1d660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d670 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
1d680 6c 69 64 20 62 79 74 65 73 20 6f 66 20 64 61 74  lid bytes of dat
1d690 61 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 69 6e  a in a[] */.  in
1d6a0 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20  t nAlloc;       
1d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d6c0 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   Allocated size 
1d6d0 6f 66 20 61 5b 5d 20 28 6e 41 6c 6c 6f 63 3e 3d  of a[] (nAlloc>=
1d6e0 6e 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  n) */.};../*.** 
1d6f0 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  This structure i
1d700 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
1d710 75 70 20 62 75 66 66 65 72 73 20 63 6f 6e 74 61  up buffers conta
1d720 69 6e 69 6e 67 20 73 65 67 6d 65 6e 74 20 62 2d  ining segment b-
1d730 74 72 65 65 20 0a 2a 2a 20 6e 6f 64 65 73 20 28  tree .** nodes (
1d740 62 6c 6f 63 6b 73 29 2e 0a 2a 2f 0a 73 74 72 75  blocks)..*/.stru
1d750 63 74 20 4e 6f 64 65 57 72 69 74 65 72 20 7b 0a  ct NodeWriter {.
1d760 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1d770 69 42 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20  iBlock;         
1d780 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 6c 6f    /* Current blo
1d790 63 6b 20 69 64 20 2a 2f 0a 20 20 42 6c 6f 62 20  ck id */.  Blob 
1d7a0 6b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  key;            
1d7b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
1d7c0 73 74 20 6b 65 79 20 77 72 69 74 74 65 6e 20 74  st key written t
1d7d0 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 6c  o the current bl
1d7e0 6f 63 6b 20 2a 2f 0a 20 20 42 6c 6f 62 20 62 6c  ock */.  Blob bl
1d7f0 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
1d800 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
1d810 65 6e 74 20 62 6c 6f 63 6b 20 69 6d 61 67 65 20  ent block image 
1d820 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
1d830 6f 62 6a 65 63 74 20 6f 66 20 74 68 69 73 20 74  object of this t
1d840 79 70 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ype contains the
1d850 20 73 74 61 74 65 20 72 65 71 75 69 72 65 64 20   state required 
1d860 74 6f 20 63 72 65 61 74 65 20 6f 72 20 61 70 70  to create or app
1d870 65 6e 64 0a 2a 2a 20 74 6f 20 61 6e 20 61 70 70  end.** to an app
1d880 65 6e 64 61 62 6c 65 20 62 2d 74 72 65 65 20 73  endable b-tree s
1d890 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 72 75 63  egment..*/.struc
1d8a0 74 20 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65  t IncrmergeWrite
1d8b0 72 20 7b 0a 20 20 69 6e 74 20 6e 4c 65 61 66 45  r {.  int nLeafE
1d8c0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1d8d0 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61        /* Space a
1d8e0 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 6c 65 61  llocated for lea
1d8f0 66 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 69 6e  f blocks */.  in
1d900 74 20 6e 57 6f 72 6b 3b 20 20 20 20 20 20 20 20  t nWork;        
1d910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d920 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   Number of leaf 
1d930 70 61 67 65 73 20 66 6c 75 73 68 65 64 20 2a 2f  pages flushed */
1d940 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1d950 20 69 41 62 73 4c 65 76 65 6c 3b 20 20 20 20 20   iAbsLevel;     
1d960 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c     /* Absolute l
1d970 65 76 65 6c 20 6f 66 20 69 6e 70 75 74 20 73 65  evel of input se
1d980 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  gments */.  int 
1d990 69 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  iIdx;           
1d9a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1d9b0 6e 64 65 78 20 6f 66 20 2a 6f 75 74 70 75 74 2a  ndex of *output*
1d9c0 20 73 65 67 6d 65 6e 74 20 69 6e 20 69 41 62 73   segment in iAbs
1d9d0 4c 65 76 65 6c 2b 31 20 2a 2f 0a 20 20 73 71 6c  Level+1 */.  sql
1d9e0 69 74 65 33 5f 69 6e 74 36 34 20 69 53 74 61 72  ite3_int64 iStar
1d9f0 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
1da00 42 6c 6f 63 6b 20 6e 75 6d 62 65 72 20 6f 66 20  Block number of 
1da10 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20  first allocated 
1da20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 73 71 6c 69 74  block */.  sqlit
1da30 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 3b 20 20  e3_int64 iEnd;  
1da40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c             /* Bl
1da50 6f 63 6b 20 6e 75 6d 62 65 72 20 6f 66 20 6c 61  ock number of la
1da60 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 62 6c 6f  st allocated blo
1da70 63 6b 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ck */.  sqlite3_
1da80 69 6e 74 36 34 20 6e 4c 65 61 66 44 61 74 61 3b  int64 nLeafData;
1da90 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
1daa0 20 6f 66 20 6c 65 61 66 20 70 61 67 65 20 64 61   of leaf page da
1dab0 74 61 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 4e  ta so far */.  N
1dac0 6f 64 65 57 72 69 74 65 72 20 61 4e 6f 64 65 57  odeWriter aNodeW
1dad0 72 69 74 65 72 5b 46 54 53 5f 4d 41 58 5f 41 50  riter[FTS_MAX_AP
1dae0 50 45 4e 44 41 42 4c 45 5f 48 45 49 47 48 54 5d  PENDABLE_HEIGHT]
1daf0 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f  ;.};../*.** An o
1db00 62 6a 65 63 74 20 6f 66 20 74 68 65 20 66 6f 6c  bject of the fol
1db10 6c 6f 77 69 6e 67 20 74 79 70 65 20 69 73 20 75  lowing type is u
1db20 73 65 64 20 74 6f 20 72 65 61 64 20 64 61 74 61  sed to read data
1db30 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 0a 2a   from a single.*
1db40 2a 20 46 54 53 20 73 65 67 6d 65 6e 74 20 6e 6f  * FTS segment no
1db50 64 65 2e 20 53 65 65 20 74 68 65 20 66 6f 6c 6c  de. See the foll
1db60 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a  owing functions:
1db70 0a 2a 2a 0a 2a 2a 20 20 20 20 20 6e 6f 64 65 52  .**.**     nodeR
1db80 65 61 64 65 72 49 6e 69 74 28 29 0a 2a 2a 20 20  eaderInit().**  
1db90 20 20 20 6e 6f 64 65 52 65 61 64 65 72 4e 65 78     nodeReaderNex
1dba0 74 28 29 0a 2a 2a 20 20 20 20 20 6e 6f 64 65 52  t().**     nodeR
1dbb0 65 61 64 65 72 52 65 6c 65 61 73 65 28 29 0a 2a  eaderRelease().*
1dbc0 2f 0a 73 74 72 75 63 74 20 4e 6f 64 65 52 65 61  /.struct NodeRea
1dbd0 64 65 72 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68  der {.  const ch
1dbe0 61 72 20 2a 61 4e 6f 64 65 3b 0a 20 20 69 6e 74  ar *aNode;.  int
1dbf0 20 6e 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 69 4f   nNode;.  int iO
1dc00 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
1dc10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1dc20 72 65 6e 74 20 6f 66 66 73 65 74 20 77 69 74 68  rent offset with
1dc30 69 6e 20 61 4e 6f 64 65 5b 5d 20 2a 2f 0a 0a 20  in aNode[] */.. 
1dc40 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61   /* Output varia
1dc50 62 6c 65 73 2e 20 43 6f 6e 74 61 69 6e 69 6e 67  bles. Containing
1dc60 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64   the current nod
1dc70 65 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 73 71  e entry. */.  sq
1dc80 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 43 68 69  lite3_int64 iChi
1dc90 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ld;           /*
1dca0 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 68 69 6c   Pointer to chil
1dcb0 64 20 6e 6f 64 65 20 2a 2f 0a 20 20 42 6c 6f 62  d node */.  Blob
1dcc0 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20   term;          
1dcd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1dce0 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20  urrent term */. 
1dcf0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44 6f   const char *aDo
1dd00 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  clist;          
1dd10 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64   /* Pointer to d
1dd20 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  oclist */.  int 
1dd30 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20  nDoclist;       
1dd40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1dd50 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 69  ize of doclist i
1dd60 6e 20 62 79 74 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f  n bytes */.};../
1dd70 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73 20  *.** If *pRc is 
1dd80 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68  not SQLITE_OK wh
1dd90 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1dda0 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
1ddb0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74  s a no-op..** Ot
1ddc0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
1ddd0 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 20 70 42  allocation at pB
1dde0 6c 6f 62 2d 3e 61 20 69 73 20 6e 6f 74 20 61 6c  lob->a is not al
1ddf0 72 65 61 64 79 20 61 74 20 6c 65 61 73 74 20 6e  ready at least n
1de00 4d 69 6e 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20  Min.** bytes in 
1de10 73 69 7a 65 2c 20 65 78 74 65 6e 64 20 28 72 65  size, extend (re
1de20 61 6c 6c 6f 63 29 20 69 74 20 74 6f 20 62 65 20  alloc) it to be 
1de30 73 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  so..**.** If an 
1de40 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
1de50 2c 20 73 65 74 20 2a 70 52 63 20 74 6f 20 53 51  , set *pRc to SQ
1de60 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 6c  LITE_NOMEM and l
1de70 65 61 76 65 20 70 42 6c 6f 62 2d 3e 61 0a 2a 2a  eave pBlob->a.**
1de80 20 75 6e 6d 6f 64 69 66 69 65 64 2e 20 4f 74 68   unmodified. Oth
1de90 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 61  erwise, if the a
1dea0 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 63 63 65 65  llocation succee
1deb0 64 73 2c 20 75 70 64 61 74 65 20 70 42 6c 6f 62  ds, update pBlob
1dec0 2d 3e 6e 41 6c 6c 6f 63 0a 2a 2a 20 74 6f 20 72  ->nAlloc.** to r
1ded0 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77 20 73  eflect the new s
1dee0 69 7a 65 20 6f 66 20 74 68 65 20 70 42 6c 6f 62  ize of the pBlob
1def0 2d 3e 61 5b 5d 20 62 75 66 66 65 72 2e 0a 2a 2f  ->a[] buffer..*/
1df00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 6c 6f  .static void blo
1df10 62 47 72 6f 77 42 75 66 66 65 72 28 42 6c 6f 62  bGrowBuffer(Blob
1df20 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 4d 69   *pBlob, int nMi
1df30 6e 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20  n, int *pRc){.  
1df40 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
1df50 5f 4f 4b 20 26 26 20 6e 4d 69 6e 3e 70 42 6c 6f  _OK && nMin>pBlo
1df60 62 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  b->nAlloc ){.   
1df70 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 6e 4d   int nAlloc = nM
1df80 69 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 61 20  in;.    char *a 
1df90 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
1dfa0 33 5f 72 65 61 6c 6c 6f 63 28 70 42 6c 6f 62 2d  3_realloc(pBlob-
1dfb0 3e 61 2c 20 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20  >a, nAlloc);.   
1dfc0 20 69 66 28 20 61 20 29 7b 0a 20 20 20 20 20 20   if( a ){.      
1dfd0 70 42 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pBlob->nAlloc = 
1dfe0 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 70 42  nAlloc;.      pB
1dff0 6c 6f 62 2d 3e 61 20 3d 20 61 3b 0a 20 20 20 20  lob->a = a;.    
1e000 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52  }else{.      *pR
1e010 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1e020 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1e030 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
1e040 61 64 76 61 6e 63 65 20 74 68 65 20 6e 6f 64 65  advance the node
1e050 2d 72 65 61 64 65 72 20 6f 62 6a 65 63 74 20 70  -reader object p
1e060 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
1e070 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a  st argument to.*
1e080 2a 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  * the next entry
1e090 20 6f 6e 20 74 68 65 20 6e 6f 64 65 2e 20 0a 2a   on the node. .*
1e0a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65  *.** Return an e
1e0b0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20  rror code if an 
1e0c0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 53 51  error occurs (SQ
1e0d0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 70 6f  LITE_NOMEM is po
1e0e0 73 73 69 62 6c 65 29 2e 20 0a 2a 2a 20 4f 74 68  ssible). .** Oth
1e0f0 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 53 51  erwise return SQ
1e100 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72  LITE_OK. If ther
1e110 65 20 69 73 20 6e 6f 20 6e 65 78 74 20 65 6e 74  e is no next ent
1e120 72 79 20 6f 6e 20 74 68 65 20 6e 6f 64 65 0a 2a  ry on the node.*
1e130 2a 20 28 65 2e 67 2e 20 62 65 63 61 75 73 65 20  * (e.g. because 
1e140 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
1e150 79 20 69 73 20 74 68 65 20 6c 61 73 74 29 20 73  y is the last) s
1e160 65 74 20 4e 6f 64 65 52 65 61 64 65 72 2d 3e 61  et NodeReader->a
1e170 4e 6f 64 65 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 20  Node to.** NULL 
1e180 74 6f 20 69 6e 64 69 63 61 74 65 20 45 4f 46 2e  to indicate EOF.
1e190 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75   Otherwise, popu
1e1a0 6c 61 74 65 20 74 68 65 20 4e 6f 64 65 52 65 61  late the NodeRea
1e1b0 64 65 72 20 73 74 72 75 63 74 75 72 65 20 6f 75  der structure ou
1e1c0 74 70 75 74 20 0a 2a 2a 20 76 61 72 69 61 62 6c  tput .** variabl
1e1d0 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65  es for the new e
1e1e0 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ntry..*/.static 
1e1f0 69 6e 74 20 6e 6f 64 65 52 65 61 64 65 72 4e 65  int nodeReaderNe
1e200 78 74 28 4e 6f 64 65 52 65 61 64 65 72 20 2a 70  xt(NodeReader *p
1e210 29 7b 0a 20 20 69 6e 74 20 62 46 69 72 73 74 20  ){.  int bFirst 
1e220 3d 20 28 70 2d 3e 74 65 72 6d 2e 6e 3d 3d 30 29  = (p->term.n==0)
1e230 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72  ;    /* True for
1e240 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 74   first term on t
1e250 68 65 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  he node */.  int
1e260 20 6e 50 72 65 66 69 78 20 3d 20 30 3b 20 20 20   nPrefix = 0;   
1e270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e280 42 79 74 65 73 20 74 6f 20 63 6f 70 79 20 66 72  Bytes to copy fr
1e290 6f 6d 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  om previous term
1e2a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 66 66 69   */.  int nSuffi
1e2b0 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  x = 0;          
1e2c0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74        /* Bytes t
1e2d0 6f 20 61 70 70 65 6e 64 20 74 6f 20 74 68 65 20  o append to the 
1e2e0 70 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20  prefix */.  int 
1e2f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1e300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1e310 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
1e320 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4e 6f 64   assert( p->aNod
1e330 65 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 43  e );.  if( p->iC
1e340 68 69 6c 64 20 26 26 20 62 46 69 72 73 74 3d 3d  hild && bFirst==
1e350 30 20 29 20 70 2d 3e 69 43 68 69 6c 64 2b 2b 3b  0 ) p->iChild++;
1e360 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 3e 3d  .  if( p->iOff>=
1e370 70 2d 3e 6e 4e 6f 64 65 20 29 7b 0a 20 20 20 20  p->nNode ){.    
1e380 2f 2a 20 45 4f 46 20 2a 2f 0a 20 20 20 20 70 2d  /* EOF */.    p-
1e390 3e 61 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 7d 65  >aNode = 0;.  }e
1e3a0 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 62 46 69  lse{.    if( bFi
1e3b0 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rst==0 ){.      
1e3c0 70 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 33 47  p->iOff += fts3G
1e3d0 65 74 56 61 72 69 6e 74 33 32 28 26 70 2d 3e 61  etVarint32(&p->a
1e3e0 4e 6f 64 65 5b 70 2d 3e 69 4f 66 66 5d 2c 20 26  Node[p->iOff], &
1e3f0 6e 50 72 65 66 69 78 29 3b 0a 20 20 20 20 7d 0a  nPrefix);.    }.
1e400 20 20 20 20 70 2d 3e 69 4f 66 66 20 2b 3d 20 66      p->iOff += f
1e410 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts3GetVarint32(&
1e420 70 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f 66 66  p->aNode[p->iOff
1e430 5d 2c 20 26 6e 53 75 66 66 69 78 29 3b 0a 0a 20  ], &nSuffix);.. 
1e440 20 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65     blobGrowBuffe
1e450 72 28 26 70 2d 3e 74 65 72 6d 2c 20 6e 50 72 65  r(&p->term, nPre
1e460 66 69 78 2b 6e 53 75 66 66 69 78 2c 20 26 72 63  fix+nSuffix, &rc
1e470 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1e480 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e490 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 74 65 72    memcpy(&p->ter
1e4a0 6d 2e 61 5b 6e 50 72 65 66 69 78 5d 2c 20 26 70  m.a[nPrefix], &p
1e4b0 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f 66 66 5d  ->aNode[p->iOff]
1e4c0 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 20 20  , nSuffix);.    
1e4d0 20 20 70 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e 50    p->term.n = nP
1e4e0 72 65 66 69 78 2b 6e 53 75 66 66 69 78 3b 0a 20  refix+nSuffix;. 
1e4f0 20 20 20 20 20 70 2d 3e 69 4f 66 66 20 2b 3d 20       p->iOff += 
1e500 6e 53 75 66 66 69 78 3b 0a 20 20 20 20 20 20 69  nSuffix;.      i
1e510 66 28 20 70 2d 3e 69 43 68 69 6c 64 3d 3d 30 20  f( p->iChild==0 
1e520 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f  ){.        p->iO
1e530 66 66 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72  ff += fts3GetVar
1e540 69 6e 74 33 32 28 26 70 2d 3e 61 4e 6f 64 65 5b  int32(&p->aNode[
1e550 70 2d 3e 69 4f 66 66 5d 2c 20 26 70 2d 3e 6e 44  p->iOff], &p->nD
1e560 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  oclist);.       
1e570 20 70 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20 26   p->aDoclist = &
1e580 70 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f 66 66  p->aNode[p->iOff
1e590 5d 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f  ];.        p->iO
1e5a0 66 66 20 2b 3d 20 70 2d 3e 6e 44 6f 63 6c 69 73  ff += p->nDoclis
1e5b0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1e5c0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1e5d0 70 2d 3e 69 4f 66 66 3c 3d 70 2d 3e 6e 4e 6f 64  p->iOff<=p->nNod
1e5e0 65 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  e );..  return r
1e5f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  c;.}../*.** Rele
1e600 61 73 65 20 61 6c 6c 20 64 79 6e 61 6d 69 63 20  ase all dynamic 
1e610 72 65 73 6f 75 72 63 65 73 20 68 65 6c 64 20 62  resources held b
1e620 79 20 6e 6f 64 65 2d 72 65 61 64 65 72 20 6f 62  y node-reader ob
1e630 6a 65 63 74 20 2a 70 2e 0a 2a 2f 0a 73 74 61 74  ject *p..*/.stat
1e640 69 63 20 76 6f 69 64 20 6e 6f 64 65 52 65 61 64  ic void nodeRead
1e650 65 72 52 65 6c 65 61 73 65 28 4e 6f 64 65 52 65  erRelease(NodeRe
1e660 61 64 65 72 20 2a 70 29 7b 0a 20 20 73 71 6c 69  ader *p){.  sqli
1e670 74 65 33 5f 66 72 65 65 28 70 2d 3e 74 65 72 6d  te3_free(p->term
1e680 2e 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .a);.}../*.** In
1e690 69 74 69 61 6c 69 7a 65 20 61 20 6e 6f 64 65 2d  itialize a node-
1e6a0 72 65 61 64 65 72 20 6f 62 6a 65 63 74 20 74 6f  reader object to
1e6b0 20 72 65 61 64 20 74 68 65 20 6e 6f 64 65 20 69   read the node i
1e6c0 6e 20 62 75 66 66 65 72 20 61 4e 6f 64 65 2f 6e  n buffer aNode/n
1e6d0 4e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  Node..**.** If s
1e6e0 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
1e6f0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1e700 20 61 6e 64 20 74 68 65 20 4e 6f 64 65 52 65 61   and the NodeRea
1e710 64 65 72 20 6f 62 6a 65 63 74 20 73 65 74 20 74  der object set t
1e720 6f 20 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74  o .** point to t
1e730 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 6f  he first entry o
1e740 6e 20 74 68 65 20 6e 6f 64 65 20 28 69 66 20 61  n the node (if a
1e750 6e 79 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ny). Otherwise, 
1e760 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72  an SQLite.** err
1e770 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1e780 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
1e790 6e 74 20 6e 6f 64 65 52 65 61 64 65 72 49 6e 69  nt nodeReaderIni
1e7a0 74 28 4e 6f 64 65 52 65 61 64 65 72 20 2a 70 2c  t(NodeReader *p,
1e7b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 4e 6f   const char *aNo
1e7c0 64 65 2c 20 69 6e 74 20 6e 4e 6f 64 65 29 7b 0a  de, int nNode){.
1e7d0 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
1e7e0 69 7a 65 6f 66 28 4e 6f 64 65 52 65 61 64 65 72  izeof(NodeReader
1e7f0 29 29 3b 0a 20 20 70 2d 3e 61 4e 6f 64 65 20 3d  ));.  p->aNode =
1e800 20 61 4e 6f 64 65 3b 0a 20 20 70 2d 3e 6e 4e 6f   aNode;.  p->nNo
1e810 64 65 20 3d 20 6e 4e 6f 64 65 3b 0a 0a 20 20 2f  de = nNode;..  /
1e820 2a 20 46 69 67 75 72 65 20 6f 75 74 20 69 66 20  * Figure out if 
1e830 74 68 69 73 20 69 73 20 61 20 6c 65 61 66 20 6f  this is a leaf o
1e840 72 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  r an internal no
1e850 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  de. */.  if( p->
1e860 61 4e 6f 64 65 5b 30 5d 20 29 7b 0a 20 20 20 20  aNode[0] ){.    
1e870 2f 2a 20 41 6e 20 69 6e 74 65 72 6e 61 6c 20 6e  /* An internal n
1e880 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 69  ode. */.    p->i
1e890 4f 66 66 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  Off = 1 + sqlite
1e8a0 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 26  3Fts3GetVarint(&
1e8b0 70 2d 3e 61 4e 6f 64 65 5b 31 5d 2c 20 26 70 2d  p->aNode[1], &p-
1e8c0 3e 69 43 68 69 6c 64 29 3b 0a 20 20 7d 65 6c 73  >iChild);.  }els
1e8d0 65 7b 0a 20 20 20 20 70 2d 3e 69 4f 66 66 20 3d  e{.    p->iOff =
1e8e0 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   1;.  }..  retur
1e8f0 6e 20 6e 6f 64 65 52 65 61 64 65 72 4e 65 78 74  n nodeReaderNext
1e900 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  (p);.}../*.** Th
1e910 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1e920 61 6c 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74  alled while writ
1e930 69 6e 67 20 61 6e 20 46 54 53 20 73 65 67 6d 65  ing an FTS segme
1e940 6e 74 20 65 61 63 68 20 74 69 6d 65 20 61 20 6c  nt each time a l
1e950 65 61 66 20 6f 0a 2a 2a 20 6e 6f 64 65 20 69 73  eaf o.** node is
1e960 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20 77 72   finished and wr
1e970 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 54  itten to disk. T
1e980 68 65 20 6b 65 79 20 28 7a 54 65 72 6d 2f 6e 54  he key (zTerm/nT
1e990 65 72 6d 29 20 69 73 20 67 75 61 72 61 6e 74 65  erm) is guarante
1e9a0 65 64 0a 2a 2a 20 74 6f 20 62 65 20 67 72 65 61  ed.** to be grea
1e9b0 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72  ter than the lar
1e9c0 67 65 73 74 20 6b 65 79 20 6f 6e 20 74 68 65 20  gest key on the 
1e9d0 6e 6f 64 65 20 6a 75 73 74 20 77 72 69 74 74 65  node just writte
1e9e0 6e 2c 20 62 75 74 20 73 6d 61 6c 6c 65 72 0a 2a  n, but smaller.*
1e9f0 2a 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  * than or equal 
1ea00 74 6f 20 74 68 65 20 66 69 72 73 74 20 6b 65 79  to the first key
1ea10 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 77 72   that will be wr
1ea20 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6e 65 78  itten to the nex
1ea30 74 20 6c 65 61 66 0a 2a 2a 20 6e 6f 64 65 2e 0a  t leaf.** node..
1ea40 2a 2a 0a 2a 2a 20 54 68 65 20 62 6c 6f 63 6b 20  **.** The block 
1ea50 69 64 20 6f 66 20 74 68 65 20 6c 65 61 66 20 6e  id of the leaf n
1ea60 6f 64 65 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ode just written
1ea70 20 74 6f 20 64 69 73 6b 20 6d 61 79 20 62 65 20   to disk may be 
1ea80 66 6f 75 6e 64 20 69 6e 0a 2a 2a 20 28 70 57 72  found in.** (pWr
1ea90 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65  iter->aNodeWrite
1eaa0 72 5b 30 5d 2e 69 42 6c 6f 63 6b 29 20 77 68 65  r[0].iBlock) whe
1eab0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1eac0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
1ead0 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63  atic int fts3Inc
1eae0 72 6d 65 72 67 65 50 75 73 68 28 0a 20 20 46 74  rmergePush(.  Ft
1eaf0 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
1eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eb10 20 46 74 73 33 20 74 61 62 6c 65 20 68 61 6e 64   Fts3 table hand
1eb20 6c 65 20 2a 2f 0a 20 20 49 6e 63 72 6d 65 72 67  le */.  Incrmerg
1eb30 65 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  eWriter *pWriter
1eb40 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ,       /* Write
1eb50 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  r object */.  co
1eb60 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c  nst char *zTerm,
1eb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eb80 20 54 65 72 6d 20 74 6f 20 77 72 69 74 65 20 74   Term to write t
1eb90 6f 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20  o internal node 
1eba0 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 20 20  */.  int nTerm  
1ebb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebc0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 61 74       /* Bytes at
1ebd0 20 7a 54 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 73   zTerm */.){.  s
1ebe0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 74  qlite3_int64 iPt
1ebf0 72 20 3d 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f  r = pWriter->aNo
1ec00 64 65 57 72 69 74 65 72 5b 30 5d 2e 69 42 6c 6f  deWriter[0].iBlo
1ec10 63 6b 3b 0a 20 20 69 6e 74 20 69 4c 61 79 65 72  ck;.  int iLayer
1ec20 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  ;..  assert( nTe
1ec30 72 6d 3e 30 20 29 3b 0a 20 20 66 6f 72 28 69 4c  rm>0 );.  for(iL
1ec40 61 79 65 72 3d 31 3b 20 41 4c 57 41 59 53 28 69  ayer=1; ALWAYS(i
1ec50 4c 61 79 65 72 3c 46 54 53 5f 4d 41 58 5f 41 50  Layer<FTS_MAX_AP
1ec60 50 45 4e 44 41 42 4c 45 5f 48 45 49 47 48 54 29  PENDABLE_HEIGHT)
1ec70 3b 20 69 4c 61 79 65 72 2b 2b 29 7b 0a 20 20 20  ; iLayer++){.   
1ec80 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1ec90 4e 65 78 74 50 74 72 20 3d 20 30 3b 0a 20 20 20  NextPtr = 0;.   
1eca0 20 4e 6f 64 65 57 72 69 74 65 72 20 2a 70 4e 6f   NodeWriter *pNo
1ecb0 64 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  de = &pWriter->a
1ecc0 4e 6f 64 65 57 72 69 74 65 72 5b 69 4c 61 79 65  NodeWriter[iLaye
1ecd0 72 5d 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  r];.    int rc =
1ece0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1ecf0 69 6e 74 20 6e 50 72 65 66 69 78 3b 0a 20 20 20  int nPrefix;.   
1ed00 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 0a 20 20   int nSuffix;.  
1ed10 20 20 69 6e 74 20 6e 53 70 61 63 65 3b 0a 0a 20    int nSpace;.. 
1ed20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
1ed30 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20   how much space 
1ed40 74 68 65 20 6b 65 79 20 77 69 6c 6c 20 63 6f 6e  the key will con
1ed50 73 75 6d 65 20 69 66 20 69 74 20 69 73 20 77 72  sume if it is wr
1ed60 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20  itten to.    ** 
1ed70 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65  the current node
1ed80 20 6f 66 20 6c 61 79 65 72 20 69 4c 61 79 65 72   of layer iLayer
1ed90 2e 20 44 75 65 20 74 6f 20 74 68 65 20 70 72 65  . Due to the pre
1eda0 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f 6e 2c  fix compression,
1edb0 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 70 61   .    ** the spa
1edc0 63 65 20 72 65 71 75 69 72 65 64 20 63 68 61 6e  ce required chan
1edd0 67 65 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ges depending on
1ede0 20 77 68 69 63 68 20 6e 6f 64 65 20 74 68 65 20   which node the 
1edf0 6b 65 79 20 69 73 20 74 6f 0a 20 20 20 20 2a 2a  key is to.    **
1ee00 20 62 65 20 61 64 64 65 64 20 74 6f 2e 20 20 2a   be added to.  *
1ee10 2f 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20  /.    nPrefix = 
1ee20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65  fts3PrefixCompre
1ee30 73 73 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e 61 2c  ss(pNode->key.a,
1ee40 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 2c 20 7a   pNode->key.n, z
1ee50 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20  Term, nTerm);.  
1ee60 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72    nSuffix = nTer
1ee70 6d 20 2d 20 6e 50 72 65 66 69 78 3b 0a 20 20 20  m - nPrefix;.   
1ee80 20 6e 53 70 61 63 65 20 20 3d 20 73 71 6c 69 74   nSpace  = sqlit
1ee90 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28  e3Fts3VarintLen(
1eea0 6e 50 72 65 66 69 78 29 3b 0a 20 20 20 20 6e 53  nPrefix);.    nS
1eeb0 70 61 63 65 20 2b 3d 20 73 71 6c 69 74 65 33 46  pace += sqlite3F
1eec0 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 53 75  ts3VarintLen(nSu
1eed0 66 66 69 78 29 20 2b 20 6e 53 75 66 66 69 78 3b  ffix) + nSuffix;
1eee0 0a 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d  ..    if( pNode-
1eef0 3e 6b 65 79 2e 6e 3d 3d 30 20 7c 7c 20 28 70 4e  >key.n==0 || (pN
1ef00 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 20 2b 20 6e  ode->block.n + n
1ef10 53 70 61 63 65 29 3c 3d 70 2d 3e 6e 4e 6f 64 65  Space)<=p->nNode
1ef20 53 69 7a 65 20 29 7b 20 0a 20 20 20 20 20 20 2f  Size ){ .      /
1ef30 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
1ef40 20 6e 6f 64 65 20 6f 66 20 6c 61 79 65 72 20 69   node of layer i
1ef50 4c 61 79 65 72 20 63 6f 6e 74 61 69 6e 73 20 7a  Layer contains z
1ef60 65 72 6f 20 6b 65 79 73 2c 20 6f 72 20 69 66 20  ero keys, or if 
1ef70 61 64 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  adding.      ** 
1ef80 74 68 65 20 6b 65 79 20 74 6f 20 69 74 20 77 69  the key to it wi
1ef90 6c 6c 20 6e 6f 74 20 63 61 75 73 65 20 69 74 20  ll not cause it 
1efa0 74 6f 20 67 72 6f 77 20 74 6f 20 6c 61 72 67 65  to grow to large
1efb0 72 20 74 68 61 6e 20 6e 4e 6f 64 65 53 69 7a 65  r than nNodeSize
1efc0 20 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73   .      ** bytes
1efd0 20 69 6e 20 73 69 7a 65 2c 20 77 72 69 74 65 20   in size, write 
1efe0 74 68 65 20 6b 65 79 20 68 65 72 65 2e 20 20 2a  the key here.  *
1eff0 2f 0a 0a 20 20 20 20 20 20 42 6c 6f 62 20 2a 70  /..      Blob *p
1f000 42 6c 6b 20 3d 20 26 70 4e 6f 64 65 2d 3e 62 6c  Blk = &pNode->bl
1f010 6f 63 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ock;.      if( p
1f020 42 6c 6b 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20  Blk->n==0 ){.   
1f030 20 20 20 20 20 62 6c 6f 62 47 72 6f 77 42 75 66       blobGrowBuf
1f040 66 65 72 28 70 42 6c 6b 2c 20 70 2d 3e 6e 4e 6f  fer(pBlk, p->nNo
1f050 64 65 53 69 7a 65 2c 20 26 72 63 29 3b 0a 20 20  deSize, &rc);.  
1f060 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1f070 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f080 20 20 20 20 20 70 42 6c 6b 2d 3e 61 5b 30 5d 20       pBlk->a[0] 
1f090 3d 20 28 63 68 61 72 29 69 4c 61 79 65 72 3b 0a  = (char)iLayer;.
1f0a0 20 20 20 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e            pBlk->
1f0b0 6e 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 46  n = 1 + sqlite3F
1f0c0 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 42  ts3PutVarint(&pB
1f0d0 6c 6b 2d 3e 61 5b 31 5d 2c 20 69 50 74 72 29 3b  lk->a[1], iPtr);
1f0e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f0f0 20 7d 0a 20 20 20 20 20 20 62 6c 6f 62 47 72 6f   }.      blobGro
1f100 77 42 75 66 66 65 72 28 70 42 6c 6b 2c 20 70 42  wBuffer(pBlk, pB
1f110 6c 6b 2d 3e 6e 20 2b 20 6e 53 70 61 63 65 2c 20  lk->n + nSpace, 
1f120 26 72 63 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62  &rc);.      blob
1f130 47 72 6f 77 42 75 66 66 65 72 28 26 70 4e 6f 64  GrowBuffer(&pNod
1f140 65 2d 3e 6b 65 79 2c 20 6e 54 65 72 6d 2c 20 26  e->key, nTerm, &
1f150 72 63 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  rc);..      if( 
1f160 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f170 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 6f  .        if( pNo
1f180 64 65 2d 3e 6b 65 79 2e 6e 20 29 7b 0a 20 20 20  de->key.n ){.   
1f190 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e 6e 20 2b         pBlk->n +
1f1a0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74  = sqlite3Fts3Put
1f1b0 56 61 72 69 6e 74 28 26 70 42 6c 6b 2d 3e 61 5b  Varint(&pBlk->a[
1f1c0 70 42 6c 6b 2d 3e 6e 5d 2c 20 6e 50 72 65 66 69  pBlk->n], nPrefi
1f1d0 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
1f1e0 20 20 20 20 20 20 70 42 6c 6b 2d 3e 6e 20 2b 3d        pBlk->n +=
1f1f0 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56   sqlite3Fts3PutV
1f200 61 72 69 6e 74 28 26 70 42 6c 6b 2d 3e 61 5b 70  arint(&pBlk->a[p
1f210 42 6c 6b 2d 3e 6e 5d 2c 20 6e 53 75 66 66 69 78  Blk->n], nSuffix
1f220 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
1f230 79 28 26 70 42 6c 6b 2d 3e 61 5b 70 42 6c 6b 2d  y(&pBlk->a[pBlk-
1f240 3e 6e 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50 72 65  >n], &zTerm[nPre
1f250 66 69 78 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a  fix], nSuffix);.
1f260 20 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e 6e 20          pBlk->n 
1f270 2b 3d 20 6e 53 75 66 66 69 78 3b 0a 0a 20 20 20  += nSuffix;..   
1f280 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 6f 64       memcpy(pNod
1f290 65 2d 3e 6b 65 79 2e 61 2c 20 7a 54 65 72 6d 2c  e->key.a, zTerm,
1f2a0 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20   nTerm);.       
1f2b0 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 20 3d 20   pNode->key.n = 
1f2c0 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  nTerm;.      }. 
1f2d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f2e0 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6c  /* Otherwise, fl
1f2f0 75 73 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ush the current 
1f300 6e 6f 64 65 20 6f 66 20 6c 61 79 65 72 20 69 4c  node of layer iL
1f310 61 79 65 72 20 74 6f 20 64 69 73 6b 2e 0a 20 20  ayer to disk..  
1f320 20 20 20 20 2a 2a 20 54 68 65 6e 20 61 6c 6c 6f      ** Then allo
1f330 63 61 74 65 20 61 20 6e 65 77 2c 20 65 6d 70 74  cate a new, empt
1f340 79 20 73 69 62 6c 69 6e 67 20 6e 6f 64 65 2e 20  y sibling node. 
1f350 54 68 65 20 6b 65 79 20 77 69 6c 6c 20 62 65 20  The key will be 
1f360 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 2a 2a  written.      **
1f370 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
1f380 20 6f 66 20 74 68 69 73 20 6e 6f 64 65 2e 20 2a   of this node. *
1f390 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  /.      rc = fts
1f3a0 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28 70 2c  3WriteSegment(p,
1f3b0 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b 2c 20   pNode->iBlock, 
1f3c0 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 2c 20  pNode->block.a, 
1f3d0 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 29 3b  pNode->block.n);
1f3e0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
1f3f0 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 41 6c  pNode->block.nAl
1f400 6c 6f 63 3e 3d 70 2d 3e 6e 4e 6f 64 65 53 69 7a  loc>=p->nNodeSiz
1f410 65 20 29 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65  e );.      pNode
1f420 2d 3e 62 6c 6f 63 6b 2e 61 5b 30 5d 20 3d 20 28  ->block.a[0] = (
1f430 63 68 61 72 29 69 4c 61 79 65 72 3b 0a 20 20 20  char)iLayer;.   
1f440 20 20 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e     pNode->block.
1f450 6e 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 46  n = 1 + sqlite3F
1f460 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 4e  ts3PutVarint(&pN
1f470 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 5b 31 5d 2c  ode->block.a[1],
1f480 20 69 50 74 72 2b 31 29 3b 0a 0a 20 20 20 20 20   iPtr+1);..     
1f490 20 69 4e 65 78 74 50 74 72 20 3d 20 70 4e 6f 64   iNextPtr = pNod
1f4a0 65 2d 3e 69 42 6c 6f 63 6b 3b 0a 20 20 20 20 20  e->iBlock;.     
1f4b0 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b 2b 2b   pNode->iBlock++
1f4c0 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 6b  ;.      pNode->k
1f4d0 65 79 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ey.n = 0;.    }.
1f4e0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1f4f0 49 54 45 5f 4f 4b 20 7c 7c 20 69 4e 65 78 74 50  ITE_OK || iNextP
1f500 74 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72  tr==0 ) return r
1f510 63 3b 0a 20 20 20 20 69 50 74 72 20 3d 20 69 4e  c;.    iPtr = iN
1f520 65 78 74 50 74 72 3b 0a 20 20 7d 0a 0a 20 20 61  extPtr;.  }..  a
1f530 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 72 65  ssert( 0 );.  re
1f540 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1f550 20 41 70 70 65 6e 64 20 61 20 74 65 72 6d 20 61   Append a term a
1f560 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
1f570 64 6f 63 6c 69 73 74 20 74 6f 20 74 68 65 20 46  doclist to the F
1f580 54 53 20 73 65 67 6d 65 6e 74 20 6e 6f 64 65 20  TS segment node 
1f590 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 73 74 6f  currently.** sto
1f5a0 72 65 64 20 69 6e 20 62 6c 6f 62 20 2a 70 4e 6f  red in blob *pNo
1f5b0 64 65 2e 20 54 68 65 20 6e 6f 64 65 20 6e 65 65  de. The node nee
1f5c0 64 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  d not contain an
1f5d0 79 20 74 65 72 6d 73 2c 20 62 75 74 20 74 68 65  y terms, but the
1f5e0 0a 2a 2a 20 68 65 61 64 65 72 20 6d 75 73 74 20  .** header must 
1f5f0 62 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72  be written befor
1f600 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
1f610 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
1f620 20 41 20 6e 6f 64 65 20 68 65 61 64 65 72 20 69   A node header i
1f630 73 20 61 20 73 69 6e 67 6c 65 20 30 78 30 30 20  s a single 0x00 
1f640 62 79 74 65 20 66 6f 72 20 61 20 6c 65 61 66 20  byte for a leaf 
1f650 6e 6f 64 65 2c 20 6f 72 20 61 20 68 65 69 67 68  node, or a heigh
1f660 74 20 76 61 72 69 6e 74 0a 2a 2a 20 66 6f 6c 6c  t varint.** foll
1f670 6f 77 65 64 20 62 79 20 74 68 65 20 6c 65 66 74  owed by the left
1f680 2d 68 61 6e 64 2d 63 68 69 6c 64 20 76 61 72 69  -hand-child vari
1f690 6e 74 20 66 6f 72 20 61 6e 20 69 6e 74 65 72 6e  nt for an intern
1f6a0 61 6c 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  al node..**.** T
1f6b0 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 70  he term to be ap
1f6c0 70 65 6e 64 65 64 20 69 73 20 70 61 73 73 65 64  pended is passed
1f6d0 20 76 69 61 20 61 72 67 75 6d 65 6e 74 73 20 7a   via arguments z
1f6e0 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 46 6f 72 20  Term/nTerm. For 
1f6f0 61 20 0a 2a 2a 20 6c 65 61 66 20 6e 6f 64 65 2c  a .** leaf node,
1f700 20 74 68 65 20 64 6f 63 6c 69 73 74 20 69 73 20   the doclist is 
1f710 70 61 73 73 65 64 20 61 73 20 61 44 6f 63 6c 69  passed as aDocli
1f720 73 74 2f 6e 44 6f 63 6c 69 73 74 2e 20 46 6f 72  st/nDoclist. For
1f730 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20   an internal.** 
1f740 6e 6f 64 65 2c 20 62 6f 74 68 20 61 44 6f 63 6c  node, both aDocl
1f750 69 73 74 20 61 6e 64 20 6e 44 6f 63 6c 69 73 74  ist and nDoclist
1f760 20 6d 75 73 74 20 62 65 20 70 61 73 73 65 64 20   must be passed 
1f770 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  0..**.** If the 
1f780 73 69 7a 65 20 6f 66 20 74 68 65 20 76 61 6c 75  size of the valu
1f790 65 20 69 6e 20 62 6c 6f 62 20 70 50 72 65 76 20  e in blob pPrev 
1f7a0 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  is zero, then th
1f7b0 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  is is the first.
1f7c0 2a 2a 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20  ** term written 
1f7d0 74 6f 20 74 68 65 20 6e 6f 64 65 2e 20 4f 74 68  to the node. Oth
1f7e0 65 72 77 69 73 65 2c 20 70 50 72 65 76 20 63 6f  erwise, pPrev co
1f7f0 6e 74 61 69 6e 73 20 61 20 63 6f 70 79 20 6f 66  ntains a copy of
1f800 20 74 68 65 20 0a 2a 2a 20 70 72 65 76 69 6f 75   the .** previou
1f810 73 20 74 65 72 6d 2e 20 42 65 66 6f 72 65 20 74  s term. Before t
1f820 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
1f830 75 72 6e 73 2c 20 69 74 20 69 73 20 75 70 64 61  urns, it is upda
1f840 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61  ted to contain a
1f850 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 7a 54 65 72  .** copy of zTer
1f860 6d 2f 6e 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 49  m/nTerm..**.** I
1f870 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1f880 74 20 74 68 65 20 62 75 66 66 65 72 20 61 73 73  t the buffer ass
1f890 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 4e 6f  ociated with pNo
1f8a0 64 65 20 69 73 20 61 6c 72 65 61 64 79 20 6c 61  de is already la
1f8b0 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 74 6f  rge.** enough to
1f8c0 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65   accommodate the
1f8d0 20 6e 65 77 20 65 6e 74 72 79 2e 20 54 68 65 20   new entry. The 
1f8e0 62 75 66 66 65 72 20 61 73 73 6f 63 69 61 74 65  buffer associate
1f8f0 64 20 77 69 74 68 20 70 50 72 65 76 0a 2a 2a 20  d with pPrev.** 
1f900 69 73 20 65 78 74 65 6e 64 65 64 20 62 79 20 74  is extended by t
1f910 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20  his function if 
1f920 72 65 71 75 72 69 72 65 64 2e 0a 2a 2a 0a 2a 2a  requrired..**.**
1f930 20 49 66 20 61 6e 20 65 72 72 6f 72 20 28 69 2e   If an error (i.
1f940 65 2e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  e. OOM condition
1f950 29 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  ) occurs, an SQL
1f960 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
1f970 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f  s.** returned. O
1f980 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
1f990 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
1f9a0 6e 74 20 66 74 73 33 41 70 70 65 6e 64 54 6f 4e  nt fts3AppendToN
1f9b0 6f 64 65 28 0a 20 20 42 6c 6f 62 20 2a 70 4e 6f  ode(.  Blob *pNo
1f9c0 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
1f9d0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
1f9e0 74 20 6e 6f 64 65 20 69 6d 61 67 65 20 74 6f 20  t node image to 
1f9f0 61 70 70 65 6e 64 20 74 6f 20 2a 2f 0a 20 20 42  append to */.  B
1fa00 6c 6f 62 20 2a 70 50 72 65 76 2c 20 20 20 20 20  lob *pPrev,     
1fa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fa20 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
1fa30 69 6e 67 20 70 72 65 76 69 6f 75 73 20 74 65 72  ing previous ter
1fa40 6d 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 63  m written */.  c
1fa50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
1fa60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1fa70 2a 20 4e 65 77 20 74 65 72 6d 20 74 6f 20 77 72  * New term to wr
1fa80 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  ite */.  int nTe
1fa90 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
1faa0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1fab0 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62 79 74   of zTerm in byt
1fac0 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  es */.  const ch
1fad0 61 72 20 2a 61 44 6f 63 6c 69 73 74 2c 20 20 20  ar *aDoclist,   
1fae0 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69          /* Docli
1faf0 73 74 20 28 6f 72 20 4e 55 4c 4c 29 20 74 6f 20  st (or NULL) to 
1fb00 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  write */.  int n
1fb10 44 6f 63 6c 69 73 74 20 20 20 20 20 20 20 20 20  Doclist         
1fb20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1fb30 7a 65 20 6f 66 20 61 44 6f 63 6c 69 73 74 20 69  ze of aDoclist i
1fb40 6e 20 62 79 74 65 73 20 2a 2f 20 0a 29 7b 0a 20  n bytes */ .){. 
1fb50 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1fb60 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
1fb70 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1fb80 2a 2f 0a 20 20 69 6e 74 20 62 46 69 72 73 74 20  */.  int bFirst 
1fb90 3d 20 28 70 50 72 65 76 2d 3e 6e 3d 3d 30 29 3b  = (pPrev->n==0);
1fba0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1fbb0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1fbc0 74 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20 2a  t term written *
1fbd0 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b  /.  int nPrefix;
1fbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbf0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1fc00 65 72 6d 20 70 72 65 66 69 78 20 69 6e 20 62 79  erm prefix in by
1fc10 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  tes */.  int nSu
1fc20 66 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20  ffix;           
1fc30 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1fc40 20 6f 66 20 74 65 72 6d 20 73 75 66 66 69 78 20   of term suffix 
1fc50 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f  in bytes */..  /
1fc60 2a 20 4e 6f 64 65 20 6d 75 73 74 20 68 61 76 65  * Node must have
1fc70 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 74   already been st
1fc80 61 72 74 65 64 2e 20 54 68 65 72 65 20 6d 75 73  arted. There mus
1fc90 74 20 62 65 20 61 20 64 6f 63 6c 69 73 74 20 66  t be a doclist f
1fca0 6f 72 20 61 0a 20 20 2a 2a 20 6c 65 61 66 20 6e  or a.  ** leaf n
1fcb0 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 6d  ode, and there m
1fcc0 75 73 74 20 6e 6f 74 20 62 65 20 61 20 64 6f 63  ust not be a doc
1fcd0 6c 69 73 74 20 66 6f 72 20 61 6e 20 69 6e 74 65  list for an inte
1fce0 72 6e 61 6c 20 6e 6f 64 65 2e 20 20 2a 2f 0a 20  rnal node.  */. 
1fcf0 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e   assert( pNode->
1fd00 6e 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  n>0 );.  assert(
1fd10 20 28 70 4e 6f 64 65 2d 3e 61 5b 30 5d 3d 3d 27   (pNode->a[0]=='
1fd20 5c 30 27 29 3d 3d 28 61 44 6f 63 6c 69 73 74 21  \0')==(aDoclist!
1fd30 3d 30 29 20 29 3b 0a 0a 20 20 62 6c 6f 62 47 72  =0) );..  blobGr
1fd40 6f 77 42 75 66 66 65 72 28 70 50 72 65 76 2c 20  owBuffer(pPrev, 
1fd50 6e 54 65 72 6d 2c 20 26 72 63 29 3b 0a 20 20 69  nTerm, &rc);.  i
1fd60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1fd70 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
1fd80 20 6e 50 72 65 66 69 78 20 3d 20 66 74 73 33 50   nPrefix = fts3P
1fd90 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70 50  refixCompress(pP
1fda0 72 65 76 2d 3e 61 2c 20 70 50 72 65 76 2d 3e 6e  rev->a, pPrev->n
1fdb0 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b  , zTerm, nTerm);
1fdc0 0a 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65  .  nSuffix = nTe
1fdd0 72 6d 20 2d 20 6e 50 72 65 66 69 78 3b 0a 20 20  rm - nPrefix;.  
1fde0 6d 65 6d 63 70 79 28 70 50 72 65 76 2d 3e 61 2c  memcpy(pPrev->a,
1fdf0 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   zTerm, nTerm);.
1fe00 20 20 70 50 72 65 76 2d 3e 6e 20 3d 20 6e 54 65    pPrev->n = nTe
1fe10 72 6d 3b 0a 0a 20 20 69 66 28 20 62 46 69 72 73  rm;..  if( bFirs
1fe20 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 6f 64  t==0 ){.    pNod
1fe30 65 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46  e->n += sqlite3F
1fe40 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 4e  ts3PutVarint(&pN
1fe50 6f 64 65 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d  ode->a[pNode->n]
1fe60 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 7d 0a  , nPrefix);.  }.
1fe70 20 20 70 4e 6f 64 65 2d 3e 6e 20 2b 3d 20 73 71    pNode->n += sq
1fe80 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69  lite3Fts3PutVari
1fe90 6e 74 28 26 70 4e 6f 64 65 2d 3e 61 5b 70 4e 6f  nt(&pNode->a[pNo
1fea0 64 65 2d 3e 6e 5d 2c 20 6e 53 75 66 66 69 78 29  de->n], nSuffix)
1feb0 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 4e 6f 64  ;.  memcpy(&pNod
1fec0 65 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d 2c 20  e->a[pNode->n], 
1fed0 26 7a 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 2c  &zTerm[nPrefix],
1fee0 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 70 4e 6f   nSuffix);.  pNo
1fef0 64 65 2d 3e 6e 20 2b 3d 20 6e 53 75 66 66 69 78  de->n += nSuffix
1ff00 3b 0a 0a 20 20 69 66 28 20 61 44 6f 63 6c 69 73  ;..  if( aDoclis
1ff10 74 20 29 7b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e  t ){.    pNode->
1ff20 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  n += sqlite3Fts3
1ff30 50 75 74 56 61 72 69 6e 74 28 26 70 4e 6f 64 65  PutVarint(&pNode
1ff40 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d 2c 20 6e  ->a[pNode->n], n
1ff50 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 6d 65  Doclist);.    me
1ff60 6d 63 70 79 28 26 70 4e 6f 64 65 2d 3e 61 5b 70  mcpy(&pNode->a[p
1ff70 4e 6f 64 65 2d 3e 6e 5d 2c 20 61 44 6f 63 6c 69  Node->n], aDocli
1ff80 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20  st, nDoclist);. 
1ff90 20 20 20 70 4e 6f 64 65 2d 3e 6e 20 2b 3d 20 6e     pNode->n += n
1ffa0 44 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20  Doclist;.  }..  
1ffb0 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 6e  assert( pNode->n
1ffc0 3c 3d 70 4e 6f 64 65 2d 3e 6e 41 6c 6c 6f 63 20  <=pNode->nAlloc 
1ffd0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  );..  return SQL
1ffe0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1fff0 20 41 70 70 65 6e 64 20 74 68 65 20 63 75 72 72   Append the curr
20000 65 6e 74 20 74 65 72 6d 20 61 6e 64 20 64 6f 63  ent term and doc
20010 6c 69 73 74 20 70 6f 69 6e 74 65 64 20 74 6f 20  list pointed to 
20020 62 79 20 63 75 72 73 6f 72 20 70 43 73 72 20 74  by cursor pCsr t
20030 6f 20 74 68 65 0a 2a 2a 20 61 70 70 65 6e 64 61  o the.** appenda
20040 62 6c 65 20 62 2d 74 72 65 65 20 73 65 67 6d 65  ble b-tree segme
20050 6e 74 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72  nt opened for wr
20060 69 74 69 6e 67 20 62 79 20 70 57 72 69 74 65 72  iting by pWriter
20070 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
20080 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
20090 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
200a0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
200b0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
200c0 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63  atic int fts3Inc
200d0 72 6d 65 72 67 65 41 70 70 65 6e 64 28 0a 20 20  rmergeAppend(.  
200e0 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
200f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20100 2f 2a 20 46 74 73 33 20 74 61 62 6c 65 20 68 61  /* Fts3 table ha
20110 6e 64 6c 65 20 2a 2f 0a 20 20 49 6e 63 72 6d 65  ndle */.  Incrme
20120 72 67 65 57 72 69 74 65 72 20 2a 70 57 72 69 74  rgeWriter *pWrit
20130 65 72 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69  er,       /* Wri
20140 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
20150 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
20160 65 72 20 2a 70 43 73 72 20 20 20 20 20 20 20 20  er *pCsr        
20170 2f 2a 20 43 75 72 73 6f 72 20 63 6f 6e 74 61 69  /* Cursor contai
20180 6e 69 6e 67 20 74 65 72 6d 20 61 6e 64 20 64 6f  ning term and do
20190 63 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 63 6f  clist */.){.  co
201a0 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20  nst char *zTerm 
201b0 3d 20 70 43 73 72 2d 3e 7a 54 65 72 6d 3b 0a 20  = pCsr->zTerm;. 
201c0 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70 43 73   int nTerm = pCs
201d0 72 2d 3e 6e 54 65 72 6d 3b 0a 20 20 63 6f 6e 73  r->nTerm;.  cons
201e0 74 20 63 68 61 72 20 2a 61 44 6f 63 6c 69 73 74  t char *aDoclist
201f0 20 3d 20 70 43 73 72 2d 3e 61 44 6f 63 6c 69 73   = pCsr->aDoclis
20200 74 3b 0a 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73  t;.  int nDoclis
20210 74 20 3d 20 70 43 73 72 2d 3e 6e 44 6f 63 6c 69  t = pCsr->nDocli
20220 73 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  st;.  int rc = S
20230 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
20240 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
20250 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61  de */.  int nSpa
20260 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
20270 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
20280 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65  pace in bytes re
20290 71 75 69 72 65 64 20 6f 6e 20 6c 65 61 66 20 2a  quired on leaf *
202a0 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b  /.  int nPrefix;
202b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202c0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 72 65    /* Size of pre
202d0 66 69 78 20 73 68 61 72 65 64 20 77 69 74 68 20  fix shared with 
202e0 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 2a 2f  previous term */
202f0 0a 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 20  .  int nSuffix; 
20300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20310 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 75 66 66   /* Size of suff
20320 69 78 20 28 6e 54 65 72 6d 20 2d 20 6e 50 72 65  ix (nTerm - nPre
20330 66 69 78 29 20 2a 2f 0a 20 20 4e 6f 64 65 57 72  fix) */.  NodeWr
20340 69 74 65 72 20 2a 70 4c 65 61 66 3b 20 20 20 20  iter *pLeaf;    
20350 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
20360 74 20 75 73 65 64 20 74 6f 20 77 72 69 74 65 20  t used to write 
20370 6c 65 61 66 20 6e 6f 64 65 73 20 2a 2f 0a 0a 20  leaf nodes */.. 
20380 20 70 4c 65 61 66 20 3d 20 26 70 57 72 69 74 65   pLeaf = &pWrite
20390 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 30  r->aNodeWriter[0
203a0 5d 3b 0a 20 20 6e 50 72 65 66 69 78 20 3d 20 66  ];.  nPrefix = f
203b0 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73  ts3PrefixCompres
203c0 73 28 70 4c 65 61 66 2d 3e 6b 65 79 2e 61 2c 20  s(pLeaf->key.a, 
203d0 70 4c 65 61 66 2d 3e 6b 65 79 2e 6e 2c 20 7a 54  pLeaf->key.n, zT
203e0 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 6e  erm, nTerm);.  n
203f0 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d 20 2d  Suffix = nTerm -
20400 20 6e 50 72 65 66 69 78 3b 0a 0a 20 20 6e 53 70   nPrefix;..  nSp
20410 61 63 65 20 20 3d 20 73 71 6c 69 74 65 33 46 74  ace  = sqlite3Ft
20420 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 50 72 65  s3VarintLen(nPre
20430 66 69 78 29 3b 0a 20 20 6e 53 70 61 63 65 20 2b  fix);.  nSpace +
20440 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72  = sqlite3Fts3Var
20450 69 6e 74 4c 65 6e 28 6e 53 75 66 66 69 78 29 20  intLen(nSuffix) 
20460 2b 20 6e 53 75 66 66 69 78 3b 0a 20 20 6e 53 70  + nSuffix;.  nSp
20470 61 63 65 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ace += sqlite3Ft
20480 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 44 6f 63  s3VarintLen(nDoc
20490 6c 69 73 74 29 20 2b 20 6e 44 6f 63 6c 69 73 74  list) + nDoclist
204a0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
204b0 75 72 72 65 6e 74 20 62 6c 6f 63 6b 20 69 73 20  urrent block is 
204c0 6e 6f 74 20 65 6d 70 74 79 2c 20 61 6e 64 20 69  not empty, and i
204d0 66 20 61 64 64 69 6e 67 20 74 68 69 73 20 74 65  f adding this te
204e0 72 6d 2f 64 6f 63 6c 69 73 74 0a 20 20 2a 2a 20  rm/doclist.  ** 
204f0 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 62  to the current b
20500 6c 6f 63 6b 20 77 6f 75 6c 64 20 6d 61 6b 65 20  lock would make 
20510 69 74 20 6c 61 72 67 65 72 20 74 68 61 6e 20 46  it larger than F
20520 74 73 33 54 61 62 6c 65 2e 6e 4e 6f 64 65 53 69  ts3Table.nNodeSi
20530 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 2c 20 77  ze.  ** bytes, w
20540 72 69 74 65 20 74 68 69 73 20 62 6c 6f 63 6b 20  rite this block 
20550 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
20560 61 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4c  ase. */.  if( pL
20570 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 3e 30 20 26  eaf->block.n>0 &
20580 26 20 28 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e  & (pLeaf->block.
20590 6e 20 2b 20 6e 53 70 61 63 65 29 3e 70 2d 3e 6e  n + nSpace)>p->n
205a0 4e 6f 64 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  NodeSize ){.    
205b0 72 63 20 3d 20 66 74 73 33 57 72 69 74 65 53 65  rc = fts3WriteSe
205c0 67 6d 65 6e 74 28 70 2c 20 70 4c 65 61 66 2d 3e  gment(p, pLeaf->
205d0 69 42 6c 6f 63 6b 2c 20 70 4c 65 61 66 2d 3e 62  iBlock, pLeaf->b
205e0 6c 6f 63 6b 2e 61 2c 20 70 4c 65 61 66 2d 3e 62  lock.a, pLeaf->b
205f0 6c 6f 63 6b 2e 6e 29 3b 0a 20 20 20 20 70 57 72  lock.n);.    pWr
20600 69 74 65 72 2d 3e 6e 57 6f 72 6b 2b 2b 3b 0a 0a  iter->nWork++;..
20610 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 63      /* Add the c
20620 75 72 72 65 6e 74 20 74 65 72 6d 20 74 6f 20 74  urrent term to t
20630 68 65 20 70 61 72 65 6e 74 20 6e 6f 64 65 2e 20  he parent node. 
20640 54 68 65 20 74 65 72 6d 20 61 64 64 65 64 20 74  The term added t
20650 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61  o the .    ** pa
20660 72 65 6e 74 20 6d 75 73 74 3a 0a 20 20 20 20 2a  rent must:.    *
20670 2a 0a 20 20 20 20 2a 2a 20 20 20 61 29 20 62 65  *.    **   a) be
20680 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
20690 65 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20 6f  e largest term o
206a0 6e 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20  n the leaf node 
206b0 6a 75 73 74 20 77 72 69 74 74 65 6e 0a 20 20 20  just written.   
206c0 20 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20   **      to the 
206d0 64 61 74 61 62 61 73 65 20 28 73 74 69 6c 6c 20  database (still 
206e0 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 4c 65  available in pLe
206f0 61 66 2d 3e 6b 65 79 29 2c 20 61 6e 64 0a 20 20  af->key), and.  
20700 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 62 29    **.    **   b)
20710 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   be less than or
20720 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 65   equal to the te
20730 72 6d 20 61 62 6f 75 74 20 74 6f 20 62 65 20 61  rm about to be a
20740 64 64 65 64 20 74 6f 20 74 68 65 20 6e 65 77 0a  dded to the new.
20750 20 20 20 20 2a 2a 20 20 20 20 20 20 6c 65 61 66      **      leaf
20760 20 6e 6f 64 65 20 28 7a 54 65 72 6d 2f 6e 54 65   node (zTerm/nTe
20770 72 6d 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  rm)..    **.    
20780 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
20790 73 2c 20 69 74 20 6d 75 73 74 20 62 65 20 74 68  s, it must be th
207a0 65 20 70 72 65 66 69 78 20 6f 66 20 7a 54 65 72  e prefix of zTer
207b0 6d 20 31 20 62 79 74 65 20 6c 6f 6e 67 65 72 20  m 1 byte longer 
207c0 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  than.    ** the 
207d0 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 28 69  common prefix (i
207e0 66 20 61 6e 79 29 20 6f 66 20 7a 54 65 72 6d 20  f any) of zTerm 
207f0 61 6e 64 20 70 57 72 69 74 65 72 2d 3e 7a 54 65  and pWriter->zTe
20800 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  rm..    */.    i
20810 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20820 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
20830 74 73 33 49 6e 63 72 6d 65 72 67 65 50 75 73 68  ts3IncrmergePush
20840 28 70 2c 20 70 57 72 69 74 65 72 2c 20 7a 54 65  (p, pWriter, zTe
20850 72 6d 2c 20 6e 50 72 65 66 69 78 2b 31 29 3b 0a  rm, nPrefix+1);.
20860 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
20870 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
20880 74 20 6f 75 74 70 75 74 20 62 6c 6f 63 6b 20 2a  t output block *
20890 2f 0a 20 20 20 20 70 4c 65 61 66 2d 3e 69 42 6c  /.    pLeaf->iBl
208a0 6f 63 6b 2b 2b 3b 0a 20 20 20 20 70 4c 65 61 66  ock++;.    pLeaf
208b0 2d 3e 6b 65 79 2e 6e 20 3d 20 30 3b 0a 20 20 20  ->key.n = 0;.   
208c0 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 20   pLeaf->block.n 
208d0 3d 20 30 3b 0a 0a 20 20 20 20 6e 53 75 66 66 69  = 0;..    nSuffi
208e0 78 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 6e  x = nTerm;.    n
208f0 53 70 61 63 65 20 20 3d 20 31 3b 0a 20 20 20 20  Space  = 1;.    
20900 6e 53 70 61 63 65 20 2b 3d 20 73 71 6c 69 74 65  nSpace += sqlite
20910 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e  3Fts3VarintLen(n
20920 53 75 66 66 69 78 29 20 2b 20 6e 53 75 66 66 69  Suffix) + nSuffi
20930 78 3b 0a 20 20 20 20 6e 53 70 61 63 65 20 2b 3d  x;.    nSpace +=
20940 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69   sqlite3Fts3Vari
20950 6e 74 4c 65 6e 28 6e 44 6f 63 6c 69 73 74 29 20  ntLen(nDoclist) 
20960 2b 20 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a  + nDoclist;.  }.
20970 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61  .  pWriter->nLea
20980 66 44 61 74 61 20 2b 3d 20 6e 53 70 61 63 65 3b  fData += nSpace;
20990 0a 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65  .  blobGrowBuffe
209a0 72 28 26 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2c  r(&pLeaf->block,
209b0 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 20   pLeaf->block.n 
209c0 2b 20 6e 53 70 61 63 65 2c 20 26 72 63 29 3b 0a  + nSpace, &rc);.
209d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
209e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
209f0 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 3d 3d 30  Leaf->block.n==0
20a00 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 61 66 2d   ){.      pLeaf-
20a10 3e 62 6c 6f 63 6b 2e 6e 20 3d 20 31 3b 0a 20 20  >block.n = 1;.  
20a20 20 20 20 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b      pLeaf->block
20a30 2e 61 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  .a[0] = '\0';.  
20a40 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 66 74 73    }.    rc = fts
20a50 33 41 70 70 65 6e 64 54 6f 4e 6f 64 65 28 0a 20  3AppendToNode(. 
20a60 20 20 20 20 20 20 20 26 70 4c 65 61 66 2d 3e 62         &pLeaf->b
20a70 6c 6f 63 6b 2c 20 26 70 4c 65 61 66 2d 3e 6b 65  lock, &pLeaf->ke
20a80 79 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  y, zTerm, nTerm,
20a90 20 61 44 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c   aDoclist, nDocl
20aa0 69 73 74 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  ist.    );.  }..
20ab0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20ac0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
20ad0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
20ae0 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 64 79 6e   release all dyn
20af0 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 20 68  amic resources h
20b00 65 6c 64 20 62 79 20 74 68 65 0a 2a 2a 20 6d 65  eld by the.** me
20b10 72 67 65 2d 77 72 69 74 65 72 20 6f 62 6a 65 63  rge-writer objec
20b20 74 20 70 57 72 69 74 65 72 2c 20 61 6e 64 20 69  t pWriter, and i
20b30 66 20 6e 6f 20 65 72 72 6f 72 20 68 61 73 20 6f  f no error has o
20b40 63 63 75 72 72 65 64 2c 20 74 6f 20 66 6c 75 73  ccurred, to flus
20b50 68 0a 2a 2a 20 61 6c 6c 20 6f 75 74 73 74 61 6e  h.** all outstan
20b60 64 69 6e 67 20 6e 6f 64 65 20 62 75 66 66 65 72  ding node buffer
20b70 73 20 68 65 6c 64 20 62 79 20 70 57 72 69 74 65  s held by pWrite
20b80 72 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  r to disk..**.**
20b90 20 49 66 20 2a 70 52 63 20 69 73 20 6e 6f 74 20   If *pRc is not 
20ba0 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74  SQLITE_OK when t
20bb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
20bc0 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 6e 6f 20  called, then no 
20bd0 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61  attempt.** is ma
20be0 64 65 20 74 6f 20 77 72 69 74 65 20 61 6e 79 20  de to write any 
20bf0 64 61 74 61 20 74 6f 20 64 69 73 6b 2e 20 49 6e  data to disk. In
20c00 73 74 65 61 64 2c 20 74 68 69 73 20 66 75 6e 63  stead, this func
20c10 74 69 6f 6e 20 73 65 72 76 65 73 20 6f 6e 6c 79  tion serves only
20c20 0a 2a 2a 20 74 6f 20 72 65 6c 65 61 73 65 20 6f  .** to release o
20c30 75 74 73 74 61 6e 64 69 6e 67 20 72 65 73 6f 75  utstanding resou
20c40 72 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  rces..**.** Othe
20c50 72 77 69 73 65 2c 20 69 66 20 2a 70 52 63 20 69  rwise, if *pRc i
20c60 73 20 69 6e 69 74 69 61 6c 6c 79 20 53 51 4c 49  s initially SQLI
20c70 54 45 5f 4f 4b 20 61 6e 64 20 61 6e 20 65 72 72  TE_OK and an err
20c80 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a  or occurs while.
20c90 2a 2a 20 66 6c 75 73 68 69 6e 67 20 62 75 66 66  ** flushing buff
20ca0 65 72 73 20 74 6f 20 64 69 73 6b 2c 20 2a 70 52  ers to disk, *pR
20cb0 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 53  c is set to an S
20cc0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
20cd0 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72   before.** retur
20ce0 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
20cf0 76 6f 69 64 20 66 74 73 33 49 6e 63 72 6d 65 72  void fts3Incrmer
20d00 67 65 52 65 6c 65 61 73 65 28 0a 20 20 46 74 73  geRelease(.  Fts
20d10 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
20d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20d30 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c  FTS3 table handl
20d40 65 20 2a 2f 0a 20 20 49 6e 63 72 6d 65 72 67 65  e */.  Incrmerge
20d50 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
20d60 20 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65 2d         /* Merge-
20d70 77 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f  writer object */
20d80 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20 20  .  int *pRc     
20d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20da0 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72     /* IN/OUT: Er
20db0 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20  ror code */.){. 
20dc0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
20dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20de0 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
20df0 61 74 65 20 74 68 72 6f 75 67 68 20 6e 6f 6e 2d  ate through non-
20e00 72 6f 6f 74 20 6c 61 79 65 72 73 20 2a 2f 0a 20  root layers */. 
20e10 20 69 6e 74 20 69 52 6f 6f 74 3b 20 20 20 20 20   int iRoot;     
20e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e30 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 6f 6f   /* Index of roo
20e40 74 20 69 6e 20 70 57 72 69 74 65 72 2d 3e 61 4e  t in pWriter->aN
20e50 6f 64 65 57 72 69 74 65 72 20 2a 2f 0a 20 20 4e  odeWriter */.  N
20e60 6f 64 65 57 72 69 74 65 72 20 2a 70 52 6f 6f 74  odeWriter *pRoot
20e70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
20e80 2a 20 4e 6f 64 65 57 72 69 74 65 72 20 66 6f 72  * NodeWriter for
20e90 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20   root node */.  
20ea0 69 6e 74 20 72 63 20 3d 20 2a 70 52 63 3b 20 20  int rc = *pRc;  
20eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ec0 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f  /* Error code */
20ed0 0a 0a 20 20 2f 2a 20 53 65 74 20 69 52 6f 6f 74  ..  /* Set iRoot
20ee0 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 69 6e   to the index in
20ef0 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57   pWriter->aNodeW
20f00 72 69 74 65 72 5b 5d 20 6f 66 20 74 68 65 20 6f  riter[] of the o
20f10 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 0a 20  utput segment . 
20f20 20 2a 2a 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 49   ** root node. I
20f30 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 66 69  f the segment fi
20f40 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 61  ts entirely on a
20f50 20 73 69 6e 67 6c 65 20 6c 65 61 66 20 6e 6f 64   single leaf nod
20f60 65 2c 20 69 52 6f 6f 74 0a 20 20 2a 2a 20 77 69  e, iRoot.  ** wi
20f70 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 30 2e 20  ll be set to 0. 
20f80 49 66 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  If the root node
20f90 20 69 73 20 74 68 65 20 70 61 72 65 6e 74 20 6f   is the parent o
20fa0 66 20 74 68 65 20 6c 65 61 76 65 73 2c 20 69 52  f the leaves, iR
20fb0 6f 6f 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  oot.  ** will be
20fc0 20 31 2e 20 41 6e 64 20 73 6f 20 6f 6e 2e 20 20   1. And so on.  
20fd0 2a 2f 0a 20 20 66 6f 72 28 69 52 6f 6f 74 3d 46  */.  for(iRoot=F
20fe0 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c  TS_MAX_APPENDABL
20ff0 45 5f 48 45 49 47 48 54 2d 31 3b 20 69 52 6f 6f  E_HEIGHT-1; iRoo
21000 74 3e 3d 30 3b 20 69 52 6f 6f 74 2d 2d 29 7b 0a  t>=0; iRoot--){.
21010 20 20 20 20 4e 6f 64 65 57 72 69 74 65 72 20 2a      NodeWriter *
21020 70 4e 6f 64 65 20 3d 20 26 70 57 72 69 74 65 72  pNode = &pWriter
21030 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 69 52  ->aNodeWriter[iR
21040 6f 6f 74 5d 3b 0a 20 20 20 20 69 66 28 20 70 4e  oot];.    if( pN
21050 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 3e 30 20 29  ode->block.n>0 )
21060 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65   break;.    asse
21070 72 74 28 20 2a 70 52 63 20 7c 7c 20 70 4e 6f 64  rt( *pRc || pNod
21080 65 2d 3e 62 6c 6f 63 6b 2e 6e 41 6c 6c 6f 63 3d  e->block.nAlloc=
21090 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
210a0 28 20 2a 70 52 63 20 7c 7c 20 70 4e 6f 64 65 2d  ( *pRc || pNode-
210b0 3e 6b 65 79 2e 6e 41 6c 6c 6f 63 3d 3d 30 20 29  >key.nAlloc==0 )
210c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
210d0 65 65 28 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e  ee(pNode->block.
210e0 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  a);.    sqlite3_
210f0 66 72 65 65 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e  free(pNode->key.
21100 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6d  a);.  }..  /* Em
21110 70 74 79 20 6f 75 74 70 75 74 20 73 65 67 6d 65  pty output segme
21120 6e 74 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  nt. This is a no
21130 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 69 52  -op. */.  if( iR
21140 6f 6f 74 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  oot<0 ) return;.
21150 0a 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65  .  /* The entire
21160 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20   output segment 
21170 66 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65  fits on a single
21180 20 6e 6f 64 65 2e 20 4e 6f 72 6d 61 6c 6c 79 2c   node. Normally,
21190 20 74 68 69 73 20 6d 65 61 6e 73 0a 20 20 2a 2a   this means.  **
211a0 20 74 68 65 20 6e 6f 64 65 20 77 6f 75 6c 64 20   the node would 
211b0 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 62  be stored as a b
211c0 6c 6f 62 20 69 6e 20 74 68 65 20 22 72 6f 6f 74  lob in the "root
211d0 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  " column of the 
211e0 25 5f 73 65 67 64 69 72 0a 20 20 2a 2a 20 74 61  %_segdir.  ** ta
211f0 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 74 68  ble. However, th
21200 69 73 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74  is is not permit
21210 74 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ted in this case
21220 2e 20 54 68 65 20 70 72 6f 62 6c 65 6d 20 69 73  . The problem is
21230 20 74 68 61 74 20 0a 20 20 2a 2a 20 73 70 61 63   that .  ** spac
21240 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
21250 65 6e 20 72 65 73 65 72 76 65 64 20 69 6e 20 74  en reserved in t
21260 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61  he %_segments ta
21270 62 6c 65 2c 20 61 6e 64 20 73 6f 20 74 68 65 20  ble, and so the 
21280 0a 20 20 2a 2a 20 73 74 61 72 74 5f 62 6c 6f 63  .  ** start_bloc
21290 6b 20 61 6e 64 20 65 6e 64 5f 62 6c 6f 63 6b 20  k and end_block 
212a0 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 25 5f  fields of the %_
212b0 73 65 67 64 69 72 20 74 61 62 6c 65 20 6d 75 73  segdir table mus
212c0 74 20 62 65 20 70 6f 70 75 6c 61 74 65 64 2e 20  t be populated. 
212d0 0a 20 20 2a 2a 20 41 6e 64 2c 20 62 79 20 64 65  .  ** And, by de
212e0 73 69 67 6e 20 6f 72 20 62 79 20 61 63 63 69 64  sign or by accid
212f0 65 6e 74 2c 20 72 65 6c 65 61 73 65 64 20 76 65  ent, released ve
21300 72 73 69 6f 6e 73 20 6f 66 20 46 54 53 20 63 61  rsions of FTS ca
21310 6e 6e 6f 74 20 68 61 6e 64 6c 65 20 0a 20 20 2a  nnot handle .  *
21320 2a 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20  * segments that 
21330 66 69 74 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  fit entirely on 
21340 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 77 69  the root node wi
21350 74 68 20 73 74 61 72 74 5f 62 6c 6f 63 6b 21 3d  th start_block!=
21360 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 73  0..  **.  ** Ins
21370 74 65 61 64 2c 20 63 72 65 61 74 65 20 61 20 73  tead, create a s
21380 79 6e 74 68 65 74 69 63 20 72 6f 6f 74 20 6e 6f  ynthetic root no
21390 64 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  de that contains
213a0 20 6e 6f 74 68 69 6e 67 20 62 75 74 20 61 20 0a   nothing but a .
213b0 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20    ** pointer to 
213c0 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6e 74 65  the single conte
213d0 6e 74 20 6e 6f 64 65 2e 20 53 6f 20 74 68 61 74  nt node. So that
213e0 20 74 68 65 20 73 65 67 6d 65 6e 74 20 63 6f 6e   the segment con
213f0 73 69 73 74 73 20 6f 66 20 61 0a 20 20 2a 2a 20  sists of a.  ** 
21400 73 69 6e 67 6c 65 20 6c 65 61 66 20 61 6e 64 20  single leaf and 
21410 61 20 73 69 6e 67 6c 65 20 69 6e 74 65 72 69 6f  a single interio
21420 72 20 28 72 6f 6f 74 29 20 6e 6f 64 65 2e 0a 20  r (root) node.. 
21430 20 2a 2a 0a 20 20 2a 2a 20 54 6f 64 6f 3a 20 42   **.  ** Todo: B
21440 65 74 74 65 72 20 6d 69 67 68 74 20 62 65 20 74  etter might be t
21450 6f 20 64 65 66 65 72 20 61 6c 6c 6f 63 61 74 69  o defer allocati
21460 6e 67 20 73 70 61 63 65 20 69 6e 20 74 68 65 20  ng space in the 
21470 25 5f 73 65 67 6d 65 6e 74 73 20 0a 20 20 2a 2a  %_segments .  **
21480 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 77 65 20   table until we 
21490 61 72 65 20 73 75 72 65 20 69 74 20 69 73 20 6e  are sure it is n
214a0 65 65 64 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  eeded..  */.  if
214b0 28 20 69 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20  ( iRoot==0 ){.  
214c0 20 20 42 6c 6f 62 20 2a 70 42 6c 6f 63 6b 20 3d    Blob *pBlock =
214d0 20 26 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65   &pWriter->aNode
214e0 57 72 69 74 65 72 5b 31 5d 2e 62 6c 6f 63 6b 3b  Writer[1].block;
214f0 0a 20 20 20 20 62 6c 6f 62 47 72 6f 77 42 75 66  .    blobGrowBuf
21500 66 65 72 28 70 42 6c 6f 63 6b 2c 20 31 20 2b 20  fer(pBlock, 1 + 
21510 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 2c  FTS3_VARINT_MAX,
21520 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72   &rc);.    if( r
21530 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21540 20 20 20 20 20 20 70 42 6c 6f 63 6b 2d 3e 61 5b        pBlock->a[
21550 30 5d 20 3d 20 30 78 30 31 3b 0a 20 20 20 20 20  0] = 0x01;.     
21560 20 70 42 6c 6f 63 6b 2d 3e 6e 20 3d 20 31 20 2b   pBlock->n = 1 +
21570 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56   sqlite3Fts3PutV
21580 61 72 69 6e 74 28 0a 20 20 20 20 20 20 20 20 20  arint(.         
21590 20 26 70 42 6c 6f 63 6b 2d 3e 61 5b 31 5d 2c 20   &pBlock->a[1], 
215a0 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72  pWriter->aNodeWr
215b0 69 74 65 72 5b 30 5d 2e 69 42 6c 6f 63 6b 0a 20  iter[0].iBlock. 
215c0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
215d0 20 20 69 52 6f 6f 74 20 3d 20 31 3b 0a 20 20 7d    iRoot = 1;.  }
215e0 0a 20 20 70 52 6f 6f 74 20 3d 20 26 70 57 72 69  .  pRoot = &pWri
215f0 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72  ter->aNodeWriter
21600 5b 69 52 6f 6f 74 5d 3b 0a 0a 20 20 2f 2a 20 46  [iRoot];..  /* F
21610 6c 75 73 68 20 61 6c 6c 20 63 75 72 72 65 6e 74  lush all current
21620 6c 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6e  ly outstanding n
21630 6f 64 65 73 20 74 6f 20 64 69 73 6b 2e 20 2a 2f  odes to disk. */
21640 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 69 52  .  for(i=0; i<iR
21650 6f 6f 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4e  oot; i++){.    N
21660 6f 64 65 57 72 69 74 65 72 20 2a 70 4e 6f 64 65  odeWriter *pNode
21670 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 4e 6f   = &pWriter->aNo
21680 64 65 57 72 69 74 65 72 5b 69 5d 3b 0a 20 20 20  deWriter[i];.   
21690 20 69 66 28 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63   if( pNode->bloc
216a0 6b 2e 6e 3e 30 20 26 26 20 72 63 3d 3d 53 51 4c  k.n>0 && rc==SQL
216b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
216c0 72 63 20 3d 20 66 74 73 33 57 72 69 74 65 53 65  rc = fts3WriteSe
216d0 67 6d 65 6e 74 28 70 2c 20 70 4e 6f 64 65 2d 3e  gment(p, pNode->
216e0 69 42 6c 6f 63 6b 2c 20 70 4e 6f 64 65 2d 3e 62  iBlock, pNode->b
216f0 6c 6f 63 6b 2e 61 2c 20 70 4e 6f 64 65 2d 3e 62  lock.a, pNode->b
21700 6c 6f 63 6b 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20  lock.n);.    }. 
21710 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
21720 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 29 3b  pNode->block.a);
21730 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
21740 65 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e 61 29 3b  e(pNode->key.a);
21750 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65  .  }..  /* Write
21760 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 72 65   the %_segdir re
21770 63 6f 72 64 2e 20 2a 2f 0a 20 20 69 66 28 20 72  cord. */.  if( r
21780 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21790 20 20 20 20 72 63 20 3d 20 66 74 73 33 57 72 69      rc = fts3Wri
217a0 74 65 53 65 67 64 69 72 28 70 2c 20 0a 20 20 20  teSegdir(p, .   
217b0 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 41       pWriter->iA
217c0 62 73 4c 65 76 65 6c 2b 31 2c 20 20 20 20 20 20  bsLevel+1,      
217d0 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 65 76 65           /* leve
217e0 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57 72  l */.        pWr
217f0 69 74 65 72 2d 3e 69 49 64 78 2c 20 20 20 20 20  iter->iIdx,     
21800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21810 20 2f 2a 20 69 64 78 20 2a 2f 0a 20 20 20 20 20   /* idx */.     
21820 20 20 20 70 57 72 69 74 65 72 2d 3e 69 53 74 61     pWriter->iSta
21830 72 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rt,             
21840 20 20 20 20 20 20 20 2f 2a 20 73 74 61 72 74 5f         /* start_
21850 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20  block */.       
21860 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57   pWriter->aNodeW
21870 72 69 74 65 72 5b 30 5d 2e 69 42 6c 6f 63 6b 2c  riter[0].iBlock,
21880 20 20 20 20 20 2f 2a 20 6c 65 61 76 65 73 5f 65       /* leaves_e
21890 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  nd_block */.    
218a0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 45 6e      pWriter->iEn
218b0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
218c0 20 20 20 20 20 20 20 20 2f 2a 20 65 6e 64 5f 62          /* end_b
218d0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
218e0 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61  pWriter->nLeafDa
218f0 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
21900 20 20 20 20 2f 2a 20 65 6e 64 5f 62 6c 6f 63 6b      /* end_block
21910 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 52 6f 6f   */.        pRoo
21920 74 2d 3e 62 6c 6f 63 6b 2e 61 2c 20 70 52 6f 6f  t->block.a, pRoo
21930 74 2d 3e 62 6c 6f 63 6b 2e 6e 20 20 20 20 20 20  t->block.n      
21940 2f 2a 20 72 6f 6f 74 20 2a 2f 0a 20 20 20 20 29  /* root */.    )
21950 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
21960 66 72 65 65 28 70 52 6f 6f 74 2d 3e 62 6c 6f 63  free(pRoot->bloc
21970 6b 2e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  k.a);.  sqlite3_
21980 66 72 65 65 28 70 52 6f 6f 74 2d 3e 6b 65 79 2e  free(pRoot->key.
21990 61 29 3b 0a 0a 20 20 2a 70 52 63 20 3d 20 72 63  a);..  *pRc = rc
219a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
219b0 72 65 20 74 68 65 20 74 65 72 6d 20 69 6e 20 62  re the term in b
219c0 75 66 66 65 72 20 7a 4c 68 73 20 28 73 69 7a 65  uffer zLhs (size
219d0 20 69 6e 20 62 79 74 65 73 20 6e 4c 68 73 29 20   in bytes nLhs) 
219e0 77 69 74 68 20 74 68 61 74 20 69 6e 0a 2a 2a 20  with that in.** 
219f0 7a 52 68 73 20 28 73 69 7a 65 20 69 6e 20 62 79  zRhs (size in by
21a00 74 65 73 20 6e 52 68 73 29 20 75 73 69 6e 67 20  tes nRhs) using 
21a10 6d 65 6d 63 6d 70 2e 20 49 66 20 6f 6e 65 20 74  memcmp. If one t
21a20 65 72 6d 20 69 73 20 61 20 70 72 65 66 69 78 20  erm is a prefix 
21a30 6f 66 0a 2a 2a 20 74 68 65 20 6f 74 68 65 72 2c  of.** the other,
21a40 20 69 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65   it is considere
21a50 64 20 74 6f 20 62 65 20 73 6d 61 6c 6c 65 72 20  d to be smaller 
21a60 74 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2e 0a  than the other..
21a70 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 2d 76 65  **.** Return -ve
21a80 20 69 66 20 7a 4c 68 73 20 69 73 20 73 6d 61 6c   if zLhs is smal
21a90 6c 65 72 20 74 68 61 6e 20 7a 52 68 73 2c 20 30  ler than zRhs, 0
21aa0 20 69 66 20 69 74 20 69 73 20 65 71 75 61 6c 2c   if it is equal,
21ab0 20 6f 72 20 2b 76 65 0a 2a 2a 20 69 66 20 69 74   or +ve.** if it
21ac0 20 69 73 20 67 72 65 61 74 65 72 2e 0a 2a 2f 0a   is greater..*/.
21ad0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 54  static int fts3T
21ae0 65 72 6d 43 6d 70 28 0a 20 20 63 6f 6e 73 74 20  ermCmp(.  const 
21af0 63 68 61 72 20 2a 7a 4c 68 73 2c 20 69 6e 74 20  char *zLhs, int 
21b00 6e 4c 68 73 2c 20 20 20 20 20 2f 2a 20 4c 48 53  nLhs,     /* LHS
21b10 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a   of comparison *
21b20 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
21b30 7a 52 68 73 2c 20 69 6e 74 20 6e 52 68 73 20 20  zRhs, int nRhs  
21b40 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 63 6f      /* RHS of co
21b50 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20  mparison */.){. 
21b60 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28   int nCmp = MIN(
21b70 6e 4c 68 73 2c 20 6e 52 68 73 29 3b 0a 20 20 69  nLhs, nRhs);.  i
21b80 6e 74 20 72 65 73 3b 0a 0a 20 20 72 65 73 20 3d  nt res;..  res =
21b90 20 6d 65 6d 63 6d 70 28 7a 4c 68 73 2c 20 7a 52   memcmp(zLhs, zR
21ba0 68 73 2c 20 6e 43 6d 70 29 3b 0a 20 20 69 66 28  hs, nCmp);.  if(
21bb0 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20 3d 20   res==0 ) res = 
21bc0 6e 4c 68 73 20 2d 20 6e 52 68 73 3b 0a 0a 20 20  nLhs - nRhs;..  
21bd0 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 0a  return res;.}...
21be0 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20 73  /*.** Query to s
21bf0 65 65 20 69 66 20 74 68 65 20 65 6e 74 72 79 20  ee if the entry 
21c00 69 6e 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74  in the %_segment
21c10 73 20 74 61 62 6c 65 20 77 69 74 68 20 62 6c 6f  s table with blo
21c20 63 6b 69 64 20 69 45 6e 64 20 69 73 20 0a 2a 2a  ckid iEnd is .**
21c30 20 4e 55 4c 4c 2e 20 49 66 20 6e 6f 20 65 72 72   NULL. If no err
21c40 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  or occurs and th
21c50 65 20 65 6e 74 72 79 20 69 73 20 4e 55 4c 4c 2c  e entry is NULL,
21c60 20 73 65 74 20 2a 70 62 52 65 73 20 31 20 62 65   set *pbRes 1 be
21c70 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e  fore.** returnin
21c80 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  g. Otherwise, se
21c90 74 20 2a 70 62 52 65 73 20 74 6f 20 30 2e 20 0a  t *pbRes to 0. .
21ca0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 61 6e 20  **.** Or, if an 
21cb0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
21cc0 6c 65 20 71 75 65 72 79 69 6e 67 20 74 68 65 20  le querying the 
21cd0 64 61 74 61 62 61 73 65 2c 20 72 65 74 75 72 6e  database, return
21ce0 20 61 6e 20 53 51 4c 69 74 65 20 0a 2a 2a 20 65   an SQLite .** e
21cf0 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66  rror code. The f
21d00 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 2a 70  inal value of *p
21d10 62 52 65 73 20 69 73 20 75 6e 64 65 66 69 6e 65  bRes is undefine
21d20 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
21d30 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73  **.** This is us
21d40 65 64 20 74 6f 20 74 65 73 74 20 69 66 20 61 20  ed to test if a 
21d50 73 65 67 6d 65 6e 74 20 69 73 20 61 6e 20 22 61  segment is an "a
21d60 70 70 65 6e 64 61 62 6c 65 22 20 73 65 67 6d 65  ppendable" segme
21d70 6e 74 2e 20 49 66 20 69 74 0a 2a 2a 20 69 73 2c  nt. If it.** is,
21d80 20 74 68 65 6e 20 61 20 4e 55 4c 4c 20 65 6e 74   then a NULL ent
21d90 72 79 20 68 61 73 20 62 65 65 6e 20 69 6e 73 65  ry has been inse
21da0 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 25 5f  rted into the %_
21db0 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 0a 2a  segments table.*
21dc0 2a 20 77 69 74 68 20 62 6c 6f 63 6b 69 64 20 25  * with blockid %
21dd0 5f 73 65 67 64 69 72 2e 65 6e 64 5f 62 6c 6f 63  _segdir.end_bloc
21de0 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
21df0 20 66 74 73 33 49 73 41 70 70 65 6e 64 61 62 6c   fts3IsAppendabl
21e00 65 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20  e(Fts3Table *p, 
21e10 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45  sqlite3_int64 iE
21e20 6e 64 2c 20 69 6e 74 20 2a 70 62 52 65 73 29 7b  nd, int *pbRes){
21e30 0a 20 20 69 6e 74 20 62 52 65 73 20 3d 20 30 3b  .  int bRes = 0;
21e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e50 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 74 6f 20     /* Result to 
21e60 73 65 74 20 2a 70 62 52 65 73 20 74 6f 20 2a 2f  set *pbRes to */
21e70 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
21e80 2a 70 43 68 65 63 6b 20 3d 20 30 3b 20 20 20 20  *pCheck = 0;    
21e90 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
21ea0 74 6f 20 71 75 65 72 79 20 64 61 74 61 62 61 73  to query databas
21eb0 65 20 77 69 74 68 20 2a 2f 0a 20 20 69 6e 74 20  e with */.  int 
21ec0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
21ed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
21ee0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
21ef0 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
21f00 74 28 70 2c 20 53 51 4c 5f 53 45 47 4d 45 4e 54  t(p, SQL_SEGMENT
21f10 5f 49 53 5f 41 50 50 45 4e 44 41 42 4c 45 2c 20  _IS_APPENDABLE, 
21f20 26 70 43 68 65 63 6b 2c 20 30 29 3b 0a 20 20 69  &pCheck, 0);.  i
21f30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21f40 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
21f50 62 69 6e 64 5f 69 6e 74 36 34 28 70 43 68 65 63  bind_int64(pChec
21f60 6b 2c 20 31 2c 20 69 45 6e 64 29 3b 0a 20 20 20  k, 1, iEnd);.   
21f70 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
21f80 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43  =sqlite3_step(pC
21f90 68 65 63 6b 29 20 29 20 62 52 65 73 20 3d 20 31  heck) ) bRes = 1
21fa0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
21fb0 65 33 5f 72 65 73 65 74 28 70 43 68 65 63 6b 29  e3_reset(pCheck)
21fc0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2a 70 62 52 65  ;.  }.  .  *pbRe
21fd0 73 20 3d 20 62 52 65 73 3b 0a 20 20 72 65 74 75  s = bRes;.  retu
21fe0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21ff0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
22000 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 6e 69   called when ini
22010 74 69 61 6c 69 7a 69 6e 67 20 61 6e 20 69 6e 63  tializing an inc
22020 72 65 6d 65 6e 74 61 6c 2d 6d 65 72 67 65 20 6f  remental-merge o
22030 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20  peration..** It 
22040 63 68 65 63 6b 73 20 69 66 20 74 68 65 20 65 78  checks if the ex
22050 69 73 74 69 6e 67 20 73 65 67 6d 65 6e 74 20 77  isting segment w
22060 69 74 68 20 69 6e 64 65 78 20 76 61 6c 75 65 20  ith index value 
22070 69 49 64 78 20 61 74 20 61 62 73 6f 6c 75 74 65  iIdx at absolute
22080 20 6c 65 76 65 6c 20 0a 2a 2a 20 28 69 41 62 73   level .** (iAbs
22090 4c 65 76 65 6c 2b 31 29 20 63 61 6e 20 62 65 20  Level+1) can be 
220a0 61 70 70 65 6e 64 65 64 20 74 6f 20 62 79 20 74  appended to by t
220b0 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d  he incremental m
220c0 65 72 67 65 2e 20 49 66 20 69 74 20 63 61 6e 2c  erge. If it can,
220d0 20 74 68 65 0a 2a 2a 20 6d 65 72 67 65 2d 77 72   the.** merge-wr
220e0 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 70 57 72  iter object *pWr
220f0 69 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69  iter is initiali
22100 7a 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  zed to write to 
22110 69 74 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69  it..**.** An exi
22120 73 74 69 6e 67 20 73 65 67 6d 65 6e 74 20 63 61  sting segment ca
22130 6e 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f  n be appended to
22140 20 62 79 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   by an increment
22150 61 6c 20 6d 65 72 67 65 20 69 66 3a 0a 2a 2a 0a  al merge if:.**.
22160 2a 2a 20 20 20 2a 20 49 74 20 77 61 73 20 69 6e  **   * It was in
22170 69 74 69 61 6c 6c 79 20 63 72 65 61 74 65 64 20  itially created 
22180 61 73 20 61 6e 20 61 70 70 65 6e 64 61 62 6c 65  as an appendable
22190 20 73 65 67 6d 65 6e 74 20 28 77 69 74 68 20 61   segment (with a
221a0 6c 6c 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 20  ll required.**  
221b0 20 20 20 73 70 61 63 65 20 70 72 65 2d 61 6c 6c     space pre-all
221c0 6f 63 61 74 65 64 29 2c 20 61 6e 64 0a 2a 2a 0a  ocated), and.**.
221d0 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73 74  **   * The first
221e0 20 6b 65 79 20 72 65 61 64 20 66 72 6f 6d 20 74   key read from t
221f0 68 65 20 69 6e 70 75 74 20 28 61 72 67 75 6d 65  he input (argume
22200 6e 74 73 20 7a 4b 65 79 20 61 6e 64 20 6e 4b 65  nts zKey and nKe
22210 79 29 20 69 73 20 0a 2a 2a 20 20 20 20 20 67 72  y) is .**     gr
22220 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c  eater than the l
22230 61 72 67 65 73 74 20 6b 65 79 20 63 75 72 72 65  argest key curre
22240 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 74  ntly stored in t
22250 68 65 20 70 6f 74 65 6e 74 69 61 6c 0a 2a 2a 20  he potential.** 
22260 20 20 20 20 6f 75 74 70 75 74 20 73 65 67 6d 65      output segme
22270 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
22280 74 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 4c  t fts3IncrmergeL
22290 6f 61 64 28 0a 20 20 46 74 73 33 54 61 62 6c 65  oad(.  Fts3Table
222a0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
222b0 20 20 20 20 20 20 20 2f 2a 20 46 74 73 33 20 74         /* Fts3 t
222c0 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
222d0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
222e0 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  AbsLevel,       
222f0 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65 76   /* Absolute lev
22300 65 6c 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d  el of input segm
22310 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 49  ents */.  int iI
22320 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
22330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
22340 65 78 20 6f 66 20 63 61 6e 64 69 64 61 74 65 20  ex of candidate 
22350 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 2a  output segment *
22360 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
22370 7a 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  zKey,           
22380 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6b 65 79      /* First key
22390 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69   to write */.  i
223a0 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20  nt nKey,        
223b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
223c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
223d0 73 20 69 6e 20 6e 4b 65 79 20 2a 2f 0a 20 20 49  s in nKey */.  I
223e0 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72 20 2a  ncrmergeWriter *
223f0 70 57 72 69 74 65 72 20 20 20 20 20 20 20 20 2f  pWriter        /
22400 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20  * Populate this 
22410 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69  object */.){.  i
22420 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
22430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22440 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
22450 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
22460 2a 70 53 65 6c 65 63 74 20 3d 20 30 3b 20 20 20  *pSelect = 0;   
22470 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20     /* SELECT to 
22480 72 65 61 64 20 25 5f 73 65 67 64 69 72 20 65 6e  read %_segdir en
22490 74 72 79 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66  try */..  rc = f
224a0 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51  ts3SqlStmt(p, SQ
224b0 4c 5f 53 45 4c 45 43 54 5f 53 45 47 44 49 52 2c  L_SELECT_SEGDIR,
224c0 20 26 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20   &pSelect, 0);. 
224d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
224e0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
224f0 33 5f 69 6e 74 36 34 20 69 53 74 61 72 74 20 3d  3_int64 iStart =
22500 20 30 3b 20 20 20 20 20 2f 2a 20 56 61 6c 75 65   0;     /* Value
22510 20 6f 66 20 25 5f 73 65 67 64 69 72 2e 73 74 61   of %_segdir.sta
22520 72 74 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  rt_block */.    
22530 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c  sqlite3_int64 iL
22540 65 61 66 45 6e 64 20 3d 20 30 3b 20 20 20 2f 2a  eafEnd = 0;   /*
22550 20 56 61 6c 75 65 20 6f 66 20 25 5f 73 65 67 64   Value of %_segd
22560 69 72 2e 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c  ir.leaves_end_bl
22570 6f 63 6b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ock */.    sqlit
22580 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 20 3d 20  e3_int64 iEnd = 
22590 30 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  0;       /* Valu
225a0 65 20 6f 66 20 25 5f 73 65 67 64 69 72 2e 65 6e  e of %_segdir.en
225b0 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 63  d_block */.    c
225c0 6f 6e 73 74 20 63 68 61 72 20 2a 61 52 6f 6f 74  onst char *aRoot
225d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
225e0 50 6f 69 6e 74 65 72 20 74 6f 20 25 5f 73 65 67  Pointer to %_seg
225f0 64 69 72 2e 72 6f 6f 74 20 62 75 66 66 65 72 20  dir.root buffer 
22600 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 6f 6f 74  */.    int nRoot
22610 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
22620 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
22630 61 52 6f 6f 74 5b 5d 20 69 6e 20 62 79 74 65 73  aRoot[] in bytes
22640 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   */.    int rc2;
22650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22660 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
22670 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69 74 65  code from sqlite
22680 33 5f 72 65 73 65 74 28 29 20 2a 2f 0a 20 20 20  3_reset() */.   
22690 20 69 6e 74 20 62 41 70 70 65 6e 64 61 62 6c 65   int bAppendable
226a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
226b0 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66  * Set to true if
226c0 20 73 65 67 6d 65 6e 74 20 69 73 20 61 70 70 65   segment is appe
226d0 6e 64 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f  ndable */..    /
226e0 2a 20 52 65 61 64 20 74 68 65 20 25 5f 73 65 67  * Read the %_seg
226f0 64 69 72 20 65 6e 74 72 79 20 66 6f 72 20 69 6e  dir entry for in
22700 64 65 78 20 69 49 64 78 20 61 62 73 6f 6c 75 74  dex iIdx absolut
22710 65 20 6c 65 76 65 6c 20 28 69 41 62 73 4c 65 76  e level (iAbsLev
22720 65 6c 2b 31 29 20 2a 2f 0a 20 20 20 20 73 71 6c  el+1) */.    sql
22730 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
22740 70 53 65 6c 65 63 74 2c 20 31 2c 20 69 41 62 73  pSelect, 1, iAbs
22750 4c 65 76 65 6c 2b 31 29 3b 0a 20 20 20 20 73 71  Level+1);.    sq
22760 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
22770 53 65 6c 65 63 74 2c 20 32 2c 20 69 49 64 78 29  Select, 2, iIdx)
22780 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
22790 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29 3d  3_step(pSelect)=
227a0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
227b0 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
227c0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
227d0 36 34 28 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a  64(pSelect, 1);.
227e0 20 20 20 20 20 20 69 4c 65 61 66 45 6e 64 20 3d        iLeafEnd =
227f0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
22800 69 6e 74 36 34 28 70 53 65 6c 65 63 74 2c 20 32  int64(pSelect, 2
22810 29 3b 0a 20 20 20 20 20 20 66 74 73 33 52 65 61  );.      fts3Rea
22820 64 45 6e 64 42 6c 6f 63 6b 46 69 65 6c 64 28 70  dEndBlockField(p
22830 53 65 6c 65 63 74 2c 20 33 2c 20 26 69 45 6e 64  Select, 3, &iEnd
22840 2c 20 26 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61  , &pWriter->nLea
22850 66 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66  fData);.      if
22860 28 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66  ( pWriter->nLeaf
22870 44 61 74 61 3c 30 20 29 7b 0a 20 20 20 20 20 20  Data<0 ){.      
22880 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66    pWriter->nLeaf
22890 44 61 74 61 20 3d 20 70 57 72 69 74 65 72 2d 3e  Data = pWriter->
228a0 6e 4c 65 61 66 44 61 74 61 20 2a 20 2d 31 3b 0a  nLeafData * -1;.
228b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 52        }.      nR
228c0 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  oot = sqlite3_co
228d0 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 65 6c 65  lumn_bytes(pSele
228e0 63 74 2c 20 34 29 3b 0a 20 20 20 20 20 20 61 52  ct, 4);.      aR
228f0 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  oot = sqlite3_co
22900 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 65 6c 65 63  lumn_blob(pSelec
22910 74 2c 20 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, 4);.    }else
22920 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  {.      return s
22930 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 65  qlite3_reset(pSe
22940 6c 65 63 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  lect);.    }..  
22950 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74    /* Check for t
22960 68 65 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 6d  he zero-length m
22970 61 72 6b 65 72 20 69 6e 20 74 68 65 20 25 5f 73  arker in the %_s
22980 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20 2a 2f  egments table */
22990 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 73  .    rc = fts3Is
229a0 41 70 70 65 6e 64 61 62 6c 65 28 70 2c 20 69 45  Appendable(p, iE
229b0 6e 64 2c 20 26 62 41 70 70 65 6e 64 61 62 6c 65  nd, &bAppendable
229c0 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
229d0 20 74 68 61 74 20 7a 4b 65 79 2f 6e 4b 65 79 20   that zKey/nKey 
229e0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
229f0 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 74  he largest key t
22a00 68 65 20 63 61 6e 64 69 64 61 74 65 20 2a 2f 0a  he candidate */.
22a10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
22a20 54 45 5f 4f 4b 20 26 26 20 62 41 70 70 65 6e 64  TE_OK && bAppend
22a30 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 63 68  able ){.      ch
22a40 61 72 20 2a 61 4c 65 61 66 20 3d 20 30 3b 0a 20  ar *aLeaf = 0;. 
22a50 20 20 20 20 20 69 6e 74 20 6e 4c 65 61 66 20 3d       int nLeaf =
22a60 20 30 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20   0;..      rc = 
22a70 73 71 6c 69 74 65 33 46 74 73 33 52 65 61 64 42  sqlite3Fts3ReadB
22a80 6c 6f 63 6b 28 70 2c 20 69 4c 65 61 66 45 6e 64  lock(p, iLeafEnd
22a90 2c 20 26 61 4c 65 61 66 2c 20 26 6e 4c 65 61 66  , &aLeaf, &nLeaf
22aa0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
22ab0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22ac0 0a 20 20 20 20 20 20 20 20 4e 6f 64 65 52 65 61  .        NodeRea
22ad0 64 65 72 20 72 65 61 64 65 72 3b 0a 20 20 20 20  der reader;.    
22ae0 20 20 20 20 66 6f 72 28 72 63 20 3d 20 6e 6f 64      for(rc = nod
22af0 65 52 65 61 64 65 72 49 6e 69 74 28 26 72 65 61  eReaderInit(&rea
22b00 64 65 72 2c 20 61 4c 65 61 66 2c 20 6e 4c 65 61  der, aLeaf, nLea
22b10 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  f);.            
22b20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
22b30 20 72 65 61 64 65 72 2e 61 4e 6f 64 65 3b 0a 20   reader.aNode;. 
22b40 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
22b50 6e 6f 64 65 52 65 61 64 65 72 4e 65 78 74 28 26  nodeReaderNext(&
22b60 72 65 61 64 65 72 29 0a 20 20 20 20 20 20 20 20  reader).        
22b70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
22b80 65 72 74 28 20 72 65 61 64 65 72 2e 61 4e 6f 64  ert( reader.aNod
22b90 65 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  e );.        }. 
22ba0 20 20 20 20 20 20 20 69 66 28 20 66 74 73 33 54         if( fts3T
22bb0 65 72 6d 43 6d 70 28 7a 4b 65 79 2c 20 6e 4b 65  ermCmp(zKey, nKe
22bc0 79 2c 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 61  y, reader.term.a
22bd0 2c 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 6e 29  , reader.term.n)
22be0 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  <=0 ){.         
22bf0 20 62 41 70 70 65 6e 64 61 62 6c 65 20 3d 20 30   bAppendable = 0
22c00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22c10 20 20 20 20 6e 6f 64 65 52 65 61 64 65 72 52 65      nodeReaderRe
22c20 6c 65 61 73 65 28 26 72 65 61 64 65 72 29 3b 0a  lease(&reader);.
22c30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
22c40 6c 69 74 65 33 5f 66 72 65 65 28 61 4c 65 61 66  lite3_free(aLeaf
22c50 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
22c60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22c70 26 26 20 62 41 70 70 65 6e 64 61 62 6c 65 20 29  && bAppendable )
22c80 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73  {.      /* It is
22c90 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 70 70   possible to app
22ca0 65 6e 64 20 74 6f 20 74 68 69 73 20 73 65 67 6d  end to this segm
22cb0 65 6e 74 2e 20 53 65 74 20 75 70 20 74 68 65 20  ent. Set up the 
22cc0 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72 0a  IncrmergeWriter.
22cd0 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 20        ** object 
22ce0 74 6f 20 64 6f 20 73 6f 2e 20 20 2a 2f 0a 20 20  to do so.  */.  
22cf0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
22d00 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 28   int nHeight = (
22d10 69 6e 74 29 61 52 6f 6f 74 5b 30 5d 3b 0a 20 20  int)aRoot[0];.  
22d20 20 20 20 20 4e 6f 64 65 57 72 69 74 65 72 20 2a      NodeWriter *
22d30 70 4e 6f 64 65 3b 0a 0a 20 20 20 20 20 20 70 57  pNode;..      pW
22d40 72 69 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74 20  riter->nLeafEst 
22d50 3d 20 28 69 6e 74 29 28 28 69 45 6e 64 20 2d 20  = (int)((iEnd - 
22d60 69 53 74 61 72 74 29 20 2b 20 31 29 2f 46 54 53  iStart) + 1)/FTS
22d70 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c 45 5f  _MAX_APPENDABLE_
22d80 48 45 49 47 48 54 3b 0a 20 20 20 20 20 20 70 57  HEIGHT;.      pW
22d90 72 69 74 65 72 2d 3e 69 53 74 61 72 74 20 3d 20  riter->iStart = 
22da0 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70 57  iStart;.      pW
22db0 72 69 74 65 72 2d 3e 69 45 6e 64 20 3d 20 69 45  riter->iEnd = iE
22dc0 6e 64 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65  nd;.      pWrite
22dd0 72 2d 3e 69 41 62 73 4c 65 76 65 6c 20 3d 20 69  r->iAbsLevel = i
22de0 41 62 73 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20  AbsLevel;.      
22df0 70 57 72 69 74 65 72 2d 3e 69 49 64 78 20 3d 20  pWriter->iIdx = 
22e00 69 49 64 78 3b 0a 0a 20 20 20 20 20 20 66 6f 72  iIdx;..      for
22e10 28 69 3d 6e 48 65 69 67 68 74 2b 31 3b 20 69 3c  (i=nHeight+1; i<
22e20 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42  FTS_MAX_APPENDAB
22e30 4c 45 5f 48 45 49 47 48 54 3b 20 69 2b 2b 29 7b  LE_HEIGHT; i++){
22e40 0a 20 20 20 20 20 20 20 20 70 57 72 69 74 65 72  .        pWriter
22e50 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 69 5d  ->aNodeWriter[i]
22e60 2e 69 42 6c 6f 63 6b 20 3d 20 70 57 72 69 74 65  .iBlock = pWrite
22e70 72 2d 3e 69 53 74 61 72 74 20 2b 20 69 2a 70 57  r->iStart + i*pW
22e80 72 69 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74 3b  riter->nLeafEst;
22e90 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
22ea0 70 4e 6f 64 65 20 3d 20 26 70 57 72 69 74 65 72  pNode = &pWriter
22eb0 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 6e 48  ->aNodeWriter[nH
22ec0 65 69 67 68 74 5d 3b 0a 20 20 20 20 20 20 70 4e  eight];.      pN
22ed0 6f 64 65 2d 3e 69 42 6c 6f 63 6b 20 3d 20 70 57  ode->iBlock = pW
22ee0 72 69 74 65 72 2d 3e 69 53 74 61 72 74 20 2b 20  riter->iStart + 
22ef0 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 45 73  pWriter->nLeafEs
22f00 74 2a 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 20  t*nHeight;.     
22f10 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28   blobGrowBuffer(
22f20 26 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2c 20 4d  &pNode->block, M
22f30 41 58 28 6e 52 6f 6f 74 2c 20 70 2d 3e 6e 4e 6f  AX(nRoot, p->nNo
22f40 64 65 53 69 7a 65 29 2c 20 26 72 63 29 3b 0a 20  deSize), &rc);. 
22f50 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
22f60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22f70 20 20 6d 65 6d 63 70 79 28 70 4e 6f 64 65 2d 3e    memcpy(pNode->
22f80 62 6c 6f 63 6b 2e 61 2c 20 61 52 6f 6f 74 2c 20  block.a, aRoot, 
22f90 6e 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20  nRoot);.        
22fa0 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 20 3d  pNode->block.n =
22fb0 20 6e 52 6f 6f 74 3b 0a 20 20 20 20 20 20 7d 0a   nRoot;.      }.
22fc0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 6e 48 65  .      for(i=nHe
22fd0 69 67 68 74 3b 20 69 3e 3d 30 20 26 26 20 72 63  ight; i>=0 && rc
22fe0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2d 2d  ==SQLITE_OK; i--
22ff0 29 7b 0a 20 20 20 20 20 20 20 20 4e 6f 64 65 52  ){.        NodeR
23000 65 61 64 65 72 20 72 65 61 64 65 72 3b 0a 20 20  eader reader;.  
23010 20 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 26 70        pNode = &p
23020 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69  Writer->aNodeWri
23030 74 65 72 5b 69 5d 3b 0a 0a 20 20 20 20 20 20 20  ter[i];..       
23040 20 72 63 20 3d 20 6e 6f 64 65 52 65 61 64 65 72   rc = nodeReader
23050 49 6e 69 74 28 26 72 65 61 64 65 72 2c 20 70 4e  Init(&reader, pN
23060 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 2c 20 70 4e  ode->block.a, pN
23070 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 29 3b 0a 20  ode->block.n);. 
23080 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 72 65         while( re
23090 61 64 65 72 2e 61 4e 6f 64 65 20 26 26 20 72 63  ader.aNode && rc
230a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
230b0 20 3d 20 6e 6f 64 65 52 65 61 64 65 72 4e 65 78   = nodeReaderNex
230c0 74 28 26 72 65 61 64 65 72 29 3b 0a 20 20 20 20  t(&reader);.    
230d0 20 20 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66      blobGrowBuff
230e0 65 72 28 26 70 4e 6f 64 65 2d 3e 6b 65 79 2c 20  er(&pNode->key, 
230f0 72 65 61 64 65 72 2e 74 65 72 6d 2e 6e 2c 20 26  reader.term.n, &
23100 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rc);.        if(
23110 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23120 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
23130 70 79 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e 61 2c  py(pNode->key.a,
23140 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 61 2c 20   reader.term.a, 
23150 72 65 61 64 65 72 2e 74 65 72 6d 2e 6e 29 3b 0a  reader.term.n);.
23160 20 20 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d            pNode-
23170 3e 6b 65 79 2e 6e 20 3d 20 72 65 61 64 65 72 2e  >key.n = reader.
23180 74 65 72 6d 2e 6e 3b 0a 20 20 20 20 20 20 20 20  term.n;.        
23190 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20    if( i>0 ){.   
231a0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 61           char *a
231b0 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Block = 0;.     
231c0 20 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 63         int nBloc
231d0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  k = 0;.         
231e0 20 20 20 70 4e 6f 64 65 20 3d 20 26 70 57 72 69     pNode = &pWri
231f0 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72  ter->aNodeWriter
23200 5b 69 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20  [i-1];.         
23210 20 20 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b     pNode->iBlock
23220 20 3d 20 72 65 61 64 65 72 2e 69 43 68 69 6c 64   = reader.iChild
23230 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
23240 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 52 65   = sqlite3Fts3Re
23250 61 64 42 6c 6f 63 6b 28 70 2c 20 72 65 61 64 65  adBlock(p, reade
23260 72 2e 69 43 68 69 6c 64 2c 20 26 61 42 6c 6f 63  r.iChild, &aBloc
23270 6b 2c 20 26 6e 42 6c 6f 63 6b 2c 20 30 29 3b 0a  k, &nBlock, 0);.
23280 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62              blob
23290 47 72 6f 77 42 75 66 66 65 72 28 26 70 4e 6f 64  GrowBuffer(&pNod
232a0 65 2d 3e 62 6c 6f 63 6b 2c 20 4d 41 58 28 6e 42  e->block, MAX(nB
232b0 6c 6f 63 6b 2c 20 70 2d 3e 6e 4e 6f 64 65 53 69  lock, p->nNodeSi
232c0 7a 65 29 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  ze), &rc);.     
232d0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
232e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
232f0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
23300 28 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 2c  (pNode->block.a,
23310 20 61 42 6c 6f 63 6b 2c 20 6e 42 6c 6f 63 6b 29   aBlock, nBlock)
23320 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
23330 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 20 3d  pNode->block.n =
23340 20 6e 42 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20   nBlock;.       
23350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23360 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
23370 61 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20  aBlock);.       
23380 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
23390 20 20 20 20 20 20 20 6e 6f 64 65 52 65 61 64 65         nodeReade
233a0 72 52 65 6c 65 61 73 65 28 26 72 65 61 64 65 72  rRelease(&reader
233b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
233c0 0a 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  ..    rc2 = sqli
233d0 74 65 33 5f 72 65 73 65 74 28 70 53 65 6c 65 63  te3_reset(pSelec
233e0 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
233f0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
23400 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   rc2;.  }..  ret
23410 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
23420 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6c   Determine the l
23430 61 72 67 65 73 74 20 73 65 67 6d 65 6e 74 20 69  argest segment i
23440 6e 64 65 78 20 76 61 6c 75 65 20 74 68 61 74 20  ndex value that 
23450 65 78 69 73 74 73 20 77 69 74 68 69 6e 20 61 62  exists within ab
23460 73 6f 6c 75 74 65 0a 2a 2a 20 6c 65 76 65 6c 20  solute.** level 
23470 69 41 62 73 4c 65 76 65 6c 2b 31 2e 20 49 66 20  iAbsLevel+1. If 
23480 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
23490 20 73 65 74 20 2a 70 69 49 64 78 20 74 6f 20 74   set *piIdx to t
234a0 68 69 73 20 76 61 6c 75 65 20 70 6c 75 73 0a 2a  his value plus.*
234b0 2a 20 6f 6e 65 20 62 65 66 6f 72 65 20 72 65 74  * one before ret
234c0 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b  urning SQLITE_OK
234d0 2e 20 4f 72 2c 20 69 66 20 74 68 65 72 65 20 61  . Or, if there a
234e0 72 65 20 6e 6f 20 73 65 67 6d 65 6e 74 73 20 61  re no segments a
234f0 74 20 61 6c 6c 20 0a 2a 2a 20 77 69 74 68 69 6e  t all .** within
23500 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c   level iAbsLevel
23510 2c 20 73 65 74 20 2a 70 69 49 64 78 20 74 6f 20  , set *piIdx to 
23520 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  zero..**.** If a
23530 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
23540 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
23550 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65   error code. The
23560 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 0a   final value of.
23570 2a 2a 20 2a 70 69 49 64 78 20 69 73 20 75 6e 64  ** *piIdx is und
23580 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63  efined in this c
23590 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
235a0 6e 74 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65  nt fts3Incrmerge
235b0 4f 75 74 70 75 74 49 64 78 28 20 0a 20 20 46 74  OutputIdx( .  Ft
235c0 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
235d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
235e0 20 46 54 53 20 54 61 62 6c 65 20 68 61 6e 64 6c   FTS Table handl
235f0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
23600 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c 2c 20  nt64 iAbsLevel, 
23610 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75         /* Absolu
23620 74 65 20 69 6e 64 65 78 20 6f 66 20 69 6e 70 75  te index of inpu
23630 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  t segments */.  
23640 69 6e 74 20 2a 70 69 49 64 78 20 20 20 20 20 20  int *piIdx      
23650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23660 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 66 72 65  /* OUT: Next fre
23670 65 20 69 6e 64 65 78 20 61 74 20 69 41 62 73 4c  e index at iAbsL
23680 65 76 65 6c 2b 31 20 2a 2f 0a 29 7b 0a 20 20 69  evel+1 */.){.  i
23690 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
236a0 5f 73 74 6d 74 20 2a 70 4f 75 74 70 75 74 49 64  _stmt *pOutputId
236b0 78 20 3d 20 30 3b 20 20 20 2f 2a 20 53 51 4c 20  x = 0;   /* SQL 
236c0 75 73 65 64 20 74 6f 20 66 69 6e 64 20 6f 75 74  used to find out
236d0 70 75 74 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20  put index */..  
236e0 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
236f0 28 70 2c 20 53 51 4c 5f 4e 45 58 54 5f 53 45 47  (p, SQL_NEXT_SEG
23700 4d 45 4e 54 5f 49 4e 44 45 58 2c 20 26 70 4f 75  MENT_INDEX, &pOu
23710 74 70 75 74 49 64 78 2c 20 30 29 3b 0a 20 20 69  tputIdx, 0);.  i
23720 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23730 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
23740 62 69 6e 64 5f 69 6e 74 36 34 28 70 4f 75 74 70  bind_int64(pOutp
23750 75 74 49 64 78 2c 20 31 2c 20 69 41 62 73 4c 65  utIdx, 1, iAbsLe
23760 76 65 6c 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69  vel+1);.    sqli
23770 74 65 33 5f 73 74 65 70 28 70 4f 75 74 70 75 74  te3_step(pOutput
23780 49 64 78 29 3b 0a 20 20 20 20 2a 70 69 49 64 78  Idx);.    *piIdx
23790 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
237a0 6e 5f 69 6e 74 28 70 4f 75 74 70 75 74 49 64 78  n_int(pOutputIdx
237b0 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  , 0);.    rc = s
237c0 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 4f 75  qlite3_reset(pOu
237d0 74 70 75 74 49 64 78 29 3b 0a 20 20 7d 0a 0a 20  tputIdx);.  }.. 
237e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
237f0 2a 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  * .** Allocate a
23800 6e 20 61 70 70 65 6e 64 61 62 6c 65 20 6f 75 74  n appendable out
23810 70 75 74 20 73 65 67 6d 65 6e 74 20 6f 6e 20 61  put segment on a
23820 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 69 41  bsolute level iA
23830 62 73 4c 65 76 65 6c 2b 31 0a 2a 2a 20 77 69 74  bsLevel+1.** wit
23840 68 20 69 64 78 20 76 61 6c 75 65 20 69 49 64 78  h idx value iIdx
23850 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 25  ..**.** In the %
23860 5f 73 65 67 64 69 72 20 74 61 62 6c 65 2c 20 61  _segdir table, a
23870 20 73 65 67 6d 65 6e 74 20 69 73 20 64 65 66 69   segment is defi
23880 6e 65 64 20 62 79 20 74 68 65 20 76 61 6c 75 65  ned by the value
23890 73 20 69 6e 20 74 68 72 65 65 0a 2a 2a 20 63 6f  s in three.** co
238a0 6c 75 6d 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  lumns:.**.**    
238b0 20 73 74 61 72 74 5f 62 6c 6f 63 6b 0a 2a 2a 20   start_block.** 
238c0 20 20 20 20 6c 65 61 76 65 73 5f 65 6e 64 5f 62      leaves_end_b
238d0 6c 6f 63 6b 0a 2a 2a 20 20 20 20 20 65 6e 64 5f  lock.**     end_
238e0 62 6c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  block.**.** When
238f0 20 61 6e 20 61 70 70 65 6e 64 61 62 6c 65 20 73   an appendable s
23900 65 67 6d 65 6e 74 20 69 73 20 61 6c 6c 6f 63 61  egment is alloca
23910 74 65 64 2c 20 69 74 20 69 73 20 65 73 74 69 6d  ted, it is estim
23920 61 74 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a  ated that the.**
23930 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
23940 6f 66 20 6c 65 61 66 20 62 6c 6f 63 6b 73 20 74  of leaf blocks t
23950 68 61 74 20 6d 61 79 20 62 65 20 72 65 71 75 69  hat may be requi
23960 72 65 64 20 69 73 20 74 68 65 20 73 75 6d 20 6f  red is the sum o
23970 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  f the.** number 
23980 6f 66 20 6c 65 61 66 20 62 6c 6f 63 6b 73 20 63  of leaf blocks c
23990 6f 6e 73 75 6d 65 64 20 62 79 20 74 68 65 20 69  onsumed by the i
239a0 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 2c 20 70  nput segments, p
239b0 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a  lus the number.*
239c0 2a 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65  * of input segme
239d0 6e 74 73 2c 20 6d 75 6c 74 69 70 6c 69 65 64 20  nts, multiplied 
239e0 62 79 20 74 77 6f 2e 20 54 68 69 73 20 76 61 6c  by two. This val
239f0 75 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ue is stored in 
23a00 73 74 61 63 6b 20 0a 2a 2a 20 76 61 72 69 61 62  stack .** variab
23a10 6c 65 20 6e 4c 65 61 66 45 73 74 2e 0a 2a 2a 0a  le nLeafEst..**.
23a20 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 31 36  ** A total of 16
23a30 2a 6e 4c 65 61 66 45 73 74 20 62 6c 6f 63 6b 73  *nLeafEst blocks
23a40 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 77   are allocated w
23a50 68 65 6e 20 61 6e 20 61 70 70 65 6e 64 61 62 6c  hen an appendabl
23a60 65 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 69 73 20  e segment.** is 
23a70 63 72 65 61 74 65 64 20 28 28 31 20 2b 20 65 6e  created ((1 + en
23a80 64 5f 62 6c 6f 63 6b 20 2d 20 73 74 61 72 74 5f  d_block - start_
23a90 62 6c 6f 63 6b 29 3d 3d 31 36 2a 6e 4c 65 61 66  block)==16*nLeaf
23aa0 45 73 74 29 2e 20 54 68 65 20 63 6f 6e 74 69 67  Est). The contig
23ab0 75 6f 75 73 0a 2a 2a 20 61 72 72 61 79 20 6f 66  uous.** array of
23ac0 20 6c 65 61 66 20 6e 6f 64 65 73 20 73 74 61 72   leaf nodes star
23ad0 74 73 20 61 74 20 74 68 65 20 66 69 72 73 74 20  ts at the first 
23ae0 62 6c 6f 63 6b 20 61 6c 6c 6f 63 61 74 65 64 2e  block allocated.
23af0 20 54 68 65 20 61 72 72 61 79 0a 2a 2a 20 6f 66   The array.** of
23b00 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 73 20   interior nodes 
23b10 74 68 61 74 20 61 72 65 20 70 61 72 65 6e 74 73  that are parents
23b20 20 6f 66 20 74 68 65 20 6c 65 61 66 20 6e 6f 64   of the leaf nod
23b30 65 73 20 73 74 61 72 74 20 61 74 20 62 6c 6f 63  es start at bloc
23b40 6b 0a 2a 2a 20 28 73 74 61 72 74 5f 62 6c 6f 63  k.** (start_bloc
23b50 6b 20 2b 20 28 31 20 2b 20 65 6e 64 5f 62 6c 6f  k + (1 + end_blo
23b60 63 6b 20 2d 20 73 74 61 72 74 5f 62 6c 6f 63 6b  ck - start_block
23b70 29 20 2f 20 31 36 29 2e 20 41 6e 64 20 73 6f 20  ) / 16). And so 
23b80 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  on..**.** In the
23b90 20 61 63 74 75 61 6c 20 63 6f 64 65 20 62 65 6c   actual code bel
23ba0 6f 77 2c 20 74 68 65 20 76 61 6c 75 65 20 22 31  ow, the value "1
23bb0 36 22 20 69 73 20 72 65 70 6c 61 63 65 64 20 77  6" is replaced w
23bc0 69 74 68 20 74 68 65 20 0a 2a 2a 20 70 72 65 2d  ith the .** pre-
23bd0 70 72 6f 63 65 73 73 6f 72 20 6d 61 63 72 6f 20  processor macro 
23be0 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42  FTS_MAX_APPENDAB
23bf0 4c 45 5f 48 45 49 47 48 54 2e 0a 2a 2f 0a 73 74  LE_HEIGHT..*/.st
23c00 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63  atic int fts3Inc
23c10 72 6d 65 72 67 65 57 72 69 74 65 72 28 20 0a 20  rmergeWriter( . 
23c20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
23c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c40 20 2f 2a 20 46 74 73 33 20 74 61 62 6c 65 20 68   /* Fts3 table h
23c50 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  andle */.  sqlit
23c60 65 33 5f 69 6e 74 36 34 20 69 41 62 73 4c 65 76  e3_int64 iAbsLev
23c70 65 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 62  el,        /* Ab
23c80 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 6f 66 20  solute level of 
23c90 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a  input segments *
23ca0 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20  /.  int iIdx,   
23cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cc0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
23cd0 6e 65 77 20 6f 75 74 70 75 74 20 73 65 67 6d 65  new output segme
23ce0 6e 74 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74  nt */.  Fts3Mult
23cf0 69 53 65 67 52 65 61 64 65 72 20 2a 70 43 73 72  iSegReader *pCsr
23d00 2c 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ,       /* Curso
23d10 72 20 74 68 61 74 20 64 61 74 61 20 77 69 6c 6c  r that data will
23d20 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   be read from */
23d30 0a 20 20 49 6e 63 72 6d 65 72 67 65 57 72 69 74  .  IncrmergeWrit
23d40 65 72 20 2a 70 57 72 69 74 65 72 20 20 20 20 20  er *pWriter     
23d50 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
23d60 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  his object */.){
23d70 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
23d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d90 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
23da0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
23db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23dc0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
23dd0 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
23de0 20 69 6e 74 20 6e 4c 65 61 66 45 73 74 20 3d 20   int nLeafEst = 
23df0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
23e00 20 2f 2a 20 42 6c 6f 63 6b 73 20 61 6c 6c 6f 63   /* Blocks alloc
23e10 61 74 65 64 20 66 6f 72 20 6c 65 61 66 20 6e 6f  ated for leaf no
23e20 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  des */.  sqlite3
23e30 5f 73 74 6d 74 20 2a 70 4c 65 61 66 45 73 74 20  _stmt *pLeafEst 
23e40 3d 20 30 3b 20 20 20 20 20 2f 2a 20 53 51 4c 20  = 0;     /* SQL 
23e50 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
23e60 65 20 6e 4c 65 61 66 45 73 74 20 2a 2f 0a 20 20  e nLeafEst */.  
23e70 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 46  sqlite3_stmt *pF
23e80 69 72 73 74 42 6c 6f 63 6b 20 3d 20 30 3b 20 20  irstBlock = 0;  
23e90 2f 2a 20 53 51 4c 20 75 73 65 64 20 74 6f 20 64  /* SQL used to d
23ea0 65 74 65 72 6d 69 6e 65 20 66 69 72 73 74 20 62  etermine first b
23eb0 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 43 61  lock */..  /* Ca
23ec0 6c 63 75 6c 61 74 65 20 6e 4c 65 61 66 45 73 74  lculate nLeafEst
23ed0 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73 33  . */.  rc = fts3
23ee0 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 4d  SqlStmt(p, SQL_M
23ef0 41 58 5f 4c 45 41 46 5f 4e 4f 44 45 5f 45 53 54  AX_LEAF_NODE_EST
23f00 49 4d 41 54 45 2c 20 26 70 4c 65 61 66 45 73 74  IMATE, &pLeafEst
23f10 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
23f20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23f30 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
23f40 74 36 34 28 70 4c 65 61 66 45 73 74 2c 20 31 2c  t64(pLeafEst, 1,
23f50 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20   iAbsLevel);.   
23f60 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
23f70 74 36 34 28 70 4c 65 61 66 45 73 74 2c 20 32 2c  t64(pLeafEst, 2,
23f80 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 29   pCsr->nSegment)
23f90 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
23fa0 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
23fb0 65 70 28 70 4c 65 61 66 45 73 74 29 20 29 7b 0a  ep(pLeafEst) ){.
23fc0 20 20 20 20 20 20 6e 4c 65 61 66 45 73 74 20 3d        nLeafEst =
23fd0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
23fe0 69 6e 74 28 70 4c 65 61 66 45 73 74 2c 20 30 29  int(pLeafEst, 0)
23ff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
24000 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
24010 4c 65 61 66 45 73 74 29 3b 0a 20 20 7d 0a 20 20  LeafEst);.  }.  
24020 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
24030 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
24040 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74    /* Calculate t
24050 68 65 20 66 69 72 73 74 20 62 6c 6f 63 6b 20 74  he first block t
24060 6f 20 75 73 65 20 69 6e 20 74 68 65 20 6f 75 74  o use in the out
24070 70 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  put segment */. 
24080 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
24090 74 28 70 2c 20 53 51 4c 5f 4e 45 58 54 5f 53 45  t(p, SQL_NEXT_SE
240a0 47 4d 45 4e 54 53 5f 49 44 2c 20 26 70 46 69 72  GMENTS_ID, &pFir
240b0 73 74 42 6c 6f 63 6b 2c 20 30 29 3b 0a 20 20 69  stBlock, 0);.  i
240c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
240d0 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49   ){.    if( SQLI
240e0 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
240f0 73 74 65 70 28 70 46 69 72 73 74 42 6c 6f 63 6b  step(pFirstBlock
24100 29 20 29 7b 0a 20 20 20 20 20 20 70 57 72 69 74  ) ){.      pWrit
24110 65 72 2d 3e 69 53 74 61 72 74 20 3d 20 73 71 6c  er->iStart = sql
24120 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
24130 34 28 70 46 69 72 73 74 42 6c 6f 63 6b 2c 20 30  4(pFirstBlock, 0
24140 29 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72  );.      pWriter
24150 2d 3e 69 45 6e 64 20 3d 20 70 57 72 69 74 65 72  ->iEnd = pWriter
24160 2d 3e 69 53 74 61 72 74 20 2d 20 31 3b 0a 20 20  ->iStart - 1;.  
24170 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 45 6e      pWriter->iEn
24180 64 20 2b 3d 20 6e 4c 65 61 66 45 73 74 20 2a 20  d += nLeafEst * 
24190 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42  FTS_MAX_APPENDAB
241a0 4c 45 5f 48 45 49 47 48 54 3b 0a 20 20 20 20 7d  LE_HEIGHT;.    }
241b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
241c0 33 5f 72 65 73 65 74 28 70 46 69 72 73 74 42 6c  3_reset(pFirstBl
241d0 6f 63 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ock);.  }.  if( 
241e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
241f0 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
24200 20 49 6e 73 65 72 74 20 74 68 65 20 6d 61 72 6b   Insert the mark
24210 65 72 20 69 6e 20 74 68 65 20 25 5f 73 65 67 6d  er in the %_segm
24220 65 6e 74 73 20 74 61 62 6c 65 20 74 6f 20 6d 61  ents table to ma
24230 6b 65 20 73 75 72 65 20 6e 6f 62 6f 64 79 20 74  ke sure nobody t
24240 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 73 74 65  ries.  ** to ste
24250 61 6c 20 74 68 65 20 73 70 61 63 65 20 6a 75 73  al the space jus
24260 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20 54 68 69  t allocated. Thi
24270 73 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 74  s is also used t
24280 6f 20 69 64 65 6e 74 69 66 79 20 0a 20 20 2a 2a  o identify .  **
24290 20 61 70 70 65 6e 64 61 62 6c 65 20 73 65 67 6d   appendable segm
242a0 65 6e 74 73 2e 20 20 2a 2f 0a 20 20 72 63 20 3d  ents.  */.  rc =
242b0 20 66 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e   fts3WriteSegmen
242c0 74 28 70 2c 20 70 57 72 69 74 65 72 2d 3e 69 45  t(p, pWriter->iE
242d0 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  nd, 0, 0);.  if(
242e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
242f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70   return rc;..  p
24300 57 72 69 74 65 72 2d 3e 69 41 62 73 4c 65 76 65  Writer->iAbsLeve
24310 6c 20 3d 20 69 41 62 73 4c 65 76 65 6c 3b 0a 20  l = iAbsLevel;. 
24320 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 45   pWriter->nLeafE
24330 73 74 20 3d 20 6e 4c 65 61 66 45 73 74 3b 0a 20  st = nLeafEst;. 
24340 20 70 57 72 69 74 65 72 2d 3e 69 49 64 78 20 3d   pWriter->iIdx =
24350 20 69 49 64 78 3b 0a 0a 20 20 2f 2a 20 53 65 74   iIdx;..  /* Set
24360 20 75 70 20 74 68 65 20 61 72 72 61 79 20 6f 66   up the array of
24370 20 4e 6f 64 65 57 72 69 74 65 72 20 6f 62 6a 65   NodeWriter obje
24380 63 74 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  cts */.  for(i=0
24390 3b 20 69 3c 46 54 53 5f 4d 41 58 5f 41 50 50 45  ; i<FTS_MAX_APPE
243a0 4e 44 41 42 4c 45 5f 48 45 49 47 48 54 3b 20 69  NDABLE_HEIGHT; i
243b0 2b 2b 29 7b 0a 20 20 20 20 70 57 72 69 74 65 72  ++){.    pWriter
243c0 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 69 5d  ->aNodeWriter[i]
243d0 2e 69 42 6c 6f 63 6b 20 3d 20 70 57 72 69 74 65  .iBlock = pWrite
243e0 72 2d 3e 69 53 74 61 72 74 20 2b 20 69 2a 70 57  r->iStart + i*pW
243f0 72 69 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74 3b  riter->nLeafEst;
24400 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
24410 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
24420 2a 20 52 65 6d 6f 76 65 20 61 6e 20 65 6e 74 72  * Remove an entr
24430 79 20 66 72 6f 6d 20 74 68 65 20 25 5f 73 65 67  y from the %_seg
24440 64 69 72 20 74 61 62 6c 65 2e 20 54 68 69 73 20  dir table. This 
24450 69 6e 76 6f 6c 76 65 73 20 72 75 6e 6e 69 6e 67  involves running
24460 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69   the .** followi
24470 6e 67 20 74 77 6f 20 73 74 61 74 65 6d 65 6e 74  ng two statement
24480 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 44 45 4c 45 54  s:.**.**   DELET
24490 45 20 46 52 4f 4d 20 25 5f 73 65 67 64 69 72 20  E FROM %_segdir 
244a0 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3a 69  WHERE level = :i
244b0 41 62 73 4c 65 76 65 6c 20 41 4e 44 20 69 64 78  AbsLevel AND idx
244c0 20 3d 20 3a 69 49 64 78 0a 2a 2a 20 20 20 55 50   = :iIdx.**   UP
244d0 44 41 54 45 20 25 5f 73 65 67 64 69 72 20 53 45  DATE %_segdir SE
244e0 54 20 69 64 78 20 3d 20 69 64 78 20 2d 20 31 20  T idx = idx - 1 
244f0 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3a 69  WHERE level = :i
24500 41 62 73 4c 65 76 65 6c 20 41 4e 44 20 69 64 78  AbsLevel AND idx
24510 20 3e 20 3a 69 49 64 78 0a 2a 2a 0a 2a 2a 20 54   > :iIdx.**.** T
24520 68 65 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  he DELETE statem
24530 65 6e 74 20 72 65 6d 6f 76 65 73 20 74 68 65 20  ent removes the 
24540 73 70 65 63 69 66 69 63 20 25 5f 73 65 67 64 69  specific %_segdi
24550 72 20 6c 65 76 65 6c 2e 20 54 68 65 20 55 50 44  r level. The UPD
24560 41 54 45 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  ATE .** statemen
24570 74 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  t ensures that t
24580 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 73 65 67  he remaining seg
24590 6d 65 6e 74 73 20 68 61 76 65 20 63 6f 6e 74 69  ments have conti
245a0 67 75 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65  guously allocate
245b0 64 0a 2a 2a 20 69 64 78 20 76 61 6c 75 65 73 2e  d.** idx values.
245c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
245d0 74 73 33 52 65 6d 6f 76 65 53 65 67 64 69 72 45  ts3RemoveSegdirE
245e0 6e 74 72 79 28 0a 20 20 46 74 73 33 54 61 62 6c  ntry(.  Fts3Tabl
245f0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
24600 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20          /* FTS3 
24610 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
24620 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
24630 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 20 20  iAbsLevel,      
24640 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65    /* Absolute le
24650 76 65 6c 20 74 6f 20 64 65 6c 65 74 65 20 66 72  vel to delete fr
24660 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  om */.  int iIdx
24670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24680 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
24690 20 6f 66 20 25 5f 73 65 67 64 69 72 20 65 6e 74   of %_segdir ent
246a0 72 79 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  ry to delete */.
246b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
246c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246d0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
246e0 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
246f0 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74 65 20 3d  _stmt *pDelete =
24700 20 30 3b 20 20 20 20 20 20 2f 2a 20 44 45 4c 45   0;      /* DELE
24710 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  TE statement */.
24720 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
24730 74 6d 74 28 70 2c 20 53 51 4c 5f 44 45 4c 45 54  tmt(p, SQL_DELET
24740 45 5f 53 45 47 44 49 52 5f 45 4e 54 52 59 2c 20  E_SEGDIR_ENTRY, 
24750 26 70 44 65 6c 65 74 65 2c 20 30 29 3b 0a 20 20  &pDelete, 0);.  
24760 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24770 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
24780 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c  _bind_int64(pDel
24790 65 74 65 2c 20 31 2c 20 69 41 62 73 4c 65 76 65  ete, 1, iAbsLeve
247a0 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
247b0 62 69 6e 64 5f 69 6e 74 28 70 44 65 6c 65 74 65  bind_int(pDelete
247c0 2c 20 32 2c 20 69 49 64 78 29 3b 0a 20 20 20 20  , 2, iIdx);.    
247d0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 44 65  sqlite3_step(pDe
247e0 6c 65 74 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  lete);.    rc = 
247f0 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 44  sqlite3_reset(pD
24800 65 6c 65 74 65 29 3b 0a 20 20 7d 0a 0a 20 20 72  elete);.  }..  r
24810 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
24820 2a 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  ** One or more s
24830 65 67 6d 65 6e 74 73 20 68 61 76 65 20 6a 75 73  egments have jus
24840 74 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 66  t been removed f
24850 72 6f 6d 20 61 62 73 6f 6c 75 74 65 20 6c 65 76  rom absolute lev
24860 65 6c 20 69 41 62 73 4c 65 76 65 6c 2e 0a 2a 2a  el iAbsLevel..**
24870 20 55 70 64 61 74 65 20 74 68 65 20 27 69 64 78   Update the 'idx
24880 27 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20  ' values of the 
24890 72 65 6d 61 69 6e 69 6e 67 20 73 65 67 6d 65 6e  remaining segmen
248a0 74 73 20 69 6e 20 74 68 65 20 6c 65 76 65 6c 20  ts in the level 
248b0 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 69  so that.** the i
248c0 64 78 20 76 61 6c 75 65 73 20 61 72 65 20 61 20  dx values are a 
248d0 63 6f 6e 74 69 67 75 6f 75 73 20 73 65 71 75 65  contiguous seque
248e0 6e 63 65 20 73 74 61 72 74 69 6e 67 20 66 72 6f  nce starting fro
248f0 6d 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  m 0..*/.static i
24900 6e 74 20 66 74 73 33 52 65 70 61 63 6b 53 65 67  nt fts3RepackSeg
24910 64 69 72 4c 65 76 65 6c 28 0a 20 20 46 74 73 33  dirLevel(.  Fts3
24920 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
24930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
24940 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  TS3 table handle
24950 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
24960 74 36 34 20 69 41 62 73 4c 65 76 65 6c 20 20 20  t64 iAbsLevel   
24970 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74        /* Absolut
24980 65 20 6c 65 76 65 6c 20 74 6f 20 72 65 70 61 63  e level to repac
24990 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  k */.){.  int rc
249a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
249b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
249c0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
249d0 74 20 2a 61 49 64 78 20 3d 20 30 3b 20 20 20 20  t *aIdx = 0;    
249e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
249f0 20 41 72 72 61 79 20 6f 66 20 72 65 6d 61 69 6e   Array of remain
24a00 69 6e 67 20 69 64 78 20 76 61 6c 75 65 73 20 2a  ing idx values *
24a10 2f 0a 20 20 69 6e 74 20 6e 49 64 78 20 3d 20 30  /.  int nIdx = 0
24a20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24a30 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 65 6e 74      /* Valid ent
24a40 72 69 65 73 20 69 6e 20 61 49 64 78 5b 5d 20 2a  ries in aIdx[] *
24a50 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d  /.  int nAlloc =
24a60 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
24a70 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
24a80 20 73 69 7a 65 20 6f 66 20 61 49 64 78 5b 5d 20   size of aIdx[] 
24a90 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
24aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ab0 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
24ac0 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 73   variable */.  s
24ad0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65  qlite3_stmt *pSe
24ae0 6c 65 63 74 20 3d 20 30 3b 20 20 20 20 20 20 2f  lect = 0;      /
24af0 2a 20 53 65 6c 65 63 74 20 73 74 61 74 65 6d 65  * Select stateme
24b00 6e 74 20 74 6f 20 72 65 61 64 20 69 64 78 20 76  nt to read idx v
24b10 61 6c 75 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  alues */.  sqlit
24b20 65 33 5f 73 74 6d 74 20 2a 70 55 70 64 61 74 65  e3_stmt *pUpdate
24b30 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 55 70   = 0;      /* Up
24b40 64 61 74 65 20 73 74 61 74 65 6d 65 6e 74 20 74  date statement t
24b50 6f 20 6d 6f 64 69 66 79 20 69 64 78 20 76 61 6c  o modify idx val
24b60 75 65 73 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66  ues */..  rc = f
24b70 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51  ts3SqlStmt(p, SQ
24b80 4c 5f 53 45 4c 45 43 54 5f 49 4e 44 45 58 45 53  L_SELECT_INDEXES
24b90 2c 20 26 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  , &pSelect, 0);.
24ba0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24bb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  _OK ){.    int r
24bc0 63 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  c2;.    sqlite3_
24bd0 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 65 6c 65  bind_int64(pSele
24be0 63 74 2c 20 31 2c 20 69 41 62 73 4c 65 76 65 6c  ct, 1, iAbsLevel
24bf0 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51  );.    while( SQ
24c00 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
24c10 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29 20  3_step(pSelect) 
24c20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 49 64  ){.      if( nId
24c30 78 3e 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  x>=nAlloc ){.   
24c40 20 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 3b 0a       int *aNew;.
24c50 20 20 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 2b          nAlloc +
24c60 3d 20 31 36 3b 0a 20 20 20 20 20 20 20 20 61 4e  = 16;.        aN
24c70 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ew = sqlite3_rea
24c80 6c 6c 6f 63 28 61 49 64 78 2c 20 6e 41 6c 6c 6f  lloc(aIdx, nAllo
24c90 63 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a  c*sizeof(int));.
24ca0 20 20 20 20 20 20 20 20 69 66 28 20 21 61 4e 65          if( !aNe
24cb0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  w ){.          r
24cc0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
24cd0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
24ce0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
24cf0 20 20 20 20 20 61 49 64 78 20 3d 20 61 4e 65 77       aIdx = aNew
24d00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24d10 61 49 64 78 5b 6e 49 64 78 2b 2b 5d 20 3d 20 73  aIdx[nIdx++] = s
24d20 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
24d30 74 28 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  t(pSelect, 0);. 
24d40 20 20 20 7d 0a 20 20 20 20 72 63 32 20 3d 20 73     }.    rc2 = s
24d50 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 65  qlite3_reset(pSe
24d60 6c 65 63 74 29 3b 0a 20 20 20 20 69 66 28 20 72  lect);.    if( r
24d70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
24d80 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20  c = rc2;.  }..  
24d90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24da0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  K ){.    rc = ft
24db0 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
24dc0 5f 53 48 49 46 54 5f 53 45 47 44 49 52 5f 45 4e  _SHIFT_SEGDIR_EN
24dd0 54 52 59 2c 20 26 70 55 70 64 61 74 65 2c 20 30  TRY, &pUpdate, 0
24de0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
24df0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24e00 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
24e10 6e 74 36 34 28 70 55 70 64 61 74 65 2c 20 32 2c  nt64(pUpdate, 2,
24e20 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 7d   iAbsLevel);.  }
24e30 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62  ..  assert( p->b
24e40 49 67 6e 6f 72 65 53 61 76 65 70 6f 69 6e 74 3d  IgnoreSavepoint=
24e50 3d 30 20 29 3b 0a 20 20 70 2d 3e 62 49 67 6e 6f  =0 );.  p->bIgno
24e60 72 65 53 61 76 65 70 6f 69 6e 74 20 3d 20 31 3b  reSavepoint = 1;
24e70 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
24e80 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e  SQLITE_OK && i<n
24e90 49 64 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Idx; i++){.    i
24ea0 66 28 20 61 49 64 78 5b 69 5d 21 3d 69 20 29 7b  f( aIdx[i]!=i ){
24eb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
24ec0 69 6e 64 5f 69 6e 74 28 70 55 70 64 61 74 65 2c  ind_int(pUpdate,
24ed0 20 33 2c 20 61 49 64 78 5b 69 5d 29 3b 0a 20 20   3, aIdx[i]);.  
24ee0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
24ef0 5f 69 6e 74 28 70 55 70 64 61 74 65 2c 20 31 2c  _int(pUpdate, 1,
24f00 20 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   i);.      sqlit
24f10 65 33 5f 73 74 65 70 28 70 55 70 64 61 74 65 29  e3_step(pUpdate)
24f20 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
24f30 69 74 65 33 5f 72 65 73 65 74 28 70 55 70 64 61  ite3_reset(pUpda
24f40 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  te);.    }.  }. 
24f50 20 70 2d 3e 62 49 67 6e 6f 72 65 53 61 76 65 70   p->bIgnoreSavep
24f60 6f 69 6e 74 20 3d 20 30 3b 0a 0a 20 20 73 71 6c  oint = 0;..  sql
24f70 69 74 65 33 5f 66 72 65 65 28 61 49 64 78 29 3b  ite3_free(aIdx);
24f80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24f90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
24fa0 33 53 74 61 72 74 4e 6f 64 65 28 42 6c 6f 62 20  3StartNode(Blob 
24fb0 2a 70 4e 6f 64 65 2c 20 69 6e 74 20 69 48 65 69  *pNode, int iHei
24fc0 67 68 74 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  ght, sqlite3_int
24fd0 36 34 20 69 43 68 69 6c 64 29 7b 0a 20 20 70 4e  64 iChild){.  pN
24fe0 6f 64 65 2d 3e 61 5b 30 5d 20 3d 20 28 63 68 61  ode->a[0] = (cha
24ff0 72 29 69 48 65 69 67 68 74 3b 0a 20 20 69 66 28  r)iHeight;.  if(
25000 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 61   iChild ){.    a
25010 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 6e 41  ssert( pNode->nA
25020 6c 6c 6f 63 3e 3d 31 2b 73 71 6c 69 74 65 33 46  lloc>=1+sqlite3F
25030 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 69 43 68  ts3VarintLen(iCh
25040 69 6c 64 29 20 29 3b 0a 20 20 20 20 70 4e 6f 64  ild) );.    pNod
25050 65 2d 3e 6e 20 3d 20 31 20 2b 20 73 71 6c 69 74  e->n = 1 + sqlit
25060 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28  e3Fts3PutVarint(
25070 26 70 4e 6f 64 65 2d 3e 61 5b 31 5d 2c 20 69 43  &pNode->a[1], iC
25080 68 69 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  hild);.  }else{.
25090 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64      assert( pNod
250a0 65 2d 3e 6e 41 6c 6c 6f 63 3e 3d 31 20 29 3b 0a  e->nAlloc>=1 );.
250b0 20 20 20 20 70 4e 6f 64 65 2d 3e 6e 20 3d 20 31      pNode->n = 1
250c0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
250d0 68 65 20 66 69 72 73 74 20 74 77 6f 20 61 72 67  he first two arg
250e0 75 6d 65 6e 74 73 20 61 72 65 20 61 20 70 6f 69  uments are a poi
250f0 6e 74 65 72 20 74 6f 20 61 6e 64 20 74 68 65 20  nter to and the 
25100 73 69 7a 65 20 6f 66 20 61 20 73 65 67 6d 65 6e  size of a segmen
25110 74 20 62 2d 74 72 65 65 0a 2a 2a 20 6e 6f 64 65  t b-tree.** node
25120 2e 20 54 68 65 20 6e 6f 64 65 20 6d 61 79 20 62  . The node may b
25130 65 20 61 20 6c 65 61 66 20 6f 72 20 61 6e 20 69  e a leaf or an i
25140 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 0a 2a 2a  nternal node..**
25150 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
25160 6e 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20  n creates a new 
25170 6e 6f 64 65 20 69 6d 61 67 65 20 69 6e 20 62 6c  node image in bl
25180 6f 62 20 6f 62 6a 65 63 74 20 2a 70 4e 65 77 20  ob object *pNew 
25190 62 79 20 63 6f 70 79 69 6e 67 0a 2a 2a 20 61 6c  by copying.** al
251a0 6c 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65  l terms that are
251b0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
251c0 20 65 71 75 61 6c 20 74 6f 20 7a 54 65 72 6d 2f   equal to zTerm/
251d0 6e 54 65 72 6d 20 28 66 6f 72 20 6c 65 61 66 20  nTerm (for leaf 
251e0 6e 6f 64 65 73 29 0a 2a 2a 20 6f 72 20 67 72 65  nodes).** or gre
251f0 61 74 65 72 20 74 68 61 6e 20 7a 54 65 72 6d 2f  ater than zTerm/
25200 6e 54 65 72 6d 20 28 66 6f 72 20 69 6e 74 65 72  nTerm (for inter
25210 6e 61 6c 20 6e 6f 64 65 73 29 20 66 72 6f 6d 20  nal nodes) from 
25220 61 4e 6f 64 65 2f 6e 4e 6f 64 65 2e 0a 2a 2f 0a  aNode/nNode..*/.
25230 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 54  static int fts3T
25240 72 75 6e 63 61 74 65 4e 6f 64 65 28 0a 20 20 63  runcateNode(.  c
25250 6f 6e 73 74 20 63 68 61 72 20 2a 61 4e 6f 64 65  onst char *aNode
25260 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
25270 2a 20 43 75 72 72 65 6e 74 20 6e 6f 64 65 20 69  * Current node i
25280 6d 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  mage */.  int nN
25290 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
252a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
252b0 65 20 6f 66 20 61 4e 6f 64 65 20 69 6e 20 62 79  e of aNode in by
252c0 74 65 73 20 2a 2f 0a 20 20 42 6c 6f 62 20 2a 70  tes */.  Blob *p
252d0 4e 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20  New,            
252e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
252f0 20 57 72 69 74 65 20 6e 65 77 20 6e 6f 64 65 20   Write new node 
25300 69 6d 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20  image here */.  
25310 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72  const char *zTer
25320 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
25330 2f 2a 20 4f 6d 69 74 20 61 6c 6c 20 74 65 72 6d  /* Omit all term
25340 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
25350 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  his */.  int nTe
25360 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
25370 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
25380 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62 79 74   of zTerm in byt
25390 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  es */.  sqlite3_
253a0 69 6e 74 36 34 20 2a 70 69 42 6c 6f 63 6b 20 20  int64 *piBlock  
253b0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
253c0 42 6c 6f 63 6b 20 6e 75 6d 62 65 72 20 69 6e 20  Block number in 
253d0 6e 65 78 74 20 6c 61 79 65 72 20 64 6f 77 6e 20  next layer down 
253e0 2a 2f 0a 29 7b 0a 20 20 4e 6f 64 65 52 65 61 64  */.){.  NodeRead
253f0 65 72 20 72 65 61 64 65 72 3b 20 20 20 20 20 20  er reader;      
25400 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 65          /* Reade
25410 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 42 6c  r object */.  Bl
25420 6f 62 20 70 72 65 76 20 3d 20 7b 30 2c 20 30 2c  ob prev = {0, 0,
25430 20 30 7d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   0};          /*
25440 20 50 72 65 76 69 6f 75 73 20 74 65 72 6d 20 77   Previous term w
25450 72 69 74 74 65 6e 20 74 6f 20 6e 65 77 20 6e 6f  ritten to new no
25460 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  de */.  int rc =
25470 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
25480 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
25490 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
254a0 62 4c 65 61 66 20 3d 20 61 4e 6f 64 65 5b 30 5d  bLeaf = aNode[0]
254b0 3d 3d 27 5c 30 27 3b 20 20 20 20 20 2f 2a 20 54  =='\0';     /* T
254c0 72 75 65 20 66 6f 72 20 61 20 6c 65 61 66 20 6e  rue for a leaf n
254d0 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  ode */..  /* All
254e0 6f 63 61 74 65 20 72 65 71 75 69 72 65 64 20 6f  ocate required o
254f0 75 74 70 75 74 20 73 70 61 63 65 20 2a 2f 0a 20  utput space */. 
25500 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28   blobGrowBuffer(
25510 70 4e 65 77 2c 20 6e 4e 6f 64 65 2c 20 26 72 63  pNew, nNode, &rc
25520 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
25530 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
25540 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 6e 20 3d 20  rc;.  pNew->n = 
25550 30 3b 0a 0a 20 20 2f 2a 20 50 6f 70 75 6c 61 74  0;..  /* Populat
25560 65 20 6e 65 77 20 6e 6f 64 65 20 62 75 66 66 65  e new node buffe
25570 72 20 2a 2f 0a 20 20 66 6f 72 28 72 63 20 3d 20  r */.  for(rc = 
25580 6e 6f 64 65 52 65 61 64 65 72 49 6e 69 74 28 26  nodeReaderInit(&
25590 72 65 61 64 65 72 2c 20 61 4e 6f 64 65 2c 20 6e  reader, aNode, n
255a0 4e 6f 64 65 29 3b 20 0a 20 20 20 20 20 20 72 63  Node); .      rc
255b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  ==SQLITE_OK && r
255c0 65 61 64 65 72 2e 61 4e 6f 64 65 3b 20 0a 20 20  eader.aNode; .  
255d0 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 52 65 61      rc = nodeRea
255e0 64 65 72 4e 65 78 74 28 26 72 65 61 64 65 72 29  derNext(&reader)
255f0 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4e  .  ){.    if( pN
25600 65 77 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  ew->n==0 ){.    
25610 20 20 69 6e 74 20 72 65 73 20 3d 20 66 74 73 33    int res = fts3
25620 54 65 72 6d 43 6d 70 28 72 65 61 64 65 72 2e 74  TermCmp(reader.t
25630 65 72 6d 2e 61 2c 20 72 65 61 64 65 72 2e 74 65  erm.a, reader.te
25640 72 6d 2e 6e 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  rm.n, zTerm, nTe
25650 72 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rm);.      if( r
25660 65 73 3c 30 20 7c 7c 20 28 62 4c 65 61 66 3d 3d  es<0 || (bLeaf==
25670 30 20 26 26 20 72 65 73 3d 3d 30 29 20 29 20 63  0 && res==0) ) c
25680 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66  ontinue;.      f
25690 74 73 33 53 74 61 72 74 4e 6f 64 65 28 70 4e 65  ts3StartNode(pNe
256a0 77 2c 20 28 69 6e 74 29 61 4e 6f 64 65 5b 30 5d  w, (int)aNode[0]
256b0 2c 20 72 65 61 64 65 72 2e 69 43 68 69 6c 64 29  , reader.iChild)
256c0 3b 0a 20 20 20 20 20 20 2a 70 69 42 6c 6f 63 6b  ;.      *piBlock
256d0 20 3d 20 72 65 61 64 65 72 2e 69 43 68 69 6c 64   = reader.iChild
256e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
256f0 20 66 74 73 33 41 70 70 65 6e 64 54 6f 4e 6f 64   fts3AppendToNod
25700 65 28 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2c  e(.        pNew,
25710 20 26 70 72 65 76 2c 20 72 65 61 64 65 72 2e 74   &prev, reader.t
25720 65 72 6d 2e 61 2c 20 72 65 61 64 65 72 2e 74 65  erm.a, reader.te
25730 72 6d 2e 6e 2c 0a 20 20 20 20 20 20 20 20 72 65  rm.n,.        re
25740 61 64 65 72 2e 61 44 6f 63 6c 69 73 74 2c 20 72  ader.aDoclist, r
25750 65 61 64 65 72 2e 6e 44 6f 63 6c 69 73 74 0a 20  eader.nDoclist. 
25760 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63     );.    if( rc
25770 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72  !=SQLITE_OK ) br
25780 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  eak;.  }.  if( p
25790 4e 65 77 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20  New->n==0 ){.   
257a0 20 66 74 73 33 53 74 61 72 74 4e 6f 64 65 28 70   fts3StartNode(p
257b0 4e 65 77 2c 20 28 69 6e 74 29 61 4e 6f 64 65 5b  New, (int)aNode[
257c0 30 5d 2c 20 72 65 61 64 65 72 2e 69 43 68 69 6c  0], reader.iChil
257d0 64 29 3b 0a 20 20 20 20 2a 70 69 42 6c 6f 63 6b  d);.    *piBlock
257e0 20 3d 20 72 65 61 64 65 72 2e 69 43 68 69 6c 64   = reader.iChild
257f0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
25800 70 4e 65 77 2d 3e 6e 3c 3d 70 4e 65 77 2d 3e 6e  pNew->n<=pNew->n
25810 41 6c 6c 6f 63 20 29 3b 0a 0a 20 20 6e 6f 64 65  Alloc );..  node
25820 52 65 61 64 65 72 52 65 6c 65 61 73 65 28 26 72  ReaderRelease(&r
25830 65 61 64 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  eader);.  sqlite
25840 33 5f 66 72 65 65 28 70 72 65 76 2e 61 29 3b 0a  3_free(prev.a);.
25850 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25860 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c  /*.** Remove all
25870 20 74 65 72 6d 73 20 73 6d 61 6c 6c 65 72 20 74   terms smaller t
25880 68 61 6e 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 20  han zTerm/nTerm 
25890 66 72 6f 6d 20 73 65 67 6d 65 6e 74 20 69 49 64  from segment iId
258a0 78 20 69 6e 20 61 62 73 6f 6c 75 74 65 20 0a 2a  x in absolute .*
258b0 2a 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65  * level iAbsLeve
258c0 6c 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76 6f  l. This may invo
258d0 6c 76 65 20 64 65 6c 65 74 69 6e 67 20 65 6e 74  lve deleting ent
258e0 72 69 65 73 20 66 72 6f 6d 20 74 68 65 20 25 5f  ries from the %_
258f0 73 65 67 6d 65 6e 74 73 0a 2a 2a 20 74 61 62 6c  segments.** tabl
25900 65 2c 20 61 6e 64 20 6d 6f 64 69 66 79 69 6e 67  e, and modifying
25910 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 69 65   existing entrie
25920 73 20 69 6e 20 62 6f 74 68 20 74 68 65 20 25 5f  s in both the %_
25930 73 65 67 6d 65 6e 74 73 20 61 6e 64 20 25 5f 73  segments and %_s
25940 65 67 64 69 72 0a 2a 2a 20 74 61 62 6c 65 73 2e  egdir.** tables.
25950 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
25960 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
25970 74 68 65 20 73 65 67 6d 65 6e 74 20 69 73 20 75  the segment is u
25980 70 64 61 74 65 64 20 73 75 63 63 65 73 73 66 75  pdated successfu
25990 6c 6c 79 2e 20 4f 72 20 61 6e 0a 2a 2a 20 53 51  lly. Or an.** SQ
259a0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
259b0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
259c0 61 74 69 63 20 69 6e 74 20 66 74 73 33 54 72 75  atic int fts3Tru
259d0 6e 63 61 74 65 53 65 67 6d 65 6e 74 28 0a 20 20  ncateSegment(.  
259e0 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
259f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a00 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20 68 61  /* FTS3 table ha
25a10 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ndle */.  sqlite
25a20 33 5f 69 6e 74 36 34 20 69 41 62 73 4c 65 76 65  3_int64 iAbsLeve
25a30 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 62 73  l,        /* Abs
25a40 6f 6c 75 74 65 20 6c 65 76 65 6c 20 6f 66 20 73  olute level of s
25a50 65 67 6d 65 6e 74 20 74 6f 20 6d 6f 64 69 66 79  egment to modify
25a60 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20   */.  int iIdx, 
25a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a80 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 77        /* Index w
25a90 69 74 68 69 6e 20 6c 65 76 65 6c 20 6f 66 20 73  ithin level of s
25aa0 65 67 6d 65 6e 74 20 74 6f 20 6d 6f 64 69 66 79  egment to modify
25ab0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
25ac0 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20   *zTerm,        
25ad0 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
25ae0 74 65 72 6d 73 20 73 6d 61 6c 6c 65 72 20 74 68  terms smaller th
25af0 61 6e 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74  an this */.  int
25b00 20 6e 54 65 72 6d 20 20 20 20 20 20 20 20 20 20   nTerm          
25b10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25b20 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
25b30 6e 20 62 75 66 66 65 72 20 7a 54 65 72 6d 20 2a  n buffer zTerm *
25b40 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
25b50 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
25b60 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
25b70 20 63 6f 64 65 20 2a 2f 0a 20 20 42 6c 6f 62 20   code */.  Blob 
25b80 72 6f 6f 74 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20  root = {0,0,0}; 
25b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
25ba0 77 20 72 6f 6f 74 20 70 61 67 65 20 69 6d 61 67  w root page imag
25bb0 65 20 2a 2f 0a 20 20 42 6c 6f 62 20 62 6c 6f 63  e */.  Blob bloc
25bc0 6b 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 20  k = {0,0,0};    
25bd0 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
25be0 20 75 73 65 64 20 66 6f 72 20 61 6e 79 20 6f 74   used for any ot
25bf0 68 65 72 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 73  her block */.  s
25c00 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 42 6c  qlite3_int64 iBl
25c10 6f 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ock = 0;       /
25c20 2a 20 42 6c 6f 63 6b 20 69 64 20 2a 2f 0a 20 20  * Block id */.  
25c30 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4e  sqlite3_int64 iN
25c40 65 77 53 74 61 72 74 20 3d 20 30 3b 20 20 20 20  ewStart = 0;    
25c50 2f 2a 20 4e 65 77 20 76 61 6c 75 65 20 66 6f 72  /* New value for
25c60 20 69 53 74 61 72 74 42 6c 6f 63 6b 20 2a 2f 0a   iStartBlock */.
25c70 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
25c80 69 4f 6c 64 53 74 61 72 74 20 3d 20 30 3b 20 20  iOldStart = 0;  
25c90 20 20 2f 2a 20 4f 6c 64 20 76 61 6c 75 65 20 66    /* Old value f
25ca0 6f 72 20 69 53 74 61 72 74 42 6c 6f 63 6b 20 2a  or iStartBlock *
25cb0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
25cc0 20 2a 70 46 65 74 63 68 20 3d 20 30 3b 20 20 20   *pFetch = 0;   
25cd0 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
25ce0 20 75 73 65 64 20 74 6f 20 66 65 74 63 68 20 73   used to fetch s
25cf0 65 67 64 69 72 20 2a 2f 0a 0a 20 20 72 63 20 3d  egdir */..  rc =
25d00 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
25d10 53 51 4c 5f 53 45 4c 45 43 54 5f 53 45 47 44 49  SQL_SELECT_SEGDI
25d20 52 2c 20 26 70 46 65 74 63 68 2c 20 30 29 3b 0a  R, &pFetch, 0);.
25d30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25d40 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  _OK ){.    int r
25d50 63 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  c2;             
25d60 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
25d70 74 65 33 5f 72 65 73 65 74 28 29 20 72 65 74 75  te3_reset() retu
25d80 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 73  rn code */.    s
25d90 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
25da0 34 28 70 46 65 74 63 68 2c 20 31 2c 20 69 41 62  4(pFetch, 1, iAb
25db0 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20 73 71 6c  sLevel);.    sql
25dc0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 46  ite3_bind_int(pF
25dd0 65 74 63 68 2c 20 32 2c 20 69 49 64 78 29 3b 0a  etch, 2, iIdx);.
25de0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
25df0 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
25e00 28 70 46 65 74 63 68 29 20 29 7b 0a 20 20 20 20  (pFetch) ){.    
25e10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 52    const char *aR
25e20 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  oot = sqlite3_co
25e30 6c 75 6d 6e 5f 62 6c 6f 62 28 70 46 65 74 63 68  lumn_blob(pFetch
25e40 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  , 4);.      int 
25e50 6e 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f  nRoot = sqlite3_
25e60 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 46 65  column_bytes(pFe
25e70 74 63 68 2c 20 34 29 3b 0a 20 20 20 20 20 20 69  tch, 4);.      i
25e80 4f 6c 64 53 74 61 72 74 20 3d 20 73 71 6c 69 74  OldStart = sqlit
25e90 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
25ea0 70 46 65 74 63 68 2c 20 31 29 3b 0a 20 20 20 20  pFetch, 1);.    
25eb0 20 20 72 63 20 3d 20 66 74 73 33 54 72 75 6e 63    rc = fts3Trunc
25ec0 61 74 65 4e 6f 64 65 28 61 52 6f 6f 74 2c 20 6e  ateNode(aRoot, n
25ed0 52 6f 6f 74 2c 20 26 72 6f 6f 74 2c 20 7a 54 65  Root, &root, zTe
25ee0 72 6d 2c 20 6e 54 65 72 6d 2c 20 26 69 42 6c 6f  rm, nTerm, &iBlo
25ef0 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ck);.    }.    r
25f00 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  c2 = sqlite3_res
25f10 65 74 28 70 46 65 74 63 68 29 3b 0a 20 20 20 20  et(pFetch);.    
25f20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25f30 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20  K ) rc = rc2;.  
25f40 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  }..  while( rc==
25f50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 42 6c  SQLITE_OK && iBl
25f60 6f 63 6b 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ock ){.    char 
25f70 2a 61 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20  *aBlock = 0;.   
25f80 20 69 6e 74 20 6e 42 6c 6f 63 6b 20 3d 20 30 3b   int nBlock = 0;
25f90 0a 20 20 20 20 69 4e 65 77 53 74 61 72 74 20 3d  .    iNewStart =
25fa0 20 69 42 6c 6f 63 6b 3b 0a 0a 20 20 20 20 72 63   iBlock;..    rc
25fb0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 52 65   = sqlite3Fts3Re
25fc0 61 64 42 6c 6f 63 6b 28 70 2c 20 69 42 6c 6f 63  adBlock(p, iBloc
25fd0 6b 2c 20 26 61 42 6c 6f 63 6b 2c 20 26 6e 42 6c  k, &aBlock, &nBl
25fe0 6f 63 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ock, 0);.    if(
25ff0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
26000 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  {.      rc = fts
26010 33 54 72 75 6e 63 61 74 65 4e 6f 64 65 28 61 42  3TruncateNode(aB
26020 6c 6f 63 6b 2c 20 6e 42 6c 6f 63 6b 2c 20 26 62  lock, nBlock, &b
26030 6c 6f 63 6b 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  lock, zTerm, nTe
26040 72 6d 2c 20 26 69 42 6c 6f 63 6b 29 3b 0a 20 20  rm, &iBlock);.  
26050 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
26060 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26070 20 20 20 72 63 20 3d 20 66 74 73 33 57 72 69 74     rc = fts3Writ
26080 65 53 65 67 6d 65 6e 74 28 70 2c 20 69 4e 65 77  eSegment(p, iNew
26090 53 74 61 72 74 2c 20 62 6c 6f 63 6b 2e 61 2c 20  Start, block.a, 
260a0 62 6c 6f 63 6b 2e 6e 29 3b 0a 20 20 20 20 7d 0a  block.n);.    }.
260b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
260c0 28 61 42 6c 6f 63 6b 29 3b 0a 20 20 7d 0a 0a 20  (aBlock);.  }.. 
260d0 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65   /* Variable iNe
260e0 77 53 74 61 72 74 20 6e 6f 77 20 63 6f 6e 74 61  wStart now conta
260f0 69 6e 73 20 74 68 65 20 66 69 72 73 74 20 76 61  ins the first va
26100 6c 69 64 20 6c 65 61 66 20 6e 6f 64 65 2e 20 2a  lid leaf node. *
26110 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
26120 54 45 5f 4f 4b 20 26 26 20 69 4e 65 77 53 74 61  TE_OK && iNewSta
26130 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rt ){.    sqlite
26140 33 5f 73 74 6d 74 20 2a 70 44 65 6c 20 3d 20 30  3_stmt *pDel = 0
26150 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53  ;.    rc = fts3S
26160 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 44 45  qlStmt(p, SQL_DE
26170 4c 45 54 45 5f 53 45 47 4d 45 4e 54 53 5f 52 41  LETE_SEGMENTS_RA
26180 4e 47 45 2c 20 26 70 44 65 6c 2c 20 30 29 3b 0a  NGE, &pDel, 0);.
26190 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
261a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
261b0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
261c0 34 28 70 44 65 6c 2c 20 31 2c 20 69 4f 6c 64 53  4(pDel, 1, iOldS
261d0 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  tart);.      sql
261e0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
261f0 70 44 65 6c 2c 20 32 2c 20 69 4e 65 77 53 74 61  pDel, 2, iNewSta
26200 72 74 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  rt-1);.      sql
26210 69 74 65 33 5f 73 74 65 70 28 70 44 65 6c 29 3b  ite3_step(pDel);
26220 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
26230 74 65 33 5f 72 65 73 65 74 28 70 44 65 6c 29 3b  te3_reset(pDel);
26240 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
26250 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26260 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
26270 74 6d 74 20 2a 70 43 68 6f 6d 70 20 3d 20 30 3b  tmt *pChomp = 0;
26280 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71  .    rc = fts3Sq
26290 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 43 48 4f  lStmt(p, SQL_CHO
262a0 4d 50 5f 53 45 47 44 49 52 2c 20 26 70 43 68 6f  MP_SEGDIR, &pCho
262b0 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mp, 0);.    if( 
262c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
262d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
262e0 69 6e 64 5f 69 6e 74 36 34 28 70 43 68 6f 6d 70  ind_int64(pChomp
262f0 2c 20 31 2c 20 69 4e 65 77 53 74 61 72 74 29 3b  , 1, iNewStart);
26300 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
26310 69 6e 64 5f 62 6c 6f 62 28 70 43 68 6f 6d 70 2c  ind_blob(pChomp,
26320 20 32 2c 20 72 6f 6f 74 2e 61 2c 20 72 6f 6f 74   2, root.a, root
26330 2e 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  .n, SQLITE_STATI
26340 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
26350 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 43 68  3_bind_int64(pCh
26360 6f 6d 70 2c 20 33 2c 20 69 41 62 73 4c 65 76 65  omp, 3, iAbsLeve
26370 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
26380 33 5f 62 69 6e 64 5f 69 6e 74 28 70 43 68 6f 6d  3_bind_int(pChom
26390 70 2c 20 34 2c 20 69 49 64 78 29 3b 0a 20 20 20  p, 4, iIdx);.   
263a0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
263b0 70 43 68 6f 6d 70 29 3b 0a 20 20 20 20 20 20 72  pChomp);.      r
263c0 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
263d0 74 28 70 43 68 6f 6d 70 29 3b 0a 20 20 20 20 7d  t(pChomp);.    }
263e0 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
263f0 66 72 65 65 28 72 6f 6f 74 2e 61 29 3b 0a 20 20  free(root.a);.  
26400 73 71 6c 69 74 65 33 5f 66 72 65 65 28 62 6c 6f  sqlite3_free(blo
26410 63 6b 2e 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  ck.a);.  return 
26420 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
26430 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
26440 6c 6c 65 64 20 61 66 74 65 72 20 61 6e 20 69 6e  lled after an in
26450 63 72 6d 65 6e 74 61 6c 2d 6d 65 72 67 65 20 6f  crmental-merge o
26460 70 65 72 61 74 69 6f 6e 20 68 61 73 20 72 75 6e  peration has run
26470 20 74 6f 0a 2a 2a 20 6d 65 72 67 65 20 28 6f 72   to.** merge (or
26480 20 70 61 72 74 69 61 6c 6c 79 20 6d 65 72 67 65   partially merge
26490 29 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65  ) two or more se
264a0 67 6d 65 6e 74 73 20 66 72 6f 6d 20 61 62 73 6f  gments from abso
264b0 6c 75 74 65 20 6c 65 76 65 6c 0a 2a 2a 20 69 41  lute level.** iA
264c0 62 73 4c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 45  bsLevel..**.** E
264d0 61 63 68 20 69 6e 70 75 74 20 73 65 67 6d 65 6e  ach input segmen
264e0 74 20 69 73 20 65 69 74 68 65 72 20 72 65 6d 6f  t is either remo
264f0 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64 62 20  ved from the db 
26500 63 6f 6d 70 6c 65 74 65 6c 79 20 28 69 66 20 61  completely (if a
26510 6c 6c 20 6f 66 0a 2a 2a 20 69 74 73 20 64 61 74  ll of.** its dat
26520 61 20 77 61 73 20 63 6f 70 69 65 64 20 74 6f 20  a was copied to 
26530 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65  the output segme
26540 6e 74 20 62 79 20 74 68 65 20 69 6e 63 72 6d 65  nt by the incrme
26550 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 29 0a 2a  rge operation).*
26560 2a 20 6f 72 20 6d 6f 64 69 66 69 65 64 20 69 6e  * or modified in
26570 20 70 6c 61 63 65 20 73 6f 20 74 68 61 74 20 69   place so that i
26580 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f 6e 74  t no longer cont
26590 61 69 6e 73 20 74 68 6f 73 65 20 65 6e 74 72 69  ains those entri
265a0 65 73 20 74 68 61 74 0a 2a 2a 20 68 61 76 65 20  es that.** have 
265b0 62 65 65 6e 20 64 75 70 6c 69 63 61 74 65 64 20  been duplicated 
265c0 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 65  in the output se
265d0 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  gment..*/.static
265e0 20 69 6e 74 20 66 74 73 33 49 6e 63 72 6d 65 72   int fts3Incrmer
265f0 67 65 43 68 6f 6d 70 28 0a 20 20 46 74 73 33 54  geChomp(.  Fts3T
26600 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
26610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
26620 53 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  S table handle *
26630 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
26640 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20  4 iAbsLevel,    
26650 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20      /* Absolute 
26660 6c 65 76 65 6c 20 63 6f 6e 74 61 69 6e 69 6e 67  level containing
26670 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46   segments */.  F
26680 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
26690 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 2f  r *pCsr,       /
266a0 2a 20 43 68 6f 6d 70 20 61 6c 6c 20 73 65 67 6d  * Chomp all segm
266b0 65 6e 74 73 20 6f 70 65 6e 65 64 20 62 79 20 74  ents opened by t
266c0 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  his cursor */.  
266d0 69 6e 74 20 2a 70 6e 52 65 6d 20 20 20 20 20 20  int *pnRem      
266e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67  /* Number of seg
26700 6d 65 6e 74 73 20 6e 6f 74 20 64 65 6c 65 74 65  ments not delete
26710 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  d */.){.  int i;
26720 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 30 3b  .  int nRem = 0;
26730 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
26740 54 45 5f 4f 4b 3b 0a 0a 20 20 66 6f 72 28 69 3d  TE_OK;..  for(i=
26750 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 2d 31  pCsr->nSegment-1
26760 3b 20 69 3e 3d 30 20 26 26 20 72 63 3d 3d 53 51  ; i>=0 && rc==SQ
26770 4c 49 54 45 5f 4f 4b 3b 20 69 2d 2d 29 7b 0a 20  LITE_OK; i--){. 
26780 20 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72     Fts3SegReader
26790 20 2a 70 53 65 67 20 3d 20 30 3b 0a 20 20 20 20   *pSeg = 0;.    
267a0 69 6e 74 20 6a 3b 0a 0a 20 20 20 20 2f 2a 20 46  int j;..    /* F
267b0 69 6e 64 20 74 68 65 20 46 74 73 33 53 65 67 52  ind the Fts3SegR
267c0 65 61 64 65 72 20 6f 62 6a 65 63 74 20 77 69 74  eader object wit
267d0 68 20 46 74 73 33 53 65 67 52 65 61 64 65 72 2e  h Fts3SegReader.
267e0 69 49 64 78 3d 3d 69 2e 20 49 74 20 69 73 20 68  iIdx==i. It is h
267f0 69 64 69 6e 67 0a 20 20 20 20 2a 2a 20 73 6f 6d  iding.    ** som
26800 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 70 43  ewhere in the pC
26810 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 5d 20  sr->apSegment[] 
26820 61 72 72 61 79 2e 20 20 2a 2f 0a 20 20 20 20 66  array.  */.    f
26830 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a  or(j=0; ALWAYS(j
26840 3c 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 29  <pCsr->nSegment)
26850 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53  ; j++){.      pS
26860 65 67 20 3d 20 70 43 73 72 2d 3e 61 70 53 65 67  eg = pCsr->apSeg
26870 6d 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  ment[j];.      i
26880 66 28 20 70 53 65 67 2d 3e 69 49 64 78 3d 3d 69  f( pSeg->iIdx==i
26890 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
268a0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 43      assert( j<pC
268b0 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 20 26 26 20  sr->nSegment && 
268c0 70 53 65 67 2d 3e 69 49 64 78 3d 3d 69 20 29 3b  pSeg->iIdx==i );
268d0 0a 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e  ..    if( pSeg->
268e0 61 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  aNode==0 ){.    
268f0 20 20 2f 2a 20 53 65 67 2d 72 65 61 64 65 72 20    /* Seg-reader 
26900 69 73 20 61 74 20 45 4f 46 2e 20 52 65 6d 6f 76  is at EOF. Remov
26910 65 20 74 68 65 20 65 6e 74 69 72 65 20 69 6e 70  e the entire inp
26920 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20  ut segment. */. 
26930 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 65       rc = fts3De
26940 6c 65 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 70  leteSegment(p, p
26950 53 65 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Seg);.      if( 
26960 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26970 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74  .        rc = ft
26980 73 33 52 65 6d 6f 76 65 53 65 67 64 69 72 45 6e  s3RemoveSegdirEn
26990 74 72 79 28 70 2c 20 69 41 62 73 4c 65 76 65 6c  try(p, iAbsLevel
269a0 2c 20 70 53 65 67 2d 3e 69 49 64 78 29 3b 0a 20  , pSeg->iIdx);. 
269b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 6e       }.      *pn
269c0 52 65 6d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Rem = 0;.    }el
269d0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  se{.      /* The
269e0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72   incremental mer
269f0 67 65 20 64 69 64 20 6e 6f 74 20 63 6f 70 79 20  ge did not copy 
26a00 61 6c 6c 20 74 68 65 20 64 61 74 61 20 66 72 6f  all the data fro
26a10 6d 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a  m this .      **
26a20 20 73 65 67 6d 65 6e 74 20 74 6f 20 74 68 65 20   segment to the 
26a30 75 70 70 65 72 20 6c 65 76 65 6c 2e 20 54 68 65  upper level. The
26a40 20 73 65 67 6d 65 6e 74 20 69 73 20 6d 6f 64 69   segment is modi
26a50 66 69 65 64 20 69 6e 20 70 6c 61 63 65 0a 20 20  fied in place.  
26a60 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 69      ** so that i
26a70 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 6b 65  t contains no ke
26a80 79 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ys smaller than 
26a90 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 2a 2f 20  zTerm/nTerm. */ 
26aa0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
26ab0 72 20 2a 7a 54 65 72 6d 20 3d 20 70 53 65 67 2d  r *zTerm = pSeg-
26ac0 3e 7a 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e  >zTerm;.      in
26ad0 74 20 6e 54 65 72 6d 20 3d 20 70 53 65 67 2d 3e  t nTerm = pSeg->
26ae0 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 72 63 20  nTerm;.      rc 
26af0 3d 20 66 74 73 33 54 72 75 6e 63 61 74 65 53 65  = fts3TruncateSe
26b00 67 6d 65 6e 74 28 70 2c 20 69 41 62 73 4c 65 76  gment(p, iAbsLev
26b10 65 6c 2c 20 70 53 65 67 2d 3e 69 49 64 78 2c 20  el, pSeg->iIdx, 
26b20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  zTerm, nTerm);. 
26b30 20 20 20 20 20 6e 52 65 6d 2b 2b 3b 0a 20 20 20       nRem++;.   
26b40 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
26b50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
26b60 52 65 6d 21 3d 70 43 73 72 2d 3e 6e 53 65 67 6d  Rem!=pCsr->nSegm
26b70 65 6e 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ent ){.    rc = 
26b80 66 74 73 33 52 65 70 61 63 6b 53 65 67 64 69 72  fts3RepackSegdir
26b90 4c 65 76 65 6c 28 70 2c 20 69 41 62 73 4c 65 76  Level(p, iAbsLev
26ba0 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 52  el);.  }..  *pnR
26bb0 65 6d 20 3d 20 6e 52 65 6d 3b 0a 20 20 72 65 74  em = nRem;.  ret
26bc0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
26bd0 20 53 74 6f 72 65 20 61 6e 20 69 6e 63 72 2d 6d   Store an incr-m
26be0 65 72 67 65 20 68 69 6e 74 20 69 6e 20 74 68 65  erge hint in the
26bf0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
26c00 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63  atic int fts3Inc
26c10 72 6d 65 72 67 65 48 69 6e 74 53 74 6f 72 65 28  rmergeHintStore(
26c20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 42 6c  Fts3Table *p, Bl
26c30 6f 62 20 2a 70 48 69 6e 74 29 7b 0a 20 20 73 71  ob *pHint){.  sq
26c40 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 52 65 70  lite3_stmt *pRep
26c50 6c 61 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lace = 0;.  int 
26c60 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
26c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
26c80 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
26c90 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
26ca0 74 28 70 2c 20 53 51 4c 5f 52 45 50 4c 41 43 45  t(p, SQL_REPLACE
26cb0 5f 53 54 41 54 2c 20 26 70 52 65 70 6c 61 63 65  _STAT, &pReplace
26cc0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
26cd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26ce0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
26cf0 74 28 70 52 65 70 6c 61 63 65 2c 20 31 2c 20 46  t(pReplace, 1, F
26d00 54 53 5f 53 54 41 54 5f 49 4e 43 52 4d 45 52 47  TS_STAT_INCRMERG
26d10 45 48 49 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  EHINT);.    sqli
26d20 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 52  te3_bind_blob(pR
26d30 65 70 6c 61 63 65 2c 20 32 2c 20 70 48 69 6e 74  eplace, 2, pHint
26d40 2d 3e 61 2c 20 70 48 69 6e 74 2d 3e 6e 2c 20 53  ->a, pHint->n, S
26d50 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
26d60 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
26d70 70 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20 72  pReplace);.    r
26d80 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
26d90 74 28 70 52 65 70 6c 61 63 65 29 3b 0a 20 20 7d  t(pReplace);.  }
26da0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
26db0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 61 6e 20  ../*.** Load an 
26dc0 69 6e 63 72 2d 6d 65 72 67 65 20 68 69 6e 74 20  incr-merge hint 
26dd0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
26de0 65 2e 20 54 68 65 20 69 6e 63 72 2d 6d 65 72 67  e. The incr-merg
26df0 65 20 68 69 6e 74 2c 20 69 66 20 6f 6e 65 20 0a  e hint, if one .
26e00 2a 2a 20 65 78 69 73 74 73 2c 20 69 73 20 73 74  ** exists, is st
26e10 6f 72 65 64 20 69 6e 20 74 68 65 20 72 6f 77 69  ored in the rowi
26e20 64 3d 3d 31 20 72 6f 77 20 6f 66 20 74 68 65 20  d==1 row of the 
26e30 25 5f 73 74 61 74 20 74 61 62 6c 65 2e 0a 2a 2a  %_stat table..**
26e40 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
26e50 6c 2c 20 70 6f 70 75 6c 61 74 65 20 62 6c 6f 62  l, populate blob
26e60 20 2a 70 48 69 6e 74 20 77 69 74 68 20 74 68 65   *pHint with the
26e70 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
26e80 20 74 68 65 20 25 5f 73 74 61 74 0a 2a 2a 20 74   the %_stat.** t
26e90 61 62 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 20  able and return 
26ea0 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72  SQLITE_OK. Other
26eb0 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f  wise, if an erro
26ec0 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
26ed0 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72   an.** SQLite er
26ee0 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
26ef0 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72  tic int fts3Incr
26f00 6d 65 72 67 65 48 69 6e 74 4c 6f 61 64 28 46 74  mergeHintLoad(Ft
26f10 73 33 54 61 62 6c 65 20 2a 70 2c 20 42 6c 6f 62  s3Table *p, Blob
26f20 20 2a 70 48 69 6e 74 29 7b 0a 20 20 73 71 6c 69   *pHint){.  sqli
26f30 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63  te3_stmt *pSelec
26f40 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  t = 0;.  int rc;
26f50 0a 0a 20 20 70 48 69 6e 74 2d 3e 6e 20 3d 20 30  ..  pHint->n = 0
26f60 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  ;.  rc = fts3Sql
26f70 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45  Stmt(p, SQL_SELE
26f80 43 54 5f 53 54 41 54 2c 20 26 70 53 65 6c 65 63  CT_STAT, &pSelec
26f90 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  t, 0);.  if( rc=
26fa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26fb0 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 73    int rc2;.    s
26fc0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
26fd0 70 53 65 6c 65 63 74 2c 20 31 2c 20 46 54 53 5f  pSelect, 1, FTS_
26fe0 53 54 41 54 5f 49 4e 43 52 4d 45 52 47 45 48 49  STAT_INCRMERGEHI
26ff0 4e 54 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  NT);.    if( SQL
27000 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
27010 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29 20 29  _step(pSelect) )
27020 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
27030 61 72 20 2a 61 48 69 6e 74 20 3d 20 73 71 6c 69  ar *aHint = sqli
27040 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
27050 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
27060 20 20 20 69 6e 74 20 6e 48 69 6e 74 20 3d 20 73     int nHint = s
27070 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
27080 74 65 73 28 70 53 65 6c 65 63 74 2c 20 30 29 3b  tes(pSelect, 0);
27090 0a 20 20 20 20 20 20 69 66 28 20 61 48 69 6e 74  .      if( aHint
270a0 20 29 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62   ){.        blob
270b0 47 72 6f 77 42 75 66 66 65 72 28 70 48 69 6e 74  GrowBuffer(pHint
270c0 2c 20 6e 48 69 6e 74 2c 20 26 72 63 29 3b 0a 20  , nHint, &rc);. 
270d0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
270e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
270f0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69        memcpy(pHi
27100 6e 74 2d 3e 61 2c 20 61 48 69 6e 74 2c 20 6e 48  nt->a, aHint, nH
27110 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  int);.          
27120 70 48 69 6e 74 2d 3e 6e 20 3d 20 6e 48 69 6e 74  pHint->n = nHint
27130 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27140 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63    }.    }.    rc
27150 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  2 = sqlite3_rese
27160 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  t(pSelect);.    
27170 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27180 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20  K ) rc = rc2;.  
27190 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
271a0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 52 63  }../*.** If *pRc
271b0 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f   is not SQLITE_O
271c0 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
271d0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
271e0 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
271f0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 70 70  * Otherwise, app
27200 65 6e 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  end an entry to 
27210 74 68 65 20 68 69 6e 74 20 73 74 6f 72 65 64 20  the hint stored 
27220 69 6e 20 62 6c 6f 62 20 2a 70 48 69 6e 74 2e 20  in blob *pHint. 
27230 45 61 63 68 20 65 6e 74 72 79 0a 2a 2a 20 63 6f  Each entry.** co
27240 6e 73 69 73 74 73 20 6f 66 20 74 77 6f 20 76 61  nsists of two va
27250 72 69 6e 74 73 2c 20 74 68 65 20 61 62 73 6f 6c  rints, the absol
27260 75 74 65 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72  ute level number
27270 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 73 65   of the input se
27280 67 6d 65 6e 74 73 20 0a 2a 2a 20 61 6e 64 20 74  gments .** and t
27290 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 70  he number of inp
272a0 75 74 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2a 0a  ut segments..**.
272b0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
272c0 2c 20 6c 65 61 76 65 20 2a 70 52 63 20 73 65 74  , leave *pRc set
272d0 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e   to SQLITE_OK an
272e0 64 20 72 65 74 75 72 6e 2e 20 49 66 20 61 6e 20  d return. If an 
272f0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a  error occurs,.**
27300 20 73 65 74 20 2a 70 52 63 20 74 6f 20 61 6e 20   set *pRc to an 
27310 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
27320 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
27330 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
27340 69 64 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65  id fts3Incrmerge
27350 48 69 6e 74 50 75 73 68 28 0a 20 20 42 6c 6f 62  HintPush(.  Blob
27360 20 2a 70 48 69 6e 74 2c 20 20 20 20 20 20 20 20   *pHint,        
27370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
27380 69 6e 74 20 62 6c 6f 62 20 74 6f 20 61 70 70 65  int blob to appe
27390 6e 64 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 69  nd to */.  i64 i
273a0 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  AbsLevel,       
273b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
273c0 72 73 74 20 76 61 72 69 6e 74 20 74 6f 20 73 74  rst varint to st
273d0 6f 72 65 20 69 6e 20 68 69 6e 74 20 2a 2f 0a 20  ore in hint */. 
273e0 20 69 6e 74 20 6e 49 6e 70 75 74 2c 20 20 20 20   int nInput,    
273f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27400 20 2f 2a 20 53 65 63 6f 6e 64 20 76 61 72 69 6e   /* Second varin
27410 74 20 74 6f 20 73 74 6f 72 65 20 69 6e 20 68 69  t to store in hi
27420 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63  nt */.  int *pRc
27430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27440 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
27450 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f  T: Error code */
27460 0a 29 7b 0a 20 20 62 6c 6f 62 47 72 6f 77 42 75  .){.  blobGrowBu
27470 66 66 65 72 28 70 48 69 6e 74 2c 20 70 48 69 6e  ffer(pHint, pHin
27480 74 2d 3e 6e 20 2b 20 32 2a 46 54 53 33 5f 56 41  t->n + 2*FTS3_VA
27490 52 49 4e 54 5f 4d 41 58 2c 20 70 52 63 29 3b 0a  RINT_MAX, pRc);.
274a0 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
274b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 48 69  TE_OK ){.    pHi
274c0 6e 74 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33  nt->n += sqlite3
274d0 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70  Fts3PutVarint(&p
274e0 48 69 6e 74 2d 3e 61 5b 70 48 69 6e 74 2d 3e 6e  Hint->a[pHint->n
274f0 5d 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20  ], iAbsLevel);. 
27500 20 20 20 70 48 69 6e 74 2d 3e 6e 20 2b 3d 20 73     pHint->n += s
27510 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72  qlite3Fts3PutVar
27520 69 6e 74 28 26 70 48 69 6e 74 2d 3e 61 5b 70 48  int(&pHint->a[pH
27530 69 6e 74 2d 3e 6e 5d 2c 20 28 69 36 34 29 6e 49  int->n], (i64)nI
27540 6e 70 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  nput);.  }.}../*
27550 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 6c 61 73  .** Read the las
27560 74 20 65 6e 74 72 79 20 28 6d 6f 73 74 20 72 65  t entry (most re
27570 63 65 6e 74 6c 79 20 70 75 73 68 65 64 29 20 66  cently pushed) f
27580 72 6f 6d 20 74 68 65 20 68 69 6e 74 20 62 6c 6f  rom the hint blo
27590 62 20 2a 70 48 69 6e 74 0a 2a 2a 20 61 6e 64 20  b *pHint.** and 
275a0 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20  then remove the 
275b0 65 6e 74 72 79 2e 20 57 72 69 74 65 20 74 68 65  entry. Write the
275c0 20 74 77 6f 20 76 61 6c 75 65 73 20 72 65 61 64   two values read
275d0 20 74 6f 20 2a 70 69 41 62 73 4c 65 76 65 6c 20   to *piAbsLevel 
275e0 61 6e 64 20 0a 2a 2a 20 2a 70 6e 49 6e 70 75 74  and .** *pnInput
275f0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
27600 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65  g..**.** If no e
27610 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
27620 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  urn SQLITE_OK. I
27630 66 20 74 68 65 20 68 69 6e 74 20 62 6c 6f 62 20  f the hint blob 
27640 69 6e 20 2a 70 48 69 6e 74 20 64 6f 65 73 0a 2a  in *pHint does.*
27650 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 74  * not contain at
27660 20 6c 65 61 73 74 20 74 77 6f 20 76 61 6c 69 64   least two valid
27670 20 76 61 72 69 6e 74 73 2c 20 72 65 74 75 72 6e   varints, return
27680 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
27690 56 54 41 42 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  VTAB..*/.static 
276a0 69 6e 74 20 66 74 73 33 49 6e 63 72 6d 65 72 67  int fts3Incrmerg
276b0 65 48 69 6e 74 50 6f 70 28 42 6c 6f 62 20 2a 70  eHintPop(Blob *p
276c0 48 69 6e 74 2c 20 69 36 34 20 2a 70 69 41 62 73  Hint, i64 *piAbs
276d0 4c 65 76 65 6c 2c 20 69 6e 74 20 2a 70 6e 49 6e  Level, int *pnIn
276e0 70 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  put){.  const in
276f0 74 20 6e 48 69 6e 74 20 3d 20 70 48 69 6e 74 2d  t nHint = pHint-
27700 3e 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  >n;.  int i;..  
27710 69 20 3d 20 70 48 69 6e 74 2d 3e 6e 2d 32 3b 0a  i = pHint->n-2;.
27720 20 20 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20    while( i>0 && 
27730 28 70 48 69 6e 74 2d 3e 61 5b 69 2d 31 5d 20 26  (pHint->a[i-1] &
27740 20 30 78 38 30 29 20 29 20 69 2d 2d 3b 0a 20 20   0x80) ) i--;.  
27750 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20 28 70  while( i>0 && (p
27760 48 69 6e 74 2d 3e 61 5b 69 2d 31 5d 20 26 20 30  Hint->a[i-1] & 0
27770 78 38 30 29 20 29 20 69 2d 2d 3b 0a 0a 20 20 70  x80) ) i--;..  p
27780 48 69 6e 74 2d 3e 6e 20 3d 20 69 3b 0a 20 20 69  Hint->n = i;.  i
27790 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47   += sqlite3Fts3G
277a0 65 74 56 61 72 69 6e 74 28 26 70 48 69 6e 74 2d  etVarint(&pHint-
277b0 3e 61 5b 69 5d 2c 20 70 69 41 62 73 4c 65 76 65  >a[i], piAbsLeve
277c0 6c 29 3b 0a 20 20 69 20 2b 3d 20 66 74 73 33 47  l);.  i += fts3G
277d0 65 74 56 61 72 69 6e 74 33 32 28 26 70 48 69 6e  etVarint32(&pHin
277e0 74 2d 3e 61 5b 69 5d 2c 20 70 6e 49 6e 70 75 74  t->a[i], pnInput
277f0 29 3b 0a 20 20 69 66 28 20 69 21 3d 6e 48 69 6e  );.  if( i!=nHin
27800 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
27810 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a  E_CORRUPT_VTAB;.
27820 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
27830 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  _OK;.}.../*.** A
27840 74 74 65 6d 70 74 20 61 6e 20 69 6e 63 72 65 6d  ttempt an increm
27850 65 6e 74 61 6c 20 6d 65 72 67 65 20 74 68 61 74  ental merge that
27860 20 77 72 69 74 65 73 20 6e 4d 65 72 67 65 20 6c   writes nMerge l
27870 65 61 66 20 62 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  eaf blocks..**.*
27880 2a 20 49 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  * Incremental me
27890 72 67 65 73 20 68 61 70 70 65 6e 20 6e 4d 69 6e  rges happen nMin
278a0 20 73 65 67 6d 65 6e 74 73 20 61 74 20 61 20 74   segments at a t
278b0 69 6d 65 2e 20 54 68 65 20 73 65 67 6d 65 6e 74  ime. The segment
278c0 73 20 0a 2a 2a 20 74 6f 20 62 65 20 6d 65 72 67  s .** to be merg
278d0 65 64 20 61 72 65 20 74 68 65 20 6e 4d 69 6e 20  ed are the nMin 
278e0 6f 6c 64 65 73 74 20 73 65 67 6d 65 6e 74 73 20  oldest segments 
278f0 28 74 68 65 20 6f 6e 65 73 20 77 69 74 68 20 74  (the ones with t
27900 68 65 20 73 6d 61 6c 6c 65 73 74 20 0a 2a 2a 20  he smallest .** 
27910 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 5f  values for the _
27920 73 65 67 64 69 72 2e 69 64 78 20 66 69 65 6c 64  segdir.idx field
27930 29 20 69 6e 20 74 68 65 20 68 69 67 68 65 73 74  ) in the highest
27940 20 6c 65 76 65 6c 20 74 68 61 74 20 63 6f 6e 74   level that cont
27950 61 69 6e 73 20 0a 2a 2a 20 61 74 20 6c 65 61 73  ains .** at leas
27960 74 20 6e 4d 69 6e 20 73 65 67 6d 65 6e 74 73 2e  t nMin segments.
27970 20 4d 75 6c 74 69 70 6c 65 20 6d 65 72 67 65 73   Multiple merges
27980 20 6d 69 67 68 74 20 6f 63 63 75 72 20 69 6e 20   might occur in 
27990 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a  an attempt to .*
279a0 2a 20 77 72 69 74 65 20 74 68 65 20 71 75 6f 74  * write the quot
279b0 61 20 6f 66 20 6e 4d 65 72 67 65 20 6c 65 61 66  a of nMerge leaf
279c0 20 62 6c 6f 63 6b 73 2e 0a 2a 2f 0a 69 6e 74 20   blocks..*/.int 
279d0 73 71 6c 69 74 65 33 46 74 73 33 49 6e 63 72 6d  sqlite3Fts3Incrm
279e0 65 72 67 65 28 46 74 73 33 54 61 62 6c 65 20 2a  erge(Fts3Table *
279f0 70 2c 20 69 6e 74 20 6e 4d 65 72 67 65 2c 20 69  p, int nMerge, i
27a00 6e 74 20 6e 4d 69 6e 29 7b 0a 20 20 69 6e 74 20  nt nMin){.  int 
27a10 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
27a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
27a30 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
27a40 69 6e 74 20 6e 52 65 6d 20 3d 20 6e 4d 65 72 67  int nRem = nMerg
27a50 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
27a60 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
27a70 66 20 70 61 67 65 73 20 79 65 74 20 74 6f 20 20  f pages yet to  
27a80 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  be written */.  
27a90 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
27aa0 65 72 20 2a 70 43 73 72 3b 20 20 20 20 20 20 20  er *pCsr;       
27ab0 2f 2a 20 43 75 72 73 6f 72 20 75 73 65 64 20 74  /* Cursor used t
27ac0 6f 20 72 65 61 64 20 69 6e 70 75 74 20 64 61 74  o read input dat
27ad0 61 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 46 69  a */.  Fts3SegFi
27ae0 6c 74 65 72 20 2a 70 46 69 6c 74 65 72 3b 20 20  lter *pFilter;  
27af0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 74 65 72         /* Filter
27b00 20 75 73 65 64 20 77 69 74 68 20 63 75 72 73 6f   used with curso
27b10 72 20 70 43 73 72 20 2a 2f 0a 20 20 49 6e 63 72  r pCsr */.  Incr
27b20 6d 65 72 67 65 57 72 69 74 65 72 20 2a 70 57 72  mergeWriter *pWr
27b30 69 74 65 72 3b 20 20 20 20 20 20 20 2f 2a 20 57  iter;       /* W
27b40 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  riter object */.
27b50 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b 20    int nSeg = 0; 
27b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b70 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
27b80 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f  nput segments */
27b90 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
27ba0 20 69 41 62 73 4c 65 76 65 6c 20 3d 20 30 3b 20   iAbsLevel = 0; 
27bb0 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c     /* Absolute l
27bc0 65 76 65 6c 20 6e 75 6d 62 65 72 20 74 6f 20 77  evel number to w
27bd0 6f 72 6b 20 6f 6e 20 2a 2f 0a 20 20 42 6c 6f 62  ork on */.  Blob
27be0 20 68 69 6e 74 20 3d 20 7b 30 2c 20 30 2c 20 30   hint = {0, 0, 0
27bf0 7d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48  };          /* H
27c00 69 6e 74 20 72 65 61 64 20 66 72 6f 6d 20 25 5f  int read from %_
27c10 73 74 61 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  stat table */.  
27c20 69 6e 74 20 62 44 69 72 74 79 48 69 6e 74 20 3d  int bDirtyHint =
27c30 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
27c40 2f 2a 20 54 72 75 65 20 69 66 20 62 6c 6f 62 20  /* True if blob 
27c50 27 68 69 6e 74 27 20 68 61 73 20 62 65 65 6e 20  'hint' has been 
27c60 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 0a 20 20 2f  modified */..  /
27c70 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
27c80 20 66 6f 72 20 74 68 65 20 63 75 72 73 6f 72 2c   for the cursor,
27c90 20 66 69 6c 74 65 72 20 61 6e 64 20 77 72 69 74   filter and writ
27ca0 65 72 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  er objects */.  
27cb0 63 6f 6e 73 74 20 69 6e 74 20 6e 41 6c 6c 6f 63  const int nAlloc
27cc0 20 3d 20 73 69 7a 65 6f 66 28 2a 70 43 73 72 29   = sizeof(*pCsr)
27cd0 20 2b 20 73 69 7a 65 6f 66 28 2a 70 46 69 6c 74   + sizeof(*pFilt
27ce0 65 72 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 57  er) + sizeof(*pW
27cf0 72 69 74 65 72 29 3b 0a 20 20 70 57 72 69 74 65  riter);.  pWrite
27d00 72 20 3d 20 28 49 6e 63 72 6d 65 72 67 65 57 72  r = (IncrmergeWr
27d10 69 74 65 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  iter *)sqlite3_m
27d20 61 6c 6c 6f 63 28 6e 41 6c 6c 6f 63 29 3b 0a 20  alloc(nAlloc);. 
27d30 20 69 66 28 20 21 70 57 72 69 74 65 72 20 29 20   if( !pWriter ) 
27d40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
27d50 4d 45 4d 3b 0a 20 20 70 46 69 6c 74 65 72 20 3d  MEM;.  pFilter =
27d60 20 28 46 74 73 33 53 65 67 46 69 6c 74 65 72 20   (Fts3SegFilter 
27d70 2a 29 26 70 57 72 69 74 65 72 5b 31 5d 3b 0a 20  *)&pWriter[1];. 
27d80 20 70 43 73 72 20 3d 20 28 46 74 73 33 4d 75 6c   pCsr = (Fts3Mul
27d90 74 69 53 65 67 52 65 61 64 65 72 20 2a 29 26 70  tiSegReader *)&p
27da0 46 69 6c 74 65 72 5b 31 5d 3b 0a 0a 20 20 72 63  Filter[1];..  rc
27db0 20 3d 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65   = fts3Incrmerge
27dc0 48 69 6e 74 4c 6f 61 64 28 70 2c 20 26 68 69 6e  HintLoad(p, &hin
27dd0 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d  t);.  while( rc=
27de0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 52  =SQLITE_OK && nR
27df0 65 6d 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  em>0 ){.    cons
27e00 74 20 69 36 34 20 6e 4d 6f 64 20 3d 20 46 54 53  t i64 nMod = FTS
27e10 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45  3_SEGDIR_MAXLEVE
27e20 4c 20 2a 20 70 2d 3e 6e 49 6e 64 65 78 3b 0a 20  L * p->nIndex;. 
27e30 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
27e40 2a 70 46 69 6e 64 4c 65 76 65 6c 20 3d 20 30 3b  *pFindLevel = 0;
27e50 20 2f 2a 20 53 51 4c 20 75 73 65 64 20 74 6f 20   /* SQL used to 
27e60 64 65 74 65 72 6d 69 6e 65 20 69 41 62 73 4c 65  determine iAbsLe
27e70 76 65 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  vel */.    int b
27e80 55 73 65 48 69 6e 74 20 3d 20 30 3b 20 20 20 20  UseHint = 0;    
27e90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
27ea0 20 69 66 20 61 74 74 65 6d 70 74 69 6e 67 20 74   if attempting t
27eb0 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 20 20  o append */.    
27ec0 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 20 20 20  int iIdx = 0;   
27ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27ee0 20 4c 61 72 67 65 73 74 20 69 64 78 20 69 6e 20   Largest idx in 
27ef0 6c 65 76 65 6c 20 28 69 41 62 73 4c 65 76 65 6c  level (iAbsLevel
27f00 2b 31 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  +1) */..    /* S
27f10 65 61 72 63 68 20 74 68 65 20 25 5f 73 65 67 64  earch the %_segd
27f20 69 72 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65  ir table for the
27f30 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20   absolute level 
27f40 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73  with the smalles
27f50 74 0a 20 20 20 20 2a 2a 20 72 65 6c 61 74 69 76  t.    ** relativ
27f60 65 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20 74  e level number t
27f70 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20  hat contains at 
27f80 6c 65 61 73 74 20 6e 4d 69 6e 20 73 65 67 6d 65  least nMin segme
27f90 6e 74 73 2c 20 69 66 20 61 6e 79 2e 0a 20 20 20  nts, if any..   
27fa0 20 2a 2a 20 49 66 20 6f 6e 65 20 69 73 20 66 6f   ** If one is fo
27fb0 75 6e 64 2c 20 73 65 74 20 69 41 62 73 4c 65 76  und, set iAbsLev
27fc0 65 6c 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75  el to the absolu
27fd0 74 65 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20  te level number 
27fe0 61 6e 64 0a 20 20 20 20 2a 2a 20 6e 53 65 67 20  and.    ** nSeg 
27ff0 74 6f 20 6e 4d 69 6e 2e 20 49 66 20 6e 6f 20 6c  to nMin. If no l
28000 65 76 65 6c 20 77 69 74 68 20 61 74 20 6c 65 61  evel with at lea
28010 73 74 20 6e 4d 69 6e 20 73 65 67 6d 65 6e 74 73  st nMin segments
28020 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 0a   can be found, .
28030 20 20 20 20 2a 2a 20 73 65 74 20 6e 53 65 67 20      ** set nSeg 
28040 74 6f 20 2d 31 2e 0a 20 20 20 20 2a 2f 0a 20 20  to -1..    */.  
28050 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
28060 6d 74 28 70 2c 20 53 51 4c 5f 46 49 4e 44 5f 4d  mt(p, SQL_FIND_M
28070 45 52 47 45 5f 4c 45 56 45 4c 2c 20 26 70 46 69  ERGE_LEVEL, &pFi
28080 6e 64 4c 65 76 65 6c 2c 20 30 29 3b 0a 20 20 20  ndLevel, 0);.   
28090 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
280a0 74 28 70 46 69 6e 64 4c 65 76 65 6c 2c 20 31 2c  t(pFindLevel, 1,
280b0 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 69 66 28 20   nMin);.    if( 
280c0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 46 69  sqlite3_step(pFi
280d0 6e 64 4c 65 76 65 6c 29 3d 3d 53 51 4c 49 54 45  ndLevel)==SQLITE
280e0 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 69 41  _ROW ){.      iA
280f0 62 73 4c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  bsLevel = sqlite
28100 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
28110 46 69 6e 64 4c 65 76 65 6c 2c 20 30 29 3b 0a 20  FindLevel, 0);. 
28120 20 20 20 20 20 6e 53 65 67 20 3d 20 6e 4d 69 6e       nSeg = nMin
28130 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
28140 20 20 20 6e 53 65 67 20 3d 20 2d 31 3b 0a 20 20     nSeg = -1;.  
28150 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
28160 69 74 65 33 5f 72 65 73 65 74 28 70 46 69 6e 64  ite3_reset(pFind
28170 4c 65 76 65 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20  Level);..    /* 
28180 49 66 20 74 68 65 20 68 69 6e 74 20 72 65 61 64  If the hint read
28190 20 66 72 6f 6d 20 74 68 65 20 25 5f 73 74 61 74   from the %_stat
281a0 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 65 6d   table is not em
281b0 70 74 79 2c 20 63 68 65 63 6b 20 69 66 20 74 68  pty, check if th
281c0 65 0a 20 20 20 20 2a 2a 20 6c 61 73 74 20 65 6e  e.    ** last en
281d0 74 72 79 20 69 6e 20 69 74 20 73 70 65 63 69 66  try in it specif
281e0 69 65 73 20 61 20 72 65 6c 61 74 69 76 65 20 6c  ies a relative l
281f0 65 76 65 6c 20 73 6d 61 6c 6c 65 72 20 74 68 61  evel smaller tha
28200 6e 20 6f 72 20 65 71 75 61 6c 0a 20 20 20 20 2a  n or equal.    *
28210 2a 20 74 6f 20 74 68 65 20 6c 65 76 65 6c 20 69  * to the level i
28220 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
28230 20 62 6c 6f 63 6b 20 61 62 6f 76 65 20 28 69 66   block above (if
28240 20 61 6e 79 29 2e 20 49 66 20 73 6f 2c 20 74 68   any). If so, th
28250 69 73 20 0a 20 20 20 20 2a 2a 20 69 74 65 72 61  is .    ** itera
28260 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tion of the loop
28270 20 77 69 6c 6c 20 77 6f 72 6b 20 6f 6e 20 6d 65   will work on me
28280 72 67 69 6e 67 20 61 74 20 74 68 65 20 68 69 6e  rging at the hin
28290 74 65 64 20 6c 65 76 65 6c 2e 0a 20 20 20 20 2a  ted level..    *
282a0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
282b0 4c 49 54 45 5f 4f 4b 20 26 26 20 68 69 6e 74 2e  LITE_OK && hint.
282c0 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  n ){.      int n
282d0 48 69 6e 74 20 3d 20 68 69 6e 74 2e 6e 3b 0a 20  Hint = hint.n;. 
282e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
282f0 36 34 20 69 48 69 6e 74 41 62 73 4c 65 76 65 6c  64 iHintAbsLevel
28300 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 48 69   = 0;      /* Hi
28310 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  nt level */.    
28320 20 20 69 6e 74 20 6e 48 69 6e 74 53 65 67 20 3d    int nHintSeg =
28330 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
28340 20 20 20 20 20 20 20 20 2f 2a 20 48 69 6e 74 20          /* Hint 
28350 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e  number of segmen
28360 74 73 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20  ts */..      rc 
28370 3d 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 48  = fts3IncrmergeH
28380 69 6e 74 50 6f 70 28 26 68 69 6e 74 2c 20 26 69  intPop(&hint, &i
28390 48 69 6e 74 41 62 73 4c 65 76 65 6c 2c 20 26 6e  HintAbsLevel, &n
283a0 48 69 6e 74 53 65 67 29 3b 0a 20 20 20 20 20 20  HintSeg);.      
283b0 69 66 28 20 6e 53 65 67 3c 30 20 7c 7c 20 28 69  if( nSeg<0 || (i
283c0 41 62 73 4c 65 76 65 6c 20 25 20 6e 4d 6f 64 29  AbsLevel % nMod)
283d0 20 3e 3d 20 28 69 48 69 6e 74 41 62 73 4c 65 76   >= (iHintAbsLev
283e0 65 6c 20 25 20 6e 4d 6f 64 29 20 29 7b 0a 20 20  el % nMod) ){.  
283f0 20 20 20 20 20 20 69 41 62 73 4c 65 76 65 6c 20        iAbsLevel 
28400 3d 20 69 48 69 6e 74 41 62 73 4c 65 76 65 6c 3b  = iHintAbsLevel;
28410 0a 20 20 20 20 20 20 20 20 6e 53 65 67 20 3d 20  .        nSeg = 
28420 6e 48 69 6e 74 53 65 67 3b 0a 20 20 20 20 20 20  nHintSeg;.      
28430 20 20 62 55 73 65 48 69 6e 74 20 3d 20 31 3b 0a    bUseHint = 1;.
28440 20 20 20 20 20 20 20 20 62 44 69 72 74 79 48 69          bDirtyHi
28450 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  nt = 1;.      }e
28460 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
28470 54 68 69 73 20 75 6e 64 6f 65 73 20 74 68 65 20  This undoes the 
28480 65 66 66 65 63 74 20 6f 66 20 74 68 65 20 48 69  effect of the Hi
28490 6e 74 50 6f 70 28 29 20 61 62 6f 76 65 20 2d 20  ntPop() above - 
284a0 73 6f 20 74 68 61 74 20 6e 6f 20 65 6e 74 72 79  so that no entry
284b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72  .        ** is r
284c0 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
284d0 68 69 6e 74 20 62 6c 6f 62 2e 20 20 2a 2f 0a 20  hint blob.  */. 
284e0 20 20 20 20 20 20 20 68 69 6e 74 2e 6e 20 3d 20         hint.n = 
284f0 6e 48 69 6e 74 3b 0a 20 20 20 20 20 20 7d 0a 20  nHint;.      }. 
28500 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
28510 6e 53 65 67 20 69 73 20 6c 65 73 73 20 74 68 61  nSeg is less tha
28520 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  t zero, then the
28530 72 65 20 69 73 20 6e 6f 20 6c 65 76 65 6c 20 77  re is no level w
28540 69 74 68 20 61 74 20 6c 65 61 73 74 0a 20 20 20  ith at least.   
28550 20 2a 2a 20 6e 4d 69 6e 20 73 65 67 6d 65 6e 74   ** nMin segment
28560 73 20 61 6e 64 20 6e 6f 20 68 69 6e 74 20 69 6e  s and no hint in
28570 20 74 68 65 20 25 5f 73 74 61 74 20 74 61 62 6c   the %_stat tabl
28580 65 2e 20 4e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f  e. No work to do
28590 2e 0a 20 20 20 20 2a 2a 20 45 78 69 74 20 65 61  ..    ** Exit ea
285a0 72 6c 79 20 69 6e 20 74 68 69 73 20 63 61 73 65  rly in this case
285b0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53  .  */.    if( nS
285c0 65 67 3c 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20  eg<0 ) break;.. 
285d0 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 63 75 72     /* Open a cur
285e0 73 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74  sor to iterate t
285f0 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 74 65  hrough the conte
28600 6e 74 73 20 6f 66 20 74 68 65 20 6f 6c 64 65 73  nts of the oldes
28610 74 20 6e 53 65 67 20 0a 20 20 20 20 2a 2a 20 69  t nSeg .    ** i
28620 6e 64 65 78 65 73 20 6f 66 20 61 62 73 6f 6c 75  ndexes of absolu
28630 74 65 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76  te level iAbsLev
28640 65 6c 2e 20 49 66 20 74 68 69 73 20 63 75 72 73  el. If this curs
28650 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  or is opened usi
28660 6e 67 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 27  ng .    ** the '
28670 68 69 6e 74 27 20 70 61 72 61 6d 65 74 65 72 73  hint' parameters
28680 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
28690 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
286a0 6c 65 73 73 20 74 68 61 6e 20 6e 53 65 67 0a 20  less than nSeg. 
286b0 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 73 20 61     ** segments a
286c0 76 61 69 6c 61 62 6c 65 20 69 6e 20 6c 65 76 65  vailable in leve
286d0 6c 20 69 41 62 73 4c 65 76 65 6c 2e 20 49 6e 20  l iAbsLevel. In 
286e0 74 68 69 73 20 63 61 73 65 2c 20 6e 6f 20 77 6f  this case, no wo
286f0 72 6b 20 69 73 0a 20 20 20 20 2a 2a 20 64 6f 6e  rk is.    ** don
28700 65 20 6f 6e 20 69 41 62 73 4c 65 76 65 6c 20 2d  e on iAbsLevel -
28710 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
28720 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74   the next iterat
28730 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ion of the loop 
28740 0a 20 20 20 20 2a 2a 20 74 6f 20 73 74 61 72 74  .    ** to start
28750 20 77 6f 72 6b 20 6f 6e 20 73 6f 6d 65 20 6f 74   work on some ot
28760 68 65 72 20 6c 65 76 65 6c 2e 20 20 2a 2f 0a 20  her level.  */. 
28770 20 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65     memset(pWrite
28780 72 2c 20 30 2c 20 6e 41 6c 6c 6f 63 29 3b 0a 20  r, 0, nAlloc);. 
28790 20 20 20 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67     pFilter->flag
287a0 73 20 3d 20 46 54 53 33 5f 53 45 47 4d 45 4e 54  s = FTS3_SEGMENT
287b0 5f 52 45 51 55 49 52 45 5f 50 4f 53 3b 0a 0a 20  _REQUIRE_POS;.. 
287c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
287d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
287e0 20 3d 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65   = fts3Incrmerge
287f0 4f 75 74 70 75 74 49 64 78 28 70 2c 20 69 41 62  OutputIdx(p, iAb
28800 73 4c 65 76 65 6c 2c 20 26 69 49 64 78 29 3b 0a  sLevel, &iIdx);.
28810 20 20 20 20 20 20 61 73 73 65 72 74 28 20 62 55        assert( bU
28820 73 65 48 69 6e 74 3d 3d 31 20 7c 7c 20 62 55 73  seHint==1 || bUs
28830 65 48 69 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20  eHint==0 );.    
28840 20 20 69 66 28 20 69 49 64 78 3d 3d 30 20 7c 7c    if( iIdx==0 ||
28850 20 28 62 55 73 65 48 69 6e 74 20 26 26 20 69 49   (bUseHint && iI
28860 64 78 3d 3d 31 29 20 29 7b 0a 20 20 20 20 20 20  dx==1) ){.      
28870 20 20 69 6e 74 20 62 49 67 6e 6f 72 65 3b 0a 20    int bIgnore;. 
28880 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33         rc = fts3
28890 53 65 67 6d 65 6e 74 49 73 4d 61 78 4c 65 76 65  SegmentIsMaxLeve
288a0 6c 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 2b 31  l(p, iAbsLevel+1
288b0 2c 20 26 62 49 67 6e 6f 72 65 29 3b 0a 20 20 20  , &bIgnore);.   
288c0 20 20 20 20 20 69 66 28 20 62 49 67 6e 6f 72 65       if( bIgnore
288d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
288e0 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  ilter->flags |= 
288f0 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 49 47 4e  FTS3_SEGMENT_IGN
28900 4f 52 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20 20  ORE_EMPTY;.     
28910 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
28920 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
28930 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28940 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72     rc = fts3Incr
28950 6d 65 72 67 65 43 73 72 28 70 2c 20 69 41 62 73  mergeCsr(p, iAbs
28960 4c 65 76 65 6c 2c 20 6e 53 65 67 2c 20 70 43 73  Level, nSeg, pCs
28970 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
28980 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20  ( SQLITE_OK==rc 
28990 26 26 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e  && pCsr->nSegmen
289a0 74 3d 3d 6e 53 65 67 0a 20 20 20 20 20 26 26 20  t==nSeg.     && 
289b0 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
289c0 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
289d0 65 61 64 65 72 53 74 61 72 74 28 70 2c 20 70 43  eaderStart(p, pC
289e0 73 72 2c 20 70 46 69 6c 74 65 72 29 29 0a 20 20  sr, pFilter)).  
289f0 20 20 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57     && SQLITE_ROW
28a00 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 46  ==(rc = sqlite3F
28a10 74 73 33 53 65 67 52 65 61 64 65 72 53 74 65 70  ts3SegReaderStep
28a20 28 70 2c 20 70 43 73 72 29 29 0a 20 20 20 20 29  (p, pCsr)).    )
28a30 7b 0a 20 20 20 20 20 20 69 66 28 20 62 55 73 65  {.      if( bUse
28a40 48 69 6e 74 20 26 26 20 69 49 64 78 3e 30 20 29  Hint && iIdx>0 )
28a50 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
28a60 63 68 61 72 20 2a 7a 4b 65 79 20 3d 20 70 43 73  char *zKey = pCs
28a70 72 2d 3e 7a 54 65 72 6d 3b 0a 20 20 20 20 20 20  r->zTerm;.      
28a80 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 43 73    int nKey = pCs
28a90 72 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20  r->nTerm;.      
28aa0 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72 6d    rc = fts3Incrm
28ab0 65 72 67 65 4c 6f 61 64 28 70 2c 20 69 41 62 73  ergeLoad(p, iAbs
28ac0 4c 65 76 65 6c 2c 20 69 49 64 78 2d 31 2c 20 7a  Level, iIdx-1, z
28ad0 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 57 72 69 74  Key, nKey, pWrit
28ae0 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  er);.      }else
28af0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
28b00 74 73 33 49 6e 63 72 6d 65 72 67 65 57 72 69 74  ts3IncrmergeWrit
28b10 65 72 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 2c  er(p, iAbsLevel,
28b20 20 69 49 64 78 2c 20 70 43 73 72 2c 20 70 57 72   iIdx, pCsr, pWr
28b30 69 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  iter);.      }..
28b40 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
28b50 4c 49 54 45 5f 4f 4b 20 26 26 20 70 57 72 69 74  LITE_OK && pWrit
28b60 65 72 2d 3e 6e 4c 65 61 66 45 73 74 20 29 7b 0a  er->nLeafEst ){.
28b70 20 20 20 20 20 20 20 20 66 74 73 33 4c 6f 67 4d          fts3LogM
28b80 65 72 67 65 28 6e 53 65 67 2c 20 69 41 62 73 4c  erge(nSeg, iAbsL
28b90 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 64  evel);.        d
28ba0 6f 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  o {.          rc
28bb0 20 3d 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65   = fts3Incrmerge
28bc0 41 70 70 65 6e 64 28 70 2c 20 70 57 72 69 74 65  Append(p, pWrite
28bd0 72 2c 20 70 43 73 72 29 3b 0a 20 20 20 20 20 20  r, pCsr);.      
28be0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28bf0 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71 6c  TE_OK ) rc = sql
28c00 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
28c10 72 53 74 65 70 28 70 2c 20 70 43 73 72 29 3b 0a  rStep(p, pCsr);.
28c20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 57            if( pW
28c30 72 69 74 65 72 2d 3e 6e 57 6f 72 6b 3e 3d 6e 52  riter->nWork>=nR
28c40 65 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  em && rc==SQLITE
28c50 5f 52 4f 57 20 29 20 72 63 20 3d 20 53 51 4c 49  _ROW ) rc = SQLI
28c60 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  TE_OK;.        }
28c70 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
28c80 45 5f 52 4f 57 20 29 3b 0a 0a 20 20 20 20 20 20  E_ROW );..      
28c90 20 20 2f 2a 20 55 70 64 61 74 65 20 6f 72 20 64    /* Update or d
28ca0 65 6c 65 74 65 20 74 68 65 20 69 6e 70 75 74 20  elete the input 
28cb0 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  segments */.    
28cc0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28cd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28ce0 20 20 20 6e 52 65 6d 20 2d 3d 20 28 31 20 2b 20     nRem -= (1 + 
28cf0 70 57 72 69 74 65 72 2d 3e 6e 57 6f 72 6b 29 3b  pWriter->nWork);
28d00 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
28d10 66 74 73 33 49 6e 63 72 6d 65 72 67 65 43 68 6f  fts3IncrmergeCho
28d20 6d 70 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 2c  mp(p, iAbsLevel,
28d30 20 70 43 73 72 2c 20 26 6e 53 65 67 29 3b 0a 20   pCsr, &nSeg);. 
28d40 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 53 65           if( nSe
28d50 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g!=0 ){.        
28d60 20 20 20 20 62 44 69 72 74 79 48 69 6e 74 20 3d      bDirtyHint =
28d70 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
28d80 66 74 73 33 49 6e 63 72 6d 65 72 67 65 48 69 6e  fts3IncrmergeHin
28d90 74 50 75 73 68 28 26 68 69 6e 74 2c 20 69 41 62  tPush(&hint, iAb
28da0 73 4c 65 76 65 6c 2c 20 6e 53 65 67 2c 20 26 72  sLevel, nSeg, &r
28db0 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  c);.          }.
28dc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28dd0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 53 65  }..      if( nSe
28de0 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g!=0 ){.        
28df0 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61  pWriter->nLeafDa
28e00 74 61 20 3d 20 70 57 72 69 74 65 72 2d 3e 6e 4c  ta = pWriter->nL
28e10 65 61 66 44 61 74 61 20 2a 20 2d 31 3b 0a 20 20  eafData * -1;.  
28e20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 33      }.      fts3
28e30 49 6e 63 72 6d 65 72 67 65 52 65 6c 65 61 73 65  IncrmergeRelease
28e40 28 70 2c 20 70 57 72 69 74 65 72 2c 20 26 72 63  (p, pWriter, &rc
28e50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 53 65  );.      if( nSe
28e60 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
28e70 66 74 73 33 50 72 6f 6d 6f 74 65 53 65 67 6d 65  fts3PromoteSegme
28e80 6e 74 73 28 70 2c 20 69 41 62 73 4c 65 76 65 6c  nts(p, iAbsLevel
28e90 2b 31 2c 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65  +1, pWriter->nLe
28ea0 61 66 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d  afData);.      }
28eb0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
28ec0 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72  te3Fts3SegReader
28ed0 46 69 6e 69 73 68 28 70 43 73 72 29 3b 0a 20 20  Finish(pCsr);.  
28ee0 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  }..  /* Write th
28ef0 65 20 68 69 6e 74 20 76 61 6c 75 65 73 20 69 6e  e hint values in
28f00 74 6f 20 74 68 65 20 25 5f 73 74 61 74 20 74 61  to the %_stat ta
28f10 62 6c 65 20 66 6f 72 20 74 68 65 20 6e 65 78 74  ble for the next
28f20 20 69 6e 63 72 2d 6d 65 72 67 65 72 20 2a 2f 0a   incr-merger */.
28f30 20 20 69 66 28 20 62 44 69 72 74 79 48 69 6e 74    if( bDirtyHint
28f40 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
28f50 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  K ){.    rc = ft
28f60 73 33 49 6e 63 72 6d 65 72 67 65 48 69 6e 74 53  s3IncrmergeHintS
28f70 74 6f 72 65 28 70 2c 20 26 68 69 6e 74 29 3b 0a  tore(p, &hint);.
28f80 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66    }..  sqlite3_f
28f90 72 65 65 28 70 57 72 69 74 65 72 29 3b 0a 20 20  ree(pWriter);.  
28fa0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 68 69 6e  sqlite3_free(hin
28fb0 74 2e 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  t.a);.  return r
28fc0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  c;.}../*.** Conv
28fd0 65 72 74 20 74 68 65 20 74 65 78 74 20 62 65 67  ert the text beg
28fe0 69 6e 6e 69 6e 67 20 61 74 20 2a 70 7a 20 69 6e  inning at *pz in
28ff0 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e  to an integer an
29000 64 20 72 65 74 75 72 6e 0a 2a 2a 20 69 74 73 20  d return.** its 
29010 76 61 6c 75 65 2e 20 20 41 64 76 61 6e 63 65 20  value.  Advance 
29020 2a 70 7a 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  *pz to point to 
29030 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63  the first charac
29040 74 65 72 20 70 61 73 74 0a 2a 2a 20 74 68 65 20  ter past.** the 
29050 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74  integer..*/.stat
29060 69 63 20 69 6e 74 20 66 74 73 33 47 65 74 69 6e  ic int fts3Getin
29070 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70  t(const char **p
29080 7a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  z){.  const char
29090 20 2a 7a 20 3d 20 2a 70 7a 3b 0a 20 20 69 6e 74   *z = *pz;.  int
290a0 20 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28   i = 0;.  while(
290b0 20 28 2a 7a 29 3e 3d 27 30 27 20 26 26 20 28 2a   (*z)>='0' && (*
290c0 7a 29 3c 3d 27 39 27 20 29 20 69 20 3d 20 31 30  z)<='9' ) i = 10
290d0 2a 69 20 2b 20 2a 28 7a 2b 2b 29 20 2d 20 27 30  *i + *(z++) - '0
290e0 27 3b 0a 20 20 2a 70 7a 20 3d 20 7a 3b 0a 20 20  ';.  *pz = z;.  
290f0 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a  return i;.}../*.
29100 2a 2a 20 50 72 6f 63 65 73 73 20 73 74 61 74 65  ** Process state
29110 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72  ments of the for
29120 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49 4e 53 45  m:.**.**    INSE
29130 52 54 20 49 4e 54 4f 20 74 61 62 6c 65 28 74 61  RT INTO table(ta
29140 62 6c 65 29 20 56 41 4c 55 45 53 28 27 6d 65 72  ble) VALUES('mer
29150 67 65 3d 41 2c 42 27 29 3b 0a 2a 2a 0a 2a 2a 20  ge=A,B');.**.** 
29160 41 20 61 6e 64 20 42 20 61 72 65 20 69 6e 74 65  A and B are inte
29170 67 65 72 73 20 74 68 61 74 20 64 65 63 6f 64 65  gers that decode
29180 20 74 6f 20 62 65 20 74 68 65 20 6e 75 6d 62 65   to be the numbe
29190 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 0a  r of leaf pages.
291a0 2a 2a 20 77 72 69 74 74 65 6e 20 66 6f 72 20 74  ** written for t
291b0 68 65 20 6d 65 72 67 65 2c 20 61 6e 64 20 74 68  he merge, and th
291c0 65 20 6d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72  e minimum number
291d0 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20   of segments on 
291e0 61 20 6c 65 76 65 6c 0a 2a 2a 20 62 65 66 6f 72  a level.** befor
291f0 65 20 69 74 20 77 69 6c 6c 20 62 65 20 73 65 6c  e it will be sel
29200 65 63 74 65 64 20 66 6f 72 20 61 20 6d 65 72 67  ected for a merg
29210 65 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  e, respectively.
29220 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
29230 74 73 33 44 6f 49 6e 63 72 6d 65 72 67 65 28 0a  ts3DoIncrmerge(.
29240 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
29250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29260 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20    /* FTS3 table 
29270 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  handle */.  cons
29280 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 20 20  t char *zParam  
29290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
292a0 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
292b0 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
292c0 22 41 2c 42 22 20 2a 2f 0a 29 7b 0a 20 20 69 6e  "A,B" */.){.  in
292d0 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e  t rc;.  int nMin
292e0 20 3d 20 28 46 54 53 33 5f 4d 45 52 47 45 5f 43   = (FTS3_MERGE_C
292f0 4f 55 4e 54 20 2f 20 32 29 3b 0a 20 20 69 6e 74  OUNT / 2);.  int
29300 20 6e 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 63   nMerge = 0;.  c
29310 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 7a  onst char *z = z
29320 50 61 72 61 6d 3b 0a 0a 20 20 2f 2a 20 52 65 61  Param;..  /* Rea
29330 64 20 74 68 65 20 66 69 72 73 74 20 69 6e 74 65  d the first inte
29340 67 65 72 20 76 61 6c 75 65 20 2a 2f 0a 20 20 6e  ger value */.  n
29350 4d 65 72 67 65 20 3d 20 66 74 73 33 47 65 74 69  Merge = fts3Geti
29360 6e 74 28 26 7a 29 3b 0a 0a 20 20 2f 2a 20 49 66  nt(&z);..  /* If
29370 20 74 68 65 20 66 69 72 73 74 20 69 6e 74 65 67   the first integ
29380 65 72 20 76 61 6c 75 65 20 69 73 20 66 6f 6c 6c  er value is foll
29390 6f 77 65 64 20 62 79 20 61 20 27 2c 27 2c 20 20  owed by a ',',  
293a0 72 65 61 64 20 74 68 65 20 73 65 63 6f 6e 64 0a  read the second.
293b0 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 76 61 6c    ** integer val
293c0 75 65 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 5b 30  ue. */.  if( z[0
293d0 5d 3d 3d 27 2c 27 20 26 26 20 7a 5b 31 5d 21 3d  ]==',' && z[1]!=
293e0 27 5c 30 27 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b  '\0' ){.    z++;
293f0 0a 20 20 20 20 6e 4d 69 6e 20 3d 20 66 74 73 33  .    nMin = fts3
29400 47 65 74 69 6e 74 28 26 7a 29 3b 0a 20 20 7d 0a  Getint(&z);.  }.
29410 0a 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 5c 30  .  if( z[0]!='\0
29420 27 20 7c 7c 20 6e 4d 69 6e 3c 32 20 29 7b 0a 20  ' || nMin<2 ){. 
29430 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
29440 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RROR;.  }else{. 
29450 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
29460 4b 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 62  K;.    if( !p->b
29470 48 61 73 53 74 61 74 20 29 7b 0a 20 20 20 20 20  HasStat ){.     
29480 20 61 73 73 65 72 74 28 20 70 2d 3e 62 46 74 73   assert( p->bFts
29490 34 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  4==0 );.      sq
294a0 6c 69 74 65 33 46 74 73 33 43 72 65 61 74 65 53  lite3Fts3CreateS
294b0 74 61 74 54 61 62 6c 65 28 26 72 63 2c 20 70 29  tatTable(&rc, p)
294c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
294d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
294e0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
294f0 74 65 33 46 74 73 33 49 6e 63 72 6d 65 72 67 65  te3Fts3Incrmerge
29500 28 70 2c 20 6e 4d 65 72 67 65 2c 20 6e 4d 69 6e  (p, nMerge, nMin
29510 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
29520 69 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73  ite3Fts3Segments
29530 43 6c 6f 73 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Close(p);.  }.  
29540 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29550 0a 2a 2a 20 50 72 6f 63 65 73 73 20 73 74 61 74  .** Process stat
29560 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 66 6f  ements of the fo
29570 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49 4e 53  rm:.**.**    INS
29580 45 52 54 20 49 4e 54 4f 20 74 61 62 6c 65 28 74  ERT INTO table(t
29590 61 62 6c 65 29 20 56 41 4c 55 45 53 28 27 61 75  able) VALUES('au
295a0 74 6f 6d 65 72 67 65 3d 58 27 29 3b 0a 2a 2a 0a  tomerge=X');.**.
295b0 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 6e  ** where X is an
295c0 20 69 6e 74 65 67 65 72 2e 20 20 58 3d 3d 30 20   integer.  X==0 
295d0 6d 65 61 6e 73 20 74 6f 20 74 75 72 6e 20 61 75  means to turn au
295e0 74 6f 6d 65 72 67 65 20 6f 66 66 2e 20 20 58 21  tomerge off.  X!
295f0 3d 30 20 6d 65 61 6e 73 0a 2a 2a 20 74 75 72 6e  =0 means.** turn
29600 20 69 74 20 6f 6e 2e 20 20 54 68 65 20 73 65 74   it on.  The set
29610 74 69 6e 67 20 69 73 20 70 65 72 73 69 73 74 65  ting is persiste
29620 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
29630 74 20 66 74 73 33 44 6f 41 75 74 6f 69 6e 63 72  t fts3DoAutoincr
29640 6d 65 72 67 65 28 0a 20 20 46 74 73 33 54 61 62  merge(.  Fts3Tab
29650 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
29660 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33           /* FTS3
29670 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   table handle */
29680 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
29690 50 61 72 61 6d 20 20 20 20 20 20 20 20 20 20 20  Param           
296a0 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e     /* Nul-termin
296b0 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74  ated string cont
296c0 61 69 6e 69 6e 67 20 62 6f 6f 6c 65 61 6e 20 2a  aining boolean *
296d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
296e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c  SQLITE_OK;.  sql
296f0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
29700 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 41 75 74 6f   = 0;.  p->nAuto
29710 69 6e 63 72 6d 65 72 67 65 20 3d 20 66 74 73 33  incrmerge = fts3
29720 47 65 74 69 6e 74 28 26 7a 50 61 72 61 6d 29 3b  Getint(&zParam);
29730 0a 20 20 69 66 28 20 70 2d 3e 6e 41 75 74 6f 69  .  if( p->nAutoi
29740 6e 63 72 6d 65 72 67 65 3d 3d 31 20 7c 7c 20 70  ncrmerge==1 || p
29750 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d 65 72 67 65  ->nAutoincrmerge
29760 3e 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e  >FTS3_MERGE_COUN
29770 54 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 75 74  T ){.    p->nAut
29780 6f 69 6e 63 72 6d 65 72 67 65 20 3d 20 38 3b 0a  oincrmerge = 8;.
29790 20 20 7d 0a 20 20 69 66 28 20 21 70 2d 3e 62 48    }.  if( !p->bH
297a0 61 73 53 74 61 74 20 29 7b 0a 20 20 20 20 61 73  asStat ){.    as
297b0 73 65 72 74 28 20 70 2d 3e 62 46 74 73 34 3d 3d  sert( p->bFts4==
297c0 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
297d0 46 74 73 33 43 72 65 61 74 65 53 74 61 74 54 61  Fts3CreateStatTa
297e0 62 6c 65 28 26 72 63 2c 20 70 29 3b 0a 20 20 20  ble(&rc, p);.   
297f0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
29800 20 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20   rc;.  }.  rc = 
29810 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
29820 51 4c 5f 52 45 50 4c 41 43 45 5f 53 54 41 54 2c  QL_REPLACE_STAT,
29830 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69   &pStmt, 0);.  i
29840 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
29850 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  c;.  sqlite3_bin
29860 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 2c 20  d_int(pStmt, 1, 
29870 46 54 53 5f 53 54 41 54 5f 41 55 54 4f 49 4e 43  FTS_STAT_AUTOINC
29880 52 4d 45 52 47 45 29 3b 0a 20 20 73 71 6c 69 74  RMERGE);.  sqlit
29890 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d  e3_bind_int(pStm
298a0 74 2c 20 32 2c 20 70 2d 3e 6e 41 75 74 6f 69 6e  t, 2, p->nAutoin
298b0 63 72 6d 65 72 67 65 29 3b 0a 20 20 73 71 6c 69  crmerge);.  sqli
298c0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
298d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
298e0 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
298f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29900 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 36 34 2d  .** Return a 64-
29910 62 69 74 20 63 68 65 63 6b 73 75 6d 20 66 6f 72  bit checksum for
29920 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 65   the FTS index e
29930 6e 74 72 79 20 73 70 65 63 69 66 69 65 64 20 62  ntry specified b
29940 79 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  y the.** argumen
29950 74 73 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ts to this funct
29960 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ion..*/.static u
29970 36 34 20 66 74 73 33 43 68 65 63 6b 73 75 6d 45  64 fts3ChecksumE
29980 6e 74 72 79 28 0a 20 20 63 6f 6e 73 74 20 63 68  ntry(.  const ch
29990 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20  ar *zTerm,      
299a0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
299b0 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e  er to buffer con
299c0 74 61 69 6e 69 6e 67 20 74 65 72 6d 20 2a 2f 0a  taining term */.
299d0 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20    int nTerm,    
299e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299f0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65    /* Size of zTe
29a00 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  rm in bytes */. 
29a10 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20 20   int iLangid,   
29a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a30 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64 20   /* Language id 
29a40 66 6f 72 20 63 75 72 72 65 6e 74 20 72 6f 77 20  for current row 
29a50 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 2c  */.  int iIndex,
29a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a70 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 28 30       /* Index (0
29a80 2e 2e 46 74 73 33 54 61 62 6c 65 2e 6e 49 6e 64  ..Fts3Table.nInd
29a90 65 78 2d 31 29 20 2a 2f 0a 20 20 69 36 34 20 69  ex-1) */.  i64 i
29aa0 44 6f 63 69 64 2c 20 20 20 20 20 20 20 20 20 20  Docid,          
29ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
29ac0 63 69 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20  cid for current 
29ad0 72 6f 77 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 43  row. */.  int iC
29ae0 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
29af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
29b00 75 6d 6e 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  umn number */.  
29b10 69 6e 74 20 69 50 6f 73 20 20 20 20 20 20 20 20  int iPos        
29b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b30 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 2a 2f 0a 29  /* Position */.)
29b40 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 36 34  {.  int i;.  u64
29b50 20 72 65 74 20 3d 20 28 75 36 34 29 69 44 6f 63   ret = (u64)iDoc
29b60 69 64 3b 0a 0a 20 20 72 65 74 20 2b 3d 20 28 72  id;..  ret += (r
29b70 65 74 3c 3c 33 29 20 2b 20 69 4c 61 6e 67 69 64  et<<3) + iLangid
29b80 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c  ;.  ret += (ret<
29b90 3c 33 29 20 2b 20 69 49 6e 64 65 78 3b 0a 20 20  <3) + iIndex;.  
29ba0 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20  ret += (ret<<3) 
29bb0 2b 20 69 43 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d  + iCol;.  ret +=
29bc0 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 50 6f 73   (ret<<3) + iPos
29bd0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
29be0 54 65 72 6d 3b 20 69 2b 2b 29 20 72 65 74 20 2b  Term; i++) ret +
29bf0 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 7a 54 65  = (ret<<3) + zTe
29c00 72 6d 5b 69 5d 3b 0a 0a 20 20 72 65 74 75 72 6e  rm[i];..  return
29c10 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   ret;.}../*.** R
29c20 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d  eturn a checksum
29c30 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   of all entries 
29c40 69 6e 20 74 68 65 20 46 54 53 20 69 6e 64 65 78  in the FTS index
29c50 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
29c60 20 74 6f 0a 2a 2a 20 6c 61 6e 67 75 61 67 65 20   to.** language 
29c70 69 64 20 69 4c 61 6e 67 69 64 2e 20 54 68 65 20  id iLangid. The 
29c80 63 68 65 63 6b 73 75 6d 20 69 73 20 63 61 6c 63  checksum is calc
29c90 75 6c 61 74 65 64 20 62 79 20 58 4f 52 69 6e 67  ulated by XORing
29ca0 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 0a 2a   the checksums.*
29cb0 2a 20 6f 66 20 65 61 63 68 20 69 6e 64 69 76 69  * of each indivi
29cc0 64 75 61 6c 20 65 6e 74 72 79 20 28 73 65 65 20  dual entry (see 
29cd0 66 74 73 33 43 68 65 63 6b 73 75 6d 45 6e 74 72  fts3ChecksumEntr
29ce0 79 28 29 29 20 74 6f 67 65 74 68 65 72 2e 0a 2a  y()) together..*
29cf0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
29d00 75 6c 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ul, the checksum
29d10 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
29d20 65 64 20 61 6e 64 20 2a 70 52 63 20 73 65 74 20  ed and *pRc set 
29d30 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  to SQLITE_OK..**
29d40 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
29d50 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
29d60 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20 61  *pRc is set to a
29d70 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
29d80 6f 64 65 2e 20 54 68 65 0a 2a 2a 20 72 65 74 75  ode. The.** retu
29d90 72 6e 20 76 61 6c 75 65 20 69 73 20 75 6e 64 65  rn value is unde
29da0 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  fined in this ca
29db0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 36  se..*/.static u6
29dc0 34 20 66 74 73 33 43 68 65 63 6b 73 75 6d 49 6e  4 fts3ChecksumIn
29dd0 64 65 78 28 0a 20 20 46 74 73 33 54 61 62 6c 65  dex(.  Fts3Table
29de0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
29df0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74         /* FTS3 t
29e00 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
29e10 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20 20   int iLangid,   
29e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e30 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64 20   /* Language id 
29e40 74 6f 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 20  to return cksum 
29e50 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e  for */.  int iIn
29e60 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  dex,            
29e70 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
29e80 78 20 74 6f 20 63 6b 73 75 6d 20 28 30 2e 2e 70  x to cksum (0..p
29e90 2d 3e 6e 49 6e 64 65 78 2d 31 29 20 2a 2f 0a 20  ->nIndex-1) */. 
29ea0 20 69 6e 74 20 2a 70 52 63 20 20 20 20 20 20 20   int *pRc       
29eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ec0 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20   /* OUT: Return 
29ed0 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  code */.){.  Fts
29ee0 33 53 65 67 46 69 6c 74 65 72 20 66 69 6c 74 65  3SegFilter filte
29ef0 72 3b 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65  r;.  Fts3MultiSe
29f00 67 52 65 61 64 65 72 20 63 73 72 3b 0a 20 20 69  gReader csr;.  i
29f10 6e 74 20 72 63 3b 0a 20 20 75 36 34 20 63 6b 73  nt rc;.  u64 cks
29f20 75 6d 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  um = 0;..  asser
29f30 74 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  t( *pRc==SQLITE_
29f40 4f 4b 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  OK );..  memset(
29f50 26 66 69 6c 74 65 72 2c 20 30 2c 20 73 69 7a 65  &filter, 0, size
29f60 6f 66 28 66 69 6c 74 65 72 29 29 3b 0a 20 20 6d  of(filter));.  m
29f70 65 6d 73 65 74 28 26 63 73 72 2c 20 30 2c 20 73  emset(&csr, 0, s
29f80 69 7a 65 6f 66 28 63 73 72 29 29 3b 0a 20 20 66  izeof(csr));.  f
29f90 69 6c 74 65 72 2e 66 6c 61 67 73 20 3d 20 20 46  ilter.flags =  F
29fa0 54 53 33 5f 53 45 47 4d 45 4e 54 5f 52 45 51 55  TS3_SEGMENT_REQU
29fb0 49 52 45 5f 50 4f 53 7c 46 54 53 33 5f 53 45 47  IRE_POS|FTS3_SEG
29fc0 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d 50 54  MENT_IGNORE_EMPT
29fd0 59 3b 0a 20 20 66 69 6c 74 65 72 2e 66 6c 61 67  Y;.  filter.flag
29fe0 73 20 7c 3d 20 46 54 53 33 5f 53 45 47 4d 45 4e  s |= FTS3_SEGMEN
29ff0 54 5f 53 43 41 4e 3b 0a 0a 20 20 72 63 20 3d 20  T_SCAN;..  rc = 
2a000 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
2a010 61 64 65 72 43 75 72 73 6f 72 28 0a 20 20 20 20  aderCursor(.    
2a020 20 20 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49    p, iLangid, iI
2a030 6e 64 65 78 2c 20 46 54 53 33 5f 53 45 47 43 55  ndex, FTS3_SEGCU
2a040 52 53 4f 52 5f 41 4c 4c 2c 20 30 2c 20 30 2c 20  RSOR_ALL, 0, 0, 
2a050 30 2c 20 31 2c 26 63 73 72 0a 20 20 29 3b 0a 20  0, 1,&csr.  );. 
2a060 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a070 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
2a080 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61  qlite3Fts3SegRea
2a090 64 65 72 53 74 61 72 74 28 70 2c 20 26 63 73 72  derStart(p, &csr
2a0a0 2c 20 26 66 69 6c 74 65 72 29 3b 0a 20 20 7d 0a  , &filter);.  }.
2a0b0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2a0c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 77 68 69 6c  E_OK ){.    whil
2a0d0 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 28  e( SQLITE_ROW==(
2a0e0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
2a0f0 53 65 67 52 65 61 64 65 72 53 74 65 70 28 70 2c  SegReaderStep(p,
2a100 20 26 63 73 72 29 29 20 29 7b 0a 20 20 20 20 20   &csr)) ){.     
2a110 20 63 68 61 72 20 2a 70 43 73 72 20 3d 20 63 73   char *pCsr = cs
2a120 72 2e 61 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20  r.aDoclist;.    
2a130 20 20 63 68 61 72 20 2a 70 45 6e 64 20 3d 20 26    char *pEnd = &
2a140 70 43 73 72 5b 63 73 72 2e 6e 44 6f 63 6c 69 73  pCsr[csr.nDoclis
2a150 74 5d 3b 0a 0a 20 20 20 20 20 20 69 36 34 20 69  t];..      i64 i
2a160 44 6f 63 69 64 20 3d 20 30 3b 0a 20 20 20 20 20  Docid = 0;.     
2a170 20 69 36 34 20 69 43 6f 6c 20 3d 20 30 3b 0a 20   i64 iCol = 0;. 
2a180 20 20 20 20 20 69 36 34 20 69 50 6f 73 20 3d 20       i64 iPos = 
2a190 30 3b 0a 0a 20 20 20 20 20 20 70 43 73 72 20 2b  0;..      pCsr +
2a1a0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74  = sqlite3Fts3Get
2a1b0 56 61 72 69 6e 74 28 70 43 73 72 2c 20 26 69 44  Varint(pCsr, &iD
2a1c0 6f 63 69 64 29 3b 0a 20 20 20 20 20 20 77 68 69  ocid);.      whi
2a1d0 6c 65 28 20 70 43 73 72 3c 70 45 6e 64 20 29 7b  le( pCsr<pEnd ){
2a1e0 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 56 61  .        i64 iVa
2a1f0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  l = 0;.        p
2a200 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  Csr += sqlite3Ft
2a210 73 33 47 65 74 56 61 72 69 6e 74 28 70 43 73 72  s3GetVarint(pCsr
2a220 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 20 20  , &iVal);.      
2a230 20 20 69 66 28 20 70 43 73 72 3c 70 45 6e 64 20    if( pCsr<pEnd 
2a240 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2a250 20 69 56 61 6c 3d 3d 30 20 7c 7c 20 69 56 61 6c   iVal==0 || iVal
2a260 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==1 ){.         
2a270 20 20 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 20     iCol = 0;.   
2a280 20 20 20 20 20 20 20 20 20 69 50 6f 73 20 3d 20           iPos = 
2a290 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
2a2a0 66 28 20 69 56 61 6c 20 29 7b 0a 20 20 20 20 20  f( iVal ){.     
2a2b0 20 20 20 20 20 20 20 20 20 70 43 73 72 20 2b 3d           pCsr +=
2a2c0 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56   sqlite3Fts3GetV
2a2d0 61 72 69 6e 74 28 70 43 73 72 2c 20 26 69 43 6f  arint(pCsr, &iCo
2a2e0 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
2a2f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2a300 20 20 20 20 20 70 43 73 72 20 2b 3d 20 73 71 6c       pCsr += sql
2a310 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e  ite3Fts3GetVarin
2a320 74 28 70 43 73 72 2c 20 26 69 56 61 6c 29 3b 0a  t(pCsr, &iVal);.
2a330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 44                iD
2a340 6f 63 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20  ocid += iVal;.  
2a350 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a360 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2a370 20 20 20 20 20 20 20 20 20 69 50 6f 73 20 2b 3d           iPos +=
2a380 20 28 69 56 61 6c 20 2d 20 32 29 3b 0a 20 20 20   (iVal - 2);.   
2a390 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d           cksum =
2a3a0 20 63 6b 73 75 6d 20 5e 20 66 74 73 33 43 68 65   cksum ^ fts3Che
2a3b0 63 6b 73 75 6d 45 6e 74 72 79 28 0a 20 20 20 20  cksumEntry(.    
2a3c0 20 20 20 20 20 20 20 20 20 20 20 20 63 73 72 2e              csr.
2a3d0 7a 54 65 72 6d 2c 20 63 73 72 2e 6e 54 65 72 6d  zTerm, csr.nTerm
2a3e0 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
2a3f0 78 2c 20 69 44 6f 63 69 64 2c 0a 20 20 20 20 20  x, iDocid,.     
2a400 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
2a410 69 43 6f 6c 2c 20 28 69 6e 74 29 69 50 6f 73 0a  iCol, (int)iPos.
2a420 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
2a430 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a440 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2a450 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
2a460 46 74 73 33 53 65 67 52 65 61 64 65 72 46 69 6e  Fts3SegReaderFin
2a470 69 73 68 28 26 63 73 72 29 3b 0a 0a 20 20 2a 70  ish(&csr);..  *p
2a480 52 63 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72  Rc = rc;.  retur
2a490 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a  n cksum;.}../*.*
2a4a0 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 63  * Check if the c
2a4b0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 46  ontents of the F
2a4c0 54 53 20 69 6e 64 65 78 20 6d 61 74 63 68 20 74  TS index match t
2a4d0 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
2a4e0 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  nts of the.** co
2a4f0 6e 74 65 6e 74 20 74 61 62 6c 65 2e 20 49 66 20  ntent table. If 
2a500 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  no error occurs 
2a510 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  and the contents
2a520 20 64 6f 20 6d 61 74 63 68 2c 20 73 65 74 20 2a   do match, set *
2a530 70 62 4f 6b 0a 2a 2a 20 74 6f 20 74 72 75 65 20  pbOk.** to true 
2a540 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
2a550 45 5f 4f 4b 2e 20 4f 72 20 69 66 20 74 68 65 20  E_OK. Or if the 
2a560 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20  contents do not 
2a570 6d 61 74 63 68 2c 20 73 65 74 20 2a 70 62 4f 6b  match, set *pbOk
2a580 0a 2a 2a 20 74 6f 20 66 61 6c 73 65 20 62 65 66  .** to false bef
2a590 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
2a5a0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
2a5b0 20 6f 63 63 75 72 73 20 28 65 2e 67 2e 20 61 6e   occurs (e.g. an
2a5c0 20 4f 4f 4d 20 6f 72 20 49 4f 20 65 72 72 6f 72   OOM or IO error
2a5d0 29 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  ), return an SQL
2a5e0 69 74 65 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f  ite error .** co
2a5f0 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 20 76 61  de. The final va
2a600 6c 75 65 20 6f 66 20 2a 70 62 4f 6b 20 69 73 20  lue of *pbOk is 
2a610 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69  undefined in thi
2a620 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  s case..*/.stati
2a630 63 20 69 6e 74 20 66 74 73 33 49 6e 74 65 67 72  c int fts3Integr
2a640 69 74 79 43 68 65 63 6b 28 46 74 73 33 54 61 62  ityCheck(Fts3Tab
2a650 6c 65 20 2a 70 2c 20 69 6e 74 20 2a 70 62 4f 6b  le *p, int *pbOk
2a660 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2a670 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2a680 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2a690 6f 64 65 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73  ode */.  u64 cks
2a6a0 75 6d 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  um1 = 0;        
2a6b0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
2a6c0 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 46 54  ksum based on FT
2a6d0 53 20 69 6e 64 65 78 20 63 6f 6e 74 65 6e 74 73  S index contents
2a6e0 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73 75 6d 32   */.  u64 cksum2
2a6f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2a700 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
2a710 6d 20 62 61 73 65 64 20 6f 6e 20 25 5f 63 6f 6e  m based on %_con
2a720 74 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 2a 2f  tent contents */
2a730 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
2a740 2a 70 41 6c 6c 4c 61 6e 67 69 64 20 3d 20 30 3b  *pAllLangid = 0;
2a750 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
2a760 74 6f 20 72 65 74 75 72 6e 20 61 6c 6c 20 6c 61  to return all la
2a770 6e 67 75 61 67 65 2d 69 64 73 20 2a 2f 0a 0a 20  nguage-ids */.. 
2a780 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 63   /* This block c
2a790 61 6c 63 75 6c 61 74 65 73 20 74 68 65 20 63 68  alculates the ch
2a7a0 65 63 6b 73 75 6d 20 61 63 63 6f 72 64 69 6e 67  ecksum according
2a7b0 20 74 6f 20 74 68 65 20 46 54 53 20 69 6e 64 65   to the FTS inde
2a7c0 78 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73  x. */.  rc = fts
2a7d0 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
2a7e0 53 45 4c 45 43 54 5f 41 4c 4c 5f 4c 41 4e 47 49  SELECT_ALL_LANGI
2a7f0 44 2c 20 26 70 41 6c 6c 4c 61 6e 67 69 64 2c 20  D, &pAllLangid, 
2a800 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
2a810 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2a820 6e 74 20 72 63 32 3b 0a 20 20 20 20 73 71 6c 69  nt rc2;.    sqli
2a830 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 41 6c  te3_bind_int(pAl
2a840 6c 4c 61 6e 67 69 64 2c 20 31 2c 20 70 2d 3e 6e  lLangid, 1, p->n
2a850 49 6e 64 65 78 29 3b 0a 20 20 20 20 77 68 69 6c  Index);.    whil
2a860 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
2a870 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 65 70   && sqlite3_step
2a880 28 70 41 6c 6c 4c 61 6e 67 69 64 29 3d 3d 53 51  (pAllLangid)==SQ
2a890 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
2a8a0 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 20 3d 20    int iLangid = 
2a8b0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
2a8c0 6e 74 28 70 41 6c 6c 4c 61 6e 67 69 64 2c 20 30  nt(pAllLangid, 0
2a8d0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  );.      int i;.
2a8e0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2a8f0 3c 70 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b 29  <p->nIndex; i++)
2a900 7b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 31  {.        cksum1
2a910 20 3d 20 63 6b 73 75 6d 31 20 5e 20 66 74 73 33   = cksum1 ^ fts3
2a920 43 68 65 63 6b 73 75 6d 49 6e 64 65 78 28 70 2c  ChecksumIndex(p,
2a930 20 69 4c 61 6e 67 69 64 2c 20 69 2c 20 26 72 63   iLangid, i, &rc
2a940 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2a950 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
2a960 65 33 5f 72 65 73 65 74 28 70 41 6c 6c 4c 61 6e  e3_reset(pAllLan
2a970 67 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gid);.    if( rc
2a980 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
2a990 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 2f   = rc2;.  }..  /
2a9a0 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 63 61 6c  * This block cal
2a9b0 63 75 6c 61 74 65 73 20 74 68 65 20 63 68 65 63  culates the chec
2a9c0 6b 73 75 6d 20 61 63 63 6f 72 64 69 6e 67 20 74  ksum according t
2a9d0 6f 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20  o the %_content 
2a9e0 74 61 62 6c 65 20 2a 2f 0a 20 20 72 63 20 3d 20  table */.  rc = 
2a9f0 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
2aa00 51 4c 5f 53 45 4c 45 43 54 5f 41 4c 4c 5f 4c 41  QL_SELECT_ALL_LA
2aa10 4e 47 49 44 2c 20 26 70 41 6c 6c 4c 61 6e 67 69  NGID, &pAllLangi
2aa20 64 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  d, 0);.  if( rc=
2aa30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2aa40 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69    sqlite3_tokeni
2aa50 7a 65 72 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73 74  zer_module const
2aa60 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 2d 3e 70   *pModule = p->p
2aa70 54 6f 6b 65 6e 69 7a 65 72 2d 3e 70 4d 6f 64 75  Tokenizer->pModu
2aa80 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  le;.    sqlite3_
2aa90 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
2aaa0 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  .    char *zSql;
2aab0 0a 20 20 20 0a 20 20 20 20 7a 53 71 6c 20 3d 20  .   .    zSql = 
2aac0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2aad0 22 53 45 4c 45 43 54 20 25 73 22 20 2c 20 70 2d  "SELECT %s" , p-
2aae0 3e 7a 52 65 61 64 45 78 70 72 6c 69 73 74 29 3b  >zReadExprlist);
2aaf0 0a 20 20 20 20 69 66 28 20 21 7a 53 71 6c 20 29  .    if( !zSql )
2ab00 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2ab10 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
2ab20 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
2ab30 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
2ab40 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
2ab50 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
2ab60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2ab70 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  ree(zSql);.    }
2ab80 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ..    while( rc=
2ab90 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51  =SQLITE_OK && SQ
2aba0 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
2abb0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
2abc0 0a 20 20 20 20 20 20 69 36 34 20 69 44 6f 63 69  .      i64 iDoci
2abd0 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
2abe0 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
2abf0 30 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c  0);.      int iL
2ac00 61 6e 67 20 3d 20 6c 61 6e 67 69 64 46 72 6f 6d  ang = langidFrom
2ac10 53 65 6c 65 63 74 28 70 2c 20 70 53 74 6d 74 29  Select(p, pStmt)
2ac20 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  ;.      int iCol
2ac30 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f  ;..      for(iCo
2ac40 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  l=0; rc==SQLITE_
2ac50 4f 4b 20 26 26 20 69 43 6f 6c 3c 70 2d 3e 6e 43  OK && iCol<p->nC
2ac60 6f 6c 75 6d 6e 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  olumn; iCol++){.
2ac70 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
2ac80 61 72 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e  ar *zText = (con
2ac90 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  st char *)sqlite
2aca0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
2acb0 74 6d 74 2c 20 69 43 6f 6c 2b 31 29 3b 0a 20 20  tmt, iCol+1);.  
2acc0 20 20 20 20 20 20 69 6e 74 20 6e 54 65 78 74 20        int nText 
2acd0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
2ace0 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69 43  _bytes(pStmt, iC
2acf0 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73  ol+1);.        s
2ad00 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
2ad10 5f 63 75 72 73 6f 72 20 2a 70 54 20 3d 20 30 3b  _cursor *pT = 0;
2ad20 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ..        rc = s
2ad30 71 6c 69 74 65 33 46 74 73 33 4f 70 65 6e 54 6f  qlite3Fts3OpenTo
2ad40 6b 65 6e 69 7a 65 72 28 70 2d 3e 70 54 6f 6b 65  kenizer(p->pToke
2ad50 6e 69 7a 65 72 2c 20 69 4c 61 6e 67 2c 20 7a 54  nizer, iLang, zT
2ad60 65 78 74 2c 20 6e 54 65 78 74 2c 20 26 70 54 29  ext, nText, &pT)
2ad70 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
2ad80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ad90 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  {.          char
2ada0 20 63 6f 6e 73 74 20 2a 7a 54 6f 6b 65 6e 3b 20   const *zToken; 
2adb0 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
2adc0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 6f 6b 65 6e  containing token
2add0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e   */.          in
2ade0 74 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 20 20 20  t nToken = 0;   
2adf0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2ae00 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 6f  r of bytes in to
2ae10 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ken */.         
2ae20 20 69 6e 74 20 69 44 75 6d 31 20 3d 20 30 2c 20   int iDum1 = 0, 
2ae30 69 44 75 6d 32 20 3d 20 30 3b 20 2f 2a 20 44 75  iDum2 = 0; /* Du
2ae40 6d 6d 79 20 76 61 72 69 61 62 6c 65 73 20 2a 2f  mmy variables */
2ae50 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
2ae60 50 6f 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Pos = 0;        
2ae70 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
2ae80 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20 7a 54 65   of token in zTe
2ae90 78 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20  xt */..         
2aea0 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78   rc = pModule->x
2aeb0 4e 65 78 74 28 70 54 2c 20 26 7a 54 6f 6b 65 6e  Next(pT, &zToken
2aec0 2c 20 26 6e 54 6f 6b 65 6e 2c 20 26 69 44 75 6d  , &nToken, &iDum
2aed0 31 2c 20 26 69 44 75 6d 32 2c 20 26 69 50 6f 73  1, &iDum2, &iPos
2aee0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2aef0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2af00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
2af10 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t i;.           
2af20 20 63 6b 73 75 6d 32 20 3d 20 63 6b 73 75 6d 32   cksum2 = cksum2
2af30 20 5e 20 66 74 73 33 43 68 65 63 6b 73 75 6d 45   ^ fts3ChecksumE
2af40 6e 74 72 79 28 0a 20 20 20 20 20 20 20 20 20 20  ntry(.          
2af50 20 20 20 20 20 20 7a 54 6f 6b 65 6e 2c 20 6e 54        zToken, nT
2af60 6f 6b 65 6e 2c 20 69 4c 61 6e 67 2c 20 30 2c 20  oken, iLang, 0, 
2af70 69 44 6f 63 69 64 2c 20 69 43 6f 6c 2c 20 69 50  iDocid, iCol, iP
2af80 6f 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  os.            )
2af90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
2afa0 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 49 6e 64  r(i=1; i<p->nInd
2afb0 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ex; i++){.      
2afc0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
2afd0 49 6e 64 65 78 5b 69 5d 2e 6e 50 72 65 66 69 78  Index[i].nPrefix
2afe0 3c 3d 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  <=nToken ){.    
2aff0 20 20 20 20 20 20 20 20 20 20 20 20 63 6b 73 75              cksu
2b000 6d 32 20 3d 20 63 6b 73 75 6d 32 20 5e 20 66 74  m2 = cksum2 ^ ft
2b010 73 33 43 68 65 63 6b 73 75 6d 45 6e 74 72 79 28  s3ChecksumEntry(
2b020 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b030 20 20 20 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 61 49     zToken, p->aI
2b040 6e 64 65 78 5b 69 5d 2e 6e 50 72 65 66 69 78 2c  ndex[i].nPrefix,
2b050 20 69 4c 61 6e 67 2c 20 69 2c 20 69 44 6f 63 69   iLang, i, iDoci
2b060 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 0a 20 20  d, iCol, iPos.  
2b070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 3b                );
2b080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2b090 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2b0a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2b0b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2b0c0 20 70 54 20 29 20 70 4d 6f 64 75 6c 65 2d 3e 78   pT ) pModule->x
2b0d0 43 6c 6f 73 65 28 70 54 29 3b 0a 20 20 20 20 20  Close(pT);.     
2b0e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b0f0 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51  E_DONE ) rc = SQ
2b100 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2b110 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
2b120 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
2b130 6d 74 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 62 4f  mt);.  }..  *pbO
2b140 6b 20 3d 20 28 63 6b 73 75 6d 31 3d 3d 63 6b 73  k = (cksum1==cks
2b150 75 6d 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  um2);.  return r
2b160 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  c;.}../*.** Run 
2b170 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68  the integrity-ch
2b180 65 63 6b 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72  eck. If no error
2b190 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
2b1a0 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73  current contents
2b1b0 20 6f 66 0a 2a 2a 20 74 68 65 20 46 54 53 20 69   of.** the FTS i
2b1c0 6e 64 65 78 20 61 72 65 20 63 6f 72 72 65 63 74  ndex are correct
2b1d0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
2b1e0 4f 4b 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 63  OK. Or, if the c
2b1f0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
2b200 2a 20 46 54 53 20 69 6e 64 65 78 20 61 72 65 20  * FTS index are 
2b210 69 6e 63 6f 72 72 65 63 74 2c 20 72 65 74 75 72  incorrect, retur
2b220 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2b230 5f 56 54 41 42 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  _VTAB..**.** Or,
2b240 20 69 66 20 61 6e 20 65 72 72 6f 72 20 28 65 2e   if an error (e.
2b250 67 2e 20 61 6e 20 4f 4f 4d 20 6f 72 20 49 4f 20  g. an OOM or IO 
2b260 65 72 72 6f 72 29 20 6f 63 63 75 72 73 2c 20 72  error) occurs, r
2b270 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
2b280 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  .** error code..
2b290 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67 72  **.** The integr
2b2a0 69 74 79 2d 63 68 65 63 6b 20 77 6f 72 6b 73 20  ity-check works 
2b2b0 61 73 20 66 6f 6c 6c 6f 77 73 2e 20 46 6f 72 20  as follows. For 
2b2c0 65 61 63 68 20 74 6f 6b 65 6e 20 61 6e 64 20 69  each token and i
2b2d0 6e 64 65 78 65 64 20 74 6f 6b 65 6e 0a 2a 2a 20  ndexed token.** 
2b2e0 70 72 65 66 69 78 20 69 6e 20 74 68 65 20 64 6f  prefix in the do
2b2f0 63 75 6d 65 6e 74 20 73 65 74 2c 20 61 20 36 34  cument set, a 64
2b300 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 69 73  -bit checksum is
2b310 20 63 61 6c 63 75 6c 61 74 65 64 20 28 62 79 20   calculated (by 
2b320 63 6f 64 65 0a 2a 2a 20 69 6e 20 66 74 73 33 43  code.** in fts3C
2b330 68 65 63 6b 73 75 6d 45 6e 74 72 79 28 29 29 20  hecksumEntry()) 
2b340 62 61 73 65 64 20 6f 6e 20 74 68 65 20 66 6f 6c  based on the fol
2b350 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
2b360 20 20 2b 20 54 68 65 20 69 6e 64 65 78 20 6e 75    + The index nu
2b370 6d 62 65 72 20 28 30 20 66 6f 72 20 74 68 65 20  mber (0 for the 
2b380 6d 61 69 6e 20 69 6e 64 65 78 2c 20 31 20 66 6f  main index, 1 fo
2b390 72 20 74 68 65 20 66 69 72 73 74 20 70 72 65 66  r the first pref
2b3a0 69 78 0a 2a 2a 20 20 20 20 20 20 20 69 6e 64 65  ix.**       inde
2b3b0 78 20 65 74 63 2e 29 2c 0a 2a 2a 20 20 20 20 20  x etc.),.**     
2b3c0 2b 20 54 68 65 20 74 6f 6b 65 6e 20 28 6f 72 20  + The token (or 
2b3d0 74 6f 6b 65 6e 20 70 72 65 66 69 78 29 20 74 65  token prefix) te
2b3e0 78 74 20 69 74 73 65 6c 66 2c 20 0a 2a 2a 20 20  xt itself, .**  
2b3f0 20 20 20 2b 20 54 68 65 20 6c 61 6e 67 75 61 67     + The languag
2b400 65 2d 69 64 20 6f 66 20 74 68 65 20 72 6f 77 20  e-id of the row 
2b410 69 74 20 61 70 70 65 61 72 73 20 69 6e 2c 0a 2a  it appears in,.*
2b420 2a 20 20 20 20 20 2b 20 54 68 65 20 64 6f 63 69  *     + The doci
2b430 64 20 6f 66 20 74 68 65 20 72 6f 77 20 69 74 20  d of the row it 
2b440 61 70 70 65 61 72 73 20 69 6e 2c 0a 2a 2a 20 20  appears in,.**  
2b450 20 20 20 2b 20 54 68 65 20 63 6f 6c 75 6d 6e 20     + The column 
2b460 69 74 20 61 70 70 65 61 72 73 20 69 6e 2c 20 61  it appears in, a
2b470 6e 64 0a 2a 2a 20 20 20 20 20 2b 20 54 68 65 20  nd.**     + The 
2b480 74 6f 6b 65 6e 73 20 70 6f 73 69 74 69 6f 6e 20  tokens position 
2b490 77 69 74 68 69 6e 20 74 68 61 74 20 63 6f 6c 75  within that colu
2b4a0 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 68  mn..**.** The ch
2b4b0 65 63 6b 73 75 6d 73 20 66 6f 72 20 61 6c 6c 20  ecksums for all 
2b4c0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 69  entries in the i
2b4d0 6e 64 65 78 20 61 72 65 20 58 4f 52 65 64 20 74  ndex are XORed t
2b4e0 6f 67 65 74 68 65 72 20 74 6f 20 63 72 65 61 74  ogether to creat
2b4f0 65 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 63 68  e.** a single ch
2b500 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 65  ecksum for the e
2b510 6e 74 69 72 65 20 69 6e 64 65 78 2e 0a 2a 2a 0a  ntire index..**.
2b520 2a 2a 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  ** The integrity
2b530 2d 63 68 65 63 6b 20 63 6f 64 65 20 63 61 6c 63  -check code calc
2b540 75 6c 61 74 65 73 20 74 68 65 20 73 61 6d 65 20  ulates the same 
2b550 63 68 65 63 6b 73 75 6d 20 69 6e 20 74 77 6f 20  checksum in two 
2b560 77 61 79 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ways:.**.**     
2b570 31 2e 20 42 79 20 73 63 61 6e 6e 69 6e 67 20 74  1. By scanning t
2b580 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2b590 68 65 20 46 54 53 20 69 6e 64 65 78 2c 20 61 6e  he FTS index, an
2b5a0 64 20 0a 2a 2a 20 20 20 20 20 32 2e 20 42 79 20  d .**     2. By 
2b5b0 73 63 61 6e 6e 69 6e 67 20 61 6e 64 20 74 6f 6b  scanning and tok
2b5c0 65 6e 69 7a 69 6e 67 20 74 68 65 20 63 6f 6e 74  enizing the cont
2b5d0 65 6e 74 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ent table..**.**
2b5e0 20 49 66 20 74 68 65 20 74 77 6f 20 63 68 65 63   If the two chec
2b5f0 6b 73 75 6d 73 20 61 72 65 20 69 64 65 6e 74 69  ksums are identi
2b600 63 61 6c 2c 20 74 68 65 20 69 6e 74 65 67 72 69  cal, the integri
2b610 74 79 2d 63 68 65 63 6b 20 69 73 20 64 65 65 6d  ty-check is deem
2b620 65 64 20 74 6f 20 68 61 76 65 0a 2a 2a 20 70 61  ed to have.** pa
2b630 73 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ssed..*/.static 
2b640 69 6e 74 20 66 74 73 33 44 6f 49 6e 74 65 67 72  int fts3DoIntegr
2b650 69 74 79 43 68 65 63 6b 28 0a 20 20 46 74 73 33  ityCheck(.  Fts3
2b660 54 61 62 6c 65 20 2a 70 20 20 20 20 20 20 20 20  Table *p        
2b670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2b680 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  TS3 table handle
2b690 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
2b6a0 0a 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b 0a  .  int bOk = 0;.
2b6b0 20 20 72 63 20 3d 20 66 74 73 33 49 6e 74 65 67    rc = fts3Integ
2b6c0 72 69 74 79 43 68 65 63 6b 28 70 2c 20 26 62 4f  rityCheck(p, &bO
2b6d0 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  k);.  if( rc==SQ
2b6e0 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 3d 3d  LITE_OK && bOk==
2b6f0 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  0 ) rc = SQLITE_
2b700 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20  CORRUPT_VTAB;.  
2b710 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2b720 0a 2a 2a 20 48 61 6e 64 6c 65 20 61 20 27 73 70  .** Handle a 'sp
2b730 65 63 69 61 6c 27 20 49 4e 53 45 52 54 20 6f 66  ecial' INSERT of
2b740 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
2b750 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
2b760 74 62 6c 28 74 62 6c 29 20 56 41 4c 55 45 53 28  tbl(tbl) VALUES(
2b770 3c 65 78 70 72 3e 29 22 0a 2a 2a 0a 2a 2a 20 41  <expr>)".**.** A
2b780 72 67 75 6d 65 6e 74 20 70 56 61 6c 20 63 6f 6e  rgument pVal con
2b790 74 61 69 6e 73 20 74 68 65 20 72 65 73 75 6c 74  tains the result
2b7a0 20 6f 66 20 3c 65 78 70 72 3e 2e 20 43 75 72 72   of <expr>. Curr
2b7b0 65 6e 74 6c 79 20 74 68 65 20 6f 6e 6c 79 20 0a  ently the only .
2b7c0 2a 2a 20 6d 65 61 6e 69 6e 67 66 75 6c 20 76 61  ** meaningful va
2b7d0 6c 75 65 20 74 6f 20 69 6e 73 65 72 74 20 69 73  lue to insert is
2b7e0 20 74 68 65 20 74 65 78 74 20 27 6f 70 74 69 6d   the text 'optim
2b7f0 69 7a 65 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ize'..*/.static 
2b800 69 6e 74 20 66 74 73 33 53 70 65 63 69 61 6c 49  int fts3SpecialI
2b810 6e 73 65 72 74 28 46 74 73 33 54 61 62 6c 65 20  nsert(Fts3Table 
2b820 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  *p, sqlite3_valu
2b830 65 20 2a 70 56 61 6c 29 7b 0a 20 20 69 6e 74 20  e *pVal){.  int 
2b840 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2b850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2b860 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
2b870 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c  const char *zVal
2b880 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
2b890 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
2b8a0 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 69 6e 74  ext(pVal);.  int
2b8b0 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f   nVal = sqlite3_
2b8c0 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c  value_bytes(pVal
2b8d0 29 3b 0a 0a 20 20 69 66 28 20 21 7a 56 61 6c 20  );..  if( !zVal 
2b8e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2b8f0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
2b900 6c 73 65 20 69 66 28 20 6e 56 61 6c 3d 3d 38 20  lse if( nVal==8 
2b910 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  && 0==sqlite3_st
2b920 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22 6f 70  rnicmp(zVal, "op
2b930 74 69 6d 69 7a 65 22 2c 20 38 29 20 29 7b 0a 20  timize", 8) ){. 
2b940 20 20 20 72 63 20 3d 20 66 74 73 33 44 6f 4f 70     rc = fts3DoOp
2b950 74 69 6d 69 7a 65 28 70 2c 20 30 29 3b 0a 20 20  timize(p, 0);.  
2b960 7d 65 6c 73 65 20 69 66 28 20 6e 56 61 6c 3d 3d  }else if( nVal==
2b970 37 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f  7 && 0==sqlite3_
2b980 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22  strnicmp(zVal, "
2b990 72 65 62 75 69 6c 64 22 2c 20 37 29 20 29 7b 0a  rebuild", 7) ){.
2b9a0 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 6f 52      rc = fts3DoR
2b9b0 65 62 75 69 6c 64 28 70 29 3b 0a 20 20 7d 65 6c  ebuild(p);.  }el
2b9c0 73 65 20 69 66 28 20 6e 56 61 6c 3d 3d 31 35 20  se if( nVal==15 
2b9d0 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  && 0==sqlite3_st
2b9e0 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22 69 6e  rnicmp(zVal, "in
2b9f0 74 65 67 72 69 74 79 2d 63 68 65 63 6b 22 2c 20  tegrity-check", 
2ba00 31 35 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  15) ){.    rc = 
2ba10 66 74 73 33 44 6f 49 6e 74 65 67 72 69 74 79 43  fts3DoIntegrityC
2ba20 68 65 63 6b 28 70 29 3b 0a 20 20 7d 65 6c 73 65  heck(p);.  }else
2ba30 20 69 66 28 20 6e 56 61 6c 3e 36 20 26 26 20 30   if( nVal>6 && 0
2ba40 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ==sqlite3_strnic
2ba50 6d 70 28 7a 56 61 6c 2c 20 22 6d 65 72 67 65 3d  mp(zVal, "merge=
2ba60 22 2c 20 36 29 20 29 7b 0a 20 20 20 20 72 63 20  ", 6) ){.    rc 
2ba70 3d 20 66 74 73 33 44 6f 49 6e 63 72 6d 65 72 67  = fts3DoIncrmerg
2ba80 65 28 70 2c 20 26 7a 56 61 6c 5b 36 5d 29 3b 0a  e(p, &zVal[6]);.
2ba90 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 61 6c    }else if( nVal
2baa0 3e 31 30 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  >10 && 0==sqlite
2bab0 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c  3_strnicmp(zVal,
2bac0 20 22 61 75 74 6f 6d 65 72 67 65 3d 22 2c 20 31   "automerge=", 1
2bad0 30 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  0) ){.    rc = f
2bae0 74 73 33 44 6f 41 75 74 6f 69 6e 63 72 6d 65 72  ts3DoAutoincrmer
2baf0 67 65 28 70 2c 20 26 7a 56 61 6c 5b 31 30 5d 29  ge(p, &zVal[10])
2bb00 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2bb10 54 45 53 54 0a 20 20 7d 65 6c 73 65 20 69 66 28  TEST.  }else if(
2bb20 20 6e 56 61 6c 3e 39 20 26 26 20 30 3d 3d 73 71   nVal>9 && 0==sq
2bb30 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a  lite3_strnicmp(z
2bb40 56 61 6c 2c 20 22 6e 6f 64 65 73 69 7a 65 3d 22  Val, "nodesize="
2bb50 2c 20 39 29 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  , 9) ){.    p->n
2bb60 4e 6f 64 65 53 69 7a 65 20 3d 20 61 74 6f 69 28  NodeSize = atoi(
2bb70 26 7a 56 61 6c 5b 39 5d 29 3b 0a 20 20 20 20 72  &zVal[9]);.    r
2bb80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2bb90 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 61 6c 3e   }else if( nVal>
2bba0 31 31 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  11 && 0==sqlite3
2bbb0 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20  _strnicmp(zVal, 
2bbc0 22 6d 61 78 70 65 6e 64 69 6e 67 3d 22 2c 20 39  "maxpending=", 9
2bbd0 29 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4d 61 78  ) ){.    p->nMax
2bbe0 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 61 74  PendingData = at
2bbf0 6f 69 28 26 7a 56 61 6c 5b 31 31 5d 29 3b 0a 20  oi(&zVal[11]);. 
2bc00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2bc10 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  K;.  }else if( n
2bc20 56 61 6c 3e 32 31 20 26 26 20 30 3d 3d 73 71 6c  Val>21 && 0==sql
2bc30 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56  ite3_strnicmp(zV
2bc40 61 6c 2c 20 22 74 65 73 74 2d 6e 6f 2d 69 6e 63  al, "test-no-inc
2bc50 72 2d 64 6f 63 6c 69 73 74 3d 22 2c 20 32 31 29  r-doclist=", 21)
2bc60 20 29 7b 0a 20 20 20 20 70 2d 3e 62 4e 6f 49 6e   ){.    p->bNoIn
2bc70 63 72 44 6f 63 6c 69 73 74 20 3d 20 61 74 6f 69  crDoclist = atoi
2bc80 28 26 7a 56 61 6c 5b 32 31 5d 29 3b 0a 20 20 20  (&zVal[21]);.   
2bc90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2bca0 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
2bcb0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2bcc0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
2bcd0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
2bce0 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  ndef SQLITE_DISA
2bcf0 42 4c 45 5f 46 54 53 34 5f 44 45 46 45 52 52 45  BLE_FTS4_DEFERRE
2bd00 44 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  D./*.** Delete a
2bd10 6c 6c 20 63 61 63 68 65 64 20 64 65 66 65 72 72  ll cached deferr
2bd20 65 64 20 64 6f 63 6c 69 73 74 73 2e 20 44 65 66  ed doclists. Def
2bd30 65 72 72 65 64 20 64 6f 63 6c 69 73 74 73 20 61  erred doclists a
2bd40 72 65 20 63 61 63 68 65 64 0a 2a 2a 20 28 61 6c  re cached.** (al
2bd50 6c 6f 63 61 74 65 64 29 20 62 79 20 74 68 65 20  located) by the 
2bd60 73 71 6c 69 74 65 33 46 74 73 33 43 61 63 68 65  sqlite3Fts3Cache
2bd70 44 65 66 65 72 72 65 64 44 6f 63 6c 69 73 74 73  DeferredDoclists
2bd80 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
2bd90 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 33  void sqlite3Fts3
2bda0 46 72 65 65 44 65 66 65 72 72 65 64 44 6f 63 6c  FreeDeferredDocl
2bdb0 69 73 74 73 28 46 74 73 33 43 75 72 73 6f 72 20  ists(Fts3Cursor 
2bdc0 2a 70 43 73 72 29 7b 0a 20 20 46 74 73 33 44 65  *pCsr){.  Fts3De
2bdd0 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70 44 65  ferredToken *pDe
2bde0 66 3b 0a 20 20 66 6f 72 28 70 44 65 66 3d 70 43  f;.  for(pDef=pC
2bdf0 73 72 2d 3e 70 44 65 66 65 72 72 65 64 3b 20 70  sr->pDeferred; p
2be00 44 65 66 3b 20 70 44 65 66 3d 70 44 65 66 2d 3e  Def; pDef=pDef->
2be10 70 4e 65 78 74 29 7b 0a 20 20 20 20 66 74 73 33  pNext){.    fts3
2be20 50 65 6e 64 69 6e 67 4c 69 73 74 44 65 6c 65 74  PendingListDelet
2be30 65 28 70 44 65 66 2d 3e 70 4c 69 73 74 29 3b 0a  e(pDef->pList);.
2be40 20 20 20 20 70 44 65 66 2d 3e 70 4c 69 73 74 20      pDef->pList 
2be50 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
2be60 2a 20 46 72 65 65 20 61 6c 6c 20 65 6e 74 72 69  * Free all entri
2be70 65 73 20 69 6e 20 74 68 65 20 70 43 73 72 2d 3e  es in the pCsr->
2be80 70 44 65 66 66 65 72 65 64 20 6c 69 73 74 2e 20  pDeffered list. 
2be90 45 6e 74 72 69 65 73 20 61 72 65 20 61 64 64 65  Entries are adde
2bea0 64 20 74 6f 20 0a 2a 2a 20 74 68 69 73 20 6c 69  d to .** this li
2beb0 73 74 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  st using sqlite3
2bec0 46 74 73 33 44 65 66 65 72 54 6f 6b 65 6e 28 29  Fts3DeferToken()
2bed0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2bee0 33 46 74 73 33 46 72 65 65 44 65 66 65 72 72 65  3Fts3FreeDeferre
2bef0 64 54 6f 6b 65 6e 73 28 46 74 73 33 43 75 72 73  dTokens(Fts3Curs
2bf00 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 46 74 73  or *pCsr){.  Fts
2bf10 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a  3DeferredToken *
2bf20 70 44 65 66 3b 0a 20 20 46 74 73 33 44 65 66 65  pDef;.  Fts3Defe
2bf30 72 72 65 64 54 6f 6b 65 6e 20 2a 70 4e 65 78 74  rredToken *pNext
2bf40 3b 0a 20 20 66 6f 72 28 70 44 65 66 3d 70 43 73  ;.  for(pDef=pCs
2bf50 72 2d 3e 70 44 65 66 65 72 72 65 64 3b 20 70 44  r->pDeferred; pD
2bf60 65 66 3b 20 70 44 65 66 3d 70 4e 65 78 74 29 7b  ef; pDef=pNext){
2bf70 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 44 65  .    pNext = pDe
2bf80 66 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 66 74  f->pNext;.    ft
2bf90 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 44 65 6c  s3PendingListDel
2bfa0 65 74 65 28 70 44 65 66 2d 3e 70 4c 69 73 74 29  ete(pDef->pList)
2bfb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
2bfc0 65 65 28 70 44 65 66 29 3b 0a 20 20 7d 0a 20 20  ee(pDef);.  }.  
2bfd0 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64 20  pCsr->pDeferred 
2bfe0 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = 0;.}../*.** Ge
2bff0 6e 65 72 61 74 65 20 64 65 66 65 72 72 65 64 2d  nerate deferred-
2c000 64 6f 63 6c 69 73 74 73 20 66 6f 72 20 61 6c 6c  doclists for all
2c010 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68 65 20 70   tokens in the p
2c020 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64 20 6c  Csr->pDeferred l
2c030 69 73 74 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20  ist.** based on 
2c040 74 68 65 20 72 6f 77 20 74 68 61 74 20 70 43 73  the row that pCs
2c050 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
2c060 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 41 20 64  ts to..**.** A d
2c070 65 66 65 72 72 65 64 2d 64 6f 63 6c 69 73 74 20  eferred-doclist 
2c080 69 73 20 6c 69 6b 65 20 61 6e 79 20 6f 74 68 65  is like any othe
2c090 72 20 64 6f 63 6c 69 73 74 20 77 69 74 68 20 70  r doclist with p
2c0a0 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74  osition informat
2c0b0 69 6f 6e 0a 2a 2a 20 69 6e 63 6c 75 64 65 64 2c  ion.** included,
2c0c0 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74 20   except that it 
2c0d0 6f 6e 6c 79 20 63 6f 6e 74 61 69 6e 73 20 65 6e  only contains en
2c0e0 74 72 69 65 73 20 66 6f 72 20 61 20 73 69 6e 67  tries for a sing
2c0f0 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 0a 2a 2a  le row of the.**
2c100 20 74 61 62 6c 65 2c 20 6e 6f 74 20 66 6f 72 20   table, not for 
2c110 61 6c 6c 20 72 6f 77 73 2e 0a 2a 2f 0a 69 6e 74  all rows..*/.int
2c120 20 73 71 6c 69 74 65 33 46 74 73 33 43 61 63 68   sqlite3Fts3Cach
2c130 65 44 65 66 65 72 72 65 64 44 6f 63 6c 69 73 74  eDeferredDoclist
2c140 73 28 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43  s(Fts3Cursor *pC
2c150 73 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  sr){.  int rc = 
2c160 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2c170 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2c180 20 63 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20 70   code */.  if( p
2c190 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64 20 29  Csr->pDeferred )
2c1a0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  {.    int i;    
2c1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c1c0 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
2c1d0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
2c1e0 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  able columns */.
2c1f0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
2c200 34 20 69 44 6f 63 69 64 3b 20 20 20 20 20 20 20  4 iDocid;       
2c210 20 20 2f 2a 20 44 6f 63 69 64 20 6f 66 20 74 68    /* Docid of th
2c220 65 20 72 6f 77 20 70 43 73 72 20 70 6f 69 6e 74  e row pCsr point
2c230 73 20 74 6f 20 2a 2f 0a 20 20 20 20 46 74 73 33  s to */.    Fts3
2c240 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70  DeferredToken *p
2c250 44 65 66 3b 20 20 20 20 20 20 2f 2a 20 55 73 65  Def;      /* Use
2c260 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
2c270 6f 75 67 68 20 64 65 66 65 72 72 65 64 20 74 6f  ough deferred to
2c280 6b 65 6e 73 20 2a 2f 0a 20 20 0a 20 20 20 20 46  kens */.  .    F
2c290 74 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 28 46  ts3Table *p = (F
2c2a0 74 73 33 54 61 62 6c 65 20 2a 29 70 43 73 72 2d  ts3Table *)pCsr-
2c2b0 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a 20 20 20  >base.pVtab;.   
2c2c0 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a   sqlite3_tokeniz
2c2d0 65 72 20 2a 70 54 20 3d 20 70 2d 3e 70 54 6f 6b  er *pT = p->pTok
2c2e0 65 6e 69 7a 65 72 3b 0a 20 20 20 20 73 71 6c 69  enizer;.    sqli
2c2f0 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f  te3_tokenizer_mo
2c300 64 75 6c 65 20 63 6f 6e 73 74 20 2a 70 4d 6f 64  dule const *pMod
2c310 75 6c 65 20 3d 20 70 54 2d 3e 70 4d 6f 64 75 6c  ule = pT->pModul
2c320 65 3b 0a 20 20 20 0a 20 20 20 20 61 73 73 65 72  e;.   .    asser
2c330 74 28 20 70 43 73 72 2d 3e 69 73 52 65 71 75 69  t( pCsr->isRequi
2c340 72 65 53 65 65 6b 3d 3d 30 20 29 3b 0a 20 20 20  reSeek==0 );.   
2c350 20 69 44 6f 63 69 64 20 3d 20 73 71 6c 69 74 65   iDocid = sqlite
2c360 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
2c370 43 73 72 2d 3e 70 53 74 6d 74 2c 20 30 29 3b 0a  Csr->pStmt, 0);.
2c380 20 20 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20    .    for(i=0; 
2c390 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20  i<p->nColumn && 
2c3a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
2c3b0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
2c3c0 2d 3e 61 62 4e 6f 74 69 6e 64 65 78 65 64 5b 69  ->abNotindexed[i
2c3d0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
2c3e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78  const char *zTex
2c3f0 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  t = (const char 
2c400 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
2c410 5f 74 65 78 74 28 70 43 73 72 2d 3e 70 53 74 6d  _text(pCsr->pStm
2c420 74 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20  t, i+1);.       
2c430 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a   sqlite3_tokeniz
2c440 65 72 5f 63 75 72 73 6f 72 20 2a 70 54 43 20 3d  er_cursor *pTC =
2c450 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20   0;..        rc 
2c460 3d 20 73 71 6c 69 74 65 33 46 74 73 33 4f 70 65  = sqlite3Fts3Ope
2c470 6e 54 6f 6b 65 6e 69 7a 65 72 28 70 54 2c 20 70  nTokenizer(pT, p
2c480 43 73 72 2d 3e 69 4c 61 6e 67 69 64 2c 20 7a 54  Csr->iLangid, zT
2c490 65 78 74 2c 20 2d 31 2c 20 26 70 54 43 29 3b 0a  ext, -1, &pTC);.
2c4a0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 72          while( r
2c4b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c4c0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 63            char c
2c4d0 6f 6e 73 74 20 2a 7a 54 6f 6b 65 6e 3b 20 20 20  onst *zToken;   
2c4e0 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
2c4f0 6e 74 61 69 6e 69 6e 67 20 74 6f 6b 65 6e 20 2a  ntaining token *
2c500 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  /.          int 
2c510 6e 54 6f 6b 65 6e 20 3d 20 30 3b 20 20 20 20 20  nToken = 0;     
2c520 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2c530 6f 66 20 62 79 74 65 73 20 69 6e 20 74 6f 6b 65  of bytes in toke
2c540 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  n */.          i
2c550 6e 74 20 69 44 75 6d 31 20 3d 20 30 2c 20 69 44  nt iDum1 = 0, iD
2c560 75 6d 32 20 3d 20 30 3b 20 2f 2a 20 44 75 6d 6d  um2 = 0; /* Dumm
2c570 79 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20  y variables */. 
2c580 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 6f           int iPo
2c590 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
2c5a0 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f     /* Position o
2c5b0 66 20 74 6f 6b 65 6e 20 69 6e 20 7a 54 65 78 74  f token in zText
2c5c0 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 72   */..          r
2c5d0 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65  c = pModule->xNe
2c5e0 78 74 28 70 54 43 2c 20 26 7a 54 6f 6b 65 6e 2c  xt(pTC, &zToken,
2c5f0 20 26 6e 54 6f 6b 65 6e 2c 20 26 69 44 75 6d 31   &nToken, &iDum1
2c600 2c 20 26 69 44 75 6d 32 2c 20 26 69 50 6f 73 29  , &iDum2, &iPos)
2c610 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
2c620 70 44 65 66 3d 70 43 73 72 2d 3e 70 44 65 66 65  pDef=pCsr->pDefe
2c630 72 72 65 64 3b 20 70 44 65 66 20 26 26 20 72 63  rred; pDef && rc
2c640 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 44 65  ==SQLITE_OK; pDe
2c650 66 3d 70 44 65 66 2d 3e 70 4e 65 78 74 29 7b 0a  f=pDef->pNext){.
2c660 20 20 20 20 20 20 20 20 20 20 20 20 46 74 73 33              Fts3
2c670 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70 50 54  PhraseToken *pPT
2c680 20 3d 20 70 44 65 66 2d 3e 70 54 6f 6b 65 6e 3b   = pDef->pToken;
2c690 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2c6a0 20 28 70 44 65 66 2d 3e 69 43 6f 6c 3e 3d 70 2d   (pDef->iCol>=p-
2c6b0 3e 6e 43 6f 6c 75 6d 6e 20 7c 7c 20 70 44 65 66  >nColumn || pDef
2c6c0 2d 3e 69 43 6f 6c 3d 3d 69 29 0a 20 20 20 20 20  ->iCol==i).     
2c6d0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
2c6e0 50 54 2d 3e 62 46 69 72 73 74 3d 3d 30 20 7c 7c  PT->bFirst==0 ||
2c6f0 20 69 50 6f 73 3d 3d 30 29 0a 20 20 20 20 20 20   iPos==0).      
2c700 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50            && (pP
2c710 54 2d 3e 6e 3d 3d 6e 54 6f 6b 65 6e 20 7c 7c 20  T->n==nToken || 
2c720 28 70 50 54 2d 3e 69 73 50 72 65 66 69 78 20 26  (pPT->isPrefix &
2c730 26 20 70 50 54 2d 3e 6e 3c 6e 54 6f 6b 65 6e 29  & pPT->n<nToken)
2c740 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
2c750 20 20 26 26 20 28 30 3d 3d 6d 65 6d 63 6d 70 28    && (0==memcmp(
2c760 7a 54 6f 6b 65 6e 2c 20 70 50 54 2d 3e 7a 2c 20  zToken, pPT->z, 
2c770 70 50 54 2d 3e 6e 29 29 0a 20 20 20 20 20 20 20  pPT->n)).       
2c780 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2c790 20 20 20 20 20 20 20 20 66 74 73 33 50 65 6e 64          fts3Pend
2c7a0 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 28 26 70  ingListAppend(&p
2c7b0 44 65 66 2d 3e 70 4c 69 73 74 2c 20 69 44 6f 63  Def->pList, iDoc
2c7c0 69 64 2c 20 69 2c 20 69 50 6f 73 2c 20 26 72 63  id, i, iPos, &rc
2c7d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
2c7e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2c7f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2c800 66 28 20 70 54 43 20 29 20 70 4d 6f 64 75 6c 65  f( pTC ) pModule
2c810 2d 3e 78 43 6c 6f 73 65 28 70 54 43 29 3b 0a 20  ->xClose(pTC);. 
2c820 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2c830 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20  QLITE_DONE ) rc 
2c840 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2c850 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2c860 66 6f 72 28 70 44 65 66 3d 70 43 73 72 2d 3e 70  for(pDef=pCsr->p
2c870 44 65 66 65 72 72 65 64 3b 20 70 44 65 66 20 26  Deferred; pDef &
2c880 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
2c890 20 70 44 65 66 3d 70 44 65 66 2d 3e 70 4e 65 78   pDef=pDef->pNex
2c8a0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44  t){.      if( pD
2c8b0 65 66 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20  ef->pList ){.   
2c8c0 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 50 65       rc = fts3Pe
2c8d0 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56  ndingListAppendV
2c8e0 61 72 69 6e 74 28 26 70 44 65 66 2d 3e 70 4c 69  arint(&pDef->pLi
2c8f0 73 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  st, 0);.      }.
2c900 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
2c910 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73  urn rc;.}..int s
2c920 71 6c 69 74 65 33 46 74 73 33 44 65 66 65 72 72  qlite3Fts3Deferr
2c930 65 64 54 6f 6b 65 6e 4c 69 73 74 28 0a 20 20 46  edTokenList(.  F
2c940 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e  ts3DeferredToken
2c950 20 2a 70 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70   *p, .  char **p
2c960 70 44 61 74 61 2c 20 0a 20 20 69 6e 74 20 2a 70  pData, .  int *p
2c970 6e 44 61 74 61 0a 29 7b 0a 20 20 63 68 61 72 20  nData.){.  char 
2c980 2a 70 52 65 74 3b 0a 20 20 69 6e 74 20 6e 53 6b  *pRet;.  int nSk
2c990 69 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  ip;.  sqlite3_in
2c9a0 74 36 34 20 64 75 6d 6d 79 3b 0a 0a 20 20 2a 70  t64 dummy;..  *p
2c9b0 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 2a 70 6e  pData = 0;.  *pn
2c9c0 44 61 74 61 20 3d 20 30 3b 0a 0a 20 20 69 66 28  Data = 0;..  if(
2c9d0 20 70 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 7b 0a   p->pList==0 ){.
2c9e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2c9f0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 52 65  E_OK;.  }..  pRe
2ca00 74 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  t = (char *)sqli
2ca10 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 2d 3e 70 4c  te3_malloc(p->pL
2ca20 69 73 74 2d 3e 6e 44 61 74 61 29 3b 0a 20 20 69  ist->nData);.  i
2ca30 66 28 20 21 70 52 65 74 20 29 20 72 65 74 75 72  f( !pRet ) retur
2ca40 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2ca50 0a 20 20 6e 53 6b 69 70 20 3d 20 73 71 6c 69 74  .  nSkip = sqlit
2ca60 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28  e3Fts3GetVarint(
2ca70 70 2d 3e 70 4c 69 73 74 2d 3e 61 44 61 74 61 2c  p->pList->aData,
2ca80 20 26 64 75 6d 6d 79 29 3b 0a 20 20 2a 70 6e 44   &dummy);.  *pnD
2ca90 61 74 61 20 3d 20 70 2d 3e 70 4c 69 73 74 2d 3e  ata = p->pList->
2caa0 6e 44 61 74 61 20 2d 20 6e 53 6b 69 70 3b 0a 20  nData - nSkip;. 
2cab0 20 2a 70 70 44 61 74 61 20 3d 20 70 52 65 74 3b   *ppData = pRet;
2cac0 0a 20 20 0a 20 20 6d 65 6d 63 70 79 28 70 52 65  .  .  memcpy(pRe
2cad0 74 2c 20 26 70 2d 3e 70 4c 69 73 74 2d 3e 61 44  t, &p->pList->aD
2cae0 61 74 61 5b 6e 53 6b 69 70 5d 2c 20 2a 70 6e 44  ata[nSkip], *pnD
2caf0 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ata);.  return S
2cb00 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2cb10 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20  ** Add an entry 
2cb20 66 6f 72 20 74 6f 6b 65 6e 20 70 54 6f 6b 65 6e  for token pToken
2cb30 20 74 6f 20 74 68 65 20 70 43 73 72 2d 3e 70 44   to the pCsr->pD
2cb40 65 66 65 72 72 65 64 20 6c 69 73 74 2e 0a 2a 2f  eferred list..*/
2cb50 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
2cb60 44 65 66 65 72 54 6f 6b 65 6e 28 0a 20 20 46 74  DeferToken(.  Ft
2cb70 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20  s3Cursor *pCsr, 
2cb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cb90 20 46 74 73 33 20 74 61 62 6c 65 20 63 75 72 73   Fts3 table curs
2cba0 6f 72 20 2a 2f 0a 20 20 46 74 73 33 50 68 72 61  or */.  Fts3Phra
2cbb0 73 65 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c  seToken *pToken,
2cbc0 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e          /* Token
2cbd0 20 74 6f 20 64 65 66 65 72 20 2a 2f 0a 20 20 69   to defer */.  i
2cbe0 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20  nt iCol         
2cbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2cc00 2a 20 43 6f 6c 75 6d 6e 20 74 68 61 74 20 74 6f  * Column that to
2cc10 6b 65 6e 20 6d 75 73 74 20 61 70 70 65 61 72 20  ken must appear 
2cc20 69 6e 20 28 6f 72 20 2d 31 29 20 2a 2f 0a 29 7b  in (or -1) */.){
2cc30 0a 20 20 46 74 73 33 44 65 66 65 72 72 65 64 54  .  Fts3DeferredT
2cc40 6f 6b 65 6e 20 2a 70 44 65 66 65 72 72 65 64 3b  oken *pDeferred;
2cc50 0a 20 20 70 44 65 66 65 72 72 65 64 20 3d 20 73  .  pDeferred = s
2cc60 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
2cc70 7a 65 6f 66 28 2a 70 44 65 66 65 72 72 65 64 29  zeof(*pDeferred)
2cc80 29 3b 0a 20 20 69 66 28 20 21 70 44 65 66 65 72  );.  if( !pDefer
2cc90 72 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  red ){.    retur
2cca0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2ccb0 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 44 65    }.  memset(pDe
2ccc0 66 65 72 72 65 64 2c 20 30 2c 20 73 69 7a 65 6f  ferred, 0, sizeo
2ccd0 66 28 2a 70 44 65 66 65 72 72 65 64 29 29 3b 0a  f(*pDeferred));.
2cce0 20 20 70 44 65 66 65 72 72 65 64 2d 3e 70 54 6f    pDeferred->pTo
2ccf0 6b 65 6e 20 3d 20 70 54 6f 6b 65 6e 3b 0a 20 20  ken = pToken;.  
2cd00 70 44 65 66 65 72 72 65 64 2d 3e 70 4e 65 78 74  pDeferred->pNext
2cd10 20 3d 20 70 43 73 72 2d 3e 70 44 65 66 65 72 72   = pCsr->pDeferr
2cd20 65 64 3b 20 0a 20 20 70 44 65 66 65 72 72 65 64  ed; .  pDeferred
2cd30 2d 3e 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20  ->iCol = iCol;. 
2cd40 20 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64   pCsr->pDeferred
2cd50 20 3d 20 70 44 65 66 65 72 72 65 64 3b 0a 0a 20   = pDeferred;.. 
2cd60 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d   assert( pToken-
2cd70 3e 70 44 65 66 65 72 72 65 64 3d 3d 30 20 29 3b  >pDeferred==0 );
2cd80 0a 20 20 70 54 6f 6b 65 6e 2d 3e 70 44 65 66 65  .  pToken->pDefe
2cd90 72 72 65 64 20 3d 20 70 44 65 66 65 72 72 65 64  rred = pDeferred
2cda0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ;..  return SQLI
2cdb0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
2cdc0 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 76 61  ./*.** SQLite va
2cdd0 6c 75 65 20 70 52 6f 77 69 64 20 63 6f 6e 74 61  lue pRowid conta
2cde0 69 6e 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66  ins the rowid of
2cdf0 20 61 20 72 6f 77 20 74 68 61 74 20 6d 61 79 20   a row that may 
2ce00 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a  or may not be.**
2ce10 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
2ce20 46 54 53 33 20 74 61 62 6c 65 2e 20 49 66 20 69  FTS3 table. If i
2ce30 74 20 69 73 2c 20 64 65 6c 65 74 65 20 69 74 20  t is, delete it 
2ce40 61 6e 64 20 61 64 6a 75 73 74 20 74 68 65 20 63  and adjust the c
2ce50 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 73 75  ontents.** of su
2ce60 62 73 69 64 75 61 72 79 20 64 61 74 61 20 73 74  bsiduary data st
2ce70 72 75 63 74 75 72 65 73 20 61 63 63 6f 72 64 69  ructures accordi
2ce80 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ngly..*/.static 
2ce90 69 6e 74 20 66 74 73 33 44 65 6c 65 74 65 42 79  int fts3DeleteBy
2cea0 52 6f 77 69 64 28 0a 20 20 46 74 73 33 54 61 62  Rowid(.  Fts3Tab
2ceb0 6c 65 20 2a 70 2c 20 0a 20 20 73 71 6c 69 74 65  le *p, .  sqlite
2cec0 33 5f 76 61 6c 75 65 20 2a 70 52 6f 77 69 64 2c  3_value *pRowid,
2ced0 20 0a 20 20 69 6e 74 20 2a 70 6e 43 68 6e 67 2c   .  int *pnChng,
2cee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cef0 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 44      /* IN/OUT: D
2cf00 65 63 72 65 6d 65 6e 74 20 69 66 20 72 6f 77 20  ecrement if row 
2cf10 69 73 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  is deleted */.  
2cf20 75 33 32 20 2a 61 53 7a 44 65 6c 0a 29 7b 0a 20  u32 *aSzDel.){. 
2cf30 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2cf40 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
2cf50 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2cf60 2a 2f 0a 20 20 69 6e 74 20 62 46 6f 75 6e 64 20  */.  int bFound 
2cf70 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2cf80 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2cf90 2a 70 52 6f 77 69 64 20 72 65 61 6c 6c 79 20 69  *pRowid really i
2cfa0 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
2cfb0 2f 0a 0a 20 20 66 74 73 33 44 65 6c 65 74 65 54  /..  fts3DeleteT
2cfc0 65 72 6d 73 28 26 72 63 2c 20 70 2c 20 70 52 6f  erms(&rc, p, pRo
2cfd0 77 69 64 2c 20 61 53 7a 44 65 6c 2c 20 26 62 46  wid, aSzDel, &bF
2cfe0 6f 75 6e 64 29 3b 0a 20 20 69 66 28 20 62 46 6f  ound);.  if( bFo
2cff0 75 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  und && rc==SQLIT
2d000 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
2d010 69 73 45 6d 70 74 79 20 3d 20 30 3b 20 20 20 20  isEmpty = 0;    
2d020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c            /* Del
2d030 65 74 69 6e 67 20 2a 70 52 6f 77 69 64 20 6c 65  eting *pRowid le
2d040 61 76 65 73 20 74 68 65 20 74 61 62 6c 65 20 65  aves the table e
2d050 6d 70 74 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d  mpty */.    rc =
2d060 20 66 74 73 33 49 73 45 6d 70 74 79 28 70 2c 20   fts3IsEmpty(p, 
2d070 70 52 6f 77 69 64 2c 20 26 69 73 45 6d 70 74 79  pRowid, &isEmpty
2d080 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2d090 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d0a0 20 20 69 66 28 20 69 73 45 6d 70 74 79 20 29 7b    if( isEmpty ){
2d0b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65  .        /* Dele
2d0c0 74 69 6e 67 20 74 68 69 73 20 72 6f 77 20 6d 65  ting this row me
2d0d0 61 6e 73 20 74 68 65 20 77 68 6f 6c 65 20 74 61  ans the whole ta
2d0e0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 20 49 6e  ble is empty. In
2d0f0 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 20   this case.     
2d100 20 20 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65     ** delete the
2d110 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 6c 6c   contents of all
2d120 20 74 68 72 65 65 20 74 61 62 6c 65 73 20 61 6e   three tables an
2d130 64 20 74 68 72 6f 77 20 61 77 61 79 20 61 6e 79  d throw away any
2d140 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
2d150 20 69 6e 20 74 68 65 20 70 65 6e 64 69 6e 67 54   in the pendingT
2d160 65 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65 2e  erms hash table.
2d170 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20    */.        rc 
2d180 3d 20 66 74 73 33 44 65 6c 65 74 65 41 6c 6c 28  = fts3DeleteAll(
2d190 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 2a  p, 1);.        *
2d1a0 70 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20  pnChng = 0;.    
2d1b0 20 20 20 20 6d 65 6d 73 65 74 28 61 53 7a 44 65      memset(aSzDe
2d1c0 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 33 32  l, 0, sizeof(u32
2d1d0 29 20 2a 20 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  ) * (p->nColumn+
2d1e0 31 29 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 7d  1) * 2);.      }
2d1f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70  else{.        *p
2d200 6e 43 68 6e 67 20 3d 20 2a 70 6e 43 68 6e 67 20  nChng = *pnChng 
2d210 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  - 1;.        if(
2d220 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d   p->zContentTbl=
2d230 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2d240 66 74 73 33 53 71 6c 45 78 65 63 28 26 72 63 2c  fts3SqlExec(&rc,
2d250 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 43   p, SQL_DELETE_C
2d260 4f 4e 54 45 4e 54 2c 20 26 70 52 6f 77 69 64 29  ONTENT, &pRowid)
2d270 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2d280 20 20 20 20 69 66 28 20 70 2d 3e 62 48 61 73 44      if( p->bHasD
2d290 6f 63 73 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ocsize ){.      
2d2a0 20 20 20 20 66 74 73 33 53 71 6c 45 78 65 63 28      fts3SqlExec(
2d2b0 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c 45  &rc, p, SQL_DELE
2d2c0 54 45 5f 44 4f 43 53 49 5a 45 2c 20 26 70 52 6f  TE_DOCSIZE, &pRo
2d2d0 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  wid);.        }.
2d2e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2d2f0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2d300 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2d310 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20  nction does the 
2d320 77 6f 72 6b 20 66 6f 72 20 74 68 65 20 78 55 70  work for the xUp
2d330 64 61 74 65 20 6d 65 74 68 6f 64 20 6f 66 20 46  date method of F
2d340 54 53 33 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  TS3 virtual.** t
2d350 61 62 6c 65 73 2e 20 54 68 65 20 73 63 68 65 6d  ables. The schem
2d360 61 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c  a of the virtual
2d370 20 74 61 62 6c 65 20 62 65 69 6e 67 3a 0a 2a 2a   table being:.**
2d380 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
2d390 41 42 4c 45 20 3c 74 61 62 6c 65 20 6e 61 6d 65  ABLE <table name
2d3a0 3e 28 20 0a 2a 2a 20 20 20 20 20 20 20 3c 75 73  >( .**       <us
2d3b0 65 72 20 63 6f 6c 75 6d 6e 73 3e 2c 0a 2a 2a 20  er columns>,.** 
2d3c0 20 20 20 20 20 20 3c 74 61 62 6c 65 20 6e 61 6d        <table nam
2d3d0 65 3e 20 48 49 44 44 45 4e 2c 20 0a 2a 2a 20 20  e> HIDDEN, .**  
2d3e0 20 20 20 20 20 64 6f 63 69 64 20 48 49 44 44 45       docid HIDDE
2d3f0 4e 2c 20 0a 2a 2a 20 20 20 20 20 20 20 3c 6c 61  N, .**       <la
2d400 6e 67 69 64 3e 20 48 49 44 44 45 4e 0a 2a 2a 20  ngid> HIDDEN.** 
2d410 20 20 20 20 29 3b 0a 2a 2a 0a 2a 2a 20 0a 2a 2f      );.**.** .*/
2d420 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
2d430 55 70 64 61 74 65 4d 65 74 68 6f 64 28 0a 20 20  UpdateMethod(.  
2d440 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
2d450 74 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  tab,            
2d460 2f 2a 20 46 54 53 33 20 76 74 61 62 20 6f 62 6a  /* FTS3 vtab obj
2d470 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  ect */.  int nAr
2d480 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
2d490 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2d4a0 20 6f 66 20 61 72 67 75 6d 65 6e 74 20 61 72 72   of argument arr
2d4b0 61 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ay */.  sqlite3_
2d4c0 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20 20  value **apVal,  
2d4d0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
2d4e0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
2d4f0 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
2d500 2a 70 52 6f 77 69 64 20 20 20 20 20 20 20 20 20  *pRowid         
2d510 20 20 20 2f 2a 20 4f 55 54 3a 20 54 68 65 20 61     /* OUT: The a
2d520 66 66 65 63 74 65 64 20 28 6f 72 20 65 66 66 65  ffected (or effe
2d530 63 74 65 64 29 20 72 6f 77 69 64 20 2a 2f 0a 29  cted) rowid */.)
2d540 7b 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  {.  Fts3Table *p
2d550 20 3d 20 28 46 74 73 33 54 61 62 6c 65 20 2a 29   = (Fts3Table *)
2d560 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 20  pVtab;.  int rc 
2d570 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2d580 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2d590 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn Code */.  int
2d5a0 20 69 73 52 65 6d 6f 76 65 20 3d 20 30 3b 20 20   isRemove = 0;  
2d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d5c0 54 72 75 65 20 66 6f 72 20 61 6e 20 55 50 44 41  True for an UPDA
2d5d0 54 45 20 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a  TE or DELETE */.
2d5e0 20 20 75 33 32 20 2a 61 53 7a 49 6e 73 20 3d 20    u32 *aSzIns = 
2d5f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2d600 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 69 6e    /* Sizes of in
2d610 73 65 72 74 65 64 20 64 6f 63 75 6d 65 6e 74 73  serted documents
2d620 20 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a 44 65   */.  u32 *aSzDe
2d630 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
2d640 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f        /* Sizes o
2d650 66 20 64 65 6c 65 74 65 64 20 64 6f 63 75 6d 65  f deleted docume
2d660 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68  nts */.  int nCh
2d670 6e 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ng = 0;         
2d680 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 74 20           /* Net 
2d690 63 68 61 6e 67 65 20 69 6e 20 6e 75 6d 62 65 72  change in number
2d6a0 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 2a 2f   of documents */
2d6b0 0a 20 20 69 6e 74 20 62 49 6e 73 65 72 74 44 6f  .  int bInsertDo
2d6c0 6e 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 41 74  ne = 0;..  /* At
2d6d0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d   this point it m
2d6e0 75 73 74 20 62 65 20 6b 6e 6f 77 6e 20 69 66 20  ust be known if 
2d6f0 74 68 65 20 25 5f 73 74 61 74 20 74 61 62 6c 65  the %_stat table
2d700 20 65 78 69 73 74 73 20 6f 72 20 6e 6f 74 2e 0a   exists or not..
2d710 20 20 2a 2a 20 53 6f 20 62 48 61 73 53 74 61 74    ** So bHasStat
2d720 20 6d 61 79 20 6e 6f 74 20 62 65 20 32 2e 20 20   may not be 2.  
2d730 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
2d740 62 48 61 73 53 74 61 74 3d 3d 30 20 7c 7c 20 70  bHasStat==0 || p
2d750 2d 3e 62 48 61 73 53 74 61 74 3d 3d 31 20 29 3b  ->bHasStat==1 );
2d760 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
2d770 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b 0a 20  Segments==0 );. 
2d780 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20   assert( .      
2d790 6e 41 72 67 3d 3d 31 20 20 20 20 20 20 20 20 20  nArg==1         
2d7a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2d7b0 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73  ELETE operations
2d7c0 20 2a 2f 0a 20 20 20 7c 7c 20 6e 41 72 67 3d 3d   */.   || nArg==
2d7d0 28 32 20 2b 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20  (2 + p->nColumn 
2d7e0 2b 20 33 29 20 20 2f 2a 20 49 4e 53 45 52 54 20  + 3)  /* INSERT 
2d7f0 6f 72 20 55 50 44 41 54 45 20 6f 70 65 72 61 74  or UPDATE operat
2d800 69 6f 6e 73 20 2a 2f 0a 20 20 29 3b 0a 0a 20 20  ions */.  );..  
2d810 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20 22  /* Check for a "
2d820 73 70 65 63 69 61 6c 22 20 49 4e 53 45 52 54 20  special" INSERT 
2d830 6f 70 65 72 61 74 69 6f 6e 2e 20 4f 6e 65 20 6f  operation. One o
2d840 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a  f the form:.  **
2d850 0a 20 20 2a 2a 20 20 20 49 4e 53 45 52 54 20 49  .  **   INSERT I
2d860 4e 54 4f 20 78 79 7a 28 78 79 7a 29 20 56 41 4c  NTO xyz(xyz) VAL
2d870 55 45 53 28 27 63 6f 6d 6d 61 6e 64 27 29 3b 0a  UES('command');.
2d880 20 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3e    */.  if( nArg>
2d890 31 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  1 .   && sqlite3
2d8a0 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61  _value_type(apVa
2d8b0 6c 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55  l[0])==SQLITE_NU
2d8c0 4c 4c 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65  LL .   && sqlite
2d8d0 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56  3_value_type(apV
2d8e0 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 5d  al[p->nColumn+2]
2d8f0 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 0a  )!=SQLITE_NULL .
2d900 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74    ){.    rc = ft
2d910 73 33 53 70 65 63 69 61 6c 49 6e 73 65 72 74 28  s3SpecialInsert(
2d920 70 2c 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c  p, apVal[p->nCol
2d930 75 6d 6e 2b 32 5d 29 3b 0a 20 20 20 20 67 6f 74  umn+2]);.    got
2d940 6f 20 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20 20  o update_out;.  
2d950 7d 0a 0a 20 20 69 66 28 20 6e 41 72 67 3e 31 20  }..  if( nArg>1 
2d960 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  && sqlite3_value
2d970 5f 69 6e 74 28 61 70 56 61 6c 5b 32 20 2b 20 70  _int(apVal[2 + p
2d980 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b 20 32 5d 29 3c  ->nColumn + 2])<
2d990 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
2d9a0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
2d9b0 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65  .    goto update
2d9c0 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
2d9d0 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 74  Allocate space t
2d9e0 6f 20 68 6f 6c 64 20 74 68 65 20 63 68 61 6e 67  o hold the chang
2d9f0 65 20 69 6e 20 64 6f 63 75 6d 65 6e 74 20 73 69  e in document si
2da00 7a 65 73 20 2a 2f 0a 20 20 61 53 7a 44 65 6c 20  zes */.  aSzDel 
2da10 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
2da20 28 20 73 69 7a 65 6f 66 28 61 53 7a 44 65 6c 5b  ( sizeof(aSzDel[
2da30 30 5d 29 2a 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  0])*(p->nColumn+
2da40 31 29 2a 32 20 29 3b 0a 20 20 69 66 28 20 61 53  1)*2 );.  if( aS
2da50 7a 44 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  zDel==0 ){.    r
2da60 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2da70 3b 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74  ;.    goto updat
2da80 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 61 53 7a  e_out;.  }.  aSz
2da90 49 6e 73 20 3d 20 26 61 53 7a 44 65 6c 5b 70 2d  Ins = &aSzDel[p-
2daa0 3e 6e 43 6f 6c 75 6d 6e 2b 31 5d 3b 0a 20 20 6d  >nColumn+1];.  m
2dab0 65 6d 73 65 74 28 61 53 7a 44 65 6c 2c 20 30 2c  emset(aSzDel, 0,
2dac0 20 73 69 7a 65 6f 66 28 61 53 7a 44 65 6c 5b 30   sizeof(aSzDel[0
2dad0 5d 29 2a 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31  ])*(p->nColumn+1
2dae0 29 2a 32 29 3b 0a 0a 20 20 72 63 20 3d 20 66 74  )*2);..  rc = ft
2daf0 73 33 57 72 69 74 65 6c 6f 63 6b 28 70 29 3b 0a  s3Writelock(p);.
2db00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2db10 5f 4f 4b 20 29 20 67 6f 74 6f 20 75 70 64 61 74  _OK ) goto updat
2db20 65 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  e_out;..  /* If 
2db30 74 68 69 73 20 69 73 20 61 6e 20 49 4e 53 45 52  this is an INSER
2db40 54 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20  T operation, or 
2db50 61 6e 20 55 50 44 41 54 45 20 74 68 61 74 20 6d  an UPDATE that m
2db60 6f 64 69 66 69 65 73 20 74 68 65 20 72 6f 77 69  odifies the rowi
2db70 64 0a 20 20 2a 2a 20 76 61 6c 75 65 2c 20 74 68  d.  ** value, th
2db80 65 6e 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  en this operatio
2db90 6e 20 72 65 71 75 69 72 65 73 20 63 6f 6e 73 74  n requires const
2dba0 72 61 69 6e 74 20 68 61 6e 64 6c 69 6e 67 2e 0a  raint handling..
2dbb0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
2dbc0 20 6f 6e 2d 63 6f 6e 66 6c 69 63 74 20 6d 6f 64   on-conflict mod
2dbd0 65 20 69 73 20 52 45 50 4c 41 43 45 2c 20 74 68  e is REPLACE, th
2dbe0 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
2dbf0 65 20 65 78 69 73 74 69 6e 67 20 72 6f 77 0a 20  e existing row. 
2dc00 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 64 65   ** should be de
2dc10 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64  leted from the d
2dc20 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 69  atabase before i
2dc30 6e 73 65 72 74 69 6e 67 20 74 68 65 20 6e 65 77  nserting the new
2dc40 20 72 6f 77 2e 20 4f 72 2c 0a 20 20 2a 2a 20 69   row. Or,.  ** i
2dc50 66 20 74 68 65 20 6f 6e 2d 63 6f 6e 66 6c 69 63  f the on-conflic
2dc60 74 20 6d 6f 64 65 20 69 73 20 6f 74 68 65 72 20  t mode is other 
2dc70 74 68 61 6e 20 52 45 50 4c 41 43 45 2c 20 74 68  than REPLACE, th
2dc80 65 6e 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6d  en this method m
2dc90 75 73 74 0a 20 20 2a 2a 20 64 65 74 65 63 74 20  ust.  ** detect 
2dca0 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6e 64  the conflict and
2dcb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2dcc0 4f 4e 53 54 52 41 49 4e 54 20 62 65 66 6f 72 65  ONSTRAINT before
2dcd0 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 20 20   beginning to.  
2dce0 2a 2a 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61  ** modify the da
2dcf0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
2dd00 2f 0a 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26  /.  if( nArg>1 &
2dd10 26 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c  & p->zContentTbl
2dd20 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69  ==0 ){.    /* Fi
2dd30 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 62 6a  nd the value obj
2dd40 65 63 74 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ect that holds t
2dd50 68 65 20 6e 65 77 20 72 6f 77 69 64 20 76 61 6c  he new rowid val
2dd60 75 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ue. */.    sqlit
2dd70 65 33 5f 76 61 6c 75 65 20 2a 70 4e 65 77 52 6f  e3_value *pNewRo
2dd80 77 69 64 20 3d 20 61 70 56 61 6c 5b 33 2b 70 2d  wid = apVal[3+p-
2dd90 3e 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 69  >nColumn];.    i
2dda0 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
2ddb0 5f 74 79 70 65 28 70 4e 65 77 52 6f 77 69 64 29  _type(pNewRowid)
2ddc0 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b  ==SQLITE_NULL ){
2ddd0 0a 20 20 20 20 20 20 70 4e 65 77 52 6f 77 69 64  .      pNewRowid
2dde0 20 3d 20 61 70 56 61 6c 5b 31 5d 3b 0a 20 20 20   = apVal[1];.   
2ddf0 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69   }..    if( sqli
2de00 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70  te3_value_type(p
2de10 4e 65 77 52 6f 77 69 64 29 21 3d 53 51 4c 49 54  NewRowid)!=SQLIT
2de20 45 5f 4e 55 4c 4c 20 26 26 20 28 20 0a 20 20 20  E_NULL && ( .   
2de30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
2de40 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 30 5d  ue_type(apVal[0]
2de50 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20  )==SQLITE_NULL. 
2de60 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 76      || sqlite3_v
2de70 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 56 61 6c  alue_int64(apVal
2de80 5b 30 5d 29 21 3d 73 71 6c 69 74 65 33 5f 76 61  [0])!=sqlite3_va
2de90 6c 75 65 5f 69 6e 74 36 34 28 70 4e 65 77 52 6f  lue_int64(pNewRo
2dea0 77 69 64 29 0a 20 20 20 20 29 29 7b 0a 20 20 20  wid).    )){.   
2deb0 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f     /* The new ro
2dec0 77 69 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  wid is not NULL 
2ded0 28 69 6e 20 74 68 69 73 20 63 61 73 65 20 74 68  (in this case th
2dee0 65 20 72 6f 77 69 64 20 77 69 6c 6c 20 62 65 0a  e rowid will be.
2def0 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74        ** automat
2df00 69 63 61 6c 6c 79 20 61 73 73 69 67 6e 65 64 20  ically assigned 
2df10 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
2df20 63 68 61 6e 63 65 20 6f 66 20 61 20 63 6f 6e 66  chance of a conf
2df30 6c 69 63 74 29 2c 20 61 6e 64 20 0a 20 20 20 20  lict), and .    
2df40 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
2df50 6e 74 20 69 73 20 65 69 74 68 65 72 20 61 6e 20  nt is either an 
2df60 49 4e 53 45 52 54 20 6f 72 20 61 6e 20 55 50 44  INSERT or an UPD
2df70 41 54 45 20 74 68 61 74 20 6d 6f 64 69 66 69 65  ATE that modifie
2df80 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72  s the.      ** r
2df90 6f 77 69 64 20 63 6f 6c 75 6d 6e 2e 20 53 6f 20  owid column. So 
2dfa0 69 66 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20  if the conflict 
2dfb0 6d 6f 64 65 20 69 73 20 52 45 50 4c 41 43 45 2c  mode is REPLACE,
2dfc0 20 74 68 65 6e 20 64 65 6c 65 74 65 20 61 6e 79   then delete any
2dfd0 0a 20 20 20 20 20 20 2a 2a 20 65 78 69 73 74 69  .      ** existi
2dfe0 6e 67 20 72 6f 77 20 77 69 74 68 20 72 6f 77 69  ng row with rowi
2dff0 64 3d 70 4e 65 77 52 6f 77 69 64 2e 20 0a 20 20  d=pNewRowid. .  
2e000 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2e010 4f 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 66 6c  Or, if the confl
2e020 69 63 74 20 6d 6f 64 65 20 69 73 20 6e 6f 74 20  ict mode is not 
2e030 52 45 50 4c 41 43 45 2c 20 69 6e 73 65 72 74 20  REPLACE, insert 
2e040 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 69  the new record i
2e050 6e 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  nto .      ** th
2e060 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c  e %_content tabl
2e070 65 2e 20 49 66 20 77 65 20 68 69 74 20 74 68 65  e. If we hit the
2e080 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77 69 64   duplicate rowid
2e090 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 6f 72 20   constraint (or 
2e0a0 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  any.      ** oth
2e0b0 65 72 20 65 72 72 6f 72 29 20 77 68 69 6c 65 20  er error) while 
2e0c0 64 6f 69 6e 67 20 73 6f 2c 20 72 65 74 75 72 6e  doing so, return
2e0d0 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
2e0e0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2e0f0 54 68 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20  This branch may 
2e100 61 6c 73 6f 20 72 75 6e 20 69 66 20 70 4e 65 77  also run if pNew
2e110 52 6f 77 69 64 20 63 6f 6e 74 61 69 6e 73 20 61  Rowid contains a
2e120 20 76 61 6c 75 65 20 74 68 61 74 20 63 61 6e 6e   value that cann
2e130 6f 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 6c  ot.      ** be l
2e140 6f 73 73 6c 65 73 73 6c 79 20 63 6f 6e 76 65 72  osslessly conver
2e150 74 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  ted to an intege
2e160 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  r. In this case,
2e170 20 74 68 65 20 65 76 65 6e 74 75 61 6c 20 0a 20   the eventual . 
2e180 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
2e190 66 74 73 33 49 6e 73 65 72 74 44 61 74 61 28 29  fts3InsertData()
2e1a0 20 28 65 69 74 68 65 72 20 6a 75 73 74 20 62 65   (either just be
2e1b0 6c 6f 77 20 6f 72 20 66 75 72 74 68 65 72 20 6f  low or further o
2e1c0 6e 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 20  n in this.      
2e1d0 2a 2a 20 66 75 6e 63 74 69 6f 6e 29 20 77 69 6c  ** function) wil
2e1e0 6c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  l return SQLITE_
2e1f0 4d 49 53 4d 41 54 43 48 2e 20 49 66 20 66 74 73  MISMATCH. If fts
2e200 33 44 65 6c 65 74 65 42 79 52 6f 77 69 64 20 69  3DeleteByRowid i
2e210 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 6f  s .      ** invo
2e220 6b 65 64 2c 20 69 74 20 77 69 6c 6c 20 64 65 6c  ked, it will del
2e230 65 74 65 20 7a 65 72 6f 20 72 6f 77 73 20 28 73  ete zero rows (s
2e240 69 6e 63 65 20 6e 6f 20 72 6f 77 20 77 69 6c 6c  ince no row will
2e250 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 64   have.      ** d
2e260 6f 63 69 64 3d 24 70 4e 65 77 52 6f 77 69 64 20  ocid=$pNewRowid 
2e270 69 66 20 24 70 4e 65 77 52 6f 77 69 64 20 69 73  if $pNewRowid is
2e280 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
2e290 76 61 6c 75 65 29 2e 0a 20 20 20 20 20 20 2a 2f  value)..      */
2e2a0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2e2b0 65 33 5f 76 74 61 62 5f 6f 6e 5f 63 6f 6e 66 6c  e3_vtab_on_confl
2e2c0 69 63 74 28 70 2d 3e 64 62 29 3d 3d 53 51 4c 49  ict(p->db)==SQLI
2e2d0 54 45 5f 52 45 50 4c 41 43 45 20 29 7b 0a 20 20  TE_REPLACE ){.  
2e2e0 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 44        rc = fts3D
2e2f0 65 6c 65 74 65 42 79 52 6f 77 69 64 28 70 2c 20  eleteByRowid(p, 
2e300 70 4e 65 77 52 6f 77 69 64 2c 20 26 6e 43 68 6e  pNewRowid, &nChn
2e310 67 2c 20 61 53 7a 44 65 6c 29 3b 0a 20 20 20 20  g, aSzDel);.    
2e320 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2e330 20 72 63 20 3d 20 66 74 73 33 49 6e 73 65 72 74   rc = fts3Insert
2e340 44 61 74 61 28 70 2c 20 61 70 56 61 6c 2c 20 70  Data(p, apVal, p
2e350 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
2e360 62 49 6e 73 65 72 74 44 6f 6e 65 20 3d 20 31 3b  bInsertDone = 1;
2e370 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2e380 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
2e390 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
2e3a0 74 6f 20 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20  to update_out;. 
2e3b0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
2e3c0 20 69 73 20 61 20 44 45 4c 45 54 45 20 6f 72 20   is a DELETE or 
2e3d0 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e  UPDATE operation
2e3e0 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 6c 64  , remove the old
2e3f0 20 72 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 69 66   record. */.  if
2e400 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
2e410 74 79 70 65 28 61 70 56 61 6c 5b 30 5d 29 21 3d  type(apVal[0])!=
2e420 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20  SQLITE_NULL ){. 
2e430 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2e440 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70  e3_value_type(ap
2e450 56 61 6c 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f  Val[0])==SQLITE_
2e460 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 72  INTEGER );.    r
2e470 63 20 3d 20 66 74 73 33 44 65 6c 65 74 65 42 79  c = fts3DeleteBy
2e480 52 6f 77 69 64 28 70 2c 20 61 70 56 61 6c 5b 30  Rowid(p, apVal[0
2e490 5d 2c 20 26 6e 43 68 6e 67 2c 20 61 53 7a 44 65  ], &nChng, aSzDe
2e4a0 6c 29 3b 0a 20 20 20 20 69 73 52 65 6d 6f 76 65  l);.    isRemove
2e4b0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
2e4c0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
2e4d0 49 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54 45  INSERT or UPDATE
2e4e0 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 73 65   operation, inse
2e4f0 72 74 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  rt the new recor
2e500 64 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67  d. */.  if( nArg
2e510 3e 31 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  >1 && rc==SQLITE
2e520 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  _OK ){.    int i
2e530 4c 61 6e 67 69 64 20 3d 20 73 71 6c 69 74 65 33  Langid = sqlite3
2e540 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c  _value_int(apVal
2e550 5b 32 20 2b 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20  [2 + p->nColumn 
2e560 2b 20 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 62  + 2]);.    if( b
2e570 49 6e 73 65 72 74 44 6f 6e 65 3d 3d 30 20 29 7b  InsertDone==0 ){
2e580 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33  .      rc = fts3
2e590 49 6e 73 65 72 74 44 61 74 61 28 70 2c 20 61 70  InsertData(p, ap
2e5a0 56 61 6c 2c 20 70 52 6f 77 69 64 29 3b 0a 20 20  Val, pRowid);.  
2e5b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2e5c0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26  TE_CONSTRAINT &&
2e5d0 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d   p->zContentTbl=
2e5e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
2e5f0 20 3d 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56   = FTS_CORRUPT_V
2e600 54 41 42 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  TAB;.      }.   
2e610 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
2e620 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 21 69 73  QLITE_OK && (!is
2e630 52 65 6d 6f 76 65 20 7c 7c 20 2a 70 52 6f 77 69  Remove || *pRowi
2e640 64 21 3d 70 2d 3e 69 50 72 65 76 44 6f 63 69 64  d!=p->iPrevDocid
2e650 20 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   ) ){.      rc =
2e660 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d   fts3PendingTerm
2e670 73 44 6f 63 69 64 28 70 2c 20 69 4c 61 6e 67 69  sDocid(p, iLangi
2e680 64 2c 20 2a 70 52 6f 77 69 64 29 3b 0a 20 20 20  d, *pRowid);.   
2e690 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
2e6a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e6b0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 50 72    assert( p->iPr
2e6c0 65 76 44 6f 63 69 64 3d 3d 2a 70 52 6f 77 69 64  evDocid==*pRowid
2e6d0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   );.      rc = f
2e6e0 74 73 33 49 6e 73 65 72 74 54 65 72 6d 73 28 70  ts3InsertTerms(p
2e6f0 2c 20 69 4c 61 6e 67 69 64 2c 20 61 70 56 61 6c  , iLangid, apVal
2e700 2c 20 61 53 7a 49 6e 73 29 3b 0a 20 20 20 20 7d  , aSzIns);.    }
2e710 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 48 61 73  .    if( p->bHas
2e720 44 6f 63 73 69 7a 65 20 29 7b 0a 20 20 20 20 20  Docsize ){.     
2e730 20 66 74 73 33 49 6e 73 65 72 74 44 6f 63 73 69   fts3InsertDocsi
2e740 7a 65 28 26 72 63 2c 20 70 2c 20 61 53 7a 49 6e  ze(&rc, p, aSzIn
2e750 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43  s);.    }.    nC
2e760 68 6e 67 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66  hng++;.  }..  if
2e770 28 20 70 2d 3e 62 46 74 73 34 20 29 7b 0a 20 20  ( p->bFts4 ){.  
2e780 20 20 66 74 73 33 55 70 64 61 74 65 44 6f 63 54    fts3UpdateDocT
2e790 6f 74 61 6c 73 28 26 72 63 2c 20 70 2c 20 61 53  otals(&rc, p, aS
2e7a0 7a 49 6e 73 2c 20 61 53 7a 44 65 6c 2c 20 6e 43  zIns, aSzDel, nC
2e7b0 68 6e 67 29 3b 0a 20 20 7d 0a 0a 20 75 70 64 61  hng);.  }.. upda
2e7c0 74 65 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  te_out:.  sqlite
2e7d0 33 5f 66 72 65 65 28 61 53 7a 44 65 6c 29 3b 0a  3_free(aSzDel);.
2e7e0 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67    sqlite3Fts3Seg
2e7f0 6d 65 6e 74 73 43 6c 6f 73 65 28 70 29 3b 0a 20  mentsClose(p);. 
2e800 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2e810 2a 20 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20  * .** Flush any 
2e820 64 61 74 61 20 69 6e 20 74 68 65 20 70 65 6e 64  data in the pend
2e830 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20 74  ing-terms hash t
2e840 61 62 6c 65 20 74 6f 20 64 69 73 6b 2e 20 49 66  able to disk. If
2e850 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20   successful,.** 
2e860 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d 65 6e  merge all segmen
2e870 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ts in the databa
2e880 73 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 68  se (including th
2e890 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 2c 20 69  e new segment, i
2e8a0 66 20 0a 2a 2a 20 74 68 65 72 65 20 77 61 73 20  f .** there was 
2e8b0 61 6e 79 20 64 61 74 61 20 74 6f 20 66 6c 75 73  any data to flus
2e8c0 68 29 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  h) into a single
2e8d0 20 73 65 67 6d 65 6e 74 2e 20 0a 2a 2f 0a 69 6e   segment. .*/.in
2e8e0 74 20 73 71 6c 69 74 65 33 46 74 73 33 4f 70 74  t sqlite3Fts3Opt
2e8f0 69 6d 69 7a 65 28 46 74 73 33 54 61 62 6c 65 20  imize(Fts3Table 
2e900 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
2e910 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
2e920 65 63 28 70 2d 3e 64 62 2c 20 22 53 41 56 45 50  ec(p->db, "SAVEP
2e930 4f 49 4e 54 20 66 74 73 33 22 2c 20 30 2c 20 30  OINT fts3", 0, 0
2e940 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
2e950 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e960 20 72 63 20 3d 20 66 74 73 33 44 6f 4f 70 74 69   rc = fts3DoOpti
2e970 6d 69 7a 65 28 70 2c 20 31 29 3b 0a 20 20 20 20  mize(p, 1);.    
2e980 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2e990 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
2e9a0 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 6e  DONE ){.      in
2e9b0 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f  t rc2 = sqlite3_
2e9c0 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c  exec(p->db, "REL
2e9d0 45 41 53 45 20 66 74 73 33 22 2c 20 30 2c 20 30  EASE fts3", 0, 0
2e9e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2e9f0 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
2ea00 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
2ea10 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
2ea20 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
2ea30 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 66 74 73  "ROLLBACK TO fts
2ea40 33 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  3", 0, 0, 0);.  
2ea50 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
2ea60 28 70 2d 3e 64 62 2c 20 22 52 45 4c 45 41 53 45  (p->db, "RELEASE
2ea70 20 66 74 73 33 22 2c 20 30 2c 20 30 2c 20 30 29   fts3", 0, 0, 0)
2ea80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
2ea90 6c 69 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74  lite3Fts3Segment
2eaa0 73 43 6c 6f 73 65 28 70 29 3b 0a 20 20 72 65 74  sClose(p);.  ret
2eab0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69  urn rc;.}..#endi
2eac0 66 0a                                            f.