/ Hex Artifact Content
Login

Artifact fb0456fa1407758f82458417c76fe4b06c86be98:


0000: 2f 2a 0a 2a 2a 20 32 30 30 39 20 4f 63 74 20 32  /*.** 2009 Oct 2
0010: 33 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  3.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 69 73 20 70 61 72 74 20 6f 66   file is part of
0190: 20 74 68 65 20 53 51 4c 69 74 65 20 46 54 53 33   the SQLite FTS3
01a0: 20 65 78 74 65 6e 73 69 6f 6e 20 6d 6f 64 75 6c   extension modul
01b0: 65 2e 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c  e. Specifically,
01c0: 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 20 63 6f  .** this file co
01d0: 6e 74 61 69 6e 73 20 63 6f 64 65 20 74 6f 20 69  ntains code to i
01e0: 6e 73 65 72 74 2c 20 75 70 64 61 74 65 20 61 6e  nsert, update an
01f0: 64 20 64 65 6c 65 74 65 20 72 6f 77 73 20 66 72  d delete rows fr
0200: 6f 6d 20 46 54 53 33 0a 2a 2a 20 74 61 62 6c 65  om FTS3.** table
0210: 73 2e 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61  s. It also conta
0220: 69 6e 73 20 63 6f 64 65 20 74 6f 20 6d 65 72 67  ins code to merg
0230: 65 20 46 54 53 33 20 62 2d 74 72 65 65 20 73 65  e FTS3 b-tree se
0240: 67 6d 65 6e 74 73 2e 20 53 6f 6d 65 0a 2a 2a 20  gments. Some.** 
0250: 6f 66 20 74 68 65 20 73 75 62 2d 72 6f 75 74 69  of the sub-routi
0260: 6e 65 73 20 75 73 65 64 20 74 6f 20 6d 65 72 67  nes used to merg
0270: 65 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20 61  e segments are a
0280: 6c 73 6f 20 75 73 65 64 20 62 79 20 74 68 65 20  lso used by the 
0290: 71 75 65 72 79 20 0a 2a 2a 20 63 6f 64 65 20 69  query .** code i
02a0: 6e 20 66 74 73 33 2e 63 2e 0a 2a 2f 0a 0a 23 69  n fts3.c..*/..#i
02b0: 6e 63 6c 75 64 65 20 22 66 74 73 33 49 6e 74 2e  nclude "fts3Int.
02c0: 68 22 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  h".#if !defined(
02d0: 53 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20  SQLITE_CORE) || 
02e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
02f0: 4e 41 42 4c 45 5f 46 54 53 33 29 0a 0a 23 69 6e  NABLE_FTS3)..#in
0300: 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e  clude <string.h>
0310: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  .#include <asser
0320: 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  t.h>.#include <s
0330: 74 64 6c 69 62 2e 68 3e 0a 0a 0a 23 64 65 66 69  tdlib.h>...#defi
0340: 6e 65 20 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e  ne FTS_MAX_APPEN
0350: 44 41 42 4c 45 5f 48 45 49 47 48 54 20 31 36 0a  DABLE_HEIGHT 16.
0360: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 66 75 6c 6c  ./*.** When full
0370: 2d 74 65 78 74 20 69 6e 64 65 78 20 6e 6f 64 65  -text index node
0380: 73 20 61 72 65 20 6c 6f 61 64 65 64 20 66 72 6f  s are loaded fro
0390: 6d 20 64 69 73 6b 2c 20 74 68 65 20 62 75 66 66  m disk, the buff
03a0: 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20  er that they.** 
03b0: 61 72 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20  are loaded into 
03c0: 68 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  has the followin
03d0: 67 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  g number of byte
03e0: 73 20 6f 66 20 70 61 64 64 69 6e 67 20 61 74 20  s of padding at 
03f0: 74 68 65 20 65 6e 64 20 0a 2a 2a 20 6f 66 20 69  the end .** of i
0400: 74 2e 20 69 2e 65 2e 20 69 66 20 61 20 66 75 6c  t. i.e. if a ful
0410: 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 6e 6f 64  l-text index nod
0420: 65 20 69 73 20 39 30 30 20 62 79 74 65 73 20 69  e is 900 bytes i
0430: 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 61 20 62  n size, then a b
0440: 75 66 66 65 72 0a 2a 2a 20 6f 66 20 39 32 30 20  uffer.** of 920 
0450: 62 79 74 65 73 20 69 73 20 61 6c 6c 6f 63 61 74  bytes is allocat
0460: 65 64 20 66 6f 72 20 69 74 2e 0a 2a 2a 0a 2a 2a  ed for it..**.**
0470: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
0480: 20 69 66 20 77 65 20 68 61 76 65 20 61 20 70 6f   if we have a po
0490: 69 6e 74 65 72 20 69 6e 74 6f 20 61 20 62 75 66  inter into a buf
04a0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e  fer containing n
04b0: 6f 64 65 20 64 61 74 61 2c 0a 2a 2a 20 69 74 20  ode data,.** it 
04c0: 69 73 20 61 6c 77 61 79 73 20 73 61 66 65 20 74  is always safe t
04d0: 6f 20 72 65 61 64 20 75 70 20 74 6f 20 74 77 6f  o read up to two
04e0: 20 76 61 72 69 6e 74 73 20 66 72 6f 6d 20 69 74   varints from it
04f0: 20 77 69 74 68 6f 75 74 20 72 69 73 6b 69 6e 67   without risking
0500: 20 61 6e 0a 2a 2a 20 6f 76 65 72 72 65 61 64 2c   an.** overread,
0510: 20 65 76 65 6e 20 69 66 20 74 68 65 20 6e 6f 64   even if the nod
0520: 65 20 64 61 74 61 20 69 73 20 63 6f 72 72 75 70  e data is corrup
0530: 74 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ted..*/.#define 
0540: 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49 4e  FTS3_NODE_PADDIN
0550: 47 20 28 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d  G (FTS3_VARINT_M
0560: 41 58 2a 32 29 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64  AX*2)../*.** Und
0570: 65 72 20 63 65 72 74 61 69 6e 20 63 69 72 63 75  er certain circu
0580: 6d 73 74 61 6e 63 65 73 2c 20 62 2d 74 72 65 65  mstances, b-tree
0590: 20 6e 6f 64 65 73 20 28 64 6f 63 6c 69 73 74 73   nodes (doclists
05a0: 29 20 63 61 6e 20 62 65 20 6c 6f 61 64 65 64 20  ) can be loaded 
05b0: 69 6e 74 6f 0a 2a 2a 20 6d 65 6d 6f 72 79 20 69  into.** memory i
05c0: 6e 63 72 65 6d 65 6e 74 61 6c 6c 79 20 69 6e 73  ncrementally ins
05d0: 74 65 61 64 20 6f 66 20 61 6c 6c 20 61 74 20 6f  tead of all at o
05e0: 6e 63 65 2e 20 54 68 69 73 20 63 61 6e 20 62 65  nce. This can be
05f0: 20 61 20 62 69 67 20 70 65 72 66 6f 72 6d 61 6e   a big performan
0600: 63 65 0a 2a 2a 20 77 69 6e 20 28 72 65 64 75 63  ce.** win (reduc
0610: 65 64 20 49 4f 20 61 6e 64 20 43 50 55 29 20 69  ed IO and CPU) i
0620: 66 20 53 51 4c 69 74 65 20 73 74 6f 70 73 20 63  f SQLite stops c
0630: 61 6c 6c 69 6e 67 20 74 68 65 20 76 69 72 74 75  alling the virtu
0640: 61 6c 20 74 61 62 6c 65 20 78 4e 65 78 74 28 29  al table xNext()
0650: 0a 2a 2a 20 6d 65 74 68 6f 64 20 62 65 66 6f 72  .** method befor
0660: 65 20 72 65 74 72 69 65 76 69 6e 67 20 61 6c 6c  e retrieving all
0670: 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 28   query results (
0680: 61 73 20 6d 61 79 20 68 61 70 70 65 6e 2c 20 66  as may happen, f
0690: 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 69  or example,.** i
06a0: 66 20 61 20 71 75 65 72 79 20 68 61 73 20 61 20  f a query has a 
06b0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 29 2e 0a 2a  LIMIT clause)..*
06c0: 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 61 6c  *.** Incremental
06d0: 20 6c 6f 61 64 69 6e 67 20 69 73 20 75 73 65 64   loading is used
06e0: 20 66 6f 72 20 62 2d 74 72 65 65 20 6e 6f 64 65   for b-tree node
06f0: 73 20 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e  s FTS3_NODE_CHUN
0700: 4b 5f 54 48 52 45 53 48 4f 4c 44 20 0a 2a 2a 20  K_THRESHOLD .** 
0710: 62 79 74 65 73 20 61 6e 64 20 6c 61 72 67 65 72  bytes and larger
0720: 2e 20 4e 6f 64 65 73 20 61 72 65 20 6c 6f 61 64  . Nodes are load
0730: 65 64 20 69 6e 20 63 68 75 6e 6b 73 20 6f 66 20  ed in chunks of 
0740: 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 53  FTS3_NODE_CHUNKS
0750: 49 5a 45 20 62 79 74 65 73 2e 0a 2a 2a 20 54 68  IZE bytes..** Th
0760: 65 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  e code is writte
0770: 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 68 61  n so that the ha
0780: 72 64 20 6c 6f 77 65 72 2d 6c 69 6d 69 74 20 66  rd lower-limit f
0790: 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 73 65  or each of these
07a0: 20 76 61 6c 75 65 73 20 0a 2a 2a 20 69 73 20 31   values .** is 1
07b0: 2e 20 43 6c 65 61 72 6c 79 20 73 75 63 68 20 73  . Clearly such s
07c0: 6d 61 6c 6c 20 76 61 6c 75 65 73 20 77 6f 75 6c  mall values woul
07d0: 64 20 62 65 20 69 6e 65 66 66 69 63 69 65 6e 74  d be inefficient
07e0: 2c 20 62 75 74 20 63 61 6e 20 62 65 20 75 73 65  , but can be use
07f0: 66 75 6c 20 0a 2a 2a 20 66 6f 72 20 74 65 73 74  ful .** for test
0800: 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2a  ing purposes..**
0810: 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 6f 64 75  .** If this modu
0820: 6c 65 20 69 73 20 62 75 69 6c 74 20 77 69 74 68  le is built with
0830: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 64 65 66   SQLITE_TEST def
0840: 69 6e 65 64 2c 20 74 68 65 73 65 20 63 6f 6e 73  ined, these cons
0850: 74 61 6e 74 73 20 6d 61 79 0a 2a 2a 20 62 65 20  tants may.** be 
0860: 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75  overridden at ru
0870: 6e 74 69 6d 65 20 66 6f 72 20 74 65 73 74 69 6e  ntime for testin
0880: 67 20 70 75 72 70 6f 73 65 73 2e 20 46 69 6c 65  g purposes. File
0890: 20 66 74 73 33 5f 74 65 73 74 2e 63 20 63 6f 6e   fts3_test.c con
08a0: 74 61 69 6e 73 0a 2a 2a 20 61 20 54 63 6c 20 69  tains.** a Tcl i
08b0: 6e 74 65 72 66 61 63 65 20 74 6f 20 72 65 61 64  nterface to read
08c0: 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 76   and write the v
08d0: 61 6c 75 65 73 2e 0a 2a 2f 0a 23 69 66 64 65 66  alues..*/.#ifdef
08e0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
08f0: 20 74 65 73 74 5f 66 74 73 33 5f 6e 6f 64 65 5f   test_fts3_node_
0900: 63 68 75 6e 6b 73 69 7a 65 20 3d 20 28 34 2a 31  chunksize = (4*1
0910: 30 32 34 29 3b 0a 69 6e 74 20 74 65 73 74 5f 66  024);.int test_f
0920: 74 73 33 5f 6e 6f 64 65 5f 63 68 75 6e 6b 5f 74  ts3_node_chunk_t
0930: 68 72 65 73 68 6f 6c 64 20 3d 20 28 34 2a 31 30  hreshold = (4*10
0940: 32 34 29 2a 34 3b 0a 23 20 64 65 66 69 6e 65 20  24)*4;.# define 
0950: 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 53  FTS3_NODE_CHUNKS
0960: 49 5a 45 20 20 20 20 20 20 20 74 65 73 74 5f 66  IZE       test_f
0970: 74 73 33 5f 6e 6f 64 65 5f 63 68 75 6e 6b 73 69  ts3_node_chunksi
0980: 7a 65 0a 23 20 64 65 66 69 6e 65 20 46 54 53 33  ze.# define FTS3
0990: 5f 4e 4f 44 45 5f 43 48 55 4e 4b 5f 54 48 52 45  _NODE_CHUNK_THRE
09a0: 53 48 4f 4c 44 20 74 65 73 74 5f 66 74 73 33 5f  SHOLD test_fts3_
09b0: 6e 6f 64 65 5f 63 68 75 6e 6b 5f 74 68 72 65 73  node_chunk_thres
09c0: 68 6f 6c 64 0a 23 65 6c 73 65 0a 23 20 64 65 66  hold.#else.# def
09d0: 69 6e 65 20 46 54 53 33 5f 4e 4f 44 45 5f 43 48  ine FTS3_NODE_CH
09e0: 55 4e 4b 53 49 5a 45 20 28 34 2a 31 30 32 34 29  UNKSIZE (4*1024)
09f0: 20 0a 23 20 64 65 66 69 6e 65 20 46 54 53 33 5f   .# define FTS3_
0a00: 4e 4f 44 45 5f 43 48 55 4e 4b 5f 54 48 52 45 53  NODE_CHUNK_THRES
0a10: 48 4f 4c 44 20 28 46 54 53 33 5f 4e 4f 44 45 5f  HOLD (FTS3_NODE_
0a20: 43 48 55 4e 4b 53 49 5a 45 2a 34 29 0a 23 65 6e  CHUNKSIZE*4).#en
0a30: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  dif../*.** The t
0a40: 77 6f 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d  wo values that m
0a50: 61 79 20 62 65 20 6d 65 61 6e 69 6e 67 66 75 6c  ay be meaningful
0a60: 6c 79 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 20  ly bound to the 
0a70: 3a 31 20 70 61 72 61 6d 65 74 65 72 20 69 6e 0a  :1 parameter in.
0a80: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 53 51  ** statements SQ
0a90: 4c 5f 52 45 50 4c 41 43 45 5f 53 54 41 54 20 61  L_REPLACE_STAT a
0aa0: 6e 64 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 54  nd SQL_SELECT_ST
0ab0: 41 54 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46  AT..*/.#define F
0ac0: 54 53 5f 53 54 41 54 5f 44 4f 43 54 4f 54 41 4c  TS_STAT_DOCTOTAL
0ad0: 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20        0.#define 
0ae0: 46 54 53 5f 53 54 41 54 5f 49 4e 43 52 4d 45 52  FTS_STAT_INCRMER
0af0: 47 45 48 49 4e 54 20 31 0a 23 64 65 66 69 6e 65  GEHINT 1.#define
0b00: 20 46 54 53 5f 53 54 41 54 5f 41 55 54 4f 49 4e   FTS_STAT_AUTOIN
0b10: 43 52 4d 45 52 47 45 20 32 0a 0a 2f 2a 0a 2a 2a  CRMERGE 2../*.**
0b20: 20 49 66 20 46 54 53 5f 4c 4f 47 5f 4d 45 52 47   If FTS_LOG_MERG
0b30: 45 53 20 69 73 20 64 65 66 69 6e 65 64 2c 20 63  ES is defined, c
0b40: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  all sqlite3_log(
0b50: 29 20 74 6f 20 72 65 70 6f 72 74 20 65 61 63 68  ) to report each
0b60: 20 61 75 74 6f 6d 61 74 69 63 0a 2a 2a 20 61 6e   automatic.** an
0b70: 64 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  d incremental me
0b80: 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 20 74 68  rge operation th
0b90: 61 74 20 74 61 6b 65 73 20 70 6c 61 63 65 2e 20  at takes place. 
0ba0: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
0bb0: 20 0a 2a 2a 20 64 65 62 75 67 67 69 6e 67 20 46   .** debugging F
0bc0: 54 53 20 6f 6e 6c 79 2c 20 69 74 20 73 68 6f 75  TS only, it shou
0bd0: 6c 64 20 6e 6f 74 20 75 73 75 61 6c 6c 79 20 62  ld not usually b
0be0: 65 20 74 75 72 6e 65 64 20 6f 6e 20 69 6e 20 70  e turned on in p
0bf0: 72 6f 64 75 63 74 69 6f 6e 0a 2a 2a 20 73 79 73  roduction.** sys
0c00: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  tems..*/.#ifdef 
0c10: 46 54 53 33 5f 4c 4f 47 5f 4d 45 52 47 45 53 0a  FTS3_LOG_MERGES.
0c20: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
0c30: 4c 6f 67 4d 65 72 67 65 28 69 6e 74 20 6e 4d 65  LogMerge(int nMe
0c40: 72 67 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  rge, sqlite3_int
0c50: 36 34 20 69 41 62 73 4c 65 76 65 6c 29 7b 0a 20  64 iAbsLevel){. 
0c60: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
0c70: 49 54 45 5f 4f 4b 2c 20 22 25 64 2d 77 61 79 20  ITE_OK, "%d-way 
0c80: 6d 65 72 67 65 20 66 72 6f 6d 20 6c 65 76 65 6c  merge from level
0c90: 20 25 64 22 2c 20 6e 4d 65 72 67 65 2c 20 28 69   %d", nMerge, (i
0ca0: 6e 74 29 69 41 62 73 4c 65 76 65 6c 29 3b 0a 7d  nt)iAbsLevel);.}
0cb0: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 66  .#else.#define f
0cc0: 74 73 33 4c 6f 67 4d 65 72 67 65 28 78 2c 20 79  ts3LogMerge(x, y
0cd0: 29 0a 23 65 6e 64 69 66 0a 0a 0a 74 79 70 65 64  ).#endif...typed
0ce0: 65 66 20 73 74 72 75 63 74 20 50 65 6e 64 69 6e  ef struct Pendin
0cf0: 67 4c 69 73 74 20 50 65 6e 64 69 6e 67 4c 69 73  gList PendingLis
0d00: 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  t;.typedef struc
0d10: 74 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 53 65  t SegmentNode Se
0d20: 67 6d 65 6e 74 4e 6f 64 65 3b 0a 74 79 70 65 64  gmentNode;.typed
0d30: 65 66 20 73 74 72 75 63 74 20 53 65 67 6d 65 6e  ef struct Segmen
0d40: 74 57 72 69 74 65 72 20 53 65 67 6d 65 6e 74 57  tWriter SegmentW
0d50: 72 69 74 65 72 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  riter;../*.** An
0d60: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
0d70: 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 61 74 61 20   following data 
0d80: 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65  structure is use
0d90: 64 20 74 6f 20 62 75 69 6c 64 20 64 6f 63 6c 69  d to build docli
0da0: 73 74 73 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74  sts.** increment
0db0: 61 6c 6c 79 2e 20 53 65 65 20 66 75 6e 63 74 69  ally. See functi
0dc0: 6f 6e 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69  on fts3PendingLi
0dd0: 73 74 41 70 70 65 6e 64 28 29 20 66 6f 72 20 64  stAppend() for d
0de0: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 73 74 72 75 63  etails..*/.struc
0df0: 74 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 7b 0a  t PendingList {.
0e00: 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20 20 63    int nData;.  c
0e10: 68 61 72 20 2a 61 44 61 74 61 3b 0a 20 20 69 6e  har *aData;.  in
0e20: 74 20 6e 53 70 61 63 65 3b 0a 20 20 73 71 6c 69  t nSpace;.  sqli
0e30: 74 65 33 5f 69 6e 74 36 34 20 69 4c 61 73 74 44  te3_int64 iLastD
0e40: 6f 63 69 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ocid;.  sqlite3_
0e50: 69 6e 74 36 34 20 69 4c 61 73 74 43 6f 6c 3b 0a  int64 iLastCol;.
0e60: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
0e70: 69 4c 61 73 74 50 6f 73 3b 0a 7d 3b 0a 0a 0a 2f  iLastPos;.};.../
0e80: 2a 0a 2a 2a 20 45 61 63 68 20 63 75 72 73 6f 72  *.** Each cursor
0e90: 20 68 61 73 20 61 20 28 70 6f 73 73 69 62 6c 79   has a (possibly
0ea0: 20 65 6d 70 74 79 29 20 6c 69 6e 6b 65 64 20 6c   empty) linked l
0eb0: 69 73 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ist of the follo
0ec0: 77 69 6e 67 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f  wing objects..*/
0ed0: 0a 73 74 72 75 63 74 20 46 74 73 33 44 65 66 65  .struct Fts3Defe
0ee0: 72 72 65 64 54 6f 6b 65 6e 20 7b 0a 20 20 46 74  rredToken {.  Ft
0ef0: 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70  s3PhraseToken *p
0f00: 54 6f 6b 65 6e 3b 20 20 20 20 20 20 20 20 2f 2a  Token;        /*
0f10: 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 6f 72 72   Pointer to corr
0f20: 65 73 70 6f 6e 64 69 6e 67 20 65 78 70 72 20 74  esponding expr t
0f30: 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43  oken */.  int iC
0f40: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
0f50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
0f60: 75 6d 6e 20 74 6f 6b 65 6e 20 6d 75 73 74 20 6f  umn token must o
0f70: 63 63 75 72 20 69 6e 20 2a 2f 0a 20 20 46 74 73  ccur in */.  Fts
0f80: 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a  3DeferredToken *
0f90: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20  pNext;       /* 
0fa0: 4e 65 78 74 20 69 6e 20 6c 69 73 74 20 6f 66 20  Next in list of 
0fb0: 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 73 20  deferred tokens 
0fc0: 2a 2f 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73 74  */.  PendingList
0fd0: 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20   *pList;        
0fe0: 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20       /* Doclist 
0ff0: 69 73 20 61 73 73 65 6d 62 6c 65 64 20 68 65 72  is assembled her
1000: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  e */.};../*.** A
1010: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
1020: 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
1030: 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
1040: 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 72 6d  through the term
1050: 73 20 6f 6e 0a 2a 2a 20 61 20 63 6f 6e 74 69 67  s on.** a contig
1060: 75 6f 75 73 20 73 65 74 20 6f 66 20 73 65 67 6d  uous set of segm
1070: 65 6e 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20  ent b-tree leaf 
1080: 6e 6f 64 65 73 2e 20 41 6c 74 68 6f 75 67 68 20  nodes. Although 
1090: 74 68 65 20 64 65 74 61 69 6c 73 20 6f 66 0a 2a  the details of.*
10a0: 2a 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  * this structure
10b0: 20 61 72 65 20 6f 6e 6c 79 20 6d 61 6e 69 70 75   are only manipu
10c0: 6c 61 74 65 64 20 62 79 20 63 6f 64 65 20 69 6e  lated by code in
10d0: 20 74 68 69 73 20 66 69 6c 65 2c 20 6f 70 61 71   this file, opaq
10e0: 75 65 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 6f 66  ue handles.** of
10f0: 20 74 79 70 65 20 46 74 73 33 53 65 67 52 65 61   type Fts3SegRea
1100: 64 65 72 2a 20 61 72 65 20 61 6c 73 6f 20 75 73  der* are also us
1110: 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20 66 74  ed by code in ft
1120: 73 33 2e 63 20 74 6f 20 69 74 65 72 61 74 65 20  s3.c to iterate 
1130: 74 68 72 6f 75 67 68 0a 2a 2a 20 74 65 72 6d 73  through.** terms
1140: 20 77 68 65 6e 20 71 75 65 72 79 69 6e 67 20 74   when querying t
1150: 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  he full-text ind
1160: 65 78 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e  ex. See function
1170: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69 74  s:.**.**   sqlit
1180: 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 4e  e3Fts3SegReaderN
1190: 65 77 28 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ew().**   sqlite
11a0: 33 46 74 73 33 53 65 67 52 65 61 64 65 72 46 72  3Fts3SegReaderFr
11b0: 65 65 28 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ee().**   sqlite
11c0: 33 46 74 73 33 53 65 67 52 65 61 64 65 72 49 74  3Fts3SegReaderIt
11d0: 65 72 61 74 65 28 29 0a 2a 2a 0a 2a 2a 20 4d 65  erate().**.** Me
11e0: 74 68 6f 64 73 20 75 73 65 64 20 74 6f 20 6d 61  thods used to ma
11f0: 6e 69 70 75 6c 61 74 65 20 46 74 73 33 53 65 67  nipulate Fts3Seg
1200: 52 65 61 64 65 72 20 73 74 72 75 63 74 75 72 65  Reader structure
1210: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 66 74 73 33 53  s:.**.**   fts3S
1220: 65 67 52 65 61 64 65 72 4e 65 78 74 28 29 0a 2a  egReaderNext().*
1230: 2a 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65  *   fts3SegReade
1240: 72 46 69 72 73 74 44 6f 63 69 64 28 29 0a 2a 2a  rFirstDocid().**
1250: 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72     fts3SegReader
1260: 4e 65 78 74 44 6f 63 69 64 28 29 0a 2a 2f 0a 73  NextDocid().*/.s
1270: 74 72 75 63 74 20 46 74 73 33 53 65 67 52 65 61  truct Fts3SegRea
1280: 64 65 72 20 7b 0a 20 20 69 6e 74 20 69 49 64 78  der {.  int iIdx
1290: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12a0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
12b0: 20 77 69 74 68 69 6e 20 6c 65 76 65 6c 2c 20 6f   within level, o
12c0: 72 20 30 78 37 46 46 46 46 46 46 46 20 66 6f 72  r 0x7FFFFFFF for
12d0: 20 50 54 20 2a 2f 0a 20 20 75 38 20 62 4c 6f 6f   PT */.  u8 bLoo
12e0: 6b 75 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  kup;            
12f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1300: 20 66 6f 72 20 61 20 6c 6f 6f 6b 75 70 20 6f 6e   for a lookup on
1310: 6c 79 20 2a 2f 0a 20 20 75 38 20 72 6f 6f 74 4f  ly */.  u8 rootO
1320: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
1330: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1340: 66 6f 72 20 61 20 72 6f 6f 74 2d 6f 6e 6c 79 20  for a root-only 
1350: 72 65 61 64 65 72 20 2a 2f 0a 0a 20 20 73 71 6c  reader */..  sql
1360: 69 74 65 33 5f 69 6e 74 36 34 20 69 53 74 61 72  ite3_int64 iStar
1370: 74 42 6c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20  tBlock;      /* 
1380: 52 6f 77 69 64 20 6f 66 20 66 69 72 73 74 20 6c  Rowid of first l
1390: 65 61 66 20 62 6c 6f 63 6b 20 74 6f 20 74 72 61  eaf block to tra
13a0: 76 65 72 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  verse */.  sqlit
13b0: 65 33 5f 69 6e 74 36 34 20 69 4c 65 61 66 45 6e  e3_int64 iLeafEn
13c0: 64 42 6c 6f 63 6b 3b 20 20 20 20 2f 2a 20 52 6f  dBlock;    /* Ro
13d0: 77 69 64 20 6f 66 20 66 69 6e 61 6c 20 6c 65 61  wid of final lea
13e0: 66 20 62 6c 6f 63 6b 20 74 6f 20 74 72 61 76 65  f block to trave
13f0: 72 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rse */.  sqlite3
1400: 5f 69 6e 74 36 34 20 69 45 6e 64 42 6c 6f 63 6b  _int64 iEndBlock
1410: 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  ;        /* Rowi
1420: 64 20 6f 66 20 66 69 6e 61 6c 20 62 6c 6f 63 6b  d of final block
1430: 20 69 6e 20 73 65 67 6d 65 6e 74 20 28 6f 72 20   in segment (or 
1440: 30 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  0) */.  sqlite3_
1450: 69 6e 74 36 34 20 69 43 75 72 72 65 6e 74 42 6c  int64 iCurrentBl
1460: 6f 63 6b 3b 20 20 20 20 2f 2a 20 43 75 72 72 65  ock;    /* Curre
1470: 6e 74 20 6c 65 61 66 20 62 6c 6f 63 6b 20 28 6f  nt leaf block (o
1480: 72 20 30 29 20 2a 2f 0a 0a 20 20 63 68 61 72 20  r 0) */..  char 
1490: 2a 61 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  *aNode;         
14a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
14b0: 69 6e 74 65 72 20 74 6f 20 6e 6f 64 65 20 64 61  inter to node da
14c0: 74 61 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  ta (or NULL) */.
14d0: 20 20 69 6e 74 20 6e 4e 6f 64 65 3b 20 20 20 20    int nNode;    
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
1500: 66 65 72 20 61 74 20 61 4e 6f 64 65 20 28 6f 72  fer at aNode (or
1510: 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f   0) */.  int nPo
1520: 70 75 6c 61 74 65 3b 20 20 20 20 20 20 20 20 20  pulate;         
1530: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e           /* If >
1540: 30 2c 20 62 79 74 65 73 20 6f 66 20 62 75 66 66  0, bytes of buff
1550: 65 72 20 61 4e 6f 64 65 5b 5d 20 6c 6f 61 64 65  er aNode[] loade
1560: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62  d */.  sqlite3_b
1570: 6c 6f 62 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20  lob *pBlob;     
1580: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74         /* If not
1590: 20 4e 55 4c 4c 2c 20 62 6c 6f 62 20 68 61 6e 64   NULL, blob hand
15a0: 6c 65 20 74 6f 20 72 65 61 64 20 6e 6f 64 65 20  le to read node 
15b0: 2a 2f 0a 0a 20 20 46 74 73 33 48 61 73 68 45 6c  */..  Fts3HashEl
15c0: 65 6d 20 2a 2a 70 70 4e 65 78 74 45 6c 65 6d 3b  em **ppNextElem;
15d0: 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73  ..  /* Variables
15e0: 20 73 65 74 20 62 79 20 66 74 73 33 53 65 67 52   set by fts3SegR
15f0: 65 61 64 65 72 4e 65 78 74 28 29 2e 20 54 68 65  eaderNext(). The
1600: 73 65 20 6d 61 79 20 62 65 20 72 65 61 64 20 64  se may be read d
1610: 69 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20  irectly.  ** by 
1620: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65 79  the caller. They
1630: 20 61 72 65 20 76 61 6c 69 64 20 66 72 6f 6d 20   are valid from 
1640: 74 68 65 20 74 69 6d 65 20 53 65 67 6d 65 6e 74  the time Segment
1650: 52 65 61 64 65 72 4e 65 77 28 29 20 72 65 74 75  ReaderNew() retu
1660: 72 6e 73 0a 20 20 2a 2a 20 75 6e 74 69 6c 20 53  rns.  ** until S
1670: 65 67 6d 65 6e 74 52 65 61 64 65 72 4e 65 78 74  egmentReaderNext
1680: 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74  () returns somet
1690: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
16a0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 2a 2a 20 28  SQLITE_OK.  ** (
16b0: 69 2e 65 2e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  i.e. SQLITE_DONE
16c0: 29 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  )..  */.  int nT
16d0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
16e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
16f0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
1700: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a  current term */.
1710: 20 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20    char *zTerm;  
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1730: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1740: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a  current term */.
1750: 20 20 69 6e 74 20 6e 54 65 72 6d 41 6c 6c 6f 63    int nTermAlloc
1760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1770: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
1780: 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 62 75 66  ize of zTerm buf
1790: 66 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  fer */.  char *a
17a0: 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20  Doclist;        
17b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
17c0: 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 20 6f  ter to doclist o
17d0: 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  f current entry 
17e0: 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73  */.  int nDoclis
17f0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1800: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1810: 64 6f 63 6c 69 73 74 20 69 6e 20 63 75 72 72 65  doclist in curre
1820: 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 0a 20 20 2f  nt entry */..  /
1830: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1840: 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 75 73  variables are us
1850: 65 64 20 62 79 20 66 74 73 33 53 65 67 52 65 61  ed by fts3SegRea
1860: 64 65 72 4e 65 78 74 44 6f 63 69 64 28 29 20 74  derNextDocid() t
1870: 6f 20 69 74 65 72 61 74 65 20 0a 20 20 2a 2a 20  o iterate .  ** 
1880: 74 68 72 6f 75 67 68 20 74 68 65 20 63 75 72 72  through the curr
1890: 65 6e 74 20 64 6f 63 6c 69 73 74 20 28 61 44 6f  ent doclist (aDo
18a0: 63 6c 69 73 74 2f 6e 44 6f 63 6c 69 73 74 29 2e  clist/nDoclist).
18b0: 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 4f  .  */.  char *pO
18c0: 66 66 73 65 74 4c 69 73 74 3b 0a 20 20 69 6e 74  ffsetList;.  int
18d0: 20 6e 4f 66 66 73 65 74 4c 69 73 74 3b 20 20 20   nOffsetList;   
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18f0: 46 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20 70  For descending p
1900: 65 6e 64 69 6e 67 20 73 65 67 2d 72 65 61 64 65  ending seg-reade
1910: 72 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 71 6c  rs only */.  sql
1920: 69 74 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 69  ite3_int64 iDoci
1930: 64 3b 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 66  d;.};..#define f
1940: 74 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65  ts3SegReaderIsPe
1950: 6e 64 69 6e 67 28 70 29 20 28 28 70 29 2d 3e 70  nding(p) ((p)->p
1960: 70 4e 65 78 74 45 6c 65 6d 21 3d 30 29 0a 23 64  pNextElem!=0).#d
1970: 65 66 69 6e 65 20 66 74 73 33 53 65 67 52 65 61  efine fts3SegRea
1980: 64 65 72 49 73 52 6f 6f 74 4f 6e 6c 79 28 70 29  derIsRootOnly(p)
1990: 20 28 28 70 29 2d 3e 72 6f 6f 74 4f 6e 6c 79 21   ((p)->rootOnly!
19a0: 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  =0)../*.** An in
19b0: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
19c0: 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64  tructure is used
19d0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 73 65 67   to create a seg
19e0: 6d 65 6e 74 20 62 2d 74 72 65 65 20 69 6e 20 74  ment b-tree in t
19f0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  he.** database. 
1a00: 54 68 65 20 69 6e 74 65 72 6e 61 6c 20 64 65 74  The internal det
1a10: 61 69 6c 73 20 6f 66 20 74 68 69 73 20 74 79 70  ails of this typ
1a20: 65 20 61 72 65 20 6f 6e 6c 79 20 61 63 63 65 73  e are only acces
1a30: 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 66 6f  sed by the.** fo
1a40: 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
1a50: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 66 74 73 33 53  s:.**.**   fts3S
1a60: 65 67 57 72 69 74 65 72 41 64 64 28 29 0a 2a 2a  egWriterAdd().**
1a70: 20 20 20 66 74 73 33 53 65 67 57 72 69 74 65 72     fts3SegWriter
1a80: 46 6c 75 73 68 28 29 0a 2a 2a 20 20 20 66 74 73  Flush().**   fts
1a90: 33 53 65 67 57 72 69 74 65 72 46 72 65 65 28 29  3SegWriterFree()
1aa0: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 65 67 6d 65  .*/.struct Segme
1ab0: 6e 74 57 72 69 74 65 72 20 7b 0a 20 20 53 65 67  ntWriter {.  Seg
1ac0: 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65 3b  mentNode *pTree;
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ae0: 50 6f 69 6e 74 65 72 20 74 6f 20 69 6e 74 65 72  Pointer to inter
1af0: 69 6f 72 20 74 72 65 65 20 73 74 72 75 63 74 75  ior tree structu
1b00: 72 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  re */.  sqlite3_
1b10: 69 6e 74 36 34 20 69 46 69 72 73 74 3b 20 20 20  int64 iFirst;   
1b20: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1b30: 20 73 6c 6f 74 20 69 6e 20 25 5f 73 65 67 6d 65   slot in %_segme
1b40: 6e 74 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  nts written */. 
1b50: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1b60: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  Free;           
1b70: 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73 6c   /* Next free sl
1b80: 6f 74 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73  ot in %_segments
1b90: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 72   */.  char *zTer
1ba0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1bb0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1bc0: 20 74 6f 20 70 72 65 76 69 6f 75 73 20 74 65 72   to previous ter
1bd0: 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  m buffer */.  in
1be0: 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20  t nTerm;        
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c00: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1c10: 20 69 6e 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 69   in zTerm */.  i
1c20: 6e 74 20 6e 4d 61 6c 6c 6f 63 3b 20 20 20 20 20  nt nMalloc;     
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c40: 2a 20 53 69 7a 65 20 6f 66 20 6d 61 6c 6c 6f 63  * Size of malloc
1c50: 27 64 20 62 75 66 66 65 72 20 61 74 20 7a 4d 61  'd buffer at zMa
1c60: 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lloc */.  char *
1c70: 7a 4d 61 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20  zMalloc;        
1c80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6c            /* Mal
1c90: 6c 6f 63 27 64 20 73 70 61 63 65 20 28 70 6f 73  loc'd space (pos
1ca0: 73 69 62 6c 79 29 20 75 73 65 64 20 66 6f 72 20  sibly) used for 
1cb0: 7a 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e  zTerm */.  int n
1cc0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1cd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1ce0: 7a 65 20 6f 66 20 61 6c 6c 6f 63 61 74 69 6f 6e  ze of allocation
1cf0: 20 61 74 20 61 44 61 74 61 20 2a 2f 0a 20 20 69   at aData */.  i
1d00: 6e 74 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20  nt nData;       
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d20: 2a 20 42 79 74 65 73 20 6f 66 20 64 61 74 61 20  * Bytes of data 
1d30: 69 6e 20 61 44 61 74 61 20 2a 2f 0a 20 20 63 68  in aData */.  ch
1d40: 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20  ar *aData;      
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d60: 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 6c 6f 63   Pointer to bloc
1d70: 6b 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20  k from malloc() 
1d80: 2a 2f 0a 20 20 69 36 34 20 6e 4c 65 61 66 44 61  */.  i64 nLeafDa
1d90: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
1da0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1db0: 66 20 62 79 74 65 73 20 6f 66 20 6c 65 61 66 20  f bytes of leaf 
1dc0: 64 61 74 61 20 77 72 69 74 74 65 6e 20 2a 2f 0a  data written */.
1dd0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 79 70 65 20 53  };../*.** Type S
1de0: 65 67 6d 65 6e 74 4e 6f 64 65 20 69 73 20 75 73  egmentNode is us
1df0: 65 64 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77  ed by the follow
1e00: 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74 69  ing three functi
1e10: 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a  ons to create.**
1e20: 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 70 61   the interior pa
1e30: 72 74 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e  rt of the segmen
1e40: 74 20 62 2b 2d 74 72 65 65 20 73 74 72 75 63 74  t b+-tree struct
1e50: 75 72 65 73 20 28 65 76 65 72 79 74 68 69 6e 67  ures (everything
1e60: 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 65 20 6c   except.** the l
1e70: 65 61 66 20 6e 6f 64 65 73 29 2e 20 54 68 65 73  eaf nodes). Thes
1e80: 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  e functions and 
1e90: 74 79 70 65 20 61 72 65 20 6f 6e 6c 79 20 65 76  type are only ev
1ea0: 65 72 20 75 73 65 64 20 62 79 20 63 6f 64 65 0a  er used by code.
1eb0: 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 66 74  ** within the ft
1ec0: 73 33 53 65 67 57 72 69 74 65 72 58 58 58 28 29  s3SegWriterXXX()
1ed0: 20 66 61 6d 69 6c 79 20 6f 66 20 66 75 6e 63 74   family of funct
1ee0: 69 6f 6e 73 20 64 65 73 63 72 69 62 65 64 20 61  ions described a
1ef0: 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 66 74  bove..**.**   ft
1f00: 73 33 4e 6f 64 65 41 64 64 54 65 72 6d 28 29 0a  s3NodeAddTerm().
1f10: 2a 2a 20 20 20 66 74 73 33 4e 6f 64 65 57 72 69  **   fts3NodeWri
1f20: 74 65 28 29 0a 2a 2a 20 20 20 66 74 73 33 4e 6f  te().**   fts3No
1f30: 64 65 46 72 65 65 28 29 0a 2a 2a 0a 2a 2a 20 57  deFree().**.** W
1f40: 68 65 6e 20 61 20 62 2b 74 72 65 65 20 69 73 20  hen a b+tree is 
1f50: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
1f60: 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20  atabase (either 
1f70: 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61  as a result of a
1f80: 20 6d 65 72 67 65 0a 2a 2a 20 6f 72 20 74 68 65   merge.** or the
1f90: 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 74   pending-terms t
1fa0: 61 62 6c 65 20 62 65 69 6e 67 20 66 6c 75 73 68  able being flush
1fb0: 65 64 29 2c 20 6c 65 61 76 65 73 20 61 72 65 20  ed), leaves are 
1fc0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1fd0: 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
1fe0: 6c 65 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  le as soon as th
1ff0: 65 79 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c  ey are completel
2000: 79 20 70 6f 70 75 6c 61 74 65 64 2e 20 54 68 65  y populated. The
2010: 20 69 6e 74 65 72 69 6f 72 20 6f 66 0a 2a 2a 20   interior of.** 
2020: 74 68 65 20 74 72 65 65 20 69 73 20 61 73 73 65  the tree is asse
2030: 6d 62 6c 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  mbled in memory 
2040: 61 6e 64 20 77 72 69 74 74 65 6e 20 6f 75 74 20  and written out 
2050: 6f 6e 6c 79 20 6f 6e 63 65 20 61 6c 6c 20 6c 65  only once all le
2060: 61 76 65 73 20 68 61 76 65 0a 2a 2a 20 62 65 65  aves have.** bee
2070: 6e 20 70 6f 70 75 6c 61 74 65 64 20 61 6e 64 20  n populated and 
2080: 73 74 6f 72 65 64 2e 20 54 68 69 73 20 69 73 20  stored. This is 
2090: 4f 6b 2c 20 61 73 20 74 68 65 20 62 2b 2d 74 72  Ok, as the b+-tr
20a0: 65 65 20 66 61 6e 6f 75 74 20 69 73 20 75 73 75  ee fanout is usu
20b0: 61 6c 6c 79 0a 2a 2a 20 76 65 72 79 20 6c 61 72  ally.** very lar
20c0: 67 65 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ge, meaning that
20d0: 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6f 66   the interior of
20e0: 20 74 68 65 20 74 72 65 65 20 63 6f 6e 73 75 6d   the tree consum
20f0: 65 73 20 72 65 6c 61 74 69 76 65 6c 79 20 0a 2a  es relatively .*
2100: 2a 20 6c 69 74 74 6c 65 20 6d 65 6d 6f 72 79 2e  * little memory.
2110: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 65 67 6d 65  .*/.struct Segme
2120: 6e 74 4e 6f 64 65 20 7b 0a 20 20 53 65 67 6d 65  ntNode {.  Segme
2130: 6e 74 4e 6f 64 65 20 2a 70 50 61 72 65 6e 74 3b  ntNode *pParent;
2140: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2150: 72 65 6e 74 20 6e 6f 64 65 20 28 6f 72 20 4e 55  rent node (or NU
2160: 4c 4c 20 66 6f 72 20 72 6f 6f 74 20 6e 6f 64 65  LL for root node
2170: 29 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e 6f  ) */.  SegmentNo
2180: 64 65 20 2a 70 52 69 67 68 74 3b 20 20 20 20 20  de *pRight;     
2190: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
21a0: 72 20 74 6f 20 72 69 67 68 74 2d 73 69 62 6c 69  r to right-sibli
21b0: 6e 67 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e  ng */.  SegmentN
21c0: 6f 64 65 20 2a 70 4c 65 66 74 6d 6f 73 74 3b 20  ode *pLeftmost; 
21d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
21e0: 65 72 20 74 6f 20 6c 65 66 74 2d 6d 6f 73 74 20  er to left-most 
21f0: 6e 6f 64 65 20 6f 66 20 74 68 69 73 20 64 65 70  node of this dep
2200: 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6e 74  th */.  int nEnt
2210: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ry;             
2220: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2230: 72 20 6f 66 20 74 65 72 6d 73 20 77 72 69 74 74  r of terms writt
2240: 65 6e 20 74 6f 20 6e 6f 64 65 20 73 6f 20 66 61  en to node so fa
2250: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65  r */.  char *zTe
2260: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
2270: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
2280: 72 20 74 6f 20 70 72 65 76 69 6f 75 73 20 74 65  r to previous te
2290: 72 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  rm buffer */.  i
22a0: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
22d0: 73 20 69 6e 20 7a 54 65 72 6d 20 2a 2f 0a 20 20  s in zTerm */.  
22e0: 69 6e 74 20 6e 4d 61 6c 6c 6f 63 3b 20 20 20 20  int nMalloc;    
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 6c 6c 6f  /* Size of mallo
2310: 63 27 64 20 62 75 66 66 65 72 20 61 74 20 7a 4d  c'd buffer at zM
2320: 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20  alloc */.  char 
2330: 2a 7a 4d 61 6c 6c 6f 63 3b 20 20 20 20 20 20 20  *zMalloc;       
2340: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
2350: 6c 6c 6f 63 27 64 20 73 70 61 63 65 20 28 70 6f  lloc'd space (po
2360: 73 73 69 62 6c 79 29 20 75 73 65 64 20 66 6f 72  ssibly) used for
2370: 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20   zTerm */.  int 
2380: 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  nData;          
2390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
23a0: 79 74 65 73 20 6f 66 20 76 61 6c 69 64 20 64 61  ytes of valid da
23b0: 74 61 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63  ta so far */.  c
23c0: 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20  har *aData;     
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23e0: 2a 20 4e 6f 64 65 20 64 61 74 61 20 2a 2f 0a 7d  * Node data */.}
23f0: 3b 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 20 76  ;../*.** Valid v
2400: 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 73 65  alues for the se
2410: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
2420: 20 66 74 73 33 53 71 6c 53 74 6d 74 28 29 2e 0a   fts3SqlStmt()..
2430: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44  */.#define SQL_D
2440: 45 4c 45 54 45 5f 43 4f 4e 54 45 4e 54 20 20 20  ELETE_CONTENT   
2450: 20 20 20 20 20 20 20 20 20 20 30 0a 23 64 65 66            0.#def
2460: 69 6e 65 20 53 51 4c 5f 49 53 5f 45 4d 50 54 59  ine SQL_IS_EMPTY
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 53 51 4c     1.#define SQL
2490: 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 43 4f 4e 54  _DELETE_ALL_CONT
24a0: 45 4e 54 20 20 20 20 20 20 20 20 20 32 20 0a 23  ENT         2 .#
24b0: 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54  define SQL_DELET
24c0: 45 5f 41 4c 4c 5f 53 45 47 4d 45 4e 54 53 20 20  E_ALL_SEGMENTS  
24d0: 20 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20        3.#define 
24e0: 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 53  SQL_DELETE_ALL_S
24f0: 45 47 44 49 52 20 20 20 20 20 20 20 20 20 20 34  EGDIR          4
2500: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c  .#define SQL_DEL
2510: 45 54 45 5f 41 4c 4c 5f 44 4f 43 53 49 5a 45 20  ETE_ALL_DOCSIZE 
2520: 20 20 20 20 20 20 20 20 35 0a 23 64 65 66 69 6e          5.#defin
2530: 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c  e SQL_DELETE_ALL
2540: 5f 53 54 41 54 20 20 20 20 20 20 20 20 20 20 20  _STAT           
2550: 20 36 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53   6.#define SQL_S
2560: 45 4c 45 43 54 5f 43 4f 4e 54 45 4e 54 5f 42 59  ELECT_CONTENT_BY
2570: 5f 52 4f 57 49 44 20 20 20 20 37 0a 23 64 65 66  _ROWID    7.#def
2580: 69 6e 65 20 53 51 4c 5f 4e 45 58 54 5f 53 45 47  ine SQL_NEXT_SEG
2590: 4d 45 4e 54 5f 49 4e 44 45 58 20 20 20 20 20 20  MENT_INDEX      
25a0: 20 20 20 38 0a 23 64 65 66 69 6e 65 20 53 51 4c     8.#define SQL
25b0: 5f 49 4e 53 45 52 54 5f 53 45 47 4d 45 4e 54 53  _INSERT_SEGMENTS
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 39 0a 23 64              9.#d
25d0: 65 66 69 6e 65 20 53 51 4c 5f 4e 45 58 54 5f 53  efine SQL_NEXT_S
25e0: 45 47 4d 45 4e 54 53 5f 49 44 20 20 20 20 20 20  EGMENTS_ID      
25f0: 20 20 20 20 31 30 0a 23 64 65 66 69 6e 65 20 53      10.#define S
2600: 51 4c 5f 49 4e 53 45 52 54 5f 53 45 47 44 49 52  QL_INSERT_SEGDIR
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 31 0a               11.
2620: 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45  #define SQL_SELE
2630: 43 54 5f 4c 45 56 45 4c 20 20 20 20 20 20 20 20  CT_LEVEL        
2640: 20 20 20 20 20 20 31 32 0a 23 64 65 66 69 6e 65        12.#define
2650: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c 45 56 45   SQL_SELECT_LEVE
2660: 4c 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20 31  L_RANGE        1
2670: 33 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45  3.#define SQL_SE
2680: 4c 45 43 54 5f 4c 45 56 45 4c 5f 43 4f 55 4e 54  LECT_LEVEL_COUNT
2690: 20 20 20 20 20 20 20 20 31 34 0a 23 64 65 66 69          14.#defi
26a0: 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 45  ne SQL_SELECT_SE
26b0: 47 44 49 52 5f 4d 41 58 5f 4c 45 56 45 4c 20 20  GDIR_MAX_LEVEL  
26c0: 20 31 35 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f   15.#define SQL_
26d0: 44 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 4c 45  DELETE_SEGDIR_LE
26e0: 56 45 4c 20 20 20 20 20 20 20 31 36 0a 23 64 65  VEL       16.#de
26f0: 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f  fine SQL_DELETE_
2700: 53 45 47 4d 45 4e 54 53 5f 52 41 4e 47 45 20 20  SEGMENTS_RANGE  
2710: 20 20 20 31 37 0a 23 64 65 66 69 6e 65 20 53 51     17.#define SQ
2720: 4c 5f 43 4f 4e 54 45 4e 54 5f 49 4e 53 45 52 54  L_CONTENT_INSERT
2730: 20 20 20 20 20 20 20 20 20 20 20 20 31 38 0a 23              18.#
2740: 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54  define SQL_DELET
2750: 45 5f 44 4f 43 53 49 5a 45 20 20 20 20 20 20 20  E_DOCSIZE       
2760: 20 20 20 20 20 31 39 0a 23 64 65 66 69 6e 65 20       19.#define 
2770: 53 51 4c 5f 52 45 50 4c 41 43 45 5f 44 4f 43 53  SQL_REPLACE_DOCS
2780: 49 5a 45 20 20 20 20 20 20 20 20 20 20 20 32 30  IZE           20
2790: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c  .#define SQL_SEL
27a0: 45 43 54 5f 44 4f 43 53 49 5a 45 20 20 20 20 20  ECT_DOCSIZE     
27b0: 20 20 20 20 20 20 20 32 31 0a 23 64 65 66 69 6e         21.#defin
27c0: 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 54 41  e SQL_SELECT_STA
27d0: 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T               
27e0: 32 32 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 52  22.#define SQL_R
27f0: 45 50 4c 41 43 45 5f 53 54 41 54 20 20 20 20 20  EPLACE_STAT     
2800: 20 20 20 20 20 20 20 20 20 32 33 0a 0a 23 64 65           23..#de
2810: 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f  fine SQL_SELECT_
2820: 41 4c 4c 5f 50 52 45 46 49 58 5f 4c 45 56 45 4c  ALL_PREFIX_LEVEL
2830: 20 20 20 32 34 0a 23 64 65 66 69 6e 65 20 53 51     24.#define SQ
2840: 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 54 45 52  L_DELETE_ALL_TER
2850: 4d 53 5f 53 45 47 44 49 52 20 20 20 32 35 0a 23  MS_SEGDIR   25.#
2860: 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54  define SQL_DELET
2870: 45 5f 53 45 47 44 49 52 5f 52 41 4e 47 45 20 20  E_SEGDIR_RANGE  
2880: 20 20 20 20 20 32 36 0a 23 64 65 66 69 6e 65 20       26.#define 
2890: 53 51 4c 5f 53 45 4c 45 43 54 5f 41 4c 4c 5f 4c  SQL_SELECT_ALL_L
28a0: 41 4e 47 49 44 20 20 20 20 20 20 20 20 20 32 37  ANGID         27
28b0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 46 49 4e  .#define SQL_FIN
28c0: 44 5f 4d 45 52 47 45 5f 4c 45 56 45 4c 20 20 20  D_MERGE_LEVEL   
28d0: 20 20 20 20 20 20 20 32 38 0a 23 64 65 66 69 6e         28.#defin
28e0: 65 20 53 51 4c 5f 4d 41 58 5f 4c 45 41 46 5f 4e  e SQL_MAX_LEAF_N
28f0: 4f 44 45 5f 45 53 54 49 4d 41 54 45 20 20 20 20  ODE_ESTIMATE    
2900: 32 39 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44  29.#define SQL_D
2910: 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 45 4e 54  ELETE_SEGDIR_ENT
2920: 52 59 20 20 20 20 20 20 20 33 30 0a 23 64 65 66  RY       30.#def
2930: 69 6e 65 20 53 51 4c 5f 53 48 49 46 54 5f 53 45  ine SQL_SHIFT_SE
2940: 47 44 49 52 5f 45 4e 54 52 59 20 20 20 20 20 20  GDIR_ENTRY      
2950: 20 20 33 31 0a 23 64 65 66 69 6e 65 20 53 51 4c    31.#define SQL
2960: 5f 53 45 4c 45 43 54 5f 53 45 47 44 49 52 20 20  _SELECT_SEGDIR  
2970: 20 20 20 20 20 20 20 20 20 20 20 33 32 0a 23 64             32.#d
2980: 65 66 69 6e 65 20 53 51 4c 5f 43 48 4f 4d 50 5f  efine SQL_CHOMP_
2990: 53 45 47 44 49 52 20 20 20 20 20 20 20 20 20 20  SEGDIR          
29a0: 20 20 20 20 33 33 0a 23 64 65 66 69 6e 65 20 53      33.#define S
29b0: 51 4c 5f 53 45 47 4d 45 4e 54 5f 49 53 5f 41 50  QL_SEGMENT_IS_AP
29c0: 50 45 4e 44 41 42 4c 45 20 20 20 20 20 33 34 0a  PENDABLE     34.
29d0: 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45  #define SQL_SELE
29e0: 43 54 5f 49 4e 44 45 58 45 53 20 20 20 20 20 20  CT_INDEXES      
29f0: 20 20 20 20 20 20 33 35 0a 23 64 65 66 69 6e 65        35.#define
2a00: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4d 58 4c 45   SQL_SELECT_MXLE
2a10: 56 45 4c 20 20 20 20 20 20 20 20 20 20 20 20 33  VEL            3
2a20: 36 0a 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53  6..#define SQL_S
2a30: 45 4c 45 43 54 5f 4c 45 56 45 4c 5f 52 41 4e 47  ELECT_LEVEL_RANG
2a40: 45 32 20 20 20 20 20 20 20 33 37 0a 23 64 65 66  E2       37.#def
2a50: 69 6e 65 20 53 51 4c 5f 55 50 44 41 54 45 5f 4c  ine SQL_UPDATE_L
2a60: 45 56 45 4c 5f 49 44 58 20 20 20 20 20 20 20 20  EVEL_IDX        
2a70: 20 20 33 38 0a 23 64 65 66 69 6e 65 20 53 51 4c    38.#define SQL
2a80: 5f 55 50 44 41 54 45 5f 4c 45 56 45 4c 20 20 20  _UPDATE_LEVEL   
2a90: 20 20 20 20 20 20 20 20 20 20 20 33 39 0a 0a 2f             39../
2aa0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2ab0: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6f 62  on is used to ob
2ac0: 74 61 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 70  tain an SQLite p
2ad0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
2ae0: 74 20 68 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72 20  t handle.** for 
2af0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 64  the statement id
2b00: 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20  entified by the 
2b10: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
2b20: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a   If successful,.
2b30: 2a 2a 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  ** *pp is set to
2b40: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
2b50: 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20  tatement handle 
2b60: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
2b70: 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72  turned..** Other
2b80: 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20  wise, an SQLite 
2b90: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2ba0: 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69  turned and *pp i
2bb0: 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a  s set to 0..**.*
2bc0: 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 61 70  * If argument ap
2bd0: 56 61 6c 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  Val is not NULL,
2be0: 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 70 6f   then it must po
2bf0: 69 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20  int to an array 
2c00: 77 69 74 68 0a 2a 2a 20 61 74 20 6c 65 61 73 74  with.** at least
2c10: 20 61 73 20 6d 61 6e 79 20 65 6e 74 72 69 65 73   as many entries
2c20: 20 61 73 20 74 68 65 20 72 65 71 75 65 73 74 65   as the requeste
2c30: 64 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20  d statement has 
2c40: 62 6f 75 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65  bound .** parame
2c50: 74 65 72 73 2e 20 54 68 65 20 76 61 6c 75 65 73  ters. The values
2c60: 20 61 72 65 20 62 6f 75 6e 64 20 74 6f 20 74 68   are bound to th
2c70: 65 20 73 74 61 74 65 6d 65 6e 74 73 20 70 61 72  e statements par
2c80: 61 6d 65 74 65 72 73 20 62 65 66 6f 72 65 0a 2a  ameters before.*
2c90: 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  * returning..*/.
2ca0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53  static int fts3S
2cb0: 71 6c 53 74 6d 74 28 0a 20 20 46 74 73 33 54 61  qlStmt(.  Fts3Ta
2cc0: 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
2cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
2ce0: 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
2cf0: 65 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74 6d 74  e */.  int eStmt
2d00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d10: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
2d20: 20 74 68 65 20 53 51 4c 5f 58 58 58 20 63 6f 6e   the SQL_XXX con
2d30: 73 74 61 6e 74 73 20 61 62 6f 76 65 20 2a 2f 0a  stants above */.
2d40: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2d50: 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pp,            
2d60: 20 20 2f 2a 20 4f 55 54 3a 20 53 74 61 74 65 6d    /* OUT: Statem
2d70: 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ent handle */.  
2d80: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
2d90: 61 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20  apVal           
2da0: 2f 2a 20 56 61 6c 75 65 73 20 74 6f 20 62 69 6e  /* Values to bin
2db0: 64 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 20 2a  d to statement *
2dc0: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
2dd0: 72 20 2a 61 7a 53 71 6c 5b 5d 20 3d 20 7b 0a 2f  r *azSql[] = {./
2de0: 2a 20 30 20 20 2a 2f 20 20 22 44 45 4c 45 54 45  * 0  */  "DELETE
2df0: 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 63 6f 6e   FROM %Q.'%q_con
2e00: 74 65 6e 74 27 20 57 48 45 52 45 20 72 6f 77 69  tent' WHERE rowi
2e10: 64 20 3d 20 3f 22 2c 0a 2f 2a 20 31 20 20 2a 2f  d = ?",./* 1  */
2e20: 20 20 22 53 45 4c 45 43 54 20 4e 4f 54 20 45 58    "SELECT NOT EX
2e30: 49 53 54 53 28 53 45 4c 45 43 54 20 64 6f 63 69  ISTS(SELECT doci
2e40: 64 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 63 6f  d FROM %Q.'%q_co
2e50: 6e 74 65 6e 74 27 20 57 48 45 52 45 20 72 6f 77  ntent' WHERE row
2e60: 69 64 21 3d 3f 29 22 2c 0a 2f 2a 20 32 20 20 2a  id!=?)",./* 2  *
2e70: 2f 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  /  "DELETE FROM 
2e80: 25 51 2e 27 25 71 5f 63 6f 6e 74 65 6e 74 27 22  %Q.'%q_content'"
2e90: 2c 0a 2f 2a 20 33 20 20 2a 2f 20 20 22 44 45 4c  ,./* 3  */  "DEL
2ea0: 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  ETE FROM %Q.'%q_
2eb0: 73 65 67 6d 65 6e 74 73 27 22 2c 0a 2f 2a 20 34  segments'",./* 4
2ec0: 20 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46 52    */  "DELETE FR
2ed0: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72  OM %Q.'%q_segdir
2ee0: 27 22 2c 0a 2f 2a 20 35 20 20 2a 2f 20 20 22 44  '",./* 5  */  "D
2ef0: 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25  ELETE FROM %Q.'%
2f00: 71 5f 64 6f 63 73 69 7a 65 27 22 2c 0a 2f 2a 20  q_docsize'",./* 
2f10: 36 20 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46  6  */  "DELETE F
2f20: 52 4f 4d 20 25 51 2e 27 25 71 5f 73 74 61 74 27  ROM %Q.'%q_stat'
2f30: 22 2c 0a 2f 2a 20 37 20 20 2a 2f 20 20 22 53 45  ",./* 7  */  "SE
2f40: 4c 45 43 54 20 25 73 20 57 48 45 52 45 20 72 6f  LECT %s WHERE ro
2f50: 77 69 64 3d 3f 22 2c 0a 2f 2a 20 38 20 20 2a 2f  wid=?",./* 8  */
2f60: 20 20 22 53 45 4c 45 43 54 20 28 53 45 4c 45 43    "SELECT (SELEC
2f70: 54 20 6d 61 78 28 69 64 78 29 20 46 52 4f 4d 20  T max(idx) FROM 
2f80: 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57  %Q.'%q_segdir' W
2f90: 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f 29 20  HERE level = ?) 
2fa0: 2b 20 31 22 2c 0a 2f 2a 20 39 20 20 2a 2f 20 20  + 1",./* 9  */  
2fb0: 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 51  "REPLACE INTO %Q
2fc0: 2e 27 25 71 5f 73 65 67 6d 65 6e 74 73 27 28 62  .'%q_segments'(b
2fd0: 6c 6f 63 6b 69 64 2c 20 62 6c 6f 63 6b 29 20 56  lockid, block) V
2fe0: 41 4c 55 45 53 28 3f 2c 20 3f 29 22 2c 0a 2f 2a  ALUES(?, ?)",./*
2ff0: 20 31 30 20 2a 2f 20 20 22 53 45 4c 45 43 54 20   10 */  "SELECT 
3000: 63 6f 61 6c 65 73 63 65 28 28 53 45 4c 45 43 54  coalesce((SELECT
3010: 20 6d 61 78 28 62 6c 6f 63 6b 69 64 29 20 46 52   max(blockid) FR
3020: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 6d 65 6e  OM %Q.'%q_segmen
3030: 74 73 27 29 20 2b 20 31 2c 20 31 29 22 2c 0a 2f  ts') + 1, 1)",./
3040: 2a 20 31 31 20 2a 2f 20 20 22 52 45 50 4c 41 43  * 11 */  "REPLAC
3050: 45 20 49 4e 54 4f 20 25 51 2e 27 25 71 5f 73 65  E INTO %Q.'%q_se
3060: 67 64 69 72 27 20 56 41 4c 55 45 53 28 3f 2c 3f  gdir' VALUES(?,?
3070: 2c 3f 2c 3f 2c 3f 2c 3f 29 22 2c 0a 0a 20 20 20  ,?,?,?,?)",..   
3080: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
3090: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6f 72 64   segments in ord
30a0: 65 72 20 66 72 6f 6d 20 6f 6c 64 65 73 74 20 74  er from oldest t
30b0: 6f 20 6e 65 77 65 73 74 2e 2a 2f 20 0a 2f 2a 20  o newest.*/ ./* 
30c0: 31 32 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 69  12 */  "SELECT i
30d0: 64 78 2c 20 73 74 61 72 74 5f 62 6c 6f 63 6b 2c  dx, start_block,
30e0: 20 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63   leaves_end_bloc
30f0: 6b 2c 20 65 6e 64 5f 62 6c 6f 63 6b 2c 20 72 6f  k, end_block, ro
3100: 6f 74 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ot ".           
3110: 20 22 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65   "FROM %Q.'%q_se
3120: 67 64 69 72 27 20 57 48 45 52 45 20 6c 65 76 65  gdir' WHERE leve
3130: 6c 20 3d 20 3f 20 4f 52 44 45 52 20 42 59 20 69  l = ? ORDER BY i
3140: 64 78 20 41 53 43 22 2c 0a 2f 2a 20 31 33 20 2a  dx ASC",./* 13 *
3150: 2f 20 20 22 53 45 4c 45 43 54 20 69 64 78 2c 20  /  "SELECT idx, 
3160: 73 74 61 72 74 5f 62 6c 6f 63 6b 2c 20 6c 65 61  start_block, lea
3170: 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 2c 20 65  ves_end_block, e
3180: 6e 64 5f 62 6c 6f 63 6b 2c 20 72 6f 6f 74 20 22  nd_block, root "
3190: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 46 52  .            "FR
31a0: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72  OM %Q.'%q_segdir
31b0: 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20 42 45  ' WHERE level BE
31c0: 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 22 0a 20  TWEEN ? AND ?". 
31d0: 20 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45             "ORDE
31e0: 52 20 42 59 20 6c 65 76 65 6c 20 44 45 53 43 2c  R BY level DESC,
31f0: 20 69 64 78 20 41 53 43 22 2c 0a 0a 2f 2a 20 31   idx ASC",../* 1
3200: 34 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 63 6f  4 */  "SELECT co
3210: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 51 2e 27  unt(*) FROM %Q.'
3220: 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52 45  %q_segdir' WHERE
3230: 20 6c 65 76 65 6c 20 3d 20 3f 22 2c 0a 2f 2a 20   level = ?",./* 
3240: 31 35 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 6d  15 */  "SELECT m
3250: 61 78 28 6c 65 76 65 6c 29 20 46 52 4f 4d 20 25  ax(level) FROM %
3260: 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57 48  Q.'%q_segdir' WH
3270: 45 52 45 20 6c 65 76 65 6c 20 42 45 54 57 45 45  ERE level BETWEE
3280: 4e 20 3f 20 41 4e 44 20 3f 22 2c 0a 0a 2f 2a 20  N ? AND ?",../* 
3290: 31 36 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46  16 */  "DELETE F
32a0: 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69  ROM %Q.'%q_segdi
32b0: 72 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d  r' WHERE level =
32c0: 20 3f 22 2c 0a 2f 2a 20 31 37 20 2a 2f 20 20 22   ?",./* 17 */  "
32d0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 27  DELETE FROM %Q.'
32e0: 25 71 5f 73 65 67 6d 65 6e 74 73 27 20 57 48 45  %q_segments' WHE
32f0: 52 45 20 62 6c 6f 63 6b 69 64 20 42 45 54 57 45  RE blockid BETWE
3300: 45 4e 20 3f 20 41 4e 44 20 3f 22 2c 0a 2f 2a 20  EN ? AND ?",./* 
3310: 31 38 20 2a 2f 20 20 22 49 4e 53 45 52 54 20 49  18 */  "INSERT I
3320: 4e 54 4f 20 25 51 2e 27 25 71 5f 63 6f 6e 74 65  NTO %Q.'%q_conte
3330: 6e 74 27 20 56 41 4c 55 45 53 28 25 73 29 22 2c  nt' VALUES(%s)",
3340: 0a 2f 2a 20 31 39 20 2a 2f 20 20 22 44 45 4c 45  ./* 19 */  "DELE
3350: 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 64  TE FROM %Q.'%q_d
3360: 6f 63 73 69 7a 65 27 20 57 48 45 52 45 20 64 6f  ocsize' WHERE do
3370: 63 69 64 20 3d 20 3f 22 2c 0a 2f 2a 20 32 30 20  cid = ?",./* 20 
3380: 2a 2f 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54  */  "REPLACE INT
3390: 4f 20 25 51 2e 27 25 71 5f 64 6f 63 73 69 7a 65  O %Q.'%q_docsize
33a0: 27 20 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 0a  ' VALUES(?,?)",.
33b0: 2f 2a 20 32 31 20 2a 2f 20 20 22 53 45 4c 45 43  /* 21 */  "SELEC
33c0: 54 20 73 69 7a 65 20 46 52 4f 4d 20 25 51 2e 27  T size FROM %Q.'
33d0: 25 71 5f 64 6f 63 73 69 7a 65 27 20 57 48 45 52  %q_docsize' WHER
33e0: 45 20 64 6f 63 69 64 3d 3f 22 2c 0a 2f 2a 20 32  E docid=?",./* 2
33f0: 32 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 76 61  2 */  "SELECT va
3400: 6c 75 65 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  lue FROM %Q.'%q_
3410: 73 74 61 74 27 20 57 48 45 52 45 20 69 64 3d 3f  stat' WHERE id=?
3420: 22 2c 0a 2f 2a 20 32 33 20 2a 2f 20 20 22 52 45  ",./* 23 */  "RE
3430: 50 4c 41 43 45 20 49 4e 54 4f 20 25 51 2e 27 25  PLACE INTO %Q.'%
3440: 71 5f 73 74 61 74 27 20 56 41 4c 55 45 53 28 3f  q_stat' VALUES(?
3450: 2c 3f 29 22 2c 0a 2f 2a 20 32 34 20 2a 2f 20 20  ,?)",./* 24 */  
3460: 22 22 2c 0a 2f 2a 20 32 35 20 2a 2f 20 20 22 22  "",./* 25 */  ""
3470: 2c 0a 0a 2f 2a 20 32 36 20 2a 2f 20 22 44 45 4c  ,../* 26 */ "DEL
3480: 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  ETE FROM %Q.'%q_
3490: 73 65 67 64 69 72 27 20 57 48 45 52 45 20 6c 65  segdir' WHERE le
34a0: 76 65 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e  vel BETWEEN ? AN
34b0: 44 20 3f 22 2c 0a 2f 2a 20 32 37 20 2a 2f 20 22  D ?",./* 27 */ "
34c0: 53 45 4c 45 43 54 20 3f 20 55 4e 49 4f 4e 20 53  SELECT ? UNION S
34d0: 45 4c 45 43 54 20 6c 65 76 65 6c 20 2f 20 28 31  ELECT level / (1
34e0: 30 32 34 20 2a 20 3f 29 20 46 52 4f 4d 20 25 51  024 * ?) FROM %Q
34f0: 2e 27 25 71 5f 73 65 67 64 69 72 27 22 2c 0a 0a  .'%q_segdir'",..
3500: 2f 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  /* This statemen
3510: 74 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  t is used to det
3520: 65 72 6d 69 6e 65 20 77 68 69 63 68 20 6c 65 76  ermine which lev
3530: 65 6c 20 74 6f 20 72 65 61 64 20 74 68 65 20 69  el to read the i
3540: 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a 20 77 68 65  nput from.** whe
3550: 6e 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 6e 20  n performing an 
3560: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67  incremental merg
3570: 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68  e. It returns th
3580: 65 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c  e absolute level
3590: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 74 68   number.** of th
35a0: 65 20 6f 6c 64 65 73 74 20 6c 65 76 65 6c 20 69  e oldest level i
35b0: 6e 20 74 68 65 20 64 62 20 74 68 61 74 20 63 6f  n the db that co
35c0: 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20  ntains at least 
35d0: 3f 20 73 65 67 6d 65 6e 74 73 2e 20 4f 72 2c 0a  ? segments. Or,.
35e0: 2a 2a 20 69 66 20 6e 6f 20 6c 65 76 65 6c 20 69  ** if no level i
35f0: 6e 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20  n the FTS index 
3600: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
3610: 61 6e 20 3f 20 73 65 67 6d 65 6e 74 73 2c 20 74  an ? segments, t
3620: 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  he statement.** 
3630: 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 72 6f 77  returns zero row
3640: 73 2e 20 20 2a 2f 0a 2f 2a 20 32 38 20 2a 2f 20  s.  */./* 28 */ 
3650: 22 53 45 4c 45 43 54 20 6c 65 76 65 6c 2c 20 63  "SELECT level, c
3660: 6f 75 6e 74 28 2a 29 20 41 53 20 63 6e 74 20 46  ount(*) AS cnt F
3670: 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69  ROM %Q.'%q_segdi
3680: 72 27 20 22 0a 20 20 20 20 20 20 20 20 20 22 20  r' ".         " 
3690: 20 47 52 4f 55 50 20 42 59 20 6c 65 76 65 6c 20   GROUP BY level 
36a0: 48 41 56 49 4e 47 20 63 6e 74 3e 3d 3f 22 0a 20  HAVING cnt>=?". 
36b0: 20 20 20 20 20 20 20 20 22 20 20 4f 52 44 45 52          "  ORDER
36c0: 20 42 59 20 28 6c 65 76 65 6c 20 25 25 20 31 30   BY (level %% 10
36d0: 32 34 29 20 41 53 43 20 4c 49 4d 49 54 20 31 22  24) ASC LIMIT 1"
36e0: 2c 0a 0a 2f 2a 20 45 73 74 69 6d 61 74 65 20 74  ,../* Estimate t
36f0: 68 65 20 75 70 70 65 72 20 6c 69 6d 69 74 20 6f  he upper limit o
3700: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
3710: 6c 65 61 66 20 6e 6f 64 65 73 20 69 6e 20 61 20  leaf nodes in a 
3720: 6e 65 77 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 63  new segment.** c
3730: 72 65 61 74 65 64 20 62 79 20 6d 65 72 67 69 6e  reated by mergin
3740: 67 20 74 68 65 20 6f 6c 64 65 73 74 20 3a 32 20  g the oldest :2 
3750: 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 61 62  segments from ab
3760: 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 3a 31 2e  solute level :1.
3770: 20 53 65 65 20 0a 2a 2a 20 66 75 6e 63 74 69 6f   See .** functio
3780: 6e 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 63  n sqlite3Fts3Inc
3790: 72 6d 65 72 67 65 28 29 20 66 6f 72 20 64 65 74  rmerge() for det
37a0: 61 69 6c 73 2e 20 20 2a 2f 0a 2f 2a 20 32 39 20  ails.  */./* 29 
37b0: 2a 2f 20 22 53 45 4c 45 43 54 20 32 20 2a 20 74  */ "SELECT 2 * t
37c0: 6f 74 61 6c 28 31 20 2b 20 6c 65 61 76 65 73 5f  otal(1 + leaves_
37d0: 65 6e 64 5f 62 6c 6f 63 6b 20 2d 20 73 74 61 72  end_block - star
37e0: 74 5f 62 6c 6f 63 6b 29 20 22 0a 20 20 20 20 20  t_block) ".     
37f0: 20 20 20 20 22 20 20 46 52 4f 4d 20 25 51 2e 27      "  FROM %Q.'
3800: 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52 45  %q_segdir' WHERE
3810: 20 6c 65 76 65 6c 20 3d 20 3f 20 41 4e 44 20 69   level = ? AND i
3820: 64 78 20 3c 20 3f 22 2c 0a 0a 2f 2a 20 53 51 4c  dx < ?",../* SQL
3830: 5f 44 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 45  _DELETE_SEGDIR_E
3840: 4e 54 52 59 0a 2a 2a 20 20 20 44 65 6c 65 74 65  NTRY.**   Delete
3850: 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 65 6e   the %_segdir en
3860: 74 72 79 20 6f 6e 20 61 62 73 6f 6c 75 74 65 20  try on absolute 
3870: 6c 65 76 65 6c 20 3a 31 20 77 69 74 68 20 69 6e  level :1 with in
3880: 64 65 78 20 3a 32 2e 20 20 2a 2f 0a 2f 2a 20 33  dex :2.  */./* 3
3890: 30 20 2a 2f 20 22 44 45 4c 45 54 45 20 46 52 4f  0 */ "DELETE FRO
38a0: 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27  M %Q.'%q_segdir'
38b0: 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f   WHERE level = ?
38c0: 20 41 4e 44 20 69 64 78 20 3d 20 3f 22 2c 0a 0a   AND idx = ?",..
38d0: 2f 2a 20 53 51 4c 5f 53 48 49 46 54 5f 53 45 47  /* SQL_SHIFT_SEG
38e0: 44 49 52 5f 45 4e 54 52 59 0a 2a 2a 20 20 20 4d  DIR_ENTRY.**   M
38f0: 6f 64 69 66 79 20 74 68 65 20 69 64 78 20 76 61  odify the idx va
3900: 6c 75 65 20 66 6f 72 20 74 68 65 20 73 65 67 6d  lue for the segm
3910: 65 6e 74 20 77 69 74 68 20 69 64 78 3d 3a 33 20  ent with idx=:3 
3920: 6f 6e 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65  on absolute leve
3930: 6c 20 3a 32 0a 2a 2a 20 20 20 74 6f 20 3a 31 2e  l :2.**   to :1.
3940: 20 20 2a 2f 0a 2f 2a 20 33 31 20 2a 2f 20 22 55    */./* 31 */ "U
3950: 50 44 41 54 45 20 25 51 2e 27 25 71 5f 73 65 67  PDATE %Q.'%q_seg
3960: 64 69 72 27 20 53 45 54 20 69 64 78 20 3d 20 3f  dir' SET idx = ?
3970: 20 57 48 45 52 45 20 6c 65 76 65 6c 3d 3f 20 41   WHERE level=? A
3980: 4e 44 20 69 64 78 3d 3f 22 2c 0a 0a 2f 2a 20 53  ND idx=?",../* S
3990: 51 4c 5f 53 45 4c 45 43 54 5f 53 45 47 44 49 52  QL_SELECT_SEGDIR
39a0: 0a 2a 2a 20 20 20 52 65 61 64 20 61 20 73 69 6e  .**   Read a sin
39b0: 67 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 74  gle entry from t
39c0: 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c  he %_segdir tabl
39d0: 65 2e 20 54 68 65 20 65 6e 74 72 79 20 66 72 6f  e. The entry fro
39e0: 6d 20 61 62 73 6f 6c 75 74 65 20 0a 2a 2a 20 20  m absolute .**  
39f0: 20 6c 65 76 65 6c 20 3a 31 20 77 69 74 68 20 69   level :1 with i
3a00: 6e 64 65 78 20 76 61 6c 75 65 20 3a 32 2e 20 20  ndex value :2.  
3a10: 2a 2f 0a 2f 2a 20 33 32 20 2a 2f 20 20 22 53 45  */./* 32 */  "SE
3a20: 4c 45 43 54 20 69 64 78 2c 20 73 74 61 72 74 5f  LECT idx, start_
3a30: 62 6c 6f 63 6b 2c 20 6c 65 61 76 65 73 5f 65 6e  block, leaves_en
3a40: 64 5f 62 6c 6f 63 6b 2c 20 65 6e 64 5f 62 6c 6f  d_block, end_blo
3a50: 63 6b 2c 20 72 6f 6f 74 20 22 0a 20 20 20 20 20  ck, root ".     
3a60: 20 20 20 20 20 20 20 22 46 52 4f 4d 20 25 51 2e         "FROM %Q.
3a70: 27 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52  '%q_segdir' WHER
3a80: 45 20 6c 65 76 65 6c 20 3d 20 3f 20 41 4e 44 20  E level = ? AND 
3a90: 69 64 78 20 3d 20 3f 22 2c 0a 0a 2f 2a 20 53 51  idx = ?",../* SQ
3aa0: 4c 5f 43 48 4f 4d 50 5f 53 45 47 44 49 52 0a 2a  L_CHOMP_SEGDIR.*
3ab0: 2a 20 20 20 55 70 64 61 74 65 20 74 68 65 20 73  *   Update the s
3ac0: 74 61 72 74 5f 62 6c 6f 63 6b 20 28 3a 31 29 20  tart_block (:1) 
3ad0: 61 6e 64 20 72 6f 6f 74 20 28 3a 32 29 20 66 69  and root (:2) fi
3ae0: 65 6c 64 73 20 6f 66 20 74 68 65 20 25 5f 73 65  elds of the %_se
3af0: 67 64 69 72 0a 2a 2a 20 20 20 65 6e 74 72 79 20  gdir.**   entry 
3b00: 6c 6f 63 61 74 65 64 20 6f 6e 20 61 62 73 6f 6c  located on absol
3b10: 75 74 65 20 6c 65 76 65 6c 20 3a 33 20 77 69 74  ute level :3 wit
3b20: 68 20 69 6e 64 65 78 20 3a 34 2e 20 20 2a 2f 0a  h index :4.  */.
3b30: 2f 2a 20 33 33 20 2a 2f 20 20 22 55 50 44 41 54  /* 33 */  "UPDAT
3b40: 45 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27  E %Q.'%q_segdir'
3b50: 20 53 45 54 20 73 74 61 72 74 5f 62 6c 6f 63 6b   SET start_block
3b60: 20 3d 20 3f 2c 20 72 6f 6f 74 20 3d 20 3f 22 0a   = ?, root = ?".
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 22 57 48 45              "WHE
3b80: 52 45 20 6c 65 76 65 6c 20 3d 20 3f 20 41 4e 44  RE level = ? AND
3b90: 20 69 64 78 20 3d 20 3f 22 2c 0a 0a 2f 2a 20 53   idx = ?",../* S
3ba0: 51 4c 5f 53 45 47 4d 45 4e 54 5f 49 53 5f 41 50  QL_SEGMENT_IS_AP
3bb0: 50 45 4e 44 41 42 4c 45 0a 2a 2a 20 20 20 52 65  PENDABLE.**   Re
3bc0: 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f  turn a single ro
3bd0: 77 20 69 66 20 74 68 65 20 73 65 67 6d 65 6e 74  w if the segment
3be0: 20 77 69 74 68 20 65 6e 64 5f 62 6c 6f 63 6b 3d   with end_block=
3bf0: 3f 20 69 73 20 61 70 70 65 6e 64 61 62 6c 65 2e  ? is appendable.
3c00: 20 4f 72 0a 2a 2a 20 20 20 6e 6f 20 72 6f 77 73   Or.**   no rows
3c10: 20 6f 74 68 65 72 77 69 73 65 2e 20 20 2a 2f 0a   otherwise.  */.
3c20: 2f 2a 20 33 34 20 2a 2f 20 20 22 53 45 4c 45 43  /* 34 */  "SELEC
3c30: 54 20 31 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  T 1 FROM %Q.'%q_
3c40: 73 65 67 6d 65 6e 74 73 27 20 57 48 45 52 45 20  segments' WHERE 
3c50: 62 6c 6f 63 6b 69 64 3d 3f 20 41 4e 44 20 62 6c  blockid=? AND bl
3c60: 6f 63 6b 20 49 53 20 4e 55 4c 4c 22 2c 0a 0a 2f  ock IS NULL",../
3c70: 2a 20 53 51 4c 5f 53 45 4c 45 43 54 5f 49 4e 44  * SQL_SELECT_IND
3c80: 45 58 45 53 0a 2a 2a 20 20 20 52 65 74 75 72 6e  EXES.**   Return
3c90: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 76 61 6c   the list of val
3ca0: 69 64 20 73 65 67 6d 65 6e 74 20 69 6e 64 65 78  id segment index
3cb0: 65 73 20 66 6f 72 20 61 62 73 6f 6c 75 74 65 20  es for absolute 
3cc0: 6c 65 76 65 6c 20 3f 20 20 2a 2f 0a 2f 2a 20 33  level ?  */./* 3
3cd0: 35 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 69 64  5 */  "SELECT id
3ce0: 78 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65  x FROM %Q.'%q_se
3cf0: 67 64 69 72 27 20 57 48 45 52 45 20 6c 65 76 65  gdir' WHERE leve
3d00: 6c 3d 3f 20 4f 52 44 45 52 20 42 59 20 31 20 41  l=? ORDER BY 1 A
3d10: 53 43 22 2c 0a 0a 2f 2a 20 53 51 4c 5f 53 45 4c  SC",../* SQL_SEL
3d20: 45 43 54 5f 4d 58 4c 45 56 45 4c 0a 2a 2a 20 20  ECT_MXLEVEL.**  
3d30: 20 52 65 74 75 72 6e 20 74 68 65 20 6c 61 72 67   Return the larg
3d40: 65 73 74 20 72 65 6c 61 74 69 76 65 20 6c 65 76  est relative lev
3d50: 65 6c 20 69 6e 20 74 68 65 20 46 54 53 20 69 6e  el in the FTS in
3d60: 64 65 78 20 6f 72 20 69 6e 64 65 78 65 73 2e 20  dex or indexes. 
3d70: 20 2a 2f 0a 2f 2a 20 33 36 20 2a 2f 20 20 22 53   */./* 36 */  "S
3d80: 45 4c 45 43 54 20 6d 61 78 28 20 6c 65 76 65 6c  ELECT max( level
3d90: 20 25 25 20 31 30 32 34 20 29 20 46 52 4f 4d 20   %% 1024 ) FROM 
3da0: 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 22 2c  %Q.'%q_segdir'",
3db0: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ..          /* R
3dc0: 65 74 75 72 6e 20 73 65 67 6d 65 6e 74 73 20 69  eturn segments i
3dd0: 6e 20 6f 72 64 65 72 20 66 72 6f 6d 20 6f 6c 64  n order from old
3de0: 65 73 74 20 74 6f 20 6e 65 77 65 73 74 2e 2a 2f  est to newest.*/
3df0: 20 0a 2f 2a 20 33 37 20 2a 2f 20 20 22 53 45 4c   ./* 37 */  "SEL
3e00: 45 43 54 20 6c 65 76 65 6c 2c 20 69 64 78 2c 20  ECT level, idx, 
3e10: 65 6e 64 5f 62 6c 6f 63 6b 20 22 0a 20 20 20 20  end_block ".    
3e20: 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 25 51          "FROM %Q
3e30: 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57 48 45  .'%q_segdir' WHE
3e40: 52 45 20 6c 65 76 65 6c 20 42 45 54 57 45 45 4e  RE level BETWEEN
3e50: 20 3f 20 41 4e 44 20 3f 20 22 0a 20 20 20 20 20   ? AND ? ".     
3e60: 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59         "ORDER BY
3e70: 20 6c 65 76 65 6c 20 44 45 53 43 2c 20 69 64 78   level DESC, idx
3e80: 20 41 53 43 22 2c 0a 0a 20 20 20 20 20 20 20 20   ASC",..        
3e90: 20 20 2f 2a 20 55 70 64 61 74 65 20 73 74 61 74    /* Update stat
3ea0: 65 6d 65 6e 74 73 20 75 73 65 64 20 77 68 69 6c  ements used whil
3eb0: 65 20 70 72 6f 6d 6f 74 69 6e 67 20 73 65 67 6d  e promoting segm
3ec0: 65 6e 74 73 20 2a 2f 0a 2f 2a 20 33 38 20 2a 2f  ents */./* 38 */
3ed0: 20 20 22 55 50 44 41 54 45 20 4f 52 20 46 41 49    "UPDATE OR FAI
3ee0: 4c 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27  L %Q.'%q_segdir'
3ef0: 20 53 45 54 20 6c 65 76 65 6c 3d 2d 31 2c 69 64   SET level=-1,id
3f00: 78 3d 3f 20 22 0a 20 20 20 20 20 20 20 20 20 20  x=? ".          
3f10: 20 20 22 57 48 45 52 45 20 6c 65 76 65 6c 3d 3f    "WHERE level=?
3f20: 20 41 4e 44 20 69 64 78 3d 3f 22 2c 0a 2f 2a 20   AND idx=?",./* 
3f30: 33 39 20 2a 2f 20 20 22 55 50 44 41 54 45 20 4f  39 */  "UPDATE O
3f40: 52 20 46 41 49 4c 20 25 51 2e 27 25 71 5f 73 65  R FAIL %Q.'%q_se
3f50: 67 64 69 72 27 20 53 45 54 20 6c 65 76 65 6c 3d  gdir' SET level=
3f60: 3f 20 57 48 45 52 45 20 6c 65 76 65 6c 3d 2d 31  ? WHERE level=-1
3f70: 22 0a 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 72 63  "..  };.  int rc
3f80: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
3f90: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
3fa0: 74 6d 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  tmt;..  assert( 
3fb0: 53 69 7a 65 6f 66 41 72 72 61 79 28 61 7a 53 71  SizeofArray(azSq
3fc0: 6c 29 3d 3d 53 69 7a 65 6f 66 41 72 72 61 79 28  l)==SizeofArray(
3fd0: 70 2d 3e 61 53 74 6d 74 29 20 29 3b 0a 20 20 61  p->aStmt) );.  a
3fe0: 73 73 65 72 74 28 20 65 53 74 6d 74 3c 53 69 7a  ssert( eStmt<Siz
3ff0: 65 6f 66 41 72 72 61 79 28 61 7a 53 71 6c 29 20  eofArray(azSql) 
4000: 26 26 20 65 53 74 6d 74 3e 3d 30 20 29 3b 0a 20  && eStmt>=0 );. 
4010: 20 0a 20 20 70 53 74 6d 74 20 3d 20 70 2d 3e 61   .  pStmt = p->a
4020: 53 74 6d 74 5b 65 53 74 6d 74 5d 3b 0a 20 20 69  Stmt[eStmt];.  i
4030: 66 28 20 21 70 53 74 6d 74 20 29 7b 0a 20 20 20  f( !pStmt ){.   
4040: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20   char *zSql;.   
4050: 20 69 66 28 20 65 53 74 6d 74 3d 3d 53 51 4c 5f   if( eStmt==SQL_
4060: 43 4f 4e 54 45 4e 54 5f 49 4e 53 45 52 54 20 29  CONTENT_INSERT )
4070: 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73  {.      zSql = s
4080: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
4090: 7a 53 71 6c 5b 65 53 74 6d 74 5d 2c 20 70 2d 3e  zSql[eStmt], p->
40a0: 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70  zDb, p->zName, p
40b0: 2d 3e 7a 57 72 69 74 65 45 78 70 72 6c 69 73 74  ->zWriteExprlist
40c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
40d0: 20 65 53 74 6d 74 3d 3d 53 51 4c 5f 53 45 4c 45   eStmt==SQL_SELE
40e0: 43 54 5f 43 4f 4e 54 45 4e 54 5f 42 59 5f 52 4f  CT_CONTENT_BY_RO
40f0: 57 49 44 20 29 7b 0a 20 20 20 20 20 20 7a 53 71  WID ){.      zSq
4100: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
4110: 6e 74 66 28 61 7a 53 71 6c 5b 65 53 74 6d 74 5d  ntf(azSql[eStmt]
4120: 2c 20 70 2d 3e 7a 52 65 61 64 45 78 70 72 6c 69  , p->zReadExprli
4130: 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  st);.    }else{.
4140: 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
4150: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 7a 53  ite3_mprintf(azS
4160: 71 6c 5b 65 53 74 6d 74 5d 2c 20 70 2d 3e 7a 44  ql[eStmt], p->zD
4170: 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  b, p->zName);.  
4180: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a 53 71    }.    if( !zSq
4190: 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
41a0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
41b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
41c0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
41d0: 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
41e0: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
41f0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
4200: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
4210: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
4220: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
4230: 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
4240: 20 20 70 2d 3e 61 53 74 6d 74 5b 65 53 74 6d 74    p->aStmt[eStmt
4250: 5d 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 7d  ] = pStmt;.    }
4260: 0a 20 20 7d 0a 20 20 69 66 28 20 61 70 56 61 6c  .  }.  if( apVal
4270: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
4280: 20 20 20 69 6e 74 20 6e 50 61 72 61 6d 20 3d 20     int nParam = 
4290: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
42a0: 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74  ameter_count(pSt
42b0: 6d 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  mt);.    for(i=0
42c0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
42d0: 26 26 20 69 3c 6e 50 61 72 61 6d 3b 20 69 2b 2b  && i<nParam; i++
42e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
42f0: 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65  lite3_bind_value
4300: 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61 70 56  (pStmt, i+1, apV
4310: 61 6c 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  al[i]);.    }.  
4320: 7d 0a 20 20 2a 70 70 20 3d 20 70 53 74 6d 74 3b  }.  *pp = pStmt;
4330: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4340: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
4350: 33 53 65 6c 65 63 74 44 6f 63 73 69 7a 65 28 0a  3SelectDocsize(.
4360: 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 54 61    Fts3Table *pTa
4370: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
4380: 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20    /* FTS3 table 
4390: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69  handle */.  sqli
43a0: 74 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64  te3_int64 iDocid
43b0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ,           /* D
43c0: 6f 63 69 64 20 74 6f 20 62 69 6e 64 20 66 6f 72  ocid to bind for
43d0: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 44 4f 43 53   SQL_SELECT_DOCS
43e0: 49 5a 45 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  IZE */.  sqlite3
43f0: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 20 20  _stmt **ppStmt  
4400: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
4410: 20 53 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   Statement handl
4420: 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
4430: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
4440: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61  0;        /* Sta
4450: 74 65 6d 65 6e 74 20 72 65 71 75 65 73 74 65 64  tement requested
4460: 20 66 72 6f 6d 20 66 74 73 33 53 71 6c 53 74 6d   from fts3SqlStm
4470: 74 28 29 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  t() */.  int rc;
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4490: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
44a0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 72 63  rn code */..  rc
44b0: 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
44c0: 54 61 62 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f  Tab, SQL_SELECT_
44d0: 44 4f 43 53 49 5a 45 2c 20 26 70 53 74 6d 74 2c  DOCSIZE, &pStmt,
44e0: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
44f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4500: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
4510: 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 69 44 6f  64(pStmt, 1, iDo
4520: 63 69 64 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  cid);.    rc = s
4530: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
4540: 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
4550: 53 51 4c 49 54 45 5f 52 4f 57 20 7c 7c 20 73 71  SQLITE_ROW || sq
4560: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
4570: 65 28 70 53 74 6d 74 2c 20 30 29 21 3d 53 51 4c  e(pStmt, 0)!=SQL
4580: 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20  ITE_BLOB ){.    
4590: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
45a0: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  eset(pStmt);.   
45b0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
45c0: 45 5f 4f 4b 20 29 20 72 63 20 3d 20 46 54 53 5f  E_OK ) rc = FTS_
45d0: 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20  CORRUPT_VTAB;.  
45e0: 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20      pStmt = 0;. 
45f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4600: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
4610: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70      }.  }..  *pp
4620: 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20  Stmt = pStmt;.  
4630: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e  return rc;.}..in
4640: 74 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 6c  t sqlite3Fts3Sel
4650: 65 63 74 44 6f 63 74 6f 74 61 6c 28 0a 20 20 46  ectDoctotal(.  F
4660: 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  ts3Table *pTab, 
4670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4680: 2a 20 46 74 73 33 20 74 61 62 6c 65 20 68 61 6e  * Fts3 table han
4690: 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dle */.  sqlite3
46a0: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 20 20  _stmt **ppStmt  
46b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
46c0: 20 53 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   Statement handl
46d0: 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
46e0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
46f0: 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72  0;.  int rc;.  r
4700: 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
4710: 70 54 61 62 2c 20 53 51 4c 5f 53 45 4c 45 43 54  pTab, SQL_SELECT
4720: 5f 53 54 41 54 2c 20 26 70 53 74 6d 74 2c 20 30  _STAT, &pStmt, 0
4730: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
4740: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
4750: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
4760: 53 74 6d 74 2c 20 31 2c 20 46 54 53 5f 53 54 41  Stmt, 1, FTS_STA
4770: 54 5f 44 4f 43 54 4f 54 41 4c 29 3b 0a 20 20 20  T_DOCTOTAL);.   
4780: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65   if( sqlite3_ste
4790: 70 28 70 53 74 6d 74 29 21 3d 53 51 4c 49 54 45  p(pStmt)!=SQLITE
47a0: 5f 52 4f 57 0a 20 20 20 20 20 7c 7c 20 73 71 6c  _ROW.     || sql
47b0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
47c0: 28 70 53 74 6d 74 2c 20 30 29 21 3d 53 51 4c 49  (pStmt, 0)!=SQLI
47d0: 54 45 5f 42 4c 4f 42 0a 20 20 20 20 29 7b 0a 20  TE_BLOB.    ){. 
47e0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
47f0: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
4800: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
4810: 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 46  LITE_OK ) rc = F
4820: 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b  TS_CORRUPT_VTAB;
4830: 0a 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20 30  .      pStmt = 0
4840: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
4850: 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20  pStmt = pStmt;. 
4860: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69   return rc;.}..i
4870: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 53 65  nt sqlite3Fts3Se
4880: 6c 65 63 74 44 6f 63 73 69 7a 65 28 0a 20 20 46  lectDocsize(.  F
4890: 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  ts3Table *pTab, 
48a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
48b0: 2a 20 46 74 73 33 20 74 61 62 6c 65 20 68 61 6e  * Fts3 table han
48c0: 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dle */.  sqlite3
48d0: 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 2c 20 20  _int64 iDocid,  
48e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 69           /* Doci
48f0: 64 20 74 6f 20 72 65 61 64 20 73 69 7a 65 20 64  d to read size d
4900: 61 74 61 20 66 6f 72 20 2a 2f 0a 20 20 73 71 6c  ata for */.  sql
4910: 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
4920: 6d 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mt           /* 
4930: 4f 55 54 3a 20 53 74 61 74 65 6d 65 6e 74 20 68  OUT: Statement h
4940: 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a 20 20 72 65  andle */.){.  re
4950: 74 75 72 6e 20 66 74 73 33 53 65 6c 65 63 74 44  turn fts3SelectD
4960: 6f 63 73 69 7a 65 28 70 54 61 62 2c 20 69 44 6f  ocsize(pTab, iDo
4970: 63 69 64 2c 20 70 70 53 74 6d 74 29 3b 0a 7d 0a  cid, ppStmt);.}.
4980: 0a 2f 2a 0a 2a 2a 20 53 69 6d 69 6c 61 72 20 74  ./*.** Similar t
4990: 6f 20 66 74 73 33 53 71 6c 53 74 6d 74 28 29 2e  o fts3SqlStmt().
49a0: 20 45 78 63 65 70 74 2c 20 61 66 74 65 72 20 62   Except, after b
49b0: 69 6e 64 69 6e 67 20 74 68 65 20 70 61 72 61 6d  inding the param
49c0: 65 74 65 72 73 20 69 6e 0a 2a 2a 20 61 72 72 61  eters in.** arra
49d0: 79 20 61 70 56 61 6c 5b 5d 20 74 6f 20 74 68 65  y apVal[] to the
49e0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
49f0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 65 53 74  dentified by eSt
4a00: 6d 74 2c 20 74 68 65 20 73 74 61 74 65 6d 65 6e  mt, the statemen
4a10: 74 0a 2a 2a 20 69 73 20 65 78 65 63 75 74 65 64  t.** is executed
4a20: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  ..**.** Returns 
4a30: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
4a40: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 75   statement is su
4a50: 63 63 65 73 73 66 75 6c 6c 79 20 65 78 65 63 75  ccessfully execu
4a60: 74 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 53 51  ted, or an.** SQ
4a70: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
4a80: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
4a90: 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 53 71  atic void fts3Sq
4aa0: 6c 45 78 65 63 28 0a 20 20 69 6e 74 20 2a 70 52  lExec(.  int *pR
4ab0: 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C,              
4ac0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
4ad0: 20 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c 65 20   */.  Fts3Table 
4ae0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
4af0: 2a 20 54 68 65 20 46 54 53 33 20 74 61 62 6c 65  * The FTS3 table
4b00: 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74 6d 74 2c   */.  int eStmt,
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4b20: 2a 20 49 6e 64 65 78 20 6f 66 20 73 74 61 74 65  * Index of state
4b30: 6d 65 6e 74 20 74 6f 20 65 76 61 6c 75 61 74 65  ment to evaluate
4b40: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
4b50: 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 2f  lue **apVal    /
4b60: 2a 20 50 61 72 61 6d 65 74 65 72 73 20 74 6f 20  * Parameters to 
4b70: 62 69 6e 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  bind */.){.  sql
4b80: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
4b90: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
4ba0: 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
4bb0: 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
4bc0: 74 6d 74 28 70 2c 20 65 53 74 6d 74 2c 20 26 70  tmt(p, eStmt, &p
4bd0: 53 74 6d 74 2c 20 61 70 56 61 6c 29 3b 20 0a 20  Stmt, apVal); . 
4be0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4bf0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
4c00: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
4c10: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
4c20: 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
4c30: 7d 0a 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 7d  }.  *pRC = rc;.}
4c40: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
4c50: 6e 63 74 69 6f 6e 20 65 6e 73 75 72 65 73 20 74  nction ensures t
4c60: 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
4c70: 61 73 20 6f 62 74 61 69 6e 65 64 20 61 6e 20 65  as obtained an e
4c80: 78 63 6c 75 73 69 76 65 20 0a 2a 2a 20 73 68 61  xclusive .** sha
4c90: 72 65 64 2d 63 61 63 68 65 20 74 61 62 6c 65 2d  red-cache table-
4ca0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 25 5f 73 65  lock on the %_se
4cb0: 67 64 69 72 20 74 61 62 6c 65 2e 20 54 68 69 73  gdir table. This
4cc0: 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66   is required bef
4cd0: 6f 72 65 20 0a 2a 2a 20 77 72 69 74 69 6e 67 20  ore .** writing 
4ce0: 64 61 74 61 20 74 6f 20 74 68 65 20 66 74 73 33  data to the fts3
4cf0: 20 74 61 62 6c 65 2e 20 49 66 20 74 68 69 73 20   table. If this 
4d00: 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 61 63 71 75  lock is not acqu
4d10: 69 72 65 64 20 66 69 72 73 74 2c 20 74 68 65 6e  ired first, then
4d20: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 6d  .** the caller m
4d30: 61 79 20 65 6e 64 20 75 70 20 61 74 74 65 6d 70  ay end up attemp
4d40: 74 69 6e 67 20 74 6f 20 74 61 6b 65 20 74 68 69  ting to take thi
4d50: 73 20 6c 6f 63 6b 20 61 73 20 70 61 72 74 20 6f  s lock as part o
4d60: 66 20 63 6f 6d 6d 69 74 74 69 6e 67 0a 2a 2a 20  f committing.** 
4d70: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63  a transaction, c
4d80: 61 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f  ausing SQLite to
4d90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
4da0: 4f 43 4b 45 44 20 6f 72 20 0a 2a 2a 20 4c 4f 43  OCKED or .** LOC
4db0: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 74  KED_SHAREDCACHEt
4dc0: 6f 20 61 20 43 4f 4d 4d 49 54 20 63 6f 6d 6d 61  o a COMMIT comma
4dd0: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  nd..**.** It is 
4de0: 62 65 73 74 20 74 6f 20 61 76 6f 69 64 20 74 68  best to avoid th
4df0: 69 73 20 62 65 63 61 75 73 65 20 69 66 20 46 54  is because if FT
4e00: 53 33 20 72 65 74 75 72 6e 73 20 61 6e 79 20 65  S3 returns any e
4e10: 72 72 6f 72 20 77 68 65 6e 20 0a 2a 2a 20 63 6f  rror when .** co
4e20: 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
4e30: 61 63 74 69 6f 6e 2c 20 74 68 65 20 77 68 6f 6c  action, the whol
4e40: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  e transaction wi
4e50: 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ll be rolled bac
4e60: 6b 2e 20 0a 2a 2a 20 41 6e 64 20 74 68 69 73 20  k. .** And this 
4e70: 69 73 20 6e 6f 74 20 77 68 61 74 20 75 73 65 72  is not what user
4e80: 73 20 65 78 70 65 63 74 20 77 68 65 6e 20 74 68  s expect when th
4e90: 65 79 20 67 65 74 20 53 51 4c 49 54 45 5f 4c 4f  ey get SQLITE_LO
4ea0: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
4eb0: 2e 20 0a 2a 2a 20 49 74 20 63 61 6e 20 73 74 69  . .** It can sti
4ec0: 6c 6c 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ll happen if the
4ed0: 20 75 73 65 72 20 6c 6f 63 6b 73 20 74 68 65 20   user locks the 
4ee0: 75 6e 64 65 72 6c 79 69 6e 67 20 74 61 62 6c 65  underlying table
4ef0: 73 20 64 69 72 65 63 74 6c 79 20 0a 2a 2a 20 69  s directly .** i
4f00: 6e 73 74 65 61 64 20 6f 66 20 61 63 63 65 73 73  nstead of access
4f10: 69 6e 67 20 74 68 65 6d 20 76 69 61 20 46 54 53  ing them via FTS
4f20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4f30: 66 74 73 33 57 72 69 74 65 6c 6f 63 6b 28 46 74  fts3Writelock(Ft
4f40: 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69  s3Table *p){.  i
4f50: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
4f60: 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70 2d 3e 6e  K;.  .  if( p->n
4f70: 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29  PendingData==0 )
4f80: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
4f90: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 72  mt *pStmt;.    r
4fa0: 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
4fb0: 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45  p, SQL_DELETE_SE
4fc0: 47 44 49 52 5f 4c 45 56 45 4c 2c 20 26 70 53 74  GDIR_LEVEL, &pSt
4fd0: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mt, 0);.    if( 
4fe0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
4ff0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
5000: 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20  ind_null(pStmt, 
5010: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
5020: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
5030: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
5040: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
5050: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
5060: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5070: 20 46 54 53 20 6d 61 69 6e 74 61 69 6e 73 20 61   FTS maintains a
5080: 20 73 65 70 61 72 61 74 65 20 69 6e 64 65 78 65   separate indexe
5090: 73 20 66 6f 72 20 65 61 63 68 20 6c 61 6e 67 75  s for each langu
50a0: 61 67 65 2d 69 64 20 28 61 20 33 32 2d 62 69 74  age-id (a 32-bit
50b0: 20 69 6e 74 65 67 65 72 29 2e 0a 2a 2a 20 57 69   integer)..** Wi
50c0: 74 68 69 6e 20 65 61 63 68 20 6c 61 6e 67 75 61  thin each langua
50d0: 67 65 20 69 64 2c 20 61 20 73 65 70 61 72 61 74  ge id, a separat
50e0: 65 20 69 6e 64 65 78 20 69 73 20 6d 61 69 6e 74  e index is maint
50f0: 61 69 6e 65 64 20 74 6f 20 73 74 6f 72 65 20 74  ained to store t
5100: 68 65 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 20 74  he.** document t
5110: 65 72 6d 73 2c 20 61 6e 64 20 65 61 63 68 20 63  erms, and each c
5120: 6f 6e 66 69 67 75 72 65 64 20 70 72 65 66 69 78  onfigured prefix
5130: 20 73 69 7a 65 20 28 63 6f 6e 66 69 67 75 72 65   size (configure
5140: 64 20 74 68 65 20 46 54 53 20 0a 2a 2a 20 22 70  d the FTS .** "p
5150: 72 65 66 69 78 3d 22 20 6f 70 74 69 6f 6e 29 2e  refix=" option).
5160: 20 41 6e 64 20 65 61 63 68 20 69 6e 64 65 78 20   And each index 
5170: 63 6f 6e 73 69 73 74 73 20 6f 66 20 6d 75 6c 74  consists of mult
5180: 69 70 6c 65 20 6c 65 76 65 6c 73 20 28 22 72 65  iple levels ("re
5190: 6c 61 74 69 76 65 0a 2a 2a 20 6c 65 76 65 6c 73  lative.** levels
51a0: 22 29 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 68  ")..**.** All th
51b0: 72 65 65 20 6f 66 20 74 68 65 73 65 20 76 61 6c  ree of these val
51c0: 75 65 73 20 28 74 68 65 20 6c 61 6e 67 75 61 67  ues (the languag
51d0: 65 20 69 64 2c 20 74 68 65 20 73 70 65 63 69 66  e id, the specif
51e0: 69 63 20 69 6e 64 65 78 20 61 6e 64 20 74 68 65  ic index and the
51f0: 0a 2a 2a 20 6c 65 76 65 6c 20 77 69 74 68 69 6e  .** level within
5200: 20 74 68 65 20 69 6e 64 65 78 29 20 61 72 65 20   the index) are 
5210: 65 6e 63 6f 64 65 64 20 69 6e 20 36 34 2d 62 69  encoded in 64-bi
5220: 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73  t integer values
5230: 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68   stored.** in th
5240: 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65  e %_segdir table
5250: 20 6f 6e 20 64 69 73 6b 2e 20 54 68 69 73 20 66   on disk. This f
5260: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
5270: 74 6f 20 63 6f 6e 76 65 72 74 20 74 68 72 65 65  to convert three
5280: 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 63 6f 6d  .** separate com
5290: 70 6f 6e 65 6e 74 20 76 61 6c 75 65 73 20 69 6e  ponent values in
52a0: 74 6f 20 74 68 65 20 73 69 6e 67 6c 65 20 36 34  to the single 64
52b0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c  -bit integer val
52c0: 75 65 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62  ue that.** can b
52d0: 65 20 75 73 65 64 20 74 6f 20 71 75 65 72 79 20  e used to query 
52e0: 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62  the %_segdir tab
52f0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66  le..**.** Specif
5300: 69 63 61 6c 6c 79 2c 20 65 61 63 68 20 6c 61 6e  ically, each lan
5310: 67 75 61 67 65 2d 69 64 2f 69 6e 64 65 78 20 63  guage-id/index c
5320: 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73 20 61 6c  ombination is al
5330: 6c 6f 63 61 74 65 64 20 31 30 32 34 20 0a 2a 2a  located 1024 .**
5340: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
5350: 6c 65 76 65 6c 20 76 61 6c 75 65 73 20 28 22 61  level values ("a
5360: 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 73 22 29  bsolute levels")
5370: 2e 20 54 68 65 20 6d 61 69 6e 20 74 65 72 6d 73  . The main terms
5380: 20 69 6e 64 65 78 0a 2a 2a 20 66 6f 72 20 6c 61   index.** for la
5390: 6e 67 75 61 67 65 2d 69 64 20 30 20 69 73 20 61  nguage-id 0 is a
53a0: 6c 6c 6f 63 61 74 65 20 76 61 6c 75 65 73 20 30  llocate values 0
53b0: 2d 31 30 32 33 2e 20 54 68 65 20 66 69 72 73 74  -1023. The first
53c0: 20 70 72 65 66 69 78 20 69 6e 64 65 78 0a 2a 2a   prefix index.**
53d0: 20 28 69 66 20 61 6e 79 29 20 66 6f 72 20 6c 61   (if any) for la
53e0: 6e 67 75 61 67 65 2d 69 64 20 30 20 69 73 20 61  nguage-id 0 is a
53f0: 6c 6c 6f 63 61 74 65 64 20 76 61 6c 75 65 73 20  llocated values 
5400: 31 30 32 34 2d 32 30 34 37 2e 20 41 6e 64 20 73  1024-2047. And s
5410: 6f 20 6f 6e 2e 0a 2a 2a 20 4c 61 6e 67 75 61 67  o on..** Languag
5420: 65 20 31 20 69 6e 64 65 78 65 73 20 61 72 65 20  e 1 indexes are 
5430: 61 6c 6c 6f 63 61 74 65 64 20 69 6d 6d 65 64 69  allocated immedi
5440: 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
5450: 6c 61 6e 67 75 61 67 65 20 30 2e 0a 2a 2a 0a 2a  language 0..**.*
5460: 2a 20 53 6f 2c 20 66 6f 72 20 61 20 73 79 73 74  * So, for a syst
5470: 65 6d 20 77 69 74 68 20 6e 50 72 65 66 69 78 20  em with nPrefix 
5480: 70 72 65 66 69 78 20 69 6e 64 65 78 65 73 20 63  prefix indexes c
5490: 6f 6e 66 69 67 75 72 65 64 2c 20 74 68 65 20 62  onfigured, the b
54a0: 6c 6f 63 6b 20 6f 66 0a 2a 2a 20 61 62 73 6f 6c  lock of.** absol
54b0: 75 74 65 20 6c 65 76 65 6c 73 20 74 68 61 74 20  ute levels that 
54c0: 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 6c  corresponds to l
54d0: 61 6e 67 75 61 67 65 2d 69 64 20 69 4c 61 6e 67  anguage-id iLang
54e0: 69 64 20 61 6e 64 20 69 6e 64 65 78 20 0a 2a 2a  id and index .**
54f0: 20 69 49 6e 64 65 78 20 73 74 61 72 74 73 20 61   iIndex starts a
5500: 74 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c  t absolute level
5510: 20 28 28 69 4c 61 6e 67 69 64 20 2a 20 28 6e 50   ((iLangid * (nP
5520: 72 65 66 69 78 2b 31 29 20 2b 20 69 49 6e 64 65  refix+1) + iInde
5530: 78 29 20 2a 20 31 30 32 34 29 2e 0a 2a 2f 0a 73  x) * 1024)..*/.s
5540: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e  tatic sqlite3_in
5550: 74 36 34 20 67 65 74 41 62 73 6f 6c 75 74 65 4c  t64 getAbsoluteL
5560: 65 76 65 6c 28 0a 20 20 46 74 73 33 54 61 62 6c  evel(.  Fts3Tabl
5570: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
5580: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20          /* FTS3 
5590: 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
55a0: 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20    int iLangid,  
55b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55c0: 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64    /* Language id
55d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 78   */.  int iIndex
55e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
55f0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
5600: 6e 20 70 2d 3e 61 49 6e 64 65 78 5b 5d 20 2a 2f  n p->aIndex[] */
5610: 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 20 20 20  .  int iLevel   
5620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5630: 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 20 73     /* Level of s
5640: 65 67 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  egments */.){.  
5650: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 42  sqlite3_int64 iB
5660: 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
5670: 2f 2a 20 46 69 72 73 74 20 61 62 73 6f 6c 75 74  /* First absolut
5680: 65 20 6c 65 76 65 6c 20 66 6f 72 20 69 4c 61 6e  e level for iLan
5690: 67 69 64 2f 69 49 6e 64 65 78 20 2a 2f 0a 20 20  gid/iIndex */.  
56a0: 61 73 73 65 72 74 28 20 69 4c 61 6e 67 69 64 3e  assert( iLangid>
56b0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
56c0: 70 2d 3e 6e 49 6e 64 65 78 3e 30 20 29 3b 0a 20  p->nIndex>0 );. 
56d0: 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 3e   assert( iIndex>
56e0: 3d 30 20 26 26 20 69 49 6e 64 65 78 3c 70 2d 3e  =0 && iIndex<p->
56f0: 6e 49 6e 64 65 78 20 29 3b 0a 0a 20 20 69 42 61  nIndex );..  iBa
5700: 73 65 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69  se = ((sqlite3_i
5710: 6e 74 36 34 29 69 4c 61 6e 67 69 64 20 2a 20 70  nt64)iLangid * p
5720: 2d 3e 6e 49 6e 64 65 78 20 2b 20 69 49 6e 64 65  ->nIndex + iInde
5730: 78 29 20 2a 20 46 54 53 33 5f 53 45 47 44 49 52  x) * FTS3_SEGDIR
5740: 5f 4d 41 58 4c 45 56 45 4c 3b 0a 20 20 72 65 74  _MAXLEVEL;.  ret
5750: 75 72 6e 20 69 42 61 73 65 20 2b 20 69 4c 65 76  urn iBase + iLev
5760: 65 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  el;.}../*.** Set
5770: 20 2a 70 70 53 74 6d 74 20 74 6f 20 61 20 73 74   *ppStmt to a st
5780: 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 74  atement handle t
5790: 68 61 74 20 6d 61 79 20 62 65 20 75 73 65 64 20  hat may be used 
57a0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
57b0: 67 68 0a 2a 2a 20 61 6c 6c 20 72 6f 77 73 20 69  gh.** all rows i
57c0: 6e 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74  n the %_segdir t
57d0: 61 62 6c 65 2c 20 66 72 6f 6d 20 6f 6c 64 65 73  able, from oldes
57e0: 74 20 74 6f 20 6e 65 77 65 73 74 2e 20 49 66 20  t to newest. If 
57f0: 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72  successful,.** r
5800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
5810: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
5820: 75 72 73 20 77 68 69 6c 65 20 70 72 65 70 61 72  urs while prepar
5830: 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ing the statemen
5840: 74 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e  t, .** return an
5850: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
5860: 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  de..**.** There 
5870: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65  is only ever one
5880: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
5890: 73 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  s SQL statement 
58a0: 63 6f 6d 70 69 6c 65 64 20 66 6f 72 0a 2a 2a 20  compiled for.** 
58b0: 65 61 63 68 20 46 54 53 33 20 74 61 62 6c 65 2e  each FTS3 table.
58c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 61 74 65  .**.** The state
58d0: 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 74 68 65  ment returns the
58e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6c 75 6d   following colum
58f0: 6e 73 20 66 72 6f 6d 20 74 68 65 20 25 5f 73 65  ns from the %_se
5900: 67 64 69 72 20 74 61 62 6c 65 3a 0a 2a 2a 0a 2a  gdir table:.**.*
5910: 2a 20 20 20 30 3a 20 69 64 78 0a 2a 2a 20 20 20  *   0: idx.**   
5920: 31 3a 20 73 74 61 72 74 5f 62 6c 6f 63 6b 0a 2a  1: start_block.*
5930: 2a 20 20 20 32 3a 20 6c 65 61 76 65 73 5f 65 6e  *   2: leaves_en
5940: 64 5f 62 6c 6f 63 6b 0a 2a 2a 20 20 20 33 3a 20  d_block.**   3: 
5950: 65 6e 64 5f 62 6c 6f 63 6b 0a 2a 2a 20 20 20 34  end_block.**   4
5960: 3a 20 72 6f 6f 74 0a 2a 2f 0a 69 6e 74 20 73 71  : root.*/.int sq
5970: 6c 69 74 65 33 46 74 73 33 41 6c 6c 53 65 67 64  lite3Fts3AllSegd
5980: 69 72 73 28 0a 20 20 46 74 73 33 54 61 62 6c 65  irs(.  Fts3Table
5990: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
59a0: 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74         /* FTS3 t
59b0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  able */.  int iL
59c0: 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20 20  angid,          
59d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e            /* Lan
59e0: 67 75 61 67 65 20 62 65 69 6e 67 20 71 75 65 72  guage being quer
59f0: 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e  ied */.  int iIn
5a00: 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  dex,            
5a10: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
5a20: 78 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65 78 5b  x for p->aIndex[
5a30: 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  ] */.  int iLeve
5a40: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
5a50: 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20         /* Level 
5a60: 74 6f 20 73 65 6c 65 63 74 20 28 72 65 6c 61 74  to select (relat
5a70: 69 76 65 20 6c 65 76 65 6c 29 20 2a 2f 0a 20 20  ive level) */.  
5a80: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
5a90: 70 53 74 6d 74 20 20 20 20 20 20 20 20 20 20 20  pStmt           
5aa0: 2f 2a 20 4f 55 54 3a 20 43 6f 6d 70 69 6c 65 64  /* OUT: Compiled
5ab0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b   statement */.){
5ac0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
5ad0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
5ae0: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
5af0: 20 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45   iLevel==FTS3_SE
5b00: 47 43 55 52 53 4f 52 5f 41 4c 4c 20 7c 7c 20 69  GCURSOR_ALL || i
5b10: 4c 65 76 65 6c 3e 3d 30 20 29 3b 0a 20 20 61 73  Level>=0 );.  as
5b20: 73 65 72 74 28 20 69 4c 65 76 65 6c 3c 46 54 53  sert( iLevel<FTS
5b30: 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45  3_SEGDIR_MAXLEVE
5b40: 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  L );.  assert( i
5b50: 49 6e 64 65 78 3e 3d 30 20 26 26 20 69 49 6e 64  Index>=0 && iInd
5b60: 65 78 3c 70 2d 3e 6e 49 6e 64 65 78 20 29 3b 0a  ex<p->nIndex );.
5b70: 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20  .  if( iLevel<0 
5b80: 29 7b 0a 20 20 20 20 2f 2a 20 22 53 45 4c 45 43  ){.    /* "SELEC
5b90: 54 20 2a 20 46 52 4f 4d 20 25 5f 73 65 67 64 69  T * FROM %_segdi
5ba0: 72 20 57 48 45 52 45 20 6c 65 76 65 6c 20 42 45  r WHERE level BE
5bb0: 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 20 4f 52  TWEEN ? AND ? OR
5bc0: 44 45 52 20 42 59 20 2e 2e 2e 22 20 2a 2f 0a 20  DER BY ..." */. 
5bd0: 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53     rc = fts3SqlS
5be0: 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43  tmt(p, SQL_SELEC
5bf0: 54 5f 4c 45 56 45 4c 5f 52 41 4e 47 45 2c 20 26  T_LEVEL_RANGE, &
5c00: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
5c10: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5c20: 20 29 7b 20 0a 20 20 20 20 20 20 73 71 6c 69 74   ){ .      sqlit
5c30: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
5c40: 74 6d 74 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c  tmt, 1, getAbsol
5c50: 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e  uteLevel(p, iLan
5c60: 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 30 29 29  gid, iIndex, 0))
5c70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
5c80: 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
5c90: 2c 20 32 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 2, .          
5ca0: 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c  getAbsoluteLevel
5cb0: 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e  (p, iLangid, iIn
5cc0: 64 65 78 2c 20 46 54 53 33 5f 53 45 47 44 49 52  dex, FTS3_SEGDIR
5cd0: 5f 4d 41 58 4c 45 56 45 4c 2d 31 29 0a 20 20 20  _MAXLEVEL-1).   
5ce0: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65     );.    }.  }e
5cf0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 22 53 45 4c  lse{.    /* "SEL
5d00: 45 43 54 20 2a 20 46 52 4f 4d 20 25 5f 73 65 67  ECT * FROM %_seg
5d10: 64 69 72 20 57 48 45 52 45 20 6c 65 76 65 6c 20  dir WHERE level 
5d20: 3d 20 3f 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e  = ? ORDER BY ...
5d30: 22 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74  " */.    rc = ft
5d40: 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
5d50: 5f 53 45 4c 45 43 54 5f 4c 45 56 45 4c 2c 20 26  _SELECT_LEVEL, &
5d60: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
5d70: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5d80: 20 29 7b 20 0a 20 20 20 20 20 20 73 71 6c 69 74   ){ .      sqlit
5d90: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
5da0: 74 6d 74 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c  tmt, 1, getAbsol
5db0: 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e  uteLevel(p, iLan
5dc0: 67 69 64 2c 20 69 49 6e 64 65 78 2c 69 4c 65 76  gid, iIndex,iLev
5dd0: 65 6c 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  el));.    }.  }.
5de0: 20 20 2a 70 70 53 74 6d 74 20 3d 20 70 53 74 6d    *ppStmt = pStm
5df0: 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
5e00: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  }.../*.** Append
5e10: 20 61 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74   a single varint
5e20: 20 74 6f 20 61 20 50 65 6e 64 69 6e 67 4c 69 73   to a PendingLis
5e30: 74 20 62 75 66 66 65 72 2e 20 53 51 4c 49 54 45  t buffer. SQLITE
5e40: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
5e50: 2a 2a 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ** if successful
5e60: 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  , or an SQLite e
5e70: 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
5e80: 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ise..**.** This 
5e90: 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 73 65  function also se
5ea0: 72 76 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  rves to allocate
5eb0: 20 74 68 65 20 50 65 6e 64 69 6e 67 4c 69 73 74   the PendingList
5ec0: 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c   structure itsel
5ed0: 66 2e 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  f..** For exampl
5ee0: 65 2c 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  e, to create a n
5ef0: 65 77 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 73  ew PendingList s
5f00: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
5f10: 69 6e 67 20 74 77 6f 0a 2a 2a 20 76 61 72 69 6e  ing two.** varin
5f20: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 65 6e 64  ts:.**.**   Pend
5f30: 69 6e 67 4c 69 73 74 20 2a 70 20 3d 20 30 3b 0a  ingList *p = 0;.
5f40: 2a 2a 20 20 20 66 74 73 33 50 65 6e 64 69 6e 67  **   fts3Pending
5f50: 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e 74  ListAppendVarint
5f60: 28 26 70 2c 20 31 29 3b 0a 2a 2a 20 20 20 66 74  (&p, 1);.**   ft
5f70: 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70  s3PendingListApp
5f80: 65 6e 64 56 61 72 69 6e 74 28 26 70 2c 20 32 29  endVarint(&p, 2)
5f90: 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.*/.static int 
5fa0: 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41  fts3PendingListA
5fb0: 70 70 65 6e 64 56 61 72 69 6e 74 28 0a 20 20 50  ppendVarint(.  P
5fc0: 65 6e 64 69 6e 67 4c 69 73 74 20 2a 2a 70 70 2c  endingList **pp,
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5fe0: 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65  * IN/OUT: Pointe
5ff0: 72 20 74 6f 20 50 65 6e 64 69 6e 67 4c 69 73 74  r to PendingList
6000: 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 73 71 6c   struct */.  sql
6010: 69 74 65 33 5f 69 6e 74 36 34 20 69 20 20 20 20  ite3_int64 i    
6020: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6030: 56 61 6c 75 65 20 74 6f 20 61 70 70 65 6e 64 20  Value to append 
6040: 74 6f 20 64 61 74 61 20 2a 2f 0a 29 7b 0a 20 20  to data */.){.  
6050: 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70 20 3d  PendingList *p =
6060: 20 2a 70 70 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f   *pp;..  /* Allo
6070: 63 61 74 65 20 6f 72 20 67 72 6f 77 20 74 68 65  cate or grow the
6080: 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 61 73 20   PendingList as 
6090: 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69  required. */.  i
60a0: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 70 20 3d  f( !p ){.    p =
60b0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
60c0: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 31 30 30  sizeof(*p) + 100
60d0: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 20 29 7b  );.    if( !p ){
60e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
60f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
6100: 7d 0a 20 20 20 20 70 2d 3e 6e 53 70 61 63 65 20  }.    p->nSpace 
6110: 3d 20 31 30 30 3b 0a 20 20 20 20 70 2d 3e 61 44  = 100;.    p->aD
6120: 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29 26 70  ata = (char *)&p
6130: 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 6e 44 61 74  [1];.    p->nDat
6140: 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 65 6c 73  a = 0;.  }.  els
6150: 65 20 69 66 28 20 70 2d 3e 6e 44 61 74 61 2b 46  e if( p->nData+F
6160: 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 2b 31  TS3_VARINT_MAX+1
6170: 3e 70 2d 3e 6e 53 70 61 63 65 20 29 7b 0a 20 20  >p->nSpace ){.  
6180: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 2d 3e    int nNew = p->
6190: 6e 53 70 61 63 65 20 2a 20 32 3b 0a 20 20 20 20  nSpace * 2;.    
61a0: 70 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  p = sqlite3_real
61b0: 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 2a 70  loc(p, sizeof(*p
61c0: 29 20 2b 20 6e 4e 65 77 29 3b 0a 20 20 20 20 69  ) + nNew);.    i
61d0: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 20 20 73  f( !p ){.      s
61e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70 70 29  qlite3_free(*pp)
61f0: 3b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 30 3b  ;.      *pp = 0;
6200: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
6210: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
6220: 7d 0a 20 20 20 20 70 2d 3e 6e 53 70 61 63 65 20  }.    p->nSpace 
6230: 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 61  = nNew;.    p->a
6240: 44 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29 26  Data = (char *)&
6250: 70 5b 31 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  p[1];.  }..  /* 
6260: 41 70 70 65 6e 64 20 74 68 65 20 6e 65 77 20 73  Append the new s
6270: 65 72 69 61 6c 69 7a 65 64 20 76 61 72 69 6e 74  erialized varint
6280: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
6290: 68 65 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 70 2d  he list. */.  p-
62a0: 3e 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69 74 65  >nData += sqlite
62b0: 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26  3Fts3PutVarint(&
62c0: 70 2d 3e 61 44 61 74 61 5b 70 2d 3e 6e 44 61 74  p->aData[p->nDat
62d0: 61 5d 2c 20 69 29 3b 0a 20 20 70 2d 3e 61 44 61  a], i);.  p->aDa
62e0: 74 61 5b 70 2d 3e 6e 44 61 74 61 5d 20 3d 20 27  ta[p->nData] = '
62f0: 5c 30 27 3b 0a 20 20 2a 70 70 20 3d 20 70 3b 0a  \0';.  *pp = p;.
6300: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6310: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  OK;.}../*.** Add
6320: 20 61 20 64 6f 63 69 64 2f 63 6f 6c 75 6d 6e 2f   a docid/column/
6330: 70 6f 73 69 74 69 6f 6e 20 65 6e 74 72 79 20 74  position entry t
6340: 6f 20 61 20 50 65 6e 64 69 6e 67 4c 69 73 74 20  o a PendingList 
6350: 73 74 72 75 63 74 75 72 65 2e 20 4e 6f 6e 2d 7a  structure. Non-z
6360: 65 72 6f 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ero.** is return
6370: 65 64 20 69 66 20 74 68 65 20 73 74 72 75 63 74  ed if the struct
6380: 75 72 65 20 69 73 20 73 71 6c 69 74 65 33 5f 72  ure is sqlite3_r
6390: 65 61 6c 6c 6f 63 65 64 20 61 73 20 70 61 72 74  ealloced as part
63a0: 20 6f 66 20 61 64 64 69 6e 67 0a 2a 2a 20 74 68   of adding.** th
63b0: 65 20 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69  e entry. Otherwi
63c0: 73 65 2c 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  se, zero..**.** 
63d0: 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
63e0: 6f 63 63 75 72 73 2c 20 2a 70 52 63 20 69 73 20  occurs, *pRc is 
63f0: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f  set to SQLITE_NO
6400: 4d 45 4d 20 62 65 66 6f 72 65 20 72 65 74 75 72  MEM before retur
6410: 6e 69 6e 67 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73  ning..** Zero is
6420: 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 65 64   always returned
6430: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 4f   in this case. O
6440: 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20  therwise, if no 
6450: 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
6460: 2c 0a 2a 2a 20 69 74 20 69 73 20 73 65 74 20 74  ,.** it is set t
6470: 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  o SQLITE_OK..*/.
6480: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 50  static int fts3P
6490: 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64  endingListAppend
64a0: 28 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73 74 20  (.  PendingList 
64b0: 2a 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20  **pp,           
64c0: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50      /* IN/OUT: P
64d0: 65 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63  endingList struc
64e0: 74 75 72 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ture */.  sqlite
64f0: 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 2c 20  3_int64 iDocid, 
6500: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63            /* Doc
6510: 69 64 20 66 6f 72 20 65 6e 74 72 79 20 74 6f 20  id for entry to 
6520: 61 64 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  add */.  sqlite3
6530: 5f 69 6e 74 36 34 20 69 43 6f 6c 2c 20 20 20 20  _int64 iCol,    
6540: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
6550: 6d 6e 20 66 6f 72 20 65 6e 74 72 79 20 74 6f 20  mn for entry to 
6560: 61 64 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  add */.  sqlite3
6570: 5f 69 6e 74 36 34 20 69 50 6f 73 2c 20 20 20 20  _int64 iPos,    
6580: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69           /* Posi
6590: 74 69 6f 6e 20 6f 66 20 74 65 72 6d 20 66 6f 72  tion of term for
65a0: 20 65 6e 74 72 79 20 74 6f 20 61 64 64 20 2a 2f   entry to add */
65b0: 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20 20  .  int *pRc     
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65d0: 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72     /* OUT: Retur
65e0: 6e 20 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 50  n code */.){.  P
65f0: 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70 20 3d 20  endingList *p = 
6600: 2a 70 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *pp;.  int rc = 
6610: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
6620: 73 65 72 74 28 20 21 70 20 7c 7c 20 70 2d 3e 69  sert( !p || p->i
6630: 4c 61 73 74 44 6f 63 69 64 3c 3d 69 44 6f 63 69  LastDocid<=iDoci
6640: 64 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 20 7c  d );..  if( !p |
6650: 7c 20 70 2d 3e 69 4c 61 73 74 44 6f 63 69 64 21  | p->iLastDocid!
6660: 3d 69 44 6f 63 69 64 20 29 7b 0a 20 20 20 20 73  =iDocid ){.    s
6670: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 65  qlite3_int64 iDe
6680: 6c 74 61 20 3d 20 69 44 6f 63 69 64 20 2d 20 28  lta = iDocid - (
6690: 70 20 3f 20 70 2d 3e 69 4c 61 73 74 44 6f 63 69  p ? p->iLastDoci
66a0: 64 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20  d : 0);.    if( 
66b0: 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
66c0: 74 28 20 70 2d 3e 6e 44 61 74 61 3c 70 2d 3e 6e  t( p->nData<p->n
66d0: 53 70 61 63 65 20 29 3b 0a 20 20 20 20 20 20 61  Space );.      a
66e0: 73 73 65 72 74 28 20 70 2d 3e 61 44 61 74 61 5b  ssert( p->aData[
66f0: 70 2d 3e 6e 44 61 74 61 5d 3d 3d 30 20 29 3b 0a  p->nData]==0 );.
6700: 20 20 20 20 20 20 70 2d 3e 6e 44 61 74 61 2b 2b        p->nData++
6710: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6720: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
6730: 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74   fts3PendingList
6740: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2c  AppendVarint(&p,
6750: 20 69 44 65 6c 74 61 29 29 20 29 7b 0a 20 20 20   iDelta)) ){.   
6760: 20 20 20 67 6f 74 6f 20 70 65 6e 64 69 6e 67 6c     goto pendingl
6770: 69 73 74 61 70 70 65 6e 64 5f 6f 75 74 3b 0a 20  istappend_out;. 
6780: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 4c 61 73     }.    p->iLas
6790: 74 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 70  tCol = -1;.    p
67a0: 2d 3e 69 4c 61 73 74 50 6f 73 20 3d 20 30 3b 0a  ->iLastPos = 0;.
67b0: 20 20 20 20 70 2d 3e 69 4c 61 73 74 44 6f 63 69      p->iLastDoci
67c0: 64 20 3d 20 69 44 6f 63 69 64 3b 0a 20 20 7d 0a  d = iDocid;.  }.
67d0: 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 26 26 20    if( iCol>0 && 
67e0: 70 2d 3e 69 4c 61 73 74 43 6f 6c 21 3d 69 43 6f  p->iLastCol!=iCo
67f0: 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c  l ){.    if( SQL
6800: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 66 74  ITE_OK!=(rc = ft
6810: 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70  s3PendingListApp
6820: 65 6e 64 56 61 72 69 6e 74 28 26 70 2c 20 31 29  endVarint(&p, 1)
6830: 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45  ).     || SQLITE
6840: 5f 4f 4b 21 3d 28 72 63 20 3d 20 66 74 73 33 50  _OK!=(rc = fts3P
6850: 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64  endingListAppend
6860: 56 61 72 69 6e 74 28 26 70 2c 20 69 43 6f 6c 29  Varint(&p, iCol)
6870: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
6880: 6f 74 6f 20 70 65 6e 64 69 6e 67 6c 69 73 74 61  oto pendinglista
6890: 70 70 65 6e 64 5f 6f 75 74 3b 0a 20 20 20 20 7d  ppend_out;.    }
68a0: 0a 20 20 20 20 70 2d 3e 69 4c 61 73 74 43 6f 6c  .    p->iLastCol
68b0: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e   = iCol;.    p->
68c0: 69 4c 61 73 74 50 6f 73 20 3d 20 30 3b 0a 20 20  iLastPos = 0;.  
68d0: 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20  }.  if( iCol>=0 
68e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
68f0: 50 6f 73 3e 70 2d 3e 69 4c 61 73 74 50 6f 73 20  Pos>p->iLastPos 
6900: 7c 7c 20 28 69 50 6f 73 3d 3d 30 20 26 26 20 70  || (iPos==0 && p
6910: 2d 3e 69 4c 61 73 74 50 6f 73 3d 3d 30 29 20 29  ->iLastPos==0) )
6920: 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 50  ;.    rc = fts3P
6930: 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64  endingListAppend
6940: 56 61 72 69 6e 74 28 26 70 2c 20 32 2b 69 50 6f  Varint(&p, 2+iPo
6950: 73 2d 70 2d 3e 69 4c 61 73 74 50 6f 73 29 3b 0a  s-p->iLastPos);.
6960: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
6970: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
6980: 2d 3e 69 4c 61 73 74 50 6f 73 20 3d 20 69 50 6f  ->iLastPos = iPo
6990: 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 70  s;.    }.  }.. p
69a0: 65 6e 64 69 6e 67 6c 69 73 74 61 70 70 65 6e 64  endinglistappend
69b0: 5f 6f 75 74 3a 0a 20 20 2a 70 52 63 20 3d 20 72  _out:.  *pRc = r
69c0: 63 3b 0a 20 20 69 66 28 20 70 21 3d 2a 70 70 20  c;.  if( p!=*pp 
69d0: 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 3b 0a  ){.    *pp = p;.
69e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
69f0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
6a00: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 50 65  ./*.** Free a Pe
6a10: 6e 64 69 6e 67 4c 69 73 74 20 6f 62 6a 65 63 74  ndingList object
6a20: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 74   allocated by ft
6a30: 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70  s3PendingListApp
6a40: 65 6e 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  end()..*/.static
6a50: 20 76 6f 69 64 20 66 74 73 33 50 65 6e 64 69 6e   void fts3Pendin
6a60: 67 4c 69 73 74 44 65 6c 65 74 65 28 50 65 6e 64  gListDelete(Pend
6a70: 69 6e 67 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  ingList *pList){
6a80: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
6a90: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
6aa0: 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   Add an entry to
6ab0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 65 6e 64   one of the pend
6ac0: 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20 74  ing-terms hash t
6ad0: 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
6ae0: 20 69 6e 74 20 66 74 73 33 50 65 6e 64 69 6e 67   int fts3Pending
6af0: 54 65 72 6d 73 41 64 64 4f 6e 65 28 0a 20 20 46  TermsAddOne(.  F
6b00: 74 73 33 54 61 62 6c 65 20 2a 70 2c 0a 20 20 69  ts3Table *p,.  i
6b10: 6e 74 20 69 43 6f 6c 2c 0a 20 20 69 6e 74 20 69  nt iCol,.  int i
6b20: 50 6f 73 2c 0a 20 20 46 74 73 33 48 61 73 68 20  Pos,.  Fts3Hash 
6b30: 2a 70 48 61 73 68 2c 20 20 20 20 20 20 20 20 20  *pHash,         
6b40: 20 20 20 20 20 20 20 2f 2a 20 50 65 6e 64 69 6e         /* Pendin
6b50: 67 20 74 65 72 6d 73 20 68 61 73 68 20 74 61 62  g terms hash tab
6b60: 6c 65 20 74 6f 20 61 64 64 20 65 6e 74 72 79 20  le to add entry 
6b70: 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  to */.  const ch
6b80: 61 72 20 2a 7a 54 6f 6b 65 6e 2c 0a 20 20 69 6e  ar *zToken,.  in
6b90: 74 20 6e 54 6f 6b 65 6e 0a 29 7b 0a 20 20 50 65  t nToken.){.  Pe
6ba0: 6e 64 69 6e 67 4c 69 73 74 20 2a 70 4c 69 73 74  ndingList *pList
6bb0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
6bc0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 4c 69 73 74  ITE_OK;..  pList
6bd0: 20 3d 20 28 50 65 6e 64 69 6e 67 4c 69 73 74 20   = (PendingList 
6be0: 2a 29 66 74 73 33 48 61 73 68 46 69 6e 64 28 70  *)fts3HashFind(p
6bf0: 48 61 73 68 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54  Hash, zToken, nT
6c00: 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 70 4c 69  oken);.  if( pLi
6c10: 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 50 65  st ){.    p->nPe
6c20: 6e 64 69 6e 67 44 61 74 61 20 2d 3d 20 28 70 4c  ndingData -= (pL
6c30: 69 73 74 2d 3e 6e 44 61 74 61 20 2b 20 6e 54 6f  ist->nData + nTo
6c40: 6b 65 6e 20 2b 20 73 69 7a 65 6f 66 28 46 74 73  ken + sizeof(Fts
6c50: 33 48 61 73 68 45 6c 65 6d 29 29 3b 0a 20 20 7d  3HashElem));.  }
6c60: 0a 20 20 69 66 28 20 66 74 73 33 50 65 6e 64 69  .  if( fts3Pendi
6c70: 6e 67 4c 69 73 74 41 70 70 65 6e 64 28 26 70 4c  ngListAppend(&pL
6c80: 69 73 74 2c 20 70 2d 3e 69 50 72 65 76 44 6f 63  ist, p->iPrevDoc
6c90: 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20  id, iCol, iPos, 
6ca0: 26 72 63 29 20 29 7b 0a 20 20 20 20 69 66 28 20  &rc) ){.    if( 
6cb0: 70 4c 69 73 74 3d 3d 66 74 73 33 48 61 73 68 49  pList==fts3HashI
6cc0: 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 54 6f  nsert(pHash, zTo
6cd0: 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 70 4c 69  ken, nToken, pLi
6ce0: 73 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  st) ){.      /* 
6cf0: 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 77 68  Malloc failed wh
6d00: 69 6c 65 20 69 6e 73 65 72 74 69 6e 67 20 74 68  ile inserting th
6d10: 65 20 6e 65 77 20 65 6e 74 72 79 2e 20 54 68 69  e new entry. Thi
6d20: 73 20 63 61 6e 20 6f 6e 6c 79 20 0a 20 20 20 20  s can only .    
6d30: 20 20 2a 2a 20 68 61 70 70 65 6e 20 69 66 20 74    ** happen if t
6d40: 68 65 72 65 20 77 61 73 20 6e 6f 20 70 72 65 76  here was no prev
6d50: 69 6f 75 73 20 65 6e 74 72 79 20 66 6f 72 20 74  ious entry for t
6d60: 68 69 73 20 74 6f 6b 65 6e 2e 0a 20 20 20 20 20  his token..     
6d70: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
6d80: 28 20 30 3d 3d 66 74 73 33 48 61 73 68 46 69 6e  ( 0==fts3HashFin
6d90: 64 28 70 48 61 73 68 2c 20 7a 54 6f 6b 65 6e 2c  d(pHash, zToken,
6da0: 20 6e 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20   nToken) );.    
6db0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6dc0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 63 20  List);.      rc 
6dd0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
6de0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
6df0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6e00: 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67  .    p->nPending
6e10: 44 61 74 61 20 2b 3d 20 28 70 4c 69 73 74 2d 3e  Data += (pList->
6e20: 6e 44 61 74 61 20 2b 20 6e 54 6f 6b 65 6e 20 2b  nData + nToken +
6e30: 20 73 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68   sizeof(Fts3Hash
6e40: 45 6c 65 6d 29 29 3b 0a 20 20 7d 0a 20 20 72 65  Elem));.  }.  re
6e50: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
6e60: 2a 20 54 6f 6b 65 6e 69 7a 65 20 74 68 65 20 6e  * Tokenize the n
6e70: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
6e80: 72 69 6e 67 20 7a 54 65 78 74 20 61 6e 64 20 61  ring zText and a
6e90: 64 64 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 74 6f  dd all tokens to
6ea0: 20 74 68 65 0a 2a 2a 20 70 65 6e 64 69 6e 67 2d   the.** pending-
6eb0: 74 65 72 6d 73 20 68 61 73 68 2d 74 61 62 6c 65  terms hash-table
6ec0: 2e 20 54 68 65 20 64 6f 63 69 64 20 75 73 65 64  . The docid used
6ed0: 20 69 73 20 74 68 61 74 20 63 75 72 72 65 6e 74   is that current
6ee0: 6c 79 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ly stored in.** 
6ef0: 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 2c 20 61  p->iPrevDocid, a
6f00: 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  nd the column is
6f10: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 61 72   specified by ar
6f20: 67 75 6d 65 6e 74 20 69 43 6f 6c 2e 0a 2a 2a 0a  gument iCol..**.
6f30: 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
6f40: 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
6f50: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
6f60: 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  se, an SQLite er
6f70: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
6f80: 74 69 63 20 69 6e 74 20 66 74 73 33 50 65 6e 64  tic int fts3Pend
6f90: 69 6e 67 54 65 72 6d 73 41 64 64 28 0a 20 20 46  ingTermsAdd(.  F
6fa0: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
6fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6fc0: 2a 20 54 61 62 6c 65 20 69 6e 74 6f 20 77 68 69  * Table into whi
6fd0: 63 68 20 74 65 78 74 20 77 69 6c 6c 20 62 65 20  ch text will be 
6fe0: 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e  inserted */.  in
6ff0: 74 20 69 4c 61 6e 67 69 64 2c 20 20 20 20 20 20  t iLangid,      
7000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7010: 20 4c 61 6e 67 75 61 67 65 20 69 64 20 74 6f 20   Language id to 
7020: 75 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  use */.  const c
7030: 68 61 72 20 2a 7a 54 65 78 74 2c 20 20 20 20 20  har *zText,     
7040: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
7050: 20 6f 66 20 64 6f 63 75 6d 65 6e 74 20 74 6f 20   of document to 
7060: 62 65 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20  be inserted */. 
7070: 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20   int iCol,      
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 74 6f 20   /* Column into 
70a0: 77 68 69 63 68 20 74 65 78 74 20 69 73 20 62 65  which text is be
70b0: 69 6e 67 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a  ing inserted */.
70c0: 20 20 75 33 32 20 2a 70 6e 57 6f 72 64 20 20 20    u32 *pnWord   
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70e0: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 49 6e 63    /* IN/OUT: Inc
70f0: 72 2e 20 62 79 20 6e 75 6d 62 65 72 20 74 6f 6b  r. by number tok
7100: 65 6e 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a  ens inserted */.
7110: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
7120: 6e 74 20 69 53 74 61 72 74 20 3d 20 30 3b 0a 20  nt iStart = 0;. 
7130: 20 69 6e 74 20 69 45 6e 64 20 3d 20 30 3b 0a 20   int iEnd = 0;. 
7140: 20 69 6e 74 20 69 50 6f 73 20 3d 20 30 3b 0a 20   int iPos = 0;. 
7150: 20 69 6e 74 20 6e 57 6f 72 64 20 3d 20 30 3b 0a   int nWord = 0;.
7160: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
7170: 54 6f 6b 65 6e 3b 0a 20 20 69 6e 74 20 6e 54 6f  Token;.  int nTo
7180: 6b 65 6e 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69  ken = 0;..  sqli
7190: 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a 70  te3_tokenizer *p
71a0: 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 70 2d 3e 70  Tokenizer = p->p
71b0: 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 73 71 6c  Tokenizer;.  sql
71c0: 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d  ite3_tokenizer_m
71d0: 6f 64 75 6c 65 20 63 6f 6e 73 74 20 2a 70 4d 6f  odule const *pMo
71e0: 64 75 6c 65 20 3d 20 70 54 6f 6b 65 6e 69 7a 65  dule = pTokenize
71f0: 72 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 73 71  r->pModule;.  sq
7200: 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
7210: 63 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20  cursor *pCsr;.  
7220: 69 6e 74 20 28 2a 78 4e 65 78 74 29 28 73 71 6c  int (*xNext)(sql
7230: 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 63  ite3_tokenizer_c
7240: 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c 0a  ursor *pCursor,.
7250: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
7260: 2a 2a 2c 69 6e 74 2a 2c 69 6e 74 2a 2c 69 6e 74  **,int*,int*,int
7270: 2a 2c 69 6e 74 2a 29 3b 0a 0a 20 20 61 73 73 65  *,int*);..  asse
7280: 72 74 28 20 70 54 6f 6b 65 6e 69 7a 65 72 20 26  rt( pTokenizer &
7290: 26 20 70 4d 6f 64 75 6c 65 20 29 3b 0a 0a 20 20  & pModule );..  
72a0: 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68  /* If the user h
72b0: 61 73 20 69 6e 73 65 72 74 65 64 20 61 20 4e 55  as inserted a NU
72c0: 4c 4c 20 76 61 6c 75 65 2c 20 74 68 69 73 20 66  LL value, this f
72d0: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63  unction may be c
72e0: 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20  alled with.  ** 
72f0: 7a 54 65 78 74 3d 3d 30 2e 20 49 6e 20 74 68 69  zText==0. In thi
7300: 73 20 63 61 73 65 2c 20 61 64 64 20 7a 65 72 6f  s case, add zero
7310: 20 74 6f 6b 65 6e 20 65 6e 74 72 69 65 73 20 74   token entries t
7320: 6f 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  o the hash table
7330: 20 61 6e 64 20 0a 20 20 2a 2a 20 72 65 74 75 72   and .  ** retur
7340: 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 69 66  n early. */.  if
7350: 28 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20  ( zText==0 ){.  
7360: 20 20 2a 70 6e 57 6f 72 64 20 3d 20 30 3b 0a 20    *pnWord = 0;. 
7370: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7380: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  _OK;.  }..  rc =
7390: 20 73 71 6c 69 74 65 33 46 74 73 33 4f 70 65 6e   sqlite3Fts3Open
73a0: 54 6f 6b 65 6e 69 7a 65 72 28 70 54 6f 6b 65 6e  Tokenizer(pToken
73b0: 69 7a 65 72 2c 20 69 4c 61 6e 67 69 64 2c 20 7a  izer, iLangid, z
73c0: 54 65 78 74 2c 20 2d 31 2c 20 26 70 43 73 72 29  Text, -1, &pCsr)
73d0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
73e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
73f0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 78  urn rc;.  }..  x
7400: 4e 65 78 74 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e  Next = pModule->
7410: 78 4e 65 78 74 3b 0a 20 20 77 68 69 6c 65 28 20  xNext;.  while( 
7420: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 0a 20 20  SQLITE_OK==rc.  
7430: 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b      && SQLITE_OK
7440: 3d 3d 28 72 63 20 3d 20 78 4e 65 78 74 28 70 43  ==(rc = xNext(pC
7450: 73 72 2c 20 26 7a 54 6f 6b 65 6e 2c 20 26 6e 54  sr, &zToken, &nT
7460: 6f 6b 65 6e 2c 20 26 69 53 74 61 72 74 2c 20 26  oken, &iStart, &
7470: 69 45 6e 64 2c 20 26 69 50 6f 73 29 29 0a 20 20  iEnd, &iPos)).  
7480: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
7490: 20 20 69 66 28 20 69 50 6f 73 3e 3d 6e 57 6f 72    if( iPos>=nWor
74a0: 64 20 29 20 6e 57 6f 72 64 20 3d 20 69 50 6f 73  d ) nWord = iPos
74b0: 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 73 69  +1;..    /* Posi
74c0: 74 69 6f 6e 73 20 63 61 6e 6e 6f 74 20 62 65 20  tions cannot be 
74d0: 6e 65 67 61 74 69 76 65 3b 20 77 65 20 75 73 65  negative; we use
74e0: 20 2d 31 20 61 73 20 61 20 74 65 72 6d 69 6e 61   -1 as a termina
74f0: 74 6f 72 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  tor internally..
7500: 20 20 20 20 2a 2a 20 54 6f 6b 65 6e 73 20 6d 75      ** Tokens mu
7510: 73 74 20 68 61 76 65 20 61 20 6e 6f 6e 2d 7a 65  st have a non-ze
7520: 72 6f 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 2a  ro length..    *
7530: 2f 0a 20 20 20 20 69 66 28 20 69 50 6f 73 3c 30  /.    if( iPos<0
7540: 20 7c 7c 20 21 7a 54 6f 6b 65 6e 20 7c 7c 20 6e   || !zToken || n
7550: 54 6f 6b 65 6e 3c 3d 30 20 29 7b 0a 20 20 20 20  Token<=0 ){.    
7560: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
7570: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
7580: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
7590: 41 64 64 20 74 68 65 20 74 65 72 6d 20 74 6f 20  Add the term to 
75a0: 74 68 65 20 74 65 72 6d 73 20 69 6e 64 65 78 20  the terms index 
75b0: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  */.    rc = fts3
75c0: 50 65 6e 64 69 6e 67 54 65 72 6d 73 41 64 64 4f  PendingTermsAddO
75d0: 6e 65 28 0a 20 20 20 20 20 20 20 20 70 2c 20 69  ne(.        p, i
75e0: 43 6f 6c 2c 20 69 50 6f 73 2c 20 26 70 2d 3e 61  Col, iPos, &p->a
75f0: 49 6e 64 65 78 5b 30 5d 2e 68 50 65 6e 64 69 6e  Index[0].hPendin
7600: 67 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  g, zToken, nToke
7610: 6e 0a 20 20 20 20 29 3b 0a 20 20 20 20 0a 20 20  n.    );.    .  
7620: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 65 72    /* Add the ter
7630: 6d 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65  m to each of the
7640: 20 70 72 65 66 69 78 20 69 6e 64 65 78 65 73 20   prefix indexes 
7650: 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 74  that it is not t
7660: 6f 6f 20 0a 20 20 20 20 2a 2a 20 73 68 6f 72 74  oo .    ** short
7670: 20 66 6f 72 2e 20 2a 2f 0a 20 20 20 20 66 6f 72   for. */.    for
7680: 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=1; rc==SQLITE
7690: 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 49 6e 64  _OK && i<p->nInd
76a0: 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ex; i++){.      
76b0: 73 74 72 75 63 74 20 46 74 73 33 49 6e 64 65 78  struct Fts3Index
76c0: 20 2a 70 49 6e 64 65 78 20 3d 20 26 70 2d 3e 61   *pIndex = &p->a
76d0: 49 6e 64 65 78 5b 69 5d 3b 0a 20 20 20 20 20 20  Index[i];.      
76e0: 69 66 28 20 6e 54 6f 6b 65 6e 3c 70 49 6e 64 65  if( nToken<pInde
76f0: 78 2d 3e 6e 50 72 65 66 69 78 20 29 20 63 6f 6e  x->nPrefix ) con
7700: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 72 63 20  tinue;.      rc 
7710: 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72  = fts3PendingTer
7720: 6d 73 41 64 64 4f 6e 65 28 0a 20 20 20 20 20 20  msAddOne(.      
7730: 20 20 20 20 70 2c 20 69 43 6f 6c 2c 20 69 50 6f      p, iCol, iPo
7740: 73 2c 20 26 70 49 6e 64 65 78 2d 3e 68 50 65 6e  s, &pIndex->hPen
7750: 64 69 6e 67 2c 20 7a 54 6f 6b 65 6e 2c 20 70 49  ding, zToken, pI
7760: 6e 64 65 78 2d 3e 6e 50 72 65 66 69 78 0a 20 20  ndex->nPrefix.  
7770: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
7780: 0a 0a 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c  ..  pModule->xCl
7790: 6f 73 65 28 70 43 73 72 29 3b 0a 20 20 2a 70 6e  ose(pCsr);.  *pn
77a0: 57 6f 72 64 20 2b 3d 20 6e 57 6f 72 64 3b 0a 20  Word += nWord;. 
77b0: 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
77c0: 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54  ITE_DONE ? SQLIT
77d0: 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f  E_OK : rc);.}../
77e0: 2a 20 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68  * .** Calling th
77f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69  is function indi
7800: 63 61 74 65 73 20 74 68 61 74 20 73 75 62 73 65  cates that subse
7810: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 0a  quent calls to .
7820: 2a 2a 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65  ** fts3PendingTe
7830: 72 6d 73 41 64 64 28 29 20 61 72 65 20 74 6f 20  rmsAdd() are to 
7840: 61 64 64 20 74 65 72 6d 2f 70 6f 73 69 74 69 6f  add term/positio
7850: 6e 2d 6c 69 73 74 20 70 61 69 72 73 20 66 6f 72  n-list pairs for
7860: 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
7870: 20 6f 66 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   of the document
7880: 20 77 69 74 68 20 64 6f 63 69 64 20 69 44 6f 63   with docid iDoc
7890: 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  id..*/.static in
78a0: 74 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72  t fts3PendingTer
78b0: 6d 73 44 6f 63 69 64 28 0a 20 20 46 74 73 33 54  msDocid(.  Fts3T
78c0: 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
78d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
78e0: 6c 6c 2d 74 65 78 74 20 74 61 62 6c 65 20 68 61  ll-text table ha
78f0: 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 62 44  ndle */.  int bD
7900: 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20  elete,          
7910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7920: 65 20 69 66 20 74 68 69 73 20 6f 70 20 69 73 20  e if this op is 
7930: 61 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e  a delete */.  in
7940: 74 20 69 4c 61 6e 67 69 64 2c 20 20 20 20 20 20  t iLangid,      
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7960: 20 4c 61 6e 67 75 61 67 65 20 69 64 20 6f 66 20   Language id of 
7970: 72 6f 77 20 62 65 69 6e 67 20 77 72 69 74 74 65  row being writte
7980: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e  n */.  sqlite_in
7990: 74 36 34 20 69 44 6f 63 69 64 20 20 20 20 20 20  t64 iDocid      
79a0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 69 64 20         /* Docid 
79b0: 6f 66 20 72 6f 77 20 62 65 69 6e 67 20 77 72 69  of row being wri
79c0: 74 74 65 6e 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  tten */.){.  ass
79d0: 65 72 74 28 20 69 4c 61 6e 67 69 64 3e 3d 30 20  ert( iLangid>=0 
79e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 62 44 65  );.  assert( bDe
79f0: 6c 65 74 65 3d 3d 31 20 7c 7c 20 62 44 65 6c 65  lete==1 || bDele
7a00: 74 65 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 54  te==0 );..  /* T
7a10: 4f 44 4f 28 73 68 65 73 73 29 20 45 78 70 6c 6f  ODO(shess) Explo
7a20: 72 65 20 77 68 65 74 68 65 72 20 70 61 72 74 69  re whether parti
7a30: 61 6c 6c 79 20 66 6c 75 73 68 69 6e 67 20 74 68  ally flushing th
7a40: 65 20 62 75 66 66 65 72 20 6f 6e 0a 20 20 2a 2a  e buffer on.  **
7a50: 20 66 6f 72 63 65 64 2d 66 6c 75 73 68 20 77 6f   forced-flush wo
7a60: 75 6c 64 20 70 72 6f 76 69 64 65 20 62 65 74 74  uld provide bett
7a70: 65 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20  er performance. 
7a80: 20 49 20 73 75 73 70 65 63 74 20 74 68 61 74 20   I suspect that 
7a90: 69 66 0a 20 20 2a 2a 20 77 65 20 6f 72 64 65 72  if.  ** we order
7aa0: 65 64 20 74 68 65 20 64 6f 63 6c 69 73 74 73 20  ed the doclists 
7ab0: 62 79 20 73 69 7a 65 20 61 6e 64 20 66 6c 75 73  by size and flus
7ac0: 68 65 64 20 74 68 65 20 6c 61 72 67 65 73 74 20  hed the largest 
7ad0: 75 6e 74 69 6c 20 74 68 65 0a 20 20 2a 2a 20 62  until the.  ** b
7ae0: 75 66 66 65 72 20 77 61 73 20 68 61 6c 66 20 65  uffer was half e
7af0: 6d 70 74 79 2c 20 74 68 61 74 20 77 6f 75 6c 64  mpty, that would
7b00: 20 6c 65 74 20 74 68 65 20 6c 65 73 73 20 66 72   let the less fr
7b10: 65 71 75 65 6e 74 20 74 65 72 6d 73 0a 20 20 2a  equent terms.  *
7b20: 2a 20 67 65 6e 65 72 61 74 65 20 6c 6f 6e 67 65  * generate longe
7b30: 72 20 64 6f 63 6c 69 73 74 73 2e 0a 20 20 2a 2f  r doclists..  */
7b40: 0a 20 20 69 66 28 20 69 44 6f 63 69 64 3c 70 2d  .  if( iDocid<p-
7b50: 3e 69 50 72 65 76 44 6f 63 69 64 20 0a 20 20 20  >iPrevDocid .   
7b60: 7c 7c 20 28 69 44 6f 63 69 64 3d 3d 70 2d 3e 69  || (iDocid==p->i
7b70: 50 72 65 76 44 6f 63 69 64 20 26 26 20 70 2d 3e  PrevDocid && p->
7b80: 62 50 72 65 76 44 65 6c 65 74 65 3d 3d 30 29 0a  bPrevDelete==0).
7b90: 20 20 20 7c 7c 20 70 2d 3e 69 50 72 65 76 4c 61     || p->iPrevLa
7ba0: 6e 67 69 64 21 3d 69 4c 61 6e 67 69 64 0a 20 20  ngid!=iLangid.  
7bb0: 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44   || p->nPendingD
7bc0: 61 74 61 3e 70 2d 3e 6e 4d 61 78 50 65 6e 64 69  ata>p->nMaxPendi
7bd0: 6e 67 44 61 74 61 20 0a 20 20 29 7b 0a 20 20 20  ngData .  ){.   
7be0: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
7bf0: 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d  3Fts3PendingTerm
7c00: 73 46 6c 75 73 68 28 70 29 3b 0a 20 20 20 20 69  sFlush(p);.    i
7c10: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7c20: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
7c30: 7d 0a 20 20 70 2d 3e 69 50 72 65 76 44 6f 63 69  }.  p->iPrevDoci
7c40: 64 20 3d 20 69 44 6f 63 69 64 3b 0a 20 20 70 2d  d = iDocid;.  p-
7c50: 3e 69 50 72 65 76 4c 61 6e 67 69 64 20 3d 20 69  >iPrevLangid = i
7c60: 4c 61 6e 67 69 64 3b 0a 20 20 70 2d 3e 62 50 72  Langid;.  p->bPr
7c70: 65 76 44 65 6c 65 74 65 20 3d 20 62 44 65 6c 65  evDelete = bDele
7c80: 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  te;.  return SQL
7c90: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
7ca0: 20 44 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e   Discard the con
7cb0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 65 6e  tents of the pen
7cc0: 64 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20  ding-terms hash 
7cd0: 74 61 62 6c 65 73 2e 20 0a 2a 2f 0a 76 6f 69 64  tables. .*/.void
7ce0: 20 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64   sqlite3Fts3Pend
7cf0: 69 6e 67 54 65 72 6d 73 43 6c 65 61 72 28 46 74  ingTermsClear(Ft
7d00: 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69  s3Table *p){.  i
7d10: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
7d20: 20 69 3c 70 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b   i<p->nIndex; i+
7d30: 2b 29 7b 0a 20 20 20 20 46 74 73 33 48 61 73 68  +){.    Fts3Hash
7d40: 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 20  Elem *pElem;.   
7d50: 20 46 74 73 33 48 61 73 68 20 2a 70 48 61 73 68   Fts3Hash *pHash
7d60: 20 3d 20 26 70 2d 3e 61 49 6e 64 65 78 5b 69 5d   = &p->aIndex[i]
7d70: 2e 68 50 65 6e 64 69 6e 67 3b 0a 20 20 20 20 66  .hPending;.    f
7d80: 6f 72 28 70 45 6c 65 6d 3d 66 74 73 33 48 61 73  or(pElem=fts3Has
7d90: 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70  hFirst(pHash); p
7da0: 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 66 74 73 33  Elem; pElem=fts3
7db0: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
7dc0: 7b 0a 20 20 20 20 20 20 50 65 6e 64 69 6e 67 4c  {.      PendingL
7dd0: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 28 50 65  ist *pList = (Pe
7de0: 6e 64 69 6e 67 4c 69 73 74 20 2a 29 66 74 73 33  ndingList *)fts3
7df0: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
7e00: 0a 20 20 20 20 20 20 66 74 73 33 50 65 6e 64 69  .      fts3Pendi
7e10: 6e 67 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  ngListDelete(pLi
7e20: 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  st);.    }.    f
7e30: 74 73 33 48 61 73 68 43 6c 65 61 72 28 70 48 61  ts3HashClear(pHa
7e40: 73 68 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 50  sh);.  }.  p->nP
7e50: 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a  endingData = 0;.
7e60: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
7e70: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
7e80: 20 62 79 20 74 68 65 20 78 55 70 64 61 74 65 28   by the xUpdate(
7e90: 29 20 6d 65 74 68 6f 64 20 61 73 20 70 61 72 74  ) method as part
7ea0: 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 0a 2a 2a   of an INSERT.**
7eb0: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 74 20 61   operation. It a
7ec0: 64 64 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20  dds entries for 
7ed0: 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65  each term in the
7ee0: 20 6e 65 77 20 72 65 63 6f 72 64 20 74 6f 20 74   new record to t
7ef0: 68 65 0a 2a 2a 20 70 65 6e 64 69 6e 67 54 65 72  he.** pendingTer
7f00: 6d 73 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a  ms hash table..*
7f10: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 61 70  *.** Argument ap
7f20: 56 61 6c 20 69 73 20 74 68 65 20 73 61 6d 65 20  Val is the same 
7f30: 61 73 20 74 68 65 20 73 69 6d 69 6c 61 72 6c 79  as the similarly
7f40: 20 6e 61 6d 65 64 20 61 72 67 75 6d 65 6e 74 20   named argument 
7f50: 70 61 73 73 65 64 20 74 6f 0a 2a 2a 20 66 74 73  passed to.** fts
7f60: 33 49 6e 73 65 72 74 44 61 74 61 28 29 2e 20 50  3InsertData(). P
7f70: 61 72 61 6d 65 74 65 72 20 69 44 6f 63 69 64 20  arameter iDocid 
7f80: 69 73 20 74 68 65 20 64 6f 63 69 64 20 6f 66 20  is the docid of 
7f90: 74 68 65 20 6e 65 77 20 72 6f 77 2e 0a 2a 2f 0a  the new row..*/.
7fa0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49  static int fts3I
7fb0: 6e 73 65 72 74 54 65 72 6d 73 28 0a 20 20 46 74  nsertTerms(.  Ft
7fc0: 73 33 54 61 62 6c 65 20 2a 70 2c 20 0a 20 20 69  s3Table *p, .  i
7fd0: 6e 74 20 69 4c 61 6e 67 69 64 2c 20 0a 20 20 73  nt iLangid, .  s
7fe0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
7ff0: 70 56 61 6c 2c 20 0a 20 20 75 33 32 20 2a 61 53  pVal, .  u32 *aS
8000: 7a 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  z.){.  int i;   
8010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8020: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
8030: 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
8040: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 70 2d 3e 6e   for(i=2; i<p->n
8050: 43 6f 6c 75 6d 6e 2b 32 3b 20 69 2b 2b 29 7b 0a  Column+2; i++){.
8060: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 69      int iCol = i
8070: 2d 32 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61  -2;.    if( p->a
8080: 62 4e 6f 74 69 6e 64 65 78 65 64 5b 69 43 6f 6c  bNotindexed[iCol
8090: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  ]==0 ){.      co
80a0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 20  nst char *zText 
80b0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
80c0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
80d0: 78 74 28 61 70 56 61 6c 5b 69 5d 29 3b 0a 20 20  xt(apVal[i]);.  
80e0: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73      int rc = fts
80f0: 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 41 64 64  3PendingTermsAdd
8100: 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 7a 54 65  (p, iLangid, zTe
8110: 78 74 2c 20 69 43 6f 6c 2c 20 26 61 53 7a 5b 69  xt, iCol, &aSz[i
8120: 43 6f 6c 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  Col]);.      if(
8130: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8140: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
8150: 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
8160: 20 20 20 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75 6d     aSz[p->nColum
8170: 6e 5d 20 2b 3d 20 73 71 6c 69 74 65 33 5f 76 61  n] += sqlite3_va
8180: 6c 75 65 5f 62 79 74 65 73 28 61 70 56 61 6c 5b  lue_bytes(apVal[
8190: 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  i]);.    }.  }. 
81a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
81b0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
81c0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
81d0: 6c 65 64 20 62 79 20 74 68 65 20 78 55 70 64 61  led by the xUpda
81e0: 74 65 28 29 20 6d 65 74 68 6f 64 20 66 6f 72 20  te() method for 
81f0: 61 6e 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74  an INSERT operat
8200: 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 61 70 56 61  ion..** The apVa
8210: 6c 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70  l parameter is p
8220: 61 73 73 65 64 20 61 20 63 6f 70 79 20 6f 66 20  assed a copy of 
8230: 74 68 65 20 61 70 56 61 6c 20 61 72 67 75 6d 65  the apVal argume
8240: 6e 74 20 70 61 73 73 65 64 20 62 79 0a 2a 2a 20  nt passed by.** 
8250: 53 51 4c 69 74 65 20 74 6f 20 74 68 65 20 78 55  SQLite to the xU
8260: 70 64 61 74 65 28 29 20 6d 65 74 68 6f 64 2e 20  pdate() method. 
8270: 69 2e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 70 56  i.e:.**.**   apV
8280: 61 6c 5b 30 5d 20 20 20 20 20 20 20 20 20 20 20  al[0]           
8290: 20 20 20 20 20 4e 6f 74 20 75 73 65 64 20 66 6f       Not used fo
82a0: 72 20 49 4e 53 45 52 54 2e 0a 2a 2a 20 20 20 61  r INSERT..**   a
82b0: 70 56 61 6c 5b 31 5d 20 20 20 20 20 20 20 20 20  pVal[1]         
82c0: 20 20 20 20 20 20 20 72 6f 77 69 64 0a 2a 2a 20         rowid.** 
82d0: 20 20 61 70 56 61 6c 5b 32 5d 20 20 20 20 20 20    apVal[2]      
82e0: 20 20 20 20 20 20 20 20 20 20 4c 65 66 74 2d 6d            Left-m
82f0: 6f 73 74 20 75 73 65 72 2d 64 65 66 69 6e 65 64  ost user-defined
8300: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 2e 2e 2e   column.**   ...
8310: 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 70 2d 3e 6e  .**   apVal[p->n
8320: 43 6f 6c 75 6d 6e 2b 31 5d 20 20 20 20 20 52 69  Column+1]     Ri
8330: 67 68 74 2d 6d 6f 73 74 20 75 73 65 72 2d 64 65  ght-most user-de
8340: 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  fined column.** 
8350: 20 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75    apVal[p->nColu
8360: 6d 6e 2b 32 5d 20 20 20 20 20 48 69 64 64 65 6e  mn+2]     Hidden
8370: 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 73 61 6d   column with sam
8380: 65 20 6e 61 6d 65 20 61 73 20 74 61 62 6c 65 0a  e name as table.
8390: 2a 2a 20 20 20 61 70 56 61 6c 5b 70 2d 3e 6e 43  **   apVal[p->nC
83a0: 6f 6c 75 6d 6e 2b 33 5d 20 20 20 20 20 48 69 64  olumn+3]     Hid
83b0: 64 65 6e 20 22 64 6f 63 69 64 22 20 63 6f 6c 75  den "docid" colu
83c0: 6d 6e 20 28 61 6c 69 61 73 20 66 6f 72 20 72 6f  mn (alias for ro
83d0: 77 69 64 29 0a 2a 2a 20 20 20 61 70 56 61 6c 5b  wid).**   apVal[
83e0: 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 34 5d 20 20 20  p->nColumn+4]   
83f0: 20 20 48 69 64 64 65 6e 20 6c 61 6e 67 75 61 67    Hidden languag
8400: 65 69 64 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74  eid column.*/.st
8410: 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 73  atic int fts3Ins
8420: 65 72 74 44 61 74 61 28 0a 20 20 46 74 73 33 54  ertData(.  Fts3T
8430: 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
8440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
8450: 6c 6c 2d 74 65 78 74 20 74 61 62 6c 65 20 2a 2f  ll-text table */
8460: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
8470: 20 2a 2a 61 70 56 61 6c 2c 20 20 20 20 20 20 20   **apVal,       
8480: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 76     /* Array of v
8490: 61 6c 75 65 73 20 74 6f 20 69 6e 73 65 72 74 20  alues to insert 
84a0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
84b0: 36 34 20 2a 70 69 44 6f 63 69 64 20 20 20 20 20  64 *piDocid     
84c0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 6f 63       /* OUT: Doc
84d0: 69 64 20 66 6f 72 20 72 6f 77 20 6a 75 73 74 20  id for row just 
84e0: 69 6e 73 65 72 74 65 64 20 2a 2f 0a 29 7b 0a 20  inserted */.){. 
84f0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8510: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
8520: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
8530: 74 20 2a 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72  t *pContentInser
8540: 74 3b 20 20 20 2f 2a 20 49 4e 53 45 52 54 20 49  t;   /* INSERT I
8550: 4e 54 4f 20 25 5f 63 6f 6e 74 65 6e 74 20 56 41  NTO %_content VA
8560: 4c 55 45 53 28 2e 2e 2e 29 20 2a 2f 0a 0a 20 20  LUES(...) */..  
8570: 69 66 28 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54  if( p->zContentT
8580: 62 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  bl ){.    sqlite
8590: 33 5f 76 61 6c 75 65 20 2a 70 52 6f 77 69 64 20  3_value *pRowid 
85a0: 3d 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75  = apVal[p->nColu
85b0: 6d 6e 2b 33 5d 3b 0a 20 20 20 20 69 66 28 20 73  mn+3];.    if( s
85c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
85d0: 65 28 70 52 6f 77 69 64 29 3d 3d 53 51 4c 49 54  e(pRowid)==SQLIT
85e0: 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  E_NULL ){.      
85f0: 70 52 6f 77 69 64 20 3d 20 61 70 56 61 6c 5b 31  pRowid = apVal[1
8600: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  ];.    }.    if(
8610: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
8620: 79 70 65 28 70 52 6f 77 69 64 29 21 3d 53 51 4c  ype(pRowid)!=SQL
8630: 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  ITE_INTEGER ){. 
8640: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8650: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
8660: 20 20 20 7d 0a 20 20 20 20 2a 70 69 44 6f 63 69     }.    *piDoci
8670: 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  d = sqlite3_valu
8680: 65 5f 69 6e 74 36 34 28 70 52 6f 77 69 64 29 3b  e_int64(pRowid);
8690: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
86a0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
86b0: 20 4c 6f 63 61 74 65 20 74 68 65 20 73 74 61 74   Locate the stat
86c0: 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 75 73 65  ement handle use
86d0: 64 20 74 6f 20 69 6e 73 65 72 74 20 64 61 74 61  d to insert data
86e0: 20 69 6e 74 6f 20 74 68 65 20 25 5f 63 6f 6e 74   into the %_cont
86f0: 65 6e 74 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20  ent.  ** table. 
8700: 54 68 65 20 53 51 4c 20 66 6f 72 20 74 68 69 73  The SQL for this
8710: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 3a 0a 20   statement is:. 
8720: 20 2a 2a 0a 20 20 2a 2a 20 20 20 49 4e 53 45 52   **.  **   INSER
8730: 54 20 49 4e 54 4f 20 25 5f 63 6f 6e 74 65 6e 74  T INTO %_content
8740: 20 56 41 4c 55 45 53 28 3f 2c 20 3f 2c 20 3f 2c   VALUES(?, ?, ?,
8750: 20 2e 2e 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20   ...).  **.  ** 
8760: 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 66 65  The statement fe
8770: 61 74 75 72 65 73 20 4e 20 27 3f 27 20 76 61 72  atures N '?' var
8780: 69 61 62 6c 65 73 2c 20 77 68 65 72 65 20 4e 20  iables, where N 
8790: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
87a0: 20 75 73 65 72 0a 20 20 2a 2a 20 64 65 66 69 6e   user.  ** defin
87b0: 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ed columns in th
87c0: 65 20 46 54 53 33 20 74 61 62 6c 65 2c 20 70 6c  e FTS3 table, pl
87d0: 75 73 20 6f 6e 65 20 66 6f 72 20 74 68 65 20 64  us one for the d
87e0: 6f 63 69 64 20 66 69 65 6c 64 2e 0a 20 20 2a 2f  ocid field..  */
87f0: 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
8800: 74 6d 74 28 70 2c 20 53 51 4c 5f 43 4f 4e 54 45  tmt(p, SQL_CONTE
8810: 4e 54 5f 49 4e 53 45 52 54 2c 20 26 70 43 6f 6e  NT_INSERT, &pCon
8820: 74 65 6e 74 49 6e 73 65 72 74 2c 20 26 61 70 56  tentInsert, &apV
8830: 61 6c 5b 31 5d 29 3b 0a 20 20 69 66 28 20 72 63  al[1]);.  if( rc
8840: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
8850: 2d 3e 7a 4c 61 6e 67 75 61 67 65 69 64 20 29 7b  ->zLanguageid ){
8860: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
8870: 33 5f 62 69 6e 64 5f 69 6e 74 28 0a 20 20 20 20  3_bind_int(.    
8880: 20 20 20 20 70 43 6f 6e 74 65 6e 74 49 6e 73 65      pContentInse
8890: 72 74 2c 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32  rt, p->nColumn+2
88a0: 2c 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  , .        sqlit
88b0: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56  e3_value_int(apV
88c0: 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 34 5d  al[p->nColumn+4]
88d0: 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 69  ).    );.  }.  i
88e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
88f0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
8900: 20 2f 2a 20 54 68 65 72 65 20 69 73 20 61 20 71   /* There is a q
8910: 75 69 72 6b 20 68 65 72 65 2e 20 54 68 65 20 75  uirk here. The u
8920: 73 65 72 73 20 49 4e 53 45 52 54 20 73 74 61 74  sers INSERT stat
8930: 65 6d 65 6e 74 20 6d 61 79 20 68 61 76 65 20 73  ement may have s
8940: 70 65 63 69 66 69 65 64 0a 20 20 2a 2a 20 61 20  pecified.  ** a 
8950: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 22 72  value for the "r
8960: 6f 77 69 64 22 20 66 69 65 6c 64 2c 20 66 6f 72  owid" field, for
8970: 20 74 68 65 20 22 64 6f 63 69 64 22 20 66 69 65   the "docid" fie
8980: 6c 64 2c 20 6f 72 20 66 6f 72 20 62 6f 74 68 2e  ld, or for both.
8990: 0a 20 20 2a 2a 20 57 68 69 63 68 20 69 73 20 61  .  ** Which is a
89a0: 20 70 72 6f 62 6c 65 6d 2c 20 73 69 6e 63 65 20   problem, since 
89b0: 22 72 6f 77 69 64 22 20 61 6e 64 20 22 64 6f 63  "rowid" and "doc
89c0: 69 64 22 20 61 72 65 20 61 6c 69 61 73 65 73 20  id" are aliases 
89d0: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d  for the.  ** sam
89e0: 65 20 76 61 6c 75 65 2e 20 46 6f 72 20 65 78 61  e value. For exa
89f0: 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
8a00: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 74    INSERT INTO ft
8a10: 73 33 74 62 6c 28 72 6f 77 69 64 2c 20 64 6f 63  s3tbl(rowid, doc
8a20: 69 64 29 20 56 41 4c 55 45 53 28 31 2c 20 32 29  id) VALUES(1, 2)
8a30: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 46  ;.  **.  ** In F
8a40: 54 53 33 2c 20 74 68 69 73 20 69 73 20 61 6e 20  TS3, this is an 
8a50: 65 72 72 6f 72 2e 20 49 74 20 69 73 20 61 6e 20  error. It is an 
8a60: 65 72 72 6f 72 20 74 6f 20 73 70 65 63 69 66 79  error to specify
8a70: 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 73   non-NULL values
8a80: 0a 20 20 2a 2a 20 66 6f 72 20 62 6f 74 68 20 64  .  ** for both d
8a90: 6f 63 69 64 20 61 6e 64 20 73 6f 6d 65 20 6f 74  ocid and some ot
8aa0: 68 65 72 20 72 6f 77 69 64 20 61 6c 69 61 73 2e  her rowid alias.
8ab0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  .  */.  if( SQLI
8ac0: 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33  TE_NULL!=sqlite3
8ad0: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61  _value_type(apVa
8ae0: 6c 5b 33 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 29  l[3+p->nColumn])
8af0: 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49   ){.    if( SQLI
8b00: 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65 33  TE_NULL==sqlite3
8b10: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61  _value_type(apVa
8b20: 6c 5b 30 5d 29 0a 20 20 20 20 20 26 26 20 53 51  l[0]).     && SQ
8b30: 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74  LITE_NULL!=sqlit
8b40: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70  e3_value_type(ap
8b50: 56 61 6c 5b 31 5d 29 0a 20 20 20 20 29 7b 0a 20  Val[1]).    ){. 
8b60: 20 20 20 20 20 2f 2a 20 41 20 72 6f 77 69 64 2f       /* A rowid/
8b70: 64 6f 63 69 64 20 63 6f 6e 66 6c 69 63 74 2e 20  docid conflict. 
8b80: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
8b90: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
8ba0: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
8bb0: 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28  ite3_bind_value(
8bc0: 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 2c 20  pContentInsert, 
8bd0: 31 2c 20 61 70 56 61 6c 5b 33 2b 70 2d 3e 6e 43  1, apVal[3+p->nC
8be0: 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 20 20 69 66 28  olumn]);.    if(
8bf0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8c00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
8c10: 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68  .  /* Execute th
8c20: 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 69  e statement to i
8c30: 6e 73 65 72 74 20 74 68 65 20 72 65 63 6f 72 64  nsert the record
8c40: 2e 20 53 65 74 20 2a 70 69 44 6f 63 69 64 20 74  . Set *piDocid t
8c50: 6f 20 74 68 65 20 0a 20 20 2a 2a 20 6e 65 77 20  o the .  ** new 
8c60: 64 6f 63 69 64 20 76 61 6c 75 65 2e 20 0a 20 20  docid value. .  
8c70: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65  */.  sqlite3_ste
8c80: 70 28 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74  p(pContentInsert
8c90: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
8ca0: 33 5f 72 65 73 65 74 28 70 43 6f 6e 74 65 6e 74  3_reset(pContent
8cb0: 49 6e 73 65 72 74 29 3b 0a 0a 20 20 2a 70 69 44  Insert);..  *piD
8cc0: 6f 63 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c  ocid = sqlite3_l
8cd0: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
8ce0: 28 70 2d 3e 64 62 29 3b 0a 20 20 72 65 74 75 72  (p->db);.  retur
8cf0: 6e 20 72 63 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  n rc;.}..../*.**
8d00: 20 52 65 6d 6f 76 65 20 61 6c 6c 20 64 61 74 61   Remove all data
8d10: 20 66 72 6f 6d 20 74 68 65 20 46 54 53 33 20 74   from the FTS3 t
8d20: 61 62 6c 65 2e 20 43 6c 65 61 72 20 74 68 65 20  able. Clear the 
8d30: 68 61 73 68 20 74 61 62 6c 65 20 63 6f 6e 74 61  hash table conta
8d40: 69 6e 69 6e 67 0a 2a 2a 20 70 65 6e 64 69 6e 67  ining.** pending
8d50: 20 74 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69   terms..*/.stati
8d60: 63 20 69 6e 74 20 66 74 73 33 44 65 6c 65 74 65  c int fts3Delete
8d70: 41 6c 6c 28 46 74 73 33 54 61 62 6c 65 20 2a 70  All(Fts3Table *p
8d80: 2c 20 69 6e 74 20 62 43 6f 6e 74 65 6e 74 29 7b  , int bContent){
8d90: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
8da0: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
8db0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
8dc0: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 44 69 73 63 61  e */..  /* Disca
8dd0: 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  rd the contents 
8de0: 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74  of the pending-t
8df0: 65 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65 2e  erms hash table.
8e00: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46 74 73   */.  sqlite3Fts
8e10: 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 43 6c 65  3PendingTermsCle
8e20: 61 72 28 70 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c  ar(p);..  /* Del
8e30: 65 74 65 20 65 76 65 72 79 74 68 69 6e 67 20 66  ete everything f
8e40: 72 6f 6d 20 74 68 65 20 73 68 61 64 6f 77 20 74  rom the shadow t
8e50: 61 62 6c 65 73 2e 20 45 78 63 65 70 74 2c 20 6c  ables. Except, l
8e60: 65 61 76 65 20 25 5f 63 6f 6e 74 65 6e 74 20 61  eave %_content a
8e70: 73 0a 20 20 2a 2a 20 69 73 20 69 66 20 62 43 6f  s.  ** is if bCo
8e80: 6e 74 65 6e 74 20 69 73 20 66 61 6c 73 65 2e 20  ntent is false. 
8e90: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
8ea0: 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d 30 20  >zContentTbl==0 
8eb0: 7c 7c 20 62 43 6f 6e 74 65 6e 74 3d 3d 30 20 29  || bContent==0 )
8ec0: 3b 0a 20 20 69 66 28 20 62 43 6f 6e 74 65 6e 74  ;.  if( bContent
8ed0: 20 29 20 66 74 73 33 53 71 6c 45 78 65 63 28 26   ) fts3SqlExec(&
8ee0: 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54  rc, p, SQL_DELET
8ef0: 45 5f 41 4c 4c 5f 43 4f 4e 54 45 4e 54 2c 20 30  E_ALL_CONTENT, 0
8f00: 29 3b 0a 20 20 66 74 73 33 53 71 6c 45 78 65 63  );.  fts3SqlExec
8f10: 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c  (&rc, p, SQL_DEL
8f20: 45 54 45 5f 41 4c 4c 5f 53 45 47 4d 45 4e 54 53  ETE_ALL_SEGMENTS
8f30: 2c 20 30 29 3b 0a 20 20 66 74 73 33 53 71 6c 45  , 0);.  fts3SqlE
8f40: 78 65 63 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f  xec(&rc, p, SQL_
8f50: 44 45 4c 45 54 45 5f 41 4c 4c 5f 53 45 47 44 49  DELETE_ALL_SEGDI
8f60: 52 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e  R, 0);.  if( p->
8f70: 62 48 61 73 44 6f 63 73 69 7a 65 20 29 7b 0a 20  bHasDocsize ){. 
8f80: 20 20 20 66 74 73 33 53 71 6c 45 78 65 63 28 26     fts3SqlExec(&
8f90: 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54  rc, p, SQL_DELET
8fa0: 45 5f 41 4c 4c 5f 44 4f 43 53 49 5a 45 2c 20 30  E_ALL_DOCSIZE, 0
8fb0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
8fc0: 62 48 61 73 53 74 61 74 20 29 7b 0a 20 20 20 20  bHasStat ){.    
8fd0: 66 74 73 33 53 71 6c 45 78 65 63 28 26 72 63 2c  fts3SqlExec(&rc,
8fe0: 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41   p, SQL_DELETE_A
8ff0: 4c 4c 5f 53 54 41 54 2c 20 30 29 3b 0a 20 20 7d  LL_STAT, 0);.  }
9000: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9010: 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  ./*.**.*/.static
9020: 20 69 6e 74 20 6c 61 6e 67 69 64 46 72 6f 6d 53   int langidFromS
9030: 65 6c 65 63 74 28 46 74 73 33 54 61 62 6c 65 20  elect(Fts3Table 
9040: 2a 70 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  *p, sqlite3_stmt
9050: 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 69 6e   *pSelect){.  in
9060: 74 20 69 4c 61 6e 67 69 64 20 3d 20 30 3b 0a 20  t iLangid = 0;. 
9070: 20 69 66 28 20 70 2d 3e 7a 4c 61 6e 67 75 61 67   if( p->zLanguag
9080: 65 69 64 20 29 20 69 4c 61 6e 67 69 64 20 3d 20  eid ) iLangid = 
9090: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
90a0: 6e 74 28 70 53 65 6c 65 63 74 2c 20 70 2d 3e 6e  nt(pSelect, p->n
90b0: 43 6f 6c 75 6d 6e 2b 31 29 3b 0a 20 20 72 65 74  Column+1);.  ret
90c0: 75 72 6e 20 69 4c 61 6e 67 69 64 3b 0a 7d 0a 0a  urn iLangid;.}..
90d0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
90e0: 65 6c 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 61  element in the a
90f0: 70 56 61 6c 5b 5d 20 61 72 72 61 79 20 69 73 20  pVal[] array is 
9100: 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61  assumed to conta
9110: 69 6e 20 74 68 65 20 64 6f 63 69 64 0a 2a 2a 20  in the docid.** 
9120: 28 61 6e 20 69 6e 74 65 67 65 72 29 20 6f 66 20  (an integer) of 
9130: 61 20 72 6f 77 20 61 62 6f 75 74 20 74 6f 20 62  a row about to b
9140: 65 20 64 65 6c 65 74 65 64 2e 20 52 65 6d 6f 76  e deleted. Remov
9150: 65 20 61 6c 6c 20 74 65 72 6d 73 20 66 72 6f 6d  e all terms from
9160: 20 74 68 65 0a 2a 2a 20 66 75 6c 6c 2d 74 65 78   the.** full-tex
9170: 74 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  t index..*/.stat
9180: 69 63 20 76 6f 69 64 20 66 74 73 33 44 65 6c 65  ic void fts3Dele
9190: 74 65 54 65 72 6d 73 28 20 0a 20 20 69 6e 74 20  teTerms( .  int 
91a0: 2a 70 52 43 2c 20 20 20 20 20 20 20 20 20 20 20  *pRC,           
91b0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
91c0: 64 65 20 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c  de */.  Fts3Tabl
91d0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
91e0: 2f 2a 20 54 68 65 20 46 54 53 20 74 61 62 6c 65  /* The FTS table
91f0: 20 74 6f 20 64 65 6c 65 74 65 20 66 72 6f 6d 20   to delete from 
9200: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
9210: 75 65 20 2a 70 52 6f 77 69 64 2c 20 20 2f 2a 20  ue *pRowid,  /* 
9220: 54 68 65 20 64 6f 63 69 64 20 74 6f 20 62 65 20  The docid to be 
9230: 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 33 32  deleted */.  u32
9240: 20 2a 61 53 7a 2c 20 20 20 20 20 20 20 20 20 20   *aSz,          
9250: 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66       /* Sizes of
9260: 20 64 65 6c 65 74 65 64 20 64 6f 63 75 6d 65 6e   deleted documen
9270: 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
9280: 2f 0a 20 20 69 6e 74 20 2a 70 62 46 6f 75 6e 64  /.  int *pbFound
9290: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
92a0: 55 54 3a 20 53 65 74 20 74 6f 20 74 72 75 65 20  UT: Set to true 
92b0: 69 66 20 72 6f 77 20 72 65 61 6c 6c 79 20 64 6f  if row really do
92c0: 65 73 20 65 78 69 73 74 20 2a 2f 0a 29 7b 0a 20  es exist */.){. 
92d0: 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
92e0: 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74  e3_stmt *pSelect
92f0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 62  ;..  assert( *pb
9300: 46 6f 75 6e 64 3d 3d 30 20 29 3b 0a 20 20 69 66  Found==0 );.  if
9310: 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
9320: 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
9330: 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43  tmt(p, SQL_SELEC
9340: 54 5f 43 4f 4e 54 45 4e 54 5f 42 59 5f 52 4f 57  T_CONTENT_BY_ROW
9350: 49 44 2c 20 26 70 53 65 6c 65 63 74 2c 20 26 70  ID, &pSelect, &p
9360: 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 72 63  Rowid);.  if( rc
9370: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
9380: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
9390: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
93a0: 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  pSelect) ){.    
93b0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
93c0: 6e 74 20 69 4c 61 6e 67 69 64 20 3d 20 6c 61 6e  nt iLangid = lan
93d0: 67 69 64 46 72 6f 6d 53 65 6c 65 63 74 28 70 2c  gidFromSelect(p,
93e0: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20   pSelect);.     
93f0: 20 69 36 34 20 69 44 6f 63 69 64 20 3d 20 73 71   i64 iDocid = sq
9400: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
9410: 36 34 28 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  64(pSelect, 0);.
9420: 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 50        rc = fts3P
9430: 65 6e 64 69 6e 67 54 65 72 6d 73 44 6f 63 69 64  endingTermsDocid
9440: 28 70 2c 20 31 2c 20 69 4c 61 6e 67 69 64 2c 20  (p, 1, iLangid, 
9450: 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 20 20 66  iDocid);.      f
9460: 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49  or(i=1; rc==SQLI
9470: 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 70 2d 3e 6e  TE_OK && i<=p->n
9480: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
9490: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
94a0: 20 69 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66   i-1;.        if
94b0: 28 20 70 2d 3e 61 62 4e 6f 74 69 6e 64 65 78 65  ( p->abNotindexe
94c0: 64 5b 69 43 6f 6c 5d 3d 3d 30 20 29 7b 0a 20 20  d[iCol]==0 ){.  
94d0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
94e0: 61 72 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e  ar *zText = (con
94f0: 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  st char *)sqlite
9500: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
9510: 65 6c 65 63 74 2c 20 69 29 3b 0a 20 20 20 20 20  elect, i);.     
9520: 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 50 65       rc = fts3Pe
9530: 6e 64 69 6e 67 54 65 72 6d 73 41 64 64 28 70 2c  ndingTermsAdd(p,
9540: 20 69 4c 61 6e 67 69 64 2c 20 7a 54 65 78 74 2c   iLangid, zText,
9550: 20 2d 31 2c 20 26 61 53 7a 5b 69 43 6f 6c 5d 29   -1, &aSz[iCol])
9560: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 53 7a 5b  ;.          aSz[
9570: 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 2b 3d 20 73  p->nColumn] += s
9580: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
9590: 74 65 73 28 70 53 65 6c 65 63 74 2c 20 69 29 3b  tes(pSelect, i);
95a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
95b0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21   }.      if( rc!
95c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
95d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
95e0: 73 65 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  set(pSelect);.  
95f0: 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b        *pRC = rc;
9600: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
9610: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
9620: 70 62 46 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 20  pbFound = 1;.   
9630: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
9640: 74 65 33 5f 72 65 73 65 74 28 70 53 65 6c 65 63  te3_reset(pSelec
9650: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
9660: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
9670: 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 2a  Select);.  }.  *
9680: 70 52 43 20 3d 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  pRC = rc;.}../*.
9690: 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
96a0: 72 61 74 69 6f 6e 20 74 6f 20 61 63 63 6f 75 6e  ration to accoun
96b0: 74 20 66 6f 72 20 74 68 65 20 63 69 72 63 75 6c  t for the circul
96c0: 61 72 20 64 65 70 65 6e 64 65 6e 63 79 20 62 65  ar dependency be
96d0: 74 77 65 65 6e 0a 2a 2a 20 66 75 6e 63 74 69 6f  tween.** functio
96e0: 6e 73 20 66 74 73 33 53 65 67 6d 65 6e 74 4d 65  ns fts3SegmentMe
96f0: 72 67 65 28 29 20 61 6e 64 20 66 74 73 33 41 6c  rge() and fts3Al
9700: 6c 6f 63 61 74 65 53 65 67 64 69 72 49 64 78 28  locateSegdirIdx(
9710: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
9720: 20 66 74 73 33 53 65 67 6d 65 6e 74 4d 65 72 67   fts3SegmentMerg
9730: 65 28 46 74 73 33 54 61 62 6c 65 20 2a 2c 20 69  e(Fts3Table *, i
9740: 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 29 3b 0a 0a  nt, int, int);..
9750: 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  /* .** This func
9760: 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61  tion allocates a
9770: 20 6e 65 77 20 6c 65 76 65 6c 20 69 4c 65 76 65   new level iLeve
9780: 6c 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 73  l index in the s
9790: 65 67 64 69 72 20 74 61 62 6c 65 2e 0a 2a 2a 20  egdir table..** 
97a0: 55 73 75 61 6c 6c 79 2c 20 69 6e 64 65 78 65 73  Usually, indexes
97b0: 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 77   are allocated w
97c0: 69 74 68 69 6e 20 61 20 6c 65 76 65 6c 20 73 65  ithin a level se
97d0: 71 75 65 6e 74 69 61 6c 6c 79 20 73 74 61 72 74  quentially start
97e0: 69 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2c 20 73  ing.** with 0, s
97f0: 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  o the allocated 
9800: 69 6e 64 65 78 20 69 73 20 6f 6e 65 20 67 72 65  index is one gre
9810: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61  ater than the va
9820: 6c 75 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  lue returned.** 
9830: 62 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  by:.**.**   SELE
9840: 43 54 20 6d 61 78 28 69 64 78 29 20 46 52 4f 4d  CT max(idx) FROM
9850: 20 25 5f 73 65 67 64 69 72 20 57 48 45 52 45 20   %_segdir WHERE 
9860: 6c 65 76 65 6c 20 3d 20 3a 69 4c 65 76 65 6c 0a  level = :iLevel.
9870: 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69  **.** However, i
9880: 66 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65  f there are alre
9890: 61 64 79 20 46 54 53 33 5f 4d 45 52 47 45 5f 43  ady FTS3_MERGE_C
98a0: 4f 55 4e 54 20 69 6e 64 65 78 65 73 20 61 74 20  OUNT indexes at 
98b0: 74 68 65 20 72 65 71 75 65 73 74 65 64 0a 2a 2a  the requested.**
98c0: 20 6c 65 76 65 6c 2c 20 74 68 65 79 20 61 72 65   level, they are
98d0: 20 6d 65 72 67 65 64 20 69 6e 74 6f 20 61 20 73   merged into a s
98e0: 69 6e 67 6c 65 20 6c 65 76 65 6c 20 28 69 4c 65  ingle level (iLe
98f0: 76 65 6c 2b 31 29 20 73 65 67 6d 65 6e 74 20 61  vel+1) segment a
9900: 6e 64 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63  nd the .** alloc
9910: 61 74 65 64 20 69 6e 64 65 78 20 69 73 20 30 2e  ated index is 0.
9920: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
9930: 73 66 75 6c 2c 20 2a 70 69 49 64 78 20 69 73 20  sful, *piIdx is 
9940: 73 65 74 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63  set to the alloc
9950: 61 74 65 64 20 69 6e 64 65 78 20 73 6c 6f 74 20  ated index slot 
9960: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  and SQLITE_OK.**
9970: 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
9980: 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20  wise, an SQLite 
9990: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
99a0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
99b0: 63 20 69 6e 74 20 66 74 73 33 41 6c 6c 6f 63 61  c int fts3Alloca
99c0: 74 65 53 65 67 64 69 72 49 64 78 28 0a 20 20 46  teSegdirIdx(.  F
99d0: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 0a 20 20  ts3Table *p, .  
99e0: 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20 20 20  int iLangid,    
99f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a00: 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64 20 2a  /* Language id *
9a10: 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 2c 20  /.  int iIndex, 
9a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a30: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72      /* Index for
9a40: 20 70 2d 3e 61 49 6e 64 65 78 20 2a 2f 0a 20 20   p->aIndex */.  
9a50: 69 6e 74 20 69 4c 65 76 65 6c 2c 20 0a 20 20 69  int iLevel, .  i
9a60: 6e 74 20 2a 70 69 49 64 78 0a 29 7b 0a 20 20 69  nt *piIdx.){.  i
9a70: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9a90: 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
9aa0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
9ab0: 2a 70 4e 65 78 74 49 64 78 3b 20 20 20 20 20 20  *pNextIdx;      
9ac0: 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6f 72 20     /* Query for 
9ad0: 6e 65 78 74 20 69 64 78 20 61 74 20 6c 65 76 65  next idx at leve
9ae0: 6c 20 69 4c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e  l iLevel */.  in
9af0: 74 20 69 4e 65 78 74 20 3d 20 30 3b 20 20 20 20  t iNext = 0;    
9b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9b10: 20 52 65 73 75 6c 74 20 6f 66 20 71 75 65 72 79   Result of query
9b20: 20 70 4e 65 78 74 49 64 78 20 2a 2f 0a 0a 20 20   pNextIdx */..  
9b30: 61 73 73 65 72 74 28 20 69 4c 61 6e 67 69 64 3e  assert( iLangid>
9b40: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9b50: 70 2d 3e 6e 49 6e 64 65 78 3e 3d 31 20 29 3b 0a  p->nIndex>=1 );.
9b60: 0a 20 20 2f 2a 20 53 65 74 20 76 61 72 69 61 62  .  /* Set variab
9b70: 6c 65 20 69 4e 65 78 74 20 74 6f 20 74 68 65 20  le iNext to the 
9b80: 6e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 73  next available s
9b90: 65 67 64 69 72 20 69 6e 64 65 78 20 61 74 20 6c  egdir index at l
9ba0: 65 76 65 6c 20 69 4c 65 76 65 6c 2e 20 2a 2f 0a  evel iLevel. */.
9bb0: 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
9bc0: 6d 74 28 70 2c 20 53 51 4c 5f 4e 45 58 54 5f 53  mt(p, SQL_NEXT_S
9bd0: 45 47 4d 45 4e 54 5f 49 4e 44 45 58 2c 20 26 70  EGMENT_INDEX, &p
9be0: 4e 65 78 74 49 64 78 2c 20 30 29 3b 0a 20 20 69  NextIdx, 0);.  i
9bf0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
9c00: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
9c10: 62 69 6e 64 5f 69 6e 74 36 34 28 0a 20 20 20 20  bind_int64(.    
9c20: 20 20 20 20 70 4e 65 78 74 49 64 78 2c 20 31 2c      pNextIdx, 1,
9c30: 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65   getAbsoluteLeve
9c40: 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49  l(p, iLangid, iI
9c50: 6e 64 65 78 2c 20 69 4c 65 76 65 6c 29 0a 20 20  ndex, iLevel).  
9c60: 20 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c    );.    if( SQL
9c70: 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
9c80: 5f 73 74 65 70 28 70 4e 65 78 74 49 64 78 29 20  _step(pNextIdx) 
9c90: 29 7b 0a 20 20 20 20 20 20 69 4e 65 78 74 20 3d  ){.      iNext =
9ca0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
9cb0: 69 6e 74 28 70 4e 65 78 74 49 64 78 2c 20 30 29  int(pNextIdx, 0)
9cc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
9cd0: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
9ce0: 4e 65 78 74 49 64 78 29 3b 0a 20 20 7d 0a 0a 20  NextIdx);.  }.. 
9cf0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
9d00: 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  OK ){.    /* If 
9d10: 69 4e 65 78 74 20 69 73 20 46 54 53 33 5f 4d 45  iNext is FTS3_ME
9d20: 52 47 45 5f 43 4f 55 4e 54 2c 20 69 6e 64 69 63  RGE_COUNT, indic
9d30: 61 74 69 6e 67 20 74 68 61 74 20 6c 65 76 65 6c  ating that level
9d40: 20 69 4c 65 76 65 6c 20 69 73 20 61 6c 72 65 61   iLevel is alrea
9d50: 64 79 0a 20 20 20 20 2a 2a 20 66 75 6c 6c 2c 20  dy.    ** full, 
9d60: 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d 65 6e  merge all segmen
9d70: 74 73 20 69 6e 20 6c 65 76 65 6c 20 69 4c 65 76  ts in level iLev
9d80: 65 6c 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  el into a single
9d90: 20 69 4c 65 76 65 6c 2b 31 0a 20 20 20 20 2a 2a   iLevel+1.    **
9da0: 20 73 65 67 6d 65 6e 74 20 61 6e 64 20 61 6c 6c   segment and all
9db0: 6f 63 61 74 65 20 28 6e 65 77 6c 79 20 66 72 65  ocate (newly fre
9dc0: 65 64 29 20 69 6e 64 65 78 20 30 20 61 74 20 6c  ed) index 0 at l
9dd0: 65 76 65 6c 20 69 4c 65 76 65 6c 2e 20 4f 74 68  evel iLevel. Oth
9de0: 65 72 77 69 73 65 2c 0a 20 20 20 20 2a 2a 20 69  erwise,.    ** i
9df0: 66 20 69 4e 65 78 74 20 69 73 20 6c 65 73 73 20  f iNext is less 
9e00: 74 68 61 6e 20 46 54 53 33 5f 4d 45 52 47 45 5f  than FTS3_MERGE_
9e10: 43 4f 55 4e 54 2c 20 61 6c 6c 6f 63 61 74 65 20  COUNT, allocate 
9e20: 69 6e 64 65 78 20 69 4e 65 78 74 2e 0a 20 20 20  index iNext..   
9e30: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 4e 65 78   */.    if( iNex
9e40: 74 3e 3d 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f  t>=FTS3_MERGE_CO
9e50: 55 4e 54 20 29 7b 0a 20 20 20 20 20 20 66 74 73  UNT ){.      fts
9e60: 33 4c 6f 67 4d 65 72 67 65 28 31 36 2c 20 67 65  3LogMerge(16, ge
9e70: 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70  tAbsoluteLevel(p
9e80: 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
9e90: 78 2c 20 69 4c 65 76 65 6c 29 29 3b 0a 20 20 20  x, iLevel));.   
9ea0: 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 6d     rc = fts3Segm
9eb0: 65 6e 74 4d 65 72 67 65 28 70 2c 20 69 4c 61 6e  entMerge(p, iLan
9ec0: 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65  gid, iIndex, iLe
9ed0: 76 65 6c 29 3b 0a 20 20 20 20 20 20 2a 70 69 49  vel);.      *piI
9ee0: 64 78 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  dx = 0;.    }els
9ef0: 65 7b 0a 20 20 20 20 20 20 2a 70 69 49 64 78 20  e{.      *piIdx 
9f00: 3d 20 69 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  = iNext;.    }. 
9f10: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
9f20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 25 5f  .}../*.** The %_
9f30: 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20 69  segments table i
9f40: 73 20 64 65 63 6c 61 72 65 64 20 61 73 20 66 6f  s declared as fo
9f50: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  llows:.**.**   C
9f60: 52 45 41 54 45 20 54 41 42 4c 45 20 25 5f 73 65  REATE TABLE %_se
9f70: 67 6d 65 6e 74 73 28 62 6c 6f 63 6b 69 64 20 49  gments(blockid I
9f80: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
9f90: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 0a  EY, block BLOB).
9fa0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
9fb0: 69 6f 6e 20 72 65 61 64 73 20 64 61 74 61 20 66  ion reads data f
9fc0: 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  rom a single row
9fd0: 20 6f 66 20 74 68 65 20 25 5f 73 65 67 6d 65 6e   of the %_segmen
9fe0: 74 73 20 74 61 62 6c 65 2e 20 54 68 65 0a 2a 2a  ts table. The.**
9ff0: 20 73 70 65 63 69 66 69 63 20 72 6f 77 20 69 73   specific row is
a000: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
a010: 68 65 20 69 42 6c 6f 63 6b 69 64 20 70 61 72 61  he iBlockid para
a020: 6d 65 74 65 72 2e 20 49 66 20 70 61 42 6c 6f 62  meter. If paBlob
a030: 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c   is not.** NULL,
a040: 20 74 68 65 6e 20 61 20 62 75 66 66 65 72 20 69   then a buffer i
a050: 73 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  s allocated usin
a060: 67 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  g sqlite3_malloc
a070: 28 29 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64  () and populated
a080: 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 63 6f 6e  .** with the con
a090: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 6c 6f  tents of the blo
a0a0: 62 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  b stored in the 
a0b0: 22 62 6c 6f 63 6b 22 20 63 6f 6c 75 6d 6e 20 6f  "block" column o
a0c0: 66 20 74 68 65 20 0a 2a 2a 20 69 64 65 6e 74 69  f the .** identi
a0d0: 66 69 65 64 20 74 61 62 6c 65 20 72 6f 77 20 69  fied table row i
a0e0: 73 2e 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  s. Whether or no
a0f0: 74 20 70 61 42 6c 6f 62 20 69 73 20 4e 55 4c 4c  t paBlob is NULL
a100: 2c 20 2a 70 6e 42 6c 6f 62 20 69 73 20 73 65 74  , *pnBlob is set
a110: 0a 2a 2a 20 74 6f 20 74 68 65 20 73 69 7a 65 20  .** to the size 
a120: 6f 66 20 74 68 65 20 62 6c 6f 62 20 69 6e 20 62  of the blob in b
a130: 79 74 65 73 20 62 65 66 6f 72 65 20 72 65 74 75  ytes before retu
a140: 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
a150: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
a160: 20 6f 72 20 74 68 65 20 74 61 62 6c 65 20 64 6f   or the table do
a170: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 74  es not contain t
a180: 68 65 20 73 70 65 63 69 66 69 65 64 20 72 6f 77  he specified row
a190: 2c 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65  ,.** an SQLite e
a1a0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
a1b0: 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
a1c0: 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
a1d0: 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 70  eturned. If.** p
a1e0: 61 42 6c 6f 62 20 69 73 20 6e 6f 6e 2d 4e 55 4c  aBlob is non-NUL
a1f0: 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  L, then it is th
a200: 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
a210: 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
a220: 6f 0a 2a 2a 20 65 76 65 6e 74 75 61 6c 6c 79 20  o.** eventually 
a230: 66 72 65 65 20 74 68 65 20 72 65 74 75 72 6e 65  free the returne
a240: 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  d buffer..**.** 
a250: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
a260: 79 20 6c 65 61 76 65 20 61 6e 20 6f 70 65 6e 20  y leave an open 
a270: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 2a 20 68 61  sqlite3_blob* ha
a280: 6e 64 6c 65 20 69 6e 20 74 68 65 0a 2a 2a 20 46  ndle in the.** F
a290: 74 73 33 54 61 62 6c 65 2e 70 53 65 67 6d 65 6e  ts3Table.pSegmen
a2a0: 74 73 20 76 61 72 69 61 62 6c 65 2e 20 54 68 69  ts variable. Thi
a2b0: 73 20 68 61 6e 64 6c 65 20 69 73 20 72 65 75 73  s handle is reus
a2c0: 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ed by subsequent
a2d0: 20 63 61 6c 6c 73 0a 2a 2a 20 74 6f 20 74 68 69   calls.** to thi
a2e0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20  s function. The 
a2f0: 68 61 6e 64 6c 65 20 6d 61 79 20 62 65 20 63 6c  handle may be cl
a300: 6f 73 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20  osed by calling 
a310: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 74  the.** sqlite3Ft
a320: 73 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28  s3SegmentsClose(
a330: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 52 65 75 73  ) function. Reus
a340: 69 6e 67 20 61 20 62 6c 6f 62 20 68 61 6e 64 6c  ing a blob handl
a350: 65 20 69 73 20 61 20 68 61 6e 64 79 0a 2a 2a 20  e is a handy.** 
a360: 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72  performance impr
a370: 6f 76 65 6d 65 6e 74 2c 20 62 75 74 20 74 68 65  ovement, but the
a380: 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 73 68 6f   blob handle sho
a390: 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 63 6c  uld always be cl
a3a0: 6f 73 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 63  osed.** before c
a3b0: 6f 6e 74 72 6f 6c 20 69 73 20 72 65 74 75 72 6e  ontrol is return
a3c0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20 28  ed to the user (
a3d0: 74 6f 20 70 72 65 76 65 6e 74 20 61 20 6c 6f 63  to prevent a loc
a3e0: 6b 20 62 65 69 6e 67 20 68 65 6c 64 0a 2a 2a 20  k being held.** 
a3f0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
a400: 66 69 6c 65 20 66 6f 72 20 6c 6f 6e 67 65 72 20  file for longer 
a410: 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 29 2e  than necessary).
a420: 20 54 68 75 73 2c 20 61 6e 79 20 76 69 72 74 75   Thus, any virtu
a430: 61 6c 20 74 61 62 6c 65 0a 2a 2a 20 6d 65 74 68  al table.** meth
a440: 6f 64 20 28 78 46 69 6c 74 65 72 20 65 74 63 2e  od (xFilter etc.
a450: 29 20 74 68 61 74 20 6d 61 79 20 64 69 72 65 63  ) that may direc
a460: 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c  tly or indirectl
a470: 79 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  y call this func
a480: 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 61 6c  tion.** must cal
a490: 6c 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  l sqlite3Fts3Seg
a4a0: 6d 65 6e 74 73 43 6c 6f 73 65 28 29 20 62 65 66  mentsClose() bef
a4b0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
a4c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
a4d0: 33 52 65 61 64 42 6c 6f 63 6b 28 0a 20 20 46 74  3ReadBlock(.  Ft
a4e0: 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a500: 20 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64   FTS3 table hand
a510: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
a520: 69 6e 74 36 34 20 69 42 6c 6f 63 6b 69 64 2c 20  int64 iBlockid, 
a530: 20 20 20 20 20 20 20 20 2f 2a 20 41 63 63 65 73          /* Acces
a540: 73 20 74 68 65 20 72 6f 77 20 77 69 74 68 20 62  s the row with b
a550: 6c 6f 63 6b 69 64 3d 24 69 42 6c 6f 63 6b 69 64  lockid=$iBlockid
a560: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 61 42   */.  char **paB
a570: 6c 6f 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  lob,            
a580: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42 6c        /* OUT: Bl
a590: 6f 62 20 64 61 74 61 20 69 6e 20 6d 61 6c 6c 6f  ob data in mallo
a5a0: 63 27 64 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  c'd buffer */.  
a5b0: 69 6e 74 20 2a 70 6e 42 6c 6f 62 2c 20 20 20 20  int *pnBlob,    
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5d0: 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20  /* OUT: Size of 
a5e0: 62 6c 6f 62 20 64 61 74 61 20 2a 2f 0a 20 20 69  blob data */.  i
a5f0: 6e 74 20 2a 70 6e 4c 6f 61 64 20 20 20 20 20 20  nt *pnLoad      
a600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a610: 2a 20 4f 55 54 3a 20 42 79 74 65 73 20 61 63 74  * OUT: Bytes act
a620: 75 61 6c 6c 79 20 6c 6f 61 64 65 64 20 2a 2f 0a  ually loaded */.
a630: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
a640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a650: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
a660: 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 70 6e 42  ode */..  /* pnB
a670: 6c 6f 62 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d  lob must be non-
a680: 4e 55 4c 4c 2e 20 70 61 42 6c 6f 62 20 6d 61 79  NULL. paBlob may
a690: 20 62 65 20 4e 55 4c 4c 20 6f 72 20 6e 6f 6e 2d   be NULL or non-
a6a0: 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 61 73 73 65 72  NULL. */.  asser
a6b0: 74 28 20 70 6e 42 6c 6f 62 20 29 3b 0a 0a 20 20  t( pnBlob );..  
a6c0: 69 66 28 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73  if( p->pSegments
a6d0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
a6e0: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e  ite3_blob_reopen
a6f0: 28 70 2d 3e 70 53 65 67 6d 65 6e 74 73 2c 20 69  (p->pSegments, i
a700: 42 6c 6f 63 6b 69 64 29 3b 0a 20 20 7d 65 6c 73  Blockid);.  }els
a710: 65 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 2d  e{.    if( 0==p-
a720: 3e 7a 53 65 67 6d 65 6e 74 73 54 62 6c 20 29 7b  >zSegmentsTbl ){
a730: 0a 20 20 20 20 20 20 70 2d 3e 7a 53 65 67 6d 65  .      p->zSegme
a740: 6e 74 73 54 62 6c 20 3d 20 73 71 6c 69 74 65 33  ntsTbl = sqlite3
a750: 5f 6d 70 72 69 6e 74 66 28 22 25 73 5f 73 65 67  _mprintf("%s_seg
a760: 6d 65 6e 74 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65  ments", p->zName
a770: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  );.      if( 0==
a780: 70 2d 3e 7a 53 65 67 6d 65 6e 74 73 54 62 6c 20  p->zSegmentsTbl 
a790: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
a7a0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
a7b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
a7c0: 6f 62 5f 6f 70 65 6e 28 0a 20 20 20 20 20 20 20  ob_open(.       
a7d0: 70 2d 3e 64 62 2c 20 70 2d 3e 7a 44 62 2c 20 70  p->db, p->zDb, p
a7e0: 2d 3e 7a 53 65 67 6d 65 6e 74 73 54 62 6c 2c 20  ->zSegmentsTbl, 
a7f0: 22 62 6c 6f 63 6b 22 2c 20 69 42 6c 6f 63 6b 69  "block", iBlocki
a800: 64 2c 20 30 2c 20 26 70 2d 3e 70 53 65 67 6d 65  d, 0, &p->pSegme
a810: 6e 74 73 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  nts.    );.  }..
a820: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
a830: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  _OK ){.    int n
a840: 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 62  Byte = sqlite3_b
a850: 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 53 65  lob_bytes(p->pSe
a860: 67 6d 65 6e 74 73 29 3b 0a 20 20 20 20 2a 70 6e  gments);.    *pn
a870: 42 6c 6f 62 20 3d 20 6e 42 79 74 65 3b 0a 20 20  Blob = nByte;.  
a880: 20 20 69 66 28 20 70 61 42 6c 6f 62 20 29 7b 0a    if( paBlob ){.
a890: 20 20 20 20 20 20 63 68 61 72 20 2a 61 42 79 74        char *aByt
a8a0: 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
a8b0: 6f 63 28 6e 42 79 74 65 20 2b 20 46 54 53 33 5f  oc(nByte + FTS3_
a8c0: 4e 4f 44 45 5f 50 41 44 44 49 4e 47 29 3b 0a 20  NODE_PADDING);. 
a8d0: 20 20 20 20 20 69 66 28 20 21 61 42 79 74 65 20       if( !aByte 
a8e0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
a8f0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
a900: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a910: 20 20 20 69 66 28 20 70 6e 4c 6f 61 64 20 26 26     if( pnLoad &&
a920: 20 6e 42 79 74 65 3e 28 46 54 53 33 5f 4e 4f 44   nByte>(FTS3_NOD
a930: 45 5f 43 48 55 4e 4b 5f 54 48 52 45 53 48 4f 4c  E_CHUNK_THRESHOL
a940: 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  D) ){.          
a950: 6e 42 79 74 65 20 3d 20 46 54 53 33 5f 4e 4f 44  nByte = FTS3_NOD
a960: 45 5f 43 48 55 4e 4b 53 49 5a 45 3b 0a 20 20 20  E_CHUNKSIZE;.   
a970: 20 20 20 20 20 20 20 2a 70 6e 4c 6f 61 64 20 3d         *pnLoad =
a980: 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20   nByte;.        
a990: 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  }.        rc = s
a9a0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64  qlite3_blob_read
a9b0: 28 70 2d 3e 70 53 65 67 6d 65 6e 74 73 2c 20 61  (p->pSegments, a
a9c0: 42 79 74 65 2c 20 6e 42 79 74 65 2c 20 30 29 3b  Byte, nByte, 0);
a9d0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
a9e0: 26 61 42 79 74 65 5b 6e 42 79 74 65 5d 2c 20 30  &aByte[nByte], 0
a9f0: 2c 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44  , FTS3_NODE_PADD
aa00: 49 4e 47 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ING);.        if
aa10: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
aa20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
aa30: 69 74 65 33 5f 66 72 65 65 28 61 42 79 74 65 29  ite3_free(aByte)
aa40: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 42 79 74  ;.          aByt
aa50: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
aa60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
aa70: 70 61 42 6c 6f 62 20 3d 20 61 42 79 74 65 3b 0a  paBlob = aByte;.
aa80: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
aa90: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
aaa0: 20 43 6c 6f 73 65 20 74 68 65 20 62 6c 6f 62 20   Close the blob 
aab0: 68 61 6e 64 6c 65 20 61 74 20 70 2d 3e 70 53 65  handle at p->pSe
aac0: 67 6d 65 6e 74 73 2c 20 69 66 20 69 74 20 69 73  gments, if it is
aad0: 20 6f 70 65 6e 2e 20 53 65 65 20 63 6f 6d 6d 65   open. See comme
aae0: 6e 74 73 20 61 62 6f 76 65 0a 2a 2a 20 74 68 65  nts above.** the
aaf0: 20 73 71 6c 69 74 65 33 46 74 73 33 52 65 61 64   sqlite3Fts3Read
ab00: 42 6c 6f 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e  Block() function
ab10: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
ab20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
ab30: 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28 46  3SegmentsClose(F
ab40: 74 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  ts3Table *p){.  
ab50: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f  sqlite3_blob_clo
ab60: 73 65 28 70 2d 3e 70 53 65 67 6d 65 6e 74 73 29  se(p->pSegments)
ab70: 3b 0a 20 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73  ;.  p->pSegments
ab80: 20 3d 20 30 3b 0a 7d 0a 20 20 20 20 0a 73 74 61   = 0;.}.    .sta
ab90: 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 52  tic int fts3SegR
aba0: 65 61 64 65 72 49 6e 63 72 52 65 61 64 28 46 74  eaderIncrRead(Ft
abb0: 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 65  s3SegReader *pRe
abc0: 61 64 65 72 29 7b 0a 20 20 69 6e 74 20 6e 52 65  ader){.  int nRe
abd0: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ad;             
abe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
abf0: 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72  er of bytes to r
ac00: 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ead */.  int rc;
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac20: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
ac30: 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 52  rn code */..  nR
ac40: 65 61 64 20 3d 20 4d 49 4e 28 70 52 65 61 64 65  ead = MIN(pReade
ac50: 72 2d 3e 6e 4e 6f 64 65 20 2d 20 70 52 65 61 64  r->nNode - pRead
ac60: 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 2c 20 46  er->nPopulate, F
ac70: 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 53 49  TS3_NODE_CHUNKSI
ac80: 5a 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ZE);.  rc = sqli
ac90: 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 0a 20  te3_blob_read(. 
aca0: 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 42       pReader->pB
acb0: 6c 6f 62 2c 20 0a 20 20 20 20 20 20 26 70 52 65  lob, .      &pRe
acc0: 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61  ader->aNode[pRea
acd0: 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 5d 2c  der->nPopulate],
ace0: 0a 20 20 20 20 20 20 6e 52 65 61 64 2c 0a 20 20  .      nRead,.  
acf0: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f      pReader->nPo
ad00: 70 75 6c 61 74 65 0a 20 20 29 3b 0a 0a 20 20 69  pulate.  );..  i
ad10: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
ad20: 20 29 7b 0a 20 20 20 20 70 52 65 61 64 65 72 2d   ){.    pReader-
ad30: 3e 6e 50 6f 70 75 6c 61 74 65 20 2b 3d 20 6e 52  >nPopulate += nR
ad40: 65 61 64 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ead;.    memset(
ad50: 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b  &pReader->aNode[
ad60: 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61  pReader->nPopula
ad70: 74 65 5d 2c 20 30 2c 20 46 54 53 33 5f 4e 4f 44  te], 0, FTS3_NOD
ad80: 45 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 20 20  E_PADDING);.    
ad90: 69 66 28 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f  if( pReader->nPo
ada0: 70 75 6c 61 74 65 3d 3d 70 52 65 61 64 65 72 2d  pulate==pReader-
adb0: 3e 6e 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  >nNode ){.      
adc0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f  sqlite3_blob_clo
add0: 73 65 28 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f  se(pReader->pBlo
ade0: 62 29 3b 0a 20 20 20 20 20 20 70 52 65 61 64 65  b);.      pReade
adf0: 72 2d 3e 70 42 6c 6f 62 20 3d 20 30 3b 0a 20 20  r->pBlob = 0;.  
ae00: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f      pReader->nPo
ae10: 70 75 6c 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  pulate = 0;.    
ae20: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
ae30: 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
ae40: 20 66 74 73 33 53 65 67 52 65 61 64 65 72 52 65   fts3SegReaderRe
ae50: 71 75 69 72 65 28 46 74 73 33 53 65 67 52 65 61  quire(Fts3SegRea
ae60: 64 65 72 20 2a 70 52 65 61 64 65 72 2c 20 63 68  der *pReader, ch
ae70: 61 72 20 2a 70 46 72 6f 6d 2c 20 69 6e 74 20 6e  ar *pFrom, int n
ae80: 42 79 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Byte){.  int rc 
ae90: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
aea0: 73 73 65 72 74 28 20 21 70 52 65 61 64 65 72 2d  ssert( !pReader-
aeb0: 3e 70 42 6c 6f 62 20 0a 20 20 20 20 20 20 20 7c  >pBlob .       |
aec0: 7c 20 28 70 46 72 6f 6d 3e 3d 70 52 65 61 64 65  | (pFrom>=pReade
aed0: 72 2d 3e 61 4e 6f 64 65 20 26 26 20 70 46 72 6f  r->aNode && pFro
aee0: 6d 3c 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64  m<&pReader->aNod
aef0: 65 5b 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65  e[pReader->nNode
af00: 5d 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28  ]).  );.  while(
af10: 20 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 20   pReader->pBlob 
af20: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
af30: 20 0a 20 20 20 20 20 26 26 20 20 28 70 46 72 6f   .     &&  (pFro
af40: 6d 20 2d 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f  m - pReader->aNo
af50: 64 65 20 2b 20 6e 42 79 74 65 29 3e 70 52 65 61  de + nByte)>pRea
af60: 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 0a 20  der->nPopulate. 
af70: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
af80: 33 53 65 67 52 65 61 64 65 72 49 6e 63 72 52 65  3SegReaderIncrRe
af90: 61 64 28 70 52 65 61 64 65 72 29 3b 0a 20 20 7d  ad(pReader);.  }
afa0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
afb0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 6e 20 46 74  ./*.** Set an Ft
afc0: 73 33 53 65 67 52 65 61 64 65 72 20 63 75 72 73  s3SegReader curs
afd0: 6f 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 45  or to point at E
afe0: 4f 46 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  OF..*/.static vo
aff0: 69 64 20 66 74 73 33 53 65 67 52 65 61 64 65 72  id fts3SegReader
b000: 53 65 74 45 6f 66 28 46 74 73 33 53 65 67 52 65  SetEof(Fts3SegRe
b010: 61 64 65 72 20 2a 70 53 65 67 29 7b 0a 20 20 69  ader *pSeg){.  i
b020: 66 28 20 21 66 74 73 33 53 65 67 52 65 61 64 65  f( !fts3SegReade
b030: 72 49 73 52 6f 6f 74 4f 6e 6c 79 28 70 53 65 67  rIsRootOnly(pSeg
b040: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
b050: 5f 66 72 65 65 28 70 53 65 67 2d 3e 61 4e 6f 64  _free(pSeg->aNod
b060: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
b070: 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 53 65 67 2d  blob_close(pSeg-
b080: 3e 70 42 6c 6f 62 29 3b 0a 20 20 20 20 70 53 65  >pBlob);.    pSe
b090: 67 2d 3e 70 42 6c 6f 62 20 3d 20 30 3b 0a 20 20  g->pBlob = 0;.  
b0a0: 7d 0a 20 20 70 53 65 67 2d 3e 61 4e 6f 64 65 20  }.  pSeg->aNode 
b0b0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  = 0;.}../*.** Mo
b0c0: 76 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ve the iterator 
b0d0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
b0e0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
b0f0: 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20 69 6e  the next term in
b100: 20 74 68 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 2e   the.** segment.
b110: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
b120: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
b130: 75 72 6e 65 64 2e 20 49 66 20 74 68 65 72 65 20  urned. If there 
b140: 69 73 20 6e 6f 20 6e 65 78 74 20 74 65 72 6d 2c  is no next term,
b150: 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  .** SQLITE_DONE.
b160: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53   Otherwise, an S
b170: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
b180: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b190: 66 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 78  fts3SegReaderNex
b1a0: 74 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  t(.  Fts3Table *
b1b0: 70 2c 20 0a 20 20 46 74 73 33 53 65 67 52 65 61  p, .  Fts3SegRea
b1c0: 64 65 72 20 2a 70 52 65 61 64 65 72 2c 0a 20 20  der *pReader,.  
b1d0: 69 6e 74 20 62 49 6e 63 72 0a 29 7b 0a 20 20 69  int bIncr.){.  i
b1e0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
b1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b200: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 6f 66  * Return code of
b210: 20 76 61 72 69 6f 75 73 20 73 75 62 2d 72 6f 75   various sub-rou
b220: 74 69 6e 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  tines */.  char 
b230: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
b240: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
b250: 72 73 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  rsor variable */
b260: 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20  .  int nPrefix; 
b270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b280: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b290: 62 79 74 65 73 20 69 6e 20 74 65 72 6d 20 70 72  bytes in term pr
b2a0: 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  efix */.  int nS
b2b0: 75 66 66 69 78 3b 20 20 20 20 20 20 20 20 20 20  uffix;          
b2c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b2d0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
b2e0: 74 65 72 6d 20 73 75 66 66 69 78 20 2a 2f 0a 0a  term suffix */..
b2f0: 20 20 69 66 28 20 21 70 52 65 61 64 65 72 2d 3e    if( !pReader->
b300: 61 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20  aDoclist ){.    
b310: 70 4e 65 78 74 20 3d 20 70 52 65 61 64 65 72 2d  pNext = pReader-
b320: 3e 61 4e 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b  >aNode;.  }else{
b330: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 26 70 52  .    pNext = &pR
b340: 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b  eader->aDoclist[
b350: 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73  pReader->nDoclis
b360: 74 5d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  t];.  }..  if( !
b370: 70 4e 65 78 74 20 7c 7c 20 70 4e 65 78 74 3e 3d  pNext || pNext>=
b380: 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b  &pReader->aNode[
b390: 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 5d 20  pReader->nNode] 
b3a0: 29 7b 0a 0a 20 20 20 20 69 66 28 20 66 74 73 33  ){..    if( fts3
b3b0: 53 65 67 52 65 61 64 65 72 49 73 50 65 6e 64 69  SegReaderIsPendi
b3c0: 6e 67 28 70 52 65 61 64 65 72 29 20 29 7b 0a 20  ng(pReader) ){. 
b3d0: 20 20 20 20 20 46 74 73 33 48 61 73 68 45 6c 65       Fts3HashEle
b3e0: 6d 20 2a 70 45 6c 65 6d 20 3d 20 2a 28 70 52 65  m *pElem = *(pRe
b3f0: 61 64 65 72 2d 3e 70 70 4e 65 78 74 45 6c 65 6d  ader->ppNextElem
b400: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b410: 5f 66 72 65 65 28 70 52 65 61 64 65 72 2d 3e 61  _free(pReader->a
b420: 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20 70 52 65  Node);.      pRe
b430: 61 64 65 72 2d 3e 61 4e 6f 64 65 20 3d 20 30 3b  ader->aNode = 0;
b440: 0a 20 20 20 20 20 20 69 66 28 20 70 45 6c 65 6d  .      if( pElem
b450: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
b460: 20 2a 61 43 6f 70 79 3b 0a 20 20 20 20 20 20 20   *aCopy;.       
b470: 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70 4c   PendingList *pL
b480: 69 73 74 20 3d 20 28 50 65 6e 64 69 6e 67 4c 69  ist = (PendingLi
b490: 73 74 20 2a 29 66 74 73 33 48 61 73 68 44 61 74  st *)fts3HashDat
b4a0: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20  a(pElem);.      
b4b0: 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 4c    int nCopy = pL
b4c0: 69 73 74 2d 3e 6e 44 61 74 61 2b 31 3b 0a 20 20  ist->nData+1;.  
b4d0: 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 7a        pReader->z
b4e0: 54 65 72 6d 20 3d 20 28 63 68 61 72 20 2a 29 66  Term = (char *)f
b4f0: 74 73 33 48 61 73 68 4b 65 79 28 70 45 6c 65 6d  ts3HashKey(pElem
b500: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64  );.        pRead
b510: 65 72 2d 3e 6e 54 65 72 6d 20 3d 20 66 74 73 33  er->nTerm = fts3
b520: 48 61 73 68 4b 65 79 73 69 7a 65 28 70 45 6c 65  HashKeysize(pEle
b530: 6d 29 3b 0a 20 20 20 20 20 20 20 20 61 43 6f 70  m);.        aCop
b540: 79 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  y = (char*)sqlit
b550: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 43 6f 70 79 29  e3_malloc(nCopy)
b560: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61  ;.        if( !a
b570: 43 6f 70 79 20 29 20 72 65 74 75 72 6e 20 53 51  Copy ) return SQ
b580: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
b590: 20 20 20 20 6d 65 6d 63 70 79 28 61 43 6f 70 79      memcpy(aCopy
b5a0: 2c 20 70 4c 69 73 74 2d 3e 61 44 61 74 61 2c 20  , pList->aData, 
b5b0: 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20  nCopy);.        
b5c0: 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 20 3d  pReader->nNode =
b5d0: 20 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69   pReader->nDocli
b5e0: 73 74 20 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  st = nCopy;.    
b5f0: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f      pReader->aNo
b600: 64 65 20 3d 20 70 52 65 61 64 65 72 2d 3e 61 44  de = pReader->aD
b610: 6f 63 6c 69 73 74 20 3d 20 61 43 6f 70 79 3b 0a  oclist = aCopy;.
b620: 20 20 20 20 20 20 20 20 70 52 65 61 64 65 72 2d          pReader-
b630: 3e 70 70 4e 65 78 74 45 6c 65 6d 2b 2b 3b 0a 20  >ppNextElem++;. 
b640: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b650: 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20 29 3b  Reader->aNode );
b660: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
b670: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b680: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 33  .    }..    fts3
b690: 53 65 67 52 65 61 64 65 72 53 65 74 45 6f 66 28  SegReaderSetEof(
b6a0: 70 52 65 61 64 65 72 29 3b 0a 0a 20 20 20 20 2f  pReader);..    /
b6b0: 2a 20 49 66 20 69 43 75 72 72 65 6e 74 42 6c 6f  * If iCurrentBlo
b6c0: 63 6b 3e 3d 69 4c 65 61 66 45 6e 64 42 6c 6f 63  ck>=iLeafEndBloc
b6d0: 6b 2c 20 74 68 69 73 20 69 73 20 61 6e 20 45 4f  k, this is an EO
b6e0: 46 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 41 6c 6c  F condition. All
b6f0: 20 6c 65 61 66 20 0a 20 20 20 20 2a 2a 20 62 6c   leaf .    ** bl
b700: 6f 63 6b 73 20 68 61 76 65 20 61 6c 72 65 61 64  ocks have alread
b710: 79 20 62 65 65 6e 20 74 72 61 76 65 72 73 65 64  y been traversed
b720: 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
b730: 28 20 70 52 65 61 64 65 72 2d 3e 69 43 75 72 72  ( pReader->iCurr
b740: 65 6e 74 42 6c 6f 63 6b 3c 3d 70 52 65 61 64 65  entBlock<=pReade
b750: 72 2d 3e 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b  r->iLeafEndBlock
b760: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 61   );.    if( pRea
b770: 64 65 72 2d 3e 69 43 75 72 72 65 6e 74 42 6c 6f  der->iCurrentBlo
b780: 63 6b 3e 3d 70 52 65 61 64 65 72 2d 3e 69 4c 65  ck>=pReader->iLe
b790: 61 66 45 6e 64 42 6c 6f 63 6b 20 29 7b 0a 20 20  afEndBlock ){.  
b7a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b7b0: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
b7c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
b7d0: 33 52 65 61 64 42 6c 6f 63 6b 28 0a 20 20 20 20  3ReadBlock(.    
b7e0: 20 20 20 20 70 2c 20 2b 2b 70 52 65 61 64 65 72      p, ++pReader
b7f0: 2d 3e 69 43 75 72 72 65 6e 74 42 6c 6f 63 6b 2c  ->iCurrentBlock,
b800: 20 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65   &pReader->aNode
b810: 2c 20 26 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64  , &pReader->nNod
b820: 65 2c 20 0a 20 20 20 20 20 20 20 20 28 62 49 6e  e, .        (bIn
b830: 63 72 20 3f 20 26 70 52 65 61 64 65 72 2d 3e 6e  cr ? &pReader->n
b840: 50 6f 70 75 6c 61 74 65 20 3a 20 30 29 0a 20 20  Populate : 0).  
b850: 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21    );.    if( rc!
b860: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
b870: 75 72 6e 20 72 63 3b 0a 20 20 20 20 61 73 73 65  urn rc;.    asse
b880: 72 74 28 20 70 52 65 61 64 65 72 2d 3e 70 42 6c  rt( pReader->pBl
b890: 6f 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ob==0 );.    if(
b8a0: 20 62 49 6e 63 72 20 26 26 20 70 52 65 61 64 65   bIncr && pReade
b8b0: 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 3c 70 52 65  r->nPopulate<pRe
b8c0: 61 64 65 72 2d 3e 6e 4e 6f 64 65 20 29 7b 0a 20  ader->nNode ){. 
b8d0: 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 42       pReader->pB
b8e0: 6c 6f 62 20 3d 20 70 2d 3e 70 53 65 67 6d 65 6e  lob = p->pSegmen
b8f0: 74 73 3b 0a 20 20 20 20 20 20 70 2d 3e 70 53 65  ts;.      p->pSe
b900: 67 6d 65 6e 74 73 20 3d 20 30 3b 0a 20 20 20 20  gments = 0;.    
b910: 7d 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 52  }.    pNext = pR
b920: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 3b 0a 20 20  eader->aNode;.  
b930: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21 66 74  }..  assert( !ft
b940: 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65 6e  s3SegReaderIsPen
b950: 64 69 6e 67 28 70 52 65 61 64 65 72 29 20 29 3b  ding(pReader) );
b960: 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53 65 67  ..  rc = fts3Seg
b970: 52 65 61 64 65 72 52 65 71 75 69 72 65 28 70 52  ReaderRequire(pR
b980: 65 61 64 65 72 2c 20 70 4e 65 78 74 2c 20 46 54  eader, pNext, FT
b990: 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 2a 32 29  S3_VARINT_MAX*2)
b9a0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
b9b0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
b9c0: 63 3b 0a 20 20 0a 20 20 2f 2a 20 42 65 63 61 75  c;.  .  /* Becau
b9d0: 73 65 20 6f 66 20 74 68 65 20 46 54 53 33 5f 4e  se of the FTS3_N
b9e0: 4f 44 45 5f 50 41 44 44 49 4e 47 20 62 79 74 65  ODE_PADDING byte
b9f0: 73 20 6f 66 20 70 61 64 64 69 6e 67 2c 20 74 68  s of padding, th
ba00: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 0a  e following is .
ba10: 20 20 2a 2a 20 73 61 66 65 20 28 6e 6f 20 72 69    ** safe (no ri
ba20: 73 6b 20 6f 66 20 6f 76 65 72 72 65 61 64 29 20  sk of overread) 
ba30: 65 76 65 6e 20 69 66 20 74 68 65 20 6e 6f 64 65  even if the node
ba40: 20 64 61 74 61 20 69 73 20 63 6f 72 72 75 70 74   data is corrupt
ba50: 65 64 2e 20 2a 2f 0a 20 20 70 4e 65 78 74 20 2b  ed. */.  pNext +
ba60: 3d 20 66 74 73 33 47 65 74 56 61 72 69 6e 74 33  = fts3GetVarint3
ba70: 32 28 70 4e 65 78 74 2c 20 26 6e 50 72 65 66 69  2(pNext, &nPrefi
ba80: 78 29 3b 0a 20 20 70 4e 65 78 74 20 2b 3d 20 66  x);.  pNext += f
ba90: 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 70  ts3GetVarint32(p
baa0: 4e 65 78 74 2c 20 26 6e 53 75 66 66 69 78 29 3b  Next, &nSuffix);
bab0: 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78 3c 30  .  if( nPrefix<0
bac0: 20 7c 7c 20 6e 53 75 66 66 69 78 3c 3d 30 20 0a   || nSuffix<=0 .
bad0: 20 20 20 7c 7c 20 26 70 4e 65 78 74 5b 6e 53 75     || &pNext[nSu
bae0: 66 66 69 78 5d 3e 26 70 52 65 61 64 65 72 2d 3e  ffix]>&pReader->
baf0: 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e  aNode[pReader->n
bb00: 4e 6f 64 65 5d 20 0a 20 20 29 7b 0a 20 20 20 20  Node] .  ){.    
bb10: 72 65 74 75 72 6e 20 46 54 53 5f 43 4f 52 52 55  return FTS_CORRU
bb20: 50 54 5f 56 54 41 42 3b 0a 20 20 7d 0a 0a 20 20  PT_VTAB;.  }..  
bb30: 69 66 28 20 6e 50 72 65 66 69 78 2b 6e 53 75 66  if( nPrefix+nSuf
bb40: 66 69 78 3e 70 52 65 61 64 65 72 2d 3e 6e 54 65  fix>pReader->nTe
bb50: 72 6d 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69  rmAlloc ){.    i
bb60: 6e 74 20 6e 4e 65 77 20 3d 20 28 6e 50 72 65 66  nt nNew = (nPref
bb70: 69 78 2b 6e 53 75 66 66 69 78 29 2a 32 3b 0a 20  ix+nSuffix)*2;. 
bb80: 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20     char *zNew = 
bb90: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
bba0: 70 52 65 61 64 65 72 2d 3e 7a 54 65 72 6d 2c 20  pReader->zTerm, 
bbb0: 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 21  nNew);.    if( !
bbc0: 7a 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 65  zNew ){.      re
bbd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
bbe0: 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65  M;.    }.    pRe
bbf0: 61 64 65 72 2d 3e 7a 54 65 72 6d 20 3d 20 7a 4e  ader->zTerm = zN
bc00: 65 77 3b 0a 20 20 20 20 70 52 65 61 64 65 72 2d  ew;.    pReader-
bc10: 3e 6e 54 65 72 6d 41 6c 6c 6f 63 20 3d 20 6e 4e  >nTermAlloc = nN
bc20: 65 77 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  ew;.  }..  rc = 
bc30: 66 74 73 33 53 65 67 52 65 61 64 65 72 52 65 71  fts3SegReaderReq
bc40: 75 69 72 65 28 70 52 65 61 64 65 72 2c 20 70 4e  uire(pReader, pN
bc50: 65 78 74 2c 20 6e 53 75 66 66 69 78 2b 46 54 53  ext, nSuffix+FTS
bc60: 33 5f 56 41 52 49 4e 54 5f 4d 41 58 29 3b 0a 20  3_VARINT_MAX);. 
bc70: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
bc80: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
bc90: 0a 20 20 6d 65 6d 63 70 79 28 26 70 52 65 61 64  .  memcpy(&pRead
bca0: 65 72 2d 3e 7a 54 65 72 6d 5b 6e 50 72 65 66 69  er->zTerm[nPrefi
bcb0: 78 5d 2c 20 70 4e 65 78 74 2c 20 6e 53 75 66 66  x], pNext, nSuff
bcc0: 69 78 29 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e  ix);.  pReader->
bcd0: 6e 54 65 72 6d 20 3d 20 6e 50 72 65 66 69 78 2b  nTerm = nPrefix+
bce0: 6e 53 75 66 66 69 78 3b 0a 20 20 70 4e 65 78 74  nSuffix;.  pNext
bcf0: 20 2b 3d 20 6e 53 75 66 66 69 78 3b 0a 20 20 70   += nSuffix;.  p
bd00: 4e 65 78 74 20 2b 3d 20 66 74 73 33 47 65 74 56  Next += fts3GetV
bd10: 61 72 69 6e 74 33 32 28 70 4e 65 78 74 2c 20 26  arint32(pNext, &
bd20: 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73  pReader->nDoclis
bd30: 74 29 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 61  t);.  pReader->a
bd40: 44 6f 63 6c 69 73 74 20 3d 20 70 4e 65 78 74 3b  Doclist = pNext;
bd50: 0a 20 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66  .  pReader->pOff
bd60: 73 65 74 4c 69 73 74 20 3d 20 30 3b 0a 0a 20 20  setList = 0;..  
bd70: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
bd80: 65 20 64 6f 63 6c 69 73 74 20 64 6f 65 73 20 6e  e doclist does n
bd90: 6f 74 20 61 70 70 65 61 72 20 74 6f 20 65 78 74  ot appear to ext
bda0: 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64  end past the end
bdb0: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 62 2d 74   of the.  ** b-t
bdc0: 72 65 65 20 6e 6f 64 65 2e 20 41 6e 64 20 74 68  ree node. And th
bdd0: 61 74 20 74 68 65 20 66 69 6e 61 6c 20 62 79 74  at the final byt
bde0: 65 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74  e of the doclist
bdf0: 20 69 73 20 30 78 30 30 2e 20 49 66 20 65 69 74   is 0x00. If eit
be00: 68 65 72 20 0a 20 20 2a 2a 20 6f 66 20 74 68 65  her .  ** of the
be10: 73 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73  se statements is
be20: 20 75 6e 74 72 75 65 2c 20 74 68 65 6e 20 74 68   untrue, then th
be30: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
be40: 20 69 73 20 63 6f 72 72 75 70 74 2e 0a 20 20 2a   is corrupt..  *
be50: 2f 0a 20 20 69 66 28 20 26 70 52 65 61 64 65 72  /.  if( &pReader
be60: 2d 3e 61 44 6f 63 6c 69 73 74 5b 70 52 65 61 64  ->aDoclist[pRead
be70: 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 5d 3e 26 70  er->nDoclist]>&p
be80: 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52  Reader->aNode[pR
be90: 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 5d 20 0a 20  eader->nNode] . 
bea0: 20 20 7c 7c 20 28 70 52 65 61 64 65 72 2d 3e 6e    || (pReader->n
beb0: 50 6f 70 75 6c 61 74 65 3d 3d 30 20 26 26 20 70  Populate==0 && p
bec0: 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74  Reader->aDoclist
bed0: 5b 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69  [pReader->nDocli
bee0: 73 74 2d 31 5d 29 0a 20 20 29 7b 0a 20 20 20 20  st-1]).  ){.    
bef0: 72 65 74 75 72 6e 20 46 54 53 5f 43 4f 52 52 55  return FTS_CORRU
bf00: 50 54 5f 56 54 41 42 3b 0a 20 20 7d 0a 20 20 72  PT_VTAB;.  }.  r
bf10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
bf20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
bf30: 65 20 53 65 67 52 65 61 64 65 72 20 74 6f 20 70  e SegReader to p
bf40: 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73  oint to the firs
bf50: 74 20 64 6f 63 69 64 20 69 6e 20 74 68 65 20 64  t docid in the d
bf60: 6f 63 6c 69 73 74 20 61 73 73 6f 63 69 61 74 65  oclist associate
bf70: 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 63 75  d.** with the cu
bf80: 72 72 65 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a 73  rrent term..*/.s
bf90: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65  tatic int fts3Se
bfa0: 67 52 65 61 64 65 72 46 69 72 73 74 44 6f 63 69  gReaderFirstDoci
bfb0: 64 28 46 74 73 33 54 61 62 6c 65 20 2a 70 54 61  d(Fts3Table *pTa
bfc0: 62 2c 20 46 74 73 33 53 65 67 52 65 61 64 65 72  b, Fts3SegReader
bfd0: 20 2a 70 52 65 61 64 65 72 29 7b 0a 20 20 69 6e   *pReader){.  in
bfe0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
bff0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 61  ;.  assert( pRea
c000: 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20 29 3b  der->aDoclist );
c010: 0a 20 20 61 73 73 65 72 74 28 20 21 70 52 65 61  .  assert( !pRea
c020: 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74  der->pOffsetList
c030: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e   );.  if( pTab->
c040: 62 44 65 73 63 49 64 78 20 26 26 20 66 74 73 33  bDescIdx && fts3
c050: 53 65 67 52 65 61 64 65 72 49 73 50 65 6e 64 69  SegReaderIsPendi
c060: 6e 67 28 70 52 65 61 64 65 72 29 20 29 7b 0a 20  ng(pReader) ){. 
c070: 20 20 20 75 38 20 62 45 6f 66 20 3d 20 30 3b 0a     u8 bEof = 0;.
c080: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 69 44 6f      pReader->iDo
c090: 63 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 52 65  cid = 0;.    pRe
c0a0: 61 64 65 72 2d 3e 6e 4f 66 66 73 65 74 4c 69 73  ader->nOffsetLis
c0b0: 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  t = 0;.    sqlit
c0c0: 65 33 46 74 73 33 44 6f 63 6c 69 73 74 50 72 65  e3Fts3DoclistPre
c0d0: 76 28 30 2c 0a 20 20 20 20 20 20 20 20 70 52 65  v(0,.        pRe
c0e0: 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 2c 20  ader->aDoclist, 
c0f0: 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73  pReader->nDoclis
c100: 74 2c 20 26 70 52 65 61 64 65 72 2d 3e 70 4f 66  t, &pReader->pOf
c110: 66 73 65 74 4c 69 73 74 2c 20 0a 20 20 20 20 20  fsetList, .     
c120: 20 20 20 26 70 52 65 61 64 65 72 2d 3e 69 44 6f     &pReader->iDo
c130: 63 69 64 2c 20 26 70 52 65 61 64 65 72 2d 3e 6e  cid, &pReader->n
c140: 4f 66 66 73 65 74 4c 69 73 74 2c 20 26 62 45 6f  OffsetList, &bEo
c150: 66 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65  f.    );.  }else
c160: 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53  {.    rc = fts3S
c170: 65 67 52 65 61 64 65 72 52 65 71 75 69 72 65 28  egReaderRequire(
c180: 70 52 65 61 64 65 72 2c 20 70 52 65 61 64 65 72  pReader, pReader
c190: 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 46 54 53 33  ->aDoclist, FTS3
c1a0: 5f 56 41 52 49 4e 54 5f 4d 41 58 29 3b 0a 20 20  _VARINT_MAX);.  
c1b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c1c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
c1d0: 20 6e 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33   n = sqlite3Fts3
c1e0: 47 65 74 56 61 72 69 6e 74 28 70 52 65 61 64 65  GetVarint(pReade
c1f0: 72 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 26 70 52  r->aDoclist, &pR
c200: 65 61 64 65 72 2d 3e 69 44 6f 63 69 64 29 3b 0a  eader->iDocid);.
c210: 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70        pReader->p
c220: 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 26 70 52  OffsetList = &pR
c230: 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b  eader->aDoclist[
c240: 6e 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  n];.    }.  }.  
c250: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
c260: 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
c270: 53 65 67 52 65 61 64 65 72 20 74 6f 20 70 6f 69  SegReader to poi
c280: 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64  nt to the next d
c290: 6f 63 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c  ocid in the docl
c2a0: 69 73 74 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  ist.** associate
c2b0: 64 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65  d with the curre
c2c0: 6e 74 20 74 65 72 6d 2e 0a 2a 2a 20 0a 2a 2a 20  nt term..** .** 
c2d0: 49 66 20 61 72 67 75 6d 65 6e 74 73 20 70 70 4f  If arguments ppO
c2e0: 66 66 73 65 74 4c 69 73 74 20 61 6e 64 20 70 6e  ffsetList and pn
c2f0: 4f 66 66 73 65 74 4c 69 73 74 20 61 72 65 20 6e  OffsetList are n
c300: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 0a 2a  ot NULL, then .*
c310: 2a 20 2a 70 70 4f 66 66 73 65 74 4c 69 73 74 20  * *ppOffsetList 
c320: 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
c330: 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c  to the first col
c340: 75 6d 6e 2d 6f 66 66 73 65 74 20 6c 69 73 74 0a  umn-offset list.
c350: 2a 2a 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73  ** in the doclis
c360: 74 20 65 6e 74 72 79 20 28 69 2e 65 2e 20 69 6d  t entry (i.e. im
c370: 6d 65 64 69 61 74 65 6c 79 20 70 61 73 74 20 74  mediately past t
c380: 68 65 20 64 6f 63 69 64 20 76 61 72 69 6e 74 29  he docid varint)
c390: 2e 0a 2a 2a 20 2a 70 6e 4f 66 66 73 65 74 4c 69  ..** *pnOffsetLi
c3a0: 73 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  st is set to the
c3b0: 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73   length of the s
c3c0: 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 2d 6f 66 66  et of column-off
c3d0: 73 65 74 0a 2a 2a 20 6c 69 73 74 73 2c 20 6e 6f  set.** lists, no
c3e0: 74 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  t including the 
c3f0: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62  nul-terminator b
c400: 79 74 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  yte. For example
c410: 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  :.*/.static int 
c420: 66 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 78  fts3SegReaderNex
c430: 74 44 6f 63 69 64 28 0a 20 20 46 74 73 33 54 61  tDocid(.  Fts3Ta
c440: 62 6c 65 20 2a 70 54 61 62 2c 0a 20 20 46 74 73  ble *pTab,.  Fts
c450: 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 65 61  3SegReader *pRea
c460: 64 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  der,         /* 
c470: 52 65 61 64 65 72 20 74 6f 20 61 64 76 61 6e 63  Reader to advanc
c480: 65 20 74 6f 20 6e 65 78 74 20 64 6f 63 69 64 20  e to next docid 
c490: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 4f 66  */.  char **ppOf
c4a0: 66 73 65 74 4c 69 73 74 2c 20 20 20 20 20 20 20  fsetList,       
c4b0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69       /* OUT: Poi
c4c0: 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20  nter to current 
c4d0: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 2a 2f  position-list */
c4e0: 0a 20 20 69 6e 74 20 2a 70 6e 4f 66 66 73 65 74  .  int *pnOffset
c4f0: 4c 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20  List            
c500: 20 20 20 2f 2a 20 4f 55 54 3a 20 4c 65 6e 67 74     /* OUT: Lengt
c510: 68 20 6f 66 20 2a 70 70 4f 66 66 73 65 74 4c 69  h of *ppOffsetLi
c520: 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29  st in bytes */.)
c530: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
c540: 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a  ITE_OK;.  char *
c550: 70 20 3d 20 70 52 65 61 64 65 72 2d 3e 70 4f 66  p = pReader->pOf
c560: 66 73 65 74 4c 69 73 74 3b 0a 20 20 63 68 61 72  fsetList;.  char
c570: 20 63 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72   c = 0;..  asser
c580: 74 28 20 70 20 29 3b 0a 0a 20 20 69 66 28 20 70  t( p );..  if( p
c590: 54 61 62 2d 3e 62 44 65 73 63 49 64 78 20 26 26  Tab->bDescIdx &&
c5a0: 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49 73   fts3SegReaderIs
c5b0: 50 65 6e 64 69 6e 67 28 70 52 65 61 64 65 72 29  Pending(pReader)
c5c0: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 70 65 6e   ){.    /* A pen
c5d0: 64 69 6e 67 2d 74 65 72 6d 73 20 73 65 67 2d 72  ding-terms seg-r
c5e0: 65 61 64 65 72 20 66 6f 72 20 61 6e 20 46 54 53  eader for an FTS
c5f0: 34 20 74 61 62 6c 65 20 74 68 61 74 20 75 73 65  4 table that use
c600: 73 20 6f 72 64 65 72 3d 64 65 73 63 2e 0a 20 20  s order=desc..  
c610: 20 20 2a 2a 20 50 65 6e 64 69 6e 67 2d 74 65 72    ** Pending-ter
c620: 6d 73 20 64 6f 63 6c 69 73 74 73 20 61 72 65 20  ms doclists are 
c630: 61 6c 77 61 79 73 20 62 75 69 6c 74 20 75 70 20  always built up 
c640: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
c650: 65 72 2c 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65  er, so.    ** we
c660: 20 68 61 76 65 20 74 6f 20 69 74 65 72 61 74 65   have to iterate
c670: 20 74 68 72 6f 75 67 68 20 74 68 65 6d 20 62 61   through them ba
c680: 63 6b 77 61 72 64 73 20 68 65 72 65 2e 20 2a 2f  ckwards here. */
c690: 0a 20 20 20 20 75 38 20 62 45 6f 66 20 3d 20 30  .    u8 bEof = 0
c6a0: 3b 0a 20 20 20 20 69 66 28 20 70 70 4f 66 66 73  ;.    if( ppOffs
c6b0: 65 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  etList ){.      
c6c0: 2a 70 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20  *ppOffsetList = 
c6d0: 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74  pReader->pOffset
c6e0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 2a 70 6e 4f  List;.      *pnO
c6f0: 66 66 73 65 74 4c 69 73 74 20 3d 20 70 52 65 61  ffsetList = pRea
c700: 64 65 72 2d 3e 6e 4f 66 66 73 65 74 4c 69 73 74  der->nOffsetList
c710: 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 1;.    }.    
c720: 73 71 6c 69 74 65 33 46 74 73 33 44 6f 63 6c 69  sqlite3Fts3Docli
c730: 73 74 50 72 65 76 28 30 2c 0a 20 20 20 20 20 20  stPrev(0,.      
c740: 20 20 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c    pReader->aDocl
c750: 69 73 74 2c 20 70 52 65 61 64 65 72 2d 3e 6e 44  ist, pReader->nD
c760: 6f 63 6c 69 73 74 2c 20 26 70 2c 20 26 70 52 65  oclist, &p, &pRe
c770: 61 64 65 72 2d 3e 69 44 6f 63 69 64 2c 0a 20 20  ader->iDocid,.  
c780: 20 20 20 20 20 20 26 70 52 65 61 64 65 72 2d 3e        &pReader->
c790: 6e 4f 66 66 73 65 74 4c 69 73 74 2c 20 26 62 45  nOffsetList, &bE
c7a0: 6f 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  of.    );.    if
c7b0: 28 20 62 45 6f 66 20 29 7b 0a 20 20 20 20 20 20  ( bEof ){.      
c7c0: 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74  pReader->pOffset
c7d0: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  List = 0;.    }e
c7e0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 65 61 64  lse{.      pRead
c7f0: 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20  er->pOffsetList 
c800: 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = p;.    }.  }el
c810: 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 45  se{.    char *pE
c820: 6e 64 20 3d 20 26 70 52 65 61 64 65 72 2d 3e 61  nd = &pReader->a
c830: 44 6f 63 6c 69 73 74 5b 70 52 65 61 64 65 72 2d  Doclist[pReader-
c840: 3e 6e 44 6f 63 6c 69 73 74 5d 3b 0a 0a 20 20 20  >nDoclist];..   
c850: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 70 20 63 75   /* Pointer p cu
c860: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 61  rrently points a
c870: 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  t the first byte
c880: 20 6f 66 20 61 6e 20 6f 66 66 73 65 74 20 6c 69   of an offset li
c890: 73 74 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 66  st. The.    ** f
c8a0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 61  ollowing block a
c8b0: 64 76 61 6e 63 65 73 20 69 74 20 74 6f 20 70 6f  dvances it to po
c8c0: 69 6e 74 20 6f 6e 65 20 62 79 74 65 20 70 61 73  int one byte pas
c8d0: 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20  t the end of.   
c8e0: 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 6f 66 66   ** the same off
c8f0: 73 65 74 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20  set list. */.   
c900: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 0a   while( 1 ){.  .
c910: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c        /* The fol
c920: 6c 6f 77 69 6e 67 20 6c 69 6e 65 20 6f 66 20 63  lowing line of c
c930: 6f 64 65 20 28 61 6e 64 20 74 68 65 20 22 70 2b  ode (and the "p+
c940: 2b 22 20 62 65 6c 6f 77 20 74 68 65 20 77 68 69  +" below the whi
c950: 6c 65 28 29 20 6c 6f 6f 70 29 20 69 73 0a 20 20  le() loop) is.  
c960: 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20      ** normally 
c970: 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75  all that is requ
c980: 69 72 65 64 20 74 6f 20 6d 6f 76 65 20 70 6f 69  ired to move poi
c990: 6e 74 65 72 20 70 20 74 6f 20 74 68 65 20 64 65  nter p to the de
c9a0: 73 69 72 65 64 20 0a 20 20 20 20 20 20 2a 2a 20  sired .      ** 
c9b0: 70 6f 73 69 74 69 6f 6e 2e 20 54 68 65 20 65 78  position. The ex
c9c0: 63 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68  ception is if th
c9d0: 69 73 20 6e 6f 64 65 20 69 73 20 62 65 69 6e 67  is node is being
c9e0: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 64 69 73   loaded from dis
c9f0: 6b 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65  k.      ** incre
ca00: 6d 65 6e 74 61 6c 6c 79 20 61 6e 64 20 70 6f 69  mentally and poi
ca10: 6e 74 65 72 20 22 70 22 20 6e 6f 77 20 70 6f 69  nter "p" now poi
ca20: 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
ca30: 20 62 79 74 65 20 70 61 73 74 0a 20 20 20 20 20   byte past.     
ca40: 20 2a 2a 20 74 68 65 20 70 6f 70 75 6c 61 74 65   ** the populate
ca50: 64 20 70 61 72 74 20 6f 66 20 70 52 65 61 64 65  d part of pReade
ca60: 72 2d 3e 61 4e 6f 64 65 5b 5d 2e 0a 20 20 20 20  r->aNode[]..    
ca70: 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65    */.      while
ca80: 28 20 2a 70 20 7c 20 63 20 29 20 63 20 3d 20 2a  ( *p | c ) c = *
ca90: 70 2b 2b 20 26 20 30 78 38 30 3b 0a 20 20 20 20  p++ & 0x80;.    
caa0: 20 20 61 73 73 65 72 74 28 20 2a 70 3d 3d 30 20    assert( *p==0 
cab0: 29 3b 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20  );.  .      if( 
cac0: 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 3d 3d  pReader->pBlob==
cad0: 30 20 7c 7c 20 70 3c 26 70 52 65 61 64 65 72 2d  0 || p<&pReader-
cae0: 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e  >aNode[pReader->
caf0: 6e 50 6f 70 75 6c 61 74 65 5d 20 29 20 62 72 65  nPopulate] ) bre
cb00: 61 6b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  ak;.      rc = f
cb10: 74 73 33 53 65 67 52 65 61 64 65 72 49 6e 63 72  ts3SegReaderIncr
cb20: 52 65 61 64 28 70 52 65 61 64 65 72 29 3b 0a 20  Read(pReader);. 
cb30: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
cb40: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
cb50: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2b  rc;.    }.    p+
cb60: 2b 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  +;.  .    /* If 
cb70: 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61  required, popula
cb80: 74 65 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  te the output va
cb90: 72 69 61 62 6c 65 73 20 77 69 74 68 20 61 20 70  riables with a p
cba0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 64 20 74 68  ointer to and th
cbb0: 65 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66  e.    ** size of
cbc0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 66   the previous of
cbd0: 66 73 65 74 2d 6c 69 73 74 2e 0a 20 20 20 20 2a  fset-list..    *
cbe0: 2f 0a 20 20 20 20 69 66 28 20 70 70 4f 66 66 73  /.    if( ppOffs
cbf0: 65 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  etList ){.      
cc00: 2a 70 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20  *ppOffsetList = 
cc10: 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74  pReader->pOffset
cc20: 4c 69 73 74 3b 0a 20 20 20 20 20 20 2a 70 6e 4f  List;.      *pnO
cc30: 66 66 73 65 74 4c 69 73 74 20 3d 20 28 69 6e 74  ffsetList = (int
cc40: 29 28 70 20 2d 20 70 52 65 61 64 65 72 2d 3e 70  )(p - pReader->p
cc50: 4f 66 66 73 65 74 4c 69 73 74 20 2d 20 31 29 3b  OffsetList - 1);
cc60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c  .    }..    /* L
cc70: 69 73 74 20 6d 61 79 20 68 61 76 65 20 62 65 65  ist may have bee
cc80: 6e 20 65 64 69 74 65 64 20 69 6e 20 70 6c 61 63  n edited in plac
cc90: 65 20 62 79 20 66 74 73 33 45 76 61 6c 4e 65 61  e by fts3EvalNea
cca0: 72 54 72 69 6d 28 29 20 2a 2f 0a 20 20 20 20 77  rTrim() */.    w
ccb0: 68 69 6c 65 28 20 70 3c 70 45 6e 64 20 26 26 20  hile( p<pEnd && 
ccc0: 2a 70 3d 3d 30 20 29 20 70 2b 2b 3b 0a 20 20 0a  *p==0 ) p++;.  .
ccd0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
cce0: 61 72 65 20 6e 6f 20 6d 6f 72 65 20 65 6e 74 72  are no more entr
ccf0: 69 65 73 20 69 6e 20 74 68 65 20 64 6f 63 6c 69  ies in the docli
cd00: 73 74 2c 20 73 65 74 20 70 4f 66 66 73 65 74 4c  st, set pOffsetL
cd10: 69 73 74 20 74 6f 0a 20 20 20 20 2a 2a 20 4e 55  ist to.    ** NU
cd20: 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73  LL. Otherwise, s
cd30: 65 74 20 46 74 73 33 53 65 67 52 65 61 64 65 72  et Fts3SegReader
cd40: 2e 69 44 6f 63 69 64 20 74 6f 20 74 68 65 20 6e  .iDocid to the n
cd50: 65 78 74 20 64 6f 63 69 64 20 61 6e 64 0a 20 20  ext docid and.  
cd60: 20 20 2a 2a 20 46 74 73 33 53 65 67 52 65 61 64    ** Fts3SegRead
cd70: 65 72 2e 70 4f 66 66 73 65 74 4c 69 73 74 20 74  er.pOffsetList t
cd80: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
cd90: 65 78 74 20 6f 66 66 73 65 74 20 6c 69 73 74 20  ext offset list 
cda0: 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 72 65  before.    ** re
cdb0: 74 75 72 6e 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a  turning..    */.
cdc0: 20 20 20 20 69 66 28 20 70 3e 3d 70 45 6e 64 20      if( p>=pEnd 
cdd0: 29 7b 0a 20 20 20 20 20 20 70 52 65 61 64 65 72  ){.      pReader
cde0: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20  ->pOffsetList = 
cdf0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
ce00: 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67      rc = fts3Seg
ce10: 52 65 61 64 65 72 52 65 71 75 69 72 65 28 70 52  ReaderRequire(pR
ce20: 65 61 64 65 72 2c 20 70 2c 20 46 54 53 33 5f 56  eader, p, FTS3_V
ce30: 41 52 49 4e 54 5f 4d 41 58 29 3b 0a 20 20 20 20  ARINT_MAX);.    
ce40: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
ce50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
ce60: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 65  qlite3_int64 iDe
ce70: 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 70 52 65  lta;.        pRe
ce80: 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73  ader->pOffsetLis
ce90: 74 20 3d 20 70 20 2b 20 73 71 6c 69 74 65 33 46  t = p + sqlite3F
cea0: 74 73 33 47 65 74 56 61 72 69 6e 74 28 70 2c 20  ts3GetVarint(p, 
ceb0: 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20  &iDelta);.      
cec0: 20 20 69 66 28 20 70 54 61 62 2d 3e 62 44 65 73    if( pTab->bDes
ced0: 63 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20  cIdx ){.        
cee0: 20 20 70 52 65 61 64 65 72 2d 3e 69 44 6f 63 69    pReader->iDoci
cef0: 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20  d -= iDelta;.   
cf00: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
cf10: 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 69        pReader->i
cf20: 44 6f 63 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b  Docid += iDelta;
cf30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
cf40: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
cf50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
cf60: 3b 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65  ;.}...int sqlite
cf70: 33 46 74 73 33 4d 73 72 4f 76 66 6c 28 0a 20 20  3Fts3MsrOvfl(.  
cf80: 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72  Fts3Cursor *pCsr
cf90: 2c 20 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65  , .  Fts3MultiSe
cfa0: 67 52 65 61 64 65 72 20 2a 70 4d 73 72 2c 0a 20  gReader *pMsr,. 
cfb0: 20 69 6e 74 20 2a 70 6e 4f 76 66 6c 0a 29 7b 0a   int *pnOvfl.){.
cfc0: 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20 3d    Fts3Table *p =
cfd0: 20 28 46 74 73 33 54 61 62 6c 65 2a 29 70 43 73   (Fts3Table*)pCs
cfe0: 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a 20  r->base.pVtab;. 
cff0: 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 30 3b 0a   int nOvfl = 0;.
d000: 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20    int ii;.  int 
d010: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
d020: 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 2d 3e    int pgsz = p->
d030: 6e 50 67 73 7a 3b 0a 0a 20 20 61 73 73 65 72 74  nPgsz;..  assert
d040: 28 20 70 2d 3e 62 46 74 73 34 20 29 3b 0a 20 20  ( p->bFts4 );.  
d050: 61 73 73 65 72 74 28 20 70 67 73 7a 3e 30 20 29  assert( pgsz>0 )
d060: 3b 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 72  ;..  for(ii=0; r
d070: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
d080: 69 69 3c 70 4d 73 72 2d 3e 6e 53 65 67 6d 65 6e  ii<pMsr->nSegmen
d090: 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 46 74  t; ii++){.    Ft
d0a0: 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 65  s3SegReader *pRe
d0b0: 61 64 65 72 20 3d 20 70 4d 73 72 2d 3e 61 70 53  ader = pMsr->apS
d0c0: 65 67 6d 65 6e 74 5b 69 69 5d 3b 0a 20 20 20 20  egment[ii];.    
d0d0: 69 66 28 20 21 66 74 73 33 53 65 67 52 65 61 64  if( !fts3SegRead
d0e0: 65 72 49 73 50 65 6e 64 69 6e 67 28 70 52 65 61  erIsPending(pRea
d0f0: 64 65 72 29 20 0a 20 20 20 20 20 26 26 20 21 66  der) .     && !f
d100: 74 73 33 53 65 67 52 65 61 64 65 72 49 73 52 6f  ts3SegReaderIsRo
d110: 6f 74 4f 6e 6c 79 28 70 52 65 61 64 65 72 29 20  otOnly(pReader) 
d120: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
d130: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6a 6a 3b 0a  lite3_int64 jj;.
d140: 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 70 52 65        for(jj=pRe
d150: 61 64 65 72 2d 3e 69 53 74 61 72 74 42 6c 6f 63  ader->iStartBloc
d160: 6b 3b 20 6a 6a 3c 3d 70 52 65 61 64 65 72 2d 3e  k; jj<=pReader->
d170: 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 3b 20 6a  iLeafEndBlock; j
d180: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  j++){.        in
d190: 74 20 6e 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20  t nBlob;.       
d1a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
d1b0: 33 52 65 61 64 42 6c 6f 63 6b 28 70 2c 20 6a 6a  3ReadBlock(p, jj
d1c0: 2c 20 30 2c 20 26 6e 42 6c 6f 62 2c 20 30 29 3b  , 0, &nBlob, 0);
d1d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
d1e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65  =SQLITE_OK ) bre
d1f0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ak;.        if( 
d200: 28 6e 42 6c 6f 62 2b 33 35 29 3e 70 67 73 7a 20  (nBlob+35)>pgsz 
d210: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 76  ){.          nOv
d220: 66 6c 20 2b 3d 20 28 6e 42 6c 6f 62 20 2b 20 33  fl += (nBlob + 3
d230: 34 29 2f 70 67 73 7a 3b 0a 20 20 20 20 20 20 20  4)/pgsz;.       
d240: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
d250: 0a 20 20 7d 0a 20 20 2a 70 6e 4f 76 66 6c 20 3d  .  }.  *pnOvfl =
d260: 20 6e 4f 76 66 6c 3b 0a 20 20 72 65 74 75 72 6e   nOvfl;.  return
d270: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72   rc;.}../*.** Fr
d280: 65 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 69 6f  ee all allocatio
d290: 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ns associated wi
d2a0: 74 68 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  th the iterator 
d2b0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 0a 2a  passed as the .*
d2c0: 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  * second argumen
d2d0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
d2e0: 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 46  e3Fts3SegReaderF
d2f0: 72 65 65 28 46 74 73 33 53 65 67 52 65 61 64 65  ree(Fts3SegReade
d300: 72 20 2a 70 52 65 61 64 65 72 29 7b 0a 20 20 69  r *pReader){.  i
d310: 66 28 20 70 52 65 61 64 65 72 20 29 7b 0a 20 20  f( pReader ){.  
d320: 20 20 69 66 28 20 21 66 74 73 33 53 65 67 52 65    if( !fts3SegRe
d330: 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28 70 52  aderIsPending(pR
d340: 65 61 64 65 72 29 20 29 7b 0a 20 20 20 20 20 20  eader) ){.      
d350: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65  sqlite3_free(pRe
d360: 61 64 65 72 2d 3e 7a 54 65 72 6d 29 3b 0a 20 20  ader->zTerm);.  
d370: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 66 74 73    }.    if( !fts
d380: 33 53 65 67 52 65 61 64 65 72 49 73 52 6f 6f 74  3SegReaderIsRoot
d390: 4f 6e 6c 79 28 70 52 65 61 64 65 72 29 20 29 7b  Only(pReader) ){
d3a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
d3b0: 72 65 65 28 70 52 65 61 64 65 72 2d 3e 61 4e 6f  ree(pReader->aNo
d3c0: 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  de);.    }.    s
d3d0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73  qlite3_blob_clos
d3e0: 65 28 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62  e(pReader->pBlob
d3f0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
d400: 5f 66 72 65 65 28 70 52 65 61 64 65 72 29 3b 0a  _free(pReader);.
d410: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
d420: 65 20 61 20 6e 65 77 20 53 65 67 52 65 61 64 65  e a new SegReade
d430: 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74  r object..*/.int
d440: 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
d450: 65 61 64 65 72 4e 65 77 28 0a 20 20 69 6e 74 20  eaderNew(.  int 
d460: 69 41 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  iAge,           
d470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
d480: 65 67 6d 65 6e 74 20 22 61 67 65 22 2e 20 2a 2f  egment "age". */
d490: 0a 20 20 69 6e 74 20 62 4c 6f 6f 6b 75 70 2c 20  .  int bLookup, 
d4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4b0: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
d4c0: 20 6c 6f 6f 6b 75 70 20 6f 6e 6c 79 20 2a 2f 0a   lookup only */.
d4d0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
d4e0: 69 53 74 61 72 74 4c 65 61 66 2c 20 20 20 20 20  iStartLeaf,     
d4f0: 20 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20    /* First leaf 
d500: 74 6f 20 74 72 61 76 65 72 73 65 20 2a 2f 0a 20  to traverse */. 
d510: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
d520: 45 6e 64 4c 65 61 66 2c 20 20 20 20 20 20 20 20  EndLeaf,        
d530: 20 2f 2a 20 46 69 6e 61 6c 20 6c 65 61 66 20 74   /* Final leaf t
d540: 6f 20 74 72 61 76 65 72 73 65 20 2a 2f 0a 20 20  o traverse */.  
d550: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45  sqlite3_int64 iE
d560: 6e 64 42 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ndBlock,        
d570: 2f 2a 20 46 69 6e 61 6c 20 62 6c 6f 63 6b 20 6f  /* Final block o
d580: 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 63  f segment */.  c
d590: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 6f 6f 74  onst char *zRoot
d5a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
d5b0: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
d5c0: 69 6e 67 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f  ing root node */
d5d0: 0a 20 20 69 6e 74 20 6e 52 6f 6f 74 2c 20 20 20  .  int nRoot,   
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5f0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75     /* Size of bu
d600: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
d610: 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 46  root node */.  F
d620: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a 70  ts3SegReader **p
d630: 70 52 65 61 64 65 72 20 20 20 20 20 20 20 20 2f  pReader        /
d640: 2a 20 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 64  * OUT: Allocated
d650: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
d660: 2f 0a 29 7b 0a 20 20 46 74 73 33 53 65 67 52 65  /.){.  Fts3SegRe
d670: 61 64 65 72 20 2a 70 52 65 61 64 65 72 3b 20 20  ader *pReader;  
d680: 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20         /* Newly 
d690: 61 6c 6c 6f 63 61 74 65 64 20 53 65 67 52 65 61  allocated SegRea
d6a0: 64 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  der object */.  
d6b0: 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 20  int nExtra = 0; 
d6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6d0: 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f  /* Bytes to allo
d6e0: 63 61 74 65 20 73 65 67 6d 65 6e 74 20 72 6f 6f  cate segment roo
d6f0: 74 20 6e 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  t node */..  ass
d700: 65 72 74 28 20 69 53 74 61 72 74 4c 65 61 66 3c  ert( iStartLeaf<
d710: 3d 69 45 6e 64 4c 65 61 66 20 29 3b 0a 20 20 69  =iEndLeaf );.  i
d720: 66 28 20 69 53 74 61 72 74 4c 65 61 66 3d 3d 30  f( iStartLeaf==0
d730: 20 29 7b 0a 20 20 20 20 6e 45 78 74 72 61 20 3d   ){.    nExtra =
d740: 20 6e 52 6f 6f 74 20 2b 20 46 54 53 33 5f 4e 4f   nRoot + FTS3_NO
d750: 44 45 5f 50 41 44 44 49 4e 47 3b 0a 20 20 7d 0a  DE_PADDING;.  }.
d760: 0a 20 20 70 52 65 61 64 65 72 20 3d 20 28 46 74  .  pReader = (Ft
d770: 73 33 53 65 67 52 65 61 64 65 72 20 2a 29 73 71  s3SegReader *)sq
d780: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
d790: 65 6f 66 28 46 74 73 33 53 65 67 52 65 61 64 65  eof(Fts3SegReade
d7a0: 72 29 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20  r) + nExtra);.  
d7b0: 69 66 28 20 21 70 52 65 61 64 65 72 20 29 7b 0a  if( !pReader ){.
d7c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d7d0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d  E_NOMEM;.  }.  m
d7e0: 65 6d 73 65 74 28 70 52 65 61 64 65 72 2c 20 30  emset(pReader, 0
d7f0: 2c 20 73 69 7a 65 6f 66 28 46 74 73 33 53 65 67  , sizeof(Fts3Seg
d800: 52 65 61 64 65 72 29 29 3b 0a 20 20 70 52 65 61  Reader));.  pRea
d810: 64 65 72 2d 3e 69 49 64 78 20 3d 20 69 41 67 65  der->iIdx = iAge
d820: 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 62 4c 6f  ;.  pReader->bLo
d830: 6f 6b 75 70 20 3d 20 62 4c 6f 6f 6b 75 70 21 3d  okup = bLookup!=
d840: 30 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 69 53  0;.  pReader->iS
d850: 74 61 72 74 42 6c 6f 63 6b 20 3d 20 69 53 74 61  tartBlock = iSta
d860: 72 74 4c 65 61 66 3b 0a 20 20 70 52 65 61 64 65  rtLeaf;.  pReade
d870: 72 2d 3e 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b  r->iLeafEndBlock
d880: 20 3d 20 69 45 6e 64 4c 65 61 66 3b 0a 20 20 70   = iEndLeaf;.  p
d890: 52 65 61 64 65 72 2d 3e 69 45 6e 64 42 6c 6f 63  Reader->iEndBloc
d8a0: 6b 20 3d 20 69 45 6e 64 42 6c 6f 63 6b 3b 0a 0a  k = iEndBlock;..
d8b0: 20 20 69 66 28 20 6e 45 78 74 72 61 20 29 7b 0a    if( nExtra ){.
d8c0: 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72      /* The entir
d8d0: 65 20 73 65 67 6d 65 6e 74 20 69 73 20 73 74 6f  e segment is sto
d8e0: 72 65 64 20 69 6e 20 74 68 65 20 72 6f 6f 74 20  red in the root 
d8f0: 6e 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 70 52 65  node. */.    pRe
d900: 61 64 65 72 2d 3e 61 4e 6f 64 65 20 3d 20 28 63  ader->aNode = (c
d910: 68 61 72 20 2a 29 26 70 52 65 61 64 65 72 5b 31  har *)&pReader[1
d920: 5d 3b 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e  ];.    pReader->
d930: 72 6f 6f 74 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  rootOnly = 1;.  
d940: 20 20 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65    pReader->nNode
d950: 20 3d 20 6e 52 6f 6f 74 3b 0a 20 20 20 20 6d 65   = nRoot;.    me
d960: 6d 63 70 79 28 70 52 65 61 64 65 72 2d 3e 61 4e  mcpy(pReader->aN
d970: 6f 64 65 2c 20 7a 52 6f 6f 74 2c 20 6e 52 6f 6f  ode, zRoot, nRoo
d980: 74 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  t);.    memset(&
d990: 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 6e  pReader->aNode[n
d9a0: 52 6f 6f 74 5d 2c 20 30 2c 20 46 54 53 33 5f 4e  Root], 0, FTS3_N
d9b0: 4f 44 45 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20  ODE_PADDING);.  
d9c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 61 64  }else{.    pRead
d9d0: 65 72 2d 3e 69 43 75 72 72 65 6e 74 42 6c 6f 63  er->iCurrentBloc
d9e0: 6b 20 3d 20 69 53 74 61 72 74 4c 65 61 66 2d 31  k = iStartLeaf-1
d9f0: 3b 0a 20 20 7d 0a 20 20 2a 70 70 52 65 61 64 65  ;.  }.  *ppReade
da00: 72 20 3d 20 70 52 65 61 64 65 72 3b 0a 20 20 72  r = pReader;.  r
da10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
da20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
da30: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  s a comparison f
da40: 75 6e 63 74 69 6f 6e 20 75 73 65 64 20 61 73 20  unction used as 
da50: 61 20 71 73 6f 72 74 28 29 20 63 61 6c 6c 62 61  a qsort() callba
da60: 63 6b 20 77 68 65 6e 20 73 6f 72 74 69 6e 67 0a  ck when sorting.
da70: 2a 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70  ** an array of p
da80: 65 6e 64 69 6e 67 20 74 65 72 6d 73 20 62 79 20  ending terms by 
da90: 74 65 72 6d 2e 20 54 68 69 73 20 6f 63 63 75 72  term. This occur
daa0: 73 20 61 73 20 70 61 72 74 20 6f 66 20 66 6c 75  s as part of flu
dab0: 73 68 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e  shing.** the con
dac0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 65 6e  tents of the pen
dad0: 64 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20  ding-terms hash 
dae0: 74 61 62 6c 65 20 74 6f 20 74 68 65 20 64 61 74  table to the dat
daf0: 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
db00: 20 69 6e 74 20 53 51 4c 49 54 45 5f 43 44 45 43   int SQLITE_CDEC
db10: 4c 20 66 74 73 33 43 6f 6d 70 61 72 65 45 6c 65  L fts3CompareEle
db20: 6d 42 79 54 65 72 6d 28 0a 20 20 63 6f 6e 73 74  mByTerm(.  const
db30: 20 76 6f 69 64 20 2a 6c 68 73 2c 0a 20 20 63 6f   void *lhs,.  co
db40: 6e 73 74 20 76 6f 69 64 20 2a 72 68 73 0a 29 7b  nst void *rhs.){
db50: 0a 20 20 63 68 61 72 20 2a 7a 31 20 3d 20 66 74  .  char *z1 = ft
db60: 73 33 48 61 73 68 4b 65 79 28 2a 28 46 74 73 33  s3HashKey(*(Fts3
db70: 48 61 73 68 45 6c 65 6d 20 2a 2a 29 6c 68 73 29  HashElem **)lhs)
db80: 3b 0a 20 20 63 68 61 72 20 2a 7a 32 20 3d 20 66  ;.  char *z2 = f
db90: 74 73 33 48 61 73 68 4b 65 79 28 2a 28 46 74 73  ts3HashKey(*(Fts
dba0: 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29 72 68 73  3HashElem **)rhs
dbb0: 29 3b 0a 20 20 69 6e 74 20 6e 31 20 3d 20 66 74  );.  int n1 = ft
dbc0: 73 33 48 61 73 68 4b 65 79 73 69 7a 65 28 2a 28  s3HashKeysize(*(
dbd0: 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29  Fts3HashElem **)
dbe0: 6c 68 73 29 3b 0a 20 20 69 6e 74 20 6e 32 20 3d  lhs);.  int n2 =
dbf0: 20 66 74 73 33 48 61 73 68 4b 65 79 73 69 7a 65   fts3HashKeysize
dc00: 28 2a 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20  (*(Fts3HashElem 
dc10: 2a 2a 29 72 68 73 29 3b 0a 0a 20 20 69 6e 74 20  **)rhs);..  int 
dc20: 6e 20 3d 20 28 6e 31 3c 6e 32 20 3f 20 6e 31 20  n = (n1<n2 ? n1 
dc30: 3a 20 6e 32 29 3b 0a 20 20 69 6e 74 20 63 20 3d  : n2);.  int c =
dc40: 20 6d 65 6d 63 6d 70 28 7a 31 2c 20 7a 32 2c 20   memcmp(z1, z2, 
dc50: 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d 30 20 29  n);.  if( c==0 )
dc60: 7b 0a 20 20 20 20 63 20 3d 20 6e 31 20 2d 20 6e  {.    c = n1 - n
dc70: 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  2;.  }.  return 
dc80: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
dc90: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
dca0: 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e  d to allocate an
dcb0: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 74   Fts3SegReader t
dcc0: 68 61 74 20 69 74 65 72 61 74 65 73 20 74 68 72  hat iterates thr
dcd0: 6f 75 67 68 0a 2a 2a 20 61 20 73 75 62 73 65 74  ough.** a subset
dce0: 20 6f 66 20 74 68 65 20 74 65 72 6d 73 20 73 74   of the terms st
dcf0: 6f 72 65 64 20 69 6e 20 74 68 65 20 46 74 73 33  ored in the Fts3
dd00: 54 61 62 6c 65 2e 70 65 6e 64 69 6e 67 54 65 72  Table.pendingTer
dd10: 6d 73 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  ms array..**.** 
dd20: 49 66 20 74 68 65 20 69 73 50 72 65 66 69 78 49  If the isPrefixI
dd30: 74 65 72 20 70 61 72 61 6d 65 74 65 72 20 69 73  ter parameter is
dd40: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
dd50: 72 65 74 75 72 6e 65 64 20 53 65 67 52 65 61 64  returned SegRead
dd60: 65 72 20 69 74 65 72 61 74 65 73 0a 2a 2a 20 74  er iterates.** t
dd70: 68 72 6f 75 67 68 20 65 61 63 68 20 74 65 72 6d  hrough each term
dd80: 20 69 6e 20 74 68 65 20 70 65 6e 64 69 6e 67 2d   in the pending-
dd90: 74 65 72 6d 73 20 74 61 62 6c 65 2e 20 4f 72 2c  terms table. Or,
dda0: 20 69 66 20 69 73 50 72 65 66 69 78 49 74 65 72   if isPrefixIter
ddb0: 20 69 73 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c   is.** non-zero,
ddc0: 20 69 74 20 69 74 65 72 61 74 65 73 20 74 68 72   it iterates thr
ddd0: 6f 75 67 68 20 65 61 63 68 20 74 65 72 6d 20 61  ough each term a
dde0: 6e 64 20 69 74 73 20 70 72 65 66 69 78 65 73 2e  nd its prefixes.
ddf0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
de00: 0a 2a 2a 20 74 68 65 20 70 65 6e 64 69 6e 67 20  .** the pending 
de10: 74 65 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65  terms hash table
de20: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65   contains the te
de30: 72 6d 73 20 22 73 71 6c 69 74 65 22 2c 20 22 6d  rms "sqlite", "m
de40: 79 73 71 6c 22 20 61 6e 64 0a 2a 2a 20 22 66 69  ysql" and.** "fi
de50: 72 65 62 69 72 64 22 2c 20 74 68 65 6e 20 74 68  rebird", then th
de60: 65 20 69 74 65 72 61 74 6f 72 20 76 69 73 69 74  e iterator visit
de70: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
de80: 27 74 65 72 6d 73 27 20 28 69 6e 20 74 68 65 20  'terms' (in the 
de90: 6f 72 64 65 72 0a 2a 2a 20 73 68 6f 77 6e 29 3a  order.** shown):
dea0: 0a 2a 2a 0a 2a 2a 20 20 20 66 20 66 69 20 66 69  .**.**   f fi fi
deb0: 72 20 66 69 72 65 20 66 69 72 65 62 20 66 69 72  r fire fireb fir
dec0: 65 62 69 20 66 69 72 65 62 69 72 20 66 69 72 65  ebi firebir fire
ded0: 62 69 72 64 0a 2a 2a 20 20 20 6d 20 6d 79 20 6d  bird.**   m my m
dee0: 79 73 20 6d 79 73 71 20 6d 79 73 71 6c 0a 2a 2a  ys mysq mysql.**
def0: 20 20 20 73 20 73 71 20 73 71 6c 20 73 71 6c 69     s sq sql sqli
df00: 20 73 71 6c 69 74 20 73 71 6c 69 74 65 0a 2a 2a   sqlit sqlite.**
df10: 0a 2a 2a 20 57 68 65 72 65 61 73 20 69 66 20 69  .** Whereas if i
df20: 73 50 72 65 66 69 78 49 74 65 72 20 69 73 20 7a  sPrefixIter is z
df30: 65 72 6f 2c 20 74 68 65 20 74 65 72 6d 73 20 76  ero, the terms v
df40: 69 73 69 74 65 64 20 61 72 65 3a 0a 2a 2a 0a 2a  isited are:.**.*
df50: 2a 20 20 20 66 69 72 65 62 69 72 64 20 6d 79 73  *   firebird mys
df60: 71 6c 20 73 71 6c 69 74 65 0a 2a 2f 0a 69 6e 74  ql sqlite.*/.int
df70: 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
df80: 65 61 64 65 72 50 65 6e 64 69 6e 67 28 0a 20 20  eaderPending(.  
df90: 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfb0: 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  /* Virtual table
dfc0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
dfd0: 20 69 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20   iIndex,        
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dff0: 49 6e 64 65 78 20 66 6f 72 20 70 2d 3e 61 49 6e  Index for p->aIn
e000: 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dex */.  const c
e010: 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20  har *zTerm,     
e020: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d           /* Term
e030: 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 2a   to search for *
e040: 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20  /.  int nTerm,  
e050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e060: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
e070: 75 66 66 65 72 20 7a 54 65 72 6d 20 2a 2f 0a 20  uffer zTerm */. 
e080: 20 69 6e 74 20 62 50 72 65 66 69 78 2c 20 20 20   int bPrefix,   
e090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0a0: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 70   /* True for a p
e0b0: 72 65 66 69 78 20 69 74 65 72 61 74 6f 72 20 2a  refix iterator *
e0c0: 2f 0a 20 20 46 74 73 33 53 65 67 52 65 61 64 65  /.  Fts3SegReade
e0d0: 72 20 2a 2a 70 70 52 65 61 64 65 72 20 20 20 20  r **ppReader    
e0e0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 67 52      /* OUT: SegR
e0f0: 65 61 64 65 72 20 66 6f 72 20 70 65 6e 64 69 6e  eader for pendin
e100: 67 2d 74 65 72 6d 73 20 2a 2f 0a 29 7b 0a 20 20  g-terms */.){.  
e110: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
e120: 52 65 61 64 65 72 20 3d 20 30 3b 20 20 20 20 20  Reader = 0;     
e130: 2f 2a 20 46 74 73 33 53 65 67 52 65 61 64 65 72  /* Fts3SegReader
e140: 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72   object to retur
e150: 6e 20 2a 2f 0a 20 20 46 74 73 33 48 61 73 68 45  n */.  Fts3HashE
e160: 6c 65 6d 20 2a 70 45 3b 20 20 20 20 20 20 20 20  lem *pE;        
e170: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
e180: 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
e190: 20 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a   Fts3HashElem **
e1a0: 61 45 6c 65 6d 20 3d 20 30 3b 20 20 20 20 20 20  aElem = 0;      
e1b0: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 65 72   /* Array of ter
e1c0: 6d 20 68 61 73 68 20 65 6e 74 72 69 65 73 20 74  m hash entries t
e1d0: 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 69 6e 74 20  o scan */.  int 
e1e0: 6e 45 6c 65 6d 20 3d 20 30 3b 20 20 20 20 20 20  nElem = 0;      
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
e200: 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 74 20  ize of array at 
e210: 61 45 6c 65 6d 20 2a 2f 0a 20 20 69 6e 74 20 72  aElem */.  int r
e220: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
e230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
e240: 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 46  turn Code */.  F
e250: 74 73 33 48 61 73 68 20 2a 70 48 61 73 68 3b 0a  ts3Hash *pHash;.
e260: 0a 20 20 70 48 61 73 68 20 3d 20 26 70 2d 3e 61  .  pHash = &p->a
e270: 49 6e 64 65 78 5b 69 49 6e 64 65 78 5d 2e 68 50  Index[iIndex].hP
e280: 65 6e 64 69 6e 67 3b 0a 20 20 69 66 28 20 62 50  ending;.  if( bP
e290: 72 65 66 69 78 20 29 7b 0a 20 20 20 20 69 6e 74  refix ){.    int
e2a0: 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 20 20 20 20   nAlloc = 0;    
e2b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
e2c0: 7a 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20  ze of allocated 
e2d0: 61 72 72 61 79 20 61 74 20 61 45 6c 65 6d 20 2a  array at aElem *
e2e0: 2f 0a 0a 20 20 20 20 66 6f 72 28 70 45 3d 66 74  /..    for(pE=ft
e2f0: 73 33 48 61 73 68 46 69 72 73 74 28 70 48 61 73  s3HashFirst(pHas
e300: 68 29 3b 20 70 45 3b 20 70 45 3d 66 74 73 33 48  h); pE; pE=fts3H
e310: 61 73 68 4e 65 78 74 28 70 45 29 29 7b 0a 20 20  ashNext(pE)){.  
e320: 20 20 20 20 63 68 61 72 20 2a 7a 4b 65 79 20 3d      char *zKey =
e330: 20 28 63 68 61 72 20 2a 29 66 74 73 33 48 61 73   (char *)fts3Has
e340: 68 4b 65 79 28 70 45 29 3b 0a 20 20 20 20 20 20  hKey(pE);.      
e350: 69 6e 74 20 6e 4b 65 79 20 3d 20 66 74 73 33 48  int nKey = fts3H
e360: 61 73 68 4b 65 79 73 69 7a 65 28 70 45 29 3b 0a  ashKeysize(pE);.
e370: 20 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3d        if( nTerm=
e380: 3d 30 20 7c 7c 20 28 6e 4b 65 79 3e 3d 6e 54 65  =0 || (nKey>=nTe
e390: 72 6d 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  rm && 0==memcmp(
e3a0: 7a 4b 65 79 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  zKey, zTerm, nTe
e3b0: 72 6d 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rm)) ){.        
e3c0: 69 66 28 20 6e 45 6c 65 6d 3d 3d 6e 41 6c 6c 6f  if( nElem==nAllo
e3d0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 46  c ){.          F
e3e0: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 61 45  ts3HashElem **aE
e3f0: 6c 65 6d 32 3b 0a 20 20 20 20 20 20 20 20 20 20  lem2;.          
e400: 6e 41 6c 6c 6f 63 20 2b 3d 20 31 36 3b 0a 20 20  nAlloc += 16;.  
e410: 20 20 20 20 20 20 20 20 61 45 6c 65 6d 32 20 3d          aElem2 =
e420: 20 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a   (Fts3HashElem *
e430: 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
e440: 63 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  c(.             
e450: 20 61 45 6c 65 6d 2c 20 6e 41 6c 6c 6f 63 2a 73   aElem, nAlloc*s
e460: 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68 45 6c  izeof(Fts3HashEl
e470: 65 6d 20 2a 29 0a 20 20 20 20 20 20 20 20 20 20  em *).          
e480: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
e490: 20 21 61 45 6c 65 6d 32 20 29 7b 0a 20 20 20 20   !aElem2 ){.    
e4a0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
e4b0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
e4c0: 20 20 20 20 20 20 20 6e 45 6c 65 6d 20 3d 20 30         nElem = 0
e4d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
e4e0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
e4f0: 0a 20 20 20 20 20 20 20 20 20 20 61 45 6c 65 6d  .          aElem
e500: 20 3d 20 61 45 6c 65 6d 32 3b 0a 20 20 20 20 20   = aElem2;.     
e510: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 61 45     }..        aE
e520: 6c 65 6d 5b 6e 45 6c 65 6d 2b 2b 5d 20 3d 20 70  lem[nElem++] = p
e530: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
e540: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6d 6f 72 65  ..    /* If more
e550: 20 74 68 61 6e 20 6f 6e 65 20 74 65 72 6d 20 6d   than one term m
e560: 61 74 63 68 65 73 20 74 68 65 20 70 72 65 66 69  atches the prefi
e570: 78 2c 20 73 6f 72 74 20 74 68 65 20 46 74 73 33  x, sort the Fts3
e580: 48 61 73 68 45 6c 65 6d 0a 20 20 20 20 2a 2a 20  HashElem.    ** 
e590: 6f 62 6a 65 63 74 73 20 69 6e 20 74 65 72 6d 20  objects in term 
e5a0: 6f 72 64 65 72 20 75 73 69 6e 67 20 71 73 6f 72  order using qsor
e5b0: 74 28 29 2e 20 54 68 69 73 20 75 73 65 73 20 74  t(). This uses t
e5c0: 68 65 20 73 61 6d 65 20 63 6f 6d 70 61 72 69 73  he same comparis
e5d0: 6f 6e 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 62 61  on.    ** callba
e5e0: 63 6b 20 61 73 20 69 73 20 75 73 65 64 20 77 68  ck as is used wh
e5f0: 65 6e 20 66 6c 75 73 68 69 6e 67 20 74 65 72 6d  en flushing term
e600: 73 20 74 6f 20 64 69 73 6b 2e 0a 20 20 20 20 2a  s to disk..    *
e610: 2f 0a 20 20 20 20 69 66 28 20 6e 45 6c 65 6d 3e  /.    if( nElem>
e620: 31 20 29 7b 0a 20 20 20 20 20 20 71 73 6f 72 74  1 ){.      qsort
e630: 28 61 45 6c 65 6d 2c 20 6e 45 6c 65 6d 2c 20 73  (aElem, nElem, s
e640: 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68 45 6c  izeof(Fts3HashEl
e650: 65 6d 20 2a 29 2c 20 66 74 73 33 43 6f 6d 70 61  em *), fts3Compa
e660: 72 65 45 6c 65 6d 42 79 54 65 72 6d 29 3b 0a 20  reElemByTerm);. 
e670: 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20     }..  }else{. 
e680: 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20     /* The query 
e690: 69 73 20 61 20 73 69 6d 70 6c 65 20 74 65 72 6d  is a simple term
e6a0: 20 6c 6f 6f 6b 75 70 20 74 68 61 74 20 6d 61 74   lookup that mat
e6b0: 63 68 65 73 20 61 74 20 6d 6f 73 74 20 6f 6e 65  ches at most one
e6c0: 20 74 65 72 6d 20 69 6e 0a 20 20 20 20 2a 2a 20   term in.    ** 
e6d0: 74 68 65 20 69 6e 64 65 78 2e 20 41 6c 6c 20 74  the index. All t
e6e0: 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20  hat is required 
e6f0: 69 73 20 61 20 73 74 72 61 69 67 68 74 20 68 61  is a straight ha
e700: 73 68 2d 6c 6f 6f 6b 75 70 2e 20 0a 20 20 20 20  sh-lookup. .    
e710: 2a 2a 0a 20 20 20 20 2a 2a 20 42 65 63 61 75 73  **.    ** Becaus
e720: 65 20 74 68 65 20 73 74 61 63 6b 20 61 64 64 72  e the stack addr
e730: 65 73 73 20 6f 66 20 70 45 20 6d 61 79 20 62 65  ess of pE may be
e740: 20 61 63 63 65 73 73 65 64 20 76 69 61 20 74 68   accessed via th
e750: 65 20 61 45 6c 65 6d 20 70 6f 69 6e 74 65 72 0a  e aElem pointer.
e760: 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2c 20 74 68      ** below, th
e770: 65 20 22 46 74 73 33 48 61 73 68 45 6c 65 6d 20  e "Fts3HashElem 
e780: 2a 70 45 22 20 6d 75 73 74 20 62 65 20 64 65 63  *pE" must be dec
e790: 6c 61 72 65 64 20 73 6f 20 74 68 61 74 20 69 74  lared so that it
e7a0: 20 69 73 20 76 61 6c 69 64 0a 20 20 20 20 2a 2a   is valid.    **
e7b0: 20 77 69 74 68 69 6e 20 74 68 69 73 20 65 6e 74   within this ent
e7c0: 69 72 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6e 6f  ire function, no
e7d0: 74 20 6a 75 73 74 20 74 68 69 73 20 22 65 6c 73  t just this "els
e7e0: 65 7b 2e 2e 2e 7d 22 20 62 6c 6f 63 6b 2e 0a 20  e{...}" block.. 
e7f0: 20 20 20 2a 2f 0a 20 20 20 20 70 45 20 3d 20 66     */.    pE = f
e800: 74 73 33 48 61 73 68 46 69 6e 64 45 6c 65 6d 28  ts3HashFindElem(
e810: 70 48 61 73 68 2c 20 7a 54 65 72 6d 2c 20 6e 54  pHash, zTerm, nT
e820: 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 45  erm);.    if( pE
e830: 20 29 7b 0a 20 20 20 20 20 20 61 45 6c 65 6d 20   ){.      aElem 
e840: 3d 20 26 70 45 3b 0a 20 20 20 20 20 20 6e 45 6c  = &pE;.      nEl
e850: 65 6d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  em = 1;.    }.  
e860: 7d 0a 0a 20 20 69 66 28 20 6e 45 6c 65 6d 3e 30  }..  if( nElem>0
e870: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   ){.    int nByt
e880: 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 33 53  e = sizeof(Fts3S
e890: 65 67 52 65 61 64 65 72 29 20 2b 20 28 6e 45 6c  egReader) + (nEl
e8a0: 65 6d 2b 31 29 2a 73 69 7a 65 6f 66 28 46 74 73  em+1)*sizeof(Fts
e8b0: 33 48 61 73 68 45 6c 65 6d 20 2a 29 3b 0a 20 20  3HashElem *);.  
e8c0: 20 20 70 52 65 61 64 65 72 20 3d 20 28 46 74 73    pReader = (Fts
e8d0: 33 53 65 67 52 65 61 64 65 72 20 2a 29 73 71 6c  3SegReader *)sql
e8e0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74  ite3_malloc(nByt
e8f0: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 52 65  e);.    if( !pRe
e900: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63  ader ){.      rc
e910: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
e920: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e930: 20 20 6d 65 6d 73 65 74 28 70 52 65 61 64 65 72    memset(pReader
e940: 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  , 0, nByte);.   
e950: 20 20 20 70 52 65 61 64 65 72 2d 3e 69 49 64 78     pReader->iIdx
e960: 20 3d 20 30 78 37 46 46 46 46 46 46 46 3b 0a 20   = 0x7FFFFFFF;. 
e970: 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 70       pReader->pp
e980: 4e 65 78 74 45 6c 65 6d 20 3d 20 28 46 74 73 33  NextElem = (Fts3
e990: 48 61 73 68 45 6c 65 6d 20 2a 2a 29 26 70 52 65  HashElem **)&pRe
e9a0: 61 64 65 72 5b 31 5d 3b 0a 20 20 20 20 20 20 6d  ader[1];.      m
e9b0: 65 6d 63 70 79 28 70 52 65 61 64 65 72 2d 3e 70  emcpy(pReader->p
e9c0: 70 4e 65 78 74 45 6c 65 6d 2c 20 61 45 6c 65 6d  pNextElem, aElem
e9d0: 2c 20 6e 45 6c 65 6d 2a 73 69 7a 65 6f 66 28 46  , nElem*sizeof(F
e9e0: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 29 29 3b  ts3HashElem *));
e9f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
ea00: 28 20 62 50 72 65 66 69 78 20 29 7b 0a 20 20 20  ( bPrefix ){.   
ea10: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 45   sqlite3_free(aE
ea20: 6c 65 6d 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 52  lem);.  }.  *ppR
ea30: 65 61 64 65 72 20 3d 20 70 52 65 61 64 65 72 3b  eader = pReader;
ea40: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ea50: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
ea60: 68 65 20 65 6e 74 72 69 65 73 20 70 6f 69 6e 74  he entries point
ea70: 65 64 20 74 6f 20 62 79 20 74 77 6f 20 46 74 73  ed to by two Fts
ea80: 33 53 65 67 52 65 61 64 65 72 20 73 74 72 75 63  3SegReader struc
ea90: 74 75 72 65 73 2e 20 0a 2a 2a 20 43 6f 6d 70 61  tures. .** Compa
eaa0: 72 69 73 6f 6e 20 69 73 20 61 73 20 66 6f 6c 6c  rison is as foll
eab0: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ows:.**.**   1) 
eac0: 45 4f 46 20 69 73 20 67 72 65 61 74 65 72 20 74  EOF is greater t
ead0: 68 61 6e 20 6e 6f 74 20 45 4f 46 2e 0a 2a 2a 0a  han not EOF..**.
eae0: 2a 2a 20 20 20 32 29 20 54 68 65 20 63 75 72 72  **   2) The curr
eaf0: 65 6e 74 20 74 65 72 6d 73 20 28 69 66 20 61 6e  ent terms (if an
eb00: 79 29 20 61 72 65 20 63 6f 6d 70 61 72 65 64 20  y) are compared 
eb10: 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20  using memcmp(). 
eb20: 49 66 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 74  If one.**      t
eb30: 65 72 6d 20 69 73 20 61 20 70 72 65 66 69 78 20  erm is a prefix 
eb40: 6f 66 20 61 6e 6f 74 68 65 72 2c 20 74 68 65 20  of another, the 
eb50: 6c 6f 6e 67 65 72 20 74 65 72 6d 20 69 73 20 63  longer term is c
eb60: 6f 6e 73 69 64 65 72 65 64 20 74 68 65 0a 2a 2a  onsidered the.**
eb70: 20 20 20 20 20 20 6c 61 72 67 65 72 2e 0a 2a 2a        larger..**
eb80: 0a 2a 2a 20 20 20 33 29 20 42 79 20 73 65 67 6d  .**   3) By segm
eb90: 65 6e 74 20 61 67 65 2e 20 41 6e 20 6f 6c 64 65  ent age. An olde
eba0: 72 20 73 65 67 6d 65 6e 74 20 69 73 20 63 6f 6e  r segment is con
ebb0: 73 69 64 65 72 65 64 20 6c 61 72 67 65 72 2e 0a  sidered larger..
ebc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
ebd0: 73 33 53 65 67 52 65 61 64 65 72 43 6d 70 28 46  s3SegReaderCmp(F
ebe0: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 4c  ts3SegReader *pL
ebf0: 68 73 2c 20 46 74 73 33 53 65 67 52 65 61 64 65  hs, Fts3SegReade
ec00: 72 20 2a 70 52 68 73 29 7b 0a 20 20 69 6e 74 20  r *pRhs){.  int 
ec10: 72 63 3b 0a 20 20 69 66 28 20 70 4c 68 73 2d 3e  rc;.  if( pLhs->
ec20: 61 4e 6f 64 65 20 26 26 20 70 52 68 73 2d 3e 61  aNode && pRhs->a
ec30: 4e 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Node ){.    int 
ec40: 72 63 32 20 3d 20 70 4c 68 73 2d 3e 6e 54 65 72  rc2 = pLhs->nTer
ec50: 6d 20 2d 20 70 52 68 73 2d 3e 6e 54 65 72 6d 3b  m - pRhs->nTerm;
ec60: 0a 20 20 20 20 69 66 28 20 72 63 32 3c 30 20 29  .    if( rc2<0 )
ec70: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d  {.      rc = mem
ec80: 63 6d 70 28 70 4c 68 73 2d 3e 7a 54 65 72 6d 2c  cmp(pLhs->zTerm,
ec90: 20 70 52 68 73 2d 3e 7a 54 65 72 6d 2c 20 70 4c   pRhs->zTerm, pL
eca0: 68 73 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20  hs->nTerm);.    
ecb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
ecc0: 3d 20 6d 65 6d 63 6d 70 28 70 4c 68 73 2d 3e 7a  = memcmp(pLhs->z
ecd0: 54 65 72 6d 2c 20 70 52 68 73 2d 3e 7a 54 65 72  Term, pRhs->zTer
ece0: 6d 2c 20 70 52 68 73 2d 3e 6e 54 65 72 6d 29 3b  m, pRhs->nTerm);
ecf0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
ed00: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  c==0 ){.      rc
ed10: 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20   = rc2;.    }.  
ed20: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
ed30: 28 70 4c 68 73 2d 3e 61 4e 6f 64 65 3d 3d 30 29  (pLhs->aNode==0)
ed40: 20 2d 20 28 70 52 68 73 2d 3e 61 4e 6f 64 65 3d   - (pRhs->aNode=
ed50: 3d 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  =0);.  }.  if( r
ed60: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  c==0 ){.    rc =
ed70: 20 70 52 68 73 2d 3e 69 49 64 78 20 2d 20 70 4c   pRhs->iIdx - pL
ed80: 68 73 2d 3e 69 49 64 78 3b 0a 20 20 7d 0a 20 20  hs->iIdx;.  }.  
ed90: 61 73 73 65 72 74 28 20 72 63 21 3d 30 20 29 3b  assert( rc!=0 );
eda0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
edb0: 0a 2f 2a 0a 2a 2a 20 41 20 64 69 66 66 65 72 65  ./*.** A differe
edc0: 6e 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  nt comparison fu
edd0: 6e 63 74 69 6f 6e 20 66 6f 72 20 53 65 67 52 65  nction for SegRe
ede0: 61 64 65 72 20 73 74 72 75 63 74 75 72 65 73 2e  ader structures.
edf0: 20 49 6e 20 74 68 69 73 0a 2a 2a 20 76 65 72 73   In this.** vers
ee00: 69 6f 6e 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ion, it is assum
ee10: 65 64 20 74 68 61 74 20 65 61 63 68 20 53 65 67  ed that each Seg
ee20: 52 65 61 64 65 72 20 70 6f 69 6e 74 73 20 74 6f  Reader points to
ee30: 20 61 6e 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20   an entry in.** 
ee40: 61 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 69 64  a doclist for id
ee50: 65 6e 74 69 63 61 6c 20 74 65 72 6d 73 2e 20 43  entical terms. C
ee60: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64  omparison is mad
ee70: 65 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  e as follows:.**
ee80: 0a 2a 2a 20 20 20 31 29 20 45 4f 46 20 28 65 6e  .**   1) EOF (en
ee90: 64 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20  d of doclist in 
eea0: 74 68 69 73 20 63 61 73 65 29 20 69 73 20 67 72  this case) is gr
eeb0: 65 61 74 65 72 20 74 68 61 6e 20 6e 6f 74 20 45  eater than not E
eec0: 4f 46 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 42  OF..**.**   2) B
eed0: 79 20 63 75 72 72 65 6e 74 20 64 6f 63 69 64 2e  y current docid.
eee0: 0a 2a 2a 0a 2a 2a 20 20 20 33 29 20 42 79 20 73  .**.**   3) By s
eef0: 65 67 6d 65 6e 74 20 61 67 65 2e 20 41 6e 20 6f  egment age. An o
ef00: 6c 64 65 72 20 73 65 67 6d 65 6e 74 20 69 73 20  lder segment is 
ef10: 63 6f 6e 73 69 64 65 72 65 64 20 6c 61 72 67 65  considered large
ef20: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
ef30: 20 66 74 73 33 53 65 67 52 65 61 64 65 72 44 6f   fts3SegReaderDo
ef40: 63 6c 69 73 74 43 6d 70 28 46 74 73 33 53 65 67  clistCmp(Fts3Seg
ef50: 52 65 61 64 65 72 20 2a 70 4c 68 73 2c 20 46 74  Reader *pLhs, Ft
ef60: 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 68  s3SegReader *pRh
ef70: 73 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 28  s){.  int rc = (
ef80: 70 4c 68 73 2d 3e 70 4f 66 66 73 65 74 4c 69 73  pLhs->pOffsetLis
ef90: 74 3d 3d 30 29 2d 28 70 52 68 73 2d 3e 70 4f 66  t==0)-(pRhs->pOf
efa0: 66 73 65 74 4c 69 73 74 3d 3d 30 29 3b 0a 20 20  fsetList==0);.  
efb0: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
efc0: 20 69 66 28 20 70 4c 68 73 2d 3e 69 44 6f 63 69   if( pLhs->iDoci
efd0: 64 3d 3d 70 52 68 73 2d 3e 69 44 6f 63 69 64 20  d==pRhs->iDocid 
efe0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 52  ){.      rc = pR
eff0: 68 73 2d 3e 69 49 64 78 20 2d 20 70 4c 68 73 2d  hs->iIdx - pLhs-
f000: 3e 69 49 64 78 3b 0a 20 20 20 20 7d 65 6c 73 65  >iIdx;.    }else
f010: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 70 4c  {.      rc = (pL
f020: 68 73 2d 3e 69 44 6f 63 69 64 20 3e 20 70 52 68  hs->iDocid > pRh
f030: 73 2d 3e 69 44 6f 63 69 64 29 20 3f 20 31 20 3a  s->iDocid) ? 1 :
f040: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   -1;.    }.  }. 
f050: 20 61 73 73 65 72 74 28 20 70 4c 68 73 2d 3e 61   assert( pLhs->a
f060: 4e 6f 64 65 20 26 26 20 70 52 68 73 2d 3e 61 4e  Node && pRhs->aN
f070: 6f 64 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ode );.  return 
f080: 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  rc;.}.static int
f090: 20 66 74 73 33 53 65 67 52 65 61 64 65 72 44 6f   fts3SegReaderDo
f0a0: 63 6c 69 73 74 43 6d 70 52 65 76 28 46 74 73 33  clistCmpRev(Fts3
f0b0: 53 65 67 52 65 61 64 65 72 20 2a 70 4c 68 73 2c  SegReader *pLhs,
f0c0: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
f0d0: 70 52 68 73 29 7b 0a 20 20 69 6e 74 20 72 63 20  pRhs){.  int rc 
f0e0: 3d 20 28 70 4c 68 73 2d 3e 70 4f 66 66 73 65 74  = (pLhs->pOffset
f0f0: 4c 69 73 74 3d 3d 30 29 2d 28 70 52 68 73 2d 3e  List==0)-(pRhs->
f100: 70 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30 29 3b  pOffsetList==0);
f110: 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
f120: 20 20 20 20 69 66 28 20 70 4c 68 73 2d 3e 69 44      if( pLhs->iD
f130: 6f 63 69 64 3d 3d 70 52 68 73 2d 3e 69 44 6f 63  ocid==pRhs->iDoc
f140: 69 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  id ){.      rc =
f150: 20 70 52 68 73 2d 3e 69 49 64 78 20 2d 20 70 4c   pRhs->iIdx - pL
f160: 68 73 2d 3e 69 49 64 78 3b 0a 20 20 20 20 7d 65  hs->iIdx;.    }e
f170: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
f180: 28 70 4c 68 73 2d 3e 69 44 6f 63 69 64 20 3c 20  (pLhs->iDocid < 
f190: 70 52 68 73 2d 3e 69 44 6f 63 69 64 29 20 3f 20  pRhs->iDocid) ? 
f1a0: 31 20 3a 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  1 : -1;.    }.  
f1b0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 68 73  }.  assert( pLhs
f1c0: 2d 3e 61 4e 6f 64 65 20 26 26 20 70 52 68 73 2d  ->aNode && pRhs-
f1d0: 3e 61 4e 6f 64 65 20 29 3b 0a 20 20 72 65 74 75  >aNode );.  retu
f1e0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
f1f0: 43 6f 6d 70 61 72 65 20 74 68 65 20 74 65 72 6d  Compare the term
f200: 20 74 68 61 74 20 74 68 65 20 46 74 73 33 53 65   that the Fts3Se
f210: 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74 20 70  gReader object p
f220: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
f230: 73 74 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 70  st argument.** p
f240: 6f 69 6e 74 73 20 74 6f 20 77 69 74 68 20 74 68  oints to with th
f250: 65 20 74 65 72 6d 20 73 70 65 63 69 66 69 65 64  e term specified
f260: 20 62 79 20 61 72 67 75 6d 65 6e 74 73 20 7a 54   by arguments zT
f270: 65 72 6d 20 61 6e 64 20 6e 54 65 72 6d 2e 20 0a  erm and nTerm. .
f280: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65  **.** If the pSe
f290: 67 20 69 74 65 72 61 74 6f 72 20 69 73 20 61 6c  g iterator is al
f2a0: 72 65 61 64 79 20 61 74 20 45 4f 46 2c 20 72 65  ready at EOF, re
f2b0: 74 75 72 6e 20 30 2e 20 4f 74 68 65 72 77 69 73  turn 0. Otherwis
f2c0: 65 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 2d 76 65  e, return.** -ve
f2d0: 20 69 66 20 74 68 65 20 70 53 65 67 20 74 65 72   if the pSeg ter
f2e0: 6d 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  m is less than z
f2f0: 54 65 72 6d 2f 6e 54 65 72 6d 2c 20 30 20 69 66  Term/nTerm, 0 if
f300: 20 74 68 65 20 74 77 6f 20 74 65 72 6d 73 20 61   the two terms a
f310: 72 65 0a 2a 2a 20 65 71 75 61 6c 2c 20 6f 72 20  re.** equal, or 
f320: 2b 76 65 20 69 66 20 74 68 65 20 70 53 65 67 20  +ve if the pSeg 
f330: 74 65 72 6d 20 69 73 20 67 72 65 61 74 65 72 20  term is greater 
f340: 74 68 61 6e 20 7a 54 65 72 6d 2f 6e 54 65 72 6d  than zTerm/nTerm
f350: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f360: 66 74 73 33 53 65 67 52 65 61 64 65 72 54 65 72  fts3SegReaderTer
f370: 6d 43 6d 70 28 0a 20 20 46 74 73 33 53 65 67 52  mCmp(.  Fts3SegR
f380: 65 61 64 65 72 20 2a 70 53 65 67 2c 20 20 20 20  eader *pSeg,    
f390: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65          /* Segme
f3a0: 6e 74 20 72 65 61 64 65 72 20 6f 62 6a 65 63 74  nt reader object
f3b0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
f3c0: 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20   *zTerm,        
f3d0: 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f        /* Term to
f3e0: 20 63 6f 6d 70 61 72 65 20 74 6f 20 2a 2f 0a 20   compare to */. 
f3f0: 20 69 6e 74 20 6e 54 65 72 6d 20 20 20 20 20 20   int nTerm      
f400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f410: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d   /* Size of term
f420: 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20   zTerm in bytes 
f430: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 65 73 20  */.){.  int res 
f440: 3d 20 30 3b 0a 20 20 69 66 28 20 70 53 65 67 2d  = 0;.  if( pSeg-
f450: 3e 61 4e 6f 64 65 20 29 7b 0a 20 20 20 20 69 66  >aNode ){.    if
f460: 28 20 70 53 65 67 2d 3e 6e 54 65 72 6d 3e 6e 54  ( pSeg->nTerm>nT
f470: 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 73  erm ){.      res
f480: 20 3d 20 6d 65 6d 63 6d 70 28 70 53 65 67 2d 3e   = memcmp(pSeg->
f490: 7a 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54  zTerm, zTerm, nT
f4a0: 65 72 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  erm);.    }else{
f4b0: 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6d 65 6d  .      res = mem
f4c0: 63 6d 70 28 70 53 65 67 2d 3e 7a 54 65 72 6d 2c  cmp(pSeg->zTerm,
f4d0: 20 7a 54 65 72 6d 2c 20 70 53 65 67 2d 3e 6e 54   zTerm, pSeg->nT
f4e0: 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  erm);.    }.    
f4f0: 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
f500: 20 20 20 20 72 65 73 20 3d 20 70 53 65 67 2d 3e      res = pSeg->
f510: 6e 54 65 72 6d 2d 6e 54 65 72 6d 3b 0a 20 20 20  nTerm-nTerm;.   
f520: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
f530: 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72  res;.}../*.** Ar
f540: 67 75 6d 65 6e 74 20 61 70 53 65 67 6d 65 6e 74  gument apSegment
f550: 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20   is an array of 
f560: 6e 53 65 67 6d 65 6e 74 20 65 6c 65 6d 65 6e 74  nSegment element
f570: 73 2e 20 49 74 20 69 73 20 6b 6e 6f 77 6e 20 74  s. It is known t
f580: 68 61 74 0a 2a 2a 20 74 68 65 20 66 69 6e 61 6c  hat.** the final
f590: 20 28 6e 53 65 67 6d 65 6e 74 2d 6e 53 75 73 70   (nSegment-nSusp
f5a0: 65 63 74 29 20 6d 65 6d 62 65 72 73 20 61 72 65  ect) members are
f5b0: 20 61 6c 72 65 61 64 79 20 69 6e 20 73 6f 72 74   already in sort
f5c0: 65 64 20 6f 72 64 65 72 0a 2a 2a 20 28 61 63 63  ed order.** (acc
f5d0: 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f  ording to the co
f5e0: 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
f5f0: 6e 20 70 72 6f 76 69 64 65 64 29 2e 20 54 68 69  n provided). Thi
f600: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 75 66 66  s function shuff
f610: 6c 65 73 0a 2a 2a 20 74 68 65 20 61 72 72 61 79  les.** the array
f620: 20 61 72 6f 75 6e 64 20 75 6e 74 69 6c 20 61 6c   around until al
f630: 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20 69 6e  l entries are in
f640: 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a 2a   sorted order..*
f650: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
f660: 73 33 53 65 67 52 65 61 64 65 72 53 6f 72 74 28  s3SegReaderSort(
f670: 0a 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72  .  Fts3SegReader
f680: 20 2a 2a 61 70 53 65 67 6d 65 6e 74 2c 20 20 20   **apSegment,   
f690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6a0: 20 20 2f 2a 20 41 72 72 61 79 20 74 6f 20 73 6f    /* Array to so
f6b0: 72 74 20 65 6e 74 72 69 65 73 20 6f 66 20 2a 2f  rt entries of */
f6c0: 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 2c  .  int nSegment,
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6f0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 70 53    /* Size of apS
f700: 65 67 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a  egment array */.
f710: 20 20 69 6e 74 20 6e 53 75 73 70 65 63 74 2c 20    int nSuspect, 
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f740: 20 2f 2a 20 55 6e 73 6f 72 74 65 64 20 65 6e 74   /* Unsorted ent
f750: 72 79 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 69 6e  ry count */.  in
f760: 74 20 28 2a 78 43 6d 70 29 28 46 74 73 33 53 65  t (*xCmp)(Fts3Se
f770: 67 52 65 61 64 65 72 20 2a 2c 20 46 74 73 33 53  gReader *, Fts3S
f780: 65 67 52 65 61 64 65 72 20 2a 29 20 20 2f 2a 20  egReader *)  /* 
f790: 43 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  Comparison funct
f7a0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ion */.){.  int 
f7b0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
f7c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
f7d0: 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
f7e0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6e   */..  assert( n
f7f0: 53 75 73 70 65 63 74 3c 3d 6e 53 65 67 6d 65 6e  Suspect<=nSegmen
f800: 74 20 29 3b 0a 0a 20 20 69 66 28 20 6e 53 75 73  t );..  if( nSus
f810: 70 65 63 74 3d 3d 6e 53 65 67 6d 65 6e 74 20 29  pect==nSegment )
f820: 20 6e 53 75 73 70 65 63 74 2d 2d 3b 0a 20 20 66   nSuspect--;.  f
f830: 6f 72 28 69 3d 6e 53 75 73 70 65 63 74 2d 31 3b  or(i=nSuspect-1;
f840: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
f850: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 66 6f 72 28   int j;.    for(
f860: 6a 3d 69 3b 20 6a 3c 28 6e 53 65 67 6d 65 6e 74  j=i; j<(nSegment
f870: 2d 31 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  -1); j++){.     
f880: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
f890: 70 54 6d 70 3b 0a 20 20 20 20 20 20 69 66 28 20  pTmp;.      if( 
f8a0: 78 43 6d 70 28 61 70 53 65 67 6d 65 6e 74 5b 6a  xCmp(apSegment[j
f8b0: 5d 2c 20 61 70 53 65 67 6d 65 6e 74 5b 6a 2b 31  ], apSegment[j+1
f8c0: 5d 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  ])<0 ) break;.  
f8d0: 20 20 20 20 70 54 6d 70 20 3d 20 61 70 53 65 67      pTmp = apSeg
f8e0: 6d 65 6e 74 5b 6a 2b 31 5d 3b 0a 20 20 20 20 20  ment[j+1];.     
f8f0: 20 61 70 53 65 67 6d 65 6e 74 5b 6a 2b 31 5d 20   apSegment[j+1] 
f900: 3d 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 3b 0a  = apSegment[j];.
f910: 20 20 20 20 20 20 61 70 53 65 67 6d 65 6e 74 5b        apSegment[
f920: 6a 5d 20 3d 20 70 54 6d 70 3b 0a 20 20 20 20 7d  j] = pTmp;.    }
f930: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  .  }..#ifndef ND
f940: 45 42 55 47 0a 20 20 2f 2a 20 43 68 65 63 6b 20  EBUG.  /* Check 
f950: 74 68 61 74 20 74 68 65 20 6c 69 73 74 20 72 65  that the list re
f960: 61 6c 6c 79 20 69 73 20 73 6f 72 74 65 64 20 6e  ally is sorted n
f970: 6f 77 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ow. */.  for(i=0
f980: 3b 20 69 3c 28 6e 53 75 73 70 65 63 74 2d 31 29  ; i<(nSuspect-1)
f990: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
f9a0: 72 74 28 20 78 43 6d 70 28 61 70 53 65 67 6d 65  rt( xCmp(apSegme
f9b0: 6e 74 5b 69 5d 2c 20 61 70 53 65 67 6d 65 6e 74  nt[i], apSegment
f9c0: 5b 69 2b 31 5d 29 3c 30 20 29 3b 0a 20 20 7d 0a  [i+1])<0 );.  }.
f9d0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  #endif.}../* .**
f9e0: 20 49 6e 73 65 72 74 20 61 20 72 65 63 6f 72 64   Insert a record
f9f0: 20 69 6e 74 6f 20 74 68 65 20 25 5f 73 65 67 6d   into the %_segm
fa00: 65 6e 74 73 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  ents table..*/.s
fa10: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 57 72  tatic int fts3Wr
fa20: 69 74 65 53 65 67 6d 65 6e 74 28 0a 20 20 46 74  iteSegment(.  Ft
fa30: 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
fa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fa50: 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68   Virtual table h
fa60: 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  andle */.  sqlit
fa70: 65 33 5f 69 6e 74 36 34 20 69 42 6c 6f 63 6b 2c  e3_int64 iBlock,
fa80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c             /* Bl
fa90: 6f 63 6b 20 69 64 20 66 6f 72 20 6e 65 77 20 62  ock id for new b
faa0: 6c 6f 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lock */.  char *
fab0: 7a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z,              
fac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
fad0: 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
fae0: 6f 6e 74 61 69 6e 69 6e 67 20 62 6c 6f 63 6b 20  ontaining block 
faf0: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 20  data */.  int n 
fb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
fb20: 65 20 6f 66 20 62 75 66 66 65 72 20 7a 20 69 6e  e of buffer z in
fb30: 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 73   bytes */.){.  s
fb40: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
fb50: 6d 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 66  mt;.  int rc = f
fb60: 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51  ts3SqlStmt(p, SQ
fb70: 4c 5f 49 4e 53 45 52 54 5f 53 45 47 4d 45 4e 54  L_INSERT_SEGMENT
fb80: 53 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  S, &pStmt, 0);. 
fb90: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
fba0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
fbb0: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74  3_bind_int64(pSt
fbc0: 6d 74 2c 20 31 2c 20 69 42 6c 6f 63 6b 29 3b 0a  mt, 1, iBlock);.
fbd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
fbe0: 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 32 2c 20  _blob(pStmt, 2, 
fbf0: 7a 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41  z, n, SQLITE_STA
fc00: 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
fc10: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
fc20: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
fc30: 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
fc40: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
fc50: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
fc60: 20 6c 61 72 67 65 73 74 20 72 65 6c 61 74 69 76   largest relativ
fc70: 65 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20 69  e level number i
fc80: 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 49 66 20  n the table. If 
fc90: 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 0a  successful, set.
fca0: 2a 2a 20 2a 70 6e 4d 61 78 20 74 6f 20 74 68 69  ** *pnMax to thi
fcb0: 73 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75  s value and retu
fcc0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74  rn SQLITE_OK. Ot
fcd0: 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65  herwise, if an e
fce0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
fcf0: 73 65 74 20 2a 70 6e 4d 61 78 20 74 6f 20 7a 65  set *pnMax to ze
fd00: 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  ro and return an
fd10: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
fd20: 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
fd30: 65 33 46 74 73 33 4d 61 78 4c 65 76 65 6c 28 46  e3Fts3MaxLevel(F
fd40: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74  ts3Table *p, int
fd50: 20 2a 70 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20   *pnMax){.  int 
fd60: 72 63 3b 0a 20 20 69 6e 74 20 6d 78 4c 65 76 65  rc;.  int mxLeve
fd70: 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  l = 0;.  sqlite3
fd80: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
fd90: 3b 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71  ;..  rc = fts3Sq
fda0: 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c  lStmt(p, SQL_SEL
fdb0: 45 43 54 5f 4d 58 4c 45 56 45 4c 2c 20 26 70 53  ECT_MXLEVEL, &pS
fdc0: 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tmt, 0);.  if( r
fdd0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
fde0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
fdf0: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
fe00: 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
fe10: 20 6d 78 4c 65 76 65 6c 20 3d 20 73 71 6c 69 74   mxLevel = sqlit
fe20: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
fe30: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  tmt, 0);.    }. 
fe40: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
fe50: 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
fe60: 7d 0a 20 20 2a 70 6e 4d 61 78 20 3d 20 6d 78 4c  }.  *pnMax = mxL
fe70: 65 76 65 6c 3b 0a 20 20 72 65 74 75 72 6e 20 72  evel;.  return r
fe80: 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 49 6e 73  c;.}../* .** Ins
fe90: 65 72 74 20 61 20 72 65 63 6f 72 64 20 69 6e 74  ert a record int
fea0: 6f 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74  o the %_segdir t
feb0: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
fec0: 69 6e 74 20 66 74 73 33 57 72 69 74 65 53 65 67  int fts3WriteSeg
fed0: 64 69 72 28 0a 20 20 46 74 73 33 54 61 62 6c 65  dir(.  Fts3Table
fee0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
fef0: 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61         /* Virtua
ff00: 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  l table handle *
ff10: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
ff20: 34 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  4 iLevel,       
ff30: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72      /* Value for
ff40: 20 22 6c 65 76 65 6c 22 20 66 69 65 6c 64 20 28   "level" field (
ff50: 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 29 20  absolute level) 
ff60: 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20  */.  int iIdx,  
ff70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff80: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
ff90: 72 20 22 69 64 78 22 20 66 69 65 6c 64 20 2a 2f  r "idx" field */
ffa0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
ffb0: 20 69 53 74 61 72 74 42 6c 6f 63 6b 2c 20 20 20   iStartBlock,   
ffc0: 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20     /* Value for 
ffd0: 22 73 74 61 72 74 5f 62 6c 6f 63 6b 22 20 66 69  "start_block" fi
ffe0: 65 6c 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  eld */.  sqlite3
fff0: 5f 69 6e 74 36 34 20 69 4c 65 61 66 45 6e 64 42  _int64 iLeafEndB
10000 6c 6f 63 6b 2c 20 20 20 20 2f 2a 20 56 61 6c 75  lock,    /* Valu
10010 65 20 66 6f 72 20 22 6c 65 61 76 65 73 5f 65 6e  e for "leaves_en
10020 64 5f 62 6c 6f 63 6b 22 20 66 69 65 6c 64 20 2a  d_block" field *
10030 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
10040 34 20 69 45 6e 64 42 6c 6f 63 6b 2c 20 20 20 20  4 iEndBlock,    
10050 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72      /* Value for
10060 20 22 65 6e 64 5f 62 6c 6f 63 6b 22 20 66 69 65   "end_block" fie
10070 6c 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ld */.  sqlite3_
10080 69 6e 74 36 34 20 6e 4c 65 61 66 44 61 74 61 2c  int64 nLeafData,
10090 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
100a0 20 6f 66 20 6c 65 61 66 20 64 61 74 61 20 69 6e   of leaf data in
100b0 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 63 68   segment */.  ch
100c0 61 72 20 2a 7a 52 6f 6f 74 2c 20 20 20 20 20 20  ar *zRoot,      
100d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
100e0 20 42 6c 6f 62 20 76 61 6c 75 65 20 66 6f 72 20   Blob value for 
100f0 22 72 6f 6f 74 22 20 66 69 65 6c 64 20 2a 2f 0a  "root" field */.
10100 20 20 69 6e 74 20 6e 52 6f 6f 74 20 20 20 20 20    int nRoot     
10110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10120 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
10130 79 74 65 73 20 69 6e 20 62 75 66 66 65 72 20 7a  ytes in buffer z
10140 52 6f 6f 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  Root */.){.  sql
10150 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
10160 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73  ;.  int rc = fts
10170 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
10180 49 4e 53 45 52 54 5f 53 45 47 44 49 52 2c 20 26  INSERT_SEGDIR, &
10190 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
101a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
101b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  {.    sqlite3_bi
101c0 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  nd_int64(pStmt, 
101d0 31 2c 20 69 4c 65 76 65 6c 29 3b 0a 20 20 20 20  1, iLevel);.    
101e0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
101f0 28 70 53 74 6d 74 2c 20 32 2c 20 69 49 64 78 29  (pStmt, 2, iIdx)
10200 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
10210 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  nd_int64(pStmt, 
10220 33 2c 20 69 53 74 61 72 74 42 6c 6f 63 6b 29 3b  3, iStartBlock);
10230 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
10240 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 34  d_int64(pStmt, 4
10250 2c 20 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 29  , iLeafEndBlock)
10260 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 44  ;.    if( nLeafD
10270 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ata==0 ){.      
10280 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
10290 36 34 28 70 53 74 6d 74 2c 20 35 2c 20 69 45 6e  64(pStmt, 5, iEn
102a0 64 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 7d 65 6c  dBlock);.    }el
102b0 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
102c0 7a 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zEnd = sqlite3_m
102d0 70 72 69 6e 74 66 28 22 25 6c 6c 64 20 25 6c 6c  printf("%lld %ll
102e0 64 22 2c 20 69 45 6e 64 42 6c 6f 63 6b 2c 20 6e  d", iEndBlock, n
102f0 4c 65 61 66 44 61 74 61 29 3b 0a 20 20 20 20 20  LeafData);.     
10300 20 69 66 28 20 21 7a 45 6e 64 20 29 20 72 65 74   if( !zEnd ) ret
10310 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
10320 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
10330 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
10340 20 35 2c 20 7a 45 6e 64 2c 20 2d 31 2c 20 73 71   5, zEnd, -1, sq
10350 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20  lite3_free);.   
10360 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62   }.    sqlite3_b
10370 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  ind_blob(pStmt, 
10380 36 2c 20 7a 52 6f 6f 74 2c 20 6e 52 6f 6f 74 2c  6, zRoot, nRoot,
10390 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
103a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65  .    sqlite3_ste
103b0 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 72 63  p(pStmt);.    rc
103c0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
103d0 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 72  (pStmt);.  }.  r
103e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
103f0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
10400 7a 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e  ze of the common
10410 20 70 72 65 66 69 78 20 28 69 66 20 61 6e 79 29   prefix (if any)
10420 20 73 68 61 72 65 64 20 62 79 20 7a 50 72 65 76   shared by zPrev
10430 20 61 6e 64 0a 2a 2a 20 7a 4e 65 78 74 2c 20 69   and.** zNext, i
10440 6e 20 62 79 74 65 73 2e 20 46 6f 72 20 65 78 61  n bytes. For exa
10450 6d 70 6c 65 2c 20 0a 2a 2a 0a 2a 2a 20 20 20 66  mple, .**.**   f
10460 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73  ts3PrefixCompres
10470 73 28 22 61 62 63 22 2c 20 33 2c 20 22 61 62 63  s("abc", 3, "abc
10480 64 65 66 22 2c 20 36 29 20 20 20 2f 2f 20 72 65  def", 6)   // re
10490 74 75 72 6e 73 20 33 0a 2a 2a 20 20 20 66 74 73  turns 3.**   fts
104a0 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28  3PrefixCompress(
104b0 22 61 62 58 22 2c 20 33 2c 20 22 61 62 63 64 65  "abX", 3, "abcde
104c0 66 22 2c 20 36 29 20 20 20 2f 2f 20 72 65 74 75  f", 6)   // retu
104d0 72 6e 73 20 32 0a 2a 2a 20 20 20 66 74 73 33 50  rns 2.**   fts3P
104e0 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 22 61  refixCompress("a
104f0 62 58 22 2c 20 33 2c 20 22 58 62 63 64 65 66 22  bX", 3, "Xbcdef"
10500 2c 20 36 29 20 20 20 2f 2f 20 72 65 74 75 72 6e  , 6)   // return
10510 73 20 30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  s 0.*/.static in
10520 74 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70  t fts3PrefixComp
10530 72 65 73 73 28 0a 20 20 63 6f 6e 73 74 20 63 68  ress(.  const ch
10540 61 72 20 2a 7a 50 72 65 76 2c 20 20 20 20 20 20  ar *zPrev,      
10550 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
10560 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65  r containing pre
10570 76 69 6f 75 73 20 74 65 72 6d 20 2a 2f 0a 20 20  vious term */.  
10580 69 6e 74 20 6e 50 72 65 76 2c 20 20 20 20 20 20  int nPrev,      
10590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105a0 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
105b0 72 20 7a 50 72 65 76 20 69 6e 20 62 79 74 65 73  r zPrev in bytes
105c0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
105d0 20 2a 7a 4e 65 78 74 2c 20 20 20 20 20 20 20 20   *zNext,        
105e0 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
105f0 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 65 78 74 20  containing next 
10600 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  term */.  int nN
10610 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
10620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
10630 65 20 6f 66 20 62 75 66 66 65 72 20 7a 4e 65 78  e of buffer zNex
10640 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b  t in bytes */.){
10650 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 55 4e 55 53  .  int n;.  UNUS
10660 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 65  ED_PARAMETER(nNe
10670 78 74 29 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20  xt);.  for(n=0; 
10680 6e 3c 6e 50 72 65 76 20 26 26 20 7a 50 72 65 76  n<nPrev && zPrev
10690 5b 6e 5d 3d 3d 7a 4e 65 78 74 5b 6e 5d 3b 20 6e  [n]==zNext[n]; n
106a0 2b 2b 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  ++);.  return n;
106b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 65  .}../*.** Add te
106c0 72 6d 20 7a 54 65 72 6d 20 74 6f 20 74 68 65 20  rm zTerm to the 
106d0 53 65 67 6d 65 6e 74 4e 6f 64 65 2e 20 49 74 20  SegmentNode. It 
106e0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
106f0 61 74 20 7a 54 65 72 6d 20 69 73 20 6c 61 72 67  at zTerm is larg
10700 65 72 0a 2a 2a 20 28 61 63 63 6f 72 64 69 6e 67  er.** (according
10710 20 74 6f 20 6d 65 6d 63 6d 70 29 20 74 68 61 6e   to memcmp) than
10720 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65   the previous te
10730 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rm..*/.static in
10740 74 20 66 74 73 33 4e 6f 64 65 41 64 64 54 65 72  t fts3NodeAddTer
10750 6d 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  m(.  Fts3Table *
10760 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
10770 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
10780 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
10790 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 2a    SegmentNode **
107a0 70 70 54 72 65 65 2c 20 20 20 20 20 20 20 20 20  ppTree,         
107b0 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 65 67    /* IN/OUT: Seg
107c0 6d 65 6e 74 4e 6f 64 65 20 68 61 6e 64 6c 65 20  mentNode handle 
107d0 2a 2f 20 0a 20 20 69 6e 74 20 69 73 43 6f 70 79  */ .  int isCopy
107e0 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
107f0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
10800 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 20 69 73 20   zTerm/nTerm is 
10810 74 72 61 6e 73 69 65 6e 74 20 2a 2f 0a 20 20 63  transient */.  c
10820 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
10830 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
10840 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
10850 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
10860 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  erm */.  int nTe
10870 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rm              
10880 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
10890 20 6f 66 20 74 65 72 6d 20 69 6e 20 62 79 74 65   of term in byte
108a0 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 67 6d 65 6e  s */.){.  Segmen
108b0 74 4e 6f 64 65 20 2a 70 54 72 65 65 20 3d 20 2a  tNode *pTree = *
108c0 70 70 54 72 65 65 3b 0a 20 20 69 6e 74 20 72 63  ppTree;.  int rc
108d0 3b 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20  ;.  SegmentNode 
108e0 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a 20 46 69 72  *pNew;..  /* Fir
108f0 73 74 20 74 72 79 20 74 6f 20 61 70 70 65 6e 64  st try to append
10900 20 74 68 65 20 74 65 72 6d 20 74 6f 20 74 68 65   the term to the
10910 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 2e 20 52   current node. R
10920 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 0a  eturn early if .
10930 20 20 2a 2a 20 74 68 69 73 20 69 73 20 70 6f 73    ** this is pos
10940 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  sible..  */.  if
10950 28 20 70 54 72 65 65 20 29 7b 0a 20 20 20 20 69  ( pTree ){.    i
10960 6e 74 20 6e 44 61 74 61 20 3d 20 70 54 72 65 65  nt nData = pTree
10970 2d 3e 6e 44 61 74 61 3b 20 20 20 20 20 2f 2a 20  ->nData;     /* 
10980 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  Current size of 
10990 6e 6f 64 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  node in bytes */
109a0 0a 20 20 20 20 69 6e 74 20 6e 52 65 71 20 3d 20  .    int nReq = 
109b0 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  nData;          
109c0 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 73     /* Required s
109d0 70 61 63 65 20 61 66 74 65 72 20 61 64 64 69 6e  pace after addin
109e0 67 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 20 20 69  g zTerm */.    i
109f0 6e 74 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20  nt nPrefix;     
10a00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10a10 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
10a20 6f 66 20 70 72 65 66 69 78 20 63 6f 6d 70 72 65  of prefix compre
10a30 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  ssion */.    int
10a40 20 6e 53 75 66 66 69 78 3b 20 20 20 20 20 20 20   nSuffix;       
10a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
10a60 66 66 69 78 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a  ffix length */..
10a70 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20 66 74      nPrefix = ft
10a80 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73  s3PrefixCompress
10a90 28 70 54 72 65 65 2d 3e 7a 54 65 72 6d 2c 20 70  (pTree->zTerm, p
10aa0 54 72 65 65 2d 3e 6e 54 65 72 6d 2c 20 7a 54 65  Tree->nTerm, zTe
10ab0 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20  rm, nTerm);.    
10ac0 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d 2d  nSuffix = nTerm-
10ad0 6e 50 72 65 66 69 78 3b 0a 0a 20 20 20 20 6e 52  nPrefix;..    nR
10ae0 65 71 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  eq += sqlite3Fts
10af0 33 56 61 72 69 6e 74 4c 65 6e 28 6e 50 72 65 66  3VarintLen(nPref
10b00 69 78 29 2b 73 71 6c 69 74 65 33 46 74 73 33 56  ix)+sqlite3Fts3V
10b10 61 72 69 6e 74 4c 65 6e 28 6e 53 75 66 66 69 78  arintLen(nSuffix
10b20 29 2b 6e 53 75 66 66 69 78 3b 0a 20 20 20 20 69  )+nSuffix;.    i
10b30 66 28 20 6e 52 65 71 3c 3d 70 2d 3e 6e 4e 6f 64  f( nReq<=p->nNod
10b40 65 53 69 7a 65 20 7c 7c 20 21 70 54 72 65 65 2d  eSize || !pTree-
10b50 3e 7a 54 65 72 6d 20 29 7b 0a 0a 20 20 20 20 20  >zTerm ){..     
10b60 20 69 66 28 20 6e 52 65 71 3e 70 2d 3e 6e 4e 6f   if( nReq>p->nNo
10b70 64 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  deSize ){.      
10b80 20 20 2f 2a 20 41 6e 20 75 6e 75 73 75 61 6c 20    /* An unusual 
10b90 63 61 73 65 3a 20 74 68 69 73 20 69 73 20 74 68  case: this is th
10ba0 65 20 66 69 72 73 74 20 74 65 72 6d 20 74 6f 20  e first term to 
10bb0 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
10bc0 6e 6f 64 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  node.        ** 
10bd0 61 6e 64 20 74 68 65 20 73 74 61 74 69 63 20 6e  and the static n
10be0 6f 64 65 20 62 75 66 66 65 72 20 28 70 2d 3e 6e  ode buffer (p->n
10bf0 4e 6f 64 65 53 69 7a 65 20 62 79 74 65 73 29 20  NodeSize bytes) 
10c00 69 73 20 6e 6f 74 20 6c 61 72 67 65 0a 20 20 20  is not large.   
10c10 20 20 20 20 20 2a 2a 20 65 6e 6f 75 67 68 2e 20       ** enough. 
10c20 55 73 65 20 61 20 73 65 70 61 72 61 74 65 6c 79  Use a separately
10c30 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66 66 65 72   malloced buffer
10c40 20 69 6e 73 74 65 61 64 20 54 68 69 73 20 77 61   instead This wa
10c50 73 74 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  stes.        ** 
10c60 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 62 79 74  p->nNodeSize byt
10c70 65 73 2c 20 62 75 74 20 73 69 6e 63 65 20 74 68  es, but since th
10c80 69 73 20 73 63 65 6e 61 72 69 6f 20 6f 6e 6c 79  is scenario only
10c90 20 63 6f 6d 65 73 20 61 62 6f 75 74 20 77 68 65   comes about whe
10ca0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  n.        ** the
10cb0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
10cc0 6e 20 74 77 6f 20 74 65 72 6d 73 20 74 68 61 74  n two terms that
10cd0 20 73 68 61 72 65 20 61 20 70 72 65 66 69 78 20   share a prefix 
10ce0 6f 66 20 61 6c 6d 6f 73 74 20 32 4b 42 2c 20 0a  of almost 2KB, .
10cf0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
10d00 69 73 20 6e 6f 74 20 65 78 70 65 63 74 65 64 20  is not expected 
10d10 74 6f 20 62 65 20 61 20 73 65 72 69 6f 75 73 20  to be a serious 
10d20 70 72 6f 62 6c 65 6d 2e 20 0a 20 20 20 20 20 20  problem. .      
10d30 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
10d40 65 72 74 28 20 70 54 72 65 65 2d 3e 61 44 61 74  ert( pTree->aDat
10d50 61 3d 3d 28 63 68 61 72 20 2a 29 26 70 54 72 65  a==(char *)&pTre
10d60 65 5b 31 5d 20 29 3b 0a 20 20 20 20 20 20 20 20  e[1] );.        
10d70 70 54 72 65 65 2d 3e 61 44 61 74 61 20 3d 20 28  pTree->aData = (
10d80 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  char *)sqlite3_m
10d90 61 6c 6c 6f 63 28 6e 52 65 71 29 3b 0a 20 20 20  alloc(nReq);.   
10da0 20 20 20 20 20 69 66 28 20 21 70 54 72 65 65 2d       if( !pTree-
10db0 3e 61 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  >aData ){.      
10dc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10dd0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
10de0 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
10df0 20 20 69 66 28 20 70 54 72 65 65 2d 3e 7a 54 65    if( pTree->zTe
10e00 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  rm ){.        /*
10e10 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70 72 65   There is no pre
10e20 66 69 78 2d 6c 65 6e 67 74 68 20 66 69 65 6c 64  fix-length field
10e30 20 66 6f 72 20 66 69 72 73 74 20 74 65 72 6d 20   for first term 
10e40 69 6e 20 61 20 6e 6f 64 65 20 2a 2f 0a 20 20 20  in a node */.   
10e50 20 20 20 20 20 6e 44 61 74 61 20 2b 3d 20 73 71       nData += sq
10e60 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69  lite3Fts3PutVari
10e70 6e 74 28 26 70 54 72 65 65 2d 3e 61 44 61 74 61  nt(&pTree->aData
10e80 5b 6e 44 61 74 61 5d 2c 20 6e 50 72 65 66 69 78  [nData], nPrefix
10e90 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
10ea0 20 20 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69 74    nData += sqlit
10eb0 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28  e3Fts3PutVarint(
10ec0 26 70 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e 44  &pTree->aData[nD
10ed0 61 74 61 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a  ata], nSuffix);.
10ee0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 54        memcpy(&pT
10ef0 72 65 65 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61  ree->aData[nData
10f00 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50 72 65 66 69  ], &zTerm[nPrefi
10f10 78 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20  x], nSuffix);.  
10f20 20 20 20 20 70 54 72 65 65 2d 3e 6e 44 61 74 61      pTree->nData
10f30 20 3d 20 6e 44 61 74 61 20 2b 20 6e 53 75 66 66   = nData + nSuff
10f40 69 78 3b 0a 20 20 20 20 20 20 70 54 72 65 65 2d  ix;.      pTree-
10f50 3e 6e 45 6e 74 72 79 2b 2b 3b 0a 0a 20 20 20 20  >nEntry++;..    
10f60 20 20 69 66 28 20 69 73 43 6f 70 79 54 65 72 6d    if( isCopyTerm
10f70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
10f80 70 54 72 65 65 2d 3e 6e 4d 61 6c 6c 6f 63 3c 6e  pTree->nMalloc<n
10f90 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Term ){.        
10fa0 20 20 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20 73    char *zNew = s
10fb0 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
10fc0 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 2c 20 6e  Tree->zMalloc, n
10fd0 54 65 72 6d 2a 32 29 3b 0a 20 20 20 20 20 20 20  Term*2);.       
10fe0 20 20 20 69 66 28 20 21 7a 4e 65 77 20 29 7b 0a     if( !zNew ){.
10ff0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
11000 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
11010 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
11020 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e 6e 4d         pTree->nM
11030 61 6c 6c 6f 63 20 3d 20 6e 54 65 72 6d 2a 32 3b  alloc = nTerm*2;
11040 0a 20 20 20 20 20 20 20 20 20 20 70 54 72 65 65  .          pTree
11050 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 7a 4e 65 77  ->zMalloc = zNew
11060 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11070 20 20 20 20 70 54 72 65 65 2d 3e 7a 54 65 72 6d      pTree->zTerm
11080 20 3d 20 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f   = pTree->zMallo
11090 63 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  c;.        memcp
110a0 79 28 70 54 72 65 65 2d 3e 7a 54 65 72 6d 2c 20  y(pTree->zTerm, 
110b0 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  zTerm, nTerm);. 
110c0 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e 6e 54         pTree->nT
110d0 65 72 6d 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20  erm = nTerm;.   
110e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
110f0 20 20 70 54 72 65 65 2d 3e 7a 54 65 72 6d 20 3d    pTree->zTerm =
11100 20 28 63 68 61 72 20 2a 29 7a 54 65 72 6d 3b 0a   (char *)zTerm;.
11110 20 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e 6e          pTree->n
11120 54 65 72 6d 20 3d 20 6e 54 65 72 6d 3b 0a 20 20  Term = nTerm;.  
11130 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
11140 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
11150 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
11160 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74   control flows t
11170 6f 20 68 65 72 65 2c 20 69 74 20 77 61 73 20 6e  o here, it was n
11180 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  ot possible to a
11190 70 70 65 6e 64 20 7a 54 65 72 6d 20 74 6f 20 74  ppend zTerm to t
111a0 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
111b0 6e 6f 64 65 2e 20 43 72 65 61 74 65 20 61 20 6e  node. Create a n
111c0 65 77 20 6e 6f 64 65 20 28 61 20 72 69 67 68 74  ew node (a right
111d0 2d 73 69 62 6c 69 6e 67 20 6f 66 20 74 68 65 20  -sibling of the 
111e0 63 75 72 72 65 6e 74 20 6e 6f 64 65 29 2e 0a 20  current node).. 
111f0 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   ** If this is t
11200 68 65 20 66 69 72 73 74 20 6e 6f 64 65 20 69 6e  he first node in
11210 20 74 68 65 20 74 72 65 65 2c 20 74 68 65 20 74   the tree, the t
11220 65 72 6d 20 69 73 20 61 64 64 65 64 20 74 6f 20  erm is added to 
11230 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 74  it..  **.  ** Ot
11240 68 65 72 77 69 73 65 2c 20 74 68 65 20 74 65 72  herwise, the ter
11250 6d 20 69 73 20 6e 6f 74 20 61 64 64 65 64 20 74  m is not added t
11260 6f 20 74 68 65 20 6e 65 77 20 6e 6f 64 65 2c 20  o the new node, 
11270 69 74 20 69 73 20 6c 65 66 74 20 65 6d 70 74 79  it is left empty
11280 20 66 6f 72 0a 20 20 2a 2a 20 6e 6f 77 2e 20 49   for.  ** now. I
11290 6e 73 74 65 61 64 2c 20 74 68 65 20 74 65 72 6d  nstead, the term
112a0 20 69 73 20 69 6e 73 65 72 74 65 64 20 69 6e 74   is inserted int
112b0 6f 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  o the parent of 
112c0 70 54 72 65 65 2e 20 49 66 20 70 54 72 65 65 20  pTree. If pTree 
112d0 0a 20 20 2a 2a 20 68 61 73 20 6e 6f 20 70 61 72  .  ** has no par
112e0 65 6e 74 2c 20 6f 6e 65 20 69 73 20 63 72 65 61  ent, one is crea
112f0 74 65 64 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  ted here..  */. 
11300 20 70 4e 65 77 20 3d 20 28 53 65 67 6d 65 6e 74   pNew = (Segment
11310 4e 6f 64 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d  Node *)sqlite3_m
11320 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 53 65 67  alloc(sizeof(Seg
11330 6d 65 6e 74 4e 6f 64 65 29 20 2b 20 70 2d 3e 6e  mentNode) + p->n
11340 4e 6f 64 65 53 69 7a 65 29 3b 0a 20 20 69 66 28  NodeSize);.  if(
11350 20 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 72 65   !pNew ){.    re
11360 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
11370 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  M;.  }.  memset(
11380 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pNew, 0, sizeof(
11390 53 65 67 6d 65 6e 74 4e 6f 64 65 29 29 3b 0a 20  SegmentNode));. 
113a0 20 70 4e 65 77 2d 3e 6e 44 61 74 61 20 3d 20 31   pNew->nData = 1
113b0 20 2b 20 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d   + FTS3_VARINT_M
113c0 41 58 3b 0a 20 20 70 4e 65 77 2d 3e 61 44 61 74  AX;.  pNew->aDat
113d0 61 20 3d 20 28 63 68 61 72 20 2a 29 26 70 4e 65  a = (char *)&pNe
113e0 77 5b 31 5d 3b 0a 0a 20 20 69 66 28 20 70 54 72  w[1];..  if( pTr
113f0 65 65 20 29 7b 0a 20 20 20 20 53 65 67 6d 65 6e  ee ){.    Segmen
11400 74 4e 6f 64 65 20 2a 70 50 61 72 65 6e 74 20 3d  tNode *pParent =
11410 20 70 54 72 65 65 2d 3e 70 50 61 72 65 6e 74 3b   pTree->pParent;
11420 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 4e 6f  .    rc = fts3No
11430 64 65 41 64 64 54 65 72 6d 28 70 2c 20 26 70 50  deAddTerm(p, &pP
11440 61 72 65 6e 74 2c 20 69 73 43 6f 70 79 54 65 72  arent, isCopyTer
11450 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29  m, zTerm, nTerm)
11460 3b 0a 20 20 20 20 69 66 28 20 70 54 72 65 65 2d  ;.    if( pTree-
11470 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20  >pParent==0 ){. 
11480 20 20 20 20 20 70 54 72 65 65 2d 3e 70 50 61 72       pTree->pPar
11490 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20  ent = pParent;. 
114a0 20 20 20 7d 0a 20 20 20 20 70 54 72 65 65 2d 3e     }.    pTree->
114b0 70 52 69 67 68 74 20 3d 20 70 4e 65 77 3b 0a 20  pRight = pNew;. 
114c0 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 6d 6f     pNew->pLeftmo
114d0 73 74 20 3d 20 70 54 72 65 65 2d 3e 70 4c 65 66  st = pTree->pLef
114e0 74 6d 6f 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d  tmost;.    pNew-
114f0 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65  >pParent = pPare
11500 6e 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4d  nt;.    pNew->zM
11510 61 6c 6c 6f 63 20 3d 20 70 54 72 65 65 2d 3e 7a  alloc = pTree->z
11520 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20 70 4e 65 77  Malloc;.    pNew
11530 2d 3e 6e 4d 61 6c 6c 6f 63 20 3d 20 70 54 72 65  ->nMalloc = pTre
11540 65 2d 3e 6e 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20  e->nMalloc;.    
11550 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d  pTree->zMalloc =
11560 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
11570 20 70 4e 65 77 2d 3e 70 4c 65 66 74 6d 6f 73 74   pNew->pLeftmost
11580 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72 63 20   = pNew;.    rc 
11590 3d 20 66 74 73 33 4e 6f 64 65 41 64 64 54 65 72  = fts3NodeAddTer
115a0 6d 28 70 2c 20 26 70 4e 65 77 2c 20 69 73 43 6f  m(p, &pNew, isCo
115b0 70 79 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e  pyTerm, zTerm, n
115c0 54 65 72 6d 29 3b 20 0a 20 20 7d 0a 0a 20 20 2a  Term); .  }..  *
115d0 70 70 54 72 65 65 20 3d 20 70 4e 65 77 3b 0a 20  ppTree = pNew;. 
115e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
115f0 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
11600 74 69 6f 6e 20 66 6f 72 20 66 74 73 33 4e 6f 64  tion for fts3Nod
11610 65 57 72 69 74 65 28 29 2e 0a 2a 2f 0a 73 74 61  eWrite()..*/.sta
11620 74 69 63 20 69 6e 74 20 66 74 73 33 54 72 65 65  tic int fts3Tree
11630 46 69 6e 69 73 68 4e 6f 64 65 28 0a 20 20 53 65  FinishNode(.  Se
11640 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65  gmentNode *pTree
11650 2c 20 0a 20 20 69 6e 74 20 69 48 65 69 67 68 74  , .  int iHeight
11660 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  , .  sqlite3_int
11670 36 34 20 69 4c 65 66 74 43 68 69 6c 64 0a 29 7b  64 iLeftChild.){
11680 0a 20 20 69 6e 74 20 6e 53 74 61 72 74 3b 0a 20  .  int nStart;. 
11690 20 61 73 73 65 72 74 28 20 69 48 65 69 67 68 74   assert( iHeight
116a0 3e 3d 31 20 26 26 20 69 48 65 69 67 68 74 3c 31  >=1 && iHeight<1
116b0 32 38 20 29 3b 0a 20 20 6e 53 74 61 72 74 20 3d  28 );.  nStart =
116c0 20 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58   FTS3_VARINT_MAX
116d0 20 2d 20 73 71 6c 69 74 65 33 46 74 73 33 56 61   - sqlite3Fts3Va
116e0 72 69 6e 74 4c 65 6e 28 69 4c 65 66 74 43 68 69  rintLen(iLeftChi
116f0 6c 64 29 3b 0a 20 20 70 54 72 65 65 2d 3e 61 44  ld);.  pTree->aD
11700 61 74 61 5b 6e 53 74 61 72 74 5d 20 3d 20 28 63  ata[nStart] = (c
11710 68 61 72 29 69 48 65 69 67 68 74 3b 0a 20 20 73  har)iHeight;.  s
11720 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72  qlite3Fts3PutVar
11730 69 6e 74 28 26 70 54 72 65 65 2d 3e 61 44 61 74  int(&pTree->aDat
11740 61 5b 6e 53 74 61 72 74 2b 31 5d 2c 20 69 4c 65  a[nStart+1], iLe
11750 66 74 43 68 69 6c 64 29 3b 0a 20 20 72 65 74 75  ftChild);.  retu
11760 72 6e 20 6e 53 74 61 72 74 3b 0a 7d 0a 0a 2f 2a  rn nStart;.}../*
11770 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 62 75  .** Write the bu
11780 66 66 65 72 20 66 6f 72 20 74 68 65 20 73 65 67  ffer for the seg
11790 6d 65 6e 74 20 6e 6f 64 65 20 70 54 72 65 65 20  ment node pTree 
117a0 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 70  and all of its p
117b0 65 65 72 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64  eers to the.** d
117c0 61 74 61 62 61 73 65 2e 20 54 68 65 6e 20 63 61  atabase. Then ca
117d0 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
117e0 20 72 65 63 75 72 73 69 76 65 6c 79 20 74 6f 20   recursively to 
117f0 77 72 69 74 65 20 74 68 65 20 70 61 72 65 6e 74  write the parent
11800 20 6f 66 20 0a 2a 2a 20 70 54 72 65 65 20 61 6e   of .** pTree an
11810 64 20 69 74 73 20 70 65 65 72 73 20 74 6f 20 74  d its peers to t
11820 68 65 20 64 61 74 61 62 61 73 65 2e 20 0a 2a 2a  he database. .**
11830 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 70  .** Except, if p
11840 54 72 65 65 20 69 73 20 61 20 72 6f 6f 74 20 6e  Tree is a root n
11850 6f 64 65 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74  ode, do not writ
11860 65 20 69 74 20 74 6f 20 74 68 65 20 64 61 74 61  e it to the data
11870 62 61 73 65 2e 20 49 6e 73 74 65 61 64 2c 0a 2a  base. Instead,.*
11880 2a 20 73 65 74 20 6f 75 74 70 75 74 20 76 61 72  * set output var
11890 69 61 62 6c 65 73 20 2a 70 61 52 6f 6f 74 20 61  iables *paRoot a
118a0 6e 64 20 2a 70 6e 52 6f 6f 74 20 74 6f 20 63 6f  nd *pnRoot to co
118b0 6e 74 61 69 6e 20 74 68 65 20 72 6f 6f 74 20 6e  ntain the root n
118c0 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ode..**.** If su
118d0 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
118e0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
118f0 61 6e 64 20 6f 75 74 70 75 74 20 76 61 72 69 61  and output varia
11900 62 6c 65 20 2a 70 69 4c 61 73 74 20 69 73 0a 2a  ble *piLast is.*
11910 2a 20 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72  * set to the lar
11920 67 65 73 74 20 62 6c 6f 63 6b 69 64 20 77 72 69  gest blockid wri
11930 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
11940 62 61 73 65 20 28 6f 72 20 7a 65 72 6f 20 69 66  base (or zero if
11950 20 6e 6f 0a 2a 2a 20 62 6c 6f 63 6b 73 20 77 65   no.** blocks we
11960 72 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  re written to th
11970 65 20 64 62 29 2e 20 4f 74 68 65 72 77 69 73 65  e db). Otherwise
11980 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
11990 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65  r code is .** re
119a0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
119b0 63 20 69 6e 74 20 66 74 73 33 4e 6f 64 65 57 72  c int fts3NodeWr
119c0 69 74 65 28 0a 20 20 46 74 73 33 54 61 62 6c 65  ite(.  Fts3Table
119d0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
119e0 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61         /* Virtua
119f0 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  l table handle *
11a00 2f 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20  /.  SegmentNode 
11a10 2a 70 54 72 65 65 2c 20 20 20 20 20 20 20 20 20  *pTree,         
11a20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 4e 6f      /* SegmentNo
11a30 64 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  de handle */.  i
11a40 6e 74 20 69 48 65 69 67 68 74 2c 20 20 20 20 20  nt iHeight,     
11a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11a60 2a 20 48 65 69 67 68 74 20 6f 66 20 74 68 69 73  * Height of this
11a70 20 6e 6f 64 65 20 69 6e 20 74 72 65 65 20 2a 2f   node in tree */
11a80 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
11a90 20 69 4c 65 61 66 2c 20 20 20 20 20 20 20 20 20   iLeaf,         
11aa0 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 69 64 20 6f     /* Block id o
11ab0 66 20 66 69 72 73 74 20 6c 65 61 66 20 6e 6f 64  f first leaf nod
11ac0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
11ad0 6e 74 36 34 20 69 46 72 65 65 2c 20 20 20 20 20  nt64 iFree,     
11ae0 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20         /* Block 
11af0 69 64 20 6f 66 20 6e 65 78 74 20 66 72 65 65 20  id of next free 
11b00 73 6c 6f 74 20 69 6e 20 25 5f 73 65 67 6d 65 6e  slot in %_segmen
11b10 74 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ts */.  sqlite3_
11b20 69 6e 74 36 34 20 2a 70 69 4c 61 73 74 2c 20 20  int64 *piLast,  
11b30 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
11b40 42 6c 6f 63 6b 20 69 64 20 6f 66 20 6c 61 73 74  Block id of last
11b50 20 65 6e 74 72 79 20 77 72 69 74 74 65 6e 20 2a   entry written *
11b60 2f 0a 20 20 63 68 61 72 20 2a 2a 70 61 52 6f 6f  /.  char **paRoo
11b70 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
11b80 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 61 74 61      /* OUT: Data
11b90 20 66 6f 72 20 72 6f 6f 74 20 6e 6f 64 65 20 2a   for root node *
11ba0 2f 0a 20 20 69 6e 74 20 2a 70 6e 52 6f 6f 74 20  /.  int *pnRoot 
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bc0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65      /* OUT: Size
11bd0 20 6f 66 20 72 6f 6f 74 20 6e 6f 64 65 20 69 6e   of root node in
11be0 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69   bytes */.){.  i
11bf0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
11c00 4b 3b 0a 0a 20 20 69 66 28 20 21 70 54 72 65 65  K;..  if( !pTree
11c10 2d 3e 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  ->pParent ){.   
11c20 20 2f 2a 20 52 6f 6f 74 20 6e 6f 64 65 20 6f 66   /* Root node of
11c30 20 74 68 65 20 74 72 65 65 2e 20 2a 2f 0a 20 20   the tree. */.  
11c40 20 20 69 6e 74 20 6e 53 74 61 72 74 20 3d 20 66    int nStart = f
11c50 74 73 33 54 72 65 65 46 69 6e 69 73 68 4e 6f 64  ts3TreeFinishNod
11c60 65 28 70 54 72 65 65 2c 20 69 48 65 69 67 68 74  e(pTree, iHeight
11c70 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20 20 2a 70  , iLeaf);.    *p
11c80 69 4c 61 73 74 20 3d 20 69 46 72 65 65 2d 31 3b  iLast = iFree-1;
11c90 0a 20 20 20 20 2a 70 6e 52 6f 6f 74 20 3d 20 70  .    *pnRoot = p
11ca0 54 72 65 65 2d 3e 6e 44 61 74 61 20 2d 20 6e 53  Tree->nData - nS
11cb0 74 61 72 74 3b 0a 20 20 20 20 2a 70 61 52 6f 6f  tart;.    *paRoo
11cc0 74 20 3d 20 26 70 54 72 65 65 2d 3e 61 44 61 74  t = &pTree->aDat
11cd0 61 5b 6e 53 74 61 72 74 5d 3b 0a 20 20 7d 65 6c  a[nStart];.  }el
11ce0 73 65 7b 0a 20 20 20 20 53 65 67 6d 65 6e 74 4e  se{.    SegmentN
11cf0 6f 64 65 20 2a 70 49 74 65 72 3b 0a 20 20 20 20  ode *pIter;.    
11d00 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4e  sqlite3_int64 iN
11d10 65 78 74 46 72 65 65 20 3d 20 69 46 72 65 65 3b  extFree = iFree;
11d20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
11d30 36 34 20 69 4e 65 78 74 4c 65 61 66 20 3d 20 69  64 iNextLeaf = i
11d40 4c 65 61 66 3b 0a 20 20 20 20 66 6f 72 28 70 49  Leaf;.    for(pI
11d50 74 65 72 3d 70 54 72 65 65 2d 3e 70 4c 65 66 74  ter=pTree->pLeft
11d60 6d 6f 73 74 3b 20 70 49 74 65 72 20 26 26 20 72  most; pIter && r
11d70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 49  c==SQLITE_OK; pI
11d80 74 65 72 3d 70 49 74 65 72 2d 3e 70 52 69 67 68  ter=pIter->pRigh
11d90 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 53  t){.      int nS
11da0 74 61 72 74 20 3d 20 66 74 73 33 54 72 65 65 46  tart = fts3TreeF
11db0 69 6e 69 73 68 4e 6f 64 65 28 70 49 74 65 72 2c  inishNode(pIter,
11dc0 20 69 48 65 69 67 68 74 2c 20 69 4e 65 78 74 4c   iHeight, iNextL
11dd0 65 61 66 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  eaf);.      int 
11de0 6e 57 72 69 74 65 20 3d 20 70 49 74 65 72 2d 3e  nWrite = pIter->
11df0 6e 44 61 74 61 20 2d 20 6e 53 74 61 72 74 3b 0a  nData - nStart;.
11e00 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74    .      rc = ft
11e10 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28 70  s3WriteSegment(p
11e20 2c 20 69 4e 65 78 74 46 72 65 65 2c 20 26 70 49  , iNextFree, &pI
11e30 74 65 72 2d 3e 61 44 61 74 61 5b 6e 53 74 61 72  ter->aData[nStar
11e40 74 5d 2c 20 6e 57 72 69 74 65 29 3b 0a 20 20 20  t], nWrite);.   
11e50 20 20 20 69 4e 65 78 74 46 72 65 65 2b 2b 3b 0a     iNextFree++;.
11e60 20 20 20 20 20 20 69 4e 65 78 74 4c 65 61 66 20        iNextLeaf 
11e70 2b 3d 20 28 70 49 74 65 72 2d 3e 6e 45 6e 74 72  += (pIter->nEntr
11e80 79 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  y+1);.    }.    
11e90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11ea0 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
11eb0 74 28 20 69 4e 65 78 74 4c 65 61 66 3d 3d 69 46  t( iNextLeaf==iF
11ec0 72 65 65 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ree );.      rc 
11ed0 3d 20 66 74 73 33 4e 6f 64 65 57 72 69 74 65 28  = fts3NodeWrite(
11ee0 0a 20 20 20 20 20 20 20 20 20 20 70 2c 20 70 54  .          p, pT
11ef0 72 65 65 2d 3e 70 50 61 72 65 6e 74 2c 20 69 48  ree->pParent, iH
11f00 65 69 67 68 74 2b 31 2c 20 69 46 72 65 65 2c 20  eight+1, iFree, 
11f10 69 4e 65 78 74 46 72 65 65 2c 20 70 69 4c 61 73  iNextFree, piLas
11f20 74 2c 20 70 61 52 6f 6f 74 2c 20 70 6e 52 6f 6f  t, paRoot, pnRoo
11f30 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  t.      );.    }
11f40 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
11f50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  c;.}../*.** Free
11f60 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   all memory allo
11f70 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74  cations associat
11f80 65 64 20 77 69 74 68 20 74 68 65 20 74 72 65 65  ed with the tree
11f90 20 70 54 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69   pTree..*/.stati
11fa0 63 20 76 6f 69 64 20 66 74 73 33 4e 6f 64 65 46  c void fts3NodeF
11fb0 72 65 65 28 53 65 67 6d 65 6e 74 4e 6f 64 65 20  ree(SegmentNode 
11fc0 2a 70 54 72 65 65 29 7b 0a 20 20 69 66 28 20 70  *pTree){.  if( p
11fd0 54 72 65 65 20 29 7b 0a 20 20 20 20 53 65 67 6d  Tree ){.    Segm
11fe0 65 6e 74 4e 6f 64 65 20 2a 70 20 3d 20 70 54 72  entNode *p = pTr
11ff0 65 65 2d 3e 70 4c 65 66 74 6d 6f 73 74 3b 0a 20  ee->pLeftmost;. 
12000 20 20 20 66 74 73 33 4e 6f 64 65 46 72 65 65 28     fts3NodeFree(
12010 70 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20  p->pParent);.   
12020 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
12030 20 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a     SegmentNode *
12040 70 52 69 67 68 74 20 3d 20 70 2d 3e 70 52 69 67  pRight = p->pRig
12050 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ht;.      if( p-
12060 3e 61 44 61 74 61 21 3d 28 63 68 61 72 20 2a 29  >aData!=(char *)
12070 26 70 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20  &p[1] ){.       
12080 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
12090 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d  >aData);.      }
120a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
120b0 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e 7a  Right==0 || p->z
120c0 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 20  Malloc==0 );.   
120d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
120e0 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  p->zMalloc);.   
120f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12100 70 29 3b 0a 20 20 20 20 20 20 70 20 3d 20 70 52  p);.      p = pR
12110 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ight;.    }.  }.
12120 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 74  }../*.** Add a t
12130 65 72 6d 20 74 6f 20 74 68 65 20 73 65 67 6d 65  erm to the segme
12140 6e 74 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  nt being constru
12150 63 74 65 64 20 62 79 20 74 68 65 20 53 65 67 6d  cted by the Segm
12160 65 6e 74 57 72 69 74 65 72 20 6f 62 6a 65 63 74  entWriter object
12170 0a 2a 2a 20 2a 70 70 57 72 69 74 65 72 2e 20 57  .** *ppWriter. W
12180 68 65 6e 20 61 64 64 69 6e 67 20 74 68 65 20 66  hen adding the f
12190 69 72 73 74 20 74 65 72 6d 20 74 6f 20 61 20 73  irst term to a s
121a0 65 67 6d 65 6e 74 2c 20 2a 70 70 57 72 69 74 65  egment, *ppWrite
121b0 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 70  r should.** be p
121c0 61 73 73 65 64 20 4e 55 4c 4c 2e 20 54 68 69 73  assed NULL. This
121d0 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61   function will a
121e0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 53 65  llocate a new Se
121f0 67 6d 65 6e 74 57 72 69 74 65 72 20 6f 62 6a 65  gmentWriter obje
12200 63 74 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e  ct.** and return
12210 20 69 74 20 76 69 61 20 74 68 65 20 69 6e 70 75   it via the inpu
12220 74 2f 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  t/output variabl
12230 65 20 2a 70 70 57 72 69 74 65 72 20 69 6e 20 74  e *ppWriter in t
12240 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
12250 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
12260 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
12270 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
12280 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
12290 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
122a0 20 69 6e 74 20 66 74 73 33 53 65 67 57 72 69 74   int fts3SegWrit
122b0 65 72 41 64 64 28 0a 20 20 46 74 73 33 54 61 62  erAdd(.  Fts3Tab
122c0 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
122d0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74           /* Virt
122e0 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  ual table handle
122f0 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 57 72 69   */.  SegmentWri
12300 74 65 72 20 2a 2a 70 70 57 72 69 74 65 72 2c 20  ter **ppWriter, 
12310 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
12320 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 68   SegmentWriter h
12330 61 6e 64 6c 65 20 2a 2f 20 0a 20 20 69 6e 74 20  andle */ .  int 
12340 69 73 43 6f 70 79 54 65 72 6d 2c 20 20 20 20 20  isCopyTerm,     
12350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12360 72 75 65 20 69 66 20 62 75 66 66 65 72 20 7a 54  rue if buffer zT
12370 65 72 6d 20 6d 75 73 74 20 62 65 20 63 6f 70 69  erm must be copi
12380 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
12390 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20  ar *zTerm,      
123a0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
123b0 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e  er to buffer con
123c0 74 61 69 6e 69 6e 67 20 74 65 72 6d 20 2a 2f 0a  taining term */.
123d0 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20    int nTerm,    
123e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123f0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72    /* Size of ter
12400 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  m in bytes */.  
12410 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44 6f 63  const char *aDoc
12420 6c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  list,           
12430 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
12440 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
12450 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  doclist */.  int
12460 20 6e 44 6f 63 6c 69 73 74 20 20 20 20 20 20 20   nDoclist       
12470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12480 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20  Size of doclist 
12490 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20  in bytes */.){. 
124a0 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20 20 20   int nPrefix;   
124b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124c0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d   /* Size of term
124d0 20 70 72 65 66 69 78 20 69 6e 20 62 79 74 65 73   prefix in bytes
124e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 66 66 69   */.  int nSuffi
124f0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
12500 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
12510 20 74 65 72 6d 20 73 75 66 66 69 78 20 69 6e 20   term suffix in 
12520 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  bytes */.  int n
12530 52 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  Req;            
12540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
12550 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
12560 71 75 69 72 65 64 20 6f 6e 20 6c 65 61 66 20 70  quired on leaf p
12570 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61  age */.  int nDa
12580 74 61 3b 0a 20 20 53 65 67 6d 65 6e 74 57 72 69  ta;.  SegmentWri
12590 74 65 72 20 2a 70 57 72 69 74 65 72 20 3d 20 2a  ter *pWriter = *
125a0 70 70 57 72 69 74 65 72 3b 0a 0a 20 20 69 66 28  ppWriter;..  if(
125b0 20 21 70 57 72 69 74 65 72 20 29 7b 0a 20 20 20   !pWriter ){.   
125c0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 73 71 6c   int rc;.    sql
125d0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
125e0 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  ;..    /* Alloca
125f0 74 65 20 74 68 65 20 53 65 67 6d 65 6e 74 57 72  te the SegmentWr
12600 69 74 65 72 20 73 74 72 75 63 74 75 72 65 20 2a  iter structure *
12610 2f 0a 20 20 20 20 70 57 72 69 74 65 72 20 3d 20  /.    pWriter = 
12620 28 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 2a  (SegmentWriter *
12630 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
12640 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e 74 57 72  sizeof(SegmentWr
12650 69 74 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20  iter));.    if( 
12660 21 70 57 72 69 74 65 72 20 29 20 72 65 74 75 72  !pWriter ) retur
12670 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
12680 20 20 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74      memset(pWrit
12690 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 65  er, 0, sizeof(Se
126a0 67 6d 65 6e 74 57 72 69 74 65 72 29 29 3b 0a 20  gmentWriter));. 
126b0 20 20 20 2a 70 70 57 72 69 74 65 72 20 3d 20 70     *ppWriter = p
126c0 57 72 69 74 65 72 3b 0a 0a 20 20 20 20 2f 2a 20  Writer;..    /* 
126d0 41 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65  Allocate a buffe
126e0 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20 61 63  r in which to ac
126f0 63 75 6d 75 6c 61 74 65 20 64 61 74 61 20 2a 2f  cumulate data */
12700 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61 44  .    pWriter->aD
12710 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ata = (char *)sq
12720 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 2d 3e  lite3_malloc(p->
12730 6e 4e 6f 64 65 53 69 7a 65 29 3b 0a 20 20 20 20  nNodeSize);.    
12740 69 66 28 20 21 70 57 72 69 74 65 72 2d 3e 61 44  if( !pWriter->aD
12750 61 74 61 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ata ) return SQL
12760 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70  ITE_NOMEM;.    p
12770 57 72 69 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20  Writer->nSize = 
12780 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 3b 0a 0a 20  p->nNodeSize;.. 
12790 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e     /* Find the n
127a0 65 78 74 20 66 72 65 65 20 62 6c 6f 63 6b 69 64  ext free blockid
127b0 20 69 6e 20 74 68 65 20 25 5f 73 65 67 6d 65 6e   in the %_segmen
127c0 74 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ts table */.    
127d0 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
127e0 28 70 2c 20 53 51 4c 5f 4e 45 58 54 5f 53 45 47  (p, SQL_NEXT_SEG
127f0 4d 45 4e 54 53 5f 49 44 2c 20 26 70 53 74 6d 74  MENTS_ID, &pStmt
12800 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
12810 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
12820 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
12830 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
12840 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
12850 20 29 7b 0a 20 20 20 20 20 20 70 57 72 69 74 65   ){.      pWrite
12860 72 2d 3e 69 46 72 65 65 20 3d 20 73 71 6c 69 74  r->iFree = sqlit
12870 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
12880 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
12890 20 70 57 72 69 74 65 72 2d 3e 69 46 69 72 73 74   pWriter->iFirst
128a0 20 3d 20 70 57 72 69 74 65 72 2d 3e 69 46 72 65   = pWriter->iFre
128b0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  e;.    }.    rc 
128c0 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
128d0 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20  pStmt);.    if( 
128e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
128f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
12900 20 6e 44 61 74 61 20 3d 20 70 57 72 69 74 65 72   nData = pWriter
12910 2d 3e 6e 44 61 74 61 3b 0a 0a 20 20 6e 50 72 65  ->nData;..  nPre
12920 66 69 78 20 3d 20 66 74 73 33 50 72 65 66 69 78  fix = fts3Prefix
12930 43 6f 6d 70 72 65 73 73 28 70 57 72 69 74 65 72  Compress(pWriter
12940 2d 3e 7a 54 65 72 6d 2c 20 70 57 72 69 74 65 72  ->zTerm, pWriter
12950 2d 3e 6e 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20  ->nTerm, zTerm, 
12960 6e 54 65 72 6d 29 3b 0a 20 20 6e 53 75 66 66 69  nTerm);.  nSuffi
12970 78 20 3d 20 6e 54 65 72 6d 2d 6e 50 72 65 66 69  x = nTerm-nPrefi
12980 78 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  x;..  /* Figure 
12990 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74  out how many byt
129a0 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  es are required 
129b0 62 79 20 74 68 69 73 20 6e 65 77 20 65 6e 74 72  by this new entr
129c0 79 20 2a 2f 0a 20 20 6e 52 65 71 20 3d 20 73 71  y */.  nReq = sq
129d0 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c  lite3Fts3VarintL
129e0 65 6e 28 6e 50 72 65 66 69 78 29 20 2b 20 20 20  en(nPrefix) +   
129f0 20 2f 2a 20 76 61 72 69 6e 74 20 63 6f 6e 74 61   /* varint conta
12a00 69 6e 69 6e 67 20 70 72 65 66 69 78 20 73 69 7a  ining prefix siz
12a10 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
12a20 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 53  Fts3VarintLen(nS
12a30 75 66 66 69 78 29 20 2b 20 20 20 20 20 20 20 20  uffix) +        
12a40 20 2f 2a 20 76 61 72 69 6e 74 20 63 6f 6e 74 61   /* varint conta
12a50 69 6e 69 6e 67 20 73 75 66 66 69 78 20 73 69 7a  ining suffix siz
12a60 65 20 2a 2f 0a 20 20 20 20 6e 53 75 66 66 69 78  e */.    nSuffix
12a70 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
12a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a90 20 2f 2a 20 54 65 72 6d 20 73 75 66 66 69 78 20   /* Term suffix 
12aa0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  */.    sqlite3Ft
12ab0 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 44 6f 63  s3VarintLen(nDoc
12ac0 6c 69 73 74 29 20 2b 20 20 20 20 20 20 20 20 2f  list) +        /
12ad0 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73  * Size of doclis
12ae0 74 20 2a 2f 0a 20 20 20 20 6e 44 6f 63 6c 69 73  t */.    nDoclis
12af0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
12b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b10 20 2f 2a 20 44 6f 63 6c 69 73 74 20 64 61 74 61   /* Doclist data
12b20 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 44 61 74 61   */..  if( nData
12b30 3e 30 20 26 26 20 6e 44 61 74 61 2b 6e 52 65 71  >0 && nData+nReq
12b40 3e 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 29 7b  >p->nNodeSize ){
12b50 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  .    int rc;..  
12b60 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74    /* The current
12b70 20 6c 65 61 66 20 6e 6f 64 65 20 69 73 20 66 75   leaf node is fu
12b80 6c 6c 2e 20 57 72 69 74 65 20 69 74 20 6f 75 74  ll. Write it out
12b90 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
12ba0 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74  . */.    rc = ft
12bb0 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28 70  s3WriteSegment(p
12bc0 2c 20 70 57 72 69 74 65 72 2d 3e 69 46 72 65 65  , pWriter->iFree
12bd0 2b 2b 2c 20 70 57 72 69 74 65 72 2d 3e 61 44 61  ++, pWriter->aDa
12be0 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 20 20  ta, nData);.    
12bf0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12c00 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
12c10 20 20 20 70 2d 3e 6e 4c 65 61 66 41 64 64 2b 2b     p->nLeafAdd++
12c20 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  ;..    /* Add th
12c30 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 74  e current term t
12c40 6f 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e  o the interior n
12c50 6f 64 65 20 74 72 65 65 2e 20 54 68 65 20 74 65  ode tree. The te
12c60 72 6d 20 61 64 64 65 64 20 74 6f 0a 20 20 20 20  rm added to.    
12c70 2a 2a 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20  ** the interior 
12c80 74 72 65 65 20 6d 75 73 74 3a 0a 20 20 20 20 2a  tree must:.    *
12c90 2a 0a 20 20 20 20 2a 2a 20 20 20 61 29 20 62 65  *.    **   a) be
12ca0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
12cb0 65 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20 6f  e largest term o
12cc0 6e 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20  n the leaf node 
12cd0 6a 75 73 74 20 77 72 69 74 74 65 6e 0a 20 20 20  just written.   
12ce0 20 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20   **      to the 
12cf0 64 61 74 61 62 61 73 65 20 28 73 74 69 6c 6c 20  database (still 
12d00 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 57 72  available in pWr
12d10 69 74 65 72 2d 3e 7a 54 65 72 6d 29 2c 20 61 6e  iter->zTerm), an
12d20 64 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  d.    **.    ** 
12d30 20 20 62 29 20 62 65 20 6c 65 73 73 20 74 68 61    b) be less tha
12d40 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
12d50 65 20 74 65 72 6d 20 61 62 6f 75 74 20 74 6f 20  e term about to 
12d60 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
12d70 6e 65 77 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  new.    **      
12d80 6c 65 61 66 20 6e 6f 64 65 20 28 7a 54 65 72 6d  leaf node (zTerm
12d90 2f 6e 54 65 72 6d 29 2e 0a 20 20 20 20 2a 2a 0a  /nTerm)..    **.
12da0 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65 72 20      ** In other 
12db0 77 6f 72 64 73 2c 20 69 74 20 6d 75 73 74 20 62  words, it must b
12dc0 65 20 74 68 65 20 70 72 65 66 69 78 20 6f 66 20  e the prefix of 
12dd0 7a 54 65 72 6d 20 31 20 62 79 74 65 20 6c 6f 6e  zTerm 1 byte lon
12de0 67 65 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ger than.    ** 
12df0 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69  the common prefi
12e00 78 20 28 69 66 20 61 6e 79 29 20 6f 66 20 7a 54  x (if any) of zT
12e10 65 72 6d 20 61 6e 64 20 70 57 72 69 74 65 72 2d  erm and pWriter-
12e20 3e 7a 54 65 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20  >zTerm..    */. 
12e30 20 20 20 61 73 73 65 72 74 28 20 6e 50 72 65 66     assert( nPref
12e40 69 78 3c 6e 54 65 72 6d 20 29 3b 0a 20 20 20 20  ix<nTerm );.    
12e50 72 63 20 3d 20 66 74 73 33 4e 6f 64 65 41 64 64  rc = fts3NodeAdd
12e60 54 65 72 6d 28 70 2c 20 26 70 57 72 69 74 65 72  Term(p, &pWriter
12e70 2d 3e 70 54 72 65 65 2c 20 69 73 43 6f 70 79 54  ->pTree, isCopyT
12e80 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 50 72 65  erm, zTerm, nPre
12e90 66 69 78 2b 31 29 3b 0a 20 20 20 20 69 66 28 20  fix+1);.    if( 
12ea0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
12eb0 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
12ec0 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70  nData = 0;.    p
12ed0 57 72 69 74 65 72 2d 3e 6e 54 65 72 6d 20 3d 20  Writer->nTerm = 
12ee0 30 3b 0a 0a 20 20 20 20 6e 50 72 65 66 69 78 20  0;..    nPrefix 
12ef0 3d 20 30 3b 0a 20 20 20 20 6e 53 75 66 66 69 78  = 0;.    nSuffix
12f00 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 6e 52   = nTerm;.    nR
12f10 65 71 20 3d 20 31 20 2b 20 20 20 20 20 20 20 20  eq = 1 +        
12f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f30 20 20 20 20 20 20 2f 2a 20 76 61 72 69 6e 74 20        /* varint 
12f40 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69  containing prefi
12f50 78 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  x size */.      
12f60 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e  sqlite3Fts3Varin
12f70 74 4c 65 6e 28 6e 54 65 72 6d 29 20 2b 20 20 20  tLen(nTerm) +   
12f80 20 20 20 20 20 20 2f 2a 20 76 61 72 69 6e 74 20        /* varint 
12f90 63 6f 6e 74 61 69 6e 69 6e 67 20 73 75 66 66 69  containing suffi
12fa0 78 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  x size */.      
12fb0 6e 54 65 72 6d 20 2b 20 20 20 20 20 20 20 20 20  nTerm +         
12fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fd0 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 73 75        /* Term su
12fe0 66 66 69 78 20 2a 2f 0a 20 20 20 20 20 20 73 71  ffix */.      sq
12ff0 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c  lite3Fts3VarintL
13000 65 6e 28 6e 44 6f 63 6c 69 73 74 29 20 2b 20 20  en(nDoclist) +  
13010 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
13020 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20  oclist */.      
13030 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20  nDoclist;       
13040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13050 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74        /* Doclist
13060 20 64 61 74 61 20 2a 2f 0a 20 20 7d 0a 0a 20 20   data */.  }..  
13070 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20  /* Increase the 
13080 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
13090 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 74 6f  bytes written to
130a0 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65   account for the
130b0 20 6e 65 77 20 65 6e 74 72 79 2e 20 2a 2f 0a 20   new entry. */. 
130c0 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44   pWriter->nLeafD
130d0 61 74 61 20 2b 3d 20 6e 52 65 71 3b 0a 0a 20 20  ata += nReq;..  
130e0 2f 2a 20 49 66 20 74 68 65 20 62 75 66 66 65 72  /* If the buffer
130f0 20 63 75 72 72 65 6e 74 6c 79 20 61 6c 6c 6f 63   currently alloc
13100 61 74 65 64 20 69 73 20 74 6f 6f 20 73 6d 61 6c  ated is too smal
13110 6c 20 66 6f 72 20 74 68 69 73 20 65 6e 74 72 79  l for this entry
13120 2c 20 72 65 61 6c 6c 6f 63 0a 20 20 2a 2a 20 74  , realloc.  ** t
13130 68 65 20 62 75 66 66 65 72 20 74 6f 20 6d 61 6b  he buffer to mak
13140 65 20 69 74 20 6c 61 72 67 65 20 65 6e 6f 75 67  e it large enoug
13150 68 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 52  h..  */.  if( nR
13160 65 71 3e 70 57 72 69 74 65 72 2d 3e 6e 53 69 7a  eq>pWriter->nSiz
13170 65 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 61  e ){.    char *a
13180 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  New = sqlite3_re
13190 61 6c 6c 6f 63 28 70 57 72 69 74 65 72 2d 3e 61  alloc(pWriter->a
131a0 44 61 74 61 2c 20 6e 52 65 71 29 3b 0a 20 20 20  Data, nReq);.   
131b0 20 69 66 28 20 21 61 4e 65 77 20 29 20 72 65 74   if( !aNew ) ret
131c0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
131d0 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61  ;.    pWriter->a
131e0 44 61 74 61 20 3d 20 61 4e 65 77 3b 0a 20 20 20  Data = aNew;.   
131f0 20 70 57 72 69 74 65 72 2d 3e 6e 53 69 7a 65 20   pWriter->nSize 
13200 3d 20 6e 52 65 71 3b 0a 20 20 7d 0a 20 20 61 73  = nReq;.  }.  as
13210 73 65 72 74 28 20 6e 44 61 74 61 2b 6e 52 65 71  sert( nData+nReq
13220 3c 3d 70 57 72 69 74 65 72 2d 3e 6e 53 69 7a 65  <=pWriter->nSize
13230 20 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64   );..  /* Append
13240 20 74 68 65 20 70 72 65 66 69 78 2d 63 6f 6d 70   the prefix-comp
13250 72 65 73 73 65 64 20 74 65 72 6d 20 61 6e 64 20  ressed term and 
13260 64 6f 63 6c 69 73 74 20 74 6f 20 74 68 65 20 62  doclist to the b
13270 75 66 66 65 72 2e 20 2a 2f 0a 20 20 6e 44 61 74  uffer. */.  nDat
13280 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  a += sqlite3Fts3
13290 50 75 74 56 61 72 69 6e 74 28 26 70 57 72 69 74  PutVarint(&pWrit
132a0 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d  er->aData[nData]
132b0 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 6e 44  , nPrefix);.  nD
132c0 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ata += sqlite3Ft
132d0 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 57 72  s3PutVarint(&pWr
132e0 69 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74  iter->aData[nDat
132f0 61 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20  a], nSuffix);.  
13300 6d 65 6d 63 70 79 28 26 70 57 72 69 74 65 72 2d  memcpy(&pWriter-
13310 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 26  >aData[nData], &
13320 7a 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 2c 20  zTerm[nPrefix], 
13330 6e 53 75 66 66 69 78 29 3b 0a 20 20 6e 44 61 74  nSuffix);.  nDat
13340 61 20 2b 3d 20 6e 53 75 66 66 69 78 3b 0a 20 20  a += nSuffix;.  
13350 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 33  nData += sqlite3
13360 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70  Fts3PutVarint(&p
13370 57 72 69 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44  Writer->aData[nD
13380 61 74 61 5d 2c 20 6e 44 6f 63 6c 69 73 74 29 3b  ata], nDoclist);
13390 0a 20 20 6d 65 6d 63 70 79 28 26 70 57 72 69 74  .  memcpy(&pWrit
133a0 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d  er->aData[nData]
133b0 2c 20 61 44 6f 63 6c 69 73 74 2c 20 6e 44 6f 63  , aDoclist, nDoc
133c0 6c 69 73 74 29 3b 0a 20 20 70 57 72 69 74 65 72  list);.  pWriter
133d0 2d 3e 6e 44 61 74 61 20 3d 20 6e 44 61 74 61 20  ->nData = nData 
133e0 2b 20 6e 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 2f  + nDoclist;..  /
133f0 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65  * Save the curre
13400 6e 74 20 74 65 72 6d 20 73 6f 20 74 68 61 74 20  nt term so that 
13410 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  it can be used t
13420 6f 20 70 72 65 66 69 78 2d 63 6f 6d 70 72 65 73  o prefix-compres
13430 73 20 74 68 65 20 6e 65 78 74 2e 0a 20 20 2a 2a  s the next..  **
13440 20 49 66 20 74 68 65 20 69 73 43 6f 70 79 54 65   If the isCopyTe
13450 72 6d 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  rm parameter is 
13460 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 62  true, then the b
13470 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
13480 20 62 79 0a 20 20 2a 2a 20 7a 54 65 72 6d 20 69   by.  ** zTerm i
13490 73 20 74 72 61 6e 73 69 65 6e 74 2c 20 73 6f 20  s transient, so 
134a0 74 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  take a copy of t
134b0 68 65 20 74 65 72 6d 20 64 61 74 61 2e 20 4f 74  he term data. Ot
134c0 68 65 72 77 69 73 65 2c 20 6a 75 73 74 0a 20 20  herwise, just.  
134d0 2a 2a 20 73 74 6f 72 65 20 61 20 63 6f 70 79 20  ** store a copy 
134e0 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a  of the pointer..
134f0 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 43 6f 70    */.  if( isCop
13500 79 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28  yTerm ){.    if(
13510 20 6e 54 65 72 6d 3e 70 57 72 69 74 65 72 2d 3e   nTerm>pWriter->
13520 6e 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  nMalloc ){.     
13530 20 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20 73 71   char *zNew = sq
13540 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 57  lite3_realloc(pW
13550 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c 6f 63 2c 20  riter->zMalloc, 
13560 6e 54 65 72 6d 2a 32 29 3b 0a 20 20 20 20 20 20  nTerm*2);.      
13570 69 66 28 20 21 7a 4e 65 77 20 29 7b 0a 20 20 20  if( !zNew ){.   
13580 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
13590 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
135a0 7d 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d  }.      pWriter-
135b0 3e 6e 4d 61 6c 6c 6f 63 20 3d 20 6e 54 65 72 6d  >nMalloc = nTerm
135c0 2a 32 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65  *2;.      pWrite
135d0 72 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 7a 4e 65  r->zMalloc = zNe
135e0 77 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72  w;.      pWriter
135f0 2d 3e 7a 54 65 72 6d 20 3d 20 7a 4e 65 77 3b 0a  ->zTerm = zNew;.
13600 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
13610 28 20 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d  ( pWriter->zTerm
13620 3d 3d 70 57 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c  ==pWriter->zMall
13630 6f 63 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  oc );.    memcpy
13640 28 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d 2c  (pWriter->zTerm,
13650 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   zTerm, nTerm);.
13660 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 72    }else{.    pWr
13670 69 74 65 72 2d 3e 7a 54 65 72 6d 20 3d 20 28 63  iter->zTerm = (c
13680 68 61 72 20 2a 29 7a 54 65 72 6d 3b 0a 20 20 7d  har *)zTerm;.  }
13690 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 54 65 72  .  pWriter->nTer
136a0 6d 20 3d 20 6e 54 65 72 6d 3b 0a 0a 20 20 72 65  m = nTerm;..  re
136b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
136c0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61  }../*.** Flush a
136d0 6c 6c 20 64 61 74 61 20 61 73 73 6f 63 69 61 74  ll data associat
136e0 65 64 20 77 69 74 68 20 74 68 65 20 53 65 67 6d  ed with the Segm
136f0 65 6e 74 57 72 69 74 65 72 20 6f 62 6a 65 63 74  entWriter object
13700 20 70 57 72 69 74 65 72 20 74 6f 20 74 68 65 0a   pWriter to the.
13710 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ** database. Thi
13720 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  s function must 
13730 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
13740 61 6c 6c 20 74 65 72 6d 73 20 68 61 76 65 20 62  all terms have b
13750 65 65 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20  een added.** to 
13760 74 68 65 20 73 65 67 6d 65 6e 74 20 75 73 69 6e  the segment usin
13770 67 20 66 74 73 33 53 65 67 57 72 69 74 65 72 41  g fts3SegWriterA
13780 64 64 28 29 2e 20 49 66 20 73 75 63 63 65 73 73  dd(). If success
13790 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
137a0 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f  s.** returned. O
137b0 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c  therwise, an SQL
137c0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
137d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
137e0 73 33 53 65 67 57 72 69 74 65 72 46 6c 75 73 68  s3SegWriterFlush
137f0 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
13800 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13810 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74      /* Virtual t
13820 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
13830 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 2a   SegmentWriter *
13840 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20  pWriter,        
13850 20 2f 2a 20 53 65 67 6d 65 6e 74 57 72 69 74 65   /* SegmentWrite
13860 72 20 74 6f 20 66 6c 75 73 68 20 74 6f 20 74 68  r to flush to th
13870 65 20 64 62 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e db */.  sqlite
13880 33 5f 69 6e 74 36 34 20 69 4c 65 76 65 6c 2c 20  3_int64 iLevel, 
13890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
138a0 75 65 20 66 6f 72 20 27 6c 65 76 65 6c 27 20 63  ue for 'level' c
138b0 6f 6c 75 6d 6e 20 6f 66 20 25 5f 73 65 67 64 69  olumn of %_segdi
138c0 72 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20  r */.  int iIdx 
138d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138e0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
138f0 66 6f 72 20 27 69 64 78 27 20 63 6f 6c 75 6d 6e  for 'idx' column
13900 20 6f 66 20 25 5f 73 65 67 64 69 72 20 2a 2f 0a   of %_segdir */.
13910 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
13920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13930 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
13940 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20 70 57 72  ode */.  if( pWr
13950 69 74 65 72 2d 3e 70 54 72 65 65 20 29 7b 0a 20  iter->pTree ){. 
13960 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
13970 20 69 4c 61 73 74 20 3d 20 30 3b 20 20 20 20 20   iLast = 0;     
13980 20 2f 2a 20 4c 61 72 67 65 73 74 20 62 6c 6f 63   /* Largest bloc
13990 6b 20 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20  k id written to 
139a0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
139b0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c  sqlite3_int64 iL
139c0 61 73 74 4c 65 61 66 3b 20 20 20 20 20 20 2f 2a  astLeaf;      /*
139d0 20 4c 61 72 67 65 73 74 20 6c 65 61 66 20 62 6c   Largest leaf bl
139e0 6f 63 6b 20 69 64 20 77 72 69 74 74 65 6e 20 74  ock id written t
139f0 6f 20 64 62 20 2a 2f 0a 20 20 20 20 63 68 61 72  o db */.    char
13a00 20 2a 7a 52 6f 6f 74 20 3d 20 4e 55 4c 4c 3b 20   *zRoot = NULL; 
13a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
13a20 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
13a30 6f 6e 74 61 69 6e 69 6e 67 20 72 6f 6f 74 20 6e  ontaining root n
13a40 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ode */.    int n
13a50 52 6f 6f 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Root = 0;       
13a60 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
13a70 20 6f 66 20 62 75 66 66 65 72 20 7a 52 6f 6f 74   of buffer zRoot
13a80 20 2a 2f 0a 0a 20 20 20 20 69 4c 61 73 74 4c 65   */..    iLastLe
13a90 61 66 20 3d 20 70 57 72 69 74 65 72 2d 3e 69 46  af = pWriter->iF
13aa0 72 65 65 3b 0a 20 20 20 20 72 63 20 3d 20 66 74  ree;.    rc = ft
13ab0 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28 70  s3WriteSegment(p
13ac0 2c 20 70 57 72 69 74 65 72 2d 3e 69 46 72 65 65  , pWriter->iFree
13ad0 2b 2b 2c 20 70 57 72 69 74 65 72 2d 3e 61 44 61  ++, pWriter->aDa
13ae0 74 61 2c 20 70 57 72 69 74 65 72 2d 3e 6e 44 61  ta, pWriter->nDa
13af0 74 61 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ta);.    if( rc=
13b00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13b10 20 20 20 20 72 63 20 3d 20 66 74 73 33 4e 6f 64      rc = fts3Nod
13b20 65 57 72 69 74 65 28 70 2c 20 70 57 72 69 74 65  eWrite(p, pWrite
13b30 72 2d 3e 70 54 72 65 65 2c 20 31 2c 0a 20 20 20  r->pTree, 1,.   
13b40 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e         pWriter->
13b50 69 46 69 72 73 74 2c 20 70 57 72 69 74 65 72 2d  iFirst, pWriter-
13b60 3e 69 46 72 65 65 2c 20 26 69 4c 61 73 74 2c 20  >iFree, &iLast, 
13b70 26 7a 52 6f 6f 74 2c 20 26 6e 52 6f 6f 74 29 3b  &zRoot, &nRoot);
13b80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
13b90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13ba0 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 57        rc = fts3W
13bb0 72 69 74 65 53 65 67 64 69 72 28 70 2c 20 69 4c  riteSegdir(p, iL
13bc0 65 76 65 6c 2c 20 69 49 64 78 2c 20 0a 20 20 20  evel, iIdx, .   
13bd0 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e         pWriter->
13be0 69 46 69 72 73 74 2c 20 69 4c 61 73 74 4c 65 61  iFirst, iLastLea
13bf0 66 2c 20 69 4c 61 73 74 2c 20 70 57 72 69 74 65  f, iLast, pWrite
13c00 72 2d 3e 6e 4c 65 61 66 44 61 74 61 2c 20 7a 52  r->nLeafData, zR
13c10 6f 6f 74 2c 20 6e 52 6f 6f 74 29 3b 0a 20 20 20  oot, nRoot);.   
13c20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
13c30 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 74 72  /* The entire tr
13c40 65 65 20 66 69 74 73 20 6f 6e 20 74 68 65 20 72  ee fits on the r
13c50 6f 6f 74 20 6e 6f 64 65 2e 20 57 72 69 74 65 20  oot node. Write 
13c60 69 74 20 74 6f 20 74 68 65 20 73 65 67 64 69 72  it to the segdir
13c70 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 72   table. */.    r
13c80 63 20 3d 20 66 74 73 33 57 72 69 74 65 53 65 67  c = fts3WriteSeg
13c90 64 69 72 28 70 2c 20 69 4c 65 76 65 6c 2c 20 69  dir(p, iLevel, i
13ca0 49 64 78 2c 20 0a 20 20 20 20 20 20 20 20 30 2c  Idx, .        0,
13cb0 20 30 2c 20 30 2c 20 70 57 72 69 74 65 72 2d 3e   0, 0, pWriter->
13cc0 6e 4c 65 61 66 44 61 74 61 2c 20 70 57 72 69 74  nLeafData, pWrit
13cd0 65 72 2d 3e 61 44 61 74 61 2c 20 70 57 72 69 74  er->aData, pWrit
13ce0 65 72 2d 3e 6e 44 61 74 61 29 3b 0a 20 20 7d 0a  er->nData);.  }.
13cf0 20 20 70 2d 3e 6e 4c 65 61 66 41 64 64 2b 2b 3b    p->nLeafAdd++;
13d00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13d10 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
13d20 6c 6c 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62  ll memory held b
13d30 79 20 74 68 65 20 53 65 67 6d 65 6e 74 57 72 69  y the SegmentWri
13d40 74 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ter object passe
13d50 64 20 61 73 20 74 68 65 20 0a 2a 2a 20 66 69 72  d as the .** fir
13d60 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  st argument..*/.
13d70 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
13d80 53 65 67 57 72 69 74 65 72 46 72 65 65 28 53 65  SegWriterFree(Se
13d90 67 6d 65 6e 74 57 72 69 74 65 72 20 2a 70 57 72  gmentWriter *pWr
13da0 69 74 65 72 29 7b 0a 20 20 69 66 28 20 70 57 72  iter){.  if( pWr
13db0 69 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  iter ){.    sqli
13dc0 74 65 33 5f 66 72 65 65 28 70 57 72 69 74 65 72  te3_free(pWriter
13dd0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 73 71  ->aData);.    sq
13de0 6c 69 74 65 33 5f 66 72 65 65 28 70 57 72 69 74  lite3_free(pWrit
13df0 65 72 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20  er->zMalloc);.  
13e00 20 20 66 74 73 33 4e 6f 64 65 46 72 65 65 28 70    fts3NodeFree(p
13e10 57 72 69 74 65 72 2d 3e 70 54 72 65 65 29 3b 0a  Writer->pTree);.
13e20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13e30 28 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 7d  (pWriter);.  }.}
13e40 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
13e50 74 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61  t value in the a
13e60 70 56 61 6c 5b 5d 20 61 72 72 61 79 20 69 73 20  pVal[] array is 
13e70 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61  assumed to conta
13e80 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a  in an integer..*
13e90 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
13ea0 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20 65  tests if there e
13eb0 78 69 73 74 20 61 6e 79 20 64 6f 63 75 6d 65 6e  xist any documen
13ec0 74 73 20 77 69 74 68 20 64 6f 63 69 64 20 76 61  ts with docid va
13ed0 6c 75 65 73 20 74 68 61 74 0a 2a 2a 20 61 72 65  lues that.** are
13ee0 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
13ef0 74 68 61 74 20 69 6e 74 65 67 65 72 2e 20 69 2e  that integer. i.
13f00 65 2e 20 69 66 20 64 65 6c 65 74 69 6e 67 20 74  e. if deleting t
13f10 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68  he document with
13f20 20 64 6f 63 69 64 0a 2a 2a 20 70 52 6f 77 69 64   docid.** pRowid
13f30 20 77 6f 75 6c 64 20 6d 65 61 6e 20 74 68 65 20   would mean the 
13f40 46 54 53 33 20 74 61 62 6c 65 20 77 65 72 65 20  FTS3 table were 
13f50 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  empty..**.** If 
13f60 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 69 73  successful, *pis
13f70 45 6d 70 74 79 20 69 73 20 73 65 74 20 74 6f 20  Empty is set to 
13f80 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62 6c  true if the tabl
13f90 65 20 69 73 20 65 6d 70 74 79 20 65 78 63 65 70  e is empty excep
13fa0 74 20 66 6f 72 0a 2a 2a 20 64 6f 63 75 6d 65 6e  t for.** documen
13fb0 74 20 70 52 6f 77 69 64 2c 20 6f 72 20 66 61 6c  t pRowid, or fal
13fc0 73 65 20 6f 74 68 65 72 77 69 73 65 2c 20 61 6e  se otherwise, an
13fd0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  d SQLITE_OK is r
13fe0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 0a 2a  eturned. If an.*
13ff0 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  * error occurs, 
14000 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
14010 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
14020 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14030 66 74 73 33 49 73 45 6d 70 74 79 28 46 74 73 33  fts3IsEmpty(Fts3
14040 54 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74 65  Table *p, sqlite
14050 33 5f 76 61 6c 75 65 20 2a 70 52 6f 77 69 64 2c  3_value *pRowid,
14060 20 69 6e 74 20 2a 70 69 73 45 6d 70 74 79 29 7b   int *pisEmpty){
14070 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
14080 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63  *pStmt;.  int rc
14090 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 43 6f 6e 74  ;.  if( p->zCont
140a0 65 6e 74 54 62 6c 20 29 7b 0a 20 20 20 20 2f 2a  entTbl ){.    /*
140b0 20 49 66 20 75 73 69 6e 67 20 74 68 65 20 63 6f   If using the co
140c0 6e 74 65 6e 74 3d 78 78 78 20 6f 70 74 69 6f 6e  ntent=xxx option
140d0 2c 20 61 73 73 75 6d 65 20 74 68 65 20 74 61 62  , assume the tab
140e0 6c 65 20 69 73 20 6e 65 76 65 72 20 65 6d 70 74  le is never empt
140f0 79 20 2a 2f 0a 20 20 20 20 2a 70 69 73 45 6d 70  y */.    *pisEmp
14100 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  ty = 0;.    rc =
14110 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
14120 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  lse{.    rc = ft
14130 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
14140 5f 49 53 5f 45 4d 50 54 59 2c 20 26 70 53 74 6d  _IS_EMPTY, &pStm
14150 74 2c 20 26 70 52 6f 77 69 64 29 3b 0a 20 20 20  t, &pRowid);.   
14160 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14170 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
14180 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
14190 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
141a0 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 69 73 45  ){.        *pisE
141b0 6d 70 74 79 20 3d 20 73 71 6c 69 74 65 33 5f 63  mpty = sqlite3_c
141c0 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
141d0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
141e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
141f0 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
14200 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
14210 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
14220 74 20 2a 70 6e 4d 61 78 20 74 6f 20 74 68 65 20  t *pnMax to the 
14230 6c 61 72 67 65 73 74 20 73 65 67 6d 65 6e 74 20  largest segment 
14240 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 64 61 74  level in the dat
14250 61 62 61 73 65 20 66 6f 72 20 74 68 65 20 69 6e  abase for the in
14260 64 65 78 0a 2a 2a 20 69 49 6e 64 65 78 2e 0a 2a  dex.** iIndex..*
14270 2a 0a 2a 2a 20 53 65 67 6d 65 6e 74 20 6c 65 76  *.** Segment lev
14280 65 6c 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  els are stored i
14290 6e 20 74 68 65 20 27 6c 65 76 65 6c 27 20 63 6f  n the 'level' co
142a0 6c 75 6d 6e 20 6f 66 20 74 68 65 20 25 5f 73 65  lumn of the %_se
142b0 67 64 69 72 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  gdir table..**.*
142c0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
142d0 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
142e0 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  , or an SQLite e
142f0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6e 6f 74  rror code if not
14300 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14310 66 74 73 33 53 65 67 6d 65 6e 74 4d 61 78 4c 65  fts3SegmentMaxLe
14320 76 65 6c 28 0a 20 20 46 74 73 33 54 61 62 6c 65  vel(.  Fts3Table
14330 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 4c 61 6e   *p, .  int iLan
14340 67 69 64 2c 0a 20 20 69 6e 74 20 69 49 6e 64 65  gid,.  int iInde
14350 78 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  x, .  sqlite3_in
14360 74 36 34 20 2a 70 6e 4d 61 78 0a 29 7b 0a 20 20  t64 *pnMax.){.  
14370 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
14380 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  tmt;.  int rc;. 
14390 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 3e   assert( iIndex>
143a0 3d 30 20 26 26 20 69 49 6e 64 65 78 3c 70 2d 3e  =0 && iIndex<p->
143b0 6e 49 6e 64 65 78 20 29 3b 0a 0a 20 20 2f 2a 20  nIndex );..  /* 
143c0 53 65 74 20 70 53 74 6d 74 20 74 6f 20 74 68 65  Set pStmt to the
143d0 20 63 6f 6d 70 69 6c 65 64 20 76 65 72 73 69 6f   compiled versio
143e0 6e 20 6f 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  n of:.  **.  ** 
143f0 20 20 53 45 4c 45 43 54 20 6d 61 78 28 6c 65 76    SELECT max(lev
14400 65 6c 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  el) FROM %Q.'%q_
14410 73 65 67 64 69 72 27 20 57 48 45 52 45 20 6c 65  segdir' WHERE le
14420 76 65 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e  vel BETWEEN ? AN
14430 44 20 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 31  D ?.  **.  ** (1
14440 30 32 34 20 69 73 20 61 63 74 75 61 6c 6c 79 20  024 is actually 
14450 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 61 63  the value of mac
14460 72 6f 20 46 54 53 33 5f 53 45 47 44 49 52 5f 50  ro FTS3_SEGDIR_P
14470 52 45 46 49 58 4c 45 56 45 4c 5f 53 54 52 29 2e  REFIXLEVEL_STR).
14480 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73  .  */.  rc = fts
14490 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
144a0 53 45 4c 45 43 54 5f 53 45 47 44 49 52 5f 4d 41  SELECT_SEGDIR_MA
144b0 58 5f 4c 45 56 45 4c 2c 20 26 70 53 74 6d 74 2c  X_LEVEL, &pStmt,
144c0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
144d0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
144e0 6e 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  n rc;.  sqlite3_
144f0 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
14500 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c 75 74 65  , 1, getAbsolute
14510 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64  Level(p, iLangid
14520 2c 20 69 49 6e 64 65 78 2c 20 30 29 29 3b 0a 20  , iIndex, 0));. 
14530 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
14540 74 36 34 28 70 53 74 6d 74 2c 20 32 2c 20 0a 20  t64(pStmt, 2, . 
14550 20 20 20 20 20 67 65 74 41 62 73 6f 6c 75 74 65       getAbsolute
14560 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64  Level(p, iLangid
14570 2c 20 69 49 6e 64 65 78 2c 20 46 54 53 33 5f 53  , iIndex, FTS3_S
14580 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 2d 31  EGDIR_MAXLEVEL-1
14590 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  ).  );.  if( SQL
145a0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
145b0 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
145c0 20 20 20 20 2a 70 6e 4d 61 78 20 3d 20 73 71 6c      *pnMax = sql
145d0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
145e0 34 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d  4(pStmt, 0);.  }
145f0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
14600 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
14610 7d 0a 0a 2f 2a 0a 2a 2a 20 69 41 62 73 4c 65 76  }../*.** iAbsLev
14620 65 6c 20 69 73 20 61 6e 20 61 62 73 6f 6c 75 74  el is an absolut
14630 65 20 6c 65 76 65 6c 20 74 68 61 74 20 6d 61 79  e level that may
14640 20 62 65 20 61 73 73 75 6d 65 64 20 74 6f 20 65   be assumed to e
14650 78 69 73 74 20 77 69 74 68 69 6e 0a 2a 2a 20 74  xist within.** t
14660 68 65 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  he database. Thi
14670 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b  s function check
14680 73 20 69 66 20 69 74 20 69 73 20 74 68 65 20 6c  s if it is the l
14690 61 72 67 65 73 74 20 6c 65 76 65 6c 20 6e 75 6d  argest level num
146a0 62 65 72 0a 2a 2a 20 77 69 74 68 69 6e 20 69 74  ber.** within it
146b0 73 20 69 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e  s index. Assumin
146c0 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  g no error occur
146d0 73 2c 20 2a 70 62 4d 61 78 20 69 73 20 73 65 74  s, *pbMax is set
146e0 20 74 6f 20 31 20 69 66 0a 2a 2a 20 69 41 62 73   to 1 if.** iAbs
146f0 4c 65 76 65 6c 20 69 73 20 69 6e 64 65 65 64 20  Level is indeed 
14700 74 68 65 20 6c 61 72 67 65 73 74 20 6c 65 76 65  the largest leve
14710 6c 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69 73  l, or 0 otherwis
14720 65 2c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  e, and SQLITE_OK
14730 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
14740 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
14750 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
14760 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
14770 6e 64 20 74 68 65 0a 2a 2a 20 66 69 6e 61 6c 20  nd the.** final 
14780 76 61 6c 75 65 20 6f 66 20 2a 70 62 4d 61 78 20  value of *pbMax 
14790 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  is undefined..*/
147a0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
147b0 53 65 67 6d 65 6e 74 49 73 4d 61 78 4c 65 76 65  SegmentIsMaxLeve
147c0 6c 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20  l(Fts3Table *p, 
147d0 69 36 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 69  i64 iAbsLevel, i
147e0 6e 74 20 2a 70 62 4d 61 78 29 7b 0a 0a 20 20 2f  nt *pbMax){..  /
147f0 2a 20 53 65 74 20 70 53 74 6d 74 20 74 6f 20 74  * Set pStmt to t
14800 68 65 20 63 6f 6d 70 69 6c 65 64 20 76 65 72 73  he compiled vers
14810 69 6f 6e 20 6f 66 3a 0a 20 20 2a 2a 0a 20 20 2a  ion of:.  **.  *
14820 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 6c  *   SELECT max(l
14830 65 76 65 6c 29 20 46 52 4f 4d 20 25 51 2e 27 25  evel) FROM %Q.'%
14840 71 5f 73 65 67 64 69 72 27 20 57 48 45 52 45 20  q_segdir' WHERE 
14850 6c 65 76 65 6c 20 42 45 54 57 45 45 4e 20 3f 20  level BETWEEN ? 
14860 41 4e 44 20 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  AND ?.  **.  ** 
14870 28 31 30 32 34 20 69 73 20 61 63 74 75 61 6c 6c  (1024 is actuall
14880 79 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  y the value of m
14890 61 63 72 6f 20 46 54 53 33 5f 53 45 47 44 49 52  acro FTS3_SEGDIR
148a0 5f 50 52 45 46 49 58 4c 45 56 45 4c 5f 53 54 52  _PREFIXLEVEL_STR
148b0 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  )..  */.  sqlite
148c0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
148d0 20 69 6e 74 20 72 63 20 3d 20 66 74 73 33 53 71   int rc = fts3Sq
148e0 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c  lStmt(p, SQL_SEL
148f0 45 43 54 5f 53 45 47 44 49 52 5f 4d 41 58 5f 4c  ECT_SEGDIR_MAX_L
14900 45 56 45 4c 2c 20 26 70 53 74 6d 74 2c 20 30 29  EVEL, &pStmt, 0)
14910 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
14920 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
14930 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  c;.  sqlite3_bin
14940 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31  d_int64(pStmt, 1
14950 2c 20 69 41 62 73 4c 65 76 65 6c 2b 31 29 3b 0a  , iAbsLevel+1);.
14960 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
14970 6e 74 36 34 28 70 53 74 6d 74 2c 20 32 2c 20 0a  nt64(pStmt, 2, .
14980 20 20 20 20 20 20 28 28 69 41 62 73 4c 65 76 65        ((iAbsLeve
14990 6c 2f 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41  l/FTS3_SEGDIR_MA
149a0 58 4c 45 56 45 4c 29 2b 31 29 20 2a 20 46 54 53  XLEVEL)+1) * FTS
149b0 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45  3_SEGDIR_MAXLEVE
149c0 4c 0a 20 20 29 3b 0a 0a 20 20 2a 70 62 4d 61 78  L.  );..  *pbMax
149d0 20 3d 20 30 3b 0a 20 20 69 66 28 20 53 51 4c 49   = 0;.  if( SQLI
149e0 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
149f0 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
14a00 20 20 20 2a 70 62 4d 61 78 20 3d 20 73 71 6c 69     *pbMax = sqli
14a10 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  te3_column_type(
14a20 70 53 74 6d 74 2c 20 30 29 3d 3d 53 51 4c 49 54  pStmt, 0)==SQLIT
14a30 45 5f 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65  E_NULL;.  }.  re
14a40 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 72 65 73  turn sqlite3_res
14a50 65 74 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a  et(pStmt);.}../*
14a60 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 65  .** Delete all e
14a70 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 25 5f  ntries in the %_
14a80 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20 61  segments table a
14a90 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
14aa0 68 65 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 6f 70  he segment.** op
14ab0 65 6e 65 64 20 77 69 74 68 20 73 65 67 2d 72 65  ened with seg-re
14ac0 61 64 65 72 20 70 53 65 67 2e 20 54 68 69 73 20  ader pSeg. This 
14ad0 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
14ae0 74 20 61 66 66 65 63 74 20 74 68 65 20 63 6f 6e  t affect the con
14af0 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20  tents.** of the 
14b00 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 2e 0a  %_segdir table..
14b10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
14b20 73 33 44 65 6c 65 74 65 53 65 67 6d 65 6e 74 28  s3DeleteSegment(
14b30 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
14b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b50 20 20 20 2f 2a 20 46 54 53 20 74 61 62 6c 65 20     /* FTS table 
14b60 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33  handle */.  Fts3
14b70 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67 20  SegReader *pSeg 
14b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
14b90 65 67 6d 65 6e 74 20 74 6f 20 64 65 6c 65 74 65  egment to delete
14ba0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
14bb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
14bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
14bd0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 66 28  rn code */.  if(
14be0 20 70 53 65 67 2d 3e 69 53 74 61 72 74 42 6c 6f   pSeg->iStartBlo
14bf0 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ck ){.    sqlite
14c00 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74 65 3b  3_stmt *pDelete;
14c10 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73          /* SQL s
14c20 74 61 74 65 6d 65 6e 74 20 74 6f 20 64 65 6c 65  tatement to dele
14c30 74 65 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 72  te rows */.    r
14c40 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
14c50 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45  p, SQL_DELETE_SE
14c60 47 4d 45 4e 54 53 5f 52 41 4e 47 45 2c 20 26 70  GMENTS_RANGE, &p
14c70 44 65 6c 65 74 65 2c 20 30 29 3b 0a 20 20 20 20  Delete, 0);.    
14c80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14c90 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
14ca0 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 44  e3_bind_int64(pD
14cb0 65 6c 65 74 65 2c 20 31 2c 20 70 53 65 67 2d 3e  elete, 1, pSeg->
14cc0 69 53 74 61 72 74 42 6c 6f 63 6b 29 3b 0a 20 20  iStartBlock);.  
14cd0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
14ce0 5f 69 6e 74 36 34 28 70 44 65 6c 65 74 65 2c 20  _int64(pDelete, 
14cf0 32 2c 20 70 53 65 67 2d 3e 69 45 6e 64 42 6c 6f  2, pSeg->iEndBlo
14d00 63 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ck);.      sqlit
14d10 65 33 5f 73 74 65 70 28 70 44 65 6c 65 74 65 29  e3_step(pDelete)
14d20 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
14d30 69 74 65 33 5f 72 65 73 65 74 28 70 44 65 6c 65  ite3_reset(pDele
14d40 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  te);.    }.  }. 
14d50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
14d60 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
14d70 6f 6e 20 69 73 20 75 73 65 64 20 61 66 74 65 72  on is used after
14d80 20 6d 65 72 67 69 6e 67 20 6d 75 6c 74 69 70 6c   merging multipl
14d90 65 20 73 65 67 6d 65 6e 74 73 20 69 6e 74 6f 20  e segments into 
14da0 61 20 73 69 6e 67 6c 65 20 6c 61 72 67 65 0a 2a  a single large.*
14db0 2a 20 73 65 67 6d 65 6e 74 20 74 6f 20 64 65 6c  * segment to del
14dc0 65 74 65 20 74 68 65 20 6f 6c 64 2c 20 6e 6f 77  ete the old, now
14dd0 20 72 65 64 75 6e 64 61 6e 74 2c 20 73 65 67 6d   redundant, segm
14de0 65 6e 74 20 62 2d 74 72 65 65 73 2e 20 53 70 65  ent b-trees. Spe
14df0 63 69 66 69 63 61 6c 6c 79 2c 0a 2a 2a 20 69 74  cifically,.** it
14e00 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 31 29 20 44 65  :.** .**   1) De
14e10 6c 65 74 65 73 20 61 6c 6c 20 25 5f 73 65 67 6d  letes all %_segm
14e20 65 6e 74 73 20 65 6e 74 72 69 65 73 20 66 6f 72  ents entries for
14e30 20 74 68 65 20 73 65 67 6d 65 6e 74 73 20 61 73   the segments as
14e40 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a  sociated with .*
14e50 2a 20 20 20 20 20 20 65 61 63 68 20 6f 66 20 74  *      each of t
14e60 68 65 20 53 65 67 52 65 61 64 65 72 20 6f 62 6a  he SegReader obj
14e70 65 63 74 73 20 69 6e 20 74 68 65 20 61 72 72 61  ects in the arra
14e80 79 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  y passed as the 
14e90 74 68 69 72 64 20 0a 2a 2a 20 20 20 20 20 20 61  third .**      a
14ea0 72 67 75 6d 65 6e 74 2c 20 61 6e 64 0a 2a 2a 0a  rgument, and.**.
14eb0 2a 2a 20 20 20 32 29 20 64 65 6c 65 74 65 73 20  **   2) deletes 
14ec0 61 6c 6c 20 25 5f 73 65 67 64 69 72 20 65 6e 74  all %_segdir ent
14ed0 72 69 65 73 20 77 69 74 68 20 6c 65 76 65 6c 20  ries with level 
14ee0 69 4c 65 76 65 6c 2c 20 6f 72 20 61 6c 6c 20 25  iLevel, or all %
14ef0 5f 73 65 67 64 69 72 0a 2a 2a 20 20 20 20 20 20  _segdir.**      
14f00 65 6e 74 72 69 65 73 20 72 65 67 61 72 64 6c 65  entries regardle
14f10 73 73 20 6f 66 20 6c 65 76 65 6c 20 69 66 20 28  ss of level if (
14f20 69 4c 65 76 65 6c 3c 30 29 2e 0a 2a 2a 0a 2a 2a  iLevel<0)..**.**
14f30 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
14f40 74 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73  turned if succes
14f50 73 66 75 6c 2c 20 6f 74 68 65 72 77 69 73 65 20  sful, otherwise 
14f60 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
14f70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
14f80 69 6e 74 20 66 74 73 33 44 65 6c 65 74 65 53 65  int fts3DeleteSe
14f90 67 64 69 72 28 0a 20 20 46 74 73 33 54 61 62 6c  gdir(.  Fts3Tabl
14fa0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
14fb0 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75          /* Virtu
14fc0 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  al table handle 
14fd0 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64  */.  int iLangid
14fe0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14ff0 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65       /* Language
15000 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e   id */.  int iIn
15010 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  dex,            
15020 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
15030 78 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65 78 20  x for p->aIndex 
15040 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c  */.  int iLevel,
15050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15060 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66       /* Level of
15070 20 25 5f 73 65 67 64 69 72 20 65 6e 74 72 69 65   %_segdir entrie
15080 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  s to delete */. 
15090 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
150a0 2a 61 70 53 65 67 6d 65 6e 74 2c 20 20 20 20 20  *apSegment,     
150b0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 53 65 67   /* Array of Seg
150c0 52 65 61 64 65 72 20 6f 62 6a 65 63 74 73 20 2a  Reader objects *
150d0 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 65 72 20  /.  int nReader 
150e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150f0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
15100 72 72 61 79 20 61 70 53 65 67 6d 65 6e 74 20 2a  rray apSegment *
15110 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
15120 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
15130 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
15140 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   Code */.  int i
15150 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
15170 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
15180 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
15190 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20  t *pDelete = 0; 
151a0 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74       /* SQL stat
151b0 65 6d 65 6e 74 20 74 6f 20 64 65 6c 65 74 65 20  ement to delete 
151c0 72 6f 77 73 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  rows */..  for(i
151d0 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
151e0 4b 20 26 26 20 69 3c 6e 52 65 61 64 65 72 3b 20  K && i<nReader; 
151f0 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  i++){.    rc = f
15200 74 73 33 44 65 6c 65 74 65 53 65 67 6d 65 6e 74  ts3DeleteSegment
15210 28 70 2c 20 61 70 53 65 67 6d 65 6e 74 5b 69 5d  (p, apSegment[i]
15220 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
15230 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15240 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
15250 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 76  ..  assert( iLev
15260 65 6c 3e 3d 30 20 7c 7c 20 69 4c 65 76 65 6c 3d  el>=0 || iLevel=
15270 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f  =FTS3_SEGCURSOR_
15280 41 4c 4c 20 29 3b 0a 20 20 69 66 28 20 69 4c 65  ALL );.  if( iLe
15290 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55 52  vel==FTS3_SEGCUR
152a0 53 4f 52 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  SOR_ALL ){.    r
152b0 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
152c0 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45  p, SQL_DELETE_SE
152d0 47 44 49 52 5f 52 41 4e 47 45 2c 20 26 70 44 65  GDIR_RANGE, &pDe
152e0 6c 65 74 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  lete, 0);.    if
152f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15300 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15310 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c  _bind_int64(pDel
15320 65 74 65 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c  ete, 1, getAbsol
15330 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e  uteLevel(p, iLan
15340 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 30 29 29  gid, iIndex, 0))
15350 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
15360 62 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c 65  bind_int64(pDele
15370 74 65 2c 20 32 2c 20 0a 20 20 20 20 20 20 20 20  te, 2, .        
15380 20 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76    getAbsoluteLev
15390 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69  el(p, iLangid, i
153a0 49 6e 64 65 78 2c 20 46 54 53 33 5f 53 45 47 44  Index, FTS3_SEGD
153b0 49 52 5f 4d 41 58 4c 45 56 45 4c 2d 31 29 0a 20  IR_MAXLEVEL-1). 
153c0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
153d0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
153e0 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
153f0 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 44 49 52  QL_DELETE_SEGDIR
15400 5f 4c 45 56 45 4c 2c 20 26 70 44 65 6c 65 74 65  _LEVEL, &pDelete
15410 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
15420 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15430 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
15440 64 5f 69 6e 74 36 34 28 0a 20 20 20 20 20 20 20  d_int64(.       
15450 20 20 20 70 44 65 6c 65 74 65 2c 20 31 2c 20 67     pDelete, 1, g
15460 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28  etAbsoluteLevel(
15470 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64  p, iLangid, iInd
15480 65 78 2c 20 69 4c 65 76 65 6c 29 0a 20 20 20 20  ex, iLevel).    
15490 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a    );.    }.  }..
154a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
154b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
154c0 65 33 5f 73 74 65 70 28 70 44 65 6c 65 74 65 29  e3_step(pDelete)
154d0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
154e0 65 33 5f 72 65 73 65 74 28 70 44 65 6c 65 74 65  e3_reset(pDelete
154f0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
15500 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68   rc;.}../*.** Wh
15510 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
15520 20 69 73 20 63 61 6c 6c 65 64 2c 20 62 75 66 66   is called, buff
15530 65 72 20 2a 70 70 4c 69 73 74 20 28 73 69 7a 65  er *ppList (size
15540 20 2a 70 6e 4c 69 73 74 20 62 79 74 65 73 29 20   *pnList bytes) 
15550 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20 61 20 70  contains .** a p
15560 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 74 68 61  osition list tha
15570 74 20 6d 61 79 20 28 6f 72 20 6d 61 79 20 6e 6f  t may (or may no
15580 74 29 20 66 65 61 74 75 72 65 20 6d 75 6c 74 69  t) feature multi
15590 70 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69  ple columns. Thi
155a0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 64  s.** function ad
155b0 6a 75 73 74 73 20 74 68 65 20 70 6f 69 6e 74 65  justs the pointe
155c0 72 20 2a 70 70 4c 69 73 74 20 61 6e 64 20 74 68  r *ppList and th
155d0 65 20 6c 65 6e 67 74 68 20 2a 70 6e 4c 69 73 74  e length *pnList
155e0 20 73 6f 20 74 68 61 74 20 74 68 65 79 0a 2a 2a   so that they.**
155f0 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 73 75   identify the su
15600 62 73 65 74 20 6f 66 20 74 68 65 20 70 6f 73 69  bset of the posi
15610 74 69 6f 6e 20 6c 69 73 74 20 74 68 61 74 20 63  tion list that c
15620 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 63 6f  orresponds to co
15630 6c 75 6d 6e 20 69 43 6f 6c 2e 0a 2a 2a 0a 2a 2a  lumn iCol..**.**
15640 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
15650 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
15660 69 6e 70 75 74 20 70 6f 73 69 74 69 6f 6e 20 6c  input position l
15670 69 73 74 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69  ist for column i
15680 43 6f 6c 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 6e  Col, then.** *pn
15690 4c 69 73 74 20 69 73 20 73 65 74 20 74 6f 20 7a  List is set to z
156a0 65 72 6f 20 62 65 66 6f 72 65 20 72 65 74 75 72  ero before retur
156b0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ning..**.** If p
156c0 61 72 61 6d 65 74 65 72 20 62 5a 65 72 6f 20 69  arameter bZero i
156d0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
156e0 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
156f0 20 69 6e 70 75 74 20 6c 69 73 74 20 66 6f 6c 6c   input list foll
15700 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 65 6e 64  owing.** the end
15710 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20 6c   of the output l
15720 69 73 74 20 69 73 20 7a 65 72 6f 65 64 20 62 65  ist is zeroed be
15730 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
15740 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
15750 74 73 33 43 6f 6c 75 6d 6e 46 69 6c 74 65 72 28  ts3ColumnFilter(
15760 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20  .  int iCol,    
15770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15780 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20     /* Column to 
15790 66 69 6c 74 65 72 20 6f 6e 20 2a 2f 0a 20 20 69  filter on */.  i
157a0 6e 74 20 62 5a 65 72 6f 2c 20 20 20 20 20 20 20  nt bZero,       
157b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
157c0 2a 20 5a 65 72 6f 20 6f 75 74 20 61 6e 79 74 68  * Zero out anyth
157d0 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 70  ing following *p
157e0 70 4c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20  pList */.  char 
157f0 2a 2a 70 70 4c 69 73 74 2c 20 20 20 20 20 20 20  **ppList,       
15800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
15810 2f 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f  /OUT: Pointer to
15820 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a   position list *
15830 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 69 73 74 20  /.  int *pnList 
15840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15850 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53      /* IN/OUT: S
15860 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 2a 70  ize of buffer *p
15870 70 4c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a  pList in bytes *
15880 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 4c 69  /.){.  char *pLi
15890 73 74 20 3d 20 2a 70 70 4c 69 73 74 3b 0a 20 20  st = *ppList;.  
158a0 69 6e 74 20 6e 4c 69 73 74 20 3d 20 2a 70 6e 4c  int nList = *pnL
158b0 69 73 74 3b 0a 20 20 63 68 61 72 20 2a 70 45 6e  ist;.  char *pEn
158c0 64 20 3d 20 26 70 4c 69 73 74 5b 6e 4c 69 73 74  d = &pList[nList
158d0 5d 3b 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e  ];.  int iCurren
158e0 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 70  t = 0;.  char *p
158f0 20 3d 20 70 4c 69 73 74 3b 0a 0a 20 20 61 73 73   = pList;..  ass
15900 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a  ert( iCol>=0 );.
15910 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
15920 20 20 63 68 61 72 20 63 20 3d 20 30 3b 0a 20 20    char c = 0;.  
15930 20 20 77 68 69 6c 65 28 20 70 3c 70 45 6e 64 20    while( p<pEnd 
15940 26 26 20 28 63 20 7c 20 2a 70 29 26 30 78 46 45  && (c | *p)&0xFE
15950 20 29 20 63 20 3d 20 2a 70 2b 2b 20 26 20 30 78   ) c = *p++ & 0x
15960 38 30 3b 0a 20 20 0a 20 20 20 20 69 66 28 20 69  80;.  .    if( i
15970 43 6f 6c 3d 3d 69 43 75 72 72 65 6e 74 20 29 7b  Col==iCurrent ){
15980 0a 20 20 20 20 20 20 6e 4c 69 73 74 20 3d 20 28  .      nList = (
15990 69 6e 74 29 28 70 20 2d 20 70 4c 69 73 74 29 3b  int)(p - pList);
159a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
159b0 20 20 7d 0a 0a 20 20 20 20 6e 4c 69 73 74 20 2d    }..    nList -
159c0 3d 20 28 69 6e 74 29 28 70 20 2d 20 70 4c 69 73  = (int)(p - pLis
159d0 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  t);.    pList = 
159e0 70 3b 0a 20 20 20 20 69 66 28 20 6e 4c 69 73 74  p;.    if( nList
159f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65  ==0 ){.      bre
15a00 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20  ak;.    }.    p 
15a10 3d 20 26 70 4c 69 73 74 5b 31 5d 3b 0a 20 20 20  = &pList[1];.   
15a20 20 70 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72   p += fts3GetVar
15a30 69 6e 74 33 32 28 70 2c 20 26 69 43 75 72 72 65  int32(p, &iCurre
15a40 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  nt);.  }..  if( 
15a50 62 5a 65 72 6f 20 26 26 20 26 70 4c 69 73 74 5b  bZero && &pList[
15a60 6e 4c 69 73 74 5d 21 3d 70 45 6e 64 20 29 7b 0a  nList]!=pEnd ){.
15a70 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73      memset(&pLis
15a80 74 5b 6e 4c 69 73 74 5d 2c 20 30 2c 20 70 45 6e  t[nList], 0, pEn
15a90 64 20 2d 20 26 70 4c 69 73 74 5b 6e 4c 69 73 74  d - &pList[nList
15aa0 5d 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 4c 69 73  ]);.  }.  *ppLis
15ab0 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 2a 70 6e  t = pList;.  *pn
15ac0 4c 69 73 74 20 3d 20 6e 4c 69 73 74 3b 0a 7d 0a  List = nList;.}.
15ad0 0a 2f 2a 0a 2a 2a 20 43 61 63 68 65 20 64 61 74  ./*.** Cache dat
15ae0 61 20 69 6e 20 74 68 65 20 46 74 73 33 4d 75 6c  a in the Fts3Mul
15af0 74 69 53 65 67 52 65 61 64 65 72 2e 61 42 75 66  tiSegReader.aBuf
15b00 66 65 72 5b 5d 20 62 75 66 66 65 72 20 28 6f 76  fer[] buffer (ov
15b10 65 72 77 72 69 74 69 6e 67 20 61 6e 79 0a 2a 2a  erwriting any.**
15b20 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 29 2e   existing data).
15b30 20 47 72 6f 77 20 74 68 65 20 62 75 66 66 65 72   Grow the buffer
15b40 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
15b50 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
15b60 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  l, return SQLITE
15b70 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  _OK. Otherwise, 
15b80 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  if an OOM error 
15b90 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a  is encountered.*
15ba0 2a 20 74 72 79 69 6e 67 20 74 6f 20 72 65 73 69  * trying to resi
15bb0 7a 65 20 74 68 65 20 62 75 66 66 65 72 2c 20 72  ze the buffer, r
15bc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
15bd0 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EM..*/.static in
15be0 74 20 66 74 73 33 4d 73 72 42 75 66 66 65 72 44  t fts3MsrBufferD
15bf0 61 74 61 28 0a 20 20 46 74 73 33 4d 75 6c 74 69  ata(.  Fts3Multi
15c00 53 65 67 52 65 61 64 65 72 20 2a 70 4d 73 72 2c  SegReader *pMsr,
15c10 20 20 20 20 20 20 20 2f 2a 20 4d 75 6c 74 69 2d         /* Multi-
15c20 73 65 67 6d 65 6e 74 2d 72 65 61 64 65 72 20 68  segment-reader h
15c30 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20  andle */.  char 
15c40 2a 70 4c 69 73 74 2c 0a 20 20 69 6e 74 20 6e 4c  *pList,.  int nL
15c50 69 73 74 0a 29 7b 0a 20 20 69 66 28 20 6e 4c 69  ist.){.  if( nLi
15c60 73 74 3e 70 4d 73 72 2d 3e 6e 42 75 66 66 65 72  st>pMsr->nBuffer
15c70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e   ){.    char *pN
15c80 65 77 3b 0a 20 20 20 20 70 4d 73 72 2d 3e 6e 42  ew;.    pMsr->nB
15c90 75 66 66 65 72 20 3d 20 6e 4c 69 73 74 2a 32 3b  uffer = nList*2;
15ca0 0a 20 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61  .    pNew = (cha
15cb0 72 20 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  r *)sqlite3_real
15cc0 6c 6f 63 28 70 4d 73 72 2d 3e 61 42 75 66 66 65  loc(pMsr->aBuffe
15cd0 72 2c 20 70 4d 73 72 2d 3e 6e 42 75 66 66 65 72  r, pMsr->nBuffer
15ce0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4e 65 77  );.    if( !pNew
15cf0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
15d00 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 4d 73 72  _NOMEM;.    pMsr
15d10 2d 3e 61 42 75 66 66 65 72 20 3d 20 70 4e 65 77  ->aBuffer = pNew
15d20 3b 0a 20 20 7d 0a 0a 20 20 6d 65 6d 63 70 79 28  ;.  }..  memcpy(
15d30 70 4d 73 72 2d 3e 61 42 75 66 66 65 72 2c 20 70  pMsr->aBuffer, p
15d40 4c 69 73 74 2c 20 6e 4c 69 73 74 29 3b 0a 20 20  List, nList);.  
15d50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15d60 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.}..int sqlite3
15d70 46 74 73 33 4d 73 72 49 6e 63 72 4e 65 78 74 28  Fts3MsrIncrNext(
15d80 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
15d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15da0 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
15db0 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
15dc0 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
15dd0 65 72 20 2a 70 4d 73 72 2c 20 20 20 20 20 20 20  er *pMsr,       
15de0 2f 2a 20 4d 75 6c 74 69 2d 73 65 67 6d 65 6e 74  /* Multi-segment
15df0 2d 72 65 61 64 65 72 20 68 61 6e 64 6c 65 20 2a  -reader handle *
15e00 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
15e10 34 20 2a 70 69 44 6f 63 69 64 2c 20 20 20 20 20  4 *piDocid,     
15e20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 6f 63 69      /* OUT: Doci
15e30 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 63 68 61  d value */.  cha
15e40 72 20 2a 2a 70 61 50 6f 73 6c 69 73 74 2c 20 20  r **paPoslist,  
15e50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15e60 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20  OUT: Pointer to 
15e70 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  position list */
15e80 0a 20 20 69 6e 74 20 2a 70 6e 50 6f 73 6c 69 73  .  int *pnPoslis
15e90 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
15ea0 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20     /* OUT: Size 
15eb0 6f 66 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  of position list
15ec0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a   in bytes */.){.
15ed0 20 20 69 6e 74 20 6e 4d 65 72 67 65 20 3d 20 70    int nMerge = p
15ee0 4d 73 72 2d 3e 6e 41 64 76 61 6e 63 65 3b 0a 20  Msr->nAdvance;. 
15ef0 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
15f00 2a 61 70 53 65 67 6d 65 6e 74 20 3d 20 70 4d 73  *apSegment = pMs
15f10 72 2d 3e 61 70 53 65 67 6d 65 6e 74 3b 0a 20 20  r->apSegment;.  
15f20 69 6e 74 20 28 2a 78 43 6d 70 29 28 46 74 73 33  int (*xCmp)(Fts3
15f30 53 65 67 52 65 61 64 65 72 20 2a 2c 20 46 74 73  SegReader *, Fts
15f40 33 53 65 67 52 65 61 64 65 72 20 2a 29 20 3d 20  3SegReader *) = 
15f50 28 0a 20 20 20 20 70 2d 3e 62 44 65 73 63 49 64  (.    p->bDescId
15f60 78 20 3f 20 66 74 73 33 53 65 67 52 65 61 64 65  x ? fts3SegReade
15f70 72 44 6f 63 6c 69 73 74 43 6d 70 52 65 76 20 3a  rDoclistCmpRev :
15f80 20 66 74 73 33 53 65 67 52 65 61 64 65 72 44 6f   fts3SegReaderDo
15f90 63 6c 69 73 74 43 6d 70 0a 20 20 29 3b 0a 0a 20  clistCmp.  );.. 
15fa0 20 69 66 28 20 6e 4d 65 72 67 65 3d 3d 30 20 29   if( nMerge==0 )
15fb0 7b 0a 20 20 20 20 2a 70 61 50 6f 73 6c 69 73 74  {.    *paPoslist
15fc0 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
15fd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
15fe0 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
15ff0 20 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72     Fts3SegReader
16000 20 2a 70 53 65 67 3b 0a 20 20 20 20 70 53 65 67   *pSeg;.    pSeg
16010 20 3d 20 70 4d 73 72 2d 3e 61 70 53 65 67 6d 65   = pMsr->apSegme
16020 6e 74 5b 30 5d 3b 0a 0a 20 20 20 20 69 66 28 20  nt[0];..    if( 
16030 70 53 65 67 2d 3e 70 4f 66 66 73 65 74 4c 69 73  pSeg->pOffsetLis
16040 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  t==0 ){.      *p
16050 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b 0a 20 20  aPoslist = 0;.  
16060 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16070 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
16080 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  rc;.      char *
16090 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  pList;.      int
160a0 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e   nList;.      in
160b0 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t j;.      sqlit
160c0 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 20  e3_int64 iDocid 
160d0 3d 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e  = apSegment[0]->
160e0 69 44 6f 63 69 64 3b 0a 0a 20 20 20 20 20 20 72  iDocid;..      r
160f0 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65  c = fts3SegReade
16100 72 4e 65 78 74 44 6f 63 69 64 28 70 2c 20 61 70  rNextDocid(p, ap
16110 53 65 67 6d 65 6e 74 5b 30 5d 2c 20 26 70 4c 69  Segment[0], &pLi
16120 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20  st, &nList);.   
16130 20 20 20 6a 20 3d 20 31 3b 0a 20 20 20 20 20 20     j = 1;.      
16140 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
16150 45 5f 4f 4b 20 0a 20 20 20 20 20 20 20 20 26 26  E_OK .        &&
16160 20 6a 3c 6e 4d 65 72 67 65 0a 20 20 20 20 20 20   j<nMerge.      
16170 20 20 26 26 20 61 70 53 65 67 6d 65 6e 74 5b 6a    && apSegment[j
16180 5d 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 0a 20  ]->pOffsetList. 
16190 20 20 20 20 20 20 20 26 26 20 61 70 53 65 67 6d         && apSegm
161a0 65 6e 74 5b 6a 5d 2d 3e 69 44 6f 63 69 64 3d 3d  ent[j]->iDocid==
161b0 69 44 6f 63 69 64 0a 20 20 20 20 20 20 29 7b 0a  iDocid.      ){.
161c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
161d0 33 53 65 67 52 65 61 64 65 72 4e 65 78 74 44 6f  3SegReaderNextDo
161e0 63 69 64 28 70 2c 20 61 70 53 65 67 6d 65 6e 74  cid(p, apSegment
161f0 5b 6a 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  [j], 0, 0);.    
16200 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d      j++;.      }
16210 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
16220 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
16230 6e 20 72 63 3b 0a 20 20 20 20 20 20 66 74 73 33  n rc;.      fts3
16240 53 65 67 52 65 61 64 65 72 53 6f 72 74 28 70 4d  SegReaderSort(pM
16250 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 2c 20 6e  sr->apSegment, n
16260 4d 65 72 67 65 2c 20 6a 2c 20 78 43 6d 70 29 3b  Merge, j, xCmp);
16270 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 4c 69 73  ..      if( nLis
16280 74 3e 30 20 26 26 20 66 74 73 33 53 65 67 52 65  t>0 && fts3SegRe
16290 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28 61 70  aderIsPending(ap
162a0 53 65 67 6d 65 6e 74 5b 30 5d 29 20 29 7b 0a 20  Segment[0]) ){. 
162b0 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33         rc = fts3
162c0 4d 73 72 42 75 66 66 65 72 44 61 74 61 28 70 4d  MsrBufferData(pM
162d0 73 72 2c 20 70 4c 69 73 74 2c 20 6e 4c 69 73 74  sr, pList, nList
162e0 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  +1);.        if(
162f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16300 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16310 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4d 73      assert( (pMs
16320 72 2d 3e 61 42 75 66 66 65 72 5b 6e 4c 69 73 74  r->aBuffer[nList
16330 5d 20 26 20 30 78 46 45 29 3d 3d 30 78 30 30 20  ] & 0xFE)==0x00 
16340 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  );.        pList
16350 20 3d 20 70 4d 73 72 2d 3e 61 42 75 66 66 65 72   = pMsr->aBuffer
16360 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
16370 20 69 66 28 20 70 4d 73 72 2d 3e 69 43 6f 6c 46   if( pMsr->iColF
16380 69 6c 74 65 72 3e 3d 30 20 29 7b 0a 20 20 20 20  ilter>=0 ){.    
16390 20 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e 46 69      fts3ColumnFi
163a0 6c 74 65 72 28 70 4d 73 72 2d 3e 69 43 6f 6c 46  lter(pMsr->iColF
163b0 69 6c 74 65 72 2c 20 31 2c 20 26 70 4c 69 73 74  ilter, 1, &pList
163c0 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20  , &nList);.     
163d0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 4c   }..      if( nL
163e0 69 73 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ist>0 ){.       
163f0 20 2a 70 61 50 6f 73 6c 69 73 74 20 3d 20 70 4c   *paPoslist = pL
16400 69 73 74 3b 0a 20 20 20 20 20 20 20 20 2a 70 69  ist;.        *pi
16410 44 6f 63 69 64 20 3d 20 69 44 6f 63 69 64 3b 0a  Docid = iDocid;.
16420 20 20 20 20 20 20 20 20 2a 70 6e 50 6f 73 6c 69          *pnPosli
16430 73 74 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20  st = nList;.    
16440 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
16450 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
16460 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16470 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
16480 66 74 73 33 53 65 67 52 65 61 64 65 72 53 74 61  fts3SegReaderSta
16490 72 74 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  rt(.  Fts3Table 
164a0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
164b0 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c        /* Virtual
164c0 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   table handle */
164d0 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52  .  Fts3MultiSegR
164e0 65 61 64 65 72 20 2a 70 43 73 72 2c 20 20 20 20  eader *pCsr,    
164f0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a     /* Cursor obj
16500 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ect */.  const c
16510 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20  har *zTerm,     
16520 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d           /* Term
16530 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 28 6f   searched for (o
16540 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74  r NULL) */.  int
16550 20 6e 54 65 72 6d 20 20 20 20 20 20 20 20 20 20   nTerm          
16560 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16570 4c 65 6e 67 74 68 20 6f 66 20 7a 54 65 72 6d 20  Length of zTerm 
16580 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20  in bytes */.){. 
16590 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 53   int i;.  int nS
165a0 65 67 20 3d 20 70 43 73 72 2d 3e 6e 53 65 67 6d  eg = pCsr->nSegm
165b0 65 6e 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ent;..  /* If th
165c0 65 20 46 74 73 33 53 65 67 46 69 6c 74 65 72 20  e Fts3SegFilter 
165d0 64 65 66 69 6e 65 73 20 61 20 73 70 65 63 69 66  defines a specif
165e0 69 63 20 74 65 72 6d 20 28 6f 72 20 74 65 72 6d  ic term (or term
165f0 20 70 72 65 66 69 78 29 20 74 6f 20 73 65 61 72   prefix) to sear
16600 63 68 20 0a 20 20 2a 2a 20 66 6f 72 2c 20 74 68  ch .  ** for, th
16610 65 6e 20 61 64 76 61 6e 63 65 20 65 61 63 68 20  en advance each 
16620 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72  segment iterator
16630 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73   until it points
16640 20 74 6f 20 61 20 74 65 72 6d 20 6f 66 0a 20 20   to a term of.  
16650 2a 2a 20 65 71 75 61 6c 20 6f 72 20 67 72 65 61  ** equal or grea
16660 74 65 72 20 76 61 6c 75 65 20 74 68 61 6e 20 74  ter value than t
16670 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65 72  he specified ter
16680 6d 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74 73  m. This prevents
16690 20 6d 61 6e 79 0a 20 20 2a 2a 20 75 6e 6e 65 63   many.  ** unnec
166a0 65 73 73 61 72 79 20 6d 65 72 67 65 2f 73 6f 72  essary merge/sor
166b0 74 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 6f 72  t operations for
166c0 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20   the case where 
166d0 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 0a 20  single segment. 
166e0 20 2a 2a 20 62 2d 74 72 65 65 20 6c 65 61 66 20   ** b-tree leaf 
166f0 6e 6f 64 65 73 20 63 6f 6e 74 61 69 6e 20 6d 6f  nodes contain mo
16700 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 65 72 6d  re than one term
16710 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
16720 3b 20 70 43 73 72 2d 3e 62 52 65 73 74 61 72 74  ; pCsr->bRestart
16730 3d 3d 30 20 26 26 20 69 3c 70 43 73 72 2d 3e 6e  ==0 && i<pCsr->n
16740 53 65 67 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20  Segment; i++){. 
16750 20 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a     int res = 0;.
16760 20 20 20 20 46 74 73 33 53 65 67 52 65 61 64 65      Fts3SegReade
16770 72 20 2a 70 53 65 67 20 3d 20 70 43 73 72 2d 3e  r *pSeg = pCsr->
16780 61 70 53 65 67 6d 65 6e 74 5b 69 5d 3b 0a 20 20  apSegment[i];.  
16790 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 6e 74    do {.      int
167a0 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61   rc = fts3SegRea
167b0 64 65 72 4e 65 78 74 28 70 2c 20 70 53 65 67 2c  derNext(p, pSeg,
167c0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
167d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
167e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 77  eturn rc;.    }w
167f0 68 69 6c 65 28 20 7a 54 65 72 6d 20 26 26 20 28  hile( zTerm && (
16800 72 65 73 20 3d 20 66 74 73 33 53 65 67 52 65 61  res = fts3SegRea
16810 64 65 72 54 65 72 6d 43 6d 70 28 70 53 65 67 2c  derTermCmp(pSeg,
16820 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 29 3c   zTerm, nTerm))<
16830 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 53  0 );..    if( pS
16840 65 67 2d 3e 62 4c 6f 6f 6b 75 70 20 26 26 20 72  eg->bLookup && r
16850 65 73 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  es!=0 ){.      f
16860 74 73 33 53 65 67 52 65 61 64 65 72 53 65 74 45  ts3SegReaderSetE
16870 6f 66 28 70 53 65 67 29 3b 0a 20 20 20 20 7d 0a  of(pSeg);.    }.
16880 20 20 7d 0a 20 20 66 74 73 33 53 65 67 52 65 61    }.  fts3SegRea
16890 64 65 72 53 6f 72 74 28 70 43 73 72 2d 3e 61 70  derSort(pCsr->ap
168a0 53 65 67 6d 65 6e 74 2c 20 6e 53 65 67 2c 20 6e  Segment, nSeg, n
168b0 53 65 67 2c 20 66 74 73 33 53 65 67 52 65 61 64  Seg, fts3SegRead
168c0 65 72 43 6d 70 29 3b 0a 0a 20 20 72 65 74 75 72  erCmp);..  retur
168d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
168e0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 53  int sqlite3Fts3S
168f0 65 67 52 65 61 64 65 72 53 74 61 72 74 28 0a 20  egReaderStart(. 
16900 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
16910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16920 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
16930 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74  e handle */.  Ft
16940 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
16950 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 2f 2a   *pCsr,       /*
16960 20 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a   Cursor object *
16970 2f 0a 20 20 46 74 73 33 53 65 67 46 69 6c 74 65  /.  Fts3SegFilte
16980 72 20 2a 70 46 69 6c 74 65 72 20 20 20 20 20 20  r *pFilter      
16990 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
169a0 6f 6e 73 20 6f 6e 20 72 61 6e 67 65 20 6f 66 20  ons on range of 
169b0 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 29 7b 0a  iteration */.){.
169c0 20 20 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 20    pCsr->pFilter 
169d0 3d 20 70 46 69 6c 74 65 72 3b 0a 20 20 72 65 74  = pFilter;.  ret
169e0 75 72 6e 20 66 74 73 33 53 65 67 52 65 61 64 65  urn fts3SegReade
169f0 72 53 74 61 72 74 28 70 2c 20 70 43 73 72 2c 20  rStart(p, pCsr, 
16a00 70 46 69 6c 74 65 72 2d 3e 7a 54 65 72 6d 2c 20  pFilter->zTerm, 
16a10 70 46 69 6c 74 65 72 2d 3e 6e 54 65 72 6d 29 3b  pFilter->nTerm);
16a20 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .}..int sqlite3F
16a30 74 73 33 4d 73 72 49 6e 63 72 53 74 61 72 74 28  ts3MsrIncrStart(
16a40 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
16a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a60 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
16a70 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
16a80 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
16a90 65 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20  er *pCsr,       
16aa0 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65 63 74  /* Cursor object
16ab0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20   */.  int iCol, 
16ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ad0 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
16ae0 74 6f 20 6d 61 74 63 68 20 6f 6e 2e 20 2a 2f 0a  to match on. */.
16af0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
16b00 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
16b10 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 69 74 65    /* Term to ite
16b20 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 20 64  rate through a d
16b30 6f 63 6c 69 73 74 20 66 6f 72 20 2a 2f 0a 20 20  oclist for */.  
16b40 69 6e 74 20 6e 54 65 72 6d 20 20 20 20 20 20 20  int nTerm       
16b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b60 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
16b70 65 73 20 69 6e 20 7a 54 65 72 6d 20 2a 2f 0a 29  es in zTerm */.)
16b80 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
16b90 20 72 63 3b 0a 20 20 69 6e 74 20 6e 53 65 67 6d   rc;.  int nSegm
16ba0 65 6e 74 20 3d 20 70 43 73 72 2d 3e 6e 53 65 67  ent = pCsr->nSeg
16bb0 6d 65 6e 74 3b 0a 20 20 69 6e 74 20 28 2a 78 43  ment;.  int (*xC
16bc0 6d 70 29 28 46 74 73 33 53 65 67 52 65 61 64 65  mp)(Fts3SegReade
16bd0 72 20 2a 2c 20 46 74 73 33 53 65 67 52 65 61 64  r *, Fts3SegRead
16be0 65 72 20 2a 29 20 3d 20 28 0a 20 20 20 20 70 2d  er *) = (.    p-
16bf0 3e 62 44 65 73 63 49 64 78 20 3f 20 66 74 73 33  >bDescIdx ? fts3
16c00 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74  SegReaderDoclist
16c10 43 6d 70 52 65 76 20 3a 20 66 74 73 33 53 65 67  CmpRev : fts3Seg
16c20 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70  ReaderDoclistCmp
16c30 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  .  );..  assert(
16c40 20 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 3d 3d   pCsr->pFilter==
16c50 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  0 );.  assert( z
16c60 54 65 72 6d 20 26 26 20 6e 54 65 72 6d 3e 30 20  Term && nTerm>0 
16c70 29 3b 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  );..  /* Advance
16c80 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 69 74   each segment it
16c90 65 72 61 74 6f 72 20 75 6e 74 69 6c 20 69 74 20  erator until it 
16ca0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 65  points to the te
16cb0 72 6d 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 20  rm zTerm/nTerm. 
16cc0 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73 33 53 65  */.  rc = fts3Se
16cd0 67 52 65 61 64 65 72 53 74 61 72 74 28 70 2c 20  gReaderStart(p, 
16ce0 70 43 73 72 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  pCsr, zTerm, nTe
16cf0 72 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  rm);.  if( rc!=S
16d00 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
16d10 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 65 74 65  n rc;..  /* Dete
16d20 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 6f  rmine how many o
16d30 66 20 74 68 65 20 73 65 67 6d 65 6e 74 73 20 61  f the segments a
16d40 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 20 74 6f  ctually point to
16d50 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 2a 2f   zTerm/nTerm. */
16d60 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53  .  for(i=0; i<nS
16d70 65 67 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  egment; i++){.  
16d80 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
16d90 2a 70 53 65 67 20 3d 20 70 43 73 72 2d 3e 61 70  *pSeg = pCsr->ap
16da0 53 65 67 6d 65 6e 74 5b 69 5d 3b 0a 20 20 20 20  Segment[i];.    
16db0 69 66 28 20 21 70 53 65 67 2d 3e 61 4e 6f 64 65  if( !pSeg->aNode
16dc0 20 7c 7c 20 66 74 73 33 53 65 67 52 65 61 64 65   || fts3SegReade
16dd0 72 54 65 72 6d 43 6d 70 28 70 53 65 67 2c 20 7a  rTermCmp(pSeg, z
16de0 54 65 72 6d 2c 20 6e 54 65 72 6d 29 20 29 7b 0a  Term, nTerm) ){.
16df0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16e00 20 7d 0a 20 20 7d 0a 20 20 70 43 73 72 2d 3e 6e   }.  }.  pCsr->n
16e10 41 64 76 61 6e 63 65 20 3d 20 69 3b 0a 0a 20 20  Advance = i;..  
16e20 2f 2a 20 41 64 76 61 6e 63 65 20 65 61 63 68 20  /* Advance each 
16e30 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 73 20  of the segments 
16e40 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
16e50 66 69 72 73 74 20 64 6f 63 69 64 2e 20 2a 2f 0a  first docid. */.
16e60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73    for(i=0; i<pCs
16e70 72 2d 3e 6e 41 64 76 61 6e 63 65 3b 20 69 2b 2b  r->nAdvance; i++
16e80 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  ){.    rc = fts3
16e90 53 65 67 52 65 61 64 65 72 46 69 72 73 74 44 6f  SegReaderFirstDo
16ea0 63 69 64 28 70 2c 20 70 43 73 72 2d 3e 61 70 53  cid(p, pCsr->apS
16eb0 65 67 6d 65 6e 74 5b 69 5d 29 3b 0a 20 20 20 20  egment[i]);.    
16ec0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16ed0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
16ee0 20 7d 0a 20 20 66 74 73 33 53 65 67 52 65 61 64   }.  fts3SegRead
16ef0 65 72 53 6f 72 74 28 70 43 73 72 2d 3e 61 70 53  erSort(pCsr->apS
16f00 65 67 6d 65 6e 74 2c 20 69 2c 20 69 2c 20 78 43  egment, i, i, xC
16f10 6d 70 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  mp);..  assert( 
16f20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3c 70  iCol<0 || iCol<p
16f30 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 70  ->nColumn );.  p
16f40 43 73 72 2d 3e 69 43 6f 6c 46 69 6c 74 65 72 20  Csr->iColFilter 
16f50 3d 20 69 43 6f 6c 3b 0a 0a 20 20 72 65 74 75 72  = iCol;..  retur
16f60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
16f70 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
16f80 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  ion is called on
16f90 20 61 20 4d 75 6c 74 69 53 65 67 52 65 61 64 65   a MultiSegReade
16fa0 72 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  r that has been 
16fb0 73 74 61 72 74 65 64 20 75 73 69 6e 67 0a 2a 2a  started using.**
16fc0 20 73 71 6c 69 74 65 33 46 74 73 33 4d 73 72 49   sqlite3Fts3MsrI
16fd0 6e 63 72 53 74 61 72 74 28 29 2e 20 4f 6e 65 20  ncrStart(). One 
16fe0 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f  or more calls to
16ff0 20 4d 73 72 49 6e 63 72 4e 65 78 74 28 29 20 6d   MsrIncrNext() m
17000 61 79 20 61 6c 73 6f 0a 2a 2a 20 68 61 76 65 20  ay also.** have 
17010 62 65 65 6e 20 6d 61 64 65 2e 20 43 61 6c 6c 69  been made. Calli
17020 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
17030 20 70 75 74 73 20 74 68 65 20 4d 75 6c 74 69 53   puts the MultiS
17040 65 67 52 65 61 64 65 72 20 69 6e 20 73 75 63 68  egReader in such
17050 0a 2a 2a 20 61 20 73 74 61 74 65 20 74 68 61 74  .** a state that
17060 20 69 66 20 74 68 65 20 6e 65 78 74 20 74 77 6f   if the next two
17070 20 63 61 6c 6c 73 20 61 72 65 3a 0a 2a 2a 0a 2a   calls are:.**.*
17080 2a 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 53  *   sqlite3Fts3S
17090 65 67 52 65 61 64 65 72 53 74 61 72 74 28 29 0a  egReaderStart().
170a0 2a 2a 20 20 20 73 71 6c 69 74 65 33 46 74 73 33  **   sqlite3Fts3
170b0 53 65 67 52 65 61 64 65 72 53 74 65 70 28 29 0a  SegReaderStep().
170c0 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 65  **.** then the e
170d0 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20 66 6f  ntire doclist fo
170e0 72 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 76  r the term is av
170f0 61 69 6c 61 62 6c 65 20 69 6e 20 0a 2a 2a 20 4d  ailable in .** M
17100 75 6c 74 69 53 65 67 52 65 61 64 65 72 2e 61 44  ultiSegReader.aD
17110 6f 63 6c 69 73 74 2f 6e 44 6f 63 6c 69 73 74 2e  oclist/nDoclist.
17120 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
17130 74 73 33 4d 73 72 49 6e 63 72 52 65 73 74 61 72  ts3MsrIncrRestar
17140 74 28 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65  t(Fts3MultiSegRe
17150 61 64 65 72 20 2a 70 43 73 72 29 7b 0a 20 20 69  ader *pCsr){.  i
17160 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
17170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17180 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
17190 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e  e through segmen
171a0 74 2d 72 65 61 64 65 72 73 20 2a 2f 0a 0a 20 20  t-readers */..  
171b0 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 7a 54  assert( pCsr->zT
171c0 65 72 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  erm==0 );.  asse
171d0 72 74 28 20 70 43 73 72 2d 3e 6e 54 65 72 6d 3d  rt( pCsr->nTerm=
171e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
171f0 70 43 73 72 2d 3e 61 44 6f 63 6c 69 73 74 3d 3d  pCsr->aDoclist==
17200 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
17210 43 73 72 2d 3e 6e 44 6f 63 6c 69 73 74 3d 3d 30  Csr->nDoclist==0
17220 20 29 3b 0a 0a 20 20 70 43 73 72 2d 3e 6e 41 64   );..  pCsr->nAd
17230 76 61 6e 63 65 20 3d 20 30 3b 0a 20 20 70 43 73  vance = 0;.  pCs
17240 72 2d 3e 62 52 65 73 74 61 72 74 20 3d 20 31 3b  r->bRestart = 1;
17250 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43  .  for(i=0; i<pC
17260 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 20 69 2b  sr->nSegment; i+
17270 2b 29 7b 0a 20 20 20 20 70 43 73 72 2d 3e 61 70  +){.    pCsr->ap
17280 53 65 67 6d 65 6e 74 5b 69 5d 2d 3e 70 4f 66 66  Segment[i]->pOff
17290 73 65 74 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  setList = 0;.   
172a0 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74   pCsr->apSegment
172b0 5b 69 5d 2d 3e 6e 4f 66 66 73 65 74 4c 69 73 74  [i]->nOffsetList
172c0 20 3d 20 30 3b 0a 20 20 20 20 70 43 73 72 2d 3e   = 0;.    pCsr->
172d0 61 70 53 65 67 6d 65 6e 74 5b 69 5d 2d 3e 69 44  apSegment[i]->iD
172e0 6f 63 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  ocid = 0;.  }.. 
172f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17300 4b 3b 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69 74  K;.}...int sqlit
17310 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 53  e3Fts3SegReaderS
17320 74 65 70 28 0a 20 20 46 74 73 33 54 61 62 6c 65  tep(.  Fts3Table
17330 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
17340 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61         /* Virtua
17350 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  l table handle *
17360 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67  /.  Fts3MultiSeg
17370 52 65 61 64 65 72 20 2a 70 43 73 72 20 20 20 20  Reader *pCsr    
17380 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62      /* Cursor ob
17390 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ject */.){.  int
173a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
173b0 0a 0a 20 20 69 6e 74 20 69 73 49 67 6e 6f 72 65  ..  int isIgnore
173c0 45 6d 70 74 79 20 3d 20 20 28 70 43 73 72 2d 3e  Empty =  (pCsr->
173d0 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26  pFilter->flags &
173e0 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 49 47   FTS3_SEGMENT_IG
173f0 4e 4f 52 45 5f 45 4d 50 54 59 29 3b 0a 20 20 69  NORE_EMPTY);.  i
17400 6e 74 20 69 73 52 65 71 75 69 72 65 50 6f 73 20  nt isRequirePos 
17410 3d 20 20 20 28 70 43 73 72 2d 3e 70 46 69 6c 74  =   (pCsr->pFilt
17420 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 33  er->flags & FTS3
17430 5f 53 45 47 4d 45 4e 54 5f 52 45 51 55 49 52 45  _SEGMENT_REQUIRE
17440 5f 50 4f 53 29 3b 0a 20 20 69 6e 74 20 69 73 43  _POS);.  int isC
17450 6f 6c 46 69 6c 74 65 72 20 3d 20 20 20 20 28 70  olFilter =    (p
17460 43 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e 66 6c  Csr->pFilter->fl
17470 61 67 73 20 26 20 46 54 53 33 5f 53 45 47 4d 45  ags & FTS3_SEGME
17480 4e 54 5f 43 4f 4c 55 4d 4e 5f 46 49 4c 54 45 52  NT_COLUMN_FILTER
17490 29 3b 0a 20 20 69 6e 74 20 69 73 50 72 65 66 69  );.  int isPrefi
174a0 78 20 3d 20 20 20 20 20 20 20 28 70 43 73 72 2d  x =       (pCsr-
174b0 3e 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20  >pFilter->flags 
174c0 26 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 50  & FTS3_SEGMENT_P
174d0 52 45 46 49 58 29 3b 0a 20 20 69 6e 74 20 69 73  REFIX);.  int is
174e0 53 63 61 6e 20 3d 20 20 20 20 20 20 20 20 20 28  Scan =         (
174f0 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e 66  pCsr->pFilter->f
17500 6c 61 67 73 20 26 20 46 54 53 33 5f 53 45 47 4d  lags & FTS3_SEGM
17510 45 4e 54 5f 53 43 41 4e 29 3b 0a 20 20 69 6e 74  ENT_SCAN);.  int
17520 20 69 73 46 69 72 73 74 20 3d 20 20 20 20 20 20   isFirst =      
17530 20 20 28 70 43 73 72 2d 3e 70 46 69 6c 74 65 72    (pCsr->pFilter
17540 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 33 5f 53  ->flags & FTS3_S
17550 45 47 4d 45 4e 54 5f 46 49 52 53 54 29 3b 0a 0a  EGMENT_FIRST);..
17560 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
17570 2a 2a 61 70 53 65 67 6d 65 6e 74 20 3d 20 70 43  **apSegment = pC
17580 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 3b 0a 20  sr->apSegment;. 
17590 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20   int nSegment = 
175a0 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a  pCsr->nSegment;.
175b0 20 20 46 74 73 33 53 65 67 46 69 6c 74 65 72 20    Fts3SegFilter 
175c0 2a 70 46 69 6c 74 65 72 20 3d 20 70 43 73 72 2d  *pFilter = pCsr-
175d0 3e 70 46 69 6c 74 65 72 3b 0a 20 20 69 6e 74 20  >pFilter;.  int 
175e0 28 2a 78 43 6d 70 29 28 46 74 73 33 53 65 67 52  (*xCmp)(Fts3SegR
175f0 65 61 64 65 72 20 2a 2c 20 46 74 73 33 53 65 67  eader *, Fts3Seg
17600 52 65 61 64 65 72 20 2a 29 20 3d 20 28 0a 20 20  Reader *) = (.  
17610 20 20 70 2d 3e 62 44 65 73 63 49 64 78 20 3f 20    p->bDescIdx ? 
17620 66 74 73 33 53 65 67 52 65 61 64 65 72 44 6f 63  fts3SegReaderDoc
17630 6c 69 73 74 43 6d 70 52 65 76 20 3a 20 66 74 73  listCmpRev : fts
17640 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73  3SegReaderDoclis
17650 74 43 6d 70 0a 20 20 29 3b 0a 0a 20 20 69 66 28  tCmp.  );..  if(
17660 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3d   pCsr->nSegment=
17670 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
17680 54 45 5f 4f 4b 3b 0a 0a 20 20 64 6f 20 7b 0a 20  TE_OK;..  do {. 
17690 20 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b 0a 20     int nMerge;. 
176a0 20 20 20 69 6e 74 20 69 3b 0a 20 20 0a 20 20 20     int i;.  .   
176b0 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20   /* Advance the 
176c0 66 69 72 73 74 20 70 43 73 72 2d 3e 6e 41 64 76  first pCsr->nAdv
176d0 61 6e 63 65 20 65 6e 74 72 69 65 73 20 69 6e 20  ance entries in 
176e0 74 68 65 20 61 70 53 65 67 6d 65 6e 74 5b 5d 20  the apSegment[] 
176f0 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 66 6f 72  array.    ** for
17700 77 61 72 64 2e 20 54 68 65 6e 20 73 6f 72 74 20  ward. Then sort 
17710 74 68 65 20 6c 69 73 74 20 69 6e 20 6f 72 64 65  the list in orde
17720 72 20 6f 66 20 63 75 72 72 65 6e 74 20 74 65 72  r of current ter
17730 6d 20 61 67 61 69 6e 2e 20 20 0a 20 20 20 20 2a  m again.  .    *
17740 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
17750 3c 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65 3b  <pCsr->nAdvance;
17760 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73   i++){.      Fts
17770 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67  3SegReader *pSeg
17780 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 69 5d 3b   = apSegment[i];
17790 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d  .      if( pSeg-
177a0 3e 62 4c 6f 6f 6b 75 70 20 29 7b 0a 20 20 20 20  >bLookup ){.    
177b0 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65      fts3SegReade
177c0 72 53 65 74 45 6f 66 28 70 53 65 67 29 3b 0a 20  rSetEof(pSeg);. 
177d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
177e0 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67      rc = fts3Seg
177f0 52 65 61 64 65 72 4e 65 78 74 28 70 2c 20 70 53  ReaderNext(p, pS
17800 65 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  eg, 0);.      }.
17810 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17820 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
17830 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66   rc;.    }.    f
17840 74 73 33 53 65 67 52 65 61 64 65 72 53 6f 72 74  ts3SegReaderSort
17850 28 61 70 53 65 67 6d 65 6e 74 2c 20 6e 53 65 67  (apSegment, nSeg
17860 6d 65 6e 74 2c 20 70 43 73 72 2d 3e 6e 41 64 76  ment, pCsr->nAdv
17870 61 6e 63 65 2c 20 66 74 73 33 53 65 67 52 65 61  ance, fts3SegRea
17880 64 65 72 43 6d 70 29 3b 0a 20 20 20 20 70 43 73  derCmp);.    pCs
17890 72 2d 3e 6e 41 64 76 61 6e 63 65 20 3d 20 30 3b  r->nAdvance = 0;
178a0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20  ..    /* If all 
178b0 74 68 65 20 73 65 67 2d 72 65 61 64 65 72 73 20  the seg-readers 
178c0 61 72 65 20 61 74 20 45 4f 46 2c 20 77 65 27 72  are at EOF, we'r
178d0 65 20 66 69 6e 69 73 68 65 64 2e 20 72 65 74 75  e finished. retu
178e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 2a 2f  rn SQLITE_OK. */
178f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
17900 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
17910 20 20 69 66 28 20 61 70 53 65 67 6d 65 6e 74 5b    if( apSegment[
17920 30 5d 2d 3e 61 4e 6f 64 65 3d 3d 30 20 29 20 62  0]->aNode==0 ) b
17930 72 65 61 6b 3b 0a 0a 20 20 20 20 70 43 73 72 2d  reak;..    pCsr-
17940 3e 6e 54 65 72 6d 20 3d 20 61 70 53 65 67 6d 65  >nTerm = apSegme
17950 6e 74 5b 30 5d 2d 3e 6e 54 65 72 6d 3b 0a 20 20  nt[0]->nTerm;.  
17960 20 20 70 43 73 72 2d 3e 7a 54 65 72 6d 20 3d 20    pCsr->zTerm = 
17970 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 7a 54  apSegment[0]->zT
17980 65 72 6d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  erm;..    /* If 
17990 74 68 69 73 20 69 73 20 61 20 70 72 65 66 69 78  this is a prefix
179a0 2d 73 65 61 72 63 68 2c 20 61 6e 64 20 69 66 20  -search, and if 
179b0 74 68 65 20 74 65 72 6d 20 74 68 61 74 20 61 70  the term that ap
179c0 53 65 67 6d 65 6e 74 5b 30 5d 20 70 6f 69 6e 74  Segment[0] point
179d0 73 0a 20 20 20 20 2a 2a 20 74 6f 20 64 6f 65 73  s.    ** to does
179e0 20 6e 6f 74 20 73 68 61 72 65 20 61 20 73 75 66   not share a suf
179f0 66 69 78 20 77 69 74 68 20 70 46 69 6c 74 65 72  fix with pFilter
17a00 2d 3e 7a 54 65 72 6d 2f 6e 54 65 72 6d 2c 20 74  ->zTerm/nTerm, t
17a10 68 65 6e 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20  hen all .    ** 
17a20 72 65 71 75 69 72 65 64 20 63 61 6c 6c 62 61 63  required callbac
17a30 6b 73 20 68 61 76 65 20 62 65 65 6e 20 6d 61 64  ks have been mad
17a40 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
17a50 65 78 69 74 20 65 61 72 6c 79 2e 0a 20 20 20 20  exit early..    
17a60 2a 2a 0a 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61  **.    ** Simila
17a70 72 6c 79 2c 20 69 66 20 74 68 69 73 20 69 73 20  rly, if this is 
17a80 61 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20  a search for an 
17a90 65 78 61 63 74 20 6d 61 74 63 68 2c 20 61 6e 64  exact match, and
17aa0 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 0a   the first term.
17ab0 20 20 20 20 2a 2a 20 6f 66 20 73 65 67 6d 65 6e      ** of segmen
17ac0 74 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 20 69  t apSegment[0] i
17ad0 73 20 6e 6f 74 20 61 20 6d 61 74 63 68 2c 20 65  s not a match, e
17ae0 78 69 74 20 65 61 72 6c 79 2e 0a 20 20 20 20 2a  xit early..    *
17af0 2f 0a 20 20 20 20 69 66 28 20 70 46 69 6c 74 65  /.    if( pFilte
17b00 72 2d 3e 7a 54 65 72 6d 20 26 26 20 21 69 73 53  r->zTerm && !isS
17b10 63 61 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  can ){.      if(
17b20 20 70 43 73 72 2d 3e 6e 54 65 72 6d 3c 70 46 69   pCsr->nTerm<pFi
17b30 6c 74 65 72 2d 3e 6e 54 65 72 6d 20 0a 20 20 20  lter->nTerm .   
17b40 20 20 20 20 7c 7c 20 28 21 69 73 50 72 65 66 69      || (!isPrefi
17b50 78 20 26 26 20 70 43 73 72 2d 3e 6e 54 65 72 6d  x && pCsr->nTerm
17b60 3e 70 46 69 6c 74 65 72 2d 3e 6e 54 65 72 6d 29  >pFilter->nTerm)
17b70 0a 20 20 20 20 20 20 20 7c 7c 20 6d 65 6d 63 6d  .       || memcm
17b80 70 28 70 43 73 72 2d 3e 7a 54 65 72 6d 2c 20 70  p(pCsr->zTerm, p
17b90 46 69 6c 74 65 72 2d 3e 7a 54 65 72 6d 2c 20 70  Filter->zTerm, p
17ba0 46 69 6c 74 65 72 2d 3e 6e 54 65 72 6d 29 20 0a  Filter->nTerm) .
17bb0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
17bc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
17bd0 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4d 65 72 67      }..    nMerg
17be0 65 20 3d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65  e = 1;.    while
17bf0 28 20 6e 4d 65 72 67 65 3c 6e 53 65 67 6d 65 6e  ( nMerge<nSegmen
17c00 74 20 0a 20 20 20 20 20 20 20 20 26 26 20 61 70  t .        && ap
17c10 53 65 67 6d 65 6e 74 5b 6e 4d 65 72 67 65 5d 2d  Segment[nMerge]-
17c20 3e 61 4e 6f 64 65 0a 20 20 20 20 20 20 20 20 26  >aNode.        &
17c30 26 20 61 70 53 65 67 6d 65 6e 74 5b 6e 4d 65 72  & apSegment[nMer
17c40 67 65 5d 2d 3e 6e 54 65 72 6d 3d 3d 70 43 73 72  ge]->nTerm==pCsr
17c50 2d 3e 6e 54 65 72 6d 20 0a 20 20 20 20 20 20 20  ->nTerm .       
17c60 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 43   && 0==memcmp(pC
17c70 73 72 2d 3e 7a 54 65 72 6d 2c 20 61 70 53 65 67  sr->zTerm, apSeg
17c80 6d 65 6e 74 5b 6e 4d 65 72 67 65 5d 2d 3e 7a 54  ment[nMerge]->zT
17c90 65 72 6d 2c 20 70 43 73 72 2d 3e 6e 54 65 72 6d  erm, pCsr->nTerm
17ca0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e  ).    ){.      n
17cb0 4d 65 72 67 65 2b 2b 3b 0a 20 20 20 20 7d 0a 0a  Merge++;.    }..
17cc0 20 20 20 20 61 73 73 65 72 74 28 20 69 73 49 67      assert( isIg
17cd0 6e 6f 72 65 45 6d 70 74 79 20 7c 7c 20 28 69 73  noreEmpty || (is
17ce0 52 65 71 75 69 72 65 50 6f 73 20 26 26 20 21 69  RequirePos && !i
17cf0 73 43 6f 6c 46 69 6c 74 65 72 29 20 29 3b 0a 20  sColFilter) );. 
17d00 20 20 20 69 66 28 20 6e 4d 65 72 67 65 3d 3d 31     if( nMerge==1
17d10 20 0a 20 20 20 20 20 26 26 20 21 69 73 49 67 6e   .     && !isIgn
17d20 6f 72 65 45 6d 70 74 79 20 0a 20 20 20 20 20 26  oreEmpty .     &
17d30 26 20 21 69 73 46 69 72 73 74 20 0a 20 20 20 20  & !isFirst .    
17d40 20 26 26 20 28 70 2d 3e 62 44 65 73 63 49 64 78   && (p->bDescIdx
17d50 3d 3d 30 20 7c 7c 20 66 74 73 33 53 65 67 52 65  ==0 || fts3SegRe
17d60 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28 61 70  aderIsPending(ap
17d70 53 65 67 6d 65 6e 74 5b 30 5d 29 3d 3d 30 29 0a  Segment[0])==0).
17d80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 43 73      ){.      pCs
17d90 72 2d 3e 6e 44 6f 63 6c 69 73 74 20 3d 20 61 70  r->nDoclist = ap
17da0 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 6e 44 6f 63  Segment[0]->nDoc
17db0 6c 69 73 74 3b 0a 20 20 20 20 20 20 69 66 28 20  list;.      if( 
17dc0 66 74 73 33 53 65 67 52 65 61 64 65 72 49 73 50  fts3SegReaderIsP
17dd0 65 6e 64 69 6e 67 28 61 70 53 65 67 6d 65 6e 74  ending(apSegment
17de0 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
17df0 72 63 20 3d 20 66 74 73 33 4d 73 72 42 75 66 66  rc = fts3MsrBuff
17e00 65 72 44 61 74 61 28 70 43 73 72 2c 20 61 70 53  erData(pCsr, apS
17e10 65 67 6d 65 6e 74 5b 30 5d 2d 3e 61 44 6f 63 6c  egment[0]->aDocl
17e20 69 73 74 2c 20 70 43 73 72 2d 3e 6e 44 6f 63 6c  ist, pCsr->nDocl
17e30 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 43  ist);.        pC
17e40 73 72 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20 70  sr->aDoclist = p
17e50 43 73 72 2d 3e 61 42 75 66 66 65 72 3b 0a 20 20  Csr->aBuffer;.  
17e60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17e70 20 20 20 70 43 73 72 2d 3e 61 44 6f 63 6c 69 73     pCsr->aDoclis
17e80 74 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d  t = apSegment[0]
17e90 2d 3e 61 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20  ->aDoclist;.    
17ea0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
17eb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
17ec0 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20   = SQLITE_ROW;. 
17ed0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17ee0 69 6e 74 20 6e 44 6f 63 6c 69 73 74 20 3d 20 30  int nDoclist = 0
17ef0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
17f00 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 2a  ize of doclist *
17f10 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
17f20 69 6e 74 36 34 20 69 50 72 65 76 20 3d 20 30 3b  int64 iPrev = 0;
17f30 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
17f40 64 6f 63 69 64 20 73 74 6f 72 65 64 20 69 6e 20  docid stored in 
17f50 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20  doclist */..    
17f60 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74    /* The current
17f70 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 69 72   term of the fir
17f80 73 74 20 6e 4d 65 72 67 65 20 65 6e 74 72 69 65  st nMerge entrie
17f90 73 20 69 6e 20 74 68 65 20 61 72 72 61 79 0a 20  s in the array. 
17fa0 20 20 20 20 20 2a 2a 20 6f 66 20 46 74 73 33 53       ** of Fts3S
17fb0 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74 73  egReader objects
17fc0 20 69 73 20 74 68 65 20 73 61 6d 65 2e 20 54 68   is the same. Th
17fd0 65 20 64 6f 63 6c 69 73 74 73 20 6d 75 73 74 20  e doclists must 
17fe0 62 65 20 6d 65 72 67 65 64 0a 20 20 20 20 20 20  be merged.      
17ff0 2a 2a 20 61 6e 64 20 61 20 73 69 6e 67 6c 65 20  ** and a single 
18000 74 65 72 6d 20 72 65 74 75 72 6e 65 64 20 77 69  term returned wi
18010 74 68 20 74 68 65 20 6d 65 72 67 65 64 20 64 6f  th the merged do
18020 63 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  clist..      */.
18030 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
18040 3c 6e 4d 65 72 67 65 3b 20 69 2b 2b 29 7b 0a 20  <nMerge; i++){. 
18050 20 20 20 20 20 20 20 66 74 73 33 53 65 67 52 65         fts3SegRe
18060 61 64 65 72 46 69 72 73 74 44 6f 63 69 64 28 70  aderFirstDocid(p
18070 2c 20 61 70 53 65 67 6d 65 6e 74 5b 69 5d 29 3b  , apSegment[i]);
18080 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
18090 74 73 33 53 65 67 52 65 61 64 65 72 53 6f 72 74  ts3SegReaderSort
180a0 28 61 70 53 65 67 6d 65 6e 74 2c 20 6e 4d 65 72  (apSegment, nMer
180b0 67 65 2c 20 6e 4d 65 72 67 65 2c 20 78 43 6d 70  ge, nMerge, xCmp
180c0 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
180d0 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 70 4f  apSegment[0]->pO
180e0 66 66 73 65 74 4c 69 73 74 20 29 7b 0a 20 20 20  ffsetList ){.   
180f0 20 20 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20       int j;     
18100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18110 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  * Number of segm
18120 65 6e 74 73 20 74 68 61 74 20 73 68 61 72 65 20  ents that share 
18130 61 20 64 6f 63 69 64 20 2a 2f 0a 20 20 20 20 20  a docid */.     
18140 20 20 20 63 68 61 72 20 2a 70 4c 69 73 74 20 3d     char *pList =
18150 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
18160 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  nList = 0;.     
18170 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20     int nByte;.  
18180 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
18190 74 36 34 20 69 44 6f 63 69 64 20 3d 20 61 70 53  t64 iDocid = apS
181a0 65 67 6d 65 6e 74 5b 30 5d 2d 3e 69 44 6f 63 69  egment[0]->iDoci
181b0 64 3b 0a 20 20 20 20 20 20 20 20 66 74 73 33 53  d;.        fts3S
181c0 65 67 52 65 61 64 65 72 4e 65 78 74 44 6f 63 69  egReaderNextDoci
181d0 64 28 70 2c 20 61 70 53 65 67 6d 65 6e 74 5b 30  d(p, apSegment[0
181e0 5d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73  ], &pList, &nLis
181f0 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  t);.        j = 
18200 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  1;.        while
18210 28 20 6a 3c 6e 4d 65 72 67 65 0a 20 20 20 20 20  ( j<nMerge.     
18220 20 20 20 20 20 20 20 26 26 20 61 70 53 65 67 6d         && apSegm
18230 65 6e 74 5b 6a 5d 2d 3e 70 4f 66 66 73 65 74 4c  ent[j]->pOffsetL
18240 69 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ist.            
18250 26 26 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2d  && apSegment[j]-
18260 3e 69 44 6f 63 69 64 3d 3d 69 44 6f 63 69 64 0a  >iDocid==iDocid.
18270 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
18280 20 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64       fts3SegRead
18290 65 72 4e 65 78 74 44 6f 63 69 64 28 70 2c 20 61  erNextDocid(p, a
182a0 70 53 65 67 6d 65 6e 74 5b 6a 5d 2c 20 30 2c 20  pSegment[j], 0, 
182b0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 2b  0);.          j+
182c0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  +;.        }..  
182d0 20 20 20 20 20 20 69 66 28 20 69 73 43 6f 6c 46        if( isColF
182e0 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  ilter ){.       
182f0 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e 46 69 6c     fts3ColumnFil
18300 74 65 72 28 70 46 69 6c 74 65 72 2d 3e 69 43 6f  ter(pFilter->iCo
18310 6c 2c 20 30 2c 20 26 70 4c 69 73 74 2c 20 26 6e  l, 0, &pList, &n
18320 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  List);.        }
18330 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69  ..        if( !i
18340 73 49 67 6e 6f 72 65 45 6d 70 74 79 20 7c 7c 20  sIgnoreEmpty || 
18350 6e 4c 69 73 74 3e 30 20 29 7b 0a 0a 20 20 20 20  nList>0 ){..    
18360 20 20 20 20 20 20 2f 2a 20 43 61 6c 63 75 6c 61        /* Calcula
18370 74 65 20 74 68 65 20 27 64 6f 63 69 64 27 20 64  te the 'docid' d
18380 65 6c 74 61 20 76 61 6c 75 65 20 74 6f 20 77 72  elta value to wr
18390 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6d 65 72  ite into the mer
183a0 67 65 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ged .          *
183b0 2a 20 64 6f 63 6c 69 73 74 2e 20 2a 2f 0a 20 20  * doclist. */.  
183c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
183d0 69 6e 74 36 34 20 69 44 65 6c 74 61 3b 0a 20 20  int64 iDelta;.  
183e0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62          if( p->b
183f0 44 65 73 63 49 64 78 20 26 26 20 6e 44 6f 63 6c  DescIdx && nDocl
18400 69 73 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ist>0 ){.       
18410 20 20 20 20 20 69 44 65 6c 74 61 20 3d 20 69 50       iDelta = iP
18420 72 65 76 20 2d 20 69 44 6f 63 69 64 3b 0a 20 20  rev - iDocid;.  
18430 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
18440 20 20 20 20 20 20 20 20 20 20 20 69 44 65 6c 74             iDelt
18450 61 20 3d 20 69 44 6f 63 69 64 20 2d 20 69 50 72  a = iDocid - iPr
18460 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ev;.          }.
18470 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
18480 28 20 69 44 65 6c 74 61 3e 30 20 7c 7c 20 28 6e  ( iDelta>0 || (n
18490 44 6f 63 6c 69 73 74 3d 3d 30 20 26 26 20 69 44  Doclist==0 && iD
184a0 65 6c 74 61 3d 3d 69 44 6f 63 69 64 29 20 29 3b  elta==iDocid) );
184b0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
184c0 74 28 20 6e 44 6f 63 6c 69 73 74 3e 30 20 7c 7c  t( nDoclist>0 ||
184d0 20 69 44 65 6c 74 61 3d 3d 69 44 6f 63 69 64 20   iDelta==iDocid 
184e0 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6e 42  );..          nB
184f0 79 74 65 20 3d 20 73 71 6c 69 74 65 33 46 74 73  yte = sqlite3Fts
18500 33 56 61 72 69 6e 74 4c 65 6e 28 69 44 65 6c 74  3VarintLen(iDelt
18510 61 29 20 2b 20 28 69 73 52 65 71 75 69 72 65 50  a) + (isRequireP
18520 6f 73 3f 6e 4c 69 73 74 2b 31 3a 30 29 3b 0a 20  os?nList+1:0);. 
18530 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 44 6f           if( nDo
18540 63 6c 69 73 74 2b 6e 42 79 74 65 3e 70 43 73 72  clist+nByte>pCsr
18550 2d 3e 6e 42 75 66 66 65 72 20 29 7b 0a 20 20 20  ->nBuffer ){.   
18560 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 61           char *a
18570 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20  New;.           
18580 20 70 43 73 72 2d 3e 6e 42 75 66 66 65 72 20 3d   pCsr->nBuffer =
18590 20 28 6e 44 6f 63 6c 69 73 74 2b 6e 42 79 74 65   (nDoclist+nByte
185a0 29 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  )*2;.           
185b0 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   aNew = sqlite3_
185c0 72 65 61 6c 6c 6f 63 28 70 43 73 72 2d 3e 61 42  realloc(pCsr->aB
185d0 75 66 66 65 72 2c 20 70 43 73 72 2d 3e 6e 42 75  uffer, pCsr->nBu
185e0 66 66 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ffer);.         
185f0 20 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a     if( !aNew ){.
18600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
18610 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
18620 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  M;.            }
18630 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 73  .            pCs
18640 72 2d 3e 61 42 75 66 66 65 72 20 3d 20 61 4e 65  r->aBuffer = aNe
18650 77 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  w;.          }..
18660 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73            if( is
18670 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20 20  First ){.       
18680 20 20 20 20 20 63 68 61 72 20 2a 61 20 3d 20 26       char *a = &
18690 70 43 73 72 2d 3e 61 42 75 66 66 65 72 5b 6e 44  pCsr->aBuffer[nD
186a0 6f 63 6c 69 73 74 5d 3b 0a 20 20 20 20 20 20 20  oclist];.       
186b0 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65 3b       int nWrite;
186c0 0a 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20  .           .   
186d0 20 20 20 20 20 20 20 20 20 6e 57 72 69 74 65 20           nWrite 
186e0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 46 69 72  = sqlite3Fts3Fir
186f0 73 74 46 69 6c 74 65 72 28 69 44 65 6c 74 61 2c  stFilter(iDelta,
18700 20 70 4c 69 73 74 2c 20 6e 4c 69 73 74 2c 20 61   pList, nList, a
18710 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
18720 66 28 20 6e 57 72 69 74 65 20 29 7b 0a 20 20 20  f( nWrite ){.   
18730 20 20 20 20 20 20 20 20 20 20 20 69 50 72 65 76             iPrev
18740 20 3d 20 69 44 6f 63 69 64 3b 0a 20 20 20 20 20   = iDocid;.     
18750 20 20 20 20 20 20 20 20 20 6e 44 6f 63 6c 69 73           nDoclis
18760 74 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20  t += nWrite;.   
18770 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
18780 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18790 20 20 20 20 20 20 20 20 6e 44 6f 63 6c 69 73 74          nDoclist
187a0 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50   += sqlite3Fts3P
187b0 75 74 56 61 72 69 6e 74 28 26 70 43 73 72 2d 3e  utVarint(&pCsr->
187c0 61 42 75 66 66 65 72 5b 6e 44 6f 63 6c 69 73 74  aBuffer[nDoclist
187d0 5d 2c 20 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  ], iDelta);.    
187e0 20 20 20 20 20 20 20 20 69 50 72 65 76 20 3d 20          iPrev = 
187f0 69 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20  iDocid;.        
18800 20 20 20 20 69 66 28 20 69 73 52 65 71 75 69 72      if( isRequir
18810 65 50 6f 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ePos ){.        
18820 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 43        memcpy(&pC
18830 73 72 2d 3e 61 42 75 66 66 65 72 5b 6e 44 6f 63  sr->aBuffer[nDoc
18840 6c 69 73 74 5d 2c 20 70 4c 69 73 74 2c 20 6e 4c  list], pList, nL
18850 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ist);.          
18860 20 20 20 20 6e 44 6f 63 6c 69 73 74 20 2b 3d 20      nDoclist += 
18870 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20  nList;.         
18880 20 20 20 20 20 70 43 73 72 2d 3e 61 42 75 66 66       pCsr->aBuff
18890 65 72 5b 6e 44 6f 63 6c 69 73 74 2b 2b 5d 20 3d  er[nDoclist++] =
188a0 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 20   '\0';.         
188b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
188c0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
188d0 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65      fts3SegReade
188e0 72 53 6f 72 74 28 61 70 53 65 67 6d 65 6e 74 2c  rSort(apSegment,
188f0 20 6e 4d 65 72 67 65 2c 20 6a 2c 20 78 43 6d 70   nMerge, j, xCmp
18900 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18910 20 69 66 28 20 6e 44 6f 63 6c 69 73 74 3e 30 20   if( nDoclist>0 
18920 29 7b 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d  ){.        pCsr-
18930 3e 61 44 6f 63 6c 69 73 74 20 3d 20 70 43 73 72  >aDoclist = pCsr
18940 2d 3e 61 42 75 66 66 65 72 3b 0a 20 20 20 20 20  ->aBuffer;.     
18950 20 20 20 70 43 73 72 2d 3e 6e 44 6f 63 6c 69 73     pCsr->nDoclis
18960 74 20 3d 20 6e 44 6f 63 6c 69 73 74 3b 0a 20 20  t = nDoclist;.  
18970 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18980 45 5f 52 4f 57 3b 0a 20 20 20 20 20 20 7d 0a 20  E_ROW;.      }. 
18990 20 20 20 7d 0a 20 20 20 20 70 43 73 72 2d 3e 6e     }.    pCsr->n
189a0 41 64 76 61 6e 63 65 20 3d 20 6e 4d 65 72 67 65  Advance = nMerge
189b0 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  ;.  }while( rc==
189c0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
189d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 76  return rc;.}...v
189e0 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 33 53  oid sqlite3Fts3S
189f0 65 67 52 65 61 64 65 72 46 69 6e 69 73 68 28 0a  egReaderFinish(.
18a00 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65    Fts3MultiSegRe
18a10 61 64 65 72 20 2a 70 43 73 72 20 20 20 20 20 20  ader *pCsr      
18a20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65 63   /* Cursor objec
18a30 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 43  t */.){.  if( pC
18a40 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  sr ){.    int i;
18a50 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
18a60 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 20  pCsr->nSegment; 
18a70 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
18a80 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72  te3Fts3SegReader
18a90 46 72 65 65 28 70 43 73 72 2d 3e 61 70 53 65 67  Free(pCsr->apSeg
18aa0 6d 65 6e 74 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  ment[i]);.    }.
18ab0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
18ac0 28 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74  (pCsr->apSegment
18ad0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
18ae0 72 65 65 28 70 43 73 72 2d 3e 61 42 75 66 66 65  ree(pCsr->aBuffe
18af0 72 29 3b 0a 0a 20 20 20 20 70 43 73 72 2d 3e 6e  r);..    pCsr->n
18b00 53 65 67 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20  Segment = 0;.   
18b10 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74   pCsr->apSegment
18b20 20 3d 20 30 3b 0a 20 20 20 20 70 43 73 72 2d 3e   = 0;.    pCsr->
18b30 61 42 75 66 66 65 72 20 3d 20 30 3b 0a 20 20 7d  aBuffer = 0;.  }
18b40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  .}../*.** Decode
18b50 20 74 68 65 20 22 65 6e 64 5f 62 6c 6f 63 6b 22   the "end_block"
18b60 20 66 69 65 6c 64 2c 20 73 65 6c 65 63 74 65 64   field, selected
18b70 20 62 79 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20   by column iCol 
18b80 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 0a 2a  of the SELECT .*
18b90 2a 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  * statement pass
18ba0 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
18bb0 61 72 67 75 6d 65 6e 74 2e 20 0a 2a 2a 0a 2a 2a  argument. .**.**
18bc0 20 54 68 65 20 22 65 6e 64 5f 62 6c 6f 63 6b 22   The "end_block"
18bd0 20 66 69 65 6c 64 20 6d 61 79 20 63 6f 6e 74 61   field may conta
18be0 69 6e 20 65 69 74 68 65 72 20 61 6e 20 69 6e 74  in either an int
18bf0 65 67 65 72 2c 20 6f 72 20 61 20 74 65 78 74 20  eger, or a text 
18c00 66 69 65 6c 64 0a 2a 2a 20 63 6f 6e 74 61 69 6e  field.** contain
18c10 69 6e 67 20 74 68 65 20 74 65 78 74 20 72 65 70  ing the text rep
18c20 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
18c30 77 6f 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20  wo non-negative 
18c40 69 6e 74 65 67 65 72 73 20 73 65 70 61 72 61 74  integers separat
18c50 65 64 20 0a 2a 2a 20 62 79 20 6f 6e 65 20 6f 72  ed .** by one or
18c60 20 6d 6f 72 65 20 73 70 61 63 65 20 28 30 78 32   more space (0x2
18c70 30 29 20 63 68 61 72 61 63 74 65 72 73 2e 20 49  0) characters. I
18c80 6e 20 74 68 65 20 66 69 72 73 74 20 63 61 73 65  n the first case
18c90 2c 20 73 65 74 20 2a 70 69 45 6e 64 42 6c 6f 63  , set *piEndBloc
18ca0 6b 20 0a 2a 2a 20 74 6f 20 74 68 65 20 69 6e 74  k .** to the int
18cb0 65 67 65 72 20 76 61 6c 75 65 20 61 6e 64 20 2a  eger value and *
18cc0 70 6e 42 79 74 65 20 74 6f 20 7a 65 72 6f 20 62  pnByte to zero b
18cd0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
18ce0 20 49 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20   In the second, 
18cf0 0a 2a 2a 20 73 65 74 20 2a 70 69 45 6e 64 42 6c  .** set *piEndBl
18d00 6f 63 6b 20 74 6f 20 74 68 65 20 66 69 72 73 74  ock to the first
18d10 20 76 61 6c 75 65 20 61 6e 64 20 2a 70 6e 42 79   value and *pnBy
18d20 74 65 20 74 6f 20 74 68 65 20 73 65 63 6f 6e 64  te to the second
18d30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
18d40 20 66 74 73 33 52 65 61 64 45 6e 64 42 6c 6f 63   fts3ReadEndBloc
18d50 6b 46 69 65 6c 64 28 0a 20 20 73 71 6c 69 74 65  kField(.  sqlite
18d60 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 2c 20 0a  3_stmt *pStmt, .
18d70 20 20 69 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69    int iCol, .  i
18d80 36 34 20 2a 70 69 45 6e 64 42 6c 6f 63 6b 2c 0a  64 *piEndBlock,.
18d90 20 20 69 36 34 20 2a 70 6e 42 79 74 65 0a 29 7b    i64 *pnByte.){
18da0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
18db0 64 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d 20  d char *zText = 
18dc0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
18dd0 65 78 74 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29  ext(pStmt, iCol)
18de0 3b 0a 20 20 69 66 28 20 7a 54 65 78 74 20 29 7b  ;.  if( zText ){
18df0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
18e00 69 6e 74 20 69 4d 75 6c 20 3d 20 31 3b 0a 20 20  int iMul = 1;.  
18e10 20 20 69 36 34 20 69 56 61 6c 20 3d 20 30 3b 0a    i64 iVal = 0;.
18e20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 54 65      for(i=0; zTe
18e30 78 74 5b 69 5d 3e 3d 27 30 27 20 26 26 20 7a 54  xt[i]>='0' && zT
18e40 65 78 74 5b 69 5d 3c 3d 27 39 27 3b 20 69 2b 2b  ext[i]<='9'; i++
18e50 29 7b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20  ){.      iVal = 
18e60 69 56 61 6c 2a 31 30 20 2b 20 28 7a 54 65 78 74  iVal*10 + (zText
18e70 5b 69 5d 20 2d 20 27 30 27 29 3b 0a 20 20 20 20  [i] - '0');.    
18e80 7d 0a 20 20 20 20 2a 70 69 45 6e 64 42 6c 6f 63  }.    *piEndBloc
18e90 6b 20 3d 20 69 56 61 6c 3b 0a 20 20 20 20 77 68  k = iVal;.    wh
18ea0 69 6c 65 28 20 7a 54 65 78 74 5b 69 5d 3d 3d 27  ile( zText[i]=='
18eb0 20 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 69 56   ' ) i++;.    iV
18ec0 61 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  al = 0;.    if( 
18ed0 7a 54 65 78 74 5b 69 5d 3d 3d 27 2d 27 20 29 7b  zText[i]=='-' ){
18ee0 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  .      i++;.    
18ef0 20 20 69 4d 75 6c 20 3d 20 2d 31 3b 0a 20 20 20    iMul = -1;.   
18f00 20 7d 0a 20 20 20 20 66 6f 72 28 2f 2a 20 6e 6f   }.    for(/* no
18f10 2d 6f 70 20 2a 2f 3b 20 7a 54 65 78 74 5b 69 5d  -op */; zText[i]
18f20 3e 3d 27 30 27 20 26 26 20 7a 54 65 78 74 5b 69  >='0' && zText[i
18f30 5d 3c 3d 27 39 27 3b 20 69 2b 2b 29 7b 0a 20 20  ]<='9'; i++){.  
18f40 20 20 20 20 69 56 61 6c 20 3d 20 69 56 61 6c 2a      iVal = iVal*
18f50 31 30 20 2b 20 28 7a 54 65 78 74 5b 69 5d 20 2d  10 + (zText[i] -
18f60 20 27 30 27 29 3b 0a 20 20 20 20 7d 0a 20 20 20   '0');.    }.   
18f70 20 2a 70 6e 42 79 74 65 20 3d 20 28 69 56 61 6c   *pnByte = (iVal
18f80 20 2a 20 28 69 36 34 29 69 4d 75 6c 29 3b 0a 20   * (i64)iMul);. 
18f90 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 20 73   }.}.../*.** A s
18fa0 65 67 6d 65 6e 74 20 6f 66 20 73 69 7a 65 20 6e  egment of size n
18fb0 42 79 74 65 20 62 79 74 65 73 20 68 61 73 20 6a  Byte bytes has j
18fc0 75 73 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ust been written
18fd0 20 74 6f 20 61 62 73 6f 6c 75 74 65 20 6c 65 76   to absolute lev
18fe0 65 6c 0a 2a 2a 20 69 41 62 73 4c 65 76 65 6c 2e  el.** iAbsLevel.
18ff0 20 50 72 6f 6d 6f 74 65 20 61 6e 79 20 73 65 67   Promote any seg
19000 6d 65 6e 74 73 20 74 68 61 74 20 73 68 6f 75 6c  ments that shoul
19010 64 20 62 65 20 70 72 6f 6d 6f 74 65 64 20 61 73  d be promoted as
19020 20 61 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74   a result..*/.st
19030 61 74 69 63 20 69 6e 74 20 66 74 73 33 50 72 6f  atic int fts3Pro
19040 6d 6f 74 65 53 65 67 6d 65 6e 74 73 28 0a 20 20  moteSegments(.  
19050 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
19060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19070 2f 2a 20 46 54 53 20 74 61 62 6c 65 20 68 61 6e  /* FTS table han
19080 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dle */.  sqlite3
19090 5f 69 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c  _int64 iAbsLevel
190a0 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f  ,        /* Abso
190b0 6c 75 74 65 20 6c 65 76 65 6c 20 6a 75 73 74 20  lute level just 
190c0 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 73 71 6c  updated */.  sql
190d0 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65  ite3_int64 nByte
190e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
190f0 53 69 7a 65 20 6f 66 20 6e 65 77 20 73 65 67 6d  Size of new segm
19100 65 6e 74 20 61 74 20 69 41 62 73 4c 65 76 65 6c  ent at iAbsLevel
19110 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
19120 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  = SQLITE_OK;.  s
19130 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 52 61  qlite3_stmt *pRa
19140 6e 67 65 3b 0a 0a 20 20 72 63 20 3d 20 66 74 73  nge;..  rc = fts
19150 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
19160 53 45 4c 45 43 54 5f 4c 45 56 45 4c 5f 52 41 4e  SELECT_LEVEL_RAN
19170 47 45 32 2c 20 26 70 52 61 6e 67 65 2c 20 30 29  GE2, &pRange, 0)
19180 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
19190 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
191a0 74 20 62 4f 6b 20 3d 20 30 3b 0a 20 20 20 20 69  t bOk = 0;.    i
191b0 36 34 20 69 4c 61 73 74 20 3d 20 28 69 41 62 73  64 iLast = (iAbs
191c0 4c 65 76 65 6c 2f 46 54 53 33 5f 53 45 47 44 49  Level/FTS3_SEGDI
191d0 52 5f 4d 41 58 4c 45 56 45 4c 20 2b 20 31 29 20  R_MAXLEVEL + 1) 
191e0 2a 20 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41  * FTS3_SEGDIR_MA
191f0 58 4c 45 56 45 4c 20 2d 20 31 3b 0a 20 20 20 20  XLEVEL - 1;.    
19200 69 36 34 20 6e 4c 69 6d 69 74 20 3d 20 28 6e 42  i64 nLimit = (nB
19210 79 74 65 2a 33 29 2f 32 3b 0a 0a 20 20 20 20 2f  yte*3)/2;..    /
19220 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
19230 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ll entries in th
19240 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65  e %_segdir table
19250 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
19260 6f 20 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e  o .    ** segmen
19270 74 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65 78  ts in this index
19280 20 6f 6e 20 6c 65 76 65 6c 73 20 67 72 65 61 74   on levels great
19290 65 72 20 74 68 61 6e 20 69 41 62 73 4c 65 76 65  er than iAbsLeve
192a0 6c 2e 20 49 66 20 74 68 65 72 65 20 69 73 0a 20  l. If there is. 
192b0 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f     ** at least o
192c0 6e 65 20 73 75 63 68 20 73 65 67 6d 65 6e 74 2c  ne such segment,
192d0 20 61 6e 64 20 69 74 20 69 73 20 70 6f 73 73 69   and it is possi
192e0 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ble to determine
192f0 20 74 68 61 74 20 61 6c 6c 20 0a 20 20 20 20 2a   that all .    *
19300 2a 20 73 75 63 68 20 73 65 67 6d 65 6e 74 73 20  * such segments 
19310 61 72 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  are smaller than
19320 20 6e 4c 69 6d 69 74 20 62 79 74 65 73 20 69 6e   nLimit bytes in
19330 20 73 69 7a 65 2c 20 74 68 65 79 20 77 69 6c 6c   size, they will
19340 20 62 65 20 0a 20 20 20 20 2a 2a 20 70 72 6f 6d   be .    ** prom
19350 6f 74 65 64 20 74 6f 20 6c 65 76 65 6c 20 69 41  oted to level iA
19360 62 73 4c 65 76 65 6c 2e 20 20 2a 2f 0a 20 20 20  bsLevel.  */.   
19370 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
19380 74 36 34 28 70 52 61 6e 67 65 2c 20 31 2c 20 69  t64(pRange, 1, i
19390 41 62 73 4c 65 76 65 6c 2b 31 29 3b 0a 20 20 20  AbsLevel+1);.   
193a0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
193b0 74 36 34 28 70 52 61 6e 67 65 2c 20 32 2c 20 69  t64(pRange, 2, i
193c0 4c 61 73 74 29 3b 0a 20 20 20 20 77 68 69 6c 65  Last);.    while
193d0 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
193e0 6c 69 74 65 33 5f 73 74 65 70 28 70 52 61 6e 67  lite3_step(pRang
193f0 65 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  e) ){.      i64 
19400 6e 53 69 7a 65 20 3d 20 30 2c 20 64 75 6d 6d 79  nSize = 0, dummy
19410 3b 0a 20 20 20 20 20 20 66 74 73 33 52 65 61 64  ;.      fts3Read
19420 45 6e 64 42 6c 6f 63 6b 46 69 65 6c 64 28 70 52  EndBlockField(pR
19430 61 6e 67 65 2c 20 32 2c 20 26 64 75 6d 6d 79 2c  ange, 2, &dummy,
19440 20 26 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20   &nSize);.      
19450 69 66 28 20 6e 53 69 7a 65 3c 3d 30 20 7c 7c 20  if( nSize<=0 || 
19460 6e 53 69 7a 65 3e 6e 4c 69 6d 69 74 20 29 7b 0a  nSize>nLimit ){.
19470 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 53          /* If nS
19480 69 7a 65 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  ize==0, then the
19490 20 25 5f 73 65 67 64 69 72 2e 65 6e 64 5f 62 6c   %_segdir.end_bl
194a0 6f 63 6b 20 66 69 65 6c 64 20 64 6f 65 73 20 6e  ock field does n
194b0 6f 74 20 6e 6f 74 20 0a 20 20 20 20 20 20 20 20  ot not .        
194c0 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 73 69 7a  ** contain a siz
194d0 65 20 76 61 6c 75 65 2e 20 54 68 69 73 20 68 61  e value. This ha
194e0 70 70 65 6e 73 20 69 66 20 69 74 20 77 61 73 20  ppens if it was 
194f0 77 72 69 74 74 65 6e 20 62 79 20 61 6e 0a 20 20  written by an.  
19500 20 20 20 20 20 20 2a 2a 20 6f 6c 64 20 76 65 72        ** old ver
19510 73 69 6f 6e 20 6f 66 20 46 54 53 2e 20 49 6e 20  sion of FTS. In 
19520 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
19530 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
19540 64 65 74 65 72 6d 69 6e 65 0a 20 20 20 20 20 20  determine.      
19550 20 20 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66    ** the size of
19560 20 74 68 65 20 73 65 67 6d 65 6e 74 2c 20 61 6e   the segment, an
19570 64 20 73 6f 20 73 65 67 6d 65 6e 74 20 70 72 6f  d so segment pro
19580 6d 6f 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0a  motion does not.
19590 20 20 20 20 20 20 20 20 2a 2a 20 74 61 6b 65 20          ** take 
195a0 70 6c 61 63 65 2e 20 20 2a 2f 0a 20 20 20 20 20  place.  */.     
195b0 20 20 20 62 4f 6b 20 3d 20 30 3b 0a 20 20 20 20     bOk = 0;.    
195c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
195d0 20 7d 0a 20 20 20 20 20 20 62 4f 6b 20 3d 20 31   }.      bOk = 1
195e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
195f0 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
19600 52 61 6e 67 65 29 3b 0a 0a 20 20 20 20 69 66 28  Range);..    if(
19610 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20 69 6e   bOk ){.      in
19620 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  t iIdx = 0;.    
19630 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
19640 70 55 70 64 61 74 65 31 20 3d 20 30 3b 0a 20 20  pUpdate1 = 0;.  
19650 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
19660 20 2a 70 55 70 64 61 74 65 32 20 3d 20 30 3b 0a   *pUpdate2 = 0;.
19670 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
19680 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19690 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c      rc = fts3Sql
196a0 53 74 6d 74 28 70 2c 20 53 51 4c 5f 55 50 44 41  Stmt(p, SQL_UPDA
196b0 54 45 5f 4c 45 56 45 4c 5f 49 44 58 2c 20 26 70  TE_LEVEL_IDX, &p
196c0 55 70 64 61 74 65 31 2c 20 30 29 3b 0a 20 20 20  Update1, 0);.   
196d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
196e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
196f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
19700 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
19710 55 50 44 41 54 45 5f 4c 45 56 45 4c 2c 20 26 70  UPDATE_LEVEL, &p
19720 55 70 64 61 74 65 32 2c 20 30 29 3b 0a 20 20 20  Update2, 0);.   
19730 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
19740 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19750 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  ..        /* Loo
19760 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 25 5f  p through all %_
19770 73 65 67 64 69 72 20 65 6e 74 72 69 65 73 20 66  segdir entries f
19780 6f 72 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74  or segments in t
19790 68 69 73 20 69 6e 64 65 78 20 77 69 74 68 0a 20  his index with. 
197a0 20 20 20 20 20 20 20 2a 2a 20 6c 65 76 65 6c 73         ** levels
197b0 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 67 72 65   equal to or gre
197c0 61 74 65 72 20 74 68 61 6e 20 69 41 62 73 4c 65  ater than iAbsLe
197d0 76 65 6c 2e 20 41 73 20 65 61 63 68 20 65 6e 74  vel. As each ent
197e0 72 79 20 69 73 20 76 69 73 69 74 65 64 2c 0a 20  ry is visited,. 
197f0 20 20 20 20 20 20 20 2a 2a 20 75 70 64 61 74 65         ** update
19800 64 20 69 74 20 74 6f 20 73 65 74 20 28 6c 65 76  d it to set (lev
19810 65 6c 20 3d 20 2d 31 29 20 61 6e 64 20 28 69 64  el = -1) and (id
19820 78 20 3d 20 4e 29 2c 20 77 68 65 72 65 20 4e 20  x = N), where N 
19830 69 73 20 30 20 66 6f 72 20 74 68 65 0a 20 20 20  is 0 for the.   
19840 20 20 20 20 20 2a 2a 20 6f 6c 64 65 73 74 20 73       ** oldest s
19850 65 67 6d 65 6e 74 20 69 6e 20 74 68 65 20 72 61  egment in the ra
19860 6e 67 65 2c 20 31 20 66 6f 72 20 74 68 65 20 6e  nge, 1 for the n
19870 65 78 74 20 6f 6c 64 65 73 74 2c 20 61 6e 64 20  ext oldest, and 
19880 73 6f 20 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  so on..        *
19890 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  *.        ** In 
198a0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f 76  other words, mov
198b0 65 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 62  e all segments b
198c0 65 69 6e 67 20 70 72 6f 6d 6f 74 65 64 20 74 6f  eing promoted to
198d0 20 6c 65 76 65 6c 20 2d 31 2c 0a 20 20 20 20 20   level -1,.     
198e0 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 20 74 68     ** setting th
198f0 65 20 22 69 64 78 22 20 66 69 65 6c 64 73 20 61  e "idx" fields a
19900 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 6f  s appropriate to
19910 20 6b 65 65 70 20 74 68 65 6d 20 69 6e 20 74 68   keep them in th
19920 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20 2a  e same.        *
19930 2a 20 6f 72 64 65 72 2e 20 54 68 65 20 63 6f 6e  * order. The con
19940 74 65 6e 74 73 20 6f 66 20 6c 65 76 65 6c 20 2d  tents of level -
19950 31 20 28 77 68 69 63 68 20 69 73 20 6e 65 76 65  1 (which is neve
19960 72 20 75 73 65 64 2c 20 65 78 63 65 70 74 0a 20  r used, except. 
19970 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 69         ** transi
19980 65 6e 74 6c 79 20 68 65 72 65 29 2c 20 77 69 6c  ently here), wil
19990 6c 20 62 65 20 6d 6f 76 65 64 20 62 61 63 6b 20  l be moved back 
199a0 74 6f 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76  to level iAbsLev
199b0 65 6c 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20  el below.  */.  
199c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
199d0 6e 64 5f 69 6e 74 36 34 28 70 52 61 6e 67 65 2c  nd_int64(pRange,
199e0 20 31 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a   1, iAbsLevel);.
199f0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 53          while( S
19a00 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
19a10 65 33 5f 73 74 65 70 28 70 52 61 6e 67 65 29 20  e3_step(pRange) 
19a20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
19a30 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 55  ite3_bind_int(pU
19a40 70 64 61 74 65 31 2c 20 31 2c 20 69 49 64 78 2b  pdate1, 1, iIdx+
19a50 2b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +);.          sq
19a60 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
19a70 55 70 64 61 74 65 31 2c 20 32 2c 20 73 71 6c 69  Update1, 2, sqli
19a80 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
19a90 52 61 6e 67 65 2c 20 30 29 29 3b 0a 20 20 20 20  Range, 0));.    
19aa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
19ab0 6e 64 5f 69 6e 74 28 70 55 70 64 61 74 65 31 2c  nd_int(pUpdate1,
19ac0 20 33 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   3, sqlite3_colu
19ad0 6d 6e 5f 69 6e 74 28 70 52 61 6e 67 65 2c 20 31  mn_int(pRange, 1
19ae0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ));.          sq
19af0 6c 69 74 65 33 5f 73 74 65 70 28 70 55 70 64 61  lite3_step(pUpda
19b00 74 65 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  te1);.          
19b10 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
19b20 65 74 28 70 55 70 64 61 74 65 31 29 3b 0a 20 20  et(pUpdate1);.  
19b30 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
19b40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19b50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
19b60 5f 72 65 73 65 74 28 70 52 61 6e 67 65 29 3b 0a  _reset(pRange);.
19b70 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
19b80 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
19b90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
19ba0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
19bb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19bc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19bd0 5f 72 65 73 65 74 28 70 52 61 6e 67 65 29 3b 0a  _reset(pRange);.
19be0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
19bf0 2a 20 4d 6f 76 65 20 6c 65 76 65 6c 20 2d 31 20  * Move level -1 
19c00 74 6f 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76  to level iAbsLev
19c10 65 6c 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  el */.      if( 
19c20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19c30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19c40 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 55 70 64  _bind_int64(pUpd
19c50 61 74 65 32 2c 20 31 2c 20 69 41 62 73 4c 65 76  ate2, 1, iAbsLev
19c60 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  el);.        sql
19c70 69 74 65 33 5f 73 74 65 70 28 70 55 70 64 61 74  ite3_step(pUpdat
19c80 65 32 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  e2);.        rc 
19c90 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
19ca0 70 55 70 64 61 74 65 32 29 3b 0a 20 20 20 20 20  pUpdate2);.     
19cb0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20   }.    }.  }... 
19cc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19cd0 2a 0a 2a 2a 20 4d 65 72 67 65 20 61 6c 6c 20 6c  *.** Merge all l
19ce0 65 76 65 6c 20 69 4c 65 76 65 6c 20 73 65 67 6d  evel iLevel segm
19cf0 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61  ents in the data
19d00 62 61 73 65 20 69 6e 74 6f 20 61 20 73 69 6e 67  base into a sing
19d10 6c 65 20 0a 2a 2a 20 69 4c 65 76 65 6c 2b 31 20  le .** iLevel+1 
19d20 73 65 67 6d 65 6e 74 2e 20 4f 72 2c 20 69 66 20  segment. Or, if 
19d30 69 4c 65 76 65 6c 3c 30 2c 20 6d 65 72 67 65 20  iLevel<0, merge 
19d40 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 74  all segments int
19d50 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 73 65  o a.** single se
19d60 67 6d 65 6e 74 20 77 69 74 68 20 61 20 6c 65 76  gment with a lev
19d70 65 6c 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  el equal to the 
19d80 6e 75 6d 65 72 69 63 61 6c 6c 79 20 6c 61 72 67  numerically larg
19d90 65 73 74 20 6c 65 76 65 6c 20 0a 2a 2a 20 63 75  est level .** cu
19da0 72 72 65 6e 74 6c 79 20 70 72 65 73 65 6e 74 20  rrently present 
19db0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
19dc0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  .**.** If this f
19dd0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
19de0 64 20 77 69 74 68 20 69 4c 65 76 65 6c 3c 30 2c  d with iLevel<0,
19df0 20 62 75 74 20 74 68 65 72 65 20 69 73 20 6f 6e   but there is on
19e00 6c 79 20 6f 6e 65 0a 2a 2a 20 73 65 67 6d 65 6e  ly one.** segmen
19e10 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
19e20 65 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  e, SQLITE_DONE i
19e30 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64  s returned immed
19e40 69 61 74 65 6c 79 2e 20 0a 2a 2a 20 4f 74 68 65  iately. .** Othe
19e50 72 77 69 73 65 2c 20 69 66 20 73 75 63 63 65 73  rwise, if succes
19e60 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
19e70 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
19e80 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
19e90 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65   .** an SQLite e
19ea0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
19eb0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
19ec0 20 69 6e 74 20 66 74 73 33 53 65 67 6d 65 6e 74   int fts3Segment
19ed0 4d 65 72 67 65 28 0a 20 20 46 74 73 33 54 61 62  Merge(.  Fts3Tab
19ee0 6c 65 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 4c  le *p, .  int iL
19ef0 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20 20  angid,          
19f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e            /* Lan
19f10 67 75 61 67 65 20 69 64 20 74 6f 20 6d 65 72 67  guage id to merg
19f20 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65  e */.  int iInde
19f30 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
19f40 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
19f50 69 6e 20 70 2d 3e 61 49 6e 64 65 78 5b 5d 20 74  in p->aIndex[] t
19f60 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74  o merge */.  int
19f70 20 69 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20   iLevel         
19f80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19f90 4c 65 76 65 6c 20 74 6f 20 6d 65 72 67 65 20 2a  Level to merge *
19fa0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
19fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fc0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
19fd0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
19fe0 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Idx = 0;        
19ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1a000 64 65 78 20 6f 66 20 6e 65 77 20 73 65 67 6d 65  dex of new segme
1a010 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  nt */.  sqlite3_
1a020 69 6e 74 36 34 20 69 4e 65 77 4c 65 76 65 6c 20  int64 iNewLevel 
1a030 3d 20 30 3b 20 20 20 20 2f 2a 20 4c 65 76 65 6c  = 0;    /* Level
1a040 2f 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65  /index to create
1a050 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 61 74 20   new segment at 
1a060 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 57 72 69 74  */.  SegmentWrit
1a070 65 72 20 2a 70 57 72 69 74 65 72 20 3d 20 30 3b  er *pWriter = 0;
1a080 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
1a090 77 72 69 74 65 20 74 68 65 20 6e 65 77 2c 20 6d  write the new, m
1a0a0 65 72 67 65 64 2c 20 73 65 67 6d 65 6e 74 20 2a  erged, segment *
1a0b0 2f 0a 20 20 46 74 73 33 53 65 67 46 69 6c 74 65  /.  Fts3SegFilte
1a0c0 72 20 66 69 6c 74 65 72 3b 20 20 20 20 20 20 20  r filter;       
1a0d0 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74      /* Segment t
1a0e0 65 72 6d 20 66 69 6c 74 65 72 20 63 6f 6e 64 69  erm filter condi
1a0f0 74 69 6f 6e 20 2a 2f 0a 20 20 46 74 73 33 4d 75  tion */.  Fts3Mu
1a100 6c 74 69 53 65 67 52 65 61 64 65 72 20 63 73 72  ltiSegReader csr
1a110 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72  ;         /* Cur
1a120 73 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74  sor to iterate t
1a130 68 72 6f 75 67 68 20 6c 65 76 65 6c 28 73 29 20  hrough level(s) 
1a140 2a 2f 0a 20 20 69 6e 74 20 62 49 67 6e 6f 72 65  */.  int bIgnore
1a150 45 6d 70 74 79 20 3d 20 30 3b 20 20 20 20 20 20  Empty = 0;      
1a160 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
1a170 69 67 6e 6f 72 65 20 65 6d 70 74 79 20 73 65 67  ignore empty seg
1a180 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 36 34 20 69  ments */.  i64 i
1a190 4d 61 78 4c 65 76 65 6c 20 3d 20 30 3b 20 20 20  MaxLevel = 0;   
1a1a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1a1b0 78 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20 66  x level number f
1a1c0 6f 72 20 74 68 69 73 20 69 6e 64 65 78 2f 6c 61  or this index/la
1a1d0 6e 67 69 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ngid */..  asser
1a1e0 74 28 20 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f  t( iLevel==FTS3_
1a1f0 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c 0a 20 20  SEGCURSOR_ALL.  
1a200 20 20 20 20 20 7c 7c 20 69 4c 65 76 65 6c 3d 3d       || iLevel==
1a210 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 50  FTS3_SEGCURSOR_P
1a220 45 4e 44 49 4e 47 0a 20 20 20 20 20 20 20 7c 7c  ENDING.       ||
1a230 20 69 4c 65 76 65 6c 3e 3d 30 0a 20 20 29 3b 0a   iLevel>=0.  );.
1a240 20 20 61 73 73 65 72 74 28 20 69 4c 65 76 65 6c    assert( iLevel
1a250 3c 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58  <FTS3_SEGDIR_MAX
1a260 4c 45 56 45 4c 20 29 3b 0a 20 20 61 73 73 65 72  LEVEL );.  asser
1a270 74 28 20 69 49 6e 64 65 78 3e 3d 30 20 26 26 20  t( iIndex>=0 && 
1a280 69 49 6e 64 65 78 3c 70 2d 3e 6e 49 6e 64 65 78  iIndex<p->nIndex
1a290 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   );..  rc = sqli
1a2a0 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72  te3Fts3SegReader
1a2b0 43 75 72 73 6f 72 28 70 2c 20 69 4c 61 6e 67 69  Cursor(p, iLangi
1a2c0 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65 76 65  d, iIndex, iLeve
1a2d0 6c 2c 20 30 2c 20 30 2c 20 31 2c 20 30 2c 20 26  l, 0, 0, 1, 0, &
1a2e0 63 73 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  csr);.  if( rc!=
1a2f0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 73 72  SQLITE_OK || csr
1a300 2e 6e 53 65 67 6d 65 6e 74 3d 3d 30 20 29 20 67  .nSegment==0 ) g
1a310 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 0a 20  oto finished;.. 
1a320 20 69 66 28 20 69 4c 65 76 65 6c 21 3d 46 54 53   if( iLevel!=FTS
1a330 33 5f 53 45 47 43 55 52 53 4f 52 5f 50 45 4e 44  3_SEGCURSOR_PEND
1a340 49 4e 47 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ING ){.    rc = 
1a350 66 74 73 33 53 65 67 6d 65 6e 74 4d 61 78 4c 65  fts3SegmentMaxLe
1a360 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20  vel(p, iLangid, 
1a370 69 49 6e 64 65 78 2c 20 26 69 4d 61 78 4c 65 76  iIndex, &iMaxLev
1a380 65 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  el);.    if( rc!
1a390 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1a3a0 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 7d 0a  o finished;.  }.
1a3b0 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3d 3d 46  .  if( iLevel==F
1a3c0 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c  TS3_SEGCURSOR_AL
1a3d0 4c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  L ){.    /* This
1a3e0 20 63 61 6c 6c 20 69 73 20 74 6f 20 6d 65 72 67   call is to merg
1a3f0 65 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69  e all segments i
1a400 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  n the database t
1a410 6f 20 61 20 73 69 6e 67 6c 65 0a 20 20 20 20 2a  o a single.    *
1a420 2a 20 73 65 67 6d 65 6e 74 2e 20 54 68 65 20 6c  * segment. The l
1a430 65 76 65 6c 20 6f 66 20 74 68 65 20 6e 65 77 20  evel of the new 
1a440 73 65 67 6d 65 6e 74 20 69 73 20 65 71 75 61 6c  segment is equal
1a450 20 74 6f 20 74 68 65 20 6e 75 6d 65 72 69 63 61   to the numerica
1a460 6c 6c 79 0a 20 20 20 20 2a 2a 20 67 72 65 61 74  lly.    ** great
1a470 65 73 74 20 73 65 67 6d 65 6e 74 20 6c 65 76 65  est segment leve
1a480 6c 20 63 75 72 72 65 6e 74 6c 79 20 70 72 65 73  l currently pres
1a490 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
1a4a0 61 73 65 20 66 6f 72 20 74 68 69 73 0a 20 20 20  ase for this.   
1a4b0 20 2a 2a 20 69 6e 64 65 78 2e 20 54 68 65 20 69   ** index. The i
1a4c0 64 78 20 6f 66 20 74 68 65 20 6e 65 77 20 73 65  dx of the new se
1a4d0 67 6d 65 6e 74 20 69 73 20 61 6c 77 61 79 73 20  gment is always 
1a4e0 30 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63  0.  */.    if( c
1a4f0 73 72 2e 6e 53 65 67 6d 65 6e 74 3d 3d 31 20 29  sr.nSegment==1 )
1a500 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1a510 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20  ITE_DONE;.      
1a520 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20  goto finished;. 
1a530 20 20 20 7d 0a 20 20 20 20 69 4e 65 77 4c 65 76     }.    iNewLev
1a540 65 6c 20 3d 20 69 4d 61 78 4c 65 76 65 6c 3b 0a  el = iMaxLevel;.
1a550 20 20 20 20 62 49 67 6e 6f 72 65 45 6d 70 74 79      bIgnoreEmpty
1a560 20 3d 20 31 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a   = 1;..  }else{.
1a570 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
1a580 20 69 73 20 74 6f 20 6d 65 72 67 65 20 61 6c 6c   is to merge all
1a590 20 73 65 67 6d 65 6e 74 73 20 61 74 20 6c 65 76   segments at lev
1a5a0 65 6c 20 69 4c 65 76 65 6c 2e 20 66 69 6e 64 20  el iLevel. find 
1a5b0 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20  the next.    ** 
1a5c0 61 76 61 69 6c 61 62 6c 65 20 73 65 67 6d 65 6e  available segmen
1a5d0 74 20 69 6e 64 65 78 20 61 74 20 6c 65 76 65 6c  t index at level
1a5e0 20 69 4c 65 76 65 6c 2b 31 2e 20 54 68 65 20 63   iLevel+1. The c
1a5f0 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 66 74  all to.    ** ft
1a600 73 33 41 6c 6c 6f 63 61 74 65 53 65 67 64 69 72  s3AllocateSegdir
1a610 49 64 78 28 29 20 77 69 6c 6c 20 6d 65 72 67 65  Idx() will merge
1a620 20 74 68 65 20 73 65 67 6d 65 6e 74 73 20 61 74   the segments at
1a630 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2b 31 20   level iLevel+1 
1a640 74 6f 20 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e  to .    ** a sin
1a650 67 6c 65 20 69 4c 65 76 65 6c 2b 32 20 73 65 67  gle iLevel+2 seg
1a660 6d 65 6e 74 20 69 66 20 6e 65 63 65 73 73 61 72  ment if necessar
1a670 79 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  y.  */.    asser
1a680 74 28 20 46 54 53 33 5f 53 45 47 43 55 52 53 4f  t( FTS3_SEGCURSO
1a690 52 5f 50 45 4e 44 49 4e 47 3d 3d 2d 31 20 29 3b  R_PENDING==-1 );
1a6a0 0a 20 20 20 20 69 4e 65 77 4c 65 76 65 6c 20 3d  .    iNewLevel =
1a6b0 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65   getAbsoluteLeve
1a6c0 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49  l(p, iLangid, iI
1a6d0 6e 64 65 78 2c 20 69 4c 65 76 65 6c 2b 31 29 3b  ndex, iLevel+1);
1a6e0 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 41 6c  .    rc = fts3Al
1a6f0 6c 6f 63 61 74 65 53 65 67 64 69 72 49 64 78 28  locateSegdirIdx(
1a700 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64  p, iLangid, iInd
1a710 65 78 2c 20 69 4c 65 76 65 6c 2b 31 2c 20 26 69  ex, iLevel+1, &i
1a720 49 64 78 29 3b 0a 20 20 20 20 62 49 67 6e 6f 72  Idx);.    bIgnor
1a730 65 45 6d 70 74 79 20 3d 20 28 69 4c 65 76 65 6c  eEmpty = (iLevel
1a740 21 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52  !=FTS3_SEGCURSOR
1a750 5f 50 45 4e 44 49 4e 47 29 20 26 26 20 28 69 4e  _PENDING) && (iN
1a760 65 77 4c 65 76 65 6c 3e 69 4d 61 78 4c 65 76 65  ewLevel>iMaxLeve
1a770 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  l);.  }.  if( rc
1a780 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1a790 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 0a 20 20  to finished;..  
1a7a0 61 73 73 65 72 74 28 20 63 73 72 2e 6e 53 65 67  assert( csr.nSeg
1a7b0 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  ment>0 );.  asse
1a7c0 72 74 28 20 69 4e 65 77 4c 65 76 65 6c 3e 3d 67  rt( iNewLevel>=g
1a7d0 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28  etAbsoluteLevel(
1a7e0 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64  p, iLangid, iInd
1a7f0 65 78 2c 20 30 29 20 29 3b 0a 20 20 61 73 73 65  ex, 0) );.  asse
1a800 72 74 28 20 69 4e 65 77 4c 65 76 65 6c 3c 67 65  rt( iNewLevel<ge
1a810 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70  tAbsoluteLevel(p
1a820 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
1a830 78 2c 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41  x,FTS3_SEGDIR_MA
1a840 58 4c 45 56 45 4c 29 20 29 3b 0a 0a 20 20 6d 65  XLEVEL) );..  me
1a850 6d 73 65 74 28 26 66 69 6c 74 65 72 2c 20 30 2c  mset(&filter, 0,
1a860 20 73 69 7a 65 6f 66 28 46 74 73 33 53 65 67 46   sizeof(Fts3SegF
1a870 69 6c 74 65 72 29 29 3b 0a 20 20 66 69 6c 74 65  ilter));.  filte
1a880 72 2e 66 6c 61 67 73 20 3d 20 46 54 53 33 5f 53  r.flags = FTS3_S
1a890 45 47 4d 45 4e 54 5f 52 45 51 55 49 52 45 5f 50  EGMENT_REQUIRE_P
1a8a0 4f 53 3b 0a 20 20 66 69 6c 74 65 72 2e 66 6c 61  OS;.  filter.fla
1a8b0 67 73 20 7c 3d 20 28 62 49 67 6e 6f 72 65 45 6d  gs |= (bIgnoreEm
1a8c0 70 74 79 20 3f 20 46 54 53 33 5f 53 45 47 4d 45  pty ? FTS3_SEGME
1a8d0 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d 50 54 59 20  NT_IGNORE_EMPTY 
1a8e0 3a 20 30 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  : 0);..  rc = sq
1a8f0 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64  lite3Fts3SegRead
1a900 65 72 53 74 61 72 74 28 70 2c 20 26 63 73 72 2c  erStart(p, &csr,
1a910 20 26 66 69 6c 74 65 72 29 3b 0a 20 20 77 68 69   &filter);.  whi
1a920 6c 65 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72  le( SQLITE_OK==r
1a930 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  c ){.    rc = sq
1a940 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64  lite3Fts3SegRead
1a950 65 72 53 74 65 70 28 70 2c 20 26 63 73 72 29 3b  erStep(p, &csr);
1a960 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1a970 49 54 45 5f 52 4f 57 20 29 20 62 72 65 61 6b 3b  ITE_ROW ) break;
1a980 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65  .    rc = fts3Se
1a990 67 57 72 69 74 65 72 41 64 64 28 70 2c 20 26 70  gWriterAdd(p, &p
1a9a0 57 72 69 74 65 72 2c 20 31 2c 20 0a 20 20 20 20  Writer, 1, .    
1a9b0 20 20 20 20 63 73 72 2e 7a 54 65 72 6d 2c 20 63      csr.zTerm, c
1a9c0 73 72 2e 6e 54 65 72 6d 2c 20 63 73 72 2e 61 44  sr.nTerm, csr.aD
1a9d0 6f 63 6c 69 73 74 2c 20 63 73 72 2e 6e 44 6f 63  oclist, csr.nDoc
1a9e0 6c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  list);.  }.  if(
1a9f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1aa00 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a   goto finished;.
1aa10 20 20 61 73 73 65 72 74 28 20 70 57 72 69 74 65    assert( pWrite
1aa20 72 20 7c 7c 20 62 49 67 6e 6f 72 65 45 6d 70 74  r || bIgnoreEmpt
1aa30 79 20 29 3b 0a 0a 20 20 69 66 28 20 69 4c 65 76  y );..  if( iLev
1aa40 65 6c 21 3d 46 54 53 33 5f 53 45 47 43 55 52 53  el!=FTS3_SEGCURS
1aa50 4f 52 5f 50 45 4e 44 49 4e 47 20 29 7b 0a 20 20  OR_PENDING ){.  
1aa60 20 20 72 63 20 3d 20 66 74 73 33 44 65 6c 65 74    rc = fts3Delet
1aa70 65 53 65 67 64 69 72 28 0a 20 20 20 20 20 20 20  eSegdir(.       
1aa80 20 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e   p, iLangid, iIn
1aa90 64 65 78 2c 20 69 4c 65 76 65 6c 2c 20 63 73 72  dex, iLevel, csr
1aaa0 2e 61 70 53 65 67 6d 65 6e 74 2c 20 63 73 72 2e  .apSegment, csr.
1aab0 6e 53 65 67 6d 65 6e 74 0a 20 20 20 20 29 3b 0a  nSegment.    );.
1aac0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1aad0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e  TE_OK ) goto fin
1aae0 69 73 68 65 64 3b 0a 20 20 7d 0a 20 20 69 66 28  ished;.  }.  if(
1aaf0 20 70 57 72 69 74 65 72 20 29 7b 0a 20 20 20 20   pWriter ){.    
1ab00 72 63 20 3d 20 66 74 73 33 53 65 67 57 72 69 74  rc = fts3SegWrit
1ab10 65 72 46 6c 75 73 68 28 70 2c 20 70 57 72 69 74  erFlush(p, pWrit
1ab20 65 72 2c 20 69 4e 65 77 4c 65 76 65 6c 2c 20 69  er, iNewLevel, i
1ab30 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Idx);.    if( rc
1ab40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ab50 20 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c 3d       if( iLevel=
1ab60 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f  =FTS3_SEGCURSOR_
1ab70 50 45 4e 44 49 4e 47 20 7c 7c 20 69 4e 65 77 4c  PENDING || iNewL
1ab80 65 76 65 6c 3c 69 4d 61 78 4c 65 76 65 6c 20 29  evel<iMaxLevel )
1ab90 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
1aba0 74 73 33 50 72 6f 6d 6f 74 65 53 65 67 6d 65 6e  ts3PromoteSegmen
1abb0 74 73 28 70 2c 20 69 4e 65 77 4c 65 76 65 6c 2c  ts(p, iNewLevel,
1abc0 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44   pWriter->nLeafD
1abd0 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ata);.      }.  
1abe0 20 20 7d 0a 20 20 7d 0a 0a 20 66 69 6e 69 73 68    }.  }.. finish
1abf0 65 64 3a 0a 20 20 66 74 73 33 53 65 67 57 72 69  ed:.  fts3SegWri
1ac00 74 65 72 46 72 65 65 28 70 57 72 69 74 65 72 29  terFree(pWriter)
1ac10 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 53  ;.  sqlite3Fts3S
1ac20 65 67 52 65 61 64 65 72 46 69 6e 69 73 68 28 26  egReaderFinish(&
1ac30 63 73 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  csr);.  return r
1ac40 63 3b 0a 7d 0a 0a 0a 2f 2a 20 0a 2a 2a 20 46 6c  c;.}.../* .** Fl
1ac50 75 73 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ush the contents
1ac60 20 6f 66 20 70 65 6e 64 69 6e 67 54 65 72 6d 73   of pendingTerms
1ac70 20 74 6f 20 6c 65 76 65 6c 20 30 20 73 65 67 6d   to level 0 segm
1ac80 65 6e 74 73 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  ents. .*/.int sq
1ac90 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67  lite3Fts3Pending
1aca0 54 65 72 6d 73 46 6c 75 73 68 28 46 74 73 33 54  TermsFlush(Fts3T
1acb0 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  able *p){.  int 
1acc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1acd0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
1ace0 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d   .  for(i=0; rc=
1acf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
1ad00 70 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b 29 7b  p->nIndex; i++){
1ad10 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65  .    rc = fts3Se
1ad20 67 6d 65 6e 74 4d 65 72 67 65 28 70 2c 20 70 2d  gmentMerge(p, p-
1ad30 3e 69 50 72 65 76 4c 61 6e 67 69 64 2c 20 69 2c  >iPrevLangid, i,
1ad40 20 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f   FTS3_SEGCURSOR_
1ad50 50 45 4e 44 49 4e 47 29 3b 0a 20 20 20 20 69 66  PENDING);.    if
1ad60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
1ad70 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  E ) rc = SQLITE_
1ad80 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OK;.  }.  sqlite
1ad90 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d  3Fts3PendingTerm
1ada0 73 43 6c 65 61 72 28 70 29 3b 0a 0a 20 20 2f 2a  sClear(p);..  /*
1adb0 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 61   Determine the a
1adc0 75 74 6f 2d 69 6e 63 72 2d 6d 65 72 67 65 20 73  uto-incr-merge s
1add0 65 74 74 69 6e 67 20 69 66 20 75 6e 6b 6e 6f 77  etting if unknow
1ade0 6e 2e 20 20 49 66 20 65 6e 61 62 6c 65 64 2c 0a  n.  If enabled,.
1adf0 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 20 74 68    ** estimate th
1ae00 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  e number of leaf
1ae10 20 62 6c 6f 63 6b 73 20 6f 66 20 63 6f 6e 74 65   blocks of conte
1ae20 6e 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  nt to be written
1ae30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
1ae40 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
1ae50 62 48 61 73 53 74 61 74 0a 20 20 20 26 26 20 70  bHasStat.   && p
1ae60 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d 65 72 67 65  ->nAutoincrmerge
1ae70 3d 3d 30 78 66 66 20 26 26 20 70 2d 3e 6e 4c 65  ==0xff && p->nLe
1ae80 61 66 41 64 64 3e 30 0a 20 20 29 7b 0a 20 20 20  afAdd>0.  ){.   
1ae90 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1aea0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 72 63  Stmt = 0;.    rc
1aeb0 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
1aec0 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 54 41  , SQL_SELECT_STA
1aed0 54 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  T, &pStmt, 0);. 
1aee0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1aef0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
1af00 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
1af10 53 74 6d 74 2c 20 31 2c 20 46 54 53 5f 53 54 41  Stmt, 1, FTS_STA
1af20 54 5f 41 55 54 4f 49 4e 43 52 4d 45 52 47 45 29  T_AUTOINCRMERGE)
1af30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1af40 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
1af50 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1af60 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
1af70 20 20 20 20 20 20 70 2d 3e 6e 41 75 74 6f 69 6e        p->nAutoin
1af80 63 72 6d 65 72 67 65 20 3d 20 73 71 6c 69 74 65  crmerge = sqlite
1af90 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
1afa0 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  mt, 0);.        
1afb0 69 66 28 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72  if( p->nAutoincr
1afc0 6d 65 72 67 65 3d 3d 31 20 29 20 70 2d 3e 6e 41  merge==1 ) p->nA
1afd0 75 74 6f 69 6e 63 72 6d 65 72 67 65 20 3d 20 38  utoincrmerge = 8
1afe0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1aff0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
1b000 45 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  E ){.        p->
1b010 6e 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 20 3d  nAutoincrmerge =
1b020 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1b030 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
1b040 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  eset(pStmt);.   
1b050 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1b060 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 63  rc;.}../*.** Enc
1b070 6f 64 65 20 4e 20 69 6e 74 65 67 65 72 73 20 61  ode N integers a
1b080 73 20 76 61 72 69 6e 74 73 20 69 6e 74 6f 20 61  s varints into a
1b090 20 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69 63   blob..*/.static
1b0a0 20 76 6f 69 64 20 66 74 73 33 45 6e 63 6f 64 65   void fts3Encode
1b0b0 49 6e 74 41 72 72 61 79 28 0a 20 20 69 6e 74 20  IntArray(.  int 
1b0c0 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  N,             /
1b0d0 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
1b0e0 69 6e 74 65 67 65 72 73 20 74 6f 20 65 6e 63 6f  integers to enco
1b0f0 64 65 20 2a 2f 0a 20 20 75 33 32 20 2a 61 2c 20  de */.  u32 *a, 
1b100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1b110 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73  e integer values
1b120 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 66   */.  char *zBuf
1b130 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ,        /* Writ
1b140 65 20 74 68 65 20 42 4c 4f 42 20 68 65 72 65 20  e the BLOB here 
1b150 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 42 75 66 20  */.  int *pNBuf 
1b160 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1b170 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1b180 20 69 66 20 7a 42 75 66 5b 5d 20 75 73 65 64 20   if zBuf[] used 
1b190 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
1b1a0 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a   i, j;.  for(i=j
1b1b0 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<N; i++){. 
1b1c0 20 20 20 6a 20 2b 3d 20 73 71 6c 69 74 65 33 46     j += sqlite3F
1b1d0 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 7a 42  ts3PutVarint(&zB
1b1e0 75 66 5b 6a 5d 2c 20 28 73 71 6c 69 74 65 33 5f  uf[j], (sqlite3_
1b1f0 69 6e 74 36 34 29 61 5b 69 5d 29 3b 0a 20 20 7d  int64)a[i]);.  }
1b200 0a 20 20 2a 70 4e 42 75 66 20 3d 20 6a 3b 0a 7d  .  *pNBuf = j;.}
1b210 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61  ../*.** Decode a
1b220 20 62 6c 6f 62 20 6f 66 20 76 61 72 69 6e 74 73   blob of varints
1b230 20 69 6e 74 6f 20 4e 20 69 6e 74 65 67 65 72 73   into N integers
1b240 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b250 66 74 73 33 44 65 63 6f 64 65 49 6e 74 41 72 72  fts3DecodeIntArr
1b260 61 79 28 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20  ay(.  int N,    
1b270 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1b280 6e 75 6d 62 65 72 20 6f 66 20 69 6e 74 65 67 65  number of intege
1b290 72 73 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a  rs to decode */.
1b2a0 20 20 75 33 32 20 2a 61 2c 20 20 20 20 20 20 20    u32 *a,       
1b2b0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
1b2c0 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73  e integer values
1b2d0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1b2e0 20 2a 7a 42 75 66 2c 20 20 2f 2a 20 54 68 65 20   *zBuf,  /* The 
1b2f0 42 4c 4f 42 20 63 6f 6e 74 61 69 6e 69 6e 67 20  BLOB containing 
1b300 74 68 65 20 76 61 72 69 6e 74 73 20 2a 2f 0a 20  the varints */. 
1b310 20 69 6e 74 20 6e 42 75 66 20 20 20 20 20 20 20   int nBuf       
1b320 20 20 20 20 2f 2a 20 73 69 7a 65 20 6f 66 20 74      /* size of t
1b330 68 65 20 42 4c 4f 42 20 2a 2f 0a 29 7b 0a 20 20  he BLOB */.){.  
1b340 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 55 4e 55 53  int i, j;.  UNUS
1b350 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 42 75  ED_PARAMETER(nBu
1b360 66 29 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  f);.  for(i=j=0;
1b370 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<N; i++){.    
1b380 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 78 3b  sqlite3_int64 x;
1b390 0a 20 20 20 20 6a 20 2b 3d 20 73 71 6c 69 74 65  .    j += sqlite
1b3a0 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 26  3Fts3GetVarint(&
1b3b0 7a 42 75 66 5b 6a 5d 2c 20 26 78 29 3b 0a 20 20  zBuf[j], &x);.  
1b3c0 20 20 61 73 73 65 72 74 28 6a 3c 3d 6e 42 75 66    assert(j<=nBuf
1b3d0 29 3b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 28 75  );.    a[i] = (u
1b3e0 33 32 29 28 78 20 26 20 30 78 66 66 66 66 66 66  32)(x & 0xffffff
1b3f0 66 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ff);.  }.}../*.*
1b400 2a 20 49 6e 73 65 72 74 20 74 68 65 20 73 69 7a  * Insert the siz
1b410 65 73 20 28 69 6e 20 74 6f 6b 65 6e 73 29 20 66  es (in tokens) f
1b420 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f  or each column o
1b430 66 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 0a 2a  f the document.*
1b440 2a 20 77 69 74 68 20 64 6f 63 69 64 20 65 71 75  * with docid equ
1b450 61 6c 20 74 6f 20 70 2d 3e 69 50 72 65 76 44 6f  al to p->iPrevDo
1b460 63 69 64 2e 20 20 54 68 65 20 73 69 7a 65 73 20  cid.  The sizes 
1b470 61 72 65 20 65 6e 63 6f 64 65 64 20 61 73 0a 2a  are encoded as.*
1b480 2a 20 61 20 62 6c 6f 62 20 6f 66 20 76 61 72 69  * a blob of vari
1b490 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nts..*/.static v
1b4a0 6f 69 64 20 66 74 73 33 49 6e 73 65 72 74 44 6f  oid fts3InsertDo
1b4b0 63 73 69 7a 65 28 0a 20 20 69 6e 74 20 2a 70 52  csize(.  int *pR
1b4c0 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C,              
1b4d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
1b4e0 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  lt code */.  Fts
1b4f0 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
1b500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b510 54 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68  Table into which
1b520 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20   to insert */.  
1b530 75 33 32 20 2a 61 53 7a 20 20 20 20 20 20 20 20  u32 *aSz        
1b540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b550 2f 2a 20 53 69 7a 65 73 20 6f 66 20 65 61 63 68  /* Sizes of each
1b560 20 63 6f 6c 75 6d 6e 2c 20 69 6e 20 74 6f 6b 65   column, in toke
1b570 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  ns */.){.  char 
1b580 2a 70 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20  *pBlob;         
1b590 20 20 20 20 2f 2a 20 54 68 65 20 42 4c 4f 42 20      /* The BLOB 
1b5a0 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20  encoding of the 
1b5b0 64 6f 63 75 6d 65 6e 74 20 73 69 7a 65 20 2a 2f  document size */
1b5c0 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20  .  int nBlob;   
1b5d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1b5e0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
1b5f0 6e 20 74 68 65 20 42 4c 4f 42 20 2a 2f 0a 20 20  n the BLOB */.  
1b600 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1b610 74 6d 74 3b 20 20 20 20 20 2f 2a 20 53 74 61 74  tmt;     /* Stat
1b620 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 69 6e  ement used to in
1b630 73 65 72 74 20 74 68 65 20 65 6e 63 6f 64 69 6e  sert the encodin
1b640 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  g */.  int rc;  
1b650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b660 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
1b670 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
1b680 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20   */..  if( *pRC 
1b690 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 42 6c 6f  ) return;.  pBlo
1b6a0 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  b = sqlite3_mall
1b6b0 6f 63 28 20 31 30 2a 70 2d 3e 6e 43 6f 6c 75 6d  oc( 10*p->nColum
1b6c0 6e 20 29 3b 0a 20 20 69 66 28 20 70 42 6c 6f 62  n );.  if( pBlob
1b6d0 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  ==0 ){.    *pRC 
1b6e0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1b6f0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1b700 20 20 66 74 73 33 45 6e 63 6f 64 65 49 6e 74 41    fts3EncodeIntA
1b710 72 72 61 79 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2c  rray(p->nColumn,
1b720 20 61 53 7a 2c 20 70 42 6c 6f 62 2c 20 26 6e 42   aSz, pBlob, &nB
1b730 6c 6f 62 29 3b 0a 20 20 72 63 20 3d 20 66 74 73  lob);.  rc = fts
1b740 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
1b750 52 45 50 4c 41 43 45 5f 44 4f 43 53 49 5a 45 2c  REPLACE_DOCSIZE,
1b760 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69   &pStmt, 0);.  i
1b770 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c  f( rc ){.    sql
1b780 69 74 65 33 5f 66 72 65 65 28 70 42 6c 6f 62 29  ite3_free(pBlob)
1b790 3b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  ;.    *pRC = rc;
1b7a0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1b7b0 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
1b7c0 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20  int64(pStmt, 1, 
1b7d0 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 29 3b 0a  p->iPrevDocid);.
1b7e0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62    sqlite3_bind_b
1b7f0 6c 6f 62 28 70 53 74 6d 74 2c 20 32 2c 20 70 42  lob(pStmt, 2, pB
1b800 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 73 71 6c 69  lob, nBlob, sqli
1b810 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 73 71 6c  te3_free);.  sql
1b820 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
1b830 3b 0a 20 20 2a 70 52 43 20 3d 20 73 71 6c 69 74  ;.  *pRC = sqlit
1b840 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
1b850 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64  .}../*.** Record
1b860 20 30 20 6f 66 20 74 68 65 20 25 5f 73 74 61 74   0 of the %_stat
1b870 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20   table contains 
1b880 61 20 62 6c 6f 62 20 63 6f 6e 73 69 73 74 69 6e  a blob consistin
1b890 67 20 6f 66 20 4e 20 76 61 72 69 6e 74 73 2c 0a  g of N varints,.
1b8a0 2a 2a 20 77 68 65 72 65 20 4e 20 69 73 20 74 68  ** where N is th
1b8b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 65 72  e number of user
1b8c0 20 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73   defined columns
1b8d0 20 69 6e 20 74 68 65 20 66 74 73 33 20 74 61 62   in the fts3 tab
1b8e0 6c 65 20 70 6c 75 73 0a 2a 2a 20 74 77 6f 2e 20  le plus.** two. 
1b8f0 49 66 20 6e 43 6f 6c 20 69 73 20 74 68 65 20 6e  If nCol is the n
1b900 75 6d 62 65 72 20 6f 66 20 75 73 65 72 20 64 65  umber of user de
1b910 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 2c 20 74  fined columns, t
1b920 68 65 6e 20 76 61 6c 75 65 73 20 6f 66 20 74 68  hen values of th
1b930 65 20 0a 2a 2a 20 76 61 72 69 6e 74 73 20 61 72  e .** varints ar
1b940 65 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73  e set as follows
1b950 3a 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 6e 74  :.**.**   Varint
1b960 20 30 3a 20 20 20 20 20 20 20 54 6f 74 61 6c 20   0:       Total 
1b970 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
1b980 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  n the table..**.
1b990 2a 2a 20 20 20 56 61 72 69 6e 74 20 31 2e 2e 6e  **   Varint 1..n
1b9a0 43 6f 6c 3a 20 46 6f 72 20 65 61 63 68 20 63 6f  Col: For each co
1b9b0 6c 75 6d 6e 2c 20 74 68 65 20 74 6f 74 61 6c 20  lumn, the total 
1b9c0 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73  number of tokens
1b9d0 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20   stored in.**   
1b9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9f0 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 61  the column for a
1ba00 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74  ll rows of the t
1ba10 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61  able..**.**   Va
1ba20 72 69 6e 74 20 31 2b 6e 43 6f 6c 3a 20 20 54 68  rint 1+nCol:  Th
1ba30 65 20 74 6f 74 61 6c 20 73 69 7a 65 2c 20 69 6e  e total size, in
1ba40 20 62 79 74 65 73 2c 20 6f 66 20 61 6c 6c 20 74   bytes, of all t
1ba50 65 78 74 20 76 61 6c 75 65 73 20 69 6e 20 61 6c  ext values in al
1ba60 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
1ba70 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f         columns o
1ba80 66 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68  f all rows of th
1ba90 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73  e table..**.*/.s
1baa0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 55  tatic void fts3U
1bab0 70 64 61 74 65 44 6f 63 54 6f 74 61 6c 73 28 0a  pdateDocTotals(.
1bac0 20 20 69 6e 74 20 2a 70 52 43 2c 20 20 20 20 20    int *pRC,     
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bae0 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
1baf0 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 54 61  code */.  Fts3Ta
1bb00 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
1bb10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
1bb20 6c 65 20 62 65 69 6e 67 20 75 70 64 61 74 65 64  le being updated
1bb30 20 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a 49 6e   */.  u32 *aSzIn
1bb40 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
1bb50 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 69 6e        /* Size in
1bb60 63 72 65 61 73 65 73 20 2a 2f 0a 20 20 75 33 32  creases */.  u32
1bb70 20 2a 61 53 7a 44 65 6c 2c 20 20 20 20 20 20 20   *aSzDel,       
1bb80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bb90 53 69 7a 65 20 64 65 63 72 65 61 73 65 73 20 2a  Size decreases *
1bba0 2f 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20 20 20  /.  int nChng   
1bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbc0 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 69 6e      /* Change in
1bbd0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 64   the number of d
1bbe0 6f 63 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  ocuments */.){. 
1bbf0 20 63 68 61 72 20 2a 70 42 6c 6f 62 3b 20 20 20   char *pBlob;   
1bc00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f            /* Sto
1bc10 72 61 67 65 20 66 6f 72 20 42 4c 4f 42 20 77 72  rage for BLOB wr
1bc20 69 74 74 65 6e 20 69 6e 74 6f 20 25 5f 73 74 61  itten into %_sta
1bc30 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62  t */.  int nBlob
1bc40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bc50 2f 2a 20 53 69 7a 65 20 6f 66 20 42 4c 4f 42 20  /* Size of BLOB 
1bc60 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 25 5f 73  written into %_s
1bc70 74 61 74 20 2a 2f 0a 20 20 75 33 32 20 2a 61 3b  tat */.  u32 *a;
1bc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc90 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 69 6e    /* Array of in
1bca0 74 65 67 65 72 73 20 74 68 61 74 20 62 65 63 6f  tegers that beco
1bcb0 6d 65 73 20 74 68 65 20 42 4c 4f 42 20 2a 2f 0a  mes the BLOB */.
1bcc0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1bcd0 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 53 74  pStmt;     /* St
1bce0 61 74 65 6d 65 6e 74 20 66 6f 72 20 72 65 61 64  atement for read
1bcf0 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 20  ing and writing 
1bd00 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
1bd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bd20 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
1bd30 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1bd40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1bd50 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
1bd60 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  subfunctions */.
1bd70 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 53 74  .  const int nSt
1bd80 61 74 20 3d 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  at = p->nColumn+
1bd90 32 3b 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  2;..  if( *pRC )
1bda0 20 72 65 74 75 72 6e 3b 0a 20 20 61 20 3d 20 73   return;.  a = s
1bdb0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 28  qlite3_malloc( (
1bdc0 73 69 7a 65 6f 66 28 75 33 32 29 2b 31 30 29 2a  sizeof(u32)+10)*
1bdd0 6e 53 74 61 74 20 29 3b 0a 20 20 69 66 28 20 61  nStat );.  if( a
1bde0 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  ==0 ){.    *pRC 
1bdf0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1be00 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1be10 20 20 70 42 6c 6f 62 20 3d 20 28 63 68 61 72 2a    pBlob = (char*
1be20 29 26 61 5b 6e 53 74 61 74 5d 3b 0a 20 20 72 63  )&a[nStat];.  rc
1be30 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
1be40 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 54 41  , SQL_SELECT_STA
1be50 54 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  T, &pStmt, 0);. 
1be60 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
1be70 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a  qlite3_free(a);.
1be80 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
1be90 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1bea0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
1beb0 74 28 70 53 74 6d 74 2c 20 31 2c 20 46 54 53 5f  t(pStmt, 1, FTS_
1bec0 53 54 41 54 5f 44 4f 43 54 4f 54 41 4c 29 3b 0a  STAT_DOCTOTAL);.
1bed0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
1bee0 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
1bef0 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 66 74 73  E_ROW ){.    fts
1bf00 33 44 65 63 6f 64 65 49 6e 74 41 72 72 61 79 28  3DecodeIntArray(
1bf10 6e 53 74 61 74 2c 20 61 2c 0a 20 20 20 20 20 20  nStat, a,.      
1bf20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
1bf30 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 30 29  n_blob(pStmt, 0)
1bf40 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ,.         sqlit
1bf50 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
1bf60 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 7d 65  pStmt, 0));.  }e
1bf70 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  lse{.    memset(
1bf80 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 33 32  a, 0, sizeof(u32
1bf90 29 2a 28 6e 53 74 61 74 29 20 29 3b 0a 20 20 7d  )*(nStat) );.  }
1bfa0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1bfb0 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
1bfc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1bfd0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
1bfe0 5f 66 72 65 65 28 61 29 3b 0a 20 20 20 20 2a 70  _free(a);.    *p
1bff0 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74  RC = rc;.    ret
1c000 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  urn;.  }.  if( n
1c010 43 68 6e 67 3c 30 20 26 26 20 61 5b 30 5d 3c 28  Chng<0 && a[0]<(
1c020 75 33 32 29 28 2d 6e 43 68 6e 67 29 20 29 7b 0a  u32)(-nChng) ){.
1c030 20 20 20 20 61 5b 30 5d 20 3d 20 30 3b 0a 20 20      a[0] = 0;.  
1c040 7d 65 6c 73 65 7b 0a 20 20 20 20 61 5b 30 5d 20  }else{.    a[0] 
1c050 2b 3d 20 6e 43 68 6e 67 3b 0a 20 20 7d 0a 20 20  += nChng;.  }.  
1c060 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
1c070 6f 6c 75 6d 6e 2b 31 3b 20 69 2b 2b 29 7b 0a 20  olumn+1; i++){. 
1c080 20 20 20 75 33 32 20 78 20 3d 20 61 5b 69 2b 31     u32 x = a[i+1
1c090 5d 3b 0a 20 20 20 20 69 66 28 20 78 2b 61 53 7a  ];.    if( x+aSz
1c0a0 49 6e 73 5b 69 5d 20 3c 20 61 53 7a 44 65 6c 5b  Ins[i] < aSzDel[
1c0b0 69 5d 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20  i] ){.      x = 
1c0c0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1c0d0 20 20 20 20 78 20 3d 20 78 20 2b 20 61 53 7a 49      x = x + aSzI
1c0e0 6e 73 5b 69 5d 20 2d 20 61 53 7a 44 65 6c 5b 69  ns[i] - aSzDel[i
1c0f0 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 5b 69  ];.    }.    a[i
1c100 2b 31 5d 20 3d 20 78 3b 0a 20 20 7d 0a 20 20 66  +1] = x;.  }.  f
1c110 74 73 33 45 6e 63 6f 64 65 49 6e 74 41 72 72 61  ts3EncodeIntArra
1c120 79 28 6e 53 74 61 74 2c 20 61 2c 20 70 42 6c 6f  y(nStat, a, pBlo
1c130 62 2c 20 26 6e 42 6c 6f 62 29 3b 0a 20 20 72 63  b, &nBlob);.  rc
1c140 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
1c150 2c 20 53 51 4c 5f 52 45 50 4c 41 43 45 5f 53 54  , SQL_REPLACE_ST
1c160 41 54 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  AT, &pStmt, 0);.
1c170 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1c180 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b  sqlite3_free(a);
1c190 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
1c1a0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1c1b0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
1c1c0 6e 74 28 70 53 74 6d 74 2c 20 31 2c 20 46 54 53  nt(pStmt, 1, FTS
1c1d0 5f 53 54 41 54 5f 44 4f 43 54 4f 54 41 4c 29 3b  _STAT_DOCTOTAL);
1c1e0 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
1c1f0 62 6c 6f 62 28 70 53 74 6d 74 2c 20 32 2c 20 70  blob(pStmt, 2, p
1c200 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 53 51 4c  Blob, nBlob, SQL
1c210 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73  ITE_STATIC);.  s
1c220 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
1c230 74 29 3b 0a 20 20 2a 70 52 43 20 3d 20 73 71 6c  t);.  *pRC = sql
1c240 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
1c250 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
1c260 65 28 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  e(a);.}../*.** M
1c270 65 72 67 65 20 74 68 65 20 65 6e 74 69 72 65 20  erge the entire 
1c280 64 61 74 61 62 61 73 65 20 73 6f 20 74 68 61 74  database so that
1c290 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20 73 65   there is one se
1c2a0 67 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20 0a  gment for each .
1c2b0 2a 2a 20 69 49 6e 64 65 78 2f 69 4c 61 6e 67 69  ** iIndex/iLangi
1c2c0 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 0a 2a  d combination..*
1c2d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1c2e0 33 44 6f 4f 70 74 69 6d 69 7a 65 28 46 74 73 33  3DoOptimize(Fts3
1c2f0 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 62 52  Table *p, int bR
1c300 65 74 75 72 6e 44 6f 6e 65 29 7b 0a 20 20 69 6e  eturnDone){.  in
1c310 74 20 62 53 65 65 6e 44 6f 6e 65 20 3d 20 30 3b  t bSeenDone = 0;
1c320 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
1c330 69 74 65 33 5f 73 74 6d 74 20 2a 70 41 6c 6c 4c  ite3_stmt *pAllL
1c340 61 6e 67 69 64 20 3d 20 30 3b 0a 0a 20 20 72 63  angid = 0;..  rc
1c350 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
1c360 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 41 4c 4c  , SQL_SELECT_ALL
1c370 5f 4c 41 4e 47 49 44 2c 20 26 70 41 6c 6c 4c 61  _LANGID, &pAllLa
1c380 6e 67 69 64 2c 20 30 29 3b 0a 20 20 69 66 28 20  ngid, 0);.  if( 
1c390 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c3a0 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20  .    int rc2;.  
1c3b0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
1c3c0 6e 74 28 70 41 6c 6c 4c 61 6e 67 69 64 2c 20 31  nt(pAllLangid, 1
1c3d0 2c 20 70 2d 3e 69 50 72 65 76 4c 61 6e 67 69 64  , p->iPrevLangid
1c3e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  );.    sqlite3_b
1c3f0 69 6e 64 5f 69 6e 74 28 70 41 6c 6c 4c 61 6e 67  ind_int(pAllLang
1c400 69 64 2c 20 32 2c 20 70 2d 3e 6e 49 6e 64 65 78  id, 2, p->nIndex
1c410 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71  );.    while( sq
1c420 6c 69 74 65 33 5f 73 74 65 70 28 70 41 6c 6c 4c  lite3_step(pAllL
1c430 61 6e 67 69 64 29 3d 3d 53 51 4c 49 54 45 5f 52  angid)==SQLITE_R
1c440 4f 57 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OW ){.      int 
1c450 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 61  i;.      int iLa
1c460 6e 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63  ngid = sqlite3_c
1c470 6f 6c 75 6d 6e 5f 69 6e 74 28 70 41 6c 6c 4c 61  olumn_int(pAllLa
1c480 6e 67 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  ngid, 0);.      
1c490 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
1c4a0 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e  ITE_OK && i<p->n
1c4b0 49 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  Index; i++){.   
1c4c0 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65       rc = fts3Se
1c4d0 67 6d 65 6e 74 4d 65 72 67 65 28 70 2c 20 69 4c  gmentMerge(p, iL
1c4e0 61 6e 67 69 64 2c 20 69 2c 20 46 54 53 33 5f 53  angid, i, FTS3_S
1c4f0 45 47 43 55 52 53 4f 52 5f 41 4c 4c 29 3b 0a 20  EGCURSOR_ALL);. 
1c500 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1c510 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
1c520 20 20 20 20 20 20 20 20 62 53 65 65 6e 44 6f 6e          bSeenDon
1c530 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
1c540 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c550 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c560 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 32   }.    }.    rc2
1c570 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
1c580 28 70 41 6c 6c 4c 61 6e 67 69 64 29 3b 0a 20 20  (pAllLangid);.  
1c590 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c5a0 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
1c5b0 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 46 74    }..  sqlite3Ft
1c5c0 73 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28  s3SegmentsClose(
1c5d0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73  p);.  sqlite3Fts
1c5e0 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 43 6c 65  3PendingTermsCle
1c5f0 61 72 28 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e  ar(p);..  return
1c600 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   (rc==SQLITE_OK 
1c610 26 26 20 62 52 65 74 75 72 6e 44 6f 6e 65 20 26  && bReturnDone &
1c620 26 20 62 53 65 65 6e 44 6f 6e 65 29 20 3f 20 53  & bSeenDone) ? S
1c630 51 4c 49 54 45 5f 44 4f 4e 45 20 3a 20 72 63 3b  QLITE_DONE : rc;
1c640 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1c650 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1c660 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  d when the user 
1c670 65 78 65 63 75 74 65 73 20 74 68 65 20 66 6f 6c  executes the fol
1c680 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  lowing statement
1c690 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 4e 53 45  :.**.**     INSE
1c6a0 52 54 20 49 4e 54 4f 20 3c 74 62 6c 3e 28 3c 74  RT INTO <tbl>(<t
1c6b0 62 6c 3e 29 20 56 41 4c 55 45 53 28 27 72 65 62  bl>) VALUES('reb
1c6c0 75 69 6c 64 27 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  uild');.**.** Th
1c6d0 65 20 65 6e 74 69 72 65 20 46 54 53 20 69 6e 64  e entire FTS ind
1c6e0 65 78 20 69 73 20 64 69 73 63 61 72 64 65 64 20  ex is discarded 
1c6f0 61 6e 64 20 72 65 62 75 69 6c 74 2e 20 49 66 20  and rebuilt. If 
1c700 74 68 65 20 74 61 62 6c 65 20 69 73 20 6f 6e 65  the table is one
1c710 20 0a 2a 2a 20 63 72 65 61 74 65 64 20 75 73 69   .** created usi
1c720 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 3d 78  ng the content=x
1c730 78 78 20 6f 70 74 69 6f 6e 2c 20 74 68 65 6e 20  xx option, then 
1c740 74 68 65 20 6e 65 77 20 69 6e 64 65 78 20 69 73  the new index is
1c750 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
1c760 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
1c770 73 20 6f 66 20 74 68 65 20 78 78 78 20 74 61 62  s of the xxx tab
1c780 6c 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  le. Otherwise, i
1c790 74 20 69 73 20 72 65 62 75 69 6c 74 20 62 61 73  t is rebuilt bas
1c7a0 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f 6e  ed.** on the con
1c7b0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 63  tents of the %_c
1c7c0 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e 0a 2a 2f  ontent table..*/
1c7d0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
1c7e0 44 6f 52 65 62 75 69 6c 64 28 46 74 73 33 54 61  DoRebuild(Fts3Ta
1c7f0 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ble *p){.  int r
1c800 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1c810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1c820 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20 20  turn Code */..  
1c830 72 63 20 3d 20 66 74 73 33 44 65 6c 65 74 65 41  rc = fts3DeleteA
1c840 6c 6c 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20  ll(p, 0);.  if( 
1c850 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c860 0a 20 20 20 20 75 33 32 20 2a 61 53 7a 20 3d 20  .    u32 *aSz = 
1c870 30 3b 0a 20 20 20 20 75 33 32 20 2a 61 53 7a 49  0;.    u32 *aSzI
1c880 6e 73 20 3d 20 30 3b 0a 20 20 20 20 75 33 32 20  ns = 0;.    u32 
1c890 2a 61 53 7a 44 65 6c 20 3d 20 30 3b 0a 20 20 20  *aSzDel = 0;.   
1c8a0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1c8b0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Stmt = 0;.    in
1c8c0 74 20 6e 45 6e 74 72 79 20 3d 20 30 3b 0a 0a 20  t nEntry = 0;.. 
1c8d0 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 65 20 61 6e     /* Compose an
1c8e0 64 20 70 72 65 70 61 72 65 20 61 6e 20 53 51 4c  d prepare an SQL
1c8f0 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 6c 6f   statement to lo
1c900 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 63  op through the c
1c910 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  ontent table */.
1c920 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d      char *zSql =
1c930 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1c940 28 22 53 45 4c 45 43 54 20 25 73 22 20 2c 20 70  ("SELECT %s" , p
1c950 2d 3e 7a 52 65 61 64 45 78 70 72 6c 69 73 74 29  ->zReadExprlist)
1c960 3b 0a 20 20 20 20 69 66 28 20 21 7a 53 71 6c 20  ;.    if( !zSql 
1c970 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1c980 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1c990 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1c9a0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
1c9b0 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
1c9c0 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
1c9d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1c9e0 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
1c9f0 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
1ca00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ca10 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69    int nByte = si
1ca20 7a 65 6f 66 28 75 33 32 29 20 2a 20 28 70 2d 3e  zeof(u32) * (p->
1ca30 6e 43 6f 6c 75 6d 6e 2b 31 29 2a 33 3b 0a 20 20  nColumn+1)*3;.  
1ca40 20 20 20 20 61 53 7a 20 3d 20 28 75 33 32 20 2a      aSz = (u32 *
1ca50 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
1ca60 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66  nByte);.      if
1ca70 28 20 61 53 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  ( aSz==0 ){.    
1ca80 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1ca90 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c  NOMEM;.      }el
1caa0 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  se{.        mems
1cab0 65 74 28 61 53 7a 2c 20 30 2c 20 6e 42 79 74 65  et(aSz, 0, nByte
1cac0 29 3b 0a 20 20 20 20 20 20 20 20 61 53 7a 49 6e  );.        aSzIn
1cad0 73 20 3d 20 26 61 53 7a 5b 70 2d 3e 6e 43 6f 6c  s = &aSz[p->nCol
1cae0 75 6d 6e 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20  umn+1];.        
1caf0 61 53 7a 44 65 6c 20 3d 20 26 61 53 7a 49 6e 73  aSzDel = &aSzIns
1cb00 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 5d 3b 0a  [p->nColumn+1];.
1cb10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1cb20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
1cb30 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
1cb40 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
1cb50 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
1cb60 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20      int iCol;.  
1cb70 20 20 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 20      int iLangid 
1cb80 3d 20 6c 61 6e 67 69 64 46 72 6f 6d 53 65 6c 65  = langidFromSele
1cb90 63 74 28 70 2c 20 70 53 74 6d 74 29 3b 0a 20 20  ct(p, pStmt);.  
1cba0 20 20 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e      rc = fts3Pen
1cbb0 64 69 6e 67 54 65 72 6d 73 44 6f 63 69 64 28 70  dingTermsDocid(p
1cbc0 2c 20 30 2c 20 69 4c 61 6e 67 69 64 2c 20 73 71  , 0, iLangid, sq
1cbd0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
1cbe0 36 34 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20  64(pStmt, 0));. 
1cbf0 20 20 20 20 20 6d 65 6d 73 65 74 28 61 53 7a 2c       memset(aSz,
1cc00 20 30 2c 20 73 69 7a 65 6f 66 28 61 53 7a 5b 30   0, sizeof(aSz[0
1cc10 5d 29 20 2a 20 28 70 2d 3e 6e 43 6f 6c 75 6d 6e  ]) * (p->nColumn
1cc20 2b 31 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  +1));.      for(
1cc30 69 43 6f 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  iCol=0; rc==SQLI
1cc40 54 45 5f 4f 4b 20 26 26 20 69 43 6f 6c 3c 70 2d  TE_OK && iCol<p-
1cc50 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 43 6f 6c 2b 2b  >nColumn; iCol++
1cc60 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1cc70 2d 3e 61 62 4e 6f 74 69 6e 64 65 78 65 64 5b 69  ->abNotindexed[i
1cc80 43 6f 6c 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Col]==0 ){.     
1cc90 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1cca0 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  *z = (const char
1ccb0 20 2a 29 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   *) sqlite3_colu
1ccc0 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  mn_text(pStmt, i
1ccd0 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  Col+1);.        
1cce0 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69    rc = fts3Pendi
1ccf0 6e 67 54 65 72 6d 73 41 64 64 28 70 2c 20 69 4c  ngTermsAdd(p, iL
1cd00 61 6e 67 69 64 2c 20 7a 2c 20 69 43 6f 6c 2c 20  angid, z, iCol, 
1cd10 26 61 53 7a 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20  &aSz[iCol]);.   
1cd20 20 20 20 20 20 20 20 61 53 7a 5b 70 2d 3e 6e 43         aSz[p->nC
1cd30 6f 6c 75 6d 6e 5d 20 2b 3d 20 73 71 6c 69 74 65  olumn] += sqlite
1cd40 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
1cd50 53 74 6d 74 2c 20 69 43 6f 6c 2b 31 29 3b 0a 20  Stmt, iCol+1);. 
1cd60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1cd70 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 48  .      if( p->bH
1cd80 61 73 44 6f 63 73 69 7a 65 20 29 7b 0a 20 20 20  asDocsize ){.   
1cd90 20 20 20 20 20 66 74 73 33 49 6e 73 65 72 74 44       fts3InsertD
1cda0 6f 63 73 69 7a 65 28 26 72 63 2c 20 70 2c 20 61  ocsize(&rc, p, a
1cdb0 53 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Sz);.      }.   
1cdc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1cdd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1cde0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
1cdf0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  (pStmt);.       
1ce00 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20   pStmt = 0;.    
1ce10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ce20 20 6e 45 6e 74 72 79 2b 2b 3b 0a 20 20 20 20 20   nEntry++;.     
1ce30 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
1ce40 43 6f 6c 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b  Col<=p->nColumn;
1ce50 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
1ce60 20 20 20 20 61 53 7a 49 6e 73 5b 69 43 6f 6c 5d      aSzIns[iCol]
1ce70 20 2b 3d 20 61 53 7a 5b 69 43 6f 6c 5d 3b 0a 20   += aSz[iCol];. 
1ce80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1ce90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1cea0 2d 3e 62 46 74 73 34 20 29 7b 0a 20 20 20 20 20  ->bFts4 ){.     
1ceb0 20 66 74 73 33 55 70 64 61 74 65 44 6f 63 54 6f   fts3UpdateDocTo
1cec0 74 61 6c 73 28 26 72 63 2c 20 70 2c 20 61 53 7a  tals(&rc, p, aSz
1ced0 49 6e 73 2c 20 61 53 7a 44 65 6c 2c 20 6e 45 6e  Ins, aSzDel, nEn
1cee0 74 72 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  try);.    }.    
1cef0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 53 7a  sqlite3_free(aSz
1cf00 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 74 6d  );..    if( pStm
1cf10 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  t ){.      int r
1cf20 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  c2 = sqlite3_fin
1cf30 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
1cf40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1cf50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1cf60 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
1cf70 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1cf80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1cf90 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1cfa0 6f 6e 20 6f 70 65 6e 73 20 61 20 63 75 72 73 6f  on opens a curso
1cfb0 72 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 74  r used to read t
1cfc0 68 65 20 69 6e 70 75 74 20 64 61 74 61 20 66 6f  he input data fo
1cfd0 72 20 61 6e 20 0a 2a 2a 20 69 6e 63 72 65 6d 65  r an .** increme
1cfe0 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65 72 61  ntal merge opera
1cff0 74 69 6f 6e 2e 20 53 70 65 63 69 66 69 63 61 6c  tion. Specifical
1d000 6c 79 2c 20 69 74 20 6f 70 65 6e 73 20 61 20 63  ly, it opens a c
1d010 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 0a 2a 2a  ursor to scan.**
1d020 20 74 68 65 20 6f 6c 64 65 73 74 20 6e 53 65 67   the oldest nSeg
1d030 20 73 65 67 6d 65 6e 74 73 20 28 69 64 78 3d 30   segments (idx=0
1d040 20 74 68 72 6f 75 67 68 20 69 64 78 3d 28 6e 53   through idx=(nS
1d050 65 67 2d 31 29 29 20 69 6e 20 61 62 73 6f 6c 75  eg-1)) in absolu
1d060 74 65 20 0a 2a 2a 20 6c 65 76 65 6c 20 69 41 62  te .** level iAb
1d070 73 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69  sLevel..*/.stati
1d080 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72 6d 65  c int fts3Incrme
1d090 72 67 65 43 73 72 28 0a 20 20 46 74 73 33 54 61  rgeCsr(.  Fts3Ta
1d0a0 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
1d0b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
1d0c0 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  3 table handle *
1d0d0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
1d0e0 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20  4 iAbsLevel,    
1d0f0 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20      /* Absolute 
1d100 6c 65 76 65 6c 20 74 6f 20 6f 70 65 6e 20 2a 2f  level to open */
1d110 0a 20 20 69 6e 74 20 6e 53 65 67 2c 20 20 20 20  .  int nSeg,    
1d120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d130 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1d140 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72 67  segments to merg
1d150 65 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69  e */.  Fts3Multi
1d160 53 65 67 52 65 61 64 65 72 20 2a 70 43 73 72 20  SegReader *pCsr 
1d170 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
1d180 20 6f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c   object to popul
1d190 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ate */.){.  int 
1d1a0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1d1b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1d1c0 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
1d1d0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1d1e0 74 6d 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tmt = 0;        
1d1f0 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 73 65  /* Statement use
1d200 64 20 74 6f 20 72 65 61 64 20 25 5f 73 65 67 64  d to read %_segd
1d210 69 72 20 65 6e 74 72 79 20 2a 2f 20 20 0a 20 20  ir entry */  .  
1d220 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
1d230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d240 2f 2a 20 42 79 74 65 73 20 61 6c 6c 6f 63 61 74  /* Bytes allocat
1d250 65 64 20 61 74 20 70 43 73 72 2d 3e 61 70 53 65  ed at pCsr->apSe
1d260 67 6d 65 6e 74 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a  gment[] */..  /*
1d270 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
1d280 66 6f 72 20 74 68 65 20 46 74 73 33 4d 75 6c 74  for the Fts3Mult
1d290 69 53 65 67 52 65 61 64 65 72 2e 61 43 73 72 5b  iSegReader.aCsr[
1d2a0 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 6d 65 6d  ] array */.  mem
1d2b0 73 65 74 28 70 43 73 72 2c 20 30 2c 20 73 69 7a  set(pCsr, 0, siz
1d2c0 65 6f 66 28 2a 70 43 73 72 29 29 3b 0a 20 20 6e  eof(*pCsr));.  n
1d2d0 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74  Byte = sizeof(Ft
1d2e0 73 33 53 65 67 52 65 61 64 65 72 20 2a 29 20 2a  s3SegReader *) *
1d2f0 20 6e 53 65 67 3b 0a 20 20 70 43 73 72 2d 3e 61   nSeg;.  pCsr->a
1d300 70 53 65 67 6d 65 6e 74 20 3d 20 28 46 74 73 33  pSegment = (Fts3
1d310 53 65 67 52 65 61 64 65 72 20 2a 2a 29 73 71 6c  SegReader **)sql
1d320 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74  ite3_malloc(nByt
1d330 65 29 3b 0a 0a 20 20 69 66 28 20 70 43 73 72 2d  e);..  if( pCsr-
1d340 3e 61 70 53 65 67 6d 65 6e 74 3d 3d 30 20 29 7b  >apSegment==0 ){
1d350 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1d360 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
1d370 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 43 73 72  .    memset(pCsr
1d380 2d 3e 61 70 53 65 67 6d 65 6e 74 2c 20 30 2c 20  ->apSegment, 0, 
1d390 6e 42 79 74 65 29 3b 0a 20 20 20 20 72 63 20 3d  nByte);.    rc =
1d3a0 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
1d3b0 53 51 4c 5f 53 45 4c 45 43 54 5f 4c 45 56 45 4c  SQL_SELECT_LEVEL
1d3c0 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
1d3d0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1d3e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
1d3f0 20 69 3b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   i;.    int rc2;
1d400 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
1d410 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31  d_int64(pStmt, 1
1d420 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20  , iAbsLevel);.  
1d430 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
1d440 6e 53 65 67 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20  nSegment==0 );. 
1d450 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
1d460 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c  SQLITE_OK && sql
1d470 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
1d480 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 26 26 20  ==SQLITE_ROW && 
1d490 69 3c 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nSeg; i++){.  
1d4a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d4b0 46 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 77  Fts3SegReaderNew
1d4c0 28 69 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  (i, 0,.         
1d4d0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1d4e0 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 29 2c  int64(pStmt, 1),
1d4f0 20 20 20 20 20 20 20 20 2f 2a 20 73 65 67 64 69          /* segdi
1d500 72 2e 73 74 61 72 74 5f 62 6c 6f 63 6b 20 2a 2f  r.start_block */
1d510 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1d520 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
1d530 70 53 74 6d 74 2c 20 32 29 2c 20 20 20 20 20 20  pStmt, 2),      
1d540 20 20 2f 2a 20 73 65 67 64 69 72 2e 6c 65 61 76    /* segdir.leav
1d550 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a  es_end_block */.
1d560 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1d570 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
1d580 53 74 6d 74 2c 20 33 29 2c 20 20 20 20 20 20 20  Stmt, 3),       
1d590 20 2f 2a 20 73 65 67 64 69 72 2e 65 6e 64 5f 62   /* segdir.end_b
1d5a0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
1d5b0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
1d5c0 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 34 29 2c  _blob(pStmt, 4),
1d5d0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 67 64           /* segd
1d5e0 69 72 2e 72 6f 6f 74 20 2a 2f 0a 20 20 20 20 20  ir.root */.     
1d5f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
1d600 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
1d610 20 34 29 2c 20 20 20 20 20 20 20 20 2f 2a 20 73   4),        /* s
1d620 65 67 64 69 72 2e 72 6f 6f 74 20 2a 2f 0a 20 20  egdir.root */.  
1d630 20 20 20 20 20 20 20 20 26 70 43 73 72 2d 3e 61          &pCsr->a
1d640 70 53 65 67 6d 65 6e 74 5b 69 5d 0a 20 20 20 20  pSegment[i].    
1d650 20 20 29 3b 0a 20 20 20 20 20 20 70 43 73 72 2d    );.      pCsr-
1d660 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 20 20 20  >nSegment++;.   
1d670 20 7d 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c   }.    rc2 = sql
1d680 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
1d690 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1d6a0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
1d6b0 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  rc2;.  }..  retu
1d6c0 72 6e 20 72 63 3b 0a 7d 0a 0a 74 79 70 65 64 65  rn rc;.}..typede
1d6d0 66 20 73 74 72 75 63 74 20 49 6e 63 72 6d 65 72  f struct Incrmer
1d6e0 67 65 57 72 69 74 65 72 20 49 6e 63 72 6d 65 72  geWriter Incrmer
1d6f0 67 65 57 72 69 74 65 72 3b 0a 74 79 70 65 64 65  geWriter;.typede
1d700 66 20 73 74 72 75 63 74 20 4e 6f 64 65 57 72 69  f struct NodeWri
1d710 74 65 72 20 4e 6f 64 65 57 72 69 74 65 72 3b 0a  ter NodeWriter;.
1d720 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 42  typedef struct B
1d730 6c 6f 62 20 42 6c 6f 62 3b 0a 74 79 70 65 64 65  lob Blob;.typede
1d740 66 20 73 74 72 75 63 74 20 4e 6f 64 65 52 65 61  f struct NodeRea
1d750 64 65 72 20 4e 6f 64 65 52 65 61 64 65 72 3b 0a  der NodeReader;.
1d760 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
1d770 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
1d780 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
1d790 20 75 73 65 64 20 61 73 20 61 20 64 79 6e 61 6d   used as a dynam
1d7a0 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 74 6f 20  ic buffer.** to 
1d7b0 62 75 69 6c 64 20 75 70 20 6e 6f 64 65 73 20 6f  build up nodes o
1d7c0 72 20 6f 74 68 65 72 20 62 6c 6f 62 73 20 6f 66  r other blobs of
1d7d0 20 64 61 74 61 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20   data in..**.** 
1d7e0 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 62 6c 6f  The function blo
1d7f0 62 47 72 6f 77 42 75 66 66 65 72 28 29 20 69 73  bGrowBuffer() is
1d800 20 75 73 65 64 20 74 6f 20 65 78 74 65 6e 64 20   used to extend 
1d810 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a  the allocation..
1d820 2a 2f 0a 73 74 72 75 63 74 20 42 6c 6f 62 20 7b  */.struct Blob {
1d830 0a 20 20 63 68 61 72 20 2a 61 3b 20 20 20 20 20  .  char *a;     
1d840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d850 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
1d860 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   allocation */. 
1d870 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
1d880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d890 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
1d8a0 6c 69 64 20 62 79 74 65 73 20 6f 66 20 64 61 74  lid bytes of dat
1d8b0 61 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 69 6e  a in a[] */.  in
1d8c0 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20  t nAlloc;       
1d8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d8e0 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   Allocated size 
1d8f0 6f 66 20 61 5b 5d 20 28 6e 41 6c 6c 6f 63 3e 3d  of a[] (nAlloc>=
1d900 6e 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  n) */.};../*.** 
1d910 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  This structure i
1d920 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
1d930 75 70 20 62 75 66 66 65 72 73 20 63 6f 6e 74 61  up buffers conta
1d940 69 6e 69 6e 67 20 73 65 67 6d 65 6e 74 20 62 2d  ining segment b-
1d950 74 72 65 65 20 0a 2a 2a 20 6e 6f 64 65 73 20 28  tree .** nodes (
1d960 62 6c 6f 63 6b 73 29 2e 0a 2a 2f 0a 73 74 72 75  blocks)..*/.stru
1d970 63 74 20 4e 6f 64 65 57 72 69 74 65 72 20 7b 0a  ct NodeWriter {.
1d980 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1d990 69 42 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20  iBlock;         
1d9a0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 6c 6f    /* Current blo
1d9b0 63 6b 20 69 64 20 2a 2f 0a 20 20 42 6c 6f 62 20  ck id */.  Blob 
1d9c0 6b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  key;            
1d9d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
1d9e0 73 74 20 6b 65 79 20 77 72 69 74 74 65 6e 20 74  st key written t
1d9f0 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 6c  o the current bl
1da00 6f 63 6b 20 2a 2f 0a 20 20 42 6c 6f 62 20 62 6c  ock */.  Blob bl
1da10 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
1da20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
1da30 65 6e 74 20 62 6c 6f 63 6b 20 69 6d 61 67 65 20  ent block image 
1da40 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
1da50 6f 62 6a 65 63 74 20 6f 66 20 74 68 69 73 20 74  object of this t
1da60 79 70 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ype contains the
1da70 20 73 74 61 74 65 20 72 65 71 75 69 72 65 64 20   state required 
1da80 74 6f 20 63 72 65 61 74 65 20 6f 72 20 61 70 70  to create or app
1da90 65 6e 64 0a 2a 2a 20 74 6f 20 61 6e 20 61 70 70  end.** to an app
1daa0 65 6e 64 61 62 6c 65 20 62 2d 74 72 65 65 20 73  endable b-tree s
1dab0 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 72 75 63  egment..*/.struc
1dac0 74 20 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65  t IncrmergeWrite
1dad0 72 20 7b 0a 20 20 69 6e 74 20 6e 4c 65 61 66 45  r {.  int nLeafE
1dae0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1daf0 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61        /* Space a
1db00 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 6c 65 61  llocated for lea
1db10 66 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 69 6e  f blocks */.  in
1db20 74 20 6e 57 6f 72 6b 3b 20 20 20 20 20 20 20 20  t nWork;        
1db30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1db40 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   Number of leaf 
1db50 70 61 67 65 73 20 66 6c 75 73 68 65 64 20 2a 2f  pages flushed */
1db60 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1db70 20 69 41 62 73 4c 65 76 65 6c 3b 20 20 20 20 20   iAbsLevel;     
1db80 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c     /* Absolute l
1db90 65 76 65 6c 20 6f 66 20 69 6e 70 75 74 20 73 65  evel of input se
1dba0 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  gments */.  int 
1dbb0 69 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  iIdx;           
1dbc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1dbd0 6e 64 65 78 20 6f 66 20 2a 6f 75 74 70 75 74 2a  ndex of *output*
1dbe0 20 73 65 67 6d 65 6e 74 20 69 6e 20 69 41 62 73   segment in iAbs
1dbf0 4c 65 76 65 6c 2b 31 20 2a 2f 0a 20 20 73 71 6c  Level+1 */.  sql
1dc00 69 74 65 33 5f 69 6e 74 36 34 20 69 53 74 61 72  ite3_int64 iStar
1dc10 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
1dc20 42 6c 6f 63 6b 20 6e 75 6d 62 65 72 20 6f 66 20  Block number of 
1dc30 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20  first allocated 
1dc40 62 6c 6f 63 6b 20 2a 2f 0a 20 20 73 71 6c 69 74  block */.  sqlit
1dc50 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 3b 20 20  e3_int64 iEnd;  
1dc60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c             /* Bl
1dc70 6f 63 6b 20 6e 75 6d 62 65 72 20 6f 66 20 6c 61  ock number of la
1dc80 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 62 6c 6f  st allocated blo
1dc90 63 6b 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ck */.  sqlite3_
1dca0 69 6e 74 36 34 20 6e 4c 65 61 66 44 61 74 61 3b  int64 nLeafData;
1dcb0 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
1dcc0 20 6f 66 20 6c 65 61 66 20 70 61 67 65 20 64 61   of leaf page da
1dcd0 74 61 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 75  ta so far */.  u
1dce0 38 20 62 4e 6f 4c 65 61 66 44 61 74 61 3b 20 20  8 bNoLeafData;  
1dcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dd00 2a 20 49 66 20 74 72 75 65 2c 20 73 74 6f 72 65  * If true, store
1dd10 20 30 20 66 6f 72 20 73 65 67 6d 65 6e 74 20 73   0 for segment s
1dd20 69 7a 65 20 2a 2f 0a 20 20 4e 6f 64 65 57 72 69  ize */.  NodeWri
1dd30 74 65 72 20 61 4e 6f 64 65 57 72 69 74 65 72 5b  ter aNodeWriter[
1dd40 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42  FTS_MAX_APPENDAB
1dd50 4c 45 5f 48 45 49 47 48 54 5d 3b 0a 7d 3b 0a 0a  LE_HEIGHT];.};..
1dd60 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20  /*.** An object 
1dd70 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1dd80 20 74 79 70 65 20 69 73 20 75 73 65 64 20 74 6f   type is used to
1dd90 20 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20   read data from 
1dda0 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 46 54 53 20  a single.** FTS 
1ddb0 73 65 67 6d 65 6e 74 20 6e 6f 64 65 2e 20 53 65  segment node. Se
1ddc0 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  e the following 
1ddd0 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  functions:.**.**
1dde0 20 20 20 20 20 6e 6f 64 65 52 65 61 64 65 72 49       nodeReaderI
1ddf0 6e 69 74 28 29 0a 2a 2a 20 20 20 20 20 6e 6f 64  nit().**     nod
1de00 65 52 65 61 64 65 72 4e 65 78 74 28 29 0a 2a 2a  eReaderNext().**
1de10 20 20 20 20 20 6e 6f 64 65 52 65 61 64 65 72 52       nodeReaderR
1de20 65 6c 65 61 73 65 28 29 0a 2a 2f 0a 73 74 72 75  elease().*/.stru
1de30 63 74 20 4e 6f 64 65 52 65 61 64 65 72 20 7b 0a  ct NodeReader {.
1de40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 4e    const char *aN
1de50 6f 64 65 3b 0a 20 20 69 6e 74 20 6e 4e 6f 64 65  ode;.  int nNode
1de60 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20  ;.  int iOff;   
1de70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de80 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
1de90 66 66 73 65 74 20 77 69 74 68 69 6e 20 61 4e 6f  ffset within aNo
1dea0 64 65 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75  de[] */..  /* Ou
1deb0 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 2e 20  tput variables. 
1dec0 43 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  Containing the c
1ded0 75 72 72 65 6e 74 20 6e 6f 64 65 20 65 6e 74 72  urrent node entr
1dee0 79 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  y. */.  sqlite3_
1def0 69 6e 74 36 34 20 69 43 68 69 6c 64 3b 20 20 20  int64 iChild;   
1df00 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1df10 65 72 20 74 6f 20 63 68 69 6c 64 20 6e 6f 64 65  er to child node
1df20 20 2a 2f 0a 20 20 42 6c 6f 62 20 74 65 72 6d 3b   */.  Blob term;
1df30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df40 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
1df50 20 74 65 72 6d 20 2a 2f 0a 20 20 63 6f 6e 73 74   term */.  const
1df60 20 63 68 61 72 20 2a 61 44 6f 63 6c 69 73 74 3b   char *aDoclist;
1df70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1df80 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74  inter to doclist
1df90 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f 63 6c 69   */.  int nDocli
1dfa0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1dfb0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1dfc0 20 64 6f 63 6c 69 73 74 20 69 6e 20 62 79 74 65   doclist in byte
1dfd0 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49  s */.};../*.** I
1dfe0 66 20 2a 70 52 63 20 69 73 20 6e 6f 74 20 53 51  f *pRc is not SQ
1dff0 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69  LITE_OK when thi
1e000 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1e010 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
1e020 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  -op..** Otherwis
1e030 65 2c 20 69 66 20 74 68 65 20 61 6c 6c 6f 63 61  e, if the alloca
1e040 74 69 6f 6e 20 61 74 20 70 42 6c 6f 62 2d 3e 61  tion at pBlob->a
1e050 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1e060 61 74 20 6c 65 61 73 74 20 6e 4d 69 6e 0a 2a 2a  at least nMin.**
1e070 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
1e080 65 78 74 65 6e 64 20 28 72 65 61 6c 6c 6f 63 29  extend (realloc)
1e090 20 69 74 20 74 6f 20 62 65 20 73 6f 2e 0a 2a 2a   it to be so..**
1e0a0 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  .** If an OOM er
1e0b0 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
1e0c0 2a 70 52 63 20 74 6f 20 53 51 4c 49 54 45 5f 4e  *pRc to SQLITE_N
1e0d0 4f 4d 45 4d 20 61 6e 64 20 6c 65 61 76 65 20 70  OMEM and leave p
1e0e0 42 6c 6f 62 2d 3e 61 0a 2a 2a 20 75 6e 6d 6f 64  Blob->a.** unmod
1e0f0 69 66 69 65 64 2e 20 4f 74 68 65 72 77 69 73 65  ified. Otherwise
1e100 2c 20 69 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  , if the allocat
1e110 69 6f 6e 20 73 75 63 63 65 65 64 73 2c 20 75 70  ion succeeds, up
1e120 64 61 74 65 20 70 42 6c 6f 62 2d 3e 6e 41 6c 6c  date pBlob->nAll
1e130 6f 63 0a 2a 2a 20 74 6f 20 72 65 66 6c 65 63 74  oc.** to reflect
1e140 20 74 68 65 20 6e 65 77 20 73 69 7a 65 20 6f 66   the new size of
1e150 20 74 68 65 20 70 42 6c 6f 62 2d 3e 61 5b 5d 20   the pBlob->a[] 
1e160 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  buffer..*/.stati
1e170 63 20 76 6f 69 64 20 62 6c 6f 62 47 72 6f 77 42  c void blobGrowB
1e180 75 66 66 65 72 28 42 6c 6f 62 20 2a 70 42 6c 6f  uffer(Blob *pBlo
1e190 62 2c 20 69 6e 74 20 6e 4d 69 6e 2c 20 69 6e 74  b, int nMin, int
1e1a0 20 2a 70 52 63 29 7b 0a 20 20 69 66 28 20 2a 70   *pRc){.  if( *p
1e1b0 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  Rc==SQLITE_OK &&
1e1c0 20 6e 4d 69 6e 3e 70 42 6c 6f 62 2d 3e 6e 41 6c   nMin>pBlob->nAl
1e1d0 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  loc ){.    int n
1e1e0 41 6c 6c 6f 63 20 3d 20 6e 4d 69 6e 3b 0a 20 20  Alloc = nMin;.  
1e1f0 20 20 63 68 61 72 20 2a 61 20 3d 20 28 63 68 61    char *a = (cha
1e200 72 20 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  r *)sqlite3_real
1e210 6c 6f 63 28 70 42 6c 6f 62 2d 3e 61 2c 20 6e 41  loc(pBlob->a, nA
1e220 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 61  lloc);.    if( a
1e230 20 29 7b 0a 20 20 20 20 20 20 70 42 6c 6f 62 2d   ){.      pBlob-
1e240 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63  >nAlloc = nAlloc
1e250 3b 0a 20 20 20 20 20 20 70 42 6c 6f 62 2d 3e 61  ;.      pBlob->a
1e260 20 3d 20 61 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = a;.    }else{
1e270 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51  .      *pRc = SQ
1e280 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1e290 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
1e2a0 74 74 65 6d 70 74 20 74 6f 20 61 64 76 61 6e 63  ttempt to advanc
1e2b0 65 20 74 68 65 20 6e 6f 64 65 2d 72 65 61 64 65  e the node-reade
1e2c0 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
1e2d0 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
1e2e0 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  ument to.** the 
1e2f0 6e 65 78 74 20 65 6e 74 72 79 20 6f 6e 20 74 68  next entry on th
1e300 65 20 6e 6f 64 65 2e 20 0a 2a 2a 0a 2a 2a 20 52  e node. .**.** R
1e310 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
1e320 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ode if an error 
1e330 6f 63 63 75 72 73 20 28 53 51 4c 49 54 45 5f 4e  occurs (SQLITE_N
1e340 4f 4d 45 4d 20 69 73 20 70 6f 73 73 69 62 6c 65  OMEM is possible
1e350 29 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  ). .** Otherwise
1e360 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1e370 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  K. If there is n
1e380 6f 20 6e 65 78 74 20 65 6e 74 72 79 20 6f 6e 20  o next entry on 
1e390 74 68 65 20 6e 6f 64 65 0a 2a 2a 20 28 65 2e 67  the node.** (e.g
1e3a0 2e 20 62 65 63 61 75 73 65 20 74 68 65 20 63 75  . because the cu
1e3b0 72 72 65 6e 74 20 65 6e 74 72 79 20 69 73 20 74  rrent entry is t
1e3c0 68 65 20 6c 61 73 74 29 20 73 65 74 20 4e 6f 64  he last) set Nod
1e3d0 65 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20 74  eReader->aNode t
1e3e0 6f 0a 2a 2a 20 4e 55 4c 4c 20 74 6f 20 69 6e 64  o.** NULL to ind
1e3f0 69 63 61 74 65 20 45 4f 46 2e 20 4f 74 68 65 72  icate EOF. Other
1e400 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 74  wise, populate t
1e410 68 65 20 4e 6f 64 65 52 65 61 64 65 72 20 73 74  he NodeReader st
1e420 72 75 63 74 75 72 65 20 6f 75 74 70 75 74 20 0a  ructure output .
1e430 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 66 6f 72  ** variables for
1e440 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 2e 0a   the new entry..
1e450 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  */.static int no
1e460 64 65 52 65 61 64 65 72 4e 65 78 74 28 4e 6f 64  deReaderNext(Nod
1e470 65 52 65 61 64 65 72 20 2a 70 29 7b 0a 20 20 69  eReader *p){.  i
1e480 6e 74 20 62 46 69 72 73 74 20 3d 20 28 70 2d 3e  nt bFirst = (p->
1e490 74 65 72 6d 2e 6e 3d 3d 30 29 3b 20 20 20 20 2f  term.n==0);    /
1e4a0 2a 20 54 72 75 65 20 66 6f 72 20 66 69 72 73 74  * True for first
1e4b0 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 6e 6f 64   term on the nod
1e4c0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66  e */.  int nPref
1e4d0 69 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ix = 0;         
1e4e0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
1e4f0 74 6f 20 63 6f 70 79 20 66 72 6f 6d 20 70 72 65  to copy from pre
1e500 76 69 6f 75 73 20 74 65 72 6d 20 2a 2f 0a 20 20  vious term */.  
1e510 69 6e 74 20 6e 53 75 66 66 69 78 20 3d 20 30 3b  int nSuffix = 0;
1e520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e530 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 70 70 65  /* Bytes to appe
1e540 6e 64 20 74 6f 20 74 68 65 20 70 72 65 66 69 78  nd to the prefix
1e550 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
1e560 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
1e570 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1e580 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  code */..  asser
1e590 74 28 20 70 2d 3e 61 4e 6f 64 65 20 29 3b 0a 20  t( p->aNode );. 
1e5a0 20 69 66 28 20 70 2d 3e 69 43 68 69 6c 64 20 26   if( p->iChild &
1e5b0 26 20 62 46 69 72 73 74 3d 3d 30 20 29 20 70 2d  & bFirst==0 ) p-
1e5c0 3e 69 43 68 69 6c 64 2b 2b 3b 0a 20 20 69 66 28  >iChild++;.  if(
1e5d0 20 70 2d 3e 69 4f 66 66 3e 3d 70 2d 3e 6e 4e 6f   p->iOff>=p->nNo
1e5e0 64 65 20 29 7b 0a 20 20 20 20 2f 2a 20 45 4f 46  de ){.    /* EOF
1e5f0 20 2a 2f 0a 20 20 20 20 70 2d 3e 61 4e 6f 64 65   */.    p->aNode
1e600 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1e610 20 20 20 69 66 28 20 62 46 69 72 73 74 3d 3d 30     if( bFirst==0
1e620 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66   ){.      p->iOf
1e630 66 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72 69  f += fts3GetVari
1e640 6e 74 33 32 28 26 70 2d 3e 61 4e 6f 64 65 5b 70  nt32(&p->aNode[p
1e650 2d 3e 69 4f 66 66 5d 2c 20 26 6e 50 72 65 66 69  ->iOff], &nPrefi
1e660 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  x);.    }.    p-
1e670 3e 69 4f 66 66 20 2b 3d 20 66 74 73 33 47 65 74  >iOff += fts3Get
1e680 56 61 72 69 6e 74 33 32 28 26 70 2d 3e 61 4e 6f  Varint32(&p->aNo
1e690 64 65 5b 70 2d 3e 69 4f 66 66 5d 2c 20 26 6e 53  de[p->iOff], &nS
1e6a0 75 66 66 69 78 29 3b 0a 0a 20 20 20 20 62 6c 6f  uffix);..    blo
1e6b0 62 47 72 6f 77 42 75 66 66 65 72 28 26 70 2d 3e  bGrowBuffer(&p->
1e6c0 74 65 72 6d 2c 20 6e 50 72 65 66 69 78 2b 6e 53  term, nPrefix+nS
1e6d0 75 66 66 69 78 2c 20 26 72 63 29 3b 0a 20 20 20  uffix, &rc);.   
1e6e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e6f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  OK ){.      memc
1e700 70 79 28 26 70 2d 3e 74 65 72 6d 2e 61 5b 6e 50  py(&p->term.a[nP
1e710 72 65 66 69 78 5d 2c 20 26 70 2d 3e 61 4e 6f 64  refix], &p->aNod
1e720 65 5b 70 2d 3e 69 4f 66 66 5d 2c 20 6e 53 75 66  e[p->iOff], nSuf
1e730 66 69 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 74  fix);.      p->t
1e740 65 72 6d 2e 6e 20 3d 20 6e 50 72 65 66 69 78 2b  erm.n = nPrefix+
1e750 6e 53 75 66 66 69 78 3b 0a 20 20 20 20 20 20 70  nSuffix;.      p
1e760 2d 3e 69 4f 66 66 20 2b 3d 20 6e 53 75 66 66 69  ->iOff += nSuffi
1e770 78 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  x;.      if( p->
1e780 69 43 68 69 6c 64 3d 3d 30 20 29 7b 0a 20 20 20  iChild==0 ){.   
1e790 20 20 20 20 20 70 2d 3e 69 4f 66 66 20 2b 3d 20       p->iOff += 
1e7a0 66 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28  fts3GetVarint32(
1e7b0 26 70 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f 66  &p->aNode[p->iOf
1e7c0 66 5d 2c 20 26 70 2d 3e 6e 44 6f 63 6c 69 73 74  f], &p->nDoclist
1e7d0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 44  );.        p->aD
1e7e0 6f 63 6c 69 73 74 20 3d 20 26 70 2d 3e 61 4e 6f  oclist = &p->aNo
1e7f0 64 65 5b 70 2d 3e 69 4f 66 66 5d 3b 0a 20 20 20  de[p->iOff];.   
1e800 20 20 20 20 20 70 2d 3e 69 4f 66 66 20 2b 3d 20       p->iOff += 
1e810 70 2d 3e 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 20  p->nDoclist;.   
1e820 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1e830 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 4f 66    assert( p->iOf
1e840 66 3c 3d 70 2d 3e 6e 4e 6f 64 65 20 29 3b 0a 0a  f<=p->nNode );..
1e850 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e860 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
1e870 6c 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72  l dynamic resour
1e880 63 65 73 20 68 65 6c 64 20 62 79 20 6e 6f 64 65  ces held by node
1e890 2d 72 65 61 64 65 72 20 6f 62 6a 65 63 74 20 2a  -reader object *
1e8a0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
1e8b0 64 20 6e 6f 64 65 52 65 61 64 65 72 52 65 6c 65  d nodeReaderRele
1e8c0 61 73 65 28 4e 6f 64 65 52 65 61 64 65 72 20 2a  ase(NodeReader *
1e8d0 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  p){.  sqlite3_fr
1e8e0 65 65 28 70 2d 3e 74 65 72 6d 2e 61 29 3b 0a 7d  ee(p->term.a);.}
1e8f0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
1e900 7a 65 20 61 20 6e 6f 64 65 2d 72 65 61 64 65 72  ze a node-reader
1e910 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 61 64 20   object to read 
1e920 74 68 65 20 6e 6f 64 65 20 69 6e 20 62 75 66 66  the node in buff
1e930 65 72 20 61 4e 6f 64 65 2f 6e 4e 6f 64 65 2e 0a  er aNode/nNode..
1e940 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
1e950 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
1e960 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
1e970 68 65 20 4e 6f 64 65 52 65 61 64 65 72 20 6f 62  he NodeReader ob
1e980 6a 65 63 74 20 73 65 74 20 74 6f 20 0a 2a 2a 20  ject set to .** 
1e990 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72  point to the fir
1e9a0 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20  st entry on the 
1e9b0 6e 6f 64 65 20 28 69 66 20 61 6e 79 29 2e 20 4f  node (if any). O
1e9c0 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c  therwise, an SQL
1e9d0 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  ite.** error cod
1e9e0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
1e9f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 64  /.static int nod
1ea00 65 52 65 61 64 65 72 49 6e 69 74 28 4e 6f 64 65  eReaderInit(Node
1ea10 52 65 61 64 65 72 20 2a 70 2c 20 63 6f 6e 73 74  Reader *p, const
1ea20 20 63 68 61 72 20 2a 61 4e 6f 64 65 2c 20 69 6e   char *aNode, in
1ea30 74 20 6e 4e 6f 64 65 29 7b 0a 20 20 6d 65 6d 73  t nNode){.  mems
1ea40 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
1ea50 4e 6f 64 65 52 65 61 64 65 72 29 29 3b 0a 20 20  NodeReader));.  
1ea60 70 2d 3e 61 4e 6f 64 65 20 3d 20 61 4e 6f 64 65  p->aNode = aNode
1ea70 3b 0a 20 20 70 2d 3e 6e 4e 6f 64 65 20 3d 20 6e  ;.  p->nNode = n
1ea80 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  Node;..  /* Figu
1ea90 72 65 20 6f 75 74 20 69 66 20 74 68 69 73 20 69  re out if this i
1eaa0 73 20 61 20 6c 65 61 66 20 6f 72 20 61 6e 20 69  s a leaf or an i
1eab0 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 20 2a 2f  nternal node. */
1eac0 0a 20 20 69 66 28 20 70 2d 3e 61 4e 6f 64 65 5b  .  if( p->aNode[
1ead0 30 5d 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20  0] ){.    /* An 
1eae0 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 20 2a  internal node. *
1eaf0 2f 0a 20 20 20 20 70 2d 3e 69 4f 66 66 20 3d 20  /.    p->iOff = 
1eb00 31 20 2b 20 73 71 6c 69 74 65 33 46 74 73 33 47  1 + sqlite3Fts3G
1eb10 65 74 56 61 72 69 6e 74 28 26 70 2d 3e 61 4e 6f  etVarint(&p->aNo
1eb20 64 65 5b 31 5d 2c 20 26 70 2d 3e 69 43 68 69 6c  de[1], &p->iChil
1eb30 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
1eb40 20 70 2d 3e 69 4f 66 66 20 3d 20 31 3b 0a 20 20   p->iOff = 1;.  
1eb50 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 6f 64 65  }..  return node
1eb60 52 65 61 64 65 72 4e 65 78 74 28 70 29 3b 0a 7d  ReaderNext(p);.}
1eb70 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1eb80 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1eb90 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 61 6e  while writing an
1eba0 20 46 54 53 20 73 65 67 6d 65 6e 74 20 65 61 63   FTS segment eac
1ebb0 68 20 74 69 6d 65 20 61 20 6c 65 61 66 20 6f 0a  h time a leaf o.
1ebc0 2a 2a 20 6e 6f 64 65 20 69 73 20 66 69 6e 69 73  ** node is finis
1ebd0 68 65 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20  hed and written 
1ebe0 74 6f 20 64 69 73 6b 2e 20 54 68 65 20 6b 65 79  to disk. The key
1ebf0 20 28 7a 54 65 72 6d 2f 6e 54 65 72 6d 29 20 69   (zTerm/nTerm) i
1ec00 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
1ec10 74 6f 20 62 65 20 67 72 65 61 74 65 72 20 74 68  to be greater th
1ec20 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  an the largest k
1ec30 65 79 20 6f 6e 20 74 68 65 20 6e 6f 64 65 20 6a  ey on the node j
1ec40 75 73 74 20 77 72 69 74 74 65 6e 2c 20 62 75 74  ust written, but
1ec50 20 73 6d 61 6c 6c 65 72 0a 2a 2a 20 74 68 61 6e   smaller.** than
1ec60 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
1ec70 20 66 69 72 73 74 20 6b 65 79 20 74 68 61 74 20   first key that 
1ec80 77 69 6c 6c 20 62 65 20 77 72 69 74 74 65 6e 20  will be written 
1ec90 74 6f 20 74 68 65 20 6e 65 78 74 20 6c 65 61 66  to the next leaf
1eca0 0a 2a 2a 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  .** node..**.** 
1ecb0 54 68 65 20 62 6c 6f 63 6b 20 69 64 20 6f 66 20  The block id of 
1ecc0 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 6a 75  the leaf node ju
1ecd0 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  st written to di
1ece0 73 6b 20 6d 61 79 20 62 65 20 66 6f 75 6e 64 20  sk may be found 
1ecf0 69 6e 0a 2a 2a 20 28 70 57 72 69 74 65 72 2d 3e  in.** (pWriter->
1ed00 61 4e 6f 64 65 57 72 69 74 65 72 5b 30 5d 2e 69  aNodeWriter[0].i
1ed10 42 6c 6f 63 6b 29 20 77 68 65 6e 20 74 68 69 73  Block) when this
1ed20 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1ed30 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  led..*/.static i
1ed40 6e 74 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65  nt fts3Incrmerge
1ed50 50 75 73 68 28 0a 20 20 46 74 73 33 54 61 62 6c  Push(.  Fts3Tabl
1ed60 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
1ed70 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73 33 20          /* Fts3 
1ed80 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
1ed90 20 20 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65    IncrmergeWrite
1eda0 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20  r *pWriter,     
1edb0 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65    /* Writer obje
1edc0 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
1edd0 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20  ar *zTerm,      
1ede0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20          /* Term 
1edf0 74 6f 20 77 72 69 74 65 20 74 6f 20 69 6e 74 65  to write to inte
1ee00 72 6e 61 6c 20 6e 6f 64 65 20 2a 2f 0a 20 20 69  rnal node */.  i
1ee10 6e 74 20 6e 54 65 72 6d 20 20 20 20 20 20 20 20  nt nTerm        
1ee20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ee30 2a 20 42 79 74 65 73 20 61 74 20 7a 54 65 72 6d  * Bytes at zTerm
1ee40 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
1ee50 5f 69 6e 74 36 34 20 69 50 74 72 20 3d 20 70 57  _int64 iPtr = pW
1ee60 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74  riter->aNodeWrit
1ee70 65 72 5b 30 5d 2e 69 42 6c 6f 63 6b 3b 0a 20 20  er[0].iBlock;.  
1ee80 69 6e 74 20 69 4c 61 79 65 72 3b 0a 0a 20 20 61  int iLayer;..  a
1ee90 73 73 65 72 74 28 20 6e 54 65 72 6d 3e 30 20 29  ssert( nTerm>0 )
1eea0 3b 0a 20 20 66 6f 72 28 69 4c 61 79 65 72 3d 31  ;.  for(iLayer=1
1eeb0 3b 20 41 4c 57 41 59 53 28 69 4c 61 79 65 72 3c  ; ALWAYS(iLayer<
1eec0 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42  FTS_MAX_APPENDAB
1eed0 4c 45 5f 48 45 49 47 48 54 29 3b 20 69 4c 61 79  LE_HEIGHT); iLay
1eee0 65 72 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  er++){.    sqlit
1eef0 65 33 5f 69 6e 74 36 34 20 69 4e 65 78 74 50 74  e3_int64 iNextPt
1ef00 72 20 3d 20 30 3b 0a 20 20 20 20 4e 6f 64 65 57  r = 0;.    NodeW
1ef10 72 69 74 65 72 20 2a 70 4e 6f 64 65 20 3d 20 26  riter *pNode = &
1ef20 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72  pWriter->aNodeWr
1ef30 69 74 65 72 5b 69 4c 61 79 65 72 5d 3b 0a 20 20  iter[iLayer];.  
1ef40 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1ef50 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 6e 50  E_OK;.    int nP
1ef60 72 65 66 69 78 3b 0a 20 20 20 20 69 6e 74 20 6e  refix;.    int n
1ef70 53 75 66 66 69 78 3b 0a 20 20 20 20 69 6e 74 20  Suffix;.    int 
1ef80 6e 53 70 61 63 65 3b 0a 0a 20 20 20 20 2f 2a 20  nSpace;..    /* 
1ef90 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
1efa0 75 63 68 20 73 70 61 63 65 20 74 68 65 20 6b 65  uch space the ke
1efb0 79 20 77 69 6c 6c 20 63 6f 6e 73 75 6d 65 20 69  y will consume i
1efc0 66 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 20  f it is written 
1efd0 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  to.    ** the cu
1efe0 72 72 65 6e 74 20 6e 6f 64 65 20 6f 66 20 6c 61  rrent node of la
1eff0 79 65 72 20 69 4c 61 79 65 72 2e 20 44 75 65 20  yer iLayer. Due 
1f000 74 6f 20 74 68 65 20 70 72 65 66 69 78 20 63 6f  to the prefix co
1f010 6d 70 72 65 73 73 69 6f 6e 2c 20 0a 20 20 20 20  mpression, .    
1f020 2a 2a 20 74 68 65 20 73 70 61 63 65 20 72 65 71  ** the space req
1f030 75 69 72 65 64 20 63 68 61 6e 67 65 73 20 64 65  uired changes de
1f040 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63 68  pending on which
1f050 20 6e 6f 64 65 20 74 68 65 20 6b 65 79 20 69 73   node the key is
1f060 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 61 64   to.    ** be ad
1f070 64 65 64 20 74 6f 2e 20 20 2a 2f 0a 20 20 20 20  ded to.  */.    
1f080 6e 50 72 65 66 69 78 20 3d 20 66 74 73 33 50 72  nPrefix = fts3Pr
1f090 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70 4e 6f  efixCompress(pNo
1f0a0 64 65 2d 3e 6b 65 79 2e 61 2c 20 70 4e 6f 64 65  de->key.a, pNode
1f0b0 2d 3e 6b 65 79 2e 6e 2c 20 7a 54 65 72 6d 2c 20  ->key.n, zTerm, 
1f0c0 6e 54 65 72 6d 29 3b 0a 20 20 20 20 6e 53 75 66  nTerm);.    nSuf
1f0d0 66 69 78 20 3d 20 6e 54 65 72 6d 20 2d 20 6e 50  fix = nTerm - nP
1f0e0 72 65 66 69 78 3b 0a 20 20 20 20 6e 53 70 61 63  refix;.    nSpac
1f0f0 65 20 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  e  = sqlite3Fts3
1f100 56 61 72 69 6e 74 4c 65 6e 28 6e 50 72 65 66 69  VarintLen(nPrefi
1f110 78 29 3b 0a 20 20 20 20 6e 53 70 61 63 65 20 2b  x);.    nSpace +
1f120 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72  = sqlite3Fts3Var
1f130 69 6e 74 4c 65 6e 28 6e 53 75 66 66 69 78 29 20  intLen(nSuffix) 
1f140 2b 20 6e 53 75 66 66 69 78 3b 0a 0a 20 20 20 20  + nSuffix;..    
1f150 69 66 28 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e  if( pNode->key.n
1f160 3d 3d 30 20 7c 7c 20 28 70 4e 6f 64 65 2d 3e 62  ==0 || (pNode->b
1f170 6c 6f 63 6b 2e 6e 20 2b 20 6e 53 70 61 63 65 29  lock.n + nSpace)
1f180 3c 3d 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 29  <=p->nNodeSize )
1f190 7b 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  { .      /* If t
1f1a0 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 20  he current node 
1f1b0 6f 66 20 6c 61 79 65 72 20 69 4c 61 79 65 72 20  of layer iLayer 
1f1c0 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 6b 65  contains zero ke
1f1d0 79 73 2c 20 6f 72 20 69 66 20 61 64 64 69 6e 67  ys, or if adding
1f1e0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6b 65  .      ** the ke
1f1f0 79 20 74 6f 20 69 74 20 77 69 6c 6c 20 6e 6f 74  y to it will not
1f200 20 63 61 75 73 65 20 69 74 20 74 6f 20 67 72 6f   cause it to gro
1f210 77 20 74 6f 20 6c 61 72 67 65 72 20 74 68 61 6e  w to larger than
1f220 20 6e 4e 6f 64 65 53 69 7a 65 20 0a 20 20 20 20   nNodeSize .    
1f230 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69    ** bytes in si
1f240 7a 65 2c 20 77 72 69 74 65 20 74 68 65 20 6b 65  ze, write the ke
1f250 79 20 68 65 72 65 2e 20 20 2a 2f 0a 0a 20 20 20  y here.  */..   
1f260 20 20 20 42 6c 6f 62 20 2a 70 42 6c 6b 20 3d 20     Blob *pBlk = 
1f270 26 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 3b 0a 20  &pNode->block;. 
1f280 20 20 20 20 20 69 66 28 20 70 42 6c 6b 2d 3e 6e       if( pBlk->n
1f290 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62  ==0 ){.        b
1f2a0 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28 70 42  lobGrowBuffer(pB
1f2b0 6c 6b 2c 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65  lk, p->nNodeSize
1f2c0 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
1f2d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f2e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
1f2f0 42 6c 6b 2d 3e 61 5b 30 5d 20 3d 20 28 63 68 61  Blk->a[0] = (cha
1f300 72 29 69 4c 61 79 65 72 3b 0a 20 20 20 20 20 20  r)iLayer;.      
1f310 20 20 20 20 70 42 6c 6b 2d 3e 6e 20 3d 20 31 20      pBlk->n = 1 
1f320 2b 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74  + sqlite3Fts3Put
1f330 56 61 72 69 6e 74 28 26 70 42 6c 6b 2d 3e 61 5b  Varint(&pBlk->a[
1f340 31 5d 2c 20 69 50 74 72 29 3b 0a 20 20 20 20 20  1], iPtr);.     
1f350 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1f360 20 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65     blobGrowBuffe
1f370 72 28 70 42 6c 6b 2c 20 70 42 6c 6b 2d 3e 6e 20  r(pBlk, pBlk->n 
1f380 2b 20 6e 53 70 61 63 65 2c 20 26 72 63 29 3b 0a  + nSpace, &rc);.
1f390 20 20 20 20 20 20 62 6c 6f 62 47 72 6f 77 42 75        blobGrowBu
1f3a0 66 66 65 72 28 26 70 4e 6f 64 65 2d 3e 6b 65 79  ffer(&pNode->key
1f3b0 2c 20 6e 54 65 72 6d 2c 20 26 72 63 29 3b 0a 0a  , nTerm, &rc);..
1f3c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1f3d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f3e0 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 6b 65     if( pNode->ke
1f3f0 79 2e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  y.n ){.         
1f400 20 70 42 6c 6b 2d 3e 6e 20 2b 3d 20 73 71 6c 69   pBlk->n += sqli
1f410 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74  te3Fts3PutVarint
1f420 28 26 70 42 6c 6b 2d 3e 61 5b 70 42 6c 6b 2d 3e  (&pBlk->a[pBlk->
1f430 6e 5d 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20  n], nPrefix);.  
1f440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f450 70 42 6c 6b 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  pBlk->n += sqlit
1f460 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28  e3Fts3PutVarint(
1f470 26 70 42 6c 6b 2d 3e 61 5b 70 42 6c 6b 2d 3e 6e  &pBlk->a[pBlk->n
1f480 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 20  ], nSuffix);.   
1f490 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 42 6c       memcpy(&pBl
1f4a0 6b 2d 3e 61 5b 70 42 6c 6b 2d 3e 6e 5d 2c 20 26  k->a[pBlk->n], &
1f4b0 7a 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 2c 20  zTerm[nPrefix], 
1f4c0 6e 53 75 66 66 69 78 29 3b 0a 20 20 20 20 20 20  nSuffix);.      
1f4d0 20 20 70 42 6c 6b 2d 3e 6e 20 2b 3d 20 6e 53 75    pBlk->n += nSu
1f4e0 66 66 69 78 3b 0a 0a 20 20 20 20 20 20 20 20 6d  ffix;..        m
1f4f0 65 6d 63 70 79 28 70 4e 6f 64 65 2d 3e 6b 65 79  emcpy(pNode->key
1f500 2e 61 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  .a, zTerm, nTerm
1f510 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f 64 65  );.        pNode
1f520 2d 3e 6b 65 79 2e 6e 20 3d 20 6e 54 65 72 6d 3b  ->key.n = nTerm;
1f530 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1f540 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68  se{.      /* Oth
1f550 65 72 77 69 73 65 2c 20 66 6c 75 73 68 20 74 68  erwise, flush th
1f560 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 20 6f  e current node o
1f570 66 20 6c 61 79 65 72 20 69 4c 61 79 65 72 20 74  f layer iLayer t
1f580 6f 20 64 69 73 6b 2e 0a 20 20 20 20 20 20 2a 2a  o disk..      **
1f590 20 54 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61   Then allocate a
1f5a0 20 6e 65 77 2c 20 65 6d 70 74 79 20 73 69 62 6c   new, empty sibl
1f5b0 69 6e 67 20 6e 6f 64 65 2e 20 54 68 65 20 6b 65  ing node. The ke
1f5c0 79 20 77 69 6c 6c 20 62 65 20 77 72 69 74 74 65  y will be writte
1f5d0 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20  n.      ** into 
1f5e0 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68  the parent of th
1f5f0 69 73 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 20 20  is node. */.    
1f600 20 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65    rc = fts3Write
1f610 53 65 67 6d 65 6e 74 28 70 2c 20 70 4e 6f 64 65  Segment(p, pNode
1f620 2d 3e 69 42 6c 6f 63 6b 2c 20 70 4e 6f 64 65 2d  ->iBlock, pNode-
1f630 3e 62 6c 6f 63 6b 2e 61 2c 20 70 4e 6f 64 65 2d  >block.a, pNode-
1f640 3e 62 6c 6f 63 6b 2e 6e 29 3b 0a 0a 20 20 20 20  >block.n);..    
1f650 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d    assert( pNode-
1f660 3e 62 6c 6f 63 6b 2e 6e 41 6c 6c 6f 63 3e 3d 70  >block.nAlloc>=p
1f670 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 29 3b 0a 20  ->nNodeSize );. 
1f680 20 20 20 20 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63       pNode->bloc
1f690 6b 2e 61 5b 30 5d 20 3d 20 28 63 68 61 72 29 69  k.a[0] = (char)i
1f6a0 4c 61 79 65 72 3b 0a 20 20 20 20 20 20 70 4e 6f  Layer;.      pNo
1f6b0 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 20 3d 20 31 20  de->block.n = 1 
1f6c0 2b 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74  + sqlite3Fts3Put
1f6d0 56 61 72 69 6e 74 28 26 70 4e 6f 64 65 2d 3e 62  Varint(&pNode->b
1f6e0 6c 6f 63 6b 2e 61 5b 31 5d 2c 20 69 50 74 72 2b  lock.a[1], iPtr+
1f6f0 31 29 3b 0a 0a 20 20 20 20 20 20 69 4e 65 78 74  1);..      iNext
1f700 50 74 72 20 3d 20 70 4e 6f 64 65 2d 3e 69 42 6c  Ptr = pNode->iBl
1f710 6f 63 6b 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65  ock;.      pNode
1f720 2d 3e 69 42 6c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  ->iBlock++;.    
1f730 20 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 20 3d    pNode->key.n =
1f740 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   0;.    }..    i
1f750 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f760 20 7c 7c 20 69 4e 65 78 74 50 74 72 3d 3d 30 20   || iNextPtr==0 
1f770 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1f780 20 69 50 74 72 20 3d 20 69 4e 65 78 74 50 74 72   iPtr = iNextPtr
1f790 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
1f7a0 20 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30   0 );.  return 0
1f7b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
1f7c0 64 20 61 20 74 65 72 6d 20 61 6e 64 20 28 6f 70  d a term and (op
1f7d0 74 69 6f 6e 61 6c 6c 79 29 20 64 6f 63 6c 69 73  tionally) doclis
1f7e0 74 20 74 6f 20 74 68 65 20 46 54 53 20 73 65 67  t to the FTS seg
1f7f0 6d 65 6e 74 20 6e 6f 64 65 20 63 75 72 72 65 6e  ment node curren
1f800 74 6c 79 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e  tly.** stored in
1f810 20 62 6c 6f 62 20 2a 70 4e 6f 64 65 2e 20 54 68   blob *pNode. Th
1f820 65 20 6e 6f 64 65 20 6e 65 65 64 20 6e 6f 74 20  e node need not 
1f830 63 6f 6e 74 61 69 6e 20 61 6e 79 20 74 65 72 6d  contain any term
1f840 73 2c 20 62 75 74 20 74 68 65 0a 2a 2a 20 68 65  s, but the.** he
1f850 61 64 65 72 20 6d 75 73 74 20 62 65 20 77 72 69  ader must be wri
1f860 74 74 65 6e 20 62 65 66 6f 72 65 20 74 68 69 73  tten before this
1f870 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1f880 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 6f 64  led..**.** A nod
1f890 65 20 68 65 61 64 65 72 20 69 73 20 61 20 73 69  e header is a si
1f8a0 6e 67 6c 65 20 30 78 30 30 20 62 79 74 65 20 66  ngle 0x00 byte f
1f8b0 6f 72 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20  or a leaf node, 
1f8c0 6f 72 20 61 20 68 65 69 67 68 74 20 76 61 72 69  or a height vari
1f8d0 6e 74 0a 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62  nt.** followed b
1f8e0 79 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d  y the left-hand-
1f8f0 63 68 69 6c 64 20 76 61 72 69 6e 74 20 66 6f 72  child varint for
1f900 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64   an internal nod
1f910 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  e..**.** The ter
1f920 6d 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  m to be appended
1f930 20 69 73 20 70 61 73 73 65 64 20 76 69 61 20 61   is passed via a
1f940 72 67 75 6d 65 6e 74 73 20 7a 54 65 72 6d 2f 6e  rguments zTerm/n
1f950 54 65 72 6d 2e 20 46 6f 72 20 61 20 0a 2a 2a 20  Term. For a .** 
1f960 6c 65 61 66 20 6e 6f 64 65 2c 20 74 68 65 20 64  leaf node, the d
1f970 6f 63 6c 69 73 74 20 69 73 20 70 61 73 73 65 64  oclist is passed
1f980 20 61 73 20 61 44 6f 63 6c 69 73 74 2f 6e 44 6f   as aDoclist/nDo
1f990 63 6c 69 73 74 2e 20 46 6f 72 20 61 6e 20 69 6e  clist. For an in
1f9a0 74 65 72 6e 61 6c 0a 2a 2a 20 6e 6f 64 65 2c 20  ternal.** node, 
1f9b0 62 6f 74 68 20 61 44 6f 63 6c 69 73 74 20 61 6e  both aDoclist an
1f9c0 64 20 6e 44 6f 63 6c 69 73 74 20 6d 75 73 74 20  d nDoclist must 
1f9d0 62 65 20 70 61 73 73 65 64 20 30 2e 0a 2a 2a 0a  be passed 0..**.
1f9e0 2a 2a 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f  ** If the size o
1f9f0 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 62  f the value in b
1fa00 6c 6f 62 20 70 50 72 65 76 20 69 73 20 7a 65 72  lob pPrev is zer
1fa10 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  o, then this is 
1fa20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 65 72  the first.** ter
1fa30 6d 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  m written to the
1fa40 20 6e 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   node. Otherwise
1fa50 2c 20 70 50 72 65 76 20 63 6f 6e 74 61 69 6e 73  , pPrev contains
1fa60 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 0a   a copy of the .
1fa70 2a 2a 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  ** previous term
1fa80 2e 20 42 65 66 6f 72 65 20 74 68 69 73 20 66 75  . Before this fu
1fa90 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20  nction returns, 
1faa0 69 74 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  it is updated to
1fab0 20 63 6f 6e 74 61 69 6e 20 61 0a 2a 2a 20 63 6f   contain a.** co
1fac0 70 79 20 6f 66 20 7a 54 65 72 6d 2f 6e 54 65 72  py of zTerm/nTer
1fad0 6d 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61  m..**.** It is a
1fae0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
1faf0 62 75 66 66 65 72 20 61 73 73 6f 63 69 61 74 65  buffer associate
1fb00 64 20 77 69 74 68 20 70 4e 6f 64 65 20 69 73 20  d with pNode is 
1fb10 61 6c 72 65 61 64 79 20 6c 61 72 67 65 0a 2a 2a  already large.**
1fb20 20 65 6e 6f 75 67 68 20 74 6f 20 61 63 63 6f 6d   enough to accom
1fb30 6d 6f 64 61 74 65 20 74 68 65 20 6e 65 77 20 65  modate the new e
1fb40 6e 74 72 79 2e 20 54 68 65 20 62 75 66 66 65 72  ntry. The buffer
1fb50 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1fb60 20 70 50 72 65 76 0a 2a 2a 20 69 73 20 65 78 74   pPrev.** is ext
1fb70 65 6e 64 65 64 20 62 79 20 74 68 69 73 20 66 75  ended by this fu
1fb80 6e 63 74 69 6f 6e 20 69 66 20 72 65 71 75 72 69  nction if requri
1fb90 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
1fba0 20 65 72 72 6f 72 20 28 69 2e 65 2e 20 4f 4f 4d   error (i.e. OOM
1fbb0 20 63 6f 6e 64 69 74 69 6f 6e 29 20 6f 63 63 75   condition) occu
1fbc0 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  rs, an SQLite er
1fbd0 72 6f 72 20 63 6f 64 65 20 69 73 0a 2a 2a 20 72  ror code is.** r
1fbe0 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
1fbf0 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
1fc00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1fc10 33 41 70 70 65 6e 64 54 6f 4e 6f 64 65 28 0a 20  3AppendToNode(. 
1fc20 20 42 6c 6f 62 20 2a 70 4e 6f 64 65 2c 20 20 20   Blob *pNode,   
1fc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc40 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e 6f 64 65   /* Current node
1fc50 20 69 6d 61 67 65 20 74 6f 20 61 70 70 65 6e 64   image to append
1fc60 20 74 6f 20 2a 2f 0a 20 20 42 6c 6f 62 20 2a 70   to */.  Blob *p
1fc70 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20 20  Prev,           
1fc80 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
1fc90 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72  er containing pr
1fca0 65 76 69 6f 75 73 20 74 65 72 6d 20 77 72 69 74  evious term writ
1fcb0 74 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ten */.  const c
1fcc0 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20  har *zTerm,     
1fcd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
1fce0 74 65 72 6d 20 74 6f 20 77 72 69 74 65 20 2a 2f  term to write */
1fcf0 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20  .  int nTerm,   
1fd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd10 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54     /* Size of zT
1fd20 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  erm in bytes */.
1fd30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44    const char *aD
1fd40 6f 63 6c 69 73 74 2c 20 20 20 20 20 20 20 20 20  oclist,         
1fd50 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 28 6f 72    /* Doclist (or
1fd60 20 4e 55 4c 4c 29 20 74 6f 20 77 72 69 74 65 20   NULL) to write 
1fd70 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73  */.  int nDoclis
1fd80 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1fd90 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1fda0 61 44 6f 63 6c 69 73 74 20 69 6e 20 62 79 74 65  aDoclist in byte
1fdb0 73 20 2a 2f 20 0a 29 7b 0a 20 20 69 6e 74 20 72  s */ .){.  int r
1fdc0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
1fdd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1fde0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1fdf0 6e 74 20 62 46 69 72 73 74 20 3d 20 28 70 50 72  nt bFirst = (pPr
1fe00 65 76 2d 3e 6e 3d 3d 30 29 3b 20 20 20 20 20 2f  ev->n==0);     /
1fe10 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
1fe20 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
1fe30 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
1fe40 74 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20  t nPrefix;      
1fe50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fe60 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 70 72   Size of term pr
1fe70 65 66 69 78 20 69 6e 20 62 79 74 65 73 20 2a 2f  efix in bytes */
1fe80 0a 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 20  .  int nSuffix; 
1fe90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fea0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65     /* Size of te
1feb0 72 6d 20 73 75 66 66 69 78 20 69 6e 20 62 79 74  rm suffix in byt
1fec0 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4e 6f 64 65  es */..  /* Node
1fed0 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61   must have alrea
1fee0 64 79 20 62 65 65 6e 20 73 74 61 72 74 65 64 2e  dy been started.
1fef0 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
1ff00 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 61 0a 20   doclist for a. 
1ff10 20 2a 2a 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61   ** leaf node, a
1ff20 6e 64 20 74 68 65 72 65 20 6d 75 73 74 20 6e 6f  nd there must no
1ff30 74 20 62 65 20 61 20 64 6f 63 6c 69 73 74 20 66  t be a doclist f
1ff40 6f 72 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e  or an internal n
1ff50 6f 64 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ode.  */.  asser
1ff60 74 28 20 70 4e 6f 64 65 2d 3e 6e 3e 30 20 29 3b  t( pNode->n>0 );
1ff70 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 6f 64  .  assert( (pNod
1ff80 65 2d 3e 61 5b 30 5d 3d 3d 27 5c 30 27 29 3d 3d  e->a[0]=='\0')==
1ff90 28 61 44 6f 63 6c 69 73 74 21 3d 30 29 20 29 3b  (aDoclist!=0) );
1ffa0 0a 0a 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66  ..  blobGrowBuff
1ffb0 65 72 28 70 50 72 65 76 2c 20 6e 54 65 72 6d 2c  er(pPrev, nTerm,
1ffc0 20 26 72 63 29 3b 0a 20 20 69 66 28 20 72 63 21   &rc);.  if( rc!
1ffd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1ffe0 75 72 6e 20 72 63 3b 0a 0a 20 20 6e 50 72 65 66  urn rc;..  nPref
1fff0 69 78 20 3d 20 66 74 73 33 50 72 65 66 69 78 43  ix = fts3PrefixC
20000 6f 6d 70 72 65 73 73 28 70 50 72 65 76 2d 3e 61  ompress(pPrev->a
20010 2c 20 70 50 72 65 76 2d 3e 6e 2c 20 7a 54 65 72  , pPrev->n, zTer
20020 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 6e 53 75  m, nTerm);.  nSu
20030 66 66 69 78 20 3d 20 6e 54 65 72 6d 20 2d 20 6e  ffix = nTerm - n
20040 50 72 65 66 69 78 3b 0a 20 20 6d 65 6d 63 70 79  Prefix;.  memcpy
20050 28 70 50 72 65 76 2d 3e 61 2c 20 7a 54 65 72 6d  (pPrev->a, zTerm
20060 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 70 50 72 65  , nTerm);.  pPre
20070 76 2d 3e 6e 20 3d 20 6e 54 65 72 6d 3b 0a 0a 20  v->n = nTerm;.. 
20080 20 69 66 28 20 62 46 69 72 73 74 3d 3d 30 20 29   if( bFirst==0 )
20090 7b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 6e 20 2b  {.    pNode->n +
200a0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74  = sqlite3Fts3Put
200b0 56 61 72 69 6e 74 28 26 70 4e 6f 64 65 2d 3e 61  Varint(&pNode->a
200c0 5b 70 4e 6f 64 65 2d 3e 6e 5d 2c 20 6e 50 72 65  [pNode->n], nPre
200d0 66 69 78 29 3b 0a 20 20 7d 0a 20 20 70 4e 6f 64  fix);.  }.  pNod
200e0 65 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46  e->n += sqlite3F
200f0 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 4e  ts3PutVarint(&pN
20100 6f 64 65 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d  ode->a[pNode->n]
20110 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 6d 65  , nSuffix);.  me
20120 6d 63 70 79 28 26 70 4e 6f 64 65 2d 3e 61 5b 70  mcpy(&pNode->a[p
20130 4e 6f 64 65 2d 3e 6e 5d 2c 20 26 7a 54 65 72 6d  Node->n], &zTerm
20140 5b 6e 50 72 65 66 69 78 5d 2c 20 6e 53 75 66 66  [nPrefix], nSuff
20150 69 78 29 3b 0a 20 20 70 4e 6f 64 65 2d 3e 6e 20  ix);.  pNode->n 
20160 2b 3d 20 6e 53 75 66 66 69 78 3b 0a 0a 20 20 69  += nSuffix;..  i
20170 66 28 20 61 44 6f 63 6c 69 73 74 20 29 7b 0a 20  f( aDoclist ){. 
20180 20 20 20 70 4e 6f 64 65 2d 3e 6e 20 2b 3d 20 73     pNode->n += s
20190 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72  qlite3Fts3PutVar
201a0 69 6e 74 28 26 70 4e 6f 64 65 2d 3e 61 5b 70 4e  int(&pNode->a[pN
201b0 6f 64 65 2d 3e 6e 5d 2c 20 6e 44 6f 63 6c 69 73  ode->n], nDoclis
201c0 74 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  t);.    memcpy(&
201d0 70 4e 6f 64 65 2d 3e 61 5b 70 4e 6f 64 65 2d 3e  pNode->a[pNode->
201e0 6e 5d 2c 20 61 44 6f 63 6c 69 73 74 2c 20 6e 44  n], aDoclist, nD
201f0 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 70 4e 6f  oclist);.    pNo
20200 64 65 2d 3e 6e 20 2b 3d 20 6e 44 6f 63 6c 69 73  de->n += nDoclis
20210 74 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  t;.  }..  assert
20220 28 20 70 4e 6f 64 65 2d 3e 6e 3c 3d 70 4e 6f 64  ( pNode->n<=pNod
20230 65 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 0a 20 20  e->nAlloc );..  
20240 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20250 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
20260 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65  d the current te
20270 72 6d 20 61 6e 64 20 64 6f 63 6c 69 73 74 20 70  rm and doclist p
20280 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 63 75 72  ointed to by cur
20290 73 6f 72 20 70 43 73 72 20 74 6f 20 74 68 65 0a  sor pCsr to the.
202a0 2a 2a 20 61 70 70 65 6e 64 61 62 6c 65 20 62 2d  ** appendable b-
202b0 74 72 65 65 20 73 65 67 6d 65 6e 74 20 6f 70 65  tree segment ope
202c0 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ned for writing 
202d0 62 79 20 70 57 72 69 74 65 72 2e 0a 2a 2a 0a 2a  by pWriter..**.*
202e0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
202f0 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
20300 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  , or an SQLite e
20310 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
20320 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
20330 6e 74 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65  nt fts3Incrmerge
20340 41 70 70 65 6e 64 28 0a 20 20 46 74 73 33 54 61  Append(.  Fts3Ta
20350 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
20360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73            /* Fts
20370 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  3 table handle *
20380 2f 0a 20 20 49 6e 63 72 6d 65 72 67 65 57 72 69  /.  IncrmergeWri
20390 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20  ter *pWriter,   
203a0 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62      /* Writer ob
203b0 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 33 4d 75  ject */.  Fts3Mu
203c0 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70 43  ltiSegReader *pC
203d0 73 72 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72  sr        /* Cur
203e0 73 6f 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  sor containing t
203f0 65 72 6d 20 61 6e 64 20 64 6f 63 6c 69 73 74 20  erm and doclist 
20400 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
20410 61 72 20 2a 7a 54 65 72 6d 20 3d 20 70 43 73 72  ar *zTerm = pCsr
20420 2d 3e 7a 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e  ->zTerm;.  int n
20430 54 65 72 6d 20 3d 20 70 43 73 72 2d 3e 6e 54 65  Term = pCsr->nTe
20440 72 6d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  rm;.  const char
20450 20 2a 61 44 6f 63 6c 69 73 74 20 3d 20 70 43 73   *aDoclist = pCs
20460 72 2d 3e 61 44 6f 63 6c 69 73 74 3b 0a 20 20 69  r->aDoclist;.  i
20470 6e 74 20 6e 44 6f 63 6c 69 73 74 20 3d 20 70 43  nt nDoclist = pC
20480 73 72 2d 3e 6e 44 6f 63 6c 69 73 74 3b 0a 20 20  sr->nDoclist;.  
20490 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
204a0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  OK;           /*
204b0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
204c0 20 20 69 6e 74 20 6e 53 70 61 63 65 3b 20 20 20    int nSpace;   
204d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204e0 2f 2a 20 54 6f 74 61 6c 20 73 70 61 63 65 20 69  /* Total space i
204f0 6e 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  n bytes required
20500 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 69 6e   on leaf */.  in
20510 74 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20  t nPrefix;      
20520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
20530 69 7a 65 20 6f 66 20 70 72 65 66 69 78 20 73 68  ize of prefix sh
20540 61 72 65 64 20 77 69 74 68 20 70 72 65 76 69 6f  ared with previo
20550 75 73 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  us term */.  int
20560 20 6e 53 75 66 66 69 78 3b 20 20 20 20 20 20 20   nSuffix;       
20570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
20580 7a 65 20 6f 66 20 73 75 66 66 69 78 20 28 6e 54  ze of suffix (nT
20590 65 72 6d 20 2d 20 6e 50 72 65 66 69 78 29 20 2a  erm - nPrefix) *
205a0 2f 0a 20 20 4e 6f 64 65 57 72 69 74 65 72 20 2a  /.  NodeWriter *
205b0 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  pLeaf;          
205c0 20 20 2f 2a 20 4f 62 6a 65 63 74 20 75 73 65 64    /* Object used
205d0 20 74 6f 20 77 72 69 74 65 20 6c 65 61 66 20 6e   to write leaf n
205e0 6f 64 65 73 20 2a 2f 0a 0a 20 20 70 4c 65 61 66  odes */..  pLeaf
205f0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 4e 6f   = &pWriter->aNo
20600 64 65 57 72 69 74 65 72 5b 30 5d 3b 0a 20 20 6e  deWriter[0];.  n
20610 50 72 65 66 69 78 20 3d 20 66 74 73 33 50 72 65  Prefix = fts3Pre
20620 66 69 78 43 6f 6d 70 72 65 73 73 28 70 4c 65 61  fixCompress(pLea
20630 66 2d 3e 6b 65 79 2e 61 2c 20 70 4c 65 61 66 2d  f->key.a, pLeaf-
20640 3e 6b 65 79 2e 6e 2c 20 7a 54 65 72 6d 2c 20 6e  >key.n, zTerm, n
20650 54 65 72 6d 29 3b 0a 20 20 6e 53 75 66 66 69 78  Term);.  nSuffix
20660 20 3d 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66   = nTerm - nPref
20670 69 78 3b 0a 0a 20 20 6e 53 70 61 63 65 20 20 3d  ix;..  nSpace  =
20680 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69   sqlite3Fts3Vari
20690 6e 74 4c 65 6e 28 6e 50 72 65 66 69 78 29 3b 0a  ntLen(nPrefix);.
206a0 20 20 6e 53 70 61 63 65 20 2b 3d 20 73 71 6c 69    nSpace += sqli
206b0 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e  te3Fts3VarintLen
206c0 28 6e 53 75 66 66 69 78 29 20 2b 20 6e 53 75 66  (nSuffix) + nSuf
206d0 66 69 78 3b 0a 20 20 6e 53 70 61 63 65 20 2b 3d  fix;.  nSpace +=
206e0 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69   sqlite3Fts3Vari
206f0 6e 74 4c 65 6e 28 6e 44 6f 63 6c 69 73 74 29 20  ntLen(nDoclist) 
20700 2b 20 6e 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 2f  + nDoclist;..  /
20710 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
20720 20 62 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 65 6d   block is not em
20730 70 74 79 2c 20 61 6e 64 20 69 66 20 61 64 64 69  pty, and if addi
20740 6e 67 20 74 68 69 73 20 74 65 72 6d 2f 64 6f 63  ng this term/doc
20750 6c 69 73 74 0a 20 20 2a 2a 20 74 6f 20 74 68 65  list.  ** to the
20760 20 63 75 72 72 65 6e 74 20 62 6c 6f 63 6b 20 77   current block w
20770 6f 75 6c 64 20 6d 61 6b 65 20 69 74 20 6c 61 72  ould make it lar
20780 67 65 72 20 74 68 61 6e 20 46 74 73 33 54 61 62  ger than Fts3Tab
20790 6c 65 2e 6e 4e 6f 64 65 53 69 7a 65 0a 20 20 2a  le.nNodeSize.  *
207a0 2a 20 62 79 74 65 73 2c 20 77 72 69 74 65 20 74  * bytes, write t
207b0 68 69 73 20 62 6c 6f 63 6b 20 6f 75 74 20 74 6f  his block out to
207c0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 2a   the database. *
207d0 2f 0a 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 62  /.  if( pLeaf->b
207e0 6c 6f 63 6b 2e 6e 3e 30 20 26 26 20 28 70 4c 65  lock.n>0 && (pLe
207f0 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 20 2b 20 6e 53  af->block.n + nS
20800 70 61 63 65 29 3e 70 2d 3e 6e 4e 6f 64 65 53 69  pace)>p->nNodeSi
20810 7a 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  ze ){.    rc = f
20820 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28  ts3WriteSegment(
20830 70 2c 20 70 4c 65 61 66 2d 3e 69 42 6c 6f 63 6b  p, pLeaf->iBlock
20840 2c 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 61  , pLeaf->block.a
20850 2c 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e  , pLeaf->block.n
20860 29 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  );.    pWriter->
20870 6e 57 6f 72 6b 2b 2b 3b 0a 0a 20 20 20 20 2f 2a  nWork++;..    /*
20880 20 41 64 64 20 74 68 65 20 63 75 72 72 65 6e 74   Add the current
20890 20 74 65 72 6d 20 74 6f 20 74 68 65 20 70 61 72   term to the par
208a0 65 6e 74 20 6e 6f 64 65 2e 20 54 68 65 20 74 65  ent node. The te
208b0 72 6d 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  rm added to the 
208c0 0a 20 20 20 20 2a 2a 20 70 61 72 65 6e 74 20 6d  .    ** parent m
208d0 75 73 74 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ust:.    **.    
208e0 2a 2a 20 20 20 61 29 20 62 65 20 67 72 65 61 74  **   a) be great
208f0 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67  er than the larg
20900 65 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20  est term on the 
20910 6c 65 61 66 20 6e 6f 64 65 20 6a 75 73 74 20 77  leaf node just w
20920 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 20 20  ritten.    **   
20930 20 20 20 74 6f 20 74 68 65 20 64 61 74 61 62 61     to the databa
20940 73 65 20 28 73 74 69 6c 6c 20 61 76 61 69 6c 61  se (still availa
20950 62 6c 65 20 69 6e 20 70 4c 65 61 66 2d 3e 6b 65  ble in pLeaf->ke
20960 79 29 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 0a 20  y), and.    **. 
20970 20 20 20 2a 2a 20 20 20 62 29 20 62 65 20 6c 65     **   b) be le
20980 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
20990 20 74 6f 20 74 68 65 20 74 65 72 6d 20 61 62 6f   to the term abo
209a0 75 74 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  ut to be added t
209b0 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a  o the new.    **
209c0 20 20 20 20 20 20 6c 65 61 66 20 6e 6f 64 65 20        leaf node 
209d0 28 7a 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 20  (zTerm/nTerm).. 
209e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20     **.    ** In 
209f0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20  other words, it 
20a00 6d 75 73 74 20 62 65 20 74 68 65 20 70 72 65 66  must be the pref
20a10 69 78 20 6f 66 20 7a 54 65 72 6d 20 31 20 62 79  ix of zTerm 1 by
20a20 74 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 20  te longer than. 
20a30 20 20 20 2a 2a 20 74 68 65 20 63 6f 6d 6d 6f 6e     ** the common
20a40 20 70 72 65 66 69 78 20 28 69 66 20 61 6e 79 29   prefix (if any)
20a50 20 6f 66 20 7a 54 65 72 6d 20 61 6e 64 20 70 57   of zTerm and pW
20a60 72 69 74 65 72 2d 3e 7a 54 65 72 6d 2e 0a 20 20  riter->zTerm..  
20a70 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
20a80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20a90 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63      rc = fts3Inc
20aa0 72 6d 65 72 67 65 50 75 73 68 28 70 2c 20 70 57  rmergePush(p, pW
20ab0 72 69 74 65 72 2c 20 7a 54 65 72 6d 2c 20 6e 50  riter, zTerm, nP
20ac0 72 65 66 69 78 2b 31 29 3b 0a 20 20 20 20 7d 0a  refix+1);.    }.
20ad0 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20  .    /* Advance 
20ae0 74 6f 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70  to the next outp
20af0 75 74 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ut block */.    
20b00 70 4c 65 61 66 2d 3e 69 42 6c 6f 63 6b 2b 2b 3b  pLeaf->iBlock++;
20b10 0a 20 20 20 20 70 4c 65 61 66 2d 3e 6b 65 79 2e  .    pLeaf->key.
20b20 6e 20 3d 20 30 3b 0a 20 20 20 20 70 4c 65 61 66  n = 0;.    pLeaf
20b30 2d 3e 62 6c 6f 63 6b 2e 6e 20 3d 20 30 3b 0a 0a  ->block.n = 0;..
20b40 20 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54      nSuffix = nT
20b50 65 72 6d 3b 0a 20 20 20 20 6e 53 70 61 63 65 20  erm;.    nSpace 
20b60 20 3d 20 31 3b 0a 20 20 20 20 6e 53 70 61 63 65   = 1;.    nSpace
20b70 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56   += sqlite3Fts3V
20b80 61 72 69 6e 74 4c 65 6e 28 6e 53 75 66 66 69 78  arintLen(nSuffix
20b90 29 20 2b 20 6e 53 75 66 66 69 78 3b 0a 20 20 20  ) + nSuffix;.   
20ba0 20 6e 53 70 61 63 65 20 2b 3d 20 73 71 6c 69 74   nSpace += sqlit
20bb0 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28  e3Fts3VarintLen(
20bc0 6e 44 6f 63 6c 69 73 74 29 20 2b 20 6e 44 6f 63  nDoclist) + nDoc
20bd0 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 70 57 72  list;.  }..  pWr
20be0 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61 74 61 20  iter->nLeafData 
20bf0 2b 3d 20 6e 53 70 61 63 65 3b 0a 20 20 62 6c 6f  += nSpace;.  blo
20c00 62 47 72 6f 77 42 75 66 66 65 72 28 26 70 4c 65  bGrowBuffer(&pLe
20c10 61 66 2d 3e 62 6c 6f 63 6b 2c 20 70 4c 65 61 66  af->block, pLeaf
20c20 2d 3e 62 6c 6f 63 6b 2e 6e 20 2b 20 6e 53 70 61  ->block.n + nSpa
20c30 63 65 2c 20 26 72 63 29 3b 0a 20 20 69 66 28 20  ce, &rc);.  if( 
20c40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20c50 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e  .    if( pLeaf->
20c60 62 6c 6f 63 6b 2e 6e 3d 3d 30 20 29 7b 0a 20 20  block.n==0 ){.  
20c70 20 20 20 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b      pLeaf->block
20c80 2e 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4c  .n = 1;.      pL
20c90 65 61 66 2d 3e 62 6c 6f 63 6b 2e 61 5b 30 5d 20  eaf->block.a[0] 
20ca0 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7d 0a 20 20  = '\0';.    }.  
20cb0 20 20 72 63 20 3d 20 66 74 73 33 41 70 70 65 6e    rc = fts3Appen
20cc0 64 54 6f 4e 6f 64 65 28 0a 20 20 20 20 20 20 20  dToNode(.       
20cd0 20 26 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2c 20   &pLeaf->block, 
20ce0 26 70 4c 65 61 66 2d 3e 6b 65 79 2c 20 7a 54 65  &pLeaf->key, zTe
20cf0 72 6d 2c 20 6e 54 65 72 6d 2c 20 61 44 6f 63 6c  rm, nTerm, aDocl
20d00 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74 0a 20 20  ist, nDoclist.  
20d10 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75    );.  }..  retu
20d20 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
20d30 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
20d40 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 6c 65 61   called to relea
20d50 73 65 20 61 6c 6c 20 64 79 6e 61 6d 69 63 20 72  se all dynamic r
20d60 65 73 6f 75 72 63 65 73 20 68 65 6c 64 20 62 79  esources held by
20d70 20 74 68 65 0a 2a 2a 20 6d 65 72 67 65 2d 77 72   the.** merge-wr
20d80 69 74 65 72 20 6f 62 6a 65 63 74 20 70 57 72 69  iter object pWri
20d90 74 65 72 2c 20 61 6e 64 20 69 66 20 6e 6f 20 65  ter, and if no e
20da0 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
20db0 64 2c 20 74 6f 20 66 6c 75 73 68 0a 2a 2a 20 61  d, to flush.** a
20dc0 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6e  ll outstanding n
20dd0 6f 64 65 20 62 75 66 66 65 72 73 20 68 65 6c 64  ode buffers held
20de0 20 62 79 20 70 57 72 69 74 65 72 20 74 6f 20 64   by pWriter to d
20df0 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  isk..**.** If *p
20e00 52 63 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45  Rc is not SQLITE
20e10 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  _OK when this fu
20e20 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
20e30 2c 20 74 68 65 6e 20 6e 6f 20 61 74 74 65 6d 70  , then no attemp
20e40 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20  t.** is made to 
20e50 77 72 69 74 65 20 61 6e 79 20 64 61 74 61 20 74  write any data t
20e60 6f 20 64 69 73 6b 2e 20 49 6e 73 74 65 61 64 2c  o disk. Instead,
20e70 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
20e80 65 72 76 65 73 20 6f 6e 6c 79 0a 2a 2a 20 74 6f  erves only.** to
20e90 20 72 65 6c 65 61 73 65 20 6f 75 74 73 74 61 6e   release outstan
20ea0 64 69 6e 67 20 72 65 73 6f 75 72 63 65 73 2e 0a  ding resources..
20eb0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
20ec0 20 69 66 20 2a 70 52 63 20 69 73 20 69 6e 69 74   if *pRc is init
20ed0 69 61 6c 6c 79 20 53 51 4c 49 54 45 5f 4f 4b 20  ially SQLITE_OK 
20ee0 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  and an error occ
20ef0 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20 66 6c 75  urs while.** flu
20f00 73 68 69 6e 67 20 62 75 66 66 65 72 73 20 74 6f  shing buffers to
20f10 20 64 69 73 6b 2c 20 2a 70 52 63 20 69 73 20 73   disk, *pRc is s
20f20 65 74 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20  et to an SQLite 
20f30 65 72 72 6f 72 20 63 6f 64 65 20 62 65 66 6f 72  error code befor
20f40 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a  e.** returning..
20f50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
20f60 74 73 33 49 6e 63 72 6d 65 72 67 65 52 65 6c 65  ts3IncrmergeRele
20f70 61 73 65 28 0a 20 20 46 74 73 33 54 61 62 6c 65  ase(.  Fts3Table
20f80 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
20f90 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74         /* FTS3 t
20fa0 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
20fb0 20 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72   IncrmergeWriter
20fc0 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20 20   *pWriter,      
20fd0 20 2f 2a 20 4d 65 72 67 65 2d 77 72 69 74 65 72   /* Merge-writer
20fe0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
20ff0 20 2a 70 52 63 20 20 20 20 20 20 20 20 20 20 20   *pRc           
21000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21010 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f  IN/OUT: Error co
21020 64 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  de */.){.  int i
21030 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
21050 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
21060 72 6f 75 67 68 20 6e 6f 6e 2d 72 6f 6f 74 20 6c  rough non-root l
21070 61 79 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ayers */.  int i
21080 52 6f 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20  Root;           
21090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
210a0 64 65 78 20 6f 66 20 72 6f 6f 74 20 69 6e 20 70  dex of root in p
210b0 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69  Writer->aNodeWri
210c0 74 65 72 20 2a 2f 0a 20 20 4e 6f 64 65 57 72 69  ter */.  NodeWri
210d0 74 65 72 20 2a 70 52 6f 6f 74 3b 20 20 20 20 20  ter *pRoot;     
210e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65           /* Node
210f0 57 72 69 74 65 72 20 66 6f 72 20 72 6f 6f 74 20  Writer for root 
21100 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  node */.  int rc
21110 20 3d 20 2a 70 52 63 3b 20 20 20 20 20 20 20 20   = *pRc;        
21120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
21130 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  or code */..  /*
21140 20 53 65 74 20 69 52 6f 6f 74 20 74 6f 20 74 68   Set iRoot to th
21150 65 20 69 6e 64 65 78 20 69 6e 20 70 57 72 69 74  e index in pWrit
21160 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b  er->aNodeWriter[
21170 5d 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20  ] of the output 
21180 73 65 67 6d 65 6e 74 20 0a 20 20 2a 2a 20 72 6f  segment .  ** ro
21190 6f 74 20 6e 6f 64 65 2e 20 49 66 20 74 68 65 20  ot node. If the 
211a0 73 65 67 6d 65 6e 74 20 66 69 74 73 20 65 6e 74  segment fits ent
211b0 69 72 65 6c 79 20 6f 6e 20 61 20 73 69 6e 67 6c  irely on a singl
211c0 65 20 6c 65 61 66 20 6e 6f 64 65 2c 20 69 52 6f  e leaf node, iRo
211d0 6f 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  ot.  ** will be 
211e0 73 65 74 20 74 6f 20 30 2e 20 49 66 20 74 68 65  set to 0. If the
211f0 20 72 6f 6f 74 20 6e 6f 64 65 20 69 73 20 74 68   root node is th
21200 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68 65 20  e parent of the 
21210 6c 65 61 76 65 73 2c 20 69 52 6f 6f 74 0a 20 20  leaves, iRoot.  
21220 2a 2a 20 77 69 6c 6c 20 62 65 20 31 2e 20 41 6e  ** will be 1. An
21230 64 20 73 6f 20 6f 6e 2e 20 20 2a 2f 0a 20 20 66  d so on.  */.  f
21240 6f 72 28 69 52 6f 6f 74 3d 46 54 53 5f 4d 41 58  or(iRoot=FTS_MAX
21250 5f 41 50 50 45 4e 44 41 42 4c 45 5f 48 45 49 47  _APPENDABLE_HEIG
21260 48 54 2d 31 3b 20 69 52 6f 6f 74 3e 3d 30 3b 20  HT-1; iRoot>=0; 
21270 69 52 6f 6f 74 2d 2d 29 7b 0a 20 20 20 20 4e 6f  iRoot--){.    No
21280 64 65 57 72 69 74 65 72 20 2a 70 4e 6f 64 65 20  deWriter *pNode 
21290 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64  = &pWriter->aNod
212a0 65 57 72 69 74 65 72 5b 69 52 6f 6f 74 5d 3b 0a  eWriter[iRoot];.
212b0 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 62      if( pNode->b
212c0 6c 6f 63 6b 2e 6e 3e 30 20 29 20 62 72 65 61 6b  lock.n>0 ) break
212d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ;.    assert( *p
212e0 52 63 20 7c 7c 20 70 4e 6f 64 65 2d 3e 62 6c 6f  Rc || pNode->blo
212f0 63 6b 2e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  ck.nAlloc==0 );.
21300 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 52 63      assert( *pRc
21310 20 7c 7c 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e   || pNode->key.n
21320 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 20 20  Alloc==0 );.    
21330 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 6f  sqlite3_free(pNo
21340 64 65 2d 3e 62 6c 6f 63 6b 2e 61 29 3b 0a 20 20  de->block.a);.  
21350 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
21360 4e 6f 64 65 2d 3e 6b 65 79 2e 61 29 3b 0a 20 20  Node->key.a);.  
21370 7d 0a 0a 20 20 2f 2a 20 45 6d 70 74 79 20 6f 75  }..  /* Empty ou
21380 74 70 75 74 20 73 65 67 6d 65 6e 74 2e 20 54 68  tput segment. Th
21390 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a  is is a no-op. *
213a0 2f 0a 20 20 69 66 28 20 69 52 6f 6f 74 3c 30 20  /.  if( iRoot<0 
213b0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
213c0 54 68 65 20 65 6e 74 69 72 65 20 6f 75 74 70 75  The entire outpu
213d0 74 20 73 65 67 6d 65 6e 74 20 66 69 74 73 20 6f  t segment fits o
213e0 6e 20 61 20 73 69 6e 67 6c 65 20 6e 6f 64 65 2e  n a single node.
213f0 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20   Normally, this 
21400 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 65 20 6e  means.  ** the n
21410 6f 64 65 20 77 6f 75 6c 64 20 62 65 20 73 74 6f  ode would be sto
21420 72 65 64 20 61 73 20 61 20 62 6c 6f 62 20 69 6e  red as a blob in
21430 20 74 68 65 20 22 72 6f 6f 74 22 20 63 6f 6c 75   the "root" colu
21440 6d 6e 20 6f 66 20 74 68 65 20 25 5f 73 65 67 64  mn of the %_segd
21450 69 72 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 48  ir.  ** table. H
21460 6f 77 65 76 65 72 2c 20 74 68 69 73 20 69 73 20  owever, this is 
21470 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 20 69 6e  not permitted in
21480 20 74 68 69 73 20 63 61 73 65 2e 20 54 68 65 20   this case. The 
21490 70 72 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 20  problem is that 
214a0 0a 20 20 2a 2a 20 73 70 61 63 65 20 68 61 73 20  .  ** space has 
214b0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 73  already been res
214c0 65 72 76 65 64 20 69 6e 20 74 68 65 20 25 5f 73  erved in the %_s
214d0 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 2c 20 61  egments table, a
214e0 6e 64 20 73 6f 20 74 68 65 20 0a 20 20 2a 2a 20  nd so the .  ** 
214f0 73 74 61 72 74 5f 62 6c 6f 63 6b 20 61 6e 64 20  start_block and 
21500 65 6e 64 5f 62 6c 6f 63 6b 20 66 69 65 6c 64 73  end_block fields
21510 20 6f 66 20 74 68 65 20 25 5f 73 65 67 64 69 72   of the %_segdir
21520 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 70   table must be p
21530 6f 70 75 6c 61 74 65 64 2e 20 0a 20 20 2a 2a 20  opulated. .  ** 
21540 41 6e 64 2c 20 62 79 20 64 65 73 69 67 6e 20 6f  And, by design o
21550 72 20 62 79 20 61 63 63 69 64 65 6e 74 2c 20 72  r by accident, r
21560 65 6c 65 61 73 65 64 20 76 65 72 73 69 6f 6e 73  eleased versions
21570 20 6f 66 20 46 54 53 20 63 61 6e 6e 6f 74 20 68   of FTS cannot h
21580 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 73 65 67 6d  andle .  ** segm
21590 65 6e 74 73 20 74 68 61 74 20 66 69 74 20 65 6e  ents that fit en
215a0 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 72 6f  tirely on the ro
215b0 6f 74 20 6e 6f 64 65 20 77 69 74 68 20 73 74 61  ot node with sta
215c0 72 74 5f 62 6c 6f 63 6b 21 3d 30 2e 0a 20 20 2a  rt_block!=0..  *
215d0 2a 0a 20 20 2a 2a 20 49 6e 73 74 65 61 64 2c 20  *.  ** Instead, 
215e0 63 72 65 61 74 65 20 61 20 73 79 6e 74 68 65 74  create a synthet
215f0 69 63 20 72 6f 6f 74 20 6e 6f 64 65 20 74 68 61  ic root node tha
21600 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 74 68 69  t contains nothi
21610 6e 67 20 62 75 74 20 61 20 0a 20 20 2a 2a 20 70  ng but a .  ** p
21620 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 69  ointer to the si
21630 6e 67 6c 65 20 63 6f 6e 74 65 6e 74 20 6e 6f 64  ngle content nod
21640 65 2e 20 53 6f 20 74 68 61 74 20 74 68 65 20 73  e. So that the s
21650 65 67 6d 65 6e 74 20 63 6f 6e 73 69 73 74 73 20  egment consists 
21660 6f 66 20 61 0a 20 20 2a 2a 20 73 69 6e 67 6c 65  of a.  ** single
21670 20 6c 65 61 66 20 61 6e 64 20 61 20 73 69 6e 67   leaf and a sing
21680 6c 65 20 69 6e 74 65 72 69 6f 72 20 28 72 6f 6f  le interior (roo
21690 74 29 20 6e 6f 64 65 2e 0a 20 20 2a 2a 0a 20 20  t) node..  **.  
216a0 2a 2a 20 54 6f 64 6f 3a 20 42 65 74 74 65 72 20  ** Todo: Better 
216b0 6d 69 67 68 74 20 62 65 20 74 6f 20 64 65 66 65  might be to defe
216c0 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 70 61  r allocating spa
216d0 63 65 20 69 6e 20 74 68 65 20 25 5f 73 65 67 6d  ce in the %_segm
216e0 65 6e 74 73 20 0a 20 20 2a 2a 20 74 61 62 6c 65  ents .  ** table
216f0 20 75 6e 74 69 6c 20 77 65 20 61 72 65 20 73 75   until we are su
21700 72 65 20 69 74 20 69 73 20 6e 65 65 64 65 64 2e  re it is needed.
21710 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 52 6f 6f  .  */.  if( iRoo
21720 74 3d 3d 30 20 29 7b 0a 20 20 20 20 42 6c 6f 62  t==0 ){.    Blob
21730 20 2a 70 42 6c 6f 63 6b 20 3d 20 26 70 57 72 69   *pBlock = &pWri
21740 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72  ter->aNodeWriter
21750 5b 31 5d 2e 62 6c 6f 63 6b 3b 0a 20 20 20 20 62  [1].block;.    b
21760 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28 70 42  lobGrowBuffer(pB
21770 6c 6f 63 6b 2c 20 31 20 2b 20 46 54 53 33 5f 56  lock, 1 + FTS3_V
21780 41 52 49 4e 54 5f 4d 41 58 2c 20 26 72 63 29 3b  ARINT_MAX, &rc);
21790 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
217a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
217b0 70 42 6c 6f 63 6b 2d 3e 61 5b 30 5d 20 3d 20 30  pBlock->a[0] = 0
217c0 78 30 31 3b 0a 20 20 20 20 20 20 70 42 6c 6f 63  x01;.      pBloc
217d0 6b 2d 3e 6e 20 3d 20 31 20 2b 20 73 71 6c 69 74  k->n = 1 + sqlit
217e0 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28  e3Fts3PutVarint(
217f0 0a 20 20 20 20 20 20 20 20 20 20 26 70 42 6c 6f  .          &pBlo
21800 63 6b 2d 3e 61 5b 31 5d 2c 20 70 57 72 69 74 65  ck->a[1], pWrite
21810 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 30  r->aNodeWriter[0
21820 5d 2e 69 42 6c 6f 63 6b 0a 20 20 20 20 20 20 29  ].iBlock.      )
21830 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 52 6f 6f  ;.    }.    iRoo
21840 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 52 6f  t = 1;.  }.  pRo
21850 6f 74 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  ot = &pWriter->a
21860 4e 6f 64 65 57 72 69 74 65 72 5b 69 52 6f 6f 74  NodeWriter[iRoot
21870 5d 3b 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20 61  ];..  /* Flush a
21880 6c 6c 20 63 75 72 72 65 6e 74 6c 79 20 6f 75 74  ll currently out
21890 73 74 61 6e 64 69 6e 67 20 6e 6f 64 65 73 20 74  standing nodes t
218a0 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 66 6f 72  o disk. */.  for
218b0 28 69 3d 30 3b 20 69 3c 69 52 6f 6f 74 3b 20 69  (i=0; i<iRoot; i
218c0 2b 2b 29 7b 0a 20 20 20 20 4e 6f 64 65 57 72 69  ++){.    NodeWri
218d0 74 65 72 20 2a 70 4e 6f 64 65 20 3d 20 26 70 57  ter *pNode = &pW
218e0 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74  riter->aNodeWrit
218f0 65 72 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  er[i];.    if( p
21900 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 3e 30 20  Node->block.n>0 
21910 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
21920 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
21930 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28  ts3WriteSegment(
21940 70 2c 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b  p, pNode->iBlock
21950 2c 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61  , pNode->block.a
21960 2c 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e  , pNode->block.n
21970 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
21980 69 74 65 33 5f 66 72 65 65 28 70 4e 6f 64 65 2d  ite3_free(pNode-
21990 3e 62 6c 6f 63 6b 2e 61 29 3b 0a 20 20 20 20 73  >block.a);.    s
219a0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 6f 64  qlite3_free(pNod
219b0 65 2d 3e 6b 65 79 2e 61 29 3b 0a 20 20 7d 0a 0a  e->key.a);.  }..
219c0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 25    /* Write the %
219d0 5f 73 65 67 64 69 72 20 72 65 63 6f 72 64 2e 20  _segdir record. 
219e0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
219f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
21a00 20 3d 20 66 74 73 33 57 72 69 74 65 53 65 67 64   = fts3WriteSegd
21a10 69 72 28 70 2c 20 0a 20 20 20 20 20 20 20 20 70  ir(p, .        p
21a20 57 72 69 74 65 72 2d 3e 69 41 62 73 4c 65 76 65  Writer->iAbsLeve
21a30 6c 2b 31 2c 20 20 20 20 20 20 20 20 20 20 20 20  l+1,            
21a40 20 20 20 2f 2a 20 6c 65 76 65 6c 20 2a 2f 0a 20     /* level */. 
21a50 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e         pWriter->
21a60 69 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  iIdx,           
21a70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 64             /* id
21a80 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57 72  x */.        pWr
21a90 69 74 65 72 2d 3e 69 53 74 61 72 74 2c 20 20 20  iter->iStart,   
21aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ab0 20 2f 2a 20 73 74 61 72 74 5f 62 6c 6f 63 6b 20   /* start_block 
21ac0 2a 2f 0a 20 20 20 20 20 20 20 20 70 57 72 69 74  */.        pWrit
21ad0 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b  er->aNodeWriter[
21ae0 30 5d 2e 69 42 6c 6f 63 6b 2c 20 20 20 20 20 2f  0].iBlock,     /
21af0 2a 20 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f  * leaves_end_blo
21b00 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57  ck */.        pW
21b10 72 69 74 65 72 2d 3e 69 45 6e 64 2c 20 20 20 20  riter->iEnd,    
21b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b30 20 20 2f 2a 20 65 6e 64 5f 62 6c 6f 63 6b 20 2a    /* end_block *
21b40 2f 0a 20 20 20 20 20 20 20 20 28 70 57 72 69 74  /.        (pWrit
21b50 65 72 2d 3e 62 4e 6f 4c 65 61 66 44 61 74 61 3d  er->bNoLeafData=
21b60 3d 30 20 3f 20 70 57 72 69 74 65 72 2d 3e 6e 4c  =0 ? pWriter->nL
21b70 65 61 66 44 61 74 61 20 3a 20 30 29 2c 20 20 20  eafData : 0),   
21b80 2f 2a 20 65 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a  /* end_block */.
21b90 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 62          pRoot->b
21ba0 6c 6f 63 6b 2e 61 2c 20 70 52 6f 6f 74 2d 3e 62  lock.a, pRoot->b
21bb0 6c 6f 63 6b 2e 6e 20 20 20 20 20 20 2f 2a 20 72  lock.n      /* r
21bc0 6f 6f 74 20 2a 2f 0a 20 20 20 20 29 3b 0a 20 20  oot */.    );.  
21bd0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
21be0 28 70 52 6f 6f 74 2d 3e 62 6c 6f 63 6b 2e 61 29  (pRoot->block.a)
21bf0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
21c00 28 70 52 6f 6f 74 2d 3e 6b 65 79 2e 61 29 3b 0a  (pRoot->key.a);.
21c10 0a 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 7d 0a  .  *pRc = rc;.}.
21c20 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
21c30 68 65 20 74 65 72 6d 20 69 6e 20 62 75 66 66 65  he term in buffe
21c40 72 20 7a 4c 68 73 20 28 73 69 7a 65 20 69 6e 20  r zLhs (size in 
21c50 62 79 74 65 73 20 6e 4c 68 73 29 20 77 69 74 68  bytes nLhs) with
21c60 20 74 68 61 74 20 69 6e 0a 2a 2a 20 7a 52 68 73   that in.** zRhs
21c70 20 28 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20   (size in bytes 
21c80 6e 52 68 73 29 20 75 73 69 6e 67 20 6d 65 6d 63  nRhs) using memc
21c90 6d 70 2e 20 49 66 20 6f 6e 65 20 74 65 72 6d 20  mp. If one term 
21ca0 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 0a 2a  is a prefix of.*
21cb0 2a 20 74 68 65 20 6f 74 68 65 72 2c 20 69 74 20  * the other, it 
21cc0 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  is considered to
21cd0 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   be smaller than
21ce0 20 74 68 65 20 6f 74 68 65 72 2e 0a 2a 2a 0a 2a   the other..**.*
21cf0 2a 20 52 65 74 75 72 6e 20 2d 76 65 20 69 66 20  * Return -ve if 
21d00 7a 4c 68 73 20 69 73 20 73 6d 61 6c 6c 65 72 20  zLhs is smaller 
21d10 74 68 61 6e 20 7a 52 68 73 2c 20 30 20 69 66 20  than zRhs, 0 if 
21d20 69 74 20 69 73 20 65 71 75 61 6c 2c 20 6f 72 20  it is equal, or 
21d30 2b 76 65 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  +ve.** if it is 
21d40 67 72 65 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  greater..*/.stat
21d50 69 63 20 69 6e 74 20 66 74 73 33 54 65 72 6d 43  ic int fts3TermC
21d60 6d 70 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  mp(.  const char
21d70 20 2a 7a 4c 68 73 2c 20 69 6e 74 20 6e 4c 68 73   *zLhs, int nLhs
21d80 2c 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20  ,     /* LHS of 
21d90 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20  comparison */.  
21da0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 68 73  const char *zRhs
21db0 2c 20 69 6e 74 20 6e 52 68 73 20 20 20 20 20 20  , int nRhs      
21dc0 2f 2a 20 52 48 53 20 6f 66 20 63 6f 6d 70 61 72  /* RHS of compar
21dd0 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ison */.){.  int
21de0 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 4c 68 73   nCmp = MIN(nLhs
21df0 2c 20 6e 52 68 73 29 3b 0a 20 20 69 6e 74 20 72  , nRhs);.  int r
21e00 65 73 3b 0a 0a 20 20 72 65 73 20 3d 20 6d 65 6d  es;..  res = mem
21e10 63 6d 70 28 7a 4c 68 73 2c 20 7a 52 68 73 2c 20  cmp(zLhs, zRhs, 
21e20 6e 43 6d 70 29 3b 0a 20 20 69 66 28 20 72 65 73  nCmp);.  if( res
21e30 3d 3d 30 20 29 20 72 65 73 20 3d 20 6e 4c 68 73  ==0 ) res = nLhs
21e40 20 2d 20 6e 52 68 73 3b 0a 0a 20 20 72 65 74 75   - nRhs;..  retu
21e50 72 6e 20 72 65 73 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  rn res;.}.../*.*
21e60 2a 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69  * Query to see i
21e70 66 20 74 68 65 20 65 6e 74 72 79 20 69 6e 20 74  f the entry in t
21e80 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61  he %_segments ta
21e90 62 6c 65 20 77 69 74 68 20 62 6c 6f 63 6b 69 64  ble with blockid
21ea0 20 69 45 6e 64 20 69 73 20 0a 2a 2a 20 4e 55 4c   iEnd is .** NUL
21eb0 4c 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  L. If no error o
21ec0 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 65 6e  ccurs and the en
21ed0 74 72 79 20 69 73 20 4e 55 4c 4c 2c 20 73 65 74  try is NULL, set
21ee0 20 2a 70 62 52 65 73 20 31 20 62 65 66 6f 72 65   *pbRes 1 before
21ef0 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 20 4f  .** returning. O
21f00 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 2a 70  therwise, set *p
21f10 62 52 65 73 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a  bRes to 0. .**.*
21f20 2a 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f  * Or, if an erro
21f30 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 71  r occurs while q
21f40 75 65 72 79 69 6e 67 20 74 68 65 20 64 61 74 61  uerying the data
21f50 62 61 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  base, return an 
21f60 53 51 4c 69 74 65 20 0a 2a 2a 20 65 72 72 6f 72  SQLite .** error
21f70 20 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c   code. The final
21f80 20 76 61 6c 75 65 20 6f 66 20 2a 70 62 52 65 73   value of *pbRes
21f90 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e   is undefined in
21fa0 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
21fb0 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74  * This is used t
21fc0 6f 20 74 65 73 74 20 69 66 20 61 20 73 65 67 6d  o test if a segm
21fd0 65 6e 74 20 69 73 20 61 6e 20 22 61 70 70 65 6e  ent is an "appen
21fe0 64 61 62 6c 65 22 20 73 65 67 6d 65 6e 74 2e 20  dable" segment. 
21ff0 49 66 20 69 74 0a 2a 2a 20 69 73 2c 20 74 68 65  If it.** is, the
22000 6e 20 61 20 4e 55 4c 4c 20 65 6e 74 72 79 20 68  n a NULL entry h
22010 61 73 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64  as been inserted
22020 20 69 6e 74 6f 20 74 68 65 20 25 5f 73 65 67 6d   into the %_segm
22030 65 6e 74 73 20 74 61 62 6c 65 0a 2a 2a 20 77 69  ents table.** wi
22040 74 68 20 62 6c 6f 63 6b 69 64 20 25 5f 73 65 67  th blockid %_seg
22050 64 69 72 2e 65 6e 64 5f 62 6c 6f 63 6b 2e 0a 2a  dir.end_block..*
22060 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
22070 33 49 73 41 70 70 65 6e 64 61 62 6c 65 28 46 74  3IsAppendable(Ft
22080 73 33 54 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69  s3Table *p, sqli
22090 74 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 2c 20  te3_int64 iEnd, 
220a0 69 6e 74 20 2a 70 62 52 65 73 29 7b 0a 20 20 69  int *pbRes){.  i
220b0 6e 74 20 62 52 65 73 20 3d 20 30 3b 20 20 20 20  nt bRes = 0;    
220c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
220d0 2a 20 52 65 73 75 6c 74 20 74 6f 20 73 65 74 20  * Result to set 
220e0 2a 70 62 52 65 73 20 74 6f 20 2a 2f 0a 20 20 73  *pbRes to */.  s
220f0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 43 68  qlite3_stmt *pCh
22100 65 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  eck = 0;       /
22110 2a 20 53 74 61 74 65 6d 65 6e 74 20 74 6f 20 71  * Statement to q
22120 75 65 72 79 20 64 61 74 61 62 61 73 65 20 77 69  uery database wi
22130 74 68 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  th */.  int rc; 
22140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22150 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
22160 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 72 63 20  n code */..  rc 
22170 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
22180 20 53 51 4c 5f 53 45 47 4d 45 4e 54 5f 49 53 5f   SQL_SEGMENT_IS_
22190 41 50 50 45 4e 44 41 42 4c 45 2c 20 26 70 43 68  APPENDABLE, &pCh
221a0 65 63 6b 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  eck, 0);.  if( r
221b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
221c0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
221d0 5f 69 6e 74 36 34 28 70 43 68 65 63 6b 2c 20 31  _int64(pCheck, 1
221e0 2c 20 69 45 6e 64 29 3b 0a 20 20 20 20 69 66 28  , iEnd);.    if(
221f0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
22200 69 74 65 33 5f 73 74 65 70 28 70 43 68 65 63 6b  ite3_step(pCheck
22210 29 20 29 20 62 52 65 73 20 3d 20 31 3b 0a 20 20  ) ) bRes = 1;.  
22220 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
22230 65 73 65 74 28 70 43 68 65 63 6b 29 3b 0a 20 20  eset(pCheck);.  
22240 7d 0a 20 20 0a 20 20 2a 70 62 52 65 73 20 3d 20  }.  .  *pbRes = 
22250 62 52 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 72  bRes;.  return r
22260 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
22270 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
22280 6c 65 64 20 77 68 65 6e 20 69 6e 69 74 69 61 6c  led when initial
22290 69 7a 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65  izing an increme
222a0 6e 74 61 6c 2d 6d 65 72 67 65 20 6f 70 65 72 61  ntal-merge opera
222b0 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 63 68 65 63  tion..** It chec
222c0 6b 73 20 69 66 20 74 68 65 20 65 78 69 73 74 69  ks if the existi
222d0 6e 67 20 73 65 67 6d 65 6e 74 20 77 69 74 68 20  ng segment with 
222e0 69 6e 64 65 78 20 76 61 6c 75 65 20 69 49 64 78  index value iIdx
222f0 20 61 74 20 61 62 73 6f 6c 75 74 65 20 6c 65 76   at absolute lev
22300 65 6c 20 0a 2a 2a 20 28 69 41 62 73 4c 65 76 65  el .** (iAbsLeve
22310 6c 2b 31 29 20 63 61 6e 20 62 65 20 61 70 70 65  l+1) can be appe
22320 6e 64 65 64 20 74 6f 20 62 79 20 74 68 65 20 69  nded to by the i
22330 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65  ncremental merge
22340 2e 20 49 66 20 69 74 20 63 61 6e 2c 20 74 68 65  . If it can, the
22350 0a 2a 2a 20 6d 65 72 67 65 2d 77 72 69 74 65 72  .** merge-writer
22360 20 6f 62 6a 65 63 74 20 2a 70 57 72 69 74 65 72   object *pWriter
22370 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
22380 74 6f 20 77 72 69 74 65 20 74 6f 20 69 74 2e 0a  to write to it..
22390 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e  **.** An existin
223a0 67 20 73 65 67 6d 65 6e 74 20 63 61 6e 20 62 65  g segment can be
223b0 20 61 70 70 65 6e 64 65 64 20 74 6f 20 62 79 20   appended to by 
223c0 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d  an incremental m
223d0 65 72 67 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  erge if:.**.**  
223e0 20 2a 20 49 74 20 77 61 73 20 69 6e 69 74 69 61   * It was initia
223f0 6c 6c 79 20 63 72 65 61 74 65 64 20 61 73 20 61  lly created as a
22400 6e 20 61 70 70 65 6e 64 61 62 6c 65 20 73 65 67  n appendable seg
22410 6d 65 6e 74 20 28 77 69 74 68 20 61 6c 6c 20 72  ment (with all r
22420 65 71 75 69 72 65 64 0a 2a 2a 20 20 20 20 20 73  equired.**     s
22430 70 61 63 65 20 70 72 65 2d 61 6c 6c 6f 63 61 74  pace pre-allocat
22440 65 64 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ed), and.**.**  
22450 20 2a 20 54 68 65 20 66 69 72 73 74 20 6b 65 79   * The first key
22460 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 69   read from the i
22470 6e 70 75 74 20 28 61 72 67 75 6d 65 6e 74 73 20  nput (arguments 
22480 7a 4b 65 79 20 61 6e 64 20 6e 4b 65 79 29 20 69  zKey and nKey) i
22490 73 20 0a 2a 2a 20 20 20 20 20 67 72 65 61 74 65  s .**     greate
224a0 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65  r than the large
224b0 73 74 20 6b 65 79 20 63 75 72 72 65 6e 74 6c 79  st key currently
224c0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70   stored in the p
224d0 6f 74 65 6e 74 69 61 6c 0a 2a 2a 20 20 20 20 20  otential.**     
224e0 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 2e 0a  output segment..
224f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
22500 73 33 49 6e 63 72 6d 65 72 67 65 4c 6f 61 64 28  s3IncrmergeLoad(
22510 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
22520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22530 20 20 20 2f 2a 20 46 74 73 33 20 74 61 62 6c 65     /* Fts3 table
22540 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c   handle */.  sql
22550 69 74 65 33 5f 69 6e 74 36 34 20 69 41 62 73 4c  ite3_int64 iAbsL
22560 65 76 65 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  evel,        /* 
22570 41 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 6f  Absolute level o
22580 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73  f input segments
22590 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20   */.  int iIdx, 
225a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225b0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
225c0 66 20 63 61 6e 64 69 64 61 74 65 20 6f 75 74 70  f candidate outp
225d0 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ut segment */.  
225e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79  const char *zKey
225f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22600 2f 2a 20 46 69 72 73 74 20 6b 65 79 20 74 6f 20  /* First key to 
22610 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  write */.  int n
22620 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
22630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
22640 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
22650 20 6e 4b 65 79 20 2a 2f 0a 20 20 49 6e 63 72 6d   nKey */.  Incrm
22660 65 72 67 65 57 72 69 74 65 72 20 2a 70 57 72 69  ergeWriter *pWri
22670 74 65 72 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ter        /* Po
22680 70 75 6c 61 74 65 20 74 68 69 73 20 6f 62 6a 65  pulate this obje
22690 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ct */.){.  int r
226a0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
226b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
226c0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
226d0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65  qlite3_stmt *pSe
226e0 6c 65 63 74 20 3d 20 30 3b 20 20 20 20 20 20 2f  lect = 0;      /
226f0 2a 20 53 45 4c 45 43 54 20 74 6f 20 72 65 61 64  * SELECT to read
22700 20 25 5f 73 65 67 64 69 72 20 65 6e 74 72 79 20   %_segdir entry 
22710 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53  */..  rc = fts3S
22720 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45  qlStmt(p, SQL_SE
22730 4c 45 43 54 5f 53 45 47 44 49 52 2c 20 26 70 53  LECT_SEGDIR, &pS
22740 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28  elect, 0);.  if(
22750 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22760 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
22770 74 36 34 20 69 53 74 61 72 74 20 3d 20 30 3b 20  t64 iStart = 0; 
22780 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
22790 25 5f 73 65 67 64 69 72 2e 73 74 61 72 74 5f 62  %_segdir.start_b
227a0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 73 71 6c 69  lock */.    sqli
227b0 74 65 33 5f 69 6e 74 36 34 20 69 4c 65 61 66 45  te3_int64 iLeafE
227c0 6e 64 20 3d 20 30 3b 20 20 20 2f 2a 20 56 61 6c  nd = 0;   /* Val
227d0 75 65 20 6f 66 20 25 5f 73 65 67 64 69 72 2e 6c  ue of %_segdir.l
227e0 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20  eaves_end_block 
227f0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  */.    sqlite3_i
22800 6e 74 36 34 20 69 45 6e 64 20 3d 20 30 3b 20 20  nt64 iEnd = 0;  
22810 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
22820 20 25 5f 73 65 67 64 69 72 2e 65 6e 64 5f 62 6c   %_segdir.end_bl
22830 6f 63 6b 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ock */.    const
22840 20 63 68 61 72 20 2a 61 52 6f 6f 74 20 3d 20 30   char *aRoot = 0
22850 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ;        /* Poin
22860 74 65 72 20 74 6f 20 25 5f 73 65 67 64 69 72 2e  ter to %_segdir.
22870 72 6f 6f 74 20 62 75 66 66 65 72 20 2a 2f 0a 20  root buffer */. 
22880 20 20 20 69 6e 74 20 6e 52 6f 6f 74 20 3d 20 30     int nRoot = 0
22890 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
228a0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 52 6f 6f   /* Size of aRoo
228b0 74 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  t[] in bytes */.
228c0 20 20 20 20 69 6e 74 20 72 63 32 3b 20 20 20 20      int rc2;    
228d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228e0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
228f0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 72 65   from sqlite3_re
22900 73 65 74 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74  set() */.    int
22910 20 62 41 70 70 65 6e 64 61 62 6c 65 20 3d 20 30   bAppendable = 0
22920 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ;          /* Se
22930 74 20 74 6f 20 74 72 75 65 20 69 66 20 73 65 67  t to true if seg
22940 6d 65 6e 74 20 69 73 20 61 70 70 65 6e 64 61 62  ment is appendab
22950 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65  le */..    /* Re
22960 61 64 20 74 68 65 20 25 5f 73 65 67 64 69 72 20  ad the %_segdir 
22970 65 6e 74 72 79 20 66 6f 72 20 69 6e 64 65 78 20  entry for index 
22980 69 49 64 78 20 61 62 73 6f 6c 75 74 65 20 6c 65  iIdx absolute le
22990 76 65 6c 20 28 69 41 62 73 4c 65 76 65 6c 2b 31  vel (iAbsLevel+1
229a0 29 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  ) */.    sqlite3
229b0 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 65 6c  _bind_int64(pSel
229c0 65 63 74 2c 20 31 2c 20 69 41 62 73 4c 65 76 65  ect, 1, iAbsLeve
229d0 6c 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l+1);.    sqlite
229e0 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 65 6c 65  3_bind_int(pSele
229f0 63 74 2c 20 32 2c 20 69 49 64 78 29 3b 0a 20 20  ct, 2, iIdx);.  
22a00 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
22a10 65 70 28 70 53 65 6c 65 63 74 29 3d 3d 53 51 4c  ep(pSelect)==SQL
22a20 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
22a30 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
22a40 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
22a50 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20 20 20  Select, 1);.    
22a60 20 20 69 4c 65 61 66 45 6e 64 20 3d 20 73 71 6c    iLeafEnd = sql
22a70 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
22a80 34 28 70 53 65 6c 65 63 74 2c 20 32 29 3b 0a 20  4(pSelect, 2);. 
22a90 20 20 20 20 20 66 74 73 33 52 65 61 64 45 6e 64       fts3ReadEnd
22aa0 42 6c 6f 63 6b 46 69 65 6c 64 28 70 53 65 6c 65  BlockField(pSele
22ab0 63 74 2c 20 33 2c 20 26 69 45 6e 64 2c 20 26 70  ct, 3, &iEnd, &p
22ac0 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61 74  Writer->nLeafDat
22ad0 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57  a);.      if( pW
22ae0 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61 74 61  riter->nLeafData
22af0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57  <0 ){.        pW
22b00 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61 74 61  riter->nLeafData
22b10 20 3d 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61   = pWriter->nLea
22b20 66 44 61 74 61 20 2a 20 2d 31 3b 0a 20 20 20 20  fData * -1;.    
22b30 20 20 7d 0a 20 20 20 20 20 20 70 57 72 69 74 65    }.      pWrite
22b40 72 2d 3e 62 4e 6f 4c 65 61 66 44 61 74 61 20 3d  r->bNoLeafData =
22b50 20 28 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66   (pWriter->nLeaf
22b60 44 61 74 61 3d 3d 30 29 3b 0a 20 20 20 20 20 20  Data==0);.      
22b70 6e 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f  nRoot = sqlite3_
22b80 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 65  column_bytes(pSe
22b90 6c 65 63 74 2c 20 34 29 3b 0a 20 20 20 20 20 20  lect, 4);.      
22ba0 61 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f  aRoot = sqlite3_
22bb0 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 65 6c  column_blob(pSel
22bc0 65 63 74 2c 20 34 29 3b 0a 20 20 20 20 7d 65 6c  ect, 4);.    }el
22bd0 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
22be0 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
22bf0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 0a 0a  Select);.    }..
22c00 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
22c10 20 74 68 65 20 7a 65 72 6f 2d 6c 65 6e 67 74 68   the zero-length
22c20 20 6d 61 72 6b 65 72 20 69 6e 20 74 68 65 20 25   marker in the %
22c30 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20  _segments table 
22c40 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  */.    rc = fts3
22c50 49 73 41 70 70 65 6e 64 61 62 6c 65 28 70 2c 20  IsAppendable(p, 
22c60 69 45 6e 64 2c 20 26 62 41 70 70 65 6e 64 61 62  iEnd, &bAppendab
22c70 6c 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  le);..    /* Che
22c80 63 6b 20 74 68 61 74 20 7a 4b 65 79 2f 6e 4b 65  ck that zKey/nKe
22c90 79 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  y is larger than
22ca0 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79   the largest key
22cb0 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 2a   the candidate *
22cc0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
22cd0 4c 49 54 45 5f 4f 4b 20 26 26 20 62 41 70 70 65  LITE_OK && bAppe
22ce0 6e 64 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  ndable ){.      
22cf0 63 68 61 72 20 2a 61 4c 65 61 66 20 3d 20 30 3b  char *aLeaf = 0;
22d00 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 65 61 66  .      int nLeaf
22d10 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 72 63 20   = 0;..      rc 
22d20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 52 65 61  = sqlite3Fts3Rea
22d30 64 42 6c 6f 63 6b 28 70 2c 20 69 4c 65 61 66 45  dBlock(p, iLeafE
22d40 6e 64 2c 20 26 61 4c 65 61 66 2c 20 26 6e 4c 65  nd, &aLeaf, &nLe
22d50 61 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  af, 0);.      if
22d60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22d70 29 7b 0a 20 20 20 20 20 20 20 20 4e 6f 64 65 52  ){.        NodeR
22d80 65 61 64 65 72 20 72 65 61 64 65 72 3b 0a 20 20  eader reader;.  
22d90 20 20 20 20 20 20 66 6f 72 28 72 63 20 3d 20 6e        for(rc = n
22da0 6f 64 65 52 65 61 64 65 72 49 6e 69 74 28 26 72  odeReaderInit(&r
22db0 65 61 64 65 72 2c 20 61 4c 65 61 66 2c 20 6e 4c  eader, aLeaf, nL
22dc0 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eaf);.          
22dd0 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
22de0 26 26 20 72 65 61 64 65 72 2e 61 4e 6f 64 65 3b  && reader.aNode;
22df0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
22e00 3d 20 6e 6f 64 65 52 65 61 64 65 72 4e 65 78 74  = nodeReaderNext
22e10 28 26 72 65 61 64 65 72 29 0a 20 20 20 20 20 20  (&reader).      
22e20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61    ){.          a
22e30 73 73 65 72 74 28 20 72 65 61 64 65 72 2e 61 4e  ssert( reader.aN
22e40 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  ode );.        }
22e50 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73  .        if( fts
22e60 33 54 65 72 6d 43 6d 70 28 7a 4b 65 79 2c 20 6e  3TermCmp(zKey, n
22e70 4b 65 79 2c 20 72 65 61 64 65 72 2e 74 65 72 6d  Key, reader.term
22e80 2e 61 2c 20 72 65 61 64 65 72 2e 74 65 72 6d 2e  .a, reader.term.
22e90 6e 29 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  n)<=0 ){.       
22ea0 20 20 20 62 41 70 70 65 6e 64 61 62 6c 65 20 3d     bAppendable =
22eb0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
22ec0 20 20 20 20 20 20 6e 6f 64 65 52 65 61 64 65 72        nodeReader
22ed0 52 65 6c 65 61 73 65 28 26 72 65 61 64 65 72 29  Release(&reader)
22ee0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22ef0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 4c 65  sqlite3_free(aLe
22f00 61 66 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  af);.    }..    
22f10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22f20 4b 20 26 26 20 62 41 70 70 65 6e 64 61 62 6c 65  K && bAppendable
22f30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20   ){.      /* It 
22f40 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  is possible to a
22f50 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 73 65  ppend to this se
22f60 67 6d 65 6e 74 2e 20 53 65 74 20 75 70 20 74 68  gment. Set up th
22f70 65 20 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65  e IncrmergeWrite
22f80 72 0a 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63  r.      ** objec
22f90 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 2a 2f 0a  t to do so.  */.
22fa0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
22fb0 20 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d     int nHeight =
22fc0 20 28 69 6e 74 29 61 52 6f 6f 74 5b 30 5d 3b 0a   (int)aRoot[0];.
22fd0 20 20 20 20 20 20 4e 6f 64 65 57 72 69 74 65 72        NodeWriter
22fe0 20 2a 70 4e 6f 64 65 3b 0a 0a 20 20 20 20 20 20   *pNode;..      
22ff0 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 45 73  pWriter->nLeafEs
23000 74 20 3d 20 28 69 6e 74 29 28 28 69 45 6e 64 20  t = (int)((iEnd 
23010 2d 20 69 53 74 61 72 74 29 20 2b 20 31 29 2f 46  - iStart) + 1)/F
23020 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c  TS_MAX_APPENDABL
23030 45 5f 48 45 49 47 48 54 3b 0a 20 20 20 20 20 20  E_HEIGHT;.      
23040 70 57 72 69 74 65 72 2d 3e 69 53 74 61 72 74 20  pWriter->iStart 
23050 3d 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  = iStart;.      
23060 70 57 72 69 74 65 72 2d 3e 69 45 6e 64 20 3d 20  pWriter->iEnd = 
23070 69 45 6e 64 3b 0a 20 20 20 20 20 20 70 57 72 69  iEnd;.      pWri
23080 74 65 72 2d 3e 69 41 62 73 4c 65 76 65 6c 20 3d  ter->iAbsLevel =
23090 20 69 41 62 73 4c 65 76 65 6c 3b 0a 20 20 20 20   iAbsLevel;.    
230a0 20 20 70 57 72 69 74 65 72 2d 3e 69 49 64 78 20    pWriter->iIdx 
230b0 3d 20 69 49 64 78 3b 0a 0a 20 20 20 20 20 20 66  = iIdx;..      f
230c0 6f 72 28 69 3d 6e 48 65 69 67 68 74 2b 31 3b 20  or(i=nHeight+1; 
230d0 69 3c 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44  i<FTS_MAX_APPEND
230e0 41 42 4c 45 5f 48 45 49 47 48 54 3b 20 69 2b 2b  ABLE_HEIGHT; i++
230f0 29 7b 0a 20 20 20 20 20 20 20 20 70 57 72 69 74  ){.        pWrit
23100 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b  er->aNodeWriter[
23110 69 5d 2e 69 42 6c 6f 63 6b 20 3d 20 70 57 72 69  i].iBlock = pWri
23120 74 65 72 2d 3e 69 53 74 61 72 74 20 2b 20 69 2a  ter->iStart + i*
23130 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 45 73  pWriter->nLeafEs
23140 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  t;.      }..    
23150 20 20 70 4e 6f 64 65 20 3d 20 26 70 57 72 69 74    pNode = &pWrit
23160 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b  er->aNodeWriter[
23170 6e 48 65 69 67 68 74 5d 3b 0a 20 20 20 20 20 20  nHeight];.      
23180 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b 20 3d 20  pNode->iBlock = 
23190 70 57 72 69 74 65 72 2d 3e 69 53 74 61 72 74 20  pWriter->iStart 
231a0 2b 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66  + pWriter->nLeaf
231b0 45 73 74 2a 6e 48 65 69 67 68 74 3b 0a 20 20 20  Est*nHeight;.   
231c0 20 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65     blobGrowBuffe
231d0 72 28 26 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2c  r(&pNode->block,
231e0 20 4d 41 58 28 6e 52 6f 6f 74 2c 20 70 2d 3e 6e   MAX(nRoot, p->n
231f0 4e 6f 64 65 53 69 7a 65 29 2c 20 26 72 63 29 3b  NodeSize), &rc);
23200 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
23210 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23220 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 6f 64 65      memcpy(pNode
23230 2d 3e 62 6c 6f 63 6b 2e 61 2c 20 61 52 6f 6f 74  ->block.a, aRoot
23240 2c 20 6e 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20  , nRoot);.      
23250 20 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e    pNode->block.n
23260 20 3d 20 6e 52 6f 6f 74 3b 0a 20 20 20 20 20 20   = nRoot;.      
23270 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 6e  }..      for(i=n
23280 48 65 69 67 68 74 3b 20 69 3e 3d 30 20 26 26 20  Height; i>=0 && 
23290 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
232a0 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 4e 6f 64  --){.        Nod
232b0 65 52 65 61 64 65 72 20 72 65 61 64 65 72 3b 0a  eReader reader;.
232c0 20 20 20 20 20 20 20 20 70 4e 6f 64 65 20 3d 20          pNode = 
232d0 26 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57  &pWriter->aNodeW
232e0 72 69 74 65 72 5b 69 5d 3b 0a 0a 20 20 20 20 20  riter[i];..     
232f0 20 20 20 72 63 20 3d 20 6e 6f 64 65 52 65 61 64     rc = nodeRead
23300 65 72 49 6e 69 74 28 26 72 65 61 64 65 72 2c 20  erInit(&reader, 
23310 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 2c 20  pNode->block.a, 
23320 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 29 3b  pNode->block.n);
23330 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
23340 72 65 61 64 65 72 2e 61 4e 6f 64 65 20 26 26 20  reader.aNode && 
23350 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
23360 72 63 20 3d 20 6e 6f 64 65 52 65 61 64 65 72 4e  rc = nodeReaderN
23370 65 78 74 28 26 72 65 61 64 65 72 29 3b 0a 20 20  ext(&reader);.  
23380 20 20 20 20 20 20 62 6c 6f 62 47 72 6f 77 42 75        blobGrowBu
23390 66 66 65 72 28 26 70 4e 6f 64 65 2d 3e 6b 65 79  ffer(&pNode->key
233a0 2c 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 6e 2c  , reader.term.n,
233b0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69   &rc);.        i
233c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
233d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
233e0 6d 63 70 79 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e  mcpy(pNode->key.
233f0 61 2c 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 61  a, reader.term.a
23400 2c 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 6e 29  , reader.term.n)
23410 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 6f 64  ;.          pNod
23420 65 2d 3e 6b 65 79 2e 6e 20 3d 20 72 65 61 64 65  e->key.n = reade
23430 72 2e 74 65 72 6d 2e 6e 3b 0a 20 20 20 20 20 20  r.term.n;.      
23440 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20      if( i>0 ){. 
23450 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
23460 2a 61 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20  *aBlock = 0;.   
23470 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 6c           int nBl
23480 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ock = 0;.       
23490 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 26 70 57       pNode = &pW
234a0 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74  riter->aNodeWrit
234b0 65 72 5b 69 2d 31 5d 3b 0a 20 20 20 20 20 20 20  er[i-1];.       
234c0 20 20 20 20 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f       pNode->iBlo
234d0 63 6b 20 3d 20 72 65 61 64 65 72 2e 69 43 68 69  ck = reader.iChi
234e0 6c 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ld;.            
234f0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
23500 52 65 61 64 42 6c 6f 63 6b 28 70 2c 20 72 65 61  ReadBlock(p, rea
23510 64 65 72 2e 69 43 68 69 6c 64 2c 20 26 61 42 6c  der.iChild, &aBl
23520 6f 63 6b 2c 20 26 6e 42 6c 6f 63 6b 2c 20 30 29  ock, &nBlock, 0)
23530 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6c  ;.            bl
23540 6f 62 47 72 6f 77 42 75 66 66 65 72 28 26 70 4e  obGrowBuffer(&pN
23550 6f 64 65 2d 3e 62 6c 6f 63 6b 2c 20 4d 41 58 28  ode->block, MAX(
23560 6e 42 6c 6f 63 6b 2c 20 70 2d 3e 6e 4e 6f 64 65  nBlock, p->nNode
23570 53 69 7a 65 29 2c 20 26 72 63 29 3b 0a 20 20 20  Size), &rc);.   
23580 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
23590 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
235a0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
235b0 70 79 28 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e  py(pNode->block.
235c0 61 2c 20 61 42 6c 6f 63 6b 2c 20 6e 42 6c 6f 63  a, aBlock, nBloc
235d0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
235e0 20 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e    pNode->block.n
235f0 20 3d 20 6e 42 6c 6f 63 6b 3b 0a 20 20 20 20 20   = nBlock;.     
23600 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23610 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
23620 65 28 61 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20  e(aBlock);.     
23630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
23640 0a 20 20 20 20 20 20 20 20 6e 6f 64 65 52 65 61  .        nodeRea
23650 64 65 72 52 65 6c 65 61 73 65 28 26 72 65 61 64  derRelease(&read
23660 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
23670 20 7d 0a 0a 20 20 20 20 72 63 32 20 3d 20 73 71   }..    rc2 = sq
23680 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 65 6c  lite3_reset(pSel
23690 65 63 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ect);.    if( rc
236a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
236b0 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 72   = rc2;.  }..  r
236c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
236d0 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  ** Determine the
236e0 20 6c 61 72 67 65 73 74 20 73 65 67 6d 65 6e 74   largest segment
236f0 20 69 6e 64 65 78 20 76 61 6c 75 65 20 74 68 61   index value tha
23700 74 20 65 78 69 73 74 73 20 77 69 74 68 69 6e 20  t exists within 
23710 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 6c 65 76 65  absolute.** leve
23720 6c 20 69 41 62 73 4c 65 76 65 6c 2b 31 2e 20 49  l iAbsLevel+1. I
23730 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
23740 73 2c 20 73 65 74 20 2a 70 69 49 64 78 20 74 6f  s, set *piIdx to
23750 20 74 68 69 73 20 76 61 6c 75 65 20 70 6c 75 73   this value plus
23760 0a 2a 2a 20 6f 6e 65 20 62 65 66 6f 72 65 20 72  .** one before r
23770 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
23780 4f 4b 2e 20 4f 72 2c 20 69 66 20 74 68 65 72 65  OK. Or, if there
23790 20 61 72 65 20 6e 6f 20 73 65 67 6d 65 6e 74 73   are no segments
237a0 20 61 74 20 61 6c 6c 20 0a 2a 2a 20 77 69 74 68   at all .** with
237b0 69 6e 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76  in level iAbsLev
237c0 65 6c 2c 20 73 65 74 20 2a 70 69 49 64 78 20 74  el, set *piIdx t
237d0 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66  o zero..**.** If
237e0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
237f0 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  , return an SQLi
23800 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54  te error code. T
23810 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f  he final value o
23820 66 0a 2a 2a 20 2a 70 69 49 64 78 20 69 73 20 75  f.** *piIdx is u
23830 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73  ndefined in this
23840 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   case..*/.static
23850 20 69 6e 74 20 66 74 73 33 49 6e 63 72 6d 65 72   int fts3Incrmer
23860 67 65 4f 75 74 70 75 74 49 64 78 28 20 0a 20 20  geOutputIdx( .  
23870 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
23880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23890 2f 2a 20 46 54 53 20 54 61 62 6c 65 20 68 61 6e  /* FTS Table han
238a0 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dle */.  sqlite3
238b0 5f 69 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c  _int64 iAbsLevel
238c0 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f  ,        /* Abso
238d0 6c 75 74 65 20 69 6e 64 65 78 20 6f 66 20 69 6e  lute index of in
238e0 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  put segments */.
238f0 20 20 69 6e 74 20 2a 70 69 49 64 78 20 20 20 20    int *piIdx    
23900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23910 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 66    /* OUT: Next f
23920 72 65 65 20 69 6e 64 65 78 20 61 74 20 69 41 62  ree index at iAb
23930 73 4c 65 76 65 6c 2b 31 20 2a 2f 0a 29 7b 0a 20  sLevel+1 */.){. 
23940 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
23950 65 33 5f 73 74 6d 74 20 2a 70 4f 75 74 70 75 74  e3_stmt *pOutput
23960 49 64 78 20 3d 20 30 3b 20 20 20 2f 2a 20 53 51  Idx = 0;   /* SQ
23970 4c 20 75 73 65 64 20 74 6f 20 66 69 6e 64 20 6f  L used to find o
23980 75 74 70 75 74 20 69 6e 64 65 78 20 2a 2f 0a 0a  utput index */..
23990 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
239a0 6d 74 28 70 2c 20 53 51 4c 5f 4e 45 58 54 5f 53  mt(p, SQL_NEXT_S
239b0 45 47 4d 45 4e 54 5f 49 4e 44 45 58 2c 20 26 70  EGMENT_INDEX, &p
239c0 4f 75 74 70 75 74 49 64 78 2c 20 30 29 3b 0a 20  OutputIdx, 0);. 
239d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
239e0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
239f0 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 4f 75  3_bind_int64(pOu
23a00 74 70 75 74 49 64 78 2c 20 31 2c 20 69 41 62 73  tputIdx, 1, iAbs
23a10 4c 65 76 65 6c 2b 31 29 3b 0a 20 20 20 20 73 71  Level+1);.    sq
23a20 6c 69 74 65 33 5f 73 74 65 70 28 70 4f 75 74 70  lite3_step(pOutp
23a30 75 74 49 64 78 29 3b 0a 20 20 20 20 2a 70 69 49  utIdx);.    *piI
23a40 64 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  dx = sqlite3_col
23a50 75 6d 6e 5f 69 6e 74 28 70 4f 75 74 70 75 74 49  umn_int(pOutputI
23a60 64 78 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d  dx, 0);.    rc =
23a70 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
23a80 4f 75 74 70 75 74 49 64 78 29 3b 0a 20 20 7d 0a  OutputIdx);.  }.
23a90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
23aa0 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ./* .** Allocate
23ab0 20 61 6e 20 61 70 70 65 6e 64 61 62 6c 65 20 6f   an appendable o
23ac0 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 6f 6e  utput segment on
23ad0 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20   absolute level 
23ae0 69 41 62 73 4c 65 76 65 6c 2b 31 0a 2a 2a 20 77  iAbsLevel+1.** w
23af0 69 74 68 20 69 64 78 20 76 61 6c 75 65 20 69 49  ith idx value iI
23b00 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  dx..**.** In the
23b10 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 2c   %_segdir table,
23b20 20 61 20 73 65 67 6d 65 6e 74 20 69 73 20 64 65   a segment is de
23b30 66 69 6e 65 64 20 62 79 20 74 68 65 20 76 61 6c  fined by the val
23b40 75 65 73 20 69 6e 20 74 68 72 65 65 0a 2a 2a 20  ues in three.** 
23b50 63 6f 6c 75 6d 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  columns:.**.**  
23b60 20 20 20 73 74 61 72 74 5f 62 6c 6f 63 6b 0a 2a     start_block.*
23b70 2a 20 20 20 20 20 6c 65 61 76 65 73 5f 65 6e 64  *     leaves_end
23b80 5f 62 6c 6f 63 6b 0a 2a 2a 20 20 20 20 20 65 6e  _block.**     en
23b90 64 5f 62 6c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 57 68  d_block.**.** Wh
23ba0 65 6e 20 61 6e 20 61 70 70 65 6e 64 61 62 6c 65  en an appendable
23bb0 20 73 65 67 6d 65 6e 74 20 69 73 20 61 6c 6c 6f   segment is allo
23bc0 63 61 74 65 64 2c 20 69 74 20 69 73 20 65 73 74  cated, it is est
23bd0 69 6d 61 74 65 64 20 74 68 61 74 20 74 68 65 0a  imated that the.
23be0 2a 2a 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  ** maximum numbe
23bf0 72 20 6f 66 20 6c 65 61 66 20 62 6c 6f 63 6b 73  r of leaf blocks
23c00 20 74 68 61 74 20 6d 61 79 20 62 65 20 72 65 71   that may be req
23c10 75 69 72 65 64 20 69 73 20 74 68 65 20 73 75 6d  uired is the sum
23c20 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65   of the.** numbe
23c30 72 20 6f 66 20 6c 65 61 66 20 62 6c 6f 63 6b 73  r of leaf blocks
23c40 20 63 6f 6e 73 75 6d 65 64 20 62 79 20 74 68 65   consumed by the
23c50 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 2c   input segments,
23c60 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72   plus the number
23c70 0a 2a 2a 20 6f 66 20 69 6e 70 75 74 20 73 65 67  .** of input seg
23c80 6d 65 6e 74 73 2c 20 6d 75 6c 74 69 70 6c 69 65  ments, multiplie
23c90 64 20 62 79 20 74 77 6f 2e 20 54 68 69 73 20 76  d by two. This v
23ca0 61 6c 75 65 20 69 73 20 73 74 6f 72 65 64 20 69  alue is stored i
23cb0 6e 20 73 74 61 63 6b 20 0a 2a 2a 20 76 61 72 69  n stack .** vari
23cc0 61 62 6c 65 20 6e 4c 65 61 66 45 73 74 2e 0a 2a  able nLeafEst..*
23cd0 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20  *.** A total of 
23ce0 31 36 2a 6e 4c 65 61 66 45 73 74 20 62 6c 6f 63  16*nLeafEst bloc
23cf0 6b 73 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64  ks are allocated
23d00 20 77 68 65 6e 20 61 6e 20 61 70 70 65 6e 64 61   when an appenda
23d10 62 6c 65 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 69  ble segment.** i
23d20 73 20 63 72 65 61 74 65 64 20 28 28 31 20 2b 20  s created ((1 + 
23d30 65 6e 64 5f 62 6c 6f 63 6b 20 2d 20 73 74 61 72  end_block - star
23d40 74 5f 62 6c 6f 63 6b 29 3d 3d 31 36 2a 6e 4c 65  t_block)==16*nLe
23d50 61 66 45 73 74 29 2e 20 54 68 65 20 63 6f 6e 74  afEst). The cont
23d60 69 67 75 6f 75 73 0a 2a 2a 20 61 72 72 61 79 20  iguous.** array 
23d70 6f 66 20 6c 65 61 66 20 6e 6f 64 65 73 20 73 74  of leaf nodes st
23d80 61 72 74 73 20 61 74 20 74 68 65 20 66 69 72 73  arts at the firs
23d90 74 20 62 6c 6f 63 6b 20 61 6c 6c 6f 63 61 74 65  t block allocate
23da0 64 2e 20 54 68 65 20 61 72 72 61 79 0a 2a 2a 20  d. The array.** 
23db0 6f 66 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65  of interior node
23dc0 73 20 74 68 61 74 20 61 72 65 20 70 61 72 65 6e  s that are paren
23dd0 74 73 20 6f 66 20 74 68 65 20 6c 65 61 66 20 6e  ts of the leaf n
23de0 6f 64 65 73 20 73 74 61 72 74 20 61 74 20 62 6c  odes start at bl
23df0 6f 63 6b 0a 2a 2a 20 28 73 74 61 72 74 5f 62 6c  ock.** (start_bl
23e00 6f 63 6b 20 2b 20 28 31 20 2b 20 65 6e 64 5f 62  ock + (1 + end_b
23e10 6c 6f 63 6b 20 2d 20 73 74 61 72 74 5f 62 6c 6f  lock - start_blo
23e20 63 6b 29 20 2f 20 31 36 29 2e 20 41 6e 64 20 73  ck) / 16). And s
23e30 6f 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  o on..**.** In t
23e40 68 65 20 61 63 74 75 61 6c 20 63 6f 64 65 20 62  he actual code b
23e50 65 6c 6f 77 2c 20 74 68 65 20 76 61 6c 75 65 20  elow, the value 
23e60 22 31 36 22 20 69 73 20 72 65 70 6c 61 63 65 64  "16" is replaced
23e70 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 70 72   with the .** pr
23e80 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63 72  e-processor macr
23e90 6f 20 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44  o FTS_MAX_APPEND
23ea0 41 42 4c 45 5f 48 45 49 47 48 54 2e 0a 2a 2f 0a  ABLE_HEIGHT..*/.
23eb0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49  static int fts3I
23ec0 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72 28 20  ncrmergeWriter( 
23ed0 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
23ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ef0 20 20 20 2f 2a 20 46 74 73 33 20 74 61 62 6c 65     /* Fts3 table
23f00 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c   handle */.  sql
23f10 69 74 65 33 5f 69 6e 74 36 34 20 69 41 62 73 4c  ite3_int64 iAbsL
23f20 65 76 65 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  evel,        /* 
23f30 41 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 6f  Absolute level o
23f40 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73  f input segments
23f50 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20   */.  int iIdx, 
23f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f70 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
23f80 66 20 6e 65 77 20 6f 75 74 70 75 74 20 73 65 67  f new output seg
23f90 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 33 4d 75  ment */.  Fts3Mu
23fa0 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70 43  ltiSegReader *pC
23fb0 73 72 2c 20 20 20 20 20 20 20 2f 2a 20 43 75 72  sr,       /* Cur
23fc0 73 6f 72 20 74 68 61 74 20 64 61 74 61 20 77 69  sor that data wi
23fd0 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ll be read from 
23fe0 2a 2f 0a 20 20 49 6e 63 72 6d 65 72 67 65 57 72  */.  IncrmergeWr
23ff0 69 74 65 72 20 2a 70 57 72 69 74 65 72 20 20 20  iter *pWriter   
24000 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65       /* Populate
24010 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
24020 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
24030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24040 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
24050 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ode */.  int i; 
24060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24070 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
24080 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
24090 0a 20 20 69 6e 74 20 6e 4c 65 61 66 45 73 74 20  .  int nLeafEst 
240a0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
240b0 20 20 20 2f 2a 20 42 6c 6f 63 6b 73 20 61 6c 6c     /* Blocks all
240c0 6f 63 61 74 65 64 20 66 6f 72 20 6c 65 61 66 20  ocated for leaf 
240d0 6e 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  nodes */.  sqlit
240e0 65 33 5f 73 74 6d 74 20 2a 70 4c 65 61 66 45 73  e3_stmt *pLeafEs
240f0 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 53 51  t = 0;     /* SQ
24100 4c 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  L used to determ
24110 69 6e 65 20 6e 4c 65 61 66 45 73 74 20 2a 2f 0a  ine nLeafEst */.
24120 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
24130 70 46 69 72 73 74 42 6c 6f 63 6b 20 3d 20 30 3b  pFirstBlock = 0;
24140 20 20 2f 2a 20 53 51 4c 20 75 73 65 64 20 74 6f    /* SQL used to
24150 20 64 65 74 65 72 6d 69 6e 65 20 66 69 72 73 74   determine first
24160 20 62 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20   block */..  /* 
24170 43 61 6c 63 75 6c 61 74 65 20 6e 4c 65 61 66 45  Calculate nLeafE
24180 73 74 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74  st. */.  rc = ft
24190 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
241a0 5f 4d 41 58 5f 4c 45 41 46 5f 4e 4f 44 45 5f 45  _MAX_LEAF_NODE_E
241b0 53 54 49 4d 41 54 45 2c 20 26 70 4c 65 61 66 45  STIMATE, &pLeafE
241c0 73 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  st, 0);.  if( rc
241d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
241e0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
241f0 69 6e 74 36 34 28 70 4c 65 61 66 45 73 74 2c 20  int64(pLeafEst, 
24200 31 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20  1, iAbsLevel);. 
24210 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
24220 69 6e 74 36 34 28 70 4c 65 61 66 45 73 74 2c 20  int64(pLeafEst, 
24230 32 2c 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e  2, pCsr->nSegmen
24240 74 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  t);.    if( SQLI
24250 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
24260 73 74 65 70 28 70 4c 65 61 66 45 73 74 29 20 29  step(pLeafEst) )
24270 7b 0a 20 20 20 20 20 20 6e 4c 65 61 66 45 73 74  {.      nLeafEst
24280 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
24290 6e 5f 69 6e 74 28 70 4c 65 61 66 45 73 74 2c 20  n_int(pLeafEst, 
242a0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  0);.    }.    rc
242b0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
242c0 28 70 4c 65 61 66 45 73 74 29 3b 0a 20 20 7d 0a  (pLeafEst);.  }.
242d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
242e0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
242f0 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65  ..  /* Calculate
24300 20 74 68 65 20 66 69 72 73 74 20 62 6c 6f 63 6b   the first block
24310 20 74 6f 20 75 73 65 20 69 6e 20 74 68 65 20 6f   to use in the o
24320 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f  utput segment */
24330 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
24340 74 6d 74 28 70 2c 20 53 51 4c 5f 4e 45 58 54 5f  tmt(p, SQL_NEXT_
24350 53 45 47 4d 45 4e 54 53 5f 49 44 2c 20 26 70 46  SEGMENTS_ID, &pF
24360 69 72 73 74 42 6c 6f 63 6b 2c 20 30 29 3b 0a 20  irstBlock, 0);. 
24370 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24380 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51  OK ){.    if( SQ
24390 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
243a0 33 5f 73 74 65 70 28 70 46 69 72 73 74 42 6c 6f  3_step(pFirstBlo
243b0 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 70 57 72  ck) ){.      pWr
243c0 69 74 65 72 2d 3e 69 53 74 61 72 74 20 3d 20 73  iter->iStart = s
243d0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
243e0 74 36 34 28 70 46 69 72 73 74 42 6c 6f 63 6b 2c  t64(pFirstBlock,
243f0 20 30 29 3b 0a 20 20 20 20 20 20 70 57 72 69 74   0);.      pWrit
24400 65 72 2d 3e 69 45 6e 64 20 3d 20 70 57 72 69 74  er->iEnd = pWrit
24410 65 72 2d 3e 69 53 74 61 72 74 20 2d 20 31 3b 0a  er->iStart - 1;.
24420 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69        pWriter->i
24430 45 6e 64 20 2b 3d 20 6e 4c 65 61 66 45 73 74 20  End += nLeafEst 
24440 2a 20 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44  * FTS_MAX_APPEND
24450 41 42 4c 45 5f 48 45 49 47 48 54 3b 0a 20 20 20  ABLE_HEIGHT;.   
24460 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
24470 74 65 33 5f 72 65 73 65 74 28 70 46 69 72 73 74  te3_reset(pFirst
24480 42 6c 6f 63 6b 29 3b 0a 20 20 7d 0a 20 20 69 66  Block);.  }.  if
24490 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
244a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
244b0 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6d 61  /* Insert the ma
244c0 72 6b 65 72 20 69 6e 20 74 68 65 20 25 5f 73 65  rker in the %_se
244d0 67 6d 65 6e 74 73 20 74 61 62 6c 65 20 74 6f 20  gments table to 
244e0 6d 61 6b 65 20 73 75 72 65 20 6e 6f 62 6f 64 79  make sure nobody
244f0 20 74 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 73   tries.  ** to s
24500 74 65 61 6c 20 74 68 65 20 73 70 61 63 65 20 6a  teal the space j
24510 75 73 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20 54  ust allocated. T
24520 68 69 73 20 69 73 20 61 6c 73 6f 20 75 73 65 64  his is also used
24530 20 74 6f 20 69 64 65 6e 74 69 66 79 20 0a 20 20   to identify .  
24540 2a 2a 20 61 70 70 65 6e 64 61 62 6c 65 20 73 65  ** appendable se
24550 67 6d 65 6e 74 73 2e 20 20 2a 2f 0a 20 20 72 63  gments.  */.  rc
24560 20 3d 20 66 74 73 33 57 72 69 74 65 53 65 67 6d   = fts3WriteSegm
24570 65 6e 74 28 70 2c 20 70 57 72 69 74 65 72 2d 3e  ent(p, pWriter->
24580 69 45 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20 69  iEnd, 0, 0);.  i
24590 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
245a0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
245b0 20 70 57 72 69 74 65 72 2d 3e 69 41 62 73 4c 65   pWriter->iAbsLe
245c0 76 65 6c 20 3d 20 69 41 62 73 4c 65 76 65 6c 3b  vel = iAbsLevel;
245d0 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61  .  pWriter->nLea
245e0 66 45 73 74 20 3d 20 6e 4c 65 61 66 45 73 74 3b  fEst = nLeafEst;
245f0 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 49 64 78  .  pWriter->iIdx
24600 20 3d 20 69 49 64 78 3b 0a 0a 20 20 2f 2a 20 53   = iIdx;..  /* S
24610 65 74 20 75 70 20 74 68 65 20 61 72 72 61 79 20  et up the array 
24620 6f 66 20 4e 6f 64 65 57 72 69 74 65 72 20 6f 62  of NodeWriter ob
24630 6a 65 63 74 73 20 2a 2f 0a 20 20 66 6f 72 28 69  jects */.  for(i
24640 3d 30 3b 20 69 3c 46 54 53 5f 4d 41 58 5f 41 50  =0; i<FTS_MAX_AP
24650 50 45 4e 44 41 42 4c 45 5f 48 45 49 47 48 54 3b  PENDABLE_HEIGHT;
24660 20 69 2b 2b 29 7b 0a 20 20 20 20 70 57 72 69 74   i++){.    pWrit
24670 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b  er->aNodeWriter[
24680 69 5d 2e 69 42 6c 6f 63 6b 20 3d 20 70 57 72 69  i].iBlock = pWri
24690 74 65 72 2d 3e 69 53 74 61 72 74 20 2b 20 69 2a  ter->iStart + i*
246a0 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 45 73  pWriter->nLeafEs
246b0 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
246c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
246d0 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6e 20 65 6e  .** Remove an en
246e0 74 72 79 20 66 72 6f 6d 20 74 68 65 20 25 5f 73  try from the %_s
246f0 65 67 64 69 72 20 74 61 62 6c 65 2e 20 54 68 69  egdir table. Thi
24700 73 20 69 6e 76 6f 6c 76 65 73 20 72 75 6e 6e 69  s involves runni
24710 6e 67 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f  ng the .** follo
24720 77 69 6e 67 20 74 77 6f 20 73 74 61 74 65 6d 65  wing two stateme
24730 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 44 45 4c  nts:.**.**   DEL
24740 45 54 45 20 46 52 4f 4d 20 25 5f 73 65 67 64 69  ETE FROM %_segdi
24750 72 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20  r WHERE level = 
24760 3a 69 41 62 73 4c 65 76 65 6c 20 41 4e 44 20 69  :iAbsLevel AND i
24770 64 78 20 3d 20 3a 69 49 64 78 0a 2a 2a 20 20 20  dx = :iIdx.**   
24780 55 50 44 41 54 45 20 25 5f 73 65 67 64 69 72 20  UPDATE %_segdir 
24790 53 45 54 20 69 64 78 20 3d 20 69 64 78 20 2d 20  SET idx = idx - 
247a0 31 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20  1 WHERE level = 
247b0 3a 69 41 62 73 4c 65 76 65 6c 20 41 4e 44 20 69  :iAbsLevel AND i
247c0 64 78 20 3e 20 3a 69 49 64 78 0a 2a 2a 0a 2a 2a  dx > :iIdx.**.**
247d0 20 54 68 65 20 44 45 4c 45 54 45 20 73 74 61 74   The DELETE stat
247e0 65 6d 65 6e 74 20 72 65 6d 6f 76 65 73 20 74 68  ement removes th
247f0 65 20 73 70 65 63 69 66 69 63 20 25 5f 73 65 67  e specific %_seg
24800 64 69 72 20 6c 65 76 65 6c 2e 20 54 68 65 20 55  dir level. The U
24810 50 44 41 54 45 20 0a 2a 2a 20 73 74 61 74 65 6d  PDATE .** statem
24820 65 6e 74 20 65 6e 73 75 72 65 73 20 74 68 61 74  ent ensures that
24830 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 73   the remaining s
24840 65 67 6d 65 6e 74 73 20 68 61 76 65 20 63 6f 6e  egments have con
24850 74 69 67 75 6f 75 73 6c 79 20 61 6c 6c 6f 63 61  tiguously alloca
24860 74 65 64 0a 2a 2a 20 69 64 78 20 76 61 6c 75 65  ted.** idx value
24870 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
24880 20 66 74 73 33 52 65 6d 6f 76 65 53 65 67 64 69   fts3RemoveSegdi
24890 72 45 6e 74 72 79 28 0a 20 20 46 74 73 33 54 61  rEntry(.  Fts3Ta
248a0 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
248b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
248c0 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  3 table handle *
248d0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
248e0 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20  4 iAbsLevel,    
248f0 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20      /* Absolute 
24900 6c 65 76 65 6c 20 74 6f 20 64 65 6c 65 74 65 20  level to delete 
24910 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 49  from */.  int iI
24920 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20  dx              
24930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
24940 65 78 20 6f 66 20 25 5f 73 65 67 64 69 72 20 65  ex of %_segdir e
24950 6e 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20 2a  ntry to delete *
24960 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
24970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24980 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
24990 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
249a0 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74 65  e3_stmt *pDelete
249b0 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 44 45   = 0;      /* DE
249c0 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a  LETE statement *
249d0 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71  /..  rc = fts3Sq
249e0 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 44 45 4c  lStmt(p, SQL_DEL
249f0 45 54 45 5f 53 45 47 44 49 52 5f 45 4e 54 52 59  ETE_SEGDIR_ENTRY
24a00 2c 20 26 70 44 65 6c 65 74 65 2c 20 30 29 3b 0a  , &pDelete, 0);.
24a10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24a20 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
24a30 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 44  e3_bind_int64(pD
24a40 65 6c 65 74 65 2c 20 31 2c 20 69 41 62 73 4c 65  elete, 1, iAbsLe
24a50 76 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  vel);.    sqlite
24a60 33 5f 62 69 6e 64 5f 69 6e 74 28 70 44 65 6c 65  3_bind_int(pDele
24a70 74 65 2c 20 32 2c 20 69 49 64 78 29 3b 0a 20 20  te, 2, iIdx);.  
24a80 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
24a90 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 72 63 20  Delete);.    rc 
24aa0 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
24ab0 70 44 65 6c 65 74 65 29 3b 0a 20 20 7d 0a 0a 20  pDelete);.  }.. 
24ac0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24ad0 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65  *.** One or more
24ae0 20 73 65 67 6d 65 6e 74 73 20 68 61 76 65 20 6a   segments have j
24af0 75 73 74 20 62 65 65 6e 20 72 65 6d 6f 76 65 64  ust been removed
24b00 20 66 72 6f 6d 20 61 62 73 6f 6c 75 74 65 20 6c   from absolute l
24b10 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c 2e 0a  evel iAbsLevel..
24b20 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 27 69  ** Update the 'i
24b30 64 78 27 20 76 61 6c 75 65 73 20 6f 66 20 74 68  dx' values of th
24b40 65 20 72 65 6d 61 69 6e 69 6e 67 20 73 65 67 6d  e remaining segm
24b50 65 6e 74 73 20 69 6e 20 74 68 65 20 6c 65 76 65  ents in the leve
24b60 6c 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65  l so that.** the
24b70 20 69 64 78 20 76 61 6c 75 65 73 20 61 72 65 20   idx values are 
24b80 61 20 63 6f 6e 74 69 67 75 6f 75 73 20 73 65 71  a contiguous seq
24b90 75 65 6e 63 65 20 73 74 61 72 74 69 6e 67 20 66  uence starting f
24ba0 72 6f 6d 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  rom 0..*/.static
24bb0 20 69 6e 74 20 66 74 73 33 52 65 70 61 63 6b 53   int fts3RepackS
24bc0 65 67 64 69 72 4c 65 76 65 6c 28 0a 20 20 46 74  egdirLevel(.  Ft
24bd0 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
24be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24bf0 20 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64   FTS3 table hand
24c00 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
24c10 69 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c 20  int64 iAbsLevel 
24c20 20 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c          /* Absol
24c30 75 74 65 20 6c 65 76 65 6c 20 74 6f 20 72 65 70  ute level to rep
24c40 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ack */.){.  int 
24c50 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
24c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
24c70 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
24c80 69 6e 74 20 2a 61 49 64 78 20 3d 20 30 3b 20 20  int *aIdx = 0;  
24c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ca0 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 65 6d 61  /* Array of rema
24cb0 69 6e 69 6e 67 20 69 64 78 20 76 61 6c 75 65 73  ining idx values
24cc0 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 64 78 20 3d   */.  int nIdx =
24cd0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
24ce0 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 65        /* Valid e
24cf0 6e 74 72 69 65 73 20 69 6e 20 61 49 64 78 5b 5d  ntries in aIdx[]
24d00 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63   */.  int nAlloc
24d10 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
24d20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
24d30 65 64 20 73 69 7a 65 20 6f 66 20 61 49 64 78 5b  ed size of aIdx[
24d40 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  ] */.  int i;   
24d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d60 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
24d70 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
24d80 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
24d90 53 65 6c 65 63 74 20 3d 20 30 3b 20 20 20 20 20  Select = 0;     
24da0 20 2f 2a 20 53 65 6c 65 63 74 20 73 74 61 74 65   /* Select state
24db0 6d 65 6e 74 20 74 6f 20 72 65 61 64 20 69 64 78  ment to read idx
24dc0 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 73 71 6c   values */.  sql
24dd0 69 74 65 33 5f 73 74 6d 74 20 2a 70 55 70 64 61  ite3_stmt *pUpda
24de0 74 65 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  te = 0;      /* 
24df0 55 70 64 61 74 65 20 73 74 61 74 65 6d 65 6e 74  Update statement
24e00 20 74 6f 20 6d 6f 64 69 66 79 20 69 64 78 20 76   to modify idx v
24e10 61 6c 75 65 73 20 2a 2f 0a 0a 20 20 72 63 20 3d  alues */..  rc =
24e20 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
24e30 53 51 4c 5f 53 45 4c 45 43 54 5f 49 4e 44 45 58  SQL_SELECT_INDEX
24e40 45 53 2c 20 26 70 53 65 6c 65 63 74 2c 20 30 29  ES, &pSelect, 0)
24e50 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
24e60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
24e70 20 72 63 32 3b 0a 20 20 20 20 73 71 6c 69 74 65   rc2;.    sqlite
24e80 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 65  3_bind_int64(pSe
24e90 6c 65 63 74 2c 20 31 2c 20 69 41 62 73 4c 65 76  lect, 1, iAbsLev
24ea0 65 6c 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  el);.    while( 
24eb0 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
24ec0 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74  te3_step(pSelect
24ed0 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  ) ){.      if( n
24ee0 49 64 78 3e 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20  Idx>=nAlloc ){. 
24ef0 20 20 20 20 20 20 20 69 6e 74 20 2a 61 4e 65 77         int *aNew
24f00 3b 0a 20 20 20 20 20 20 20 20 6e 41 6c 6c 6f 63  ;.        nAlloc
24f10 20 2b 3d 20 31 36 3b 0a 20 20 20 20 20 20 20 20   += 16;.        
24f20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72  aNew = sqlite3_r
24f30 65 61 6c 6c 6f 63 28 61 49 64 78 2c 20 6e 41 6c  ealloc(aIdx, nAl
24f40 6c 6f 63 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29  loc*sizeof(int))
24f50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61  ;.        if( !a
24f60 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  New ){.         
24f70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
24f80 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  EM;.          br
24f90 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
24fa0 20 20 20 20 20 20 20 61 49 64 78 20 3d 20 61 4e         aIdx = aN
24fb0 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ew;.      }.    
24fc0 20 20 61 49 64 78 5b 6e 49 64 78 2b 2b 5d 20 3d    aIdx[nIdx++] =
24fd0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
24fe0 69 6e 74 28 70 53 65 6c 65 63 74 2c 20 30 29 3b  int(pSelect, 0);
24ff0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 32 20 3d  .    }.    rc2 =
25000 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
25010 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69 66 28  Select);.    if(
25020 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
25030 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a   rc = rc2;.  }..
25040 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25050 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
25060 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
25070 51 4c 5f 53 48 49 46 54 5f 53 45 47 44 49 52 5f  QL_SHIFT_SEGDIR_
25080 45 4e 54 52 59 2c 20 26 70 55 70 64 61 74 65 2c  ENTRY, &pUpdate,
25090 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
250a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
250b0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
250c0 5f 69 6e 74 36 34 28 70 55 70 64 61 74 65 2c 20  _int64(pUpdate, 
250d0 32 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20  2, iAbsLevel);. 
250e0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d   }..  assert( p-
250f0 3e 62 49 67 6e 6f 72 65 53 61 76 65 70 6f 69 6e  >bIgnoreSavepoin
25100 74 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 62 49 67  t==0 );.  p->bIg
25110 6e 6f 72 65 53 61 76 65 70 6f 69 6e 74 20 3d 20  noreSavepoint = 
25120 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  1;.  for(i=0; rc
25130 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
25140 3c 6e 49 64 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nIdx; i++){.   
25150 20 69 66 28 20 61 49 64 78 5b 69 5d 21 3d 69 20   if( aIdx[i]!=i 
25160 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
25170 5f 62 69 6e 64 5f 69 6e 74 28 70 55 70 64 61 74  _bind_int(pUpdat
25180 65 2c 20 33 2c 20 61 49 64 78 5b 69 5d 29 3b 0a  e, 3, aIdx[i]);.
25190 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
251a0 6e 64 5f 69 6e 74 28 70 55 70 64 61 74 65 2c 20  nd_int(pUpdate, 
251b0 31 2c 20 69 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, i);.      sql
251c0 69 74 65 33 5f 73 74 65 70 28 70 55 70 64 61 74  ite3_step(pUpdat
251d0 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  e);.      rc = s
251e0 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 55 70  qlite3_reset(pUp
251f0 64 61 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  date);.    }.  }
25200 0a 20 20 70 2d 3e 62 49 67 6e 6f 72 65 53 61 76  .  p->bIgnoreSav
25210 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 0a 20 20 73  epoint = 0;..  s
25220 71 6c 69 74 65 33 5f 66 72 65 65 28 61 49 64 78  qlite3_free(aIdx
25230 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
25240 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
25250 74 73 33 53 74 61 72 74 4e 6f 64 65 28 42 6c 6f  ts3StartNode(Blo
25260 62 20 2a 70 4e 6f 64 65 2c 20 69 6e 74 20 69 48  b *pNode, int iH
25270 65 69 67 68 74 2c 20 73 71 6c 69 74 65 33 5f 69  eight, sqlite3_i
25280 6e 74 36 34 20 69 43 68 69 6c 64 29 7b 0a 20 20  nt64 iChild){.  
25290 70 4e 6f 64 65 2d 3e 61 5b 30 5d 20 3d 20 28 63  pNode->a[0] = (c
252a0 68 61 72 29 69 48 65 69 67 68 74 3b 0a 20 20 69  har)iHeight;.  i
252b0 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
252c0 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e   assert( pNode->
252d0 6e 41 6c 6c 6f 63 3e 3d 31 2b 73 71 6c 69 74 65  nAlloc>=1+sqlite
252e0 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 69  3Fts3VarintLen(i
252f0 43 68 69 6c 64 29 20 29 3b 0a 20 20 20 20 70 4e  Child) );.    pN
25300 6f 64 65 2d 3e 6e 20 3d 20 31 20 2b 20 73 71 6c  ode->n = 1 + sql
25310 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e  ite3Fts3PutVarin
25320 74 28 26 70 4e 6f 64 65 2d 3e 61 5b 31 5d 2c 20  t(&pNode->a[1], 
25330 69 43 68 69 6c 64 29 3b 0a 20 20 7d 65 6c 73 65  iChild);.  }else
25340 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
25350 6f 64 65 2d 3e 6e 41 6c 6c 6f 63 3e 3d 31 20 29  ode->nAlloc>=1 )
25360 3b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 6e 20 3d  ;.    pNode->n =
25370 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
25380 20 54 68 65 20 66 69 72 73 74 20 74 77 6f 20 61   The first two a
25390 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 20 70  rguments are a p
253a0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 64 20 74 68  ointer to and th
253b0 65 20 73 69 7a 65 20 6f 66 20 61 20 73 65 67 6d  e size of a segm
253c0 65 6e 74 20 62 2d 74 72 65 65 0a 2a 2a 20 6e 6f  ent b-tree.** no
253d0 64 65 2e 20 54 68 65 20 6e 6f 64 65 20 6d 61 79  de. The node may
253e0 20 62 65 20 61 20 6c 65 61 66 20 6f 72 20 61 6e   be a leaf or an
253f0 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 0a   internal node..
25400 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
25410 69 6f 6e 20 63 72 65 61 74 65 73 20 61 20 6e 65  ion creates a ne
25420 77 20 6e 6f 64 65 20 69 6d 61 67 65 20 69 6e 20  w node image in 
25430 62 6c 6f 62 20 6f 62 6a 65 63 74 20 2a 70 4e 65  blob object *pNe
25440 77 20 62 79 20 63 6f 70 79 69 6e 67 0a 2a 2a 20  w by copying.** 
25450 61 6c 6c 20 74 65 72 6d 73 20 74 68 61 74 20 61  all terms that a
25460 72 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  re greater than 
25470 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 54 65 72  or equal to zTer
25480 6d 2f 6e 54 65 72 6d 20 28 66 6f 72 20 6c 65 61  m/nTerm (for lea
25490 66 20 6e 6f 64 65 73 29 0a 2a 2a 20 6f 72 20 67  f nodes).** or g
254a0 72 65 61 74 65 72 20 74 68 61 6e 20 7a 54 65 72  reater than zTer
254b0 6d 2f 6e 54 65 72 6d 20 28 66 6f 72 20 69 6e 74  m/nTerm (for int
254c0 65 72 6e 61 6c 20 6e 6f 64 65 73 29 20 66 72 6f  ernal nodes) fro
254d0 6d 20 61 4e 6f 64 65 2f 6e 4e 6f 64 65 2e 0a 2a  m aNode/nNode..*
254e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
254f0 33 54 72 75 6e 63 61 74 65 4e 6f 64 65 28 0a 20  3TruncateNode(. 
25500 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 4e 6f   const char *aNo
25510 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
25520 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e 6f 64 65   /* Current node
25530 20 69 6d 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   image */.  int 
25540 6e 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  nNode,          
25550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
25560 69 7a 65 20 6f 66 20 61 4e 6f 64 65 20 69 6e 20  ize of aNode in 
25570 62 79 74 65 73 20 2a 2f 0a 20 20 42 6c 6f 62 20  bytes */.  Blob 
25580 2a 70 4e 65 77 2c 20 20 20 20 20 20 20 20 20 20  *pNew,          
25590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
255a0 54 3a 20 57 72 69 74 65 20 6e 65 77 20 6e 6f 64  T: Write new nod
255b0 65 20 69 6d 61 67 65 20 68 65 72 65 20 2a 2f 0a  e image here */.
255c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
255d0 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
255e0 20 20 2f 2a 20 4f 6d 69 74 20 61 6c 6c 20 74 65    /* Omit all te
255f0 72 6d 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  rms smaller than
25600 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e   this */.  int n
25610 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
25620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
25630 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62  ze of zTerm in b
25640 79 74 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ytes */.  sqlite
25650 33 5f 69 6e 74 36 34 20 2a 70 69 42 6c 6f 63 6b  3_int64 *piBlock
25660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
25670 3a 20 42 6c 6f 63 6b 20 6e 75 6d 62 65 72 20 69  : Block number i
25680 6e 20 6e 65 78 74 20 6c 61 79 65 72 20 64 6f 77  n next layer dow
25690 6e 20 2a 2f 0a 29 7b 0a 20 20 4e 6f 64 65 52 65  n */.){.  NodeRe
256a0 61 64 65 72 20 72 65 61 64 65 72 3b 20 20 20 20  ader reader;    
256b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
256c0 64 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  der object */.  
256d0 42 6c 6f 62 20 70 72 65 76 20 3d 20 7b 30 2c 20  Blob prev = {0, 
256e0 30 2c 20 30 7d 3b 20 20 20 20 20 20 20 20 20 20  0, 0};          
256f0 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 65 72 6d  /* Previous term
25700 20 77 72 69 74 74 65 6e 20 74 6f 20 6e 65 77 20   written to new 
25710 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  node */.  int rc
25720 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
25730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
25740 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
25750 74 20 62 4c 65 61 66 20 3d 20 61 4e 6f 64 65 5b  t bLeaf = aNode[
25760 30 5d 3d 3d 27 5c 30 27 3b 20 20 20 20 20 2f 2a  0]=='\0';     /*
25770 20 54 72 75 65 20 66 6f 72 20 61 20 6c 65 61 66   True for a leaf
25780 20 6e 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41   node */..  /* A
25790 6c 6c 6f 63 61 74 65 20 72 65 71 75 69 72 65 64  llocate required
257a0 20 6f 75 74 70 75 74 20 73 70 61 63 65 20 2a 2f   output space */
257b0 0a 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65  .  blobGrowBuffe
257c0 72 28 70 4e 65 77 2c 20 6e 4e 6f 64 65 2c 20 26  r(pNew, nNode, &
257d0 72 63 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  rc);.  if( rc!=S
257e0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
257f0 6e 20 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 6e 20  n rc;.  pNew->n 
25800 3d 20 30 3b 0a 0a 20 20 2f 2a 20 50 6f 70 75 6c  = 0;..  /* Popul
25810 61 74 65 20 6e 65 77 20 6e 6f 64 65 20 62 75 66  ate new node buf
25820 66 65 72 20 2a 2f 0a 20 20 66 6f 72 28 72 63 20  fer */.  for(rc 
25830 3d 20 6e 6f 64 65 52 65 61 64 65 72 49 6e 69 74  = nodeReaderInit
25840 28 26 72 65 61 64 65 72 2c 20 61 4e 6f 64 65 2c  (&reader, aNode,
25850 20 6e 4e 6f 64 65 29 3b 20 0a 20 20 20 20 20 20   nNode); .      
25860 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
25870 20 72 65 61 64 65 72 2e 61 4e 6f 64 65 3b 20 0a   reader.aNode; .
25880 20 20 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 52        rc = nodeR
25890 65 61 64 65 72 4e 65 78 74 28 26 72 65 61 64 65  eaderNext(&reade
258a0 72 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  r).  ){.    if( 
258b0 70 4e 65 77 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20  pNew->n==0 ){.  
258c0 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 66 74      int res = ft
258d0 73 33 54 65 72 6d 43 6d 70 28 72 65 61 64 65 72  s3TermCmp(reader
258e0 2e 74 65 72 6d 2e 61 2c 20 72 65 61 64 65 72 2e  .term.a, reader.
258f0 74 65 72 6d 2e 6e 2c 20 7a 54 65 72 6d 2c 20 6e  term.n, zTerm, n
25900 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 69 66 28  Term);.      if(
25910 20 72 65 73 3c 30 20 7c 7c 20 28 62 4c 65 61 66   res<0 || (bLeaf
25920 3d 3d 30 20 26 26 20 72 65 73 3d 3d 30 29 20 29  ==0 && res==0) )
25930 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
25940 20 66 74 73 33 53 74 61 72 74 4e 6f 64 65 28 70   fts3StartNode(p
25950 4e 65 77 2c 20 28 69 6e 74 29 61 4e 6f 64 65 5b  New, (int)aNode[
25960 30 5d 2c 20 72 65 61 64 65 72 2e 69 43 68 69 6c  0], reader.iChil
25970 64 29 3b 0a 20 20 20 20 20 20 2a 70 69 42 6c 6f  d);.      *piBlo
25980 63 6b 20 3d 20 72 65 61 64 65 72 2e 69 43 68 69  ck = reader.iChi
25990 6c 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ld;.    }.    rc
259a0 20 3d 20 66 74 73 33 41 70 70 65 6e 64 54 6f 4e   = fts3AppendToN
259b0 6f 64 65 28 0a 20 20 20 20 20 20 20 20 70 4e 65  ode(.        pNe
259c0 77 2c 20 26 70 72 65 76 2c 20 72 65 61 64 65 72  w, &prev, reader
259d0 2e 74 65 72 6d 2e 61 2c 20 72 65 61 64 65 72 2e  .term.a, reader.
259e0 74 65 72 6d 2e 6e 2c 0a 20 20 20 20 20 20 20 20  term.n,.        
259f0 72 65 61 64 65 72 2e 61 44 6f 63 6c 69 73 74 2c  reader.aDoclist,
25a00 20 72 65 61 64 65 72 2e 6e 44 6f 63 6c 69 73 74   reader.nDoclist
25a10 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
25a20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
25a30 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
25a40 20 70 4e 65 77 2d 3e 6e 3d 3d 30 20 29 7b 0a 20   pNew->n==0 ){. 
25a50 20 20 20 66 74 73 33 53 74 61 72 74 4e 6f 64 65     fts3StartNode
25a60 28 70 4e 65 77 2c 20 28 69 6e 74 29 61 4e 6f 64  (pNew, (int)aNod
25a70 65 5b 30 5d 2c 20 72 65 61 64 65 72 2e 69 43 68  e[0], reader.iCh
25a80 69 6c 64 29 3b 0a 20 20 20 20 2a 70 69 42 6c 6f  ild);.    *piBlo
25a90 63 6b 20 3d 20 72 65 61 64 65 72 2e 69 43 68 69  ck = reader.iChi
25aa0 6c 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ld;.  }.  assert
25ab0 28 20 70 4e 65 77 2d 3e 6e 3c 3d 70 4e 65 77 2d  ( pNew->n<=pNew-
25ac0 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 0a 20 20 6e 6f  >nAlloc );..  no
25ad0 64 65 52 65 61 64 65 72 52 65 6c 65 61 73 65 28  deReaderRelease(
25ae0 26 72 65 61 64 65 72 29 3b 0a 20 20 73 71 6c 69  &reader);.  sqli
25af0 74 65 33 5f 66 72 65 65 28 70 72 65 76 2e 61 29  te3_free(prev.a)
25b00 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
25b10 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61  ../*.** Remove a
25b20 6c 6c 20 74 65 72 6d 73 20 73 6d 61 6c 6c 65 72  ll terms smaller
25b30 20 74 68 61 6e 20 7a 54 65 72 6d 2f 6e 54 65 72   than zTerm/nTer
25b40 6d 20 66 72 6f 6d 20 73 65 67 6d 65 6e 74 20 69  m from segment i
25b50 49 64 78 20 69 6e 20 61 62 73 6f 6c 75 74 65 20  Idx in absolute 
25b60 0a 2a 2a 20 6c 65 76 65 6c 20 69 41 62 73 4c 65  .** level iAbsLe
25b70 76 65 6c 2e 20 54 68 69 73 20 6d 61 79 20 69 6e  vel. This may in
25b80 76 6f 6c 76 65 20 64 65 6c 65 74 69 6e 67 20 65  volve deleting e
25b90 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68 65 20  ntries from the 
25ba0 25 5f 73 65 67 6d 65 6e 74 73 0a 2a 2a 20 74 61  %_segments.** ta
25bb0 62 6c 65 2c 20 61 6e 64 20 6d 6f 64 69 66 79 69  ble, and modifyi
25bc0 6e 67 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  ng existing entr
25bd0 69 65 73 20 69 6e 20 62 6f 74 68 20 74 68 65 20  ies in both the 
25be0 25 5f 73 65 67 6d 65 6e 74 73 20 61 6e 64 20 25  %_segments and %
25bf0 5f 73 65 67 64 69 72 0a 2a 2a 20 74 61 62 6c 65  _segdir.** table
25c00 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  s..**.** SQLITE_
25c10 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
25c20 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69 73  f the segment is
25c30 20 75 70 64 61 74 65 64 20 73 75 63 63 65 73 73   updated success
25c40 66 75 6c 6c 79 2e 20 4f 72 20 61 6e 0a 2a 2a 20  fully. Or an.** 
25c50 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
25c60 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
25c70 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 54  static int fts3T
25c80 72 75 6e 63 61 74 65 53 65 67 6d 65 6e 74 28 0a  runcateSegment(.
25c90 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
25ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25cb0 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20    /* FTS3 table 
25cc0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69  handle */.  sqli
25cd0 74 65 33 5f 69 6e 74 36 34 20 69 41 62 73 4c 65  te3_int64 iAbsLe
25ce0 76 65 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 41  vel,        /* A
25cf0 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 6f 66  bsolute level of
25d00 20 73 65 67 6d 65 6e 74 20 74 6f 20 6d 6f 64 69   segment to modi
25d10 66 79 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  fy */.  int iIdx
25d20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25d30 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
25d40 20 77 69 74 68 69 6e 20 6c 65 76 65 6c 20 6f 66   within level of
25d50 20 73 65 67 6d 65 6e 74 20 74 6f 20 6d 6f 64 69   segment to modi
25d60 66 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  fy */.  const ch
25d70 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20  ar *zTerm,      
25d80 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
25d90 65 20 74 65 72 6d 73 20 73 6d 61 6c 6c 65 72 20  e terms smaller 
25da0 74 68 61 6e 20 74 68 69 73 20 2a 2f 0a 20 20 69  than this */.  i
25db0 6e 74 20 6e 54 65 72 6d 20 20 20 20 20 20 20 20  nt nTerm        
25dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25dd0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
25de0 20 69 6e 20 62 75 66 66 65 72 20 7a 54 65 72 6d   in buffer zTerm
25df0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
25e00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
25e10 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
25e20 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 6c 6f  rn code */.  Blo
25e30 62 20 72 6f 6f 74 20 3d 20 7b 30 2c 30 2c 30 7d  b root = {0,0,0}
25e40 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
25e50 4e 65 77 20 72 6f 6f 74 20 70 61 67 65 20 69 6d  New root page im
25e60 61 67 65 20 2a 2f 0a 20 20 42 6c 6f 62 20 62 6c  age */.  Blob bl
25e70 6f 63 6b 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20  ock = {0,0,0};  
25e80 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
25e90 65 72 20 75 73 65 64 20 66 6f 72 20 61 6e 79 20  er used for any 
25ea0 6f 74 68 65 72 20 62 6c 6f 63 6b 20 2a 2f 0a 20  other block */. 
25eb0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
25ec0 42 6c 6f 63 6b 20 3d 20 30 3b 20 20 20 20 20 20  Block = 0;      
25ed0 20 2f 2a 20 42 6c 6f 63 6b 20 69 64 20 2a 2f 0a   /* Block id */.
25ee0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
25ef0 69 4e 65 77 53 74 61 72 74 20 3d 20 30 3b 20 20  iNewStart = 0;  
25f00 20 20 2f 2a 20 4e 65 77 20 76 61 6c 75 65 20 66    /* New value f
25f10 6f 72 20 69 53 74 61 72 74 42 6c 6f 63 6b 20 2a  or iStartBlock *
25f20 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
25f30 34 20 69 4f 6c 64 53 74 61 72 74 20 3d 20 30 3b  4 iOldStart = 0;
25f40 20 20 20 20 2f 2a 20 4f 6c 64 20 76 61 6c 75 65      /* Old value
25f50 20 66 6f 72 20 69 53 74 61 72 74 42 6c 6f 63 6b   for iStartBlock
25f60 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
25f70 6d 74 20 2a 70 46 65 74 63 68 20 3d 20 30 3b 20  mt *pFetch = 0; 
25f80 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65        /* Stateme
25f90 6e 74 20 75 73 65 64 20 74 6f 20 66 65 74 63 68  nt used to fetch
25fa0 20 73 65 67 64 69 72 20 2a 2f 0a 0a 20 20 72 63   segdir */..  rc
25fb0 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
25fc0 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 45 47  , SQL_SELECT_SEG
25fd0 44 49 52 2c 20 26 70 46 65 74 63 68 2c 20 30 29  DIR, &pFetch, 0)
25fe0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
25ff0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
26000 20 72 63 32 3b 20 20 20 20 20 20 20 20 20 20 20   rc2;           
26010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
26020 6c 69 74 65 33 5f 72 65 73 65 74 28 29 20 72 65  lite3_reset() re
26030 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 20  turn code */.   
26040 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
26050 74 36 34 28 70 46 65 74 63 68 2c 20 31 2c 20 69  t64(pFetch, 1, i
26060 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20 73  AbsLevel);.    s
26070 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
26080 70 46 65 74 63 68 2c 20 32 2c 20 69 49 64 78 29  pFetch, 2, iIdx)
26090 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
260a0 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
260b0 65 70 28 70 46 65 74 63 68 29 20 29 7b 0a 20 20  ep(pFetch) ){.  
260c0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
260d0 61 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f  aRoot = sqlite3_
260e0 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 46 65 74  column_blob(pFet
260f0 63 68 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 6e  ch, 4);.      in
26100 74 20 6e 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65  t nRoot = sqlite
26110 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
26120 46 65 74 63 68 2c 20 34 29 3b 0a 20 20 20 20 20  Fetch, 4);.     
26130 20 69 4f 6c 64 53 74 61 72 74 20 3d 20 73 71 6c   iOldStart = sql
26140 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
26150 34 28 70 46 65 74 63 68 2c 20 31 29 3b 0a 20 20  4(pFetch, 1);.  
26160 20 20 20 20 72 63 20 3d 20 66 74 73 33 54 72 75      rc = fts3Tru
26170 6e 63 61 74 65 4e 6f 64 65 28 61 52 6f 6f 74 2c  ncateNode(aRoot,
26180 20 6e 52 6f 6f 74 2c 20 26 72 6f 6f 74 2c 20 7a   nRoot, &root, z
26190 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 26 69 42  Term, nTerm, &iB
261a0 6c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lock);.    }.   
261b0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72   rc2 = sqlite3_r
261c0 65 73 65 74 28 70 46 65 74 63 68 29 3b 0a 20 20  eset(pFetch);.  
261d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
261e0 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
261f0 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63    }..  while( rc
26200 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
26210 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 68 61  Block ){.    cha
26220 72 20 2a 61 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20  r *aBlock = 0;. 
26230 20 20 20 69 6e 74 20 6e 42 6c 6f 63 6b 20 3d 20     int nBlock = 
26240 30 3b 0a 20 20 20 20 69 4e 65 77 53 74 61 72 74  0;.    iNewStart
26250 20 3d 20 69 42 6c 6f 63 6b 3b 0a 0a 20 20 20 20   = iBlock;..    
26260 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
26270 52 65 61 64 42 6c 6f 63 6b 28 70 2c 20 69 42 6c  ReadBlock(p, iBl
26280 6f 63 6b 2c 20 26 61 42 6c 6f 63 6b 2c 20 26 6e  ock, &aBlock, &n
26290 42 6c 6f 63 6b 2c 20 30 29 3b 0a 20 20 20 20 69  Block, 0);.    i
262a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
262b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
262c0 74 73 33 54 72 75 6e 63 61 74 65 4e 6f 64 65 28  ts3TruncateNode(
262d0 61 42 6c 6f 63 6b 2c 20 6e 42 6c 6f 63 6b 2c 20  aBlock, nBlock, 
262e0 26 62 6c 6f 63 6b 2c 20 7a 54 65 72 6d 2c 20 6e  &block, zTerm, n
262f0 54 65 72 6d 2c 20 26 69 42 6c 6f 63 6b 29 3b 0a  Term, &iBlock);.
26300 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
26310 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26320 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 57 72       rc = fts3Wr
26330 69 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 69 4e  iteSegment(p, iN
26340 65 77 53 74 61 72 74 2c 20 62 6c 6f 63 6b 2e 61  ewStart, block.a
26350 2c 20 62 6c 6f 63 6b 2e 6e 29 3b 0a 20 20 20 20  , block.n);.    
26360 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
26370 65 65 28 61 42 6c 6f 63 6b 29 3b 0a 20 20 7d 0a  ee(aBlock);.  }.
26380 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69  .  /* Variable i
26390 4e 65 77 53 74 61 72 74 20 6e 6f 77 20 63 6f 6e  NewStart now con
263a0 74 61 69 6e 73 20 74 68 65 20 66 69 72 73 74 20  tains the first 
263b0 76 61 6c 69 64 20 6c 65 61 66 20 6e 6f 64 65 2e  valid leaf node.
263c0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
263d0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4e 65 77 53  LITE_OK && iNewS
263e0 74 61 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  tart ){.    sqli
263f0 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c 20 3d  te3_stmt *pDel =
26400 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   0;.    rc = fts
26410 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
26420 44 45 4c 45 54 45 5f 53 45 47 4d 45 4e 54 53 5f  DELETE_SEGMENTS_
26430 52 41 4e 47 45 2c 20 26 70 44 65 6c 2c 20 30 29  RANGE, &pDel, 0)
26440 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
26450 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26460 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
26470 74 36 34 28 70 44 65 6c 2c 20 31 2c 20 69 4f 6c  t64(pDel, 1, iOl
26480 64 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73  dStart);.      s
26490 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
264a0 34 28 70 44 65 6c 2c 20 32 2c 20 69 4e 65 77 53  4(pDel, 2, iNewS
264b0 74 61 72 74 2d 31 29 3b 0a 20 20 20 20 20 20 73  tart-1);.      s
264c0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 44 65 6c  qlite3_step(pDel
264d0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
264e0 6c 69 74 65 33 5f 72 65 73 65 74 28 70 44 65 6c  lite3_reset(pDel
264f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
26500 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26510 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
26520 5f 73 74 6d 74 20 2a 70 43 68 6f 6d 70 20 3d 20  _stmt *pChomp = 
26530 30 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  0;.    rc = fts3
26540 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 43  SqlStmt(p, SQL_C
26550 48 4f 4d 50 5f 53 45 47 44 49 52 2c 20 26 70 43  HOMP_SEGDIR, &pC
26560 68 6f 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66  homp, 0);.    if
26570 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26580 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
26590 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 43 68 6f  _bind_int64(pCho
265a0 6d 70 2c 20 31 2c 20 69 4e 65 77 53 74 61 72 74  mp, 1, iNewStart
265b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
265c0 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 43 68 6f 6d  _bind_blob(pChom
265d0 70 2c 20 32 2c 20 72 6f 6f 74 2e 61 2c 20 72 6f  p, 2, root.a, ro
265e0 6f 74 2e 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41  ot.n, SQLITE_STA
265f0 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TIC);.      sqli
26600 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
26610 43 68 6f 6d 70 2c 20 33 2c 20 69 41 62 73 4c 65  Chomp, 3, iAbsLe
26620 76 65 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  vel);.      sqli
26630 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 43 68  te3_bind_int(pCh
26640 6f 6d 70 2c 20 34 2c 20 69 49 64 78 29 3b 0a 20  omp, 4, iIdx);. 
26650 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65       sqlite3_ste
26660 70 28 70 43 68 6f 6d 70 29 3b 0a 20 20 20 20 20  p(pChomp);.     
26670 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
26680 73 65 74 28 70 43 68 6f 6d 70 29 3b 0a 20 20 20  set(pChomp);.   
26690 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
266a0 33 5f 66 72 65 65 28 72 6f 6f 74 2e 61 29 3b 0a  3_free(root.a);.
266b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 62    sqlite3_free(b
266c0 6c 6f 63 6b 2e 61 29 3b 0a 20 20 72 65 74 75 72  lock.a);.  retur
266d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
266e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
266f0 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6e 20  called after an 
26700 69 6e 63 72 6d 65 6e 74 61 6c 2d 6d 65 72 67 65  incrmental-merge
26710 20 6f 70 65 72 61 74 69 6f 6e 20 68 61 73 20 72   operation has r
26720 75 6e 20 74 6f 0a 2a 2a 20 6d 65 72 67 65 20 28  un to.** merge (
26730 6f 72 20 70 61 72 74 69 61 6c 6c 79 20 6d 65 72  or partially mer
26740 67 65 29 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ge) two or more 
26750 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 61 62  segments from ab
26760 73 6f 6c 75 74 65 20 6c 65 76 65 6c 0a 2a 2a 20  solute level.** 
26770 69 41 62 73 4c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a  iAbsLevel..**.**
26780 20 45 61 63 68 20 69 6e 70 75 74 20 73 65 67 6d   Each input segm
26790 65 6e 74 20 69 73 20 65 69 74 68 65 72 20 72 65  ent is either re
267a0 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64  moved from the d
267b0 62 20 63 6f 6d 70 6c 65 74 65 6c 79 20 28 69 66  b completely (if
267c0 20 61 6c 6c 20 6f 66 0a 2a 2a 20 69 74 73 20 64   all of.** its d
267d0 61 74 61 20 77 61 73 20 63 6f 70 69 65 64 20 74  ata was copied t
267e0 6f 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67  o the output seg
267f0 6d 65 6e 74 20 62 79 20 74 68 65 20 69 6e 63 72  ment by the incr
26800 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 29  merge operation)
26810 0a 2a 2a 20 6f 72 20 6d 6f 64 69 66 69 65 64 20  .** or modified 
26820 69 6e 20 70 6c 61 63 65 20 73 6f 20 74 68 61 74  in place so that
26830 20 69 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f   it no longer co
26840 6e 74 61 69 6e 73 20 74 68 6f 73 65 20 65 6e 74  ntains those ent
26850 72 69 65 73 20 74 68 61 74 0a 2a 2a 20 68 61 76  ries that.** hav
26860 65 20 62 65 65 6e 20 64 75 70 6c 69 63 61 74 65  e been duplicate
26870 64 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20  d in the output 
26880 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  segment..*/.stat
26890 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72 6d  ic int fts3Incrm
268a0 65 72 67 65 43 68 6f 6d 70 28 0a 20 20 46 74 73  ergeChomp(.  Fts
268b0 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
268c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
268d0 46 54 53 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  FTS table handle
268e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
268f0 74 36 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 20  t64 iAbsLevel,  
26900 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74        /* Absolut
26910 65 20 6c 65 76 65 6c 20 63 6f 6e 74 61 69 6e 69  e level containi
26920 6e 67 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  ng segments */. 
26930 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61   Fts3MultiSegRea
26940 64 65 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20  der *pCsr,      
26950 20 2f 2a 20 43 68 6f 6d 70 20 61 6c 6c 20 73 65   /* Chomp all se
26960 67 6d 65 6e 74 73 20 6f 70 65 6e 65 64 20 62 79  gments opened by
26970 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a   this cursor */.
26980 20 20 69 6e 74 20 2a 70 6e 52 65 6d 20 20 20 20    int *pnRem    
26990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
269b0 65 67 6d 65 6e 74 73 20 6e 6f 74 20 64 65 6c 65  egments not dele
269c0 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ted */.){.  int 
269d0 69 3b 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20  i;.  int nRem = 
269e0 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
269f0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 66 6f 72 28  LITE_OK;..  for(
26a00 69 3d 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74  i=pCsr->nSegment
26a10 2d 31 3b 20 69 3e 3d 30 20 26 26 20 72 63 3d 3d  -1; i>=0 && rc==
26a20 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2d 2d 29 7b  SQLITE_OK; i--){
26a30 0a 20 20 20 20 46 74 73 33 53 65 67 52 65 61 64  .    Fts3SegRead
26a40 65 72 20 2a 70 53 65 67 20 3d 20 30 3b 0a 20 20  er *pSeg = 0;.  
26a50 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 20 20 2f 2a    int j;..    /*
26a60 20 46 69 6e 64 20 74 68 65 20 46 74 73 33 53 65   Find the Fts3Se
26a70 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74 20 77  gReader object w
26a80 69 74 68 20 46 74 73 33 53 65 67 52 65 61 64 65  ith Fts3SegReade
26a90 72 2e 69 49 64 78 3d 3d 69 2e 20 49 74 20 69 73  r.iIdx==i. It is
26aa0 20 68 69 64 69 6e 67 0a 20 20 20 20 2a 2a 20 73   hiding.    ** s
26ab0 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65 20  omewhere in the 
26ac0 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b  pCsr->apSegment[
26ad0 5d 20 61 72 72 61 79 2e 20 20 2a 2f 0a 20 20 20  ] array.  */.   
26ae0 20 66 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59 53   for(j=0; ALWAYS
26af0 28 6a 3c 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e  (j<pCsr->nSegmen
26b00 74 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  t); j++){.      
26b10 70 53 65 67 20 3d 20 70 43 73 72 2d 3e 61 70 53  pSeg = pCsr->apS
26b20 65 67 6d 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 20  egment[j];.     
26b30 20 69 66 28 20 70 53 65 67 2d 3e 69 49 64 78 3d   if( pSeg->iIdx=
26b40 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =i ) break;.    
26b50 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  }.    assert( j<
26b60 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 20 26  pCsr->nSegment &
26b70 26 20 70 53 65 67 2d 3e 69 49 64 78 3d 3d 69 20  & pSeg->iIdx==i 
26b80 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 65 67  );..    if( pSeg
26b90 2d 3e 61 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  ->aNode==0 ){.  
26ba0 20 20 20 20 2f 2a 20 53 65 67 2d 72 65 61 64 65      /* Seg-reade
26bb0 72 20 69 73 20 61 74 20 45 4f 46 2e 20 52 65 6d  r is at EOF. Rem
26bc0 6f 76 65 20 74 68 65 20 65 6e 74 69 72 65 20 69  ove the entire i
26bd0 6e 70 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a 2f  nput segment. */
26be0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33  .      rc = fts3
26bf0 44 65 6c 65 74 65 53 65 67 6d 65 6e 74 28 70 2c  DeleteSegment(p,
26c00 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20 69 66   pSeg);.      if
26c10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26c20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
26c30 66 74 73 33 52 65 6d 6f 76 65 53 65 67 64 69 72  fts3RemoveSegdir
26c40 45 6e 74 72 79 28 70 2c 20 69 41 62 73 4c 65 76  Entry(p, iAbsLev
26c50 65 6c 2c 20 70 53 65 67 2d 3e 69 49 64 78 29 3b  el, pSeg->iIdx);
26c60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
26c70 70 6e 52 65 6d 20 3d 20 30 3b 0a 20 20 20 20 7d  pnRem = 0;.    }
26c80 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54  else{.      /* T
26c90 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d  he incremental m
26ca0 65 72 67 65 20 64 69 64 20 6e 6f 74 20 63 6f 70  erge did not cop
26cb0 79 20 61 6c 6c 20 74 68 65 20 64 61 74 61 20 66  y all the data f
26cc0 72 6f 6d 20 74 68 69 73 20 0a 20 20 20 20 20 20  rom this .      
26cd0 2a 2a 20 73 65 67 6d 65 6e 74 20 74 6f 20 74 68  ** segment to th
26ce0 65 20 75 70 70 65 72 20 6c 65 76 65 6c 2e 20 54  e upper level. T
26cf0 68 65 20 73 65 67 6d 65 6e 74 20 69 73 20 6d 6f  he segment is mo
26d00 64 69 66 69 65 64 20 69 6e 20 70 6c 61 63 65 0a  dified in place.
26d10 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74        ** so that
26d20 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   it contains no 
26d30 6b 65 79 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  keys smaller tha
26d40 6e 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 2a  n zTerm/nTerm. *
26d50 2f 20 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  / .      const c
26d60 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 70 53 65  har *zTerm = pSe
26d70 67 2d 3e 7a 54 65 72 6d 3b 0a 20 20 20 20 20 20  g->zTerm;.      
26d80 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70 53 65 67  int nTerm = pSeg
26d90 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 72  ->nTerm;.      r
26da0 63 20 3d 20 66 74 73 33 54 72 75 6e 63 61 74 65  c = fts3Truncate
26db0 53 65 67 6d 65 6e 74 28 70 2c 20 69 41 62 73 4c  Segment(p, iAbsL
26dc0 65 76 65 6c 2c 20 70 53 65 67 2d 3e 69 49 64 78  evel, pSeg->iIdx
26dd0 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b  , zTerm, nTerm);
26de0 0a 20 20 20 20 20 20 6e 52 65 6d 2b 2b 3b 0a 20  .      nRem++;. 
26df0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
26e00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
26e10 20 6e 52 65 6d 21 3d 70 43 73 72 2d 3e 6e 53 65   nRem!=pCsr->nSe
26e20 67 6d 65 6e 74 20 29 7b 0a 20 20 20 20 72 63 20  gment ){.    rc 
26e30 3d 20 66 74 73 33 52 65 70 61 63 6b 53 65 67 64  = fts3RepackSegd
26e40 69 72 4c 65 76 65 6c 28 70 2c 20 69 41 62 73 4c  irLevel(p, iAbsL
26e50 65 76 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70  evel);.  }..  *p
26e60 6e 52 65 6d 20 3d 20 6e 52 65 6d 3b 0a 20 20 72  nRem = nRem;.  r
26e70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
26e80 2a 2a 20 53 74 6f 72 65 20 61 6e 20 69 6e 63 72  ** Store an incr
26e90 2d 6d 65 72 67 65 20 68 69 6e 74 20 69 6e 20 74  -merge hint in t
26ea0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
26eb0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49  static int fts3I
26ec0 6e 63 72 6d 65 72 67 65 48 69 6e 74 53 74 6f 72  ncrmergeHintStor
26ed0 65 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20  e(Fts3Table *p, 
26ee0 42 6c 6f 62 20 2a 70 48 69 6e 74 29 7b 0a 20 20  Blob *pHint){.  
26ef0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 52  sqlite3_stmt *pR
26f00 65 70 6c 61 63 65 20 3d 20 30 3b 0a 20 20 69 6e  eplace = 0;.  in
26f10 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
26f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26f30 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
26f40 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
26f50 74 6d 74 28 70 2c 20 53 51 4c 5f 52 45 50 4c 41  tmt(p, SQL_REPLA
26f60 43 45 5f 53 54 41 54 2c 20 26 70 52 65 70 6c 61  CE_STAT, &pRepla
26f70 63 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ce, 0);.  if( rc
26f80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26f90 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
26fa0 69 6e 74 28 70 52 65 70 6c 61 63 65 2c 20 31 2c  int(pReplace, 1,
26fb0 20 46 54 53 5f 53 54 41 54 5f 49 4e 43 52 4d 45   FTS_STAT_INCRME
26fc0 52 47 45 48 49 4e 54 29 3b 0a 20 20 20 20 73 71  RGEHINT);.    sq
26fd0 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28  lite3_bind_blob(
26fe0 70 52 65 70 6c 61 63 65 2c 20 32 2c 20 70 48 69  pReplace, 2, pHi
26ff0 6e 74 2d 3e 61 2c 20 70 48 69 6e 74 2d 3e 6e 2c  nt->a, pHint->n,
27000 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
27010 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65  .    sqlite3_ste
27020 70 28 70 52 65 70 6c 61 63 65 29 3b 0a 20 20 20  p(pReplace);.   
27030 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
27040 73 65 74 28 70 52 65 70 6c 61 63 65 29 3b 0a 20  set(pReplace);. 
27050 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
27060 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 61  .}../*.** Load a
27070 6e 20 69 6e 63 72 2d 6d 65 72 67 65 20 68 69 6e  n incr-merge hin
27080 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  t from the datab
27090 61 73 65 2e 20 54 68 65 20 69 6e 63 72 2d 6d 65  ase. The incr-me
270a0 72 67 65 20 68 69 6e 74 2c 20 69 66 20 6f 6e 65  rge hint, if one
270b0 20 0a 2a 2a 20 65 78 69 73 74 73 2c 20 69 73 20   .** exists, is 
270c0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 72 6f  stored in the ro
270d0 77 69 64 3d 3d 31 20 72 6f 77 20 6f 66 20 74 68  wid==1 row of th
270e0 65 20 25 5f 73 74 61 74 20 74 61 62 6c 65 2e 0a  e %_stat table..
270f0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
27100 66 75 6c 2c 20 70 6f 70 75 6c 61 74 65 20 62 6c  ful, populate bl
27110 6f 62 20 2a 70 48 69 6e 74 20 77 69 74 68 20 74  ob *pHint with t
27120 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
27130 6f 6d 20 74 68 65 20 25 5f 73 74 61 74 0a 2a 2a  om the %_stat.**
27140 20 74 61 62 6c 65 20 61 6e 64 20 72 65 74 75 72   table and retur
27150 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68  n SQLITE_OK. Oth
27160 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72  erwise, if an er
27170 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
27180 72 6e 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20  rn an.** SQLite 
27190 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
271a0 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e  tatic int fts3In
271b0 63 72 6d 65 72 67 65 48 69 6e 74 4c 6f 61 64 28  crmergeHintLoad(
271c0 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 42 6c  Fts3Table *p, Bl
271d0 6f 62 20 2a 70 48 69 6e 74 29 7b 0a 20 20 73 71  ob *pHint){.  sq
271e0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c  lite3_stmt *pSel
271f0 65 63 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ect = 0;.  int r
27200 63 3b 0a 0a 20 20 70 48 69 6e 74 2d 3e 6e 20 3d  c;..  pHint->n =
27210 20 30 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53   0;.  rc = fts3S
27220 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45  qlStmt(p, SQL_SE
27230 4c 45 43 54 5f 53 54 41 54 2c 20 26 70 53 65 6c  LECT_STAT, &pSel
27240 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ect, 0);.  if( r
27250 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27260 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
27270 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
27280 74 28 70 53 65 6c 65 63 74 2c 20 31 2c 20 46 54  t(pSelect, 1, FT
27290 53 5f 53 54 41 54 5f 49 4e 43 52 4d 45 52 47 45  S_STAT_INCRMERGE
272a0 48 49 4e 54 29 3b 0a 20 20 20 20 69 66 28 20 53  HINT);.    if( S
272b0 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
272c0 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29  e3_step(pSelect)
272d0 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
272e0 63 68 61 72 20 2a 61 48 69 6e 74 20 3d 20 73 71  char *aHint = sq
272f0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
27300 62 28 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  b(pSelect, 0);. 
27310 20 20 20 20 20 69 6e 74 20 6e 48 69 6e 74 20 3d       int nHint =
27320 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
27330 62 79 74 65 73 28 70 53 65 6c 65 63 74 2c 20 30  bytes(pSelect, 0
27340 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 48 69  );.      if( aHi
27350 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 62 6c  nt ){.        bl
27360 6f 62 47 72 6f 77 42 75 66 66 65 72 28 70 48 69  obGrowBuffer(pHi
27370 6e 74 2c 20 6e 48 69 6e 74 2c 20 26 72 63 29 3b  nt, nHint, &rc);
27380 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
27390 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
273a0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
273b0 48 69 6e 74 2d 3e 61 2c 20 61 48 69 6e 74 2c 20  Hint->a, aHint, 
273c0 6e 48 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  nHint);.        
273d0 20 20 70 48 69 6e 74 2d 3e 6e 20 3d 20 6e 48 69    pHint->n = nHi
273e0 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nt;.        }.  
273f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
27400 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  rc2 = sqlite3_re
27410 73 65 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  set(pSelect);.  
27420 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27430 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
27440 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
27450 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70  ;.}../*.** If *p
27460 52 63 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45  Rc is not SQLITE
27470 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  _OK when this fu
27480 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
27490 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
274a0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
274b0 70 70 65 6e 64 20 61 6e 20 65 6e 74 72 79 20 74  ppend an entry t
274c0 6f 20 74 68 65 20 68 69 6e 74 20 73 74 6f 72 65  o the hint store
274d0 64 20 69 6e 20 62 6c 6f 62 20 2a 70 48 69 6e 74  d in blob *pHint
274e0 2e 20 45 61 63 68 20 65 6e 74 72 79 0a 2a 2a 20  . Each entry.** 
274f0 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 77 6f 20  consists of two 
27500 76 61 72 69 6e 74 73 2c 20 74 68 65 20 61 62 73  varints, the abs
27510 6f 6c 75 74 65 20 6c 65 76 65 6c 20 6e 75 6d 62  olute level numb
27520 65 72 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  er of the input 
27530 73 65 67 6d 65 6e 74 73 20 0a 2a 2a 20 61 6e 64  segments .** and
27540 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   the number of i
27550 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 2e 0a 2a  nput segments..*
27560 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
27570 75 6c 2c 20 6c 65 61 76 65 20 2a 70 52 63 20 73  ul, leave *pRc s
27580 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
27590 61 6e 64 20 72 65 74 75 72 6e 2e 20 49 66 20 61  and return. If a
275a0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a  n error occurs,.
275b0 2a 2a 20 73 65 74 20 2a 70 52 63 20 74 6f 20 61  ** set *pRc to a
275c0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
275d0 6f 64 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ode before retur
275e0 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
275f0 76 6f 69 64 20 66 74 73 33 49 6e 63 72 6d 65 72  void fts3Incrmer
27600 67 65 48 69 6e 74 50 75 73 68 28 0a 20 20 42 6c  geHintPush(.  Bl
27610 6f 62 20 2a 70 48 69 6e 74 2c 20 20 20 20 20 20  ob *pHint,      
27620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27630 20 48 69 6e 74 20 62 6c 6f 62 20 74 6f 20 61 70   Hint blob to ap
27640 70 65 6e 64 20 74 6f 20 2a 2f 0a 20 20 69 36 34  pend to */.  i64
27650 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 20   iAbsLevel,     
27660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27670 46 69 72 73 74 20 76 61 72 69 6e 74 20 74 6f 20  First varint to 
27680 73 74 6f 72 65 20 69 6e 20 68 69 6e 74 20 2a 2f  store in hint */
27690 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74 2c 20 20  .  int nInput,  
276a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276b0 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 76 61 72     /* Second var
276c0 69 6e 74 20 74 6f 20 73 74 6f 72 65 20 69 6e 20  int to store in 
276d0 68 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  hint */.  int *p
276e0 52 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc              
276f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
27700 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20  OUT: Error code 
27710 2a 2f 0a 29 7b 0a 20 20 62 6c 6f 62 47 72 6f 77  */.){.  blobGrow
27720 42 75 66 66 65 72 28 70 48 69 6e 74 2c 20 70 48  Buffer(pHint, pH
27730 69 6e 74 2d 3e 6e 20 2b 20 32 2a 46 54 53 33 5f  int->n + 2*FTS3_
27740 56 41 52 49 4e 54 5f 4d 41 58 2c 20 70 52 63 29  VARINT_MAX, pRc)
27750 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51  ;.  if( *pRc==SQ
27760 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
27770 48 69 6e 74 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  Hint->n += sqlit
27780 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28  e3Fts3PutVarint(
27790 26 70 48 69 6e 74 2d 3e 61 5b 70 48 69 6e 74 2d  &pHint->a[pHint-
277a0 3e 6e 5d 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b  >n], iAbsLevel);
277b0 0a 20 20 20 20 70 48 69 6e 74 2d 3e 6e 20 2b 3d  .    pHint->n +=
277c0 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56   sqlite3Fts3PutV
277d0 61 72 69 6e 74 28 26 70 48 69 6e 74 2d 3e 61 5b  arint(&pHint->a[
277e0 70 48 69 6e 74 2d 3e 6e 5d 2c 20 28 69 36 34 29  pHint->n], (i64)
277f0 6e 49 6e 70 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  nInput);.  }.}..
27800 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 6c  /*.** Read the l
27810 61 73 74 20 65 6e 74 72 79 20 28 6d 6f 73 74 20  ast entry (most 
27820 72 65 63 65 6e 74 6c 79 20 70 75 73 68 65 64 29  recently pushed)
27830 20 66 72 6f 6d 20 74 68 65 20 68 69 6e 74 20 62   from the hint b
27840 6c 6f 62 20 2a 70 48 69 6e 74 0a 2a 2a 20 61 6e  lob *pHint.** an
27850 64 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68  d then remove th
27860 65 20 65 6e 74 72 79 2e 20 57 72 69 74 65 20 74  e entry. Write t
27870 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20 72 65  he two values re
27880 61 64 20 74 6f 20 2a 70 69 41 62 73 4c 65 76 65  ad to *piAbsLeve
27890 6c 20 61 6e 64 20 0a 2a 2a 20 2a 70 6e 49 6e 70  l and .** *pnInp
278a0 75 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ut before return
278b0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ing..**.** If no
278c0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
278d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
278e0 20 49 66 20 74 68 65 20 68 69 6e 74 20 62 6c 6f   If the hint blo
278f0 62 20 69 6e 20 2a 70 48 69 6e 74 20 64 6f 65 73  b in *pHint does
27900 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
27910 61 74 20 6c 65 61 73 74 20 74 77 6f 20 76 61 6c  at least two val
27920 69 64 20 76 61 72 69 6e 74 73 2c 20 72 65 74 75  id varints, retu
27930 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
27940 54 5f 56 54 41 42 2e 0a 2a 2f 0a 73 74 61 74 69  T_VTAB..*/.stati
27950 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72 6d 65  c int fts3Incrme
27960 72 67 65 48 69 6e 74 50 6f 70 28 42 6c 6f 62 20  rgeHintPop(Blob 
27970 2a 70 48 69 6e 74 2c 20 69 36 34 20 2a 70 69 41  *pHint, i64 *piA
27980 62 73 4c 65 76 65 6c 2c 20 69 6e 74 20 2a 70 6e  bsLevel, int *pn
27990 49 6e 70 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20  Input){.  const 
279a0 69 6e 74 20 6e 48 69 6e 74 20 3d 20 70 48 69 6e  int nHint = pHin
279b0 74 2d 3e 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  t->n;.  int i;..
279c0 20 20 69 20 3d 20 70 48 69 6e 74 2d 3e 6e 2d 32    i = pHint->n-2
279d0 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 26  ;.  while( i>0 &
279e0 26 20 28 70 48 69 6e 74 2d 3e 61 5b 69 2d 31 5d  & (pHint->a[i-1]
279f0 20 26 20 30 78 38 30 29 20 29 20 69 2d 2d 3b 0a   & 0x80) ) i--;.
27a00 20 20 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20    while( i>0 && 
27a10 28 70 48 69 6e 74 2d 3e 61 5b 69 2d 31 5d 20 26  (pHint->a[i-1] &
27a20 20 30 78 38 30 29 20 29 20 69 2d 2d 3b 0a 0a 20   0x80) ) i--;.. 
27a30 20 70 48 69 6e 74 2d 3e 6e 20 3d 20 69 3b 0a 20   pHint->n = i;. 
27a40 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73   i += sqlite3Fts
27a50 33 47 65 74 56 61 72 69 6e 74 28 26 70 48 69 6e  3GetVarint(&pHin
27a60 74 2d 3e 61 5b 69 5d 2c 20 70 69 41 62 73 4c 65  t->a[i], piAbsLe
27a70 76 65 6c 29 3b 0a 20 20 69 20 2b 3d 20 66 74 73  vel);.  i += fts
27a80 33 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 48  3GetVarint32(&pH
27a90 69 6e 74 2d 3e 61 5b 69 5d 2c 20 70 6e 49 6e 70  int->a[i], pnInp
27aa0 75 74 29 3b 0a 20 20 69 66 28 20 69 21 3d 6e 48  ut);.  if( i!=nH
27ab0 69 6e 74 20 29 20 72 65 74 75 72 6e 20 46 54 53  int ) return FTS
27ac0 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 0a  _CORRUPT_VTAB;..
27ad0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27ae0 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 74  OK;.}.../*.** At
27af0 74 65 6d 70 74 20 61 6e 20 69 6e 63 72 65 6d 65  tempt an increme
27b00 6e 74 61 6c 20 6d 65 72 67 65 20 74 68 61 74 20  ntal merge that 
27b10 77 72 69 74 65 73 20 6e 4d 65 72 67 65 20 6c 65  writes nMerge le
27b20 61 66 20 62 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a  af blocks..**.**
27b30 20 49 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72   Incremental mer
27b40 67 65 73 20 68 61 70 70 65 6e 20 6e 4d 69 6e 20  ges happen nMin 
27b50 73 65 67 6d 65 6e 74 73 20 61 74 20 61 20 74 69  segments at a ti
27b60 6d 65 2e 20 54 68 65 20 73 65 67 6d 65 6e 74 73  me. The segments
27b70 20 0a 2a 2a 20 74 6f 20 62 65 20 6d 65 72 67 65   .** to be merge
27b80 64 20 61 72 65 20 74 68 65 20 6e 4d 69 6e 20 6f  d are the nMin o
27b90 6c 64 65 73 74 20 73 65 67 6d 65 6e 74 73 20 28  ldest segments (
27ba0 74 68 65 20 6f 6e 65 73 20 77 69 74 68 20 74 68  the ones with th
27bb0 65 20 73 6d 61 6c 6c 65 73 74 20 0a 2a 2a 20 76  e smallest .** v
27bc0 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 5f 73  alues for the _s
27bd0 65 67 64 69 72 2e 69 64 78 20 66 69 65 6c 64 29  egdir.idx field)
27be0 20 69 6e 20 74 68 65 20 68 69 67 68 65 73 74 20   in the highest 
27bf0 6c 65 76 65 6c 20 74 68 61 74 20 63 6f 6e 74 61  level that conta
27c00 69 6e 73 20 0a 2a 2a 20 61 74 20 6c 65 61 73 74  ins .** at least
27c10 20 6e 4d 69 6e 20 73 65 67 6d 65 6e 74 73 2e 20   nMin segments. 
27c20 4d 75 6c 74 69 70 6c 65 20 6d 65 72 67 65 73 20  Multiple merges 
27c30 6d 69 67 68 74 20 6f 63 63 75 72 20 69 6e 20 61  might occur in a
27c40 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a  n attempt to .**
27c50 20 77 72 69 74 65 20 74 68 65 20 71 75 6f 74 61   write the quota
27c60 20 6f 66 20 6e 4d 65 72 67 65 20 6c 65 61 66 20   of nMerge leaf 
27c70 62 6c 6f 63 6b 73 2e 0a 2a 2f 0a 69 6e 74 20 73  blocks..*/.int s
27c80 71 6c 69 74 65 33 46 74 73 33 49 6e 63 72 6d 65  qlite3Fts3Incrme
27c90 72 67 65 28 46 74 73 33 54 61 62 6c 65 20 2a 70  rge(Fts3Table *p
27ca0 2c 20 69 6e 74 20 6e 4d 65 72 67 65 2c 20 69 6e  , int nMerge, in
27cb0 74 20 6e 4d 69 6e 29 7b 0a 20 20 69 6e 74 20 72  t nMin){.  int r
27cc0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
27cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
27ce0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
27cf0 6e 74 20 6e 52 65 6d 20 3d 20 6e 4d 65 72 67 65  nt nRem = nMerge
27d00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
27d10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  * Number of leaf
27d20 20 70 61 67 65 73 20 79 65 74 20 74 6f 20 20 62   pages yet to  b
27d30 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 46  e written */.  F
27d40 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
27d50 72 20 2a 70 43 73 72 3b 20 20 20 20 20 20 20 2f  r *pCsr;       /
27d60 2a 20 43 75 72 73 6f 72 20 75 73 65 64 20 74 6f  * Cursor used to
27d70 20 72 65 61 64 20 69 6e 70 75 74 20 64 61 74 61   read input data
27d80 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 46 69 6c   */.  Fts3SegFil
27d90 74 65 72 20 2a 70 46 69 6c 74 65 72 3b 20 20 20  ter *pFilter;   
27da0 20 20 20 20 20 20 2f 2a 20 46 69 6c 74 65 72 20        /* Filter 
27db0 75 73 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  used with cursor
27dc0 20 70 43 73 72 20 2a 2f 0a 20 20 49 6e 63 72 6d   pCsr */.  Incrm
27dd0 65 72 67 65 57 72 69 74 65 72 20 2a 70 57 72 69  ergeWriter *pWri
27de0 74 65 72 3b 20 20 20 20 20 20 20 2f 2a 20 57 72  ter;       /* Wr
27df0 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  iter object */. 
27e00 20 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b 20 20   int nSeg = 0;  
27e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
27e30 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  put segments */.
27e40 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
27e50 69 41 62 73 4c 65 76 65 6c 20 3d 20 30 3b 20 20  iAbsLevel = 0;  
27e60 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65    /* Absolute le
27e70 76 65 6c 20 6e 75 6d 62 65 72 20 74 6f 20 77 6f  vel number to wo
27e80 72 6b 20 6f 6e 20 2a 2f 0a 20 20 42 6c 6f 62 20  rk on */.  Blob 
27e90 68 69 6e 74 20 3d 20 7b 30 2c 20 30 2c 20 30 7d  hint = {0, 0, 0}
27ea0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 69  ;          /* Hi
27eb0 6e 74 20 72 65 61 64 20 66 72 6f 6d 20 25 5f 73  nt read from %_s
27ec0 74 61 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  tat table */.  i
27ed0 6e 74 20 62 44 69 72 74 79 48 69 6e 74 20 3d 20  nt bDirtyHint = 
27ee0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
27ef0 2a 20 54 72 75 65 20 69 66 20 62 6c 6f 62 20 27  * True if blob '
27f00 68 69 6e 74 27 20 68 61 73 20 62 65 65 6e 20 6d  hint' has been m
27f10 6f 64 69 66 69 65 64 20 2a 2f 0a 0a 20 20 2f 2a  odified */..  /*
27f20 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
27f30 66 6f 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20  for the cursor, 
27f40 66 69 6c 74 65 72 20 61 6e 64 20 77 72 69 74 65  filter and write
27f50 72 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 63  r objects */.  c
27f60 6f 6e 73 74 20 69 6e 74 20 6e 41 6c 6c 6f 63 20  onst int nAlloc 
27f70 3d 20 73 69 7a 65 6f 66 28 2a 70 43 73 72 29 20  = sizeof(*pCsr) 
27f80 2b 20 73 69 7a 65 6f 66 28 2a 70 46 69 6c 74 65  + sizeof(*pFilte
27f90 72 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 57 72  r) + sizeof(*pWr
27fa0 69 74 65 72 29 3b 0a 20 20 70 57 72 69 74 65 72  iter);.  pWriter
27fb0 20 3d 20 28 49 6e 63 72 6d 65 72 67 65 57 72 69   = (IncrmergeWri
27fc0 74 65 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  ter *)sqlite3_ma
27fd0 6c 6c 6f 63 28 6e 41 6c 6c 6f 63 29 3b 0a 20 20  lloc(nAlloc);.  
27fe0 69 66 28 20 21 70 57 72 69 74 65 72 20 29 20 72  if( !pWriter ) r
27ff0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
28000 45 4d 3b 0a 20 20 70 46 69 6c 74 65 72 20 3d 20  EM;.  pFilter = 
28010 28 46 74 73 33 53 65 67 46 69 6c 74 65 72 20 2a  (Fts3SegFilter *
28020 29 26 70 57 72 69 74 65 72 5b 31 5d 3b 0a 20 20  )&pWriter[1];.  
28030 70 43 73 72 20 3d 20 28 46 74 73 33 4d 75 6c 74  pCsr = (Fts3Mult
28040 69 53 65 67 52 65 61 64 65 72 20 2a 29 26 70 46  iSegReader *)&pF
28050 69 6c 74 65 72 5b 31 5d 3b 0a 0a 20 20 72 63 20  ilter[1];..  rc 
28060 3d 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 48  = fts3IncrmergeH
28070 69 6e 74 4c 6f 61 64 28 70 2c 20 26 68 69 6e 74  intLoad(p, &hint
28080 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
28090 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 52 65  SQLITE_OK && nRe
280a0 6d 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  m>0 ){.    const
280b0 20 69 36 34 20 6e 4d 6f 64 20 3d 20 46 54 53 33   i64 nMod = FTS3
280c0 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c  _SEGDIR_MAXLEVEL
280d0 20 2a 20 70 2d 3e 6e 49 6e 64 65 78 3b 0a 20 20   * p->nIndex;.  
280e0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
280f0 70 46 69 6e 64 4c 65 76 65 6c 20 3d 20 30 3b 20  pFindLevel = 0; 
28100 2f 2a 20 53 51 4c 20 75 73 65 64 20 74 6f 20 64  /* SQL used to d
28110 65 74 65 72 6d 69 6e 65 20 69 41 62 73 4c 65 76  etermine iAbsLev
28120 65 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 55  el */.    int bU
28130 73 65 48 69 6e 74 20 3d 20 30 3b 20 20 20 20 20  seHint = 0;     
28140 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
28150 69 66 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  if attempting to
28160 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 20 20 69   append */.    i
28170 6e 74 20 69 49 64 78 20 3d 20 30 3b 20 20 20 20  nt iIdx = 0;    
28180 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28190 4c 61 72 67 65 73 74 20 69 64 78 20 69 6e 20 6c  Largest idx in l
281a0 65 76 65 6c 20 28 69 41 62 73 4c 65 76 65 6c 2b  evel (iAbsLevel+
281b0 31 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  1) */..    /* Se
281c0 61 72 63 68 20 74 68 65 20 25 5f 73 65 67 64 69  arch the %_segdi
281d0 72 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20  r table for the 
281e0 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 77  absolute level w
281f0 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  ith the smallest
28200 0a 20 20 20 20 2a 2a 20 72 65 6c 61 74 69 76 65  .    ** relative
28210 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20 74 68   level number th
28220 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c  at contains at l
28230 65 61 73 74 20 6e 4d 69 6e 20 73 65 67 6d 65 6e  east nMin segmen
28240 74 73 2c 20 69 66 20 61 6e 79 2e 0a 20 20 20 20  ts, if any..    
28250 2a 2a 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75  ** If one is fou
28260 6e 64 2c 20 73 65 74 20 69 41 62 73 4c 65 76 65  nd, set iAbsLeve
28270 6c 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74  l to the absolut
28280 65 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20 61  e level number a
28290 6e 64 0a 20 20 20 20 2a 2a 20 6e 53 65 67 20 74  nd.    ** nSeg t
282a0 6f 20 6e 4d 69 6e 2e 20 49 66 20 6e 6f 20 6c 65  o nMin. If no le
282b0 76 65 6c 20 77 69 74 68 20 61 74 20 6c 65 61 73  vel with at leas
282c0 74 20 6e 4d 69 6e 20 73 65 67 6d 65 6e 74 73 20  t nMin segments 
282d0 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 0a 20  can be found, . 
282e0 20 20 20 2a 2a 20 73 65 74 20 6e 53 65 67 20 74     ** set nSeg t
282f0 6f 20 2d 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o -1..    */.   
28300 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
28310 74 28 70 2c 20 53 51 4c 5f 46 49 4e 44 5f 4d 45  t(p, SQL_FIND_ME
28320 52 47 45 5f 4c 45 56 45 4c 2c 20 26 70 46 69 6e  RGE_LEVEL, &pFin
28330 64 4c 65 76 65 6c 2c 20 30 29 3b 0a 20 20 20 20  dLevel, 0);.    
28340 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
28350 28 70 46 69 6e 64 4c 65 76 65 6c 2c 20 31 2c 20  (pFindLevel, 1, 
28360 4d 41 58 28 32 2c 20 6e 4d 69 6e 29 29 3b 0a 20  MAX(2, nMin));. 
28370 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
28380 74 65 70 28 70 46 69 6e 64 4c 65 76 65 6c 29 3d  tep(pFindLevel)=
28390 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
283a0 20 20 20 20 20 69 41 62 73 4c 65 76 65 6c 20 3d       iAbsLevel =
283b0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
283c0 69 6e 74 36 34 28 70 46 69 6e 64 4c 65 76 65 6c  int64(pFindLevel
283d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 6e 53 65 67  , 0);.      nSeg
283e0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
283f0 6e 5f 69 6e 74 28 70 46 69 6e 64 4c 65 76 65 6c  n_int(pFindLevel
28400 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 1);.      asse
28410 72 74 28 20 6e 53 65 67 3e 3d 32 20 29 3b 0a 20  rt( nSeg>=2 );. 
28420 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28430 6e 53 65 67 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  nSeg = -1;.    }
28440 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
28450 33 5f 72 65 73 65 74 28 70 46 69 6e 64 4c 65 76  3_reset(pFindLev
28460 65 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  el);..    /* If 
28470 74 68 65 20 68 69 6e 74 20 72 65 61 64 20 66 72  the hint read fr
28480 6f 6d 20 74 68 65 20 25 5f 73 74 61 74 20 74 61  om the %_stat ta
28490 62 6c 65 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  ble is not empty
284a0 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 0a 20  , check if the. 
284b0 20 20 20 2a 2a 20 6c 61 73 74 20 65 6e 74 72 79     ** last entry
284c0 20 69 6e 20 69 74 20 73 70 65 63 69 66 69 65 73   in it specifies
284d0 20 61 20 72 65 6c 61 74 69 76 65 20 6c 65 76 65   a relative leve
284e0 6c 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f  l smaller than o
284f0 72 20 65 71 75 61 6c 0a 20 20 20 20 2a 2a 20 74  r equal.    ** t
28500 6f 20 74 68 65 20 6c 65 76 65 6c 20 69 64 65 6e  o the level iden
28510 74 69 66 69 65 64 20 62 79 20 74 68 65 20 62 6c  tified by the bl
28520 6f 63 6b 20 61 62 6f 76 65 20 28 69 66 20 61 6e  ock above (if an
28530 79 29 2e 20 49 66 20 73 6f 2c 20 74 68 69 73 20  y). If so, this 
28540 0a 20 20 20 20 2a 2a 20 69 74 65 72 61 74 69 6f  .    ** iteratio
28550 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 69  n of the loop wi
28560 6c 6c 20 77 6f 72 6b 20 6f 6e 20 6d 65 72 67 69  ll work on mergi
28570 6e 67 20 61 74 20 74 68 65 20 68 69 6e 74 65 64  ng at the hinted
28580 20 6c 65 76 65 6c 2e 0a 20 20 20 20 2a 2f 0a 20   level..    */. 
28590 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
285a0 45 5f 4f 4b 20 26 26 20 68 69 6e 74 2e 6e 20 29  E_OK && hint.n )
285b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 48 69 6e  {.      int nHin
285c0 74 20 3d 20 68 69 6e 74 2e 6e 3b 0a 20 20 20 20  t = hint.n;.    
285d0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
285e0 69 48 69 6e 74 41 62 73 4c 65 76 65 6c 20 3d 20  iHintAbsLevel = 
285f0 30 3b 20 20 20 20 20 20 2f 2a 20 48 69 6e 74 20  0;      /* Hint 
28600 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 20 20 69  level */.      i
28610 6e 74 20 6e 48 69 6e 74 53 65 67 20 3d 20 30 3b  nt nHintSeg = 0;
28620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28630 20 20 20 20 20 2f 2a 20 48 69 6e 74 20 6e 75 6d       /* Hint num
28640 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
28650 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 66  */..      rc = f
28660 74 73 33 49 6e 63 72 6d 65 72 67 65 48 69 6e 74  ts3IncrmergeHint
28670 50 6f 70 28 26 68 69 6e 74 2c 20 26 69 48 69 6e  Pop(&hint, &iHin
28680 74 41 62 73 4c 65 76 65 6c 2c 20 26 6e 48 69 6e  tAbsLevel, &nHin
28690 74 53 65 67 29 3b 0a 20 20 20 20 20 20 69 66 28  tSeg);.      if(
286a0 20 6e 53 65 67 3c 30 20 7c 7c 20 28 69 41 62 73   nSeg<0 || (iAbs
286b0 4c 65 76 65 6c 20 25 20 6e 4d 6f 64 29 20 3e 3d  Level % nMod) >=
286c0 20 28 69 48 69 6e 74 41 62 73 4c 65 76 65 6c 20   (iHintAbsLevel 
286d0 25 20 6e 4d 6f 64 29 20 29 7b 0a 20 20 20 20 20  % nMod) ){.     
286e0 20 20 20 69 41 62 73 4c 65 76 65 6c 20 3d 20 69     iAbsLevel = i
286f0 48 69 6e 74 41 62 73 4c 65 76 65 6c 3b 0a 20 20  HintAbsLevel;.  
28700 20 20 20 20 20 20 6e 53 65 67 20 3d 20 6e 48 69        nSeg = nHi
28710 6e 74 53 65 67 3b 0a 20 20 20 20 20 20 20 20 62  ntSeg;.        b
28720 55 73 65 48 69 6e 74 20 3d 20 31 3b 0a 20 20 20  UseHint = 1;.   
28730 20 20 20 20 20 62 44 69 72 74 79 48 69 6e 74 20       bDirtyHint 
28740 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
28750 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
28760 73 20 75 6e 64 6f 65 73 20 74 68 65 20 65 66 66  s undoes the eff
28770 65 63 74 20 6f 66 20 74 68 65 20 48 69 6e 74 50  ect of the HintP
28780 6f 70 28 29 20 61 62 6f 76 65 20 2d 20 73 6f 20  op() above - so 
28790 74 68 61 74 20 6e 6f 20 65 6e 74 72 79 0a 20 20  that no entry.  
287a0 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 6d 6f        ** is remo
287b0 76 65 64 20 66 72 6f 6d 20 74 68 65 20 68 69 6e  ved from the hin
287c0 74 20 62 6c 6f 62 2e 20 20 2a 2f 0a 20 20 20 20  t blob.  */.    
287d0 20 20 20 20 68 69 6e 74 2e 6e 20 3d 20 6e 48 69      hint.n = nHi
287e0 6e 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nt;.      }.    
287f0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 53 65  }..    /* If nSe
28800 67 20 69 73 20 6c 65 73 73 20 74 68 61 74 20 7a  g is less that z
28810 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ero, then there 
28820 69 73 20 6e 6f 20 6c 65 76 65 6c 20 77 69 74 68  is no level with
28830 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 2a 2a   at least.    **
28840 20 6e 4d 69 6e 20 73 65 67 6d 65 6e 74 73 20 61   nMin segments a
28850 6e 64 20 6e 6f 20 68 69 6e 74 20 69 6e 20 74 68  nd no hint in th
28860 65 20 25 5f 73 74 61 74 20 74 61 62 6c 65 2e 20  e %_stat table. 
28870 4e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 2e 0a 20  No work to do.. 
28880 20 20 20 2a 2a 20 45 78 69 74 20 65 61 72 6c 79     ** Exit early
28890 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
288a0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53 65 67 3c  */.    if( nSeg<
288b0 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  0 ) break;..    
288c0 2f 2a 20 4f 70 65 6e 20 61 20 63 75 72 73 6f 72  /* Open a cursor
288d0 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
288e0 75 67 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ugh the contents
288f0 20 6f 66 20 74 68 65 20 6f 6c 64 65 73 74 20 6e   of the oldest n
28900 53 65 67 20 0a 20 20 20 20 2a 2a 20 69 6e 64 65  Seg .    ** inde
28910 78 65 73 20 6f 66 20 61 62 73 6f 6c 75 74 65 20  xes of absolute 
28920 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c 2e  level iAbsLevel.
28930 20 49 66 20 74 68 69 73 20 63 75 72 73 6f 72 20   If this cursor 
28940 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  is opened using 
28950 0a 20 20 20 20 2a 2a 20 74 68 65 20 27 68 69 6e  .    ** the 'hin
28960 74 27 20 70 61 72 61 6d 65 74 65 72 73 2c 20 69  t' parameters, i
28970 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
28980 61 74 20 74 68 65 72 65 20 61 72 65 20 6c 65 73  at there are les
28990 73 20 74 68 61 6e 20 6e 53 65 67 0a 20 20 20 20  s than nSeg.    
289a0 2a 2a 20 73 65 67 6d 65 6e 74 73 20 61 76 61 69  ** segments avai
289b0 6c 61 62 6c 65 20 69 6e 20 6c 65 76 65 6c 20 69  lable in level i
289c0 41 62 73 4c 65 76 65 6c 2e 20 49 6e 20 74 68 69  AbsLevel. In thi
289d0 73 20 63 61 73 65 2c 20 6e 6f 20 77 6f 72 6b 20  s case, no work 
289e0 69 73 0a 20 20 20 20 2a 2a 20 64 6f 6e 65 20 6f  is.    ** done o
289f0 6e 20 69 41 62 73 4c 65 76 65 6c 20 2d 20 66 61  n iAbsLevel - fa
28a00 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
28a10 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
28a20 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 0a 20 20   of the loop .  
28a30 20 20 2a 2a 20 74 6f 20 73 74 61 72 74 20 77 6f    ** to start wo
28a40 72 6b 20 6f 6e 20 73 6f 6d 65 20 6f 74 68 65 72  rk on some other
28a50 20 6c 65 76 65 6c 2e 20 20 2a 2f 0a 20 20 20 20   level.  */.    
28a60 6d 65 6d 73 65 74 28 70 57 72 69 74 65 72 2c 20  memset(pWriter, 
28a70 30 2c 20 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  0, nAlloc);.    
28a80 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 3d  pFilter->flags =
28a90 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 52 45   FTS3_SEGMENT_RE
28aa0 51 55 49 52 45 5f 50 4f 53 3b 0a 0a 20 20 20 20  QUIRE_POS;..    
28ab0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28ac0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
28ad0 66 74 73 33 49 6e 63 72 6d 65 72 67 65 4f 75 74  fts3IncrmergeOut
28ae0 70 75 74 49 64 78 28 70 2c 20 69 41 62 73 4c 65  putIdx(p, iAbsLe
28af0 76 65 6c 2c 20 26 69 49 64 78 29 3b 0a 20 20 20  vel, &iIdx);.   
28b00 20 20 20 61 73 73 65 72 74 28 20 62 55 73 65 48     assert( bUseH
28b10 69 6e 74 3d 3d 31 20 7c 7c 20 62 55 73 65 48 69  int==1 || bUseHi
28b20 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  nt==0 );.      i
28b30 66 28 20 69 49 64 78 3d 3d 30 20 7c 7c 20 28 62  f( iIdx==0 || (b
28b40 55 73 65 48 69 6e 74 20 26 26 20 69 49 64 78 3d  UseHint && iIdx=
28b50 3d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  =1) ){.        i
28b60 6e 74 20 62 49 67 6e 6f 72 65 20 3d 20 30 3b 0a  nt bIgnore = 0;.
28b70 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
28b80 33 53 65 67 6d 65 6e 74 49 73 4d 61 78 4c 65 76  3SegmentIsMaxLev
28b90 65 6c 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 2b  el(p, iAbsLevel+
28ba0 31 2c 20 26 62 49 67 6e 6f 72 65 29 3b 0a 20 20  1, &bIgnore);.  
28bb0 20 20 20 20 20 20 69 66 28 20 62 49 67 6e 6f 72        if( bIgnor
28bc0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e ){.          p
28bd0 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d  Filter->flags |=
28be0 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 49 47   FTS3_SEGMENT_IG
28bf0 4e 4f 52 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20  NORE_EMPTY;.    
28c00 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
28c10 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
28c20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28c30 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63      rc = fts3Inc
28c40 72 6d 65 72 67 65 43 73 72 28 70 2c 20 69 41 62  rmergeCsr(p, iAb
28c50 73 4c 65 76 65 6c 2c 20 6e 53 65 67 2c 20 70 43  sLevel, nSeg, pC
28c60 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  sr);.    }.    i
28c70 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63  f( SQLITE_OK==rc
28c80 20 26 26 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65   && pCsr->nSegme
28c90 6e 74 3d 3d 6e 53 65 67 0a 20 20 20 20 20 26 26  nt==nSeg.     &&
28ca0 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
28cb0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  = sqlite3Fts3Seg
28cc0 52 65 61 64 65 72 53 74 61 72 74 28 70 2c 20 70  ReaderStart(p, p
28cd0 43 73 72 2c 20 70 46 69 6c 74 65 72 29 29 0a 20  Csr, pFilter)). 
28ce0 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 52 4f      && SQLITE_RO
28cf0 57 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  W==(rc = sqlite3
28d00 46 74 73 33 53 65 67 52 65 61 64 65 72 53 74 65  Fts3SegReaderSte
28d10 70 28 70 2c 20 70 43 73 72 29 29 0a 20 20 20 20  p(p, pCsr)).    
28d20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 55 73  ){.      if( bUs
28d30 65 48 69 6e 74 20 26 26 20 69 49 64 78 3e 30 20  eHint && iIdx>0 
28d40 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
28d50 20 63 68 61 72 20 2a 7a 4b 65 79 20 3d 20 70 43   char *zKey = pC
28d60 73 72 2d 3e 7a 54 65 72 6d 3b 0a 20 20 20 20 20  sr->zTerm;.     
28d70 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 43     int nKey = pC
28d80 73 72 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20  sr->nTerm;.     
28d90 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72     rc = fts3Incr
28da0 6d 65 72 67 65 4c 6f 61 64 28 70 2c 20 69 41 62  mergeLoad(p, iAb
28db0 73 4c 65 76 65 6c 2c 20 69 49 64 78 2d 31 2c 20  sLevel, iIdx-1, 
28dc0 7a 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 57 72 69  zKey, nKey, pWri
28dd0 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ter);.      }els
28de0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
28df0 66 74 73 33 49 6e 63 72 6d 65 72 67 65 57 72 69  fts3IncrmergeWri
28e00 74 65 72 28 70 2c 20 69 41 62 73 4c 65 76 65 6c  ter(p, iAbsLevel
28e10 2c 20 69 49 64 78 2c 20 70 43 73 72 2c 20 70 57  , iIdx, pCsr, pW
28e20 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  riter);.      }.
28e30 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
28e40 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 57 72 69  QLITE_OK && pWri
28e50 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74 20 29 7b  ter->nLeafEst ){
28e60 0a 20 20 20 20 20 20 20 20 66 74 73 33 4c 6f 67  .        fts3Log
28e70 4d 65 72 67 65 28 6e 53 65 67 2c 20 69 41 62 73  Merge(nSeg, iAbs
28e80 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 20 20  Level);.        
28e90 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72  do {.          r
28ea0 63 20 3d 20 66 74 73 33 49 6e 63 72 6d 65 72 67  c = fts3Incrmerg
28eb0 65 41 70 70 65 6e 64 28 70 2c 20 70 57 72 69 74  eAppend(p, pWrit
28ec0 65 72 2c 20 70 43 73 72 29 3b 0a 20 20 20 20 20  er, pCsr);.     
28ed0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
28ee0 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71  ITE_OK ) rc = sq
28ef0 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64  lite3Fts3SegRead
28f00 65 72 53 74 65 70 28 70 2c 20 70 43 73 72 29 3b  erStep(p, pCsr);
28f10 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
28f20 57 72 69 74 65 72 2d 3e 6e 57 6f 72 6b 3e 3d 6e  Writer->nWork>=n
28f30 52 65 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  Rem && rc==SQLIT
28f40 45 5f 52 4f 57 20 29 20 72 63 20 3d 20 53 51 4c  E_ROW ) rc = SQL
28f50 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
28f60 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
28f70 54 45 5f 52 4f 57 20 29 3b 0a 0a 20 20 20 20 20  TE_ROW );..     
28f80 20 20 20 2f 2a 20 55 70 64 61 74 65 20 6f 72 20     /* Update or 
28f90 64 65 6c 65 74 65 20 74 68 65 20 69 6e 70 75 74  delete the input
28fa0 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   segments */.   
28fb0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
28fc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28fd0 20 20 20 20 6e 52 65 6d 20 2d 3d 20 28 31 20 2b      nRem -= (1 +
28fe0 20 70 57 72 69 74 65 72 2d 3e 6e 57 6f 72 6b 29   pWriter->nWork)
28ff0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
29000 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 43 68   fts3IncrmergeCh
29010 6f 6d 70 28 70 2c 20 69 41 62 73 4c 65 76 65 6c  omp(p, iAbsLevel
29020 2c 20 70 43 73 72 2c 20 26 6e 53 65 67 29 3b 0a  , pCsr, &nSeg);.
29030 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 53            if( nS
29040 65 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  eg!=0 ){.       
29050 20 20 20 20 20 62 44 69 72 74 79 48 69 6e 74 20       bDirtyHint 
29060 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
29070 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 48 69   fts3IncrmergeHi
29080 6e 74 50 75 73 68 28 26 68 69 6e 74 2c 20 69 41  ntPush(&hint, iA
29090 62 73 4c 65 76 65 6c 2c 20 6e 53 65 67 2c 20 26  bsLevel, nSeg, &
290a0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rc);.          }
290b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
290c0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 53   }..      if( nS
290d0 65 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  eg!=0 ){.       
290e0 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44   pWriter->nLeafD
290f0 61 74 61 20 3d 20 70 57 72 69 74 65 72 2d 3e 6e  ata = pWriter->n
29100 4c 65 61 66 44 61 74 61 20 2a 20 2d 31 3b 0a 20  LeafData * -1;. 
29110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73       }.      fts
29120 33 49 6e 63 72 6d 65 72 67 65 52 65 6c 65 61 73  3IncrmergeReleas
29130 65 28 70 2c 20 70 57 72 69 74 65 72 2c 20 26 72  e(p, pWriter, &r
29140 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 53  c);.      if( nS
29150 65 67 3d 3d 30 20 26 26 20 70 57 72 69 74 65 72  eg==0 && pWriter
29160 2d 3e 62 4e 6f 4c 65 61 66 44 61 74 61 3d 3d 30  ->bNoLeafData==0
29170 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 33   ){.        fts3
29180 50 72 6f 6d 6f 74 65 53 65 67 6d 65 6e 74 73 28  PromoteSegments(
29190 70 2c 20 69 41 62 73 4c 65 76 65 6c 2b 31 2c 20  p, iAbsLevel+1, 
291a0 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61  pWriter->nLeafDa
291b0 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ta);.      }.   
291c0 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46   }..    sqlite3F
291d0 74 73 33 53 65 67 52 65 61 64 65 72 46 69 6e 69  ts3SegReaderFini
291e0 73 68 28 70 43 73 72 29 3b 0a 20 20 7d 0a 0a 20  sh(pCsr);.  }.. 
291f0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 68 69   /* Write the hi
29200 6e 74 20 76 61 6c 75 65 73 20 69 6e 74 6f 20 74  nt values into t
29210 68 65 20 25 5f 73 74 61 74 20 74 61 62 6c 65 20  he %_stat table 
29220 66 6f 72 20 74 68 65 20 6e 65 78 74 20 69 6e 63  for the next inc
29230 72 2d 6d 65 72 67 65 72 20 2a 2f 0a 20 20 69 66  r-merger */.  if
29240 28 20 62 44 69 72 74 79 48 69 6e 74 20 26 26 20  ( bDirtyHint && 
29250 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
29260 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e  .    rc = fts3In
29270 63 72 6d 65 72 67 65 48 69 6e 74 53 74 6f 72 65  crmergeHintStore
29280 28 70 2c 20 26 68 69 6e 74 29 3b 0a 20 20 7d 0a  (p, &hint);.  }.
29290 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
292a0 70 57 72 69 74 65 72 29 3b 0a 20 20 73 71 6c 69  pWriter);.  sqli
292b0 74 65 33 5f 66 72 65 65 28 68 69 6e 74 2e 61 29  te3_free(hint.a)
292c0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
292d0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
292e0 74 68 65 20 74 65 78 74 20 62 65 67 69 6e 6e 69  the text beginni
292f0 6e 67 20 61 74 20 2a 70 7a 20 69 6e 74 6f 20 61  ng at *pz into a
29300 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 20 72 65  n integer and re
29310 74 75 72 6e 0a 2a 2a 20 69 74 73 20 76 61 6c 75  turn.** its valu
29320 65 2e 20 20 41 64 76 61 6e 63 65 20 2a 70 7a 20  e.  Advance *pz 
29330 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
29340 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20  first character 
29350 70 61 73 74 0a 2a 2a 20 74 68 65 20 69 6e 74 65  past.** the inte
29360 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ger..*/.static i
29370 6e 74 20 66 74 73 33 47 65 74 69 6e 74 28 63 6f  nt fts3Getint(co
29380 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 29 7b 0a  nst char **pz){.
29390 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
293a0 3d 20 2a 70 7a 3b 0a 20 20 69 6e 74 20 69 20 3d  = *pz;.  int i =
293b0 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a 7a   0;.  while( (*z
293c0 29 3e 3d 27 30 27 20 26 26 20 28 2a 7a 29 3c 3d  )>='0' && (*z)<=
293d0 27 39 27 20 29 20 69 20 3d 20 31 30 2a 69 20 2b  '9' ) i = 10*i +
293e0 20 2a 28 7a 2b 2b 29 20 2d 20 27 30 27 3b 0a 20   *(z++) - '0';. 
293f0 20 2a 70 7a 20 3d 20 7a 3b 0a 20 20 72 65 74 75   *pz = z;.  retu
29400 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  rn i;.}../*.** P
29410 72 6f 63 65 73 73 20 73 74 61 74 65 6d 65 6e 74  rocess statement
29420 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  s of the form:.*
29430 2a 0a 2a 2a 20 20 20 20 49 4e 53 45 52 54 20 49  *.**    INSERT I
29440 4e 54 4f 20 74 61 62 6c 65 28 74 61 62 6c 65 29  NTO table(table)
29450 20 56 41 4c 55 45 53 28 27 6d 65 72 67 65 3d 41   VALUES('merge=A
29460 2c 42 27 29 3b 0a 2a 2a 0a 2a 2a 20 41 20 61 6e  ,B');.**.** A an
29470 64 20 42 20 61 72 65 20 69 6e 74 65 67 65 72 73  d B are integers
29480 20 74 68 61 74 20 64 65 63 6f 64 65 20 74 6f 20   that decode to 
29490 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
294a0 20 6c 65 61 66 20 70 61 67 65 73 0a 2a 2a 20 77   leaf pages.** w
294b0 72 69 74 74 65 6e 20 66 6f 72 20 74 68 65 20 6d  ritten for the m
294c0 65 72 67 65 2c 20 61 6e 64 20 74 68 65 20 6d 69  erge, and the mi
294d0 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  nimum number of 
294e0 73 65 67 6d 65 6e 74 73 20 6f 6e 20 61 20 6c 65  segments on a le
294f0 76 65 6c 0a 2a 2a 20 62 65 66 6f 72 65 20 69 74  vel.** before it
29500 20 77 69 6c 6c 20 62 65 20 73 65 6c 65 63 74 65   will be selecte
29510 64 20 66 6f 72 20 61 20 6d 65 72 67 65 2c 20 72  d for a merge, r
29520 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a  espectively..*/.
29530 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 44  static int fts3D
29540 6f 49 6e 63 72 6d 65 72 67 65 28 0a 20 20 46 74  oIncrmerge(.  Ft
29550 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
29560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29570 20 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64   FTS3 table hand
29580 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
29590 61 72 20 2a 7a 50 61 72 61 6d 20 20 20 20 20 20  ar *zParam      
295a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74          /* Nul-t
295b0 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
295c0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 22 41 2c 42   containing "A,B
295d0 22 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  " */.){.  int rc
295e0 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 28  ;.  int nMin = (
295f0 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54  FTS3_MERGE_COUNT
29600 20 2f 20 32 29 3b 0a 20 20 69 6e 74 20 6e 4d 65   / 2);.  int nMe
29610 72 67 65 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74  rge = 0;.  const
29620 20 63 68 61 72 20 2a 7a 20 3d 20 7a 50 61 72 61   char *z = zPara
29630 6d 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  m;..  /* Read th
29640 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20  e first integer 
29650 76 61 6c 75 65 20 2a 2f 0a 20 20 6e 4d 65 72 67  value */.  nMerg
29660 65 20 3d 20 66 74 73 33 47 65 74 69 6e 74 28 26  e = fts3Getint(&
29670 7a 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  z);..  /* If the
29680 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 76   first integer v
29690 61 6c 75 65 20 69 73 20 66 6f 6c 6c 6f 77 65 64  alue is followed
296a0 20 62 79 20 61 20 27 2c 27 2c 20 20 72 65 61 64   by a ',',  read
296b0 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a   the second.  **
296c0 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 20   integer value. 
296d0 2a 2f 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  */.  if( z[0]=='
296e0 2c 27 20 26 26 20 7a 5b 31 5d 21 3d 27 5c 30 27  ,' && z[1]!='\0'
296f0 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20   ){.    z++;.   
29700 20 6e 4d 69 6e 20 3d 20 66 74 73 33 47 65 74 69   nMin = fts3Geti
29710 6e 74 28 26 7a 29 3b 0a 20 20 7d 0a 0a 20 20 69  nt(&z);.  }..  i
29720 66 28 20 7a 5b 30 5d 21 3d 27 5c 30 27 20 7c 7c  f( z[0]!='\0' ||
29730 20 6e 4d 69 6e 3c 32 20 29 7b 0a 20 20 20 20 72   nMin<2 ){.    r
29740 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
29750 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
29760 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
29770 20 20 20 69 66 28 20 21 70 2d 3e 62 48 61 73 53     if( !p->bHasS
29780 74 61 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  tat ){.      ass
29790 65 72 74 28 20 70 2d 3e 62 46 74 73 34 3d 3d 30  ert( p->bFts4==0
297a0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
297b0 33 46 74 73 33 43 72 65 61 74 65 53 74 61 74 54  3Fts3CreateStatT
297c0 61 62 6c 65 28 26 72 63 2c 20 70 29 3b 0a 20 20  able(&rc, p);.  
297d0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
297e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
297f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
29800 74 73 33 49 6e 63 72 6d 65 72 67 65 28 70 2c 20  ts3Incrmerge(p, 
29810 6e 4d 65 72 67 65 2c 20 6e 4d 69 6e 29 3b 0a 20  nMerge, nMin);. 
29820 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
29830 46 74 73 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73  Fts3SegmentsClos
29840 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
29850 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29860 50 72 6f 63 65 73 73 20 73 74 61 74 65 6d 65 6e  Process statemen
29870 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  ts of the form:.
29880 2a 2a 0a 2a 2a 20 20 20 20 49 4e 53 45 52 54 20  **.**    INSERT 
29890 49 4e 54 4f 20 74 61 62 6c 65 28 74 61 62 6c 65  INTO table(table
298a0 29 20 56 41 4c 55 45 53 28 27 61 75 74 6f 6d 65  ) VALUES('autome
298b0 72 67 65 3d 58 27 29 3b 0a 2a 2a 0a 2a 2a 20 77  rge=X');.**.** w
298c0 68 65 72 65 20 58 20 69 73 20 61 6e 20 69 6e 74  here X is an int
298d0 65 67 65 72 2e 20 20 58 3d 3d 30 20 6d 65 61 6e  eger.  X==0 mean
298e0 73 20 74 6f 20 74 75 72 6e 20 61 75 74 6f 6d 65  s to turn autome
298f0 72 67 65 20 6f 66 66 2e 20 20 58 21 3d 30 20 6d  rge off.  X!=0 m
29900 65 61 6e 73 0a 2a 2a 20 74 75 72 6e 20 69 74 20  eans.** turn it 
29910 6f 6e 2e 20 20 54 68 65 20 73 65 74 74 69 6e 67  on.  The setting
29920 20 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a   is persistent..
29930 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
29940 73 33 44 6f 41 75 74 6f 69 6e 63 72 6d 65 72 67  s3DoAutoincrmerg
29950 65 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  e(.  Fts3Table *
29960 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
29970 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62       /* FTS3 tab
29980 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  le handle */.  c
29990 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61  onst char *zPara
299a0 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m              /
299b0 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  * Nul-terminated
299c0 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
299d0 6e 67 20 62 6f 6f 6c 65 61 6e 20 2a 2f 0a 29 7b  ng boolean */.){
299e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
299f0 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33  TE_OK;.  sqlite3
29a00 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
29a10 3b 0a 20 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72  ;.  p->nAutoincr
29a20 6d 65 72 67 65 20 3d 20 66 74 73 33 47 65 74 69  merge = fts3Geti
29a30 6e 74 28 26 7a 50 61 72 61 6d 29 3b 0a 20 20 69  nt(&zParam);.  i
29a40 66 28 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d  f( p->nAutoincrm
29a50 65 72 67 65 3d 3d 31 20 7c 7c 20 70 2d 3e 6e 41  erge==1 || p->nA
29a60 75 74 6f 69 6e 63 72 6d 65 72 67 65 3e 46 54 53  utoincrmerge>FTS
29a70 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 20 29 7b  3_MERGE_COUNT ){
29a80 0a 20 20 20 20 70 2d 3e 6e 41 75 74 6f 69 6e 63  .    p->nAutoinc
29a90 72 6d 65 72 67 65 20 3d 20 38 3b 0a 20 20 7d 0a  rmerge = 8;.  }.
29aa0 20 20 69 66 28 20 21 70 2d 3e 62 48 61 73 53 74    if( !p->bHasSt
29ab0 61 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  at ){.    assert
29ac0 28 20 70 2d 3e 62 46 74 73 34 3d 3d 30 20 29 3b  ( p->bFts4==0 );
29ad0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33  .    sqlite3Fts3
29ae0 43 72 65 61 74 65 53 74 61 74 54 61 62 6c 65 28  CreateStatTable(
29af0 26 72 63 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  &rc, p);.    if(
29b00 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
29b10 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 74 73 33  .  }.  rc = fts3
29b20 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 52  SqlStmt(p, SQL_R
29b30 45 50 4c 41 43 45 5f 53 54 41 54 2c 20 26 70 53  EPLACE_STAT, &pS
29b40 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tmt, 0);.  if( r
29b50 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
29b60 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
29b70 74 28 70 53 74 6d 74 2c 20 31 2c 20 46 54 53 5f  t(pStmt, 1, FTS_
29b80 53 54 41 54 5f 41 55 54 4f 49 4e 43 52 4d 45 52  STAT_AUTOINCRMER
29b90 47 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  GE);.  sqlite3_b
29ba0 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32  ind_int(pStmt, 2
29bb0 2c 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d 65  , p->nAutoincrme
29bc0 72 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  rge);.  sqlite3_
29bd0 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 72  step(pStmt);.  r
29be0 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
29bf0 74 28 70 53 74 6d 74 29 3b 0a 20 20 72 65 74 75  t(pStmt);.  retu
29c00 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29c10 52 65 74 75 72 6e 20 61 20 36 34 2d 62 69 74 20  Return a 64-bit 
29c20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65  checksum for the
29c30 20 46 54 53 20 69 6e 64 65 78 20 65 6e 74 72 79   FTS index entry
29c40 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
29c50 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 74  e.** arguments t
29c60 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
29c70 0a 2a 2f 0a 73 74 61 74 69 63 20 75 36 34 20 66  .*/.static u64 f
29c80 74 73 33 43 68 65 63 6b 73 75 6d 45 6e 74 72 79  ts3ChecksumEntry
29c90 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
29ca0 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  zTerm,          
29cb0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
29cc0 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
29cd0 69 6e 67 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  ing term */.  in
29ce0 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 20 20 20  t nTerm,        
29cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29d00 20 53 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69   Size of zTerm i
29d10 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
29d20 20 69 4c 61 6e 67 69 64 2c 20 20 20 20 20 20 20   iLangid,       
29d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29d40 4c 61 6e 67 75 61 67 65 20 69 64 20 66 6f 72 20  Language id for 
29d50 63 75 72 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20  current row */. 
29d60 20 69 6e 74 20 69 49 6e 64 65 78 2c 20 20 20 20   int iIndex,    
29d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d80 20 2f 2a 20 49 6e 64 65 78 20 28 30 2e 2e 46 74   /* Index (0..Ft
29d90 73 33 54 61 62 6c 65 2e 6e 49 6e 64 65 78 2d 31  s3Table.nIndex-1
29da0 29 20 2a 2f 0a 20 20 69 36 34 20 69 44 6f 63 69  ) */.  i64 iDoci
29db0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
29dc0 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 69 64 20         /* Docid 
29dd0 66 6f 72 20 63 75 72 72 65 6e 74 20 72 6f 77 2e  for current row.
29de0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20   */.  int iCol, 
29df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e00 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
29e10 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
29e20 69 50 6f 73 20 20 20 20 20 20 20 20 20 20 20 20  iPos            
29e30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
29e40 6f 73 69 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  osition */.){.  
29e50 69 6e 74 20 69 3b 0a 20 20 75 36 34 20 72 65 74  int i;.  u64 ret
29e60 20 3d 20 28 75 36 34 29 69 44 6f 63 69 64 3b 0a   = (u64)iDocid;.
29e70 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c  .  ret += (ret<<
29e80 33 29 20 2b 20 69 4c 61 6e 67 69 64 3b 0a 20 20  3) + iLangid;.  
29e90 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20  ret += (ret<<3) 
29ea0 2b 20 69 49 6e 64 65 78 3b 0a 20 20 72 65 74 20  + iIndex;.  ret 
29eb0 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 43  += (ret<<3) + iC
29ec0 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65  ol;.  ret += (re
29ed0 74 3c 3c 33 29 20 2b 20 69 50 6f 73 3b 0a 20 20  t<<3) + iPos;.  
29ee0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d  for(i=0; i<nTerm
29ef0 3b 20 69 2b 2b 29 20 72 65 74 20 2b 3d 20 28 72  ; i++) ret += (r
29f00 65 74 3c 3c 33 29 20 2b 20 7a 54 65 72 6d 5b 69  et<<3) + zTerm[i
29f10 5d 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 74  ];..  return ret
29f20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
29f30 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  n a checksum of 
29f40 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 74  all entries in t
29f50 68 65 20 46 54 53 20 69 6e 64 65 78 20 74 68 61  he FTS index tha
29f60 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 0a  t correspond to.
29f70 2a 2a 20 6c 61 6e 67 75 61 67 65 20 69 64 20 69  ** language id i
29f80 4c 61 6e 67 69 64 2e 20 54 68 65 20 63 68 65 63  Langid. The chec
29f90 6b 73 75 6d 20 69 73 20 63 61 6c 63 75 6c 61 74  ksum is calculat
29fa0 65 64 20 62 79 20 58 4f 52 69 6e 67 20 74 68 65  ed by XORing the
29fb0 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 6f 66   checksums.** of
29fc0 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c   each individual
29fd0 20 65 6e 74 72 79 20 28 73 65 65 20 66 74 73 33   entry (see fts3
29fe0 43 68 65 63 6b 73 75 6d 45 6e 74 72 79 28 29 29  ChecksumEntry())
29ff0 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 0a 2a 2a   together..**.**
2a000 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
2a010 74 68 65 20 63 68 65 63 6b 73 75 6d 20 76 61 6c  the checksum val
2a020 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  ue is returned a
2a030 6e 64 20 2a 70 52 63 20 73 65 74 20 74 6f 20 53  nd *pRc set to S
2a040 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68  QLITE_OK..** Oth
2a050 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72  erwise, if an er
2a060 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 52 63  ror occurs, *pRc
2a070 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 53 51   is set to an SQ
2a080 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
2a090 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76   The.** return v
2a0a0 61 6c 75 65 20 69 73 20 75 6e 64 65 66 69 6e 65  alue is undefine
2a0b0 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
2a0c0 2a 2f 0a 73 74 61 74 69 63 20 75 36 34 20 66 74  */.static u64 ft
2a0d0 73 33 43 68 65 63 6b 73 75 6d 49 6e 64 65 78 28  s3ChecksumIndex(
2a0e0 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
2a0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a100 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65     /* FTS3 table
2a110 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
2a120 20 69 4c 61 6e 67 69 64 2c 20 20 20 20 20 20 20   iLangid,       
2a130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a140 4c 61 6e 67 75 61 67 65 20 69 64 20 74 6f 20 72  Language id to r
2a150 65 74 75 72 6e 20 63 6b 73 75 6d 20 66 6f 72 20  eturn cksum for 
2a160 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 2c  */.  int iIndex,
2a170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a180 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
2a190 20 63 6b 73 75 6d 20 28 30 2e 2e 70 2d 3e 6e 49   cksum (0..p->nI
2a1a0 6e 64 65 78 2d 31 29 20 2a 2f 0a 20 20 69 6e 74  ndex-1) */.  int
2a1b0 20 2a 70 52 63 20 20 20 20 20 20 20 20 20 20 20   *pRc           
2a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a1d0 4f 55 54 3a 20 52 65 74 75 72 6e 20 63 6f 64 65  OUT: Return code
2a1e0 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 53 65 67   */.){.  Fts3Seg
2a1f0 46 69 6c 74 65 72 20 66 69 6c 74 65 72 3b 0a 20  Filter filter;. 
2a200 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61   Fts3MultiSegRea
2a210 64 65 72 20 63 73 72 3b 0a 20 20 69 6e 74 20 72  der csr;.  int r
2a220 63 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 20 3d  c;.  u64 cksum =
2a230 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a   0;..  assert( *
2a240 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
2a250 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69 6c  ;..  memset(&fil
2a260 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66  ter, 0, sizeof(f
2a270 69 6c 74 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65  ilter));.  memse
2a280 74 28 26 63 73 72 2c 20 30 2c 20 73 69 7a 65 6f  t(&csr, 0, sizeo
2a290 66 28 63 73 72 29 29 3b 0a 20 20 66 69 6c 74 65  f(csr));.  filte
2a2a0 72 2e 66 6c 61 67 73 20 3d 20 20 46 54 53 33 5f  r.flags =  FTS3_
2a2b0 53 45 47 4d 45 4e 54 5f 52 45 51 55 49 52 45 5f  SEGMENT_REQUIRE_
2a2c0 50 4f 53 7c 46 54 53 33 5f 53 45 47 4d 45 4e 54  POS|FTS3_SEGMENT
2a2d0 5f 49 47 4e 4f 52 45 5f 45 4d 50 54 59 3b 0a 20  _IGNORE_EMPTY;. 
2a2e0 20 66 69 6c 74 65 72 2e 66 6c 61 67 73 20 7c 3d   filter.flags |=
2a2f0 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 53 43   FTS3_SEGMENT_SC
2a300 41 4e 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  AN;..  rc = sqli
2a310 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72  te3Fts3SegReader
2a320 43 75 72 73 6f 72 28 0a 20 20 20 20 20 20 70 2c  Cursor(.      p,
2a330 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78   iLangid, iIndex
2a340 2c 20 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52  , FTS3_SEGCURSOR
2a350 5f 41 4c 4c 2c 20 30 2c 20 30 2c 20 30 2c 20 31  _ALL, 0, 0, 0, 1
2a360 2c 26 63 73 72 0a 20 20 29 3b 0a 20 20 69 66 28  ,&csr.  );.  if(
2a370 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2a380 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
2a390 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 53  e3Fts3SegReaderS
2a3a0 74 61 72 74 28 70 2c 20 26 63 73 72 2c 20 26 66  tart(p, &csr, &f
2a3b0 69 6c 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  ilter);.  }..  i
2a3c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a3d0 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 53   ){.    while( S
2a3e0 51 4c 49 54 45 5f 52 4f 57 3d 3d 28 72 63 20 3d  QLITE_ROW==(rc =
2a3f0 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
2a400 65 61 64 65 72 53 74 65 70 28 70 2c 20 26 63 73  eaderStep(p, &cs
2a410 72 29 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61  r)) ){.      cha
2a420 72 20 2a 70 43 73 72 20 3d 20 63 73 72 2e 61 44  r *pCsr = csr.aD
2a430 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 63 68  oclist;.      ch
2a440 61 72 20 2a 70 45 6e 64 20 3d 20 26 70 43 73 72  ar *pEnd = &pCsr
2a450 5b 63 73 72 2e 6e 44 6f 63 6c 69 73 74 5d 3b 0a  [csr.nDoclist];.
2a460 0a 20 20 20 20 20 20 69 36 34 20 69 44 6f 63 69  .      i64 iDoci
2a470 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 36 34  d = 0;.      i64
2a480 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20   iCol = 0;.     
2a490 20 69 36 34 20 69 50 6f 73 20 3d 20 30 3b 0a 0a   i64 iPos = 0;..
2a4a0 20 20 20 20 20 20 70 43 73 72 20 2b 3d 20 73 71        pCsr += sq
2a4b0 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
2a4c0 6e 74 28 70 43 73 72 2c 20 26 69 44 6f 63 69 64  nt(pCsr, &iDocid
2a4d0 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
2a4e0 70 43 73 72 3c 70 45 6e 64 20 29 7b 0a 20 20 20  pCsr<pEnd ){.   
2a4f0 20 20 20 20 20 69 36 34 20 69 56 61 6c 20 3d 20       i64 iVal = 
2a500 30 3b 0a 20 20 20 20 20 20 20 20 70 43 73 72 20  0;.        pCsr 
2a510 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65  += sqlite3Fts3Ge
2a520 74 56 61 72 69 6e 74 28 70 43 73 72 2c 20 26 69  tVarint(pCsr, &i
2a530 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Val);.        if
2a540 28 20 70 43 73 72 3c 70 45 6e 64 20 29 7b 0a 20  ( pCsr<pEnd ){. 
2a550 20 20 20 20 20 20 20 20 20 69 66 28 20 69 56 61           if( iVa
2a560 6c 3d 3d 30 20 7c 7c 20 69 56 61 6c 3d 3d 31 20  l==0 || iVal==1 
2a570 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2a580 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Col = 0;.       
2a590 20 20 20 20 20 69 50 6f 73 20 3d 20 30 3b 0a 20       iPos = 0;. 
2a5a0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
2a5b0 56 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Val ){.         
2a5c0 20 20 20 20 20 70 43 73 72 20 2b 3d 20 73 71 6c       pCsr += sql
2a5d0 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e  ite3Fts3GetVarin
2a5e0 74 28 70 43 73 72 2c 20 26 69 43 6f 6c 29 3b 0a  t(pCsr, &iCol);.
2a5f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
2a600 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
2a610 20 70 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33   pCsr += sqlite3
2a620 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 70 43  Fts3GetVarint(pC
2a630 73 72 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20  sr, &iVal);.    
2a640 20 20 20 20 20 20 20 20 20 20 69 44 6f 63 69 64            iDocid
2a650 20 2b 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20   += iVal;.      
2a660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a670 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2a680 20 20 20 20 20 69 50 6f 73 20 2b 3d 20 28 69 56       iPos += (iV
2a690 61 6c 20 2d 20 32 29 3b 0a 20 20 20 20 20 20 20  al - 2);.       
2a6a0 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 63 6b 73       cksum = cks
2a6b0 75 6d 20 5e 20 66 74 73 33 43 68 65 63 6b 73 75  um ^ fts3Checksu
2a6c0 6d 45 6e 74 72 79 28 0a 20 20 20 20 20 20 20 20  mEntry(.        
2a6d0 20 20 20 20 20 20 20 20 63 73 72 2e 7a 54 65 72          csr.zTer
2a6e0 6d 2c 20 63 73 72 2e 6e 54 65 72 6d 2c 20 69 4c  m, csr.nTerm, iL
2a6f0 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69  angid, iIndex, i
2a700 44 6f 63 69 64 2c 0a 20 20 20 20 20 20 20 20 20  Docid,.         
2a710 20 20 20 20 20 20 20 28 69 6e 74 29 69 43 6f 6c         (int)iCol
2a720 2c 20 28 69 6e 74 29 69 50 6f 73 0a 20 20 20 20  , (int)iPos.    
2a730 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2a740 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2a750 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2a760 20 7d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33   }.  sqlite3Fts3
2a770 53 65 67 52 65 61 64 65 72 46 69 6e 69 73 68 28  SegReaderFinish(
2a780 26 63 73 72 29 3b 0a 0a 20 20 2a 70 52 63 20 3d  &csr);..  *pRc =
2a790 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 63 6b   rc;.  return ck
2a7a0 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  sum;.}../*.** Ch
2a7b0 65 63 6b 20 69 66 20 74 68 65 20 63 6f 6e 74 65  eck if the conte
2a7c0 6e 74 73 20 6f 66 20 74 68 65 20 46 54 53 20 69  nts of the FTS i
2a7d0 6e 64 65 78 20 6d 61 74 63 68 20 74 68 65 20 63  ndex match the c
2a7e0 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20  urrent contents 
2a7f0 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  of the.** conten
2a800 74 20 74 61 62 6c 65 2e 20 49 66 20 6e 6f 20 65  t table. If no e
2a810 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20  rror occurs and 
2a820 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20  the contents do 
2a830 6d 61 74 63 68 2c 20 73 65 74 20 2a 70 62 4f 6b  match, set *pbOk
2a840 0a 2a 2a 20 74 6f 20 74 72 75 65 20 61 6e 64 20  .** to true and 
2a850 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a860 2e 20 4f 72 20 69 66 20 74 68 65 20 63 6f 6e 74  . Or if the cont
2a870 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63  ents do not matc
2a880 68 2c 20 73 65 74 20 2a 70 62 4f 6b 0a 2a 2a 20  h, set *pbOk.** 
2a890 74 6f 20 66 61 6c 73 65 20 62 65 66 6f 72 65 20  to false before 
2a8a0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
2a8b0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2a8c0 75 72 73 20 28 65 2e 67 2e 20 61 6e 20 4f 4f 4d  urs (e.g. an OOM
2a8d0 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 2c 20 72   or IO error), r
2a8e0 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
2a8f0 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 2e 20  error .** code. 
2a900 54 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65 20  The final value 
2a910 6f 66 20 2a 70 62 4f 6b 20 69 73 20 75 6e 64 65  of *pbOk is unde
2a920 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  fined in this ca
2a930 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
2a940 74 20 66 74 73 33 49 6e 74 65 67 72 69 74 79 43  t fts3IntegrityC
2a950 68 65 63 6b 28 46 74 73 33 54 61 62 6c 65 20 2a  heck(Fts3Table *
2a960 70 2c 20 69 6e 74 20 2a 70 62 4f 6b 29 7b 0a 20  p, int *pbOk){. 
2a970 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2a980 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
2a990 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2a9a0 2a 2f 0a 20 20 75 36 34 20 63 6b 73 75 6d 31 20  */.  u64 cksum1 
2a9b0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2a9c0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
2a9d0 20 62 61 73 65 64 20 6f 6e 20 46 54 53 20 69 6e   based on FTS in
2a9e0 64 65 78 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a  dex contents */.
2a9f0 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d 20 30    u64 cksum2 = 0
2aa00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2aa10 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61    /* Checksum ba
2aa20 73 65 64 20 6f 6e 20 25 5f 63 6f 6e 74 65 6e 74  sed on %_content
2aa30 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 73   contents */.  s
2aa40 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 41 6c  qlite3_stmt *pAl
2aa50 6c 4c 61 6e 67 69 64 20 3d 20 30 3b 20 20 20 2f  lLangid = 0;   /
2aa60 2a 20 53 74 61 74 65 6d 65 6e 74 20 74 6f 20 72  * Statement to r
2aa70 65 74 75 72 6e 20 61 6c 6c 20 6c 61 6e 67 75 61  eturn all langua
2aa80 67 65 2d 69 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20  ge-ids */..  /* 
2aa90 54 68 69 73 20 62 6c 6f 63 6b 20 63 61 6c 63 75  This block calcu
2aaa0 6c 61 74 65 73 20 74 68 65 20 63 68 65 63 6b 73  lates the checks
2aab0 75 6d 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  um according to 
2aac0 74 68 65 20 46 54 53 20 69 6e 64 65 78 2e 20 2a  the FTS index. *
2aad0 2f 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  /.  rc = fts3Sql
2aae0 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45  Stmt(p, SQL_SELE
2aaf0 43 54 5f 41 4c 4c 5f 4c 41 4e 47 49 44 2c 20 26  CT_ALL_LANGID, &
2ab00 70 41 6c 6c 4c 61 6e 67 69 64 2c 20 30 29 3b 0a  pAllLangid, 0);.
2ab10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ab20 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  _OK ){.    int r
2ab30 63 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  c2;.    sqlite3_
2ab40 62 69 6e 64 5f 69 6e 74 28 70 41 6c 6c 4c 61 6e  bind_int(pAllLan
2ab50 67 69 64 2c 20 31 2c 20 70 2d 3e 69 50 72 65 76  gid, 1, p->iPrev
2ab60 4c 61 6e 67 69 64 29 3b 0a 20 20 20 20 73 71 6c  Langid);.    sql
2ab70 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 41  ite3_bind_int(pA
2ab80 6c 6c 4c 61 6e 67 69 64 2c 20 32 2c 20 70 2d 3e  llLangid, 2, p->
2ab90 6e 49 6e 64 65 78 29 3b 0a 20 20 20 20 77 68 69  nIndex);.    whi
2aba0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
2abb0 4b 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 65  K && sqlite3_ste
2abc0 70 28 70 41 6c 6c 4c 61 6e 67 69 64 29 3d 3d 53  p(pAllLangid)==S
2abd0 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
2abe0 20 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 20 3d     int iLangid =
2abf0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
2ac00 69 6e 74 28 70 41 6c 6c 4c 61 6e 67 69 64 2c 20  int(pAllLangid, 
2ac10 30 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  0);.      int i;
2ac20 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
2ac30 69 3c 70 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b  i<p->nIndex; i++
2ac40 29 7b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  ){.        cksum
2ac50 31 20 3d 20 63 6b 73 75 6d 31 20 5e 20 66 74 73  1 = cksum1 ^ fts
2ac60 33 43 68 65 63 6b 73 75 6d 49 6e 64 65 78 28 70  3ChecksumIndex(p
2ac70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 2c 20 26 72  , iLangid, i, &r
2ac80 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
2ac90 7d 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  }.    rc2 = sqli
2aca0 74 65 33 5f 72 65 73 65 74 28 70 41 6c 6c 4c 61  te3_reset(pAllLa
2acb0 6e 67 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72  ngid);.    if( r
2acc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
2acd0 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20  c = rc2;.  }..  
2ace0 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 63 61  /* This block ca
2acf0 6c 63 75 6c 61 74 65 73 20 74 68 65 20 63 68 65  lculates the che
2ad00 63 6b 73 75 6d 20 61 63 63 6f 72 64 69 6e 67 20  cksum according 
2ad10 74 6f 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74  to the %_content
2ad20 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20   table */.  if( 
2ad30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2ad40 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b  .    sqlite3_tok
2ad50 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 63 6f  enizer_module co
2ad60 6e 73 74 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70  nst *pModule = p
2ad70 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 2d 3e 70 4d  ->pTokenizer->pM
2ad80 6f 64 75 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74  odule;.    sqlit
2ad90 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
2ada0 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   0;.    char *zS
2adb0 71 6c 3b 0a 20 20 20 0a 20 20 20 20 7a 53 71 6c  ql;.   .    zSql
2adc0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2add0 74 66 28 22 53 45 4c 45 43 54 20 25 73 22 20 2c  tf("SELECT %s" ,
2ade0 20 70 2d 3e 7a 52 65 61 64 45 78 70 72 6c 69 73   p->zReadExprlis
2adf0 74 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 53 71  t);.    if( !zSq
2ae00 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
2ae10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2ae20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2ae30 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
2ae40 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
2ae50 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
2ae60 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
2ae70 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
2ae80 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28 20    }..    while( 
2ae90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2aea0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
2aeb0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
2aec0 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 44   ){.      i64 iD
2aed0 6f 63 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63  ocid = sqlite3_c
2aee0 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d  olumn_int64(pStm
2aef0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 6e 74  t, 0);.      int
2af00 20 69 4c 61 6e 67 20 3d 20 6c 61 6e 67 69 64 46   iLang = langidF
2af10 72 6f 6d 53 65 6c 65 63 74 28 70 2c 20 70 53 74  romSelect(p, pSt
2af20 6d 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  mt);.      int i
2af30 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  Col;..      for(
2af40 69 43 6f 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  iCol=0; rc==SQLI
2af50 54 45 5f 4f 4b 20 26 26 20 69 43 6f 6c 3c 70 2d  TE_OK && iCol<p-
2af60 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 43 6f 6c 2b 2b  >nColumn; iCol++
2af70 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
2af80 2d 3e 61 62 4e 6f 74 69 6e 64 65 78 65 64 5b 69  ->abNotindexed[i
2af90 43 6f 6c 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Col]==0 ){.     
2afa0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2afb0 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20  *zText = (const 
2afc0 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63  char *)sqlite3_c
2afd0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
2afe0 2c 20 69 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20  , iCol+1);.     
2aff0 20 20 20 20 20 69 6e 74 20 6e 54 65 78 74 20 3d       int nText =
2b000 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
2b010 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69 43 6f  bytes(pStmt, iCo
2b020 6c 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  l+1);.          
2b030 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65  sqlite3_tokenize
2b040 72 5f 63 75 72 73 6f 72 20 2a 70 54 20 3d 20 30  r_cursor *pT = 0
2b050 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ;..          rc 
2b060 3d 20 73 71 6c 69 74 65 33 46 74 73 33 4f 70 65  = sqlite3Fts3Ope
2b070 6e 54 6f 6b 65 6e 69 7a 65 72 28 70 2d 3e 70 54  nTokenizer(p->pT
2b080 6f 6b 65 6e 69 7a 65 72 2c 20 69 4c 61 6e 67 2c  okenizer, iLang,
2b090 20 7a 54 65 78 74 2c 20 6e 54 65 78 74 2c 26 70   zText, nText,&p
2b0a0 54 29 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68  T);.          wh
2b0b0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
2b0c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2b0d0 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54    char const *zT
2b0e0 6f 6b 65 6e 3b 20 20 20 20 20 20 20 2f 2a 20 42  oken;       /* B
2b0f0 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
2b100 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20   token */.      
2b110 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e        int nToken
2b120 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2b130 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
2b140 65 73 20 69 6e 20 74 6f 6b 65 6e 20 2a 2f 0a 20  es in token */. 
2b150 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
2b160 44 75 6d 31 20 3d 20 30 2c 20 69 44 75 6d 32 20  Dum1 = 0, iDum2 
2b170 3d 20 30 3b 20 2f 2a 20 44 75 6d 6d 79 20 76 61  = 0; /* Dummy va
2b180 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20  riables */.     
2b190 20 20 20 20 20 20 20 69 6e 74 20 69 50 6f 73 20         int iPos 
2b1a0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2b1b0 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20   /* Position of 
2b1c0 74 6f 6b 65 6e 20 69 6e 20 7a 54 65 78 74 20 2a  token in zText *
2b1d0 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  /..            r
2b1e0 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65  c = pModule->xNe
2b1f0 78 74 28 70 54 2c 20 26 7a 54 6f 6b 65 6e 2c 20  xt(pT, &zToken, 
2b200 26 6e 54 6f 6b 65 6e 2c 20 26 69 44 75 6d 31 2c  &nToken, &iDum1,
2b210 20 26 69 44 75 6d 32 2c 20 26 69 50 6f 73 29 3b   &iDum2, &iPos);
2b220 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2b230 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b240 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2b250 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20  int i;.         
2b260 20 20 20 20 20 63 6b 73 75 6d 32 20 3d 20 63 6b       cksum2 = ck
2b270 73 75 6d 32 20 5e 20 66 74 73 33 43 68 65 63 6b  sum2 ^ fts3Check
2b280 73 75 6d 45 6e 74 72 79 28 0a 20 20 20 20 20 20  sumEntry(.      
2b290 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 6b              zTok
2b2a0 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 69 4c 61 6e  en, nToken, iLan
2b2b0 67 2c 20 30 2c 20 69 44 6f 63 69 64 2c 20 69 43  g, 0, iDocid, iC
2b2c0 6f 6c 2c 20 69 50 6f 73 0a 20 20 20 20 20 20 20  ol, iPos.       
2b2d0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
2b2e0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
2b2f0 20 69 3c 70 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b   i<p->nIndex; i+
2b300 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2b310 20 20 20 20 69 66 28 20 70 2d 3e 61 49 6e 64 65      if( p->aInde
2b320 78 5b 69 5d 2e 6e 50 72 65 66 69 78 3c 3d 6e 54  x[i].nPrefix<=nT
2b330 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  oken ){.        
2b340 20 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d 32            cksum2
2b350 20 3d 20 63 6b 73 75 6d 32 20 5e 20 66 74 73 33   = cksum2 ^ fts3
2b360 43 68 65 63 6b 73 75 6d 45 6e 74 72 79 28 0a 20  ChecksumEntry(. 
2b370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b380 20 20 20 20 20 7a 54 6f 6b 65 6e 2c 20 70 2d 3e       zToken, p->
2b390 61 49 6e 64 65 78 5b 69 5d 2e 6e 50 72 65 66 69  aIndex[i].nPrefi
2b3a0 78 2c 20 69 4c 61 6e 67 2c 20 69 2c 20 69 44 6f  x, iLang, i, iDo
2b3b0 63 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 0a  cid, iCol, iPos.
2b3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3d0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20    );.           
2b3e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2b3f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2b400 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2b410 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2b420 54 20 29 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c  T ) pModule->xCl
2b430 6f 73 65 28 70 54 29 3b 0a 20 20 20 20 20 20 20  ose(pT);.       
2b440 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b450 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51  E_DONE ) rc = SQ
2b460 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
2b470 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2b480 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ..    sqlite3_fi
2b490 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
2b4a0 20 7d 0a 0a 20 20 2a 70 62 4f 6b 20 3d 20 28 63   }..  *pbOk = (c
2b4b0 6b 73 75 6d 31 3d 3d 63 6b 73 75 6d 32 29 3b 0a  ksum1==cksum2);.
2b4c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2b4d0 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 69 6e  /*.** Run the in
2b4e0 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2e 20 49  tegrity-check. I
2b4f0 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
2b500 73 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  s and the curren
2b510 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 0a 2a 2a  t contents of.**
2b520 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 61   the FTS index a
2b530 72 65 20 63 6f 72 72 65 63 74 2c 20 72 65 74 75  re correct, retu
2b540 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 72  rn SQLITE_OK. Or
2b550 2c 20 69 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  , if the content
2b560 73 20 6f 66 20 74 68 65 0a 2a 2a 20 46 54 53 20  s of the.** FTS 
2b570 69 6e 64 65 78 20 61 72 65 20 69 6e 63 6f 72 72  index are incorr
2b580 65 63 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ect, return SQLI
2b590 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 2e  TE_CORRUPT_VTAB.
2b5a0 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 61 6e  .**.** Or, if an
2b5b0 20 65 72 72 6f 72 20 28 65 2e 67 2e 20 61 6e 20   error (e.g. an 
2b5c0 4f 4f 4d 20 6f 72 20 49 4f 20 65 72 72 6f 72 29  OOM or IO error)
2b5d0 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
2b5e0 61 6e 20 53 51 4c 69 74 65 20 0a 2a 2a 20 65 72  an SQLite .** er
2b5f0 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
2b600 54 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68  The integrity-ch
2b610 65 63 6b 20 77 6f 72 6b 73 20 61 73 20 66 6f 6c  eck works as fol
2b620 6c 6f 77 73 2e 20 46 6f 72 20 65 61 63 68 20 74  lows. For each t
2b630 6f 6b 65 6e 20 61 6e 64 20 69 6e 64 65 78 65 64  oken and indexed
2b640 20 74 6f 6b 65 6e 0a 2a 2a 20 70 72 65 66 69 78   token.** prefix
2b650 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   in the document
2b660 20 73 65 74 2c 20 61 20 36 34 2d 62 69 74 20 63   set, a 64-bit c
2b670 68 65 63 6b 73 75 6d 20 69 73 20 63 61 6c 63 75  hecksum is calcu
2b680 6c 61 74 65 64 20 28 62 79 20 63 6f 64 65 0a 2a  lated (by code.*
2b690 2a 20 69 6e 20 66 74 73 33 43 68 65 63 6b 73 75  * in fts3Checksu
2b6a0 6d 45 6e 74 72 79 28 29 29 20 62 61 73 65 64 20  mEntry()) based 
2b6b0 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  on the following
2b6c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20 54 68  :.**.**     + Th
2b6d0 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 28  e index number (
2b6e0 30 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 69  0 for the main i
2b6f0 6e 64 65 78 2c 20 31 20 66 6f 72 20 74 68 65 20  ndex, 1 for the 
2b700 66 69 72 73 74 20 70 72 65 66 69 78 0a 2a 2a 20  first prefix.** 
2b710 20 20 20 20 20 20 69 6e 64 65 78 20 65 74 63 2e        index etc.
2b720 29 2c 0a 2a 2a 20 20 20 20 20 2b 20 54 68 65 20  ),.**     + The 
2b730 74 6f 6b 65 6e 20 28 6f 72 20 74 6f 6b 65 6e 20  token (or token 
2b740 70 72 65 66 69 78 29 20 74 65 78 74 20 69 74 73  prefix) text its
2b750 65 6c 66 2c 20 0a 2a 2a 20 20 20 20 20 2b 20 54  elf, .**     + T
2b760 68 65 20 6c 61 6e 67 75 61 67 65 2d 69 64 20 6f  he language-id o
2b770 66 20 74 68 65 20 72 6f 77 20 69 74 20 61 70 70  f the row it app
2b780 65 61 72 73 20 69 6e 2c 0a 2a 2a 20 20 20 20 20  ears in,.**     
2b790 2b 20 54 68 65 20 64 6f 63 69 64 20 6f 66 20 74  + The docid of t
2b7a0 68 65 20 72 6f 77 20 69 74 20 61 70 70 65 61 72  he row it appear
2b7b0 73 20 69 6e 2c 0a 2a 2a 20 20 20 20 20 2b 20 54  s in,.**     + T
2b7c0 68 65 20 63 6f 6c 75 6d 6e 20 69 74 20 61 70 70  he column it app
2b7d0 65 61 72 73 20 69 6e 2c 20 61 6e 64 0a 2a 2a 20  ears in, and.** 
2b7e0 20 20 20 20 2b 20 54 68 65 20 74 6f 6b 65 6e 73      + The tokens
2b7f0 20 70 6f 73 69 74 69 6f 6e 20 77 69 74 68 69 6e   position within
2b800 20 74 68 61 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a   that column..**
2b810 0a 2a 2a 20 54 68 65 20 63 68 65 63 6b 73 75 6d  .** The checksum
2b820 73 20 66 6f 72 20 61 6c 6c 20 65 6e 74 72 69 65  s for all entrie
2b830 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61  s in the index a
2b840 72 65 20 58 4f 52 65 64 20 74 6f 67 65 74 68 65  re XORed togethe
2b850 72 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20 61  r to create.** a
2b860 20 73 69 6e 67 6c 65 20 63 68 65 63 6b 73 75 6d   single checksum
2b870 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20   for the entire 
2b880 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  index..**.** The
2b890 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b   integrity-check
2b8a0 20 63 6f 64 65 20 63 61 6c 63 75 6c 61 74 65 73   code calculates
2b8b0 20 74 68 65 20 73 61 6d 65 20 63 68 65 63 6b 73   the same checks
2b8c0 75 6d 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a  um in two ways:.
2b8d0 2a 2a 0a 2a 2a 20 20 20 20 20 31 2e 20 42 79 20  **.**     1. By 
2b8e0 73 63 61 6e 6e 69 6e 67 20 74 68 65 20 63 6f 6e  scanning the con
2b8f0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 46 54 53  tents of the FTS
2b900 20 69 6e 64 65 78 2c 20 61 6e 64 20 0a 2a 2a 20   index, and .** 
2b910 20 20 20 20 32 2e 20 42 79 20 73 63 61 6e 6e 69      2. By scanni
2b920 6e 67 20 61 6e 64 20 74 6f 6b 65 6e 69 7a 69 6e  ng and tokenizin
2b930 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 74 61  g the content ta
2b940 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
2b950 65 20 74 77 6f 20 63 68 65 63 6b 73 75 6d 73 20  e two checksums 
2b960 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2c 20 74  are identical, t
2b970 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65  he integrity-che
2b980 63 6b 20 69 73 20 64 65 65 6d 65 64 20 74 6f 20  ck is deemed to 
2b990 68 61 76 65 0a 2a 2a 20 70 61 73 73 65 64 2e 0a  have.** passed..
2b9a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
2b9b0 73 33 44 6f 49 6e 74 65 67 72 69 74 79 43 68 65  s3DoIntegrityChe
2b9c0 63 6b 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  ck(.  Fts3Table 
2b9d0 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *p              
2b9e0 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61        /* FTS3 ta
2b9f0 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 29 7b  ble handle */.){
2ba00 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
2ba10 20 62 4f 6b 20 3d 20 30 3b 0a 20 20 72 63 20 3d   bOk = 0;.  rc =
2ba20 20 66 74 73 33 49 6e 74 65 67 72 69 74 79 43 68   fts3IntegrityCh
2ba30 65 63 6b 28 70 2c 20 26 62 4f 6b 29 3b 0a 20 20  eck(p, &bOk);.  
2ba40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2ba50 4b 20 26 26 20 62 4f 6b 3d 3d 30 20 29 20 72 63  K && bOk==0 ) rc
2ba60 20 3d 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56   = FTS_CORRUPT_V
2ba70 54 41 42 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  TAB;.  return rc
2ba80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c  ;.}../*.** Handl
2ba90 65 20 61 20 27 73 70 65 63 69 61 6c 27 20 49 4e  e a 'special' IN
2baa0 53 45 52 54 20 6f 66 20 74 68 65 20 66 6f 72 6d  SERT of the form
2bab0 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 49 4e 53 45 52  :.**.**   "INSER
2bac0 54 20 49 4e 54 4f 20 74 62 6c 28 74 62 6c 29 20  T INTO tbl(tbl) 
2bad0 56 41 4c 55 45 53 28 3c 65 78 70 72 3e 29 22 0a  VALUES(<expr>)".
2bae0 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  **.** Argument p
2baf0 56 61 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  Val contains the
2bb00 20 72 65 73 75 6c 74 20 6f 66 20 3c 65 78 70 72   result of <expr
2bb10 3e 2e 20 43 75 72 72 65 6e 74 6c 79 20 74 68 65  >. Currently the
2bb20 20 6f 6e 6c 79 20 0a 2a 2a 20 6d 65 61 6e 69 6e   only .** meanin
2bb30 67 66 75 6c 20 76 61 6c 75 65 20 74 6f 20 69 6e  gful value to in
2bb40 73 65 72 74 20 69 73 20 74 68 65 20 74 65 78 74  sert is the text
2bb50 20 27 6f 70 74 69 6d 69 7a 65 27 2e 0a 2a 2f 0a   'optimize'..*/.
2bb60 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53  static int fts3S
2bb70 70 65 63 69 61 6c 49 6e 73 65 72 74 28 46 74 73  pecialInsert(Fts
2bb80 33 54 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74  3Table *p, sqlit
2bb90 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 29 7b  e3_value *pVal){
2bba0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bbc0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
2bbd0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2bbe0 72 20 2a 7a 56 61 6c 20 3d 20 28 63 6f 6e 73 74  r *zVal = (const
2bbf0 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f   char *)sqlite3_
2bc00 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
2bc10 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73  ;.  int nVal = s
2bc20 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
2bc30 65 73 28 70 56 61 6c 29 3b 0a 0a 20 20 69 66 28  es(pVal);..  if(
2bc40 20 21 7a 56 61 6c 20 29 7b 0a 20 20 20 20 72 65   !zVal ){.    re
2bc50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2bc60 4d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  M;.  }else if( n
2bc70 56 61 6c 3d 3d 38 20 26 26 20 30 3d 3d 73 71 6c  Val==8 && 0==sql
2bc80 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56  ite3_strnicmp(zV
2bc90 61 6c 2c 20 22 6f 70 74 69 6d 69 7a 65 22 2c 20  al, "optimize", 
2bca0 38 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  8) ){.    rc = f
2bcb0 74 73 33 44 6f 4f 70 74 69 6d 69 7a 65 28 70 2c  ts3DoOptimize(p,
2bcc0 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   0);.  }else if(
2bcd0 20 6e 56 61 6c 3d 3d 37 20 26 26 20 30 3d 3d 73   nVal==7 && 0==s
2bce0 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
2bcf0 7a 56 61 6c 2c 20 22 72 65 62 75 69 6c 64 22 2c  zVal, "rebuild",
2bd00 20 37 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20   7) ){.    rc = 
2bd10 66 74 73 33 44 6f 52 65 62 75 69 6c 64 28 70 29  fts3DoRebuild(p)
2bd20 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56  ;.  }else if( nV
2bd30 61 6c 3d 3d 31 35 20 26 26 20 30 3d 3d 73 71 6c  al==15 && 0==sql
2bd40 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56  ite3_strnicmp(zV
2bd50 61 6c 2c 20 22 69 6e 74 65 67 72 69 74 79 2d 63  al, "integrity-c
2bd60 68 65 63 6b 22 2c 20 31 35 29 20 29 7b 0a 20 20  heck", 15) ){.  
2bd70 20 20 72 63 20 3d 20 66 74 73 33 44 6f 49 6e 74    rc = fts3DoInt
2bd80 65 67 72 69 74 79 43 68 65 63 6b 28 70 29 3b 0a  egrityCheck(p);.
2bd90 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 61 6c    }else if( nVal
2bda0 3e 36 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  >6 && 0==sqlite3
2bdb0 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20  _strnicmp(zVal, 
2bdc0 22 6d 65 72 67 65 3d 22 2c 20 36 29 20 29 7b 0a  "merge=", 6) ){.
2bdd0 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 6f 49      rc = fts3DoI
2bde0 6e 63 72 6d 65 72 67 65 28 70 2c 20 26 7a 56 61  ncrmerge(p, &zVa
2bdf0 6c 5b 36 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69  l[6]);.  }else i
2be00 66 28 20 6e 56 61 6c 3e 31 30 20 26 26 20 30 3d  f( nVal>10 && 0=
2be10 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d  =sqlite3_strnicm
2be20 70 28 7a 56 61 6c 2c 20 22 61 75 74 6f 6d 65 72  p(zVal, "automer
2be30 67 65 3d 22 2c 20 31 30 29 20 29 7b 0a 20 20 20  ge=", 10) ){.   
2be40 20 72 63 20 3d 20 66 74 73 33 44 6f 41 75 74 6f   rc = fts3DoAuto
2be50 69 6e 63 72 6d 65 72 67 65 28 70 2c 20 26 7a 56  incrmerge(p, &zV
2be60 61 6c 5b 31 30 5d 29 3b 0a 23 69 66 64 65 66 20  al[10]);.#ifdef 
2be70 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7d 65  SQLITE_TEST.  }e
2be80 6c 73 65 20 69 66 28 20 6e 56 61 6c 3e 39 20 26  lse if( nVal>9 &
2be90 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  & 0==sqlite3_str
2bea0 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22 6e 6f 64  nicmp(zVal, "nod
2beb0 65 73 69 7a 65 3d 22 2c 20 39 29 20 29 7b 0a 20  esize=", 9) ){. 
2bec0 20 20 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20     p->nNodeSize 
2bed0 3d 20 61 74 6f 69 28 26 7a 56 61 6c 5b 39 5d 29  = atoi(&zVal[9])
2bee0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
2bef0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
2bf00 28 20 6e 56 61 6c 3e 31 31 20 26 26 20 30 3d 3d  ( nVal>11 && 0==
2bf10 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
2bf20 28 7a 56 61 6c 2c 20 22 6d 61 78 70 65 6e 64 69  (zVal, "maxpendi
2bf30 6e 67 3d 22 2c 20 39 29 20 29 7b 0a 20 20 20 20  ng=", 9) ){.    
2bf40 70 2d 3e 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61  p->nMaxPendingDa
2bf50 74 61 20 3d 20 61 74 6f 69 28 26 7a 56 61 6c 5b  ta = atoi(&zVal[
2bf60 31 31 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  11]);.    rc = S
2bf70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
2bf80 65 20 69 66 28 20 6e 56 61 6c 3e 32 31 20 26 26  e if( nVal>21 &&
2bf90 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e   0==sqlite3_strn
2bfa0 69 63 6d 70 28 7a 56 61 6c 2c 20 22 74 65 73 74  icmp(zVal, "test
2bfb0 2d 6e 6f 2d 69 6e 63 72 2d 64 6f 63 6c 69 73 74  -no-incr-doclist
2bfc0 3d 22 2c 20 32 31 29 20 29 7b 0a 20 20 20 20 70  =", 21) ){.    p
2bfd0 2d 3e 62 4e 6f 49 6e 63 72 44 6f 63 6c 69 73 74  ->bNoIncrDoclist
2bfe0 20 3d 20 61 74 6f 69 28 26 7a 56 61 6c 5b 32 31   = atoi(&zVal[21
2bff0 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ]);.    rc = SQL
2c000 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 20  ITE_OK;.#endif. 
2c010 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
2c020 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2c030 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2c040 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
2c050 54 45 5f 44 49 53 41 42 4c 45 5f 46 54 53 34 5f  TE_DISABLE_FTS4_
2c060 44 45 46 45 52 52 45 44 0a 2f 2a 0a 2a 2a 20 44  DEFERRED./*.** D
2c070 65 6c 65 74 65 20 61 6c 6c 20 63 61 63 68 65 64  elete all cached
2c080 20 64 65 66 65 72 72 65 64 20 64 6f 63 6c 69 73   deferred doclis
2c090 74 73 2e 20 44 65 66 65 72 72 65 64 20 64 6f 63  ts. Deferred doc
2c0a0 6c 69 73 74 73 20 61 72 65 20 63 61 63 68 65 64  lists are cached
2c0b0 0a 2a 2a 20 28 61 6c 6c 6f 63 61 74 65 64 29 20  .** (allocated) 
2c0c0 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 46 74  by the sqlite3Ft
2c0d0 73 33 43 61 63 68 65 44 65 66 65 72 72 65 64 44  s3CacheDeferredD
2c0e0 6f 63 6c 69 73 74 73 28 29 20 66 75 6e 63 74 69  oclists() functi
2c0f0 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
2c100 74 65 33 46 74 73 33 46 72 65 65 44 65 66 65 72  te3Fts3FreeDefer
2c110 72 65 64 44 6f 63 6c 69 73 74 73 28 46 74 73 33  redDoclists(Fts3
2c120 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20  Cursor *pCsr){. 
2c130 20 46 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b   Fts3DeferredTok
2c140 65 6e 20 2a 70 44 65 66 3b 0a 20 20 66 6f 72 28  en *pDef;.  for(
2c150 70 44 65 66 3d 70 43 73 72 2d 3e 70 44 65 66 65  pDef=pCsr->pDefe
2c160 72 72 65 64 3b 20 70 44 65 66 3b 20 70 44 65 66  rred; pDef; pDef
2c170 3d 70 44 65 66 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pDef->pNext){. 
2c180 20 20 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69     fts3PendingLi
2c190 73 74 44 65 6c 65 74 65 28 70 44 65 66 2d 3e 70  stDelete(pDef->p
2c1a0 4c 69 73 74 29 3b 0a 20 20 20 20 70 44 65 66 2d  List);.    pDef-
2c1b0 3e 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a  >pList = 0;.  }.
2c1c0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c  }../*.** Free al
2c1d0 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  l entries in the
2c1e0 20 70 43 73 72 2d 3e 70 44 65 66 66 65 72 65 64   pCsr->pDeffered
2c1f0 20 6c 69 73 74 2e 20 45 6e 74 72 69 65 73 20 61   list. Entries a
2c200 72 65 20 61 64 64 65 64 20 74 6f 20 0a 2a 2a 20  re added to .** 
2c210 74 68 69 73 20 6c 69 73 74 20 75 73 69 6e 67 20  this list using 
2c220 73 71 6c 69 74 65 33 46 74 73 33 44 65 66 65 72  sqlite3Fts3Defer
2c230 54 6f 6b 65 6e 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Token()..*/.void
2c240 20 73 71 6c 69 74 65 33 46 74 73 33 46 72 65 65   sqlite3Fts3Free
2c250 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 73 28 46  DeferredTokens(F
2c260 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 29  ts3Cursor *pCsr)
2c270 7b 0a 20 20 46 74 73 33 44 65 66 65 72 72 65 64  {.  Fts3Deferred
2c280 54 6f 6b 65 6e 20 2a 70 44 65 66 3b 0a 20 20 46  Token *pDef;.  F
2c290 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e  ts3DeferredToken
2c2a0 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70   *pNext;.  for(p
2c2b0 44 65 66 3d 70 43 73 72 2d 3e 70 44 65 66 65 72  Def=pCsr->pDefer
2c2c0 72 65 64 3b 20 70 44 65 66 3b 20 70 44 65 66 3d  red; pDef; pDef=
2c2d0 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
2c2e0 74 20 3d 20 70 44 65 66 2d 3e 70 4e 65 78 74 3b  t = pDef->pNext;
2c2f0 0a 20 20 20 20 66 74 73 33 50 65 6e 64 69 6e 67  .    fts3Pending
2c300 4c 69 73 74 44 65 6c 65 74 65 28 70 44 65 66 2d  ListDelete(pDef-
2c310 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  >pList);.    sql
2c320 69 74 65 33 5f 66 72 65 65 28 70 44 65 66 29 3b  ite3_free(pDef);
2c330 0a 20 20 7d 0a 20 20 70 43 73 72 2d 3e 70 44 65  .  }.  pCsr->pDe
2c340 66 65 72 72 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f  ferred = 0;.}../
2c350 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 64 65  *.** Generate de
2c360 66 65 72 72 65 64 2d 64 6f 63 6c 69 73 74 73 20  ferred-doclists 
2c370 66 6f 72 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 69  for all tokens i
2c380 6e 20 74 68 65 20 70 43 73 72 2d 3e 70 44 65 66  n the pCsr->pDef
2c390 65 72 72 65 64 20 6c 69 73 74 0a 2a 2a 20 62 61  erred list.** ba
2c3a0 73 65 64 20 6f 6e 20 74 68 65 20 72 6f 77 20 74  sed on the row t
2c3b0 68 61 74 20 70 43 73 72 20 63 75 72 72 65 6e 74  hat pCsr current
2c3c0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a  ly points to..**
2c3d0 0a 2a 2a 20 41 20 64 65 66 65 72 72 65 64 2d 64  .** A deferred-d
2c3e0 6f 63 6c 69 73 74 20 69 73 20 6c 69 6b 65 20 61  oclist is like a
2c3f0 6e 79 20 6f 74 68 65 72 20 64 6f 63 6c 69 73 74  ny other doclist
2c400 20 77 69 74 68 20 70 6f 73 69 74 69 6f 6e 20 69   with position i
2c410 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e  nformation.** in
2c420 63 6c 75 64 65 64 2c 20 65 78 63 65 70 74 20 74  cluded, except t
2c430 68 61 74 20 69 74 20 6f 6e 6c 79 20 63 6f 6e 74  hat it only cont
2c440 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72  ains entries for
2c450 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
2c460 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 6e   the.** table, n
2c470 6f 74 20 66 6f 72 20 61 6c 6c 20 72 6f 77 73 2e  ot for all rows.
2c480 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
2c490 74 73 33 43 61 63 68 65 44 65 66 65 72 72 65 64  ts3CacheDeferred
2c4a0 44 6f 63 6c 69 73 74 73 28 46 74 73 33 43 75 72  Doclists(Fts3Cur
2c4b0 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e  sor *pCsr){.  in
2c4c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2c4d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2c4e0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2c4f0 20 20 69 66 28 20 70 43 73 72 2d 3e 70 44 65 66    if( pCsr->pDef
2c500 65 72 72 65 64 20 29 7b 0a 20 20 20 20 69 6e 74  erred ){.    int
2c510 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
2c520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
2c530 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
2c540 72 6f 75 67 68 20 74 61 62 6c 65 20 63 6f 6c 75  rough table colu
2c550 6d 6e 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  mns */.    sqlit
2c560 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 3b  e3_int64 iDocid;
2c570 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 69           /* Doci
2c580 64 20 6f 66 20 74 68 65 20 72 6f 77 20 70 43 73  d of the row pCs
2c590 72 20 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 20  r points to */. 
2c5a0 20 20 20 46 74 73 33 44 65 66 65 72 72 65 64 54     Fts3DeferredT
2c5b0 6f 6b 65 6e 20 2a 70 44 65 66 3b 20 20 20 20 20  oken *pDef;     
2c5c0 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
2c5d0 61 74 65 20 74 68 72 6f 75 67 68 20 64 65 66 65  ate through defe
2c5e0 72 72 65 64 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20  rred tokens */. 
2c5f0 20 0a 20 20 20 20 46 74 73 33 54 61 62 6c 65 20   .    Fts3Table 
2c600 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65 20  *p = (Fts3Table 
2c610 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74  *)pCsr->base.pVt
2c620 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ab;.    sqlite3_
2c630 74 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 20 3d 20  tokenizer *pT = 
2c640 70 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20  p->pTokenizer;. 
2c650 20 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e     sqlite3_token
2c660 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73  izer_module cons
2c670 74 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 54 2d  t *pModule = pT-
2c680 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 0a 20 20  >pModule;.   .  
2c690 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
2c6a0 69 73 52 65 71 75 69 72 65 53 65 65 6b 3d 3d 30  isRequireSeek==0
2c6b0 20 29 3b 0a 20 20 20 20 69 44 6f 63 69 64 20 3d   );.    iDocid =
2c6c0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
2c6d0 69 6e 74 36 34 28 70 43 73 72 2d 3e 70 53 74 6d  int64(pCsr->pStm
2c6e0 74 2c 20 30 29 3b 0a 20 20 0a 20 20 20 20 66 6f  t, 0);.  .    fo
2c6f0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
2c700 75 6d 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  umn && rc==SQLIT
2c710 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  E_OK; i++){.    
2c720 20 20 69 66 28 20 70 2d 3e 61 62 4e 6f 74 69 6e    if( p->abNotin
2c730 64 65 78 65 64 5b 69 5d 3d 3d 30 20 29 7b 0a 20  dexed[i]==0 ){. 
2c740 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
2c750 72 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73  r *zText = (cons
2c760 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  t char *)sqlite3
2c770 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 43 73  _column_text(pCs
2c780 72 2d 3e 70 53 74 6d 74 2c 20 69 2b 31 29 3b 0a  r->pStmt, i+1);.
2c790 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2c7a0 74 6f 6b 65 6e 69 7a 65 72 5f 63 75 72 73 6f 72  tokenizer_cursor
2c7b0 20 2a 70 54 43 20 3d 20 30 3b 0a 0a 20 20 20 20   *pTC = 0;..    
2c7c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2c7d0 46 74 73 33 4f 70 65 6e 54 6f 6b 65 6e 69 7a 65  Fts3OpenTokenize
2c7e0 72 28 70 54 2c 20 70 43 73 72 2d 3e 69 4c 61 6e  r(pT, pCsr->iLan
2c7f0 67 69 64 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20  gid, zText, -1, 
2c800 26 70 54 43 29 3b 0a 20 20 20 20 20 20 20 20 77  &pTC);.        w
2c810 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
2c820 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2c830 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 6f   char const *zTo
2c840 6b 65 6e 3b 20 20 20 20 20 20 20 2f 2a 20 42 75  ken;       /* Bu
2c850 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
2c860 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20  token */.       
2c870 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 3d 20     int nToken = 
2c880 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
2c890 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
2c8a0 69 6e 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20  in token */.    
2c8b0 20 20 20 20 20 20 69 6e 74 20 69 44 75 6d 31 20        int iDum1 
2c8c0 3d 20 30 2c 20 69 44 75 6d 32 20 3d 20 30 3b 20  = 0, iDum2 = 0; 
2c8d0 2f 2a 20 44 75 6d 6d 79 20 76 61 72 69 61 62 6c  /* Dummy variabl
2c8e0 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  es */.          
2c8f0 69 6e 74 20 69 50 6f 73 20 3d 20 30 3b 20 20 20  int iPos = 0;   
2c900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73            /* Pos
2c910 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 69  ition of token i
2c920 6e 20 7a 54 65 78 74 20 2a 2f 0a 0a 20 20 20 20  n zText */..    
2c930 20 20 20 20 20 20 72 63 20 3d 20 70 4d 6f 64 75        rc = pModu
2c940 6c 65 2d 3e 78 4e 65 78 74 28 70 54 43 2c 20 26  le->xNext(pTC, &
2c950 7a 54 6f 6b 65 6e 2c 20 26 6e 54 6f 6b 65 6e 2c  zToken, &nToken,
2c960 20 26 69 44 75 6d 31 2c 20 26 69 44 75 6d 32 2c   &iDum1, &iDum2,
2c970 20 26 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20   &iPos);.       
2c980 20 20 20 66 6f 72 28 70 44 65 66 3d 70 43 73 72     for(pDef=pCsr
2c990 2d 3e 70 44 65 66 65 72 72 65 64 3b 20 70 44 65  ->pDeferred; pDe
2c9a0 66 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  f && rc==SQLITE_
2c9b0 4f 4b 3b 20 70 44 65 66 3d 70 44 65 66 2d 3e 70  OK; pDef=pDef->p
2c9c0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  Next){.         
2c9d0 20 20 20 46 74 73 33 50 68 72 61 73 65 54 6f 6b     Fts3PhraseTok
2c9e0 65 6e 20 2a 70 50 54 20 3d 20 70 44 65 66 2d 3e  en *pPT = pDef->
2c9f0 70 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  pToken;.        
2ca00 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 69      if( (pDef->i
2ca10 43 6f 6c 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20  Col>=p->nColumn 
2ca20 7c 7c 20 70 44 65 66 2d 3e 69 43 6f 6c 3d 3d 69  || pDef->iCol==i
2ca30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
2ca40 20 20 26 26 20 28 70 50 54 2d 3e 62 46 69 72 73    && (pPT->bFirs
2ca50 74 3d 3d 30 20 7c 7c 20 69 50 6f 73 3d 3d 30 29  t==0 || iPos==0)
2ca60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ca70 20 26 26 20 28 70 50 54 2d 3e 6e 3d 3d 6e 54 6f   && (pPT->n==nTo
2ca80 6b 65 6e 20 7c 7c 20 28 70 50 54 2d 3e 69 73 50  ken || (pPT->isP
2ca90 72 65 66 69 78 20 26 26 20 70 50 54 2d 3e 6e 3c  refix && pPT->n<
2caa0 6e 54 6f 6b 65 6e 29 29 0a 20 20 20 20 20 20 20  nToken)).       
2cab0 20 20 20 20 20 20 20 20 20 26 26 20 28 30 3d 3d           && (0==
2cac0 6d 65 6d 63 6d 70 28 7a 54 6f 6b 65 6e 2c 20 70  memcmp(zToken, p
2cad0 50 54 2d 3e 7a 2c 20 70 50 54 2d 3e 6e 29 29 0a  PT->z, pPT->n)).
2cae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 7b                ){
2caf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
2cb00 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70  ts3PendingListAp
2cb10 70 65 6e 64 28 26 70 44 65 66 2d 3e 70 4c 69 73  pend(&pDef->pLis
2cb20 74 2c 20 69 44 6f 63 69 64 2c 20 69 2c 20 69 50  t, iDocid, i, iP
2cb30 6f 73 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  os, &rc);.      
2cb40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2cb50 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2cb60 20 20 20 20 20 20 69 66 28 20 70 54 43 20 29 20        if( pTC ) 
2cb70 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28  pModule->xClose(
2cb80 70 54 43 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pTC);.        if
2cb90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
2cba0 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  E ) rc = SQLITE_
2cbb0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2cbc0 7d 0a 0a 20 20 20 20 66 6f 72 28 70 44 65 66 3d  }..    for(pDef=
2cbd0 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64 3b  pCsr->pDeferred;
2cbe0 20 70 44 65 66 20 26 26 20 72 63 3d 3d 53 51 4c   pDef && rc==SQL
2cbf0 49 54 45 5f 4f 4b 3b 20 70 44 65 66 3d 70 44 65  ITE_OK; pDef=pDe
2cc00 66 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  f->pNext){.     
2cc10 20 69 66 28 20 70 44 65 66 2d 3e 70 4c 69 73 74   if( pDef->pList
2cc20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2cc30 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74   fts3PendingList
2cc40 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 44  AppendVarint(&pD
2cc50 65 66 2d 3e 70 4c 69 73 74 2c 20 30 29 3b 0a 20  ef->pList, 0);. 
2cc60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2cc70 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2cc80 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
2cc90 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 4c 69  3DeferredTokenLi
2cca0 73 74 28 0a 20 20 46 74 73 33 44 65 66 65 72 72  st(.  Fts3Deferr
2ccb0 65 64 54 6f 6b 65 6e 20 2a 70 2c 20 0a 20 20 63  edToken *p, .  c
2ccc0 68 61 72 20 2a 2a 70 70 44 61 74 61 2c 20 0a 20  har **ppData, . 
2ccd0 20 69 6e 74 20 2a 70 6e 44 61 74 61 0a 29 7b 0a   int *pnData.){.
2cce0 20 20 63 68 61 72 20 2a 70 52 65 74 3b 0a 20 20    char *pRet;.  
2ccf0 69 6e 74 20 6e 53 6b 69 70 3b 0a 20 20 73 71 6c  int nSkip;.  sql
2cd00 69 74 65 33 5f 69 6e 74 36 34 20 64 75 6d 6d 79  ite3_int64 dummy
2cd10 3b 0a 0a 20 20 2a 70 70 44 61 74 61 20 3d 20 30  ;..  *ppData = 0
2cd20 3b 0a 20 20 2a 70 6e 44 61 74 61 20 3d 20 30 3b  ;.  *pnData = 0;
2cd30 0a 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 73 74  ..  if( p->pList
2cd40 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
2cd50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2cd60 0a 0a 20 20 70 52 65 74 20 3d 20 28 63 68 61 72  ..  pRet = (char
2cd70 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
2cd80 63 28 70 2d 3e 70 4c 69 73 74 2d 3e 6e 44 61 74  c(p->pList->nDat
2cd90 61 29 3b 0a 20 20 69 66 28 20 21 70 52 65 74 20  a);.  if( !pRet 
2cda0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2cdb0 4e 4f 4d 45 4d 3b 0a 0a 20 20 6e 53 6b 69 70 20  NOMEM;..  nSkip 
2cdc0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74  = sqlite3Fts3Get
2cdd0 56 61 72 69 6e 74 28 70 2d 3e 70 4c 69 73 74 2d  Varint(p->pList-
2cde0 3e 61 44 61 74 61 2c 20 26 64 75 6d 6d 79 29 3b  >aData, &dummy);
2cdf0 0a 20 20 2a 70 6e 44 61 74 61 20 3d 20 70 2d 3e  .  *pnData = p->
2ce00 70 4c 69 73 74 2d 3e 6e 44 61 74 61 20 2d 20 6e  pList->nData - n
2ce10 53 6b 69 70 3b 0a 20 20 2a 70 70 44 61 74 61 20  Skip;.  *ppData 
2ce20 3d 20 70 52 65 74 3b 0a 20 20 0a 20 20 6d 65 6d  = pRet;.  .  mem
2ce30 63 70 79 28 70 52 65 74 2c 20 26 70 2d 3e 70 4c  cpy(pRet, &p->pL
2ce40 69 73 74 2d 3e 61 44 61 74 61 5b 6e 53 6b 69 70  ist->aData[nSkip
2ce50 5d 2c 20 2a 70 6e 44 61 74 61 29 3b 0a 20 20 72  ], *pnData);.  r
2ce60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2ce70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
2ce80 20 65 6e 74 72 79 20 66 6f 72 20 74 6f 6b 65 6e   entry for token
2ce90 20 70 54 6f 6b 65 6e 20 74 6f 20 74 68 65 20 70   pToken to the p
2cea0 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64 20 6c  Csr->pDeferred l
2ceb0 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ist..*/.int sqli
2cec0 74 65 33 46 74 73 33 44 65 66 65 72 54 6f 6b 65  te3Fts3DeferToke
2ced0 6e 28 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20  n(.  Fts3Cursor 
2cee0 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20 20  *pCsr,          
2cef0 20 20 20 20 20 2f 2a 20 46 74 73 33 20 74 61 62       /* Fts3 tab
2cf00 6c 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 46  le cursor */.  F
2cf10 74 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a  ts3PhraseToken *
2cf20 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 2f  pToken,        /
2cf30 2a 20 54 6f 6b 65 6e 20 74 6f 20 64 65 66 65 72  * Token to defer
2cf40 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20   */.  int iCol  
2cf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf60 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
2cf70 74 68 61 74 20 74 6f 6b 65 6e 20 6d 75 73 74 20  that token must 
2cf80 61 70 70 65 61 72 20 69 6e 20 28 6f 72 20 2d 31  appear in (or -1
2cf90 29 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 44 65  ) */.){.  Fts3De
2cfa0 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70 44 65  ferredToken *pDe
2cfb0 66 65 72 72 65 64 3b 0a 20 20 70 44 65 66 65 72  ferred;.  pDefer
2cfc0 72 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  red = sqlite3_ma
2cfd0 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 44 65  lloc(sizeof(*pDe
2cfe0 66 65 72 72 65 64 29 29 3b 0a 20 20 69 66 28 20  ferred));.  if( 
2cff0 21 70 44 65 66 65 72 72 65 64 20 29 7b 0a 20 20  !pDeferred ){.  
2d000 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d010 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d  NOMEM;.  }.  mem
2d020 73 65 74 28 70 44 65 66 65 72 72 65 64 2c 20 30  set(pDeferred, 0
2d030 2c 20 73 69 7a 65 6f 66 28 2a 70 44 65 66 65 72  , sizeof(*pDefer
2d040 72 65 64 29 29 3b 0a 20 20 70 44 65 66 65 72 72  red));.  pDeferr
2d050 65 64 2d 3e 70 54 6f 6b 65 6e 20 3d 20 70 54 6f  ed->pToken = pTo
2d060 6b 65 6e 3b 0a 20 20 70 44 65 66 65 72 72 65 64  ken;.  pDeferred
2d070 2d 3e 70 4e 65 78 74 20 3d 20 70 43 73 72 2d 3e  ->pNext = pCsr->
2d080 70 44 65 66 65 72 72 65 64 3b 20 0a 20 20 70 44  pDeferred; .  pD
2d090 65 66 65 72 72 65 64 2d 3e 69 43 6f 6c 20 3d 20  eferred->iCol = 
2d0a0 69 43 6f 6c 3b 0a 20 20 70 43 73 72 2d 3e 70 44  iCol;.  pCsr->pD
2d0b0 65 66 65 72 72 65 64 20 3d 20 70 44 65 66 65 72  eferred = pDefer
2d0c0 72 65 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  red;..  assert( 
2d0d0 70 54 6f 6b 65 6e 2d 3e 70 44 65 66 65 72 72 65  pToken->pDeferre
2d0e0 64 3d 3d 30 20 29 3b 0a 20 20 70 54 6f 6b 65 6e  d==0 );.  pToken
2d0f0 2d 3e 70 44 65 66 65 72 72 65 64 20 3d 20 70 44  ->pDeferred = pD
2d100 65 66 65 72 72 65 64 3b 0a 0a 20 20 72 65 74 75  eferred;..  retu
2d110 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2d120 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 51  #endif../*.** SQ
2d130 4c 69 74 65 20 76 61 6c 75 65 20 70 52 6f 77 69  Lite value pRowi
2d140 64 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72  d contains the r
2d150 6f 77 69 64 20 6f 66 20 61 20 72 6f 77 20 74 68  owid of a row th
2d160 61 74 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  at may or may no
2d170 74 20 62 65 0a 2a 2a 20 70 72 65 73 65 6e 74 20  t be.** present 
2d180 69 6e 20 74 68 65 20 46 54 53 33 20 74 61 62 6c  in the FTS3 tabl
2d190 65 2e 20 49 66 20 69 74 20 69 73 2c 20 64 65 6c  e. If it is, del
2d1a0 65 74 65 20 69 74 20 61 6e 64 20 61 64 6a 75 73  ete it and adjus
2d1b0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  t the contents.*
2d1c0 2a 20 6f 66 20 73 75 62 73 69 64 75 61 72 79 20  * of subsiduary 
2d1d0 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
2d1e0 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a  accordingly..*/.
2d1f0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 44  static int fts3D
2d200 65 6c 65 74 65 42 79 52 6f 77 69 64 28 0a 20 20  eleteByRowid(.  
2d210 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 0a 20  Fts3Table *p, . 
2d220 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2d230 70 52 6f 77 69 64 2c 20 0a 20 20 69 6e 74 20 2a  pRowid, .  int *
2d240 70 6e 43 68 6e 67 2c 20 20 20 20 20 20 20 20 20  pnChng,         
2d250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
2d260 2f 4f 55 54 3a 20 44 65 63 72 65 6d 65 6e 74 20  /OUT: Decrement 
2d270 69 66 20 72 6f 77 20 69 73 20 64 65 6c 65 74 65  if row is delete
2d280 64 20 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a 44  d */.  u32 *aSzD
2d290 65 6c 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  el.){.  int rc =
2d2a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2d2b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2d2c0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2d2d0 62 46 6f 75 6e 64 20 3d 20 30 3b 20 20 20 20 20  bFound = 0;     
2d2e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2d2f0 72 75 65 20 69 66 20 2a 70 52 6f 77 69 64 20 72  rue if *pRowid r
2d300 65 61 6c 6c 79 20 69 73 20 69 6e 20 74 68 65 20  eally is in the 
2d310 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 66 74 73 33  table */..  fts3
2d320 44 65 6c 65 74 65 54 65 72 6d 73 28 26 72 63 2c  DeleteTerms(&rc,
2d330 20 70 2c 20 70 52 6f 77 69 64 2c 20 61 53 7a 44   p, pRowid, aSzD
2d340 65 6c 2c 20 26 62 46 6f 75 6e 64 29 3b 0a 20 20  el, &bFound);.  
2d350 69 66 28 20 62 46 6f 75 6e 64 20 26 26 20 72 63  if( bFound && rc
2d360 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2d370 20 20 20 69 6e 74 20 69 73 45 6d 70 74 79 20 3d     int isEmpty =
2d380 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2d390 20 2f 2a 20 44 65 6c 65 74 69 6e 67 20 2a 70 52   /* Deleting *pR
2d3a0 6f 77 69 64 20 6c 65 61 76 65 73 20 74 68 65 20  owid leaves the 
2d3b0 74 61 62 6c 65 20 65 6d 70 74 79 20 2a 2f 0a 20  table empty */. 
2d3c0 20 20 20 72 63 20 3d 20 66 74 73 33 49 73 45 6d     rc = fts3IsEm
2d3d0 70 74 79 28 70 2c 20 70 52 6f 77 69 64 2c 20 26  pty(p, pRowid, &
2d3e0 69 73 45 6d 70 74 79 29 3b 0a 20 20 20 20 69 66  isEmpty);.    if
2d3f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2d400 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 45  ){.      if( isE
2d410 6d 70 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20  mpty ){.        
2d420 2f 2a 20 44 65 6c 65 74 69 6e 67 20 74 68 69 73  /* Deleting this
2d430 20 72 6f 77 20 6d 65 61 6e 73 20 74 68 65 20 77   row means the w
2d440 68 6f 6c 65 20 74 61 62 6c 65 20 69 73 20 65 6d  hole table is em
2d450 70 74 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73  pty. In this cas
2d460 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 65 6c  e.        ** del
2d470 65 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ete the contents
2d480 20 6f 66 20 61 6c 6c 20 74 68 72 65 65 20 74 61   of all three ta
2d490 62 6c 65 73 20 61 6e 64 20 74 68 72 6f 77 20 61  bles and throw a
2d4a0 77 61 79 20 61 6e 79 0a 20 20 20 20 20 20 20 20  way any.        
2d4b0 2a 2a 20 64 61 74 61 20 69 6e 20 74 68 65 20 70  ** data in the p
2d4c0 65 6e 64 69 6e 67 54 65 72 6d 73 20 68 61 73 68  endingTerms hash
2d4d0 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20   table.  */.    
2d4e0 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 65 6c      rc = fts3Del
2d4f0 65 74 65 41 6c 6c 28 70 2c 20 31 29 3b 0a 20 20  eteAll(p, 1);.  
2d500 20 20 20 20 20 20 2a 70 6e 43 68 6e 67 20 3d 20        *pnChng = 
2d510 30 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  0;.        memse
2d520 74 28 61 53 7a 44 65 6c 2c 20 30 2c 20 73 69 7a  t(aSzDel, 0, siz
2d530 65 6f 66 28 75 33 32 29 20 2a 20 28 70 2d 3e 6e  eof(u32) * (p->n
2d540 43 6f 6c 75 6d 6e 2b 31 29 20 2a 20 32 29 3b 0a  Column+1) * 2);.
2d550 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2d560 20 20 20 20 20 2a 70 6e 43 68 6e 67 20 3d 20 2a       *pnChng = *
2d570 70 6e 43 68 6e 67 20 2d 20 31 3b 0a 20 20 20 20  pnChng - 1;.    
2d580 20 20 20 20 69 66 28 20 70 2d 3e 7a 43 6f 6e 74      if( p->zCont
2d590 65 6e 74 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  entTbl==0 ){.   
2d5a0 20 20 20 20 20 20 20 66 74 73 33 53 71 6c 45 78         fts3SqlEx
2d5b0 65 63 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44  ec(&rc, p, SQL_D
2d5c0 45 4c 45 54 45 5f 43 4f 4e 54 45 4e 54 2c 20 26  ELETE_CONTENT, &
2d5d0 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  pRowid);.       
2d5e0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
2d5f0 2d 3e 62 48 61 73 44 6f 63 73 69 7a 65 20 29 7b  ->bHasDocsize ){
2d600 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33 53  .          fts3S
2d610 71 6c 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53  qlExec(&rc, p, S
2d620 51 4c 5f 44 45 4c 45 54 45 5f 44 4f 43 53 49 5a  QL_DELETE_DOCSIZ
2d630 45 2c 20 26 70 52 6f 77 69 64 29 3b 0a 20 20 20  E, &pRowid);.   
2d640 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2d650 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
2d660 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2d670 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
2d680 65 73 20 74 68 65 20 77 6f 72 6b 20 66 6f 72 20  es the work for 
2d690 74 68 65 20 78 55 70 64 61 74 65 20 6d 65 74 68  the xUpdate meth
2d6a0 6f 64 20 6f 66 20 46 54 53 33 20 76 69 72 74 75  od of FTS3 virtu
2d6b0 61 6c 0a 2a 2a 20 74 61 62 6c 65 73 2e 20 54 68  al.** tables. Th
2d6c0 65 20 73 63 68 65 6d 61 20 6f 66 20 74 68 65 20  e schema of the 
2d6d0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 62 65  virtual table be
2d6e0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43  ing:.**.**     C
2d6f0 52 45 41 54 45 20 54 41 42 4c 45 20 3c 74 61 62  REATE TABLE <tab
2d700 6c 65 20 6e 61 6d 65 3e 28 20 0a 2a 2a 20 20 20  le name>( .**   
2d710 20 20 20 20 3c 75 73 65 72 20 63 6f 6c 75 6d 6e      <user column
2d720 73 3e 2c 0a 2a 2a 20 20 20 20 20 20 20 3c 74 61  s>,.**       <ta
2d730 62 6c 65 20 6e 61 6d 65 3e 20 48 49 44 44 45 4e  ble name> HIDDEN
2d740 2c 20 0a 2a 2a 20 20 20 20 20 20 20 64 6f 63 69  , .**       doci
2d750 64 20 48 49 44 44 45 4e 2c 20 0a 2a 2a 20 20 20  d HIDDEN, .**   
2d760 20 20 20 20 3c 6c 61 6e 67 69 64 3e 20 48 49 44      <langid> HID
2d770 44 45 4e 0a 2a 2a 20 20 20 20 20 29 3b 0a 2a 2a  DEN.**     );.**
2d780 0a 2a 2a 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  .** .*/.int sqli
2d790 74 65 33 46 74 73 33 55 70 64 61 74 65 4d 65 74  te3Fts3UpdateMet
2d7a0 68 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  hod(.  sqlite3_v
2d7b0 74 61 62 20 2a 70 56 74 61 62 2c 20 20 20 20 20  tab *pVtab,     
2d7c0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 76         /* FTS3 v
2d7d0 74 61 62 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  tab object */.  
2d7e0 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20  int nArg,       
2d7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d800 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 67 75 6d  /* Size of argum
2d810 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 73  ent array */.  s
2d820 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
2d830 70 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  pVal,          /
2d840 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
2d850 65 6e 74 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ents */.  sqlite
2d860 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 20 20  _int64 *pRowid  
2d870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2d880 3a 20 54 68 65 20 61 66 66 65 63 74 65 64 20 28  : The affected (
2d890 6f 72 20 65 66 66 65 63 74 65 64 29 20 72 6f 77  or effected) row
2d8a0 69 64 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 54  id */.){.  Fts3T
2d8b0 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33 54  able *p = (Fts3T
2d8c0 61 62 6c 65 20 2a 29 70 56 74 61 62 3b 0a 20 20  able *)pVtab;.  
2d8d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2d8e0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
2d8f0 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
2d900 2f 0a 20 20 69 6e 74 20 69 73 52 65 6d 6f 76 65  /.  int isRemove
2d910 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2d920 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
2d930 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
2d940 45 54 45 20 2a 2f 0a 20 20 75 33 32 20 2a 61 53  ETE */.  u32 *aS
2d950 7a 49 6e 73 20 3d 20 30 3b 20 20 20 20 20 20 20  zIns = 0;       
2d960 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2d970 73 20 6f 66 20 69 6e 73 65 72 74 65 64 20 64 6f  s of inserted do
2d980 63 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 75 33 32  cuments */.  u32
2d990 20 2a 61 53 7a 44 65 6c 20 3d 20 30 3b 20 20 20   *aSzDel = 0;   
2d9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d9b0 53 69 7a 65 73 20 6f 66 20 64 65 6c 65 74 65 64  Sizes of deleted
2d9c0 20 64 6f 63 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   documents */.  
2d9d0 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b 20 20  int nChng = 0;  
2d9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d9f0 2f 2a 20 4e 65 74 20 63 68 61 6e 67 65 20 69 6e  /* Net change in
2da00 20 6e 75 6d 62 65 72 20 6f 66 20 64 6f 63 75 6d   number of docum
2da10 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 62 49  ents */.  int bI
2da20 6e 73 65 72 74 44 6f 6e 65 20 3d 20 30 3b 0a 0a  nsertDone = 0;..
2da30 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
2da40 6e 74 20 69 74 20 6d 75 73 74 20 62 65 20 6b 6e  nt it must be kn
2da50 6f 77 6e 20 69 66 20 74 68 65 20 25 5f 73 74 61  own if the %_sta
2da60 74 20 74 61 62 6c 65 20 65 78 69 73 74 73 20 6f  t table exists o
2da70 72 20 6e 6f 74 2e 0a 20 20 2a 2a 20 53 6f 20 62  r not..  ** So b
2da80 48 61 73 53 74 61 74 20 6d 61 79 20 6e 6f 74 20  HasStat may not 
2da90 62 65 20 32 2e 20 20 2a 2f 0a 20 20 61 73 73 65  be 2.  */.  asse
2daa0 72 74 28 20 70 2d 3e 62 48 61 73 53 74 61 74 3d  rt( p->bHasStat=
2dab0 3d 30 20 7c 7c 20 70 2d 3e 62 48 61 73 53 74 61  =0 || p->bHasSta
2dac0 74 3d 3d 31 20 29 3b 0a 0a 20 20 61 73 73 65 72  t==1 );..  asser
2dad0 74 28 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73 3d  t( p->pSegments=
2dae0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2daf0 0a 20 20 20 20 20 20 6e 41 72 67 3d 3d 31 20 20  .      nArg==1  
2db00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db10 20 20 20 2f 2a 20 44 45 4c 45 54 45 20 6f 70 65     /* DELETE ope
2db20 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 7c 7c  rations */.   ||
2db30 20 6e 41 72 67 3d 3d 28 32 20 2b 20 70 2d 3e 6e   nArg==(2 + p->n
2db40 43 6f 6c 75 6d 6e 20 2b 20 33 29 20 20 2f 2a 20  Column + 3)  /* 
2db50 49 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54 45  INSERT or UPDATE
2db60 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20   operations */. 
2db70 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
2db80 66 6f 72 20 61 20 22 73 70 65 63 69 61 6c 22 20  for a "special" 
2db90 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e  INSERT operation
2dba0 2e 20 4f 6e 65 20 6f 66 20 74 68 65 20 66 6f 72  . One of the for
2dbb0 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 49  m:.  **.  **   I
2dbc0 4e 53 45 52 54 20 49 4e 54 4f 20 78 79 7a 28 78  NSERT INTO xyz(x
2dbd0 79 7a 29 20 56 41 4c 55 45 53 28 27 63 6f 6d 6d  yz) VALUES('comm
2dbe0 61 6e 64 27 29 3b 0a 20 20 2a 2f 0a 20 20 69 66  and');.  */.  if
2dbf0 28 20 6e 41 72 67 3e 31 20 0a 20 20 20 26 26 20  ( nArg>1 .   && 
2dc00 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
2dc10 70 65 28 61 70 56 61 6c 5b 30 5d 29 3d 3d 53 51  pe(apVal[0])==SQ
2dc20 4c 49 54 45 5f 4e 55 4c 4c 20 0a 20 20 20 26 26  LITE_NULL .   &&
2dc30 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
2dc40 79 70 65 28 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f  ype(apVal[p->nCo
2dc50 6c 75 6d 6e 2b 32 5d 29 21 3d 53 51 4c 49 54 45  lumn+2])!=SQLITE
2dc60 5f 4e 55 4c 4c 20 0a 20 20 29 7b 0a 20 20 20 20  _NULL .  ){.    
2dc70 72 63 20 3d 20 66 74 73 33 53 70 65 63 69 61 6c  rc = fts3Special
2dc80 49 6e 73 65 72 74 28 70 2c 20 61 70 56 61 6c 5b  Insert(p, apVal[
2dc90 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 5d 29 3b 0a  p->nColumn+2]);.
2dca0 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f      goto update_
2dcb0 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  out;.  }..  if( 
2dcc0 6e 41 72 67 3e 31 20 26 26 20 73 71 6c 69 74 65  nArg>1 && sqlite
2dcd0 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61  3_value_int(apVa
2dce0 6c 5b 32 20 2b 20 70 2d 3e 6e 43 6f 6c 75 6d 6e  l[2 + p->nColumn
2dcf0 20 2b 20 32 5d 29 3c 30 20 29 7b 0a 20 20 20 20   + 2])<0 ){.    
2dd00 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
2dd10 54 52 41 49 4e 54 3b 0a 20 20 20 20 67 6f 74 6f  TRAINT;.    goto
2dd20 20 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20 20 7d   update_out;.  }
2dd30 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
2dd40 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  space to hold th
2dd50 65 20 63 68 61 6e 67 65 20 69 6e 20 64 6f 63 75  e change in docu
2dd60 6d 65 6e 74 20 73 69 7a 65 73 20 2a 2f 0a 20 20  ment sizes */.  
2dd70 61 53 7a 44 65 6c 20 3d 20 73 71 6c 69 74 65 33  aSzDel = sqlite3
2dd80 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
2dd90 61 53 7a 44 65 6c 5b 30 5d 29 2a 28 70 2d 3e 6e  aSzDel[0])*(p->n
2dda0 43 6f 6c 75 6d 6e 2b 31 29 2a 32 20 29 3b 0a 20  Column+1)*2 );. 
2ddb0 20 69 66 28 20 61 53 7a 44 65 6c 3d 3d 30 20 29   if( aSzDel==0 )
2ddc0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
2ddd0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
2dde0 6f 20 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20 20  o update_out;.  
2ddf0 7d 0a 20 20 61 53 7a 49 6e 73 20 3d 20 26 61 53  }.  aSzIns = &aS
2de00 7a 44 65 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  zDel[p->nColumn+
2de10 31 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 53 7a  1];.  memset(aSz
2de20 44 65 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  Del, 0, sizeof(a
2de30 53 7a 44 65 6c 5b 30 5d 29 2a 28 70 2d 3e 6e 43  SzDel[0])*(p->nC
2de40 6f 6c 75 6d 6e 2b 31 29 2a 32 29 3b 0a 0a 20 20  olumn+1)*2);..  
2de50 72 63 20 3d 20 66 74 73 33 57 72 69 74 65 6c 6f  rc = fts3Writelo
2de60 63 6b 28 70 29 3b 0a 20 20 69 66 28 20 72 63 21  ck(p);.  if( rc!
2de70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2de80 6f 20 75 70 64 61 74 65 5f 6f 75 74 3b 0a 0a 20  o update_out;.. 
2de90 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
2dea0 6e 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69  n INSERT operati
2deb0 6f 6e 2c 20 6f 72 20 61 6e 20 55 50 44 41 54 45  on, or an UPDATE
2dec0 20 74 68 61 74 20 6d 6f 64 69 66 69 65 73 20 74   that modifies t
2ded0 68 65 20 72 6f 77 69 64 0a 20 20 2a 2a 20 76 61  he rowid.  ** va
2dee0 6c 75 65 2c 20 74 68 65 6e 20 74 68 69 73 20 6f  lue, then this o
2def0 70 65 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  peration require
2df00 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 6e  s constraint han
2df10 64 6c 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dling..  **.  **
2df20 20 49 66 20 74 68 65 20 6f 6e 2d 63 6f 6e 66 6c   If the on-confl
2df30 69 63 74 20 6d 6f 64 65 20 69 73 20 52 45 50 4c  ict mode is REPL
2df40 41 43 45 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ACE, this means 
2df50 74 68 61 74 20 74 68 65 20 65 78 69 73 74 69 6e  that the existin
2df60 67 20 72 6f 77 0a 20 20 2a 2a 20 73 68 6f 75 6c  g row.  ** shoul
2df70 64 20 62 65 20 64 65 6c 65 74 65 64 20 66 72 6f  d be deleted fro
2df80 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  m the database b
2df90 65 66 6f 72 65 20 69 6e 73 65 72 74 69 6e 67 20  efore inserting 
2dfa0 74 68 65 20 6e 65 77 20 72 6f 77 2e 20 4f 72 2c  the new row. Or,
2dfb0 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 6f 6e 2d  .  ** if the on-
2dfc0 63 6f 6e 66 6c 69 63 74 20 6d 6f 64 65 20 69 73  conflict mode is
2dfd0 20 6f 74 68 65 72 20 74 68 61 6e 20 52 45 50 4c   other than REPL
2dfe0 41 43 45 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  ACE, then this m
2dff0 65 74 68 6f 64 20 6d 75 73 74 0a 20 20 2a 2a 20  ethod must.  ** 
2e000 64 65 74 65 63 74 20 74 68 65 20 63 6f 6e 66 6c  detect the confl
2e010 69 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ict and return S
2e020 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
2e030 20 62 65 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e   before beginnin
2e040 67 20 74 6f 0a 20 20 2a 2a 20 6d 6f 64 69 66 79  g to.  ** modify
2e050 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e060 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  le..  */.  if( n
2e070 41 72 67 3e 31 20 26 26 20 70 2d 3e 7a 43 6f 6e  Arg>1 && p->zCon
2e080 74 65 6e 74 54 62 6c 3d 3d 30 20 29 7b 0a 20 20  tentTbl==0 ){.  
2e090 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 76 61    /* Find the va
2e0a0 6c 75 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20  lue object that 
2e0b0 68 6f 6c 64 73 20 74 68 65 20 6e 65 77 20 72 6f  holds the new ro
2e0c0 77 69 64 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  wid value. */.  
2e0d0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
2e0e0 2a 70 4e 65 77 52 6f 77 69 64 20 3d 20 61 70 56  *pNewRowid = apV
2e0f0 61 6c 5b 33 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d  al[3+p->nColumn]
2e100 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2e110 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 4e 65  3_value_type(pNe
2e120 77 52 6f 77 69 64 29 3d 3d 53 51 4c 49 54 45 5f  wRowid)==SQLITE_
2e130 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e  NULL ){.      pN
2e140 65 77 52 6f 77 69 64 20 3d 20 61 70 56 61 6c 5b  ewRowid = apVal[
2e150 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  1];.    }..    i
2e160 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
2e170 5f 74 79 70 65 28 70 4e 65 77 52 6f 77 69 64 29  _type(pNewRowid)
2e180 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 26 26  !=SQLITE_NULL &&
2e190 20 28 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ( .        sqli
2e1a0 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
2e1b0 70 56 61 6c 5b 30 5d 29 3d 3d 53 51 4c 49 54 45  pVal[0])==SQLITE
2e1c0 5f 4e 55 4c 4c 0a 20 20 20 20 20 7c 7c 20 73 71  _NULL.     || sq
2e1d0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
2e1e0 34 28 61 70 56 61 6c 5b 30 5d 29 21 3d 73 71 6c  4(apVal[0])!=sql
2e1f0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
2e200 28 70 4e 65 77 52 6f 77 69 64 29 0a 20 20 20 20  (pNewRowid).    
2e210 29 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  )){.      /* The
2e220 20 6e 65 77 20 72 6f 77 69 64 20 69 73 20 6e 6f   new rowid is no
2e230 74 20 4e 55 4c 4c 20 28 69 6e 20 74 68 69 73 20  t NULL (in this 
2e240 63 61 73 65 20 74 68 65 20 72 6f 77 69 64 20 77  case the rowid w
2e250 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  ill be.      ** 
2e260 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73  automatically as
2e270 73 69 67 6e 65 64 20 61 6e 64 20 74 68 65 72 65  signed and there
2e280 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 6f 66   is no chance of
2e290 20 61 20 63 6f 6e 66 6c 69 63 74 29 2c 20 61 6e   a conflict), an
2e2a0 64 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  d .      ** the 
2e2b0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 65 69 74  statement is eit
2e2c0 68 65 72 20 61 6e 20 49 4e 53 45 52 54 20 6f 72  her an INSERT or
2e2d0 20 61 6e 20 55 50 44 41 54 45 20 74 68 61 74 20   an UPDATE that 
2e2e0 6d 6f 64 69 66 69 65 73 20 74 68 65 0a 20 20 20  modifies the.   
2e2f0 20 20 20 2a 2a 20 72 6f 77 69 64 20 63 6f 6c 75     ** rowid colu
2e300 6d 6e 2e 20 53 6f 20 69 66 20 74 68 65 20 63 6f  mn. So if the co
2e310 6e 66 6c 69 63 74 20 6d 6f 64 65 20 69 73 20 52  nflict mode is R
2e320 45 50 4c 41 43 45 2c 20 74 68 65 6e 20 64 65 6c  EPLACE, then del
2e330 65 74 65 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a  ete any.      **
2e340 20 65 78 69 73 74 69 6e 67 20 72 6f 77 20 77 69   existing row wi
2e350 74 68 20 72 6f 77 69 64 3d 70 4e 65 77 52 6f 77  th rowid=pNewRow
2e360 69 64 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  id. .      **.  
2e370 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68      ** Or, if th
2e380 65 20 63 6f 6e 66 6c 69 63 74 20 6d 6f 64 65 20  e conflict mode 
2e390 69 73 20 6e 6f 74 20 52 45 50 4c 41 43 45 2c 20  is not REPLACE, 
2e3a0 69 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 72  insert the new r
2e3b0 65 63 6f 72 64 20 69 6e 74 6f 20 0a 20 20 20 20  ecord into .    
2e3c0 20 20 2a 2a 20 74 68 65 20 25 5f 63 6f 6e 74 65    ** the %_conte
2e3d0 6e 74 20 74 61 62 6c 65 2e 20 49 66 20 77 65 20  nt table. If we 
2e3e0 68 69 74 20 74 68 65 20 64 75 70 6c 69 63 61 74  hit the duplicat
2e3f0 65 20 72 6f 77 69 64 20 63 6f 6e 73 74 72 61 69  e rowid constrai
2e400 6e 74 20 28 6f 72 20 61 6e 79 0a 20 20 20 20 20  nt (or any.     
2e410 20 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 29   ** other error)
2e420 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c   while doing so,
2e430 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
2e440 65 6c 79 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ely..      **.  
2e450 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e      ** This bran
2e460 63 68 20 6d 61 79 20 61 6c 73 6f 20 72 75 6e 20  ch may also run 
2e470 69 66 20 70 4e 65 77 52 6f 77 69 64 20 63 6f 6e  if pNewRowid con
2e480 74 61 69 6e 73 20 61 20 76 61 6c 75 65 20 74 68  tains a value th
2e490 61 74 20 63 61 6e 6e 6f 74 0a 20 20 20 20 20 20  at cannot.      
2e4a0 2a 2a 20 62 65 20 6c 6f 73 73 6c 65 73 73 6c 79  ** be losslessly
2e4b0 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61 6e   converted to an
2e4c0 20 69 6e 74 65 67 65 72 2e 20 49 6e 20 74 68 69   integer. In thi
2e4d0 73 20 63 61 73 65 2c 20 74 68 65 20 65 76 65 6e  s case, the even
2e4e0 74 75 61 6c 20 0a 20 20 20 20 20 20 2a 2a 20 63  tual .      ** c
2e4f0 61 6c 6c 20 74 6f 20 66 74 73 33 49 6e 73 65 72  all to fts3Inser
2e500 74 44 61 74 61 28 29 20 28 65 69 74 68 65 72 20  tData() (either 
2e510 6a 75 73 74 20 62 65 6c 6f 77 20 6f 72 20 66 75  just below or fu
2e520 72 74 68 65 72 20 6f 6e 20 69 6e 20 74 68 69 73  rther on in this
2e530 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
2e540 6f 6e 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  on) will return 
2e550 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 2e  SQLITE_MISMATCH.
2e560 20 49 66 20 66 74 73 33 44 65 6c 65 74 65 42 79   If fts3DeleteBy
2e570 52 6f 77 69 64 20 69 73 20 0a 20 20 20 20 20 20  Rowid is .      
2e580 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20 69 74 20 77  ** invoked, it w
2e590 69 6c 6c 20 64 65 6c 65 74 65 20 7a 65 72 6f 20  ill delete zero 
2e5a0 72 6f 77 73 20 28 73 69 6e 63 65 20 6e 6f 20 72  rows (since no r
2e5b0 6f 77 20 77 69 6c 6c 20 68 61 76 65 0a 20 20 20  ow will have.   
2e5c0 20 20 20 2a 2a 20 64 6f 63 69 64 3d 24 70 4e 65     ** docid=$pNe
2e5d0 77 52 6f 77 69 64 20 69 66 20 24 70 4e 65 77 52  wRowid if $pNewR
2e5e0 6f 77 69 64 20 69 73 20 6e 6f 74 20 61 6e 20 69  owid is not an i
2e5f0 6e 74 65 67 65 72 20 76 61 6c 75 65 29 2e 0a 20  nteger value).. 
2e600 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
2e610 28 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 6f  ( sqlite3_vtab_o
2e620 6e 5f 63 6f 6e 66 6c 69 63 74 28 70 2d 3e 64 62  n_conflict(p->db
2e630 29 3d 3d 53 51 4c 49 54 45 5f 52 45 50 4c 41 43  )==SQLITE_REPLAC
2e640 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
2e650 3d 20 66 74 73 33 44 65 6c 65 74 65 42 79 52 6f  = fts3DeleteByRo
2e660 77 69 64 28 70 2c 20 70 4e 65 77 52 6f 77 69 64  wid(p, pNewRowid
2e670 2c 20 26 6e 43 68 6e 67 2c 20 61 53 7a 44 65 6c  , &nChng, aSzDel
2e680 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2e690 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
2e6a0 33 49 6e 73 65 72 74 44 61 74 61 28 70 2c 20 61  3InsertData(p, a
2e6b0 70 56 61 6c 2c 20 70 52 6f 77 69 64 29 3b 0a 20  pVal, pRowid);. 
2e6c0 20 20 20 20 20 20 20 62 49 6e 73 65 72 74 44 6f         bInsertDo
2e6d0 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ne = 1;.      }.
2e6e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2e6f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e700 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65  .    goto update
2e710 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
2e720 49 66 20 74 68 69 73 20 69 73 20 61 20 44 45 4c  If this is a DEL
2e730 45 54 45 20 6f 72 20 55 50 44 41 54 45 20 6f 70  ETE or UPDATE op
2e740 65 72 61 74 69 6f 6e 2c 20 72 65 6d 6f 76 65 20  eration, remove 
2e750 74 68 65 20 6f 6c 64 20 72 65 63 6f 72 64 2e 20  the old record. 
2e760 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
2e770 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61  _value_type(apVa
2e780 6c 5b 30 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55  l[0])!=SQLITE_NU
2e790 4c 4c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  LL ){.    assert
2e7a0 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
2e7b0 74 79 70 65 28 61 70 56 61 6c 5b 30 5d 29 3d 3d  type(apVal[0])==
2e7c0 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29  SQLITE_INTEGER )
2e7d0 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 44  ;.    rc = fts3D
2e7e0 65 6c 65 74 65 42 79 52 6f 77 69 64 28 70 2c 20  eleteByRowid(p, 
2e7f0 61 70 56 61 6c 5b 30 5d 2c 20 26 6e 43 68 6e 67  apVal[0], &nChng
2e800 2c 20 61 53 7a 44 65 6c 29 3b 0a 20 20 20 20 69  , aSzDel);.    i
2e810 73 52 65 6d 6f 76 65 20 3d 20 31 3b 0a 20 20 7d  sRemove = 1;.  }
2e820 0a 20 20 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  .  .  /* If this
2e830 20 69 73 20 61 6e 20 49 4e 53 45 52 54 20 6f 72   is an INSERT or
2e840 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f   UPDATE operatio
2e850 6e 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 65  n, insert the ne
2e860 77 20 72 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 69  w record. */.  i
2e870 66 28 20 6e 41 72 67 3e 31 20 26 26 20 72 63 3d  f( nArg>1 && rc=
2e880 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e890 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 20 3d 20    int iLangid = 
2e8a0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
2e8b0 74 28 61 70 56 61 6c 5b 32 20 2b 20 70 2d 3e 6e  t(apVal[2 + p->n
2e8c0 43 6f 6c 75 6d 6e 20 2b 20 32 5d 29 3b 0a 20 20  Column + 2]);.  
2e8d0 20 20 69 66 28 20 62 49 6e 73 65 72 74 44 6f 6e    if( bInsertDon
2e8e0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
2e8f0 20 3d 20 66 74 73 33 49 6e 73 65 72 74 44 61 74   = fts3InsertDat
2e900 61 28 70 2c 20 61 70 56 61 6c 2c 20 70 52 6f 77  a(p, apVal, pRow
2e910 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  id);.      if( r
2e920 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  c==SQLITE_CONSTR
2e930 41 49 4e 54 20 26 26 20 70 2d 3e 7a 43 6f 6e 74  AINT && p->zCont
2e940 65 6e 74 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  entTbl==0 ){.   
2e950 20 20 20 20 20 72 63 20 3d 20 46 54 53 5f 43 4f       rc = FTS_CO
2e960 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 20 20  RRUPT_VTAB;.    
2e970 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
2e980 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e990 26 26 20 28 21 69 73 52 65 6d 6f 76 65 20 7c 7c  && (!isRemove ||
2e9a0 20 2a 70 52 6f 77 69 64 21 3d 70 2d 3e 69 50 72   *pRowid!=p->iPr
2e9b0 65 76 44 6f 63 69 64 20 29 20 29 7b 0a 20 20 20  evDocid ) ){.   
2e9c0 20 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64     rc = fts3Pend
2e9d0 69 6e 67 54 65 72 6d 73 44 6f 63 69 64 28 70 2c  ingTermsDocid(p,
2e9e0 20 30 2c 20 69 4c 61 6e 67 69 64 2c 20 2a 70 52   0, iLangid, *pR
2e9f0 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  owid);.    }.   
2ea00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ea10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
2ea20 72 74 28 20 70 2d 3e 69 50 72 65 76 44 6f 63 69  rt( p->iPrevDoci
2ea30 64 3d 3d 2a 70 52 6f 77 69 64 20 29 3b 0a 20 20  d==*pRowid );.  
2ea40 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 73      rc = fts3Ins
2ea50 65 72 74 54 65 72 6d 73 28 70 2c 20 69 4c 61 6e  ertTerms(p, iLan
2ea60 67 69 64 2c 20 61 70 56 61 6c 2c 20 61 53 7a 49  gid, apVal, aSzI
2ea70 6e 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ns);.    }.    i
2ea80 66 28 20 70 2d 3e 62 48 61 73 44 6f 63 73 69 7a  f( p->bHasDocsiz
2ea90 65 20 29 7b 0a 20 20 20 20 20 20 66 74 73 33 49  e ){.      fts3I
2eaa0 6e 73 65 72 74 44 6f 63 73 69 7a 65 28 26 72 63  nsertDocsize(&rc
2eab0 2c 20 70 2c 20 61 53 7a 49 6e 73 29 3b 0a 20 20  , p, aSzIns);.  
2eac0 20 20 7d 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b    }.    nChng++;
2ead0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 62  .  }..  if( p->b
2eae0 46 74 73 34 20 29 7b 0a 20 20 20 20 66 74 73 33  Fts4 ){.    fts3
2eaf0 55 70 64 61 74 65 44 6f 63 54 6f 74 61 6c 73 28  UpdateDocTotals(
2eb00 26 72 63 2c 20 70 2c 20 61 53 7a 49 6e 73 2c 20  &rc, p, aSzIns, 
2eb10 61 53 7a 44 65 6c 2c 20 6e 43 68 6e 67 29 3b 0a  aSzDel, nChng);.
2eb20 20 20 7d 0a 0a 20 75 70 64 61 74 65 5f 6f 75 74    }.. update_out
2eb30 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
2eb40 28 61 53 7a 44 65 6c 29 3b 0a 20 20 73 71 6c 69  (aSzDel);.  sqli
2eb50 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73 43  te3Fts3SegmentsC
2eb60 6c 6f 73 65 28 70 29 3b 0a 20 20 72 65 74 75 72  lose(p);.  retur
2eb70 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  n rc;.}../* .** 
2eb80 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 69  Flush any data i
2eb90 6e 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65  n the pending-te
2eba0 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65 20 74  rms hash table t
2ebb0 6f 20 64 69 73 6b 2e 20 49 66 20 73 75 63 63 65  o disk. If succe
2ebc0 73 73 66 75 6c 2c 0a 2a 2a 20 6d 65 72 67 65 20  ssful,.** merge 
2ebd0 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20  all segments in 
2ebe0 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69 6e  the database (in
2ebf0 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20  cluding the new 
2ec00 73 65 67 6d 65 6e 74 2c 20 69 66 20 0a 2a 2a 20  segment, if .** 
2ec10 74 68 65 72 65 20 77 61 73 20 61 6e 79 20 64 61  there was any da
2ec20 74 61 20 74 6f 20 66 6c 75 73 68 29 20 69 6e 74  ta to flush) int
2ec30 6f 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65  o a single segme
2ec40 6e 74 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nt. .*/.int sqli
2ec50 74 65 33 46 74 73 33 4f 70 74 69 6d 69 7a 65 28  te3Fts3Optimize(
2ec60 46 74 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20  Fts3Table *p){. 
2ec70 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20   int rc;.  rc = 
2ec80 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
2ec90 64 62 2c 20 22 53 41 56 45 50 4f 49 4e 54 20 66  db, "SAVEPOINT f
2eca0 74 73 33 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ts3", 0, 0, 0);.
2ecb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ecc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
2ecd0 66 74 73 33 44 6f 4f 70 74 69 6d 69 7a 65 28 70  fts3DoOptimize(p
2ece0 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 1);.    if( rc
2ecf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72  ==SQLITE_OK || r
2ed00 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
2ed10 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20  {.      int rc2 
2ed20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
2ed30 2d 3e 64 62 2c 20 22 52 45 4c 45 41 53 45 20 66  ->db, "RELEASE f
2ed40 74 73 33 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ts3", 0, 0, 0);.
2ed50 20 20 20 20 20 20 69 66 28 20 72 63 32 21 3d 53        if( rc2!=S
2ed60 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
2ed70 72 63 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rc2;.    }else{.
2ed80 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
2ed90 65 63 28 70 2d 3e 64 62 2c 20 22 52 4f 4c 4c 42  ec(p->db, "ROLLB
2eda0 41 43 4b 20 54 4f 20 66 74 73 33 22 2c 20 30 2c  ACK TO fts3", 0,
2edb0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
2edc0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
2edd0 2c 20 22 52 45 4c 45 41 53 45 20 66 74 73 33 22  , "RELEASE fts3"
2ede0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
2edf0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 46  }.  }.  sqlite3F
2ee00 74 73 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65  ts3SegmentsClose
2ee10 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
2ee20 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a              ;.}..#endif.