/ Hex Artifact Content
Login

Artifact a3f7bf869622d1d0aa66661ba71d88e6f9646d69a2c335f40a0addf25974db47:


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 33 28 70 2d 3e 64 62 2c 20 7a 53  are_v3(p->db, zS
41e0: 71 6c 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 50  ql, -1, SQLITE_P
41f0: 52 45 50 41 52 45 5f 50 45 52 53 49 53 54 45 4e  REPARE_PERSISTEN
4200: 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T,.             
4210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4220: 20 26 70 53 74 6d 74 2c 20 4e 55 4c 4c 29 3b 0a   &pStmt, NULL);.
4230: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
4240: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  ee(zSql);.      
4250: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
4260: 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d  TE_OK || pStmt==
4270: 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 53  0 );.      p->aS
4280: 74 6d 74 5b 65 53 74 6d 74 5d 20 3d 20 70 53 74  tmt[eStmt] = pSt
4290: 6d 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  mt;.    }.  }.  
42a0: 69 66 28 20 61 70 56 61 6c 20 29 7b 0a 20 20 20  if( apVal ){.   
42b0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
42c0: 6e 50 61 72 61 6d 20 3d 20 73 71 6c 69 74 65 33  nParam = sqlite3
42d0: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
42e0: 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
42f0: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
4300: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 50  QLITE_OK && i<nP
4310: 61 72 61 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aram; i++){.    
4320: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
4330: 69 6e 64 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c  ind_value(pStmt,
4340: 20 69 2b 31 2c 20 61 70 56 61 6c 5b 69 5d 29 3b   i+1, apVal[i]);
4350: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70  .    }.  }.  *pp
4360: 20 3d 20 70 53 74 6d 74 3b 0a 20 20 72 65 74 75   = pStmt;.  retu
4370: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69  rn rc;.}...stati
4380: 63 20 69 6e 74 20 66 74 73 33 53 65 6c 65 63 74  c int fts3Select
4390: 44 6f 63 73 69 7a 65 28 0a 20 20 46 74 73 33 54  Docsize(.  Fts3T
43a0: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
43b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
43c0: 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  S3 table handle 
43d0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
43e0: 36 34 20 69 44 6f 63 69 64 2c 20 20 20 20 20 20  64 iDocid,      
43f0: 20 20 20 20 20 2f 2a 20 44 6f 63 69 64 20 74 6f       /* Docid to
4400: 20 62 69 6e 64 20 66 6f 72 20 53 51 4c 5f 53 45   bind for SQL_SE
4410: 4c 45 43 54 5f 44 4f 43 53 49 5a 45 20 2a 2f 0a  LECT_DOCSIZE */.
4420: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
4430: 2a 70 70 53 74 6d 74 20 20 20 20 20 20 20 20 20  *ppStmt         
4440: 20 20 2f 2a 20 4f 55 54 3a 20 53 74 61 74 65 6d    /* OUT: Statem
4450: 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 29 7b  ent handle */.){
4460: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
4470: 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20 20 20 20  *pStmt = 0;     
4480: 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
4490: 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 66  requested from f
44a0: 74 73 33 53 71 6c 53 74 6d 74 28 29 20 2a 2f 0a  ts3SqlStmt() */.
44b0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44d0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
44e0: 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73 33   */..  rc = fts3
44f0: 53 71 6c 53 74 6d 74 28 70 54 61 62 2c 20 53 51  SqlStmt(pTab, SQ
4500: 4c 5f 53 45 4c 45 43 54 5f 44 4f 43 53 49 5a 45  L_SELECT_DOCSIZE
4510: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
4520: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4530: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
4540: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d  _bind_int64(pStm
4550: 74 2c 20 31 2c 20 69 44 6f 63 69 64 29 3b 0a 20  t, 1, iDocid);. 
4560: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
4570: 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20  step(pStmt);.   
4580: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
4590: 52 4f 57 20 7c 7c 20 73 71 6c 69 74 65 33 5f 63  ROW || sqlite3_c
45a0: 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74  olumn_type(pStmt
45b0: 2c 20 30 29 21 3d 53 51 4c 49 54 45 5f 42 4c 4f  , 0)!=SQLITE_BLO
45c0: 42 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  B ){.      rc = 
45d0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
45e0: 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tmt);.      if( 
45f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
4600: 72 63 20 3d 20 46 54 53 5f 43 4f 52 52 55 50 54  rc = FTS_CORRUPT
4610: 5f 56 54 41 42 3b 0a 20 20 20 20 20 20 70 53 74  _VTAB;.      pSt
4620: 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  mt = 0;.    }els
4630: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
4640: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
4650: 20 7d 0a 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20   }..  *ppStmt = 
4660: 70 53 74 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20  pStmt;.  return 
4670: 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  rc;.}..int sqlit
4680: 65 33 46 74 73 33 53 65 6c 65 63 74 44 6f 63 74  e3Fts3SelectDoct
4690: 6f 74 61 6c 28 0a 20 20 46 74 73 33 54 61 62 6c  otal(.  Fts3Tabl
46a0: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
46b0: 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73 33 20          /* Fts3 
46c0: 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
46d0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
46e0: 2a 70 70 53 74 6d 74 20 20 20 20 20 20 20 20 20  *ppStmt         
46f0: 20 20 2f 2a 20 4f 55 54 3a 20 53 74 61 74 65 6d    /* OUT: Statem
4700: 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 29 7b  ent handle */.){
4710: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
4720: 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e  *pStmt = 0;.  in
4730: 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 66 74 73  t rc;.  rc = fts
4740: 33 53 71 6c 53 74 6d 74 28 70 54 61 62 2c 20 53  3SqlStmt(pTab, S
4750: 51 4c 5f 53 45 4c 45 43 54 5f 53 54 41 54 2c 20  QL_SELECT_STAT, 
4760: 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66  &pStmt, 0);.  if
4770: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4780: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
4790: 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31  ind_int(pStmt, 1
47a0: 2c 20 46 54 53 5f 53 54 41 54 5f 44 4f 43 54 4f  , FTS_STAT_DOCTO
47b0: 54 41 4c 29 3b 0a 20 20 20 20 69 66 28 20 73 71  TAL);.    if( sq
47c0: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
47d0: 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57 0a 20 20  )!=SQLITE_ROW.  
47e0: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 63 6f     || sqlite3_co
47f0: 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c  lumn_type(pStmt,
4800: 20 30 29 21 3d 53 51 4c 49 54 45 5f 42 4c 4f 42   0)!=SQLITE_BLOB
4810: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
4820: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
4830: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69  (pStmt);.      i
4840: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4850: 20 29 20 72 63 20 3d 20 46 54 53 5f 43 4f 52 52   ) rc = FTS_CORR
4860: 55 50 54 5f 56 54 41 42 3b 0a 20 20 20 20 20 20  UPT_VTAB;.      
4870: 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  pStmt = 0;.    }
4880: 0a 20 20 7d 0a 20 20 2a 70 70 53 74 6d 74 20 3d  .  }.  *ppStmt =
4890: 20 70 53 74 6d 74 3b 0a 20 20 72 65 74 75 72 6e   pStmt;.  return
48a0: 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69   rc;.}..int sqli
48b0: 74 65 33 46 74 73 33 53 65 6c 65 63 74 44 6f 63  te3Fts3SelectDoc
48c0: 73 69 7a 65 28 0a 20 20 46 74 73 33 54 61 62 6c  size(.  Fts3Tabl
48d0: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
48e0: 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73 33 20          /* Fts3 
48f0: 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
4900: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
4910: 69 44 6f 63 69 64 2c 20 20 20 20 20 20 20 20 20  iDocid,         
4920: 20 20 2f 2a 20 44 6f 63 69 64 20 74 6f 20 72 65    /* Docid to re
4930: 61 64 20 73 69 7a 65 20 64 61 74 61 20 66 6f 72  ad size data for
4940: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
4950: 6d 74 20 2a 2a 70 70 53 74 6d 74 20 20 20 20 20  mt **ppStmt     
4960: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 74        /* OUT: St
4970: 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 2a  atement handle *
4980: 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 74  /.){.  return ft
4990: 73 33 53 65 6c 65 63 74 44 6f 63 73 69 7a 65 28  s3SelectDocsize(
49a0: 70 54 61 62 2c 20 69 44 6f 63 69 64 2c 20 70 70  pTab, iDocid, pp
49b0: 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Stmt);.}../*.** 
49c0: 53 69 6d 69 6c 61 72 20 74 6f 20 66 74 73 33 53  Similar to fts3S
49d0: 71 6c 53 74 6d 74 28 29 2e 20 45 78 63 65 70 74  qlStmt(). Except
49e0: 2c 20 61 66 74 65 72 20 62 69 6e 64 69 6e 67 20  , after binding 
49f0: 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 69  the parameters i
4a00: 6e 0a 2a 2a 20 61 72 72 61 79 20 61 70 56 61 6c  n.** array apVal
4a10: 5b 5d 20 74 6f 20 74 68 65 20 53 51 4c 20 73 74  [] to the SQL st
4a20: 61 74 65 6d 65 6e 74 20 69 64 65 6e 74 69 66 69  atement identifi
4a30: 65 64 20 62 79 20 65 53 74 6d 74 2c 20 74 68 65  ed by eStmt, the
4a40: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 73   statement.** is
4a50: 20 65 78 65 63 75 74 65 64 2e 0a 2a 2a 0a 2a 2a   executed..**.**
4a60: 20 52 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   Returns SQLITE_
4a70: 4f 4b 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  OK if the statem
4a80: 65 6e 74 20 69 73 20 73 75 63 63 65 73 73 66 75  ent is successfu
4a90: 6c 6c 79 20 65 78 65 63 75 74 65 64 2c 20 6f 72  lly executed, or
4aa0: 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72   an.** SQLite er
4ab0: 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
4ac0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  se..*/.static vo
4ad0: 69 64 20 66 74 73 33 53 71 6c 45 78 65 63 28 0a  id fts3SqlExec(.
4ae0: 20 20 69 6e 74 20 2a 70 52 43 2c 20 20 20 20 20    int *pRC,     
4af0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
4b00: 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 46  sult code */.  F
4b10: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
4b20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46          /* The F
4b30: 54 53 33 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  TS3 table */.  i
4b40: 6e 74 20 65 53 74 6d 74 2c 20 20 20 20 20 20 20  nt eStmt,       
4b50: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
4b60: 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 20 74 6f   of statement to
4b70: 20 65 76 61 6c 75 61 74 65 20 2a 2f 0a 20 20 73   evaluate */.  s
4b80: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
4b90: 70 56 61 6c 20 20 20 20 2f 2a 20 50 61 72 61 6d  pVal    /* Param
4ba0: 65 74 65 72 73 20 74 6f 20 62 69 6e 64 20 2a 2f  eters to bind */
4bb0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
4bc0: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
4bd0: 20 72 63 3b 0a 20 20 69 66 28 20 2a 70 52 43 20   rc;.  if( *pRC 
4be0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 72 63 20 3d  ) return;.  rc =
4bf0: 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
4c00: 65 53 74 6d 74 2c 20 26 70 53 74 6d 74 2c 20 61  eStmt, &pStmt, a
4c10: 70 56 61 6c 29 3b 20 0a 20 20 69 66 28 20 72 63  pVal); .  if( rc
4c20: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
4c30: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
4c40: 70 53 74 6d 74 29 3b 0a 20 20 20 20 72 63 20 3d  pStmt);.    rc =
4c50: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
4c60: 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 2a 70 52  Stmt);.  }.  *pR
4c70: 43 20 3d 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  C = rc;.}.../*.*
4c80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
4c90: 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
4ca0: 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 62 74 61   caller has obta
4cb0: 69 6e 65 64 20 61 6e 20 65 78 63 6c 75 73 69 76  ined an exclusiv
4cc0: 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d 63 61 63  e .** shared-cac
4cd0: 68 65 20 74 61 62 6c 65 2d 6c 6f 63 6b 20 6f 6e  he table-lock on
4ce0: 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61   the %_segdir ta
4cf0: 62 6c 65 2e 20 54 68 69 73 20 69 73 20 72 65 71  ble. This is req
4d00: 75 69 72 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a  uired before .**
4d10: 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f   writing data to
4d20: 20 74 68 65 20 66 74 73 33 20 74 61 62 6c 65 2e   the fts3 table.
4d30: 20 49 66 20 74 68 69 73 20 6c 6f 63 6b 20 69 73   If this lock is
4d40: 20 6e 6f 74 20 61 63 71 75 69 72 65 64 20 66 69   not acquired fi
4d50: 72 73 74 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  rst, then.** the
4d60: 20 63 61 6c 6c 65 72 20 6d 61 79 20 65 6e 64 20   caller may end 
4d70: 75 70 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  up attempting to
4d80: 20 74 61 6b 65 20 74 68 69 73 20 6c 6f 63 6b 20   take this lock 
4d90: 61 73 20 70 61 72 74 20 6f 66 20 63 6f 6d 6d 69  as part of commi
4da0: 74 74 69 6e 67 0a 2a 2a 20 61 20 74 72 61 6e 73  tting.** a trans
4db0: 61 63 74 69 6f 6e 2c 20 63 61 75 73 69 6e 67 20  action, causing 
4dc0: 53 51 4c 69 74 65 20 74 6f 20 72 65 74 75 72 6e  SQLite to return
4dd0: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 6f   SQLITE_LOCKED o
4de0: 72 20 0a 2a 2a 20 4c 4f 43 4b 45 44 5f 53 48 41  r .** LOCKED_SHA
4df0: 52 45 44 43 41 43 48 45 74 6f 20 61 20 43 4f 4d  REDCACHEto a COM
4e00: 4d 49 54 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  MIT command..**.
4e10: 2a 2a 20 49 74 20 69 73 20 62 65 73 74 20 74 6f  ** It is best to
4e20: 20 61 76 6f 69 64 20 74 68 69 73 20 62 65 63 61   avoid this beca
4e30: 75 73 65 20 69 66 20 46 54 53 33 20 72 65 74 75  use if FTS3 retu
4e40: 72 6e 73 20 61 6e 79 20 65 72 72 6f 72 20 77 68  rns any error wh
4e50: 65 6e 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 69 6e  en .** committin
4e60: 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  g a transaction,
4e70: 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73   the whole trans
4e80: 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72  action will be r
4e90: 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 0a 2a 2a 20  olled back. .** 
4ea0: 41 6e 64 20 74 68 69 73 20 69 73 20 6e 6f 74 20  And this is not 
4eb0: 77 68 61 74 20 75 73 65 72 73 20 65 78 70 65 63  what users expec
4ec0: 74 20 77 68 65 6e 20 74 68 65 79 20 67 65 74 20  t when they get 
4ed0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
4ee0: 41 52 45 44 43 41 43 48 45 2e 20 0a 2a 2a 20 49  AREDCACHE. .** I
4ef0: 74 20 63 61 6e 20 73 74 69 6c 6c 20 68 61 70 70  t can still happ
4f00: 65 6e 20 69 66 20 74 68 65 20 75 73 65 72 20 6c  en if the user l
4f10: 6f 63 6b 73 20 74 68 65 20 75 6e 64 65 72 6c 79  ocks the underly
4f20: 69 6e 67 20 74 61 62 6c 65 73 20 64 69 72 65 63  ing tables direc
4f30: 74 6c 79 20 0a 2a 2a 20 69 6e 73 74 65 61 64 20  tly .** instead 
4f40: 6f 66 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  of accessing the
4f50: 6d 20 76 69 61 20 46 54 53 2e 0a 2a 2f 0a 73 74  m via FTS..*/.st
4f60: 61 74 69 63 20 69 6e 74 20 66 74 73 33 57 72 69  atic int fts3Wri
4f70: 74 65 6c 6f 63 6b 28 46 74 73 33 54 61 62 6c 65  telock(Fts3Table
4f80: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
4f90: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20   SQLITE_OK;.  . 
4fa0: 20 69 66 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67   if( p->nPending
4fb0: 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Data==0 ){.    s
4fc0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
4fd0: 6d 74 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73  mt;.    rc = fts
4fe0: 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
4ff0: 44 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 4c 45  DELETE_SEGDIR_LE
5000: 56 45 4c 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  VEL, &pStmt, 0);
5010: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
5020: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
5030: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
5040: 6c 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  l(pStmt, 1);.   
5050: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
5060: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63  pStmt);.      rc
5070: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
5080: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20  (pStmt);.    }. 
5090: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
50a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 54 53 20 6d 61  .}../*.** FTS ma
50b0: 69 6e 74 61 69 6e 73 20 61 20 73 65 70 61 72 61  intains a separa
50c0: 74 65 20 69 6e 64 65 78 65 73 20 66 6f 72 20 65  te indexes for e
50d0: 61 63 68 20 6c 61 6e 67 75 61 67 65 2d 69 64 20  ach language-id 
50e0: 28 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  (a 32-bit intege
50f0: 72 29 2e 0a 2a 2a 20 57 69 74 68 69 6e 20 65 61  r)..** Within ea
5100: 63 68 20 6c 61 6e 67 75 61 67 65 20 69 64 2c 20  ch language id, 
5110: 61 20 73 65 70 61 72 61 74 65 20 69 6e 64 65 78  a separate index
5120: 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 74   is maintained t
5130: 6f 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 64  o store the.** d
5140: 6f 63 75 6d 65 6e 74 20 74 65 72 6d 73 2c 20 61  ocument terms, a
5150: 6e 64 20 65 61 63 68 20 63 6f 6e 66 69 67 75 72  nd each configur
5160: 65 64 20 70 72 65 66 69 78 20 73 69 7a 65 20 28  ed prefix size (
5170: 63 6f 6e 66 69 67 75 72 65 64 20 74 68 65 20 46  configured the F
5180: 54 53 20 0a 2a 2a 20 22 70 72 65 66 69 78 3d 22  TS .** "prefix="
5190: 20 6f 70 74 69 6f 6e 29 2e 20 41 6e 64 20 65 61   option). And ea
51a0: 63 68 20 69 6e 64 65 78 20 63 6f 6e 73 69 73 74  ch index consist
51b0: 73 20 6f 66 20 6d 75 6c 74 69 70 6c 65 20 6c 65  s of multiple le
51c0: 76 65 6c 73 20 28 22 72 65 6c 61 74 69 76 65 0a  vels ("relative.
51d0: 2a 2a 20 6c 65 76 65 6c 73 22 29 2e 0a 2a 2a 0a  ** levels")..**.
51e0: 2a 2a 20 41 6c 6c 20 74 68 72 65 65 20 6f 66 20  ** All three of 
51f0: 74 68 65 73 65 20 76 61 6c 75 65 73 20 28 74 68  these values (th
5200: 65 20 6c 61 6e 67 75 61 67 65 20 69 64 2c 20 74  e language id, t
5210: 68 65 20 73 70 65 63 69 66 69 63 20 69 6e 64 65  he specific inde
5220: 78 20 61 6e 64 20 74 68 65 0a 2a 2a 20 6c 65 76  x and the.** lev
5230: 65 6c 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e  el within the in
5240: 64 65 78 29 20 61 72 65 20 65 6e 63 6f 64 65 64  dex) are encoded
5250: 20 69 6e 20 36 34 2d 62 69 74 20 69 6e 74 65 67   in 64-bit integ
5260: 65 72 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  er values stored
5270: 0a 2a 2a 20 69 6e 20 74 68 65 20 25 5f 73 65 67  .** in the %_seg
5280: 64 69 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73  dir table on dis
5290: 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  k. This function
52a0: 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6e 76   is used to conv
52b0: 65 72 74 20 74 68 72 65 65 0a 2a 2a 20 73 65 70  ert three.** sep
52c0: 61 72 61 74 65 20 63 6f 6d 70 6f 6e 65 6e 74 20  arate component 
52d0: 76 61 6c 75 65 73 20 69 6e 74 6f 20 74 68 65 20  values into the 
52e0: 73 69 6e 67 6c 65 20 36 34 2d 62 69 74 20 69 6e  single 64-bit in
52f0: 74 65 67 65 72 20 76 61 6c 75 65 20 74 68 61 74  teger value that
5300: 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20  .** can be used 
5310: 74 6f 20 71 75 65 72 79 20 74 68 65 20 25 5f 73  to query the %_s
5320: 65 67 64 69 72 20 74 61 62 6c 65 2e 0a 2a 2a 0a  egdir table..**.
5330: 2a 2a 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c  ** Specifically,
5340: 20 65 61 63 68 20 6c 61 6e 67 75 61 67 65 2d 69   each language-i
5350: 64 2f 69 6e 64 65 78 20 63 6f 6d 62 69 6e 61 74  d/index combinat
5360: 69 6f 6e 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ion is allocated
5370: 20 31 30 32 34 20 0a 2a 2a 20 36 34 2d 62 69 74   1024 .** 64-bit
5380: 20 69 6e 74 65 67 65 72 20 6c 65 76 65 6c 20 76   integer level v
5390: 61 6c 75 65 73 20 28 22 61 62 73 6f 6c 75 74 65  alues ("absolute
53a0: 20 6c 65 76 65 6c 73 22 29 2e 20 54 68 65 20 6d   levels"). The m
53b0: 61 69 6e 20 74 65 72 6d 73 20 69 6e 64 65 78 0a  ain terms index.
53c0: 2a 2a 20 66 6f 72 20 6c 61 6e 67 75 61 67 65 2d  ** for language-
53d0: 69 64 20 30 20 69 73 20 61 6c 6c 6f 63 61 74 65  id 0 is allocate
53e0: 20 76 61 6c 75 65 73 20 30 2d 31 30 32 33 2e 20   values 0-1023. 
53f0: 54 68 65 20 66 69 72 73 74 20 70 72 65 66 69 78  The first prefix
5400: 20 69 6e 64 65 78 0a 2a 2a 20 28 69 66 20 61 6e   index.** (if an
5410: 79 29 20 66 6f 72 20 6c 61 6e 67 75 61 67 65 2d  y) for language-
5420: 69 64 20 30 20 69 73 20 61 6c 6c 6f 63 61 74 65  id 0 is allocate
5430: 64 20 76 61 6c 75 65 73 20 31 30 32 34 2d 32 30  d values 1024-20
5440: 34 37 2e 20 41 6e 64 20 73 6f 20 6f 6e 2e 0a 2a  47. And so on..*
5450: 2a 20 4c 61 6e 67 75 61 67 65 20 31 20 69 6e 64  * Language 1 ind
5460: 65 78 65 73 20 61 72 65 20 61 6c 6c 6f 63 61 74  exes are allocat
5470: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  ed immediately f
5480: 6f 6c 6c 6f 77 69 6e 67 20 6c 61 6e 67 75 61 67  ollowing languag
5490: 65 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 2c 20 66  e 0..**.** So, f
54a0: 6f 72 20 61 20 73 79 73 74 65 6d 20 77 69 74 68  or a system with
54b0: 20 6e 50 72 65 66 69 78 20 70 72 65 66 69 78 20   nPrefix prefix 
54c0: 69 6e 64 65 78 65 73 20 63 6f 6e 66 69 67 75 72  indexes configur
54d0: 65 64 2c 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66  ed, the block of
54e0: 0a 2a 2a 20 61 62 73 6f 6c 75 74 65 20 6c 65 76  .** absolute lev
54f0: 65 6c 73 20 74 68 61 74 20 63 6f 72 72 65 73 70  els that corresp
5500: 6f 6e 64 73 20 74 6f 20 6c 61 6e 67 75 61 67 65  onds to language
5510: 2d 69 64 20 69 4c 61 6e 67 69 64 20 61 6e 64 20  -id iLangid and 
5520: 69 6e 64 65 78 20 0a 2a 2a 20 69 49 6e 64 65 78  index .** iIndex
5530: 20 73 74 61 72 74 73 20 61 74 20 61 62 73 6f 6c   starts at absol
5540: 75 74 65 20 6c 65 76 65 6c 20 28 28 69 4c 61 6e  ute level ((iLan
5550: 67 69 64 20 2a 20 28 6e 50 72 65 66 69 78 2b 31  gid * (nPrefix+1
5560: 29 20 2b 20 69 49 6e 64 65 78 29 20 2a 20 31 30  ) + iIndex) * 10
5570: 32 34 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  24)..*/.static s
5580: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 67 65 74  qlite3_int64 get
5590: 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 0a 20  AbsoluteLevel(. 
55a0: 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
55b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55c0: 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20 68   /* FTS3 table h
55d0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  andle */.  int i
55e0: 4c 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20  Langid,         
55f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
5600: 6e 67 75 61 67 65 20 69 64 20 2a 2f 0a 20 20 69  nguage id */.  i
5610: 6e 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20 20  nt iIndex,      
5620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5630: 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 61 49  * Index in p->aI
5640: 6e 64 65 78 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  ndex[] */.  int 
5650: 69 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20 20  iLevel          
5660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
5670: 65 76 65 6c 20 6f 66 20 73 65 67 6d 65 6e 74 73  evel of segments
5680: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
5690: 5f 69 6e 74 36 34 20 69 42 61 73 65 3b 20 20 20  _int64 iBase;   
56a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
56b0: 74 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c  t absolute level
56c0: 20 66 6f 72 20 69 4c 61 6e 67 69 64 2f 69 49 6e   for iLangid/iIn
56d0: 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  dex */.  assert(
56e0: 20 69 4c 61 6e 67 69 64 3e 3d 30 20 29 3b 0a 20   iLangid>=0 );. 
56f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 49 6e 64   assert( p->nInd
5700: 65 78 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ex>0 );.  assert
5710: 28 20 69 49 6e 64 65 78 3e 3d 30 20 26 26 20 69  ( iIndex>=0 && i
5720: 49 6e 64 65 78 3c 70 2d 3e 6e 49 6e 64 65 78 20  Index<p->nIndex 
5730: 29 3b 0a 0a 20 20 69 42 61 73 65 20 3d 20 28 28  );..  iBase = ((
5740: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 69 4c  sqlite3_int64)iL
5750: 61 6e 67 69 64 20 2a 20 70 2d 3e 6e 49 6e 64 65  angid * p->nInde
5760: 78 20 2b 20 69 49 6e 64 65 78 29 20 2a 20 46 54  x + iIndex) * FT
5770: 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56  S3_SEGDIR_MAXLEV
5780: 45 4c 3b 0a 20 20 72 65 74 75 72 6e 20 69 42 61  EL;.  return iBa
5790: 73 65 20 2b 20 69 4c 65 76 65 6c 3b 0a 7d 0a 0a  se + iLevel;.}..
57a0: 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 70 53 74 6d  /*.** Set *ppStm
57b0: 74 20 74 6f 20 61 20 73 74 61 74 65 6d 65 6e 74  t to a statement
57c0: 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6d 61 79   handle that may
57d0: 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65 72   be used to iter
57e0: 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61  ate through.** a
57f0: 6c 6c 20 72 6f 77 73 20 69 6e 20 74 68 65 20 25  ll rows in the %
5800: 5f 73 65 67 64 69 72 20 74 61 62 6c 65 2c 20 66  _segdir table, f
5810: 72 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65  rom oldest to ne
5820: 77 65 73 74 2e 20 49 66 20 73 75 63 63 65 73 73  west. If success
5830: 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53  ful,.** return S
5840: 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20  QLITE_OK. If an 
5850: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
5860: 6c 65 20 70 72 65 70 61 72 69 6e 67 20 74 68 65  le preparing the
5870: 20 73 74 61 74 65 6d 65 6e 74 2c 20 0a 2a 2a 20   statement, .** 
5880: 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
5890: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
58a0: 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79  ** There is only
58b0: 20 65 76 65 72 20 6f 6e 65 20 69 6e 73 74 61 6e   ever one instan
58c0: 63 65 20 6f 66 20 74 68 69 73 20 53 51 4c 20 73  ce of this SQL s
58d0: 74 61 74 65 6d 65 6e 74 20 63 6f 6d 70 69 6c 65  tatement compile
58e0: 64 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 46 54  d for.** each FT
58f0: 53 33 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  S3 table..**.** 
5900: 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72 65  The statement re
5910: 74 75 72 6e 73 20 74 68 65 20 66 6f 6c 6c 6f 77  turns the follow
5920: 69 6e 67 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  ing columns from
5930: 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61   the %_segdir ta
5940: 62 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20  ble:.**.**   0: 
5950: 69 64 78 0a 2a 2a 20 20 20 31 3a 20 73 74 61 72  idx.**   1: star
5960: 74 5f 62 6c 6f 63 6b 0a 2a 2a 20 20 20 32 3a 20  t_block.**   2: 
5970: 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b  leaves_end_block
5980: 0a 2a 2a 20 20 20 33 3a 20 65 6e 64 5f 62 6c 6f  .**   3: end_blo
5990: 63 6b 0a 2a 2a 20 20 20 34 3a 20 72 6f 6f 74 0a  ck.**   4: root.
59a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
59b0: 73 33 41 6c 6c 53 65 67 64 69 72 73 28 0a 20 20  s3AllSegdirs(.  
59c0: 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59e0: 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20 2a 2f  /* FTS3 table */
59f0: 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20  .  int iLangid, 
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a10: 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 62     /* Language b
5a20: 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a  eing queried */.
5a30: 20 20 69 6e 74 20 69 49 6e 64 65 78 2c 20 20 20    int iIndex,   
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a50: 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20 70    /* Index for p
5a60: 2d 3e 61 49 6e 64 65 78 5b 5d 20 2a 2f 0a 20 20  ->aIndex[] */.  
5a70: 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  int iLevel,     
5a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a90: 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 73 65 6c 65  /* Level to sele
5aa0: 63 74 20 28 72 65 6c 61 74 69 76 65 20 6c 65 76  ct (relative lev
5ab0: 65 6c 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  el) */.  sqlite3
5ac0: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 20 20  _stmt **ppStmt  
5ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
5ae0: 20 43 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d   Compiled statem
5af0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
5b00: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  rc;.  sqlite3_st
5b10: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 0a  mt *pStmt = 0;..
5b20: 20 20 61 73 73 65 72 74 28 20 69 4c 65 76 65 6c    assert( iLevel
5b30: 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52  ==FTS3_SEGCURSOR
5b40: 5f 41 4c 4c 20 7c 7c 20 69 4c 65 76 65 6c 3e 3d  _ALL || iLevel>=
5b50: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
5b60: 4c 65 76 65 6c 3c 46 54 53 33 5f 53 45 47 44 49  Level<FTS3_SEGDI
5b70: 52 5f 4d 41 58 4c 45 56 45 4c 20 29 3b 0a 20 20  R_MAXLEVEL );.  
5b80: 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 3e 3d  assert( iIndex>=
5b90: 30 20 26 26 20 69 49 6e 64 65 78 3c 70 2d 3e 6e  0 && iIndex<p->n
5ba0: 49 6e 64 65 78 20 29 3b 0a 0a 20 20 69 66 28 20  Index );..  if( 
5bb0: 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20  iLevel<0 ){.    
5bc0: 2f 2a 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  /* "SELECT * FRO
5bd0: 4d 20 25 5f 73 65 67 64 69 72 20 57 48 45 52 45  M %_segdir WHERE
5be0: 20 6c 65 76 65 6c 20 42 45 54 57 45 45 4e 20 3f   level BETWEEN ?
5bf0: 20 41 4e 44 20 3f 20 4f 52 44 45 52 20 42 59 20   AND ? ORDER BY 
5c00: 2e 2e 2e 22 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ..." */.    rc =
5c10: 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
5c20: 53 51 4c 5f 53 45 4c 45 43 54 5f 4c 45 56 45 4c  SQL_SELECT_LEVEL
5c30: 5f 52 41 4e 47 45 2c 20 26 70 53 74 6d 74 2c 20  _RANGE, &pStmt, 
5c40: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
5c50: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
5c60: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
5c70: 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 2c  _int64(pStmt, 1,
5c80: 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65   getAbsoluteLeve
5c90: 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49  l(p, iLangid, iI
5ca0: 6e 64 65 78 2c 20 30 29 29 3b 0a 20 20 20 20 20  ndex, 0));.     
5cb0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
5cc0: 74 36 34 28 70 53 74 6d 74 2c 20 32 2c 20 0a 20  t64(pStmt, 2, . 
5cd0: 20 20 20 20 20 20 20 20 20 67 65 74 41 62 73 6f           getAbso
5ce0: 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61  luteLevel(p, iLa
5cf0: 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 46 54  ngid, iIndex, FT
5d00: 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56  S3_SEGDIR_MAXLEV
5d10: 45 4c 2d 31 29 0a 20 20 20 20 20 20 29 3b 0a 20  EL-1).      );. 
5d20: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
5d30: 20 20 2f 2a 20 22 53 45 4c 45 43 54 20 2a 20 46    /* "SELECT * F
5d40: 52 4f 4d 20 25 5f 73 65 67 64 69 72 20 57 48 45  ROM %_segdir WHE
5d50: 52 45 20 6c 65 76 65 6c 20 3d 20 3f 20 4f 52 44  RE level = ? ORD
5d60: 45 52 20 42 59 20 2e 2e 2e 22 20 2a 2f 0a 20 20  ER BY ..." */.  
5d70: 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
5d80: 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54  mt(p, SQL_SELECT
5d90: 5f 4c 45 56 45 4c 2c 20 26 70 53 74 6d 74 2c 20  _LEVEL, &pStmt, 
5da0: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
5db0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
5dc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
5dd0: 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 2c  _int64(pStmt, 1,
5de0: 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65   getAbsoluteLeve
5df0: 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49  l(p, iLangid, iI
5e00: 6e 64 65 78 2c 69 4c 65 76 65 6c 29 29 3b 0a 20  ndex,iLevel));. 
5e10: 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70 53 74     }.  }.  *ppSt
5e20: 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 72 65  mt = pStmt;.  re
5e30: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
5e40: 2a 2a 20 41 70 70 65 6e 64 20 61 20 73 69 6e 67  ** Append a sing
5e50: 6c 65 20 76 61 72 69 6e 74 20 74 6f 20 61 20 50  le varint to a P
5e60: 65 6e 64 69 6e 67 4c 69 73 74 20 62 75 66 66 65  endingList buffe
5e70: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
5e80: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 66 20 73  returned.** if s
5e90: 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
5ea0: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
5eb0: 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  de otherwise..**
5ec0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
5ed0: 6e 20 61 6c 73 6f 20 73 65 72 76 65 73 20 74 6f  n also serves to
5ee0: 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 65   allocate the Pe
5ef0: 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63 74  ndingList struct
5f00: 75 72 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 46  ure itself..** F
5f10: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20 63  or example, to c
5f20: 72 65 61 74 65 20 61 20 6e 65 77 20 50 65 6e 64  reate a new Pend
5f30: 69 6e 67 4c 69 73 74 20 73 74 72 75 63 74 75 72  ingList structur
5f40: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 77 6f  e containing two
5f50: 0a 2a 2a 20 76 61 72 69 6e 74 73 3a 0a 2a 2a 0a  .** varints:.**.
5f60: 2a 2a 20 20 20 50 65 6e 64 69 6e 67 4c 69 73 74  **   PendingList
5f70: 20 2a 70 20 3d 20 30 3b 0a 2a 2a 20 20 20 66 74   *p = 0;.**   ft
5f80: 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70  s3PendingListApp
5f90: 65 6e 64 56 61 72 69 6e 74 28 26 70 2c 20 31 29  endVarint(&p, 1)
5fa0: 3b 0a 2a 2a 20 20 20 66 74 73 33 50 65 6e 64 69  ;.**   fts3Pendi
5fb0: 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69  ngListAppendVari
5fc0: 6e 74 28 26 70 2c 20 32 29 3b 0a 2a 2f 0a 73 74  nt(&p, 2);.*/.st
5fd0: 61 74 69 63 20 69 6e 74 20 66 74 73 33 50 65 6e  atic int fts3Pen
5fe0: 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61  dingListAppendVa
5ff0: 72 69 6e 74 28 0a 20 20 50 65 6e 64 69 6e 67 4c  rint(.  PendingL
6000: 69 73 74 20 2a 2a 70 70 2c 20 20 20 20 20 20 20  ist **pp,       
6010: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
6020: 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 50 65  T: Pointer to Pe
6030: 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63 74  ndingList struct
6040: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
6050: 74 36 34 20 69 20 20 20 20 20 20 20 20 20 20 20  t64 i           
6060: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
6070: 6f 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74 61  o append to data
6080: 20 2a 2f 0a 29 7b 0a 20 20 50 65 6e 64 69 6e 67   */.){.  Pending
6090: 4c 69 73 74 20 2a 70 20 3d 20 2a 70 70 3b 0a 0a  List *p = *pp;..
60a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72    /* Allocate or
60b0: 20 67 72 6f 77 20 74 68 65 20 50 65 6e 64 69 6e   grow the Pendin
60c0: 67 4c 69 73 74 20 61 73 20 72 65 71 75 69 72 65  gList as require
60d0: 64 2e 20 2a 2f 0a 20 20 69 66 28 20 21 70 20 29  d. */.  if( !p )
60e0: 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  {.    p = sqlite
60f0: 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
6100: 2a 70 29 20 2b 20 31 30 30 29 3b 0a 20 20 20 20  *p) + 100);.    
6110: 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 20 20  if( !p ){.      
6120: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6130: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
6140: 2d 3e 6e 53 70 61 63 65 20 3d 20 31 30 30 3b 0a  ->nSpace = 100;.
6150: 20 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 28      p->aData = (
6160: 63 68 61 72 20 2a 29 26 70 5b 31 5d 3b 0a 20 20  char *)&p[1];.  
6170: 20 20 70 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a    p->nData = 0;.
6180: 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 70    }.  else if( p
6190: 2d 3e 6e 44 61 74 61 2b 46 54 53 33 5f 56 41 52  ->nData+FTS3_VAR
61a0: 49 4e 54 5f 4d 41 58 2b 31 3e 70 2d 3e 6e 53 70  INT_MAX+1>p->nSp
61b0: 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ace ){.    int n
61c0: 4e 65 77 20 3d 20 70 2d 3e 6e 53 70 61 63 65 20  New = p->nSpace 
61d0: 2a 20 32 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  * 2;.    p = sql
61e0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 2c 20  ite3_realloc(p, 
61f0: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 6e 4e 65  sizeof(*p) + nNe
6200: 77 29 3b 0a 20 20 20 20 69 66 28 20 21 70 20 29  w);.    if( !p )
6210: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
6220: 66 72 65 65 28 2a 70 70 29 3b 0a 20 20 20 20 20  free(*pp);.     
6230: 20 2a 70 70 20 3d 20 30 3b 0a 20 20 20 20 20 20   *pp = 0;.      
6240: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6250: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
6260: 2d 3e 6e 53 70 61 63 65 20 3d 20 6e 4e 65 77 3b  ->nSpace = nNew;
6270: 0a 20 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20  .    p->aData = 
6280: 28 63 68 61 72 20 2a 29 26 70 5b 31 5d 3b 0a 20  (char *)&p[1];. 
6290: 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20   }..  /* Append 
62a0: 74 68 65 20 6e 65 77 20 73 65 72 69 61 6c 69 7a  the new serializ
62b0: 65 64 20 76 61 72 69 6e 74 20 74 6f 20 74 68 65  ed varint to the
62c0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73 74   end of the list
62d0: 2e 20 2a 2f 0a 20 20 70 2d 3e 6e 44 61 74 61 20  . */.  p->nData 
62e0: 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75  += sqlite3Fts3Pu
62f0: 74 56 61 72 69 6e 74 28 26 70 2d 3e 61 44 61 74  tVarint(&p->aDat
6300: 61 5b 70 2d 3e 6e 44 61 74 61 5d 2c 20 69 29 3b  a[p->nData], i);
6310: 0a 20 20 70 2d 3e 61 44 61 74 61 5b 70 2d 3e 6e  .  p->aData[p->n
6320: 44 61 74 61 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  Data] = '\0';.  
6330: 2a 70 70 20 3d 20 70 3b 0a 20 20 72 65 74 75 72  *pp = p;.  retur
6340: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
6350: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 64 6f 63 69  /*.** Add a doci
6360: 64 2f 63 6f 6c 75 6d 6e 2f 70 6f 73 69 74 69 6f  d/column/positio
6370: 6e 20 65 6e 74 72 79 20 74 6f 20 61 20 50 65 6e  n entry to a Pen
6380: 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63 74 75  dingList structu
6390: 72 65 2e 20 4e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20  re. Non-zero.** 
63a0: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
63b0: 68 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  he structure is 
63c0: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 65  sqlite3_realloce
63d0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 64 64  d as part of add
63e0: 69 6e 67 0a 2a 2a 20 74 68 65 20 65 6e 74 72 79  ing.** the entry
63f0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 7a 65 72  . Otherwise, zer
6400: 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f  o..**.** If an O
6410: 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  OM error occurs,
6420: 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20   *pRc is set to 
6430: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 62 65 66  SQLITE_NOMEM bef
6440: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
6450: 2a 20 5a 65 72 6f 20 69 73 20 61 6c 77 61 79 73  * Zero is always
6460: 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68 69   returned in thi
6470: 73 20 63 61 73 65 2e 20 4f 74 68 65 72 77 69 73  s case. Otherwis
6480: 65 2c 20 69 66 20 6e 6f 20 4f 4f 4d 20 65 72 72  e, if no OOM err
6490: 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74  or occurs,.** it
64a0: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
64b0: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
64c0: 69 6e 74 20 66 74 73 33 50 65 6e 64 69 6e 67 4c  int fts3PendingL
64d0: 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50 65 6e  istAppend(.  Pen
64e0: 64 69 6e 67 4c 69 73 74 20 2a 2a 70 70 2c 20 20  dingList **pp,  
64f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6500: 49 4e 2f 4f 55 54 3a 20 50 65 6e 64 69 6e 67 4c  IN/OUT: PendingL
6510: 69 73 74 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ist structure */
6520: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
6530: 20 69 44 6f 63 69 64 2c 20 20 20 20 20 20 20 20   iDocid,        
6540: 20 20 20 2f 2a 20 44 6f 63 69 64 20 66 6f 72 20     /* Docid for 
6550: 65 6e 74 72 79 20 74 6f 20 61 64 64 20 2a 2f 0a  entry to add */.
6560: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
6570: 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  iCol,           
6580: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 66 6f 72 20    /* Column for 
6590: 65 6e 74 72 79 20 74 6f 20 61 64 64 20 2a 2f 0a  entry to add */.
65a0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
65b0: 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20 20  iPos,           
65c0: 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66    /* Position of
65d0: 20 74 65 72 6d 20 66 6f 72 20 65 6e 74 72 79 20   term for entry 
65e0: 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69 6e 74 20  to add */.  int 
65f0: 2a 70 52 63 20 20 20 20 20 20 20 20 20 20 20 20  *pRc            
6600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
6610: 55 54 3a 20 52 65 74 75 72 6e 20 63 6f 64 65 20  UT: Return code 
6620: 2a 2f 0a 29 7b 0a 20 20 50 65 6e 64 69 6e 67 4c  */.){.  PendingL
6630: 69 73 74 20 2a 70 20 3d 20 2a 70 70 3b 0a 20 20  ist *p = *pp;.  
6640: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
6650: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  OK;..  assert( !
6660: 70 20 7c 7c 20 70 2d 3e 69 4c 61 73 74 44 6f 63  p || p->iLastDoc
6670: 69 64 3c 3d 69 44 6f 63 69 64 20 29 3b 0a 0a 20  id<=iDocid );.. 
6680: 20 69 66 28 20 21 70 20 7c 7c 20 70 2d 3e 69 4c   if( !p || p->iL
6690: 61 73 74 44 6f 63 69 64 21 3d 69 44 6f 63 69 64  astDocid!=iDocid
66a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
66b0: 69 6e 74 36 34 20 69 44 65 6c 74 61 20 3d 20 69  int64 iDelta = i
66c0: 44 6f 63 69 64 20 2d 20 28 70 20 3f 20 70 2d 3e  Docid - (p ? p->
66d0: 69 4c 61 73 74 44 6f 63 69 64 20 3a 20 30 29 3b  iLastDocid : 0);
66e0: 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
66f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
6700: 44 61 74 61 3c 70 2d 3e 6e 53 70 61 63 65 20 29  Data<p->nSpace )
6710: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
6720: 70 2d 3e 61 44 61 74 61 5b 70 2d 3e 6e 44 61 74  p->aData[p->nDat
6730: 61 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  a]==0 );.      p
6740: 2d 3e 6e 44 61 74 61 2b 2b 3b 0a 20 20 20 20 7d  ->nData++;.    }
6750: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
6760: 4f 4b 21 3d 28 72 63 20 3d 20 66 74 73 33 50 65  OK!=(rc = fts3Pe
6770: 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56  ndingListAppendV
6780: 61 72 69 6e 74 28 26 70 2c 20 69 44 65 6c 74 61  arint(&p, iDelta
6790: 29 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  )) ){.      goto
67a0: 20 70 65 6e 64 69 6e 67 6c 69 73 74 61 70 70 65   pendinglistappe
67b0: 6e 64 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  nd_out;.    }.  
67c0: 20 20 70 2d 3e 69 4c 61 73 74 43 6f 6c 20 3d 20    p->iLastCol = 
67d0: 2d 31 3b 0a 20 20 20 20 70 2d 3e 69 4c 61 73 74  -1;.    p->iLast
67e0: 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Pos = 0;.    p->
67f0: 69 4c 61 73 74 44 6f 63 69 64 20 3d 20 69 44 6f  iLastDocid = iDo
6800: 63 69 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  cid;.  }.  if( i
6810: 43 6f 6c 3e 30 20 26 26 20 70 2d 3e 69 4c 61 73  Col>0 && p->iLas
6820: 74 43 6f 6c 21 3d 69 43 6f 6c 20 29 7b 0a 20 20  tCol!=iCol ){.  
6830: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
6840: 3d 28 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69  =(rc = fts3Pendi
6850: 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69  ngListAppendVari
6860: 6e 74 28 26 70 2c 20 31 29 29 0a 20 20 20 20 20  nt(&p, 1)).     
6870: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
6880: 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 4c  c = fts3PendingL
6890: 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e 74 28  istAppendVarint(
68a0: 26 70 2c 20 69 43 6f 6c 29 29 0a 20 20 20 20 29  &p, iCol)).    )
68b0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 65 6e  {.      goto pen
68c0: 64 69 6e 67 6c 69 73 74 61 70 70 65 6e 64 5f 6f  dinglistappend_o
68d0: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  ut;.    }.    p-
68e0: 3e 69 4c 61 73 74 43 6f 6c 20 3d 20 69 43 6f 6c  >iLastCol = iCol
68f0: 3b 0a 20 20 20 20 70 2d 3e 69 4c 61 73 74 50 6f  ;.    p->iLastPo
6900: 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  s = 0;.  }.  if(
6910: 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20   iCol>=0 ){.    
6920: 61 73 73 65 72 74 28 20 69 50 6f 73 3e 70 2d 3e  assert( iPos>p->
6930: 69 4c 61 73 74 50 6f 73 20 7c 7c 20 28 69 50 6f  iLastPos || (iPo
6940: 73 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 61 73 74  s==0 && p->iLast
6950: 50 6f 73 3d 3d 30 29 20 29 3b 0a 20 20 20 20 72  Pos==0) );.    r
6960: 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 4c  c = fts3PendingL
6970: 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e 74 28  istAppendVarint(
6980: 26 70 2c 20 32 2b 69 50 6f 73 2d 70 2d 3e 69 4c  &p, 2+iPos-p->iL
6990: 61 73 74 50 6f 73 29 3b 0a 20 20 20 20 69 66 28  astPos);.    if(
69a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
69b0: 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 61 73 74  {.      p->iLast
69c0: 50 6f 73 20 3d 20 69 50 6f 73 3b 0a 20 20 20 20  Pos = iPos;.    
69d0: 7d 0a 20 20 7d 0a 0a 20 70 65 6e 64 69 6e 67 6c  }.  }.. pendingl
69e0: 69 73 74 61 70 70 65 6e 64 5f 6f 75 74 3a 0a 20  istappend_out:. 
69f0: 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 69 66   *pRc = rc;.  if
6a00: 28 20 70 21 3d 2a 70 70 20 29 7b 0a 20 20 20 20  ( p!=*pp ){.    
6a10: 2a 70 70 20 3d 20 70 3b 0a 20 20 20 20 72 65 74  *pp = p;.    ret
6a20: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
6a30: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
6a40: 46 72 65 65 20 61 20 50 65 6e 64 69 6e 67 4c 69  Free a PendingLi
6a50: 73 74 20 6f 62 6a 65 63 74 20 61 6c 6c 6f 63 61  st object alloca
6a60: 74 65 64 20 62 79 20 66 74 73 33 50 65 6e 64 69  ted by fts3Pendi
6a70: 6e 67 4c 69 73 74 41 70 70 65 6e 64 28 29 2e 0a  ngListAppend()..
6a80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
6a90: 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 44 65  ts3PendingListDe
6aa0: 6c 65 74 65 28 50 65 6e 64 69 6e 67 4c 69 73 74  lete(PendingList
6ab0: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69   *pList){.  sqli
6ac0: 74 65 33 5f 66 72 65 65 28 70 4c 69 73 74 29 3b  te3_free(pList);
6ad0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
6ae0: 20 65 6e 74 72 79 20 74 6f 20 6f 6e 65 20 6f 66   entry to one of
6af0: 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72   the pending-ter
6b00: 6d 73 20 68 61 73 68 20 74 61 62 6c 65 73 2e 0a  ms hash tables..
6b10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
6b20: 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 41 64  s3PendingTermsAd
6b30: 64 4f 6e 65 28 0a 20 20 46 74 73 33 54 61 62 6c  dOne(.  Fts3Tabl
6b40: 65 20 2a 70 2c 0a 20 20 69 6e 74 20 69 43 6f 6c  e *p,.  int iCol
6b50: 2c 0a 20 20 69 6e 74 20 69 50 6f 73 2c 0a 20 20  ,.  int iPos,.  
6b60: 46 74 73 33 48 61 73 68 20 2a 70 48 61 73 68 2c  Fts3Hash *pHash,
6b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b80: 2f 2a 20 50 65 6e 64 69 6e 67 20 74 65 72 6d 73  /* Pending terms
6b90: 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 61   hash table to a
6ba0: 64 64 20 65 6e 74 72 79 20 74 6f 20 2a 2f 0a 20  dd entry to */. 
6bb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f   const char *zTo
6bc0: 6b 65 6e 2c 0a 20 20 69 6e 74 20 6e 54 6f 6b 65  ken,.  int nToke
6bd0: 6e 0a 29 7b 0a 20 20 50 65 6e 64 69 6e 67 4c 69  n.){.  PendingLi
6be0: 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74  st *pList;.  int
6bf0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
6c00: 0a 0a 20 20 70 4c 69 73 74 20 3d 20 28 50 65 6e  ..  pList = (Pen
6c10: 64 69 6e 67 4c 69 73 74 20 2a 29 66 74 73 33 48  dingList *)fts3H
6c20: 61 73 68 46 69 6e 64 28 70 48 61 73 68 2c 20 7a  ashFind(pHash, z
6c30: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a  Token, nToken);.
6c40: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
6c50: 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61     p->nPendingDa
6c60: 74 61 20 2d 3d 20 28 70 4c 69 73 74 2d 3e 6e 44  ta -= (pList->nD
6c70: 61 74 61 20 2b 20 6e 54 6f 6b 65 6e 20 2b 20 73  ata + nToken + s
6c80: 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68 45 6c  izeof(Fts3HashEl
6c90: 65 6d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  em));.  }.  if( 
6ca0: 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41  fts3PendingListA
6cb0: 70 70 65 6e 64 28 26 70 4c 69 73 74 2c 20 70 2d  ppend(&pList, p-
6cc0: 3e 69 50 72 65 76 44 6f 63 69 64 2c 20 69 43 6f  >iPrevDocid, iCo
6cd0: 6c 2c 20 69 50 6f 73 2c 20 26 72 63 29 20 29 7b  l, iPos, &rc) ){
6ce0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
6cf0: 66 74 73 33 48 61 73 68 49 6e 73 65 72 74 28 70  fts3HashInsert(p
6d00: 48 61 73 68 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54  Hash, zToken, nT
6d10: 6f 6b 65 6e 2c 20 70 4c 69 73 74 29 20 29 7b 0a  oken, pList) ){.
6d20: 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20        /* Malloc 
6d30: 66 61 69 6c 65 64 20 77 68 69 6c 65 20 69 6e 73  failed while ins
6d40: 65 72 74 69 6e 67 20 74 68 65 20 6e 65 77 20 65  erting the new e
6d50: 6e 74 72 79 2e 20 54 68 69 73 20 63 61 6e 20 6f  ntry. This can o
6d60: 6e 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 68 61  nly .      ** ha
6d70: 70 70 65 6e 20 69 66 20 74 68 65 72 65 20 77 61  ppen if there wa
6d80: 73 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 65 6e  s no previous en
6d90: 74 72 79 20 66 6f 72 20 74 68 69 73 20 74 6f 6b  try for this tok
6da0: 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  en..      */.   
6db0: 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 66 74     assert( 0==ft
6dc0: 73 33 48 61 73 68 46 69 6e 64 28 70 48 61 73 68  s3HashFind(pHash
6dd0: 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  , zToken, nToken
6de0: 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
6df0: 65 33 5f 66 72 65 65 28 70 4c 69 73 74 29 3b 0a  e3_free(pList);.
6e00: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6e10: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
6e20: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
6e30: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d  ITE_OK ){.    p-
6e40: 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 2b 3d  >nPendingData +=
6e50: 20 28 70 4c 69 73 74 2d 3e 6e 44 61 74 61 20 2b   (pList->nData +
6e60: 20 6e 54 6f 6b 65 6e 20 2b 20 73 69 7a 65 6f 66   nToken + sizeof
6e70: 28 46 74 73 33 48 61 73 68 45 6c 65 6d 29 29 3b  (Fts3HashElem));
6e80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6e90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 6b 65 6e  ;.}../*.** Token
6ea0: 69 7a 65 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d  ize the nul-term
6eb0: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 7a 54  inated string zT
6ec0: 65 78 74 20 61 6e 64 20 61 64 64 20 61 6c 6c 20  ext and add all 
6ed0: 74 6f 6b 65 6e 73 20 74 6f 20 74 68 65 0a 2a 2a  tokens to the.**
6ee0: 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68   pending-terms h
6ef0: 61 73 68 2d 74 61 62 6c 65 2e 20 54 68 65 20 64  ash-table. The d
6f00: 6f 63 69 64 20 75 73 65 64 20 69 73 20 74 68 61  ocid used is tha
6f10: 74 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  t currently stor
6f20: 65 64 20 69 6e 0a 2a 2a 20 70 2d 3e 69 50 72 65  ed in.** p->iPre
6f30: 76 44 6f 63 69 64 2c 20 61 6e 64 20 74 68 65 20  vDocid, and the 
6f40: 63 6f 6c 75 6d 6e 20 69 73 20 73 70 65 63 69 66  column is specif
6f50: 69 65 64 20 62 79 20 61 72 67 75 6d 65 6e 74 20  ied by argument 
6f60: 69 43 6f 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  iCol..**.** If s
6f70: 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
6f80: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
6f90: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
6fa0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
6fb0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
6fc0: 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d   fts3PendingTerm
6fd0: 73 41 64 64 28 0a 20 20 46 74 73 33 54 61 62 6c  sAdd(.  Fts3Tabl
6fe0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
6ff0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
7000: 20 69 6e 74 6f 20 77 68 69 63 68 20 74 65 78 74   into which text
7010: 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65   will be inserte
7020: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67  d */.  int iLang
7030: 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
7040: 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61         /* Langua
7050: 67 65 20 69 64 20 74 6f 20 75 73 65 20 2a 2f 0a  ge id to use */.
7060: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
7070: 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ext,            
7080: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 64 6f 63    /* Text of doc
7090: 75 6d 65 6e 74 20 74 6f 20 62 65 20 69 6e 73 65  ument to be inse
70a0: 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  rted */.  int iC
70b0: 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
70c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
70d0: 75 6d 6e 20 69 6e 74 6f 20 77 68 69 63 68 20 74  umn into which t
70e0: 65 78 74 20 69 73 20 62 65 69 6e 67 20 69 6e 73  ext is being ins
70f0: 65 72 74 65 64 20 2a 2f 0a 20 20 75 33 32 20 2a  erted */.  u32 *
7100: 70 6e 57 6f 72 64 20 20 20 20 20 20 20 20 20 20  pnWord          
7110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
7120: 2f 4f 55 54 3a 20 49 6e 63 72 2e 20 62 79 20 6e  /OUT: Incr. by n
7130: 75 6d 62 65 72 20 74 6f 6b 65 6e 73 20 69 6e 73  umber tokens ins
7140: 65 72 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  erted */.){.  in
7150: 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 53 74 61  t rc;.  int iSta
7160: 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 45  rt = 0;.  int iE
7170: 6e 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 50  nd = 0;.  int iP
7180: 6f 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57  os = 0;.  int nW
7190: 6f 72 64 20 3d 20 30 3b 0a 0a 20 20 63 68 61 72  ord = 0;..  char
71a0: 20 63 6f 6e 73 74 20 2a 7a 54 6f 6b 65 6e 3b 0a   const *zToken;.
71b0: 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 3d 20 30    int nToken = 0
71c0: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b  ;..  sqlite3_tok
71d0: 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 65 6e 69 7a  enizer *pTokeniz
71e0: 65 72 20 3d 20 70 2d 3e 70 54 6f 6b 65 6e 69 7a  er = p->pTokeniz
71f0: 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f  er;.  sqlite3_to
7200: 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 63  kenizer_module c
7210: 6f 6e 73 74 20 2a 70 4d 6f 64 75 6c 65 20 3d 20  onst *pModule = 
7220: 70 54 6f 6b 65 6e 69 7a 65 72 2d 3e 70 4d 6f 64  pTokenizer->pMod
7230: 75 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 74  ule;.  sqlite3_t
7240: 6f 6b 65 6e 69 7a 65 72 5f 63 75 72 73 6f 72 20  okenizer_cursor 
7250: 2a 70 43 73 72 3b 0a 20 20 69 6e 74 20 28 2a 78  *pCsr;.  int (*x
7260: 4e 65 78 74 29 28 73 71 6c 69 74 65 33 5f 74 6f  Next)(sqlite3_to
7270: 6b 65 6e 69 7a 65 72 5f 63 75 72 73 6f 72 20 2a  kenizer_cursor *
7280: 70 43 75 72 73 6f 72 2c 0a 20 20 20 20 20 20 63  pCursor,.      c
7290: 6f 6e 73 74 20 63 68 61 72 2a 2a 2c 69 6e 74 2a  onst char**,int*
72a0: 2c 69 6e 74 2a 2c 69 6e 74 2a 2c 69 6e 74 2a 29  ,int*,int*,int*)
72b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  ;..  assert( pTo
72c0: 6b 65 6e 69 7a 65 72 20 26 26 20 70 4d 6f 64 75  kenizer && pModu
72d0: 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  le );..  /* If t
72e0: 68 65 20 75 73 65 72 20 68 61 73 20 69 6e 73 65  he user has inse
72f0: 72 74 65 64 20 61 20 4e 55 4c 4c 20 76 61 6c 75  rted a NULL valu
7300: 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
7310: 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77   may be called w
7320: 69 74 68 0a 20 20 2a 2a 20 7a 54 65 78 74 3d 3d  ith.  ** zText==
7330: 30 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  0. In this case,
7340: 20 61 64 64 20 7a 65 72 6f 20 74 6f 6b 65 6e 20   add zero token 
7350: 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20 68  entries to the h
7360: 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 0a 20  ash table and . 
7370: 20 2a 2a 20 72 65 74 75 72 6e 20 65 61 72 6c 79   ** return early
7380: 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 54 65 78 74  . */.  if( zText
7390: 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 6e 57 6f  ==0 ){.    *pnWo
73a0: 72 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  rd = 0;.    retu
73b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
73c0: 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
73d0: 33 46 74 73 33 4f 70 65 6e 54 6f 6b 65 6e 69 7a  3Fts3OpenTokeniz
73e0: 65 72 28 70 54 6f 6b 65 6e 69 7a 65 72 2c 20 69  er(pTokenizer, i
73f0: 4c 61 6e 67 69 64 2c 20 7a 54 65 78 74 2c 20 2d  Langid, zText, -
7400: 31 2c 20 26 70 43 73 72 29 3b 0a 20 20 69 66 28  1, &pCsr);.  if(
7410: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7420: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
7430: 0a 20 20 7d 0a 0a 20 20 78 4e 65 78 74 20 3d 20  .  }..  xNext = 
7440: 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78 74 3b 0a  pModule->xNext;.
7450: 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f    while( SQLITE_
7460: 4f 4b 3d 3d 72 63 0a 20 20 20 20 20 20 26 26 20  OK==rc.      && 
7470: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
7480: 20 78 4e 65 78 74 28 70 43 73 72 2c 20 26 7a 54   xNext(pCsr, &zT
7490: 6f 6b 65 6e 2c 20 26 6e 54 6f 6b 65 6e 2c 20 26  oken, &nToken, &
74a0: 69 53 74 61 72 74 2c 20 26 69 45 6e 64 2c 20 26  iStart, &iEnd, &
74b0: 69 50 6f 73 29 29 0a 20 20 29 7b 0a 20 20 20 20  iPos)).  ){.    
74c0: 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 69  int i;.    if( i
74d0: 50 6f 73 3e 3d 6e 57 6f 72 64 20 29 20 6e 57 6f  Pos>=nWord ) nWo
74e0: 72 64 20 3d 20 69 50 6f 73 2b 31 3b 0a 0a 20 20  rd = iPos+1;..  
74f0: 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 73 20 63    /* Positions c
7500: 61 6e 6e 6f 74 20 62 65 20 6e 65 67 61 74 69 76  annot be negativ
7510: 65 3b 20 77 65 20 75 73 65 20 2d 31 20 61 73 20  e; we use -1 as 
7520: 61 20 74 65 72 6d 69 6e 61 74 6f 72 20 69 6e 74  a terminator int
7530: 65 72 6e 61 6c 6c 79 2e 0a 20 20 20 20 2a 2a 20  ernally..    ** 
7540: 54 6f 6b 65 6e 73 20 6d 75 73 74 20 68 61 76 65  Tokens must have
7550: 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 6c 65 6e 67   a non-zero leng
7560: 74 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  th..    */.    i
7570: 66 28 20 69 50 6f 73 3c 30 20 7c 7c 20 21 7a 54  f( iPos<0 || !zT
7580: 6f 6b 65 6e 20 7c 7c 20 6e 54 6f 6b 65 6e 3c 3d  oken || nToken<=
7590: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
75a0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
75b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
75c0: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
75d0: 20 74 65 72 6d 20 74 6f 20 74 68 65 20 74 65 72   term to the ter
75e0: 6d 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ms index */.    
75f0: 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67  rc = fts3Pending
7600: 54 65 72 6d 73 41 64 64 4f 6e 65 28 0a 20 20 20  TermsAddOne(.   
7610: 20 20 20 20 20 70 2c 20 69 43 6f 6c 2c 20 69 50       p, iCol, iP
7620: 6f 73 2c 20 26 70 2d 3e 61 49 6e 64 65 78 5b 30  os, &p->aIndex[0
7630: 5d 2e 68 50 65 6e 64 69 6e 67 2c 20 7a 54 6f 6b  ].hPending, zTok
7640: 65 6e 2c 20 6e 54 6f 6b 65 6e 0a 20 20 20 20 29  en, nToken.    )
7650: 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 41 64  ;.    .    /* Ad
7660: 64 20 74 68 65 20 74 65 72 6d 20 74 6f 20 65 61  d the term to ea
7670: 63 68 20 6f 66 20 74 68 65 20 70 72 65 66 69 78  ch of the prefix
7680: 20 69 6e 64 65 78 65 73 20 74 68 61 74 20 69 74   indexes that it
7690: 20 69 73 20 6e 6f 74 20 74 6f 6f 20 0a 20 20 20   is not too .   
76a0: 20 2a 2a 20 73 68 6f 72 74 20 66 6f 72 2e 20 2a   ** short for. *
76b0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 72  /.    for(i=1; r
76c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
76d0: 69 3c 70 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b  i<p->nIndex; i++
76e0: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
76f0: 46 74 73 33 49 6e 64 65 78 20 2a 70 49 6e 64 65  Fts3Index *pInde
7700: 78 20 3d 20 26 70 2d 3e 61 49 6e 64 65 78 5b 69  x = &p->aIndex[i
7710: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 54 6f  ];.      if( nTo
7720: 6b 65 6e 3c 70 49 6e 64 65 78 2d 3e 6e 50 72 65  ken<pIndex->nPre
7730: 66 69 78 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  fix ) continue;.
7740: 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 50        rc = fts3P
7750: 65 6e 64 69 6e 67 54 65 72 6d 73 41 64 64 4f 6e  endingTermsAddOn
7760: 65 28 0a 20 20 20 20 20 20 20 20 20 20 70 2c 20  e(.          p, 
7770: 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 26 70 49 6e  iCol, iPos, &pIn
7780: 64 65 78 2d 3e 68 50 65 6e 64 69 6e 67 2c 20 7a  dex->hPending, z
7790: 54 6f 6b 65 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e  Token, pIndex->n
77a0: 50 72 65 66 69 78 0a 20 20 20 20 20 20 29 3b 0a  Prefix.      );.
77b0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 4d 6f      }.  }..  pMo
77c0: 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 43 73  dule->xClose(pCs
77d0: 72 29 3b 0a 20 20 2a 70 6e 57 6f 72 64 20 2b 3d  r);.  *pnWord +=
77e0: 20 6e 57 6f 72 64 3b 0a 20 20 72 65 74 75 72 6e   nWord;.  return
77f0: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e   (rc==SQLITE_DON
7800: 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  E ? SQLITE_OK : 
7810: 72 63 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 43  rc);.}../* .** C
7820: 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
7830: 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74  tion indicates t
7840: 68 61 74 20 73 75 62 73 65 71 75 65 6e 74 20 63  hat subsequent c
7850: 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 66 74 73 33  alls to .** fts3
7860: 50 65 6e 64 69 6e 67 54 65 72 6d 73 41 64 64 28  PendingTermsAdd(
7870: 29 20 61 72 65 20 74 6f 20 61 64 64 20 74 65 72  ) are to add ter
7880: 6d 2f 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  m/position-list 
7890: 70 61 69 72 73 20 66 6f 72 20 74 68 65 0a 2a 2a  pairs for the.**
78a0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
78b0: 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 64   document with d
78c0: 6f 63 69 64 20 69 44 6f 63 69 64 2e 0a 2a 2f 0a  ocid iDocid..*/.
78d0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 50  static int fts3P
78e0: 65 6e 64 69 6e 67 54 65 72 6d 73 44 6f 63 69 64  endingTermsDocid
78f0: 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
7900: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7910: 20 20 20 20 2f 2a 20 46 75 6c 6c 2d 74 65 78 74      /* Full-text
7920: 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   table handle */
7930: 0a 20 20 69 6e 74 20 62 44 65 6c 65 74 65 2c 20  .  int bDelete, 
7940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7950: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
7960: 69 73 20 6f 70 20 69 73 20 61 20 64 65 6c 65 74  is op is a delet
7970: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67  e */.  int iLang
7980: 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
7990: 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61         /* Langua
79a0: 67 65 20 69 64 20 6f 66 20 72 6f 77 20 62 65 69  ge id of row bei
79b0: 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  ng written */.  
79c0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 44 6f  sqlite_int64 iDo
79d0: 63 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20  cid             
79e0: 2f 2a 20 44 6f 63 69 64 20 6f 66 20 72 6f 77 20  /* Docid of row 
79f0: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f  being written */
7a00: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 4c  .){.  assert( iL
7a10: 61 6e 67 69 64 3e 3d 30 20 29 3b 0a 20 20 61 73  angid>=0 );.  as
7a20: 73 65 72 74 28 20 62 44 65 6c 65 74 65 3d 3d 31  sert( bDelete==1
7a30: 20 7c 7c 20 62 44 65 6c 65 74 65 3d 3d 30 20 29   || bDelete==0 )
7a40: 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f 28 73 68 65  ;..  /* TODO(she
7a50: 73 73 29 20 45 78 70 6c 6f 72 65 20 77 68 65 74  ss) Explore whet
7a60: 68 65 72 20 70 61 72 74 69 61 6c 6c 79 20 66 6c  her partially fl
7a70: 75 73 68 69 6e 67 20 74 68 65 20 62 75 66 66 65  ushing the buffe
7a80: 72 20 6f 6e 0a 20 20 2a 2a 20 66 6f 72 63 65 64  r on.  ** forced
7a90: 2d 66 6c 75 73 68 20 77 6f 75 6c 64 20 70 72 6f  -flush would pro
7aa0: 76 69 64 65 20 62 65 74 74 65 72 20 70 65 72 66  vide better perf
7ab0: 6f 72 6d 61 6e 63 65 2e 20 20 49 20 73 75 73 70  ormance.  I susp
7ac0: 65 63 74 20 74 68 61 74 20 69 66 0a 20 20 2a 2a  ect that if.  **
7ad0: 20 77 65 20 6f 72 64 65 72 65 64 20 74 68 65 20   we ordered the 
7ae0: 64 6f 63 6c 69 73 74 73 20 62 79 20 73 69 7a 65  doclists by size
7af0: 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 68 65   and flushed the
7b00: 20 6c 61 72 67 65 73 74 20 75 6e 74 69 6c 20 74   largest until t
7b10: 68 65 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 77  he.  ** buffer w
7b20: 61 73 20 68 61 6c 66 20 65 6d 70 74 79 2c 20 74  as half empty, t
7b30: 68 61 74 20 77 6f 75 6c 64 20 6c 65 74 20 74 68  hat would let th
7b40: 65 20 6c 65 73 73 20 66 72 65 71 75 65 6e 74 20  e less frequent 
7b50: 74 65 72 6d 73 0a 20 20 2a 2a 20 67 65 6e 65 72  terms.  ** gener
7b60: 61 74 65 20 6c 6f 6e 67 65 72 20 64 6f 63 6c 69  ate longer docli
7b70: 73 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  sts..  */.  if( 
7b80: 69 44 6f 63 69 64 3c 70 2d 3e 69 50 72 65 76 44  iDocid<p->iPrevD
7b90: 6f 63 69 64 20 0a 20 20 20 7c 7c 20 28 69 44 6f  ocid .   || (iDo
7ba0: 63 69 64 3d 3d 70 2d 3e 69 50 72 65 76 44 6f 63  cid==p->iPrevDoc
7bb0: 69 64 20 26 26 20 70 2d 3e 62 50 72 65 76 44 65  id && p->bPrevDe
7bc0: 6c 65 74 65 3d 3d 30 29 0a 20 20 20 7c 7c 20 70  lete==0).   || p
7bd0: 2d 3e 69 50 72 65 76 4c 61 6e 67 69 64 21 3d 69  ->iPrevLangid!=i
7be0: 4c 61 6e 67 69 64 0a 20 20 20 7c 7c 20 70 2d 3e  Langid.   || p->
7bf0: 6e 50 65 6e 64 69 6e 67 44 61 74 61 3e 70 2d 3e  nPendingData>p->
7c00: 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61 74 61 20  nMaxPendingData 
7c10: 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  .  ){.    int rc
7c20: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 65   = sqlite3Fts3Pe
7c30: 6e 64 69 6e 67 54 65 72 6d 73 46 6c 75 73 68 28  ndingTermsFlush(
7c40: 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  p);.    if( rc!=
7c50: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
7c60: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 2d 3e  rn rc;.  }.  p->
7c70: 69 50 72 65 76 44 6f 63 69 64 20 3d 20 69 44 6f  iPrevDocid = iDo
7c80: 63 69 64 3b 0a 20 20 70 2d 3e 69 50 72 65 76 4c  cid;.  p->iPrevL
7c90: 61 6e 67 69 64 20 3d 20 69 4c 61 6e 67 69 64 3b  angid = iLangid;
7ca0: 0a 20 20 70 2d 3e 62 50 72 65 76 44 65 6c 65 74  .  p->bPrevDelet
7cb0: 65 20 3d 20 62 44 65 6c 65 74 65 3b 0a 20 20 72  e = bDelete;.  r
7cc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7cd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  .}../*.** Discar
7ce0: 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
7cf0: 66 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65  f the pending-te
7d00: 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65 73 2e  rms hash tables.
7d10: 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
7d20: 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d  3Fts3PendingTerm
7d30: 73 43 6c 65 61 72 28 46 74 73 33 54 61 62 6c 65  sClear(Fts3Table
7d40: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
7d50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
7d60: 49 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  Index; i++){.   
7d70: 20 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 70   Fts3HashElem *p
7d80: 45 6c 65 6d 3b 0a 20 20 20 20 46 74 73 33 48 61  Elem;.    Fts3Ha
7d90: 73 68 20 2a 70 48 61 73 68 20 3d 20 26 70 2d 3e  sh *pHash = &p->
7da0: 61 49 6e 64 65 78 5b 69 5d 2e 68 50 65 6e 64 69  aIndex[i].hPendi
7db0: 6e 67 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65  ng;.    for(pEle
7dc0: 6d 3d 66 74 73 33 48 61 73 68 46 69 72 73 74 28  m=fts3HashFirst(
7dd0: 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  pHash); pElem; p
7de0: 45 6c 65 6d 3d 66 74 73 33 48 61 73 68 4e 65 78  Elem=fts3HashNex
7df0: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20  t(pElem)){.     
7e00: 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70 4c   PendingList *pL
7e10: 69 73 74 20 3d 20 28 50 65 6e 64 69 6e 67 4c 69  ist = (PendingLi
7e20: 73 74 20 2a 29 66 74 73 33 48 61 73 68 44 61 74  st *)fts3HashDat
7e30: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20  a(pElem);.      
7e40: 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 44  fts3PendingListD
7e50: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
7e60: 20 20 7d 0a 20 20 20 20 66 74 73 33 48 61 73 68    }.    fts3Hash
7e70: 43 6c 65 61 72 28 70 48 61 73 68 29 3b 0a 20 20  Clear(pHash);.  
7e80: 7d 0a 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44  }.  p->nPendingD
7e90: 61 74 61 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ata = 0;.}../*.*
7ea0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
7eb0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
7ec0: 20 78 55 70 64 61 74 65 28 29 20 6d 65 74 68 6f   xUpdate() metho
7ed0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20  d as part of an 
7ee0: 49 4e 53 45 52 54 0a 2a 2a 20 6f 70 65 72 61 74  INSERT.** operat
7ef0: 69 6f 6e 2e 20 49 74 20 61 64 64 73 20 65 6e 74  ion. It adds ent
7f00: 72 69 65 73 20 66 6f 72 20 65 61 63 68 20 74 65  ries for each te
7f10: 72 6d 20 69 6e 20 74 68 65 20 6e 65 77 20 72 65  rm in the new re
7f20: 63 6f 72 64 20 74 6f 20 74 68 65 0a 2a 2a 20 70  cord to the.** p
7f30: 65 6e 64 69 6e 67 54 65 72 6d 73 20 68 61 73 68  endingTerms hash
7f40: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 72   table..**.** Ar
7f50: 67 75 6d 65 6e 74 20 61 70 56 61 6c 20 69 73 20  gument apVal is 
7f60: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
7f70: 73 69 6d 69 6c 61 72 6c 79 20 6e 61 6d 65 64 20  similarly named 
7f80: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
7f90: 74 6f 0a 2a 2a 20 66 74 73 33 49 6e 73 65 72 74  to.** fts3Insert
7fa0: 44 61 74 61 28 29 2e 20 50 61 72 61 6d 65 74 65  Data(). Paramete
7fb0: 72 20 69 44 6f 63 69 64 20 69 73 20 74 68 65 20  r iDocid is the 
7fc0: 64 6f 63 69 64 20 6f 66 20 74 68 65 20 6e 65 77  docid of the new
7fd0: 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
7fe0: 69 6e 74 20 66 74 73 33 49 6e 73 65 72 74 54 65  int fts3InsertTe
7ff0: 72 6d 73 28 0a 20 20 46 74 73 33 54 61 62 6c 65  rms(.  Fts3Table
8000: 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 4c 61 6e   *p, .  int iLan
8010: 67 69 64 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  gid, .  sqlite3_
8020: 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20 0a  value **apVal, .
8030: 20 20 75 33 32 20 2a 61 53 7a 0a 29 7b 0a 20 20    u32 *aSz.){.  
8040: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8060: 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
8070: 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
8080: 32 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  2; i<p->nColumn+
8090: 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  2; i++){.    int
80a0: 20 69 43 6f 6c 20 3d 20 69 2d 32 3b 0a 20 20 20   iCol = i-2;.   
80b0: 20 69 66 28 20 70 2d 3e 61 62 4e 6f 74 69 6e 64   if( p->abNotind
80c0: 65 78 65 64 5b 69 43 6f 6c 5d 3d 3d 30 20 29 7b  exed[iCol]==0 ){
80d0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
80e0: 72 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73  r *zText = (cons
80f0: 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  t char *)sqlite3
8100: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61  _value_text(apVa
8110: 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74  l[i]);.      int
8120: 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e   rc = fts3Pendin
8130: 67 54 65 72 6d 73 41 64 64 28 70 2c 20 69 4c 61  gTermsAdd(p, iLa
8140: 6e 67 69 64 2c 20 7a 54 65 78 74 2c 20 69 43 6f  ngid, zText, iCo
8150: 6c 2c 20 26 61 53 7a 5b 69 43 6f 6c 5d 29 3b 0a  l, &aSz[iCol]);.
8160: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
8170: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
8180: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
8190: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 53 7a 5b      }.      aSz[
81a0: 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 2b 3d 20 73  p->nColumn] += s
81b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
81c0: 65 73 28 61 70 56 61 6c 5b 69 5d 29 3b 0a 20 20  es(apVal[i]);.  
81d0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
81e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
81f0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
8200: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
8210: 74 68 65 20 78 55 70 64 61 74 65 28 29 20 6d 65  the xUpdate() me
8220: 74 68 6f 64 20 66 6f 72 20 61 6e 20 49 4e 53 45  thod for an INSE
8230: 52 54 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  RT operation..**
8240: 20 54 68 65 20 61 70 56 61 6c 20 70 61 72 61 6d   The apVal param
8250: 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20 61  eter is passed a
8260: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 61 70 56   copy of the apV
8270: 61 6c 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  al argument pass
8280: 65 64 20 62 79 0a 2a 2a 20 53 51 4c 69 74 65 20  ed by.** SQLite 
8290: 74 6f 20 74 68 65 20 78 55 70 64 61 74 65 28 29  to the xUpdate()
82a0: 20 6d 65 74 68 6f 64 2e 20 69 2e 65 3a 0a 2a 2a   method. i.e:.**
82b0: 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 30 5d 20 20  .**   apVal[0]  
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 6f                No
82d0: 74 20 75 73 65 64 20 66 6f 72 20 49 4e 53 45 52  t used for INSER
82e0: 54 2e 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 31 5d  T..**   apVal[1]
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8300: 72 6f 77 69 64 0a 2a 2a 20 20 20 61 70 56 61 6c  rowid.**   apVal
8310: 5b 32 5d 20 20 20 20 20 20 20 20 20 20 20 20 20  [2]             
8320: 20 20 20 4c 65 66 74 2d 6d 6f 73 74 20 75 73 65     Left-most use
8330: 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e  r-defined column
8340: 0a 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 61  .**   ....**   a
8350: 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  pVal[p->nColumn+
8360: 31 5d 20 20 20 20 20 52 69 67 68 74 2d 6d 6f 73  1]     Right-mos
8370: 74 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 63  t user-defined c
8380: 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 61 70 56 61 6c  olumn.**   apVal
8390: 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 5d 20 20  [p->nColumn+2]  
83a0: 20 20 20 48 69 64 64 65 6e 20 63 6f 6c 75 6d 6e     Hidden column
83b0: 20 77 69 74 68 20 73 61 6d 65 20 6e 61 6d 65 20   with same name 
83c0: 61 73 20 74 61 62 6c 65 0a 2a 2a 20 20 20 61 70  as table.**   ap
83d0: 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 33  Val[p->nColumn+3
83e0: 5d 20 20 20 20 20 48 69 64 64 65 6e 20 22 64 6f  ]     Hidden "do
83f0: 63 69 64 22 20 63 6f 6c 75 6d 6e 20 28 61 6c 69  cid" column (ali
8400: 61 73 20 66 6f 72 20 72 6f 77 69 64 29 0a 2a 2a  as for rowid).**
8410: 20 20 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c     apVal[p->nCol
8420: 75 6d 6e 2b 34 5d 20 20 20 20 20 48 69 64 64 65  umn+4]     Hidde
8430: 6e 20 6c 61 6e 67 75 61 67 65 69 64 20 63 6f 6c  n languageid col
8440: 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  umn.*/.static in
8450: 74 20 66 74 73 33 49 6e 73 65 72 74 44 61 74 61  t fts3InsertData
8460: 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
8470: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8480: 20 20 20 20 2f 2a 20 46 75 6c 6c 2d 74 65 78 74      /* Full-text
8490: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
84a0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
84b0: 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  l,          /* A
84c0: 72 72 61 79 20 6f 66 20 76 61 6c 75 65 73 20 74  rray of values t
84d0: 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 73 71  o insert */.  sq
84e0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 44  lite3_int64 *piD
84f0: 6f 63 69 64 20 20 20 20 20 20 20 20 20 20 2f 2a  ocid          /*
8500: 20 4f 55 54 3a 20 44 6f 63 69 64 20 66 6f 72 20   OUT: Docid for 
8510: 72 6f 77 20 6a 75 73 74 20 69 6e 73 65 72 74 65  row just inserte
8520: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  d */.){.  int rc
8530: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
8550: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  urn code */.  sq
8560: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 43 6f 6e  lite3_stmt *pCon
8570: 74 65 6e 74 49 6e 73 65 72 74 3b 20 20 20 2f 2a  tentInsert;   /*
8580: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 5f 63   INSERT INTO %_c
8590: 6f 6e 74 65 6e 74 20 56 41 4c 55 45 53 28 2e 2e  ontent VALUES(..
85a0: 2e 29 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e  .) */..  if( p->
85b0: 7a 43 6f 6e 74 65 6e 74 54 62 6c 20 29 7b 0a 20  zContentTbl ){. 
85c0: 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
85d0: 20 2a 70 52 6f 77 69 64 20 3d 20 61 70 56 61 6c   *pRowid = apVal
85e0: 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 33 5d 3b 0a  [p->nColumn+3];.
85f0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
8600: 76 61 6c 75 65 5f 74 79 70 65 28 70 52 6f 77 69  value_type(pRowi
8610: 64 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  d)==SQLITE_NULL 
8620: 29 7b 0a 20 20 20 20 20 20 70 52 6f 77 69 64 20  ){.      pRowid 
8630: 3d 20 61 70 56 61 6c 5b 31 5d 3b 0a 20 20 20 20  = apVal[1];.    
8640: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
8650: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 52 6f  3_value_type(pRo
8660: 77 69 64 29 21 3d 53 51 4c 49 54 45 5f 49 4e 54  wid)!=SQLITE_INT
8670: 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 72 65  EGER ){.      re
8680: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
8690: 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20  TRAINT;.    }.  
86a0: 20 20 2a 70 69 44 6f 63 69 64 20 3d 20 73 71 6c    *piDocid = sql
86b0: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
86c0: 28 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 72 65  (pRowid);.    re
86d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
86e0: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
86f0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68   the statement h
8700: 61 6e 64 6c 65 20 75 73 65 64 20 74 6f 20 69 6e  andle used to in
8710: 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74  sert data into t
8720: 68 65 20 25 5f 63 6f 6e 74 65 6e 74 0a 20 20 2a  he %_content.  *
8730: 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 53 51 4c  * table. The SQL
8740: 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 6d   for this statem
8750: 65 6e 74 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ent is:.  **.  *
8760: 2a 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  *   INSERT INTO 
8770: 25 5f 63 6f 6e 74 65 6e 74 20 56 41 4c 55 45 53  %_content VALUES
8780: 28 3f 2c 20 3f 2c 20 3f 2c 20 2e 2e 2e 29 0a 20  (?, ?, ?, ...). 
8790: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 74 61   **.  ** The sta
87a0: 74 65 6d 65 6e 74 20 66 65 61 74 75 72 65 73 20  tement features 
87b0: 4e 20 27 3f 27 20 76 61 72 69 61 62 6c 65 73 2c  N '?' variables,
87c0: 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20   where N is the 
87d0: 6e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 0a 20  number of user. 
87e0: 20 2a 2a 20 64 65 66 69 6e 65 64 20 63 6f 6c 75   ** defined colu
87f0: 6d 6e 73 20 69 6e 20 74 68 65 20 46 54 53 33 20  mns in the FTS3 
8800: 74 61 62 6c 65 2c 20 70 6c 75 73 20 6f 6e 65 20  table, plus one 
8810: 66 6f 72 20 74 68 65 20 64 6f 63 69 64 20 66 69  for the docid fi
8820: 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  eld..  */.  rc =
8830: 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
8840: 53 51 4c 5f 43 4f 4e 54 45 4e 54 5f 49 4e 53 45  SQL_CONTENT_INSE
8850: 52 54 2c 20 26 70 43 6f 6e 74 65 6e 74 49 6e 73  RT, &pContentIns
8860: 65 72 74 2c 20 26 61 70 56 61 6c 5b 31 5d 29 3b  ert, &apVal[1]);
8870: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
8880: 45 5f 4f 4b 20 26 26 20 70 2d 3e 7a 4c 61 6e 67  E_OK && p->zLang
8890: 75 61 67 65 69 64 20 29 7b 0a 20 20 20 20 72 63  uageid ){.    rc
88a0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
88b0: 69 6e 74 28 0a 20 20 20 20 20 20 20 20 70 43 6f  int(.        pCo
88c0: 6e 74 65 6e 74 49 6e 73 65 72 74 2c 20 70 2d 3e  ntentInsert, p->
88d0: 6e 43 6f 6c 75 6d 6e 2b 32 2c 20 0a 20 20 20 20  nColumn+2, .    
88e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
88f0: 65 5f 69 6e 74 28 61 70 56 61 6c 5b 70 2d 3e 6e  e_int(apVal[p->n
8900: 43 6f 6c 75 6d 6e 2b 34 5d 29 0a 20 20 20 20 29  Column+4]).    )
8910: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
8920: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
8930: 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65  rn rc;..  /* The
8940: 72 65 20 69 73 20 61 20 71 75 69 72 6b 20 68 65  re is a quirk he
8950: 72 65 2e 20 54 68 65 20 75 73 65 72 73 20 49 4e  re. The users IN
8960: 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 20 6d  SERT statement m
8970: 61 79 20 68 61 76 65 20 73 70 65 63 69 66 69 65  ay have specifie
8980: 64 0a 20 20 2a 2a 20 61 20 76 61 6c 75 65 20 66  d.  ** a value f
8990: 6f 72 20 74 68 65 20 22 72 6f 77 69 64 22 20 66  or the "rowid" f
89a0: 69 65 6c 64 2c 20 66 6f 72 20 74 68 65 20 22 64  ield, for the "d
89b0: 6f 63 69 64 22 20 66 69 65 6c 64 2c 20 6f 72 20  ocid" field, or 
89c0: 66 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 20 57  for both..  ** W
89d0: 68 69 63 68 20 69 73 20 61 20 70 72 6f 62 6c 65  hich is a proble
89e0: 6d 2c 20 73 69 6e 63 65 20 22 72 6f 77 69 64 22  m, since "rowid"
89f0: 20 61 6e 64 20 22 64 6f 63 69 64 22 20 61 72 65   and "docid" are
8a00: 20 61 6c 69 61 73 65 73 20 66 6f 72 20 74 68 65   aliases for the
8a10: 0a 20 20 2a 2a 20 73 61 6d 65 20 76 61 6c 75 65  .  ** same value
8a20: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20  . For example:. 
8a30: 20 2a 2a 0a 20 20 2a 2a 20 20 20 49 4e 53 45 52   **.  **   INSER
8a40: 54 20 49 4e 54 4f 20 66 74 73 33 74 62 6c 28 72  T INTO fts3tbl(r
8a50: 6f 77 69 64 2c 20 64 6f 63 69 64 29 20 56 41 4c  owid, docid) VAL
8a60: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 2a 2a 0a  UES(1, 2);.  **.
8a70: 20 20 2a 2a 20 49 6e 20 46 54 53 33 2c 20 74 68    ** In FTS3, th
8a80: 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20  is is an error. 
8a90: 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 74  It is an error t
8aa0: 6f 20 73 70 65 63 69 66 79 20 6e 6f 6e 2d 4e 55  o specify non-NU
8ab0: 4c 4c 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 66  LL values.  ** f
8ac0: 6f 72 20 62 6f 74 68 20 64 6f 63 69 64 20 61 6e  or both docid an
8ad0: 64 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 6f 77  d some other row
8ae0: 69 64 20 61 6c 69 61 73 2e 0a 20 20 2a 2f 0a 20  id alias..  */. 
8af0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c   if( SQLITE_NULL
8b00: 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  !=sqlite3_value_
8b10: 74 79 70 65 28 61 70 56 61 6c 5b 33 2b 70 2d 3e  type(apVal[3+p->
8b20: 6e 43 6f 6c 75 6d 6e 5d 29 20 29 7b 0a 20 20 20  nColumn]) ){.   
8b30: 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c   if( SQLITE_NULL
8b40: 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ==sqlite3_value_
8b50: 74 79 70 65 28 61 70 56 61 6c 5b 30 5d 29 0a 20  type(apVal[0]). 
8b60: 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4e 55      && SQLITE_NU
8b70: 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  LL!=sqlite3_valu
8b80: 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 31 5d 29  e_type(apVal[1])
8b90: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
8ba0: 20 41 20 72 6f 77 69 64 2f 64 6f 63 69 64 20 63   A rowid/docid c
8bb0: 6f 6e 66 6c 69 63 74 2e 20 2a 2f 0a 20 20 20 20  onflict. */.    
8bc0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8bd0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
8be0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
8bf0: 6e 64 5f 76 61 6c 75 65 28 70 43 6f 6e 74 65 6e  nd_value(pConten
8c00: 74 49 6e 73 65 72 74 2c 20 31 2c 20 61 70 56 61  tInsert, 1, apVa
8c10: 6c 5b 33 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 29  l[3+p->nColumn])
8c20: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
8c30: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
8c40: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45   rc;.  }..  /* E
8c50: 78 65 63 75 74 65 20 74 68 65 20 73 74 61 74 65  xecute the state
8c60: 6d 65 6e 74 20 74 6f 20 69 6e 73 65 72 74 20 74  ment to insert t
8c70: 68 65 20 72 65 63 6f 72 64 2e 20 53 65 74 20 2a  he record. Set *
8c80: 70 69 44 6f 63 69 64 20 74 6f 20 74 68 65 20 0a  piDocid to the .
8c90: 20 20 2a 2a 20 6e 65 77 20 64 6f 63 69 64 20 76    ** new docid v
8ca0: 61 6c 75 65 2e 20 0a 20 20 2a 2f 0a 20 20 73 71  alue. .  */.  sq
8cb0: 6c 69 74 65 33 5f 73 74 65 70 28 70 43 6f 6e 74  lite3_step(pCont
8cc0: 65 6e 74 49 6e 73 65 72 74 29 3b 0a 20 20 72 63  entInsert);.  rc
8cd0: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
8ce0: 28 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 29  (pContentInsert)
8cf0: 3b 0a 0a 20 20 2a 70 69 44 6f 63 69 64 20 3d 20  ;..  *piDocid = 
8d00: 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
8d10: 65 72 74 5f 72 6f 77 69 64 28 70 2d 3e 64 62 29  ert_rowid(p->db)
8d20: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
8d30: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  ..../*.** Remove
8d40: 20 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74   all data from t
8d50: 68 65 20 46 54 53 33 20 74 61 62 6c 65 2e 20 43  he FTS3 table. C
8d60: 6c 65 61 72 20 74 68 65 20 68 61 73 68 20 74 61  lear the hash ta
8d70: 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a  ble containing.*
8d80: 2a 20 70 65 6e 64 69 6e 67 20 74 65 72 6d 73 2e  * pending terms.
8d90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
8da0: 74 73 33 44 65 6c 65 74 65 41 6c 6c 28 46 74 73  ts3DeleteAll(Fts
8db0: 33 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 62  3Table *p, int b
8dc0: 43 6f 6e 74 65 6e 74 29 7b 0a 20 20 69 6e 74 20  Content){.  int 
8dd0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
8de0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
8df0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
8e00: 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20   /* Discard the 
8e10: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
8e20: 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68 61  pending-terms ha
8e30: 73 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73  sh table. */.  s
8e40: 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e  qlite3Fts3Pendin
8e50: 67 54 65 72 6d 73 43 6c 65 61 72 28 70 29 3b 0a  gTermsClear(p);.
8e60: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 65 76 65  .  /* Delete eve
8e70: 72 79 74 68 69 6e 67 20 66 72 6f 6d 20 74 68 65  rything from the
8e80: 20 73 68 61 64 6f 77 20 74 61 62 6c 65 73 2e 20   shadow tables. 
8e90: 45 78 63 65 70 74 2c 20 6c 65 61 76 65 20 25 5f  Except, leave %_
8ea0: 63 6f 6e 74 65 6e 74 20 61 73 0a 20 20 2a 2a 20  content as.  ** 
8eb0: 69 73 20 69 66 20 62 43 6f 6e 74 65 6e 74 20 69  is if bContent i
8ec0: 73 20 66 61 6c 73 65 2e 20 20 2a 2f 0a 20 20 61  s false.  */.  a
8ed0: 73 73 65 72 74 28 20 70 2d 3e 7a 43 6f 6e 74 65  ssert( p->zConte
8ee0: 6e 74 54 62 6c 3d 3d 30 20 7c 7c 20 62 43 6f 6e  ntTbl==0 || bCon
8ef0: 74 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28  tent==0 );.  if(
8f00: 20 62 43 6f 6e 74 65 6e 74 20 29 20 66 74 73 33   bContent ) fts3
8f10: 53 71 6c 45 78 65 63 28 26 72 63 2c 20 70 2c 20  SqlExec(&rc, p, 
8f20: 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 43  SQL_DELETE_ALL_C
8f30: 4f 4e 54 45 4e 54 2c 20 30 29 3b 0a 20 20 66 74  ONTENT, 0);.  ft
8f40: 73 33 53 71 6c 45 78 65 63 28 26 72 63 2c 20 70  s3SqlExec(&rc, p
8f50: 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c  , SQL_DELETE_ALL
8f60: 5f 53 45 47 4d 45 4e 54 53 2c 20 30 29 3b 0a 20  _SEGMENTS, 0);. 
8f70: 20 66 74 73 33 53 71 6c 45 78 65 63 28 26 72 63   fts3SqlExec(&rc
8f80: 2c 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f  , p, SQL_DELETE_
8f90: 41 4c 4c 5f 53 45 47 44 49 52 2c 20 30 29 3b 0a  ALL_SEGDIR, 0);.
8fa0: 20 20 69 66 28 20 70 2d 3e 62 48 61 73 44 6f 63    if( p->bHasDoc
8fb0: 73 69 7a 65 20 29 7b 0a 20 20 20 20 66 74 73 33  size ){.    fts3
8fc0: 53 71 6c 45 78 65 63 28 26 72 63 2c 20 70 2c 20  SqlExec(&rc, p, 
8fd0: 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 44  SQL_DELETE_ALL_D
8fe0: 4f 43 53 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a  OCSIZE, 0);.  }.
8ff0: 20 20 69 66 28 20 70 2d 3e 62 48 61 73 53 74 61    if( p->bHasSta
9000: 74 20 29 7b 0a 20 20 20 20 66 74 73 33 53 71 6c  t ){.    fts3Sql
9010: 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53 51 4c  Exec(&rc, p, SQL
9020: 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 53 54 41 54  _DELETE_ALL_STAT
9030: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
9040: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a  rn rc;.}../*.**.
9050: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 61  */.static int la
9060: 6e 67 69 64 46 72 6f 6d 53 65 6c 65 63 74 28 46  ngidFromSelect(F
9070: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 73 71 6c  ts3Table *p, sql
9080: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65  ite3_stmt *pSele
9090: 63 74 29 7b 0a 20 20 69 6e 74 20 69 4c 61 6e 67  ct){.  int iLang
90a0: 69 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d  id = 0;.  if( p-
90b0: 3e 7a 4c 61 6e 67 75 61 67 65 69 64 20 29 20 69  >zLanguageid ) i
90c0: 4c 61 6e 67 69 64 20 3d 20 73 71 6c 69 74 65 33  Langid = sqlite3
90d0: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 65 6c  _column_int(pSel
90e0: 65 63 74 2c 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  ect, p->nColumn+
90f0: 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 4c 61  1);.  return iLa
9100: 6e 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ngid;.}../*.** T
9110: 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74  he first element
9120: 20 69 6e 20 74 68 65 20 61 70 56 61 6c 5b 5d 20   in the apVal[] 
9130: 61 72 72 61 79 20 69 73 20 61 73 73 75 6d 65 64  array is assumed
9140: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
9150: 64 6f 63 69 64 0a 2a 2a 20 28 61 6e 20 69 6e 74  docid.** (an int
9160: 65 67 65 72 29 20 6f 66 20 61 20 72 6f 77 20 61  eger) of a row a
9170: 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74  bout to be delet
9180: 65 64 2e 20 52 65 6d 6f 76 65 20 61 6c 6c 20 74  ed. Remove all t
9190: 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  erms from the.**
91a0: 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   full-text index
91b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
91c0: 20 66 74 73 33 44 65 6c 65 74 65 54 65 72 6d 73   fts3DeleteTerms
91d0: 28 20 0a 20 20 69 6e 74 20 2a 70 52 43 2c 20 20  ( .  int *pRC,  
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
91f0: 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
9200: 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
9210: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
9220: 46 54 53 20 74 61 62 6c 65 20 74 6f 20 64 65 6c  FTS table to del
9230: 65 74 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 73 71  ete from */.  sq
9240: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 6f  lite3_value *pRo
9250: 77 69 64 2c 20 20 2f 2a 20 54 68 65 20 64 6f 63  wid,  /* The doc
9260: 69 64 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  id to be deleted
9270: 20 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a 2c 20   */.  u32 *aSz, 
9280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9290: 20 53 69 7a 65 73 20 6f 66 20 64 65 6c 65 74 65   Sizes of delete
92a0: 64 20 64 6f 63 75 6d 65 6e 74 20 77 72 69 74 74  d document writt
92b0: 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  en here */.  int
92c0: 20 2a 70 62 46 6f 75 6e 64 20 20 20 20 20 20 20   *pbFound       
92d0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74       /* OUT: Set
92e0: 20 74 6f 20 74 72 75 65 20 69 66 20 72 6f 77 20   to true if row 
92f0: 72 65 61 6c 6c 79 20 64 6f 65 73 20 65 78 69 73  really does exis
9300: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
9310: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
9320: 20 2a 70 53 65 6c 65 63 74 3b 0a 0a 20 20 61 73   *pSelect;..  as
9330: 73 65 72 74 28 20 2a 70 62 46 6f 75 6e 64 3d 3d  sert( *pbFound==
9340: 30 20 29 3b 0a 20 20 69 66 28 20 2a 70 52 43 20  0 );.  if( *pRC 
9350: 29 20 72 65 74 75 72 6e 3b 0a 20 20 72 63 20 3d  ) return;.  rc =
9360: 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
9370: 53 51 4c 5f 53 45 4c 45 43 54 5f 43 4f 4e 54 45  SQL_SELECT_CONTE
9380: 4e 54 5f 42 59 5f 52 4f 57 49 44 2c 20 26 70 53  NT_BY_ROWID, &pS
9390: 65 6c 65 63 74 2c 20 26 70 52 6f 77 69 64 29 3b  elect, &pRowid);
93a0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
93b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
93c0: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
93d0: 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74  te3_step(pSelect
93e0: 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
93f0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 61 6e  ;.      int iLan
9400: 67 69 64 20 3d 20 6c 61 6e 67 69 64 46 72 6f 6d  gid = langidFrom
9410: 53 65 6c 65 63 74 28 70 2c 20 70 53 65 6c 65 63  Select(p, pSelec
9420: 74 29 3b 0a 20 20 20 20 20 20 69 36 34 20 69 44  t);.      i64 iD
9430: 6f 63 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63  ocid = sqlite3_c
9440: 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 65 6c  olumn_int64(pSel
9450: 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ect, 0);.      r
9460: 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54  c = fts3PendingT
9470: 65 72 6d 73 44 6f 63 69 64 28 70 2c 20 31 2c 20  ermsDocid(p, 1, 
9480: 69 4c 61 6e 67 69 64 2c 20 69 44 6f 63 69 64 29  iLangid, iDocid)
9490: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b  ;.      for(i=1;
94a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
94b0: 26 20 69 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b  & i<=p->nColumn;
94c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
94d0: 6e 74 20 69 43 6f 6c 20 3d 20 69 2d 31 3b 0a 20  nt iCol = i-1;. 
94e0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 62         if( p->ab
94f0: 4e 6f 74 69 6e 64 65 78 65 64 5b 69 43 6f 6c 5d  Notindexed[iCol]
9500: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
9510: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
9520: 78 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  xt = (const char
9530: 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   *)sqlite3_colum
9540: 6e 5f 74 65 78 74 28 70 53 65 6c 65 63 74 2c 20  n_text(pSelect, 
9550: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  i);.          rc
9560: 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65   = fts3PendingTe
9570: 72 6d 73 41 64 64 28 70 2c 20 69 4c 61 6e 67 69  rmsAdd(p, iLangi
9580: 64 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26 61  d, zText, -1, &a
9590: 53 7a 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20 20 20  Sz[iCol]);.     
95a0: 20 20 20 20 20 61 53 7a 5b 70 2d 3e 6e 43 6f 6c       aSz[p->nCol
95b0: 75 6d 6e 5d 20 2b 3d 20 73 71 6c 69 74 65 33 5f  umn] += sqlite3_
95c0: 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 65  column_bytes(pSe
95d0: 6c 65 63 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  lect, i);.      
95e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
95f0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
9600: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
9610: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 65  qlite3_reset(pSe
9620: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 2a  lect);.        *
9630: 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  pRC = rc;.      
9640: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
9650: 7d 0a 20 20 20 20 20 20 2a 70 62 46 6f 75 6e 64  }.      *pbFound
9660: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
9670: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
9680: 65 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  et(pSelect);.  }
9690: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
96a0: 33 5f 72 65 73 65 74 28 70 53 65 6c 65 63 74 29  3_reset(pSelect)
96b0: 3b 0a 20 20 7d 0a 20 20 2a 70 52 43 20 3d 20 72  ;.  }.  *pRC = r
96c0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77  c;.}../*.** Forw
96d0: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
96e0: 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74  to account for t
96f0: 68 65 20 63 69 72 63 75 6c 61 72 20 64 65 70 65  he circular depe
9700: 6e 64 65 6e 63 79 20 62 65 74 77 65 65 6e 0a 2a  ndency between.*
9710: 2a 20 66 75 6e 63 74 69 6f 6e 73 20 66 74 73 33  * functions fts3
9720: 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 29 20 61  SegmentMerge() a
9730: 6e 64 20 66 74 73 33 41 6c 6c 6f 63 61 74 65 53  nd fts3AllocateS
9740: 65 67 64 69 72 49 64 78 28 29 2e 0a 2a 2f 0a 73  egdirIdx()..*/.s
9750: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65  tatic int fts3Se
9760: 67 6d 65 6e 74 4d 65 72 67 65 28 46 74 73 33 54  gmentMerge(Fts3T
9770: 61 62 6c 65 20 2a 2c 20 69 6e 74 2c 20 69 6e 74  able *, int, int
9780: 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 20 0a 2a 2a 20  , int);../* .** 
9790: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
97a0: 6c 6f 63 61 74 65 73 20 61 20 6e 65 77 20 6c 65  locates a new le
97b0: 76 65 6c 20 69 4c 65 76 65 6c 20 69 6e 64 65 78  vel iLevel index
97c0: 20 69 6e 20 74 68 65 20 73 65 67 64 69 72 20 74   in the segdir t
97d0: 61 62 6c 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79  able..** Usually
97e0: 2c 20 69 6e 64 65 78 65 73 20 61 72 65 20 61 6c  , indexes are al
97f0: 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 61  located within a
9800: 20 6c 65 76 65 6c 20 73 65 71 75 65 6e 74 69 61   level sequentia
9810: 6c 6c 79 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20  lly starting.** 
9820: 77 69 74 68 20 30 2c 20 73 6f 20 74 68 65 20 61  with 0, so the a
9830: 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78 20 69  llocated index i
9840: 73 20 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68  s one greater th
9850: 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  an the value ret
9860: 75 72 6e 65 64 0a 2a 2a 20 62 79 3a 0a 2a 2a 0a  urned.** by:.**.
9870: 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28  **   SELECT max(
9880: 69 64 78 29 20 46 52 4f 4d 20 25 5f 73 65 67 64  idx) FROM %_segd
9890: 69 72 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d  ir WHERE level =
98a0: 20 3a 69 4c 65 76 65 6c 0a 2a 2a 0a 2a 2a 20 48   :iLevel.**.** H
98b0: 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 72 65  owever, if there
98c0: 20 61 72 65 20 61 6c 72 65 61 64 79 20 46 54 53   are already FTS
98d0: 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 20 69 6e  3_MERGE_COUNT in
98e0: 64 65 78 65 73 20 61 74 20 74 68 65 20 72 65 71  dexes at the req
98f0: 75 65 73 74 65 64 0a 2a 2a 20 6c 65 76 65 6c 2c  uested.** level,
9900: 20 74 68 65 79 20 61 72 65 20 6d 65 72 67 65 64   they are merged
9910: 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6c   into a single l
9920: 65 76 65 6c 20 28 69 4c 65 76 65 6c 2b 31 29 20  evel (iLevel+1) 
9930: 73 65 67 6d 65 6e 74 20 61 6e 64 20 74 68 65 20  segment and the 
9940: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  .** allocated in
9950: 64 65 78 20 69 73 20 30 2e 0a 2a 2a 0a 2a 2a 20  dex is 0..**.** 
9960: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a  If successful, *
9970: 70 69 49 64 78 20 69 73 20 73 65 74 20 74 6f 20  piIdx is set to 
9980: 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  the allocated in
9990: 64 65 78 20 73 6c 6f 74 20 61 6e 64 20 53 51 4c  dex slot and SQL
99a0: 49 54 45 5f 4f 4b 0a 2a 2a 20 72 65 74 75 72 6e  ITE_OK.** return
99b0: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ed. Otherwise, a
99c0: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
99d0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
99e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
99f0: 74 73 33 41 6c 6c 6f 63 61 74 65 53 65 67 64 69  ts3AllocateSegdi
9a00: 72 49 64 78 28 0a 20 20 46 74 73 33 54 61 62 6c  rIdx(.  Fts3Tabl
9a10: 65 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 4c 61  e *p, .  int iLa
9a20: 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  ngid,           
9a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67           /* Lang
9a40: 75 61 67 65 20 69 64 20 2a 2f 0a 20 20 69 6e 74  uage id */.  int
9a50: 20 69 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20   iIndex,        
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9a70: 49 6e 64 65 78 20 66 6f 72 20 70 2d 3e 61 49 6e  Index for p->aIn
9a80: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  dex */.  int iLe
9a90: 76 65 6c 2c 20 0a 20 20 69 6e 74 20 2a 70 69 49  vel, .  int *piI
9aa0: 64 78 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  dx.){.  int rc; 
9ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ac0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
9ad0: 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n Code */.  sqli
9ae0: 74 65 33 5f 73 74 6d 74 20 2a 70 4e 65 78 74 49  te3_stmt *pNextI
9af0: 64 78 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 51  dx;         /* Q
9b00: 75 65 72 79 20 66 6f 72 20 6e 65 78 74 20 69 64  uery for next id
9b10: 78 20 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65  x at level iLeve
9b20: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 78 74  l */.  int iNext
9b30: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9b40: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
9b50: 20 6f 66 20 71 75 65 72 79 20 70 4e 65 78 74 49   of query pNextI
9b60: 64 78 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  dx */..  assert(
9b70: 20 69 4c 61 6e 67 69 64 3e 3d 30 20 29 3b 0a 20   iLangid>=0 );. 
9b80: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 49 6e 64   assert( p->nInd
9b90: 65 78 3e 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 53  ex>=1 );..  /* S
9ba0: 65 74 20 76 61 72 69 61 62 6c 65 20 69 4e 65 78  et variable iNex
9bb0: 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 61 76  t to the next av
9bc0: 61 69 6c 61 62 6c 65 20 73 65 67 64 69 72 20 69  ailable segdir i
9bd0: 6e 64 65 78 20 61 74 20 6c 65 76 65 6c 20 69 4c  ndex at level iL
9be0: 65 76 65 6c 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  evel. */.  rc = 
9bf0: 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
9c00: 51 4c 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54 5f  QL_NEXT_SEGMENT_
9c10: 49 4e 44 45 58 2c 20 26 70 4e 65 78 74 49 64 78  INDEX, &pNextIdx
9c20: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
9c30: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9c40: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
9c50: 74 36 34 28 0a 20 20 20 20 20 20 20 20 70 4e 65  t64(.        pNe
9c60: 78 74 49 64 78 2c 20 31 2c 20 67 65 74 41 62 73  xtIdx, 1, getAbs
9c70: 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c  oluteLevel(p, iL
9c80: 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69  angid, iIndex, i
9c90: 4c 65 76 65 6c 29 0a 20 20 20 20 29 3b 0a 20 20  Level).    );.  
9ca0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
9cb0: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
9cc0: 4e 65 78 74 49 64 78 29 20 29 7b 0a 20 20 20 20  NextIdx) ){.    
9cd0: 20 20 69 4e 65 78 74 20 3d 20 73 71 6c 69 74 65    iNext = sqlite
9ce0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 4e 65  3_column_int(pNe
9cf0: 78 74 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 7d  xtIdx, 0);.    }
9d00: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
9d10: 33 5f 72 65 73 65 74 28 70 4e 65 78 74 49 64 78  3_reset(pNextIdx
9d20: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
9d30: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
9d40: 20 20 20 2f 2a 20 49 66 20 69 4e 65 78 74 20 69     /* If iNext i
9d50: 73 20 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55  s FTS3_MERGE_COU
9d60: 4e 54 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  NT, indicating t
9d70: 68 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c  hat level iLevel
9d80: 20 69 73 20 61 6c 72 65 61 64 79 0a 20 20 20 20   is already.    
9d90: 2a 2a 20 66 75 6c 6c 2c 20 6d 65 72 67 65 20 61  ** full, merge a
9da0: 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6c  ll segments in l
9db0: 65 76 65 6c 20 69 4c 65 76 65 6c 20 69 6e 74 6f  evel iLevel into
9dc0: 20 61 20 73 69 6e 67 6c 65 20 69 4c 65 76 65 6c   a single iLevel
9dd0: 2b 31 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e  +1.    ** segmen
9de0: 74 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 28  t and allocate (
9df0: 6e 65 77 6c 79 20 66 72 65 65 64 29 20 69 6e 64  newly freed) ind
9e00: 65 78 20 30 20 61 74 20 6c 65 76 65 6c 20 69 4c  ex 0 at level iL
9e10: 65 76 65 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c  evel. Otherwise,
9e20: 0a 20 20 20 20 2a 2a 20 69 66 20 69 4e 65 78 74  .    ** if iNext
9e30: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 46 54   is less than FT
9e40: 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 2c 20  S3_MERGE_COUNT, 
9e50: 61 6c 6c 6f 63 61 74 65 20 69 6e 64 65 78 20 69  allocate index i
9e60: 4e 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Next..    */.   
9e70: 20 69 66 28 20 69 4e 65 78 74 3e 3d 46 54 53 33   if( iNext>=FTS3
9e80: 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 20 29 7b 0a  _MERGE_COUNT ){.
9e90: 20 20 20 20 20 20 66 74 73 33 4c 6f 67 4d 65 72        fts3LogMer
9ea0: 67 65 28 31 36 2c 20 67 65 74 41 62 73 6f 6c 75  ge(16, getAbsolu
9eb0: 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67  teLevel(p, iLang
9ec0: 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65 76  id, iIndex, iLev
9ed0: 65 6c 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  el));.      rc =
9ee0: 20 66 74 73 33 53 65 67 6d 65 6e 74 4d 65 72 67   fts3SegmentMerg
9ef0: 65 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49  e(p, iLangid, iI
9f00: 6e 64 65 78 2c 20 69 4c 65 76 65 6c 29 3b 0a 20  ndex, iLevel);. 
9f10: 20 20 20 20 20 2a 70 69 49 64 78 20 3d 20 30 3b       *piIdx = 0;
9f20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9f30: 20 20 2a 70 69 49 64 78 20 3d 20 69 4e 65 78 74    *piIdx = iNext
9f40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
9f50: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
9f60: 2a 2a 20 54 68 65 20 25 5f 73 65 67 6d 65 6e 74  ** The %_segment
9f70: 73 20 74 61 62 6c 65 20 69 73 20 64 65 63 6c 61  s table is decla
9f80: 72 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  red as follows:.
9f90: 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54  **.**   CREATE T
9fa0: 41 42 4c 45 20 25 5f 73 65 67 6d 65 6e 74 73 28  ABLE %_segments(
9fb0: 62 6c 6f 63 6b 69 64 20 49 4e 54 45 47 45 52 20  blockid INTEGER 
9fc0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f  PRIMARY KEY, blo
9fd0: 63 6b 20 42 4c 4f 42 29 0a 2a 2a 0a 2a 2a 20 54  ck BLOB).**.** T
9fe0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61  his function rea
9ff0: 64 73 20 64 61 74 61 20 66 72 6f 6d 20 61 20 73  ds data from a s
a000: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
a010: 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c   %_segments tabl
a020: 65 2e 20 54 68 65 0a 2a 2a 20 73 70 65 63 69 66  e. The.** specif
a030: 69 63 20 72 6f 77 20 69 73 20 69 64 65 6e 74 69  ic row is identi
a040: 66 69 65 64 20 62 79 20 74 68 65 20 69 42 6c 6f  fied by the iBlo
a050: 63 6b 69 64 20 70 61 72 61 6d 65 74 65 72 2e 20  ckid parameter. 
a060: 49 66 20 70 61 42 6c 6f 62 20 69 73 20 6e 6f 74  If paBlob is not
a070: 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 61  .** NULL, then a
a080: 20 62 75 66 66 65 72 20 69 73 20 61 6c 6c 6f 63   buffer is alloc
a090: 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ated using sqlit
a0a0: 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  e3_malloc() and 
a0b0: 70 6f 70 75 6c 61 74 65 64 0a 2a 2a 20 77 69 74  populated.** wit
a0c0: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  h the contents o
a0d0: 66 20 74 68 65 20 62 6c 6f 62 20 73 74 6f 72 65  f the blob store
a0e0: 64 20 69 6e 20 74 68 65 20 22 62 6c 6f 63 6b 22  d in the "block"
a0f0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 0a   column of the .
a100: 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20 74 61  ** identified ta
a110: 62 6c 65 20 72 6f 77 20 69 73 2e 20 57 68 65 74  ble row is. Whet
a120: 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 42 6c 6f  her or not paBlo
a130: 62 20 69 73 20 4e 55 4c 4c 2c 20 2a 70 6e 42 6c  b is NULL, *pnBl
a140: 6f 62 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f 20  ob is set.** to 
a150: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
a160: 62 6c 6f 62 20 69 6e 20 62 79 74 65 73 20 62 65  blob in bytes be
a170: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
a180: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
a190: 72 20 6f 63 63 75 72 73 2c 20 6f 72 20 74 68 65  r occurs, or the
a1a0: 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20   table does not 
a1b0: 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 70 65 63  contain the spec
a1c0: 69 66 69 65 64 20 72 6f 77 2c 0a 2a 2a 20 61 6e  ified row,.** an
a1d0: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
a1e0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
a1f0: 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
a200: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
a210: 2e 20 49 66 0a 2a 2a 20 70 61 42 6c 6f 62 20 69  . If.** paBlob i
a220: 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e  s non-NULL, then
a230: 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   it is the respo
a240: 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
a250: 20 63 61 6c 6c 65 72 20 74 6f 0a 2a 2a 20 65 76   caller to.** ev
a260: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68  entually free th
a270: 65 20 72 65 74 75 72 6e 65 64 20 62 75 66 66 65  e returned buffe
a280: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
a290: 6e 63 74 69 6f 6e 20 6d 61 79 20 6c 65 61 76 65  nction may leave
a2a0: 20 61 6e 20 6f 70 65 6e 20 73 71 6c 69 74 65 33   an open sqlite3
a2b0: 5f 62 6c 6f 62 2a 20 68 61 6e 64 6c 65 20 69 6e  _blob* handle in
a2c0: 20 74 68 65 0a 2a 2a 20 46 74 73 33 54 61 62 6c   the.** Fts3Tabl
a2d0: 65 2e 70 53 65 67 6d 65 6e 74 73 20 76 61 72 69  e.pSegments vari
a2e0: 61 62 6c 65 2e 20 54 68 69 73 20 68 61 6e 64 6c  able. This handl
a2f0: 65 20 69 73 20 72 65 75 73 65 64 20 62 79 20 73  e is reused by s
a300: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 0a  ubsequent calls.
a310: 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ** to this funct
a320: 69 6f 6e 2e 20 54 68 65 20 68 61 6e 64 6c 65 20  ion. The handle 
a330: 6d 61 79 20 62 65 20 63 6c 6f 73 65 64 20 62 79  may be closed by
a340: 20 63 61 6c 6c 69 6e 67 20 74 68 65 0a 2a 2a 20   calling the.** 
a350: 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 6d 65  sqlite3Fts3Segme
a360: 6e 74 73 43 6c 6f 73 65 28 29 20 66 75 6e 63 74  ntsClose() funct
a370: 69 6f 6e 2e 20 52 65 75 73 69 6e 67 20 61 20 62  ion. Reusing a b
a380: 6c 6f 62 20 68 61 6e 64 6c 65 20 69 73 20 61 20  lob handle is a 
a390: 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d  handy.** perform
a3a0: 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74  ance improvement
a3b0: 2c 20 62 75 74 20 74 68 65 20 62 6c 6f 62 20 68  , but the blob h
a3c0: 61 6e 64 6c 65 20 73 68 6f 75 6c 64 20 61 6c 77  andle should alw
a3d0: 61 79 73 20 62 65 20 63 6c 6f 73 65 64 0a 2a 2a  ays be closed.**
a3e0: 20 62 65 66 6f 72 65 20 63 6f 6e 74 72 6f 6c 20   before control 
a3f0: 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
a400: 68 65 20 75 73 65 72 20 28 74 6f 20 70 72 65 76  he user (to prev
a410: 65 6e 74 20 61 20 6c 6f 63 6b 20 62 65 69 6e 67  ent a lock being
a420: 20 68 65 6c 64 0a 2a 2a 20 6f 6e 20 74 68 65 20   held.** on the 
a430: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
a440: 72 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 65  r longer than ne
a450: 63 65 73 73 61 72 79 29 2e 20 54 68 75 73 2c 20  cessary). Thus, 
a460: 61 6e 79 20 76 69 72 74 75 61 6c 20 74 61 62 6c  any virtual tabl
a470: 65 0a 2a 2a 20 6d 65 74 68 6f 64 20 28 78 46 69  e.** method (xFi
a480: 6c 74 65 72 20 65 74 63 2e 29 20 74 68 61 74 20  lter etc.) that 
a490: 6d 61 79 20 64 69 72 65 63 74 6c 79 20 6f 72 20  may directly or 
a4a0: 69 6e 64 69 72 65 63 74 6c 79 20 63 61 6c 6c 20  indirectly call 
a4b0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
a4c0: 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74   must call sqlit
a4d0: 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73 43 6c  e3Fts3SegmentsCl
a4e0: 6f 73 65 28 29 20 62 65 66 6f 72 65 20 72 65 74  ose() before ret
a4f0: 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  urning..*/.int s
a500: 71 6c 69 74 65 33 46 74 73 33 52 65 61 64 42 6c  qlite3Fts3ReadBl
a510: 6f 63 6b 28 0a 20 20 46 74 73 33 54 61 62 6c 65  ock(.  Fts3Table
a520: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
a530: 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74         /* FTS3 t
a540: 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
a550: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
a560: 42 6c 6f 63 6b 69 64 2c 20 20 20 20 20 20 20 20  Blockid,        
a570: 20 2f 2a 20 41 63 63 65 73 73 20 74 68 65 20 72   /* Access the r
a580: 6f 77 20 77 69 74 68 20 62 6c 6f 63 6b 69 64 3d  ow with blockid=
a590: 24 69 42 6c 6f 63 6b 69 64 20 2a 2f 0a 20 20 63  $iBlockid */.  c
a5a0: 68 61 72 20 2a 2a 70 61 42 6c 6f 62 2c 20 20 20  har **paBlob,   
a5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a5c0: 2a 20 4f 55 54 3a 20 42 6c 6f 62 20 64 61 74 61  * OUT: Blob data
a5d0: 20 69 6e 20 6d 61 6c 6c 6f 63 27 64 20 62 75 66   in malloc'd buf
a5e0: 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  fer */.  int *pn
a5f0: 42 6c 6f 62 2c 20 20 20 20 20 20 20 20 20 20 20  Blob,           
a600: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
a610: 20 53 69 7a 65 20 6f 66 20 62 6c 6f 62 20 64 61   Size of blob da
a620: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c  ta */.  int *pnL
a630: 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 20 20  oad             
a640: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
a650: 42 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 6c  Bytes actually l
a660: 6f 61 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  oaded */.){.  in
a670: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
a680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a690: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
a6a0: 0a 20 20 2f 2a 20 70 6e 42 6c 6f 62 20 6d 75 73  .  /* pnBlob mus
a6b0: 74 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 70  t be non-NULL. p
a6c0: 61 42 6c 6f 62 20 6d 61 79 20 62 65 20 4e 55 4c  aBlob may be NUL
a6d0: 4c 20 6f 72 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 2a  L or non-NULL. *
a6e0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 6e 42 6c  /.  assert( pnBl
a6f0: 6f 62 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  ob );..  if( p->
a700: 70 53 65 67 6d 65 6e 74 73 20 29 7b 0a 20 20 20  pSegments ){.   
a710: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
a720: 6f 62 5f 72 65 6f 70 65 6e 28 70 2d 3e 70 53 65  ob_reopen(p->pSe
a730: 67 6d 65 6e 74 73 2c 20 69 42 6c 6f 63 6b 69 64  gments, iBlockid
a740: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
a750: 69 66 28 20 30 3d 3d 70 2d 3e 7a 53 65 67 6d 65  if( 0==p->zSegme
a760: 6e 74 73 54 62 6c 20 29 7b 0a 20 20 20 20 20 20  ntsTbl ){.      
a770: 70 2d 3e 7a 53 65 67 6d 65 6e 74 73 54 62 6c 20  p->zSegmentsTbl 
a780: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
a790: 66 28 22 25 73 5f 73 65 67 6d 65 6e 74 73 22 2c  f("%s_segments",
a7a0: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20   p->zName);.    
a7b0: 20 20 69 66 28 20 30 3d 3d 70 2d 3e 7a 53 65 67    if( 0==p->zSeg
a7c0: 6d 65 6e 74 73 54 62 6c 20 29 20 72 65 74 75 72  mentsTbl ) retur
a7d0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
a7e0: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
a7f0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e  qlite3_blob_open
a800: 28 0a 20 20 20 20 20 20 20 70 2d 3e 64 62 2c 20  (.       p->db, 
a810: 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 53 65 67 6d  p->zDb, p->zSegm
a820: 65 6e 74 73 54 62 6c 2c 20 22 62 6c 6f 63 6b 22  entsTbl, "block"
a830: 2c 20 69 42 6c 6f 63 6b 69 64 2c 20 30 2c 20 26  , iBlockid, 0, &
a840: 70 2d 3e 70 53 65 67 6d 65 6e 74 73 0a 20 20 20  p->pSegments.   
a850: 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72   );.  }..  if( r
a860: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
a870: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
a880: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74  sqlite3_blob_byt
a890: 65 73 28 70 2d 3e 70 53 65 67 6d 65 6e 74 73 29  es(p->pSegments)
a8a0: 3b 0a 20 20 20 20 2a 70 6e 42 6c 6f 62 20 3d 20  ;.    *pnBlob = 
a8b0: 6e 42 79 74 65 3b 0a 20 20 20 20 69 66 28 20 70  nByte;.    if( p
a8c0: 61 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 63  aBlob ){.      c
a8d0: 68 61 72 20 2a 61 42 79 74 65 20 3d 20 73 71 6c  har *aByte = sql
a8e0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74  ite3_malloc(nByt
a8f0: 65 20 2b 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41  e + FTS3_NODE_PA
a900: 44 44 49 4e 47 29 3b 0a 20 20 20 20 20 20 69 66  DDING);.      if
a910: 28 20 21 61 42 79 74 65 20 29 7b 0a 20 20 20 20  ( !aByte ){.    
a920: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
a930: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c  NOMEM;.      }el
a940: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
a950: 70 6e 4c 6f 61 64 20 26 26 20 6e 42 79 74 65 3e  pnLoad && nByte>
a960: 28 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b  (FTS3_NODE_CHUNK
a970: 5f 54 48 52 45 53 48 4f 4c 44 29 20 29 7b 0a 20  _THRESHOLD) ){. 
a980: 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 20 3d           nByte =
a990: 20 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b   FTS3_NODE_CHUNK
a9a0: 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 20 20  SIZE;.          
a9b0: 2a 70 6e 4c 6f 61 64 20 3d 20 6e 42 79 74 65 3b  *pnLoad = nByte;
a9c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a9d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
a9e0: 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70 53 65  blob_read(p->pSe
a9f0: 67 6d 65 6e 74 73 2c 20 61 42 79 74 65 2c 20 6e  gments, aByte, n
aa00: 42 79 74 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Byte, 0);.      
aa10: 20 20 6d 65 6d 73 65 74 28 26 61 42 79 74 65 5b    memset(&aByte[
aa20: 6e 42 79 74 65 5d 2c 20 30 2c 20 46 54 53 33 5f  nByte], 0, FTS3_
aa30: 4e 4f 44 45 5f 50 41 44 44 49 4e 47 29 3b 0a 20  NODE_PADDING);. 
aa40: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
aa50: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
aa60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
aa70: 65 65 28 61 42 79 74 65 29 3b 0a 20 20 20 20 20  ee(aByte);.     
aa80: 20 20 20 20 20 61 42 79 74 65 20 3d 20 30 3b 0a       aByte = 0;.
aa90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
aaa0: 7d 0a 20 20 20 20 20 20 2a 70 61 42 6c 6f 62 20  }.      *paBlob 
aab0: 3d 20 61 42 79 74 65 3b 0a 20 20 20 20 7d 0a 20  = aByte;.    }. 
aac0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
aad0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
aae0: 74 68 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20  the blob handle 
aaf0: 61 74 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73 2c  at p->pSegments,
ab00: 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 2e 20   if it is open. 
ab10: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
ab20: 76 65 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  ve.** the sqlite
ab30: 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28 29  3Fts3ReadBlock()
ab40: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 65   function for de
ab50: 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tails..*/.void s
ab60: 71 6c 69 74 65 33 46 74 73 33 53 65 67 6d 65 6e  qlite3Fts3Segmen
ab70: 74 73 43 6c 6f 73 65 28 46 74 73 33 54 61 62 6c  tsClose(Fts3Tabl
ab80: 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
ab90: 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d 3e 70  _blob_close(p->p
aba0: 53 65 67 6d 65 6e 74 73 29 3b 0a 20 20 70 2d 3e  Segments);.  p->
abb0: 70 53 65 67 6d 65 6e 74 73 20 3d 20 30 3b 0a 7d  pSegments = 0;.}
abc0: 0a 20 20 20 20 0a 73 74 61 74 69 63 20 69 6e 74  .    .static int
abd0: 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49 6e   fts3SegReaderIn
abe0: 63 72 52 65 61 64 28 46 74 73 33 53 65 67 52 65  crRead(Fts3SegRe
abf0: 61 64 65 72 20 2a 70 52 65 61 64 65 72 29 7b 0a  ader *pReader){.
ac00: 20 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20    int nRead;    
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
ac30: 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a  ytes to read */.
ac40: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
ac50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac60: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
ac70: 20 2a 2f 0a 0a 20 20 6e 52 65 61 64 20 3d 20 4d   */..  nRead = M
ac80: 49 4e 28 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64  IN(pReader->nNod
ac90: 65 20 2d 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f  e - pReader->nPo
aca0: 70 75 6c 61 74 65 2c 20 46 54 53 33 5f 4e 4f 44  pulate, FTS3_NOD
acb0: 45 5f 43 48 55 4e 4b 53 49 5a 45 29 3b 0a 20 20  E_CHUNKSIZE);.  
acc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
acd0: 62 5f 72 65 61 64 28 0a 20 20 20 20 20 20 70 52  b_read(.      pR
ace0: 65 61 64 65 72 2d 3e 70 42 6c 6f 62 2c 20 0a 20  eader->pBlob, . 
acf0: 20 20 20 20 20 26 70 52 65 61 64 65 72 2d 3e 61       &pReader->a
ad00: 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e 50  Node[pReader->nP
ad10: 6f 70 75 6c 61 74 65 5d 2c 0a 20 20 20 20 20 20  opulate],.      
ad20: 6e 52 65 61 64 2c 0a 20 20 20 20 20 20 70 52 65  nRead,.      pRe
ad30: 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 0a  ader->nPopulate.
ad40: 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d    );..  if( rc==
ad50: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ad60: 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c   pReader->nPopul
ad70: 61 74 65 20 2b 3d 20 6e 52 65 61 64 3b 0a 20 20  ate += nRead;.  
ad80: 20 20 6d 65 6d 73 65 74 28 26 70 52 65 61 64 65    memset(&pReade
ad90: 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65 72  r->aNode[pReader
ada0: 2d 3e 6e 50 6f 70 75 6c 61 74 65 5d 2c 20 30 2c  ->nPopulate], 0,
adb0: 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49   FTS3_NODE_PADDI
adc0: 4e 47 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65  NG);.    if( pRe
add0: 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 3d  ader->nPopulate=
ade0: 3d 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 20  =pReader->nNode 
adf0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ae00: 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61  _blob_close(pRea
ae10: 64 65 72 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 20  der->pBlob);.   
ae20: 20 20 20 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f     pReader->pBlo
ae30: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 52 65  b = 0;.      pRe
ae40: 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 20  ader->nPopulate 
ae50: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
ae60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
ae70: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65  tatic int fts3Se
ae80: 67 52 65 61 64 65 72 52 65 71 75 69 72 65 28 46  gReaderRequire(F
ae90: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 52  ts3SegReader *pR
aea0: 65 61 64 65 72 2c 20 63 68 61 72 20 2a 70 46 72  eader, char *pFr
aeb0: 6f 6d 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a  om, int nByte){.
aec0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
aed0: 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
aee0: 21 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 20  !pReader->pBlob 
aef0: 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 46 72 6f  .       || (pFro
af00: 6d 3e 3d 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64  m>=pReader->aNod
af10: 65 20 26 26 20 70 46 72 6f 6d 3c 26 70 52 65 61  e && pFrom<&pRea
af20: 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64  der->aNode[pRead
af30: 65 72 2d 3e 6e 4e 6f 64 65 5d 29 0a 20 20 29 3b  er->nNode]).  );
af40: 0a 20 20 77 68 69 6c 65 28 20 70 52 65 61 64 65  .  while( pReade
af50: 72 2d 3e 70 42 6c 6f 62 20 26 26 20 72 63 3d 3d  r->pBlob && rc==
af60: 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20  SQLITE_OK .     
af70: 26 26 20 20 28 70 46 72 6f 6d 20 2d 20 70 52 65  &&  (pFrom - pRe
af80: 61 64 65 72 2d 3e 61 4e 6f 64 65 20 2b 20 6e 42  ader->aNode + nB
af90: 79 74 65 29 3e 70 52 65 61 64 65 72 2d 3e 6e 50  yte)>pReader->nP
afa0: 6f 70 75 6c 61 74 65 0a 20 20 29 7b 0a 20 20 20  opulate.  ){.   
afb0: 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61   rc = fts3SegRea
afc0: 64 65 72 49 6e 63 72 52 65 61 64 28 70 52 65 61  derIncrRead(pRea
afd0: 64 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  der);.  }.  retu
afe0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
aff0: 53 65 74 20 61 6e 20 46 74 73 33 53 65 67 52 65  Set an Fts3SegRe
b000: 61 64 65 72 20 63 75 72 73 6f 72 20 74 6f 20 70  ader cursor to p
b010: 6f 69 6e 74 20 61 74 20 45 4f 46 2e 0a 2a 2f 0a  oint at EOF..*/.
b020: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
b030: 53 65 67 52 65 61 64 65 72 53 65 74 45 6f 66 28  SegReaderSetEof(
b040: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
b050: 53 65 67 29 7b 0a 20 20 69 66 28 20 21 66 74 73  Seg){.  if( !fts
b060: 33 53 65 67 52 65 61 64 65 72 49 73 52 6f 6f 74  3SegReaderIsRoot
b070: 4f 6e 6c 79 28 70 53 65 67 29 20 29 7b 0a 20 20  Only(pSeg) ){.  
b080: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
b090: 53 65 67 2d 3e 61 4e 6f 64 65 29 3b 0a 20 20 20  Seg->aNode);.   
b0a0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c   sqlite3_blob_cl
b0b0: 6f 73 65 28 70 53 65 67 2d 3e 70 42 6c 6f 62 29  ose(pSeg->pBlob)
b0c0: 3b 0a 20 20 20 20 70 53 65 67 2d 3e 70 42 6c 6f  ;.    pSeg->pBlo
b0d0: 62 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 53 65  b = 0;.  }.  pSe
b0e0: 67 2d 3e 61 4e 6f 64 65 20 3d 20 30 3b 0a 7d 0a  g->aNode = 0;.}.
b0f0: 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
b100: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
b110: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
b120: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e 65 78  ument to the nex
b130: 74 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a  t term in the.**
b140: 20 73 65 67 6d 65 6e 74 2e 20 49 66 20 73 75 63   segment. If suc
b150: 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
b160: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
b170: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  If there is no n
b180: 65 78 74 20 74 65 72 6d 2c 0a 2a 2a 20 53 51 4c  ext term,.** SQL
b190: 49 54 45 5f 44 4f 4e 45 2e 20 4f 74 68 65 72 77  ITE_DONE. Otherw
b1a0: 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ise, an SQLite e
b1b0: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
b1c0: 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67  atic int fts3Seg
b1d0: 52 65 61 64 65 72 4e 65 78 74 28 0a 20 20 46 74  ReaderNext(.  Ft
b1e0: 73 33 54 61 62 6c 65 20 2a 70 2c 20 0a 20 20 46  s3Table *p, .  F
b1f0: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 52  ts3SegReader *pR
b200: 65 61 64 65 72 2c 0a 20 20 69 6e 74 20 62 49 6e  eader,.  int bIn
b210: 63 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  cr.){.  int rc; 
b220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b230: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
b240: 6e 20 63 6f 64 65 20 6f 66 20 76 61 72 69 6f 75  n code of variou
b250: 73 20 73 75 62 2d 72 6f 75 74 69 6e 65 73 20 2a  s sub-routines *
b260: 2f 0a 20 20 63 68 61 72 20 2a 70 4e 65 78 74 3b  /.  char *pNext;
b270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b280: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 76 61      /* Cursor va
b290: 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  riable */.  int 
b2a0: 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20 20 20  nPrefix;        
b2b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b2c0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
b2d0: 6e 20 74 65 72 6d 20 70 72 65 66 69 78 20 2a 2f  n term prefix */
b2e0: 0a 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 20  .  int nSuffix; 
b2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b300: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b310: 62 79 74 65 73 20 69 6e 20 74 65 72 6d 20 73 75  bytes in term su
b320: 66 66 69 78 20 2a 2f 0a 0a 20 20 69 66 28 20 21  ffix */..  if( !
b330: 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73  pReader->aDoclis
b340: 74 20 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  t ){.    pNext =
b350: 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 3b   pReader->aNode;
b360: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
b370: 65 78 74 20 3d 20 26 70 52 65 61 64 65 72 2d 3e  ext = &pReader->
b380: 61 44 6f 63 6c 69 73 74 5b 70 52 65 61 64 65 72  aDoclist[pReader
b390: 2d 3e 6e 44 6f 63 6c 69 73 74 5d 3b 0a 20 20 7d  ->nDoclist];.  }
b3a0: 0a 0a 20 20 69 66 28 20 21 70 4e 65 78 74 20 7c  ..  if( !pNext |
b3b0: 7c 20 70 4e 65 78 74 3e 3d 26 70 52 65 61 64 65  | pNext>=&pReade
b3c0: 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65 72  r->aNode[pReader
b3d0: 2d 3e 6e 4e 6f 64 65 5d 20 29 7b 0a 0a 20 20 20  ->nNode] ){..   
b3e0: 20 69 66 28 20 66 74 73 33 53 65 67 52 65 61 64   if( fts3SegRead
b3f0: 65 72 49 73 50 65 6e 64 69 6e 67 28 70 52 65 61  erIsPending(pRea
b400: 64 65 72 29 20 29 7b 0a 20 20 20 20 20 20 46 74  der) ){.      Ft
b410: 73 33 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65  s3HashElem *pEle
b420: 6d 20 3d 20 2a 28 70 52 65 61 64 65 72 2d 3e 70  m = *(pReader->p
b430: 70 4e 65 78 74 45 6c 65 6d 29 3b 0a 20 20 20 20  pNextElem);.    
b440: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
b450: 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 29 3b 0a  Reader->aNode);.
b460: 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 61        pReader->a
b470: 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Node = 0;.      
b480: 69 66 28 20 70 45 6c 65 6d 20 29 7b 0a 20 20 20  if( pElem ){.   
b490: 20 20 20 20 20 63 68 61 72 20 2a 61 43 6f 70 79       char *aCopy
b4a0: 3b 0a 20 20 20 20 20 20 20 20 50 65 6e 64 69 6e  ;.        Pendin
b4b0: 67 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 28  gList *pList = (
b4c0: 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 29 66 74  PendingList *)ft
b4d0: 73 33 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  s3HashData(pElem
b4e0: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  );.        int n
b4f0: 43 6f 70 79 20 3d 20 70 4c 69 73 74 2d 3e 6e 44  Copy = pList->nD
b500: 61 74 61 2b 31 3b 0a 20 20 20 20 20 20 20 20 70  ata+1;.        p
b510: 52 65 61 64 65 72 2d 3e 7a 54 65 72 6d 20 3d 20  Reader->zTerm = 
b520: 28 63 68 61 72 20 2a 29 66 74 73 33 48 61 73 68  (char *)fts3Hash
b530: 4b 65 79 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  Key(pElem);.    
b540: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 54 65      pReader->nTe
b550: 72 6d 20 3d 20 66 74 73 33 48 61 73 68 4b 65 79  rm = fts3HashKey
b560: 73 69 7a 65 28 70 45 6c 65 6d 29 3b 0a 20 20 20  size(pElem);.   
b570: 20 20 20 20 20 61 43 6f 70 79 20 3d 20 28 63 68       aCopy = (ch
b580: 61 72 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  ar*)sqlite3_mall
b590: 6f 63 28 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20  oc(nCopy);.     
b5a0: 20 20 20 69 66 28 20 21 61 43 6f 70 79 20 29 20     if( !aCopy ) 
b5b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
b5c0: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  MEM;.        mem
b5d0: 63 70 79 28 61 43 6f 70 79 2c 20 70 4c 69 73 74  cpy(aCopy, pList
b5e0: 2d 3e 61 44 61 74 61 2c 20 6e 43 6f 70 79 29 3b  ->aData, nCopy);
b5f0: 0a 20 20 20 20 20 20 20 20 70 52 65 61 64 65 72  .        pReader
b600: 2d 3e 6e 4e 6f 64 65 20 3d 20 70 52 65 61 64 65  ->nNode = pReade
b610: 72 2d 3e 6e 44 6f 63 6c 69 73 74 20 3d 20 6e 43  r->nDoclist = nC
b620: 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 70 52 65  opy;.        pRe
b630: 61 64 65 72 2d 3e 61 4e 6f 64 65 20 3d 20 70 52  ader->aNode = pR
b640: 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20  eader->aDoclist 
b650: 3d 20 61 43 6f 70 79 3b 0a 20 20 20 20 20 20 20  = aCopy;.       
b660: 20 70 52 65 61 64 65 72 2d 3e 70 70 4e 65 78 74   pReader->ppNext
b670: 45 6c 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Elem++;.        
b680: 61 73 73 65 72 74 28 20 70 52 65 61 64 65 72 2d  assert( pReader-
b690: 3e 61 4e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  >aNode );.      
b6a0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
b6b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
b6c0: 0a 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64  .    fts3SegRead
b6d0: 65 72 53 65 74 45 6f 66 28 70 52 65 61 64 65 72  erSetEof(pReader
b6e0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 69 43  );..    /* If iC
b6f0: 75 72 72 65 6e 74 42 6c 6f 63 6b 3e 3d 69 4c 65  urrentBlock>=iLe
b700: 61 66 45 6e 64 42 6c 6f 63 6b 2c 20 74 68 69 73  afEndBlock, this
b710: 20 69 73 20 61 6e 20 45 4f 46 20 63 6f 6e 64 69   is an EOF condi
b720: 74 69 6f 6e 2e 20 41 6c 6c 20 6c 65 61 66 20 0a  tion. All leaf .
b730: 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 73 20 68 61      ** blocks ha
b740: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
b750: 74 72 61 76 65 72 73 65 64 2e 20 20 2a 2f 0a 20  traversed.  */. 
b760: 20 20 20 61 73 73 65 72 74 28 20 70 52 65 61 64     assert( pRead
b770: 65 72 2d 3e 69 43 75 72 72 65 6e 74 42 6c 6f 63  er->iCurrentBloc
b780: 6b 3c 3d 70 52 65 61 64 65 72 2d 3e 69 4c 65 61  k<=pReader->iLea
b790: 66 45 6e 64 42 6c 6f 63 6b 20 29 3b 0a 20 20 20  fEndBlock );.   
b7a0: 20 69 66 28 20 70 52 65 61 64 65 72 2d 3e 69 43   if( pReader->iC
b7b0: 75 72 72 65 6e 74 42 6c 6f 63 6b 3e 3d 70 52 65  urrentBlock>=pRe
b7c0: 61 64 65 72 2d 3e 69 4c 65 61 66 45 6e 64 42 6c  ader->iLeafEndBl
b7d0: 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ock ){.      ret
b7e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
b7f0: 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 73     }..    rc = s
b800: 71 6c 69 74 65 33 46 74 73 33 52 65 61 64 42 6c  qlite3Fts3ReadBl
b810: 6f 63 6b 28 0a 20 20 20 20 20 20 20 20 70 2c 20  ock(.        p, 
b820: 2b 2b 70 52 65 61 64 65 72 2d 3e 69 43 75 72 72  ++pReader->iCurr
b830: 65 6e 74 42 6c 6f 63 6b 2c 20 26 70 52 65 61 64  entBlock, &pRead
b840: 65 72 2d 3e 61 4e 6f 64 65 2c 20 26 70 52 65 61  er->aNode, &pRea
b850: 64 65 72 2d 3e 6e 4e 6f 64 65 2c 20 0a 20 20 20  der->nNode, .   
b860: 20 20 20 20 20 28 62 49 6e 63 72 20 3f 20 26 70       (bIncr ? &p
b870: 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74  Reader->nPopulat
b880: 65 20 3a 20 30 29 0a 20 20 20 20 29 3b 0a 20 20  e : 0).    );.  
b890: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b8a0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
b8b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65  .    assert( pRe
b8c0: 61 64 65 72 2d 3e 70 42 6c 6f 62 3d 3d 30 20 29  ader->pBlob==0 )
b8d0: 3b 0a 20 20 20 20 69 66 28 20 62 49 6e 63 72 20  ;.    if( bIncr 
b8e0: 26 26 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70  && pReader->nPop
b8f0: 75 6c 61 74 65 3c 70 52 65 61 64 65 72 2d 3e 6e  ulate<pReader->n
b900: 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 70 52  Node ){.      pR
b910: 65 61 64 65 72 2d 3e 70 42 6c 6f 62 20 3d 20 70  eader->pBlob = p
b920: 2d 3e 70 53 65 67 6d 65 6e 74 73 3b 0a 20 20 20  ->pSegments;.   
b930: 20 20 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73 20     p->pSegments 
b940: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
b950: 4e 65 78 74 20 3d 20 70 52 65 61 64 65 72 2d 3e  Next = pReader->
b960: 61 4e 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 61 73  aNode;.  }..  as
b970: 73 65 72 74 28 20 21 66 74 73 33 53 65 67 52 65  sert( !fts3SegRe
b980: 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28 70 52  aderIsPending(pR
b990: 65 61 64 65 72 29 20 29 3b 0a 0a 20 20 72 63 20  eader) );..  rc 
b9a0: 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72 52  = fts3SegReaderR
b9b0: 65 71 75 69 72 65 28 70 52 65 61 64 65 72 2c 20  equire(pReader, 
b9c0: 70 4e 65 78 74 2c 20 46 54 53 33 5f 56 41 52 49  pNext, FTS3_VARI
b9d0: 4e 54 5f 4d 41 58 2a 32 29 3b 0a 20 20 69 66 28  NT_MAX*2);.  if(
b9e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b9f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 0a 20   return rc;.  . 
ba00: 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 74   /* Because of t
ba10: 68 65 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44  he FTS3_NODE_PAD
ba20: 44 49 4e 47 20 62 79 74 65 73 20 6f 66 20 70 61  DING bytes of pa
ba30: 64 64 69 6e 67 2c 20 74 68 65 20 66 6f 6c 6c 6f  dding, the follo
ba40: 77 69 6e 67 20 69 73 20 0a 20 20 2a 2a 20 73 61  wing is .  ** sa
ba50: 66 65 20 28 6e 6f 20 72 69 73 6b 20 6f 66 20 6f  fe (no risk of o
ba60: 76 65 72 72 65 61 64 29 20 65 76 65 6e 20 69 66  verread) even if
ba70: 20 74 68 65 20 6e 6f 64 65 20 64 61 74 61 20 69   the node data i
ba80: 73 20 63 6f 72 72 75 70 74 65 64 2e 20 2a 2f 0a  s corrupted. */.
ba90: 20 20 70 4e 65 78 74 20 2b 3d 20 66 74 73 33 47    pNext += fts3G
baa0: 65 74 56 61 72 69 6e 74 33 32 28 70 4e 65 78 74  etVarint32(pNext
bab0: 2c 20 26 6e 50 72 65 66 69 78 29 3b 0a 20 20 70  , &nPrefix);.  p
bac0: 4e 65 78 74 20 2b 3d 20 66 74 73 33 47 65 74 56  Next += fts3GetV
bad0: 61 72 69 6e 74 33 32 28 70 4e 65 78 74 2c 20 26  arint32(pNext, &
bae0: 6e 53 75 66 66 69 78 29 3b 0a 20 20 69 66 28 20  nSuffix);.  if( 
baf0: 6e 50 72 65 66 69 78 3c 30 20 7c 7c 20 6e 53 75  nPrefix<0 || nSu
bb00: 66 66 69 78 3c 3d 30 20 0a 20 20 20 7c 7c 20 26  ffix<=0 .   || &
bb10: 70 4e 65 78 74 5b 6e 53 75 66 66 69 78 5d 3e 26  pNext[nSuffix]>&
bb20: 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70  pReader->aNode[p
bb30: 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 5d 20 0a  Reader->nNode] .
bb40: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
bb50: 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41 42  FTS_CORRUPT_VTAB
bb60: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 50 72  ;.  }..  if( nPr
bb70: 65 66 69 78 2b 6e 53 75 66 66 69 78 3e 70 52 65  efix+nSuffix>pRe
bb80: 61 64 65 72 2d 3e 6e 54 65 72 6d 41 6c 6c 6f 63  ader->nTermAlloc
bb90: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77   ){.    int nNew
bba0: 20 3d 20 28 6e 50 72 65 66 69 78 2b 6e 53 75 66   = (nPrefix+nSuf
bbb0: 66 69 78 29 2a 32 3b 0a 20 20 20 20 63 68 61 72  fix)*2;.    char
bbc0: 20 2a 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *zNew = sqlite3
bbd0: 5f 72 65 61 6c 6c 6f 63 28 70 52 65 61 64 65 72  _realloc(pReader
bbe0: 2d 3e 7a 54 65 72 6d 2c 20 6e 4e 65 77 29 3b 0a  ->zTerm, nNew);.
bbf0: 20 20 20 20 69 66 28 20 21 7a 4e 65 77 20 29 7b      if( !zNew ){
bc00: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
bc10: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
bc20: 7d 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e 7a  }.    pReader->z
bc30: 54 65 72 6d 20 3d 20 7a 4e 65 77 3b 0a 20 20 20  Term = zNew;.   
bc40: 20 70 52 65 61 64 65 72 2d 3e 6e 54 65 72 6d 41   pReader->nTermA
bc50: 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 7d  lloc = nNew;.  }
bc60: 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53 65 67  ..  rc = fts3Seg
bc70: 52 65 61 64 65 72 52 65 71 75 69 72 65 28 70 52  ReaderRequire(pR
bc80: 65 61 64 65 72 2c 20 70 4e 65 78 74 2c 20 6e 53  eader, pNext, nS
bc90: 75 66 66 69 78 2b 46 54 53 33 5f 56 41 52 49 4e  uffix+FTS3_VARIN
bca0: 54 5f 4d 41 58 29 3b 0a 20 20 69 66 28 20 72 63  T_MAX);.  if( rc
bcb0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
bcc0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 6d 65 6d 63  turn rc;..  memc
bcd0: 70 79 28 26 70 52 65 61 64 65 72 2d 3e 7a 54 65  py(&pReader->zTe
bce0: 72 6d 5b 6e 50 72 65 66 69 78 5d 2c 20 70 4e 65  rm[nPrefix], pNe
bcf0: 78 74 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20  xt, nSuffix);.  
bd00: 70 52 65 61 64 65 72 2d 3e 6e 54 65 72 6d 20 3d  pReader->nTerm =
bd10: 20 6e 50 72 65 66 69 78 2b 6e 53 75 66 66 69 78   nPrefix+nSuffix
bd20: 3b 0a 20 20 70 4e 65 78 74 20 2b 3d 20 6e 53 75  ;.  pNext += nSu
bd30: 66 66 69 78 3b 0a 20 20 70 4e 65 78 74 20 2b 3d  ffix;.  pNext +=
bd40: 20 66 74 73 33 47 65 74 56 61 72 69 6e 74 33 32   fts3GetVarint32
bd50: 28 70 4e 65 78 74 2c 20 26 70 52 65 61 64 65 72  (pNext, &pReader
bd60: 2d 3e 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 70  ->nDoclist);.  p
bd70: 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74  Reader->aDoclist
bd80: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 70 52 65 61   = pNext;.  pRea
bd90: 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74  der->pOffsetList
bda0: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63   = 0;..  /* Chec
bdb0: 6b 20 74 68 61 74 20 74 68 65 20 64 6f 63 6c 69  k that the docli
bdc0: 73 74 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65  st does not appe
bdd0: 61 72 20 74 6f 20 65 78 74 65 6e 64 20 70 61 73  ar to extend pas
bde0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
bdf0: 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 6e 6f 64  .  ** b-tree nod
be00: 65 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65 20  e. And that the 
be10: 66 69 6e 61 6c 20 62 79 74 65 20 6f 66 20 74 68  final byte of th
be20: 65 20 64 6f 63 6c 69 73 74 20 69 73 20 30 78 30  e doclist is 0x0
be30: 30 2e 20 49 66 20 65 69 74 68 65 72 20 0a 20 20  0. If either .  
be40: 2a 2a 20 6f 66 20 74 68 65 73 65 20 73 74 61 74  ** of these stat
be50: 65 6d 65 6e 74 73 20 69 73 20 75 6e 74 72 75 65  ements is untrue
be60: 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20  , then the data 
be70: 73 74 72 75 63 74 75 72 65 20 69 73 20 63 6f 72  structure is cor
be80: 72 75 70 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rupt..  */.  if(
be90: 20 26 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c   &pReader->aDocl
bea0: 69 73 74 5b 70 52 65 61 64 65 72 2d 3e 6e 44 6f  ist[pReader->nDo
beb0: 63 6c 69 73 74 5d 3e 26 70 52 65 61 64 65 72 2d  clist]>&pReader-
bec0: 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e  >aNode[pReader->
bed0: 6e 4e 6f 64 65 5d 20 0a 20 20 20 7c 7c 20 28 70  nNode] .   || (p
bee0: 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74  Reader->nPopulat
bef0: 65 3d 3d 30 20 26 26 20 70 52 65 61 64 65 72 2d  e==0 && pReader-
bf00: 3e 61 44 6f 63 6c 69 73 74 5b 70 52 65 61 64 65  >aDoclist[pReade
bf10: 72 2d 3e 6e 44 6f 63 6c 69 73 74 2d 31 5d 29 0a  r->nDoclist-1]).
bf20: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
bf30: 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41 42  FTS_CORRUPT_VTAB
bf40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
bf50: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
bf60: 2a 2a 20 53 65 74 20 74 68 65 20 53 65 67 52 65  ** Set the SegRe
bf70: 61 64 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  ader to point to
bf80: 20 74 68 65 20 66 69 72 73 74 20 64 6f 63 69 64   the first docid
bf90: 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20   in the doclist 
bfa0: 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
bfb0: 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  th the current t
bfc0: 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  erm..*/.static i
bfd0: 6e 74 20 66 74 73 33 53 65 67 52 65 61 64 65 72  nt fts3SegReader
bfe0: 46 69 72 73 74 44 6f 63 69 64 28 46 74 73 33 54  FirstDocid(Fts3T
bff0: 61 62 6c 65 20 2a 70 54 61 62 2c 20 46 74 73 33  able *pTab, Fts3
c000: 53 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64  SegReader *pRead
c010: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
c020: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
c030: 65 72 74 28 20 70 52 65 61 64 65 72 2d 3e 61 44  ert( pReader->aD
c040: 6f 63 6c 69 73 74 20 29 3b 0a 20 20 61 73 73 65  oclist );.  asse
c050: 72 74 28 20 21 70 52 65 61 64 65 72 2d 3e 70 4f  rt( !pReader->pO
c060: 66 66 73 65 74 4c 69 73 74 20 29 3b 0a 20 20 69  ffsetList );.  i
c070: 66 28 20 70 54 61 62 2d 3e 62 44 65 73 63 49 64  f( pTab->bDescId
c080: 78 20 26 26 20 66 74 73 33 53 65 67 52 65 61 64  x && fts3SegRead
c090: 65 72 49 73 50 65 6e 64 69 6e 67 28 70 52 65 61  erIsPending(pRea
c0a0: 64 65 72 29 20 29 7b 0a 20 20 20 20 75 38 20 62  der) ){.    u8 b
c0b0: 45 6f 66 20 3d 20 30 3b 0a 20 20 20 20 70 52 65  Eof = 0;.    pRe
c0c0: 61 64 65 72 2d 3e 69 44 6f 63 69 64 20 3d 20 30  ader->iDocid = 0
c0d0: 3b 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e  ;.    pReader->n
c0e0: 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 30 3b 0a  OffsetList = 0;.
c0f0: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 44      sqlite3Fts3D
c100: 6f 63 6c 69 73 74 50 72 65 76 28 30 2c 0a 20 20  oclistPrev(0,.  
c110: 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 61        pReader->a
c120: 44 6f 63 6c 69 73 74 2c 20 70 52 65 61 64 65 72  Doclist, pReader
c130: 2d 3e 6e 44 6f 63 6c 69 73 74 2c 20 26 70 52 65  ->nDoclist, &pRe
c140: 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73  ader->pOffsetLis
c150: 74 2c 20 0a 20 20 20 20 20 20 20 20 26 70 52 65  t, .        &pRe
c160: 61 64 65 72 2d 3e 69 44 6f 63 69 64 2c 20 26 70  ader->iDocid, &p
c170: 52 65 61 64 65 72 2d 3e 6e 4f 66 66 73 65 74 4c  Reader->nOffsetL
c180: 69 73 74 2c 20 26 62 45 6f 66 0a 20 20 20 20 29  ist, &bEof.    )
c190: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
c1a0: 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65  c = fts3SegReade
c1b0: 72 52 65 71 75 69 72 65 28 70 52 65 61 64 65 72  rRequire(pReader
c1c0: 2c 20 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c  , pReader->aDocl
c1d0: 69 73 74 2c 20 46 54 53 33 5f 56 41 52 49 4e 54  ist, FTS3_VARINT
c1e0: 5f 4d 41 58 29 3b 0a 20 20 20 20 69 66 28 20 72  _MAX);.    if( r
c1f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
c200: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71        int n = sq
c210: 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
c220: 6e 74 28 70 52 65 61 64 65 72 2d 3e 61 44 6f 63  nt(pReader->aDoc
c230: 6c 69 73 74 2c 20 26 70 52 65 61 64 65 72 2d 3e  list, &pReader->
c240: 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 20 20 70  iDocid);.      p
c250: 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c  Reader->pOffsetL
c260: 69 73 74 20 3d 20 26 70 52 65 61 64 65 72 2d 3e  ist = &pReader->
c270: 61 44 6f 63 6c 69 73 74 5b 6e 5d 3b 0a 20 20 20  aDoclist[n];.   
c280: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
c290: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  rc;.}../*.** Adv
c2a0: 61 6e 63 65 20 74 68 65 20 53 65 67 52 65 61 64  ance the SegRead
c2b0: 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  er to point to t
c2c0: 68 65 20 6e 65 78 74 20 64 6f 63 69 64 20 69 6e  he next docid in
c2d0: 20 74 68 65 20 64 6f 63 6c 69 73 74 0a 2a 2a 20   the doclist.** 
c2e0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
c2f0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d  the current term
c300: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 61 72 67 75  ..** .** If argu
c310: 6d 65 6e 74 73 20 70 70 4f 66 66 73 65 74 4c 69  ments ppOffsetLi
c320: 73 74 20 61 6e 64 20 70 6e 4f 66 66 73 65 74 4c  st and pnOffsetL
c330: 69 73 74 20 61 72 65 20 6e 6f 74 20 4e 55 4c 4c  ist are not NULL
c340: 2c 20 74 68 65 6e 20 0a 2a 2a 20 2a 70 70 4f 66  , then .** *ppOf
c350: 66 73 65 74 4c 69 73 74 20 69 73 20 73 65 74 20  fsetList is set 
c360: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
c370: 66 69 72 73 74 20 63 6f 6c 75 6d 6e 2d 6f 66 66  first column-off
c380: 73 65 74 20 6c 69 73 74 0a 2a 2a 20 69 6e 20 74  set list.** in t
c390: 68 65 20 64 6f 63 6c 69 73 74 20 65 6e 74 72 79  he doclist entry
c3a0: 20 28 69 2e 65 2e 20 69 6d 6d 65 64 69 61 74 65   (i.e. immediate
c3b0: 6c 79 20 70 61 73 74 20 74 68 65 20 64 6f 63 69  ly past the doci
c3c0: 64 20 76 61 72 69 6e 74 29 2e 0a 2a 2a 20 2a 70  d varint)..** *p
c3d0: 6e 4f 66 66 73 65 74 4c 69 73 74 20 69 73 20 73  nOffsetList is s
c3e0: 65 74 20 74 6f 20 74 68 65 20 6c 65 6e 67 74 68  et to the length
c3f0: 20 6f 66 20 74 68 65 20 73 65 74 20 6f 66 20 63   of the set of c
c400: 6f 6c 75 6d 6e 2d 6f 66 66 73 65 74 0a 2a 2a 20  olumn-offset.** 
c410: 6c 69 73 74 73 2c 20 6e 6f 74 20 69 6e 63 6c 75  lists, not inclu
c420: 64 69 6e 67 20 74 68 65 20 6e 75 6c 2d 74 65 72  ding the nul-ter
c430: 6d 69 6e 61 74 6f 72 20 62 79 74 65 2e 20 46 6f  minator byte. Fo
c440: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2f 0a 73 74  r example:.*/.st
c450: 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67  atic int fts3Seg
c460: 52 65 61 64 65 72 4e 65 78 74 44 6f 63 69 64 28  ReaderNextDocid(
c470: 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 54  .  Fts3Table *pT
c480: 61 62 2c 0a 20 20 46 74 73 33 53 65 67 52 65 61  ab,.  Fts3SegRea
c490: 64 65 72 20 2a 70 52 65 61 64 65 72 2c 20 20 20  der *pReader,   
c4a0: 20 20 20 20 20 20 2f 2a 20 52 65 61 64 65 72 20        /* Reader 
c4b0: 74 6f 20 61 64 76 61 6e 63 65 20 74 6f 20 6e 65  to advance to ne
c4c0: 78 74 20 64 6f 63 69 64 20 2a 2f 0a 20 20 63 68  xt docid */.  ch
c4d0: 61 72 20 2a 2a 70 70 4f 66 66 73 65 74 4c 69 73  ar **ppOffsetLis
c4e0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
c4f0: 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f   OUT: Pointer to
c500: 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
c510: 6e 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  n-list */.  int 
c520: 2a 70 6e 4f 66 66 73 65 74 4c 69 73 74 20 20 20  *pnOffsetList   
c530: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
c540: 55 54 3a 20 4c 65 6e 67 74 68 20 6f 66 20 2a 70  UT: Length of *p
c550: 70 4f 66 66 73 65 74 4c 69 73 74 20 69 6e 20 62  pOffsetList in b
c560: 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ytes */.){.  int
c570: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c580: 0a 20 20 63 68 61 72 20 2a 70 20 3d 20 70 52 65  .  char *p = pRe
c590: 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73  ader->pOffsetLis
c5a0: 74 3b 0a 20 20 63 68 61 72 20 63 20 3d 20 30 3b  t;.  char c = 0;
c5b0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b  ..  assert( p );
c5c0: 0a 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 62 44  ..  if( pTab->bD
c5d0: 65 73 63 49 64 78 20 26 26 20 66 74 73 33 53 65  escIdx && fts3Se
c5e0: 67 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e 67  gReaderIsPending
c5f0: 28 70 52 65 61 64 65 72 29 20 29 7b 0a 20 20 20  (pReader) ){.   
c600: 20 2f 2a 20 41 20 70 65 6e 64 69 6e 67 2d 74 65   /* A pending-te
c610: 72 6d 73 20 73 65 67 2d 72 65 61 64 65 72 20 66  rms seg-reader f
c620: 6f 72 20 61 6e 20 46 54 53 34 20 74 61 62 6c 65  or an FTS4 table
c630: 20 74 68 61 74 20 75 73 65 73 20 6f 72 64 65 72   that uses order
c640: 3d 64 65 73 63 2e 0a 20 20 20 20 2a 2a 20 50 65  =desc..    ** Pe
c650: 6e 64 69 6e 67 2d 74 65 72 6d 73 20 64 6f 63 6c  nding-terms docl
c660: 69 73 74 73 20 61 72 65 20 61 6c 77 61 79 73 20  ists are always 
c670: 62 75 69 6c 74 20 75 70 20 69 6e 20 61 73 63 65  built up in asce
c680: 6e 64 69 6e 67 20 6f 72 64 65 72 2c 20 73 6f 0a  nding order, so.
c690: 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74      ** we have t
c6a0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
c6b0: 68 20 74 68 65 6d 20 62 61 63 6b 77 61 72 64 73  h them backwards
c6c0: 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 75 38   here. */.    u8
c6d0: 20 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20 20 69   bEof = 0;.    i
c6e0: 66 28 20 70 70 4f 66 66 73 65 74 4c 69 73 74 20  f( ppOffsetList 
c6f0: 29 7b 0a 20 20 20 20 20 20 2a 70 70 4f 66 66 73  ){.      *ppOffs
c700: 65 74 4c 69 73 74 20 3d 20 70 52 65 61 64 65 72  etList = pReader
c710: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3b 0a 20  ->pOffsetList;. 
c720: 20 20 20 20 20 2a 70 6e 4f 66 66 73 65 74 4c 69       *pnOffsetLi
c730: 73 74 20 3d 20 70 52 65 61 64 65 72 2d 3e 6e 4f  st = pReader->nO
c740: 66 66 73 65 74 4c 69 73 74 20 2d 20 31 3b 0a 20  ffsetList - 1;. 
c750: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
c760: 46 74 73 33 44 6f 63 6c 69 73 74 50 72 65 76 28  Fts3DoclistPrev(
c770: 30 2c 0a 20 20 20 20 20 20 20 20 70 52 65 61 64  0,.        pRead
c780: 65 72 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 70 52  er->aDoclist, pR
c790: 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 2c  eader->nDoclist,
c7a0: 20 26 70 2c 20 26 70 52 65 61 64 65 72 2d 3e 69   &p, &pReader->i
c7b0: 44 6f 63 69 64 2c 0a 20 20 20 20 20 20 20 20 26  Docid,.        &
c7c0: 70 52 65 61 64 65 72 2d 3e 6e 4f 66 66 73 65 74  pReader->nOffset
c7d0: 4c 69 73 74 2c 20 26 62 45 6f 66 0a 20 20 20 20  List, &bEof.    
c7e0: 29 3b 0a 20 20 20 20 69 66 28 20 62 45 6f 66 20  );.    if( bEof 
c7f0: 29 7b 0a 20 20 20 20 20 20 70 52 65 61 64 65 72  ){.      pReader
c800: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20  ->pOffsetList = 
c810: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
c820: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 4f 66      pReader->pOf
c830: 66 73 65 74 4c 69 73 74 20 3d 20 70 3b 0a 20 20  fsetList = p;.  
c840: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
c850: 20 63 68 61 72 20 2a 70 45 6e 64 20 3d 20 26 70   char *pEnd = &p
c860: 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74  Reader->aDoclist
c870: 5b 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69  [pReader->nDocli
c880: 73 74 5d 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 69  st];..    /* Poi
c890: 6e 74 65 72 20 70 20 63 75 72 72 65 6e 74 6c 79  nter p currently
c8a0: 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 66   points at the f
c8b0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6e 20  irst byte of an 
c8c0: 6f 66 66 73 65 74 20 6c 69 73 74 2e 20 54 68 65  offset list. The
c8d0: 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  .    ** followin
c8e0: 67 20 62 6c 6f 63 6b 20 61 64 76 61 6e 63 65 73  g block advances
c8f0: 20 69 74 20 74 6f 20 70 6f 69 6e 74 20 6f 6e 65   it to point one
c900: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 65   byte past the e
c910: 6e 64 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  nd of.    ** the
c920: 20 73 61 6d 65 20 6f 66 66 73 65 74 20 6c 69 73   same offset lis
c930: 74 2e 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28  t. */.    while(
c940: 20 31 20 29 7b 0a 20 20 0a 20 20 20 20 20 20 2f   1 ){.  .      /
c950: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
c960: 6c 69 6e 65 20 6f 66 20 63 6f 64 65 20 28 61 6e  line of code (an
c970: 64 20 74 68 65 20 22 70 2b 2b 22 20 62 65 6c 6f  d the "p++" belo
c980: 77 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f  w the while() lo
c990: 6f 70 29 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  op) is.      ** 
c9a0: 6e 6f 72 6d 61 6c 6c 79 20 61 6c 6c 20 74 68 61  normally all tha
c9b0: 74 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  t is required to
c9c0: 20 6d 6f 76 65 20 70 6f 69 6e 74 65 72 20 70 20   move pointer p 
c9d0: 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 20 0a  to the desired .
c9e0: 20 20 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f        ** positio
c9f0: 6e 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  n. The exception
ca00: 20 69 73 20 69 66 20 74 68 69 73 20 6e 6f 64 65   is if this node
ca10: 20 69 73 20 62 65 69 6e 67 20 6c 6f 61 64 65 64   is being loaded
ca20: 20 66 72 6f 6d 20 64 69 73 6b 0a 20 20 20 20 20   from disk.     
ca30: 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c 6c   ** incrementall
ca40: 79 20 61 6e 64 20 70 6f 69 6e 74 65 72 20 22 70  y and pointer "p
ca50: 22 20 6e 6f 77 20 70 6f 69 6e 74 73 20 74 6f 20  " now points to 
ca60: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70  the first byte p
ca70: 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ast.      ** the
ca80: 20 70 6f 70 75 6c 61 74 65 64 20 70 61 72 74 20   populated part 
ca90: 6f 66 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64  of pReader->aNod
caa0: 65 5b 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  e[]..      */.  
cab0: 20 20 20 20 77 68 69 6c 65 28 20 2a 70 20 7c 20      while( *p | 
cac0: 63 20 29 20 63 20 3d 20 2a 70 2b 2b 20 26 20 30  c ) c = *p++ & 0
cad0: 78 38 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  x80;.      asser
cae0: 74 28 20 2a 70 3d 3d 30 20 29 3b 0a 20 20 0a 20  t( *p==0 );.  . 
caf0: 20 20 20 20 20 69 66 28 20 70 52 65 61 64 65 72       if( pReader
cb00: 2d 3e 70 42 6c 6f 62 3d 3d 30 20 7c 7c 20 70 3c  ->pBlob==0 || p<
cb10: 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b  &pReader->aNode[
cb20: 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61  pReader->nPopula
cb30: 74 65 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  te] ) break;.   
cb40: 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52     rc = fts3SegR
cb50: 65 61 64 65 72 49 6e 63 72 52 65 61 64 28 70 52  eaderIncrRead(pR
cb60: 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20 69 66  eader);.      if
cb70: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
cb80: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
cb90: 20 7d 0a 20 20 20 20 70 2b 2b 3b 0a 20 20 0a 20   }.    p++;.  . 
cba0: 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65     /* If require
cbb0: 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  d, populate the 
cbc0: 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  output variables
cbd0: 20 77 69 74 68 20 61 20 70 6f 69 6e 74 65 72 20   with a pointer 
cbe0: 74 6f 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  to and the.    *
cbf0: 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 72  * size of the pr
cc00: 65 76 69 6f 75 73 20 6f 66 66 73 65 74 2d 6c 69  evious offset-li
cc10: 73 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  st..    */.    i
cc20: 66 28 20 70 70 4f 66 66 73 65 74 4c 69 73 74 20  f( ppOffsetList 
cc30: 29 7b 0a 20 20 20 20 20 20 2a 70 70 4f 66 66 73  ){.      *ppOffs
cc40: 65 74 4c 69 73 74 20 3d 20 70 52 65 61 64 65 72  etList = pReader
cc50: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3b 0a 20  ->pOffsetList;. 
cc60: 20 20 20 20 20 2a 70 6e 4f 66 66 73 65 74 4c 69       *pnOffsetLi
cc70: 73 74 20 3d 20 28 69 6e 74 29 28 70 20 2d 20 70  st = (int)(p - p
cc80: 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c  Reader->pOffsetL
cc90: 69 73 74 20 2d 20 31 29 3b 0a 20 20 20 20 7d 0a  ist - 1);.    }.
cca0: 0a 20 20 20 20 2f 2a 20 4c 69 73 74 20 6d 61 79  .    /* List may
ccb0: 20 68 61 76 65 20 62 65 65 6e 20 65 64 69 74 65   have been edite
ccc0: 64 20 69 6e 20 70 6c 61 63 65 20 62 79 20 66 74  d in place by ft
ccd0: 73 33 45 76 61 6c 4e 65 61 72 54 72 69 6d 28 29  s3EvalNearTrim()
cce0: 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
ccf0: 3c 70 45 6e 64 20 26 26 20 2a 70 3d 3d 30 20 29  <pEnd && *p==0 )
cd00: 20 70 2b 2b 3b 0a 20 20 0a 20 20 20 20 2f 2a 20   p++;.  .    /* 
cd10: 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
cd20: 6d 6f 72 65 20 65 6e 74 72 69 65 73 20 69 6e 20  more entries in 
cd30: 74 68 65 20 64 6f 63 6c 69 73 74 2c 20 73 65 74  the doclist, set
cd40: 20 70 4f 66 66 73 65 74 4c 69 73 74 20 74 6f 0a   pOffsetList to.
cd50: 20 20 20 20 2a 2a 20 4e 55 4c 4c 2e 20 4f 74 68      ** NULL. Oth
cd60: 65 72 77 69 73 65 2c 20 73 65 74 20 46 74 73 33  erwise, set Fts3
cd70: 53 65 67 52 65 61 64 65 72 2e 69 44 6f 63 69 64  SegReader.iDocid
cd80: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 6f 63   to the next doc
cd90: 69 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 46 74  id and.    ** Ft
cda0: 73 33 53 65 67 52 65 61 64 65 72 2e 70 4f 66 66  s3SegReader.pOff
cdb0: 73 65 74 4c 69 73 74 20 74 6f 20 70 6f 69 6e 74  setList to point
cdc0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6f 66 66   to the next off
cdd0: 73 65 74 20 6c 69 73 74 20 62 65 66 6f 72 65 0a  set list before.
cde0: 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 69 6e 67      ** returning
cdf0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
ce00: 20 70 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20   p>=pEnd ){.    
ce10: 20 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73    pReader->pOffs
ce20: 65 74 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  etList = 0;.    
ce30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
ce40: 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72 52  = fts3SegReaderR
ce50: 65 71 75 69 72 65 28 70 52 65 61 64 65 72 2c 20  equire(pReader, 
ce60: 70 2c 20 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d  p, FTS3_VARINT_M
ce70: 41 58 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  AX);.      if( r
ce80: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
ce90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
cea0: 69 6e 74 36 34 20 69 44 65 6c 74 61 3b 0a 20 20  int64 iDelta;.  
ceb0: 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70        pReader->p
cec0: 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 70 20 2b  OffsetList = p +
ced0: 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56   sqlite3Fts3GetV
cee0: 61 72 69 6e 74 28 70 2c 20 26 69 44 65 6c 74 61  arint(p, &iDelta
cef0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
cf00: 54 61 62 2d 3e 62 44 65 73 63 49 64 78 20 29 7b  Tab->bDescIdx ){
cf10: 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 61 64  .          pRead
cf20: 65 72 2d 3e 69 44 6f 63 69 64 20 2d 3d 20 69 44  er->iDocid -= iD
cf30: 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 7d 65  elta;.        }e
cf40: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
cf50: 52 65 61 64 65 72 2d 3e 69 44 6f 63 69 64 20 2b  Reader->iDocid +
cf60: 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  = iDelta;.      
cf70: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
cf80: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
cf90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 69  SQLITE_OK;.}...i
cfa0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 4d 73  nt sqlite3Fts3Ms
cfb0: 72 4f 76 66 6c 28 0a 20 20 46 74 73 33 43 75 72  rOvfl(.  Fts3Cur
cfc0: 73 6f 72 20 2a 70 43 73 72 2c 20 0a 20 20 46 74  sor *pCsr, .  Ft
cfd0: 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
cfe0: 20 2a 70 4d 73 72 2c 0a 20 20 69 6e 74 20 2a 70   *pMsr,.  int *p
cff0: 6e 4f 76 66 6c 0a 29 7b 0a 20 20 46 74 73 33 54  nOvfl.){.  Fts3T
d000: 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33 54  able *p = (Fts3T
d010: 61 62 6c 65 2a 29 70 43 73 72 2d 3e 62 61 73 65  able*)pCsr->base
d020: 2e 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 6e 4f  .pVtab;.  int nO
d030: 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  vfl = 0;.  int i
d040: 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  i;.  int rc = SQ
d050: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 70  LITE_OK;.  int p
d060: 67 73 7a 20 3d 20 70 2d 3e 6e 50 67 73 7a 3b 0a  gsz = p->nPgsz;.
d070: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 46  .  assert( p->bF
d080: 74 73 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ts4 );.  assert(
d090: 20 70 67 73 7a 3e 30 20 29 3b 0a 0a 20 20 66 6f   pgsz>0 );..  fo
d0a0: 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  r(ii=0; rc==SQLI
d0b0: 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 4d 73 72  TE_OK && ii<pMsr
d0c0: 2d 3e 6e 53 65 67 6d 65 6e 74 3b 20 69 69 2b 2b  ->nSegment; ii++
d0d0: 29 7b 0a 20 20 20 20 46 74 73 33 53 65 67 52 65  ){.    Fts3SegRe
d0e0: 61 64 65 72 20 2a 70 52 65 61 64 65 72 20 3d 20  ader *pReader = 
d0f0: 70 4d 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b  pMsr->apSegment[
d100: 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 21 66 74  ii];.    if( !ft
d110: 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65 6e  s3SegReaderIsPen
d120: 64 69 6e 67 28 70 52 65 61 64 65 72 29 20 0a 20  ding(pReader) . 
d130: 20 20 20 20 26 26 20 21 66 74 73 33 53 65 67 52      && !fts3SegR
d140: 65 61 64 65 72 49 73 52 6f 6f 74 4f 6e 6c 79 28  eaderIsRootOnly(
d150: 70 52 65 61 64 65 72 29 20 0a 20 20 20 20 29 7b  pReader) .    ){
d160: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
d170: 6e 74 36 34 20 6a 6a 3b 0a 20 20 20 20 20 20 66  nt64 jj;.      f
d180: 6f 72 28 6a 6a 3d 70 52 65 61 64 65 72 2d 3e 69  or(jj=pReader->i
d190: 53 74 61 72 74 42 6c 6f 63 6b 3b 20 6a 6a 3c 3d  StartBlock; jj<=
d1a0: 70 52 65 61 64 65 72 2d 3e 69 4c 65 61 66 45 6e  pReader->iLeafEn
d1b0: 64 42 6c 6f 63 6b 3b 20 6a 6a 2b 2b 29 7b 0a 20  dBlock; jj++){. 
d1c0: 20 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62         int nBlob
d1d0: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
d1e0: 71 6c 69 74 65 33 46 74 73 33 52 65 61 64 42 6c  qlite3Fts3ReadBl
d1f0: 6f 63 6b 28 70 2c 20 6a 6a 2c 20 30 2c 20 26 6e  ock(p, jj, 0, &n
d200: 42 6c 6f 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  Blob, 0);.      
d210: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d220: 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  _OK ) break;.   
d230: 20 20 20 20 20 69 66 28 20 28 6e 42 6c 6f 62 2b       if( (nBlob+
d240: 33 35 29 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20  35)>pgsz ){.    
d250: 20 20 20 20 20 20 6e 4f 76 66 6c 20 2b 3d 20 28        nOvfl += (
d260: 6e 42 6c 6f 62 20 2b 20 33 34 29 2f 70 67 73 7a  nBlob + 34)/pgsz
d270: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d280: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
d290: 2a 70 6e 4f 76 66 6c 20 3d 20 6e 4f 76 66 6c 3b  *pnOvfl = nOvfl;
d2a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d2b0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
d2c0: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f  allocations asso
d2d0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
d2e0: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
d2f0: 61 73 20 74 68 65 20 0a 2a 2a 20 73 65 63 6f 6e  as the .** secon
d300: 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76  d argument..*/.v
d310: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 33 53  oid sqlite3Fts3S
d320: 65 67 52 65 61 64 65 72 46 72 65 65 28 46 74 73  egReaderFree(Fts
d330: 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 65 61  3SegReader *pRea
d340: 64 65 72 29 7b 0a 20 20 69 66 28 20 70 52 65 61  der){.  if( pRea
d350: 64 65 72 20 29 7b 0a 20 20 20 20 69 66 28 20 21  der ){.    if( !
d360: 66 74 73 33 53 65 67 52 65 61 64 65 72 49 73 50  fts3SegReaderIsP
d370: 65 6e 64 69 6e 67 28 70 52 65 61 64 65 72 29 20  ending(pReader) 
d380: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
d390: 5f 66 72 65 65 28 70 52 65 61 64 65 72 2d 3e 7a  _free(pReader->z
d3a0: 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Term);.    }.   
d3b0: 20 69 66 28 20 21 66 74 73 33 53 65 67 52 65 61   if( !fts3SegRea
d3c0: 64 65 72 49 73 52 6f 6f 74 4f 6e 6c 79 28 70 52  derIsRootOnly(pR
d3d0: 65 61 64 65 72 29 20 29 7b 0a 20 20 20 20 20 20  eader) ){.      
d3e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65  sqlite3_free(pRe
d3f0: 61 64 65 72 2d 3e 61 4e 6f 64 65 29 3b 0a 20 20  ader->aNode);.  
d400: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
d410: 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61 64  blob_close(pRead
d420: 65 72 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 7d 0a  er->pBlob);.  }.
d430: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
d440: 52 65 61 64 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Reader);.}../*.*
d450: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
d460: 20 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63   SegReader objec
d470: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
d480: 33 46 74 73 33 53 65 67 52 65 61 64 65 72 4e 65  3Fts3SegReaderNe
d490: 77 28 0a 20 20 69 6e 74 20 69 41 67 65 2c 20 20  w(.  int iAge,  
d4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4b0: 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20       /* Segment 
d4c0: 22 61 67 65 22 2e 20 2a 2f 0a 20 20 69 6e 74 20  "age". */.  int 
d4d0: 62 4c 6f 6f 6b 75 70 2c 20 20 20 20 20 20 20 20  bLookup,        
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
d4f0: 72 75 65 20 66 6f 72 20 61 20 6c 6f 6f 6b 75 70  rue for a lookup
d500: 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 71 6c 69 74   only */.  sqlit
d510: 65 33 5f 69 6e 74 36 34 20 69 53 74 61 72 74 4c  e3_int64 iStartL
d520: 65 61 66 2c 20 20 20 20 20 20 20 2f 2a 20 46 69  eaf,       /* Fi
d530: 72 73 74 20 6c 65 61 66 20 74 6f 20 74 72 61 76  rst leaf to trav
d540: 65 72 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  erse */.  sqlite
d550: 33 5f 69 6e 74 36 34 20 69 45 6e 64 4c 65 61 66  3_int64 iEndLeaf
d560: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e  ,         /* Fin
d570: 61 6c 20 6c 65 61 66 20 74 6f 20 74 72 61 76 65  al leaf to trave
d580: 72 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rse */.  sqlite3
d590: 5f 69 6e 74 36 34 20 69 45 6e 64 42 6c 6f 63 6b  _int64 iEndBlock
d5a0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 61  ,        /* Fina
d5b0: 6c 20 62 6c 6f 63 6b 20 6f 66 20 73 65 67 6d 65  l block of segme
d5c0: 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nt */.  const ch
d5d0: 61 72 20 2a 7a 52 6f 6f 74 2c 20 20 20 20 20 20  ar *zRoot,      
d5e0: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
d5f0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 72 6f 6f  r containing roo
d600: 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  t node */.  int 
d610: 6e 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20  nRoot,          
d620: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
d630: 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 63 6f  ize of buffer co
d640: 6e 74 61 69 6e 69 6e 67 20 72 6f 6f 74 20 6e 6f  ntaining root no
d650: 64 65 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 52  de */.  Fts3SegR
d660: 65 61 64 65 72 20 2a 2a 70 70 52 65 61 64 65 72  eader **ppReader
d670: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
d680: 41 6c 6c 6f 63 61 74 65 64 20 46 74 73 33 53 65  Allocated Fts3Se
d690: 67 52 65 61 64 65 72 20 2a 2f 0a 29 7b 0a 20 20  gReader */.){.  
d6a0: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
d6b0: 52 65 61 64 65 72 3b 20 20 20 20 20 20 20 20 20  Reader;         
d6c0: 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  /* Newly allocat
d6d0: 65 64 20 53 65 67 52 65 61 64 65 72 20 6f 62 6a  ed SegReader obj
d6e0: 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ect */.  int nEx
d6f0: 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tra = 0;        
d700: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
d710: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 65  s to allocate se
d720: 67 6d 65 6e 74 20 72 6f 6f 74 20 6e 6f 64 65 20  gment root node 
d730: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 53  */..  assert( iS
d740: 74 61 72 74 4c 65 61 66 3c 3d 69 45 6e 64 4c 65  tartLeaf<=iEndLe
d750: 61 66 20 29 3b 0a 20 20 69 66 28 20 69 53 74 61  af );.  if( iSta
d760: 72 74 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20  rtLeaf==0 ){.   
d770: 20 6e 45 78 74 72 61 20 3d 20 6e 52 6f 6f 74 20   nExtra = nRoot 
d780: 2b 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44  + FTS3_NODE_PADD
d790: 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 61  ING;.  }..  pRea
d7a0: 64 65 72 20 3d 20 28 46 74 73 33 53 65 67 52 65  der = (Fts3SegRe
d7b0: 61 64 65 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  ader *)sqlite3_m
d7c0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46 74 73  alloc(sizeof(Fts
d7d0: 33 53 65 67 52 65 61 64 65 72 29 20 2b 20 6e 45  3SegReader) + nE
d7e0: 78 74 72 61 29 3b 0a 20 20 69 66 28 20 21 70 52  xtra);.  if( !pR
d7f0: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 72 65 74  eader ){.    ret
d800: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
d810: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
d820: 52 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f  Reader, 0, sizeo
d830: 66 28 46 74 73 33 53 65 67 52 65 61 64 65 72 29  f(Fts3SegReader)
d840: 29 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 69 49  );.  pReader->iI
d850: 64 78 20 3d 20 69 41 67 65 3b 0a 20 20 70 52 65  dx = iAge;.  pRe
d860: 61 64 65 72 2d 3e 62 4c 6f 6f 6b 75 70 20 3d 20  ader->bLookup = 
d870: 62 4c 6f 6f 6b 75 70 21 3d 30 3b 0a 20 20 70 52  bLookup!=0;.  pR
d880: 65 61 64 65 72 2d 3e 69 53 74 61 72 74 42 6c 6f  eader->iStartBlo
d890: 63 6b 20 3d 20 69 53 74 61 72 74 4c 65 61 66 3b  ck = iStartLeaf;
d8a0: 0a 20 20 70 52 65 61 64 65 72 2d 3e 69 4c 65 61  .  pReader->iLea
d8b0: 66 45 6e 64 42 6c 6f 63 6b 20 3d 20 69 45 6e 64  fEndBlock = iEnd
d8c0: 4c 65 61 66 3b 0a 20 20 70 52 65 61 64 65 72 2d  Leaf;.  pReader-
d8d0: 3e 69 45 6e 64 42 6c 6f 63 6b 20 3d 20 69 45 6e  >iEndBlock = iEn
d8e0: 64 42 6c 6f 63 6b 3b 0a 0a 20 20 69 66 28 20 6e  dBlock;..  if( n
d8f0: 45 78 74 72 61 20 29 7b 0a 20 20 20 20 2f 2a 20  Extra ){.    /* 
d900: 54 68 65 20 65 6e 74 69 72 65 20 73 65 67 6d 65  The entire segme
d910: 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  nt is stored in 
d920: 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 2a  the root node. *
d930: 2f 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e 61  /.    pReader->a
d940: 4e 6f 64 65 20 3d 20 28 63 68 61 72 20 2a 29 26  Node = (char *)&
d950: 70 52 65 61 64 65 72 5b 31 5d 3b 0a 20 20 20 20  pReader[1];.    
d960: 70 52 65 61 64 65 72 2d 3e 72 6f 6f 74 4f 6e 6c  pReader->rootOnl
d970: 79 20 3d 20 31 3b 0a 20 20 20 20 70 52 65 61 64  y = 1;.    pRead
d980: 65 72 2d 3e 6e 4e 6f 64 65 20 3d 20 6e 52 6f 6f  er->nNode = nRoo
d990: 74 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 52  t;.    memcpy(pR
d9a0: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 2c 20 7a 52  eader->aNode, zR
d9b0: 6f 6f 74 2c 20 6e 52 6f 6f 74 29 3b 0a 20 20 20  oot, nRoot);.   
d9c0: 20 6d 65 6d 73 65 74 28 26 70 52 65 61 64 65 72   memset(&pReader
d9d0: 2d 3e 61 4e 6f 64 65 5b 6e 52 6f 6f 74 5d 2c 20  ->aNode[nRoot], 
d9e0: 30 2c 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44  0, FTS3_NODE_PAD
d9f0: 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DING);.  }else{.
da00: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 69 43 75      pReader->iCu
da10: 72 72 65 6e 74 42 6c 6f 63 6b 20 3d 20 69 53 74  rrentBlock = iSt
da20: 61 72 74 4c 65 61 66 2d 31 3b 0a 20 20 7d 0a 20  artLeaf-1;.  }. 
da30: 20 2a 70 70 52 65 61 64 65 72 20 3d 20 70 52 65   *ppReader = pRe
da40: 61 64 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53  ader;.  return S
da50: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
da60: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63 6f 6d  ** This is a com
da70: 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
da80: 20 75 73 65 64 20 61 73 20 61 20 71 73 6f 72 74   used as a qsort
da90: 28 29 20 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e  () callback when
daa0: 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 61 6e 20 61   sorting.** an a
dab0: 72 72 61 79 20 6f 66 20 70 65 6e 64 69 6e 67 20  rray of pending 
dac0: 74 65 72 6d 73 20 62 79 20 74 65 72 6d 2e 20 54  terms by term. T
dad0: 68 69 73 20 6f 63 63 75 72 73 20 61 73 20 70 61  his occurs as pa
dae0: 72 74 20 6f 66 20 66 6c 75 73 68 69 6e 67 0a 2a  rt of flushing.*
daf0: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * the contents o
db00: 66 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65  f the pending-te
db10: 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65 20 74  rms hash table t
db20: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  o the database..
db30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
db40: 4c 49 54 45 5f 43 44 45 43 4c 20 66 74 73 33 43  LITE_CDECL fts3C
db50: 6f 6d 70 61 72 65 45 6c 65 6d 42 79 54 65 72 6d  ompareElemByTerm
db60: 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  (.  const void *
db70: 6c 68 73 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69  lhs,.  const voi
db80: 64 20 2a 72 68 73 0a 29 7b 0a 20 20 63 68 61 72  d *rhs.){.  char
db90: 20 2a 7a 31 20 3d 20 66 74 73 33 48 61 73 68 4b   *z1 = fts3HashK
dba0: 65 79 28 2a 28 46 74 73 33 48 61 73 68 45 6c 65  ey(*(Fts3HashEle
dbb0: 6d 20 2a 2a 29 6c 68 73 29 3b 0a 20 20 63 68 61  m **)lhs);.  cha
dbc0: 72 20 2a 7a 32 20 3d 20 66 74 73 33 48 61 73 68  r *z2 = fts3Hash
dbd0: 4b 65 79 28 2a 28 46 74 73 33 48 61 73 68 45 6c  Key(*(Fts3HashEl
dbe0: 65 6d 20 2a 2a 29 72 68 73 29 3b 0a 20 20 69 6e  em **)rhs);.  in
dbf0: 74 20 6e 31 20 3d 20 66 74 73 33 48 61 73 68 4b  t n1 = fts3HashK
dc00: 65 79 73 69 7a 65 28 2a 28 46 74 73 33 48 61 73  eysize(*(Fts3Has
dc10: 68 45 6c 65 6d 20 2a 2a 29 6c 68 73 29 3b 0a 20  hElem **)lhs);. 
dc20: 20 69 6e 74 20 6e 32 20 3d 20 66 74 73 33 48 61   int n2 = fts3Ha
dc30: 73 68 4b 65 79 73 69 7a 65 28 2a 28 46 74 73 33  shKeysize(*(Fts3
dc40: 48 61 73 68 45 6c 65 6d 20 2a 2a 29 72 68 73 29  HashElem **)rhs)
dc50: 3b 0a 0a 20 20 69 6e 74 20 6e 20 3d 20 28 6e 31  ;..  int n = (n1
dc60: 3c 6e 32 20 3f 20 6e 31 20 3a 20 6e 32 29 3b 0a  <n2 ? n1 : n2);.
dc70: 20 20 69 6e 74 20 63 20 3d 20 6d 65 6d 63 6d 70    int c = memcmp
dc80: 28 7a 31 2c 20 7a 32 2c 20 6e 29 3b 0a 20 20 69  (z1, z2, n);.  i
dc90: 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 63  f( c==0 ){.    c
dca0: 20 3d 20 6e 31 20 2d 20 6e 32 3b 0a 20 20 7d 0a   = n1 - n2;.  }.
dcb0: 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f    return c;.}../
dcc0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
dcd0: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c  on is used to al
dce0: 6c 6f 63 61 74 65 20 61 6e 20 46 74 73 33 53 65  locate an Fts3Se
dcf0: 67 52 65 61 64 65 72 20 74 68 61 74 20 69 74 65  gReader that ite
dd00: 72 61 74 65 73 20 74 68 72 6f 75 67 68 0a 2a 2a  rates through.**
dd10: 20 61 20 73 75 62 73 65 74 20 6f 66 20 74 68 65   a subset of the
dd20: 20 74 65 72 6d 73 20 73 74 6f 72 65 64 20 69 6e   terms stored in
dd30: 20 74 68 65 20 46 74 73 33 54 61 62 6c 65 2e 70   the Fts3Table.p
dd40: 65 6e 64 69 6e 67 54 65 72 6d 73 20 61 72 72 61  endingTerms arra
dd50: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
dd60: 69 73 50 72 65 66 69 78 49 74 65 72 20 70 61 72  isPrefixIter par
dd70: 61 6d 65 74 65 72 20 69 73 20 7a 65 72 6f 2c 20  ameter is zero, 
dd80: 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65  then the returne
dd90: 64 20 53 65 67 52 65 61 64 65 72 20 69 74 65 72  d SegReader iter
dda0: 61 74 65 73 0a 2a 2a 20 74 68 72 6f 75 67 68 20  ates.** through 
ddb0: 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65  each term in the
ddc0: 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 74   pending-terms t
ddd0: 61 62 6c 65 2e 20 4f 72 2c 20 69 66 20 69 73 50  able. Or, if isP
dde0: 72 65 66 69 78 49 74 65 72 20 69 73 0a 2a 2a 20  refixIter is.** 
ddf0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 74 65  non-zero, it ite
de00: 72 61 74 65 73 20 74 68 72 6f 75 67 68 20 65 61  rates through ea
de10: 63 68 20 74 65 72 6d 20 61 6e 64 20 69 74 73 20  ch term and its 
de20: 70 72 65 66 69 78 65 73 2e 20 46 6f 72 20 65 78  prefixes. For ex
de30: 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74 68 65  ample, if.** the
de40: 20 70 65 6e 64 69 6e 67 20 74 65 72 6d 73 20 68   pending terms h
de50: 61 73 68 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  ash table contai
de60: 6e 73 20 74 68 65 20 74 65 72 6d 73 20 22 73 71  ns the terms "sq
de70: 6c 69 74 65 22 2c 20 22 6d 79 73 71 6c 22 20 61  lite", "mysql" a
de80: 6e 64 0a 2a 2a 20 22 66 69 72 65 62 69 72 64 22  nd.** "firebird"
de90: 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65 72 61  , then the itera
dea0: 74 6f 72 20 76 69 73 69 74 73 20 74 68 65 20 66  tor visits the f
deb0: 6f 6c 6c 6f 77 69 6e 67 20 27 74 65 72 6d 73 27  ollowing 'terms'
dec0: 20 28 69 6e 20 74 68 65 20 6f 72 64 65 72 0a 2a   (in the order.*
ded0: 2a 20 73 68 6f 77 6e 29 3a 0a 2a 2a 0a 2a 2a 20  * shown):.**.** 
dee0: 20 20 66 20 66 69 20 66 69 72 20 66 69 72 65 20    f fi fir fire 
def0: 66 69 72 65 62 20 66 69 72 65 62 69 20 66 69 72  fireb firebi fir
df00: 65 62 69 72 20 66 69 72 65 62 69 72 64 0a 2a 2a  ebir firebird.**
df10: 20 20 20 6d 20 6d 79 20 6d 79 73 20 6d 79 73 71     m my mys mysq
df20: 20 6d 79 73 71 6c 0a 2a 2a 20 20 20 73 20 73 71   mysql.**   s sq
df30: 20 73 71 6c 20 73 71 6c 69 20 73 71 6c 69 74 20   sql sqli sqlit 
df40: 73 71 6c 69 74 65 0a 2a 2a 0a 2a 2a 20 57 68 65  sqlite.**.** Whe
df50: 72 65 61 73 20 69 66 20 69 73 50 72 65 66 69 78  reas if isPrefix
df60: 49 74 65 72 20 69 73 20 7a 65 72 6f 2c 20 74 68  Iter is zero, th
df70: 65 20 74 65 72 6d 73 20 76 69 73 69 74 65 64 20  e terms visited 
df80: 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 66 69 72  are:.**.**   fir
df90: 65 62 69 72 64 20 6d 79 73 71 6c 20 73 71 6c 69  ebird mysql sqli
dfa0: 74 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  te.*/.int sqlite
dfb0: 33 46 74 73 33 53 65 67 52 65 61 64 65 72 50 65  3Fts3SegReaderPe
dfc0: 6e 64 69 6e 67 28 0a 20 20 46 74 73 33 54 61 62  nding(.  Fts3Tab
dfd0: 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
dfe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74           /* Virt
dff0: 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  ual table handle
e000: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 78   */.  int iIndex
e010: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e020: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66        /* Index f
e030: 6f 72 20 70 2d 3e 61 49 6e 64 65 78 20 2a 2f 0a  or p->aIndex */.
e040: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
e050: 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
e060: 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 61    /* Term to sea
e070: 72 63 68 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  rch for */.  int
e080: 20 6e 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20   nTerm,         
e090: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e0a0: 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 7a  Size of buffer z
e0b0: 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 50  Term */.  int bP
e0c0: 72 65 66 69 78 2c 20 20 20 20 20 20 20 20 20 20  refix,          
e0d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
e0e0: 65 20 66 6f 72 20 61 20 70 72 65 66 69 78 20 69  e for a prefix i
e0f0: 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 46 74 73  terator */.  Fts
e100: 33 53 65 67 52 65 61 64 65 72 20 2a 2a 70 70 52  3SegReader **ppR
e110: 65 61 64 65 72 20 20 20 20 20 20 20 20 2f 2a 20  eader        /* 
e120: 4f 55 54 3a 20 53 65 67 52 65 61 64 65 72 20 66  OUT: SegReader f
e130: 6f 72 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73  or pending-terms
e140: 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 53 65 67   */.){.  Fts3Seg
e150: 52 65 61 64 65 72 20 2a 70 52 65 61 64 65 72 20  Reader *pReader 
e160: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 74 73 33  = 0;     /* Fts3
e170: 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74  SegReader object
e180: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
e190: 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 70 45  Fts3HashElem *pE
e1a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e1b0: 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
e1c0: 61 62 6c 65 20 2a 2f 0a 20 20 46 74 73 33 48 61  able */.  Fts3Ha
e1d0: 73 68 45 6c 65 6d 20 2a 2a 61 45 6c 65 6d 20 3d  shElem **aElem =
e1e0: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 72   0;       /* Arr
e1f0: 61 79 20 6f 66 20 74 65 72 6d 20 68 61 73 68 20  ay of term hash 
e200: 65 6e 74 72 69 65 73 20 74 6f 20 73 63 61 6e 20  entries to scan 
e210: 2a 2f 0a 20 20 69 6e 74 20 6e 45 6c 65 6d 20 3d  */.  int nElem =
e220: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
e230: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
e240: 61 72 72 61 79 20 61 74 20 61 45 6c 65 6d 20 2a  array at aElem *
e250: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
e260: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
e270: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
e280: 64 65 20 2a 2f 0a 20 20 46 74 73 33 48 61 73 68  de */.  Fts3Hash
e290: 20 2a 70 48 61 73 68 3b 0a 0a 20 20 70 48 61 73   *pHash;..  pHas
e2a0: 68 20 3d 20 26 70 2d 3e 61 49 6e 64 65 78 5b 69  h = &p->aIndex[i
e2b0: 49 6e 64 65 78 5d 2e 68 50 65 6e 64 69 6e 67 3b  Index].hPending;
e2c0: 0a 20 20 69 66 28 20 62 50 72 65 66 69 78 20 29  .  if( bPrefix )
e2d0: 7b 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63  {.    int nAlloc
e2e0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
e2f0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
e300: 6c 6c 6f 63 61 74 65 64 20 61 72 72 61 79 20 61  llocated array a
e310: 74 20 61 45 6c 65 6d 20 2a 2f 0a 0a 20 20 20 20  t aElem */..    
e320: 66 6f 72 28 70 45 3d 66 74 73 33 48 61 73 68 46  for(pE=fts3HashF
e330: 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 3b  irst(pHash); pE;
e340: 20 70 45 3d 66 74 73 33 48 61 73 68 4e 65 78 74   pE=fts3HashNext
e350: 28 70 45 29 29 7b 0a 20 20 20 20 20 20 63 68 61  (pE)){.      cha
e360: 72 20 2a 7a 4b 65 79 20 3d 20 28 63 68 61 72 20  r *zKey = (char 
e370: 2a 29 66 74 73 33 48 61 73 68 4b 65 79 28 70 45  *)fts3HashKey(pE
e380: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65  );.      int nKe
e390: 79 20 3d 20 66 74 73 33 48 61 73 68 4b 65 79 73  y = fts3HashKeys
e3a0: 69 7a 65 28 70 45 29 3b 0a 20 20 20 20 20 20 69  ize(pE);.      i
e3b0: 66 28 20 6e 54 65 72 6d 3d 3d 30 20 7c 7c 20 28  f( nTerm==0 || (
e3c0: 6e 4b 65 79 3e 3d 6e 54 65 72 6d 20 26 26 20 30  nKey>=nTerm && 0
e3d0: 3d 3d 6d 65 6d 63 6d 70 28 7a 4b 65 79 2c 20 7a  ==memcmp(zKey, z
e3e0: 54 65 72 6d 2c 20 6e 54 65 72 6d 29 29 20 29 7b  Term, nTerm)) ){
e3f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 45 6c  .        if( nEl
e400: 65 6d 3d 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  em==nAlloc ){.  
e410: 20 20 20 20 20 20 20 20 46 74 73 33 48 61 73 68          Fts3Hash
e420: 45 6c 65 6d 20 2a 2a 61 45 6c 65 6d 32 3b 0a 20  Elem **aElem2;. 
e430: 20 20 20 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20           nAlloc 
e440: 2b 3d 20 31 36 3b 0a 20 20 20 20 20 20 20 20 20  += 16;.         
e450: 20 61 45 6c 65 6d 32 20 3d 20 28 46 74 73 33 48   aElem2 = (Fts3H
e460: 61 73 68 45 6c 65 6d 20 2a 2a 29 73 71 6c 69 74  ashElem **)sqlit
e470: 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20  e3_realloc(.    
e480: 20 20 20 20 20 20 20 20 20 20 61 45 6c 65 6d 2c            aElem,
e490: 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 46   nAlloc*sizeof(F
e4a0: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 29 0a 20  ts3HashElem *). 
e4b0: 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
e4c0: 20 20 20 20 20 20 69 66 28 20 21 61 45 6c 65 6d        if( !aElem
e4d0: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
e4e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
e4f0: 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM;.            
e500: 6e 45 6c 65 6d 20 3d 20 30 3b 0a 20 20 20 20 20  nElem = 0;.     
e510: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e520: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e530: 20 20 20 20 61 45 6c 65 6d 20 3d 20 61 45 6c 65      aElem = aEle
e540: 6d 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  m2;.        }.. 
e550: 20 20 20 20 20 20 20 61 45 6c 65 6d 5b 6e 45 6c         aElem[nEl
e560: 65 6d 2b 2b 5d 20 3d 20 70 45 3b 0a 20 20 20 20  em++] = pE;.    
e570: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
e580: 2a 20 49 66 20 6d 6f 72 65 20 74 68 61 6e 20 6f  * If more than o
e590: 6e 65 20 74 65 72 6d 20 6d 61 74 63 68 65 73 20  ne term matches 
e5a0: 74 68 65 20 70 72 65 66 69 78 2c 20 73 6f 72 74  the prefix, sort
e5b0: 20 74 68 65 20 46 74 73 33 48 61 73 68 45 6c 65   the Fts3HashEle
e5c0: 6d 0a 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 73  m.    ** objects
e5d0: 20 69 6e 20 74 65 72 6d 20 6f 72 64 65 72 20 75   in term order u
e5e0: 73 69 6e 67 20 71 73 6f 72 74 28 29 2e 20 54 68  sing qsort(). Th
e5f0: 69 73 20 75 73 65 73 20 74 68 65 20 73 61 6d 65  is uses the same
e600: 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20   comparison.    
e610: 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 61 73 20 69  ** callback as i
e620: 73 20 75 73 65 64 20 77 68 65 6e 20 66 6c 75 73  s used when flus
e630: 68 69 6e 67 20 74 65 72 6d 73 20 74 6f 20 64 69  hing terms to di
e640: 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  sk..    */.    i
e650: 66 28 20 6e 45 6c 65 6d 3e 31 20 29 7b 0a 20 20  f( nElem>1 ){.  
e660: 20 20 20 20 71 73 6f 72 74 28 61 45 6c 65 6d 2c      qsort(aElem,
e670: 20 6e 45 6c 65 6d 2c 20 73 69 7a 65 6f 66 28 46   nElem, sizeof(F
e680: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 29 2c 20  ts3HashElem *), 
e690: 66 74 73 33 43 6f 6d 70 61 72 65 45 6c 65 6d 42  fts3CompareElemB
e6a0: 79 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20  yTerm);.    }.. 
e6b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
e6c0: 68 65 20 71 75 65 72 79 20 69 73 20 61 20 73 69  he query is a si
e6d0: 6d 70 6c 65 20 74 65 72 6d 20 6c 6f 6f 6b 75 70  mple term lookup
e6e0: 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 74   that matches at
e6f0: 20 6d 6f 73 74 20 6f 6e 65 20 74 65 72 6d 20 69   most one term i
e700: 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64  n.    ** the ind
e710: 65 78 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 20  ex. All that is 
e720: 72 65 71 75 69 72 65 64 20 69 73 20 61 20 73 74  required is a st
e730: 72 61 69 67 68 74 20 68 61 73 68 2d 6c 6f 6f 6b  raight hash-look
e740: 75 70 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  up. .    **.    
e750: 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 73  ** Because the s
e760: 74 61 63 6b 20 61 64 64 72 65 73 73 20 6f 66 20  tack address of 
e770: 70 45 20 6d 61 79 20 62 65 20 61 63 63 65 73 73  pE may be access
e780: 65 64 20 76 69 61 20 74 68 65 20 61 45 6c 65 6d  ed via the aElem
e790: 20 70 6f 69 6e 74 65 72 0a 20 20 20 20 2a 2a 20   pointer.    ** 
e7a0: 62 65 6c 6f 77 2c 20 74 68 65 20 22 46 74 73 33  below, the "Fts3
e7b0: 48 61 73 68 45 6c 65 6d 20 2a 70 45 22 20 6d 75  HashElem *pE" mu
e7c0: 73 74 20 62 65 20 64 65 63 6c 61 72 65 64 20 73  st be declared s
e7d0: 6f 20 74 68 61 74 20 69 74 20 69 73 20 76 61 6c  o that it is val
e7e0: 69 64 0a 20 20 20 20 2a 2a 20 77 69 74 68 69 6e  id.    ** within
e7f0: 20 74 68 69 73 20 65 6e 74 69 72 65 20 66 75 6e   this entire fun
e800: 63 74 69 6f 6e 2c 20 6e 6f 74 20 6a 75 73 74 20  ction, not just 
e810: 74 68 69 73 20 22 65 6c 73 65 7b 2e 2e 2e 7d 22  this "else{...}"
e820: 20 62 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20   block..    */. 
e830: 20 20 20 70 45 20 3d 20 66 74 73 33 48 61 73 68     pE = fts3Hash
e840: 46 69 6e 64 45 6c 65 6d 28 70 48 61 73 68 2c 20  FindElem(pHash, 
e850: 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  zTerm, nTerm);. 
e860: 20 20 20 69 66 28 20 70 45 20 29 7b 0a 20 20 20     if( pE ){.   
e870: 20 20 20 61 45 6c 65 6d 20 3d 20 26 70 45 3b 0a     aElem = &pE;.
e880: 20 20 20 20 20 20 6e 45 6c 65 6d 20 3d 20 31 3b        nElem = 1;
e890: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
e8a0: 28 20 6e 45 6c 65 6d 3e 30 20 29 7b 0a 20 20 20  ( nElem>0 ){.   
e8b0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a   int nByte = siz
e8c0: 65 6f 66 28 46 74 73 33 53 65 67 52 65 61 64 65  eof(Fts3SegReade
e8d0: 72 29 20 2b 20 28 6e 45 6c 65 6d 2b 31 29 2a 73  r) + (nElem+1)*s
e8e0: 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68 45 6c  izeof(Fts3HashEl
e8f0: 65 6d 20 2a 29 3b 0a 20 20 20 20 70 52 65 61 64  em *);.    pRead
e900: 65 72 20 3d 20 28 46 74 73 33 53 65 67 52 65 61  er = (Fts3SegRea
e910: 64 65 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  der *)sqlite3_ma
e920: 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 20  lloc(nByte);.   
e930: 20 69 66 28 20 21 70 52 65 61 64 65 72 20 29 7b   if( !pReader ){
e940: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
e950: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
e960: 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lse{.      memse
e970: 74 28 70 52 65 61 64 65 72 2c 20 30 2c 20 6e 42  t(pReader, 0, nB
e980: 79 74 65 29 3b 0a 20 20 20 20 20 20 70 52 65 61  yte);.      pRea
e990: 64 65 72 2d 3e 69 49 64 78 20 3d 20 30 78 37 46  der->iIdx = 0x7F
e9a0: 46 46 46 46 46 46 3b 0a 20 20 20 20 20 20 70 52  FFFFFF;.      pR
e9b0: 65 61 64 65 72 2d 3e 70 70 4e 65 78 74 45 6c 65  eader->ppNextEle
e9c0: 6d 20 3d 20 28 46 74 73 33 48 61 73 68 45 6c 65  m = (Fts3HashEle
e9d0: 6d 20 2a 2a 29 26 70 52 65 61 64 65 72 5b 31 5d  m **)&pReader[1]
e9e0: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
e9f0: 52 65 61 64 65 72 2d 3e 70 70 4e 65 78 74 45 6c  Reader->ppNextEl
ea00: 65 6d 2c 20 61 45 6c 65 6d 2c 20 6e 45 6c 65 6d  em, aElem, nElem
ea10: 2a 73 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68  *sizeof(Fts3Hash
ea20: 45 6c 65 6d 20 2a 29 29 3b 0a 20 20 20 20 7d 0a  Elem *));.    }.
ea30: 20 20 7d 0a 0a 20 20 69 66 28 20 62 50 72 65 66    }..  if( bPref
ea40: 69 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ix ){.    sqlite
ea50: 33 5f 66 72 65 65 28 61 45 6c 65 6d 29 3b 0a 20  3_free(aElem);. 
ea60: 20 7d 0a 20 20 2a 70 70 52 65 61 64 65 72 20 3d   }.  *ppReader =
ea70: 20 70 52 65 61 64 65 72 3b 0a 20 20 72 65 74 75   pReader;.  retu
ea80: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
ea90: 43 6f 6d 70 61 72 65 20 74 68 65 20 65 6e 74 72  Compare the entr
eaa0: 69 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ies pointed to b
eab0: 79 20 74 77 6f 20 46 74 73 33 53 65 67 52 65 61  y two Fts3SegRea
eac0: 64 65 72 20 73 74 72 75 63 74 75 72 65 73 2e 20  der structures. 
ead0: 0a 2a 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69  .** Comparison i
eae0: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
eaf0: 0a 2a 2a 20 20 20 31 29 20 45 4f 46 20 69 73 20  .**   1) EOF is 
eb00: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e 6f 74  greater than not
eb10: 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29   EOF..**.**   2)
eb20: 20 54 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   The current ter
eb30: 6d 73 20 28 69 66 20 61 6e 79 29 20 61 72 65 20  ms (if any) are 
eb40: 63 6f 6d 70 61 72 65 64 20 75 73 69 6e 67 20 6d  compared using m
eb50: 65 6d 63 6d 70 28 29 2e 20 49 66 20 6f 6e 65 0a  emcmp(). If one.
eb60: 2a 2a 20 20 20 20 20 20 74 65 72 6d 20 69 73 20  **      term is 
eb70: 61 20 70 72 65 66 69 78 20 6f 66 20 61 6e 6f 74  a prefix of anot
eb80: 68 65 72 2c 20 74 68 65 20 6c 6f 6e 67 65 72 20  her, the longer 
eb90: 74 65 72 6d 20 69 73 20 63 6f 6e 73 69 64 65 72  term is consider
eba0: 65 64 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c  ed the.**      l
ebb0: 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 33  arger..**.**   3
ebc0: 29 20 42 79 20 73 65 67 6d 65 6e 74 20 61 67 65  ) By segment age
ebd0: 2e 20 41 6e 20 6f 6c 64 65 72 20 73 65 67 6d 65  . An older segme
ebe0: 6e 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  nt is considered
ebf0: 20 6c 61 72 67 65 72 2e 0a 2a 2f 0a 73 74 61 74   larger..*/.stat
ec00: 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65  ic int fts3SegRe
ec10: 61 64 65 72 43 6d 70 28 46 74 73 33 53 65 67 52  aderCmp(Fts3SegR
ec20: 65 61 64 65 72 20 2a 70 4c 68 73 2c 20 46 74 73  eader *pLhs, Fts
ec30: 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 68 73  3SegReader *pRhs
ec40: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
ec50: 66 28 20 70 4c 68 73 2d 3e 61 4e 6f 64 65 20 26  f( pLhs->aNode &
ec60: 26 20 70 52 68 73 2d 3e 61 4e 6f 64 65 20 29 7b  & pRhs->aNode ){
ec70: 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 70  .    int rc2 = p
ec80: 4c 68 73 2d 3e 6e 54 65 72 6d 20 2d 20 70 52 68  Lhs->nTerm - pRh
ec90: 73 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 69 66  s->nTerm;.    if
eca0: 28 20 72 63 32 3c 30 20 29 7b 0a 20 20 20 20 20  ( rc2<0 ){.     
ecb0: 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 68   rc = memcmp(pLh
ecc0: 73 2d 3e 7a 54 65 72 6d 2c 20 70 52 68 73 2d 3e  s->zTerm, pRhs->
ecd0: 7a 54 65 72 6d 2c 20 70 4c 68 73 2d 3e 6e 54 65  zTerm, pLhs->nTe
ece0: 72 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rm);.    }else{.
ecf0: 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d        rc = memcm
ed00: 70 28 70 4c 68 73 2d 3e 7a 54 65 72 6d 2c 20 70  p(pLhs->zTerm, p
ed10: 52 68 73 2d 3e 7a 54 65 72 6d 2c 20 70 52 68 73  Rhs->zTerm, pRhs
ed20: 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a  ->nTerm);.    }.
ed30: 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b      if( rc==0 ){
ed40: 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
ed50: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
ed60: 20 20 20 20 72 63 20 3d 20 28 70 4c 68 73 2d 3e      rc = (pLhs->
ed70: 61 4e 6f 64 65 3d 3d 30 29 20 2d 20 28 70 52 68  aNode==0) - (pRh
ed80: 73 2d 3e 61 4e 6f 64 65 3d 3d 30 29 3b 0a 20 20  s->aNode==0);.  
ed90: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  }.  if( rc==0 ){
eda0: 0a 20 20 20 20 72 63 20 3d 20 70 52 68 73 2d 3e  .    rc = pRhs->
edb0: 69 49 64 78 20 2d 20 70 4c 68 73 2d 3e 69 49 64  iIdx - pLhs->iId
edc0: 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  x;.  }.  assert(
edd0: 20 72 63 21 3d 30 20 29 3b 0a 20 20 72 65 74 75   rc!=0 );.  retu
ede0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
edf0: 41 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6d 70  A different comp
ee00: 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
ee10: 66 6f 72 20 53 65 67 52 65 61 64 65 72 20 73 74  for SegReader st
ee20: 72 75 63 74 75 72 65 73 2e 20 49 6e 20 74 68 69  ructures. In thi
ee30: 73 0a 2a 2a 20 76 65 72 73 69 6f 6e 2c 20 69 74  s.** version, it
ee40: 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
ee50: 20 65 61 63 68 20 53 65 67 52 65 61 64 65 72 20   each SegReader 
ee60: 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74  points to an ent
ee70: 72 79 20 69 6e 0a 2a 2a 20 61 20 64 6f 63 6c 69  ry in.** a docli
ee80: 73 74 20 66 6f 72 20 69 64 65 6e 74 69 63 61 6c  st for identical
ee90: 20 74 65 72 6d 73 2e 20 43 6f 6d 70 61 72 69 73   terms. Comparis
eea0: 6f 6e 20 69 73 20 6d 61 64 65 20 61 73 20 66 6f  on is made as fo
eeb0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  llows:.**.**   1
eec0: 29 20 45 4f 46 20 28 65 6e 64 20 6f 66 20 64 6f  ) EOF (end of do
eed0: 63 6c 69 73 74 20 69 6e 20 74 68 69 73 20 63 61  clist in this ca
eee0: 73 65 29 20 69 73 20 67 72 65 61 74 65 72 20 74  se) is greater t
eef0: 68 61 6e 20 6e 6f 74 20 45 4f 46 2e 0a 2a 2a 0a  han not EOF..**.
ef00: 2a 2a 20 20 20 32 29 20 42 79 20 63 75 72 72 65  **   2) By curre
ef10: 6e 74 20 64 6f 63 69 64 2e 0a 2a 2a 0a 2a 2a 20  nt docid..**.** 
ef20: 20 20 33 29 20 42 79 20 73 65 67 6d 65 6e 74 20    3) By segment 
ef30: 61 67 65 2e 20 41 6e 20 6f 6c 64 65 72 20 73 65  age. An older se
ef40: 67 6d 65 6e 74 20 69 73 20 63 6f 6e 73 69 64 65  gment is conside
ef50: 72 65 64 20 6c 61 72 67 65 72 2e 0a 2a 2f 0a 73  red larger..*/.s
ef60: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65  tatic int fts3Se
ef70: 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d  gReaderDoclistCm
ef80: 70 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20  p(Fts3SegReader 
ef90: 2a 70 4c 68 73 2c 20 46 74 73 33 53 65 67 52 65  *pLhs, Fts3SegRe
efa0: 61 64 65 72 20 2a 70 52 68 73 29 7b 0a 20 20 69  ader *pRhs){.  i
efb0: 6e 74 20 72 63 20 3d 20 28 70 4c 68 73 2d 3e 70  nt rc = (pLhs->p
efc0: 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30 29 2d 28  OffsetList==0)-(
efd0: 70 52 68 73 2d 3e 70 4f 66 66 73 65 74 4c 69 73  pRhs->pOffsetLis
efe0: 74 3d 3d 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  t==0);.  if( rc=
eff0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4c  =0 ){.    if( pL
f000: 68 73 2d 3e 69 44 6f 63 69 64 3d 3d 70 52 68 73  hs->iDocid==pRhs
f010: 2d 3e 69 44 6f 63 69 64 20 29 7b 0a 20 20 20 20  ->iDocid ){.    
f020: 20 20 72 63 20 3d 20 70 52 68 73 2d 3e 69 49 64    rc = pRhs->iId
f030: 78 20 2d 20 70 4c 68 73 2d 3e 69 49 64 78 3b 0a  x - pLhs->iIdx;.
f040: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f050: 20 72 63 20 3d 20 28 70 4c 68 73 2d 3e 69 44 6f   rc = (pLhs->iDo
f060: 63 69 64 20 3e 20 70 52 68 73 2d 3e 69 44 6f 63  cid > pRhs->iDoc
f070: 69 64 29 20 3f 20 31 20 3a 20 2d 31 3b 0a 20 20  id) ? 1 : -1;.  
f080: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
f090: 28 20 70 4c 68 73 2d 3e 61 4e 6f 64 65 20 26 26  ( pLhs->aNode &&
f0a0: 20 70 52 68 73 2d 3e 61 4e 6f 64 65 20 29 3b 0a   pRhs->aNode );.
f0b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73    return rc;.}.s
f0c0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65  tatic int fts3Se
f0d0: 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d  gReaderDoclistCm
f0e0: 70 52 65 76 28 46 74 73 33 53 65 67 52 65 61 64  pRev(Fts3SegRead
f0f0: 65 72 20 2a 70 4c 68 73 2c 20 46 74 73 33 53 65  er *pLhs, Fts3Se
f100: 67 52 65 61 64 65 72 20 2a 70 52 68 73 29 7b 0a  gReader *pRhs){.
f110: 20 20 69 6e 74 20 72 63 20 3d 20 28 70 4c 68 73    int rc = (pLhs
f120: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30  ->pOffsetList==0
f130: 29 2d 28 70 52 68 73 2d 3e 70 4f 66 66 73 65 74  )-(pRhs->pOffset
f140: 4c 69 73 74 3d 3d 30 29 3b 0a 20 20 69 66 28 20  List==0);.  if( 
f150: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  rc==0 ){.    if(
f160: 20 70 4c 68 73 2d 3e 69 44 6f 63 69 64 3d 3d 70   pLhs->iDocid==p
f170: 52 68 73 2d 3e 69 44 6f 63 69 64 20 29 7b 0a 20  Rhs->iDocid ){. 
f180: 20 20 20 20 20 72 63 20 3d 20 70 52 68 73 2d 3e       rc = pRhs->
f190: 69 49 64 78 20 2d 20 70 4c 68 73 2d 3e 69 49 64  iIdx - pLhs->iId
f1a0: 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  x;.    }else{.  
f1b0: 20 20 20 20 72 63 20 3d 20 28 70 4c 68 73 2d 3e      rc = (pLhs->
f1c0: 69 44 6f 63 69 64 20 3c 20 70 52 68 73 2d 3e 69  iDocid < pRhs->i
f1d0: 44 6f 63 69 64 29 20 3f 20 31 20 3a 20 2d 31 3b  Docid) ? 1 : -1;
f1e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
f1f0: 65 72 74 28 20 70 4c 68 73 2d 3e 61 4e 6f 64 65  ert( pLhs->aNode
f200: 20 26 26 20 70 52 68 73 2d 3e 61 4e 6f 64 65 20   && pRhs->aNode 
f210: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
f220: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
f230: 20 74 68 65 20 74 65 72 6d 20 74 68 61 74 20 74   the term that t
f240: 68 65 20 46 74 73 33 53 65 67 52 65 61 64 65 72  he Fts3SegReader
f250: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
f260: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
f270: 6d 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  ment.** points t
f280: 6f 20 77 69 74 68 20 74 68 65 20 74 65 72 6d 20  o with the term 
f290: 73 70 65 63 69 66 69 65 64 20 62 79 20 61 72 67  specified by arg
f2a0: 75 6d 65 6e 74 73 20 7a 54 65 72 6d 20 61 6e 64  uments zTerm and
f2b0: 20 6e 54 65 72 6d 2e 20 0a 2a 2a 0a 2a 2a 20 49   nTerm. .**.** I
f2c0: 66 20 74 68 65 20 70 53 65 67 20 69 74 65 72 61  f the pSeg itera
f2d0: 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
f2e0: 74 20 45 4f 46 2c 20 72 65 74 75 72 6e 20 30 2e  t EOF, return 0.
f2f0: 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
f300: 72 6e 0a 2a 2a 20 2d 76 65 20 69 66 20 74 68 65  rn.** -ve if the
f310: 20 70 53 65 67 20 74 65 72 6d 20 69 73 20 6c 65   pSeg term is le
f320: 73 73 20 74 68 61 6e 20 7a 54 65 72 6d 2f 6e 54  ss than zTerm/nT
f330: 65 72 6d 2c 20 30 20 69 66 20 74 68 65 20 74 77  erm, 0 if the tw
f340: 6f 20 74 65 72 6d 73 20 61 72 65 0a 2a 2a 20 65  o terms are.** e
f350: 71 75 61 6c 2c 20 6f 72 20 2b 76 65 20 69 66 20  qual, or +ve if 
f360: 74 68 65 20 70 53 65 67 20 74 65 72 6d 20 69 73  the pSeg term is
f370: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 54   greater than zT
f380: 65 72 6d 2f 6e 54 65 72 6d 2e 0a 2a 2f 0a 73 74  erm/nTerm..*/.st
f390: 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67  atic int fts3Seg
f3a0: 52 65 61 64 65 72 54 65 72 6d 43 6d 70 28 0a 20  ReaderTermCmp(. 
f3b0: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
f3c0: 70 53 65 67 2c 20 20 20 20 20 20 20 20 20 20 20  pSeg,           
f3d0: 20 2f 2a 20 53 65 67 6d 65 6e 74 20 72 65 61 64   /* Segment read
f3e0: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  er object */.  c
f3f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
f400: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
f410: 2a 20 54 65 72 6d 20 74 6f 20 63 6f 6d 70 61 72  * Term to compar
f420: 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  e to */.  int nT
f430: 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  erm             
f440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
f450: 65 20 6f 66 20 74 65 72 6d 20 7a 54 65 72 6d 20  e of term zTerm 
f460: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20  in bytes */.){. 
f470: 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20   int res = 0;.  
f480: 69 66 28 20 70 53 65 67 2d 3e 61 4e 6f 64 65 20  if( pSeg->aNode 
f490: 29 7b 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d  ){.    if( pSeg-
f4a0: 3e 6e 54 65 72 6d 3e 6e 54 65 72 6d 20 29 7b 0a  >nTerm>nTerm ){.
f4b0: 20 20 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63        res = memc
f4c0: 6d 70 28 70 53 65 67 2d 3e 7a 54 65 72 6d 2c 20  mp(pSeg->zTerm, 
f4d0: 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  zTerm, nTerm);. 
f4e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f4f0: 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 53 65  res = memcmp(pSe
f500: 67 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65 72 6d 2c  g->zTerm, zTerm,
f510: 20 70 53 65 67 2d 3e 6e 54 65 72 6d 29 3b 0a 20   pSeg->nTerm);. 
f520: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 73     }.    if( res
f530: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73  ==0 ){.      res
f540: 20 3d 20 70 53 65 67 2d 3e 6e 54 65 72 6d 2d 6e   = pSeg->nTerm-n
f550: 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Term;.    }.  }.
f560: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
f570: 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
f580: 61 70 53 65 67 6d 65 6e 74 20 69 73 20 61 6e 20  apSegment is an 
f590: 61 72 72 61 79 20 6f 66 20 6e 53 65 67 6d 65 6e  array of nSegmen
f5a0: 74 20 65 6c 65 6d 65 6e 74 73 2e 20 49 74 20 69  t elements. It i
f5b0: 73 20 6b 6e 6f 77 6e 20 74 68 61 74 0a 2a 2a 20  s known that.** 
f5c0: 74 68 65 20 66 69 6e 61 6c 20 28 6e 53 65 67 6d  the final (nSegm
f5d0: 65 6e 74 2d 6e 53 75 73 70 65 63 74 29 20 6d 65  ent-nSuspect) me
f5e0: 6d 62 65 72 73 20 61 72 65 20 61 6c 72 65 61 64  mbers are alread
f5f0: 79 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  y in sorted orde
f600: 72 0a 2a 2a 20 28 61 63 63 6f 72 64 69 6e 67 20  r.** (according 
f610: 74 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  to the compariso
f620: 6e 20 66 75 6e 63 74 69 6f 6e 20 70 72 6f 76 69  n function provi
f630: 64 65 64 29 2e 20 54 68 69 73 20 66 75 6e 63 74  ded). This funct
f640: 69 6f 6e 20 73 68 75 66 66 6c 65 73 0a 2a 2a 20  ion shuffles.** 
f650: 74 68 65 20 61 72 72 61 79 20 61 72 6f 75 6e 64  the array around
f660: 20 75 6e 74 69 6c 20 61 6c 6c 20 65 6e 74 72 69   until all entri
f670: 65 73 20 61 72 65 20 69 6e 20 73 6f 72 74 65 64  es are in sorted
f680: 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
f690: 63 20 76 6f 69 64 20 66 74 73 33 53 65 67 52 65  c void fts3SegRe
f6a0: 61 64 65 72 53 6f 72 74 28 0a 20 20 46 74 73 33  aderSort(.  Fts3
f6b0: 53 65 67 52 65 61 64 65 72 20 2a 2a 61 70 53 65  SegReader **apSe
f6c0: 67 6d 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20  gment,          
f6d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
f6e0: 72 61 79 20 74 6f 20 73 6f 72 74 20 65 6e 74 72  ray to sort entr
f6f0: 69 65 73 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20  ies of */.  int 
f700: 6e 53 65 67 6d 65 6e 74 2c 20 20 20 20 20 20 20  nSegment,       
f710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
f730: 7a 65 20 6f 66 20 61 70 53 65 67 6d 65 6e 74 20  ze of apSegment 
f740: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  array */.  int n
f750: 53 75 73 70 65 63 74 2c 20 20 20 20 20 20 20 20  Suspect,        
f760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
f780: 6f 72 74 65 64 20 65 6e 74 72 79 20 63 6f 75 6e  orted entry coun
f790: 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 6d  t */.  int (*xCm
f7a0: 70 29 28 46 74 73 33 53 65 67 52 65 61 64 65 72  p)(Fts3SegReader
f7b0: 20 2a 2c 20 46 74 73 33 53 65 67 52 65 61 64 65   *, Fts3SegReade
f7c0: 72 20 2a 29 20 20 2f 2a 20 43 6f 6d 70 61 72 69  r *)  /* Compari
f7d0: 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  son function */.
f7e0: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f800: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
f810: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20   variable */..  
f820: 61 73 73 65 72 74 28 20 6e 53 75 73 70 65 63 74  assert( nSuspect
f830: 3c 3d 6e 53 65 67 6d 65 6e 74 20 29 3b 0a 0a 20  <=nSegment );.. 
f840: 20 69 66 28 20 6e 53 75 73 70 65 63 74 3d 3d 6e   if( nSuspect==n
f850: 53 65 67 6d 65 6e 74 20 29 20 6e 53 75 73 70 65  Segment ) nSuspe
f860: 63 74 2d 2d 3b 0a 20 20 66 6f 72 28 69 3d 6e 53  ct--;.  for(i=nS
f870: 75 73 70 65 63 74 2d 31 3b 20 69 3e 3d 30 3b 20  uspect-1; i>=0; 
f880: 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b  i--){.    int j;
f890: 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c  .    for(j=i; j<
f8a0: 28 6e 53 65 67 6d 65 6e 74 2d 31 29 3b 20 6a 2b  (nSegment-1); j+
f8b0: 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 33 53 65  +){.      Fts3Se
f8c0: 67 52 65 61 64 65 72 20 2a 70 54 6d 70 3b 0a 20  gReader *pTmp;. 
f8d0: 20 20 20 20 20 69 66 28 20 78 43 6d 70 28 61 70       if( xCmp(ap
f8e0: 53 65 67 6d 65 6e 74 5b 6a 5d 2c 20 61 70 53 65  Segment[j], apSe
f8f0: 67 6d 65 6e 74 5b 6a 2b 31 5d 29 3c 30 20 29 20  gment[j+1])<0 ) 
f900: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6d  break;.      pTm
f910: 70 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 6a 2b  p = apSegment[j+
f920: 31 5d 3b 0a 20 20 20 20 20 20 61 70 53 65 67 6d  1];.      apSegm
f930: 65 6e 74 5b 6a 2b 31 5d 20 3d 20 61 70 53 65 67  ent[j+1] = apSeg
f940: 6d 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 20 20 61  ment[j];.      a
f950: 70 53 65 67 6d 65 6e 74 5b 6a 5d 20 3d 20 70 54  pSegment[j] = pT
f960: 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  mp;.    }.  }..#
f970: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
f980: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
f990: 65 20 6c 69 73 74 20 72 65 61 6c 6c 79 20 69 73  e list really is
f9a0: 20 73 6f 72 74 65 64 20 6e 6f 77 2e 20 2a 2f 0a   sorted now. */.
f9b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 6e 53    for(i=0; i<(nS
f9c0: 75 73 70 65 63 74 2d 31 29 3b 20 69 2b 2b 29 7b  uspect-1); i++){
f9d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 78 43 6d  .    assert( xCm
f9e0: 70 28 61 70 53 65 67 6d 65 6e 74 5b 69 5d 2c 20  p(apSegment[i], 
f9f0: 61 70 53 65 67 6d 65 6e 74 5b 69 2b 31 5d 29 3c  apSegment[i+1])<
fa00: 30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  0 );.  }.#endif.
fa10: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 49 6e 73 65 72 74  }../* .** Insert
fa20: 20 61 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74   a record into t
fa30: 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61  he %_segments ta
fa40: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
fa50: 6e 74 20 66 74 73 33 57 72 69 74 65 53 65 67 6d  nt fts3WriteSegm
fa60: 65 6e 74 28 0a 20 20 46 74 73 33 54 61 62 6c 65  ent(.  Fts3Table
fa70: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
fa80: 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61         /* Virtua
fa90: 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  l table handle *
faa0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
fab0: 34 20 69 42 6c 6f 63 6b 2c 20 20 20 20 20 20 20  4 iBlock,       
fac0: 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 69 64 20      /* Block id 
fad0: 66 6f 72 20 6e 65 77 20 62 6c 6f 63 6b 20 2a 2f  for new block */
fae0: 0a 20 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20  .  char *z,     
faf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb00: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
fb10: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
fb20: 6e 67 20 62 6c 6f 63 6b 20 64 61 74 61 20 2a 2f  ng block data */
fb30: 0a 20 20 69 6e 74 20 6e 20 20 20 20 20 20 20 20  .  int n        
fb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb50: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75     /* Size of bu
fb60: 66 66 65 72 20 7a 20 69 6e 20 62 79 74 65 73 20  ffer z in bytes 
fb70: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
fb80: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
fb90: 6e 74 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  nt rc = fts3SqlS
fba0: 74 6d 74 28 70 2c 20 53 51 4c 5f 49 4e 53 45 52  tmt(p, SQL_INSER
fbb0: 54 5f 53 45 47 4d 45 4e 54 53 2c 20 26 70 53 74  T_SEGMENTS, &pSt
fbc0: 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  mt, 0);.  if( rc
fbd0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
fbe0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
fbf0: 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20  int64(pStmt, 1, 
fc00: 69 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 73 71 6c  iBlock);.    sql
fc10: 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
fc20: 53 74 6d 74 2c 20 32 2c 20 7a 2c 20 6e 2c 20 53  Stmt, 2, z, n, S
fc30: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
fc40: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
fc50: 70 53 74 6d 74 29 3b 0a 20 20 20 20 72 63 20 3d  pStmt);.    rc =
fc60: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
fc70: 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Stmt);.  }.  ret
fc80: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
fc90: 20 46 69 6e 64 20 74 68 65 20 6c 61 72 67 65 73   Find the larges
fca0: 74 20 72 65 6c 61 74 69 76 65 20 6c 65 76 65 6c  t relative level
fcb0: 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 74   number in the t
fcc0: 61 62 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73  able. If success
fcd0: 66 75 6c 2c 20 73 65 74 0a 2a 2a 20 2a 70 6e 4d  ful, set.** *pnM
fce0: 61 78 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65  ax to this value
fcf0: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
fd00: 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65  TE_OK. Otherwise
fd10: 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  , if an error oc
fd20: 63 75 72 73 2c 0a 2a 2a 20 73 65 74 20 2a 70 6e  curs,.** set *pn
fd30: 4d 61 78 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20  Max to zero and 
fd40: 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
fd50: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
fd60: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 4d  int sqlite3Fts3M
fd70: 61 78 4c 65 76 65 6c 28 46 74 73 33 54 61 62 6c  axLevel(Fts3Tabl
fd80: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78  e *p, int *pnMax
fd90: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
fda0: 6e 74 20 6d 78 4c 65 76 65 6c 20 3d 20 30 3b 0a  nt mxLevel = 0;.
fdb0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
fdc0: 70 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 72 63  pStmt = 0;..  rc
fdd0: 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
fde0: 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4d 58 4c  , SQL_SELECT_MXL
fdf0: 45 56 45 4c 2c 20 26 70 53 74 6d 74 2c 20 30 29  EVEL, &pStmt, 0)
fe00: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
fe10: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
fe20: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
fe30: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
fe40: 20 29 7b 0a 20 20 20 20 20 20 6d 78 4c 65 76 65   ){.      mxLeve
fe50: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
fe60: 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29  mn_int(pStmt, 0)
fe70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
fe80: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
fe90: 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 2a 70 6e  Stmt);.  }.  *pn
fea0: 4d 61 78 20 3d 20 6d 78 4c 65 76 65 6c 3b 0a 20  Max = mxLevel;. 
feb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
fec0: 2a 20 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 72  * .** Insert a r
fed0: 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 25  ecord into the %
fee0: 5f 73 65 67 64 69 72 20 74 61 62 6c 65 2e 0a 2a  _segdir table..*
fef0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
ff00: 33 57 72 69 74 65 53 65 67 64 69 72 28 0a 20 20  3WriteSegdir(.  
ff10: 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
ff20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff30: 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  /* Virtual table
ff40: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c   handle */.  sql
ff50: 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 65 76 65  ite3_int64 iLeve
ff60: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l,           /* 
ff70: 56 61 6c 75 65 20 66 6f 72 20 22 6c 65 76 65 6c  Value for "level
ff80: 22 20 66 69 65 6c 64 20 28 61 62 73 6f 6c 75 74  " field (absolut
ff90: 65 20 6c 65 76 65 6c 29 20 2a 2f 0a 20 20 69 6e  e level) */.  in
ffa0: 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20 20  t iIdx,         
ffb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ffc0: 20 56 61 6c 75 65 20 66 6f 72 20 22 69 64 78 22   Value for "idx"
ffd0: 20 66 69 65 6c 64 20 2a 2f 0a 20 20 73 71 6c 69   field */.  sqli
ffe0: 74 65 33 5f 69 6e 74 36 34 20 69 53 74 61 72 74  te3_int64 iStart
fff0: 42 6c 6f 63 6b 2c 20 20 20 20 20 20 2f 2a 20 56  Block,      /* V
10000 61 6c 75 65 20 66 6f 72 20 22 73 74 61 72 74 5f  alue for "start_
10010 62 6c 6f 63 6b 22 20 66 69 65 6c 64 20 2a 2f 0a  block" field */.
10020 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
10030 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 2c 20 20  iLeafEndBlock,  
10040 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22    /* Value for "
10050 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b  leaves_end_block
10060 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 73 71 6c  " field */.  sql
10070 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 42  ite3_int64 iEndB
10080 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 2f 2a 20  lock,        /* 
10090 56 61 6c 75 65 20 66 6f 72 20 22 65 6e 64 5f 62  Value for "end_b
100a0 6c 6f 63 6b 22 20 66 69 65 6c 64 20 2a 2f 0a 20  lock" field */. 
100b0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
100c0 4c 65 61 66 44 61 74 61 2c 20 20 20 20 20 20 20  LeafData,       
100d0 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6c 65 61   /* Bytes of lea
100e0 66 20 64 61 74 61 20 69 6e 20 73 65 67 6d 65 6e  f data in segmen
100f0 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 6f  t */.  char *zRo
10100 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ot,             
10110 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 62 20 76         /* Blob v
10120 61 6c 75 65 20 66 6f 72 20 22 72 6f 6f 74 22 20  alue for "root" 
10130 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  field */.  int n
10140 52 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20 20  Root            
10150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10160 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
10170 20 62 75 66 66 65 72 20 7a 52 6f 6f 74 20 2a 2f   buffer zRoot */
10180 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
10190 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
101a0 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
101b0 74 28 70 2c 20 53 51 4c 5f 49 4e 53 45 52 54 5f  t(p, SQL_INSERT_
101c0 53 45 47 44 49 52 2c 20 26 70 53 74 6d 74 2c 20  SEGDIR, &pStmt, 
101d0 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
101e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
101f0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
10200 34 28 70 53 74 6d 74 2c 20 31 2c 20 69 4c 65 76  4(pStmt, 1, iLev
10210 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  el);.    sqlite3
10220 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c  _bind_int(pStmt,
10230 20 32 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 73   2, iIdx);.    s
10240 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
10250 34 28 70 53 74 6d 74 2c 20 33 2c 20 69 53 74 61  4(pStmt, 3, iSta
10260 72 74 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 73 71  rtBlock);.    sq
10270 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
10280 28 70 53 74 6d 74 2c 20 34 2c 20 69 4c 65 61 66  (pStmt, 4, iLeaf
10290 45 6e 64 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 69  EndBlock);.    i
102a0 66 28 20 6e 4c 65 61 66 44 61 74 61 3d 3d 30 20  f( nLeafData==0 
102b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
102c0 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d  _bind_int64(pStm
102d0 74 2c 20 35 2c 20 69 45 6e 64 42 6c 6f 63 6b 29  t, 5, iEndBlock)
102e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
102f0 20 20 20 63 68 61 72 20 2a 7a 45 6e 64 20 3d 20     char *zEnd = 
10300 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
10310 22 25 6c 6c 64 20 25 6c 6c 64 22 2c 20 69 45 6e  "%lld %lld", iEn
10320 64 42 6c 6f 63 6b 2c 20 6e 4c 65 61 66 44 61 74  dBlock, nLeafDat
10330 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  a);.      if( !z
10340 45 6e 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  End ) return SQL
10350 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
10360 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
10370 78 74 28 70 53 74 6d 74 2c 20 35 2c 20 7a 45 6e  xt(pStmt, 5, zEn
10380 64 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66  d, -1, sqlite3_f
10390 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ree);.    }.    
103a0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
103b0 62 28 70 53 74 6d 74 2c 20 36 2c 20 7a 52 6f 6f  b(pStmt, 6, zRoo
103c0 74 2c 20 6e 52 6f 6f 74 2c 20 53 51 4c 49 54 45  t, nRoot, SQLITE
103d0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71  _STATIC);.    sq
103e0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
103f0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
10400 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
10410 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
10420 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
10430 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
10440 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78  he common prefix
10450 20 28 69 66 20 61 6e 79 29 20 73 68 61 72 65 64   (if any) shared
10460 20 62 79 20 7a 50 72 65 76 20 61 6e 64 0a 2a 2a   by zPrev and.**
10470 20 7a 4e 65 78 74 2c 20 69 6e 20 62 79 74 65 73   zNext, in bytes
10480 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 0a  . For example, .
10490 2a 2a 0a 2a 2a 20 20 20 66 74 73 33 50 72 65 66  **.**   fts3Pref
104a0 69 78 43 6f 6d 70 72 65 73 73 28 22 61 62 63 22  ixCompress("abc"
104b0 2c 20 33 2c 20 22 61 62 63 64 65 66 22 2c 20 36  , 3, "abcdef", 6
104c0 29 20 20 20 2f 2f 20 72 65 74 75 72 6e 73 20 33  )   // returns 3
104d0 0a 2a 2a 20 20 20 66 74 73 33 50 72 65 66 69 78  .**   fts3Prefix
104e0 43 6f 6d 70 72 65 73 73 28 22 61 62 58 22 2c 20  Compress("abX", 
104f0 33 2c 20 22 61 62 63 64 65 66 22 2c 20 36 29 20  3, "abcdef", 6) 
10500 20 20 2f 2f 20 72 65 74 75 72 6e 73 20 32 0a 2a    // returns 2.*
10510 2a 20 20 20 66 74 73 33 50 72 65 66 69 78 43 6f  *   fts3PrefixCo
10520 6d 70 72 65 73 73 28 22 61 62 58 22 2c 20 33 2c  mpress("abX", 3,
10530 20 22 58 62 63 64 65 66 22 2c 20 36 29 20 20 20   "Xbcdef", 6)   
10540 2f 2f 20 72 65 74 75 72 6e 73 20 30 0a 2a 2f 0a  // returns 0.*/.
10550 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 50  static int fts3P
10560 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 0a 20  refixCompress(. 
10570 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72   const char *zPr
10580 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ev,             
10590 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
105a0 69 6e 69 6e 67 20 70 72 65 76 69 6f 75 73 20 74  ining previous t
105b0 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72  erm */.  int nPr
105c0 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ev,             
105d0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
105e0 20 6f 66 20 62 75 66 66 65 72 20 7a 50 72 65 76   of buffer zPrev
105f0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
10600 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 78 74  onst char *zNext
10610 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
10620 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
10630 69 6e 67 20 6e 65 78 74 20 74 65 72 6d 20 2a 2f  ing next term */
10640 0a 20 20 69 6e 74 20 6e 4e 65 78 74 20 20 20 20  .  int nNext    
10650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10660 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75     /* Size of bu
10670 66 66 65 72 20 7a 4e 65 78 74 20 69 6e 20 62 79  ffer zNext in by
10680 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tes */.){.  int 
10690 6e 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  n;.  UNUSED_PARA
106a0 4d 45 54 45 52 28 6e 4e 65 78 74 29 3b 0a 20 20  METER(nNext);.  
106b0 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 50 72 65 76  for(n=0; n<nPrev
106c0 20 26 26 20 7a 50 72 65 76 5b 6e 5d 3d 3d 7a 4e   && zPrev[n]==zN
106d0 65 78 74 5b 6e 5d 3b 20 6e 2b 2b 29 3b 0a 20 20  ext[n]; n++);.  
106e0 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
106f0 2a 2a 20 41 64 64 20 74 65 72 6d 20 7a 54 65 72  ** Add term zTer
10700 6d 20 74 6f 20 74 68 65 20 53 65 67 6d 65 6e 74  m to the Segment
10710 4e 6f 64 65 2e 20 49 74 20 69 73 20 67 75 61 72  Node. It is guar
10720 61 6e 74 65 65 64 20 74 68 61 74 20 7a 54 65 72  anteed that zTer
10730 6d 20 69 73 20 6c 61 72 67 65 72 0a 2a 2a 20 28  m is larger.** (
10740 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 6d 65 6d  according to mem
10750 63 6d 70 29 20 74 68 61 6e 20 74 68 65 20 70 72  cmp) than the pr
10760 65 76 69 6f 75 73 20 74 65 72 6d 2e 0a 2a 2f 0a  evious term..*/.
10770 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 4e  static int fts3N
10780 6f 64 65 41 64 64 54 65 72 6d 28 0a 20 20 46 74  odeAddTerm(.  Ft
10790 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
107a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
107b0 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68   Virtual table h
107c0 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 65 67 6d 65  andle */.  Segme
107d0 6e 74 4e 6f 64 65 20 2a 2a 70 70 54 72 65 65 2c  ntNode **ppTree,
107e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
107f0 2f 4f 55 54 3a 20 53 65 67 6d 65 6e 74 4e 6f 64  /OUT: SegmentNod
10800 65 20 68 61 6e 64 6c 65 20 2a 2f 20 0a 20 20 69  e handle */ .  i
10810 6e 74 20 69 73 43 6f 70 79 54 65 72 6d 2c 20 20  nt isCopyTerm,  
10820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10830 2a 20 54 72 75 65 20 69 66 20 7a 54 65 72 6d 2f  * True if zTerm/
10840 6e 54 65 72 6d 20 69 73 20 74 72 61 6e 73 69 65  nTerm is transie
10850 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nt */.  const ch
10860 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20  ar *zTerm,      
10870 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
10880 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e  er to buffer con
10890 74 61 69 6e 69 6e 67 20 74 65 72 6d 20 2a 2f 0a  taining term */.
108a0 20 20 69 6e 74 20 6e 54 65 72 6d 20 20 20 20 20    int nTerm     
108b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108c0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72    /* Size of ter
108d0 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b  m in bytes */.){
108e0 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a  .  SegmentNode *
108f0 70 54 72 65 65 20 3d 20 2a 70 70 54 72 65 65 3b  pTree = *ppTree;
10900 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 53 65 67  .  int rc;.  Seg
10910 6d 65 6e 74 4e 6f 64 65 20 2a 70 4e 65 77 3b 0a  mentNode *pNew;.
10920 0a 20 20 2f 2a 20 46 69 72 73 74 20 74 72 79 20  .  /* First try 
10930 74 6f 20 61 70 70 65 6e 64 20 74 68 65 20 74 65  to append the te
10940 72 6d 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  rm to the curren
10950 74 20 6e 6f 64 65 2e 20 52 65 74 75 72 6e 20 65  t node. Return e
10960 61 72 6c 79 20 69 66 20 0a 20 20 2a 2a 20 74 68  arly if .  ** th
10970 69 73 20 69 73 20 70 6f 73 73 69 62 6c 65 2e 0a  is is possible..
10980 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 72 65 65    */.  if( pTree
10990 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 44 61 74   ){.    int nDat
109a0 61 20 3d 20 70 54 72 65 65 2d 3e 6e 44 61 74 61  a = pTree->nData
109b0 3b 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74  ;     /* Current
109c0 20 73 69 7a 65 20 6f 66 20 6e 6f 64 65 20 69 6e   size of node in
109d0 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e   bytes */.    in
109e0 74 20 6e 52 65 71 20 3d 20 6e 44 61 74 61 3b 20  t nReq = nData; 
109f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10a00 65 71 75 69 72 65 64 20 73 70 61 63 65 20 61 66  equired space af
10a10 74 65 72 20 61 64 64 69 6e 67 20 7a 54 65 72 6d  ter adding zTerm
10a20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 72 65   */.    int nPre
10a30 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  fix;            
10a40 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
10a50 6f 66 20 62 79 74 65 73 20 6f 66 20 70 72 65 66  of bytes of pref
10a60 69 78 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 2a  ix compression *
10a70 2f 0a 20 20 20 20 69 6e 74 20 6e 53 75 66 66 69  /.    int nSuffi
10a80 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
10a90 20 20 20 20 2f 2a 20 53 75 66 66 69 78 20 6c 65      /* Suffix le
10aa0 6e 67 74 68 20 2a 2f 0a 0a 20 20 20 20 6e 50 72  ngth */..    nPr
10ab0 65 66 69 78 20 3d 20 66 74 73 33 50 72 65 66 69  efix = fts3Prefi
10ac0 78 43 6f 6d 70 72 65 73 73 28 70 54 72 65 65 2d  xCompress(pTree-
10ad0 3e 7a 54 65 72 6d 2c 20 70 54 72 65 65 2d 3e 6e  >zTerm, pTree->n
10ae0 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  Term, zTerm, nTe
10af0 72 6d 29 3b 0a 20 20 20 20 6e 53 75 66 66 69 78  rm);.    nSuffix
10b00 20 3d 20 6e 54 65 72 6d 2d 6e 50 72 65 66 69 78   = nTerm-nPrefix
10b10 3b 0a 0a 20 20 20 20 6e 52 65 71 20 2b 3d 20 73  ;..    nReq += s
10b20 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e 74  qlite3Fts3Varint
10b30 4c 65 6e 28 6e 50 72 65 66 69 78 29 2b 73 71 6c  Len(nPrefix)+sql
10b40 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65  ite3Fts3VarintLe
10b50 6e 28 6e 53 75 66 66 69 78 29 2b 6e 53 75 66 66  n(nSuffix)+nSuff
10b60 69 78 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 71  ix;.    if( nReq
10b70 3c 3d 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 7c  <=p->nNodeSize |
10b80 7c 20 21 70 54 72 65 65 2d 3e 7a 54 65 72 6d 20  | !pTree->zTerm 
10b90 29 7b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 52  ){..      if( nR
10ba0 65 71 3e 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20  eq>p->nNodeSize 
10bb0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  ){.        /* An
10bc0 20 75 6e 75 73 75 61 6c 20 63 61 73 65 3a 20 74   unusual case: t
10bd0 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
10be0 20 74 65 72 6d 20 74 6f 20 62 65 20 61 64 64 65   term to be adde
10bf0 64 20 74 6f 20 74 68 65 20 6e 6f 64 65 0a 20 20  d to the node.  
10c00 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65        ** and the
10c10 20 73 74 61 74 69 63 20 6e 6f 64 65 20 62 75 66   static node buf
10c20 66 65 72 20 28 70 2d 3e 6e 4e 6f 64 65 53 69 7a  fer (p->nNodeSiz
10c30 65 20 62 79 74 65 73 29 20 69 73 20 6e 6f 74 20  e bytes) is not 
10c40 6c 61 72 67 65 0a 20 20 20 20 20 20 20 20 2a 2a  large.        **
10c50 20 65 6e 6f 75 67 68 2e 20 55 73 65 20 61 20 73   enough. Use a s
10c60 65 70 61 72 61 74 65 6c 79 20 6d 61 6c 6c 6f 63  eparately malloc
10c70 65 64 20 62 75 66 66 65 72 20 69 6e 73 74 65 61  ed buffer instea
10c80 64 20 54 68 69 73 20 77 61 73 74 65 73 0a 20 20  d This wastes.  
10c90 20 20 20 20 20 20 2a 2a 20 70 2d 3e 6e 4e 6f 64        ** p->nNod
10ca0 65 53 69 7a 65 20 62 79 74 65 73 2c 20 62 75 74  eSize bytes, but
10cb0 20 73 69 6e 63 65 20 74 68 69 73 20 73 63 65 6e   since this scen
10cc0 61 72 69 6f 20 6f 6e 6c 79 20 63 6f 6d 65 73 20  ario only comes 
10cd0 61 62 6f 75 74 20 77 68 65 6e 0a 20 20 20 20 20  about when.     
10ce0 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
10cf0 73 65 20 63 6f 6e 74 61 69 6e 20 74 77 6f 20 74  se contain two t
10d00 65 72 6d 73 20 74 68 61 74 20 73 68 61 72 65 20  erms that share 
10d10 61 20 70 72 65 66 69 78 20 6f 66 20 61 6c 6d 6f  a prefix of almo
10d20 73 74 20 32 4b 42 2c 20 0a 20 20 20 20 20 20 20  st 2KB, .       
10d30 20 2a 2a 20 74 68 69 73 20 69 73 20 6e 6f 74 20   ** this is not 
10d40 65 78 70 65 63 74 65 64 20 74 6f 20 62 65 20 61  expected to be a
10d50 20 73 65 72 69 6f 75 73 20 70 72 6f 62 6c 65 6d   serious problem
10d60 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  . .        */.  
10d70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
10d80 72 65 65 2d 3e 61 44 61 74 61 3d 3d 28 63 68 61  ree->aData==(cha
10d90 72 20 2a 29 26 70 54 72 65 65 5b 31 5d 20 29 3b  r *)&pTree[1] );
10da0 0a 20 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e  .        pTree->
10db0 61 44 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29  aData = (char *)
10dc0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
10dd0 52 65 71 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Req);.        if
10de0 28 20 21 70 54 72 65 65 2d 3e 61 44 61 74 61 20  ( !pTree->aData 
10df0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
10e00 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
10e10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10e20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
10e30 54 72 65 65 2d 3e 7a 54 65 72 6d 20 29 7b 0a 20  Tree->zTerm ){. 
10e40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20         /* There 
10e50 69 73 20 6e 6f 20 70 72 65 66 69 78 2d 6c 65 6e  is no prefix-len
10e60 67 74 68 20 66 69 65 6c 64 20 66 6f 72 20 66 69  gth field for fi
10e70 72 73 74 20 74 65 72 6d 20 69 6e 20 61 20 6e 6f  rst term in a no
10e80 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 44  de */.        nD
10e90 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ata += sqlite3Ft
10ea0 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 54 72  s3PutVarint(&pTr
10eb0 65 65 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d  ee->aData[nData]
10ec0 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 20 20  , nPrefix);.    
10ed0 20 20 7d 0a 0a 20 20 20 20 20 20 6e 44 61 74 61    }..      nData
10ee0 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50   += sqlite3Fts3P
10ef0 75 74 56 61 72 69 6e 74 28 26 70 54 72 65 65 2d  utVarint(&pTree-
10f00 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 6e  >aData[nData], n
10f10 53 75 66 66 69 78 29 3b 0a 20 20 20 20 20 20 6d  Suffix);.      m
10f20 65 6d 63 70 79 28 26 70 54 72 65 65 2d 3e 61 44  emcpy(&pTree->aD
10f30 61 74 61 5b 6e 44 61 74 61 5d 2c 20 26 7a 54 65  ata[nData], &zTe
10f40 72 6d 5b 6e 50 72 65 66 69 78 5d 2c 20 6e 53 75  rm[nPrefix], nSu
10f50 66 66 69 78 29 3b 0a 20 20 20 20 20 20 70 54 72  ffix);.      pTr
10f60 65 65 2d 3e 6e 44 61 74 61 20 3d 20 6e 44 61 74  ee->nData = nDat
10f70 61 20 2b 20 6e 53 75 66 66 69 78 3b 0a 20 20 20  a + nSuffix;.   
10f80 20 20 20 70 54 72 65 65 2d 3e 6e 45 6e 74 72 79     pTree->nEntry
10f90 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69  ++;..      if( i
10fa0 73 43 6f 70 79 54 65 72 6d 20 29 7b 0a 20 20 20  sCopyTerm ){.   
10fb0 20 20 20 20 20 69 66 28 20 70 54 72 65 65 2d 3e       if( pTree->
10fc0 6e 4d 61 6c 6c 6f 63 3c 6e 54 65 72 6d 20 29 7b  nMalloc<nTerm ){
10fd0 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
10fe0 2a 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f  *zNew = sqlite3_
10ff0 72 65 61 6c 6c 6f 63 28 70 54 72 65 65 2d 3e 7a  realloc(pTree->z
11000 4d 61 6c 6c 6f 63 2c 20 6e 54 65 72 6d 2a 32 29  Malloc, nTerm*2)
11010 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
11020 21 7a 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20  !zNew ){.       
11030 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11040 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
11050 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
11060 70 54 72 65 65 2d 3e 6e 4d 61 6c 6c 6f 63 20 3d  pTree->nMalloc =
11070 20 6e 54 65 72 6d 2a 32 3b 0a 20 20 20 20 20 20   nTerm*2;.      
11080 20 20 20 20 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c      pTree->zMall
11090 6f 63 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20 20  oc = zNew;.     
110a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72     }.        pTr
110b0 65 65 2d 3e 7a 54 65 72 6d 20 3d 20 70 54 72 65  ee->zTerm = pTre
110c0 65 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20  e->zMalloc;.    
110d0 20 20 20 20 6d 65 6d 63 70 79 28 70 54 72 65 65      memcpy(pTree
110e0 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20  ->zTerm, zTerm, 
110f0 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  nTerm);.        
11100 70 54 72 65 65 2d 3e 6e 54 65 72 6d 20 3d 20 6e  pTree->nTerm = n
11110 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Term;.      }els
11120 65 7b 0a 20 20 20 20 20 20 20 20 70 54 72 65 65  e{.        pTree
11130 2d 3e 7a 54 65 72 6d 20 3d 20 28 63 68 61 72 20  ->zTerm = (char 
11140 2a 29 7a 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  *)zTerm;.       
11150 20 70 54 72 65 65 2d 3e 6e 54 65 72 6d 20 3d 20   pTree->nTerm = 
11160 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  nTerm;.      }. 
11170 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11180 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
11190 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f  ..  /* If contro
111a0 6c 20 66 6c 6f 77 73 20 74 6f 20 68 65 72 65 2c  l flows to here,
111b0 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73   it was not poss
111c0 69 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 7a  ible to append z
111d0 54 65 72 6d 20 74 6f 20 74 68 65 0a 20 20 2a 2a  Term to the.  **
111e0 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 2e 20 43   current node. C
111f0 72 65 61 74 65 20 61 20 6e 65 77 20 6e 6f 64 65  reate a new node
11200 20 28 61 20 72 69 67 68 74 2d 73 69 62 6c 69 6e   (a right-siblin
11210 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  g of the current
11220 20 6e 6f 64 65 29 2e 0a 20 20 2a 2a 20 49 66 20   node)..  ** If 
11230 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
11240 74 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 74 72  t node in the tr
11250 65 65 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20  ee, the term is 
11260 61 64 64 65 64 20 74 6f 20 69 74 2e 0a 20 20 2a  added to it..  *
11270 2a 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65  *.  ** Otherwise
11280 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f  , the term is no
11290 74 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6e  t added to the n
112a0 65 77 20 6e 6f 64 65 2c 20 69 74 20 69 73 20 6c  ew node, it is l
112b0 65 66 74 20 65 6d 70 74 79 20 66 6f 72 0a 20 20  eft empty for.  
112c0 2a 2a 20 6e 6f 77 2e 20 49 6e 73 74 65 61 64 2c  ** now. Instead,
112d0 20 74 68 65 20 74 65 72 6d 20 69 73 20 69 6e 73   the term is ins
112e0 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 70  erted into the p
112f0 61 72 65 6e 74 20 6f 66 20 70 54 72 65 65 2e 20  arent of pTree. 
11300 49 66 20 70 54 72 65 65 20 0a 20 20 2a 2a 20 68  If pTree .  ** h
11310 61 73 20 6e 6f 20 70 61 72 65 6e 74 2c 20 6f 6e  as no parent, on
11320 65 20 69 73 20 63 72 65 61 74 65 64 20 68 65 72  e is created her
11330 65 2e 0a 20 20 2a 2f 0a 20 20 70 4e 65 77 20 3d  e..  */.  pNew =
11340 20 28 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 29   (SegmentNode *)
11350 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
11360 69 7a 65 6f 66 28 53 65 67 6d 65 6e 74 4e 6f 64  izeof(SegmentNod
11370 65 29 20 2b 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a  e) + p->nNodeSiz
11380 65 29 3b 0a 20 20 69 66 28 20 21 70 4e 65 77 20  e);.  if( !pNew 
11390 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
113a0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
113b0 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30    memset(pNew, 0
113c0 2c 20 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e 74  , sizeof(Segment
113d0 4e 6f 64 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  Node));.  pNew->
113e0 6e 44 61 74 61 20 3d 20 31 20 2b 20 46 54 53 33  nData = 1 + FTS3
113f0 5f 56 41 52 49 4e 54 5f 4d 41 58 3b 0a 20 20 70  _VARINT_MAX;.  p
11400 4e 65 77 2d 3e 61 44 61 74 61 20 3d 20 28 63 68  New->aData = (ch
11410 61 72 20 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 0a  ar *)&pNew[1];..
11420 20 20 69 66 28 20 70 54 72 65 65 20 29 7b 0a 20    if( pTree ){. 
11430 20 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a     SegmentNode *
11440 70 50 61 72 65 6e 74 20 3d 20 70 54 72 65 65 2d  pParent = pTree-
11450 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 72 63  >pParent;.    rc
11460 20 3d 20 66 74 73 33 4e 6f 64 65 41 64 64 54 65   = fts3NodeAddTe
11470 72 6d 28 70 2c 20 26 70 50 61 72 65 6e 74 2c 20  rm(p, &pParent, 
11480 69 73 43 6f 70 79 54 65 72 6d 2c 20 7a 54 65 72  isCopyTerm, zTer
11490 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69  m, nTerm);.    i
114a0 66 28 20 70 54 72 65 65 2d 3e 70 50 61 72 65 6e  f( pTree->pParen
114b0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 54  t==0 ){.      pT
114c0 72 65 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70  ree->pParent = p
114d0 50 61 72 65 6e 74 3b 0a 20 20 20 20 7d 0a 20 20  Parent;.    }.  
114e0 20 20 70 54 72 65 65 2d 3e 70 52 69 67 68 74 20    pTree->pRight 
114f0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77  = pNew;.    pNew
11500 2d 3e 70 4c 65 66 74 6d 6f 73 74 20 3d 20 70 54  ->pLeftmost = pT
11510 72 65 65 2d 3e 70 4c 65 66 74 6d 6f 73 74 3b 0a  ree->pLeftmost;.
11520 20 20 20 20 70 4e 65 77 2d 3e 70 50 61 72 65 6e      pNew->pParen
11530 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 20  t = pParent;.   
11540 20 70 4e 65 77 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d   pNew->zMalloc =
11550 20 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 3b   pTree->zMalloc;
11560 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4d 61 6c 6c  .    pNew->nMall
11570 6f 63 20 3d 20 70 54 72 65 65 2d 3e 6e 4d 61 6c  oc = pTree->nMal
11580 6c 6f 63 3b 0a 20 20 20 20 70 54 72 65 65 2d 3e  loc;.    pTree->
11590 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d  zMalloc = 0;.  }
115a0 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  else{.    pNew->
115b0 70 4c 65 66 74 6d 6f 73 74 20 3d 20 70 4e 65 77  pLeftmost = pNew
115c0 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 4e  ;.    rc = fts3N
115d0 6f 64 65 41 64 64 54 65 72 6d 28 70 2c 20 26 70  odeAddTerm(p, &p
115e0 4e 65 77 2c 20 69 73 43 6f 70 79 54 65 72 6d 2c  New, isCopyTerm,
115f0 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 20   zTerm, nTerm); 
11600 0a 20 20 7d 0a 0a 20 20 2a 70 70 54 72 65 65 20  .  }..  *ppTree 
11610 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e  = pNew;.  return
11620 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65   rc;.}../*.** He
11630 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f  lper function fo
11640 72 20 66 74 73 33 4e 6f 64 65 57 72 69 74 65 28  r fts3NodeWrite(
11650 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
11660 20 66 74 73 33 54 72 65 65 46 69 6e 69 73 68 4e   fts3TreeFinishN
11670 6f 64 65 28 0a 20 20 53 65 67 6d 65 6e 74 4e 6f  ode(.  SegmentNo
11680 64 65 20 2a 70 54 72 65 65 2c 20 0a 20 20 69 6e  de *pTree, .  in
11690 74 20 69 48 65 69 67 68 74 2c 20 0a 20 20 73 71  t iHeight, .  sq
116a0 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 65 66  lite3_int64 iLef
116b0 74 43 68 69 6c 64 0a 29 7b 0a 20 20 69 6e 74 20  tChild.){.  int 
116c0 6e 53 74 61 72 74 3b 0a 20 20 61 73 73 65 72 74  nStart;.  assert
116d0 28 20 69 48 65 69 67 68 74 3e 3d 31 20 26 26 20  ( iHeight>=1 && 
116e0 69 48 65 69 67 68 74 3c 31 32 38 20 29 3b 0a 20  iHeight<128 );. 
116f0 20 6e 53 74 61 72 74 20 3d 20 46 54 53 33 5f 56   nStart = FTS3_V
11700 41 52 49 4e 54 5f 4d 41 58 20 2d 20 73 71 6c 69  ARINT_MAX - sqli
11710 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e  te3Fts3VarintLen
11720 28 69 4c 65 66 74 43 68 69 6c 64 29 3b 0a 20 20  (iLeftChild);.  
11730 70 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e 53 74  pTree->aData[nSt
11740 61 72 74 5d 20 3d 20 28 63 68 61 72 29 69 48 65  art] = (char)iHe
11750 69 67 68 74 3b 0a 20 20 73 71 6c 69 74 65 33 46  ight;.  sqlite3F
11760 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 54  ts3PutVarint(&pT
11770 72 65 65 2d 3e 61 44 61 74 61 5b 6e 53 74 61 72  ree->aData[nStar
11780 74 2b 31 5d 2c 20 69 4c 65 66 74 43 68 69 6c 64  t+1], iLeftChild
11790 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 53 74 61  );.  return nSta
117a0 72 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  rt;.}../*.** Wri
117b0 74 65 20 74 68 65 20 62 75 66 66 65 72 20 66 6f  te the buffer fo
117c0 72 20 74 68 65 20 73 65 67 6d 65 6e 74 20 6e 6f  r the segment no
117d0 64 65 20 70 54 72 65 65 20 61 6e 64 20 61 6c 6c  de pTree and all
117e0 20 6f 66 20 69 74 73 20 70 65 65 72 73 20 74 6f   of its peers to
117f0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
11800 2e 20 54 68 65 6e 20 63 61 6c 6c 20 74 68 69 73  . Then call this
11810 20 66 75 6e 63 74 69 6f 6e 20 72 65 63 75 72 73   function recurs
11820 69 76 65 6c 79 20 74 6f 20 77 72 69 74 65 20 74  ively to write t
11830 68 65 20 70 61 72 65 6e 74 20 6f 66 20 0a 2a 2a  he parent of .**
11840 20 70 54 72 65 65 20 61 6e 64 20 69 74 73 20 70   pTree and its p
11850 65 65 72 73 20 74 6f 20 74 68 65 20 64 61 74 61  eers to the data
11860 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63  base. .**.** Exc
11870 65 70 74 2c 20 69 66 20 70 54 72 65 65 20 69 73  ept, if pTree is
11880 20 61 20 72 6f 6f 74 20 6e 6f 64 65 2c 20 64 6f   a root node, do
11890 20 6e 6f 74 20 77 72 69 74 65 20 69 74 20 74 6f   not write it to
118a0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
118b0 6e 73 74 65 61 64 2c 0a 2a 2a 20 73 65 74 20 6f  nstead,.** set o
118c0 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20  utput variables 
118d0 2a 70 61 52 6f 6f 74 20 61 6e 64 20 2a 70 6e 52  *paRoot and *pnR
118e0 6f 6f 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  oot to contain t
118f0 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 0a 2a 2a  he root node..**
11900 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
11910 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
11920 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6f 75 74  returned and out
11930 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70 69  put variable *pi
11940 4c 61 73 74 20 69 73 0a 2a 2a 20 73 65 74 20 74  Last is.** set t
11950 6f 20 74 68 65 20 6c 61 72 67 65 73 74 20 62 6c  o the largest bl
11960 6f 63 6b 69 64 20 77 72 69 74 74 65 6e 20 74 6f  ockid written to
11970 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 6f   the database (o
11980 72 20 7a 65 72 6f 20 69 66 20 6e 6f 0a 2a 2a 20  r zero if no.** 
11990 62 6c 6f 63 6b 73 20 77 65 72 65 20 77 72 69 74  blocks were writ
119a0 74 65 6e 20 74 6f 20 74 68 65 20 64 62 29 2e 20  ten to the db). 
119b0 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51  Otherwise, an SQ
119c0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
119d0 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  is .** returned.
119e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
119f0 74 73 33 4e 6f 64 65 57 72 69 74 65 28 0a 20 20  ts3NodeWrite(.  
11a00 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
11a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  /* Virtual table
11a30 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 65 67   handle */.  Seg
11a40 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65 2c  mentNode *pTree,
11a50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11a60 53 65 67 6d 65 6e 74 4e 6f 64 65 20 68 61 6e 64  SegmentNode hand
11a70 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 48 65 69  le */.  int iHei
11a80 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ght,            
11a90 20 20 20 20 20 20 20 20 2f 2a 20 48 65 69 67 68          /* Heigh
11aa0 74 20 6f 66 20 74 68 69 73 20 6e 6f 64 65 20 69  t of this node i
11ab0 6e 20 74 72 65 65 20 2a 2f 0a 20 20 73 71 6c 69  n tree */.  sqli
11ac0 74 65 33 5f 69 6e 74 36 34 20 69 4c 65 61 66 2c  te3_int64 iLeaf,
11ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
11ae0 6c 6f 63 6b 20 69 64 20 6f 66 20 66 69 72 73 74  lock id of first
11af0 20 6c 65 61 66 20 6e 6f 64 65 20 2a 2f 0a 20 20   leaf node */.  
11b00 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 46  sqlite3_int64 iF
11b10 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ree,            
11b20 2f 2a 20 42 6c 6f 63 6b 20 69 64 20 6f 66 20 6e  /* Block id of n
11b30 65 78 74 20 66 72 65 65 20 73 6c 6f 74 20 69 6e  ext free slot in
11b40 20 25 5f 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20   %_segments */. 
11b50 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
11b60 70 69 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20  piLast,         
11b70 20 2f 2a 20 4f 55 54 3a 20 42 6c 6f 63 6b 20 69   /* OUT: Block i
11b80 64 20 6f 66 20 6c 61 73 74 20 65 6e 74 72 79 20  d of last entry 
11b90 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 63 68 61  written */.  cha
11ba0 72 20 2a 2a 70 61 52 6f 6f 74 2c 20 20 20 20 20  r **paRoot,     
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11bc0 4f 55 54 3a 20 44 61 74 61 20 66 6f 72 20 72 6f  OUT: Data for ro
11bd0 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  ot node */.  int
11be0 20 2a 70 6e 52 6f 6f 74 20 20 20 20 20 20 20 20   *pnRoot        
11bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11c00 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 72 6f 6f  OUT: Size of roo
11c10 74 20 6e 6f 64 65 20 69 6e 20 62 79 74 65 73 20  t node in bytes 
11c20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
11c30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
11c40 66 28 20 21 70 54 72 65 65 2d 3e 70 50 61 72 65  f( !pTree->pPare
11c50 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 52 6f 6f  nt ){.    /* Roo
11c60 74 20 6e 6f 64 65 20 6f 66 20 74 68 65 20 74 72  t node of the tr
11c70 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ee. */.    int n
11c80 53 74 61 72 74 20 3d 20 66 74 73 33 54 72 65 65  Start = fts3Tree
11c90 46 69 6e 69 73 68 4e 6f 64 65 28 70 54 72 65 65  FinishNode(pTree
11ca0 2c 20 69 48 65 69 67 68 74 2c 20 69 4c 65 61 66  , iHeight, iLeaf
11cb0 29 3b 0a 20 20 20 20 2a 70 69 4c 61 73 74 20 3d  );.    *piLast =
11cc0 20 69 46 72 65 65 2d 31 3b 0a 20 20 20 20 2a 70   iFree-1;.    *p
11cd0 6e 52 6f 6f 74 20 3d 20 70 54 72 65 65 2d 3e 6e  nRoot = pTree->n
11ce0 44 61 74 61 20 2d 20 6e 53 74 61 72 74 3b 0a 20  Data - nStart;. 
11cf0 20 20 20 2a 70 61 52 6f 6f 74 20 3d 20 26 70 54     *paRoot = &pT
11d00 72 65 65 2d 3e 61 44 61 74 61 5b 6e 53 74 61 72  ree->aData[nStar
11d10 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t];.  }else{.   
11d20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 49   SegmentNode *pI
11d30 74 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ter;.    sqlite3
11d40 5f 69 6e 74 36 34 20 69 4e 65 78 74 46 72 65 65  _int64 iNextFree
11d50 20 3d 20 69 46 72 65 65 3b 0a 20 20 20 20 73 71   = iFree;.    sq
11d60 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4e 65 78  lite3_int64 iNex
11d70 74 4c 65 61 66 20 3d 20 69 4c 65 61 66 3b 0a 20  tLeaf = iLeaf;. 
11d80 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 54 72     for(pIter=pTr
11d90 65 65 2d 3e 70 4c 65 66 74 6d 6f 73 74 3b 20 70  ee->pLeftmost; p
11da0 49 74 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49  Iter && rc==SQLI
11db0 54 45 5f 4f 4b 3b 20 70 49 74 65 72 3d 70 49 74  TE_OK; pIter=pIt
11dc0 65 72 2d 3e 70 52 69 67 68 74 29 7b 0a 20 20 20  er->pRight){.   
11dd0 20 20 20 69 6e 74 20 6e 53 74 61 72 74 20 3d 20     int nStart = 
11de0 66 74 73 33 54 72 65 65 46 69 6e 69 73 68 4e 6f  fts3TreeFinishNo
11df0 64 65 28 70 49 74 65 72 2c 20 69 48 65 69 67 68  de(pIter, iHeigh
11e00 74 2c 20 69 4e 65 78 74 4c 65 61 66 29 3b 0a 20  t, iNextLeaf);. 
11e10 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65 20       int nWrite 
11e20 3d 20 70 49 74 65 72 2d 3e 6e 44 61 74 61 20 2d  = pIter->nData -
11e30 20 6e 53 74 61 72 74 3b 0a 20 20 0a 20 20 20 20   nStart;.  .    
11e40 20 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65    rc = fts3Write
11e50 53 65 67 6d 65 6e 74 28 70 2c 20 69 4e 65 78 74  Segment(p, iNext
11e60 46 72 65 65 2c 20 26 70 49 74 65 72 2d 3e 61 44  Free, &pIter->aD
11e70 61 74 61 5b 6e 53 74 61 72 74 5d 2c 20 6e 57 72  ata[nStart], nWr
11e80 69 74 65 29 3b 0a 20 20 20 20 20 20 69 4e 65 78  ite);.      iNex
11e90 74 46 72 65 65 2b 2b 3b 0a 20 20 20 20 20 20 69  tFree++;.      i
11ea0 4e 65 78 74 4c 65 61 66 20 2b 3d 20 28 70 49 74  NextLeaf += (pIt
11eb0 65 72 2d 3e 6e 45 6e 74 72 79 2b 31 29 3b 0a 20  er->nEntry+1);. 
11ec0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
11ed0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11ee0 20 20 20 20 61 73 73 65 72 74 28 20 69 4e 65 78      assert( iNex
11ef0 74 4c 65 61 66 3d 3d 69 46 72 65 65 20 29 3b 0a  tLeaf==iFree );.
11f00 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 4e        rc = fts3N
11f10 6f 64 65 57 72 69 74 65 28 0a 20 20 20 20 20 20  odeWrite(.      
11f20 20 20 20 20 70 2c 20 70 54 72 65 65 2d 3e 70 50      p, pTree->pP
11f30 61 72 65 6e 74 2c 20 69 48 65 69 67 68 74 2b 31  arent, iHeight+1
11f40 2c 20 69 46 72 65 65 2c 20 69 4e 65 78 74 46 72  , iFree, iNextFr
11f50 65 65 2c 20 70 69 4c 61 73 74 2c 20 70 61 52 6f  ee, piLast, paRo
11f60 6f 74 2c 20 70 6e 52 6f 6f 74 0a 20 20 20 20 20  ot, pnRoot.     
11f70 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   );.    }.  }.. 
11f80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11f90 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65  *.** Free all me
11fa0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  mory allocations
11fb0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
11fc0 20 74 68 65 20 74 72 65 65 20 70 54 72 65 65 2e   the tree pTree.
11fd0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11fe0 66 74 73 33 4e 6f 64 65 46 72 65 65 28 53 65 67  fts3NodeFree(Seg
11ff0 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65 29  mentNode *pTree)
12000 7b 0a 20 20 69 66 28 20 70 54 72 65 65 20 29 7b  {.  if( pTree ){
12010 0a 20 20 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65  .    SegmentNode
12020 20 2a 70 20 3d 20 70 54 72 65 65 2d 3e 70 4c 65   *p = pTree->pLe
12030 66 74 6d 6f 73 74 3b 0a 20 20 20 20 66 74 73 33  ftmost;.    fts3
12040 4e 6f 64 65 46 72 65 65 28 70 2d 3e 70 50 61 72  NodeFree(p->pPar
12050 65 6e 74 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ent);.    while(
12060 20 70 20 29 7b 0a 20 20 20 20 20 20 53 65 67 6d   p ){.      Segm
12070 65 6e 74 4e 6f 64 65 20 2a 70 52 69 67 68 74 20  entNode *pRight 
12080 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  = p->pRight;.   
12090 20 20 20 69 66 28 20 70 2d 3e 61 44 61 74 61 21     if( p->aData!
120a0 3d 28 63 68 61 72 20 2a 29 26 70 5b 31 5d 20 29  =(char *)&p[1] )
120b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
120c0 33 5f 66 72 65 65 28 70 2d 3e 61 44 61 74 61 29  3_free(p->aData)
120d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
120e0 61 73 73 65 72 74 28 20 70 52 69 67 68 74 3d 3d  assert( pRight==
120f0 30 20 7c 7c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 3d  0 || p->zMalloc=
12100 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
12110 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 4d 61 6c  te3_free(p->zMal
12120 6c 6f 63 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  loc);.      sqli
12130 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
12140 20 20 20 70 20 3d 20 70 52 69 67 68 74 3b 0a 20     p = pRight;. 
12150 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
12160 2a 20 41 64 64 20 61 20 74 65 72 6d 20 74 6f 20  * Add a term to 
12170 74 68 65 20 73 65 67 6d 65 6e 74 20 62 65 69 6e  the segment bein
12180 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  g constructed by
12190 20 74 68 65 20 53 65 67 6d 65 6e 74 57 72 69 74   the SegmentWrit
121a0 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 2a 70 70  er object.** *pp
121b0 57 72 69 74 65 72 2e 20 57 68 65 6e 20 61 64 64  Writer. When add
121c0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 74 65  ing the first te
121d0 72 6d 20 74 6f 20 61 20 73 65 67 6d 65 6e 74 2c  rm to a segment,
121e0 20 2a 70 70 57 72 69 74 65 72 20 73 68 6f 75 6c   *ppWriter shoul
121f0 64 0a 2a 2a 20 62 65 20 70 61 73 73 65 64 20 4e  d.** be passed N
12200 55 4c 4c 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ULL. This functi
12210 6f 6e 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74 65  on will allocate
12220 20 61 20 6e 65 77 20 53 65 67 6d 65 6e 74 57 72   a new SegmentWr
12230 69 74 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 61  iter object.** a
12240 6e 64 20 72 65 74 75 72 6e 20 69 74 20 76 69 61  nd return it via
12250 20 74 68 65 20 69 6e 70 75 74 2f 6f 75 74 70 75   the input/outpu
12260 74 20 76 61 72 69 61 62 6c 65 20 2a 70 70 57 72  t variable *ppWr
12270 69 74 65 72 20 69 6e 20 74 68 69 73 20 63 61 73  iter in this cas
12280 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  e..**.** If succ
12290 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
122a0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
122b0 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c  therwise, an SQL
122c0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
122d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
122e0 73 33 53 65 67 57 72 69 74 65 72 41 64 64 28 0a  s3SegWriterAdd(.
122f0 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
12300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12310 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
12320 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53  le handle */.  S
12330 65 67 6d 65 6e 74 57 72 69 74 65 72 20 2a 2a 70  egmentWriter **p
12340 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 2f  pWriter,       /
12350 2a 20 49 4e 2f 4f 55 54 3a 20 53 65 67 6d 65 6e  * IN/OUT: Segmen
12360 74 57 72 69 74 65 72 20 68 61 6e 64 6c 65 20 2a  tWriter handle *
12370 2f 20 0a 20 20 69 6e 74 20 69 73 43 6f 70 79 54  / .  int isCopyT
12380 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
12390 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
123a0 62 75 66 66 65 72 20 7a 54 65 72 6d 20 6d 75 73  buffer zTerm mus
123b0 74 20 62 65 20 63 6f 70 69 65 64 20 2a 2f 0a 20  t be copied */. 
123c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
123d0 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
123e0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
123f0 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
12400 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e   term */.  int n
12410 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
12420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
12430 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e 20 62 79  ze of term in by
12440 74 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  tes */.  const c
12450 68 61 72 20 2a 61 44 6f 63 6c 69 73 74 2c 20 20  har *aDoclist,  
12460 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
12470 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f  ter to buffer co
12480 6e 74 61 69 6e 69 6e 67 20 64 6f 63 6c 69 73 74  ntaining doclist
12490 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f 63 6c 69   */.  int nDocli
124a0 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
124b0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
124c0 20 64 6f 63 6c 69 73 74 20 69 6e 20 62 79 74 65   doclist in byte
124d0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  s */.){.  int nP
124e0 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20  refix;          
124f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
12500 65 20 6f 66 20 74 65 72 6d 20 70 72 65 66 69 78  e of term prefix
12510 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
12520 6e 74 20 6e 53 75 66 66 69 78 3b 20 20 20 20 20  nt nSuffix;     
12530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12540 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 73  * Size of term s
12550 75 66 66 69 78 20 69 6e 20 62 79 74 65 73 20 2a  uffix in bytes *
12560 2f 0a 20 20 69 6e 74 20 6e 52 65 71 3b 20 20 20  /.  int nReq;   
12570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12580 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
12590 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
125a0 6f 6e 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a  on leaf page */.
125b0 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20 20 53    int nData;.  S
125c0 65 67 6d 65 6e 74 57 72 69 74 65 72 20 2a 70 57  egmentWriter *pW
125d0 72 69 74 65 72 20 3d 20 2a 70 70 57 72 69 74 65  riter = *ppWrite
125e0 72 3b 0a 0a 20 20 69 66 28 20 21 70 57 72 69 74  r;..  if( !pWrit
125f0 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  er ){.    int rc
12600 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
12610 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 20 20  mt *pStmt;..    
12620 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
12630 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 73 74  SegmentWriter st
12640 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 70  ructure */.    p
12650 57 72 69 74 65 72 20 3d 20 28 53 65 67 6d 65 6e  Writer = (Segmen
12660 74 57 72 69 74 65 72 20 2a 29 73 71 6c 69 74 65  tWriter *)sqlite
12670 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
12680 53 65 67 6d 65 6e 74 57 72 69 74 65 72 29 29 3b  SegmentWriter));
12690 0a 20 20 20 20 69 66 28 20 21 70 57 72 69 74 65  .    if( !pWrite
126a0 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  r ) return SQLIT
126b0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d  E_NOMEM;.    mem
126c0 73 65 74 28 70 57 72 69 74 65 72 2c 20 30 2c 20  set(pWriter, 0, 
126d0 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e 74 57 72  sizeof(SegmentWr
126e0 69 74 65 72 29 29 3b 0a 20 20 20 20 2a 70 70 57  iter));.    *ppW
126f0 72 69 74 65 72 20 3d 20 70 57 72 69 74 65 72 3b  riter = pWriter;
12700 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  ..    /* Allocat
12710 65 20 61 20 62 75 66 66 65 72 20 69 6e 20 77 68  e a buffer in wh
12720 69 63 68 20 74 6f 20 61 63 63 75 6d 75 6c 61 74  ich to accumulat
12730 65 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 70 57  e data */.    pW
12740 72 69 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 28  riter->aData = (
12750 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  char *)sqlite3_m
12760 61 6c 6c 6f 63 28 70 2d 3e 6e 4e 6f 64 65 53 69  alloc(p->nNodeSi
12770 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 57  ze);.    if( !pW
12780 72 69 74 65 72 2d 3e 61 44 61 74 61 20 29 20 72  riter->aData ) r
12790 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
127a0 45 4d 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d  EM;.    pWriter-
127b0 3e 6e 53 69 7a 65 20 3d 20 70 2d 3e 6e 4e 6f 64  >nSize = p->nNod
127c0 65 53 69 7a 65 3b 0a 0a 20 20 20 20 2f 2a 20 46  eSize;..    /* F
127d0 69 6e 64 20 74 68 65 20 6e 65 78 74 20 66 72 65  ind the next fre
127e0 65 20 62 6c 6f 63 6b 69 64 20 69 6e 20 74 68 65  e blockid in the
127f0 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c   %_segments tabl
12800 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74  e */.    rc = ft
12810 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
12820 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54 53 5f 49  _NEXT_SEGMENTS_I
12830 44 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  D, &pStmt, 0);. 
12840 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12850 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
12860 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
12870 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
12880 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
12890 20 20 20 70 57 72 69 74 65 72 2d 3e 69 46 72 65     pWriter->iFre
128a0 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
128b0 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
128c0 30 29 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65  0);.      pWrite
128d0 72 2d 3e 69 46 69 72 73 74 20 3d 20 70 57 72 69  r->iFirst = pWri
128e0 74 65 72 2d 3e 69 46 72 65 65 3b 0a 20 20 20 20  ter->iFree;.    
128f0 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
12900 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
12910 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
12920 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
12930 72 63 3b 0a 20 20 7d 0a 20 20 6e 44 61 74 61 20  rc;.  }.  nData 
12940 3d 20 70 57 72 69 74 65 72 2d 3e 6e 44 61 74 61  = pWriter->nData
12950 3b 0a 0a 20 20 6e 50 72 65 66 69 78 20 3d 20 66  ;..  nPrefix = f
12960 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73  ts3PrefixCompres
12970 73 28 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d  s(pWriter->zTerm
12980 2c 20 70 57 72 69 74 65 72 2d 3e 6e 54 65 72 6d  , pWriter->nTerm
12990 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b  , zTerm, nTerm);
129a0 0a 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65  .  nSuffix = nTe
129b0 72 6d 2d 6e 50 72 65 66 69 78 3b 0a 0a 20 20 2f  rm-nPrefix;..  /
129c0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
129d0 20 6d 61 6e 79 20 62 79 74 65 73 20 61 72 65 20   many bytes are 
129e0 72 65 71 75 69 72 65 64 20 62 79 20 74 68 69 73  required by this
129f0 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20   new entry */.  
12a00 6e 52 65 71 20 3d 20 73 71 6c 69 74 65 33 46 74  nReq = sqlite3Ft
12a10 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 50 72 65  s3VarintLen(nPre
12a20 66 69 78 29 20 2b 20 20 20 20 2f 2a 20 76 61 72  fix) +    /* var
12a30 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  int containing p
12a40 72 65 66 69 78 20 73 69 7a 65 20 2a 2f 0a 20 20  refix size */.  
12a50 20 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72    sqlite3Fts3Var
12a60 69 6e 74 4c 65 6e 28 6e 53 75 66 66 69 78 29 20  intLen(nSuffix) 
12a70 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 76 61 72  +         /* var
12a80 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73  int containing s
12a90 75 66 66 69 78 20 73 69 7a 65 20 2a 2f 0a 20 20  uffix size */.  
12aa0 20 20 6e 53 75 66 66 69 78 20 2b 20 20 20 20 20    nSuffix +     
12ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72            /* Ter
12ad0 6d 20 73 75 66 66 69 78 20 2a 2f 0a 20 20 20 20  m suffix */.    
12ae0 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e  sqlite3Fts3Varin
12af0 74 4c 65 6e 28 6e 44 6f 63 6c 69 73 74 29 20 2b  tLen(nDoclist) +
12b00 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
12b10 6f 66 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20  of doclist */.  
12b20 20 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20    nDoclist;     
12b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63            /* Doc
12b50 6c 69 73 74 20 64 61 74 61 20 2a 2f 0a 0a 20 20  list data */..  
12b60 69 66 28 20 6e 44 61 74 61 3e 30 20 26 26 20 6e  if( nData>0 && n
12b70 44 61 74 61 2b 6e 52 65 71 3e 70 2d 3e 6e 4e 6f  Data+nReq>p->nNo
12b80 64 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e  deSize ){.    in
12b90 74 20 72 63 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  t rc;..    /* Th
12ba0 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 6e  e current leaf n
12bb0 6f 64 65 20 69 73 20 66 75 6c 6c 2e 20 57 72 69  ode is full. Wri
12bc0 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65  te it out to the
12bd0 20 64 61 74 61 62 61 73 65 2e 20 2a 2f 0a 20 20   database. */.  
12be0 20 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65    rc = fts3Write
12bf0 53 65 67 6d 65 6e 74 28 70 2c 20 70 57 72 69 74  Segment(p, pWrit
12c00 65 72 2d 3e 69 46 72 65 65 2b 2b 2c 20 70 57 72  er->iFree++, pWr
12c10 69 74 65 72 2d 3e 61 44 61 74 61 2c 20 6e 44 61  iter->aData, nDa
12c20 74 61 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ta);.    if( rc!
12c30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
12c40 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6e  urn rc;.    p->n
12c50 4c 65 61 66 41 64 64 2b 2b 3b 0a 0a 20 20 20 20  LeafAdd++;..    
12c60 2f 2a 20 41 64 64 20 74 68 65 20 63 75 72 72 65  /* Add the curre
12c70 6e 74 20 74 65 72 6d 20 74 6f 20 74 68 65 20 69  nt term to the i
12c80 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20 74 72 65  nterior node tre
12c90 65 2e 20 54 68 65 20 74 65 72 6d 20 61 64 64 65  e. The term adde
12ca0 64 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  d to.    ** the 
12cb0 69 6e 74 65 72 69 6f 72 20 74 72 65 65 20 6d 75  interior tree mu
12cc0 73 74 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  st:.    **.    *
12cd0 2a 20 20 20 61 29 20 62 65 20 67 72 65 61 74 65  *   a) be greate
12ce0 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65  r than the large
12cf0 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 6c  st term on the l
12d00 65 61 66 20 6e 6f 64 65 20 6a 75 73 74 20 77 72  eaf node just wr
12d10 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 20 20 20  itten.    **    
12d20 20 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73    to the databas
12d30 65 20 28 73 74 69 6c 6c 20 61 76 61 69 6c 61 62  e (still availab
12d40 6c 65 20 69 6e 20 70 57 72 69 74 65 72 2d 3e 7a  le in pWriter->z
12d50 54 65 72 6d 29 2c 20 61 6e 64 0a 20 20 20 20 2a  Term), and.    *
12d60 2a 0a 20 20 20 20 2a 2a 20 20 20 62 29 20 62 65  *.    **   b) be
12d70 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
12d80 75 61 6c 20 74 6f 20 74 68 65 20 74 65 72 6d 20  ual to the term 
12d90 61 62 6f 75 74 20 74 6f 20 62 65 20 61 64 64 65  about to be adde
12da0 64 20 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20  d to the new.   
12db0 20 2a 2a 20 20 20 20 20 20 6c 65 61 66 20 6e 6f   **      leaf no
12dc0 64 65 20 28 7a 54 65 72 6d 2f 6e 54 65 72 6d 29  de (zTerm/nTerm)
12dd0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
12de0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
12df0 69 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 70  it must be the p
12e00 72 65 66 69 78 20 6f 66 20 7a 54 65 72 6d 20 31  refix of zTerm 1
12e10 20 62 79 74 65 20 6c 6f 6e 67 65 72 20 74 68 61   byte longer tha
12e20 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6d  n.    ** the com
12e30 6d 6f 6e 20 70 72 65 66 69 78 20 28 69 66 20 61  mon prefix (if a
12e40 6e 79 29 20 6f 66 20 7a 54 65 72 6d 20 61 6e 64  ny) of zTerm and
12e50 20 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d 2e   pWriter->zTerm.
12e60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
12e70 72 74 28 20 6e 50 72 65 66 69 78 3c 6e 54 65 72  rt( nPrefix<nTer
12e80 6d 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 74  m );.    rc = ft
12e90 73 33 4e 6f 64 65 41 64 64 54 65 72 6d 28 70 2c  s3NodeAddTerm(p,
12ea0 20 26 70 57 72 69 74 65 72 2d 3e 70 54 72 65 65   &pWriter->pTree
12eb0 2c 20 69 73 43 6f 70 79 54 65 72 6d 2c 20 7a 54  , isCopyTerm, zT
12ec0 65 72 6d 2c 20 6e 50 72 65 66 69 78 2b 31 29 3b  erm, nPrefix+1);
12ed0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
12ee0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
12ef0 72 63 3b 0a 0a 20 20 20 20 6e 44 61 74 61 20 3d  rc;..    nData =
12f00 20 30 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d   0;.    pWriter-
12f10 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 0a 20 20 20  >nTerm = 0;..   
12f20 20 6e 50 72 65 66 69 78 20 3d 20 30 3b 0a 20 20   nPrefix = 0;.  
12f30 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72    nSuffix = nTer
12f40 6d 3b 0a 20 20 20 20 6e 52 65 71 20 3d 20 31 20  m;.    nReq = 1 
12f50 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
12f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12f70 2a 20 76 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e  * varint contain
12f80 69 6e 67 20 70 72 65 66 69 78 20 73 69 7a 65 20  ing prefix size 
12f90 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
12fa0 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 54  Fts3VarintLen(nT
12fb0 65 72 6d 29 20 2b 20 20 20 20 20 20 20 20 20 2f  erm) +         /
12fc0 2a 20 76 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e  * varint contain
12fd0 69 6e 67 20 73 75 66 66 69 78 20 73 69 7a 65 20  ing suffix size 
12fe0 2a 2f 0a 20 20 20 20 20 20 6e 54 65 72 6d 20 2b  */.      nTerm +
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13010 2a 20 54 65 72 6d 20 73 75 66 66 69 78 20 2a 2f  * Term suffix */
13020 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
13030 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 44 6f 63  s3VarintLen(nDoc
13040 6c 69 73 74 29 20 2b 20 20 20 20 20 20 2f 2a 20  list) +      /* 
13050 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20  Size of doclist 
13060 2a 2f 0a 20 20 20 20 20 20 6e 44 6f 63 6c 69 73  */.      nDoclis
13070 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
13080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13090 2a 20 44 6f 63 6c 69 73 74 20 64 61 74 61 20 2a  * Doclist data *
130a0 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72  /.  }..  /* Incr
130b0 65 61 73 65 20 74 68 65 20 74 6f 74 61 6c 20 6e  ease the total n
130c0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
130d0 72 69 74 74 65 6e 20 74 6f 20 61 63 63 6f 75 6e  ritten to accoun
130e0 74 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e  t for the new en
130f0 74 72 79 2e 20 2a 2f 0a 20 20 70 57 72 69 74 65  try. */.  pWrite
13100 72 2d 3e 6e 4c 65 61 66 44 61 74 61 20 2b 3d 20  r->nLeafData += 
13110 6e 52 65 71 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  nReq;..  /* If t
13120 68 65 20 62 75 66 66 65 72 20 63 75 72 72 65 6e  he buffer curren
13130 74 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 69 73  tly allocated is
13140 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74   too small for t
13150 68 69 73 20 65 6e 74 72 79 2c 20 72 65 61 6c 6c  his entry, reall
13160 6f 63 0a 20 20 2a 2a 20 74 68 65 20 62 75 66 66  oc.  ** the buff
13170 65 72 20 74 6f 20 6d 61 6b 65 20 69 74 20 6c 61  er to make it la
13180 72 67 65 20 65 6e 6f 75 67 68 2e 0a 20 20 2a 2f  rge enough..  */
13190 0a 20 20 69 66 28 20 6e 52 65 71 3e 70 57 72 69  .  if( nReq>pWri
131a0 74 65 72 2d 3e 6e 53 69 7a 65 20 29 7b 0a 20 20  ter->nSize ){.  
131b0 20 20 63 68 61 72 20 2a 61 4e 65 77 20 3d 20 73    char *aNew = s
131c0 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
131d0 57 72 69 74 65 72 2d 3e 61 44 61 74 61 2c 20 6e  Writer->aData, n
131e0 52 65 71 29 3b 0a 20 20 20 20 69 66 28 20 21 61  Req);.    if( !a
131f0 4e 65 77 20 29 20 72 65 74 75 72 6e 20 53 51 4c  New ) return SQL
13200 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70  ITE_NOMEM;.    p
13210 57 72 69 74 65 72 2d 3e 61 44 61 74 61 20 3d 20  Writer->aData = 
13220 61 4e 65 77 3b 0a 20 20 20 20 70 57 72 69 74 65  aNew;.    pWrite
13230 72 2d 3e 6e 53 69 7a 65 20 3d 20 6e 52 65 71 3b  r->nSize = nReq;
13240 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
13250 44 61 74 61 2b 6e 52 65 71 3c 3d 70 57 72 69 74  Data+nReq<=pWrit
13260 65 72 2d 3e 6e 53 69 7a 65 20 29 3b 0a 0a 20 20  er->nSize );..  
13270 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 70 72  /* Append the pr
13280 65 66 69 78 2d 63 6f 6d 70 72 65 73 73 65 64 20  efix-compressed 
13290 74 65 72 6d 20 61 6e 64 20 64 6f 63 6c 69 73 74  term and doclist
132a0 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 2e 20   to the buffer. 
132b0 2a 2f 0a 20 20 6e 44 61 74 61 20 2b 3d 20 73 71  */.  nData += sq
132c0 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69  lite3Fts3PutVari
132d0 6e 74 28 26 70 57 72 69 74 65 72 2d 3e 61 44 61  nt(&pWriter->aDa
132e0 74 61 5b 6e 44 61 74 61 5d 2c 20 6e 50 72 65 66  ta[nData], nPref
132f0 69 78 29 3b 0a 20 20 6e 44 61 74 61 20 2b 3d 20  ix);.  nData += 
13300 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
13310 72 69 6e 74 28 26 70 57 72 69 74 65 72 2d 3e 61  rint(&pWriter->a
13320 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 6e 53 75  Data[nData], nSu
13330 66 66 69 78 29 3b 0a 20 20 6d 65 6d 63 70 79 28  ffix);.  memcpy(
13340 26 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 5b  &pWriter->aData[
13350 6e 44 61 74 61 5d 2c 20 26 7a 54 65 72 6d 5b 6e  nData], &zTerm[n
13360 50 72 65 66 69 78 5d 2c 20 6e 53 75 66 66 69 78  Prefix], nSuffix
13370 29 3b 0a 20 20 6e 44 61 74 61 20 2b 3d 20 6e 53  );.  nData += nS
13380 75 66 66 69 78 3b 0a 20 20 6e 44 61 74 61 20 2b  uffix;.  nData +
13390 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74  = sqlite3Fts3Put
133a0 56 61 72 69 6e 74 28 26 70 57 72 69 74 65 72 2d  Varint(&pWriter-
133b0 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 6e  >aData[nData], n
133c0 44 6f 63 6c 69 73 74 29 3b 0a 20 20 6d 65 6d 63  Doclist);.  memc
133d0 70 79 28 26 70 57 72 69 74 65 72 2d 3e 61 44 61  py(&pWriter->aDa
133e0 74 61 5b 6e 44 61 74 61 5d 2c 20 61 44 6f 63 6c  ta[nData], aDocl
133f0 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a  ist, nDoclist);.
13400 20 20 70 57 72 69 74 65 72 2d 3e 6e 44 61 74 61    pWriter->nData
13410 20 3d 20 6e 44 61 74 61 20 2b 20 6e 44 6f 63 6c   = nData + nDocl
13420 69 73 74 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20  ist;..  /* Save 
13430 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d  the current term
13440 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20   so that it can 
13450 62 65 20 75 73 65 64 20 74 6f 20 70 72 65 66 69  be used to prefi
13460 78 2d 63 6f 6d 70 72 65 73 73 20 74 68 65 20 6e  x-compress the n
13470 65 78 74 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65  ext..  ** If the
13480 20 69 73 43 6f 70 79 54 65 72 6d 20 70 61 72 61   isCopyTerm para
13490 6d 65 74 65 72 20 69 73 20 74 72 75 65 2c 20 74  meter is true, t
134a0 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70  hen the buffer p
134b0 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 20 20 2a  ointed to by.  *
134c0 2a 20 7a 54 65 72 6d 20 69 73 20 74 72 61 6e 73  * zTerm is trans
134d0 69 65 6e 74 2c 20 73 6f 20 74 61 6b 65 20 61 20  ient, so take a 
134e0 63 6f 70 79 20 6f 66 20 74 68 65 20 74 65 72 6d  copy of the term
134f0 20 64 61 74 61 2e 20 4f 74 68 65 72 77 69 73 65   data. Otherwise
13500 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 73 74 6f 72  , just.  ** stor
13510 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
13520 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  pointer..  */.  
13530 69 66 28 20 69 73 43 6f 70 79 54 65 72 6d 20 29  if( isCopyTerm )
13540 7b 0a 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3e  {.    if( nTerm>
13550 70 57 72 69 74 65 72 2d 3e 6e 4d 61 6c 6c 6f 63  pWriter->nMalloc
13560 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
13570 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72  zNew = sqlite3_r
13580 65 61 6c 6c 6f 63 28 70 57 72 69 74 65 72 2d 3e  ealloc(pWriter->
13590 7a 4d 61 6c 6c 6f 63 2c 20 6e 54 65 72 6d 2a 32  zMalloc, nTerm*2
135a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4e  );.      if( !zN
135b0 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ew ){.        re
135c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
135d0 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
135e0 20 70 57 72 69 74 65 72 2d 3e 6e 4d 61 6c 6c 6f   pWriter->nMallo
135f0 63 20 3d 20 6e 54 65 72 6d 2a 32 3b 0a 20 20 20  c = nTerm*2;.   
13600 20 20 20 70 57 72 69 74 65 72 2d 3e 7a 4d 61 6c     pWriter->zMal
13610 6c 6f 63 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20  loc = zNew;.    
13620 20 20 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d    pWriter->zTerm
13630 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20 7d 0a 20   = zNew;.    }. 
13640 20 20 20 61 73 73 65 72 74 28 20 70 57 72 69 74     assert( pWrit
13650 65 72 2d 3e 7a 54 65 72 6d 3d 3d 70 57 72 69 74  er->zTerm==pWrit
13660 65 72 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 3b 0a 20  er->zMalloc );. 
13670 20 20 20 6d 65 6d 63 70 79 28 70 57 72 69 74 65     memcpy(pWrite
13680 72 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65 72 6d 2c  r->zTerm, zTerm,
13690 20 6e 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65   nTerm);.  }else
136a0 7b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 7a  {.    pWriter->z
136b0 54 65 72 6d 20 3d 20 28 63 68 61 72 20 2a 29 7a  Term = (char *)z
136c0 54 65 72 6d 3b 0a 20 20 7d 0a 20 20 70 57 72 69  Term;.  }.  pWri
136d0 74 65 72 2d 3e 6e 54 65 72 6d 20 3d 20 6e 54 65  ter->nTerm = nTe
136e0 72 6d 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  rm;..  return SQ
136f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
13700 2a 20 46 6c 75 73 68 20 61 6c 6c 20 64 61 74 61  * Flush all data
13710 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
13720 20 74 68 65 20 53 65 67 6d 65 6e 74 57 72 69 74   the SegmentWrit
13730 65 72 20 6f 62 6a 65 63 74 20 70 57 72 69 74 65  er object pWrite
13740 72 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61  r to the.** data
13750 62 61 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74  base. This funct
13760 69 6f 6e 20 6d 75 73 74 20 62 65 20 63 61 6c 6c  ion must be call
13770 65 64 20 61 66 74 65 72 20 61 6c 6c 20 74 65 72  ed after all ter
13780 6d 73 20 68 61 76 65 20 62 65 65 6e 20 61 64 64  ms have been add
13790 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73 65 67  ed.** to the seg
137a0 6d 65 6e 74 20 75 73 69 6e 67 20 66 74 73 33 53  ment using fts3S
137b0 65 67 57 72 69 74 65 72 41 64 64 28 29 2e 20 49  egWriterAdd(). I
137c0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  f successful, SQ
137d0 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a 20 72 65  LITE_OK is.** re
137e0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
137f0 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  e, an SQLite err
13800 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
13810 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 57 72  ic int fts3SegWr
13820 69 74 65 72 46 6c 75 73 68 28 0a 20 20 46 74 73  iterFlush(.  Fts
13830 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
13840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13850 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  Virtual table ha
13860 6e 64 6c 65 20 2a 2f 0a 20 20 53 65 67 6d 65 6e  ndle */.  Segmen
13870 74 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  tWriter *pWriter
13880 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67  ,         /* Seg
13890 6d 65 6e 74 57 72 69 74 65 72 20 74 6f 20 66 6c  mentWriter to fl
138a0 75 73 68 20 74 6f 20 74 68 65 20 64 62 20 2a 2f  ush to the db */
138b0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
138c0 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20   iLevel,        
138d0 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20     /* Value for 
138e0 27 6c 65 76 65 6c 27 20 63 6f 6c 75 6d 6e 20 6f  'level' column o
138f0 66 20 25 5f 73 65 67 64 69 72 20 2a 2f 0a 20 20  f %_segdir */.  
13900 69 6e 74 20 69 49 64 78 20 20 20 20 20 20 20 20  int iIdx        
13910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13920 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 27 69 64  /* Value for 'id
13930 78 27 20 63 6f 6c 75 6d 6e 20 6f 66 20 25 5f 73  x' column of %_s
13940 65 67 64 69 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e  egdir */.){.  in
13950 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
13960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13970 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
13980 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 70    if( pWriter->p
13990 54 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Tree ){.    sqli
139a0 74 65 33 5f 69 6e 74 36 34 20 69 4c 61 73 74 20  te3_int64 iLast 
139b0 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4c 61 72  = 0;      /* Lar
139c0 67 65 73 74 20 62 6c 6f 63 6b 20 69 64 20 77 72  gest block id wr
139d0 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73  itten to databas
139e0 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
139f0 5f 69 6e 74 36 34 20 69 4c 61 73 74 4c 65 61 66  _int64 iLastLeaf
13a00 3b 20 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73  ;      /* Larges
13a10 74 20 6c 65 61 66 20 62 6c 6f 63 6b 20 69 64 20  t leaf block id 
13a20 77 72 69 74 74 65 6e 20 74 6f 20 64 62 20 2a 2f  written to db */
13a30 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 6f 6f 74  .    char *zRoot
13a40 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20   = NULL;        
13a50 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
13a60 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
13a70 6e 67 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a  ng root node */.
13a80 20 20 20 20 69 6e 74 20 6e 52 6f 6f 74 20 3d 20      int nRoot = 
13a90 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
13aa0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
13ab0 66 65 72 20 7a 52 6f 6f 74 20 2a 2f 0a 0a 20 20  fer zRoot */..  
13ac0 20 20 69 4c 61 73 74 4c 65 61 66 20 3d 20 70 57    iLastLeaf = pW
13ad0 72 69 74 65 72 2d 3e 69 46 72 65 65 3b 0a 20 20  riter->iFree;.  
13ae0 20 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65    rc = fts3Write
13af0 53 65 67 6d 65 6e 74 28 70 2c 20 70 57 72 69 74  Segment(p, pWrit
13b00 65 72 2d 3e 69 46 72 65 65 2b 2b 2c 20 70 57 72  er->iFree++, pWr
13b10 69 74 65 72 2d 3e 61 44 61 74 61 2c 20 70 57 72  iter->aData, pWr
13b20 69 74 65 72 2d 3e 6e 44 61 74 61 29 3b 0a 20 20  iter->nData);.  
13b30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13b40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
13b50 3d 20 66 74 73 33 4e 6f 64 65 57 72 69 74 65 28  = fts3NodeWrite(
13b60 70 2c 20 70 57 72 69 74 65 72 2d 3e 70 54 72 65  p, pWriter->pTre
13b70 65 2c 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20  e, 1,.          
13b80 70 57 72 69 74 65 72 2d 3e 69 46 69 72 73 74 2c  pWriter->iFirst,
13b90 20 70 57 72 69 74 65 72 2d 3e 69 46 72 65 65 2c   pWriter->iFree,
13ba0 20 26 69 4c 61 73 74 2c 20 26 7a 52 6f 6f 74 2c   &iLast, &zRoot,
13bb0 20 26 6e 52 6f 6f 74 29 3b 0a 20 20 20 20 7d 0a   &nRoot);.    }.
13bc0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
13bd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
13be0 63 20 3d 20 66 74 73 33 57 72 69 74 65 53 65 67  c = fts3WriteSeg
13bf0 64 69 72 28 70 2c 20 69 4c 65 76 65 6c 2c 20 69  dir(p, iLevel, i
13c00 49 64 78 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Idx, .          
13c10 70 57 72 69 74 65 72 2d 3e 69 46 69 72 73 74 2c  pWriter->iFirst,
13c20 20 69 4c 61 73 74 4c 65 61 66 2c 20 69 4c 61 73   iLastLeaf, iLas
13c30 74 2c 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61  t, pWriter->nLea
13c40 66 44 61 74 61 2c 20 7a 52 6f 6f 74 2c 20 6e 52  fData, zRoot, nR
13c50 6f 6f 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  oot);.    }.  }e
13c60 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
13c70 65 6e 74 69 72 65 20 74 72 65 65 20 66 69 74 73  entire tree fits
13c80 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64   on the root nod
13c90 65 2e 20 57 72 69 74 65 20 69 74 20 74 6f 20 74  e. Write it to t
13ca0 68 65 20 73 65 67 64 69 72 20 74 61 62 6c 65 2e  he segdir table.
13cb0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73   */.    rc = fts
13cc0 33 57 72 69 74 65 53 65 67 64 69 72 28 70 2c 20  3WriteSegdir(p, 
13cd0 69 4c 65 76 65 6c 2c 20 69 49 64 78 2c 20 0a 20  iLevel, iIdx, . 
13ce0 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20         0, 0, 0, 
13cf0 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61  pWriter->nLeafDa
13d00 74 61 2c 20 70 57 72 69 74 65 72 2d 3e 61 44 61  ta, pWriter->aDa
13d10 74 61 2c 20 70 57 72 69 74 65 72 2d 3e 6e 44 61  ta, pWriter->nDa
13d20 74 61 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4c  ta);.  }.  p->nL
13d30 65 61 66 41 64 64 2b 2b 3b 0a 20 20 72 65 74 75  eafAdd++;.  retu
13d40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13d50 52 65 6c 65 61 73 65 20 61 6c 6c 20 6d 65 6d 6f  Release all memo
13d60 72 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 53  ry held by the S
13d70 65 67 6d 65 6e 74 57 72 69 74 65 72 20 6f 62 6a  egmentWriter obj
13d80 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
13d90 65 20 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75  e .** first argu
13da0 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
13db0 76 6f 69 64 20 66 74 73 33 53 65 67 57 72 69 74  void fts3SegWrit
13dc0 65 72 46 72 65 65 28 53 65 67 6d 65 6e 74 57 72  erFree(SegmentWr
13dd0 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a  iter *pWriter){.
13de0 20 20 69 66 28 20 70 57 72 69 74 65 72 20 29 7b    if( pWriter ){
13df0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
13e00 65 28 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61  e(pWriter->aData
13e10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
13e20 72 65 65 28 70 57 72 69 74 65 72 2d 3e 7a 4d 61  ree(pWriter->zMa
13e30 6c 6c 6f 63 29 3b 0a 20 20 20 20 66 74 73 33 4e  lloc);.    fts3N
13e40 6f 64 65 46 72 65 65 28 70 57 72 69 74 65 72 2d  odeFree(pWriter-
13e50 3e 70 54 72 65 65 29 3b 0a 20 20 20 20 73 71 6c  >pTree);.    sql
13e60 69 74 65 33 5f 66 72 65 65 28 70 57 72 69 74 65  ite3_free(pWrite
13e70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
13e80 20 54 68 65 20 66 69 72 73 74 20 76 61 6c 75 65   The first value
13e90 20 69 6e 20 74 68 65 20 61 70 56 61 6c 5b 5d 20   in the apVal[] 
13ea0 61 72 72 61 79 20 69 73 20 61 73 73 75 6d 65 64  array is assumed
13eb0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69   to contain an i
13ec0 6e 74 65 67 65 72 2e 0a 2a 2a 20 54 68 69 73 20  nteger..** This 
13ed0 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69  function tests i
13ee0 66 20 74 68 65 72 65 20 65 78 69 73 74 20 61 6e  f there exist an
13ef0 79 20 64 6f 63 75 6d 65 6e 74 73 20 77 69 74 68  y documents with
13f00 20 64 6f 63 69 64 20 76 61 6c 75 65 73 20 74 68   docid values th
13f10 61 74 0a 2a 2a 20 61 72 65 20 64 69 66 66 65 72  at.** are differ
13f20 65 6e 74 20 66 72 6f 6d 20 74 68 61 74 20 69 6e  ent from that in
13f30 74 65 67 65 72 2e 20 69 2e 65 2e 20 69 66 20 64  teger. i.e. if d
13f40 65 6c 65 74 69 6e 67 20 74 68 65 20 64 6f 63 75  eleting the docu
13f50 6d 65 6e 74 20 77 69 74 68 20 64 6f 63 69 64 0a  ment with docid.
13f60 2a 2a 20 70 52 6f 77 69 64 20 77 6f 75 6c 64 20  ** pRowid would 
13f70 6d 65 61 6e 20 74 68 65 20 46 54 53 33 20 74 61  mean the FTS3 ta
13f80 62 6c 65 20 77 65 72 65 20 65 6d 70 74 79 2e 0a  ble were empty..
13f90 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
13fa0 66 75 6c 2c 20 2a 70 69 73 45 6d 70 74 79 20 69  ful, *pisEmpty i
13fb0 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66  s set to true if
13fc0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
13fd0 70 74 79 20 65 78 63 65 70 74 20 66 6f 72 0a 2a  pty except for.*
13fe0 2a 20 64 6f 63 75 6d 65 6e 74 20 70 52 6f 77 69  * document pRowi
13ff0 64 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  d, or false othe
14000 72 77 69 73 65 2c 20 61 6e 64 20 53 51 4c 49 54  rwise, and SQLIT
14010 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
14020 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  . If an.** error
14030 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69   occurs, an SQLi
14040 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
14050 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
14060 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 73 45  atic int fts3IsE
14070 6d 70 74 79 28 46 74 73 33 54 61 62 6c 65 20 2a  mpty(Fts3Table *
14080 70 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  p, sqlite3_value
14090 20 2a 70 52 6f 77 69 64 2c 20 69 6e 74 20 2a 70   *pRowid, int *p
140a0 69 73 45 6d 70 74 79 29 7b 0a 20 20 73 71 6c 69  isEmpty){.  sqli
140b0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
140c0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
140d0 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 20   p->zContentTbl 
140e0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 75 73 69  ){.    /* If usi
140f0 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 3d 78  ng the content=x
14100 78 78 20 6f 70 74 69 6f 6e 2c 20 61 73 73 75 6d  xx option, assum
14110 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6e  e the table is n
14120 65 76 65 72 20 65 6d 70 74 79 20 2a 2f 0a 20 20  ever empty */.  
14130 20 20 2a 70 69 73 45 6d 70 74 79 20 3d 20 30 3b    *pisEmpty = 0;
14140 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
14150 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
14160 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
14170 6d 74 28 70 2c 20 53 51 4c 5f 49 53 5f 45 4d 50  mt(p, SQL_IS_EMP
14180 54 59 2c 20 26 70 53 74 6d 74 2c 20 26 70 52 6f  TY, &pStmt, &pRo
14190 77 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  wid);.    if( rc
141a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
141b0 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
141c0 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
141d0 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
141e0 20 20 20 20 2a 70 69 73 45 6d 70 74 79 20 3d 20      *pisEmpty = 
141f0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
14200 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  nt(pStmt, 0);.  
14210 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
14220 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
14230 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Stmt);.    }.  }
14240 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14250 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 6e 4d 61  ./*.** Set *pnMa
14260 78 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73 74  x to the largest
14270 20 73 65 67 6d 65 6e 74 20 6c 65 76 65 6c 20 69   segment level i
14280 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
14290 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  or the index.** 
142a0 69 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 53 65  iIndex..**.** Se
142b0 67 6d 65 6e 74 20 6c 65 76 65 6c 73 20 61 72 65  gment levels are
142c0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 27   stored in the '
142d0 6c 65 76 65 6c 27 20 63 6f 6c 75 6d 6e 20 6f 66  level' column of
142e0 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61   the %_segdir ta
142f0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ble..**.** Retur
14300 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
14310 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
14320 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
14330 64 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  de if not..*/.st
14340 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67  atic int fts3Seg
14350 6d 65 6e 74 4d 61 78 4c 65 76 65 6c 28 0a 20 20  mentMaxLevel(.  
14360 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 0a 20  Fts3Table *p, . 
14370 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 0a 20 20   int iLangid,.  
14380 69 6e 74 20 69 49 6e 64 65 78 2c 20 0a 20 20 73  int iIndex, .  s
14390 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 6e  qlite3_int64 *pn
143a0 4d 61 78 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  Max.){.  sqlite3
143b0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
143c0 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
143d0 28 20 69 49 6e 64 65 78 3e 3d 30 20 26 26 20 69  ( iIndex>=0 && i
143e0 49 6e 64 65 78 3c 70 2d 3e 6e 49 6e 64 65 78 20  Index<p->nIndex 
143f0 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 70 53 74  );..  /* Set pSt
14400 6d 74 20 74 6f 20 74 68 65 20 63 6f 6d 70 69 6c  mt to the compil
14410 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 3a 0a 20  ed version of:. 
14420 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c 45 43   **.  **   SELEC
14430 54 20 6d 61 78 28 6c 65 76 65 6c 29 20 46 52 4f  T max(level) FRO
14440 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27  M %Q.'%q_segdir'
14450 20 57 48 45 52 45 20 6c 65 76 65 6c 20 42 45 54   WHERE level BET
14460 57 45 45 4e 20 3f 20 41 4e 44 20 3f 0a 20 20 2a  WEEN ? AND ?.  *
14470 2a 0a 20 20 2a 2a 20 28 31 30 32 34 20 69 73 20  *.  ** (1024 is 
14480 61 63 74 75 61 6c 6c 79 20 74 68 65 20 76 61 6c  actually the val
14490 75 65 20 6f 66 20 6d 61 63 72 6f 20 46 54 53 33  ue of macro FTS3
144a0 5f 53 45 47 44 49 52 5f 50 52 45 46 49 58 4c 45  _SEGDIR_PREFIXLE
144b0 56 45 4c 5f 53 54 52 29 2e 0a 20 20 2a 2f 0a 20  VEL_STR)..  */. 
144c0 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
144d0 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f  t(p, SQL_SELECT_
144e0 53 45 47 44 49 52 5f 4d 41 58 5f 4c 45 56 45 4c  SEGDIR_MAX_LEVEL
144f0 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
14500 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14510 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
14520 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
14530 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 67 65  t64(pStmt, 1, ge
14540 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70  tAbsoluteLevel(p
14550 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
14560 78 2c 20 30 29 29 3b 0a 20 20 73 71 6c 69 74 65  x, 0));.  sqlite
14570 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74  3_bind_int64(pSt
14580 6d 74 2c 20 32 2c 20 0a 20 20 20 20 20 20 67 65  mt, 2, .      ge
14590 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70  tAbsoluteLevel(p
145a0 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
145b0 78 2c 20 46 54 53 33 5f 53 45 47 44 49 52 5f 4d  x, FTS3_SEGDIR_M
145c0 41 58 4c 45 56 45 4c 2d 31 29 0a 20 20 29 3b 0a  AXLEVEL-1).  );.
145d0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
145e0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
145f0 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 2a 70 6e  Stmt) ){.    *pn
14600 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Max = sqlite3_co
14610 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
14620 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
14630 72 6e 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74  rn sqlite3_reset
14640 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pStmt);.}../*.*
14650 2a 20 69 41 62 73 4c 65 76 65 6c 20 69 73 20 61  * iAbsLevel is a
14660 6e 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c  n absolute level
14670 20 74 68 61 74 20 6d 61 79 20 62 65 20 61 73 73   that may be ass
14680 75 6d 65 64 20 74 6f 20 65 78 69 73 74 20 77 69  umed to exist wi
14690 74 68 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61  thin.** the data
146a0 62 61 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74  base. This funct
146b0 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 69 74  ion checks if it
146c0 20 69 73 20 74 68 65 20 6c 61 72 67 65 73 74 20   is the largest 
146d0 6c 65 76 65 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20  level number.** 
146e0 77 69 74 68 69 6e 20 69 74 73 20 69 6e 64 65 78  within its index
146f0 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72  . Assuming no er
14700 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 62 4d  ror occurs, *pbM
14710 61 78 20 69 73 20 73 65 74 20 74 6f 20 31 20 69  ax is set to 1 i
14720 66 0a 2a 2a 20 69 41 62 73 4c 65 76 65 6c 20 69  f.** iAbsLevel i
14730 73 20 69 6e 64 65 65 64 20 74 68 65 20 6c 61 72  s indeed the lar
14740 67 65 73 74 20 6c 65 76 65 6c 2c 20 6f 72 20 30  gest level, or 0
14750 20 6f 74 68 65 72 77 69 73 65 2c 20 61 6e 64 20   otherwise, and 
14760 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
14770 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
14780 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
14790 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
147a0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 0a  eturned and the.
147b0 2a 2a 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f  ** final value o
147c0 66 20 2a 70 62 4d 61 78 20 69 73 20 75 6e 64 65  f *pbMax is unde
147d0 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
147e0 20 69 6e 74 20 66 74 73 33 53 65 67 6d 65 6e 74   int fts3Segment
147f0 49 73 4d 61 78 4c 65 76 65 6c 28 46 74 73 33 54  IsMaxLevel(Fts3T
14800 61 62 6c 65 20 2a 70 2c 20 69 36 34 20 69 41 62  able *p, i64 iAb
14810 73 4c 65 76 65 6c 2c 20 69 6e 74 20 2a 70 62 4d  sLevel, int *pbM
14820 61 78 29 7b 0a 0a 20 20 2f 2a 20 53 65 74 20 70  ax){..  /* Set p
14830 53 74 6d 74 20 74 6f 20 74 68 65 20 63 6f 6d 70  Stmt to the comp
14840 69 6c 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 3a  iled version of:
14850 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c  .  **.  **   SEL
14860 45 43 54 20 6d 61 78 28 6c 65 76 65 6c 29 20 46  ECT max(level) F
14870 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69  ROM %Q.'%q_segdi
14880 72 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20 42  r' WHERE level B
14890 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 0a 20  ETWEEN ? AND ?. 
148a0 20 2a 2a 0a 20 20 2a 2a 20 28 31 30 32 34 20 69   **.  ** (1024 i
148b0 73 20 61 63 74 75 61 6c 6c 79 20 74 68 65 20 76  s actually the v
148c0 61 6c 75 65 20 6f 66 20 6d 61 63 72 6f 20 46 54  alue of macro FT
148d0 53 33 5f 53 45 47 44 49 52 5f 50 52 45 46 49 58  S3_SEGDIR_PREFIX
148e0 4c 45 56 45 4c 5f 53 54 52 29 2e 0a 20 20 2a 2f  LEVEL_STR)..  */
148f0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
14900 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63  *pStmt;.  int rc
14910 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
14920 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 45 47  , SQL_SELECT_SEG
14930 44 49 52 5f 4d 41 58 5f 4c 45 56 45 4c 2c 20 26  DIR_MAX_LEVEL, &
14940 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
14950 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14960 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 73 71   return rc;.  sq
14970 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
14980 28 70 53 74 6d 74 2c 20 31 2c 20 69 41 62 73 4c  (pStmt, 1, iAbsL
14990 65 76 65 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74  evel+1);.  sqlit
149a0 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
149b0 74 6d 74 2c 20 32 2c 20 0a 20 20 20 20 20 20 28  tmt, 2, .      (
149c0 28 69 41 62 73 4c 65 76 65 6c 2f 46 54 53 33 5f  (iAbsLevel/FTS3_
149d0 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 29  SEGDIR_MAXLEVEL)
149e0 2b 31 29 20 2a 20 46 54 53 33 5f 53 45 47 44 49  +1) * FTS3_SEGDI
149f0 52 5f 4d 41 58 4c 45 56 45 4c 0a 20 20 29 3b 0a  R_MAXLEVEL.  );.
14a00 0a 20 20 2a 70 62 4d 61 78 20 3d 20 30 3b 0a 20  .  *pbMax = 0;. 
14a10 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
14a20 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
14a30 74 6d 74 29 20 29 7b 0a 20 20 20 20 2a 70 62 4d  tmt) ){.    *pbM
14a40 61 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ax = sqlite3_col
14a50 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20  umn_type(pStmt, 
14a60 30 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b  0)==SQLITE_NULL;
14a70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
14a80 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
14a90 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  t);.}../*.** Del
14aa0 65 74 65 20 61 6c 6c 20 65 6e 74 72 69 65 73 20  ete all entries 
14ab0 69 6e 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74  in the %_segment
14ac0 73 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74  s table associat
14ad0 65 64 20 77 69 74 68 20 74 68 65 20 73 65 67 6d  ed with the segm
14ae0 65 6e 74 0a 2a 2a 20 6f 70 65 6e 65 64 20 77 69  ent.** opened wi
14af0 74 68 20 73 65 67 2d 72 65 61 64 65 72 20 70 53  th seg-reader pS
14b00 65 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  eg. This functio
14b10 6e 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63  n does not affec
14b20 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  t the contents.*
14b30 2a 20 6f 66 20 74 68 65 20 25 5f 73 65 67 64 69  * of the %_segdi
14b40 72 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  r table..*/.stat
14b50 69 63 20 69 6e 74 20 66 74 73 33 44 65 6c 65 74  ic int fts3Delet
14b60 65 53 65 67 6d 65 6e 74 28 0a 20 20 46 74 73 33  eSegment(.  Fts3
14b70 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
14b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
14b90 54 53 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  TS table handle 
14ba0 2a 2f 0a 20 20 46 74 73 33 53 65 67 52 65 61 64  */.  Fts3SegRead
14bb0 65 72 20 2a 70 53 65 67 20 20 20 20 20 20 20 20  er *pSeg        
14bc0 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20       /* Segment 
14bd0 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 29 7b 0a  to delete */.){.
14be0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14bf0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
14c00 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
14c10 20 2a 2f 0a 20 20 69 66 28 20 70 53 65 67 2d 3e   */.  if( pSeg->
14c20 69 53 74 61 72 74 42 6c 6f 63 6b 20 29 7b 0a 20  iStartBlock ){. 
14c30 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
14c40 2a 70 44 65 6c 65 74 65 3b 20 20 20 20 20 20 20  *pDelete;       
14c50 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   /* SQL statemen
14c60 74 20 74 6f 20 64 65 6c 65 74 65 20 72 6f 77 73  t to delete rows
14c70 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73   */.    rc = fts
14c80 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
14c90 44 45 4c 45 54 45 5f 53 45 47 4d 45 4e 54 53 5f  DELETE_SEGMENTS_
14ca0 52 41 4e 47 45 2c 20 26 70 44 65 6c 65 74 65 2c  RANGE, &pDelete,
14cb0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
14cc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
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 31 2c 20 70 53 65 67 2d 3e 69 53 74 61 72 74 42  1, pSeg->iStartB
14d00 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  lock);.      sql
14d10 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
14d20 70 44 65 6c 65 74 65 2c 20 32 2c 20 70 53 65 67  pDelete, 2, pSeg
14d30 2d 3e 69 45 6e 64 42 6c 6f 63 6b 29 3b 0a 20 20  ->iEndBlock);.  
14d40 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
14d50 28 70 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 20  (pDelete);.     
14d60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
14d70 73 65 74 28 70 44 65 6c 65 74 65 29 3b 0a 20 20  set(pDelete);.  
14d80 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
14d90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
14da0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
14db0 73 65 64 20 61 66 74 65 72 20 6d 65 72 67 69 6e  sed after mergin
14dc0 67 20 6d 75 6c 74 69 70 6c 65 20 73 65 67 6d 65  g multiple segme
14dd0 6e 74 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  nts into a singl
14de0 65 20 6c 61 72 67 65 0a 2a 2a 20 73 65 67 6d 65  e large.** segme
14df0 6e 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  nt to delete the
14e00 20 6f 6c 64 2c 20 6e 6f 77 20 72 65 64 75 6e 64   old, now redund
14e10 61 6e 74 2c 20 73 65 67 6d 65 6e 74 20 62 2d 74  ant, segment b-t
14e20 72 65 65 73 2e 20 53 70 65 63 69 66 69 63 61 6c  rees. Specifical
14e30 6c 79 2c 0a 2a 2a 20 69 74 3a 0a 2a 2a 20 0a 2a  ly,.** it:.** .*
14e40 2a 20 20 20 31 29 20 44 65 6c 65 74 65 73 20 61  *   1) Deletes a
14e50 6c 6c 20 25 5f 73 65 67 6d 65 6e 74 73 20 65 6e  ll %_segments en
14e60 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 73 65  tries for the se
14e70 67 6d 65 6e 74 73 20 61 73 73 6f 63 69 61 74 65  gments associate
14e80 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 20 20  d with .**      
14e90 65 61 63 68 20 6f 66 20 74 68 65 20 53 65 67 52  each of the SegR
14ea0 65 61 64 65 72 20 6f 62 6a 65 63 74 73 20 69 6e  eader objects in
14eb0 20 74 68 65 20 61 72 72 61 79 20 70 61 73 73 65   the array passe
14ec0 64 20 61 73 20 74 68 65 20 74 68 69 72 64 20 0a  d as the third .
14ed0 2a 2a 20 20 20 20 20 20 61 72 67 75 6d 65 6e 74  **      argument
14ee0 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 32 29  , and.**.**   2)
14ef0 20 64 65 6c 65 74 65 73 20 61 6c 6c 20 25 5f 73   deletes all %_s
14f00 65 67 64 69 72 20 65 6e 74 72 69 65 73 20 77 69  egdir entries wi
14f10 74 68 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2c  th level iLevel,
14f20 20 6f 72 20 61 6c 6c 20 25 5f 73 65 67 64 69 72   or all %_segdir
14f30 0a 2a 2a 20 20 20 20 20 20 65 6e 74 72 69 65 73  .**      entries
14f40 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6c   regardless of l
14f50 65 76 65 6c 20 69 66 20 28 69 4c 65 76 65 6c 3c  evel if (iLevel<
14f60 30 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  0)..**.** SQLITE
14f70 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
14f80 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
14f90 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69  therwise an SQLi
14fa0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
14fb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
14fc0 33 44 65 6c 65 74 65 53 65 67 64 69 72 28 0a 20  3DeleteSegdir(. 
14fd0 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
14fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ff0 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
15000 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  e handle */.  in
15010 74 20 69 4c 61 6e 67 69 64 2c 20 20 20 20 20 20  t iLangid,      
15020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15030 20 4c 61 6e 67 75 61 67 65 20 69 64 20 2a 2f 0a   Language id */.
15040 20 20 69 6e 74 20 69 49 6e 64 65 78 2c 20 20 20    int iIndex,   
15050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15060 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20 70    /* Index for p
15070 2d 3e 61 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ->aIndex */.  in
15080 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  t iLevel,       
15090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
150a0 20 4c 65 76 65 6c 20 6f 66 20 25 5f 73 65 67 64   Level of %_segd
150b0 69 72 20 65 6e 74 72 69 65 73 20 74 6f 20 64 65  ir entries to de
150c0 6c 65 74 65 20 2a 2f 0a 20 20 46 74 73 33 53 65  lete */.  Fts3Se
150d0 67 52 65 61 64 65 72 20 2a 2a 61 70 53 65 67 6d  gReader **apSegm
150e0 65 6e 74 2c 20 20 20 20 20 20 2f 2a 20 41 72 72  ent,      /* Arr
150f0 61 79 20 6f 66 20 53 65 67 52 65 61 64 65 72 20  ay of SegReader 
15100 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 69 6e 74  objects */.  int
15110 20 6e 52 65 61 64 65 72 20 20 20 20 20 20 20 20   nReader        
15120 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15130 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70  Size of array ap
15140 53 65 67 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  Segment */.){.  
15150 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15160 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
15170 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
15180 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
15190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151a0 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
151b0 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 73 71  variable */.  sq
151c0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c  lite3_stmt *pDel
151d0 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  ete = 0;      /*
151e0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74   SQL statement t
151f0 6f 20 64 65 6c 65 74 65 20 72 6f 77 73 20 2a 2f  o delete rows */
15200 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d  ..  for(i=0; rc=
15210 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
15220 6e 52 65 61 64 65 72 3b 20 69 2b 2b 29 7b 0a 20  nReader; i++){. 
15230 20 20 20 72 63 20 3d 20 66 74 73 33 44 65 6c 65     rc = fts3Dele
15240 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 61 70 53  teSegment(p, apS
15250 65 67 6d 65 6e 74 5b 69 5d 29 3b 0a 20 20 7d 0a  egment[i]);.  }.
15260 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15270 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
15280 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  n rc;.  }..  ass
15290 65 72 74 28 20 69 4c 65 76 65 6c 3e 3d 30 20 7c  ert( iLevel>=0 |
152a0 7c 20 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53  | iLevel==FTS3_S
152b0 45 47 43 55 52 53 4f 52 5f 41 4c 4c 20 29 3b 0a  EGCURSOR_ALL );.
152c0 20 20 69 66 28 20 69 4c 65 76 65 6c 3d 3d 46 54    if( iLevel==FT
152d0 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c  S3_SEGCURSOR_ALL
152e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
152f0 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
15300 44 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 52 41  DELETE_SEGDIR_RA
15310 4e 47 45 2c 20 26 70 44 65 6c 65 74 65 2c 20 30  NGE, &pDelete, 0
15320 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
15330 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15340 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
15350 6e 74 36 34 28 70 44 65 6c 65 74 65 2c 20 31 2c  nt64(pDelete, 1,
15360 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65   getAbsoluteLeve
15370 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49  l(p, iLangid, iI
15380 6e 64 65 78 2c 20 30 29 29 3b 0a 20 20 20 20 20  ndex, 0));.     
15390 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
153a0 74 36 34 28 70 44 65 6c 65 74 65 2c 20 32 2c 20  t64(pDelete, 2, 
153b0 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 41 62  .          getAb
153c0 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69  soluteLevel(p, i
153d0 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20  Langid, iIndex, 
153e0 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c  FTS3_SEGDIR_MAXL
153f0 45 56 45 4c 2d 31 29 0a 20 20 20 20 20 20 29 3b  EVEL-1).      );
15400 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
15410 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c      rc = fts3Sql
15420 53 74 6d 74 28 70 2c 20 53 51 4c 5f 44 45 4c 45  Stmt(p, SQL_DELE
15430 54 45 5f 53 45 47 44 49 52 5f 4c 45 56 45 4c 2c  TE_SEGDIR_LEVEL,
15440 20 26 70 44 65 6c 65 74 65 2c 20 30 29 3b 0a 20   &pDelete, 0);. 
15450 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15460 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
15470 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
15480 28 0a 20 20 20 20 20 20 20 20 20 20 70 44 65 6c  (.          pDel
15490 65 74 65 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c  ete, 1, getAbsol
154a0 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e  uteLevel(p, iLan
154b0 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65  gid, iIndex, iLe
154c0 76 65 6c 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  vel).      );.  
154d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
154e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
154f0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
15500 28 70 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 72  (pDelete);.    r
15510 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
15520 74 28 70 44 65 6c 65 74 65 29 3b 0a 20 20 7d 0a  t(pDelete);.  }.
15530 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15540 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  ./*.** When this
15550 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
15560 6c 65 64 2c 20 62 75 66 66 65 72 20 2a 70 70 4c  led, buffer *ppL
15570 69 73 74 20 28 73 69 7a 65 20 2a 70 6e 4c 69 73  ist (size *pnLis
15580 74 20 62 79 74 65 73 29 20 63 6f 6e 74 61 69 6e  t bytes) contain
15590 73 20 0a 2a 2a 20 61 20 70 6f 73 69 74 69 6f 6e  s .** a position
155a0 20 6c 69 73 74 20 74 68 61 74 20 6d 61 79 20 28   list that may (
155b0 6f 72 20 6d 61 79 20 6e 6f 74 29 20 66 65 61 74  or may not) feat
155c0 75 72 65 20 6d 75 6c 74 69 70 6c 65 20 63 6f 6c  ure multiple col
155d0 75 6d 6e 73 2e 20 54 68 69 73 0a 2a 2a 20 66 75  umns. This.** fu
155e0 6e 63 74 69 6f 6e 20 61 64 6a 75 73 74 73 20 74  nction adjusts t
155f0 68 65 20 70 6f 69 6e 74 65 72 20 2a 70 70 4c 69  he pointer *ppLi
15600 73 74 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74  st and the lengt
15610 68 20 2a 70 6e 4c 69 73 74 20 73 6f 20 74 68 61  h *pnList so tha
15620 74 20 74 68 65 79 0a 2a 2a 20 69 64 65 6e 74 69  t they.** identi
15630 66 79 20 74 68 65 20 73 75 62 73 65 74 20 6f 66  fy the subset of
15640 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
15650 73 74 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  st that correspo
15660 6e 64 73 20 74 6f 20 63 6f 6c 75 6d 6e 20 69 43  nds to column iC
15670 6f 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ol..**.** If the
15680 72 65 20 61 72 65 20 6e 6f 20 65 6e 74 72 69 65  re are no entrie
15690 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 70  s in the input p
156a0 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72  osition list for
156b0 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20 74 68   column iCol, th
156c0 65 6e 0a 2a 2a 20 2a 70 6e 4c 69 73 74 20 69 73  en.** *pnList is
156d0 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 62 65 66   set to zero bef
156e0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
156f0 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
15700 72 20 62 5a 65 72 6f 20 69 73 20 6e 6f 6e 2d 7a  r bZero is non-z
15710 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 70 61  ero, then any pa
15720 72 74 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  rt of the input 
15730 6c 69 73 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a  list following.*
15740 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  * the end of the
15750 20 6f 75 74 70 75 74 20 6c 69 73 74 20 69 73 20   output list is 
15760 7a 65 72 6f 65 64 20 62 65 66 6f 72 65 20 72 65  zeroed before re
15770 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
15780 69 63 20 76 6f 69 64 20 66 74 73 33 43 6f 6c 75  ic void fts3Colu
15790 6d 6e 46 69 6c 74 65 72 28 0a 20 20 69 6e 74 20  mnFilter(.  int 
157a0 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  iCol,           
157b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
157c0 6f 6c 75 6d 6e 20 74 6f 20 66 69 6c 74 65 72 20  olumn to filter 
157d0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 5a 65 72  on */.  int bZer
157e0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
157f0 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20          /* Zero 
15800 6f 75 74 20 61 6e 79 74 68 69 6e 67 20 66 6f 6c  out anything fol
15810 6c 6f 77 69 6e 67 20 2a 70 70 4c 69 73 74 20 2a  lowing *ppList *
15820 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 4c 69 73  /.  char **ppLis
15830 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
15840 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50      /* IN/OUT: P
15850 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73 69 74 69  ointer to positi
15860 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  on list */.  int
15870 20 2a 70 6e 4c 69 73 74 20 20 20 20 20 20 20 20   *pnList        
15880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15890 49 4e 2f 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20  IN/OUT: Size of 
158a0 62 75 66 66 65 72 20 2a 70 70 4c 69 73 74 20 69  buffer *ppList i
158b0 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20  n bytes */.){.  
158c0 63 68 61 72 20 2a 70 4c 69 73 74 20 3d 20 2a 70  char *pList = *p
158d0 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 4c 69  pList;.  int nLi
158e0 73 74 20 3d 20 2a 70 6e 4c 69 73 74 3b 0a 20 20  st = *pnList;.  
158f0 63 68 61 72 20 2a 70 45 6e 64 20 3d 20 26 70 4c  char *pEnd = &pL
15900 69 73 74 5b 6e 4c 69 73 74 5d 3b 0a 20 20 69 6e  ist[nList];.  in
15910 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 0a  t iCurrent = 0;.
15920 20 20 63 68 61 72 20 2a 70 20 3d 20 70 4c 69 73    char *p = pLis
15930 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 43  t;..  assert( iC
15940 6f 6c 3e 3d 30 20 29 3b 0a 20 20 77 68 69 6c 65  ol>=0 );.  while
15950 28 20 31 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ( 1 ){.    char 
15960 63 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  c = 0;.    while
15970 28 20 70 3c 70 45 6e 64 20 26 26 20 28 63 20 7c  ( p<pEnd && (c |
15980 20 2a 70 29 26 30 78 46 45 20 29 20 63 20 3d 20   *p)&0xFE ) c = 
15990 2a 70 2b 2b 20 26 20 30 78 38 30 3b 0a 20 20 0a  *p++ & 0x80;.  .
159a0 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 69 43      if( iCol==iC
159b0 75 72 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  urrent ){.      
159c0 6e 4c 69 73 74 20 3d 20 28 69 6e 74 29 28 70 20  nList = (int)(p 
159d0 2d 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  - pList);.      
159e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
159f0 20 20 6e 4c 69 73 74 20 2d 3d 20 28 69 6e 74 29    nList -= (int)
15a00 28 70 20 2d 20 70 4c 69 73 74 29 3b 0a 20 20 20  (p - pList);.   
15a10 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20 20   pList = p;.    
15a20 69 66 28 20 6e 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( nList==0 ){.
15a30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15a40 20 7d 0a 20 20 20 20 70 20 3d 20 26 70 4c 69 73   }.    p = &pLis
15a50 74 5b 31 5d 3b 0a 20 20 20 20 70 20 2b 3d 20 66  t[1];.    p += f
15a60 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 70  ts3GetVarint32(p
15a70 2c 20 26 69 43 75 72 72 65 6e 74 29 3b 0a 20 20  , &iCurrent);.  
15a80 7d 0a 0a 20 20 69 66 28 20 62 5a 65 72 6f 20 26  }..  if( bZero &
15a90 26 20 26 70 4c 69 73 74 5b 6e 4c 69 73 74 5d 21  & &pList[nList]!
15aa0 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 6d 65 6d  =pEnd ){.    mem
15ab0 73 65 74 28 26 70 4c 69 73 74 5b 6e 4c 69 73 74  set(&pList[nList
15ac0 5d 2c 20 30 2c 20 70 45 6e 64 20 2d 20 26 70 4c  ], 0, pEnd - &pL
15ad0 69 73 74 5b 6e 4c 69 73 74 5d 29 3b 0a 20 20 7d  ist[nList]);.  }
15ae0 0a 20 20 2a 70 70 4c 69 73 74 20 3d 20 70 4c 69  .  *ppList = pLi
15af0 73 74 3b 0a 20 20 2a 70 6e 4c 69 73 74 20 3d 20  st;.  *pnList = 
15b00 6e 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nList;.}../*.** 
15b10 43 61 63 68 65 20 64 61 74 61 20 69 6e 20 74 68  Cache data in th
15b20 65 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65  e Fts3MultiSegRe
15b30 61 64 65 72 2e 61 42 75 66 66 65 72 5b 5d 20 62  ader.aBuffer[] b
15b40 75 66 66 65 72 20 28 6f 76 65 72 77 72 69 74 69  uffer (overwriti
15b50 6e 67 20 61 6e 79 0a 2a 2a 20 65 78 69 73 74 69  ng any.** existi
15b60 6e 67 20 64 61 74 61 29 2e 20 47 72 6f 77 20 74  ng data). Grow t
15b70 68 65 20 62 75 66 66 65 72 20 69 66 20 72 65 71  he buffer if req
15b80 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  uired..**.** If 
15b90 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
15ba0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74  rn SQLITE_OK. Ot
15bb0 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 4f  herwise, if an O
15bc0 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  OM error is enco
15bd0 75 6e 74 65 72 65 64 0a 2a 2a 20 74 72 79 69 6e  untered.** tryin
15be0 67 20 74 6f 20 72 65 73 69 7a 65 20 74 68 65 20  g to resize the 
15bf0 62 75 66 66 65 72 2c 20 72 65 74 75 72 6e 20 53  buffer, return S
15c00 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a  QLITE_NOMEM..*/.
15c10 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 4d  static int fts3M
15c20 73 72 42 75 66 66 65 72 44 61 74 61 28 0a 20 20  srBufferData(.  
15c30 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
15c40 65 72 20 2a 70 4d 73 72 2c 20 20 20 20 20 20 20  er *pMsr,       
15c50 2f 2a 20 4d 75 6c 74 69 2d 73 65 67 6d 65 6e 74  /* Multi-segment
15c60 2d 72 65 61 64 65 72 20 68 61 6e 64 6c 65 20 2a  -reader handle *
15c70 2f 0a 20 20 63 68 61 72 20 2a 70 4c 69 73 74 2c  /.  char *pList,
15c80 0a 20 20 69 6e 74 20 6e 4c 69 73 74 0a 29 7b 0a  .  int nList.){.
15c90 20 20 69 66 28 20 6e 4c 69 73 74 3e 70 4d 73 72    if( nList>pMsr
15ca0 2d 3e 6e 42 75 66 66 65 72 20 29 7b 0a 20 20 20  ->nBuffer ){.   
15cb0 20 63 68 61 72 20 2a 70 4e 65 77 3b 0a 20 20 20   char *pNew;.   
15cc0 20 70 4d 73 72 2d 3e 6e 42 75 66 66 65 72 20 3d   pMsr->nBuffer =
15cd0 20 6e 4c 69 73 74 2a 32 3b 0a 20 20 20 20 70 4e   nList*2;.    pN
15ce0 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ew = (char *)sql
15cf0 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4d 73  ite3_realloc(pMs
15d00 72 2d 3e 61 42 75 66 66 65 72 2c 20 70 4d 73 72  r->aBuffer, pMsr
15d10 2d 3e 6e 42 75 66 66 65 72 29 3b 0a 20 20 20 20  ->nBuffer);.    
15d20 69 66 28 20 21 70 4e 65 77 20 29 20 72 65 74 75  if( !pNew ) retu
15d30 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
15d40 0a 20 20 20 20 70 4d 73 72 2d 3e 61 42 75 66 66  .    pMsr->aBuff
15d50 65 72 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a  er = pNew;.  }..
15d60 20 20 6d 65 6d 63 70 79 28 70 4d 73 72 2d 3e 61    memcpy(pMsr->a
15d70 42 75 66 66 65 72 2c 20 70 4c 69 73 74 2c 20 6e  Buffer, pList, n
15d80 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  List);.  return 
15d90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e  SQLITE_OK;.}..in
15da0 74 20 73 71 6c 69 74 65 33 46 74 73 33 4d 73 72  t sqlite3Fts3Msr
15db0 49 6e 63 72 4e 65 78 74 28 0a 20 20 46 74 73 33  IncrNext(.  Fts3
15dc0 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
15dd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
15de0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
15df0 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c  dle */.  Fts3Mul
15e00 74 69 53 65 67 52 65 61 64 65 72 20 2a 70 4d 73  tiSegReader *pMs
15e10 72 2c 20 20 20 20 20 20 20 2f 2a 20 4d 75 6c 74  r,       /* Mult
15e20 69 2d 73 65 67 6d 65 6e 74 2d 72 65 61 64 65 72  i-segment-reader
15e30 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c   handle */.  sql
15e40 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 44 6f  ite3_int64 *piDo
15e50 63 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  cid,         /* 
15e60 4f 55 54 3a 20 44 6f 63 69 64 20 76 61 6c 75 65  OUT: Docid value
15e70 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 61 50   */.  char **paP
15e80 6f 73 6c 69 73 74 2c 20 20 20 20 20 20 20 20 20  oslist,         
15e90 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f        /* OUT: Po
15ea0 69 6e 74 65 72 20 74 6f 20 70 6f 73 69 74 69 6f  inter to positio
15eb0 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  n list */.  int 
15ec0 2a 70 6e 50 6f 73 6c 69 73 74 20 20 20 20 20 20  *pnPoslist      
15ed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
15ee0 55 54 3a 20 53 69 7a 65 20 6f 66 20 70 6f 73 69  UT: Size of posi
15ef0 74 69 6f 6e 20 6c 69 73 74 20 69 6e 20 62 79 74  tion list in byt
15f00 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  es */.){.  int n
15f10 4d 65 72 67 65 20 3d 20 70 4d 73 72 2d 3e 6e 41  Merge = pMsr->nA
15f20 64 76 61 6e 63 65 3b 0a 20 20 46 74 73 33 53 65  dvance;.  Fts3Se
15f30 67 52 65 61 64 65 72 20 2a 2a 61 70 53 65 67 6d  gReader **apSegm
15f40 65 6e 74 20 3d 20 70 4d 73 72 2d 3e 61 70 53 65  ent = pMsr->apSe
15f50 67 6d 65 6e 74 3b 0a 20 20 69 6e 74 20 28 2a 78  gment;.  int (*x
15f60 43 6d 70 29 28 46 74 73 33 53 65 67 52 65 61 64  Cmp)(Fts3SegRead
15f70 65 72 20 2a 2c 20 46 74 73 33 53 65 67 52 65 61  er *, Fts3SegRea
15f80 64 65 72 20 2a 29 20 3d 20 28 0a 20 20 20 20 70  der *) = (.    p
15f90 2d 3e 62 44 65 73 63 49 64 78 20 3f 20 66 74 73  ->bDescIdx ? fts
15fa0 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73  3SegReaderDoclis
15fb0 74 43 6d 70 52 65 76 20 3a 20 66 74 73 33 53 65  tCmpRev : fts3Se
15fc0 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d  gReaderDoclistCm
15fd0 70 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 6e 4d  p.  );..  if( nM
15fe0 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  erge==0 ){.    *
15ff0 70 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b 0a 20  paPoslist = 0;. 
16000 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16010 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  _OK;.  }..  whil
16020 65 28 20 31 20 29 7b 0a 20 20 20 20 46 74 73 33  e( 1 ){.    Fts3
16030 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67 3b  SegReader *pSeg;
16040 0a 20 20 20 20 70 53 65 67 20 3d 20 70 4d 73 72  .    pSeg = pMsr
16050 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 30 5d 3b 0a  ->apSegment[0];.
16060 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70  .    if( pSeg->p
16070 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30 20 29 7b  OffsetList==0 ){
16080 0a 20 20 20 20 20 20 2a 70 61 50 6f 73 6c 69 73  .      *paPoslis
16090 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  t = 0;.      bre
160a0 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ak;.    }else{. 
160b0 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
160c0 20 20 20 63 68 61 72 20 2a 70 4c 69 73 74 3b 0a     char *pList;.
160d0 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 73 74 3b        int nList;
160e0 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
160f0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
16100 34 20 69 44 6f 63 69 64 20 3d 20 61 70 53 65 67  4 iDocid = apSeg
16110 6d 65 6e 74 5b 30 5d 2d 3e 69 44 6f 63 69 64 3b  ment[0]->iDocid;
16120 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  ..      rc = fts
16130 33 53 65 67 52 65 61 64 65 72 4e 65 78 74 44 6f  3SegReaderNextDo
16140 63 69 64 28 70 2c 20 61 70 53 65 67 6d 65 6e 74  cid(p, apSegment
16150 5b 30 5d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c  [0], &pList, &nL
16160 69 73 74 29 3b 0a 20 20 20 20 20 20 6a 20 3d 20  ist);.      j = 
16170 31 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  1;.      while( 
16180 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20  rc==SQLITE_OK . 
16190 20 20 20 20 20 20 20 26 26 20 6a 3c 6e 4d 65 72         && j<nMer
161a0 67 65 0a 20 20 20 20 20 20 20 20 26 26 20 61 70  ge.        && ap
161b0 53 65 67 6d 65 6e 74 5b 6a 5d 2d 3e 70 4f 66 66  Segment[j]->pOff
161c0 73 65 74 4c 69 73 74 0a 20 20 20 20 20 20 20 20  setList.        
161d0 26 26 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2d  && apSegment[j]-
161e0 3e 69 44 6f 63 69 64 3d 3d 69 44 6f 63 69 64 0a  >iDocid==iDocid.
161f0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
16200 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61   rc = fts3SegRea
16210 64 65 72 4e 65 78 74 44 6f 63 69 64 28 70 2c 20  derNextDocid(p, 
16220 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2c 20 30 2c  apSegment[j], 0,
16230 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b   0);.        j++
16240 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16250 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16260 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
16270 20 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64       fts3SegRead
16280 65 72 53 6f 72 74 28 70 4d 73 72 2d 3e 61 70 53  erSort(pMsr->apS
16290 65 67 6d 65 6e 74 2c 20 6e 4d 65 72 67 65 2c 20  egment, nMerge, 
162a0 6a 2c 20 78 43 6d 70 29 3b 0a 0a 20 20 20 20 20  j, xCmp);..     
162b0 20 69 66 28 20 6e 4c 69 73 74 3e 30 20 26 26 20   if( nList>0 && 
162c0 66 74 73 33 53 65 67 52 65 61 64 65 72 49 73 50  fts3SegReaderIsP
162d0 65 6e 64 69 6e 67 28 61 70 53 65 67 6d 65 6e 74  ending(apSegment
162e0 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
162f0 72 63 20 3d 20 66 74 73 33 4d 73 72 42 75 66 66  rc = fts3MsrBuff
16300 65 72 44 61 74 61 28 70 4d 73 72 2c 20 70 4c 69  erData(pMsr, pLi
16310 73 74 2c 20 6e 4c 69 73 74 2b 31 29 3b 0a 20 20  st, nList+1);.  
16320 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
16330 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
16340 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73   rc;.        ass
16350 65 72 74 28 20 28 70 4d 73 72 2d 3e 61 42 75 66  ert( (pMsr->aBuf
16360 66 65 72 5b 6e 4c 69 73 74 5d 20 26 20 30 78 46  fer[nList] & 0xF
16370 45 29 3d 3d 30 78 30 30 20 29 3b 0a 20 20 20 20  E)==0x00 );.    
16380 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4d 73 72      pList = pMsr
16390 2d 3e 61 42 75 66 66 65 72 3b 0a 20 20 20 20 20  ->aBuffer;.     
163a0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 4d   }..      if( pM
163b0 73 72 2d 3e 69 43 6f 6c 46 69 6c 74 65 72 3e 3d  sr->iColFilter>=
163c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  0 ){.        fts
163d0 33 43 6f 6c 75 6d 6e 46 69 6c 74 65 72 28 70 4d  3ColumnFilter(pM
163e0 73 72 2d 3e 69 43 6f 6c 46 69 6c 74 65 72 2c 20  sr->iColFilter, 
163f0 31 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73  1, &pList, &nLis
16400 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  t);.      }..   
16410 20 20 20 69 66 28 20 6e 4c 69 73 74 3e 30 20 29     if( nList>0 )
16420 7b 0a 20 20 20 20 20 20 20 20 2a 70 61 50 6f 73  {.        *paPos
16430 6c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  list = pList;.  
16440 20 20 20 20 20 20 2a 70 69 44 6f 63 69 64 20 3d        *piDocid =
16450 20 69 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20   iDocid;.       
16460 20 2a 70 6e 50 6f 73 6c 69 73 74 20 3d 20 6e 4c   *pnPoslist = nL
16470 69 73 74 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ist;.        bre
16480 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
16490 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
164a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74  SQLITE_OK;.}..st
164b0 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67  atic int fts3Seg
164c0 52 65 61 64 65 72 53 74 61 72 74 28 0a 20 20 46  ReaderStart(.  F
164d0 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
164e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
164f0 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * Virtual table 
16500 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33  handle */.  Fts3
16510 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a  MultiSegReader *
16520 70 43 73 72 2c 20 20 20 20 20 20 20 2f 2a 20 43  pCsr,       /* C
16530 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  ursor object */.
16540 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
16550 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
16560 20 20 2f 2a 20 54 65 72 6d 20 73 65 61 72 63 68    /* Term search
16570 65 64 20 66 6f 72 20 28 6f 72 20 4e 55 4c 4c 29  ed for (or NULL)
16580 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 20   */.  int nTerm 
16590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165a0 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
165b0 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65  of zTerm in byte
165c0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
165d0 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 70 43  .  int nSeg = pC
165e0 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 0a 20  sr->nSegment;.. 
165f0 20 2f 2a 20 49 66 20 74 68 65 20 46 74 73 33 53   /* If the Fts3S
16600 65 67 46 69 6c 74 65 72 20 64 65 66 69 6e 65 73  egFilter defines
16610 20 61 20 73 70 65 63 69 66 69 63 20 74 65 72 6d   a specific term
16620 20 28 6f 72 20 74 65 72 6d 20 70 72 65 66 69 78   (or term prefix
16630 29 20 74 6f 20 73 65 61 72 63 68 20 0a 20 20 2a  ) to search .  *
16640 2a 20 66 6f 72 2c 20 74 68 65 6e 20 61 64 76 61  * for, then adva
16650 6e 63 65 20 65 61 63 68 20 73 65 67 6d 65 6e 74  nce each segment
16660 20 69 74 65 72 61 74 6f 72 20 75 6e 74 69 6c 20   iterator until 
16670 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 74  it points to a t
16680 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 65 71 75 61  erm of.  ** equa
16690 6c 20 6f 72 20 67 72 65 61 74 65 72 20 76 61 6c  l or greater val
166a0 75 65 20 74 68 61 6e 20 74 68 65 20 73 70 65 63  ue than the spec
166b0 69 66 69 65 64 20 74 65 72 6d 2e 20 54 68 69 73  ified term. This
166c0 20 70 72 65 76 65 6e 74 73 20 6d 61 6e 79 0a 20   prevents many. 
166d0 20 2a 2a 20 75 6e 6e 65 63 65 73 73 61 72 79 20   ** unnecessary 
166e0 6d 65 72 67 65 2f 73 6f 72 74 20 6f 70 65 72 61  merge/sort opera
166f0 74 69 6f 6e 73 20 66 6f 72 20 74 68 65 20 63 61  tions for the ca
16700 73 65 20 77 68 65 72 65 20 73 69 6e 67 6c 65 20  se where single 
16710 73 65 67 6d 65 6e 74 0a 20 20 2a 2a 20 62 2d 74  segment.  ** b-t
16720 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 20 63  ree leaf nodes c
16730 6f 6e 74 61 69 6e 20 6d 6f 72 65 20 74 68 61 6e  ontain more than
16740 20 6f 6e 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a   one term..  */.
16750 20 20 66 6f 72 28 69 3d 30 3b 20 70 43 73 72 2d    for(i=0; pCsr-
16760 3e 62 52 65 73 74 61 72 74 3d 3d 30 20 26 26 20  >bRestart==0 && 
16770 69 3c 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74  i<pCsr->nSegment
16780 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
16790 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 46 74 73  res = 0;.    Fts
167a0 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67  3SegReader *pSeg
167b0 20 3d 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65   = pCsr->apSegme
167c0 6e 74 5b 69 5d 3b 0a 20 20 20 20 64 6f 20 7b 0a  nt[i];.    do {.
167d0 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 66        int rc = f
167e0 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 78 74  ts3SegReaderNext
167f0 28 70 2c 20 70 53 65 67 2c 20 30 29 3b 0a 20 20  (p, pSeg, 0);.  
16800 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16810 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
16820 63 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 7a  c;.    }while( z
16830 54 65 72 6d 20 26 26 20 28 72 65 73 20 3d 20 66  Term && (res = f
16840 74 73 33 53 65 67 52 65 61 64 65 72 54 65 72 6d  ts3SegReaderTerm
16850 43 6d 70 28 70 53 65 67 2c 20 7a 54 65 72 6d 2c  Cmp(pSeg, zTerm,
16860 20 6e 54 65 72 6d 29 29 3c 30 20 29 3b 0a 0a 20   nTerm))<0 );.. 
16870 20 20 20 69 66 28 20 70 53 65 67 2d 3e 62 4c 6f     if( pSeg->bLo
16880 6f 6b 75 70 20 26 26 20 72 65 73 21 3d 30 20 29  okup && res!=0 )
16890 7b 0a 20 20 20 20 20 20 66 74 73 33 53 65 67 52  {.      fts3SegR
168a0 65 61 64 65 72 53 65 74 45 6f 66 28 70 53 65 67  eaderSetEof(pSeg
168b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  );.    }.  }.  f
168c0 74 73 33 53 65 67 52 65 61 64 65 72 53 6f 72 74  ts3SegReaderSort
168d0 28 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74  (pCsr->apSegment
168e0 2c 20 6e 53 65 67 2c 20 6e 53 65 67 2c 20 66 74  , nSeg, nSeg, ft
168f0 73 33 53 65 67 52 65 61 64 65 72 43 6d 70 29 3b  s3SegReaderCmp);
16900 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
16910 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c  E_OK;.}..int sql
16920 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
16930 72 53 74 61 72 74 28 0a 20 20 46 74 73 33 54 61  rStart(.  Fts3Ta
16940 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
16950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
16960 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
16970 65 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69  e */.  Fts3Multi
16980 53 65 67 52 65 61 64 65 72 20 2a 70 43 73 72 2c  SegReader *pCsr,
16990 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
169a0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
169b0 33 53 65 67 46 69 6c 74 65 72 20 2a 70 46 69 6c  3SegFilter *pFil
169c0 74 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ter          /* 
169d0 52 65 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20  Restrictions on 
169e0 72 61 6e 67 65 20 6f 66 20 69 74 65 72 61 74 69  range of iterati
169f0 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 70 43 73 72 2d  on */.){.  pCsr-
16a00 3e 70 46 69 6c 74 65 72 20 3d 20 70 46 69 6c 74  >pFilter = pFilt
16a10 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  er;.  return fts
16a20 33 53 65 67 52 65 61 64 65 72 53 74 61 72 74 28  3SegReaderStart(
16a30 70 2c 20 70 43 73 72 2c 20 70 46 69 6c 74 65 72  p, pCsr, pFilter
16a40 2d 3e 7a 54 65 72 6d 2c 20 70 46 69 6c 74 65 72  ->zTerm, pFilter
16a50 2d 3e 6e 54 65 72 6d 29 3b 0a 7d 0a 0a 69 6e 74  ->nTerm);.}..int
16a60 20 73 71 6c 69 74 65 33 46 74 73 33 4d 73 72 49   sqlite3Fts3MsrI
16a70 6e 63 72 53 74 61 72 74 28 0a 20 20 46 74 73 33  ncrStart(.  Fts3
16a80 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
16a90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
16aa0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
16ab0 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c  dle */.  Fts3Mul
16ac0 74 69 53 65 67 52 65 61 64 65 72 20 2a 70 43 73  tiSegReader *pCs
16ad0 72 2c 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73  r,       /* Curs
16ae0 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  or object */.  i
16af0 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
16b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16b10 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 6d 61 74 63  * Column to matc
16b20 68 20 6f 6e 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74  h on. */.  const
16b30 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20   char *zTerm,   
16b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
16b50 72 6d 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  rm to iterate th
16b60 72 6f 75 67 68 20 61 20 64 6f 63 6c 69 73 74 20  rough a doclist 
16b70 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  for */.  int nTe
16b80 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rm              
16b90 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
16ba0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a  er of bytes in z
16bb0 54 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  Term */.){.  int
16bc0 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   i;.  int rc;.  
16bd0 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 70  int nSegment = p
16be0 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20  Csr->nSegment;. 
16bf0 20 69 6e 74 20 28 2a 78 43 6d 70 29 28 46 74 73   int (*xCmp)(Fts
16c00 33 53 65 67 52 65 61 64 65 72 20 2a 2c 20 46 74  3SegReader *, Ft
16c10 73 33 53 65 67 52 65 61 64 65 72 20 2a 29 20 3d  s3SegReader *) =
16c20 20 28 0a 20 20 20 20 70 2d 3e 62 44 65 73 63 49   (.    p->bDescI
16c30 64 78 20 3f 20 66 74 73 33 53 65 67 52 65 61 64  dx ? fts3SegRead
16c40 65 72 44 6f 63 6c 69 73 74 43 6d 70 52 65 76 20  erDoclistCmpRev 
16c50 3a 20 66 74 73 33 53 65 67 52 65 61 64 65 72 44  : fts3SegReaderD
16c60 6f 63 6c 69 73 74 43 6d 70 0a 20 20 29 3b 0a 0a  oclistCmp.  );..
16c70 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
16c80 70 46 69 6c 74 65 72 3d 3d 30 20 29 3b 0a 20 20  pFilter==0 );.  
16c90 61 73 73 65 72 74 28 20 7a 54 65 72 6d 20 26 26  assert( zTerm &&
16ca0 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f   nTerm>0 );..  /
16cb0 2a 20 41 64 76 61 6e 63 65 20 65 61 63 68 20 73  * Advance each s
16cc0 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 20  egment iterator 
16cd0 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20  until it points 
16ce0 74 6f 20 74 68 65 20 74 65 72 6d 20 7a 54 65 72  to the term zTer
16cf0 6d 2f 6e 54 65 72 6d 2e 20 2a 2f 0a 20 20 72 63  m/nTerm. */.  rc
16d00 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72   = fts3SegReader
16d10 53 74 61 72 74 28 70 2c 20 70 43 73 72 2c 20 7a  Start(p, pCsr, z
16d20 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20  Term, nTerm);.  
16d30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16d40 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
16d50 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 68    /* Determine h
16d60 6f 77 20 6d 61 6e 79 20 6f 66 20 74 68 65 20 73  ow many of the s
16d70 65 67 6d 65 6e 74 73 20 61 63 74 75 61 6c 6c 79  egments actually
16d80 20 70 6f 69 6e 74 20 74 6f 20 7a 54 65 72 6d 2f   point to zTerm/
16d90 6e 54 65 72 6d 2e 20 2a 2f 0a 20 20 66 6f 72 28  nTerm. */.  for(
16da0 69 3d 30 3b 20 69 3c 6e 53 65 67 6d 65 6e 74 3b  i=0; i<nSegment;
16db0 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 33 53   i++){.    Fts3S
16dc0 65 67 52 65 61 64 65 72 20 2a 70 53 65 67 20 3d  egReader *pSeg =
16dd0 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74   pCsr->apSegment
16de0 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 21 70 53  [i];.    if( !pS
16df0 65 67 2d 3e 61 4e 6f 64 65 20 7c 7c 20 66 74 73  eg->aNode || fts
16e00 33 53 65 67 52 65 61 64 65 72 54 65 72 6d 43 6d  3SegReaderTermCm
16e10 70 28 70 53 65 67 2c 20 7a 54 65 72 6d 2c 20 6e  p(pSeg, zTerm, n
16e20 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 20 20 62  Term) ){.      b
16e30 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
16e40 20 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65    pCsr->nAdvance
16e50 20 3d 20 69 3b 0a 0a 20 20 2f 2a 20 41 64 76 61   = i;..  /* Adva
16e60 6e 63 65 20 65 61 63 68 20 6f 66 20 74 68 65 20  nce each of the 
16e70 73 65 67 6d 65 6e 74 73 20 74 6f 20 70 6f 69 6e  segments to poin
16e80 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 64  t to the first d
16e90 6f 63 69 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  ocid. */.  for(i
16ea0 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 41 64 76  =0; i<pCsr->nAdv
16eb0 61 6e 63 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ance; i++){.    
16ec0 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64  rc = fts3SegRead
16ed0 65 72 46 69 72 73 74 44 6f 63 69 64 28 70 2c 20  erFirstDocid(p, 
16ee0 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b  pCsr->apSegment[
16ef0 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  i]);.    if( rc!
16f00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
16f10 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 66 74  urn rc;.  }.  ft
16f20 73 33 53 65 67 52 65 61 64 65 72 53 6f 72 74 28  s3SegReaderSort(
16f30 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 2c  pCsr->apSegment,
16f40 20 69 2c 20 69 2c 20 78 43 6d 70 29 3b 0a 0a 20   i, i, xCmp);.. 
16f50 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3c 30 20   assert( iCol<0 
16f60 7c 7c 20 69 43 6f 6c 3c 70 2d 3e 6e 43 6f 6c 75  || iCol<p->nColu
16f70 6d 6e 20 29 3b 0a 20 20 70 43 73 72 2d 3e 69 43  mn );.  pCsr->iC
16f80 6f 6c 46 69 6c 74 65 72 20 3d 20 69 43 6f 6c 3b  olFilter = iCol;
16f90 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
16fa0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
16fb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
16fc0 63 61 6c 6c 65 64 20 6f 6e 20 61 20 4d 75 6c 74  called on a Mult
16fd0 69 53 65 67 52 65 61 64 65 72 20 74 68 61 74 20  iSegReader that 
16fe0 68 61 73 20 62 65 65 6e 20 73 74 61 72 74 65 64  has been started
16ff0 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
17000 33 46 74 73 33 4d 73 72 49 6e 63 72 53 74 61 72  3Fts3MsrIncrStar
17010 74 28 29 2e 20 4f 6e 65 20 6f 72 20 6d 6f 72 65  t(). One or more
17020 20 63 61 6c 6c 73 20 74 6f 20 4d 73 72 49 6e 63   calls to MsrInc
17030 72 4e 65 78 74 28 29 20 6d 61 79 20 61 6c 73 6f  rNext() may also
17040 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 6d 61  .** have been ma
17050 64 65 2e 20 43 61 6c 6c 69 6e 67 20 74 68 69 73  de. Calling this
17060 20 66 75 6e 63 74 69 6f 6e 20 70 75 74 73 20 74   function puts t
17070 68 65 20 4d 75 6c 74 69 53 65 67 52 65 61 64 65  he MultiSegReade
17080 72 20 69 6e 20 73 75 63 68 0a 2a 2a 20 61 20 73  r in such.** a s
17090 74 61 74 65 20 74 68 61 74 20 69 66 20 74 68 65  tate that if the
170a0 20 6e 65 78 74 20 74 77 6f 20 63 61 6c 6c 73 20   next two calls 
170b0 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c  are:.**.**   sql
170c0 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
170d0 72 53 74 61 72 74 28 29 0a 2a 2a 20 20 20 73 71  rStart().**   sq
170e0 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64  lite3Fts3SegRead
170f0 65 72 53 74 65 70 28 29 0a 2a 2a 0a 2a 2a 20 74  erStep().**.** t
17100 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20 64  hen the entire d
17110 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 65 20 74  oclist for the t
17120 65 72 6d 20 69 73 20 61 76 61 69 6c 61 62 6c 65  erm is available
17130 20 69 6e 20 0a 2a 2a 20 4d 75 6c 74 69 53 65 67   in .** MultiSeg
17140 52 65 61 64 65 72 2e 61 44 6f 63 6c 69 73 74 2f  Reader.aDoclist/
17150 6e 44 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 69 6e 74  nDoclist..*/.int
17160 20 73 71 6c 69 74 65 33 46 74 73 33 4d 73 72 49   sqlite3Fts3MsrI
17170 6e 63 72 52 65 73 74 61 72 74 28 46 74 73 33 4d  ncrRestart(Fts3M
17180 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70  ultiSegReader *p
17190 43 73 72 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  Csr){.  int i;  
171a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171b0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
171c0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
171d0 67 68 20 73 65 67 6d 65 6e 74 2d 72 65 61 64 65  gh segment-reade
171e0 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  rs */..  assert(
171f0 20 70 43 73 72 2d 3e 7a 54 65 72 6d 3d 3d 30 20   pCsr->zTerm==0 
17200 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 73  );.  assert( pCs
17210 72 2d 3e 6e 54 65 72 6d 3d 3d 30 20 29 3b 0a 20  r->nTerm==0 );. 
17220 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 61   assert( pCsr->a
17230 44 6f 63 6c 69 73 74 3d 3d 30 20 29 3b 0a 20 20  Doclist==0 );.  
17240 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 6e 44  assert( pCsr->nD
17250 6f 63 6c 69 73 74 3d 3d 30 20 29 3b 0a 0a 20 20  oclist==0 );..  
17260 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65 20 3d  pCsr->nAdvance =
17270 20 30 3b 0a 20 20 70 43 73 72 2d 3e 62 52 65 73   0;.  pCsr->bRes
17280 74 61 72 74 20 3d 20 31 3b 0a 20 20 66 6f 72 28  tart = 1;.  for(
17290 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 53 65  i=0; i<pCsr->nSe
172a0 67 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  gment; i++){.   
172b0 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74   pCsr->apSegment
172c0 5b 69 5d 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74  [i]->pOffsetList
172d0 20 3d 20 30 3b 0a 20 20 20 20 70 43 73 72 2d 3e   = 0;.    pCsr->
172e0 61 70 53 65 67 6d 65 6e 74 5b 69 5d 2d 3e 6e 4f  apSegment[i]->nO
172f0 66 66 73 65 74 4c 69 73 74 20 3d 20 30 3b 0a 20  ffsetList = 0;. 
17300 20 20 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65     pCsr->apSegme
17310 6e 74 5b 69 5d 2d 3e 69 44 6f 63 69 64 20 3d 20  nt[i]->iDocid = 
17320 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  0;.  }..  return
17330 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
17340 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 53  int sqlite3Fts3S
17350 65 67 52 65 61 64 65 72 53 74 65 70 28 0a 20 20  egReaderStep(.  
17360 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
17370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17380 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  /* Virtual table
17390 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73   handle */.  Fts
173a0 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20  3MultiSegReader 
173b0 2a 70 43 73 72 20 20 20 20 20 20 20 20 2f 2a 20  *pCsr        /* 
173c0 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  Cursor object */
173d0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
173e0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 6e 74  QLITE_OK;..  int
173f0 20 69 73 49 67 6e 6f 72 65 45 6d 70 74 79 20 3d   isIgnoreEmpty =
17400 20 20 28 70 43 73 72 2d 3e 70 46 69 6c 74 65 72    (pCsr->pFilter
17410 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 33 5f 53  ->flags & FTS3_S
17420 45 47 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d  EGMENT_IGNORE_EM
17430 50 54 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  PTY);.  int isRe
17440 71 75 69 72 65 50 6f 73 20 3d 20 20 20 28 70 43  quirePos =   (pC
17450 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e 66 6c 61  sr->pFilter->fla
17460 67 73 20 26 20 46 54 53 33 5f 53 45 47 4d 45 4e  gs & FTS3_SEGMEN
17470 54 5f 52 45 51 55 49 52 45 5f 50 4f 53 29 3b 0a  T_REQUIRE_POS);.
17480 20 20 69 6e 74 20 69 73 43 6f 6c 46 69 6c 74 65    int isColFilte
17490 72 20 3d 20 20 20 20 28 70 43 73 72 2d 3e 70 46  r =    (pCsr->pF
174a0 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  ilter->flags & F
174b0 54 53 33 5f 53 45 47 4d 45 4e 54 5f 43 4f 4c 55  TS3_SEGMENT_COLU
174c0 4d 4e 5f 46 49 4c 54 45 52 29 3b 0a 20 20 69 6e  MN_FILTER);.  in
174d0 74 20 69 73 50 72 65 66 69 78 20 3d 20 20 20 20  t isPrefix =    
174e0 20 20 20 28 70 43 73 72 2d 3e 70 46 69 6c 74 65     (pCsr->pFilte
174f0 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 33 5f  r->flags & FTS3_
17500 53 45 47 4d 45 4e 54 5f 50 52 45 46 49 58 29 3b  SEGMENT_PREFIX);
17510 0a 20 20 69 6e 74 20 69 73 53 63 61 6e 20 3d 20  .  int isScan = 
17520 20 20 20 20 20 20 20 20 28 70 43 73 72 2d 3e 70          (pCsr->p
17530 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26 20  Filter->flags & 
17540 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 53 43 41  FTS3_SEGMENT_SCA
17550 4e 29 3b 0a 20 20 69 6e 74 20 69 73 46 69 72 73  N);.  int isFirs
17560 74 20 3d 20 20 20 20 20 20 20 20 28 70 43 73 72  t =        (pCsr
17570 2d 3e 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73  ->pFilter->flags
17580 20 26 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f   & FTS3_SEGMENT_
17590 46 49 52 53 54 29 3b 0a 0a 20 20 46 74 73 33 53  FIRST);..  Fts3S
175a0 65 67 52 65 61 64 65 72 20 2a 2a 61 70 53 65 67  egReader **apSeg
175b0 6d 65 6e 74 20 3d 20 70 43 73 72 2d 3e 61 70 53  ment = pCsr->apS
175c0 65 67 6d 65 6e 74 3b 0a 20 20 69 6e 74 20 6e 53  egment;.  int nS
175d0 65 67 6d 65 6e 74 20 3d 20 70 43 73 72 2d 3e 6e  egment = pCsr->n
175e0 53 65 67 6d 65 6e 74 3b 0a 20 20 46 74 73 33 53  Segment;.  Fts3S
175f0 65 67 46 69 6c 74 65 72 20 2a 70 46 69 6c 74 65  egFilter *pFilte
17600 72 20 3d 20 70 43 73 72 2d 3e 70 46 69 6c 74 65  r = pCsr->pFilte
17610 72 3b 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70 29  r;.  int (*xCmp)
17620 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a  (Fts3SegReader *
17630 2c 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20  , Fts3SegReader 
17640 2a 29 20 3d 20 28 0a 20 20 20 20 70 2d 3e 62 44  *) = (.    p->bD
17650 65 73 63 49 64 78 20 3f 20 66 74 73 33 53 65 67  escIdx ? fts3Seg
17660 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70  ReaderDoclistCmp
17670 52 65 76 20 3a 20 66 74 73 33 53 65 67 52 65 61  Rev : fts3SegRea
17680 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 0a 20 20  derDoclistCmp.  
17690 29 3b 0a 0a 20 20 69 66 28 20 70 43 73 72 2d 3e  );..  if( pCsr->
176a0 6e 53 65 67 6d 65 6e 74 3d 3d 30 20 29 20 72 65  nSegment==0 ) re
176b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
176c0 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 6e 74 20  .  do {.    int 
176d0 6e 4d 65 72 67 65 3b 0a 20 20 20 20 69 6e 74 20  nMerge;.    int 
176e0 69 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41 64 76  i;.  .    /* Adv
176f0 61 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 70  ance the first p
17700 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65 20 65 6e  Csr->nAdvance en
17710 74 72 69 65 73 20 69 6e 20 74 68 65 20 61 70 53  tries in the apS
17720 65 67 6d 65 6e 74 5b 5d 20 61 72 72 61 79 0a 20  egment[] array. 
17730 20 20 20 2a 2a 20 66 6f 72 77 61 72 64 2e 20 54     ** forward. T
17740 68 65 6e 20 73 6f 72 74 20 74 68 65 20 6c 69 73  hen sort the lis
17750 74 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 63 75  t in order of cu
17760 72 72 65 6e 74 20 74 65 72 6d 20 61 67 61 69 6e  rrent term again
17770 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  .  .    */.    f
17780 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e  or(i=0; i<pCsr->
17790 6e 41 64 76 61 6e 63 65 3b 20 69 2b 2b 29 7b 0a  nAdvance; i++){.
177a0 20 20 20 20 20 20 46 74 73 33 53 65 67 52 65 61        Fts3SegRea
177b0 64 65 72 20 2a 70 53 65 67 20 3d 20 61 70 53 65  der *pSeg = apSe
177c0 67 6d 65 6e 74 5b 69 5d 3b 0a 20 20 20 20 20 20  gment[i];.      
177d0 69 66 28 20 70 53 65 67 2d 3e 62 4c 6f 6f 6b 75  if( pSeg->bLooku
177e0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  p ){.        fts
177f0 33 53 65 67 52 65 61 64 65 72 53 65 74 45 6f 66  3SegReaderSetEof
17800 28 70 53 65 67 29 3b 0a 20 20 20 20 20 20 7d 65  (pSeg);.      }e
17810 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
17820 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e  = fts3SegReaderN
17830 65 78 74 28 70 2c 20 70 53 65 67 2c 20 30 29 3b  ext(p, pSeg, 0);
17840 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
17850 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17860 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
17870 20 20 7d 0a 20 20 20 20 66 74 73 33 53 65 67 52    }.    fts3SegR
17880 65 61 64 65 72 53 6f 72 74 28 61 70 53 65 67 6d  eaderSort(apSegm
17890 65 6e 74 2c 20 6e 53 65 67 6d 65 6e 74 2c 20 70  ent, nSegment, p
178a0 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65 2c 20 66  Csr->nAdvance, f
178b0 74 73 33 53 65 67 52 65 61 64 65 72 43 6d 70 29  ts3SegReaderCmp)
178c0 3b 0a 20 20 20 20 70 43 73 72 2d 3e 6e 41 64 76  ;.    pCsr->nAdv
178d0 61 6e 63 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  ance = 0;..    /
178e0 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 73 65 67  * If all the seg
178f0 2d 72 65 61 64 65 72 73 20 61 72 65 20 61 74 20  -readers are at 
17900 45 4f 46 2c 20 77 65 27 72 65 20 66 69 6e 69 73  EOF, we're finis
17910 68 65 64 2e 20 72 65 74 75 72 6e 20 53 51 4c 49  hed. return SQLI
17920 54 45 5f 4f 4b 2e 20 2a 2f 0a 20 20 20 20 61 73  TE_OK. */.    as
17930 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
17940 5f 4f 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 61  _OK );.    if( a
17950 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 61 4e 6f  pSegment[0]->aNo
17960 64 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a  de==0 ) break;..
17970 20 20 20 20 70 43 73 72 2d 3e 6e 54 65 72 6d 20      pCsr->nTerm 
17980 3d 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e  = apSegment[0]->
17990 6e 54 65 72 6d 3b 0a 20 20 20 20 70 43 73 72 2d  nTerm;.    pCsr-
179a0 3e 7a 54 65 72 6d 20 3d 20 61 70 53 65 67 6d 65  >zTerm = apSegme
179b0 6e 74 5b 30 5d 2d 3e 7a 54 65 72 6d 3b 0a 0a 20  nt[0]->zTerm;.. 
179c0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
179d0 20 61 20 70 72 65 66 69 78 2d 73 65 61 72 63 68   a prefix-search
179e0 2c 20 61 6e 64 20 69 66 20 74 68 65 20 74 65 72  , and if the ter
179f0 6d 20 74 68 61 74 20 61 70 53 65 67 6d 65 6e 74  m that apSegment
17a00 5b 30 5d 20 70 6f 69 6e 74 73 0a 20 20 20 20 2a  [0] points.    *
17a10 2a 20 74 6f 20 64 6f 65 73 20 6e 6f 74 20 73 68  * to does not sh
17a20 61 72 65 20 61 20 73 75 66 66 69 78 20 77 69 74  are a suffix wit
17a30 68 20 70 46 69 6c 74 65 72 2d 3e 7a 54 65 72 6d  h pFilter->zTerm
17a40 2f 6e 54 65 72 6d 2c 20 74 68 65 6e 20 61 6c 6c  /nTerm, then all
17a50 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65   .    ** require
17a60 64 20 63 61 6c 6c 62 61 63 6b 73 20 68 61 76 65  d callbacks have
17a70 20 62 65 65 6e 20 6d 61 64 65 2e 20 49 6e 20 74   been made. In t
17a80 68 69 73 20 63 61 73 65 20 65 78 69 74 20 65 61  his case exit ea
17a90 72 6c 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  rly..    **.    
17aa0 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 66  ** Similarly, if
17ab0 20 74 68 69 73 20 69 73 20 61 20 73 65 61 72 63   this is a searc
17ac0 68 20 66 6f 72 20 61 6e 20 65 78 61 63 74 20 6d  h for an exact m
17ad0 61 74 63 68 2c 20 61 6e 64 20 74 68 65 20 66 69  atch, and the fi
17ae0 72 73 74 20 74 65 72 6d 0a 20 20 20 20 2a 2a 20  rst term.    ** 
17af0 6f 66 20 73 65 67 6d 65 6e 74 20 61 70 53 65 67  of segment apSeg
17b00 6d 65 6e 74 5b 30 5d 20 69 73 20 6e 6f 74 20 61  ment[0] is not a
17b10 20 6d 61 74 63 68 2c 20 65 78 69 74 20 65 61 72   match, exit ear
17b20 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ly..    */.    i
17b30 66 28 20 70 46 69 6c 74 65 72 2d 3e 7a 54 65 72  f( pFilter->zTer
17b40 6d 20 26 26 20 21 69 73 53 63 61 6e 20 29 7b 0a  m && !isScan ){.
17b50 20 20 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e        if( pCsr->
17b60 6e 54 65 72 6d 3c 70 46 69 6c 74 65 72 2d 3e 6e  nTerm<pFilter->n
17b70 54 65 72 6d 20 0a 20 20 20 20 20 20 20 7c 7c 20  Term .       || 
17b80 28 21 69 73 50 72 65 66 69 78 20 26 26 20 70 43  (!isPrefix && pC
17b90 73 72 2d 3e 6e 54 65 72 6d 3e 70 46 69 6c 74 65  sr->nTerm>pFilte
17ba0 72 2d 3e 6e 54 65 72 6d 29 0a 20 20 20 20 20 20  r->nTerm).      
17bb0 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 43 73 72 2d   || memcmp(pCsr-
17bc0 3e 7a 54 65 72 6d 2c 20 70 46 69 6c 74 65 72 2d  >zTerm, pFilter-
17bd0 3e 7a 54 65 72 6d 2c 20 70 46 69 6c 74 65 72 2d  >zTerm, pFilter-
17be0 3e 6e 54 65 72 6d 29 20 0a 20 20 20 20 20 20 29  >nTerm) .      )
17bf0 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
17c00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
17c10 20 20 20 20 6e 4d 65 72 67 65 20 3d 20 31 3b 0a      nMerge = 1;.
17c20 20 20 20 20 77 68 69 6c 65 28 20 6e 4d 65 72 67      while( nMerg
17c30 65 3c 6e 53 65 67 6d 65 6e 74 20 0a 20 20 20 20  e<nSegment .    
17c40 20 20 20 20 26 26 20 61 70 53 65 67 6d 65 6e 74      && apSegment
17c50 5b 6e 4d 65 72 67 65 5d 2d 3e 61 4e 6f 64 65 0a  [nMerge]->aNode.
17c60 20 20 20 20 20 20 20 20 26 26 20 61 70 53 65 67          && apSeg
17c70 6d 65 6e 74 5b 6e 4d 65 72 67 65 5d 2d 3e 6e 54  ment[nMerge]->nT
17c80 65 72 6d 3d 3d 70 43 73 72 2d 3e 6e 54 65 72 6d  erm==pCsr->nTerm
17c90 20 0a 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d   .        && 0==
17ca0 6d 65 6d 63 6d 70 28 70 43 73 72 2d 3e 7a 54 65  memcmp(pCsr->zTe
17cb0 72 6d 2c 20 61 70 53 65 67 6d 65 6e 74 5b 6e 4d  rm, apSegment[nM
17cc0 65 72 67 65 5d 2d 3e 7a 54 65 72 6d 2c 20 70 43  erge]->zTerm, pC
17cd0 73 72 2d 3e 6e 54 65 72 6d 29 0a 20 20 20 20 29  sr->nTerm).    )
17ce0 7b 0a 20 20 20 20 20 20 6e 4d 65 72 67 65 2b 2b  {.      nMerge++
17cf0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
17d00 65 72 74 28 20 69 73 49 67 6e 6f 72 65 45 6d 70  ert( isIgnoreEmp
17d10 74 79 20 7c 7c 20 28 69 73 52 65 71 75 69 72 65  ty || (isRequire
17d20 50 6f 73 20 26 26 20 21 69 73 43 6f 6c 46 69 6c  Pos && !isColFil
17d30 74 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ter) );.    if( 
17d40 6e 4d 65 72 67 65 3d 3d 31 20 0a 20 20 20 20 20  nMerge==1 .     
17d50 26 26 20 21 69 73 49 67 6e 6f 72 65 45 6d 70 74  && !isIgnoreEmpt
17d60 79 20 0a 20 20 20 20 20 26 26 20 21 69 73 46 69  y .     && !isFi
17d70 72 73 74 20 0a 20 20 20 20 20 26 26 20 28 70 2d  rst .     && (p-
17d80 3e 62 44 65 73 63 49 64 78 3d 3d 30 20 7c 7c 20  >bDescIdx==0 || 
17d90 66 74 73 33 53 65 67 52 65 61 64 65 72 49 73 50  fts3SegReaderIsP
17da0 65 6e 64 69 6e 67 28 61 70 53 65 67 6d 65 6e 74  ending(apSegment
17db0 5b 30 5d 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a  [0])==0).    ){.
17dc0 20 20 20 20 20 20 70 43 73 72 2d 3e 6e 44 6f 63        pCsr->nDoc
17dd0 6c 69 73 74 20 3d 20 61 70 53 65 67 6d 65 6e 74  list = apSegment
17de0 5b 30 5d 2d 3e 6e 44 6f 63 6c 69 73 74 3b 0a 20  [0]->nDoclist;. 
17df0 20 20 20 20 20 69 66 28 20 66 74 73 33 53 65 67       if( fts3Seg
17e00 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28  ReaderIsPending(
17e10 61 70 53 65 67 6d 65 6e 74 5b 30 5d 29 20 29 7b  apSegment[0]) ){
17e20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74  .        rc = ft
17e30 73 33 4d 73 72 42 75 66 66 65 72 44 61 74 61 28  s3MsrBufferData(
17e40 70 43 73 72 2c 20 61 70 53 65 67 6d 65 6e 74 5b  pCsr, apSegment[
17e50 30 5d 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 70 43  0]->aDoclist, pC
17e60 73 72 2d 3e 6e 44 6f 63 6c 69 73 74 29 3b 0a 20  sr->nDoclist);. 
17e70 20 20 20 20 20 20 20 70 43 73 72 2d 3e 61 44 6f         pCsr->aDo
17e80 63 6c 69 73 74 20 3d 20 70 43 73 72 2d 3e 61 42  clist = pCsr->aB
17e90 75 66 66 65 72 3b 0a 20 20 20 20 20 20 7d 65 6c  uffer;.      }el
17ea0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 73 72  se{.        pCsr
17eb0 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20 61 70 53  ->aDoclist = apS
17ec0 65 67 6d 65 6e 74 5b 30 5d 2d 3e 61 44 6f 63 6c  egment[0]->aDocl
17ed0 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ist;.      }.   
17ee0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17ef0 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c 49  E_OK ) rc = SQLI
17f00 54 45 5f 52 4f 57 3b 0a 20 20 20 20 7d 65 6c 73  TE_ROW;.    }els
17f10 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 44 6f  e{.      int nDo
17f20 63 6c 69 73 74 20 3d 20 30 3b 20 20 20 20 20 20  clist = 0;      
17f30 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
17f40 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20  doclist */.     
17f50 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
17f60 50 72 65 76 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Prev = 0;    /* 
17f70 50 72 65 76 69 6f 75 73 20 64 6f 63 69 64 20 73  Previous docid s
17f80 74 6f 72 65 64 20 69 6e 20 64 6f 63 6c 69 73 74  tored in doclist
17f90 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   */..      /* Th
17fa0 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 6f  e current term o
17fb0 66 20 74 68 65 20 66 69 72 73 74 20 6e 4d 65 72  f the first nMer
17fc0 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ge entries in th
17fd0 65 20 61 72 72 61 79 0a 20 20 20 20 20 20 2a 2a  e array.      **
17fe0 20 6f 66 20 46 74 73 33 53 65 67 52 65 61 64 65   of Fts3SegReade
17ff0 72 20 6f 62 6a 65 63 74 73 20 69 73 20 74 68 65  r objects is the
18000 20 73 61 6d 65 2e 20 54 68 65 20 64 6f 63 6c 69   same. The docli
18010 73 74 73 20 6d 75 73 74 20 62 65 20 6d 65 72 67  sts must be merg
18020 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ed.      ** and 
18030 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 72 65  a single term re
18040 74 75 72 6e 65 64 20 77 69 74 68 20 74 68 65 20  turned with the 
18050 6d 65 72 67 65 64 20 64 6f 63 6c 69 73 74 2e 0a  merged doclist..
18060 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66        */.      f
18070 6f 72 28 69 3d 30 3b 20 69 3c 6e 4d 65 72 67 65  or(i=0; i<nMerge
18080 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
18090 66 74 73 33 53 65 67 52 65 61 64 65 72 46 69 72  fts3SegReaderFir
180a0 73 74 44 6f 63 69 64 28 70 2c 20 61 70 53 65 67  stDocid(p, apSeg
180b0 6d 65 6e 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20  ment[i]);.      
180c0 7d 0a 20 20 20 20 20 20 66 74 73 33 53 65 67 52  }.      fts3SegR
180d0 65 61 64 65 72 53 6f 72 74 28 61 70 53 65 67 6d  eaderSort(apSegm
180e0 65 6e 74 2c 20 6e 4d 65 72 67 65 2c 20 6e 4d 65  ent, nMerge, nMe
180f0 72 67 65 2c 20 78 43 6d 70 29 3b 0a 20 20 20 20  rge, xCmp);.    
18100 20 20 77 68 69 6c 65 28 20 61 70 53 65 67 6d 65    while( apSegme
18110 6e 74 5b 30 5d 2d 3e 70 4f 66 66 73 65 74 4c 69  nt[0]->pOffsetLi
18120 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  st ){.        in
18130 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
18140 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18150 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 68  r of segments th
18160 61 74 20 73 68 61 72 65 20 61 20 64 6f 63 69 64  at share a docid
18170 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
18180 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20   *pList = 0;.   
18190 20 20 20 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d       int nList =
181a0 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
181b0 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 73  nByte;.        s
181c0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 6f  qlite3_int64 iDo
181d0 63 69 64 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b  cid = apSegment[
181e0 30 5d 2d 3e 69 44 6f 63 69 64 3b 0a 20 20 20 20  0]->iDocid;.    
181f0 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65      fts3SegReade
18200 72 4e 65 78 74 44 6f 63 69 64 28 70 2c 20 61 70  rNextDocid(p, ap
18210 53 65 67 6d 65 6e 74 5b 30 5d 2c 20 26 70 4c 69  Segment[0], &pLi
18220 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20  st, &nList);.   
18230 20 20 20 20 20 6a 20 3d 20 31 3b 0a 20 20 20 20       j = 1;.    
18240 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 6e 4d 65      while( j<nMe
18250 72 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  rge.            
18260 26 26 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2d  && apSegment[j]-
18270 3e 70 4f 66 66 73 65 74 4c 69 73 74 0a 20 20 20  >pOffsetList.   
18280 20 20 20 20 20 20 20 20 20 26 26 20 61 70 53 65           && apSe
18290 67 6d 65 6e 74 5b 6a 5d 2d 3e 69 44 6f 63 69 64  gment[j]->iDocid
182a0 3d 3d 69 44 6f 63 69 64 0a 20 20 20 20 20 20 20  ==iDocid.       
182b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74   ){.          ft
182c0 73 33 53 65 67 52 65 61 64 65 72 4e 65 78 74 44  s3SegReaderNextD
182d0 6f 63 69 64 28 70 2c 20 61 70 53 65 67 6d 65 6e  ocid(p, apSegmen
182e0 74 5b 6a 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20  t[j], 0, 0);.   
182f0 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
18300 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
18310 66 28 20 69 73 43 6f 6c 46 69 6c 74 65 72 20 29  f( isColFilter )
18320 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33  {.          fts3
18330 43 6f 6c 75 6d 6e 46 69 6c 74 65 72 28 70 46 69  ColumnFilter(pFi
18340 6c 74 65 72 2d 3e 69 43 6f 6c 2c 20 30 2c 20 26  lter->iCol, 0, &
18350 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a  pList, &nList);.
18360 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
18370 20 20 20 69 66 28 20 21 69 73 49 67 6e 6f 72 65     if( !isIgnore
18380 45 6d 70 74 79 20 7c 7c 20 6e 4c 69 73 74 3e 30  Empty || nList>0
18390 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f   ){..          /
183a0 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20  * Calculate the 
183b0 27 64 6f 63 69 64 27 20 64 65 6c 74 61 20 76 61  'docid' delta va
183c0 6c 75 65 20 74 6f 20 77 72 69 74 65 20 69 6e 74  lue to write int
183d0 6f 20 74 68 65 20 6d 65 72 67 65 64 20 0a 20 20  o the merged .  
183e0 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69          ** docli
183f0 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  st. */.         
18400 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
18410 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 20  Delta;.         
18420 20 69 66 28 20 70 2d 3e 62 44 65 73 63 49 64 78   if( p->bDescIdx
18430 20 26 26 20 6e 44 6f 63 6c 69 73 74 3e 30 20 29   && nDoclist>0 )
18440 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 44  {.            iD
18450 65 6c 74 61 20 3d 20 69 50 72 65 76 20 2d 20 69  elta = iPrev - i
18460 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20 20  Docid;.         
18470 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18480 20 20 20 20 69 44 65 6c 74 61 20 3d 20 69 44 6f      iDelta = iDo
18490 63 69 64 20 2d 20 69 50 72 65 76 3b 0a 20 20 20  cid - iPrev;.   
184a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
184b0 20 20 20 61 73 73 65 72 74 28 20 69 44 65 6c 74     assert( iDelt
184c0 61 3e 30 20 7c 7c 20 28 6e 44 6f 63 6c 69 73 74  a>0 || (nDoclist
184d0 3d 3d 30 20 26 26 20 69 44 65 6c 74 61 3d 3d 69  ==0 && iDelta==i
184e0 44 6f 63 69 64 29 20 29 3b 0a 20 20 20 20 20 20  Docid) );.      
184f0 20 20 20 20 61 73 73 65 72 74 28 20 6e 44 6f 63      assert( nDoc
18500 6c 69 73 74 3e 30 20 7c 7c 20 69 44 65 6c 74 61  list>0 || iDelta
18510 3d 3d 69 44 6f 63 69 64 20 29 3b 0a 0a 20 20 20  ==iDocid );..   
18520 20 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 73         nByte = s
18530 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e 74  qlite3Fts3Varint
18540 4c 65 6e 28 69 44 65 6c 74 61 29 20 2b 20 28 69  Len(iDelta) + (i
18550 73 52 65 71 75 69 72 65 50 6f 73 3f 6e 4c 69 73  sRequirePos?nLis
18560 74 2b 31 3a 30 29 3b 0a 20 20 20 20 20 20 20 20  t+1:0);.        
18570 20 20 69 66 28 20 6e 44 6f 63 6c 69 73 74 2b 6e    if( nDoclist+n
18580 42 79 74 65 3e 70 43 73 72 2d 3e 6e 42 75 66 66  Byte>pCsr->nBuff
18590 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  er ){.          
185a0 20 20 63 68 61 72 20 2a 61 4e 65 77 3b 0a 20 20    char *aNew;.  
185b0 20 20 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e            pCsr->
185c0 6e 42 75 66 66 65 72 20 3d 20 28 6e 44 6f 63 6c  nBuffer = (nDocl
185d0 69 73 74 2b 6e 42 79 74 65 29 2a 32 3b 0a 20 20  ist+nByte)*2;.  
185e0 20 20 20 20 20 20 20 20 20 20 61 4e 65 77 20 3d            aNew =
185f0 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
18600 28 70 43 73 72 2d 3e 61 42 75 66 66 65 72 2c 20  (pCsr->aBuffer, 
18610 70 43 73 72 2d 3e 6e 42 75 66 66 65 72 29 3b 0a  pCsr->nBuffer);.
18620 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
18630 21 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20  !aNew ){.       
18640 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
18650 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
18660 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18670 20 20 20 20 20 20 70 43 73 72 2d 3e 61 42 75 66        pCsr->aBuf
18680 66 65 72 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20  fer = aNew;.    
18690 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
186a0 20 20 20 69 66 28 20 69 73 46 69 72 73 74 20 29     if( isFirst )
186b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  {.            ch
186c0 61 72 20 2a 61 20 3d 20 26 70 43 73 72 2d 3e 61  ar *a = &pCsr->a
186d0 42 75 66 66 65 72 5b 6e 44 6f 63 6c 69 73 74 5d  Buffer[nDoclist]
186e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
186f0 74 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20  t nWrite;.      
18700 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
18710 20 20 6e 57 72 69 74 65 20 3d 20 73 71 6c 69 74    nWrite = sqlit
18720 65 33 46 74 73 33 46 69 72 73 74 46 69 6c 74 65  e3Fts3FirstFilte
18730 72 28 69 44 65 6c 74 61 2c 20 70 4c 69 73 74 2c  r(iDelta, pList,
18740 20 6e 4c 69 73 74 2c 20 61 29 3b 0a 20 20 20 20   nList, a);.    
18750 20 20 20 20 20 20 20 20 69 66 28 20 6e 57 72 69          if( nWri
18760 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  te ){.          
18770 20 20 20 20 69 50 72 65 76 20 3d 20 69 44 6f 63      iPrev = iDoc
18780 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  id;.            
18790 20 20 6e 44 6f 63 6c 69 73 74 20 2b 3d 20 6e 57    nDoclist += nW
187a0 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20  rite;.          
187b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
187c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
187d0 20 6e 44 6f 63 6c 69 73 74 20 2b 3d 20 73 71 6c   nDoclist += sql
187e0 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e  ite3Fts3PutVarin
187f0 74 28 26 70 43 73 72 2d 3e 61 42 75 66 66 65 72  t(&pCsr->aBuffer
18800 5b 6e 44 6f 63 6c 69 73 74 5d 2c 20 69 44 65 6c  [nDoclist], iDel
18810 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ta);.           
18820 20 69 50 72 65 76 20 3d 20 69 44 6f 63 69 64 3b   iPrev = iDocid;
18830 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
18840 20 69 73 52 65 71 75 69 72 65 50 6f 73 20 29 7b   isRequirePos ){
18850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  .              m
18860 65 6d 63 70 79 28 26 70 43 73 72 2d 3e 61 42 75  emcpy(&pCsr->aBu
18870 66 66 65 72 5b 6e 44 6f 63 6c 69 73 74 5d 2c 20  ffer[nDoclist], 
18880 70 4c 69 73 74 2c 20 6e 4c 69 73 74 29 3b 0a 20  pList, nList);. 
18890 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 44 6f               nDo
188a0 63 6c 69 73 74 20 2b 3d 20 6e 4c 69 73 74 3b 0a  clist += nList;.
188b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
188c0 73 72 2d 3e 61 42 75 66 66 65 72 5b 6e 44 6f 63  sr->aBuffer[nDoc
188d0 6c 69 73 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a  list++] = '\0';.
188e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
188f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18900 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 74 73    }..        fts
18910 33 53 65 67 52 65 61 64 65 72 53 6f 72 74 28 61  3SegReaderSort(a
18920 70 53 65 67 6d 65 6e 74 2c 20 6e 4d 65 72 67 65  pSegment, nMerge
18930 2c 20 6a 2c 20 78 43 6d 70 29 3b 0a 20 20 20 20  , j, xCmp);.    
18940 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 44    }.      if( nD
18950 6f 63 6c 69 73 74 3e 30 20 29 7b 0a 20 20 20 20  oclist>0 ){.    
18960 20 20 20 20 70 43 73 72 2d 3e 61 44 6f 63 6c 69      pCsr->aDocli
18970 73 74 20 3d 20 70 43 73 72 2d 3e 61 42 75 66 66  st = pCsr->aBuff
18980 65 72 3b 0a 20 20 20 20 20 20 20 20 70 43 73 72  er;.        pCsr
18990 2d 3e 6e 44 6f 63 6c 69 73 74 20 3d 20 6e 44 6f  ->nDoclist = nDo
189a0 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 72  clist;.        r
189b0 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a  c = SQLITE_ROW;.
189c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
189d0 20 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65    pCsr->nAdvance
189e0 20 3d 20 6e 4d 65 72 67 65 3b 0a 20 20 7d 77 68   = nMerge;.  }wh
189f0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
18a00 4f 4b 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  OK );..  return 
18a10 72 63 3b 0a 7d 0a 0a 0a 76 6f 69 64 20 73 71 6c  rc;.}...void sql
18a20 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
18a30 72 46 69 6e 69 73 68 28 0a 20 20 46 74 73 33 4d  rFinish(.  Fts3M
18a40 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70  ultiSegReader *p
18a50 43 73 72 20 20 20 20 20 20 20 2f 2a 20 43 75 72  Csr       /* Cur
18a60 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  sor object */.){
18a70 0a 20 20 69 66 28 20 70 43 73 72 20 29 7b 0a 20  .  if( pCsr ){. 
18a80 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
18a90 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e  r(i=0; i<pCsr->n
18aa0 53 65 67 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20  Segment; i++){. 
18ab0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33       sqlite3Fts3
18ac0 53 65 67 52 65 61 64 65 72 46 72 65 65 28 70 43  SegReaderFree(pC
18ad0 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69 5d  sr->apSegment[i]
18ae0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
18af0 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e  ite3_free(pCsr->
18b00 61 70 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20  apSegment);.    
18b10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73  sqlite3_free(pCs
18b20 72 2d 3e 61 42 75 66 66 65 72 29 3b 0a 0a 20 20  r->aBuffer);..  
18b30 20 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74    pCsr->nSegment
18b40 20 3d 20 30 3b 0a 20 20 20 20 70 43 73 72 2d 3e   = 0;.    pCsr->
18b50 61 70 53 65 67 6d 65 6e 74 20 3d 20 30 3b 0a 20  apSegment = 0;. 
18b60 20 20 20 70 43 73 72 2d 3e 61 42 75 66 66 65 72     pCsr->aBuffer
18b70 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
18b80 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 22 65  ** Decode the "e
18b90 6e 64 5f 62 6c 6f 63 6b 22 20 66 69 65 6c 64 2c  nd_block" field,
18ba0 20 73 65 6c 65 63 74 65 64 20 62 79 20 63 6f 6c   selected by col
18bb0 75 6d 6e 20 69 43 6f 6c 20 6f 66 20 74 68 65 20  umn iCol of the 
18bc0 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65  SELECT .** state
18bd0 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74  ment passed as t
18be0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
18bf0 74 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 65  t. .**.** The "e
18c00 6e 64 5f 62 6c 6f 63 6b 22 20 66 69 65 6c 64 20  nd_block" field 
18c10 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 69 74 68  may contain eith
18c20 65 72 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 6f  er an integer, o
18c30 72 20 61 20 74 65 78 74 20 66 69 65 6c 64 0a 2a  r a text field.*
18c40 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
18c50 20 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61   text representa
18c60 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6e 6f 6e 2d  tion of two non-
18c70 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72  negative integer
18c80 73 20 73 65 70 61 72 61 74 65 64 20 0a 2a 2a 20  s separated .** 
18c90 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  by one or more s
18ca0 70 61 63 65 20 28 30 78 32 30 29 20 63 68 61 72  pace (0x20) char
18cb0 61 63 74 65 72 73 2e 20 49 6e 20 74 68 65 20 66  acters. In the f
18cc0 69 72 73 74 20 63 61 73 65 2c 20 73 65 74 20 2a  irst case, set *
18cd0 70 69 45 6e 64 42 6c 6f 63 6b 20 0a 2a 2a 20 74  piEndBlock .** t
18ce0 6f 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  o the integer va
18cf0 6c 75 65 20 61 6e 64 20 2a 70 6e 42 79 74 65 20  lue and *pnByte 
18d00 74 6f 20 7a 65 72 6f 20 62 65 66 6f 72 65 20 72  to zero before r
18d10 65 74 75 72 6e 69 6e 67 2e 20 49 6e 20 74 68 65  eturning. In the
18d20 20 73 65 63 6f 6e 64 2c 20 0a 2a 2a 20 73 65 74   second, .** set
18d30 20 2a 70 69 45 6e 64 42 6c 6f 63 6b 20 74 6f 20   *piEndBlock to 
18d40 74 68 65 20 66 69 72 73 74 20 76 61 6c 75 65 20  the first value 
18d50 61 6e 64 20 2a 70 6e 42 79 74 65 20 74 6f 20 74  and *pnByte to t
18d60 68 65 20 73 65 63 6f 6e 64 2e 0a 2a 2f 0a 73 74  he second..*/.st
18d70 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 52 65  atic void fts3Re
18d80 61 64 45 6e 64 42 6c 6f 63 6b 46 69 65 6c 64 28  adEndBlockField(
18d90 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
18da0 2a 70 53 74 6d 74 2c 20 0a 20 20 69 6e 74 20 69  *pStmt, .  int i
18db0 43 6f 6c 2c 20 0a 20 20 69 36 34 20 2a 70 69 45  Col, .  i64 *piE
18dc0 6e 64 42 6c 6f 63 6b 2c 0a 20 20 69 36 34 20 2a  ndBlock,.  i64 *
18dd0 70 6e 42 79 74 65 0a 29 7b 0a 20 20 63 6f 6e 73  pnByte.){.  cons
18de0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
18df0 2a 7a 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33  *zText = sqlite3
18e00 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
18e10 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 69 66 28  mt, iCol);.  if(
18e20 20 7a 54 65 78 74 20 29 7b 0a 20 20 20 20 69 6e   zText ){.    in
18e30 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 69 4d 75  t i;.    int iMu
18e40 6c 20 3d 20 31 3b 0a 20 20 20 20 69 36 34 20 69  l = 1;.    i64 i
18e50 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  Val = 0;.    for
18e60 28 69 3d 30 3b 20 7a 54 65 78 74 5b 69 5d 3e 3d  (i=0; zText[i]>=
18e70 27 30 27 20 26 26 20 7a 54 65 78 74 5b 69 5d 3c  '0' && zText[i]<
18e80 3d 27 39 27 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ='9'; i++){.    
18e90 20 20 69 56 61 6c 20 3d 20 69 56 61 6c 2a 31 30    iVal = iVal*10
18ea0 20 2b 20 28 7a 54 65 78 74 5b 69 5d 20 2d 20 27   + (zText[i] - '
18eb0 30 27 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  0');.    }.    *
18ec0 70 69 45 6e 64 42 6c 6f 63 6b 20 3d 20 69 56 61  piEndBlock = iVa
18ed0 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 54  l;.    while( zT
18ee0 65 78 74 5b 69 5d 3d 3d 27 20 27 20 29 20 69 2b  ext[i]==' ' ) i+
18ef0 2b 3b 0a 20 20 20 20 69 56 61 6c 20 3d 20 30 3b  +;.    iVal = 0;
18f00 0a 20 20 20 20 69 66 28 20 7a 54 65 78 74 5b 69  .    if( zText[i
18f10 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]=='-' ){.      
18f20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 4d 75 6c 20  i++;.      iMul 
18f30 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
18f40 66 6f 72 28 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 3b  for(/* no-op */;
18f50 20 7a 54 65 78 74 5b 69 5d 3e 3d 27 30 27 20 26   zText[i]>='0' &
18f60 26 20 7a 54 65 78 74 5b 69 5d 3c 3d 27 39 27 3b  & zText[i]<='9';
18f70 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 56 61   i++){.      iVa
18f80 6c 20 3d 20 69 56 61 6c 2a 31 30 20 2b 20 28 7a  l = iVal*10 + (z
18f90 54 65 78 74 5b 69 5d 20 2d 20 27 30 27 29 3b 0a  Text[i] - '0');.
18fa0 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e 42 79 74      }.    *pnByt
18fb0 65 20 3d 20 28 69 56 61 6c 20 2a 20 28 69 36 34  e = (iVal * (i64
18fc0 29 69 4d 75 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  )iMul);.  }.}...
18fd0 2f 2a 0a 2a 2a 20 41 20 73 65 67 6d 65 6e 74 20  /*.** A segment 
18fe0 6f 66 20 73 69 7a 65 20 6e 42 79 74 65 20 62 79  of size nByte by
18ff0 74 65 73 20 68 61 73 20 6a 75 73 74 20 62 65 65  tes has just bee
19000 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 61 62 73  n written to abs
19010 6f 6c 75 74 65 20 6c 65 76 65 6c 0a 2a 2a 20 69  olute level.** i
19020 41 62 73 4c 65 76 65 6c 2e 20 50 72 6f 6d 6f 74  AbsLevel. Promot
19030 65 20 61 6e 79 20 73 65 67 6d 65 6e 74 73 20 74  e any segments t
19040 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 70 72  hat should be pr
19050 6f 6d 6f 74 65 64 20 61 73 20 61 20 72 65 73 75  omoted as a resu
19060 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  lt..*/.static in
19070 74 20 66 74 73 33 50 72 6f 6d 6f 74 65 53 65 67  t fts3PromoteSeg
19080 6d 65 6e 74 73 28 0a 20 20 46 74 73 33 54 61 62  ments(.  Fts3Tab
19090 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
190a0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20           /* FTS 
190b0 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
190c0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
190d0 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 20 20  iAbsLevel,      
190e0 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65    /* Absolute le
190f0 76 65 6c 20 6a 75 73 74 20 75 70 64 61 74 65 64  vel just updated
19100 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
19110 74 36 34 20 6e 42 79 74 65 20 20 20 20 20 20 20  t64 nByte       
19120 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
19130 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 61 74 20   new segment at 
19140 69 41 62 73 4c 65 76 65 6c 20 2a 2f 0a 29 7b 0a  iAbsLevel */.){.
19150 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
19160 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 5f  E_OK;.  sqlite3_
19170 73 74 6d 74 20 2a 70 52 61 6e 67 65 3b 0a 0a 20  stmt *pRange;.. 
19180 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
19190 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f  t(p, SQL_SELECT_
191a0 4c 45 56 45 4c 5f 52 41 4e 47 45 32 2c 20 26 70  LEVEL_RANGE2, &p
191b0 52 61 6e 67 65 2c 20 30 29 3b 0a 0a 20 20 69 66  Range, 0);..  if
191c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
191d0 29 7b 0a 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d  ){.    int bOk =
191e0 20 30 3b 0a 20 20 20 20 69 36 34 20 69 4c 61 73   0;.    i64 iLas
191f0 74 20 3d 20 28 69 41 62 73 4c 65 76 65 6c 2f 46  t = (iAbsLevel/F
19200 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45  TS3_SEGDIR_MAXLE
19210 56 45 4c 20 2b 20 31 29 20 2a 20 46 54 53 33 5f  VEL + 1) * FTS3_
19220 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 20  SEGDIR_MAXLEVEL 
19230 2d 20 31 3b 0a 20 20 20 20 69 36 34 20 6e 4c 69  - 1;.    i64 nLi
19240 6d 69 74 20 3d 20 28 6e 42 79 74 65 2a 33 29 2f  mit = (nByte*3)/
19250 32 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20  2;..    /* Loop 
19260 74 68 72 6f 75 67 68 20 61 6c 6c 20 65 6e 74 72  through all entr
19270 69 65 73 20 69 6e 20 74 68 65 20 25 5f 73 65 67  ies in the %_seg
19280 64 69 72 20 74 61 62 6c 65 20 63 6f 72 72 65 73  dir table corres
19290 70 6f 6e 64 69 6e 67 20 74 6f 20 0a 20 20 20 20  ponding to .    
192a0 2a 2a 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74  ** segments in t
192b0 68 69 73 20 69 6e 64 65 78 20 6f 6e 20 6c 65 76  his index on lev
192c0 65 6c 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  els greater than
192d0 20 69 41 62 73 4c 65 76 65 6c 2e 20 49 66 20 74   iAbsLevel. If t
192e0 68 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 61  here is.    ** a
192f0 74 20 6c 65 61 73 74 20 6f 6e 65 20 73 75 63 68  t least one such
19300 20 73 65 67 6d 65 6e 74 2c 20 61 6e 64 20 69 74   segment, and it
19310 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
19320 64 65 74 65 72 6d 69 6e 65 20 74 68 61 74 20 61  determine that a
19330 6c 6c 20 0a 20 20 20 20 2a 2a 20 73 75 63 68 20  ll .    ** such 
19340 73 65 67 6d 65 6e 74 73 20 61 72 65 20 73 6d 61  segments are sma
19350 6c 6c 65 72 20 74 68 61 6e 20 6e 4c 69 6d 69 74  ller than nLimit
19360 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
19370 74 68 65 79 20 77 69 6c 6c 20 62 65 20 0a 20 20  they will be .  
19380 20 20 2a 2a 20 70 72 6f 6d 6f 74 65 64 20 74 6f    ** promoted to
19390 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c   level iAbsLevel
193a0 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  .  */.    sqlite
193b0 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 52 61  3_bind_int64(pRa
193c0 6e 67 65 2c 20 31 2c 20 69 41 62 73 4c 65 76 65  nge, 1, iAbsLeve
193d0 6c 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l+1);.    sqlite
193e0 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 52 61  3_bind_int64(pRa
193f0 6e 67 65 2c 20 32 2c 20 69 4c 61 73 74 29 3b 0a  nge, 2, iLast);.
19400 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54      while( SQLIT
19410 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
19420 74 65 70 28 70 52 61 6e 67 65 29 20 29 7b 0a 20  tep(pRange) ){. 
19430 20 20 20 20 20 69 36 34 20 6e 53 69 7a 65 20 3d       i64 nSize =
19440 20 30 2c 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20   0, dummy;.     
19450 20 66 74 73 33 52 65 61 64 45 6e 64 42 6c 6f 63   fts3ReadEndBloc
19460 6b 46 69 65 6c 64 28 70 52 61 6e 67 65 2c 20 32  kField(pRange, 2
19470 2c 20 26 64 75 6d 6d 79 2c 20 26 6e 53 69 7a 65  , &dummy, &nSize
19480 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 53 69  );.      if( nSi
19490 7a 65 3c 3d 30 20 7c 7c 20 6e 53 69 7a 65 3e 6e  ze<=0 || nSize>n
194a0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
194b0 20 2f 2a 20 49 66 20 6e 53 69 7a 65 3d 3d 30 2c   /* If nSize==0,
194c0 20 74 68 65 6e 20 74 68 65 20 25 5f 73 65 67 64   then the %_segd
194d0 69 72 2e 65 6e 64 5f 62 6c 6f 63 6b 20 66 69 65  ir.end_block fie
194e0 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6e 6f 74 20  ld does not not 
194f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
19500 61 69 6e 20 61 20 73 69 7a 65 20 76 61 6c 75 65  ain a size value
19510 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  . This happens i
19520 66 20 69 74 20 77 61 73 20 77 72 69 74 74 65 6e  f it was written
19530 20 62 79 20 61 6e 0a 20 20 20 20 20 20 20 20 2a   by an.        *
19540 2a 20 6f 6c 64 20 76 65 72 73 69 6f 6e 20 6f 66  * old version of
19550 20 46 54 53 2e 20 49 6e 20 74 68 69 73 20 63 61   FTS. In this ca
19560 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  se it is not pos
19570 73 69 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69  sible to determi
19580 6e 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ne.        ** th
19590 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73 65  e size of the se
195a0 67 6d 65 6e 74 2c 20 61 6e 64 20 73 6f 20 73 65  gment, and so se
195b0 67 6d 65 6e 74 20 70 72 6f 6d 6f 74 69 6f 6e 20  gment promotion 
195c0 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 20  does not.       
195d0 20 2a 2a 20 74 61 6b 65 20 70 6c 61 63 65 2e 20   ** take place. 
195e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f 6b 20   */.        bOk 
195f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 0;.        bre
19600 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
19610 20 20 62 4f 6b 20 3d 20 31 3b 0a 20 20 20 20 7d    bOk = 1;.    }
19620 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
19630 33 5f 72 65 73 65 74 28 70 52 61 6e 67 65 29 3b  3_reset(pRange);
19640 0a 0a 20 20 20 20 69 66 28 20 62 4f 6b 20 29 7b  ..    if( bOk ){
19650 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20  .      int iIdx 
19660 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
19670 65 33 5f 73 74 6d 74 20 2a 70 55 70 64 61 74 65  e3_stmt *pUpdate
19680 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  1 = 0;.      sql
19690 69 74 65 33 5f 73 74 6d 74 20 2a 70 55 70 64 61  ite3_stmt *pUpda
196a0 74 65 32 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  te2 = 0;..      
196b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
196c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
196d0 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
196e0 20 53 51 4c 5f 55 50 44 41 54 45 5f 4c 45 56 45   SQL_UPDATE_LEVE
196f0 4c 5f 49 44 58 2c 20 26 70 55 70 64 61 74 65 31  L_IDX, &pUpdate1
19700 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
19710 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19720 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19730 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
19740 74 28 70 2c 20 53 51 4c 5f 55 50 44 41 54 45 5f  t(p, SQL_UPDATE_
19750 4c 45 56 45 4c 2c 20 26 70 55 70 64 61 74 65 32  LEVEL, &pUpdate2
19760 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 0);.      }.. 
19770 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
19780 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 20  ITE_OK ){..     
19790 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
197a0 67 68 20 61 6c 6c 20 25 5f 73 65 67 64 69 72 20  gh all %_segdir 
197b0 65 6e 74 72 69 65 73 20 66 6f 72 20 73 65 67 6d  entries for segm
197c0 65 6e 74 73 20 69 6e 20 74 68 69 73 20 69 6e 64  ents in this ind
197d0 65 78 20 77 69 74 68 0a 20 20 20 20 20 20 20 20  ex with.        
197e0 2a 2a 20 6c 65 76 65 6c 73 20 65 71 75 61 6c 20  ** levels equal 
197f0 74 6f 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  to or greater th
19800 61 6e 20 69 41 62 73 4c 65 76 65 6c 2e 20 41 73  an iAbsLevel. As
19810 20 65 61 63 68 20 65 6e 74 72 79 20 69 73 20 76   each entry is v
19820 69 73 69 74 65 64 2c 0a 20 20 20 20 20 20 20 20  isited,.        
19830 2a 2a 20 75 70 64 61 74 65 64 20 69 74 20 74 6f  ** updated it to
19840 20 73 65 74 20 28 6c 65 76 65 6c 20 3d 20 2d 31   set (level = -1
19850 29 20 61 6e 64 20 28 69 64 78 20 3d 20 4e 29 2c  ) and (idx = N),
19860 20 77 68 65 72 65 20 4e 20 69 73 20 30 20 66 6f   where N is 0 fo
19870 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  r the.        **
19880 20 6f 6c 64 65 73 74 20 73 65 67 6d 65 6e 74 20   oldest segment 
19890 69 6e 20 74 68 65 20 72 61 6e 67 65 2c 20 31 20  in the range, 1 
198a0 66 6f 72 20 74 68 65 20 6e 65 78 74 20 6f 6c 64  for the next old
198b0 65 73 74 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 0a  est, and so on..
198c0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
198d0 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77     ** In other w
198e0 6f 72 64 73 2c 20 6d 6f 76 65 20 61 6c 6c 20 73  ords, move all s
198f0 65 67 6d 65 6e 74 73 20 62 65 69 6e 67 20 70 72  egments being pr
19900 6f 6d 6f 74 65 64 20 74 6f 20 6c 65 76 65 6c 20  omoted to level 
19910 2d 31 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  -1,.        ** s
19920 65 74 74 69 6e 67 20 74 68 65 20 22 69 64 78 22  etting the "idx"
19930 20 66 69 65 6c 64 73 20 61 73 20 61 70 70 72 6f   fields as appro
19940 70 72 69 61 74 65 20 74 6f 20 6b 65 65 70 20 74  priate to keep t
19950 68 65 6d 20 69 6e 20 74 68 65 20 73 61 6d 65 0a  hem in the same.
19960 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72          ** order
19970 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  . The contents o
19980 66 20 6c 65 76 65 6c 20 2d 31 20 28 77 68 69 63  f level -1 (whic
19990 68 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2c  h is never used,
199a0 20 65 78 63 65 70 74 0a 20 20 20 20 20 20 20 20   except.        
199b0 2a 2a 20 74 72 61 6e 73 69 65 6e 74 6c 79 20 68  ** transiently h
199c0 65 72 65 29 2c 20 77 69 6c 6c 20 62 65 20 6d 6f  ere), will be mo
199d0 76 65 64 20 62 61 63 6b 20 74 6f 20 6c 65 76 65  ved back to leve
199e0 6c 20 69 41 62 73 4c 65 76 65 6c 20 62 65 6c 6f  l iAbsLevel belo
199f0 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  w.  */.        s
19a00 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
19a10 34 28 70 52 61 6e 67 65 2c 20 31 2c 20 69 41 62  4(pRange, 1, iAb
19a20 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 20  sLevel);.       
19a30 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52   while( SQLITE_R
19a40 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
19a50 28 70 52 61 6e 67 65 29 20 29 7b 0a 20 20 20 20  (pRange) ){.    
19a60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
19a70 6e 64 5f 69 6e 74 28 70 55 70 64 61 74 65 31 2c  nd_int(pUpdate1,
19a80 20 31 2c 20 69 49 64 78 2b 2b 29 3b 0a 20 20 20   1, iIdx++);.   
19a90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
19aa0 69 6e 64 5f 69 6e 74 28 70 55 70 64 61 74 65 31  ind_int(pUpdate1
19ab0 2c 20 32 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  , 2, sqlite3_col
19ac0 75 6d 6e 5f 69 6e 74 28 70 52 61 6e 67 65 2c 20  umn_int(pRange, 
19ad0 30 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  0));.          s
19ae0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
19af0 70 55 70 64 61 74 65 31 2c 20 33 2c 20 73 71 6c  pUpdate1, 3, sql
19b00 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
19b10 70 52 61 6e 67 65 2c 20 31 29 29 3b 0a 20 20 20  pRange, 1));.   
19b20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
19b30 74 65 70 28 70 55 70 64 61 74 65 31 29 3b 0a 20  tep(pUpdate1);. 
19b40 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
19b50 6c 69 74 65 33 5f 72 65 73 65 74 28 70 55 70 64  lite3_reset(pUpd
19b60 61 74 65 31 29 3b 0a 20 20 20 20 20 20 20 20 20  ate1);.         
19b70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19b80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
19b90 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28    sqlite3_reset(
19ba0 70 52 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 20  pRange);.       
19bb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19bc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
19bd0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
19be0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19bf0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
19c00 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
19c10 70 52 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d  pRange);.      }
19c20 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20  ..      /* Move 
19c30 6c 65 76 65 6c 20 2d 31 20 74 6f 20 6c 65 76 65  level -1 to leve
19c40 6c 20 69 41 62 73 4c 65 76 65 6c 20 2a 2f 0a 20  l iAbsLevel */. 
19c50 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
19c60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19c70 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
19c80 6e 74 36 34 28 70 55 70 64 61 74 65 32 2c 20 31  nt64(pUpdate2, 1
19c90 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20  , iAbsLevel);.  
19ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
19cb0 65 70 28 70 55 70 64 61 74 65 32 29 3b 0a 20 20  ep(pUpdate2);.  
19cc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19cd0 65 33 5f 72 65 73 65 74 28 70 55 70 64 61 74 65  e3_reset(pUpdate
19ce0 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
19cf0 7d 0a 20 20 7d 0a 0a 0a 20 20 72 65 74 75 72 6e  }.  }...  return
19d00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65   rc;.}../*.** Me
19d10 72 67 65 20 61 6c 6c 20 6c 65 76 65 6c 20 69 4c  rge all level iL
19d20 65 76 65 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e  evel segments in
19d30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
19d40 74 6f 20 61 20 73 69 6e 67 6c 65 20 0a 2a 2a 20  to a single .** 
19d50 69 4c 65 76 65 6c 2b 31 20 73 65 67 6d 65 6e 74  iLevel+1 segment
19d60 2e 20 4f 72 2c 20 69 66 20 69 4c 65 76 65 6c 3c  . Or, if iLevel<
19d70 30 2c 20 6d 65 72 67 65 20 61 6c 6c 20 73 65 67  0, merge all seg
19d80 6d 65 6e 74 73 20 69 6e 74 6f 20 61 0a 2a 2a 20  ments into a.** 
19d90 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 20 77  single segment w
19da0 69 74 68 20 61 20 6c 65 76 65 6c 20 65 71 75 61  ith a level equa
19db0 6c 20 74 6f 20 74 68 65 20 6e 75 6d 65 72 69 63  l to the numeric
19dc0 61 6c 6c 79 20 6c 61 72 67 65 73 74 20 6c 65 76  ally largest lev
19dd0 65 6c 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  el .** currently
19de0 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
19df0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
19e00 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  If this function
19e10 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
19e20 69 4c 65 76 65 6c 3c 30 2c 20 62 75 74 20 74 68  iLevel<0, but th
19e30 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 0a  ere is only one.
19e40 2a 2a 20 73 65 67 6d 65 6e 74 20 69 6e 20 74 68  ** segment in th
19e50 65 20 64 61 74 61 62 61 73 65 2c 20 53 51 4c 49  e database, SQLI
19e60 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
19e70 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ned immediately.
19e80 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
19e90 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  if successful, S
19ea0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
19eb0 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  rned. If an erro
19ec0 72 20 6f 63 63 75 72 73 2c 20 0a 2a 2a 20 61 6e  r occurs, .** an
19ed0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
19ee0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
19ef0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
19f00 73 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 0a  s3SegmentMerge(.
19f10 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
19f20 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20  .  int iLangid, 
19f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f40 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69     /* Language i
19f50 64 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20  d to merge */.  
19f60 69 6e 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20  int iIndex,     
19f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f80 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 61  /* Index in p->a
19f90 49 6e 64 65 78 5b 5d 20 74 6f 20 6d 65 72 67 65  Index[] to merge
19fa0 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c   */.  int iLevel
19fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fc0 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74        /* Level t
19fd0 6f 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20  o merge */.){.  
19fe0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
19ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a000 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1a010 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30  /.  int iIdx = 0
1a020 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a030 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1a040 6e 65 77 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  new segment */. 
1a050 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1a060 4e 65 77 4c 65 76 65 6c 20 3d 20 30 3b 20 20 20  NewLevel = 0;   
1a070 20 2f 2a 20 4c 65 76 65 6c 2f 69 6e 64 65 78 20   /* Level/index 
1a080 74 6f 20 63 72 65 61 74 65 20 6e 65 77 20 73 65  to create new se
1a090 67 6d 65 6e 74 20 61 74 20 2a 2f 0a 20 20 53 65  gment at */.  Se
1a0a0 67 6d 65 6e 74 57 72 69 74 65 72 20 2a 70 57 72  gmentWriter *pWr
1a0b0 69 74 65 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a  iter = 0;     /*
1a0c0 20 55 73 65 64 20 74 6f 20 77 72 69 74 65 20 74   Used to write t
1a0d0 68 65 20 6e 65 77 2c 20 6d 65 72 67 65 64 2c 20  he new, merged, 
1a0e0 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73  segment */.  Fts
1a0f0 33 53 65 67 46 69 6c 74 65 72 20 66 69 6c 74 65  3SegFilter filte
1a100 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
1a110 53 65 67 6d 65 6e 74 20 74 65 72 6d 20 66 69 6c  Segment term fil
1a120 74 65 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f  ter condition */
1a130 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52  .  Fts3MultiSegR
1a140 65 61 64 65 72 20 63 73 72 3b 20 20 20 20 20 20  eader csr;      
1a150 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
1a160 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
1a170 6c 65 76 65 6c 28 73 29 20 2a 2f 0a 20 20 69 6e  level(s) */.  in
1a180 74 20 62 49 67 6e 6f 72 65 45 6d 70 74 79 20 3d  t bIgnoreEmpty =
1a190 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1a1a0 20 54 72 75 65 20 74 6f 20 69 67 6e 6f 72 65 20   True to ignore 
1a1b0 65 6d 70 74 79 20 73 65 67 6d 65 6e 74 73 20 2a  empty segments *
1a1c0 2f 0a 20 20 69 36 34 20 69 4d 61 78 4c 65 76 65  /.  i64 iMaxLeve
1a1d0 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
1a1e0 20 20 20 20 2f 2a 20 4d 61 78 20 6c 65 76 65 6c      /* Max level
1a1f0 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73   number for this
1a200 20 69 6e 64 65 78 2f 6c 61 6e 67 69 64 20 2a 2f   index/langid */
1a210 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 76  ..  assert( iLev
1a220 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53  el==FTS3_SEGCURS
1a230 4f 52 5f 41 4c 4c 0a 20 20 20 20 20 20 20 7c 7c  OR_ALL.       ||
1a240 20 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45   iLevel==FTS3_SE
1a250 47 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 0a  GCURSOR_PENDING.
1a260 20 20 20 20 20 20 20 7c 7c 20 69 4c 65 76 65 6c         || iLevel
1a270 3e 3d 30 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  >=0.  );.  asser
1a280 74 28 20 69 4c 65 76 65 6c 3c 46 54 53 33 5f 53  t( iLevel<FTS3_S
1a290 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 20 29  EGDIR_MAXLEVEL )
1a2a0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 49 6e 64  ;.  assert( iInd
1a2b0 65 78 3e 3d 30 20 26 26 20 69 49 6e 64 65 78 3c  ex>=0 && iIndex<
1a2c0 70 2d 3e 6e 49 6e 64 65 78 20 29 3b 0a 0a 20 20  p->nIndex );..  
1a2d0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
1a2e0 53 65 67 52 65 61 64 65 72 43 75 72 73 6f 72 28  SegReaderCursor(
1a2f0 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64  p, iLangid, iInd
1a300 65 78 2c 20 69 4c 65 76 65 6c 2c 20 30 2c 20 30  ex, iLevel, 0, 0
1a310 2c 20 31 2c 20 30 2c 20 26 63 73 72 29 3b 0a 20  , 1, 0, &csr);. 
1a320 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a330 4f 4b 20 7c 7c 20 63 73 72 2e 6e 53 65 67 6d 65  OK || csr.nSegme
1a340 6e 74 3d 3d 30 20 29 20 67 6f 74 6f 20 66 69 6e  nt==0 ) goto fin
1a350 69 73 68 65 64 3b 0a 0a 20 20 69 66 28 20 69 4c  ished;..  if( iL
1a360 65 76 65 6c 21 3d 46 54 53 33 5f 53 45 47 43 55  evel!=FTS3_SEGCU
1a370 52 53 4f 52 5f 50 45 4e 44 49 4e 47 20 29 7b 0a  RSOR_PENDING ){.
1a380 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67      rc = fts3Seg
1a390 6d 65 6e 74 4d 61 78 4c 65 76 65 6c 28 70 2c 20  mentMaxLevel(p, 
1a3a0 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c  iLangid, iIndex,
1a3b0 20 26 69 4d 61 78 4c 65 76 65 6c 29 3b 0a 20 20   &iMaxLevel);.  
1a3c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a3d0 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69 73  _OK ) goto finis
1a3e0 68 65 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  hed;.  }..  if( 
1a3f0 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47  iLevel==FTS3_SEG
1a400 43 55 52 53 4f 52 5f 41 4c 4c 20 29 7b 0a 20 20  CURSOR_ALL ){.  
1a410 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 69    /* This call i
1a420 73 20 74 6f 20 6d 65 72 67 65 20 61 6c 6c 20 73  s to merge all s
1a430 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 64  egments in the d
1a440 61 74 61 62 61 73 65 20 74 6f 20 61 20 73 69 6e  atabase to a sin
1a450 67 6c 65 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65  gle.    ** segme
1a460 6e 74 2e 20 54 68 65 20 6c 65 76 65 6c 20 6f 66  nt. The level of
1a470 20 74 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74   the new segment
1a480 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65   is equal to the
1a490 20 6e 75 6d 65 72 69 63 61 6c 6c 79 0a 20 20 20   numerically.   
1a4a0 20 2a 2a 20 67 72 65 61 74 65 73 74 20 73 65 67   ** greatest seg
1a4b0 6d 65 6e 74 20 6c 65 76 65 6c 20 63 75 72 72 65  ment level curre
1a4c0 6e 74 6c 79 20 70 72 65 73 65 6e 74 20 69 6e 20  ntly present in 
1a4d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72  the database for
1a4e0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 6e 64   this.    ** ind
1a4f0 65 78 2e 20 54 68 65 20 69 64 78 20 6f 66 20 74  ex. The idx of t
1a500 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 69  he new segment i
1a510 73 20 61 6c 77 61 79 73 20 30 2e 20 20 2a 2f 0a  s always 0.  */.
1a520 20 20 20 20 69 66 28 20 63 73 72 2e 6e 53 65 67      if( csr.nSeg
1a530 6d 65 6e 74 3d 3d 31 20 26 26 20 30 3d 3d 66 74  ment==1 && 0==ft
1a540 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65 6e  s3SegReaderIsPen
1a550 64 69 6e 67 28 63 73 72 2e 61 70 53 65 67 6d 65  ding(csr.apSegme
1a560 6e 74 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  nt[0]) ){.      
1a570 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1a580 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e  ;.      goto fin
1a590 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ished;.    }.   
1a5a0 20 69 4e 65 77 4c 65 76 65 6c 20 3d 20 69 4d 61   iNewLevel = iMa
1a5b0 78 4c 65 76 65 6c 3b 0a 20 20 20 20 62 49 67 6e  xLevel;.    bIgn
1a5c0 6f 72 65 45 6d 70 74 79 20 3d 20 31 3b 0a 0a 20  oreEmpty = 1;.. 
1a5d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
1a5e0 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 6d  his call is to m
1a5f0 65 72 67 65 20 61 6c 6c 20 73 65 67 6d 65 6e 74  erge all segment
1a600 73 20 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65  s at level iLeve
1a610 6c 2e 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74  l. find the next
1a620 0a 20 20 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  .    ** availabl
1a630 65 20 73 65 67 6d 65 6e 74 20 69 6e 64 65 78 20  e segment index 
1a640 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2b  at level iLevel+
1a650 31 2e 20 54 68 65 20 63 61 6c 6c 20 74 6f 0a 20  1. The call to. 
1a660 20 20 20 2a 2a 20 66 74 73 33 41 6c 6c 6f 63 61     ** fts3Alloca
1a670 74 65 53 65 67 64 69 72 49 64 78 28 29 20 77 69  teSegdirIdx() wi
1a680 6c 6c 20 6d 65 72 67 65 20 74 68 65 20 73 65 67  ll merge the seg
1a690 6d 65 6e 74 73 20 61 74 20 6c 65 76 65 6c 20 69  ments at level i
1a6a0 4c 65 76 65 6c 2b 31 20 74 6f 20 0a 20 20 20 20  Level+1 to .    
1a6b0 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 4c 65 76  ** a single iLev
1a6c0 65 6c 2b 32 20 73 65 67 6d 65 6e 74 20 69 66 20  el+2 segment if 
1a6d0 6e 65 63 65 73 73 61 72 79 2e 20 20 2a 2f 0a 20  necessary.  */. 
1a6e0 20 20 20 61 73 73 65 72 74 28 20 46 54 53 33 5f     assert( FTS3_
1a6f0 53 45 47 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e  SEGCURSOR_PENDIN
1a700 47 3d 3d 2d 31 20 29 3b 0a 20 20 20 20 69 4e 65  G==-1 );.    iNe
1a710 77 4c 65 76 65 6c 20 3d 20 67 65 74 41 62 73 6f  wLevel = getAbso
1a720 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61  luteLevel(p, iLa
1a730 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c  ngid, iIndex, iL
1a740 65 76 65 6c 2b 31 29 3b 0a 20 20 20 20 72 63 20  evel+1);.    rc 
1a750 3d 20 66 74 73 33 41 6c 6c 6f 63 61 74 65 53 65  = fts3AllocateSe
1a760 67 64 69 72 49 64 78 28 70 2c 20 69 4c 61 6e 67  gdirIdx(p, iLang
1a770 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65 76  id, iIndex, iLev
1a780 65 6c 2b 31 2c 20 26 69 49 64 78 29 3b 0a 20 20  el+1, &iIdx);.  
1a790 20 20 62 49 67 6e 6f 72 65 45 6d 70 74 79 20 3d    bIgnoreEmpty =
1a7a0 20 28 69 4c 65 76 65 6c 21 3d 46 54 53 33 5f 53   (iLevel!=FTS3_S
1a7b0 45 47 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47  EGCURSOR_PENDING
1a7c0 29 20 26 26 20 28 69 4e 65 77 4c 65 76 65 6c 3e  ) && (iNewLevel>
1a7d0 69 4d 61 78 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a  iMaxLevel);.  }.
1a7e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a7f0 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69 73  _OK ) goto finis
1a800 68 65 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  hed;..  assert( 
1a810 63 73 72 2e 6e 53 65 67 6d 65 6e 74 3e 30 20 29  csr.nSegment>0 )
1a820 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4e 65 77  ;.  assert( iNew
1a830 4c 65 76 65 6c 3e 3d 67 65 74 41 62 73 6f 6c 75  Level>=getAbsolu
1a840 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67  teLevel(p, iLang
1a850 69 64 2c 20 69 49 6e 64 65 78 2c 20 30 29 20 29  id, iIndex, 0) )
1a860 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4e 65 77  ;.  assert( iNew
1a870 4c 65 76 65 6c 3c 67 65 74 41 62 73 6f 6c 75 74  Level<getAbsolut
1a880 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69  eLevel(p, iLangi
1a890 64 2c 20 69 49 6e 64 65 78 2c 46 54 53 33 5f 53  d, iIndex,FTS3_S
1a8a0 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 29 20  EGDIR_MAXLEVEL) 
1a8b0 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69  );..  memset(&fi
1a8c0 6c 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  lter, 0, sizeof(
1a8d0 46 74 73 33 53 65 67 46 69 6c 74 65 72 29 29 3b  Fts3SegFilter));
1a8e0 0a 20 20 66 69 6c 74 65 72 2e 66 6c 61 67 73 20  .  filter.flags 
1a8f0 3d 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 52  = FTS3_SEGMENT_R
1a900 45 51 55 49 52 45 5f 50 4f 53 3b 0a 20 20 66 69  EQUIRE_POS;.  fi
1a910 6c 74 65 72 2e 66 6c 61 67 73 20 7c 3d 20 28 62  lter.flags |= (b
1a920 49 67 6e 6f 72 65 45 6d 70 74 79 20 3f 20 46 54  IgnoreEmpty ? FT
1a930 53 33 5f 53 45 47 4d 45 4e 54 5f 49 47 4e 4f 52  S3_SEGMENT_IGNOR
1a940 45 5f 45 4d 50 54 59 20 3a 20 30 29 3b 0a 0a 20  E_EMPTY : 0);.. 
1a950 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
1a960 33 53 65 67 52 65 61 64 65 72 53 74 61 72 74 28  3SegReaderStart(
1a970 70 2c 20 26 63 73 72 2c 20 26 66 69 6c 74 65 72  p, &csr, &filter
1a980 29 3b 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49  );.  while( SQLI
1a990 54 45 5f 4f 4b 3d 3d 72 63 20 29 7b 0a 20 20 20  TE_OK==rc ){.   
1a9a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
1a9b0 33 53 65 67 52 65 61 64 65 72 53 74 65 70 28 70  3SegReaderStep(p
1a9c0 2c 20 26 63 73 72 29 3b 0a 20 20 20 20 69 66 28  , &csr);.    if(
1a9d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20   rc!=SQLITE_ROW 
1a9e0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 72 63 20  ) break;.    rc 
1a9f0 3d 20 66 74 73 33 53 65 67 57 72 69 74 65 72 41  = fts3SegWriterA
1aa00 64 64 28 70 2c 20 26 70 57 72 69 74 65 72 2c 20  dd(p, &pWriter, 
1aa10 31 2c 20 0a 20 20 20 20 20 20 20 20 63 73 72 2e  1, .        csr.
1aa20 7a 54 65 72 6d 2c 20 63 73 72 2e 6e 54 65 72 6d  zTerm, csr.nTerm
1aa30 2c 20 63 73 72 2e 61 44 6f 63 6c 69 73 74 2c 20  , csr.aDoclist, 
1aa40 63 73 72 2e 6e 44 6f 63 6c 69 73 74 29 3b 0a 20  csr.nDoclist);. 
1aa50 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
1aa60 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69  ITE_OK ) goto fi
1aa70 6e 69 73 68 65 64 3b 0a 20 20 61 73 73 65 72 74  nished;.  assert
1aa80 28 20 70 57 72 69 74 65 72 20 7c 7c 20 62 49 67  ( pWriter || bIg
1aa90 6e 6f 72 65 45 6d 70 74 79 20 29 3b 0a 0a 20 20  noreEmpty );..  
1aaa0 69 66 28 20 69 4c 65 76 65 6c 21 3d 46 54 53 33  if( iLevel!=FTS3
1aab0 5f 53 45 47 43 55 52 53 4f 52 5f 50 45 4e 44 49  _SEGCURSOR_PENDI
1aac0 4e 47 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  NG ){.    rc = f
1aad0 74 73 33 44 65 6c 65 74 65 53 65 67 64 69 72 28  ts3DeleteSegdir(
1aae0 0a 20 20 20 20 20 20 20 20 70 2c 20 69 4c 61 6e  .        p, iLan
1aaf0 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65  gid, iIndex, iLe
1ab00 76 65 6c 2c 20 63 73 72 2e 61 70 53 65 67 6d 65  vel, csr.apSegme
1ab10 6e 74 2c 20 63 73 72 2e 6e 53 65 67 6d 65 6e 74  nt, csr.nSegment
1ab20 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
1ab30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1ab40 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20  goto finished;. 
1ab50 20 7d 0a 20 20 69 66 28 20 70 57 72 69 74 65 72   }.  if( pWriter
1ab60 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
1ab70 33 53 65 67 57 72 69 74 65 72 46 6c 75 73 68 28  3SegWriterFlush(
1ab80 70 2c 20 70 57 72 69 74 65 72 2c 20 69 4e 65 77  p, pWriter, iNew
1ab90 4c 65 76 65 6c 2c 20 69 49 64 78 29 3b 0a 20 20  Level, iIdx);.  
1aba0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1abb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
1abc0 20 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45   iLevel==FTS3_SE
1abd0 47 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 20  GCURSOR_PENDING 
1abe0 7c 7c 20 69 4e 65 77 4c 65 76 65 6c 3c 69 4d 61  || iNewLevel<iMa
1abf0 78 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20 20 20  xLevel ){.      
1ac00 20 20 72 63 20 3d 20 66 74 73 33 50 72 6f 6d 6f    rc = fts3Promo
1ac10 74 65 53 65 67 6d 65 6e 74 73 28 70 2c 20 69 4e  teSegments(p, iN
1ac20 65 77 4c 65 76 65 6c 2c 20 70 57 72 69 74 65 72  ewLevel, pWriter
1ac30 2d 3e 6e 4c 65 61 66 44 61 74 61 29 3b 0a 20 20  ->nLeafData);.  
1ac40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1ac50 0a 20 66 69 6e 69 73 68 65 64 3a 0a 20 20 66 74  . finished:.  ft
1ac60 73 33 53 65 67 57 72 69 74 65 72 46 72 65 65 28  s3SegWriterFree(
1ac70 70 57 72 69 74 65 72 29 3b 0a 20 20 73 71 6c 69  pWriter);.  sqli
1ac80 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72  te3Fts3SegReader
1ac90 46 69 6e 69 73 68 28 26 63 73 72 29 3b 0a 20 20  Finish(&csr);.  
1aca0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1acb0 2a 20 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65 20  * .** Flush the 
1acc0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 65 6e 64  contents of pend
1acd0 69 6e 67 54 65 72 6d 73 20 74 6f 20 6c 65 76 65  ingTerms to leve
1ace0 6c 20 30 20 73 65 67 6d 65 6e 74 73 2e 20 0a 2a  l 0 segments. .*
1acf0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
1ad00 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 46 6c 75  3PendingTermsFlu
1ad10 73 68 28 46 74 73 33 54 61 62 6c 65 20 2a 70 29  sh(Fts3Table *p)
1ad20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1ad30 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b  ITE_OK;.  int i;
1ad40 0a 20 20 20 20 20 20 20 20 0a 20 20 66 6f 72 28  .        .  for(
1ad50 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
1ad60 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 49 6e 64 65  OK && i<p->nInde
1ad70 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20  x; i++){.    rc 
1ad80 3d 20 66 74 73 33 53 65 67 6d 65 6e 74 4d 65 72  = fts3SegmentMer
1ad90 67 65 28 70 2c 20 70 2d 3e 69 50 72 65 76 4c 61  ge(p, p->iPrevLa
1ada0 6e 67 69 64 2c 20 69 2c 20 46 54 53 33 5f 53 45  ngid, i, FTS3_SE
1adb0 47 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 29  GCURSOR_PENDING)
1adc0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1add0 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d  LITE_DONE ) rc =
1ade0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1adf0 20 20 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e    sqlite3Fts3Pen
1ae00 64 69 6e 67 54 65 72 6d 73 43 6c 65 61 72 28 70  dingTermsClear(p
1ae10 29 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69  );..  /* Determi
1ae20 6e 65 20 74 68 65 20 61 75 74 6f 2d 69 6e 63 72  ne the auto-incr
1ae30 2d 6d 65 72 67 65 20 73 65 74 74 69 6e 67 20 69  -merge setting i
1ae40 66 20 75 6e 6b 6e 6f 77 6e 2e 20 20 49 66 20 65  f unknown.  If e
1ae50 6e 61 62 6c 65 64 2c 0a 20 20 2a 2a 20 65 73 74  nabled,.  ** est
1ae60 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
1ae70 20 6f 66 20 6c 65 61 66 20 62 6c 6f 63 6b 73 20   of leaf blocks 
1ae80 6f 66 20 63 6f 6e 74 65 6e 74 20 74 6f 20 62 65  of content to be
1ae90 20 77 72 69 74 74 65 6e 0a 20 20 2a 2f 0a 20 20   written.  */.  
1aea0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1aeb0 4b 20 26 26 20 70 2d 3e 62 48 61 73 53 74 61 74  K && p->bHasStat
1aec0 0a 20 20 20 26 26 20 70 2d 3e 6e 41 75 74 6f 69  .   && p->nAutoi
1aed0 6e 63 72 6d 65 72 67 65 3d 3d 30 78 66 66 20 26  ncrmerge==0xff &
1aee0 26 20 70 2d 3e 6e 4c 65 61 66 41 64 64 3e 30 0a  & p->nLeafAdd>0.
1aef0 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
1af00 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
1af10 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53  ;.    rc = fts3S
1af20 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45  qlStmt(p, SQL_SE
1af30 4c 45 43 54 5f 53 54 41 54 2c 20 26 70 53 74 6d  LECT_STAT, &pStm
1af40 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  t, 0);.    if( r
1af50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1af60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
1af70 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 2c  nd_int(pStmt, 1,
1af80 20 46 54 53 5f 53 54 41 54 5f 41 55 54 4f 49 4e   FTS_STAT_AUTOIN
1af90 43 52 4d 45 52 47 45 29 3b 0a 20 20 20 20 20 20  CRMERGE);.      
1afa0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
1afb0 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  p(pStmt);.      
1afc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52  if( rc==SQLITE_R
1afd0 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  OW ){.        p-
1afe0 3e 6e 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 20  >nAutoincrmerge 
1aff0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
1b000 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  _int(pStmt, 0);.
1b010 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e          if( p->n
1b020 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 3d 3d 31  Autoincrmerge==1
1b030 20 29 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d   ) p->nAutoincrm
1b040 65 72 67 65 20 3d 20 38 3b 0a 20 20 20 20 20 20  erge = 8;.      
1b050 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
1b060 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
1b070 20 20 20 20 20 70 2d 3e 6e 41 75 74 6f 69 6e 63       p->nAutoinc
1b080 72 6d 65 72 67 65 20 3d 20 30 3b 0a 20 20 20 20  rmerge = 0;.    
1b090 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
1b0a0 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
1b0b0 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  mt);.    }.  }. 
1b0c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1b0d0 2a 0a 2a 2a 20 45 6e 63 6f 64 65 20 4e 20 69 6e  *.** Encode N in
1b0e0 74 65 67 65 72 73 20 61 73 20 76 61 72 69 6e 74  tegers as varint
1b0f0 73 20 69 6e 74 6f 20 61 20 62 6c 6f 62 2e 0a 2a  s into a blob..*
1b100 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1b110 73 33 45 6e 63 6f 64 65 49 6e 74 41 72 72 61 79  s3EncodeIntArray
1b120 28 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  (.  int N,      
1b130 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
1b140 6d 62 65 72 20 6f 66 20 69 6e 74 65 67 65 72 73  mber of integers
1b150 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20   to encode */.  
1b160 75 33 32 20 2a 61 2c 20 20 20 20 20 20 20 20 20  u32 *a,         
1b170 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65     /* The intege
1b180 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 63 68  r values */.  ch
1b190 61 72 20 2a 7a 42 75 66 2c 20 20 20 20 20 20 20  ar *zBuf,       
1b1a0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 42 4c   /* Write the BL
1b1b0 4f 42 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  OB here */.  int
1b1c0 20 2a 70 4e 42 75 66 20 20 20 20 20 20 20 20 20   *pNBuf         
1b1d0 2f 2a 20 57 72 69 74 65 20 6e 75 6d 62 65 72 20  /* Write number 
1b1e0 6f 66 20 62 79 74 65 73 20 69 66 20 7a 42 75 66  of bytes if zBuf
1b1f0 5b 5d 20 75 73 65 64 20 68 65 72 65 20 2a 2f 0a  [] used here */.
1b200 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
1b210 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 4e 3b   for(i=j=0; i<N;
1b220 20 69 2b 2b 29 7b 0a 20 20 20 20 6a 20 2b 3d 20   i++){.    j += 
1b230 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
1b240 72 69 6e 74 28 26 7a 42 75 66 5b 6a 5d 2c 20 28  rint(&zBuf[j], (
1b250 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 61 5b  sqlite3_int64)a[
1b260 69 5d 29 3b 0a 20 20 7d 0a 20 20 2a 70 4e 42 75  i]);.  }.  *pNBu
1b270 66 20 3d 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f = j;.}../*.** 
1b280 44 65 63 6f 64 65 20 61 20 62 6c 6f 62 20 6f 66  Decode a blob of
1b290 20 76 61 72 69 6e 74 73 20 69 6e 74 6f 20 4e 20   varints into N 
1b2a0 69 6e 74 65 67 65 72 73 0a 2a 2f 0a 73 74 61 74  integers.*/.stat
1b2b0 69 63 20 76 6f 69 64 20 66 74 73 33 44 65 63 6f  ic void fts3Deco
1b2c0 64 65 49 6e 74 41 72 72 61 79 28 0a 20 20 69 6e  deIntArray(.  in
1b2d0 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t N,            
1b2e0 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
1b2f0 66 20 69 6e 74 65 67 65 72 73 20 74 6f 20 64 65  f integers to de
1b300 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 2a 61  code */.  u32 *a
1b310 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1b320 57 72 69 74 65 20 74 68 65 20 69 6e 74 65 67 65  Write the intege
1b330 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 63 6f  r values */.  co
1b340 6e 73 74 20 63 68 61 72 20 2a 7a 42 75 66 2c 20  nst char *zBuf, 
1b350 20 2f 2a 20 54 68 65 20 42 4c 4f 42 20 63 6f 6e   /* The BLOB con
1b360 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 72 69  taining the vari
1b370 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 75  nts */.  int nBu
1b380 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  f           /* s
1b390 69 7a 65 20 6f 66 20 74 68 65 20 42 4c 4f 42 20  ize of the BLOB 
1b3a0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
1b3b0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1b3c0 45 54 45 52 28 6e 42 75 66 29 3b 0a 20 20 66 6f  ETER(nBuf);.  fo
1b3d0 72 28 69 3d 6a 3d 30 3b 20 69 3c 4e 3b 20 69 2b  r(i=j=0; i<N; i+
1b3e0 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  +){.    sqlite3_
1b3f0 69 6e 74 36 34 20 78 3b 0a 20 20 20 20 6a 20 2b  int64 x;.    j +
1b400 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74  = sqlite3Fts3Get
1b410 56 61 72 69 6e 74 28 26 7a 42 75 66 5b 6a 5d 2c  Varint(&zBuf[j],
1b420 20 26 78 29 3b 0a 20 20 20 20 61 73 73 65 72 74   &x);.    assert
1b430 28 6a 3c 3d 6e 42 75 66 29 3b 0a 20 20 20 20 61  (j<=nBuf);.    a
1b440 5b 69 5d 20 3d 20 28 75 33 32 29 28 78 20 26 20  [i] = (u32)(x & 
1b450 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d  0xffffffff);.  }
1b460 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
1b470 20 74 68 65 20 73 69 7a 65 73 20 28 69 6e 20 74   the sizes (in t
1b480 6f 6b 65 6e 73 29 20 66 6f 72 20 65 61 63 68 20  okens) for each 
1b490 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 64 6f  column of the do
1b4a0 63 75 6d 65 6e 74 0a 2a 2a 20 77 69 74 68 20 64  cument.** with d
1b4b0 6f 63 69 64 20 65 71 75 61 6c 20 74 6f 20 70 2d  ocid equal to p-
1b4c0 3e 69 50 72 65 76 44 6f 63 69 64 2e 20 20 54 68  >iPrevDocid.  Th
1b4d0 65 20 73 69 7a 65 73 20 61 72 65 20 65 6e 63 6f  e sizes are enco
1b4e0 64 65 64 20 61 73 0a 2a 2a 20 61 20 62 6c 6f 62  ded as.** a blob
1b4f0 20 6f 66 20 76 61 72 69 6e 74 73 2e 0a 2a 2f 0a   of varints..*/.
1b500 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
1b510 49 6e 73 65 72 74 44 6f 63 73 69 7a 65 28 0a 20  InsertDocsize(. 
1b520 20 69 6e 74 20 2a 70 52 43 2c 20 20 20 20 20 20   int *pRC,      
1b530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b540 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1b550 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  */.  Fts3Table *
1b560 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1b570 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 69 6e       /* Table in
1b580 74 6f 20 77 68 69 63 68 20 74 6f 20 69 6e 73 65  to which to inse
1b590 72 74 20 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a  rt */.  u32 *aSz
1b5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5b0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73          /* Sizes
1b5c0 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2c   of each column,
1b5d0 20 69 6e 20 74 6f 6b 65 6e 73 20 2a 2f 0a 29 7b   in tokens */.){
1b5e0 0a 20 20 63 68 61 72 20 2a 70 42 6c 6f 62 3b 20  .  char *pBlob; 
1b5f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b600 68 65 20 42 4c 4f 42 20 65 6e 63 6f 64 69 6e 67  he BLOB encoding
1b610 20 6f 66 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   of the document
1b620 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   size */.  int n
1b630 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20  Blob;           
1b640 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1b650 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 42 4c   bytes in the BL
1b660 4f 42 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  OB */.  sqlite3_
1b670 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
1b680 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 73   /* Statement us
1b690 65 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ed to insert the
1b6a0 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69   encoding */.  i
1b6b0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1b6c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1b6d0 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66  t code from subf
1b6e0 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69  unctions */..  i
1b6f0 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
1b700 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69  ;.  pBlob = sqli
1b710 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 31 30 2a 70  te3_malloc( 10*p
1b720 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69  ->nColumn );.  i
1b730 66 28 20 70 42 6c 6f 62 3d 3d 30 20 29 7b 0a 20  f( pBlob==0 ){. 
1b740 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45     *pRC = SQLITE
1b750 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75  _NOMEM;.    retu
1b760 72 6e 3b 0a 20 20 7d 0a 20 20 66 74 73 33 45 6e  rn;.  }.  fts3En
1b770 63 6f 64 65 49 6e 74 41 72 72 61 79 28 70 2d 3e  codeIntArray(p->
1b780 6e 43 6f 6c 75 6d 6e 2c 20 61 53 7a 2c 20 70 42  nColumn, aSz, pB
1b790 6c 6f 62 2c 20 26 6e 42 6c 6f 62 29 3b 0a 20 20  lob, &nBlob);.  
1b7a0 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
1b7b0 28 70 2c 20 53 51 4c 5f 52 45 50 4c 41 43 45 5f  (p, SQL_REPLACE_
1b7c0 44 4f 43 53 49 5a 45 2c 20 26 70 53 74 6d 74 2c  DOCSIZE, &pStmt,
1b7d0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b   0);.  if( rc ){
1b7e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1b7f0 65 28 70 42 6c 6f 62 29 3b 0a 20 20 20 20 2a 70  e(pBlob);.    *p
1b800 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74  RC = rc;.    ret
1b810 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
1b820 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
1b830 74 6d 74 2c 20 31 2c 20 70 2d 3e 69 50 72 65 76  tmt, 1, p->iPrev
1b840 44 6f 63 69 64 29 3b 0a 20 20 73 71 6c 69 74 65  Docid);.  sqlite
1b850 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d  3_bind_blob(pStm
1b860 74 2c 20 32 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c  t, 2, pBlob, nBl
1b870 6f 62 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ob, sqlite3_free
1b880 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65  );.  sqlite3_ste
1b890 70 28 70 53 74 6d 74 29 3b 0a 20 20 2a 70 52 43  p(pStmt);.  *pRC
1b8a0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
1b8b0 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pStmt);.}../*.*
1b8c0 2a 20 52 65 63 6f 72 64 20 30 20 6f 66 20 74 68  * Record 0 of th
1b8d0 65 20 25 5f 73 74 61 74 20 74 61 62 6c 65 20 63  e %_stat table c
1b8e0 6f 6e 74 61 69 6e 73 20 61 20 62 6c 6f 62 20 63  ontains a blob c
1b8f0 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 4e 20 76  onsisting of N v
1b900 61 72 69 6e 74 73 2c 0a 2a 2a 20 77 68 65 72 65  arints,.** where
1b910 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
1b920 20 6f 66 20 75 73 65 72 20 64 65 66 69 6e 65 64   of user defined
1b930 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
1b940 66 74 73 33 20 74 61 62 6c 65 20 70 6c 75 73 0a  fts3 table plus.
1b950 2a 2a 20 74 77 6f 2e 20 49 66 20 6e 43 6f 6c 20  ** two. If nCol 
1b960 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1b970 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 6f   user defined co
1b980 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 76 61 6c 75  lumns, then valu
1b990 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 76 61  es of the .** va
1b9a0 72 69 6e 74 73 20 61 72 65 20 73 65 74 20 61 73  rints are set as
1b9b0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
1b9c0 20 20 56 61 72 69 6e 74 20 30 3a 20 20 20 20 20    Varint 0:     
1b9d0 20 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f    Total number o
1b9e0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
1b9f0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72  ble..**.**   Var
1ba00 69 6e 74 20 31 2e 2e 6e 43 6f 6c 3a 20 46 6f 72  int 1..nCol: For
1ba10 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2c 20 74 68   each column, th
1ba20 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
1ba30 66 20 74 6f 6b 65 6e 73 20 73 74 6f 72 65 64 20  f tokens stored 
1ba40 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  in.**           
1ba50 20 20 20 20 20 20 20 20 74 68 65 20 63 6f 6c 75          the colu
1ba60 6d 6e 20 66 6f 72 20 61 6c 6c 20 72 6f 77 73 20  mn for all rows 
1ba70 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  of the table..**
1ba80 0a 2a 2a 20 20 20 56 61 72 69 6e 74 20 31 2b 6e  .**   Varint 1+n
1ba90 43 6f 6c 3a 20 20 54 68 65 20 74 6f 74 61 6c 20  Col:  The total 
1baa0 73 69 7a 65 2c 20 69 6e 20 62 79 74 65 73 2c 20  size, in bytes, 
1bab0 6f 66 20 61 6c 6c 20 74 65 78 74 20 76 61 6c 75  of all text valu
1bac0 65 73 20 69 6e 20 61 6c 6c 0a 2a 2a 20 20 20 20  es in all.**    
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
1bae0 6f 6c 75 6d 6e 73 20 6f 66 20 61 6c 6c 20 72 6f  olumns of all ro
1baf0 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ws of the table.
1bb00 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .**.*/.static vo
1bb10 69 64 20 66 74 73 33 55 70 64 61 74 65 44 6f 63  id fts3UpdateDoc
1bb20 54 6f 74 61 6c 73 28 0a 20 20 69 6e 74 20 2a 70  Totals(.  int *p
1bb30 52 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  RC,             
1bb40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1bb50 20 72 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   result code */.
1bb60 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
1bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb80 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67    /* Table being
1bb90 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 75 33   updated */.  u3
1bba0 32 20 2a 61 53 7a 49 6e 73 2c 20 20 20 20 20 20  2 *aSzIns,      
1bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bbc0 20 53 69 7a 65 20 69 6e 63 72 65 61 73 65 73 20   Size increases 
1bbd0 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a 44 65 6c  */.  u32 *aSzDel
1bbe0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1bbf0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 64 65 63       /* Size dec
1bc00 72 65 61 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20  reases */.  int 
1bc10 6e 43 68 6e 67 20 20 20 20 20 20 20 20 20 20 20  nChng           
1bc20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1bc30 68 61 6e 67 65 20 69 6e 20 74 68 65 20 6e 75 6d  hange in the num
1bc40 62 65 72 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73  ber of documents
1bc50 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70   */.){.  char *p
1bc60 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20  Blob;           
1bc70 20 20 2f 2a 20 53 74 6f 72 61 67 65 20 66 6f 72    /* Storage for
1bc80 20 42 4c 4f 42 20 77 72 69 74 74 65 6e 20 69 6e   BLOB written in
1bc90 74 6f 20 25 5f 73 74 61 74 20 2a 2f 0a 20 20 69  to %_stat */.  i
1bca0 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20  nt nBlob;       
1bcb0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1bcc0 6f 66 20 42 4c 4f 42 20 77 72 69 74 74 65 6e 20  of BLOB written 
1bcd0 69 6e 74 6f 20 25 5f 73 74 61 74 20 2a 2f 0a 20  into %_stat */. 
1bce0 20 75 33 32 20 2a 61 3b 20 20 20 20 20 20 20 20   u32 *a;        
1bcf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
1bd00 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74  ay of integers t
1bd10 68 61 74 20 62 65 63 6f 6d 65 73 20 74 68 65 20  hat becomes the 
1bd20 42 4c 4f 42 20 2a 2f 0a 20 20 73 71 6c 69 74 65  BLOB */.  sqlite
1bd30 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
1bd40 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
1bd50 66 6f 72 20 72 65 61 64 69 6e 67 20 61 6e 64 20  for reading and 
1bd60 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  writing */.  int
1bd70 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1bd80 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1bd90 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
1bda0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1bdb0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
1bdc0 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74  de from subfunct
1bdd0 69 6f 6e 73 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74  ions */..  const
1bde0 20 69 6e 74 20 6e 53 74 61 74 20 3d 20 70 2d 3e   int nStat = p->
1bdf0 6e 43 6f 6c 75 6d 6e 2b 32 3b 0a 0a 20 20 69 66  nColumn+2;..  if
1be00 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
1be10 0a 20 20 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  a = sqlite3_m
1be20 61 6c 6c 6f 63 28 20 28 73 69 7a 65 6f 66 28 75  alloc( (sizeof(u
1be30 33 32 29 2b 31 30 29 2a 6e 53 74 61 74 20 29 3b  32)+10)*nStat );
1be40 0a 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20  .  if( a==0 ){. 
1be50 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45     *pRC = SQLITE
1be60 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75  _NOMEM;.    retu
1be70 72 6e 3b 0a 20 20 7d 0a 20 20 70 42 6c 6f 62 20  rn;.  }.  pBlob 
1be80 3d 20 28 63 68 61 72 2a 29 26 61 5b 6e 53 74 61  = (char*)&a[nSta
1be90 74 5d 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53  t];.  rc = fts3S
1bea0 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45  qlStmt(p, SQL_SE
1beb0 4c 45 43 54 5f 53 54 41 54 2c 20 26 70 53 74 6d  LECT_STAT, &pStm
1bec0 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  t, 0);.  if( rc 
1bed0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
1bee0 72 65 65 28 61 29 3b 0a 20 20 20 20 2a 70 52 43  ree(a);.    *pRC
1bef0 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
1bf00 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
1bf10 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c  _bind_int(pStmt,
1bf20 20 31 2c 20 46 54 53 5f 53 54 41 54 5f 44 4f 43   1, FTS_STAT_DOC
1bf30 54 4f 54 41 4c 29 3b 0a 20 20 69 66 28 20 73 71  TOTAL);.  if( sq
1bf40 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
1bf50 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
1bf60 0a 20 20 20 20 66 74 73 33 44 65 63 6f 64 65 49  .    fts3DecodeI
1bf70 6e 74 41 72 72 61 79 28 6e 53 74 61 74 2c 20 61  ntArray(nStat, a
1bf80 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ,.         sqlit
1bf90 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
1bfa0 53 74 6d 74 2c 20 30 29 2c 0a 20 20 20 20 20 20  Stmt, 0),.      
1bfb0 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
1bfc0 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 30  n_bytes(pStmt, 0
1bfd0 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
1bfe0 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 73 69   memset(a, 0, si
1bff0 7a 65 6f 66 28 75 33 32 29 2a 28 6e 53 74 61 74  zeof(u32)*(nStat
1c000 29 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ) );.  }.  rc = 
1c010 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
1c020 74 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  tmt);.  if( rc!=
1c030 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c040 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29   sqlite3_free(a)
1c050 3b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  ;.    *pRC = rc;
1c060 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1c070 0a 20 20 69 66 28 20 6e 43 68 6e 67 3c 30 20 26  .  if( nChng<0 &
1c080 26 20 61 5b 30 5d 3c 28 75 33 32 29 28 2d 6e 43  & a[0]<(u32)(-nC
1c090 68 6e 67 29 20 29 7b 0a 20 20 20 20 61 5b 30 5d  hng) ){.    a[0]
1c0a0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1c0b0 20 20 20 61 5b 30 5d 20 2b 3d 20 6e 43 68 6e 67     a[0] += nChng
1c0c0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1c0d0 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 3b   i<p->nColumn+1;
1c0e0 20 69 2b 2b 29 7b 0a 20 20 20 20 75 33 32 20 78   i++){.    u32 x
1c0f0 20 3d 20 61 5b 69 2b 31 5d 3b 0a 20 20 20 20 69   = a[i+1];.    i
1c100 66 28 20 78 2b 61 53 7a 49 6e 73 5b 69 5d 20 3c  f( x+aSzIns[i] <
1c110 20 61 53 7a 44 65 6c 5b 69 5d 20 29 7b 0a 20 20   aSzDel[i] ){.  
1c120 20 20 20 20 78 20 3d 20 30 3b 0a 20 20 20 20 7d      x = 0;.    }
1c130 65 6c 73 65 7b 0a 20 20 20 20 20 20 78 20 3d 20  else{.      x = 
1c140 78 20 2b 20 61 53 7a 49 6e 73 5b 69 5d 20 2d 20  x + aSzIns[i] - 
1c150 61 53 7a 44 65 6c 5b 69 5d 3b 0a 20 20 20 20 7d  aSzDel[i];.    }
1c160 0a 20 20 20 20 61 5b 69 2b 31 5d 20 3d 20 78 3b  .    a[i+1] = x;
1c170 0a 20 20 7d 0a 20 20 66 74 73 33 45 6e 63 6f 64  .  }.  fts3Encod
1c180 65 49 6e 74 41 72 72 61 79 28 6e 53 74 61 74 2c  eIntArray(nStat,
1c190 20 61 2c 20 70 42 6c 6f 62 2c 20 26 6e 42 6c 6f   a, pBlob, &nBlo
1c1a0 62 29 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53  b);.  rc = fts3S
1c1b0 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 52 45  qlStmt(p, SQL_RE
1c1c0 50 4c 41 43 45 5f 53 54 41 54 2c 20 26 70 53 74  PLACE_STAT, &pSt
1c1d0 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  mt, 0);.  if( rc
1c1e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1c1f0 66 72 65 65 28 61 29 3b 0a 20 20 20 20 2a 70 52  free(a);.    *pR
1c200 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  C = rc;.    retu
1c210 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
1c220 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74  3_bind_int(pStmt
1c230 2c 20 31 2c 20 46 54 53 5f 53 54 41 54 5f 44 4f  , 1, FTS_STAT_DO
1c240 43 54 4f 54 41 4c 29 3b 0a 20 20 73 71 6c 69 74  CTOTAL);.  sqlit
1c250 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74  e3_bind_blob(pSt
1c260 6d 74 2c 20 32 2c 20 70 42 6c 6f 62 2c 20 6e 42  mt, 2, pBlob, nB
1c270 6c 6f 62 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  lob, SQLITE_STAT
1c280 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  IC);.  sqlite3_s
1c290 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 2a 70  tep(pStmt);.  *p
1c2a0 52 43 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  RC = sqlite3_res
1c2b0 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c  et(pStmt);.  sql
1c2c0 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 7d 0a  ite3_free(a);.}.
1c2d0 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 68 65  ./*.** Merge the
1c2e0 20 65 6e 74 69 72 65 20 64 61 74 61 62 61 73 65   entire database
1c2f0 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 69   so that there i
1c300 73 20 6f 6e 65 20 73 65 67 6d 65 6e 74 20 66 6f  s one segment fo
1c310 72 20 65 61 63 68 20 0a 2a 2a 20 69 49 6e 64 65  r each .** iInde
1c320 78 2f 69 4c 61 6e 67 69 64 20 63 6f 6d 62 69 6e  x/iLangid combin
1c330 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
1c340 20 69 6e 74 20 66 74 73 33 44 6f 4f 70 74 69 6d   int fts3DoOptim
1c350 69 7a 65 28 46 74 73 33 54 61 62 6c 65 20 2a 70  ize(Fts3Table *p
1c360 2c 20 69 6e 74 20 62 52 65 74 75 72 6e 44 6f 6e  , int bReturnDon
1c370 65 29 7b 0a 20 20 69 6e 74 20 62 53 65 65 6e 44  e){.  int bSeenD
1c380 6f 6e 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  one = 0;.  int r
1c390 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  c;.  sqlite3_stm
1c3a0 74 20 2a 70 41 6c 6c 4c 61 6e 67 69 64 20 3d 20  t *pAllLangid = 
1c3b0 30 3b 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53  0;..  rc = fts3S
1c3c0 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45  qlStmt(p, SQL_SE
1c3d0 4c 45 43 54 5f 41 4c 4c 5f 4c 41 4e 47 49 44 2c  LECT_ALL_LANGID,
1c3e0 20 26 70 41 6c 6c 4c 61 6e 67 69 64 2c 20 30 29   &pAllLangid, 0)
1c3f0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1c400 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
1c410 20 72 63 32 3b 0a 20 20 20 20 73 71 6c 69 74 65   rc2;.    sqlite
1c420 33 5f 62 69 6e 64 5f 69 6e 74 28 70 41 6c 6c 4c  3_bind_int(pAllL
1c430 61 6e 67 69 64 2c 20 31 2c 20 70 2d 3e 69 50 72  angid, 1, p->iPr
1c440 65 76 4c 61 6e 67 69 64 29 3b 0a 20 20 20 20 73  evLangid);.    s
1c450 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
1c460 70 41 6c 6c 4c 61 6e 67 69 64 2c 20 32 2c 20 70  pAllLangid, 2, p
1c470 2d 3e 6e 49 6e 64 65 78 29 3b 0a 20 20 20 20 77  ->nIndex);.    w
1c480 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74  hile( sqlite3_st
1c490 65 70 28 70 41 6c 6c 4c 61 6e 67 69 64 29 3d 3d  ep(pAllLangid)==
1c4a0 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
1c4b0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
1c4c0 20 69 6e 74 20 69 4c 61 6e 67 69 64 20 3d 20 73   int iLangid = s
1c4d0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
1c4e0 74 28 70 41 6c 6c 4c 61 6e 67 69 64 2c 20 30 29  t(pAllLangid, 0)
1c4f0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
1c500 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1c510 26 20 69 3c 70 2d 3e 6e 49 6e 64 65 78 3b 20 69  & i<p->nIndex; i
1c520 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ++){.        rc 
1c530 3d 20 66 74 73 33 53 65 67 6d 65 6e 74 4d 65 72  = fts3SegmentMer
1c540 67 65 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69  ge(p, iLangid, i
1c550 2c 20 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52  , FTS3_SEGCURSOR
1c560 5f 41 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 69  _ALL);.        i
1c570 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
1c580 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
1c590 62 53 65 65 6e 44 6f 6e 65 20 3d 20 31 3b 0a 20  bSeenDone = 1;. 
1c5a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1c5b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
1c5c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1c5d0 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
1c5e0 65 33 5f 72 65 73 65 74 28 70 41 6c 6c 4c 61 6e  e3_reset(pAllLan
1c5f0 67 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gid);.    if( rc
1c600 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
1c610 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 73   = rc2;.  }..  s
1c620 71 6c 69 74 65 33 46 74 73 33 53 65 67 6d 65 6e  qlite3Fts3Segmen
1c630 74 73 43 6c 6f 73 65 28 70 29 3b 0a 20 20 73 71  tsClose(p);.  sq
1c640 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67  lite3Fts3Pending
1c650 54 65 72 6d 73 43 6c 65 61 72 28 70 29 3b 0a 0a  TermsClear(p);..
1c660 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
1c670 4c 49 54 45 5f 4f 4b 20 26 26 20 62 52 65 74 75  LITE_OK && bRetu
1c680 72 6e 44 6f 6e 65 20 26 26 20 62 53 65 65 6e 44  rnDone && bSeenD
1c690 6f 6e 65 29 20 3f 20 53 51 4c 49 54 45 5f 44 4f  one) ? SQLITE_DO
1c6a0 4e 45 20 3a 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  NE : rc;.}../*.*
1c6b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1c6c0 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
1c6d0 68 65 20 75 73 65 72 20 65 78 65 63 75 74 65 73  he user executes
1c6e0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
1c6f0 74 61 74 65 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20  tatement:.**.** 
1c700 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1c710 3c 74 62 6c 3e 28 3c 74 62 6c 3e 29 20 56 41 4c  <tbl>(<tbl>) VAL
1c720 55 45 53 28 27 72 65 62 75 69 6c 64 27 29 3b 0a  UES('rebuild');.
1c730 2a 2a 0a 2a 2a 20 54 68 65 20 65 6e 74 69 72 65  **.** The entire
1c740 20 46 54 53 20 69 6e 64 65 78 20 69 73 20 64 69   FTS index is di
1c750 73 63 61 72 64 65 64 20 61 6e 64 20 72 65 62 75  scarded and rebu
1c760 69 6c 74 2e 20 49 66 20 74 68 65 20 74 61 62 6c  ilt. If the tabl
1c770 65 20 69 73 20 6f 6e 65 20 0a 2a 2a 20 63 72 65  e is one .** cre
1c780 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 63  ated using the c
1c790 6f 6e 74 65 6e 74 3d 78 78 78 20 6f 70 74 69 6f  ontent=xxx optio
1c7a0 6e 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 77 20  n, then the new 
1c7b0 69 6e 64 65 78 20 69 73 20 62 61 73 65 64 20 6f  index is based o
1c7c0 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  n.** the current
1c7d0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1c7e0 20 78 78 78 20 74 61 62 6c 65 2e 20 4f 74 68 65   xxx table. Othe
1c7f0 72 77 69 73 65 2c 20 69 74 20 69 73 20 72 65 62  rwise, it is reb
1c800 75 69 6c 74 20 62 61 73 65 64 0a 2a 2a 20 6f 6e  uilt based.** on
1c810 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1c820 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74   the %_content t
1c830 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
1c840 69 6e 74 20 66 74 73 33 44 6f 52 65 62 75 69 6c  int fts3DoRebuil
1c850 64 28 46 74 73 33 54 61 62 6c 65 20 2a 70 29 7b  d(Fts3Table *p){
1c860 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1c870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c880 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
1c890 65 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73  e */..  rc = fts
1c8a0 33 44 65 6c 65 74 65 41 6c 6c 28 70 2c 20 30 29  3DeleteAll(p, 0)
1c8b0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1c8c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 33 32  TE_OK ){.    u32
1c8d0 20 2a 61 53 7a 20 3d 20 30 3b 0a 20 20 20 20 75   *aSz = 0;.    u
1c8e0 33 32 20 2a 61 53 7a 49 6e 73 20 3d 20 30 3b 0a  32 *aSzIns = 0;.
1c8f0 20 20 20 20 75 33 32 20 2a 61 53 7a 44 65 6c 20      u32 *aSzDel 
1c900 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
1c910 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
1c920 3b 0a 20 20 20 20 69 6e 74 20 6e 45 6e 74 72 79  ;.    int nEntry
1c930 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f   = 0;..    /* Co
1c940 6d 70 6f 73 65 20 61 6e 64 20 70 72 65 70 61 72  mpose and prepar
1c950 65 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  e an SQL stateme
1c960 6e 74 20 74 6f 20 6c 6f 6f 70 20 74 68 72 6f 75  nt to loop throu
1c970 67 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 74  gh the content t
1c980 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  able */.    char
1c990 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33   *zSql = sqlite3
1c9a0 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
1c9b0 20 25 73 22 20 2c 20 70 2d 3e 7a 52 65 61 64 45   %s" , p->zReadE
1c9c0 78 70 72 6c 69 73 74 29 3b 0a 20 20 20 20 69 66  xprlist);.    if
1c9d0 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20  ( !zSql ){.     
1c9e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1c9f0 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
1ca00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1ca10 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
1ca20 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
1ca30 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Stmt, 0);.      
1ca40 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
1ca50 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  l);.    }..    i
1ca60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ca70 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   ){.      int nB
1ca80 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 75 33 32  yte = sizeof(u32
1ca90 29 20 2a 20 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  ) * (p->nColumn+
1caa0 31 29 2a 33 3b 0a 20 20 20 20 20 20 61 53 7a 20  1)*3;.      aSz 
1cab0 3d 20 28 75 33 32 20 2a 29 73 71 6c 69 74 65 33  = (u32 *)sqlite3
1cac0 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a  _malloc(nByte);.
1cad0 20 20 20 20 20 20 69 66 28 20 61 53 7a 3d 3d 30        if( aSz==0
1cae0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1caf0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1cb00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1cb10 20 20 20 20 6d 65 6d 73 65 74 28 61 53 7a 2c 20      memset(aSz, 
1cb20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  0, nByte);.     
1cb30 20 20 20 61 53 7a 49 6e 73 20 3d 20 26 61 53 7a     aSzIns = &aSz
1cb40 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 5d 3b 0a  [p->nColumn+1];.
1cb50 20 20 20 20 20 20 20 20 61 53 7a 44 65 6c 20 3d          aSzDel =
1cb60 20 26 61 53 7a 49 6e 73 5b 70 2d 3e 6e 43 6f 6c   &aSzIns[p->nCol
1cb70 75 6d 6e 2b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a  umn+1];.      }.
1cb80 20 20 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65      }..    while
1cb90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1cba0 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
1cbb0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
1cbc0 74 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  t) ){.      int 
1cbd0 69 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  iCol;.      int 
1cbe0 69 4c 61 6e 67 69 64 20 3d 20 6c 61 6e 67 69 64  iLangid = langid
1cbf0 46 72 6f 6d 53 65 6c 65 63 74 28 70 2c 20 70 53  FromSelect(p, pS
1cc00 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tmt);.      rc =
1cc10 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d   fts3PendingTerm
1cc20 73 44 6f 63 69 64 28 70 2c 20 30 2c 20 69 4c 61  sDocid(p, 0, iLa
1cc30 6e 67 69 64 2c 20 73 71 6c 69 74 65 33 5f 63 6f  ngid, sqlite3_co
1cc40 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
1cc50 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d  , 0));.      mem
1cc60 73 65 74 28 61 53 7a 2c 20 30 2c 20 73 69 7a 65  set(aSz, 0, size
1cc70 6f 66 28 61 53 7a 5b 30 5d 29 20 2a 20 28 70 2d  of(aSz[0]) * (p-
1cc80 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 29 3b 0a 20 20  >nColumn+1));.  
1cc90 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
1cca0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1ccb0 20 69 43 6f 6c 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e   iCol<p->nColumn
1ccc0 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
1ccd0 20 20 20 69 66 28 20 70 2d 3e 61 62 4e 6f 74 69     if( p->abNoti
1cce0 6e 64 65 78 65 64 5b 69 43 6f 6c 5d 3d 3d 30 20  ndexed[iCol]==0 
1ccf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
1cd00 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f  st char *z = (co
1cd10 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69  nst char *) sqli
1cd20 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
1cd30 70 53 74 6d 74 2c 20 69 43 6f 6c 2b 31 29 3b 0a  pStmt, iCol+1);.
1cd40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 66            rc = f
1cd50 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 41  ts3PendingTermsA
1cd60 64 64 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 7a  dd(p, iLangid, z
1cd70 2c 20 69 43 6f 6c 2c 20 26 61 53 7a 5b 69 43 6f  , iCol, &aSz[iCo
1cd80 6c 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  l]);.          a
1cd90 53 7a 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 2b  Sz[p->nColumn] +
1cda0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
1cdb0 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69 43  _bytes(pStmt, iC
1cdc0 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  ol+1);.        }
1cdd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1cde0 66 28 20 70 2d 3e 62 48 61 73 44 6f 63 73 69 7a  f( p->bHasDocsiz
1cdf0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  e ){.        fts
1ce00 33 49 6e 73 65 72 74 44 6f 63 73 69 7a 65 28 26  3InsertDocsize(&
1ce10 72 63 2c 20 70 2c 20 61 53 7a 29 3b 0a 20 20 20  rc, p, aSz);.   
1ce20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
1ce30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1ce40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1ce50 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
1ce60 0a 20 20 20 20 20 20 20 20 70 53 74 6d 74 20 3d  .        pStmt =
1ce70 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
1ce80 0a 20 20 20 20 20 20 20 20 6e 45 6e 74 72 79 2b  .        nEntry+
1ce90 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  +;.        for(i
1cea0 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 3d 70 2d 3e  Col=0; iCol<=p->
1ceb0 6e 43 6f 6c 75 6d 6e 3b 20 69 43 6f 6c 2b 2b 29  nColumn; iCol++)
1cec0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53 7a 49  {.          aSzI
1ced0 6e 73 5b 69 43 6f 6c 5d 20 2b 3d 20 61 53 7a 5b  ns[iCol] += aSz[
1cee0 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20 7d  iCol];.        }
1cef0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1cf00 20 20 20 69 66 28 20 70 2d 3e 62 46 74 73 34 20     if( p->bFts4 
1cf10 29 7b 0a 20 20 20 20 20 20 66 74 73 33 55 70 64  ){.      fts3Upd
1cf20 61 74 65 44 6f 63 54 6f 74 61 6c 73 28 26 72 63  ateDocTotals(&rc
1cf30 2c 20 70 2c 20 61 53 7a 49 6e 73 2c 20 61 53 7a  , p, aSzIns, aSz
1cf40 44 65 6c 2c 20 6e 45 6e 74 72 79 29 3b 0a 20 20  Del, nEntry);.  
1cf50 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
1cf60 66 72 65 65 28 61 53 7a 29 3b 0a 0a 20 20 20 20  free(aSz);..    
1cf70 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20  if( pStmt ){.   
1cf80 20 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c     int rc2 = sql
1cf90 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
1cfa0 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tmt);.      if( 
1cfb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1cfc0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63  .        rc = rc
1cfd0 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  2;.      }.    }
1cfe0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1cff0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
1d000 73 20 66 75 6e 63 74 69 6f 6e 20 6f 70 65 6e 73  s function opens
1d010 20 61 20 63 75 72 73 6f 72 20 75 73 65 64 20 74   a cursor used t
1d020 6f 20 72 65 61 64 20 74 68 65 20 69 6e 70 75 74  o read the input
1d030 20 64 61 74 61 20 66 6f 72 20 61 6e 20 0a 2a 2a   data for an .**
1d040 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72   incremental mer
1d050 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53 70  ge operation. Sp
1d060 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 74 20 6f  ecifically, it o
1d070 70 65 6e 73 20 61 20 63 75 72 73 6f 72 20 74 6f  pens a cursor to
1d080 20 73 63 61 6e 0a 2a 2a 20 74 68 65 20 6f 6c 64   scan.** the old
1d090 65 73 74 20 6e 53 65 67 20 73 65 67 6d 65 6e 74  est nSeg segment
1d0a0 73 20 28 69 64 78 3d 30 20 74 68 72 6f 75 67 68  s (idx=0 through
1d0b0 20 69 64 78 3d 28 6e 53 65 67 2d 31 29 29 20 69   idx=(nSeg-1)) i
1d0c0 6e 20 61 62 73 6f 6c 75 74 65 20 0a 2a 2a 20 6c  n absolute .** l
1d0d0 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c 2e 0a  evel iAbsLevel..
1d0e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
1d0f0 73 33 49 6e 63 72 6d 65 72 67 65 43 73 72 28 0a  s3IncrmergeCsr(.
1d100 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
1d110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d120 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20    /* FTS3 table 
1d130 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69  handle */.  sqli
1d140 74 65 33 5f 69 6e 74 36 34 20 69 41 62 73 4c 65  te3_int64 iAbsLe
1d150 76 65 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 41  vel,        /* A
1d160 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 74 6f  bsolute level to
1d170 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e   open */.  int n
1d180 53 65 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Seg,            
1d190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1d1a0 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73  mber of segments
1d1b0 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46   to merge */.  F
1d1c0 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
1d1d0 72 20 2a 70 43 73 72 20 20 20 20 20 20 20 20 2f  r *pCsr        /
1d1e0 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  * Cursor object 
1d1f0 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29  to populate */.)
1d200 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1d210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d220 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
1d230 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
1d240 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
1d250 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65          /* State
1d260 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 72 65 61  ment used to rea
1d270 64 20 25 5f 73 65 67 64 69 72 20 65 6e 74 72 79  d %_segdir entry
1d280 20 2a 2f 20 20 0a 20 20 69 6e 74 20 6e 42 79 74   */  .  int nByt
1d290 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1d2a0 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
1d2b0 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 70 43   allocated at pC
1d2c0 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 5d 20  sr->apSegment[] 
1d2d0 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
1d2e0 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
1d2f0 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
1d300 65 72 2e 61 43 73 72 5b 5d 20 61 72 72 61 79 20  er.aCsr[] array 
1d310 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 70 43 73 72  */.  memset(pCsr
1d320 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 73  , 0, sizeof(*pCs
1d330 72 29 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73  r));.  nByte = s
1d340 69 7a 65 6f 66 28 46 74 73 33 53 65 67 52 65 61  izeof(Fts3SegRea
1d350 64 65 72 20 2a 29 20 2a 20 6e 53 65 67 3b 0a 20  der *) * nSeg;. 
1d360 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74   pCsr->apSegment
1d370 20 3d 20 28 46 74 73 33 53 65 67 52 65 61 64 65   = (Fts3SegReade
1d380 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  r **)sqlite3_mal
1d390 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 0a 20 20 69  loc(nByte);..  i
1d3a0 66 28 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65  f( pCsr->apSegme
1d3b0 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  nt==0 ){.    rc 
1d3c0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1d3d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
1d3e0 73 65 74 28 70 43 73 72 2d 3e 61 70 53 65 67 6d  set(pCsr->apSegm
1d3f0 65 6e 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  ent, 0, nByte);.
1d400 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c      rc = fts3Sql
1d410 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45  Stmt(p, SQL_SELE
1d420 43 54 5f 4c 45 56 45 4c 2c 20 26 70 53 74 6d 74  CT_LEVEL, &pStmt
1d430 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
1d440 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d450 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1d460 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 73 71 6c  int rc2;.    sql
1d470 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
1d480 70 53 74 6d 74 2c 20 31 2c 20 69 41 62 73 4c 65  pStmt, 1, iAbsLe
1d490 76 65 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  vel);.    assert
1d4a0 28 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74  ( pCsr->nSegment
1d4b0 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  ==0 );.    for(i
1d4c0 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
1d4d0 4b 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 65  K && sqlite3_ste
1d4e0 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
1d4f0 5f 52 4f 57 20 26 26 20 69 3c 6e 53 65 67 3b 20  _ROW && i<nSeg; 
1d500 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
1d510 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
1d520 65 61 64 65 72 4e 65 77 28 69 2c 20 30 2c 0a 20  eaderNew(i, 0,. 
1d530 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1d540 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
1d550 74 6d 74 2c 20 31 29 2c 20 20 20 20 20 20 20 20  tmt, 1),        
1d560 2f 2a 20 73 65 67 64 69 72 2e 73 74 61 72 74 5f  /* segdir.start_
1d570 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20  block */.       
1d580 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
1d590 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 32  n_int64(pStmt, 2
1d5a0 29 2c 20 20 20 20 20 20 20 20 2f 2a 20 73 65 67  ),        /* seg
1d5b0 64 69 72 2e 6c 65 61 76 65 73 5f 65 6e 64 5f 62  dir.leaves_end_b
1d5c0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
1d5d0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
1d5e0 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 33 29  _int64(pStmt, 3)
1d5f0 2c 20 20 20 20 20 20 20 20 2f 2a 20 73 65 67 64  ,        /* segd
1d600 69 72 2e 65 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a  ir.end_block */.
1d610 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1d620 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53  3_column_blob(pS
1d630 74 6d 74 2c 20 34 29 2c 20 20 20 20 20 20 20 20  tmt, 4),        
1d640 20 2f 2a 20 73 65 67 64 69 72 2e 72 6f 6f 74 20   /* segdir.root 
1d650 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
1d660 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
1d670 73 28 70 53 74 6d 74 2c 20 34 29 2c 20 20 20 20  s(pStmt, 4),    
1d680 20 20 20 20 2f 2a 20 73 65 67 64 69 72 2e 72 6f      /* segdir.ro
1d690 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ot */.          
1d6a0 26 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74  &pCsr->apSegment
1d6b0 5b 69 5d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  [i].      );.   
1d6c0 20 20 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e     pCsr->nSegmen
1d6d0 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  t++;.    }.    r
1d6e0 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  c2 = sqlite3_res
1d6f0 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69  et(pStmt);.    i
1d700 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d710 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d   ) rc = rc2;.  }
1d720 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1d730 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
1d740 20 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72   IncrmergeWriter
1d750 20 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72   IncrmergeWriter
1d760 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
1d770 20 4e 6f 64 65 57 72 69 74 65 72 20 4e 6f 64 65   NodeWriter Node
1d780 57 72 69 74 65 72 3b 0a 74 79 70 65 64 65 66 20  Writer;.typedef 
1d790 73 74 72 75 63 74 20 42 6c 6f 62 20 42 6c 6f 62  struct Blob Blob
1d7a0 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
1d7b0 20 4e 6f 64 65 52 65 61 64 65 72 20 4e 6f 64 65   NodeReader Node
1d7c0 52 65 61 64 65 72 3b 0a 0a 2f 2a 0a 2a 2a 20 41  Reader;../*.** A
1d7d0 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
1d7e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
1d7f0 63 74 75 72 65 20 69 73 20 75 73 65 64 20 61 73  cture is used as
1d800 20 61 20 64 79 6e 61 6d 69 63 20 62 75 66 66 65   a dynamic buffe
1d810 72 0a 2a 2a 20 74 6f 20 62 75 69 6c 64 20 75 70  r.** to build up
1d820 20 6e 6f 64 65 73 20 6f 72 20 6f 74 68 65 72 20   nodes or other 
1d830 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 69 6e  blobs of data in
1d840 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 75 6e 63  ..**.** The func
1d850 74 69 6f 6e 20 62 6c 6f 62 47 72 6f 77 42 75 66  tion blobGrowBuf
1d860 66 65 72 28 29 20 69 73 20 75 73 65 64 20 74 6f  fer() is used to
1d870 20 65 78 74 65 6e 64 20 74 68 65 20 61 6c 6c 6f   extend the allo
1d880 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63  cation..*/.struc
1d890 74 20 42 6c 6f 62 20 7b 0a 20 20 63 68 61 72 20  t Blob {.  char 
1d8a0 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *a;             
1d8b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1d8c0 69 6e 74 65 72 20 74 6f 20 61 6c 6c 6f 63 61 74  inter to allocat
1d8d0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ion */.  int n; 
1d8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1d900 65 72 20 6f 66 20 76 61 6c 69 64 20 62 79 74 65  er of valid byte
1d910 73 20 6f 66 20 64 61 74 61 20 69 6e 20 61 5b 5d  s of data in a[]
1d920 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63   */.  int nAlloc
1d930 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d940 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
1d950 65 64 20 73 69 7a 65 20 6f 66 20 61 5b 5d 20 28  ed size of a[] (
1d960 6e 41 6c 6c 6f 63 3e 3d 6e 29 20 2a 2f 0a 7d 3b  nAlloc>=n) */.};
1d970 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 73 74 72  ../*.** This str
1d980 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20 74  ucture is used t
1d990 6f 20 62 75 69 6c 64 20 75 70 20 62 75 66 66 65  o build up buffe
1d9a0 72 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 65  rs containing se
1d9b0 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 0a 2a 2a  gment b-tree .**
1d9c0 20 6e 6f 64 65 73 20 28 62 6c 6f 63 6b 73 29 2e   nodes (blocks).
1d9d0 0a 2a 2f 0a 73 74 72 75 63 74 20 4e 6f 64 65 57  .*/.struct NodeW
1d9e0 72 69 74 65 72 20 7b 0a 20 20 73 71 6c 69 74 65  riter {.  sqlite
1d9f0 33 5f 69 6e 74 36 34 20 69 42 6c 6f 63 6b 3b 20  3_int64 iBlock; 
1da00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1da10 72 65 6e 74 20 62 6c 6f 63 6b 20 69 64 20 2a 2f  rent block id */
1da20 0a 20 20 42 6c 6f 62 20 6b 65 79 3b 20 20 20 20  .  Blob key;    
1da30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da40 20 20 20 2f 2a 20 4c 61 73 74 20 6b 65 79 20 77     /* Last key w
1da50 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 63 75  ritten to the cu
1da60 72 72 65 6e 74 20 62 6c 6f 63 6b 20 2a 2f 0a 20  rrent block */. 
1da70 20 42 6c 6f 62 20 62 6c 6f 63 6b 3b 20 20 20 20   Blob block;    
1da80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da90 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 6c 6f 63   /* Current bloc
1daa0 6b 20 69 6d 61 67 65 20 2a 2f 0a 7d 3b 0a 0a 2f  k image */.};../
1dab0 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f  *.** An object o
1dac0 66 20 74 68 69 73 20 74 79 70 65 20 63 6f 6e 74  f this type cont
1dad0 61 69 6e 73 20 74 68 65 20 73 74 61 74 65 20 72  ains the state r
1dae0 65 71 75 69 72 65 64 20 74 6f 20 63 72 65 61 74  equired to creat
1daf0 65 20 6f 72 20 61 70 70 65 6e 64 0a 2a 2a 20 74  e or append.** t
1db00 6f 20 61 6e 20 61 70 70 65 6e 64 61 62 6c 65 20  o an appendable 
1db10 62 2d 74 72 65 65 20 73 65 67 6d 65 6e 74 2e 0a  b-tree segment..
1db20 2a 2f 0a 73 74 72 75 63 74 20 49 6e 63 72 6d 65  */.struct Incrme
1db30 72 67 65 57 72 69 74 65 72 20 7b 0a 20 20 69 6e  rgeWriter {.  in
1db40 74 20 6e 4c 65 61 66 45 73 74 3b 20 20 20 20 20  t nLeafEst;     
1db50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1db60 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   Space allocated
1db70 20 66 6f 72 20 6c 65 61 66 20 62 6c 6f 63 6b 73   for leaf blocks
1db80 20 2a 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 3b   */.  int nWork;
1db90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dba0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1dbb0 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 66 6c  of leaf pages fl
1dbc0 75 73 68 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  ushed */.  sqlit
1dbd0 65 33 5f 69 6e 74 36 34 20 69 41 62 73 4c 65 76  e3_int64 iAbsLev
1dbe0 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 62  el;        /* Ab
1dbf0 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 6f 66 20  solute level of 
1dc00 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a  input segments *
1dc10 2f 0a 20 20 69 6e 74 20 69 49 64 78 3b 20 20 20  /.  int iIdx;   
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc30 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1dc40 2a 6f 75 74 70 75 74 2a 20 73 65 67 6d 65 6e 74  *output* segment
1dc50 20 69 6e 20 69 41 62 73 4c 65 76 65 6c 2b 31 20   in iAbsLevel+1 
1dc60 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
1dc70 36 34 20 69 53 74 61 72 74 3b 20 20 20 20 20 20  64 iStart;      
1dc80 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 6e 75       /* Block nu
1dc90 6d 62 65 72 20 6f 66 20 66 69 72 73 74 20 61 6c  mber of first al
1dca0 6c 6f 63 61 74 65 64 20 62 6c 6f 63 6b 20 2a 2f  located block */
1dcb0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1dcc0 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20   iEnd;          
1dcd0 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 6e 75 6d 62     /* Block numb
1dce0 65 72 20 6f 66 20 6c 61 73 74 20 61 6c 6c 6f 63  er of last alloc
1dcf0 61 74 65 64 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20  ated block */.  
1dd00 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4c  sqlite3_int64 nL
1dd10 65 61 66 44 61 74 61 3b 20 20 20 20 20 20 20 20  eafData;        
1dd20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6c 65 61 66  /* Bytes of leaf
1dd30 20 70 61 67 65 20 64 61 74 61 20 73 6f 20 66 61   page data so fa
1dd40 72 20 2a 2f 0a 20 20 75 38 20 62 4e 6f 4c 65 61  r */.  u8 bNoLea
1dd50 66 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  fData;          
1dd60 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
1dd70 65 2c 20 73 74 6f 72 65 20 30 20 66 6f 72 20 73  e, store 0 for s
1dd80 65 67 6d 65 6e 74 20 73 69 7a 65 20 2a 2f 0a 20  egment size */. 
1dd90 20 4e 6f 64 65 57 72 69 74 65 72 20 61 4e 6f 64   NodeWriter aNod
1dda0 65 57 72 69 74 65 72 5b 46 54 53 5f 4d 41 58 5f  eWriter[FTS_MAX_
1ddb0 41 50 50 45 4e 44 41 42 4c 45 5f 48 45 49 47 48  APPENDABLE_HEIGH
1ddc0 54 5d 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  T];.};../*.** An
1ddd0 20 6f 62 6a 65 63 74 20 6f 66 20 74 68 65 20 66   object of the f
1dde0 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 69 73  ollowing type is
1ddf0 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 64 61   used to read da
1de00 74 61 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  ta from a single
1de10 0a 2a 2a 20 46 54 53 20 73 65 67 6d 65 6e 74 20  .** FTS segment 
1de20 6e 6f 64 65 2e 20 53 65 65 20 74 68 65 20 66 6f  node. See the fo
1de30 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
1de40 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 6e 6f 64  s:.**.**     nod
1de50 65 52 65 61 64 65 72 49 6e 69 74 28 29 0a 2a 2a  eReaderInit().**
1de60 20 20 20 20 20 6e 6f 64 65 52 65 61 64 65 72 4e       nodeReaderN
1de70 65 78 74 28 29 0a 2a 2a 20 20 20 20 20 6e 6f 64  ext().**     nod
1de80 65 52 65 61 64 65 72 52 65 6c 65 61 73 65 28 29  eReaderRelease()
1de90 0a 2a 2f 0a 73 74 72 75 63 74 20 4e 6f 64 65 52  .*/.struct NodeR
1dea0 65 61 64 65 72 20 7b 0a 20 20 63 6f 6e 73 74 20  eader {.  const 
1deb0 63 68 61 72 20 2a 61 4e 6f 64 65 3b 0a 20 20 69  char *aNode;.  i
1dec0 6e 74 20 6e 4e 6f 64 65 3b 0a 20 20 69 6e 74 20  nt nNode;.  int 
1ded0 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  iOff;           
1dee0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1def0 75 72 72 65 6e 74 20 6f 66 66 73 65 74 20 77 69  urrent offset wi
1df00 74 68 69 6e 20 61 4e 6f 64 65 5b 5d 20 2a 2f 0a  thin aNode[] */.
1df10 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72  .  /* Output var
1df20 69 61 62 6c 65 73 2e 20 43 6f 6e 74 61 69 6e 69  iables. Containi
1df30 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e  ng the current n
1df40 6f 64 65 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20  ode entry. */.  
1df50 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 43  sqlite3_int64 iC
1df60 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  hild;           
1df70 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 68  /* Pointer to ch
1df80 69 6c 64 20 6e 6f 64 65 20 2a 2f 0a 20 20 42 6c  ild node */.  Bl
1df90 6f 62 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20  ob term;        
1dfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dfb0 20 43 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f   Current term */
1dfc0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  .  const char *a
1dfd0 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20  Doclist;        
1dfe0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
1dff0 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 69 6e   doclist */.  in
1e000 74 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20  t nDoclist;     
1e010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e020 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74   Size of doclist
1e030 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 7d 3b 0a   in bytes */.};.
1e040 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69  ./*.** If *pRc i
1e050 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20  s not SQLITE_OK 
1e060 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
1e070 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
1e080 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
1e090 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
1e0a0 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 20  e allocation at 
1e0b0 70 42 6c 6f 62 2d 3e 61 20 69 73 20 6e 6f 74 20  pBlob->a is not 
1e0c0 61 6c 72 65 61 64 79 20 61 74 20 6c 65 61 73 74  already at least
1e0d0 20 6e 4d 69 6e 0a 2a 2a 20 62 79 74 65 73 20 69   nMin.** bytes i
1e0e0 6e 20 73 69 7a 65 2c 20 65 78 74 65 6e 64 20 28  n size, extend (
1e0f0 72 65 61 6c 6c 6f 63 29 20 69 74 20 74 6f 20 62  realloc) it to b
1e100 65 20 73 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  e so..**.** If a
1e110 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  n OOM error occu
1e120 72 73 2c 20 73 65 74 20 2a 70 52 63 20 74 6f 20  rs, set *pRc to 
1e130 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64  SQLITE_NOMEM and
1e140 20 6c 65 61 76 65 20 70 42 6c 6f 62 2d 3e 61 0a   leave pBlob->a.
1e150 2a 2a 20 75 6e 6d 6f 64 69 66 69 65 64 2e 20 4f  ** unmodified. O
1e160 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
1e170 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 63 63   allocation succ
1e180 65 65 64 73 2c 20 75 70 64 61 74 65 20 70 42 6c  eeds, update pBl
1e190 6f 62 2d 3e 6e 41 6c 6c 6f 63 0a 2a 2a 20 74 6f  ob->nAlloc.** to
1e1a0 20 72 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77   reflect the new
1e1b0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 42 6c   size of the pBl
1e1c0 6f 62 2d 3e 61 5b 5d 20 62 75 66 66 65 72 2e 0a  ob->a[] buffer..
1e1d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
1e1e0 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28 42 6c  lobGrowBuffer(Bl
1e1f0 6f 62 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e  ob *pBlob, int n
1e200 4d 69 6e 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a  Min, int *pRc){.
1e210 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
1e220 54 45 5f 4f 4b 20 26 26 20 6e 4d 69 6e 3e 70 42  TE_OK && nMin>pB
1e230 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  lob->nAlloc ){. 
1e240 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20     int nAlloc = 
1e250 6e 4d 69 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a  nMin;.    char *
1e260 61 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  a = (char *)sqli
1e270 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 42 6c 6f  te3_realloc(pBlo
1e280 62 2d 3e 61 2c 20 6e 41 6c 6c 6f 63 29 3b 0a 20  b->a, nAlloc);. 
1e290 20 20 20 69 66 28 20 61 20 29 7b 0a 20 20 20 20     if( a ){.    
1e2a0 20 20 70 42 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63 20    pBlob->nAlloc 
1e2b0 3d 20 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  = nAlloc;.      
1e2c0 70 42 6c 6f 62 2d 3e 61 20 3d 20 61 3b 0a 20 20  pBlob->a = a;.  
1e2d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
1e2e0 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  pRc = SQLITE_NOM
1e2f0 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  EM;.    }.  }.}.
1e300 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
1e310 6f 20 61 64 76 61 6e 63 65 20 74 68 65 20 6e 6f  o advance the no
1e320 64 65 2d 72 65 61 64 65 72 20 6f 62 6a 65 63 74  de-reader object
1e330 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
1e340 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
1e350 0a 2a 2a 20 74 68 65 20 6e 65 78 74 20 65 6e 74  .** the next ent
1e360 72 79 20 6f 6e 20 74 68 65 20 6e 6f 64 65 2e 20  ry on the node. 
1e370 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  .**.** Return an
1e380 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
1e390 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28  n error occurs (
1e3a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
1e3b0 70 6f 73 73 69 62 6c 65 29 2e 20 0a 2a 2a 20 4f  possible). .** O
1e3c0 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
1e3d0 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68  SQLITE_OK. If th
1e3e0 65 72 65 20 69 73 20 6e 6f 20 6e 65 78 74 20 65  ere is no next e
1e3f0 6e 74 72 79 20 6f 6e 20 74 68 65 20 6e 6f 64 65  ntry on the node
1e400 0a 2a 2a 20 28 65 2e 67 2e 20 62 65 63 61 75 73  .** (e.g. becaus
1e410 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  e the current en
1e420 74 72 79 20 69 73 20 74 68 65 20 6c 61 73 74 29  try is the last)
1e430 20 73 65 74 20 4e 6f 64 65 52 65 61 64 65 72 2d   set NodeReader-
1e440 3e 61 4e 6f 64 65 20 74 6f 0a 2a 2a 20 4e 55 4c  >aNode to.** NUL
1e450 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 45 4f  L to indicate EO
1e460 46 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f  F. Otherwise, po
1e470 70 75 6c 61 74 65 20 74 68 65 20 4e 6f 64 65 52  pulate the NodeR
1e480 65 61 64 65 72 20 73 74 72 75 63 74 75 72 65 20  eader structure 
1e490 6f 75 74 70 75 74 20 0a 2a 2a 20 76 61 72 69 61  output .** varia
1e4a0 62 6c 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77  bles for the new
1e4b0 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69   entry..*/.stati
1e4c0 63 20 69 6e 74 20 6e 6f 64 65 52 65 61 64 65 72  c int nodeReader
1e4d0 4e 65 78 74 28 4e 6f 64 65 52 65 61 64 65 72 20  Next(NodeReader 
1e4e0 2a 70 29 7b 0a 20 20 69 6e 74 20 62 46 69 72 73  *p){.  int bFirs
1e4f0 74 20 3d 20 28 70 2d 3e 74 65 72 6d 2e 6e 3d 3d  t = (p->term.n==
1e500 30 29 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 66  0);    /* True f
1e510 6f 72 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e  or first term on
1e520 20 74 68 65 20 6e 6f 64 65 20 2a 2f 0a 20 20 69   the node */.  i
1e530 6e 74 20 6e 50 72 65 66 69 78 20 3d 20 30 3b 20  nt nPrefix = 0; 
1e540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e550 2a 20 42 79 74 65 73 20 74 6f 20 63 6f 70 79 20  * Bytes to copy 
1e560 66 72 6f 6d 20 70 72 65 76 69 6f 75 73 20 74 65  from previous te
1e570 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 66  rm */.  int nSuf
1e580 66 69 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20  fix = 0;        
1e590 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
1e5a0 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 74 68   to append to th
1e5b0 65 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e  e prefix */.  in
1e5c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1e5d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1e5e0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1e5f0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4e  .  assert( p->aN
1e600 6f 64 65 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ode );.  if( p->
1e610 69 43 68 69 6c 64 20 26 26 20 62 46 69 72 73 74  iChild && bFirst
1e620 3d 3d 30 20 29 20 70 2d 3e 69 43 68 69 6c 64 2b  ==0 ) p->iChild+
1e630 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66 66  +;.  if( p->iOff
1e640 3e 3d 70 2d 3e 6e 4e 6f 64 65 20 29 7b 0a 20 20  >=p->nNode ){.  
1e650 20 20 2f 2a 20 45 4f 46 20 2a 2f 0a 20 20 20 20    /* EOF */.    
1e660 70 2d 3e 61 4e 6f 64 65 20 3d 20 30 3b 0a 20 20  p->aNode = 0;.  
1e670 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 62  }else{.    if( b
1e680 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  First==0 ){.    
1e690 20 20 70 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73    p->iOff += fts
1e6a0 33 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 2d  3GetVarint32(&p-
1e6b0 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f 66 66 5d 2c  >aNode[p->iOff],
1e6c0 20 26 6e 50 72 65 66 69 78 29 3b 0a 20 20 20 20   &nPrefix);.    
1e6d0 7d 0a 20 20 20 20 70 2d 3e 69 4f 66 66 20 2b 3d  }.    p->iOff +=
1e6e0 20 66 74 73 33 47 65 74 56 61 72 69 6e 74 33 32   fts3GetVarint32
1e6f0 28 26 70 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f  (&p->aNode[p->iO
1e700 66 66 5d 2c 20 26 6e 53 75 66 66 69 78 29 3b 0a  ff], &nSuffix);.
1e710 0a 20 20 20 20 62 6c 6f 62 47 72 6f 77 42 75 66  .    blobGrowBuf
1e720 66 65 72 28 26 70 2d 3e 74 65 72 6d 2c 20 6e 50  fer(&p->term, nP
1e730 72 65 66 69 78 2b 6e 53 75 66 66 69 78 2c 20 26  refix+nSuffix, &
1e740 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  rc);.    if( rc=
1e750 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e760 20 20 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 74      memcpy(&p->t
1e770 65 72 6d 2e 61 5b 6e 50 72 65 66 69 78 5d 2c 20  erm.a[nPrefix], 
1e780 26 70 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f 66  &p->aNode[p->iOf
1e790 66 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20  f], nSuffix);.  
1e7a0 20 20 20 20 70 2d 3e 74 65 72 6d 2e 6e 20 3d 20      p->term.n = 
1e7b0 6e 50 72 65 66 69 78 2b 6e 53 75 66 66 69 78 3b  nPrefix+nSuffix;
1e7c0 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 20 2b  .      p->iOff +
1e7d0 3d 20 6e 53 75 66 66 69 78 3b 0a 20 20 20 20 20  = nSuffix;.     
1e7e0 20 69 66 28 20 70 2d 3e 69 43 68 69 6c 64 3d 3d   if( p->iChild==
1e7f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
1e800 69 4f 66 66 20 2b 3d 20 66 74 73 33 47 65 74 56  iOff += fts3GetV
1e810 61 72 69 6e 74 33 32 28 26 70 2d 3e 61 4e 6f 64  arint32(&p->aNod
1e820 65 5b 70 2d 3e 69 4f 66 66 5d 2c 20 26 70 2d 3e  e[p->iOff], &p->
1e830 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20  nDoclist);.     
1e840 20 20 20 70 2d 3e 61 44 6f 63 6c 69 73 74 20 3d     p->aDoclist =
1e850 20 26 70 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f   &p->aNode[p->iO
1e860 66 66 5d 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ff];.        p->
1e870 69 4f 66 66 20 2b 3d 20 70 2d 3e 6e 44 6f 63 6c  iOff += p->nDocl
1e880 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ist;.      }.   
1e890 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
1e8a0 28 20 70 2d 3e 69 4f 66 66 3c 3d 70 2d 3e 6e 4e  ( p->iOff<=p->nN
1e8b0 6f 64 65 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  ode );..  return
1e8c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1e8d0 6c 65 61 73 65 20 61 6c 6c 20 64 79 6e 61 6d 69  lease all dynami
1e8e0 63 20 72 65 73 6f 75 72 63 65 73 20 68 65 6c 64  c resources held
1e8f0 20 62 79 20 6e 6f 64 65 2d 72 65 61 64 65 72 20   by node-reader 
1e900 6f 62 6a 65 63 74 20 2a 70 2e 0a 2a 2f 0a 73 74  object *p..*/.st
1e910 61 74 69 63 20 76 6f 69 64 20 6e 6f 64 65 52 65  atic void nodeRe
1e920 61 64 65 72 52 65 6c 65 61 73 65 28 4e 6f 64 65  aderRelease(Node
1e930 52 65 61 64 65 72 20 2a 70 29 7b 0a 20 20 73 71  Reader *p){.  sq
1e940 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 74 65  lite3_free(p->te
1e950 72 6d 2e 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rm.a);.}../*.** 
1e960 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 6f 64  Initialize a nod
1e970 65 2d 72 65 61 64 65 72 20 6f 62 6a 65 63 74 20  e-reader object 
1e980 74 6f 20 72 65 61 64 20 74 68 65 20 6e 6f 64 65  to read the node
1e990 20 69 6e 20 62 75 66 66 65 72 20 61 4e 6f 64 65   in buffer aNode
1e9a0 2f 6e 4e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  /nNode..**.** If
1e9b0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
1e9c0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1e9d0 65 64 20 61 6e 64 20 74 68 65 20 4e 6f 64 65 52  ed and the NodeR
1e9e0 65 61 64 65 72 20 6f 62 6a 65 63 74 20 73 65 74  eader object set
1e9f0 20 74 6f 20 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f   to .** point to
1ea00 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1ea10 20 6f 6e 20 74 68 65 20 6e 6f 64 65 20 28 69 66   on the node (if
1ea20 20 61 6e 79 29 2e 20 4f 74 68 65 72 77 69 73 65   any). Otherwise
1ea30 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65  , an SQLite.** e
1ea40 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1ea50 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1ea60 20 69 6e 74 20 6e 6f 64 65 52 65 61 64 65 72 49   int nodeReaderI
1ea70 6e 69 74 28 4e 6f 64 65 52 65 61 64 65 72 20 2a  nit(NodeReader *
1ea80 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  p, const char *a
1ea90 4e 6f 64 65 2c 20 69 6e 74 20 6e 4e 6f 64 65 29  Node, int nNode)
1eaa0 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
1eab0 20 73 69 7a 65 6f 66 28 4e 6f 64 65 52 65 61 64   sizeof(NodeRead
1eac0 65 72 29 29 3b 0a 20 20 70 2d 3e 61 4e 6f 64 65  er));.  p->aNode
1ead0 20 3d 20 61 4e 6f 64 65 3b 0a 20 20 70 2d 3e 6e   = aNode;.  p->n
1eae0 4e 6f 64 65 20 3d 20 6e 4e 6f 64 65 3b 0a 0a 20  Node = nNode;.. 
1eaf0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 69   /* Figure out i
1eb00 66 20 74 68 69 73 20 69 73 20 61 20 6c 65 61 66  f this is a leaf
1eb10 20 6f 72 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   or an internal 
1eb20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70  node. */.  if( p
1eb30 2d 3e 61 4e 6f 64 65 5b 30 5d 20 29 7b 0a 20 20  ->aNode[0] ){.  
1eb40 20 20 2f 2a 20 41 6e 20 69 6e 74 65 72 6e 61 6c    /* An internal
1eb50 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 70 2d   node. */.    p-
1eb60 3e 69 4f 66 66 20 3d 20 31 20 2b 20 73 71 6c 69  >iOff = 1 + sqli
1eb70 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74  te3Fts3GetVarint
1eb80 28 26 70 2d 3e 61 4e 6f 64 65 5b 31 5d 2c 20 26  (&p->aNode[1], &
1eb90 70 2d 3e 69 43 68 69 6c 64 29 3b 0a 20 20 7d 65  p->iChild);.  }e
1eba0 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 69 4f 66 66  lse{.    p->iOff
1ebb0 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   = 1;.  }..  ret
1ebc0 75 72 6e 20 6e 6f 64 65 52 65 61 64 65 72 4e 65  urn nodeReaderNe
1ebd0 78 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xt(p);.}../*.** 
1ebe0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1ebf0 20 63 61 6c 6c 65 64 20 77 68 69 6c 65 20 77 72   called while wr
1ec00 69 74 69 6e 67 20 61 6e 20 46 54 53 20 73 65 67  iting an FTS seg
1ec10 6d 65 6e 74 20 65 61 63 68 20 74 69 6d 65 20 61  ment each time a
1ec20 20 6c 65 61 66 20 6f 0a 2a 2a 20 6e 6f 64 65 20   leaf o.** node 
1ec30 69 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20  is finished and 
1ec40 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
1ec50 20 54 68 65 20 6b 65 79 20 28 7a 54 65 72 6d 2f   The key (zTerm/
1ec60 6e 54 65 72 6d 29 20 69 73 20 67 75 61 72 61 6e  nTerm) is guaran
1ec70 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 67 72  teed.** to be gr
1ec80 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c  eater than the l
1ec90 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 74 68  argest key on th
1eca0 65 20 6e 6f 64 65 20 6a 75 73 74 20 77 72 69 74  e node just writ
1ecb0 74 65 6e 2c 20 62 75 74 20 73 6d 61 6c 6c 65 72  ten, but smaller
1ecc0 0a 2a 2a 20 74 68 61 6e 20 6f 72 20 65 71 75 61  .** than or equa
1ecd0 6c 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 6b  l to the first k
1ece0 65 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ey that will be 
1ecf0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6e  written to the n
1ed00 65 78 74 20 6c 65 61 66 0a 2a 2a 20 6e 6f 64 65  ext leaf.** node
1ed10 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 6c 6f 63  ..**.** The bloc
1ed20 6b 20 69 64 20 6f 66 20 74 68 65 20 6c 65 61 66  k id of the leaf
1ed30 20 6e 6f 64 65 20 6a 75 73 74 20 77 72 69 74 74   node just writt
1ed40 65 6e 20 74 6f 20 64 69 73 6b 20 6d 61 79 20 62  en to disk may b
1ed50 65 20 66 6f 75 6e 64 20 69 6e 0a 2a 2a 20 28 70  e found in.** (p
1ed60 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69  Writer->aNodeWri
1ed70 74 65 72 5b 30 5d 2e 69 42 6c 6f 63 6b 29 20 77  ter[0].iBlock) w
1ed80 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1ed90 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  n is called..*/.
1eda0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49  static int fts3I
1edb0 6e 63 72 6d 65 72 67 65 50 75 73 68 28 0a 20 20  ncrmergePush(.  
1edc0 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
1edd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ede0 2f 2a 20 46 74 73 33 20 74 61 62 6c 65 20 68 61  /* Fts3 table ha
1edf0 6e 64 6c 65 20 2a 2f 0a 20 20 49 6e 63 72 6d 65  ndle */.  Incrme
1ee00 72 67 65 57 72 69 74 65 72 20 2a 70 57 72 69 74  rgeWriter *pWrit
1ee10 65 72 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69  er,       /* Wri
1ee20 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
1ee30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72  const char *zTer
1ee40 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
1ee50 2f 2a 20 54 65 72 6d 20 74 6f 20 77 72 69 74 65  /* Term to write
1ee60 20 74 6f 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64   to internal nod
1ee70 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  e */.  int nTerm
1ee80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee90 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
1eea0 61 74 20 7a 54 65 72 6d 20 2a 2f 0a 29 7b 0a 20  at zTerm */.){. 
1eeb0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1eec0 50 74 72 20 3d 20 70 57 72 69 74 65 72 2d 3e 61  Ptr = pWriter->a
1eed0 4e 6f 64 65 57 72 69 74 65 72 5b 30 5d 2e 69 42  NodeWriter[0].iB
1eee0 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 69 4c 61 79  lock;.  int iLay
1eef0 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  er;..  assert( n
1ef00 54 65 72 6d 3e 30 20 29 3b 0a 20 20 66 6f 72 28  Term>0 );.  for(
1ef10 69 4c 61 79 65 72 3d 31 3b 20 41 4c 57 41 59 53  iLayer=1; ALWAYS
1ef20 28 69 4c 61 79 65 72 3c 46 54 53 5f 4d 41 58 5f  (iLayer<FTS_MAX_
1ef30 41 50 50 45 4e 44 41 42 4c 45 5f 48 45 49 47 48  APPENDABLE_HEIGH
1ef40 54 29 3b 20 69 4c 61 79 65 72 2b 2b 29 7b 0a 20  T); iLayer++){. 
1ef50 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
1ef60 20 69 4e 65 78 74 50 74 72 20 3d 20 30 3b 0a 20   iNextPtr = 0;. 
1ef70 20 20 20 4e 6f 64 65 57 72 69 74 65 72 20 2a 70     NodeWriter *p
1ef80 4e 6f 64 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Node = &pWriter-
1ef90 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 69 4c 61  >aNodeWriter[iLa
1efa0 79 65 72 5d 3b 0a 20 20 20 20 69 6e 74 20 72 63  yer];.    int rc
1efb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1efc0 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 0a 20    int nPrefix;. 
1efd0 20 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 0a     int nSuffix;.
1efe0 20 20 20 20 69 6e 74 20 6e 53 70 61 63 65 3b 0a      int nSpace;.
1eff0 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
1f000 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63  ut how much spac
1f010 65 20 74 68 65 20 6b 65 79 20 77 69 6c 6c 20 63  e the key will c
1f020 6f 6e 73 75 6d 65 20 69 66 20 69 74 20 69 73 20  onsume if it is 
1f030 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a  written to.    *
1f040 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f  * the current no
1f050 64 65 20 6f 66 20 6c 61 79 65 72 20 69 4c 61 79  de of layer iLay
1f060 65 72 2e 20 44 75 65 20 74 6f 20 74 68 65 20 70  er. Due to the p
1f070 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f  refix compressio
1f080 6e 2c 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  n, .    ** the s
1f090 70 61 63 65 20 72 65 71 75 69 72 65 64 20 63 68  pace required ch
1f0a0 61 6e 67 65 73 20 64 65 70 65 6e 64 69 6e 67 20  anges depending 
1f0b0 6f 6e 20 77 68 69 63 68 20 6e 6f 64 65 20 74 68  on which node th
1f0c0 65 20 6b 65 79 20 69 73 20 74 6f 0a 20 20 20 20  e key is to.    
1f0d0 2a 2a 20 62 65 20 61 64 64 65 64 20 74 6f 2e 20  ** be added to. 
1f0e0 20 2a 2f 0a 20 20 20 20 6e 50 72 65 66 69 78 20   */.    nPrefix 
1f0f0 3d 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70  = fts3PrefixComp
1f100 72 65 73 73 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e  ress(pNode->key.
1f110 61 2c 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 2c  a, pNode->key.n,
1f120 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   zTerm, nTerm);.
1f130 20 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54      nSuffix = nT
1f140 65 72 6d 20 2d 20 6e 50 72 65 66 69 78 3b 0a 20  erm - nPrefix;. 
1f150 20 20 20 6e 53 70 61 63 65 20 20 3d 20 73 71 6c     nSpace  = sql
1f160 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65  ite3Fts3VarintLe
1f170 6e 28 6e 50 72 65 66 69 78 29 3b 0a 20 20 20 20  n(nPrefix);.    
1f180 6e 53 70 61 63 65 20 2b 3d 20 73 71 6c 69 74 65  nSpace += sqlite
1f190 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e  3Fts3VarintLen(n
1f1a0 53 75 66 66 69 78 29 20 2b 20 6e 53 75 66 66 69  Suffix) + nSuffi
1f1b0 78 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 6f 64  x;..    if( pNod
1f1c0 65 2d 3e 6b 65 79 2e 6e 3d 3d 30 20 7c 7c 20 28  e->key.n==0 || (
1f1d0 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 20 2b  pNode->block.n +
1f1e0 20 6e 53 70 61 63 65 29 3c 3d 70 2d 3e 6e 4e 6f   nSpace)<=p->nNo
1f1f0 64 65 53 69 7a 65 20 29 7b 20 0a 20 20 20 20 20  deSize ){ .     
1f200 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65   /* If the curre
1f210 6e 74 20 6e 6f 64 65 20 6f 66 20 6c 61 79 65 72  nt node of layer
1f220 20 69 4c 61 79 65 72 20 63 6f 6e 74 61 69 6e 73   iLayer contains
1f230 20 7a 65 72 6f 20 6b 65 79 73 2c 20 6f 72 20 69   zero keys, or i
1f240 66 20 61 64 64 69 6e 67 0a 20 20 20 20 20 20 2a  f adding.      *
1f250 2a 20 74 68 65 20 6b 65 79 20 74 6f 20 69 74 20  * the key to it 
1f260 77 69 6c 6c 20 6e 6f 74 20 63 61 75 73 65 20 69  will not cause i
1f270 74 20 74 6f 20 67 72 6f 77 20 74 6f 20 6c 61 72  t to grow to lar
1f280 67 65 72 20 74 68 61 6e 20 6e 4e 6f 64 65 53 69  ger than nNodeSi
1f290 7a 65 20 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  ze .      ** byt
1f2a0 65 73 20 69 6e 20 73 69 7a 65 2c 20 77 72 69 74  es in size, writ
1f2b0 65 20 74 68 65 20 6b 65 79 20 68 65 72 65 2e 20  e the key here. 
1f2c0 20 2a 2f 0a 0a 20 20 20 20 20 20 42 6c 6f 62 20   */..      Blob 
1f2d0 2a 70 42 6c 6b 20 3d 20 26 70 4e 6f 64 65 2d 3e  *pBlk = &pNode->
1f2e0 62 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 69 66 28  block;.      if(
1f2f0 20 70 42 6c 6b 2d 3e 6e 3d 3d 30 20 29 7b 0a 20   pBlk->n==0 ){. 
1f300 20 20 20 20 20 20 20 62 6c 6f 62 47 72 6f 77 42         blobGrowB
1f310 75 66 66 65 72 28 70 42 6c 6b 2c 20 70 2d 3e 6e  uffer(pBlk, p->n
1f320 4e 6f 64 65 53 69 7a 65 2c 20 26 72 63 29 3b 0a  NodeSize, &rc);.
1f330 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1f340 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f350 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e 61 5b 30         pBlk->a[0
1f360 5d 20 3d 20 28 63 68 61 72 29 69 4c 61 79 65 72  ] = (char)iLayer
1f370 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c 6b  ;.          pBlk
1f380 2d 3e 6e 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ->n = 1 + sqlite
1f390 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26  3Fts3PutVarint(&
1f3a0 70 42 6c 6b 2d 3e 61 5b 31 5d 2c 20 69 50 74 72  pBlk->a[1], iPtr
1f3b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1f3c0 20 20 20 7d 0a 20 20 20 20 20 20 62 6c 6f 62 47     }.      blobG
1f3d0 72 6f 77 42 75 66 66 65 72 28 70 42 6c 6b 2c 20  rowBuffer(pBlk, 
1f3e0 70 42 6c 6b 2d 3e 6e 20 2b 20 6e 53 70 61 63 65  pBlk->n + nSpace
1f3f0 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 62 6c  , &rc);.      bl
1f400 6f 62 47 72 6f 77 42 75 66 66 65 72 28 26 70 4e  obGrowBuffer(&pN
1f410 6f 64 65 2d 3e 6b 65 79 2c 20 6e 54 65 72 6d 2c  ode->key, nTerm,
1f420 20 26 72 63 29 3b 0a 0a 20 20 20 20 20 20 69 66   &rc);..      if
1f430 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f440 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1f450 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 20 29 7b 0a 20  Node->key.n ){. 
1f460 20 20 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e 6e           pBlk->n
1f470 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50   += sqlite3Fts3P
1f480 75 74 56 61 72 69 6e 74 28 26 70 42 6c 6b 2d 3e  utVarint(&pBlk->
1f490 61 5b 70 42 6c 6b 2d 3e 6e 5d 2c 20 6e 50 72 65  a[pBlk->n], nPre
1f4a0 66 69 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  fix);.        }.
1f4b0 20 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e 6e 20          pBlk->n 
1f4c0 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75  += sqlite3Fts3Pu
1f4d0 74 56 61 72 69 6e 74 28 26 70 42 6c 6b 2d 3e 61  tVarint(&pBlk->a
1f4e0 5b 70 42 6c 6b 2d 3e 6e 5d 2c 20 6e 53 75 66 66  [pBlk->n], nSuff
1f4f0 69 78 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ix);.        mem
1f500 63 70 79 28 26 70 42 6c 6b 2d 3e 61 5b 70 42 6c  cpy(&pBlk->a[pBl
1f510 6b 2d 3e 6e 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50  k->n], &zTerm[nP
1f520 72 65 66 69 78 5d 2c 20 6e 53 75 66 66 69 78 29  refix], nSuffix)
1f530 3b 0a 20 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e  ;.        pBlk->
1f540 6e 20 2b 3d 20 6e 53 75 66 66 69 78 3b 0a 0a 20  n += nSuffix;.. 
1f550 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e         memcpy(pN
1f560 6f 64 65 2d 3e 6b 65 79 2e 61 2c 20 7a 54 65 72  ode->key.a, zTer
1f570 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20  m, nTerm);.     
1f580 20 20 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 20     pNode->key.n 
1f590 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = nTerm;.      }
1f5a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f5b0 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    /* Otherwise, 
1f5c0 66 6c 75 73 68 20 74 68 65 20 63 75 72 72 65 6e  flush the curren
1f5d0 74 20 6e 6f 64 65 20 6f 66 20 6c 61 79 65 72 20  t node of layer 
1f5e0 69 4c 61 79 65 72 20 74 6f 20 64 69 73 6b 2e 0a  iLayer to disk..
1f5f0 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 61 6c        ** Then al
1f600 6c 6f 63 61 74 65 20 61 20 6e 65 77 2c 20 65 6d  locate a new, em
1f610 70 74 79 20 73 69 62 6c 69 6e 67 20 6e 6f 64 65  pty sibling node
1f620 2e 20 54 68 65 20 6b 65 79 20 77 69 6c 6c 20 62  . The key will b
1f630 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20  e written.      
1f640 2a 2a 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ** into the pare
1f650 6e 74 20 6f 66 20 74 68 69 73 20 6e 6f 64 65 2e  nt of this node.
1f660 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 66   */.      rc = f
1f670 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28  ts3WriteSegment(
1f680 70 2c 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b  p, pNode->iBlock
1f690 2c 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61  , pNode->block.a
1f6a0 2c 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e  , pNode->block.n
1f6b0 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  );..      assert
1f6c0 28 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e  ( pNode->block.n
1f6d0 41 6c 6c 6f 63 3e 3d 70 2d 3e 6e 4e 6f 64 65 53  Alloc>=p->nNodeS
1f6e0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 70 4e 6f  ize );.      pNo
1f6f0 64 65 2d 3e 62 6c 6f 63 6b 2e 61 5b 30 5d 20 3d  de->block.a[0] =
1f700 20 28 63 68 61 72 29 69 4c 61 79 65 72 3b 0a 20   (char)iLayer;. 
1f710 20 20 20 20 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63       pNode->bloc
1f720 6b 2e 6e 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  k.n = 1 + sqlite
1f730 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26  3Fts3PutVarint(&
1f740 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 5b 31  pNode->block.a[1
1f750 5d 2c 20 69 50 74 72 2b 31 29 3b 0a 0a 20 20 20  ], iPtr+1);..   
1f760 20 20 20 69 4e 65 78 74 50 74 72 20 3d 20 70 4e     iNextPtr = pN
1f770 6f 64 65 2d 3e 69 42 6c 6f 63 6b 3b 0a 20 20 20  ode->iBlock;.   
1f780 20 20 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b     pNode->iBlock
1f790 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d  ++;.      pNode-
1f7a0 3e 6b 65 79 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  >key.n = 0;.    
1f7b0 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  }..    if( rc!=S
1f7c0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 4e 65 78  QLITE_OK || iNex
1f7d0 74 50 74 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  tPtr==0 ) return
1f7e0 20 72 63 3b 0a 20 20 20 20 69 50 74 72 20 3d 20   rc;.    iPtr = 
1f7f0 69 4e 65 78 74 50 74 72 3b 0a 20 20 7d 0a 0a 20  iNextPtr;.  }.. 
1f800 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20   assert( 0 );.  
1f810 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1f820 2a 2a 20 41 70 70 65 6e 64 20 61 20 74 65 72 6d  ** Append a term
1f830 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79   and (optionally
1f840 29 20 64 6f 63 6c 69 73 74 20 74 6f 20 74 68 65  ) doclist to the
1f850 20 46 54 53 20 73 65 67 6d 65 6e 74 20 6e 6f 64   FTS segment nod
1f860 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 73  e currently.** s
1f870 74 6f 72 65 64 20 69 6e 20 62 6c 6f 62 20 2a 70  tored in blob *p
1f880 4e 6f 64 65 2e 20 54 68 65 20 6e 6f 64 65 20 6e  Node. The node n
1f890 65 65 64 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  eed not contain 
1f8a0 61 6e 79 20 74 65 72 6d 73 2c 20 62 75 74 20 74  any terms, but t
1f8b0 68 65 0a 2a 2a 20 68 65 61 64 65 72 20 6d 75 73  he.** header mus
1f8c0 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 66  t be written bef
1f8d0 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
1f8e0 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
1f8f0 2a 2a 20 41 20 6e 6f 64 65 20 68 65 61 64 65 72  ** A node header
1f900 20 69 73 20 61 20 73 69 6e 67 6c 65 20 30 78 30   is a single 0x0
1f910 30 20 62 79 74 65 20 66 6f 72 20 61 20 6c 65 61  0 byte for a lea
1f920 66 20 6e 6f 64 65 2c 20 6f 72 20 61 20 68 65 69  f node, or a hei
1f930 67 68 74 20 76 61 72 69 6e 74 0a 2a 2a 20 66 6f  ght varint.** fo
1f940 6c 6c 6f 77 65 64 20 62 79 20 74 68 65 20 6c 65  llowed by the le
1f950 66 74 2d 68 61 6e 64 2d 63 68 69 6c 64 20 76 61  ft-hand-child va
1f960 72 69 6e 74 20 66 6f 72 20 61 6e 20 69 6e 74 65  rint for an inte
1f970 72 6e 61 6c 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rnal node..**.**
1f980 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   The term to be 
1f990 61 70 70 65 6e 64 65 64 20 69 73 20 70 61 73 73  appended is pass
1f9a0 65 64 20 76 69 61 20 61 72 67 75 6d 65 6e 74 73  ed via arguments
1f9b0 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 46 6f   zTerm/nTerm. Fo
1f9c0 72 20 61 20 0a 2a 2a 20 6c 65 61 66 20 6e 6f 64  r a .** leaf nod
1f9d0 65 2c 20 74 68 65 20 64 6f 63 6c 69 73 74 20 69  e, the doclist i
1f9e0 73 20 70 61 73 73 65 64 20 61 73 20 61 44 6f 63  s passed as aDoc
1f9f0 6c 69 73 74 2f 6e 44 6f 63 6c 69 73 74 2e 20 46  list/nDoclist. F
1fa00 6f 72 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a 2a  or an internal.*
1fa10 2a 20 6e 6f 64 65 2c 20 62 6f 74 68 20 61 44 6f  * node, both aDo
1fa20 63 6c 69 73 74 20 61 6e 64 20 6e 44 6f 63 6c 69  clist and nDocli
1fa30 73 74 20 6d 75 73 74 20 62 65 20 70 61 73 73 65  st must be passe
1fa40 64 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  d 0..**.** If th
1fa50 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 76 61  e size of the va
1fa60 6c 75 65 20 69 6e 20 62 6c 6f 62 20 70 50 72 65  lue in blob pPre
1fa70 76 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  v is zero, then 
1fa80 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1fa90 74 0a 2a 2a 20 74 65 72 6d 20 77 72 69 74 74 65  t.** term writte
1faa0 6e 20 74 6f 20 74 68 65 20 6e 6f 64 65 2e 20 4f  n to the node. O
1fab0 74 68 65 72 77 69 73 65 2c 20 70 50 72 65 76 20  therwise, pPrev 
1fac0 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 70 79 20  contains a copy 
1fad0 6f 66 20 74 68 65 20 0a 2a 2a 20 70 72 65 76 69  of the .** previ
1fae0 6f 75 73 20 74 65 72 6d 2e 20 42 65 66 6f 72 65  ous term. Before
1faf0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
1fb00 65 74 75 72 6e 73 2c 20 69 74 20 69 73 20 75 70  eturns, it is up
1fb10 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  dated to contain
1fb20 20 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 7a 54   a.** copy of zT
1fb30 65 72 6d 2f 6e 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a  erm/nTerm..**.**
1fb40 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
1fb50 68 61 74 20 74 68 65 20 62 75 66 66 65 72 20 61  hat the buffer a
1fb60 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
1fb70 4e 6f 64 65 20 69 73 20 61 6c 72 65 61 64 79 20  Node is already 
1fb80 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20  large.** enough 
1fb90 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74  to accommodate t
1fba0 68 65 20 6e 65 77 20 65 6e 74 72 79 2e 20 54 68  he new entry. Th
1fbb0 65 20 62 75 66 66 65 72 20 61 73 73 6f 63 69 61  e buffer associa
1fbc0 74 65 64 20 77 69 74 68 20 70 50 72 65 76 0a 2a  ted with pPrev.*
1fbd0 2a 20 69 73 20 65 78 74 65 6e 64 65 64 20 62 79  * is extended by
1fbe0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1fbf0 66 20 72 65 71 75 72 69 72 65 64 2e 0a 2a 2a 0a  f requrired..**.
1fc00 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 28  ** If an error (
1fc10 69 2e 65 2e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69  i.e. OOM conditi
1fc20 6f 6e 29 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  on) occurs, an S
1fc30 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1fc40 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
1fc50 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
1fc60 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
1fc70 20 69 6e 74 20 66 74 73 33 41 70 70 65 6e 64 54   int fts3AppendT
1fc80 6f 4e 6f 64 65 28 0a 20 20 42 6c 6f 62 20 2a 70  oNode(.  Blob *p
1fc90 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  Node,           
1fca0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
1fcb0 65 6e 74 20 6e 6f 64 65 20 69 6d 61 67 65 20 74  ent node image t
1fcc0 6f 20 61 70 70 65 6e 64 20 74 6f 20 2a 2f 0a 20  o append to */. 
1fcd0 20 42 6c 6f 62 20 2a 70 50 72 65 76 2c 20 20 20   Blob *pPrev,   
1fce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcf0 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
1fd00 69 6e 69 6e 67 20 70 72 65 76 69 6f 75 73 20 74  ining previous t
1fd10 65 72 6d 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  erm written */. 
1fd20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
1fd30 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
1fd40 20 2f 2a 20 4e 65 77 20 74 65 72 6d 20 74 6f 20   /* New term to 
1fd50 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  write */.  int n
1fd60 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
1fd70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1fd80 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62  ze of zTerm in b
1fd90 79 74 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ytes */.  const 
1fda0 63 68 61 72 20 2a 61 44 6f 63 6c 69 73 74 2c 20  char *aDoclist, 
1fdb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63            /* Doc
1fdc0 6c 69 73 74 20 28 6f 72 20 4e 55 4c 4c 29 20 74  list (or NULL) t
1fdd0 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74  o write */.  int
1fde0 20 6e 44 6f 63 6c 69 73 74 20 20 20 20 20 20 20   nDoclist       
1fdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fe00 53 69 7a 65 20 6f 66 20 61 44 6f 63 6c 69 73 74  Size of aDoclist
1fe10 20 69 6e 20 62 79 74 65 73 20 2a 2f 20 0a 29 7b   in bytes */ .){
1fe20 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1fe30 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
1fe40 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1fe50 65 20 2a 2f 0a 20 20 69 6e 74 20 62 46 69 72 73  e */.  int bFirs
1fe60 74 20 3d 20 28 70 50 72 65 76 2d 3e 6e 3d 3d 30  t = (pPrev->n==0
1fe70 29 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  );     /* True i
1fe80 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1fe90 72 73 74 20 74 65 72 6d 20 77 72 69 74 74 65 6e  rst term written
1fea0 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69   */.  int nPrefi
1feb0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
1fec0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1fed0 20 74 65 72 6d 20 70 72 65 66 69 78 20 69 6e 20   term prefix in 
1fee0 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  bytes */.  int n
1fef0 53 75 66 66 69 78 3b 20 20 20 20 20 20 20 20 20  Suffix;         
1ff00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1ff10 7a 65 20 6f 66 20 74 65 72 6d 20 73 75 66 66 69  ze of term suffi
1ff20 78 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20  x in bytes */.. 
1ff30 20 2f 2a 20 4e 6f 64 65 20 6d 75 73 74 20 68 61   /* Node must ha
1ff40 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
1ff50 73 74 61 72 74 65 64 2e 20 54 68 65 72 65 20 6d  started. There m
1ff60 75 73 74 20 62 65 20 61 20 64 6f 63 6c 69 73 74  ust be a doclist
1ff70 20 66 6f 72 20 61 0a 20 20 2a 2a 20 6c 65 61 66   for a.  ** leaf
1ff80 20 6e 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65   node, and there
1ff90 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 20 64   must not be a d
1ffa0 6f 63 6c 69 73 74 20 66 6f 72 20 61 6e 20 69 6e  oclist for an in
1ffb0 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 20 20 2a 2f  ternal node.  */
1ffc0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65  .  assert( pNode
1ffd0 2d 3e 6e 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ->n>0 );.  asser
1ffe0 74 28 20 28 70 4e 6f 64 65 2d 3e 61 5b 30 5d 3d  t( (pNode->a[0]=
1fff0 3d 27 5c 30 27 29 3d 3d 28 61 44 6f 63 6c 69 73  ='\0')==(aDoclis
20000 74 21 3d 30 29 20 29 3b 0a 0a 20 20 62 6c 6f 62  t!=0) );..  blob
20010 47 72 6f 77 42 75 66 66 65 72 28 70 50 72 65 76  GrowBuffer(pPrev
20020 2c 20 6e 54 65 72 6d 2c 20 26 72 63 29 3b 0a 20  , nTerm, &rc);. 
20030 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20040 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
20050 0a 20 20 6e 50 72 65 66 69 78 20 3d 20 66 74 73  .  nPrefix = fts
20060 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28  3PrefixCompress(
20070 70 50 72 65 76 2d 3e 61 2c 20 70 50 72 65 76 2d  pPrev->a, pPrev-
20080 3e 6e 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  >n, zTerm, nTerm
20090 29 3b 0a 20 20 6e 53 75 66 66 69 78 20 3d 20 6e  );.  nSuffix = n
200a0 54 65 72 6d 20 2d 20 6e 50 72 65 66 69 78 3b 0a  Term - nPrefix;.
200b0 20 20 6d 65 6d 63 70 79 28 70 50 72 65 76 2d 3e    memcpy(pPrev->
200c0 61 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29  a, zTerm, nTerm)
200d0 3b 0a 20 20 70 50 72 65 76 2d 3e 6e 20 3d 20 6e  ;.  pPrev->n = n
200e0 54 65 72 6d 3b 0a 0a 20 20 69 66 28 20 62 46 69  Term;..  if( bFi
200f0 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e  rst==0 ){.    pN
20100 6f 64 65 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65  ode->n += sqlite
20110 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26  3Fts3PutVarint(&
20120 70 4e 6f 64 65 2d 3e 61 5b 70 4e 6f 64 65 2d 3e  pNode->a[pNode->
20130 6e 5d 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20  n], nPrefix);.  
20140 7d 0a 20 20 70 4e 6f 64 65 2d 3e 6e 20 2b 3d 20  }.  pNode->n += 
20150 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
20160 72 69 6e 74 28 26 70 4e 6f 64 65 2d 3e 61 5b 70  rint(&pNode->a[p
20170 4e 6f 64 65 2d 3e 6e 5d 2c 20 6e 53 75 66 66 69  Node->n], nSuffi
20180 78 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 4e  x);.  memcpy(&pN
20190 6f 64 65 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d  ode->a[pNode->n]
201a0 2c 20 26 7a 54 65 72 6d 5b 6e 50 72 65 66 69 78  , &zTerm[nPrefix
201b0 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 70  ], nSuffix);.  p
201c0 4e 6f 64 65 2d 3e 6e 20 2b 3d 20 6e 53 75 66 66  Node->n += nSuff
201d0 69 78 3b 0a 0a 20 20 69 66 28 20 61 44 6f 63 6c  ix;..  if( aDocl
201e0 69 73 74 20 29 7b 0a 20 20 20 20 70 4e 6f 64 65  ist ){.    pNode
201f0 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ->n += sqlite3Ft
20200 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 4e 6f  s3PutVarint(&pNo
20210 64 65 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d 2c  de->a[pNode->n],
20220 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20   nDoclist);.    
20230 6d 65 6d 63 70 79 28 26 70 4e 6f 64 65 2d 3e 61  memcpy(&pNode->a
20240 5b 70 4e 6f 64 65 2d 3e 6e 5d 2c 20 61 44 6f 63  [pNode->n], aDoc
20250 6c 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b  list, nDoclist);
20260 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 6e 20 2b 3d  .    pNode->n +=
20270 20 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a 0a   nDoclist;.  }..
20280 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d    assert( pNode-
20290 3e 6e 3c 3d 70 4e 6f 64 65 2d 3e 6e 41 6c 6c 6f  >n<=pNode->nAllo
202a0 63 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  c );..  return S
202b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
202c0 2a 2a 20 41 70 70 65 6e 64 20 74 68 65 20 63 75  ** Append the cu
202d0 72 72 65 6e 74 20 74 65 72 6d 20 61 6e 64 20 64  rrent term and d
202e0 6f 63 6c 69 73 74 20 70 6f 69 6e 74 65 64 20 74  oclist pointed t
202f0 6f 20 62 79 20 63 75 72 73 6f 72 20 70 43 73 72  o by cursor pCsr
20300 20 74 6f 20 74 68 65 0a 2a 2a 20 61 70 70 65 6e   to the.** appen
20310 64 61 62 6c 65 20 62 2d 74 72 65 65 20 73 65 67  dable b-tree seg
20320 6d 65 6e 74 20 6f 70 65 6e 65 64 20 66 6f 72 20  ment opened for 
20330 77 72 69 74 69 6e 67 20 62 79 20 70 57 72 69 74  writing by pWrit
20340 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
20350 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
20360 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
20370 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
20380 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
20390 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49  static int fts3I
203a0 6e 63 72 6d 65 72 67 65 41 70 70 65 6e 64 28 0a  ncrmergeAppend(.
203b0 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
203c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203d0 20 20 2f 2a 20 46 74 73 33 20 74 61 62 6c 65 20    /* Fts3 table 
203e0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 49 6e 63 72  handle */.  Incr
203f0 6d 65 72 67 65 57 72 69 74 65 72 20 2a 70 57 72  mergeWriter *pWr
20400 69 74 65 72 2c 20 20 20 20 20 20 20 2f 2a 20 57  iter,       /* W
20410 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  riter object */.
20420 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65    Fts3MultiSegRe
20430 61 64 65 72 20 2a 70 43 73 72 20 20 20 20 20 20  ader *pCsr      
20440 20 20 2f 2a 20 43 75 72 73 6f 72 20 63 6f 6e 74    /* Cursor cont
20450 61 69 6e 69 6e 67 20 74 65 72 6d 20 61 6e 64 20  aining term and 
20460 64 6f 63 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20  doclist */.){.  
20470 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72  const char *zTer
20480 6d 20 3d 20 70 43 73 72 2d 3e 7a 54 65 72 6d 3b  m = pCsr->zTerm;
20490 0a 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70  .  int nTerm = p
204a0 43 73 72 2d 3e 6e 54 65 72 6d 3b 0a 20 20 63 6f  Csr->nTerm;.  co
204b0 6e 73 74 20 63 68 61 72 20 2a 61 44 6f 63 6c 69  nst char *aDocli
204c0 73 74 20 3d 20 70 43 73 72 2d 3e 61 44 6f 63 6c  st = pCsr->aDocl
204d0 69 73 74 3b 0a 20 20 69 6e 74 20 6e 44 6f 63 6c  ist;.  int nDocl
204e0 69 73 74 20 3d 20 70 43 73 72 2d 3e 6e 44 6f 63  ist = pCsr->nDoc
204f0 6c 69 73 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  list;.  int rc =
20500 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
20510 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
20520 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  code */.  int nS
20530 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
20540 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
20550 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20   space in bytes 
20560 72 65 71 75 69 72 65 64 20 6f 6e 20 6c 65 61 66  required on leaf
20570 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69   */.  int nPrefi
20580 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
20590 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70      /* Size of p
205a0 72 65 66 69 78 20 73 68 61 72 65 64 20 77 69 74  refix shared wit
205b0 68 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20  h previous term 
205c0 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 66 66 69 78  */.  int nSuffix
205d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
205e0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 75     /* Size of su
205f0 66 66 69 78 20 28 6e 54 65 72 6d 20 2d 20 6e 50  ffix (nTerm - nP
20600 72 65 66 69 78 29 20 2a 2f 0a 20 20 4e 6f 64 65  refix) */.  Node
20610 57 72 69 74 65 72 20 2a 70 4c 65 61 66 3b 20 20  Writer *pLeaf;  
20620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a            /* Obj
20630 65 63 74 20 75 73 65 64 20 74 6f 20 77 72 69 74  ect used to writ
20640 65 20 6c 65 61 66 20 6e 6f 64 65 73 20 2a 2f 0a  e leaf nodes */.
20650 0a 20 20 70 4c 65 61 66 20 3d 20 26 70 57 72 69  .  pLeaf = &pWri
20660 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72  ter->aNodeWriter
20670 5b 30 5d 3b 0a 20 20 6e 50 72 65 66 69 78 20 3d  [0];.  nPrefix =
20680 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72   fts3PrefixCompr
20690 65 73 73 28 70 4c 65 61 66 2d 3e 6b 65 79 2e 61  ess(pLeaf->key.a
206a0 2c 20 70 4c 65 61 66 2d 3e 6b 65 79 2e 6e 2c 20  , pLeaf->key.n, 
206b0 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  zTerm, nTerm);. 
206c0 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d   nSuffix = nTerm
206d0 20 2d 20 6e 50 72 65 66 69 78 3b 0a 0a 20 20 6e   - nPrefix;..  n
206e0 53 70 61 63 65 20 20 3d 20 73 71 6c 69 74 65 33  Space  = sqlite3
206f0 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 50  Fts3VarintLen(nP
20700 72 65 66 69 78 29 3b 0a 20 20 6e 53 70 61 63 65  refix);.  nSpace
20710 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56   += sqlite3Fts3V
20720 61 72 69 6e 74 4c 65 6e 28 6e 53 75 66 66 69 78  arintLen(nSuffix
20730 29 20 2b 20 6e 53 75 66 66 69 78 3b 0a 20 20 6e  ) + nSuffix;.  n
20740 53 70 61 63 65 20 2b 3d 20 73 71 6c 69 74 65 33  Space += sqlite3
20750 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 44  Fts3VarintLen(nD
20760 6f 63 6c 69 73 74 29 20 2b 20 6e 44 6f 63 6c 69  oclist) + nDocli
20770 73 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  st;..  /* If the
20780 20 63 75 72 72 65 6e 74 20 62 6c 6f 63 6b 20 69   current block i
20790 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 61 6e 64  s not empty, and
207a0 20 69 66 20 61 64 64 69 6e 67 20 74 68 69 73 20   if adding this 
207b0 74 65 72 6d 2f 64 6f 63 6c 69 73 74 0a 20 20 2a  term/doclist.  *
207c0 2a 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  * to the current
207d0 20 62 6c 6f 63 6b 20 77 6f 75 6c 64 20 6d 61 6b   block would mak
207e0 65 20 69 74 20 6c 61 72 67 65 72 20 74 68 61 6e  e it larger than
207f0 20 46 74 73 33 54 61 62 6c 65 2e 6e 4e 6f 64 65   Fts3Table.nNode
20800 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 2c  Size.  ** bytes,
20810 20 77 72 69 74 65 20 74 68 69 73 20 62 6c 6f 63   write this bloc
20820 6b 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  k out to the dat
20830 61 62 61 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20  abase. */.  if( 
20840 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 3e 30  pLeaf->block.n>0
20850 20 26 26 20 28 70 4c 65 61 66 2d 3e 62 6c 6f 63   && (pLeaf->bloc
20860 6b 2e 6e 20 2b 20 6e 53 70 61 63 65 29 3e 70 2d  k.n + nSpace)>p-
20870 3e 6e 4e 6f 64 65 53 69 7a 65 20 29 7b 0a 20 20  >nNodeSize ){.  
20880 20 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65    rc = fts3Write
20890 53 65 67 6d 65 6e 74 28 70 2c 20 70 4c 65 61 66  Segment(p, pLeaf
208a0 2d 3e 69 42 6c 6f 63 6b 2c 20 70 4c 65 61 66 2d  ->iBlock, pLeaf-
208b0 3e 62 6c 6f 63 6b 2e 61 2c 20 70 4c 65 61 66 2d  >block.a, pLeaf-
208c0 3e 62 6c 6f 63 6b 2e 6e 29 3b 0a 20 20 20 20 70  >block.n);.    p
208d0 57 72 69 74 65 72 2d 3e 6e 57 6f 72 6b 2b 2b 3b  Writer->nWork++;
208e0 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
208f0 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 74 6f   current term to
20900 20 74 68 65 20 70 61 72 65 6e 74 20 6e 6f 64 65   the parent node
20910 2e 20 54 68 65 20 74 65 72 6d 20 61 64 64 65 64  . The term added
20920 20 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   to the .    ** 
20930 70 61 72 65 6e 74 20 6d 75 73 74 3a 0a 20 20 20  parent must:.   
20940 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 61 29 20   **.    **   a) 
20950 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
20960 74 68 65 20 6c 61 72 67 65 73 74 20 74 65 72 6d  the largest term
20970 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 6e 6f 64   on the leaf nod
20980 65 20 6a 75 73 74 20 77 72 69 74 74 65 6e 0a 20  e just written. 
20990 20 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 74 68     **      to th
209a0 65 20 64 61 74 61 62 61 73 65 20 28 73 74 69 6c  e database (stil
209b0 6c 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70  l available in p
209c0 4c 65 61 66 2d 3e 6b 65 79 29 2c 20 61 6e 64 0a  Leaf->key), and.
209d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
209e0 62 29 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  b) be less than 
209f0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
20a00 74 65 72 6d 20 61 62 6f 75 74 20 74 6f 20 62 65  term about to be
20a10 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6e 65   added to the ne
20a20 77 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6c 65  w.    **      le
20a30 61 66 20 6e 6f 64 65 20 28 7a 54 65 72 6d 2f 6e  af node (zTerm/n
20a40 54 65 72 6d 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  Term)..    **.  
20a50 20 20 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f    ** In other wo
20a60 72 64 73 2c 20 69 74 20 6d 75 73 74 20 62 65 20  rds, it must be 
20a70 74 68 65 20 70 72 65 66 69 78 20 6f 66 20 7a 54  the prefix of zT
20a80 65 72 6d 20 31 20 62 79 74 65 20 6c 6f 6e 67 65  erm 1 byte longe
20a90 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68  r than.    ** th
20aa0 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20  e common prefix 
20ab0 28 69 66 20 61 6e 79 29 20 6f 66 20 7a 54 65 72  (if any) of zTer
20ac0 6d 20 61 6e 64 20 70 57 72 69 74 65 72 2d 3e 7a  m and pWriter->z
20ad0 54 65 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Term..    */.   
20ae0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20af0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
20b00 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 50 75   fts3IncrmergePu
20b10 73 68 28 70 2c 20 70 57 72 69 74 65 72 2c 20 7a  sh(p, pWriter, z
20b20 54 65 72 6d 2c 20 6e 50 72 65 66 69 78 2b 31 29  Term, nPrefix+1)
20b30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
20b40 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  Advance to the n
20b50 65 78 74 20 6f 75 74 70 75 74 20 62 6c 6f 63 6b  ext output block
20b60 20 2a 2f 0a 20 20 20 20 70 4c 65 61 66 2d 3e 69   */.    pLeaf->i
20b70 42 6c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 70 4c 65  Block++;.    pLe
20b80 61 66 2d 3e 6b 65 79 2e 6e 20 3d 20 30 3b 0a 20  af->key.n = 0;. 
20b90 20 20 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e     pLeaf->block.
20ba0 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 6e 53 75 66  n = 0;..    nSuf
20bb0 66 69 78 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20  fix = nTerm;.   
20bc0 20 6e 53 70 61 63 65 20 20 3d 20 31 3b 0a 20 20   nSpace  = 1;.  
20bd0 20 20 6e 53 70 61 63 65 20 2b 3d 20 73 71 6c 69    nSpace += sqli
20be0 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e  te3Fts3VarintLen
20bf0 28 6e 53 75 66 66 69 78 29 20 2b 20 6e 53 75 66  (nSuffix) + nSuf
20c00 66 69 78 3b 0a 20 20 20 20 6e 53 70 61 63 65 20  fix;.    nSpace 
20c10 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56 61  += sqlite3Fts3Va
20c20 72 69 6e 74 4c 65 6e 28 6e 44 6f 63 6c 69 73 74  rintLen(nDoclist
20c30 29 20 2b 20 6e 44 6f 63 6c 69 73 74 3b 0a 20 20  ) + nDoclist;.  
20c40 7d 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c  }..  pWriter->nL
20c50 65 61 66 44 61 74 61 20 2b 3d 20 6e 53 70 61 63  eafData += nSpac
20c60 65 3b 0a 20 20 62 6c 6f 62 47 72 6f 77 42 75 66  e;.  blobGrowBuf
20c70 66 65 72 28 26 70 4c 65 61 66 2d 3e 62 6c 6f 63  fer(&pLeaf->bloc
20c80 6b 2c 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e  k, pLeaf->block.
20c90 6e 20 2b 20 6e 53 70 61 63 65 2c 20 26 72 63 29  n + nSpace, &rc)
20ca0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
20cb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
20cc0 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 3d   pLeaf->block.n=
20cd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 61  =0 ){.      pLea
20ce0 66 2d 3e 62 6c 6f 63 6b 2e 6e 20 3d 20 31 3b 0a  f->block.n = 1;.
20cf0 20 20 20 20 20 20 70 4c 65 61 66 2d 3e 62 6c 6f        pLeaf->blo
20d00 63 6b 2e 61 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ck.a[0] = '\0';.
20d10 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 66      }.    rc = f
20d20 74 73 33 41 70 70 65 6e 64 54 6f 4e 6f 64 65 28  ts3AppendToNode(
20d30 0a 20 20 20 20 20 20 20 20 26 70 4c 65 61 66 2d  .        &pLeaf-
20d40 3e 62 6c 6f 63 6b 2c 20 26 70 4c 65 61 66 2d 3e  >block, &pLeaf->
20d50 6b 65 79 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  key, zTerm, nTer
20d60 6d 2c 20 61 44 6f 63 6c 69 73 74 2c 20 6e 44 6f  m, aDoclist, nDo
20d70 63 6c 69 73 74 0a 20 20 20 20 29 3b 0a 20 20 7d  clist.    );.  }
20d80 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
20d90 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20da0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
20db0 74 6f 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 64  to release all d
20dc0 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73  ynamic resources
20dd0 20 68 65 6c 64 20 62 79 20 74 68 65 0a 2a 2a 20   held by the.** 
20de0 6d 65 72 67 65 2d 77 72 69 74 65 72 20 6f 62 6a  merge-writer obj
20df0 65 63 74 20 70 57 72 69 74 65 72 2c 20 61 6e 64  ect pWriter, and
20e00 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 68 61 73   if no error has
20e10 20 6f 63 63 75 72 72 65 64 2c 20 74 6f 20 66 6c   occurred, to fl
20e20 75 73 68 0a 2a 2a 20 61 6c 6c 20 6f 75 74 73 74  ush.** all outst
20e30 61 6e 64 69 6e 67 20 6e 6f 64 65 20 62 75 66 66  anding node buff
20e40 65 72 73 20 68 65 6c 64 20 62 79 20 70 57 72 69  ers held by pWri
20e50 74 65 72 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ter to disk..**.
20e60 2a 2a 20 49 66 20 2a 70 52 63 20 69 73 20 6e 6f  ** If *pRc is no
20e70 74 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e  t SQLITE_OK when
20e80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
20e90 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 6e  s called, then n
20ea0 6f 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20  o attempt.** is 
20eb0 6d 61 64 65 20 74 6f 20 77 72 69 74 65 20 61 6e  made to write an
20ec0 79 20 64 61 74 61 20 74 6f 20 64 69 73 6b 2e 20  y data to disk. 
20ed0 49 6e 73 74 65 61 64 2c 20 74 68 69 73 20 66 75  Instead, this fu
20ee0 6e 63 74 69 6f 6e 20 73 65 72 76 65 73 20 6f 6e  nction serves on
20ef0 6c 79 0a 2a 2a 20 74 6f 20 72 65 6c 65 61 73 65  ly.** to release
20f00 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 73   outstanding res
20f10 6f 75 72 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74  ources..**.** Ot
20f20 68 65 72 77 69 73 65 2c 20 69 66 20 2a 70 52 63  herwise, if *pRc
20f30 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 53 51   is initially SQ
20f40 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 61 6e 20 65  LITE_OK and an e
20f50 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
20f60 65 0a 2a 2a 20 66 6c 75 73 68 69 6e 67 20 62 75  e.** flushing bu
20f70 66 66 65 72 73 20 74 6f 20 64 69 73 6b 2c 20 2a  ffers to disk, *
20f80 70 52 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e  pRc is set to an
20f90 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
20fa0 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74  de before.** ret
20fb0 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
20fc0 63 20 76 6f 69 64 20 66 74 73 33 49 6e 63 72 6d  c void fts3Incrm
20fd0 65 72 67 65 52 65 6c 65 61 73 65 28 0a 20 20 46  ergeRelease(.  F
20fe0 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
20ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21000 2a 20 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e  * FTS3 table han
21010 64 6c 65 20 2a 2f 0a 20 20 49 6e 63 72 6d 65 72  dle */.  Incrmer
21020 67 65 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  geWriter *pWrite
21030 72 2c 20 20 20 20 20 20 20 2f 2a 20 4d 65 72 67  r,       /* Merg
21040 65 2d 77 72 69 74 65 72 20 6f 62 6a 65 63 74 20  e-writer object 
21050 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20  */.  int *pRc   
21060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21070 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
21080 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 29 7b  Error code */.){
21090 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
210a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210b0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
210c0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6e 6f  erate through no
210d0 6e 2d 72 6f 6f 74 20 6c 61 79 65 72 73 20 2a 2f  n-root layers */
210e0 0a 20 20 69 6e 74 20 69 52 6f 6f 74 3b 20 20 20  .  int iRoot;   
210f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21100 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72     /* Index of r
21110 6f 6f 74 20 69 6e 20 70 57 72 69 74 65 72 2d 3e  oot in pWriter->
21120 61 4e 6f 64 65 57 72 69 74 65 72 20 2a 2f 0a 20  aNodeWriter */. 
21130 20 4e 6f 64 65 57 72 69 74 65 72 20 2a 70 52 6f   NodeWriter *pRo
21140 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ot;             
21150 20 2f 2a 20 4e 6f 64 65 57 72 69 74 65 72 20 66   /* NodeWriter f
21160 6f 72 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a  or root node */.
21170 20 20 69 6e 74 20 72 63 20 3d 20 2a 70 52 63 3b    int rc = *pRc;
21180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21190 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
211a0 2a 2f 0a 0a 20 20 2f 2a 20 53 65 74 20 69 52 6f  */..  /* Set iRo
211b0 6f 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ot to the index 
211c0 69 6e 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64  in pWriter->aNod
211d0 65 57 72 69 74 65 72 5b 5d 20 6f 66 20 74 68 65  eWriter[] of the
211e0 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20   output segment 
211f0 0a 20 20 2a 2a 20 72 6f 6f 74 20 6e 6f 64 65 2e  .  ** root node.
21200 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20   If the segment 
21210 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
21220 20 61 20 73 69 6e 67 6c 65 20 6c 65 61 66 20 6e   a single leaf n
21230 6f 64 65 2c 20 69 52 6f 6f 74 0a 20 20 2a 2a 20  ode, iRoot.  ** 
21240 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 30  will be set to 0
21250 2e 20 49 66 20 74 68 65 20 72 6f 6f 74 20 6e 6f  . If the root no
21260 64 65 20 69 73 20 74 68 65 20 70 61 72 65 6e 74  de is the parent
21270 20 6f 66 20 74 68 65 20 6c 65 61 76 65 73 2c 20   of the leaves, 
21280 69 52 6f 6f 74 0a 20 20 2a 2a 20 77 69 6c 6c 20  iRoot.  ** will 
21290 62 65 20 31 2e 20 41 6e 64 20 73 6f 20 6f 6e 2e  be 1. And so on.
212a0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 52 6f 6f 74    */.  for(iRoot
212b0 3d 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41  =FTS_MAX_APPENDA
212c0 42 4c 45 5f 48 45 49 47 48 54 2d 31 3b 20 69 52  BLE_HEIGHT-1; iR
212d0 6f 6f 74 3e 3d 30 3b 20 69 52 6f 6f 74 2d 2d 29  oot>=0; iRoot--)
212e0 7b 0a 20 20 20 20 4e 6f 64 65 57 72 69 74 65 72  {.    NodeWriter
212f0 20 2a 70 4e 6f 64 65 20 3d 20 26 70 57 72 69 74   *pNode = &pWrit
21300 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b  er->aNodeWriter[
21310 69 52 6f 6f 74 5d 3b 0a 20 20 20 20 69 66 28 20  iRoot];.    if( 
21320 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 3e 30  pNode->block.n>0
21330 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73   ) break;.    as
21340 73 65 72 74 28 20 2a 70 52 63 20 7c 7c 20 70 4e  sert( *pRc || pN
21350 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 41 6c 6c 6f  ode->block.nAllo
21360 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
21370 72 74 28 20 2a 70 52 63 20 7c 7c 20 70 4e 6f 64  rt( *pRc || pNod
21380 65 2d 3e 6b 65 79 2e 6e 41 6c 6c 6f 63 3d 3d 30  e->key.nAlloc==0
21390 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
213a0 66 72 65 65 28 70 4e 6f 64 65 2d 3e 62 6c 6f 63  free(pNode->bloc
213b0 6b 2e 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  k.a);.    sqlite
213c0 33 5f 66 72 65 65 28 70 4e 6f 64 65 2d 3e 6b 65  3_free(pNode->ke
213d0 79 2e 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  y.a);.  }..  /* 
213e0 45 6d 70 74 79 20 6f 75 74 70 75 74 20 73 65 67  Empty output seg
213f0 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61 20  ment. This is a 
21400 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20  no-op. */.  if( 
21410 69 52 6f 6f 74 3c 30 20 29 20 72 65 74 75 72 6e  iRoot<0 ) return
21420 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 6e 74 69  ;..  /* The enti
21430 72 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e  re output segmen
21440 74 20 66 69 74 73 20 6f 6e 20 61 20 73 69 6e 67  t fits on a sing
21450 6c 65 20 6e 6f 64 65 2e 20 4e 6f 72 6d 61 6c 6c  le node. Normall
21460 79 2c 20 74 68 69 73 20 6d 65 61 6e 73 0a 20 20  y, this means.  
21470 2a 2a 20 74 68 65 20 6e 6f 64 65 20 77 6f 75 6c  ** the node woul
21480 64 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61  d be stored as a
21490 20 62 6c 6f 62 20 69 6e 20 74 68 65 20 22 72 6f   blob in the "ro
214a0 6f 74 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ot" column of th
214b0 65 20 25 5f 73 65 67 64 69 72 0a 20 20 2a 2a 20  e %_segdir.  ** 
214c0 74 61 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20  table. However, 
214d0 74 68 69 73 20 69 73 20 6e 6f 74 20 70 65 72 6d  this is not perm
214e0 69 74 74 65 64 20 69 6e 20 74 68 69 73 20 63 61  itted in this ca
214f0 73 65 2e 20 54 68 65 20 70 72 6f 62 6c 65 6d 20  se. The problem 
21500 69 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 73 70  is that .  ** sp
21510 61 63 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ace has already 
21520 62 65 65 6e 20 72 65 73 65 72 76 65 64 20 69 6e  been reserved in
21530 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20   the %_segments 
21540 74 61 62 6c 65 2c 20 61 6e 64 20 73 6f 20 74 68  table, and so th
21550 65 20 0a 20 20 2a 2a 20 73 74 61 72 74 5f 62 6c  e .  ** start_bl
21560 6f 63 6b 20 61 6e 64 20 65 6e 64 5f 62 6c 6f 63  ock and end_bloc
21570 6b 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  k fields of the 
21580 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 20 6d  %_segdir table m
21590 75 73 74 20 62 65 20 70 6f 70 75 6c 61 74 65 64  ust be populated
215a0 2e 20 0a 20 20 2a 2a 20 41 6e 64 2c 20 62 79 20  . .  ** And, by 
215b0 64 65 73 69 67 6e 20 6f 72 20 62 79 20 61 63 63  design or by acc
215c0 69 64 65 6e 74 2c 20 72 65 6c 65 61 73 65 64 20  ident, released 
215d0 76 65 72 73 69 6f 6e 73 20 6f 66 20 46 54 53 20  versions of FTS 
215e0 63 61 6e 6e 6f 74 20 68 61 6e 64 6c 65 20 0a 20  cannot handle . 
215f0 20 2a 2a 20 73 65 67 6d 65 6e 74 73 20 74 68 61   ** segments tha
21600 74 20 66 69 74 20 65 6e 74 69 72 65 6c 79 20 6f  t fit entirely o
21610 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20  n the root node 
21620 77 69 74 68 20 73 74 61 72 74 5f 62 6c 6f 63 6b  with start_block
21630 21 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  !=0..  **.  ** I
21640 6e 73 74 65 61 64 2c 20 63 72 65 61 74 65 20 61  nstead, create a
21650 20 73 79 6e 74 68 65 74 69 63 20 72 6f 6f 74 20   synthetic root 
21660 6e 6f 64 65 20 74 68 61 74 20 63 6f 6e 74 61 69  node that contai
21670 6e 73 20 6e 6f 74 68 69 6e 67 20 62 75 74 20 61  ns nothing but a
21680 20 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74   .  ** pointer t
21690 6f 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6e  o the single con
216a0 74 65 6e 74 20 6e 6f 64 65 2e 20 53 6f 20 74 68  tent node. So th
216b0 61 74 20 74 68 65 20 73 65 67 6d 65 6e 74 20 63  at the segment c
216c0 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 20 20 2a  onsists of a.  *
216d0 2a 20 73 69 6e 67 6c 65 20 6c 65 61 66 20 61 6e  * single leaf an
216e0 64 20 61 20 73 69 6e 67 6c 65 20 69 6e 74 65 72  d a single inter
216f0 69 6f 72 20 28 72 6f 6f 74 29 20 6e 6f 64 65 2e  ior (root) node.
21700 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 64 6f 3a  .  **.  ** Todo:
21710 20 42 65 74 74 65 72 20 6d 69 67 68 74 20 62 65   Better might be
21720 20 74 6f 20 64 65 66 65 72 20 61 6c 6c 6f 63 61   to defer alloca
21730 74 69 6e 67 20 73 70 61 63 65 20 69 6e 20 74 68  ting space in th
21740 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 0a 20 20  e %_segments .  
21750 2a 2a 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 77  ** table until w
21760 65 20 61 72 65 20 73 75 72 65 20 69 74 20 69 73  e are sure it is
21770 20 6e 65 65 64 65 64 2e 0a 20 20 2a 2f 0a 20 20   needed..  */.  
21780 69 66 28 20 69 52 6f 6f 74 3d 3d 30 20 29 7b 0a  if( iRoot==0 ){.
21790 20 20 20 20 42 6c 6f 62 20 2a 70 42 6c 6f 63 6b      Blob *pBlock
217a0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 4e 6f   = &pWriter->aNo
217b0 64 65 57 72 69 74 65 72 5b 31 5d 2e 62 6c 6f 63  deWriter[1].bloc
217c0 6b 3b 0a 20 20 20 20 62 6c 6f 62 47 72 6f 77 42  k;.    blobGrowB
217d0 75 66 66 65 72 28 70 42 6c 6f 63 6b 2c 20 31 20  uffer(pBlock, 1 
217e0 2b 20 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41  + FTS3_VARINT_MA
217f0 58 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  X, &rc);.    if(
21800 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21810 7b 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b 2d 3e  {.      pBlock->
21820 61 5b 30 5d 20 3d 20 30 78 30 31 3b 0a 20 20 20  a[0] = 0x01;.   
21830 20 20 20 70 42 6c 6f 63 6b 2d 3e 6e 20 3d 20 31     pBlock->n = 1
21840 20 2b 20 73 71 6c 69 74 65 33 46 74 73 33 50 75   + sqlite3Fts3Pu
21850 74 56 61 72 69 6e 74 28 0a 20 20 20 20 20 20 20  tVarint(.       
21860 20 20 20 26 70 42 6c 6f 63 6b 2d 3e 61 5b 31 5d     &pBlock->a[1]
21870 2c 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65  , pWriter->aNode
21880 57 72 69 74 65 72 5b 30 5d 2e 69 42 6c 6f 63 6b  Writer[0].iBlock
21890 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
218a0 20 20 20 20 69 52 6f 6f 74 20 3d 20 31 3b 0a 20      iRoot = 1;. 
218b0 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 26 70 57   }.  pRoot = &pW
218c0 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74  riter->aNodeWrit
218d0 65 72 5b 69 52 6f 6f 74 5d 3b 0a 0a 20 20 2f 2a  er[iRoot];..  /*
218e0 20 46 6c 75 73 68 20 61 6c 6c 20 63 75 72 72 65   Flush all curre
218f0 6e 74 6c 79 20 6f 75 74 73 74 61 6e 64 69 6e 67  ntly outstanding
21900 20 6e 6f 64 65 73 20 74 6f 20 64 69 73 6b 2e 20   nodes to disk. 
21910 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
21920 69 52 6f 6f 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  iRoot; i++){.   
21930 20 4e 6f 64 65 57 72 69 74 65 72 20 2a 70 4e 6f   NodeWriter *pNo
21940 64 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  de = &pWriter->a
21950 4e 6f 64 65 57 72 69 74 65 72 5b 69 5d 3b 0a 20  NodeWriter[i];. 
21960 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 62 6c     if( pNode->bl
21970 6f 63 6b 2e 6e 3e 30 20 26 26 20 72 63 3d 3d 53  ock.n>0 && rc==S
21980 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21990 20 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65    rc = fts3Write
219a0 53 65 67 6d 65 6e 74 28 70 2c 20 70 4e 6f 64 65  Segment(p, pNode
219b0 2d 3e 69 42 6c 6f 63 6b 2c 20 70 4e 6f 64 65 2d  ->iBlock, pNode-
219c0 3e 62 6c 6f 63 6b 2e 61 2c 20 70 4e 6f 64 65 2d  >block.a, pNode-
219d0 3e 62 6c 6f 63 6b 2e 6e 29 3b 0a 20 20 20 20 7d  >block.n);.    }
219e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
219f0 65 28 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61  e(pNode->block.a
21a00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
21a10 72 65 65 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e 61  ree(pNode->key.a
21a20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69  );.  }..  /* Wri
21a30 74 65 20 74 68 65 20 25 5f 73 65 67 64 69 72 20  te the %_segdir 
21a40 72 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 69 66 28  record. */.  if(
21a50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21a60 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 57  {.    rc = fts3W
21a70 72 69 74 65 53 65 67 64 69 72 28 70 2c 20 0a 20  riteSegdir(p, . 
21a80 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e         pWriter->
21a90 69 41 62 73 4c 65 76 65 6c 2b 31 2c 20 20 20 20  iAbsLevel+1,    
21aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 65             /* le
21ab0 76 65 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  vel */.        p
21ac0 57 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 20 20  Writer->iIdx,   
21ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ae0 20 20 20 2f 2a 20 69 64 78 20 2a 2f 0a 20 20 20     /* idx */.   
21af0 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 53       pWriter->iS
21b00 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 20 20  tart,           
21b10 20 20 20 20 20 20 20 20 20 2f 2a 20 73 74 61 72           /* star
21b20 74 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  t_block */.     
21b30 20 20 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64     pWriter->aNod
21b40 65 57 72 69 74 65 72 5b 30 5d 2e 69 42 6c 6f 63  eWriter[0].iBloc
21b50 6b 2c 20 20 20 20 20 2f 2a 20 6c 65 61 76 65 73  k,     /* leaves
21b60 5f 65 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20  _end_block */.  
21b70 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69        pWriter->i
21b80 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  End,            
21b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 65 6e 64            /* end
21ba0 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  _block */.      
21bb0 20 20 28 70 57 72 69 74 65 72 2d 3e 62 4e 6f 4c    (pWriter->bNoL
21bc0 65 61 66 44 61 74 61 3d 3d 30 20 3f 20 70 57 72  eafData==0 ? pWr
21bd0 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61 74 61 20  iter->nLeafData 
21be0 3a 20 30 29 2c 20 20 20 2f 2a 20 65 6e 64 5f 62  : 0),   /* end_b
21bf0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
21c00 70 52 6f 6f 74 2d 3e 62 6c 6f 63 6b 2e 61 2c 20  pRoot->block.a, 
21c10 70 52 6f 6f 74 2d 3e 62 6c 6f 63 6b 2e 6e 20 20  pRoot->block.n  
21c20 20 20 20 20 2f 2a 20 72 6f 6f 74 20 2a 2f 0a 20      /* root */. 
21c30 20 20 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69     );.  }.  sqli
21c40 74 65 33 5f 66 72 65 65 28 70 52 6f 6f 74 2d 3e  te3_free(pRoot->
21c50 62 6c 6f 63 6b 2e 61 29 3b 0a 20 20 73 71 6c 69  block.a);.  sqli
21c60 74 65 33 5f 66 72 65 65 28 70 52 6f 6f 74 2d 3e  te3_free(pRoot->
21c70 6b 65 79 2e 61 29 3b 0a 0a 20 20 2a 70 52 63 20  key.a);..  *pRc 
21c80 3d 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  = rc;.}../*.** C
21c90 6f 6d 70 61 72 65 20 74 68 65 20 74 65 72 6d 20  ompare the term 
21ca0 69 6e 20 62 75 66 66 65 72 20 7a 4c 68 73 20 28  in buffer zLhs (
21cb0 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6e 4c  size in bytes nL
21cc0 68 73 29 20 77 69 74 68 20 74 68 61 74 20 69 6e  hs) with that in
21cd0 0a 2a 2a 20 7a 52 68 73 20 28 73 69 7a 65 20 69  .** zRhs (size i
21ce0 6e 20 62 79 74 65 73 20 6e 52 68 73 29 20 75 73  n bytes nRhs) us
21cf0 69 6e 67 20 6d 65 6d 63 6d 70 2e 20 49 66 20 6f  ing memcmp. If o
21d00 6e 65 20 74 65 72 6d 20 69 73 20 61 20 70 72 65  ne term is a pre
21d10 66 69 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6f 74  fix of.** the ot
21d20 68 65 72 2c 20 69 74 20 69 73 20 63 6f 6e 73 69  her, it is consi
21d30 64 65 72 65 64 20 74 6f 20 62 65 20 73 6d 61 6c  dered to be smal
21d40 6c 65 72 20 74 68 61 6e 20 74 68 65 20 6f 74 68  ler than the oth
21d50 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
21d60 20 2d 76 65 20 69 66 20 7a 4c 68 73 20 69 73 20   -ve if zLhs is 
21d70 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 7a 52 68  smaller than zRh
21d80 73 2c 20 30 20 69 66 20 69 74 20 69 73 20 65 71  s, 0 if it is eq
21d90 75 61 6c 2c 20 6f 72 20 2b 76 65 0a 2a 2a 20 69  ual, or +ve.** i
21da0 66 20 69 74 20 69 73 20 67 72 65 61 74 65 72 2e  f it is greater.
21db0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
21dc0 74 73 33 54 65 72 6d 43 6d 70 28 0a 20 20 63 6f  ts3TermCmp(.  co
21dd0 6e 73 74 20 63 68 61 72 20 2a 7a 4c 68 73 2c 20  nst char *zLhs, 
21de0 69 6e 74 20 6e 4c 68 73 2c 20 20 20 20 20 2f 2a  int nLhs,     /*
21df0 20 4c 48 53 20 6f 66 20 63 6f 6d 70 61 72 69 73   LHS of comparis
21e00 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
21e10 61 72 20 2a 7a 52 68 73 2c 20 69 6e 74 20 6e 52  ar *zRhs, int nR
21e20 68 73 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f  hs      /* RHS o
21e30 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a  f comparison */.
21e40 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20  ){.  int nCmp = 
21e50 4d 49 4e 28 6e 4c 68 73 2c 20 6e 52 68 73 29 3b  MIN(nLhs, nRhs);
21e60 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 72  .  int res;..  r
21e70 65 73 20 3d 20 6d 65 6d 63 6d 70 28 7a 4c 68 73  es = memcmp(zLhs
21e80 2c 20 7a 52 68 73 2c 20 6e 43 6d 70 29 3b 0a 20  , zRhs, nCmp);. 
21e90 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65   if( res==0 ) re
21ea0 73 20 3d 20 6e 4c 68 73 20 2d 20 6e 52 68 73 3b  s = nLhs - nRhs;
21eb0 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ..  return res;.
21ec0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20  }.../*.** Query 
21ed0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 65 6e  to see if the en
21ee0 74 72 79 20 69 6e 20 74 68 65 20 25 5f 73 65 67  try in the %_seg
21ef0 6d 65 6e 74 73 20 74 61 62 6c 65 20 77 69 74 68  ments table with
21f00 20 62 6c 6f 63 6b 69 64 20 69 45 6e 64 20 69 73   blockid iEnd is
21f10 20 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66 20 6e 6f   .** NULL. If no
21f20 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e   error occurs an
21f30 64 20 74 68 65 20 65 6e 74 72 79 20 69 73 20 4e  d the entry is N
21f40 55 4c 4c 2c 20 73 65 74 20 2a 70 62 52 65 73 20  ULL, set *pbRes 
21f50 31 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75  1 before.** retu
21f60 72 6e 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65  rning. Otherwise
21f70 2c 20 73 65 74 20 2a 70 62 52 65 73 20 74 6f 20  , set *pbRes to 
21f80 30 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  0. .**.** Or, if
21f90 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
21fa0 20 77 68 69 6c 65 20 71 75 65 72 79 69 6e 67 20   while querying 
21fb0 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 72 65  the database, re
21fc0 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 0a  turn an SQLite .
21fd0 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54  ** error code. T
21fe0 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f  he final value o
21ff0 66 20 2a 70 62 52 65 73 20 69 73 20 75 6e 64 65  f *pbRes is unde
22000 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  fined in this ca
22010 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  se..**.** This i
22020 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 69  s used to test i
22030 66 20 61 20 73 65 67 6d 65 6e 74 20 69 73 20 61  f a segment is a
22040 6e 20 22 61 70 70 65 6e 64 61 62 6c 65 22 20 73  n "appendable" s
22050 65 67 6d 65 6e 74 2e 20 49 66 20 69 74 0a 2a 2a  egment. If it.**
22060 20 69 73 2c 20 74 68 65 6e 20 61 20 4e 55 4c 4c   is, then a NULL
22070 20 65 6e 74 72 79 20 68 61 73 20 62 65 65 6e 20   entry has been 
22080 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
22090 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62  e %_segments tab
220a0 6c 65 0a 2a 2a 20 77 69 74 68 20 62 6c 6f 63 6b  le.** with block
220b0 69 64 20 25 5f 73 65 67 64 69 72 2e 65 6e 64 5f  id %_segdir.end_
220c0 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  block..*/.static
220d0 20 69 6e 74 20 66 74 73 33 49 73 41 70 70 65 6e   int fts3IsAppen
220e0 64 61 62 6c 65 28 46 74 73 33 54 61 62 6c 65 20  dable(Fts3Table 
220f0 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  *p, sqlite3_int6
22100 34 20 69 45 6e 64 2c 20 69 6e 74 20 2a 70 62 52  4 iEnd, int *pbR
22110 65 73 29 7b 0a 20 20 69 6e 74 20 62 52 65 73 20  es){.  int bRes 
22120 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
22130 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
22140 20 74 6f 20 73 65 74 20 2a 70 62 52 65 73 20 74   to set *pbRes t
22150 6f 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  o */.  sqlite3_s
22160 74 6d 74 20 2a 70 43 68 65 63 6b 20 3d 20 30 3b  tmt *pCheck = 0;
22170 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d         /* Statem
22180 65 6e 74 20 74 6f 20 71 75 65 72 79 20 64 61 74  ent to query dat
22190 61 62 61 73 65 20 77 69 74 68 20 2a 2f 0a 20 20  abase with */.  
221a0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
221b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221c0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
221d0 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71  /..  rc = fts3Sq
221e0 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 47  lStmt(p, SQL_SEG
221f0 4d 45 4e 54 5f 49 53 5f 41 50 50 45 4e 44 41 42  MENT_IS_APPENDAB
22200 4c 45 2c 20 26 70 43 68 65 63 6b 2c 20 30 29 3b  LE, &pCheck, 0);
22210 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
22220 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
22230 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
22240 43 68 65 63 6b 2c 20 31 2c 20 69 45 6e 64 29 3b  Check, 1, iEnd);
22250 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
22260 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
22270 70 28 70 43 68 65 63 6b 29 20 29 20 62 52 65 73  p(pCheck) ) bRes
22280 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 1;.    rc = s
22290 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 43 68  qlite3_reset(pCh
222a0 65 63 6b 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2a  eck);.  }.  .  *
222b0 70 62 52 65 73 20 3d 20 62 52 65 73 3b 0a 20 20  pbRes = bRes;.  
222c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
222d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
222e0 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
222f0 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 6e   initializing an
22300 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65 72   incremental-mer
22310 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  ge operation..**
22320 20 49 74 20 63 68 65 63 6b 73 20 69 66 20 74 68   It checks if th
22330 65 20 65 78 69 73 74 69 6e 67 20 73 65 67 6d 65  e existing segme
22340 6e 74 20 77 69 74 68 20 69 6e 64 65 78 20 76 61  nt with index va
22350 6c 75 65 20 69 49 64 78 20 61 74 20 61 62 73 6f  lue iIdx at abso
22360 6c 75 74 65 20 6c 65 76 65 6c 20 0a 2a 2a 20 28  lute level .** (
22370 69 41 62 73 4c 65 76 65 6c 2b 31 29 20 63 61 6e  iAbsLevel+1) can
22380 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20   be appended to 
22390 62 79 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74  by the increment
223a0 61 6c 20 6d 65 72 67 65 2e 20 49 66 20 69 74 20  al merge. If it 
223b0 63 61 6e 2c 20 74 68 65 0a 2a 2a 20 6d 65 72 67  can, the.** merg
223c0 65 2d 77 72 69 74 65 72 20 6f 62 6a 65 63 74 20  e-writer object 
223d0 2a 70 57 72 69 74 65 72 20 69 73 20 69 6e 69 74  *pWriter is init
223e0 69 61 6c 69 7a 65 64 20 74 6f 20 77 72 69 74 65  ialized to write
223f0 20 74 6f 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 41 6e   to it..**.** An
22400 20 65 78 69 73 74 69 6e 67 20 73 65 67 6d 65 6e   existing segmen
22410 74 20 63 61 6e 20 62 65 20 61 70 70 65 6e 64 65  t can be appende
22420 64 20 74 6f 20 62 79 20 61 6e 20 69 6e 63 72 65  d to by an incre
22430 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 69 66 3a  mental merge if:
22440 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 74 20 77 61  .**.**   * It wa
22450 73 20 69 6e 69 74 69 61 6c 6c 79 20 63 72 65 61  s initially crea
22460 74 65 64 20 61 73 20 61 6e 20 61 70 70 65 6e 64  ted as an append
22470 61 62 6c 65 20 73 65 67 6d 65 6e 74 20 28 77 69  able segment (wi
22480 74 68 20 61 6c 6c 20 72 65 71 75 69 72 65 64 0a  th all required.
22490 2a 2a 20 20 20 20 20 73 70 61 63 65 20 70 72 65  **     space pre
224a0 2d 61 6c 6c 6f 63 61 74 65 64 29 2c 20 61 6e 64  -allocated), and
224b0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66  .**.**   * The f
224c0 69 72 73 74 20 6b 65 79 20 72 65 61 64 20 66 72  irst key read fr
224d0 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 28 61 72  om the input (ar
224e0 67 75 6d 65 6e 74 73 20 7a 4b 65 79 20 61 6e 64  guments zKey and
224f0 20 6e 4b 65 79 29 20 69 73 20 0a 2a 2a 20 20 20   nKey) is .**   
22500 20 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74    greater than t
22510 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 63  he largest key c
22520 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
22530 69 6e 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c  in the potential
22540 0a 2a 2a 20 20 20 20 20 6f 75 74 70 75 74 20 73  .**     output s
22550 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  egment..*/.stati
22560 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72 6d 65  c int fts3Incrme
22570 72 67 65 4c 6f 61 64 28 0a 20 20 46 74 73 33 54  rgeLoad(.  Fts3T
22580 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
22590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74             /* Ft
225a0 73 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  s3 table handle 
225b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
225c0 36 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20  64 iAbsLevel,   
225d0 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65       /* Absolute
225e0 20 6c 65 76 65 6c 20 6f 66 20 69 6e 70 75 74 20   level of input 
225f0 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e  segments */.  in
22600 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20 20  t iIdx,         
22610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22620 20 49 6e 64 65 78 20 6f 66 20 63 61 6e 64 69 64   Index of candid
22630 61 74 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65  ate output segme
22640 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nt */.  const ch
22650 61 72 20 2a 7a 4b 65 79 2c 20 20 20 20 20 20 20  ar *zKey,       
22660 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
22670 20 6b 65 79 20 74 6f 20 77 72 69 74 65 20 2a 2f   key to write */
22680 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20  .  int nKey,    
22690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
226b0 62 79 74 65 73 20 69 6e 20 6e 4b 65 79 20 2a 2f  bytes in nKey */
226c0 0a 20 20 49 6e 63 72 6d 65 72 67 65 57 72 69 74  .  IncrmergeWrit
226d0 65 72 20 2a 70 57 72 69 74 65 72 20 20 20 20 20  er *pWriter     
226e0 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
226f0 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  his object */.){
22700 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
22710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22720 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
22730 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
22740 74 6d 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 30  tmt *pSelect = 0
22750 3b 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54  ;      /* SELECT
22760 20 74 6f 20 72 65 61 64 20 25 5f 73 65 67 64 69   to read %_segdi
22770 72 20 65 6e 74 72 79 20 2a 2f 0a 0a 20 20 72 63  r entry */..  rc
22780 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
22790 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 45 47  , SQL_SELECT_SEG
227a0 44 49 52 2c 20 26 70 53 65 6c 65 63 74 2c 20 30  DIR, &pSelect, 0
227b0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
227c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
227d0 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 53 74 61  lite3_int64 iSta
227e0 72 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 56  rt = 0;     /* V
227f0 61 6c 75 65 20 6f 66 20 25 5f 73 65 67 64 69 72  alue of %_segdir
22800 2e 73 74 61 72 74 5f 62 6c 6f 63 6b 20 2a 2f 0a  .start_block */.
22810 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
22820 34 20 69 4c 65 61 66 45 6e 64 20 3d 20 30 3b 20  4 iLeafEnd = 0; 
22830 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 25 5f    /* Value of %_
22840 73 65 67 64 69 72 2e 6c 65 61 76 65 73 5f 65 6e  segdir.leaves_en
22850 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 73  d_block */.    s
22860 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e  qlite3_int64 iEn
22870 64 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  d = 0;       /* 
22880 56 61 6c 75 65 20 6f 66 20 25 5f 73 65 67 64 69  Value of %_segdi
22890 72 2e 65 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20  r.end_block */. 
228a0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61     const char *a
228b0 52 6f 6f 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Root = 0;       
228c0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 25   /* Pointer to %
228d0 5f 73 65 67 64 69 72 2e 72 6f 6f 74 20 62 75 66  _segdir.root buf
228e0 66 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  fer */.    int n
228f0 52 6f 6f 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Root = 0;       
22900 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
22910 20 6f 66 20 61 52 6f 6f 74 5b 5d 20 69 6e 20 62   of aRoot[] in b
22920 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ytes */.    int 
22930 72 63 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  rc2;            
22940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
22950 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 71  urn code from sq
22960 6c 69 74 65 33 5f 72 65 73 65 74 28 29 20 2a 2f  lite3_reset() */
22970 0a 20 20 20 20 69 6e 74 20 62 41 70 70 65 6e 64  .    int bAppend
22980 61 62 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20  able = 0;       
22990 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75     /* Set to tru
229a0 65 20 69 66 20 73 65 67 6d 65 6e 74 20 69 73 20  e if segment is 
229b0 61 70 70 65 6e 64 61 62 6c 65 20 2a 2f 0a 0a 20  appendable */.. 
229c0 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 25     /* Read the %
229d0 5f 73 65 67 64 69 72 20 65 6e 74 72 79 20 66 6f  _segdir entry fo
229e0 72 20 69 6e 64 65 78 20 69 49 64 78 20 61 62 73  r index iIdx abs
229f0 6f 6c 75 74 65 20 6c 65 76 65 6c 20 28 69 41 62  olute level (iAb
22a00 73 4c 65 76 65 6c 2b 31 29 20 2a 2f 0a 20 20 20  sLevel+1) */.   
22a10 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
22a20 74 36 34 28 70 53 65 6c 65 63 74 2c 20 31 2c 20  t64(pSelect, 1, 
22a30 69 41 62 73 4c 65 76 65 6c 2b 31 29 3b 0a 20 20  iAbsLevel+1);.  
22a40 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
22a50 6e 74 28 70 53 65 6c 65 63 74 2c 20 32 2c 20 69  nt(pSelect, 2, i
22a60 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 73 71  Idx);.    if( sq
22a70 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65  lite3_step(pSele
22a80 63 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  ct)==SQLITE_ROW 
22a90 29 7b 0a 20 20 20 20 20 20 69 53 74 61 72 74 20  ){.      iStart 
22aa0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
22ab0 5f 69 6e 74 36 34 28 70 53 65 6c 65 63 74 2c 20  _int64(pSelect, 
22ac0 31 29 3b 0a 20 20 20 20 20 20 69 4c 65 61 66 45  1);.      iLeafE
22ad0 6e 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  nd = sqlite3_col
22ae0 75 6d 6e 5f 69 6e 74 36 34 28 70 53 65 6c 65 63  umn_int64(pSelec
22af0 74 2c 20 32 29 3b 0a 20 20 20 20 20 20 66 74 73  t, 2);.      fts
22b00 33 52 65 61 64 45 6e 64 42 6c 6f 63 6b 46 69 65  3ReadEndBlockFie
22b10 6c 64 28 70 53 65 6c 65 63 74 2c 20 33 2c 20 26  ld(pSelect, 3, &
22b20 69 45 6e 64 2c 20 26 70 57 72 69 74 65 72 2d 3e  iEnd, &pWriter->
22b30 6e 4c 65 61 66 44 61 74 61 29 3b 0a 20 20 20 20  nLeafData);.    
22b40 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 6e    if( pWriter->n
22b50 4c 65 61 66 44 61 74 61 3c 30 20 29 7b 0a 20 20  LeafData<0 ){.  
22b60 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e        pWriter->n
22b70 4c 65 61 66 44 61 74 61 20 3d 20 70 57 72 69 74  LeafData = pWrit
22b80 65 72 2d 3e 6e 4c 65 61 66 44 61 74 61 20 2a 20  er->nLeafData * 
22b90 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
22ba0 20 20 70 57 72 69 74 65 72 2d 3e 62 4e 6f 4c 65    pWriter->bNoLe
22bb0 61 66 44 61 74 61 20 3d 20 28 70 57 72 69 74 65  afData = (pWrite
22bc0 72 2d 3e 6e 4c 65 61 66 44 61 74 61 3d 3d 30 29  r->nLeafData==0)
22bd0 3b 0a 20 20 20 20 20 20 6e 52 6f 6f 74 20 3d 20  ;.      nRoot = 
22be0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
22bf0 79 74 65 73 28 70 53 65 6c 65 63 74 2c 20 34 29  ytes(pSelect, 4)
22c00 3b 0a 20 20 20 20 20 20 61 52 6f 6f 74 20 3d 20  ;.      aRoot = 
22c10 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
22c20 6c 6f 62 28 70 53 65 6c 65 63 74 2c 20 34 29 3b  lob(pSelect, 4);
22c30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22c40 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
22c50 5f 72 65 73 65 74 28 70 53 65 6c 65 63 74 29 3b  _reset(pSelect);
22c60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
22c70 68 65 63 6b 20 66 6f 72 20 74 68 65 20 7a 65 72  heck for the zer
22c80 6f 2d 6c 65 6e 67 74 68 20 6d 61 72 6b 65 72 20  o-length marker 
22c90 69 6e 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74  in the %_segment
22ca0 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 72  s table */.    r
22cb0 63 20 3d 20 66 74 73 33 49 73 41 70 70 65 6e 64  c = fts3IsAppend
22cc0 61 62 6c 65 28 70 2c 20 69 45 6e 64 2c 20 26 62  able(p, iEnd, &b
22cd0 41 70 70 65 6e 64 61 62 6c 65 29 3b 0a 0a 20 20  Appendable);..  
22ce0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
22cf0 7a 4b 65 79 2f 6e 4b 65 79 20 69 73 20 6c 61 72  zKey/nKey is lar
22d00 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72  ger than the lar
22d10 67 65 73 74 20 6b 65 79 20 74 68 65 20 63 61 6e  gest key the can
22d20 64 69 64 61 74 65 20 2a 2f 0a 20 20 20 20 69 66  didate */.    if
22d30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22d40 26 26 20 62 41 70 70 65 6e 64 61 62 6c 65 20 29  && bAppendable )
22d50 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 61 4c  {.      char *aL
22d60 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  eaf = 0;.      i
22d70 6e 74 20 6e 4c 65 61 66 20 3d 20 30 3b 0a 0a 20  nt nLeaf = 0;.. 
22d80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22d90 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28 70  3Fts3ReadBlock(p
22da0 2c 20 69 4c 65 61 66 45 6e 64 2c 20 26 61 4c 65  , iLeafEnd, &aLe
22db0 61 66 2c 20 26 6e 4c 65 61 66 2c 20 30 29 3b 0a  af, &nLeaf, 0);.
22dc0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
22dd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22de0 20 20 20 4e 6f 64 65 52 65 61 64 65 72 20 72 65     NodeReader re
22df0 61 64 65 72 3b 0a 20 20 20 20 20 20 20 20 66 6f  ader;.        fo
22e00 72 28 72 63 20 3d 20 6e 6f 64 65 52 65 61 64 65  r(rc = nodeReade
22e10 72 49 6e 69 74 28 26 72 65 61 64 65 72 2c 20 61  rInit(&reader, a
22e20 4c 65 61 66 2c 20 6e 4c 65 61 66 29 3b 0a 20 20  Leaf, nLeaf);.  
22e30 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51            rc==SQ
22e40 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 61 64 65  LITE_OK && reade
22e50 72 2e 61 4e 6f 64 65 3b 0a 20 20 20 20 20 20 20  r.aNode;.       
22e60 20 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 52 65       rc = nodeRe
22e70 61 64 65 72 4e 65 78 74 28 26 72 65 61 64 65 72  aderNext(&reader
22e80 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
22e90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
22ea0 65 61 64 65 72 2e 61 4e 6f 64 65 20 29 3b 0a 20  eader.aNode );. 
22eb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22ec0 20 69 66 28 20 66 74 73 33 54 65 72 6d 43 6d 70   if( fts3TermCmp
22ed0 28 7a 4b 65 79 2c 20 6e 4b 65 79 2c 20 72 65 61  (zKey, nKey, rea
22ee0 64 65 72 2e 74 65 72 6d 2e 61 2c 20 72 65 61 64  der.term.a, read
22ef0 65 72 2e 74 65 72 6d 2e 6e 29 3c 3d 30 20 29 7b  er.term.n)<=0 ){
22f00 0a 20 20 20 20 20 20 20 20 20 20 62 41 70 70 65  .          bAppe
22f10 6e 64 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  ndable = 0;.    
22f20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 6f      }.        no
22f30 64 65 52 65 61 64 65 72 52 65 6c 65 61 73 65 28  deReaderRelease(
22f40 26 72 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20  &reader);.      
22f50 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
22f60 66 72 65 65 28 61 4c 65 61 66 29 3b 0a 20 20 20  free(aLeaf);.   
22f70 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
22f80 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 41 70  SQLITE_OK && bAp
22f90 70 65 6e 64 61 62 6c 65 20 29 7b 0a 20 20 20 20  pendable ){.    
22fa0 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69    /* It is possi
22fb0 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 74 6f  ble to append to
22fc0 20 74 68 69 73 20 73 65 67 6d 65 6e 74 2e 20 53   this segment. S
22fd0 65 74 20 75 70 20 74 68 65 20 49 6e 63 72 6d 65  et up the Incrme
22fe0 72 67 65 57 72 69 74 65 72 0a 20 20 20 20 20 20  rgeWriter.      
22ff0 2a 2a 20 6f 62 6a 65 63 74 20 74 6f 20 64 6f 20  ** object to do 
23000 73 6f 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e  so.  */.      in
23010 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  t i;.      int n
23020 48 65 69 67 68 74 20 3d 20 28 69 6e 74 29 61 52  Height = (int)aR
23030 6f 6f 74 5b 30 5d 3b 0a 20 20 20 20 20 20 4e 6f  oot[0];.      No
23040 64 65 57 72 69 74 65 72 20 2a 70 4e 6f 64 65 3b  deWriter *pNode;
23050 0a 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d  ..      pWriter-
23060 3e 6e 4c 65 61 66 45 73 74 20 3d 20 28 69 6e 74  >nLeafEst = (int
23070 29 28 28 69 45 6e 64 20 2d 20 69 53 74 61 72 74  )((iEnd - iStart
23080 29 20 2b 20 31 29 2f 46 54 53 5f 4d 41 58 5f 41  ) + 1)/FTS_MAX_A
23090 50 50 45 4e 44 41 42 4c 45 5f 48 45 49 47 48 54  PPENDABLE_HEIGHT
230a0 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d  ;.      pWriter-
230b0 3e 69 53 74 61 72 74 20 3d 20 69 53 74 61 72 74  >iStart = iStart
230c0 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d  ;.      pWriter-
230d0 3e 69 45 6e 64 20 3d 20 69 45 6e 64 3b 0a 20 20  >iEnd = iEnd;.  
230e0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 41 62      pWriter->iAb
230f0 73 4c 65 76 65 6c 20 3d 20 69 41 62 73 4c 65 76  sLevel = iAbsLev
23100 65 6c 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65  el;.      pWrite
23110 72 2d 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a  r->iIdx = iIdx;.
23120 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 6e 48 65  .      for(i=nHe
23130 69 67 68 74 2b 31 3b 20 69 3c 46 54 53 5f 4d 41  ight+1; i<FTS_MA
23140 58 5f 41 50 50 45 4e 44 41 42 4c 45 5f 48 45 49  X_APPENDABLE_HEI
23150 47 48 54 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  GHT; i++){.     
23160 20 20 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64     pWriter->aNod
23170 65 57 72 69 74 65 72 5b 69 5d 2e 69 42 6c 6f 63  eWriter[i].iBloc
23180 6b 20 3d 20 70 57 72 69 74 65 72 2d 3e 69 53 74  k = pWriter->iSt
23190 61 72 74 20 2b 20 69 2a 70 57 72 69 74 65 72 2d  art + i*pWriter-
231a0 3e 6e 4c 65 61 66 45 73 74 3b 0a 20 20 20 20 20  >nLeafEst;.     
231b0 20 7d 0a 0a 20 20 20 20 20 20 70 4e 6f 64 65 20   }..      pNode 
231c0 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64  = &pWriter->aNod
231d0 65 57 72 69 74 65 72 5b 6e 48 65 69 67 68 74 5d  eWriter[nHeight]
231e0 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 69  ;.      pNode->i
231f0 42 6c 6f 63 6b 20 3d 20 70 57 72 69 74 65 72 2d  Block = pWriter-
23200 3e 69 53 74 61 72 74 20 2b 20 70 57 72 69 74 65  >iStart + pWrite
23210 72 2d 3e 6e 4c 65 61 66 45 73 74 2a 6e 48 65 69  r->nLeafEst*nHei
23220 67 68 74 3b 0a 20 20 20 20 20 20 62 6c 6f 62 47  ght;.      blobG
23230 72 6f 77 42 75 66 66 65 72 28 26 70 4e 6f 64 65  rowBuffer(&pNode
23240 2d 3e 62 6c 6f 63 6b 2c 20 4d 41 58 28 6e 52 6f  ->block, MAX(nRo
23250 6f 74 2c 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65  ot, p->nNodeSize
23260 29 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69  ), &rc);.      i
23270 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23280 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
23290 70 79 28 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e  py(pNode->block.
232a0 61 2c 20 61 52 6f 6f 74 2c 20 6e 52 6f 6f 74 29  a, aRoot, nRoot)
232b0 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d  ;.        pNode-
232c0 3e 62 6c 6f 63 6b 2e 6e 20 3d 20 6e 52 6f 6f 74  >block.n = nRoot
232d0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
232e0 20 66 6f 72 28 69 3d 6e 48 65 69 67 68 74 3b 20   for(i=nHeight; 
232f0 69 3e 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49  i>=0 && rc==SQLI
23300 54 45 5f 4f 4b 3b 20 69 2d 2d 29 7b 0a 20 20 20  TE_OK; i--){.   
23310 20 20 20 20 20 4e 6f 64 65 52 65 61 64 65 72 20       NodeReader 
23320 72 65 61 64 65 72 3b 0a 20 20 20 20 20 20 20 20  reader;.        
23330 70 4e 6f 64 65 20 3d 20 26 70 57 72 69 74 65 72  pNode = &pWriter
23340 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 69 5d  ->aNodeWriter[i]
23350 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ;..        rc = 
23360 6e 6f 64 65 52 65 61 64 65 72 49 6e 69 74 28 26  nodeReaderInit(&
23370 72 65 61 64 65 72 2c 20 70 4e 6f 64 65 2d 3e 62  reader, pNode->b
23380 6c 6f 63 6b 2e 61 2c 20 70 4e 6f 64 65 2d 3e 62  lock.a, pNode->b
23390 6c 6f 63 6b 2e 6e 29 3b 0a 20 20 20 20 20 20 20  lock.n);.       
233a0 20 77 68 69 6c 65 28 20 72 65 61 64 65 72 2e 61   while( reader.a
233b0 4e 6f 64 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  Node && rc==SQLI
233c0 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 6e 6f 64  TE_OK ) rc = nod
233d0 65 52 65 61 64 65 72 4e 65 78 74 28 26 72 65 61  eReaderNext(&rea
233e0 64 65 72 29 3b 0a 20 20 20 20 20 20 20 20 62 6c  der);.        bl
233f0 6f 62 47 72 6f 77 42 75 66 66 65 72 28 26 70 4e  obGrowBuffer(&pN
23400 6f 64 65 2d 3e 6b 65 79 2c 20 72 65 61 64 65 72  ode->key, reader
23410 2e 74 65 72 6d 2e 6e 2c 20 26 72 63 29 3b 0a 20  .term.n, &rc);. 
23420 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
23430 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23440 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 6f        memcpy(pNo
23450 64 65 2d 3e 6b 65 79 2e 61 2c 20 72 65 61 64 65  de->key.a, reade
23460 72 2e 74 65 72 6d 2e 61 2c 20 72 65 61 64 65 72  r.term.a, reader
23470 2e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20  .term.n);.      
23480 20 20 20 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e      pNode->key.n
23490 20 3d 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 6e   = reader.term.n
234a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
234b0 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  i>0 ){.         
234c0 20 20 20 63 68 61 72 20 2a 61 42 6c 6f 63 6b 20     char *aBlock 
234d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
234e0 20 69 6e 74 20 6e 42 6c 6f 63 6b 20 3d 20 30 3b   int nBlock = 0;
234f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 6f  .            pNo
23500 64 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  de = &pWriter->a
23510 4e 6f 64 65 57 72 69 74 65 72 5b 69 2d 31 5d 3b  NodeWriter[i-1];
23520 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 6f  .            pNo
23530 64 65 2d 3e 69 42 6c 6f 63 6b 20 3d 20 72 65 61  de->iBlock = rea
23540 64 65 72 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20  der.iChild;.    
23550 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
23560 69 74 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63  ite3Fts3ReadBloc
23570 6b 28 70 2c 20 72 65 61 64 65 72 2e 69 43 68 69  k(p, reader.iChi
23580 6c 64 2c 20 26 61 42 6c 6f 63 6b 2c 20 26 6e 42  ld, &aBlock, &nB
23590 6c 6f 63 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  lock, 0);.      
235a0 20 20 20 20 20 20 62 6c 6f 62 47 72 6f 77 42 75        blobGrowBu
235b0 66 66 65 72 28 26 70 4e 6f 64 65 2d 3e 62 6c 6f  ffer(&pNode->blo
235c0 63 6b 2c 20 4d 41 58 28 6e 42 6c 6f 63 6b 2c 20  ck, MAX(nBlock, 
235d0 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 29 2c 20 26  p->nNodeSize), &
235e0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rc);.           
235f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23600 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
23610 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 6f 64 65      memcpy(pNode
23620 2d 3e 62 6c 6f 63 6b 2e 61 2c 20 61 42 6c 6f 63  ->block.a, aBloc
23630 6b 2c 20 6e 42 6c 6f 63 6b 29 3b 0a 20 20 20 20  k, nBlock);.    
23640 20 20 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d            pNode-
23650 3e 62 6c 6f 63 6b 2e 6e 20 3d 20 6e 42 6c 6f 63  >block.n = nBloc
23660 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
23670 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
23680 69 74 65 33 5f 66 72 65 65 28 61 42 6c 6f 63 6b  ite3_free(aBlock
23690 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
236a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
236b0 20 6e 6f 64 65 52 65 61 64 65 72 52 65 6c 65 61   nodeReaderRelea
236c0 73 65 28 26 72 65 61 64 65 72 29 3b 0a 20 20 20  se(&reader);.   
236d0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
236e0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  rc2 = sqlite3_re
236f0 73 65 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  set(pSelect);.  
23700 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
23710 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
23720 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
23730 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  ;.}../*.** Deter
23740 6d 69 6e 65 20 74 68 65 20 6c 61 72 67 65 73 74  mine the largest
23750 20 73 65 67 6d 65 6e 74 20 69 6e 64 65 78 20 76   segment index v
23760 61 6c 75 65 20 74 68 61 74 20 65 78 69 73 74 73  alue that exists
23770 20 77 69 74 68 69 6e 20 61 62 73 6f 6c 75 74 65   within absolute
23780 0a 2a 2a 20 6c 65 76 65 6c 20 69 41 62 73 4c 65  .** level iAbsLe
23790 76 65 6c 2b 31 2e 20 49 66 20 6e 6f 20 65 72 72  vel+1. If no err
237a0 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a  or occurs, set *
237b0 70 69 49 64 78 20 74 6f 20 74 68 69 73 20 76 61  piIdx to this va
237c0 6c 75 65 20 70 6c 75 73 0a 2a 2a 20 6f 6e 65 20  lue plus.** one 
237d0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
237e0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 72 2c 20   SQLITE_OK. Or, 
237f0 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
23800 73 65 67 6d 65 6e 74 73 20 61 74 20 61 6c 6c 20  segments at all 
23810 0a 2a 2a 20 77 69 74 68 69 6e 20 6c 65 76 65 6c  .** within level
23820 20 69 41 62 73 4c 65 76 65 6c 2c 20 73 65 74 20   iAbsLevel, set 
23830 2a 70 69 49 64 78 20 74 6f 20 7a 65 72 6f 2e 0a  *piIdx to zero..
23840 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
23850 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
23860 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
23870 20 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c   code. The final
23880 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 2a 70 69   value of.** *pi
23890 49 64 78 20 69 73 20 75 6e 64 65 66 69 6e 65 64  Idx is undefined
238a0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
238b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
238c0 33 49 6e 63 72 6d 65 72 67 65 4f 75 74 70 75 74  3IncrmergeOutput
238d0 49 64 78 28 20 0a 20 20 46 74 73 33 54 61 62 6c  Idx( .  Fts3Tabl
238e0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
238f0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20 54          /* FTS T
23900 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
23910 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
23920 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  AbsLevel,       
23930 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 69 6e 64   /* Absolute ind
23940 65 78 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d  ex of input segm
23950 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ents */.  int *p
23960 69 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20  iIdx            
23970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
23980 3a 20 4e 65 78 74 20 66 72 65 65 20 69 6e 64 65  : Next free inde
23990 78 20 61 74 20 69 41 62 73 4c 65 76 65 6c 2b 31  x at iAbsLevel+1
239a0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
239b0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
239c0 2a 70 4f 75 74 70 75 74 49 64 78 20 3d 20 30 3b  *pOutputIdx = 0;
239d0 20 20 20 2f 2a 20 53 51 4c 20 75 73 65 64 20 74     /* SQL used t
239e0 6f 20 66 69 6e 64 20 6f 75 74 70 75 74 20 69 6e  o find output in
239f0 64 65 78 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66  dex */..  rc = f
23a00 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51  ts3SqlStmt(p, SQ
23a10 4c 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54 5f 49  L_NEXT_SEGMENT_I
23a20 4e 44 45 58 2c 20 26 70 4f 75 74 70 75 74 49 64  NDEX, &pOutputId
23a30 78 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  x, 0);.  if( rc=
23a40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23a50 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
23a60 6e 74 36 34 28 70 4f 75 74 70 75 74 49 64 78 2c  nt64(pOutputIdx,
23a70 20 31 2c 20 69 41 62 73 4c 65 76 65 6c 2b 31 29   1, iAbsLevel+1)
23a80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
23a90 65 70 28 70 4f 75 74 70 75 74 49 64 78 29 3b 0a  ep(pOutputIdx);.
23aa0 20 20 20 20 2a 70 69 49 64 78 20 3d 20 73 71 6c      *piIdx = sql
23ab0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
23ac0 70 4f 75 74 70 75 74 49 64 78 2c 20 30 29 3b 0a  pOutputIdx, 0);.
23ad0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23ae0 5f 72 65 73 65 74 28 70 4f 75 74 70 75 74 49 64  _reset(pOutputId
23af0 78 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  x);.  }..  retur
23b00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  n rc;.}../* .** 
23b10 41 6c 6c 6f 63 61 74 65 20 61 6e 20 61 70 70 65  Allocate an appe
23b20 6e 64 61 62 6c 65 20 6f 75 74 70 75 74 20 73 65  ndable output se
23b30 67 6d 65 6e 74 20 6f 6e 20 61 62 73 6f 6c 75 74  gment on absolut
23b40 65 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65  e level iAbsLeve
23b50 6c 2b 31 0a 2a 2a 20 77 69 74 68 20 69 64 78 20  l+1.** with idx 
23b60 76 61 6c 75 65 20 69 49 64 78 2e 0a 2a 2a 0a 2a  value iIdx..**.*
23b70 2a 20 49 6e 20 74 68 65 20 25 5f 73 65 67 64 69  * In the %_segdi
23b80 72 20 74 61 62 6c 65 2c 20 61 20 73 65 67 6d 65  r table, a segme
23b90 6e 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  nt is defined by
23ba0 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20 74   the values in t
23bb0 68 72 65 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 3a  hree.** columns:
23bc0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 74 61 72 74  .**.**     start
23bd0 5f 62 6c 6f 63 6b 0a 2a 2a 20 20 20 20 20 6c 65  _block.**     le
23be0 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 0a 2a  aves_end_block.*
23bf0 2a 20 20 20 20 20 65 6e 64 5f 62 6c 6f 63 6b 0a  *     end_block.
23c00 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 70  **.** When an ap
23c10 70 65 6e 64 61 62 6c 65 20 73 65 67 6d 65 6e 74  pendable segment
23c20 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69   is allocated, i
23c30 74 20 69 73 20 65 73 74 69 6d 61 74 65 64 20 74  t is estimated t
23c40 68 61 74 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d  hat the.** maxim
23c50 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61  um number of lea
23c60 66 20 62 6c 6f 63 6b 73 20 74 68 61 74 20 6d 61  f blocks that ma
23c70 79 20 62 65 20 72 65 71 75 69 72 65 64 20 69 73  y be required is
23c80 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 0a   the sum of the.
23c90 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61  ** number of lea
23ca0 66 20 62 6c 6f 63 6b 73 20 63 6f 6e 73 75 6d 65  f blocks consume
23cb0 64 20 62 79 20 74 68 65 20 69 6e 70 75 74 20 73  d by the input s
23cc0 65 67 6d 65 6e 74 73 2c 20 70 6c 75 73 20 74 68  egments, plus th
23cd0 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 69  e number.** of i
23ce0 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 2c 20 6d  nput segments, m
23cf0 75 6c 74 69 70 6c 69 65 64 20 62 79 20 74 77 6f  ultiplied by two
23d00 2e 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20  . This value is 
23d10 73 74 6f 72 65 64 20 69 6e 20 73 74 61 63 6b 20  stored in stack 
23d20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 4c 65  .** variable nLe
23d30 61 66 45 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  afEst..**.** A t
23d40 6f 74 61 6c 20 6f 66 20 31 36 2a 6e 4c 65 61 66  otal of 16*nLeaf
23d50 45 73 74 20 62 6c 6f 63 6b 73 20 61 72 65 20 61  Est blocks are a
23d60 6c 6c 6f 63 61 74 65 64 20 77 68 65 6e 20 61 6e  llocated when an
23d70 20 61 70 70 65 6e 64 61 62 6c 65 20 73 65 67 6d   appendable segm
23d80 65 6e 74 0a 2a 2a 20 69 73 20 63 72 65 61 74 65  ent.** is create
23d90 64 20 28 28 31 20 2b 20 65 6e 64 5f 62 6c 6f 63  d ((1 + end_bloc
23da0 6b 20 2d 20 73 74 61 72 74 5f 62 6c 6f 63 6b 29  k - start_block)
23db0 3d 3d 31 36 2a 6e 4c 65 61 66 45 73 74 29 2e 20  ==16*nLeafEst). 
23dc0 54 68 65 20 63 6f 6e 74 69 67 75 6f 75 73 0a 2a  The contiguous.*
23dd0 2a 20 61 72 72 61 79 20 6f 66 20 6c 65 61 66 20  * array of leaf 
23de0 6e 6f 64 65 73 20 73 74 61 72 74 73 20 61 74 20  nodes starts at 
23df0 74 68 65 20 66 69 72 73 74 20 62 6c 6f 63 6b 20  the first block 
23e00 61 6c 6c 6f 63 61 74 65 64 2e 20 54 68 65 20 61  allocated. The a
23e10 72 72 61 79 0a 2a 2a 20 6f 66 20 69 6e 74 65 72  rray.** of inter
23e20 69 6f 72 20 6e 6f 64 65 73 20 74 68 61 74 20 61  ior nodes that a
23e30 72 65 20 70 61 72 65 6e 74 73 20 6f 66 20 74 68  re parents of th
23e40 65 20 6c 65 61 66 20 6e 6f 64 65 73 20 73 74 61  e leaf nodes sta
23e50 72 74 20 61 74 20 62 6c 6f 63 6b 0a 2a 2a 20 28  rt at block.** (
23e60 73 74 61 72 74 5f 62 6c 6f 63 6b 20 2b 20 28 31  start_block + (1
23e70 20 2b 20 65 6e 64 5f 62 6c 6f 63 6b 20 2d 20 73   + end_block - s
23e80 74 61 72 74 5f 62 6c 6f 63 6b 29 20 2f 20 31 36  tart_block) / 16
23e90 29 2e 20 41 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a  ). And so on..**
23ea0 0a 2a 2a 20 49 6e 20 74 68 65 20 61 63 74 75 61  .** In the actua
23eb0 6c 20 63 6f 64 65 20 62 65 6c 6f 77 2c 20 74 68  l code below, th
23ec0 65 20 76 61 6c 75 65 20 22 31 36 22 20 69 73 20  e value "16" is 
23ed0 72 65 70 6c 61 63 65 64 20 77 69 74 68 20 74 68  replaced with th
23ee0 65 20 0a 2a 2a 20 70 72 65 2d 70 72 6f 63 65 73  e .** pre-proces
23ef0 73 6f 72 20 6d 61 63 72 6f 20 46 54 53 5f 4d 41  sor macro FTS_MA
23f00 58 5f 41 50 50 45 4e 44 41 42 4c 45 5f 48 45 49  X_APPENDABLE_HEI
23f10 47 48 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  GHT..*/.static i
23f20 6e 74 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65  nt fts3Incrmerge
23f30 57 72 69 74 65 72 28 20 0a 20 20 46 74 73 33 54  Writer( .  Fts3T
23f40 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
23f50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74             /* Ft
23f60 73 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  s3 table handle 
23f70 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
23f80 36 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20  64 iAbsLevel,   
23f90 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65       /* Absolute
23fa0 20 6c 65 76 65 6c 20 6f 66 20 69 6e 70 75 74 20   level of input 
23fb0 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e  segments */.  in
23fc0 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20 20  t iIdx,         
23fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23fe0 20 49 6e 64 65 78 20 6f 66 20 6e 65 77 20 6f 75   Index of new ou
23ff0 74 70 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  tput segment */.
24000 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65    Fts3MultiSegRe
24010 61 64 65 72 20 2a 70 43 73 72 2c 20 20 20 20 20  ader *pCsr,     
24020 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 68 61 74    /* Cursor that
24030 20 64 61 74 61 20 77 69 6c 6c 20 62 65 20 72 65   data will be re
24040 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 49 6e 63  ad from */.  Inc
24050 72 6d 65 72 67 65 57 72 69 74 65 72 20 2a 70 57  rmergeWriter *pW
24060 72 69 74 65 72 20 20 20 20 20 20 20 20 2f 2a 20  riter        /* 
24070 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 6f 62  Populate this ob
24080 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ject */.){.  int
24090 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
240a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
240b0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
240c0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
240d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240e0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
240f0 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  iable */.  int n
24100 4c 65 61 66 45 73 74 20 3d 20 30 3b 20 20 20 20  LeafEst = 0;    
24110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c             /* Bl
24120 6f 63 6b 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  ocks allocated f
24130 6f 72 20 6c 65 61 66 20 6e 6f 64 65 73 20 2a 2f  or leaf nodes */
24140 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
24150 2a 70 4c 65 61 66 45 73 74 20 3d 20 30 3b 20 20  *pLeafEst = 0;  
24160 20 20 20 2f 2a 20 53 51 4c 20 75 73 65 64 20 74     /* SQL used t
24170 6f 20 64 65 74 65 72 6d 69 6e 65 20 6e 4c 65 61  o determine nLea
24180 66 45 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  fEst */.  sqlite
24190 33 5f 73 74 6d 74 20 2a 70 46 69 72 73 74 42 6c  3_stmt *pFirstBl
241a0 6f 63 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 51 4c  ock = 0;  /* SQL
241b0 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
241c0 6e 65 20 66 69 72 73 74 20 62 6c 6f 63 6b 20 2a  ne first block *
241d0 2f 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74  /..  /* Calculat
241e0 65 20 6e 4c 65 61 66 45 73 74 2e 20 2a 2f 0a 20  e nLeafEst. */. 
241f0 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
24200 74 28 70 2c 20 53 51 4c 5f 4d 41 58 5f 4c 45 41  t(p, SQL_MAX_LEA
24210 46 5f 4e 4f 44 45 5f 45 53 54 49 4d 41 54 45 2c  F_NODE_ESTIMATE,
24220 20 26 70 4c 65 61 66 45 73 74 2c 20 30 29 3b 0a   &pLeafEst, 0);.
24230 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24240 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
24250 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 4c  e3_bind_int64(pL
24260 65 61 66 45 73 74 2c 20 31 2c 20 69 41 62 73 4c  eafEst, 1, iAbsL
24270 65 76 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  evel);.    sqlit
24280 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 4c  e3_bind_int64(pL
24290 65 61 66 45 73 74 2c 20 32 2c 20 70 43 73 72 2d  eafEst, 2, pCsr-
242a0 3e 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20  >nSegment);.    
242b0 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
242c0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 4c 65  sqlite3_step(pLe
242d0 61 66 45 73 74 29 20 29 7b 0a 20 20 20 20 20 20  afEst) ){.      
242e0 6e 4c 65 61 66 45 73 74 20 3d 20 73 71 6c 69 74  nLeafEst = sqlit
242f0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 4c  e3_column_int(pL
24300 65 61 66 45 73 74 2c 20 30 29 3b 0a 20 20 20 20  eafEst, 0);.    
24310 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
24320 65 33 5f 72 65 73 65 74 28 70 4c 65 61 66 45 73  e3_reset(pLeafEs
24330 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  t);.  }.  if( rc
24340 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
24350 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 43  turn rc;..  /* C
24360 61 6c 63 75 6c 61 74 65 20 74 68 65 20 66 69 72  alculate the fir
24370 73 74 20 62 6c 6f 63 6b 20 74 6f 20 75 73 65 20  st block to use 
24380 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 65  in the output se
24390 67 6d 65 6e 74 20 2a 2f 0a 20 20 72 63 20 3d 20  gment */.  rc = 
243a0 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
243b0 51 4c 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54 53  QL_NEXT_SEGMENTS
243c0 5f 49 44 2c 20 26 70 46 69 72 73 74 42 6c 6f 63  _ID, &pFirstBloc
243d0 6b 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  k, 0);.  if( rc=
243e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
243f0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
24400 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
24410 46 69 72 73 74 42 6c 6f 63 6b 29 20 29 7b 0a 20  FirstBlock) ){. 
24420 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 53       pWriter->iS
24430 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 63  tart = sqlite3_c
24440 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 46 69 72  olumn_int64(pFir
24450 73 74 42 6c 6f 63 6b 2c 20 30 29 3b 0a 20 20 20  stBlock, 0);.   
24460 20 20 20 70 57 72 69 74 65 72 2d 3e 69 45 6e 64     pWriter->iEnd
24470 20 3d 20 70 57 72 69 74 65 72 2d 3e 69 53 74 61   = pWriter->iSta
24480 72 74 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 57  rt - 1;.      pW
24490 72 69 74 65 72 2d 3e 69 45 6e 64 20 2b 3d 20 6e  riter->iEnd += n
244a0 4c 65 61 66 45 73 74 20 2a 20 46 54 53 5f 4d 41  LeafEst * FTS_MA
244b0 58 5f 41 50 50 45 4e 44 41 42 4c 45 5f 48 45 49  X_APPENDABLE_HEI
244c0 47 48 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  GHT;.    }.    r
244d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
244e0 74 28 70 46 69 72 73 74 42 6c 6f 63 6b 29 3b 0a  t(pFirstBlock);.
244f0 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
24500 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
24510 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65 72   rc;..  /* Inser
24520 74 20 74 68 65 20 6d 61 72 6b 65 72 20 69 6e 20  t the marker in 
24530 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74  the %_segments t
24540 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  able to make sur
24550 65 20 6e 6f 62 6f 64 79 20 74 72 69 65 73 0a 20  e nobody tries. 
24560 20 2a 2a 20 74 6f 20 73 74 65 61 6c 20 74 68 65   ** to steal the
24570 20 73 70 61 63 65 20 6a 75 73 74 20 61 6c 6c 6f   space just allo
24580 63 61 74 65 64 2e 20 54 68 69 73 20 69 73 20 61  cated. This is a
24590 6c 73 6f 20 75 73 65 64 20 74 6f 20 69 64 65 6e  lso used to iden
245a0 74 69 66 79 20 0a 20 20 2a 2a 20 61 70 70 65 6e  tify .  ** appen
245b0 64 61 62 6c 65 20 73 65 67 6d 65 6e 74 73 2e 20  dable segments. 
245c0 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73 33 57   */.  rc = fts3W
245d0 72 69 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 70  riteSegment(p, p
245e0 57 72 69 74 65 72 2d 3e 69 45 6e 64 2c 20 30 2c  Writer->iEnd, 0,
245f0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
24600 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
24610 6e 20 72 63 3b 0a 0a 20 20 70 57 72 69 74 65 72  n rc;..  pWriter
24620 2d 3e 69 41 62 73 4c 65 76 65 6c 20 3d 20 69 41  ->iAbsLevel = iA
24630 62 73 4c 65 76 65 6c 3b 0a 20 20 70 57 72 69 74  bsLevel;.  pWrit
24640 65 72 2d 3e 6e 4c 65 61 66 45 73 74 20 3d 20 6e  er->nLeafEst = n
24650 4c 65 61 66 45 73 74 3b 0a 20 20 70 57 72 69 74  LeafEst;.  pWrit
24660 65 72 2d 3e 69 49 64 78 20 3d 20 69 49 64 78 3b  er->iIdx = iIdx;
24670 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68  ..  /* Set up th
24680 65 20 61 72 72 61 79 20 6f 66 20 4e 6f 64 65 57  e array of NodeW
24690 72 69 74 65 72 20 6f 62 6a 65 63 74 73 20 2a 2f  riter objects */
246a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 46 54  .  for(i=0; i<FT
246b0 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c 45  S_MAX_APPENDABLE
246c0 5f 48 45 49 47 48 54 3b 20 69 2b 2b 29 7b 0a 20  _HEIGHT; i++){. 
246d0 20 20 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64     pWriter->aNod
246e0 65 57 72 69 74 65 72 5b 69 5d 2e 69 42 6c 6f 63  eWriter[i].iBloc
246f0 6b 20 3d 20 70 57 72 69 74 65 72 2d 3e 69 53 74  k = pWriter->iSt
24700 61 72 74 20 2b 20 69 2a 70 57 72 69 74 65 72 2d  art + i*pWriter-
24710 3e 6e 4c 65 61 66 45 73 74 3b 0a 20 20 7d 0a 20  >nLeafEst;.  }. 
24720 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
24730 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  K;.}../*.** Remo
24740 76 65 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  ve an entry from
24750 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61   the %_segdir ta
24760 62 6c 65 2e 20 54 68 69 73 20 69 6e 76 6f 6c 76  ble. This involv
24770 65 73 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 0a  es running the .
24780 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f  ** following two
24790 20 73 74 61 74 65 6d 65 6e 74 73 3a 0a 2a 2a 0a   statements:.**.
247a0 2a 2a 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  **   DELETE FROM
247b0 20 25 5f 73 65 67 64 69 72 20 57 48 45 52 45 20   %_segdir WHERE 
247c0 6c 65 76 65 6c 20 3d 20 3a 69 41 62 73 4c 65 76  level = :iAbsLev
247d0 65 6c 20 41 4e 44 20 69 64 78 20 3d 20 3a 69 49  el AND idx = :iI
247e0 64 78 0a 2a 2a 20 20 20 55 50 44 41 54 45 20 25  dx.**   UPDATE %
247f0 5f 73 65 67 64 69 72 20 53 45 54 20 69 64 78 20  _segdir SET idx 
24800 3d 20 69 64 78 20 2d 20 31 20 57 48 45 52 45 20  = idx - 1 WHERE 
24810 6c 65 76 65 6c 20 3d 20 3a 69 41 62 73 4c 65 76  level = :iAbsLev
24820 65 6c 20 41 4e 44 20 69 64 78 20 3e 20 3a 69 49  el AND idx > :iI
24830 64 78 0a 2a 2a 0a 2a 2a 20 54 68 65 20 44 45 4c  dx.**.** The DEL
24840 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 72 65  ETE statement re
24850 6d 6f 76 65 73 20 74 68 65 20 73 70 65 63 69 66  moves the specif
24860 69 63 20 25 5f 73 65 67 64 69 72 20 6c 65 76 65  ic %_segdir leve
24870 6c 2e 20 54 68 65 20 55 50 44 41 54 45 20 0a 2a  l. The UPDATE .*
24880 2a 20 73 74 61 74 65 6d 65 6e 74 20 65 6e 73 75  * statement ensu
24890 72 65 73 20 74 68 61 74 20 74 68 65 20 72 65 6d  res that the rem
248a0 61 69 6e 69 6e 67 20 73 65 67 6d 65 6e 74 73 20  aining segments 
248b0 68 61 76 65 20 63 6f 6e 74 69 67 75 6f 75 73 6c  have contiguousl
248c0 79 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 69  y allocated.** i
248d0 64 78 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74  dx values..*/.st
248e0 61 74 69 63 20 69 6e 74 20 66 74 73 33 52 65 6d  atic int fts3Rem
248f0 6f 76 65 53 65 67 64 69 72 45 6e 74 72 79 28 0a  oveSegdirEntry(.
24900 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
24910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24920 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20    /* FTS3 table 
24930 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69  handle */.  sqli
24940 74 65 33 5f 69 6e 74 36 34 20 69 41 62 73 4c 65  te3_int64 iAbsLe
24950 76 65 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 41  vel,        /* A
24960 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 74 6f  bsolute level to
24970 20 64 65 6c 65 74 65 20 66 72 6f 6d 20 2a 2f 0a   delete from */.
24980 20 20 69 6e 74 20 69 49 64 78 20 20 20 20 20 20    int iIdx      
24990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249a0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 25 5f    /* Index of %_
249b0 73 65 67 64 69 72 20 65 6e 74 72 79 20 74 6f 20  segdir entry to 
249c0 64 65 6c 65 74 65 20 2a 2f 0a 29 7b 0a 20 20 69  delete */.){.  i
249d0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
249e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
249f0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
24a00 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
24a10 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 20  *pDelete = 0;   
24a20 20 20 20 2f 2a 20 44 45 4c 45 54 45 20 73 74 61     /* DELETE sta
24a30 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 72 63 20  tement */..  rc 
24a40 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
24a50 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 44   SQL_DELETE_SEGD
24a60 49 52 5f 45 4e 54 52 59 2c 20 26 70 44 65 6c 65  IR_ENTRY, &pDele
24a70 74 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  te, 0);.  if( rc
24a80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24a90 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
24aa0 69 6e 74 36 34 28 70 44 65 6c 65 74 65 2c 20 31  int64(pDelete, 1
24ab0 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20  , iAbsLevel);.  
24ac0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
24ad0 6e 74 28 70 44 65 6c 65 74 65 2c 20 32 2c 20 69  nt(pDelete, 2, i
24ae0 49 64 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Idx);.    sqlite
24af0 33 5f 73 74 65 70 28 70 44 65 6c 65 74 65 29 3b  3_step(pDelete);
24b00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
24b10 33 5f 72 65 73 65 74 28 70 44 65 6c 65 74 65 29  3_reset(pDelete)
24b20 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
24b30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65  rc;.}../*.** One
24b40 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74   or more segment
24b50 73 20 68 61 76 65 20 6a 75 73 74 20 62 65 65 6e  s have just been
24b60 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 61 62   removed from ab
24b70 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 69 41 62  solute level iAb
24b80 73 4c 65 76 65 6c 2e 0a 2a 2a 20 55 70 64 61 74  sLevel..** Updat
24b90 65 20 74 68 65 20 27 69 64 78 27 20 76 61 6c 75  e the 'idx' valu
24ba0 65 73 20 6f 66 20 74 68 65 20 72 65 6d 61 69 6e  es of the remain
24bb0 69 6e 67 20 73 65 67 6d 65 6e 74 73 20 69 6e 20  ing segments in 
24bc0 74 68 65 20 6c 65 76 65 6c 20 73 6f 20 74 68 61  the level so tha
24bd0 74 0a 2a 2a 20 74 68 65 20 69 64 78 20 76 61 6c  t.** the idx val
24be0 75 65 73 20 61 72 65 20 61 20 63 6f 6e 74 69 67  ues are a contig
24bf0 75 6f 75 73 20 73 65 71 75 65 6e 63 65 20 73 74  uous sequence st
24c00 61 72 74 69 6e 67 20 66 72 6f 6d 20 30 2e 0a 2a  arting from 0..*
24c10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
24c20 33 52 65 70 61 63 6b 53 65 67 64 69 72 4c 65 76  3RepackSegdirLev
24c30 65 6c 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  el(.  Fts3Table 
24c40 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
24c50 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61        /* FTS3 ta
24c60 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
24c70 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 41  sqlite3_int64 iA
24c80 62 73 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20  bsLevel         
24c90 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65 76 65  /* Absolute leve
24ca0 6c 20 74 6f 20 72 65 70 61 63 6b 20 2a 2f 0a 29  l to repack */.)
24cb0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
24cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cd0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
24ce0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 49 64  de */.  int *aId
24cf0 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  x = 0;          
24d00 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
24d10 20 6f 66 20 72 65 6d 61 69 6e 69 6e 67 20 69 64   of remaining id
24d20 78 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  x values */.  in
24d30 74 20 6e 49 64 78 20 3d 20 30 3b 20 20 20 20 20  t nIdx = 0;     
24d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24d50 20 56 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69   Valid entries i
24d60 6e 20 61 49 64 78 5b 5d 20 2a 2f 0a 20 20 69 6e  n aIdx[] */.  in
24d70 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 20 20 20  t nAlloc = 0;   
24d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24d90 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   Allocated size 
24da0 6f 66 20 61 49 64 78 5b 5d 20 2a 2f 0a 20 20 69  of aIdx[] */.  i
24db0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
24dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24dd0 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
24de0 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
24df0 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 20 3d  _stmt *pSelect =
24e00 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 6c 65   0;      /* Sele
24e10 63 74 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  ct statement to 
24e20 72 65 61 64 20 69 64 78 20 76 61 6c 75 65 73 20  read idx values 
24e30 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
24e40 74 20 2a 70 55 70 64 61 74 65 20 3d 20 30 3b 20  t *pUpdate = 0; 
24e50 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 73       /* Update s
24e60 74 61 74 65 6d 65 6e 74 20 74 6f 20 6d 6f 64 69  tatement to modi
24e70 66 79 20 69 64 78 20 76 61 6c 75 65 73 20 2a 2f  fy idx values */
24e80 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  ..  rc = fts3Sql
24e90 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45  Stmt(p, SQL_SELE
24ea0 43 54 5f 49 4e 44 45 58 45 53 2c 20 26 70 53 65  CT_INDEXES, &pSe
24eb0 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  lect, 0);.  if( 
24ec0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24ed0 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20  .    int rc2;.  
24ee0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
24ef0 6e 74 36 34 28 70 53 65 6c 65 63 74 2c 20 31 2c  nt64(pSelect, 1,
24f00 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20   iAbsLevel);.   
24f10 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52   while( SQLITE_R
24f20 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
24f30 28 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  (pSelect) ){.   
24f40 20 20 20 69 66 28 20 6e 49 64 78 3e 3d 6e 41 6c     if( nIdx>=nAl
24f50 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69  loc ){.        i
24f60 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 20 20  nt *aNew;.      
24f70 20 20 6e 41 6c 6c 6f 63 20 2b 3d 20 31 36 3b 0a    nAlloc += 16;.
24f80 20 20 20 20 20 20 20 20 61 4e 65 77 20 3d 20 73          aNew = s
24f90 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61  qlite3_realloc(a
24fa0 49 64 78 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65  Idx, nAlloc*size
24fb0 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20  of(int));.      
24fc0 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a 20    if( !aNew ){. 
24fd0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
24fe0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
24ff0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25000 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
25010 49 64 78 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20  Idx = aNew;.    
25020 20 20 7d 0a 20 20 20 20 20 20 61 49 64 78 5b 6e    }.      aIdx[n
25030 49 64 78 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33  Idx++] = sqlite3
25040 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 65 6c  _column_int(pSel
25050 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ect, 0);.    }. 
25060 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
25070 5f 72 65 73 65 74 28 70 53 65 6c 65 63 74 29 3b  _reset(pSelect);
25080 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
25090 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
250a0 32 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  2;.  }..  if( rc
250b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
250c0 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53     rc = fts3SqlS
250d0 74 6d 74 28 70 2c 20 53 51 4c 5f 53 48 49 46 54  tmt(p, SQL_SHIFT
250e0 5f 53 45 47 44 49 52 5f 45 4e 54 52 59 2c 20 26  _SEGDIR_ENTRY, &
250f0 70 55 70 64 61 74 65 2c 20 30 29 3b 0a 20 20 7d  pUpdate, 0);.  }
25100 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
25110 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
25120 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
25130 55 70 64 61 74 65 2c 20 32 2c 20 69 41 62 73 4c  Update, 2, iAbsL
25140 65 76 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  evel);.  }..  as
25150 73 65 72 74 28 20 70 2d 3e 62 49 67 6e 6f 72 65  sert( p->bIgnore
25160 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 3b 0a  Savepoint==0 );.
25170 20 20 70 2d 3e 62 49 67 6e 6f 72 65 53 61 76 65    p->bIgnoreSave
25180 70 6f 69 6e 74 20 3d 20 31 3b 0a 20 20 66 6f 72  point = 1;.  for
25190 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
251a0 5f 4f 4b 20 26 26 20 69 3c 6e 49 64 78 3b 20 69  _OK && i<nIdx; i
251b0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 49 64  ++){.    if( aId
251c0 78 5b 69 5d 21 3d 69 20 29 7b 0a 20 20 20 20 20  x[i]!=i ){.     
251d0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
251e0 74 28 70 55 70 64 61 74 65 2c 20 33 2c 20 61 49  t(pUpdate, 3, aI
251f0 64 78 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 71  dx[i]);.      sq
25200 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
25210 55 70 64 61 74 65 2c 20 31 2c 20 69 29 3b 0a 20  Update, 1, i);. 
25220 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65       sqlite3_ste
25230 70 28 70 55 70 64 61 74 65 29 3b 0a 20 20 20 20  p(pUpdate);.    
25240 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
25250 65 73 65 74 28 70 55 70 64 61 74 65 29 3b 0a 20  eset(pUpdate);. 
25260 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 62 49     }.  }.  p->bI
25270 67 6e 6f 72 65 53 61 76 65 70 6f 69 6e 74 20 3d  gnoreSavepoint =
25280 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66   0;..  sqlite3_f
25290 72 65 65 28 61 49 64 78 29 3b 0a 20 20 72 65 74  ree(aIdx);.  ret
252a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
252b0 63 20 76 6f 69 64 20 66 74 73 33 53 74 61 72 74  c void fts3Start
252c0 4e 6f 64 65 28 42 6c 6f 62 20 2a 70 4e 6f 64 65  Node(Blob *pNode
252d0 2c 20 69 6e 74 20 69 48 65 69 67 68 74 2c 20 73  , int iHeight, s
252e0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 43 68  qlite3_int64 iCh
252f0 69 6c 64 29 7b 0a 20 20 70 4e 6f 64 65 2d 3e 61  ild){.  pNode->a
25300 5b 30 5d 20 3d 20 28 63 68 61 72 29 69 48 65 69  [0] = (char)iHei
25310 67 68 74 3b 0a 20 20 69 66 28 20 69 43 68 69 6c  ght;.  if( iChil
25320 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
25330 20 70 4e 6f 64 65 2d 3e 6e 41 6c 6c 6f 63 3e 3d   pNode->nAlloc>=
25340 31 2b 73 71 6c 69 74 65 33 46 74 73 33 56 61 72  1+sqlite3Fts3Var
25350 69 6e 74 4c 65 6e 28 69 43 68 69 6c 64 29 20 29  intLen(iChild) )
25360 3b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 6e 20 3d  ;.    pNode->n =
25370 20 31 20 2b 20 73 71 6c 69 74 65 33 46 74 73 33   1 + sqlite3Fts3
25380 50 75 74 56 61 72 69 6e 74 28 26 70 4e 6f 64 65  PutVarint(&pNode
25390 2d 3e 61 5b 31 5d 2c 20 69 43 68 69 6c 64 29 3b  ->a[1], iChild);
253a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
253b0 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 6e 41 6c  sert( pNode->nAl
253c0 6c 6f 63 3e 3d 31 20 29 3b 0a 20 20 20 20 70 4e  loc>=1 );.    pN
253d0 6f 64 65 2d 3e 6e 20 3d 20 31 3b 0a 20 20 7d 0a  ode->n = 1;.  }.
253e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72  }../*.** The fir
253f0 73 74 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73  st two arguments
25400 20 61 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74   are a pointer t
25410 6f 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  o and the size o
25420 66 20 61 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  f a segment b-tr
25430 65 65 0a 2a 2a 20 6e 6f 64 65 2e 20 54 68 65 20  ee.** node. The 
25440 6e 6f 64 65 20 6d 61 79 20 62 65 20 61 20 6c 65  node may be a le
25450 61 66 20 6f 72 20 61 6e 20 69 6e 74 65 72 6e 61  af or an interna
25460 6c 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  l node..**.** Th
25470 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 72 65 61  is function crea
25480 74 65 73 20 61 20 6e 65 77 20 6e 6f 64 65 20 69  tes a new node i
25490 6d 61 67 65 20 69 6e 20 62 6c 6f 62 20 6f 62 6a  mage in blob obj
254a0 65 63 74 20 2a 70 4e 65 77 20 62 79 20 63 6f 70  ect *pNew by cop
254b0 79 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d  ying.** all term
254c0 73 20 74 68 61 74 20 61 72 65 20 67 72 65 61 74  s that are great
254d0 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
254e0 20 74 6f 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 20   to zTerm/nTerm 
254f0 28 66 6f 72 20 6c 65 61 66 20 6e 6f 64 65 73 29  (for leaf nodes)
25500 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74  .** or greater t
25510 68 61 6e 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 20  han zTerm/nTerm 
25520 28 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  (for internal no
25530 64 65 73 29 20 66 72 6f 6d 20 61 4e 6f 64 65 2f  des) from aNode/
25540 6e 4e 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  nNode..*/.static
25550 20 69 6e 74 20 66 74 73 33 54 72 75 6e 63 61 74   int fts3Truncat
25560 65 4e 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 63  eNode(.  const c
25570 68 61 72 20 2a 61 4e 6f 64 65 2c 20 20 20 20 20  har *aNode,     
25580 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
25590 65 6e 74 20 6e 6f 64 65 20 69 6d 61 67 65 20 2a  ent node image *
255a0 2f 0a 20 20 69 6e 74 20 6e 4e 6f 64 65 2c 20 20  /.  int nNode,  
255b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255c0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
255d0 4e 6f 64 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  Node in bytes */
255e0 0a 20 20 42 6c 6f 62 20 2a 70 4e 65 77 2c 20 20  .  Blob *pNew,  
255f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25600 20 20 20 2f 2a 20 4f 55 54 3a 20 57 72 69 74 65     /* OUT: Write
25610 20 6e 65 77 20 6e 6f 64 65 20 69 6d 61 67 65 20   new node image 
25620 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
25630 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20  char *zTerm,    
25640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6d 69            /* Omi
25650 74 20 61 6c 6c 20 74 65 72 6d 73 20 73 6d 61 6c  t all terms smal
25660 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20 2a 2f  ler than this */
25670 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20  .  int nTerm,   
25680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25690 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54     /* Size of zT
256a0 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  erm in bytes */.
256b0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
256c0 2a 70 69 42 6c 6f 63 6b 20 20 20 20 20 20 20 20  *piBlock        
256d0 20 20 2f 2a 20 4f 55 54 3a 20 42 6c 6f 63 6b 20    /* OUT: Block 
256e0 6e 75 6d 62 65 72 20 69 6e 20 6e 65 78 74 20 6c  number in next l
256f0 61 79 65 72 20 64 6f 77 6e 20 2a 2f 0a 29 7b 0a  ayer down */.){.
25700 20 20 4e 6f 64 65 52 65 61 64 65 72 20 72 65 61    NodeReader rea
25710 64 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  der;            
25720 20 20 2f 2a 20 52 65 61 64 65 72 20 6f 62 6a 65    /* Reader obje
25730 63 74 20 2a 2f 0a 20 20 42 6c 6f 62 20 70 72 65  ct */.  Blob pre
25740 76 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 20 20  v = {0, 0, 0};  
25750 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
25760 6f 75 73 20 74 65 72 6d 20 77 72 69 74 74 65 6e  ous term written
25770 20 74 6f 20 6e 65 77 20 6e 6f 64 65 20 2a 2f 0a   to new node */.
25780 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
25790 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
257a0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
257b0 20 2a 2f 0a 20 20 69 6e 74 20 62 4c 65 61 66 20   */.  int bLeaf 
257c0 3d 20 61 4e 6f 64 65 5b 30 5d 3d 3d 27 5c 30 27  = aNode[0]=='\0'
257d0 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f  ;     /* True fo
257e0 72 20 61 20 6c 65 61 66 20 6e 6f 64 65 20 2a 2f  r a leaf node */
257f0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
25800 72 65 71 75 69 72 65 64 20 6f 75 74 70 75 74 20  required output 
25810 73 70 61 63 65 20 2a 2f 0a 20 20 62 6c 6f 62 47  space */.  blobG
25820 72 6f 77 42 75 66 66 65 72 28 70 4e 65 77 2c 20  rowBuffer(pNew, 
25830 6e 4e 6f 64 65 2c 20 26 72 63 29 3b 0a 20 20 69  nNode, &rc);.  i
25840 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25850 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
25860 70 4e 65 77 2d 3e 6e 20 3d 20 30 3b 0a 0a 20 20  pNew->n = 0;..  
25870 2f 2a 20 50 6f 70 75 6c 61 74 65 20 6e 65 77 20  /* Populate new 
25880 6e 6f 64 65 20 62 75 66 66 65 72 20 2a 2f 0a 20  node buffer */. 
25890 20 66 6f 72 28 72 63 20 3d 20 6e 6f 64 65 52 65   for(rc = nodeRe
258a0 61 64 65 72 49 6e 69 74 28 26 72 65 61 64 65 72  aderInit(&reader
258b0 2c 20 61 4e 6f 64 65 2c 20 6e 4e 6f 64 65 29 3b  , aNode, nNode);
258c0 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49   .      rc==SQLI
258d0 54 45 5f 4f 4b 20 26 26 20 72 65 61 64 65 72 2e  TE_OK && reader.
258e0 61 4e 6f 64 65 3b 20 0a 20 20 20 20 20 20 72 63  aNode; .      rc
258f0 20 3d 20 6e 6f 64 65 52 65 61 64 65 72 4e 65 78   = nodeReaderNex
25900 74 28 26 72 65 61 64 65 72 29 0a 20 20 29 7b 0a  t(&reader).  ){.
25910 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 3d      if( pNew->n=
25920 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
25930 72 65 73 20 3d 20 66 74 73 33 54 65 72 6d 43 6d  res = fts3TermCm
25940 70 28 72 65 61 64 65 72 2e 74 65 72 6d 2e 61 2c  p(reader.term.a,
25950 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 6e 2c 20   reader.term.n, 
25960 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  zTerm, nTerm);. 
25970 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 7c       if( res<0 |
25980 7c 20 28 62 4c 65 61 66 3d 3d 30 20 26 26 20 72  | (bLeaf==0 && r
25990 65 73 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75  es==0) ) continu
259a0 65 3b 0a 20 20 20 20 20 20 66 74 73 33 53 74 61  e;.      fts3Sta
259b0 72 74 4e 6f 64 65 28 70 4e 65 77 2c 20 28 69 6e  rtNode(pNew, (in
259c0 74 29 61 4e 6f 64 65 5b 30 5d 2c 20 72 65 61 64  t)aNode[0], read
259d0 65 72 2e 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  er.iChild);.    
259e0 20 20 2a 70 69 42 6c 6f 63 6b 20 3d 20 72 65 61    *piBlock = rea
259f0 64 65 72 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20  der.iChild;.    
25a00 7d 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 41  }.    rc = fts3A
25a10 70 70 65 6e 64 54 6f 4e 6f 64 65 28 0a 20 20 20  ppendToNode(.   
25a20 20 20 20 20 20 70 4e 65 77 2c 20 26 70 72 65 76       pNew, &prev
25a30 2c 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 61 2c  , reader.term.a,
25a40 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 6e 2c 0a   reader.term.n,.
25a50 20 20 20 20 20 20 20 20 72 65 61 64 65 72 2e 61          reader.a
25a60 44 6f 63 6c 69 73 74 2c 20 72 65 61 64 65 72 2e  Doclist, reader.
25a70 6e 44 6f 63 6c 69 73 74 0a 20 20 20 20 29 3b 0a  nDoclist.    );.
25a80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25a90 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20  TE_OK ) break;. 
25aa0 20 7d 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e   }.  if( pNew->n
25ab0 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 33 53  ==0 ){.    fts3S
25ac0 74 61 72 74 4e 6f 64 65 28 70 4e 65 77 2c 20 28  tartNode(pNew, (
25ad0 69 6e 74 29 61 4e 6f 64 65 5b 30 5d 2c 20 72 65  int)aNode[0], re
25ae0 61 64 65 72 2e 69 43 68 69 6c 64 29 3b 0a 20 20  ader.iChild);.  
25af0 20 20 2a 70 69 42 6c 6f 63 6b 20 3d 20 72 65 61    *piBlock = rea
25b00 64 65 72 2e 69 43 68 69 6c 64 3b 0a 20 20 7d 0a  der.iChild;.  }.
25b10 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
25b20 6e 3c 3d 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20  n<=pNew->nAlloc 
25b30 29 3b 0a 0a 20 20 6e 6f 64 65 52 65 61 64 65 72  );..  nodeReader
25b40 52 65 6c 65 61 73 65 28 26 72 65 61 64 65 72 29  Release(&reader)
25b50 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
25b60 28 70 72 65 76 2e 61 29 3b 0a 20 20 72 65 74 75  (prev.a);.  retu
25b70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
25b80 52 65 6d 6f 76 65 20 61 6c 6c 20 74 65 72 6d 73  Remove all terms
25b90 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 7a 54   smaller than zT
25ba0 65 72 6d 2f 6e 54 65 72 6d 20 66 72 6f 6d 20 73  erm/nTerm from s
25bb0 65 67 6d 65 6e 74 20 69 49 64 78 20 69 6e 20 61  egment iIdx in a
25bc0 62 73 6f 6c 75 74 65 20 0a 2a 2a 20 6c 65 76 65  bsolute .** leve
25bd0 6c 20 69 41 62 73 4c 65 76 65 6c 2e 20 54 68 69  l iAbsLevel. Thi
25be0 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 64 65  s may involve de
25bf0 6c 65 74 69 6e 67 20 65 6e 74 72 69 65 73 20 66  leting entries f
25c00 72 6f 6d 20 74 68 65 20 25 5f 73 65 67 6d 65 6e  rom the %_segmen
25c10 74 73 0a 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64  ts.** table, and
25c20 20 6d 6f 64 69 66 79 69 6e 67 20 65 78 69 73 74   modifying exist
25c30 69 6e 67 20 65 6e 74 72 69 65 73 20 69 6e 20 62  ing entries in b
25c40 6f 74 68 20 74 68 65 20 25 5f 73 65 67 6d 65 6e  oth the %_segmen
25c50 74 73 20 61 6e 64 20 25 5f 73 65 67 64 69 72 0a  ts and %_segdir.
25c60 2a 2a 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ** tables..**.**
25c70 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
25c80 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 73 65  turned if the se
25c90 67 6d 65 6e 74 20 69 73 20 75 70 64 61 74 65 64  gment is updated
25ca0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 4f   successfully. O
25cb0 72 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 65  r an.** SQLite e
25cc0 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
25cd0 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
25ce0 6e 74 20 66 74 73 33 54 72 75 6e 63 61 74 65 53  nt fts3TruncateS
25cf0 65 67 6d 65 6e 74 28 0a 20 20 46 74 73 33 54 61  egment(.  Fts3Ta
25d00 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
25d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
25d20 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  3 table handle *
25d30 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
25d40 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20  4 iAbsLevel,    
25d50 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20      /* Absolute 
25d60 6c 65 76 65 6c 20 6f 66 20 73 65 67 6d 65 6e 74  level of segment
25d70 20 74 6f 20 6d 6f 64 69 66 79 20 2a 2f 0a 20 20   to modify */.  
25d80 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20  int iIdx,       
25d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25da0 2f 2a 20 49 6e 64 65 78 20 77 69 74 68 69 6e 20  /* Index within 
25db0 6c 65 76 65 6c 20 6f 66 20 73 65 67 6d 65 6e 74  level of segment
25dc0 20 74 6f 20 6d 6f 64 69 66 79 20 2a 2f 0a 20 20   to modify */.  
25dd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72  const char *zTer
25de0 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
25df0 2f 2a 20 52 65 6d 6f 76 65 20 74 65 72 6d 73 20  /* Remove terms 
25e00 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69  smaller than thi
25e10 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  s */.  int nTerm
25e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e30 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
25e40 6f 66 20 62 79 74 65 73 20 69 6e 20 62 75 66 66  of bytes in buff
25e50 65 72 20 7a 54 65 72 6d 20 2a 2f 0a 29 7b 0a 20  er zTerm */.){. 
25e60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
25e70 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
25e80 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
25e90 2a 2f 0a 20 20 42 6c 6f 62 20 72 6f 6f 74 20 3d  */.  Blob root =
25ea0 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 20 20 20 20   {0,0,0};       
25eb0 20 20 20 20 20 2f 2a 20 4e 65 77 20 72 6f 6f 74       /* New root
25ec0 20 70 61 67 65 20 69 6d 61 67 65 20 2a 2f 0a 20   page image */. 
25ed0 20 42 6c 6f 62 20 62 6c 6f 63 6b 20 3d 20 7b 30   Blob block = {0
25ee0 2c 30 2c 30 7d 3b 20 20 20 20 20 20 20 20 20 20  ,0,0};          
25ef0 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64 20   /* Buffer used 
25f00 66 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 62 6c  for any other bl
25f10 6f 63 6b 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ock */.  sqlite3
25f20 5f 69 6e 74 36 34 20 69 42 6c 6f 63 6b 20 3d 20  _int64 iBlock = 
25f30 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63  0;       /* Bloc
25f40 6b 20 69 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  k id */.  sqlite
25f50 33 5f 69 6e 74 36 34 20 69 4e 65 77 53 74 61 72  3_int64 iNewStar
25f60 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77  t = 0;    /* New
25f70 20 76 61 6c 75 65 20 66 6f 72 20 69 53 74 61 72   value for iStar
25f80 74 42 6c 6f 63 6b 20 2a 2f 0a 20 20 73 71 6c 69  tBlock */.  sqli
25f90 74 65 33 5f 69 6e 74 36 34 20 69 4f 6c 64 53 74  te3_int64 iOldSt
25fa0 61 72 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f  art = 0;    /* O
25fb0 6c 64 20 76 61 6c 75 65 20 66 6f 72 20 69 53 74  ld value for iSt
25fc0 61 72 74 42 6c 6f 63 6b 20 2a 2f 0a 20 20 73 71  artBlock */.  sq
25fd0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 46 65 74  lite3_stmt *pFet
25fe0 63 68 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ch = 0;       /*
25ff0 20 53 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20   Statement used 
26000 74 6f 20 66 65 74 63 68 20 73 65 67 64 69 72 20  to fetch segdir 
26010 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53  */..  rc = fts3S
26020 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45  qlStmt(p, SQL_SE
26030 4c 45 43 54 5f 53 45 47 44 49 52 2c 20 26 70 46  LECT_SEGDIR, &pF
26040 65 74 63 68 2c 20 30 29 3b 0a 20 20 69 66 28 20  etch, 0);.  if( 
26050 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26060 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 20 20 20  .    int rc2;   
26070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26080 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 72 65     /* sqlite3_re
26090 73 65 74 28 29 20 72 65 74 75 72 6e 20 63 6f 64  set() return cod
260a0 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
260b0 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 46 65 74  _bind_int64(pFet
260c0 63 68 2c 20 31 2c 20 69 41 62 73 4c 65 76 65 6c  ch, 1, iAbsLevel
260d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  );.    sqlite3_b
260e0 69 6e 64 5f 69 6e 74 28 70 46 65 74 63 68 2c 20  ind_int(pFetch, 
260f0 32 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 69 66  2, iIdx);.    if
26100 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
26110 6c 69 74 65 33 5f 73 74 65 70 28 70 46 65 74 63  lite3_step(pFetc
26120 68 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  h) ){.      cons
26130 74 20 63 68 61 72 20 2a 61 52 6f 6f 74 20 3d 20  t char *aRoot = 
26140 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
26150 6c 6f 62 28 70 46 65 74 63 68 2c 20 34 29 3b 0a  lob(pFetch, 4);.
26160 20 20 20 20 20 20 69 6e 74 20 6e 52 6f 6f 74 20        int nRoot 
26170 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
26180 5f 62 79 74 65 73 28 70 46 65 74 63 68 2c 20 34  _bytes(pFetch, 4
26190 29 3b 0a 20 20 20 20 20 20 69 4f 6c 64 53 74 61  );.      iOldSta
261a0 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  rt = sqlite3_col
261b0 75 6d 6e 5f 69 6e 74 36 34 28 70 46 65 74 63 68  umn_int64(pFetch
261c0 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , 1);.      rc =
261d0 20 66 74 73 33 54 72 75 6e 63 61 74 65 4e 6f 64   fts3TruncateNod
261e0 65 28 61 52 6f 6f 74 2c 20 6e 52 6f 6f 74 2c 20  e(aRoot, nRoot, 
261f0 26 72 6f 6f 74 2c 20 7a 54 65 72 6d 2c 20 6e 54  &root, zTerm, nT
26200 65 72 6d 2c 20 26 69 42 6c 6f 63 6b 29 3b 0a 20  erm, &iBlock);. 
26210 20 20 20 7d 0a 20 20 20 20 72 63 32 20 3d 20 73     }.    rc2 = s
26220 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 46 65  qlite3_reset(pFe
26230 74 63 68 29 3b 0a 20 20 20 20 69 66 28 20 72 63  tch);.    if( rc
26240 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
26250 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 77   = rc2;.  }..  w
26260 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
26270 5f 4f 4b 20 26 26 20 69 42 6c 6f 63 6b 20 29 7b  _OK && iBlock ){
26280 0a 20 20 20 20 63 68 61 72 20 2a 61 42 6c 6f 63  .    char *aBloc
26290 6b 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  k = 0;.    int n
262a0 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 69  Block = 0;.    i
262b0 4e 65 77 53 74 61 72 74 20 3d 20 69 42 6c 6f 63  NewStart = iBloc
262c0 6b 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  k;..    rc = sql
262d0 69 74 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63  ite3Fts3ReadBloc
262e0 6b 28 70 2c 20 69 42 6c 6f 63 6b 2c 20 26 61 42  k(p, iBlock, &aB
262f0 6c 6f 63 6b 2c 20 26 6e 42 6c 6f 63 6b 2c 20 30  lock, &nBlock, 0
26300 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
26310 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26320 20 20 72 63 20 3d 20 66 74 73 33 54 72 75 6e 63    rc = fts3Trunc
26330 61 74 65 4e 6f 64 65 28 61 42 6c 6f 63 6b 2c 20  ateNode(aBlock, 
26340 6e 42 6c 6f 63 6b 2c 20 26 62 6c 6f 63 6b 2c 20  nBlock, &block, 
26350 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 26 69  zTerm, nTerm, &i
26360 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  Block);.    }.  
26370 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26380 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
26390 3d 20 66 74 73 33 57 72 69 74 65 53 65 67 6d 65  = fts3WriteSegme
263a0 6e 74 28 70 2c 20 69 4e 65 77 53 74 61 72 74 2c  nt(p, iNewStart,
263b0 20 62 6c 6f 63 6b 2e 61 2c 20 62 6c 6f 63 6b 2e   block.a, block.
263c0 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  n);.    }.    sq
263d0 6c 69 74 65 33 5f 66 72 65 65 28 61 42 6c 6f 63  lite3_free(aBloc
263e0 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 56 61  k);.  }..  /* Va
263f0 72 69 61 62 6c 65 20 69 4e 65 77 53 74 61 72 74  riable iNewStart
26400 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68   now contains th
26410 65 20 66 69 72 73 74 20 76 61 6c 69 64 20 6c 65  e first valid le
26420 61 66 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 66  af node. */.  if
26430 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26440 26 26 20 69 4e 65 77 53 74 61 72 74 20 29 7b 0a  && iNewStart ){.
26450 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
26460 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20   *pDel = 0;.    
26470 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
26480 28 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53  (p, SQL_DELETE_S
26490 45 47 4d 45 4e 54 53 5f 52 41 4e 47 45 2c 20 26  EGMENTS_RANGE, &
264a0 70 44 65 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66  pDel, 0);.    if
264b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
264c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
264d0 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c  _bind_int64(pDel
264e0 2c 20 31 2c 20 69 4f 6c 64 53 74 61 72 74 29 3b  , 1, iOldStart);
264f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
26500 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c 2c 20  ind_int64(pDel, 
26510 32 2c 20 69 4e 65 77 53 74 61 72 74 2d 31 29 3b  2, iNewStart-1);
26520 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
26530 74 65 70 28 70 44 65 6c 29 3b 0a 20 20 20 20 20  tep(pDel);.     
26540 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
26550 73 65 74 28 70 44 65 6c 29 3b 0a 20 20 20 20 7d  set(pDel);.    }
26560 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
26570 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26580 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
26590 43 68 6f 6d 70 20 3d 20 30 3b 0a 20 20 20 20 72  Chomp = 0;.    r
265a0 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
265b0 70 2c 20 53 51 4c 5f 43 48 4f 4d 50 5f 53 45 47  p, SQL_CHOMP_SEG
265c0 44 49 52 2c 20 26 70 43 68 6f 6d 70 2c 20 30 29  DIR, &pChomp, 0)
265d0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
265e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
265f0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
26600 74 36 34 28 70 43 68 6f 6d 70 2c 20 31 2c 20 69  t64(pChomp, 1, i
26610 4e 65 77 53 74 61 72 74 29 3b 0a 20 20 20 20 20  NewStart);.     
26620 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
26630 6f 62 28 70 43 68 6f 6d 70 2c 20 32 2c 20 72 6f  ob(pChomp, 2, ro
26640 6f 74 2e 61 2c 20 72 6f 6f 74 2e 6e 2c 20 53 51  ot.a, root.n, SQ
26650 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
26660 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
26670 5f 69 6e 74 36 34 28 70 43 68 6f 6d 70 2c 20 33  _int64(pChomp, 3
26680 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20  , iAbsLevel);.  
26690 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
266a0 5f 69 6e 74 28 70 43 68 6f 6d 70 2c 20 34 2c 20  _int(pChomp, 4, 
266b0 69 49 64 78 29 3b 0a 20 20 20 20 20 20 73 71 6c  iIdx);.      sql
266c0 69 74 65 33 5f 73 74 65 70 28 70 43 68 6f 6d 70  ite3_step(pChomp
266d0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
266e0 6c 69 74 65 33 5f 72 65 73 65 74 28 70 43 68 6f  lite3_reset(pCho
266f0 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
26700 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 72    sqlite3_free(r
26710 6f 6f 74 2e 61 29 3b 0a 20 20 73 71 6c 69 74 65  oot.a);.  sqlite
26720 33 5f 66 72 65 65 28 62 6c 6f 63 6b 2e 61 29 3b  3_free(block.a);
26730 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26740 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
26750 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
26760 66 74 65 72 20 61 6e 20 69 6e 63 72 6d 65 6e 74  fter an incrment
26770 61 6c 2d 6d 65 72 67 65 20 6f 70 65 72 61 74 69  al-merge operati
26780 6f 6e 20 68 61 73 20 72 75 6e 20 74 6f 0a 2a 2a  on has run to.**
26790 20 6d 65 72 67 65 20 28 6f 72 20 70 61 72 74 69   merge (or parti
267a0 61 6c 6c 79 20 6d 65 72 67 65 29 20 74 77 6f 20  ally merge) two 
267b0 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73  or more segments
267c0 20 66 72 6f 6d 20 61 62 73 6f 6c 75 74 65 20 6c   from absolute l
267d0 65 76 65 6c 0a 2a 2a 20 69 41 62 73 4c 65 76 65  evel.** iAbsLeve
267e0 6c 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e  l..**.** Each in
267f0 70 75 74 20 73 65 67 6d 65 6e 74 20 69 73 20 65  put segment is e
26800 69 74 68 65 72 20 72 65 6d 6f 76 65 64 20 66 72  ither removed fr
26810 6f 6d 20 74 68 65 20 64 62 20 63 6f 6d 70 6c 65  om the db comple
26820 74 65 6c 79 20 28 69 66 20 61 6c 6c 20 6f 66 0a  tely (if all of.
26830 2a 2a 20 69 74 73 20 64 61 74 61 20 77 61 73 20  ** its data was 
26840 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75  copied to the ou
26850 74 70 75 74 20 73 65 67 6d 65 6e 74 20 62 79 20  tput segment by 
26860 74 68 65 20 69 6e 63 72 6d 65 72 67 65 20 6f 70  the incrmerge op
26870 65 72 61 74 69 6f 6e 29 0a 2a 2a 20 6f 72 20 6d  eration).** or m
26880 6f 64 69 66 69 65 64 20 69 6e 20 70 6c 61 63 65  odified in place
26890 20 73 6f 20 74 68 61 74 20 69 74 20 6e 6f 20 6c   so that it no l
268a0 6f 6e 67 65 72 20 63 6f 6e 74 61 69 6e 73 20 74  onger contains t
268b0 68 6f 73 65 20 65 6e 74 72 69 65 73 20 74 68 61  hose entries tha
268c0 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64  t.** have been d
268d0 75 70 6c 69 63 61 74 65 64 20 69 6e 20 74 68 65  uplicated in the
268e0 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 2e   output segment.
268f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
26900 74 73 33 49 6e 63 72 6d 65 72 67 65 43 68 6f 6d  ts3IncrmergeChom
26910 70 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  p(.  Fts3Table *
26920 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
26930 20 20 20 20 20 2f 2a 20 46 54 53 20 74 61 62 6c       /* FTS tabl
26940 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71  e handle */.  sq
26950 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 41 62 73  lite3_int64 iAbs
26960 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 2f 2a  Level,        /*
26970 20 41 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20   Absolute level 
26980 63 6f 6e 74 61 69 6e 69 6e 67 20 73 65 67 6d 65  containing segme
26990 6e 74 73 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c  nts */.  Fts3Mul
269a0 74 69 53 65 67 52 65 61 64 65 72 20 2a 70 43 73  tiSegReader *pCs
269b0 72 2c 20 20 20 20 20 20 20 2f 2a 20 43 68 6f 6d  r,       /* Chom
269c0 70 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 6f  p all segments o
269d0 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 63 75  pened by this cu
269e0 72 73 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  rsor */.  int *p
269f0 6e 52 65 6d 20 20 20 20 20 20 20 20 20 20 20 20  nRem            
26a00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
26a10 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
26a20 6e 6f 74 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29  not deleted */.)
26a30 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
26a40 20 6e 52 65 6d 20 3d 20 30 3b 0a 20 20 69 6e 74   nRem = 0;.  int
26a50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26a60 0a 0a 20 20 66 6f 72 28 69 3d 70 43 73 72 2d 3e  ..  for(i=pCsr->
26a70 6e 53 65 67 6d 65 6e 74 2d 31 3b 20 69 3e 3d 30  nSegment-1; i>=0
26a80 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
26a90 4b 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 46 74 73  K; i--){.    Fts
26aa0 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67  3SegReader *pSeg
26ab0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6a 3b   = 0;.    int j;
26ac0 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68  ..    /* Find th
26ad0 65 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20  e Fts3SegReader 
26ae0 6f 62 6a 65 63 74 20 77 69 74 68 20 46 74 73 33  object with Fts3
26af0 53 65 67 52 65 61 64 65 72 2e 69 49 64 78 3d 3d  SegReader.iIdx==
26b00 69 2e 20 49 74 20 69 73 20 68 69 64 69 6e 67 0a  i. It is hiding.
26b10 20 20 20 20 2a 2a 20 73 6f 6d 65 77 68 65 72 65      ** somewhere
26b20 20 69 6e 20 74 68 65 20 70 43 73 72 2d 3e 61 70   in the pCsr->ap
26b30 53 65 67 6d 65 6e 74 5b 5d 20 61 72 72 61 79 2e  Segment[] array.
26b40 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30    */.    for(j=0
26b50 3b 20 41 4c 57 41 59 53 28 6a 3c 70 43 73 72 2d  ; ALWAYS(j<pCsr-
26b60 3e 6e 53 65 67 6d 65 6e 74 29 3b 20 6a 2b 2b 29  >nSegment); j++)
26b70 7b 0a 20 20 20 20 20 20 70 53 65 67 20 3d 20 70  {.      pSeg = p
26b80 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 6a  Csr->apSegment[j
26b90 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  ];.      if( pSe
26ba0 67 2d 3e 69 49 64 78 3d 3d 69 20 29 20 62 72 65  g->iIdx==i ) bre
26bb0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ak;.    }.    as
26bc0 73 65 72 74 28 20 6a 3c 70 43 73 72 2d 3e 6e 53  sert( j<pCsr->nS
26bd0 65 67 6d 65 6e 74 20 26 26 20 70 53 65 67 2d 3e  egment && pSeg->
26be0 69 49 64 78 3d 3d 69 20 29 3b 0a 0a 20 20 20 20  iIdx==i );..    
26bf0 69 66 28 20 70 53 65 67 2d 3e 61 4e 6f 64 65 3d  if( pSeg->aNode=
26c00 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53  =0 ){.      /* S
26c10 65 67 2d 72 65 61 64 65 72 20 69 73 20 61 74 20  eg-reader is at 
26c20 45 4f 46 2e 20 52 65 6d 6f 76 65 20 74 68 65 20  EOF. Remove the 
26c30 65 6e 74 69 72 65 20 69 6e 70 75 74 20 73 65 67  entire input seg
26c40 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72  ment. */.      r
26c50 63 20 3d 20 66 74 73 33 44 65 6c 65 74 65 53 65  c = fts3DeleteSe
26c60 67 6d 65 6e 74 28 70 2c 20 70 53 65 67 29 3b 0a  gment(p, pSeg);.
26c70 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
26c80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26c90 20 20 20 72 63 20 3d 20 66 74 73 33 52 65 6d 6f     rc = fts3Remo
26ca0 76 65 53 65 67 64 69 72 45 6e 74 72 79 28 70 2c  veSegdirEntry(p,
26cb0 20 69 41 62 73 4c 65 76 65 6c 2c 20 70 53 65 67   iAbsLevel, pSeg
26cc0 2d 3e 69 49 64 78 29 3b 0a 20 20 20 20 20 20 7d  ->iIdx);.      }
26cd0 0a 20 20 20 20 20 20 2a 70 6e 52 65 6d 20 3d 20  .      *pnRem = 
26ce0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
26cf0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 63 72 65      /* The incre
26d00 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 64 69 64  mental merge did
26d10 20 6e 6f 74 20 63 6f 70 79 20 61 6c 6c 20 74 68   not copy all th
26d20 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73  e data from this
26d30 20 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65   .      ** segme
26d40 6e 74 20 74 6f 20 74 68 65 20 75 70 70 65 72 20  nt to the upper 
26d50 6c 65 76 65 6c 2e 20 54 68 65 20 73 65 67 6d 65  level. The segme
26d60 6e 74 20 69 73 20 6d 6f 64 69 66 69 65 64 20 69  nt is modified i
26d70 6e 20 70 6c 61 63 65 0a 20 20 20 20 20 20 2a 2a  n place.      **
26d80 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 74   so that it cont
26d90 61 69 6e 73 20 6e 6f 20 6b 65 79 73 20 73 6d 61  ains no keys sma
26da0 6c 6c 65 72 20 74 68 61 6e 20 7a 54 65 72 6d 2f  ller than zTerm/
26db0 6e 54 65 72 6d 2e 20 2a 2f 20 0a 20 20 20 20 20  nTerm. */ .     
26dc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
26dd0 72 6d 20 3d 20 70 53 65 67 2d 3e 7a 54 65 72 6d  rm = pSeg->zTerm
26de0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72  ;.      int nTer
26df0 6d 20 3d 20 70 53 65 67 2d 3e 6e 54 65 72 6d 3b  m = pSeg->nTerm;
26e00 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33  .      rc = fts3
26e10 54 72 75 6e 63 61 74 65 53 65 67 6d 65 6e 74 28  TruncateSegment(
26e20 70 2c 20 69 41 62 73 4c 65 76 65 6c 2c 20 70 53  p, iAbsLevel, pS
26e30 65 67 2d 3e 69 49 64 78 2c 20 7a 54 65 72 6d 2c  eg->iIdx, zTerm,
26e40 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 6e   nTerm);.      n
26e50 52 65 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  Rem++;.    }.  }
26e60 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
26e70 54 45 5f 4f 4b 20 26 26 20 6e 52 65 6d 21 3d 70  TE_OK && nRem!=p
26e80 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 20 29 7b  Csr->nSegment ){
26e90 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 52 65  .    rc = fts3Re
26ea0 70 61 63 6b 53 65 67 64 69 72 4c 65 76 65 6c 28  packSegdirLevel(
26eb0 70 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20  p, iAbsLevel);. 
26ec0 20 7d 0a 0a 20 20 2a 70 6e 52 65 6d 20 3d 20 6e   }..  *pnRem = n
26ed0 52 65 6d 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  Rem;.  return rc
26ee0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 6f 72 65  ;.}../*.** Store
26ef0 20 61 6e 20 69 6e 63 72 2d 6d 65 72 67 65 20 68   an incr-merge h
26f00 69 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  int in the datab
26f10 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
26f20 6e 74 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65  nt fts3Incrmerge
26f30 48 69 6e 74 53 74 6f 72 65 28 46 74 73 33 54 61  HintStore(Fts3Ta
26f40 62 6c 65 20 2a 70 2c 20 42 6c 6f 62 20 2a 70 48  ble *p, Blob *pH
26f50 69 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  int){.  sqlite3_
26f60 73 74 6d 74 20 2a 70 52 65 70 6c 61 63 65 20 3d  stmt *pReplace =
26f70 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   0;.  int rc;   
26f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f90 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
26fa0 63 6f 64 65 20 2a 2f 0a 0a 20 20 72 63 20 3d 20  code */..  rc = 
26fb0 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
26fc0 51 4c 5f 52 45 50 4c 41 43 45 5f 53 54 41 54 2c  QL_REPLACE_STAT,
26fd0 20 26 70 52 65 70 6c 61 63 65 2c 20 30 29 3b 0a   &pReplace, 0);.
26fe0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26ff0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
27000 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 52 65 70  e3_bind_int(pRep
27010 6c 61 63 65 2c 20 31 2c 20 46 54 53 5f 53 54 41  lace, 1, FTS_STA
27020 54 5f 49 4e 43 52 4d 45 52 47 45 48 49 4e 54 29  T_INCRMERGEHINT)
27030 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
27040 6e 64 5f 62 6c 6f 62 28 70 52 65 70 6c 61 63 65  nd_blob(pReplace
27050 2c 20 32 2c 20 70 48 69 6e 74 2d 3e 61 2c 20 70  , 2, pHint->a, p
27060 48 69 6e 74 2d 3e 6e 2c 20 53 51 4c 49 54 45 5f  Hint->n, SQLITE_
27070 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c  STATIC);.    sql
27080 69 74 65 33 5f 73 74 65 70 28 70 52 65 70 6c 61  ite3_step(pRepla
27090 63 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ce);.    rc = sq
270a0 6c 69 74 65 33 5f 72 65 73 65 74 28 70 52 65 70  lite3_reset(pRep
270b0 6c 61 63 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  lace);.  }..  re
270c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
270d0 2a 20 4c 6f 61 64 20 61 6e 20 69 6e 63 72 2d 6d  * Load an incr-m
270e0 65 72 67 65 20 68 69 6e 74 20 66 72 6f 6d 20 74  erge hint from t
270f0 68 65 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  he database. The
27100 20 69 6e 63 72 2d 6d 65 72 67 65 20 68 69 6e 74   incr-merge hint
27110 2c 20 69 66 20 6f 6e 65 20 0a 2a 2a 20 65 78 69  , if one .** exi
27120 73 74 73 2c 20 69 73 20 73 74 6f 72 65 64 20 69  sts, is stored i
27130 6e 20 74 68 65 20 72 6f 77 69 64 3d 3d 31 20 72  n the rowid==1 r
27140 6f 77 20 6f 66 20 74 68 65 20 25 5f 73 74 61 74  ow of the %_stat
27150 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
27160 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70 6f 70   successful, pop
27170 75 6c 61 74 65 20 62 6c 6f 62 20 2a 70 48 69 6e  ulate blob *pHin
27180 74 20 77 69 74 68 20 74 68 65 20 76 61 6c 75 65  t with the value
27190 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25   read from the %
271a0 5f 73 74 61 74 0a 2a 2a 20 74 61 62 6c 65 20 61  _stat.** table a
271b0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
271c0 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  _OK. Otherwise, 
271d0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
271e0 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 0a 2a 2a  rs, return an.**
271f0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
27200 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
27210 74 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 48  t fts3IncrmergeH
27220 69 6e 74 4c 6f 61 64 28 46 74 73 33 54 61 62 6c  intLoad(Fts3Tabl
27230 65 20 2a 70 2c 20 42 6c 6f 62 20 2a 70 48 69 6e  e *p, Blob *pHin
27240 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  t){.  sqlite3_st
27250 6d 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 30 3b  mt *pSelect = 0;
27260 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 70 48  .  int rc;..  pH
27270 69 6e 74 2d 3e 6e 20 3d 20 30 3b 0a 20 20 72 63  int->n = 0;.  rc
27280 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
27290 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 54 41  , SQL_SELECT_STA
272a0 54 2c 20 26 70 53 65 6c 65 63 74 2c 20 30 29 3b  T, &pSelect, 0);
272b0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
272c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
272d0 72 63 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rc2;.    sqlite3
272e0 5f 62 69 6e 64 5f 69 6e 74 28 70 53 65 6c 65 63  _bind_int(pSelec
272f0 74 2c 20 31 2c 20 46 54 53 5f 53 54 41 54 5f 49  t, 1, FTS_STAT_I
27300 4e 43 52 4d 45 52 47 45 48 49 4e 54 29 3b 0a 20  NCRMERGEHINT);. 
27310 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
27320 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
27330 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  pSelect) ){.    
27340 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 48    const char *aH
27350 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  int = sqlite3_co
27360 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 65 6c 65 63  lumn_blob(pSelec
27370 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 6e 74  t, 0);.      int
27380 20 6e 48 69 6e 74 20 3d 20 73 71 6c 69 74 65 33   nHint = sqlite3
27390 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
273a0 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20  elect, 0);.     
273b0 20 69 66 28 20 61 48 69 6e 74 20 29 7b 0a 20 20   if( aHint ){.  
273c0 20 20 20 20 20 20 62 6c 6f 62 47 72 6f 77 42 75        blobGrowBu
273d0 66 66 65 72 28 70 48 69 6e 74 2c 20 6e 48 69 6e  ffer(pHint, nHin
273e0 74 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  t, &rc);.       
273f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27400 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
27410 6d 65 6d 63 70 79 28 70 48 69 6e 74 2d 3e 61 2c  memcpy(pHint->a,
27420 20 61 48 69 6e 74 2c 20 6e 48 69 6e 74 29 3b 0a   aHint, nHint);.
27430 20 20 20 20 20 20 20 20 20 20 70 48 69 6e 74 2d            pHint-
27440 3e 6e 20 3d 20 6e 48 69 6e 74 3b 0a 20 20 20 20  >n = nHint;.    
27450 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
27460 20 20 7d 0a 20 20 20 20 72 63 32 20 3d 20 73 71    }.    rc2 = sq
27470 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 65 6c  lite3_reset(pSel
27480 65 63 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ect);.    if( rc
27490 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
274a0 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 72   = rc2;.  }..  r
274b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
274c0 2a 2a 20 49 66 20 2a 70 52 63 20 69 73 20 6e 6f  ** If *pRc is no
274d0 74 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e  t SQLITE_OK when
274e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
274f0 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
27500 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65  a no-op..** Othe
27510 72 77 69 73 65 2c 20 61 70 70 65 6e 64 20 61 6e  rwise, append an
27520 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 68 69   entry to the hi
27530 6e 74 20 73 74 6f 72 65 64 20 69 6e 20 62 6c 6f  nt stored in blo
27540 62 20 2a 70 48 69 6e 74 2e 20 45 61 63 68 20 65  b *pHint. Each e
27550 6e 74 72 79 0a 2a 2a 20 63 6f 6e 73 69 73 74 73  ntry.** consists
27560 20 6f 66 20 74 77 6f 20 76 61 72 69 6e 74 73 2c   of two varints,
27570 20 74 68 65 20 61 62 73 6f 6c 75 74 65 20 6c 65   the absolute le
27580 76 65 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  vel number of th
27590 65 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73  e input segments
275a0 20 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 75 6d   .** and the num
275b0 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67  ber of input seg
275c0 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ments..**.** If 
275d0 73 75 63 63 65 73 73 66 75 6c 2c 20 6c 65 61 76  successful, leav
275e0 65 20 2a 70 52 63 20 73 65 74 20 74 6f 20 53 51  e *pRc set to SQ
275f0 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75  LITE_OK and retu
27600 72 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  rn. If an error 
27610 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 65 74 20 2a  occurs,.** set *
27620 70 52 63 20 74 6f 20 61 6e 20 53 51 4c 69 74 65  pRc to an SQLite
27630 20 65 72 72 6f 72 20 63 6f 64 65 20 62 65 66 6f   error code befo
27640 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
27650 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
27660 33 49 6e 63 72 6d 65 72 67 65 48 69 6e 74 50 75  3IncrmergeHintPu
27670 73 68 28 0a 20 20 42 6c 6f 62 20 2a 70 48 69 6e  sh(.  Blob *pHin
27680 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
27690 20 20 20 20 20 20 2f 2a 20 48 69 6e 74 20 62 6c        /* Hint bl
276a0 6f 62 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  ob to append to 
276b0 2a 2f 0a 20 20 69 36 34 20 69 41 62 73 4c 65 76  */.  i64 iAbsLev
276c0 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
276d0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 76 61       /* First va
276e0 72 69 6e 74 20 74 6f 20 73 74 6f 72 65 20 69 6e  rint to store in
276f0 20 68 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e   hint */.  int n
27700 49 6e 70 75 74 2c 20 20 20 20 20 20 20 20 20 20  Input,          
27710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
27720 63 6f 6e 64 20 76 61 72 69 6e 74 20 74 6f 20 73  cond varint to s
27730 74 6f 72 65 20 69 6e 20 68 69 6e 74 20 2a 2f 0a  tore in hint */.
27740 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20 20 20    int *pRc      
27750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27760 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72    /* IN/OUT: Err
27770 6f 72 20 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20  or code */.){.  
27780 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28 70  blobGrowBuffer(p
27790 48 69 6e 74 2c 20 70 48 69 6e 74 2d 3e 6e 20 2b  Hint, pHint->n +
277a0 20 32 2a 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d   2*FTS3_VARINT_M
277b0 41 58 2c 20 70 52 63 29 3b 0a 20 20 69 66 28 20  AX, pRc);.  if( 
277c0 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
277d0 29 7b 0a 20 20 20 20 70 48 69 6e 74 2d 3e 6e 20  ){.    pHint->n 
277e0 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75  += sqlite3Fts3Pu
277f0 74 56 61 72 69 6e 74 28 26 70 48 69 6e 74 2d 3e  tVarint(&pHint->
27800 61 5b 70 48 69 6e 74 2d 3e 6e 5d 2c 20 69 41 62  a[pHint->n], iAb
27810 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20 70 48 69  sLevel);.    pHi
27820 6e 74 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33  nt->n += sqlite3
27830 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70  Fts3PutVarint(&p
27840 48 69 6e 74 2d 3e 61 5b 70 48 69 6e 74 2d 3e 6e  Hint->a[pHint->n
27850 5d 2c 20 28 69 36 34 29 6e 49 6e 70 75 74 29 3b  ], (i64)nInput);
27860 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
27870 61 64 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  ad the last entr
27880 79 20 28 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  y (most recently
27890 20 70 75 73 68 65 64 29 20 66 72 6f 6d 20 74 68   pushed) from th
278a0 65 20 68 69 6e 74 20 62 6c 6f 62 20 2a 70 48 69  e hint blob *pHi
278b0 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 6e 20 72  nt.** and then r
278c0 65 6d 6f 76 65 20 74 68 65 20 65 6e 74 72 79 2e  emove the entry.
278d0 20 57 72 69 74 65 20 74 68 65 20 74 77 6f 20 76   Write the two v
278e0 61 6c 75 65 73 20 72 65 61 64 20 74 6f 20 2a 70  alues read to *p
278f0 69 41 62 73 4c 65 76 65 6c 20 61 6e 64 20 0a 2a  iAbsLevel and .*
27900 2a 20 2a 70 6e 49 6e 70 75 74 20 62 65 66 6f 72  * *pnInput befor
27910 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
27920 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** If no error o
27930 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 53 51  ccurs, return SQ
27940 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 20  LITE_OK. If the 
27950 68 69 6e 74 20 62 6c 6f 62 20 69 6e 20 2a 70 48  hint blob in *pH
27960 69 6e 74 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  int does.** not 
27970 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61 73 74  contain at least
27980 20 74 77 6f 20 76 61 6c 69 64 20 76 61 72 69 6e   two valid varin
27990 74 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ts, return SQLIT
279a0 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 2e 0a  E_CORRUPT_VTAB..
279b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
279c0 73 33 49 6e 63 72 6d 65 72 67 65 48 69 6e 74 50  s3IncrmergeHintP
279d0 6f 70 28 42 6c 6f 62 20 2a 70 48 69 6e 74 2c 20  op(Blob *pHint, 
279e0 69 36 34 20 2a 70 69 41 62 73 4c 65 76 65 6c 2c  i64 *piAbsLevel,
279f0 20 69 6e 74 20 2a 70 6e 49 6e 70 75 74 29 7b 0a   int *pnInput){.
27a00 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 48 69 6e    const int nHin
27a10 74 20 3d 20 70 48 69 6e 74 2d 3e 6e 3b 0a 20 20  t = pHint->n;.  
27a20 69 6e 74 20 69 3b 0a 0a 20 20 69 20 3d 20 70 48  int i;..  i = pH
27a30 69 6e 74 2d 3e 6e 2d 32 3b 0a 20 20 77 68 69 6c  int->n-2;.  whil
27a40 65 28 20 69 3e 30 20 26 26 20 28 70 48 69 6e 74  e( i>0 && (pHint
27a50 2d 3e 61 5b 69 2d 31 5d 20 26 20 30 78 38 30 29  ->a[i-1] & 0x80)
27a60 20 29 20 69 2d 2d 3b 0a 20 20 77 68 69 6c 65 28   ) i--;.  while(
27a70 20 69 3e 30 20 26 26 20 28 70 48 69 6e 74 2d 3e   i>0 && (pHint->
27a80 61 5b 69 2d 31 5d 20 26 20 30 78 38 30 29 20 29  a[i-1] & 0x80) )
27a90 20 69 2d 2d 3b 0a 0a 20 20 70 48 69 6e 74 2d 3e   i--;..  pHint->
27aa0 6e 20 3d 20 69 3b 0a 20 20 69 20 2b 3d 20 73 71  n = i;.  i += sq
27ab0 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
27ac0 6e 74 28 26 70 48 69 6e 74 2d 3e 61 5b 69 5d 2c  nt(&pHint->a[i],
27ad0 20 70 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20   piAbsLevel);.  
27ae0 69 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72 69  i += fts3GetVari
27af0 6e 74 33 32 28 26 70 48 69 6e 74 2d 3e 61 5b 69  nt32(&pHint->a[i
27b00 5d 2c 20 70 6e 49 6e 70 75 74 29 3b 0a 20 20 69  ], pnInput);.  i
27b10 66 28 20 69 21 3d 6e 48 69 6e 74 20 29 20 72 65  f( i!=nHint ) re
27b20 74 75 72 6e 20 46 54 53 5f 43 4f 52 52 55 50 54  turn FTS_CORRUPT
27b30 5f 56 54 41 42 3b 0a 0a 20 20 72 65 74 75 72 6e  _VTAB;..  return
27b40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
27b50 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 61 6e  /*.** Attempt an
27b60 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72   incremental mer
27b70 67 65 20 74 68 61 74 20 77 72 69 74 65 73 20 6e  ge that writes n
27b80 4d 65 72 67 65 20 6c 65 61 66 20 62 6c 6f 63 6b  Merge leaf block
27b90 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65  s..**.** Increme
27ba0 6e 74 61 6c 20 6d 65 72 67 65 73 20 68 61 70 70  ntal merges happ
27bb0 65 6e 20 6e 4d 69 6e 20 73 65 67 6d 65 6e 74 73  en nMin segments
27bc0 20 61 74 20 61 20 74 69 6d 65 2e 20 54 68 65 20   at a time. The 
27bd0 73 65 67 6d 65 6e 74 73 20 0a 2a 2a 20 74 6f 20  segments .** to 
27be0 62 65 20 6d 65 72 67 65 64 20 61 72 65 20 74 68  be merged are th
27bf0 65 20 6e 4d 69 6e 20 6f 6c 64 65 73 74 20 73 65  e nMin oldest se
27c00 67 6d 65 6e 74 73 20 28 74 68 65 20 6f 6e 65 73  gments (the ones
27c10 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65   with the smalle
27c20 73 74 20 0a 2a 2a 20 76 61 6c 75 65 73 20 66 6f  st .** values fo
27c30 72 20 74 68 65 20 5f 73 65 67 64 69 72 2e 69 64  r the _segdir.id
27c40 78 20 66 69 65 6c 64 29 20 69 6e 20 74 68 65 20  x field) in the 
27c50 68 69 67 68 65 73 74 20 6c 65 76 65 6c 20 74 68  highest level th
27c60 61 74 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20  at contains .** 
27c70 61 74 20 6c 65 61 73 74 20 6e 4d 69 6e 20 73 65  at least nMin se
27c80 67 6d 65 6e 74 73 2e 20 4d 75 6c 74 69 70 6c 65  gments. Multiple
27c90 20 6d 65 72 67 65 73 20 6d 69 67 68 74 20 6f 63   merges might oc
27ca0 63 75 72 20 69 6e 20 61 6e 20 61 74 74 65 6d 70  cur in an attemp
27cb0 74 20 74 6f 20 0a 2a 2a 20 77 72 69 74 65 20 74  t to .** write t
27cc0 68 65 20 71 75 6f 74 61 20 6f 66 20 6e 4d 65 72  he quota of nMer
27cd0 67 65 20 6c 65 61 66 20 62 6c 6f 63 6b 73 2e 0a  ge leaf blocks..
27ce0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
27cf0 73 33 49 6e 63 72 6d 65 72 67 65 28 46 74 73 33  s3Incrmerge(Fts3
27d00 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 6e 4d  Table *p, int nM
27d10 65 72 67 65 2c 20 69 6e 74 20 6e 4d 69 6e 29 7b  erge, int nMin){
27d20 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
27d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d40 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
27d50 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d 20  e */.  int nRem 
27d60 3d 20 6e 4d 65 72 67 65 3b 20 20 20 20 20 20 20  = nMerge;       
27d70 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
27d80 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 79   of leaf pages y
27d90 65 74 20 74 6f 20 20 62 65 20 77 72 69 74 74 65  et to  be writte
27da0 6e 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69  n */.  Fts3Multi
27db0 53 65 67 52 65 61 64 65 72 20 2a 70 43 73 72 3b  SegReader *pCsr;
27dc0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
27dd0 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 69 6e   used to read in
27de0 70 75 74 20 64 61 74 61 20 2a 2f 0a 20 20 46 74  put data */.  Ft
27df0 73 33 53 65 67 46 69 6c 74 65 72 20 2a 70 46 69  s3SegFilter *pFi
27e00 6c 74 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a  lter;         /*
27e10 20 46 69 6c 74 65 72 20 75 73 65 64 20 77 69 74   Filter used wit
27e20 68 20 63 75 72 73 6f 72 20 70 43 73 72 20 2a 2f  h cursor pCsr */
27e30 0a 20 20 49 6e 63 72 6d 65 72 67 65 57 72 69 74  .  IncrmergeWrit
27e40 65 72 20 2a 70 57 72 69 74 65 72 3b 20 20 20 20  er *pWriter;    
27e50 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a     /* Writer obj
27e60 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65  ect */.  int nSe
27e70 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
27e80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
27e90 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d  er of input segm
27ea0 65 6e 74 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ents */.  sqlite
27eb0 33 5f 69 6e 74 36 34 20 69 41 62 73 4c 65 76 65  3_int64 iAbsLeve
27ec0 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 62 73  l = 0;    /* Abs
27ed0 6f 6c 75 74 65 20 6c 65 76 65 6c 20 6e 75 6d 62  olute level numb
27ee0 65 72 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 2a 2f  er to work on */
27ef0 0a 20 20 42 6c 6f 62 20 68 69 6e 74 20 3d 20 7b  .  Blob hint = {
27f00 30 2c 20 30 2c 20 30 7d 3b 20 20 20 20 20 20 20  0, 0, 0};       
27f10 20 20 20 2f 2a 20 48 69 6e 74 20 72 65 61 64 20     /* Hint read 
27f20 66 72 6f 6d 20 25 5f 73 74 61 74 20 74 61 62 6c  from %_stat tabl
27f30 65 20 2a 2f 0a 20 20 69 6e 74 20 62 44 69 72 74  e */.  int bDirt
27f40 79 48 69 6e 74 20 3d 20 30 3b 20 20 20 20 20 20  yHint = 0;      
27f50 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
27f60 66 20 62 6c 6f 62 20 27 68 69 6e 74 27 20 68 61  f blob 'hint' ha
27f70 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  s been modified 
27f80 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
27f90 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
27fa0 63 75 72 73 6f 72 2c 20 66 69 6c 74 65 72 20 61  cursor, filter a
27fb0 6e 64 20 77 72 69 74 65 72 20 6f 62 6a 65 63 74  nd writer object
27fc0 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  s */.  const int
27fd0 20 6e 41 6c 6c 6f 63 20 3d 20 73 69 7a 65 6f 66   nAlloc = sizeof
27fe0 28 2a 70 43 73 72 29 20 2b 20 73 69 7a 65 6f 66  (*pCsr) + sizeof
27ff0 28 2a 70 46 69 6c 74 65 72 29 20 2b 20 73 69 7a  (*pFilter) + siz
28000 65 6f 66 28 2a 70 57 72 69 74 65 72 29 3b 0a 20  eof(*pWriter);. 
28010 20 70 57 72 69 74 65 72 20 3d 20 28 49 6e 63 72   pWriter = (Incr
28020 6d 65 72 67 65 57 72 69 74 65 72 20 2a 29 73 71  mergeWriter *)sq
28030 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 41 6c  lite3_malloc(nAl
28040 6c 6f 63 29 3b 0a 20 20 69 66 28 20 21 70 57 72  loc);.  if( !pWr
28050 69 74 65 72 20 29 20 72 65 74 75 72 6e 20 53 51  iter ) return SQ
28060 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 46  LITE_NOMEM;.  pF
28070 69 6c 74 65 72 20 3d 20 28 46 74 73 33 53 65 67  ilter = (Fts3Seg
28080 46 69 6c 74 65 72 20 2a 29 26 70 57 72 69 74 65  Filter *)&pWrite
28090 72 5b 31 5d 3b 0a 20 20 70 43 73 72 20 3d 20 28  r[1];.  pCsr = (
280a0 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
280b0 65 72 20 2a 29 26 70 46 69 6c 74 65 72 5b 31 5d  er *)&pFilter[1]
280c0 3b 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 49 6e  ;..  rc = fts3In
280d0 63 72 6d 65 72 67 65 48 69 6e 74 4c 6f 61 64 28  crmergeHintLoad(
280e0 70 2c 20 26 68 69 6e 74 29 3b 0a 20 20 77 68 69  p, &hint);.  whi
280f0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
28100 4b 20 26 26 20 6e 52 65 6d 3e 30 20 29 7b 0a 20  K && nRem>0 ){. 
28110 20 20 20 63 6f 6e 73 74 20 69 36 34 20 6e 4d 6f     const i64 nMo
28120 64 20 3d 20 46 54 53 33 5f 53 45 47 44 49 52 5f  d = FTS3_SEGDIR_
28130 4d 41 58 4c 45 56 45 4c 20 2a 20 70 2d 3e 6e 49  MAXLEVEL * p->nI
28140 6e 64 65 78 3b 0a 20 20 20 20 73 71 6c 69 74 65  ndex;.    sqlite
28150 33 5f 73 74 6d 74 20 2a 70 46 69 6e 64 4c 65 76  3_stmt *pFindLev
28160 65 6c 20 3d 20 30 3b 20 2f 2a 20 53 51 4c 20 75  el = 0; /* SQL u
28170 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
28180 20 69 41 62 73 4c 65 76 65 6c 20 2a 2f 0a 20 20   iAbsLevel */.  
28190 20 20 69 6e 74 20 62 55 73 65 48 69 6e 74 20 3d    int bUseHint =
281a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
281b0 2f 2a 20 54 72 75 65 20 69 66 20 61 74 74 65 6d  /* True if attem
281c0 70 74 69 6e 67 20 74 6f 20 61 70 70 65 6e 64 20  pting to append 
281d0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 20  */.    int iIdx 
281e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
281f0 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20       /* Largest 
28200 69 64 78 20 69 6e 20 6c 65 76 65 6c 20 28 69 41  idx in level (iA
28210 62 73 4c 65 76 65 6c 2b 31 29 20 2a 2f 0a 0a 20  bsLevel+1) */.. 
28220 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65     /* Search the
28230 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 20   %_segdir table 
28240 66 6f 72 20 74 68 65 20 61 62 73 6f 6c 75 74 65  for the absolute
28250 20 6c 65 76 65 6c 20 77 69 74 68 20 74 68 65 20   level with the 
28260 73 6d 61 6c 6c 65 73 74 0a 20 20 20 20 2a 2a 20  smallest.    ** 
28270 72 65 6c 61 74 69 76 65 20 6c 65 76 65 6c 20 6e  relative level n
28280 75 6d 62 65 72 20 74 68 61 74 20 63 6f 6e 74 61  umber that conta
28290 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6e 4d 69  ins at least nMi
282a0 6e 20 73 65 67 6d 65 6e 74 73 2c 20 69 66 20 61  n segments, if a
282b0 6e 79 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e  ny..    ** If on
282c0 65 20 69 73 20 66 6f 75 6e 64 2c 20 73 65 74 20  e is found, set 
282d0 69 41 62 73 4c 65 76 65 6c 20 74 6f 20 74 68 65  iAbsLevel to the
282e0 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20   absolute level 
282f0 6e 75 6d 62 65 72 20 61 6e 64 0a 20 20 20 20 2a  number and.    *
28300 2a 20 6e 53 65 67 20 74 6f 20 6e 4d 69 6e 2e 20  * nSeg to nMin. 
28310 49 66 20 6e 6f 20 6c 65 76 65 6c 20 77 69 74 68  If no level with
28320 20 61 74 20 6c 65 61 73 74 20 6e 4d 69 6e 20 73   at least nMin s
28330 65 67 6d 65 6e 74 73 20 63 61 6e 20 62 65 20 66  egments can be f
28340 6f 75 6e 64 2c 20 0a 20 20 20 20 2a 2a 20 73 65  ound, .    ** se
28350 74 20 6e 53 65 67 20 74 6f 20 2d 31 2e 0a 20 20  t nSeg to -1..  
28360 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74    */.    rc = ft
28370 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
28380 5f 46 49 4e 44 5f 4d 45 52 47 45 5f 4c 45 56 45  _FIND_MERGE_LEVE
28390 4c 2c 20 26 70 46 69 6e 64 4c 65 76 65 6c 2c 20  L, &pFindLevel, 
283a0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
283b0 62 69 6e 64 5f 69 6e 74 28 70 46 69 6e 64 4c 65  bind_int(pFindLe
283c0 76 65 6c 2c 20 31 2c 20 4d 41 58 28 32 2c 20 6e  vel, 1, MAX(2, n
283d0 4d 69 6e 29 29 3b 0a 20 20 20 20 69 66 28 20 73  Min));.    if( s
283e0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 46 69 6e  qlite3_step(pFin
283f0 64 4c 65 76 65 6c 29 3d 3d 53 51 4c 49 54 45 5f  dLevel)==SQLITE_
28400 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 69 41 62  ROW ){.      iAb
28410 73 4c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  sLevel = sqlite3
28420 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 46  _column_int64(pF
28430 69 6e 64 4c 65 76 65 6c 2c 20 30 29 3b 0a 20 20  indLevel, 0);.  
28440 20 20 20 20 6e 53 65 67 20 3d 20 73 71 6c 69 74      nSeg = sqlit
28450 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 46  e3_column_int(pF
28460 69 6e 64 4c 65 76 65 6c 2c 20 31 29 3b 0a 20 20  indLevel, 1);.  
28470 20 20 20 20 61 73 73 65 72 74 28 20 6e 53 65 67      assert( nSeg
28480 3e 3d 32 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  >=2 );.    }else
28490 7b 0a 20 20 20 20 20 20 6e 53 65 67 20 3d 20 2d  {.      nSeg = -
284a0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  1;.    }.    rc 
284b0 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
284c0 70 46 69 6e 64 4c 65 76 65 6c 29 3b 0a 0a 20 20  pFindLevel);..  
284d0 20 20 2f 2a 20 49 66 20 74 68 65 20 68 69 6e 74    /* If the hint
284e0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25   read from the %
284f0 5f 73 74 61 74 20 74 61 62 6c 65 20 69 73 20 6e  _stat table is n
28500 6f 74 20 65 6d 70 74 79 2c 20 63 68 65 63 6b 20  ot empty, check 
28510 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61  if the.    ** la
28520 73 74 20 65 6e 74 72 79 20 69 6e 20 69 74 20 73  st entry in it s
28530 70 65 63 69 66 69 65 73 20 61 20 72 65 6c 61 74  pecifies a relat
28540 69 76 65 20 6c 65 76 65 6c 20 73 6d 61 6c 6c 65  ive level smalle
28550 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  r than or equal.
28560 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 65      ** to the le
28570 76 65 6c 20 69 64 65 6e 74 69 66 69 65 64 20 62  vel identified b
28580 79 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76  y the block abov
28590 65 20 28 69 66 20 61 6e 79 29 2e 20 49 66 20 73  e (if any). If s
285a0 6f 2c 20 74 68 69 73 20 0a 20 20 20 20 2a 2a 20  o, this .    ** 
285b0 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
285c0 20 6c 6f 6f 70 20 77 69 6c 6c 20 77 6f 72 6b 20   loop will work 
285d0 6f 6e 20 6d 65 72 67 69 6e 67 20 61 74 20 74 68  on merging at th
285e0 65 20 68 69 6e 74 65 64 20 6c 65 76 65 6c 2e 0a  e hinted level..
285f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
28600 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
28610 68 69 6e 74 2e 6e 20 29 7b 0a 20 20 20 20 20 20  hint.n ){.      
28620 69 6e 74 20 6e 48 69 6e 74 20 3d 20 68 69 6e 74  int nHint = hint
28630 2e 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  .n;.      sqlite
28640 33 5f 69 6e 74 36 34 20 69 48 69 6e 74 41 62 73  3_int64 iHintAbs
28650 4c 65 76 65 6c 20 3d 20 30 3b 20 20 20 20 20 20  Level = 0;      
28660 2f 2a 20 48 69 6e 74 20 6c 65 76 65 6c 20 2a 2f  /* Hint level */
28670 0a 20 20 20 20 20 20 69 6e 74 20 6e 48 69 6e 74  .      int nHint
28680 53 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Seg = 0;        
28690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
286a0 48 69 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 73  Hint number of s
286b0 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 20 20  egments */..    
286c0 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72 6d    rc = fts3Incrm
286d0 65 72 67 65 48 69 6e 74 50 6f 70 28 26 68 69 6e  ergeHintPop(&hin
286e0 74 2c 20 26 69 48 69 6e 74 41 62 73 4c 65 76 65  t, &iHintAbsLeve
286f0 6c 2c 20 26 6e 48 69 6e 74 53 65 67 29 3b 0a 20  l, &nHintSeg);. 
28700 20 20 20 20 20 69 66 28 20 6e 53 65 67 3c 30 20       if( nSeg<0 
28710 7c 7c 20 28 69 41 62 73 4c 65 76 65 6c 20 25 20  || (iAbsLevel % 
28720 6e 4d 6f 64 29 20 3e 3d 20 28 69 48 69 6e 74 41  nMod) >= (iHintA
28730 62 73 4c 65 76 65 6c 20 25 20 6e 4d 6f 64 29 20  bsLevel % nMod) 
28740 29 7b 0a 20 20 20 20 20 20 20 20 69 41 62 73 4c  ){.        iAbsL
28750 65 76 65 6c 20 3d 20 69 48 69 6e 74 41 62 73 4c  evel = iHintAbsL
28760 65 76 65 6c 3b 0a 20 20 20 20 20 20 20 20 6e 53  evel;.        nS
28770 65 67 20 3d 20 6e 48 69 6e 74 53 65 67 3b 0a 20  eg = nHintSeg;. 
28780 20 20 20 20 20 20 20 62 55 73 65 48 69 6e 74 20         bUseHint 
28790 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 44 69  = 1;.        bDi
287a0 72 74 79 48 69 6e 74 20 3d 20 31 3b 0a 20 20 20  rtyHint = 1;.   
287b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
287c0 20 20 2f 2a 20 54 68 69 73 20 75 6e 64 6f 65 73    /* This undoes
287d0 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74   the effect of t
287e0 68 65 20 48 69 6e 74 50 6f 70 28 29 20 61 62 6f  he HintPop() abo
287f0 76 65 20 2d 20 73 6f 20 74 68 61 74 20 6e 6f 20  ve - so that no 
28800 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2a  entry.        **
28810 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   is removed from
28820 20 74 68 65 20 68 69 6e 74 20 62 6c 6f 62 2e 20   the hint blob. 
28830 20 2a 2f 0a 20 20 20 20 20 20 20 20 68 69 6e 74   */.        hint
28840 2e 6e 20 3d 20 6e 48 69 6e 74 3b 0a 20 20 20 20  .n = nHint;.    
28850 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
28860 2a 20 49 66 20 6e 53 65 67 20 69 73 20 6c 65 73  * If nSeg is les
28870 73 20 74 68 61 74 20 7a 65 72 6f 2c 20 74 68 65  s that zero, the
28880 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 65  n there is no le
28890 76 65 6c 20 77 69 74 68 20 61 74 20 6c 65 61 73  vel with at leas
288a0 74 0a 20 20 20 20 2a 2a 20 6e 4d 69 6e 20 73 65  t.    ** nMin se
288b0 67 6d 65 6e 74 73 20 61 6e 64 20 6e 6f 20 68 69  gments and no hi
288c0 6e 74 20 69 6e 20 74 68 65 20 25 5f 73 74 61 74  nt in the %_stat
288d0 20 74 61 62 6c 65 2e 20 4e 6f 20 77 6f 72 6b 20   table. No work 
288e0 74 6f 20 64 6f 2e 0a 20 20 20 20 2a 2a 20 45 78  to do..    ** Ex
288f0 69 74 20 65 61 72 6c 79 20 69 6e 20 74 68 69 73  it early in this
28900 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69   case.  */.    i
28910 66 28 20 6e 53 65 67 3c 30 20 29 20 62 72 65 61  f( nSeg<0 ) brea
28920 6b 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  k;..    /* Open 
28930 61 20 63 75 72 73 6f 72 20 74 6f 20 69 74 65 72  a cursor to iter
28940 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
28950 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
28960 6f 6c 64 65 73 74 20 6e 53 65 67 20 0a 20 20 20  oldest nSeg .   
28970 20 2a 2a 20 69 6e 64 65 78 65 73 20 6f 66 20 61   ** indexes of a
28980 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 69 41  bsolute level iA
28990 62 73 4c 65 76 65 6c 2e 20 49 66 20 74 68 69 73  bsLevel. If this
289a0 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65   cursor is opene
289b0 64 20 75 73 69 6e 67 20 0a 20 20 20 20 2a 2a 20  d using .    ** 
289c0 74 68 65 20 27 68 69 6e 74 27 20 70 61 72 61 6d  the 'hint' param
289d0 65 74 65 72 73 2c 20 69 74 20 69 73 20 70 6f 73  eters, it is pos
289e0 73 69 62 6c 65 20 74 68 61 74 20 74 68 65 72 65  sible that there
289f0 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 6e   are less than n
28a00 53 65 67 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65  Seg.    ** segme
28a10 6e 74 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  nts available in
28a20 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c   level iAbsLevel
28a30 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
28a40 6e 6f 20 77 6f 72 6b 20 69 73 0a 20 20 20 20 2a  no work is.    *
28a50 2a 20 64 6f 6e 65 20 6f 6e 20 69 41 62 73 4c 65  * done on iAbsLe
28a60 76 65 6c 20 2d 20 66 61 6c 6c 20 74 68 72 6f 75  vel - fall throu
28a70 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  gh to the next i
28a80 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
28a90 6c 6f 6f 70 20 0a 20 20 20 20 2a 2a 20 74 6f 20  loop .    ** to 
28aa0 73 74 61 72 74 20 77 6f 72 6b 20 6f 6e 20 73 6f  start work on so
28ab0 6d 65 20 6f 74 68 65 72 20 6c 65 76 65 6c 2e 20  me other level. 
28ac0 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   */.    memset(p
28ad0 57 72 69 74 65 72 2c 20 30 2c 20 6e 41 6c 6c 6f  Writer, 0, nAllo
28ae0 63 29 3b 0a 20 20 20 20 70 46 69 6c 74 65 72 2d  c);.    pFilter-
28af0 3e 66 6c 61 67 73 20 3d 20 46 54 53 33 5f 53 45  >flags = FTS3_SE
28b00 47 4d 45 4e 54 5f 52 45 51 55 49 52 45 5f 50 4f  GMENT_REQUIRE_PO
28b10 53 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  S;..    if( rc==
28b20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28b30 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72     rc = fts3Incr
28b40 6d 65 72 67 65 4f 75 74 70 75 74 49 64 78 28 70  mergeOutputIdx(p
28b50 2c 20 69 41 62 73 4c 65 76 65 6c 2c 20 26 69 49  , iAbsLevel, &iI
28b60 64 78 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  dx);.      asser
28b70 74 28 20 62 55 73 65 48 69 6e 74 3d 3d 31 20 7c  t( bUseHint==1 |
28b80 7c 20 62 55 73 65 48 69 6e 74 3d 3d 30 20 29 3b  | bUseHint==0 );
28b90 0a 20 20 20 20 20 20 69 66 28 20 69 49 64 78 3d  .      if( iIdx=
28ba0 3d 30 20 7c 7c 20 28 62 55 73 65 48 69 6e 74 20  =0 || (bUseHint 
28bb0 26 26 20 69 49 64 78 3d 3d 31 29 20 29 7b 0a 20  && iIdx==1) ){. 
28bc0 20 20 20 20 20 20 20 69 6e 74 20 62 49 67 6e 6f         int bIgno
28bd0 72 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  re = 0;.        
28be0 72 63 20 3d 20 66 74 73 33 53 65 67 6d 65 6e 74  rc = fts3Segment
28bf0 49 73 4d 61 78 4c 65 76 65 6c 28 70 2c 20 69 41  IsMaxLevel(p, iA
28c00 62 73 4c 65 76 65 6c 2b 31 2c 20 26 62 49 67 6e  bsLevel+1, &bIgn
28c10 6f 72 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ore);.        if
28c20 28 20 62 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20  ( bIgnore ){.   
28c30 20 20 20 20 20 20 20 70 46 69 6c 74 65 72 2d 3e         pFilter->
28c40 66 6c 61 67 73 20 7c 3d 20 46 54 53 33 5f 53 45  flags |= FTS3_SE
28c50 47 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d 50  GMENT_IGNORE_EMP
28c60 54 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  TY;.        }.  
28c70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
28c80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28c90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
28ca0 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 43 73   fts3IncrmergeCs
28cb0 72 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 2c 20  r(p, iAbsLevel, 
28cc0 6e 53 65 67 2c 20 70 43 73 72 29 3b 0a 20 20 20  nSeg, pCsr);.   
28cd0 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54   }.    if( SQLIT
28ce0 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 70 43 73 72  E_OK==rc && pCsr
28cf0 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 6e 53 65 67  ->nSegment==nSeg
28d00 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f  .     && SQLITE_
28d10 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK==(rc = sqlite
28d20 33 46 74 73 33 53 65 67 52 65 61 64 65 72 53 74  3Fts3SegReaderSt
28d30 61 72 74 28 70 2c 20 70 43 73 72 2c 20 70 46 69  art(p, pCsr, pFi
28d40 6c 74 65 72 29 29 0a 20 20 20 20 20 26 26 20 53  lter)).     && S
28d50 51 4c 49 54 45 5f 52 4f 57 3d 3d 28 72 63 20 3d  QLITE_ROW==(rc =
28d60 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
28d70 65 61 64 65 72 53 74 65 70 28 70 2c 20 70 43 73  eaderStep(p, pCs
28d80 72 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  r)).    ){.     
28d90 20 69 66 28 20 62 55 73 65 48 69 6e 74 20 26 26   if( bUseHint &&
28da0 20 69 49 64 78 3e 30 20 29 7b 0a 20 20 20 20 20   iIdx>0 ){.     
28db0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
28dc0 4b 65 79 20 3d 20 70 43 73 72 2d 3e 7a 54 65 72  Key = pCsr->zTer
28dd0 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  m;.        int n
28de0 4b 65 79 20 3d 20 70 43 73 72 2d 3e 6e 54 65 72  Key = pCsr->nTer
28df0 6d 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  m;.        rc = 
28e00 66 74 73 33 49 6e 63 72 6d 65 72 67 65 4c 6f 61  fts3IncrmergeLoa
28e10 64 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 2c 20  d(p, iAbsLevel, 
28e20 69 49 64 78 2d 31 2c 20 7a 4b 65 79 2c 20 6e 4b  iIdx-1, zKey, nK
28e30 65 79 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  ey, pWriter);.  
28e40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28e50 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72     rc = fts3Incr
28e60 6d 65 72 67 65 57 72 69 74 65 72 28 70 2c 20 69  mergeWriter(p, i
28e70 41 62 73 4c 65 76 65 6c 2c 20 69 49 64 78 2c 20  AbsLevel, iIdx, 
28e80 70 43 73 72 2c 20 70 57 72 69 74 65 72 29 3b 0a  pCsr, pWriter);.
28e90 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
28ea0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28eb0 20 26 26 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65   && pWriter->nLe
28ec0 61 66 45 73 74 20 29 7b 0a 20 20 20 20 20 20 20  afEst ){.       
28ed0 20 66 74 73 33 4c 6f 67 4d 65 72 67 65 28 6e 53   fts3LogMerge(nS
28ee0 65 67 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a  eg, iAbsLevel);.
28ef0 20 20 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20          do {.   
28f00 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33         rc = fts3
28f10 49 6e 63 72 6d 65 72 67 65 41 70 70 65 6e 64 28  IncrmergeAppend(
28f20 70 2c 20 70 57 72 69 74 65 72 2c 20 70 43 73 72  p, pWriter, pCsr
28f30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
28f40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28f50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
28f60 33 53 65 67 52 65 61 64 65 72 53 74 65 70 28 70  3SegReaderStep(p
28f70 2c 20 70 43 73 72 29 3b 0a 20 20 20 20 20 20 20  , pCsr);.       
28f80 20 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e     if( pWriter->
28f90 6e 57 6f 72 6b 3e 3d 6e 52 65 6d 20 26 26 20 72  nWork>=nRem && r
28fa0 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 20  c==SQLITE_ROW ) 
28fb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
28fc0 20 20 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20          }while( 
28fd0 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  rc==SQLITE_ROW )
28fe0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 70  ;..        /* Up
28ff0 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65 20 74  date or delete t
29000 68 65 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  he input segment
29010 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  s */.        if(
29020 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29030 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 52 65 6d  {.          nRem
29040 20 2d 3d 20 28 31 20 2b 20 70 57 72 69 74 65 72   -= (1 + pWriter
29050 2d 3e 6e 57 6f 72 6b 29 3b 0a 20 20 20 20 20 20  ->nWork);.      
29060 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63      rc = fts3Inc
29070 72 6d 65 72 67 65 43 68 6f 6d 70 28 70 2c 20 69  rmergeChomp(p, i
29080 41 62 73 4c 65 76 65 6c 2c 20 70 43 73 72 2c 20  AbsLevel, pCsr, 
29090 26 6e 53 65 67 29 3b 0a 20 20 20 20 20 20 20 20  &nSeg);.        
290a0 20 20 69 66 28 20 6e 53 65 67 21 3d 30 20 29 7b    if( nSeg!=0 ){
290b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 44 69  .            bDi
290c0 72 74 79 48 69 6e 74 20 3d 20 31 3b 0a 20 20 20  rtyHint = 1;.   
290d0 20 20 20 20 20 20 20 20 20 66 74 73 33 49 6e 63           fts3Inc
290e0 72 6d 65 72 67 65 48 69 6e 74 50 75 73 68 28 26  rmergeHintPush(&
290f0 68 69 6e 74 2c 20 69 41 62 73 4c 65 76 65 6c 2c  hint, iAbsLevel,
29100 20 6e 53 65 67 2c 20 26 72 63 29 3b 0a 20 20 20   nSeg, &rc);.   
29110 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29120 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
29130 20 20 69 66 28 20 6e 53 65 67 21 3d 30 20 29 7b    if( nSeg!=0 ){
29140 0a 20 20 20 20 20 20 20 20 70 57 72 69 74 65 72  .        pWriter
29150 2d 3e 6e 4c 65 61 66 44 61 74 61 20 3d 20 70 57  ->nLeafData = pW
29160 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61 74 61  riter->nLeafData
29170 20 2a 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   * -1;.      }. 
29180 20 20 20 20 20 66 74 73 33 49 6e 63 72 6d 65 72       fts3Incrmer
29190 67 65 52 65 6c 65 61 73 65 28 70 2c 20 70 57 72  geRelease(p, pWr
291a0 69 74 65 72 2c 20 26 72 63 29 3b 0a 20 20 20 20  iter, &rc);.    
291b0 20 20 69 66 28 20 6e 53 65 67 3d 3d 30 20 26 26    if( nSeg==0 &&
291c0 20 70 57 72 69 74 65 72 2d 3e 62 4e 6f 4c 65 61   pWriter->bNoLea
291d0 66 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20  fData==0 ){.    
291e0 20 20 20 20 66 74 73 33 50 72 6f 6d 6f 74 65 53      fts3PromoteS
291f0 65 67 6d 65 6e 74 73 28 70 2c 20 69 41 62 73 4c  egments(p, iAbsL
29200 65 76 65 6c 2b 31 2c 20 70 57 72 69 74 65 72 2d  evel+1, pWriter-
29210 3e 6e 4c 65 61 66 44 61 74 61 29 3b 0a 20 20 20  >nLeafData);.   
29220 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
29230 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
29240 61 64 65 72 46 69 6e 69 73 68 28 70 43 73 72 29  aderFinish(pCsr)
29250 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
29260 65 20 74 68 65 20 68 69 6e 74 20 76 61 6c 75 65  e the hint value
29270 73 20 69 6e 74 6f 20 74 68 65 20 25 5f 73 74 61  s into the %_sta
29280 74 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20  t table for the 
29290 6e 65 78 74 20 69 6e 63 72 2d 6d 65 72 67 65 72  next incr-merger
292a0 20 2a 2f 0a 20 20 69 66 28 20 62 44 69 72 74 79   */.  if( bDirty
292b0 48 69 6e 74 20 26 26 20 72 63 3d 3d 53 51 4c 49  Hint && rc==SQLI
292c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
292d0 3d 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 48  = fts3IncrmergeH
292e0 69 6e 74 53 74 6f 72 65 28 70 2c 20 26 68 69 6e  intStore(p, &hin
292f0 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  t);.  }..  sqlit
29300 65 33 5f 66 72 65 65 28 70 57 72 69 74 65 72 29  e3_free(pWriter)
29310 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
29320 28 68 69 6e 74 2e 61 29 3b 0a 20 20 72 65 74 75  (hint.a);.  retu
29330 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29340 43 6f 6e 76 65 72 74 20 74 68 65 20 74 65 78 74  Convert the text
29350 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 2a 70   beginning at *p
29360 7a 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65  z into an intege
29370 72 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  r and return.** 
29380 69 74 73 20 76 61 6c 75 65 2e 20 20 41 64 76 61  its value.  Adva
29390 6e 63 65 20 2a 70 7a 20 74 6f 20 70 6f 69 6e 74  nce *pz to point
293a0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 68   to the first ch
293b0 61 72 61 63 74 65 72 20 70 61 73 74 0a 2a 2a 20  aracter past.** 
293c0 74 68 65 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a  the integer..**.
293d0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
293e0 20 75 73 65 64 20 66 6f 72 20 70 61 72 61 6d 65   used for parame
293f0 74 65 72 73 20 74 6f 20 6d 65 72 67 65 3d 20 61  ters to merge= a
29400 6e 64 20 69 6e 63 72 6d 65 72 67 65 3d 0a 2a 2a  nd incrmerge=.**
29410 20 63 6f 6d 6d 61 6e 64 73 2e 20 0a 2a 2f 0a 73   commands. .*/.s
29420 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 47 65  tatic int fts3Ge
29430 74 69 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20  tint(const char 
29440 2a 2a 70 7a 29 7b 0a 20 20 63 6f 6e 73 74 20 63  **pz){.  const c
29450 68 61 72 20 2a 7a 20 3d 20 2a 70 7a 3b 0a 20 20  har *z = *pz;.  
29460 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 77 68 69  int i = 0;.  whi
29470 6c 65 28 20 28 2a 7a 29 3e 3d 27 30 27 20 26 26  le( (*z)>='0' &&
29480 20 28 2a 7a 29 3c 3d 27 39 27 20 26 26 20 69 3c   (*z)<='9' && i<
29490 32 31 34 37 34 38 33 36 33 20 29 20 69 20 3d 20  214748363 ) i = 
294a0 31 30 2a 69 20 2b 20 2a 28 7a 2b 2b 29 20 2d 20  10*i + *(z++) - 
294b0 27 30 27 3b 0a 20 20 2a 70 7a 20 3d 20 7a 3b 0a  '0';.  *pz = z;.
294c0 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f    return i;.}../
294d0 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 73 74 61  *.** Process sta
294e0 74 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 66  tements of the f
294f0 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49 4e  orm:.**.**    IN
29500 53 45 52 54 20 49 4e 54 4f 20 74 61 62 6c 65 28  SERT INTO table(
29510 74 61 62 6c 65 29 20 56 41 4c 55 45 53 28 27 6d  table) VALUES('m
29520 65 72 67 65 3d 41 2c 42 27 29 3b 0a 2a 2a 0a 2a  erge=A,B');.**.*
29530 2a 20 41 20 61 6e 64 20 42 20 61 72 65 20 69 6e  * A and B are in
29540 74 65 67 65 72 73 20 74 68 61 74 20 64 65 63 6f  tegers that deco
29550 64 65 20 74 6f 20 62 65 20 74 68 65 20 6e 75 6d  de to be the num
29560 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65  ber of leaf page
29570 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 66 6f 72  s.** written for
29580 20 74 68 65 20 6d 65 72 67 65 2c 20 61 6e 64 20   the merge, and 
29590 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6e 75 6d 62  the minimum numb
295a0 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 6f  er of segments o
295b0 6e 20 61 20 6c 65 76 65 6c 0a 2a 2a 20 62 65 66  n a level.** bef
295c0 6f 72 65 20 69 74 20 77 69 6c 6c 20 62 65 20 73  ore it will be s
295d0 65 6c 65 63 74 65 64 20 66 6f 72 20 61 20 6d 65  elected for a me
295e0 72 67 65 2c 20 72 65 73 70 65 63 74 69 76 65 6c  rge, respectivel
295f0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
29600 20 66 74 73 33 44 6f 49 6e 63 72 6d 65 72 67 65   fts3DoIncrmerge
29610 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
29620 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29630 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c      /* FTS3 tabl
29640 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f  e handle */.  co
29650 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
29660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29670 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   Nul-terminated 
29680 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
29690 67 20 22 41 2c 42 22 20 2a 2f 0a 29 7b 0a 20 20  g "A,B" */.){.  
296a0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4d  int rc;.  int nM
296b0 69 6e 20 3d 20 28 46 54 53 33 5f 4d 45 52 47 45  in = (FTS3_MERGE
296c0 5f 43 4f 55 4e 54 20 2f 20 32 29 3b 0a 20 20 69  _COUNT / 2);.  i
296d0 6e 74 20 6e 4d 65 72 67 65 20 3d 20 30 3b 0a 20  nt nMerge = 0;. 
296e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
296f0 20 7a 50 61 72 61 6d 3b 0a 0a 20 20 2f 2a 20 52   zParam;..  /* R
29700 65 61 64 20 74 68 65 20 66 69 72 73 74 20 69 6e  ead the first in
29710 74 65 67 65 72 20 76 61 6c 75 65 20 2a 2f 0a 20  teger value */. 
29720 20 6e 4d 65 72 67 65 20 3d 20 66 74 73 33 47 65   nMerge = fts3Ge
29730 74 69 6e 74 28 26 7a 29 3b 0a 0a 20 20 2f 2a 20  tint(&z);..  /* 
29740 49 66 20 74 68 65 20 66 69 72 73 74 20 69 6e 74  If the first int
29750 65 67 65 72 20 76 61 6c 75 65 20 69 73 20 66 6f  eger value is fo
29760 6c 6c 6f 77 65 64 20 62 79 20 61 20 27 2c 27 2c  llowed by a ',',
29770 20 20 72 65 61 64 20 74 68 65 20 73 65 63 6f 6e    read the secon
29780 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 76  d.  ** integer v
29790 61 6c 75 65 2e 20 2a 2f 0a 20 20 69 66 28 20 7a  alue. */.  if( z
297a0 5b 30 5d 3d 3d 27 2c 27 20 26 26 20 7a 5b 31 5d  [0]==',' && z[1]
297b0 21 3d 27 5c 30 27 20 29 7b 0a 20 20 20 20 7a 2b  !='\0' ){.    z+
297c0 2b 3b 0a 20 20 20 20 6e 4d 69 6e 20 3d 20 66 74  +;.    nMin = ft
297d0 73 33 47 65 74 69 6e 74 28 26 7a 29 3b 0a 20 20  s3Getint(&z);.  
297e0 7d 0a 0a 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27  }..  if( z[0]!='
297f0 5c 30 27 20 7c 7c 20 6e 4d 69 6e 3c 32 20 29 7b  \0' || nMin<2 ){
29800 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
29810 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b  _ERROR;.  }else{
29820 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
29830 5f 4f 4b 3b 0a 20 20 20 20 69 66 28 20 21 70 2d  _OK;.    if( !p-
29840 3e 62 48 61 73 53 74 61 74 20 29 7b 0a 20 20 20  >bHasStat ){.   
29850 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 46     assert( p->bF
29860 74 73 34 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ts4==0 );.      
29870 73 71 6c 69 74 65 33 46 74 73 33 43 72 65 61 74  sqlite3Fts3Creat
29880 65 53 74 61 74 54 61 62 6c 65 28 26 72 63 2c 20  eStatTable(&rc, 
29890 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  p);.    }.    if
298a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
298b0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
298c0 6c 69 74 65 33 46 74 73 33 49 6e 63 72 6d 65 72  lite3Fts3Incrmer
298d0 67 65 28 70 2c 20 6e 4d 65 72 67 65 2c 20 6e 4d  ge(p, nMerge, nM
298e0 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  in);.    }.    s
298f0 71 6c 69 74 65 33 46 74 73 33 53 65 67 6d 65 6e  qlite3Fts3Segmen
29900 74 73 43 6c 6f 73 65 28 70 29 3b 0a 20 20 7d 0a  tsClose(p);.  }.
29910 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
29920 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 73 74  /*.** Process st
29930 61 74 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  atements of the 
29940 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49  form:.**.**    I
29950 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 62 6c 65  NSERT INTO table
29960 28 74 61 62 6c 65 29 20 56 41 4c 55 45 53 28 27  (table) VALUES('
29970 61 75 74 6f 6d 65 72 67 65 3d 58 27 29 3b 0a 2a  automerge=X');.*
29980 2a 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20  *.** where X is 
29990 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 58 3d 3d  an integer.  X==
299a0 30 20 6d 65 61 6e 73 20 74 6f 20 74 75 72 6e 20  0 means to turn 
299b0 61 75 74 6f 6d 65 72 67 65 20 6f 66 66 2e 20 20  automerge off.  
299c0 58 21 3d 30 20 6d 65 61 6e 73 0a 2a 2a 20 74 75  X!=0 means.** tu
299d0 72 6e 20 69 74 20 6f 6e 2e 20 20 54 68 65 20 73  rn it on.  The s
299e0 65 74 74 69 6e 67 20 69 73 20 70 65 72 73 69 73  etting is persis
299f0 74 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tent..*/.static 
29a00 69 6e 74 20 66 74 73 33 44 6f 41 75 74 6f 69 6e  int fts3DoAutoin
29a10 63 72 6d 65 72 67 65 28 0a 20 20 46 74 73 33 54  crmerge(.  Fts3T
29a20 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
29a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
29a40 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  S3 table handle 
29a50 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
29a60 2a 7a 50 61 72 61 6d 20 20 20 20 20 20 20 20 20  *zParam         
29a70 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d       /* Nul-term
29a80 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f  inated string co
29a90 6e 74 61 69 6e 69 6e 67 20 62 6f 6f 6c 65 61 6e  ntaining boolean
29aa0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
29ab0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  = SQLITE_OK;.  s
29ac0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
29ad0 6d 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 41 75  mt = 0;.  p->nAu
29ae0 74 6f 69 6e 63 72 6d 65 72 67 65 20 3d 20 66 74  toincrmerge = ft
29af0 73 33 47 65 74 69 6e 74 28 26 7a 50 61 72 61 6d  s3Getint(&zParam
29b00 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 41 75 74  );.  if( p->nAut
29b10 6f 69 6e 63 72 6d 65 72 67 65 3d 3d 31 20 7c 7c  oincrmerge==1 ||
29b20 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d 65 72   p->nAutoincrmer
29b30 67 65 3e 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f  ge>FTS3_MERGE_CO
29b40 55 4e 54 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41  UNT ){.    p->nA
29b50 75 74 6f 69 6e 63 72 6d 65 72 67 65 20 3d 20 38  utoincrmerge = 8
29b60 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 2d 3e  ;.  }.  if( !p->
29b70 62 48 61 73 53 74 61 74 20 29 7b 0a 20 20 20 20  bHasStat ){.    
29b80 61 73 73 65 72 74 28 20 70 2d 3e 62 46 74 73 34  assert( p->bFts4
29b90 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==0 );.    sqlit
29ba0 65 33 46 74 73 33 43 72 65 61 74 65 53 74 61 74  e3Fts3CreateStat
29bb0 54 61 62 6c 65 28 26 72 63 2c 20 70 29 3b 0a 20  Table(&rc, p);. 
29bc0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
29bd0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20  rn rc;.  }.  rc 
29be0 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
29bf0 20 53 51 4c 5f 52 45 50 4c 41 43 45 5f 53 54 41   SQL_REPLACE_STA
29c00 54 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  T, &pStmt, 0);. 
29c10 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
29c20 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62   rc;.  sqlite3_b
29c30 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31  ind_int(pStmt, 1
29c40 2c 20 46 54 53 5f 53 54 41 54 5f 41 55 54 4f 49  , FTS_STAT_AUTOI
29c50 4e 43 52 4d 45 52 47 45 29 3b 0a 20 20 73 71 6c  NCRMERGE);.  sql
29c60 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53  ite3_bind_int(pS
29c70 74 6d 74 2c 20 32 2c 20 70 2d 3e 6e 41 75 74 6f  tmt, 2, p->nAuto
29c80 69 6e 63 72 6d 65 72 67 65 29 3b 0a 20 20 73 71  incrmerge);.  sq
29c90 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
29ca0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
29cb0 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
29cc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
29cd0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 36  /*.** Return a 6
29ce0 34 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 66  4-bit checksum f
29cf0 6f 72 20 74 68 65 20 46 54 53 20 69 6e 64 65 78  or the FTS index
29d00 20 65 6e 74 72 79 20 73 70 65 63 69 66 69 65 64   entry specified
29d10 20 62 79 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d   by the.** argum
29d20 65 6e 74 73 20 74 6f 20 74 68 69 73 20 66 75 6e  ents to this fun
29d30 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
29d40 20 75 36 34 20 66 74 73 33 43 68 65 63 6b 73 75   u64 fts3Checksu
29d50 6d 45 6e 74 72 79 28 0a 20 20 63 6f 6e 73 74 20  mEntry(.  const 
29d60 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20  char *zTerm,    
29d70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
29d80 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
29d90 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d 20 2a  ontaining term *
29da0 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20  /.  int nTerm,  
29db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29dc0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a      /* Size of z
29dd0 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f  Term in bytes */
29de0 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20  .  int iLangid, 
29df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e00 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69     /* Language i
29e10 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20 72 6f  d for current ro
29e20 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65  w */.  int iInde
29e30 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
29e40 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
29e50 28 30 2e 2e 46 74 73 33 54 61 62 6c 65 2e 6e 49  (0..Fts3Table.nI
29e60 6e 64 65 78 2d 31 29 20 2a 2f 0a 20 20 69 36 34  ndex-1) */.  i64
29e70 20 69 44 6f 63 69 64 2c 20 20 20 20 20 20 20 20   iDocid,        
29e80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29e90 44 6f 63 69 64 20 66 6f 72 20 63 75 72 72 65 6e  Docid for curren
29ea0 74 20 72 6f 77 2e 20 2a 2f 0a 20 20 69 6e 74 20  t row. */.  int 
29eb0 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  iCol,           
29ec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
29ed0 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 2a 2f 0a  olumn number */.
29ee0 20 20 69 6e 74 20 69 50 6f 73 20 20 20 20 20 20    int iPos      
29ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f00 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 2a 2f    /* Position */
29f10 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75  .){.  int i;.  u
29f20 36 34 20 72 65 74 20 3d 20 28 75 36 34 29 69 44  64 ret = (u64)iD
29f30 6f 63 69 64 3b 0a 0a 20 20 72 65 74 20 2b 3d 20  ocid;..  ret += 
29f40 28 72 65 74 3c 3c 33 29 20 2b 20 69 4c 61 6e 67  (ret<<3) + iLang
29f50 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65  id;.  ret += (re
29f60 74 3c 3c 33 29 20 2b 20 69 49 6e 64 65 78 3b 0a  t<<3) + iIndex;.
29f70 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33    ret += (ret<<3
29f80 29 20 2b 20 69 43 6f 6c 3b 0a 20 20 72 65 74 20  ) + iCol;.  ret 
29f90 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 50  += (ret<<3) + iP
29fa0 6f 73 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  os;.  for(i=0; i
29fb0 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 20 72 65 74  <nTerm; i++) ret
29fc0 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 7a   += (ret<<3) + z
29fd0 54 65 72 6d 5b 69 5d 3b 0a 0a 20 20 72 65 74 75  Term[i];..  retu
29fe0 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn ret;.}../*.**
29ff0 20 52 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73   Return a checks
2a000 75 6d 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65  um of all entrie
2a010 73 20 69 6e 20 74 68 65 20 46 54 53 20 69 6e 64  s in the FTS ind
2a020 65 78 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  ex that correspo
2a030 6e 64 20 74 6f 0a 2a 2a 20 6c 61 6e 67 75 61 67  nd to.** languag
2a040 65 20 69 64 20 69 4c 61 6e 67 69 64 2e 20 54 68  e id iLangid. Th
2a050 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 63 61  e checksum is ca
2a060 6c 63 75 6c 61 74 65 64 20 62 79 20 58 4f 52 69  lculated by XORi
2a070 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  ng the checksums
2a080 0a 2a 2a 20 6f 66 20 65 61 63 68 20 69 6e 64 69  .** of each indi
2a090 76 69 64 75 61 6c 20 65 6e 74 72 79 20 28 73 65  vidual entry (se
2a0a0 65 20 66 74 73 33 43 68 65 63 6b 73 75 6d 45 6e  e fts3ChecksumEn
2a0b0 74 72 79 28 29 29 20 74 6f 67 65 74 68 65 72 2e  try()) together.
2a0c0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
2a0d0 73 66 75 6c 2c 20 74 68 65 20 63 68 65 63 6b 73  sful, the checks
2a0e0 75 6d 20 76 61 6c 75 65 20 69 73 20 72 65 74 75  um value is retu
2a0f0 72 6e 65 64 20 61 6e 64 20 2a 70 52 63 20 73 65  rned and *pRc se
2a100 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  t to SQLITE_OK..
2a110 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
2a120 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2a130 2c 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f  , *pRc is set to
2a140 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
2a150 20 63 6f 64 65 2e 20 54 68 65 0a 2a 2a 20 72 65   code. The.** re
2a160 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 75 6e  turn value is un
2a170 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
2a180 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  case..*/.static 
2a190 75 36 34 20 66 74 73 33 43 68 65 63 6b 73 75 6d  u64 fts3Checksum
2a1a0 49 6e 64 65 78 28 0a 20 20 46 74 73 33 54 61 62  Index(.  Fts3Tab
2a1b0 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
2a1c0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33           /* FTS3
2a1d0 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   table handle */
2a1e0 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20  .  int iLangid, 
2a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a200 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69     /* Language i
2a210 64 20 74 6f 20 72 65 74 75 72 6e 20 63 6b 73 75  d to return cksu
2a220 6d 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  m for */.  int i
2a230 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20  Index,          
2a240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2a250 64 65 78 20 74 6f 20 63 6b 73 75 6d 20 28 30 2e  dex to cksum (0.
2a260 2e 70 2d 3e 6e 49 6e 64 65 78 2d 31 29 20 2a 2f  .p->nIndex-1) */
2a270 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20 20  .  int *pRc     
2a280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a290 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72     /* OUT: Retur
2a2a0 6e 20 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 46  n code */.){.  F
2a2b0 74 73 33 53 65 67 46 69 6c 74 65 72 20 66 69 6c  ts3SegFilter fil
2a2c0 74 65 72 3b 0a 20 20 46 74 73 33 4d 75 6c 74 69  ter;.  Fts3Multi
2a2d0 53 65 67 52 65 61 64 65 72 20 63 73 72 3b 0a 20  SegReader csr;. 
2a2e0 20 69 6e 74 20 72 63 3b 0a 20 20 75 36 34 20 63   int rc;.  u64 c
2a2f0 6b 73 75 6d 20 3d 20 30 3b 0a 0a 20 20 61 73 73  ksum = 0;..  ass
2a300 65 72 74 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54  ert( *pRc==SQLIT
2a310 45 5f 4f 4b 20 29 3b 0a 0a 20 20 6d 65 6d 73 65  E_OK );..  memse
2a320 74 28 26 66 69 6c 74 65 72 2c 20 30 2c 20 73 69  t(&filter, 0, si
2a330 7a 65 6f 66 28 66 69 6c 74 65 72 29 29 3b 0a 20  zeof(filter));. 
2a340 20 6d 65 6d 73 65 74 28 26 63 73 72 2c 20 30 2c   memset(&csr, 0,
2a350 20 73 69 7a 65 6f 66 28 63 73 72 29 29 3b 0a 20   sizeof(csr));. 
2a360 20 66 69 6c 74 65 72 2e 66 6c 61 67 73 20 3d 20   filter.flags = 
2a370 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 52 45   FTS3_SEGMENT_RE
2a380 51 55 49 52 45 5f 50 4f 53 7c 46 54 53 33 5f 53  QUIRE_POS|FTS3_S
2a390 45 47 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d  EGMENT_IGNORE_EM
2a3a0 50 54 59 3b 0a 20 20 66 69 6c 74 65 72 2e 66 6c  PTY;.  filter.fl
2a3b0 61 67 73 20 7c 3d 20 46 54 53 33 5f 53 45 47 4d  ags |= FTS3_SEGM
2a3c0 45 4e 54 5f 53 43 41 4e 3b 0a 0a 20 20 72 63 20  ENT_SCAN;..  rc 
2a3d0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  = sqlite3Fts3Seg
2a3e0 52 65 61 64 65 72 43 75 72 73 6f 72 28 0a 20 20  ReaderCursor(.  
2a3f0 20 20 20 20 70 2c 20 69 4c 61 6e 67 69 64 2c 20      p, iLangid, 
2a400 69 49 6e 64 65 78 2c 20 46 54 53 33 5f 53 45 47  iIndex, FTS3_SEG
2a410 43 55 52 53 4f 52 5f 41 4c 4c 2c 20 30 2c 20 30  CURSOR_ALL, 0, 0
2a420 2c 20 30 2c 20 31 2c 26 63 73 72 0a 20 20 29 3b  , 0, 1,&csr.  );
2a430 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2a440 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
2a450 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
2a460 65 61 64 65 72 53 74 61 72 74 28 70 2c 20 26 63  eaderStart(p, &c
2a470 73 72 2c 20 26 66 69 6c 74 65 72 29 3b 0a 20 20  sr, &filter);.  
2a480 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
2a490 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 77 68  ITE_OK ){.    wh
2a4a0 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d  ile( SQLITE_ROW=
2a4b0 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  =(rc = sqlite3Ft
2a4c0 73 33 53 65 67 52 65 61 64 65 72 53 74 65 70 28  s3SegReaderStep(
2a4d0 70 2c 20 26 63 73 72 29 29 20 29 7b 0a 20 20 20  p, &csr)) ){.   
2a4e0 20 20 20 63 68 61 72 20 2a 70 43 73 72 20 3d 20     char *pCsr = 
2a4f0 63 73 72 2e 61 44 6f 63 6c 69 73 74 3b 0a 20 20  csr.aDoclist;.  
2a500 20 20 20 20 63 68 61 72 20 2a 70 45 6e 64 20 3d      char *pEnd =
2a510 20 26 70 43 73 72 5b 63 73 72 2e 6e 44 6f 63 6c   &pCsr[csr.nDocl
2a520 69 73 74 5d 3b 0a 0a 20 20 20 20 20 20 69 36 34  ist];..      i64
2a530 20 69 44 6f 63 69 64 20 3d 20 30 3b 0a 20 20 20   iDocid = 0;.   
2a540 20 20 20 69 36 34 20 69 43 6f 6c 20 3d 20 30 3b     i64 iCol = 0;
2a550 0a 20 20 20 20 20 20 69 36 34 20 69 50 6f 73 20  .      i64 iPos 
2a560 3d 20 30 3b 0a 0a 20 20 20 20 20 20 70 43 73 72  = 0;..      pCsr
2a570 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47   += sqlite3Fts3G
2a580 65 74 56 61 72 69 6e 74 28 70 43 73 72 2c 20 26  etVarint(pCsr, &
2a590 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 20 20 77  iDocid);.      w
2a5a0 68 69 6c 65 28 20 70 43 73 72 3c 70 45 6e 64 20  hile( pCsr<pEnd 
2a5b0 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  ){.        i64 i
2a5c0 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Val = 0;.       
2a5d0 20 70 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33   pCsr += sqlite3
2a5e0 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 70 43  Fts3GetVarint(pC
2a5f0 73 72 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20  sr, &iVal);.    
2a600 20 20 20 20 69 66 28 20 70 43 73 72 3c 70 45 6e      if( pCsr<pEn
2a610 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  d ){.          i
2a620 66 28 20 69 56 61 6c 3d 3d 30 20 7c 7c 20 69 56  f( iVal==0 || iV
2a630 61 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  al==1 ){.       
2a640 20 20 20 20 20 69 43 6f 6c 20 3d 20 30 3b 0a 20       iCol = 0;. 
2a650 20 20 20 20 20 20 20 20 20 20 20 69 50 6f 73 20             iPos 
2a660 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
2a670 20 69 66 28 20 69 56 61 6c 20 29 7b 0a 20 20 20   if( iVal ){.   
2a680 20 20 20 20 20 20 20 20 20 20 20 70 43 73 72 20             pCsr 
2a690 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65  += sqlite3Fts3Ge
2a6a0 74 56 61 72 69 6e 74 28 70 43 73 72 2c 20 26 69  tVarint(pCsr, &i
2a6b0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Col);.          
2a6c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2a6d0 20 20 20 20 20 20 20 70 43 73 72 20 2b 3d 20 73         pCsr += s
2a6e0 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
2a6f0 69 6e 74 28 70 43 73 72 2c 20 26 69 56 61 6c 29  int(pCsr, &iVal)
2a700 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2a710 69 44 6f 63 69 64 20 2b 3d 20 69 56 61 6c 3b 0a  iDocid += iVal;.
2a720 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2a730 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2a740 20 20 20 20 20 20 20 20 20 20 20 69 50 6f 73 20             iPos 
2a750 2b 3d 20 28 69 56 61 6c 20 2d 20 32 29 3b 0a 20  += (iVal - 2);. 
2a760 20 20 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d             cksum
2a770 20 3d 20 63 6b 73 75 6d 20 5e 20 66 74 73 33 43   = cksum ^ fts3C
2a780 68 65 63 6b 73 75 6d 45 6e 74 72 79 28 0a 20 20  hecksumEntry(.  
2a790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 73                cs
2a7a0 72 2e 7a 54 65 72 6d 2c 20 63 73 72 2e 6e 54 65  r.zTerm, csr.nTe
2a7b0 72 6d 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e  rm, iLangid, iIn
2a7c0 64 65 78 2c 20 69 44 6f 63 69 64 2c 0a 20 20 20  dex, iDocid,.   
2a7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
2a7e0 74 29 69 43 6f 6c 2c 20 28 69 6e 74 29 69 50 6f  t)iCol, (int)iPo
2a7f0 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b  s.            );
2a800 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2a810 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2a820 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
2a830 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 46  e3Fts3SegReaderF
2a840 69 6e 69 73 68 28 26 63 73 72 29 3b 0a 0a 20 20  inish(&csr);..  
2a850 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 72 65 74  *pRc = rc;.  ret
2a860 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
2a870 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65  .** Check if the
2a880 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2a890 20 46 54 53 20 69 6e 64 65 78 20 6d 61 74 63 68   FTS index match
2a8a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
2a8b0 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20  tents of the.** 
2a8c0 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e 20 49  content table. I
2a8d0 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
2a8e0 73 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e  s and the conten
2a8f0 74 73 20 64 6f 20 6d 61 74 63 68 2c 20 73 65 74  ts do match, set
2a900 20 2a 70 62 4f 6b 0a 2a 2a 20 74 6f 20 74 72 75   *pbOk.** to tru
2a910 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  e and return SQL
2a920 49 54 45 5f 4f 4b 2e 20 4f 72 20 69 66 20 74 68  ITE_OK. Or if th
2a930 65 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f  e contents do no
2a940 74 20 6d 61 74 63 68 2c 20 73 65 74 20 2a 70 62  t match, set *pb
2a950 4f 6b 0a 2a 2a 20 74 6f 20 66 61 6c 73 65 20 62  Ok.** to false b
2a960 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
2a970 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
2a980 6f 72 20 6f 63 63 75 72 73 20 28 65 2e 67 2e 20  or occurs (e.g. 
2a990 61 6e 20 4f 4f 4d 20 6f 72 20 49 4f 20 65 72 72  an OOM or IO err
2a9a0 6f 72 29 2c 20 72 65 74 75 72 6e 20 61 6e 20 53  or), return an S
2a9b0 51 4c 69 74 65 20 65 72 72 6f 72 20 0a 2a 2a 20  QLite error .** 
2a9c0 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 20  code. The final 
2a9d0 76 61 6c 75 65 20 6f 66 20 2a 70 62 4f 6b 20 69  value of *pbOk i
2a9e0 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  s undefined in t
2a9f0 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61  his case..*/.sta
2aa00 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 74 65  tic int fts3Inte
2aa10 67 72 69 74 79 43 68 65 63 6b 28 46 74 73 33 54  grityCheck(Fts3T
2aa20 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 2a 70 62  able *p, int *pb
2aa30 4f 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Ok){.  int rc = 
2aa40 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2aa50 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2aa60 20 63 6f 64 65 20 2a 2f 0a 20 20 75 36 34 20 63   code */.  u64 c
2aa70 6b 73 75 6d 31 20 3d 20 30 3b 20 20 20 20 20 20  ksum1 = 0;      
2aa80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
2aa90 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20  ecksum based on 
2aaa0 46 54 53 20 69 6e 64 65 78 20 63 6f 6e 74 65 6e  FTS index conten
2aab0 74 73 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73 75  ts */.  u64 cksu
2aac0 6d 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  m2 = 0;         
2aad0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
2aae0 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 25 5f 63  sum based on %_c
2aaf0 6f 6e 74 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20  ontent contents 
2ab00 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
2ab10 74 20 2a 70 41 6c 6c 4c 61 6e 67 69 64 20 3d 20  t *pAllLangid = 
2ab20 30 3b 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e  0;   /* Statemen
2ab30 74 20 74 6f 20 72 65 74 75 72 6e 20 61 6c 6c 20  t to return all 
2ab40 6c 61 6e 67 75 61 67 65 2d 69 64 73 20 2a 2f 0a  language-ids */.
2ab50 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b  .  /* This block
2ab60 20 63 61 6c 63 75 6c 61 74 65 73 20 74 68 65 20   calculates the 
2ab70 63 68 65 63 6b 73 75 6d 20 61 63 63 6f 72 64 69  checksum accordi
2ab80 6e 67 20 74 6f 20 74 68 65 20 46 54 53 20 69 6e  ng to the FTS in
2ab90 64 65 78 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 66  dex. */.  rc = f
2aba0 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51  ts3SqlStmt(p, SQ
2abb0 4c 5f 53 45 4c 45 43 54 5f 41 4c 4c 5f 4c 41 4e  L_SELECT_ALL_LAN
2abc0 47 49 44 2c 20 26 70 41 6c 6c 4c 61 6e 67 69 64  GID, &pAllLangid
2abd0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
2abe0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2abf0 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 73 71   int rc2;.    sq
2ac00 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
2ac10 41 6c 6c 4c 61 6e 67 69 64 2c 20 31 2c 20 70 2d  AllLangid, 1, p-
2ac20 3e 69 50 72 65 76 4c 61 6e 67 69 64 29 3b 0a 20  >iPrevLangid);. 
2ac30 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
2ac40 69 6e 74 28 70 41 6c 6c 4c 61 6e 67 69 64 2c 20  int(pAllLangid, 
2ac50 32 2c 20 70 2d 3e 6e 49 6e 64 65 78 29 3b 0a 20  2, p->nIndex);. 
2ac60 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
2ac70 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74  LITE_OK && sqlit
2ac80 65 33 5f 73 74 65 70 28 70 41 6c 6c 4c 61 6e 67  e3_step(pAllLang
2ac90 69 64 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  id)==SQLITE_ROW 
2aca0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 61  ){.      int iLa
2acb0 6e 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63  ngid = sqlite3_c
2acc0 6f 6c 75 6d 6e 5f 69 6e 74 28 70 41 6c 6c 4c 61  olumn_int(pAllLa
2acd0 6e 67 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  ngid, 0);.      
2ace0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
2acf0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 6e 64 65  (i=0; i<p->nInde
2ad00 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  x; i++){.       
2ad10 20 63 6b 73 75 6d 31 20 3d 20 63 6b 73 75 6d 31   cksum1 = cksum1
2ad20 20 5e 20 66 74 73 33 43 68 65 63 6b 73 75 6d 49   ^ fts3ChecksumI
2ad30 6e 64 65 78 28 70 2c 20 69 4c 61 6e 67 69 64 2c  ndex(p, iLangid,
2ad40 20 69 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20   i, &rc);.      
2ad50 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 32 20  }.    }.    rc2 
2ad60 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
2ad70 70 41 6c 6c 4c 61 6e 67 69 64 29 3b 0a 20 20 20  pAllLangid);.   
2ad80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ad90 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
2ada0 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c   }..  /* This bl
2adb0 6f 63 6b 20 63 61 6c 63 75 6c 61 74 65 73 20 74  ock calculates t
2adc0 68 65 20 63 68 65 63 6b 73 75 6d 20 61 63 63 6f  he checksum acco
2add0 72 64 69 6e 67 20 74 6f 20 74 68 65 20 25 5f 63  rding to the %_c
2ade0 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  ontent table */.
2adf0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ae00 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
2ae10 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64  e3_tokenizer_mod
2ae20 75 6c 65 20 63 6f 6e 73 74 20 2a 70 4d 6f 64 75  ule const *pModu
2ae30 6c 65 20 3d 20 70 2d 3e 70 54 6f 6b 65 6e 69 7a  le = p->pTokeniz
2ae40 65 72 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20  er->pModule;.   
2ae50 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2ae60 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 63 68  Stmt = 0;.    ch
2ae70 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 0a 20 20  ar *zSql;.   .  
2ae80 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
2ae90 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
2aea0 20 25 73 22 20 2c 20 70 2d 3e 7a 52 65 61 64 45   %s" , p->zReadE
2aeb0 78 70 72 6c 69 73 74 29 3b 0a 20 20 20 20 69 66  xprlist);.    if
2aec0 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20  ( !zSql ){.     
2aed0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2aee0 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
2aef0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2af00 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
2af10 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
2af20 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Stmt, 0);.      
2af30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
2af40 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77  l);.    }..    w
2af50 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
2af60 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  _OK && SQLITE_RO
2af70 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
2af80 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20  pStmt) ){.      
2af90 69 36 34 20 69 44 6f 63 69 64 20 3d 20 73 71 6c  i64 iDocid = sql
2afa0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
2afb0 34 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  4(pStmt, 0);.   
2afc0 20 20 20 69 6e 74 20 69 4c 61 6e 67 20 3d 20 6c     int iLang = l
2afd0 61 6e 67 69 64 46 72 6f 6d 53 65 6c 65 63 74 28  angidFromSelect(
2afe0 70 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  p, pStmt);.     
2aff0 20 69 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20 20 20   int iCol;..    
2b000 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 72 63    for(iCol=0; rc
2b010 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
2b020 43 6f 6c 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Col<p->nColumn; 
2b030 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iCol++){.       
2b040 20 69 66 28 20 70 2d 3e 61 62 4e 6f 74 69 6e 64   if( p->abNotind
2b050 65 78 65 64 5b 69 43 6f 6c 5d 3d 3d 30 20 29 7b  exed[iCol]==0 ){
2b060 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
2b070 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d 20 28   char *zText = (
2b080 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c  const char *)sql
2b090 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
2b0a0 28 70 53 74 6d 74 2c 20 69 43 6f 6c 2b 31 29 3b  (pStmt, iCol+1);
2b0b0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
2b0c0 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33 5f 63  Text = sqlite3_c
2b0d0 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
2b0e0 74 2c 20 69 43 6f 6c 2b 31 29 3b 0a 20 20 20 20  t, iCol+1);.    
2b0f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 6f        sqlite3_to
2b100 6b 65 6e 69 7a 65 72 5f 63 75 72 73 6f 72 20 2a  kenizer_cursor *
2b110 70 54 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20  pT = 0;..       
2b120 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
2b130 74 73 33 4f 70 65 6e 54 6f 6b 65 6e 69 7a 65 72  ts3OpenTokenizer
2b140 28 70 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 2c 20  (p->pTokenizer, 
2b150 69 4c 61 6e 67 2c 20 7a 54 65 78 74 2c 20 6e 54  iLang, zText, nT
2b160 65 78 74 2c 26 70 54 29 3b 0a 20 20 20 20 20 20  ext,&pT);.      
2b170 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
2b180 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b190 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e          char con
2b1a0 73 74 20 2a 7a 54 6f 6b 65 6e 3b 20 20 20 20 20  st *zToken;     
2b1b0 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
2b1c0 61 69 6e 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a  aining token */.
2b1d0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
2b1e0 6e 54 6f 6b 65 6e 20 3d 20 30 3b 20 20 20 20 20  nToken = 0;     
2b1f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2b200 6f 66 20 62 79 74 65 73 20 69 6e 20 74 6f 6b 65  of bytes in toke
2b210 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  n */.           
2b220 20 69 6e 74 20 69 44 75 6d 31 20 3d 20 30 2c 20   int iDum1 = 0, 
2b230 69 44 75 6d 32 20 3d 20 30 3b 20 2f 2a 20 44 75  iDum2 = 0; /* Du
2b240 6d 6d 79 20 76 61 72 69 61 62 6c 65 73 20 2a 2f  mmy variables */
2b250 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
2b260 20 69 50 6f 73 20 3d 20 30 3b 20 20 20 20 20 20   iPos = 0;      
2b270 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69         /* Positi
2b280 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20 7a  on of token in z
2b290 54 65 78 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20  Text */..       
2b2a0 20 20 20 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c       rc = pModul
2b2b0 65 2d 3e 78 4e 65 78 74 28 70 54 2c 20 26 7a 54  e->xNext(pT, &zT
2b2c0 6f 6b 65 6e 2c 20 26 6e 54 6f 6b 65 6e 2c 20 26  oken, &nToken, &
2b2d0 69 44 75 6d 31 2c 20 26 69 44 75 6d 32 2c 20 26  iDum1, &iDum2, &
2b2e0 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 20  iPos);.         
2b2f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b300 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2b310 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
2b320 20 20 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d             cksum
2b330 32 20 3d 20 63 6b 73 75 6d 32 20 5e 20 66 74 73  2 = cksum2 ^ fts
2b340 33 43 68 65 63 6b 73 75 6d 45 6e 74 72 79 28 0a  3ChecksumEntry(.
2b350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b360 20 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e    zToken, nToken
2b370 2c 20 69 4c 61 6e 67 2c 20 30 2c 20 69 44 6f 63  , iLang, 0, iDoc
2b380 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 0a 20  id, iCol, iPos. 
2b390 20 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a               );.
2b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
2b3b0 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 49 6e 64  r(i=1; i<p->nInd
2b3c0 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ex; i++){.      
2b3d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
2b3e0 3e 61 49 6e 64 65 78 5b 69 5d 2e 6e 50 72 65 66  >aIndex[i].nPref
2b3f0 69 78 3c 3d 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20  ix<=nToken ){.  
2b400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b410 63 6b 73 75 6d 32 20 3d 20 63 6b 73 75 6d 32 20  cksum2 = cksum2 
2b420 5e 20 66 74 73 33 43 68 65 63 6b 73 75 6d 45 6e  ^ fts3ChecksumEn
2b430 74 72 79 28 0a 20 20 20 20 20 20 20 20 20 20 20  try(.           
2b440 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 6b 65             zToke
2b450 6e 2c 20 70 2d 3e 61 49 6e 64 65 78 5b 69 5d 2e  n, p->aIndex[i].
2b460 6e 50 72 65 66 69 78 2c 20 69 4c 61 6e 67 2c 20  nPrefix, iLang, 
2b470 69 2c 20 69 44 6f 63 69 64 2c 20 69 43 6f 6c 2c  i, iDocid, iCol,
2b480 20 69 50 6f 73 0a 20 20 20 20 20 20 20 20 20 20   iPos.          
2b490 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2b4a0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2b4b0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2b4c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2b4d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2b4e0 20 69 66 28 20 70 54 20 29 20 70 4d 6f 64 75 6c   if( pT ) pModul
2b4f0 65 2d 3e 78 43 6c 6f 73 65 28 70 54 29 3b 0a 20  e->xClose(pT);. 
2b500 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
2b510 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72  =SQLITE_DONE ) r
2b520 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2b530 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2b540 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
2b550 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
2b560 6d 74 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 62 4f  mt);.  }..  *pbO
2b570 6b 20 3d 20 28 63 6b 73 75 6d 31 3d 3d 63 6b 73  k = (cksum1==cks
2b580 75 6d 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  um2);.  return r
2b590 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  c;.}../*.** Run 
2b5a0 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68  the integrity-ch
2b5b0 65 63 6b 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72  eck. If no error
2b5c0 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
2b5d0 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73  current contents
2b5e0 20 6f 66 0a 2a 2a 20 74 68 65 20 46 54 53 20 69   of.** the FTS i
2b5f0 6e 64 65 78 20 61 72 65 20 63 6f 72 72 65 63 74  ndex are correct
2b600 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
2b610 4f 4b 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 63  OK. Or, if the c
2b620 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
2b630 2a 20 46 54 53 20 69 6e 64 65 78 20 61 72 65 20  * FTS index are 
2b640 69 6e 63 6f 72 72 65 63 74 2c 20 72 65 74 75 72  incorrect, retur
2b650 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2b660 5f 56 54 41 42 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  _VTAB..**.** Or,
2b670 20 69 66 20 61 6e 20 65 72 72 6f 72 20 28 65 2e   if an error (e.
2b680 67 2e 20 61 6e 20 4f 4f 4d 20 6f 72 20 49 4f 20  g. an OOM or IO 
2b690 65 72 72 6f 72 29 20 6f 63 63 75 72 73 2c 20 72  error) occurs, r
2b6a0 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
2b6b0 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  .** error code..
2b6c0 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67 72  **.** The integr
2b6d0 69 74 79 2d 63 68 65 63 6b 20 77 6f 72 6b 73 20  ity-check works 
2b6e0 61 73 20 66 6f 6c 6c 6f 77 73 2e 20 46 6f 72 20  as follows. For 
2b6f0 65 61 63 68 20 74 6f 6b 65 6e 20 61 6e 64 20 69  each token and i
2b700 6e 64 65 78 65 64 20 74 6f 6b 65 6e 0a 2a 2a 20  ndexed token.** 
2b710 70 72 65 66 69 78 20 69 6e 20 74 68 65 20 64 6f  prefix in the do
2b720 63 75 6d 65 6e 74 20 73 65 74 2c 20 61 20 36 34  cument set, a 64
2b730 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 69 73  -bit checksum is
2b740 20 63 61 6c 63 75 6c 61 74 65 64 20 28 62 79 20   calculated (by 
2b750 63 6f 64 65 0a 2a 2a 20 69 6e 20 66 74 73 33 43  code.** in fts3C
2b760 68 65 63 6b 73 75 6d 45 6e 74 72 79 28 29 29 20  hecksumEntry()) 
2b770 62 61 73 65 64 20 6f 6e 20 74 68 65 20 66 6f 6c  based on the fol
2b780 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
2b790 20 20 2b 20 54 68 65 20 69 6e 64 65 78 20 6e 75    + The index nu
2b7a0 6d 62 65 72 20 28 30 20 66 6f 72 20 74 68 65 20  mber (0 for the 
2b7b0 6d 61 69 6e 20 69 6e 64 65 78 2c 20 31 20 66 6f  main index, 1 fo
2b7c0 72 20 74 68 65 20 66 69 72 73 74 20 70 72 65 66  r the first pref
2b7d0 69 78 0a 2a 2a 20 20 20 20 20 20 20 69 6e 64 65  ix.**       inde
2b7e0 78 20 65 74 63 2e 29 2c 0a 2a 2a 20 20 20 20 20  x etc.),.**     
2b7f0 2b 20 54 68 65 20 74 6f 6b 65 6e 20 28 6f 72 20  + The token (or 
2b800 74 6f 6b 65 6e 20 70 72 65 66 69 78 29 20 74 65  token prefix) te
2b810 78 74 20 69 74 73 65 6c 66 2c 20 0a 2a 2a 20 20  xt itself, .**  
2b820 20 20 20 2b 20 54 68 65 20 6c 61 6e 67 75 61 67     + The languag
2b830 65 2d 69 64 20 6f 66 20 74 68 65 20 72 6f 77 20  e-id of the row 
2b840 69 74 20 61 70 70 65 61 72 73 20 69 6e 2c 0a 2a  it appears in,.*
2b850 2a 20 20 20 20 20 2b 20 54 68 65 20 64 6f 63 69  *     + The doci
2b860 64 20 6f 66 20 74 68 65 20 72 6f 77 20 69 74 20  d of the row it 
2b870 61 70 70 65 61 72 73 20 69 6e 2c 0a 2a 2a 20 20  appears in,.**  
2b880 20 20 20 2b 20 54 68 65 20 63 6f 6c 75 6d 6e 20     + The column 
2b890 69 74 20 61 70 70 65 61 72 73 20 69 6e 2c 20 61  it appears in, a
2b8a0 6e 64 0a 2a 2a 20 20 20 20 20 2b 20 54 68 65 20  nd.**     + The 
2b8b0 74 6f 6b 65 6e 73 20 70 6f 73 69 74 69 6f 6e 20  tokens position 
2b8c0 77 69 74 68 69 6e 20 74 68 61 74 20 63 6f 6c 75  within that colu
2b8d0 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 68  mn..**.** The ch
2b8e0 65 63 6b 73 75 6d 73 20 66 6f 72 20 61 6c 6c 20  ecksums for all 
2b8f0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 69  entries in the i
2b900 6e 64 65 78 20 61 72 65 20 58 4f 52 65 64 20 74  ndex are XORed t
2b910 6f 67 65 74 68 65 72 20 74 6f 20 63 72 65 61 74  ogether to creat
2b920 65 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 63 68  e.** a single ch
2b930 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 65  ecksum for the e
2b940 6e 74 69 72 65 20 69 6e 64 65 78 2e 0a 2a 2a 0a  ntire index..**.
2b950 2a 2a 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  ** The integrity
2b960 2d 63 68 65 63 6b 20 63 6f 64 65 20 63 61 6c 63  -check code calc
2b970 75 6c 61 74 65 73 20 74 68 65 20 73 61 6d 65 20  ulates the same 
2b980 63 68 65 63 6b 73 75 6d 20 69 6e 20 74 77 6f 20  checksum in two 
2b990 77 61 79 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ways:.**.**     
2b9a0 31 2e 20 42 79 20 73 63 61 6e 6e 69 6e 67 20 74  1. By scanning t
2b9b0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2b9c0 68 65 20 46 54 53 20 69 6e 64 65 78 2c 20 61 6e  he FTS index, an
2b9d0 64 20 0a 2a 2a 20 20 20 20 20 32 2e 20 42 79 20  d .**     2. By 
2b9e0 73 63 61 6e 6e 69 6e 67 20 61 6e 64 20 74 6f 6b  scanning and tok
2b9f0 65 6e 69 7a 69 6e 67 20 74 68 65 20 63 6f 6e 74  enizing the cont
2ba00 65 6e 74 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ent table..**.**
2ba10 20 49 66 20 74 68 65 20 74 77 6f 20 63 68 65 63   If the two chec
2ba20 6b 73 75 6d 73 20 61 72 65 20 69 64 65 6e 74 69  ksums are identi
2ba30 63 61 6c 2c 20 74 68 65 20 69 6e 74 65 67 72 69  cal, the integri
2ba40 74 79 2d 63 68 65 63 6b 20 69 73 20 64 65 65 6d  ty-check is deem
2ba50 65 64 20 74 6f 20 68 61 76 65 0a 2a 2a 20 70 61  ed to have.** pa
2ba60 73 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ssed..*/.static 
2ba70 69 6e 74 20 66 74 73 33 44 6f 49 6e 74 65 67 72  int fts3DoIntegr
2ba80 69 74 79 43 68 65 63 6b 28 0a 20 20 46 74 73 33  ityCheck(.  Fts3
2ba90 54 61 62 6c 65 20 2a 70 20 20 20 20 20 20 20 20  Table *p        
2baa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2bab0 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  TS3 table handle
2bac0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
2bad0 0a 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b 0a  .  int bOk = 0;.
2bae0 20 20 72 63 20 3d 20 66 74 73 33 49 6e 74 65 67    rc = fts3Integ
2baf0 72 69 74 79 43 68 65 63 6b 28 70 2c 20 26 62 4f  rityCheck(p, &bO
2bb00 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  k);.  if( rc==SQ
2bb10 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 3d 3d  LITE_OK && bOk==
2bb20 30 20 29 20 72 63 20 3d 20 46 54 53 5f 43 4f 52  0 ) rc = FTS_COR
2bb30 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 72 65 74  RUPT_VTAB;.  ret
2bb40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2bb50 20 48 61 6e 64 6c 65 20 61 20 27 73 70 65 63 69   Handle a 'speci
2bb60 61 6c 27 20 49 4e 53 45 52 54 20 6f 66 20 74 68  al' INSERT of th
2bb70 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
2bb80 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c  "INSERT INTO tbl
2bb90 28 74 62 6c 29 20 56 41 4c 55 45 53 28 3c 65 78  (tbl) VALUES(<ex
2bba0 70 72 3e 29 22 0a 2a 2a 0a 2a 2a 20 41 72 67 75  pr>)".**.** Argu
2bbb0 6d 65 6e 74 20 70 56 61 6c 20 63 6f 6e 74 61 69  ment pVal contai
2bbc0 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ns the result of
2bbd0 20 3c 65 78 70 72 3e 2e 20 43 75 72 72 65 6e 74   <expr>. Current
2bbe0 6c 79 20 74 68 65 20 6f 6e 6c 79 20 0a 2a 2a 20  ly the only .** 
2bbf0 6d 65 61 6e 69 6e 67 66 75 6c 20 76 61 6c 75 65  meaningful value
2bc00 20 74 6f 20 69 6e 73 65 72 74 20 69 73 20 74 68   to insert is th
2bc10 65 20 74 65 78 74 20 27 6f 70 74 69 6d 69 7a 65  e text 'optimize
2bc20 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  '..*/.static int
2bc30 20 66 74 73 33 53 70 65 63 69 61 6c 49 6e 73 65   fts3SpecialInse
2bc40 72 74 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  rt(Fts3Table *p,
2bc50 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2bc60 70 56 61 6c 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pVal){.  int rc;
2bc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2bc90 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e  rn Code */.  con
2bca0 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20  st char *zVal = 
2bcb0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
2bcc0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
2bcd0 28 70 56 61 6c 29 3b 0a 20 20 69 6e 74 20 6e 56  (pVal);.  int nV
2bce0 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  al = sqlite3_val
2bcf0 75 65 5f 62 79 74 65 73 28 70 56 61 6c 29 3b 0a  ue_bytes(pVal);.
2bd00 0a 20 20 69 66 28 20 21 7a 56 61 6c 20 29 7b 0a  .  if( !zVal ){.
2bd10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2bd20 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
2bd30 20 69 66 28 20 6e 56 61 6c 3d 3d 38 20 26 26 20   if( nVal==8 && 
2bd40 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  0==sqlite3_strni
2bd50 63 6d 70 28 7a 56 61 6c 2c 20 22 6f 70 74 69 6d  cmp(zVal, "optim
2bd60 69 7a 65 22 2c 20 38 29 20 29 7b 0a 20 20 20 20  ize", 8) ){.    
2bd70 72 63 20 3d 20 66 74 73 33 44 6f 4f 70 74 69 6d  rc = fts3DoOptim
2bd80 69 7a 65 28 70 2c 20 30 29 3b 0a 20 20 7d 65 6c  ize(p, 0);.  }el
2bd90 73 65 20 69 66 28 20 6e 56 61 6c 3d 3d 37 20 26  se if( nVal==7 &
2bda0 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  & 0==sqlite3_str
2bdb0 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22 72 65 62  nicmp(zVal, "reb
2bdc0 75 69 6c 64 22 2c 20 37 29 20 29 7b 0a 20 20 20  uild", 7) ){.   
2bdd0 20 72 63 20 3d 20 66 74 73 33 44 6f 52 65 62 75   rc = fts3DoRebu
2bde0 69 6c 64 28 70 29 3b 0a 20 20 7d 65 6c 73 65 20  ild(p);.  }else 
2bdf0 69 66 28 20 6e 56 61 6c 3d 3d 31 35 20 26 26 20  if( nVal==15 && 
2be00 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  0==sqlite3_strni
2be10 63 6d 70 28 7a 56 61 6c 2c 20 22 69 6e 74 65 67  cmp(zVal, "integ
2be20 72 69 74 79 2d 63 68 65 63 6b 22 2c 20 31 35 29  rity-check", 15)
2be30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
2be40 33 44 6f 49 6e 74 65 67 72 69 74 79 43 68 65 63  3DoIntegrityChec
2be50 6b 28 70 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  k(p);.  }else if
2be60 28 20 6e 56 61 6c 3e 36 20 26 26 20 30 3d 3d 73  ( nVal>6 && 0==s
2be70 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
2be80 7a 56 61 6c 2c 20 22 6d 65 72 67 65 3d 22 2c 20  zVal, "merge=", 
2be90 36 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  6) ){.    rc = f
2bea0 74 73 33 44 6f 49 6e 63 72 6d 65 72 67 65 28 70  ts3DoIncrmerge(p
2beb0 2c 20 26 7a 56 61 6c 5b 36 5d 29 3b 0a 20 20 7d  , &zVal[6]);.  }
2bec0 65 6c 73 65 20 69 66 28 20 6e 56 61 6c 3e 31 30  else if( nVal>10
2bed0 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73   && 0==sqlite3_s
2bee0 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22 61  trnicmp(zVal, "a
2bef0 75 74 6f 6d 65 72 67 65 3d 22 2c 20 31 30 29 20  utomerge=", 10) 
2bf00 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  ){.    rc = fts3
2bf10 44 6f 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 28  DoAutoincrmerge(
2bf20 70 2c 20 26 7a 56 61 6c 5b 31 30 5d 29 3b 0a 23  p, &zVal[10]);.#
2bf30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2bf40 54 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56  T.  }else if( nV
2bf50 61 6c 3e 39 20 26 26 20 30 3d 3d 73 71 6c 69 74  al>9 && 0==sqlit
2bf60 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c  e3_strnicmp(zVal
2bf70 2c 20 22 6e 6f 64 65 73 69 7a 65 3d 22 2c 20 39  , "nodesize=", 9
2bf80 29 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4e 6f 64  ) ){.    p->nNod
2bf90 65 53 69 7a 65 20 3d 20 61 74 6f 69 28 26 7a 56  eSize = atoi(&zV
2bfa0 61 6c 5b 39 5d 29 3b 0a 20 20 20 20 72 63 20 3d  al[9]);.    rc =
2bfb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
2bfc0 6c 73 65 20 69 66 28 20 6e 56 61 6c 3e 31 31 20  lse if( nVal>11 
2bfd0 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  && 0==sqlite3_st
2bfe0 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22 6d 61  rnicmp(zVal, "ma
2bff0 78 70 65 6e 64 69 6e 67 3d 22 2c 20 39 29 20 29  xpending=", 9) )
2c000 7b 0a 20 20 20 20 70 2d 3e 6e 4d 61 78 50 65 6e  {.    p->nMaxPen
2c010 64 69 6e 67 44 61 74 61 20 3d 20 61 74 6f 69 28  dingData = atoi(
2c020 26 7a 56 61 6c 5b 31 31 5d 29 3b 0a 20 20 20 20  &zVal[11]);.    
2c030 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2c040 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 61 6c    }else if( nVal
2c050 3e 32 31 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  >21 && 0==sqlite
2c060 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c  3_strnicmp(zVal,
2c070 20 22 74 65 73 74 2d 6e 6f 2d 69 6e 63 72 2d 64   "test-no-incr-d
2c080 6f 63 6c 69 73 74 3d 22 2c 20 32 31 29 20 29 7b  oclist=", 21) ){
2c090 0a 20 20 20 20 70 2d 3e 62 4e 6f 49 6e 63 72 44  .    p->bNoIncrD
2c0a0 6f 63 6c 69 73 74 20 3d 20 61 74 6f 69 28 26 7a  oclist = atoi(&z
2c0b0 56 61 6c 5b 32 31 5d 29 3b 0a 20 20 20 20 72 63  Val[21]);.    rc
2c0c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65   = SQLITE_OK;.#e
2c0d0 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
2c0e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
2c0f0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
2c100 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
2c110 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
2c120 5f 46 54 53 34 5f 44 45 46 45 52 52 45 44 0a 2f  _FTS4_DEFERRED./
2c130 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20  *.** Delete all 
2c140 63 61 63 68 65 64 20 64 65 66 65 72 72 65 64 20  cached deferred 
2c150 64 6f 63 6c 69 73 74 73 2e 20 44 65 66 65 72 72  doclists. Deferr
2c160 65 64 20 64 6f 63 6c 69 73 74 73 20 61 72 65 20  ed doclists are 
2c170 63 61 63 68 65 64 0a 2a 2a 20 28 61 6c 6c 6f 63  cached.** (alloc
2c180 61 74 65 64 29 20 62 79 20 74 68 65 20 73 71 6c  ated) by the sql
2c190 69 74 65 33 46 74 73 33 43 61 63 68 65 44 65 66  ite3Fts3CacheDef
2c1a0 65 72 72 65 64 44 6f 63 6c 69 73 74 73 28 29 20  erredDoclists() 
2c1b0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
2c1c0 64 20 73 71 6c 69 74 65 33 46 74 73 33 46 72 65  d sqlite3Fts3Fre
2c1d0 65 44 65 66 65 72 72 65 64 44 6f 63 6c 69 73 74  eDeferredDoclist
2c1e0 73 28 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43  s(Fts3Cursor *pC
2c1f0 73 72 29 7b 0a 20 20 46 74 73 33 44 65 66 65 72  sr){.  Fts3Defer
2c200 72 65 64 54 6f 6b 65 6e 20 2a 70 44 65 66 3b 0a  redToken *pDef;.
2c210 20 20 66 6f 72 28 70 44 65 66 3d 70 43 73 72 2d    for(pDef=pCsr-
2c220 3e 70 44 65 66 65 72 72 65 64 3b 20 70 44 65 66  >pDeferred; pDef
2c230 3b 20 70 44 65 66 3d 70 44 65 66 2d 3e 70 4e 65  ; pDef=pDef->pNe
2c240 78 74 29 7b 0a 20 20 20 20 66 74 73 33 50 65 6e  xt){.    fts3Pen
2c250 64 69 6e 67 4c 69 73 74 44 65 6c 65 74 65 28 70  dingListDelete(p
2c260 44 65 66 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20  Def->pList);.   
2c270 20 70 44 65 66 2d 3e 70 4c 69 73 74 20 3d 20 30   pDef->pList = 0
2c280 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
2c290 72 65 65 20 61 6c 6c 20 65 6e 74 72 69 65 73 20  ree all entries 
2c2a0 69 6e 20 74 68 65 20 70 43 73 72 2d 3e 70 44 65  in the pCsr->pDe
2c2b0 66 66 65 72 65 64 20 6c 69 73 74 2e 20 45 6e 74  ffered list. Ent
2c2c0 72 69 65 73 20 61 72 65 20 61 64 64 65 64 20 74  ries are added t
2c2d0 6f 20 0a 2a 2a 20 74 68 69 73 20 6c 69 73 74 20  o .** this list 
2c2e0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 46 74 73  using sqlite3Fts
2c2f0 33 44 65 66 65 72 54 6f 6b 65 6e 28 29 2e 0a 2a  3DeferToken()..*
2c300 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
2c310 73 33 46 72 65 65 44 65 66 65 72 72 65 64 54 6f  s3FreeDeferredTo
2c320 6b 65 6e 73 28 46 74 73 33 43 75 72 73 6f 72 20  kens(Fts3Cursor 
2c330 2a 70 43 73 72 29 7b 0a 20 20 46 74 73 33 44 65  *pCsr){.  Fts3De
2c340 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70 44 65  ferredToken *pDe
2c350 66 3b 0a 20 20 46 74 73 33 44 65 66 65 72 72 65  f;.  Fts3Deferre
2c360 64 54 6f 6b 65 6e 20 2a 70 4e 65 78 74 3b 0a 20  dToken *pNext;. 
2c370 20 66 6f 72 28 70 44 65 66 3d 70 43 73 72 2d 3e   for(pDef=pCsr->
2c380 70 44 65 66 65 72 72 65 64 3b 20 70 44 65 66 3b  pDeferred; pDef;
2c390 20 70 44 65 66 3d 70 4e 65 78 74 29 7b 0a 20 20   pDef=pNext){.  
2c3a0 20 20 70 4e 65 78 74 20 3d 20 70 44 65 66 2d 3e    pNext = pDef->
2c3b0 70 4e 65 78 74 3b 0a 20 20 20 20 66 74 73 33 50  pNext;.    fts3P
2c3c0 65 6e 64 69 6e 67 4c 69 73 74 44 65 6c 65 74 65  endingListDelete
2c3d0 28 70 44 65 66 2d 3e 70 4c 69 73 74 29 3b 0a 20  (pDef->pList);. 
2c3e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2c3f0 70 44 65 66 29 3b 0a 20 20 7d 0a 20 20 70 43 73  pDef);.  }.  pCs
2c400 72 2d 3e 70 44 65 66 65 72 72 65 64 20 3d 20 30  r->pDeferred = 0
2c410 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
2c420 61 74 65 20 64 65 66 65 72 72 65 64 2d 64 6f 63  ate deferred-doc
2c430 6c 69 73 74 73 20 66 6f 72 20 61 6c 6c 20 74 6f  lists for all to
2c440 6b 65 6e 73 20 69 6e 20 74 68 65 20 70 43 73 72  kens in the pCsr
2c450 2d 3e 70 44 65 66 65 72 72 65 64 20 6c 69 73 74  ->pDeferred list
2c460 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74 68 65  .** based on the
2c470 20 72 6f 77 20 74 68 61 74 20 70 43 73 72 20 63   row that pCsr c
2c480 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
2c490 74 6f 2e 0a 2a 2a 0a 2a 2a 20 41 20 64 65 66 65  to..**.** A defe
2c4a0 72 72 65 64 2d 64 6f 63 6c 69 73 74 20 69 73 20  rred-doclist is 
2c4b0 6c 69 6b 65 20 61 6e 79 20 6f 74 68 65 72 20 64  like any other d
2c4c0 6f 63 6c 69 73 74 20 77 69 74 68 20 70 6f 73 69  oclist with posi
2c4d0 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
2c4e0 0a 2a 2a 20 69 6e 63 6c 75 64 65 64 2c 20 65 78  .** included, ex
2c4f0 63 65 70 74 20 74 68 61 74 20 69 74 20 6f 6e 6c  cept that it onl
2c500 79 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69  y contains entri
2c510 65 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  es for a single 
2c520 72 6f 77 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61  row of the.** ta
2c530 62 6c 65 2c 20 6e 6f 74 20 66 6f 72 20 61 6c 6c  ble, not for all
2c540 20 72 6f 77 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71   rows..*/.int sq
2c550 6c 69 74 65 33 46 74 73 33 43 61 63 68 65 44 65  lite3Fts3CacheDe
2c560 66 65 72 72 65 64 44 6f 63 6c 69 73 74 73 28 46  ferredDoclists(F
2c570 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 29  ts3Cursor *pCsr)
2c580 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2c590 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2c5a0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2c5b0 64 65 20 2a 2f 0a 20 20 69 66 28 20 70 43 73 72  de */.  if( pCsr
2c5c0 2d 3e 70 44 65 66 65 72 72 65 64 20 29 7b 0a 20  ->pDeferred ){. 
2c5d0 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
2c5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c5f0 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
2c600 61 74 65 20 74 68 72 6f 75 67 68 20 74 61 62 6c  ate through tabl
2c610 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  e columns */.   
2c620 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
2c630 44 6f 63 69 64 3b 20 20 20 20 20 20 20 20 20 2f  Docid;         /
2c640 2a 20 44 6f 63 69 64 20 6f 66 20 74 68 65 20 72  * Docid of the r
2c650 6f 77 20 70 43 73 72 20 70 6f 69 6e 74 73 20 74  ow pCsr points t
2c660 6f 20 2a 2f 0a 20 20 20 20 46 74 73 33 44 65 66  o */.    Fts3Def
2c670 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70 44 65 66  erredToken *pDef
2c680 3b 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74  ;      /* Used t
2c690 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
2c6a0 68 20 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e  h deferred token
2c6b0 73 20 2a 2f 0a 20 20 0a 20 20 20 20 46 74 73 33  s */.  .    Fts3
2c6c0 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33  Table *p = (Fts3
2c6d0 54 61 62 6c 65 20 2a 29 70 43 73 72 2d 3e 62 61  Table *)pCsr->ba
2c6e0 73 65 2e 70 56 74 61 62 3b 0a 20 20 20 20 73 71  se.pVtab;.    sq
2c6f0 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 20  lite3_tokenizer 
2c700 2a 70 54 20 3d 20 70 2d 3e 70 54 6f 6b 65 6e 69  *pT = p->pTokeni
2c710 7a 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  zer;.    sqlite3
2c720 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c  _tokenizer_modul
2c730 65 20 63 6f 6e 73 74 20 2a 70 4d 6f 64 75 6c 65  e const *pModule
2c740 20 3d 20 70 54 2d 3e 70 4d 6f 64 75 6c 65 3b 0a   = pT->pModule;.
2c750 20 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20     .    assert( 
2c760 70 43 73 72 2d 3e 69 73 52 65 71 75 69 72 65 53  pCsr->isRequireS
2c770 65 65 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 69 44  eek==0 );.    iD
2c780 6f 63 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63  ocid = sqlite3_c
2c790 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 43 73 72  olumn_int64(pCsr
2c7a0 2d 3e 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 0a  ->pStmt, 0);.  .
2c7b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2c7c0 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 72 63 3d  ->nColumn && rc=
2c7d0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29  =SQLITE_OK; i++)
2c7e0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61  {.      if( p->a
2c7f0 62 4e 6f 74 69 6e 64 65 78 65 64 5b 69 5d 3d 3d  bNotindexed[i]==
2c800 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  0 ){.        con
2c810 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d  st char *zText =
2c820 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
2c830 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
2c840 78 74 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20  xt(pCsr->pStmt, 
2c850 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  i+1);.        sq
2c860 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
2c870 63 75 72 73 6f 72 20 2a 70 54 43 20 3d 20 30 3b  cursor *pTC = 0;
2c880 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ..        rc = s
2c890 71 6c 69 74 65 33 46 74 73 33 4f 70 65 6e 54 6f  qlite3Fts3OpenTo
2c8a0 6b 65 6e 69 7a 65 72 28 70 54 2c 20 70 43 73 72  kenizer(pT, pCsr
2c8b0 2d 3e 69 4c 61 6e 67 69 64 2c 20 7a 54 65 78 74  ->iLangid, zText
2c8c0 2c 20 2d 31 2c 20 26 70 54 43 29 3b 0a 20 20 20  , -1, &pTC);.   
2c8d0 20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d       while( rc==
2c8e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c8f0 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73         char cons
2c900 74 20 2a 7a 54 6f 6b 65 6e 3b 20 20 20 20 20 20  t *zToken;      
2c910 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
2c920 69 6e 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20  ining token */. 
2c930 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 54 6f           int nTo
2c940 6b 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ken = 0;        
2c950 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2c960 62 79 74 65 73 20 69 6e 20 74 6f 6b 65 6e 20 2a  bytes in token *
2c970 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  /.          int 
2c980 69 44 75 6d 31 20 3d 20 30 2c 20 69 44 75 6d 32  iDum1 = 0, iDum2
2c990 20 3d 20 30 3b 20 2f 2a 20 44 75 6d 6d 79 20 76   = 0; /* Dummy v
2c9a0 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  ariables */.    
2c9b0 20 20 20 20 20 20 69 6e 74 20 69 50 6f 73 20 3d        int iPos =
2c9c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2c9d0 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74  /* Position of t
2c9e0 6f 6b 65 6e 20 69 6e 20 7a 54 65 78 74 20 2a 2f  oken in zText */
2c9f0 0a 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ..          rc =
2ca00 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78 74 28   pModule->xNext(
2ca10 70 54 43 2c 20 26 7a 54 6f 6b 65 6e 2c 20 26 6e  pTC, &zToken, &n
2ca20 54 6f 6b 65 6e 2c 20 26 69 44 75 6d 31 2c 20 26  Token, &iDum1, &
2ca30 69 44 75 6d 32 2c 20 26 69 50 6f 73 29 3b 0a 20  iDum2, &iPos);. 
2ca40 20 20 20 20 20 20 20 20 20 66 6f 72 28 70 44 65           for(pDe
2ca50 66 3d 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65  f=pCsr->pDeferre
2ca60 64 3b 20 70 44 65 66 20 26 26 20 72 63 3d 3d 53  d; pDef && rc==S
2ca70 51 4c 49 54 45 5f 4f 4b 3b 20 70 44 65 66 3d 70  QLITE_OK; pDef=p
2ca80 44 65 66 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Def->pNext){.   
2ca90 20 20 20 20 20 20 20 20 20 46 74 73 33 50 68 72           Fts3Phr
2caa0 61 73 65 54 6f 6b 65 6e 20 2a 70 50 54 20 3d 20  aseToken *pPT = 
2cab0 70 44 65 66 2d 3e 70 54 6f 6b 65 6e 3b 0a 20 20  pDef->pToken;.  
2cac0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
2cad0 44 65 66 2d 3e 69 43 6f 6c 3e 3d 70 2d 3e 6e 43  Def->iCol>=p->nC
2cae0 6f 6c 75 6d 6e 20 7c 7c 20 70 44 65 66 2d 3e 69  olumn || pDef->i
2caf0 43 6f 6c 3d 3d 69 29 0a 20 20 20 20 20 20 20 20  Col==i).        
2cb00 20 20 20 20 20 20 20 20 26 26 20 28 70 50 54 2d          && (pPT-
2cb10 3e 62 46 69 72 73 74 3d 3d 30 20 7c 7c 20 69 50  >bFirst==0 || iP
2cb20 6f 73 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20  os==0).         
2cb30 20 20 20 20 20 20 20 26 26 20 28 70 50 54 2d 3e         && (pPT->
2cb40 6e 3d 3d 6e 54 6f 6b 65 6e 20 7c 7c 20 28 70 50  n==nToken || (pP
2cb50 54 2d 3e 69 73 50 72 65 66 69 78 20 26 26 20 70  T->isPrefix && p
2cb60 50 54 2d 3e 6e 3c 6e 54 6f 6b 65 6e 29 29 0a 20  PT->n<nToken)). 
2cb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
2cb80 26 20 28 30 3d 3d 6d 65 6d 63 6d 70 28 7a 54 6f  & (0==memcmp(zTo
2cb90 6b 65 6e 2c 20 70 50 54 2d 3e 7a 2c 20 70 50 54  ken, pPT->z, pPT
2cba0 2d 3e 6e 29 29 0a 20 20 20 20 20 20 20 20 20 20  ->n)).          
2cbb0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2cbc0 20 20 20 20 20 66 74 73 33 50 65 6e 64 69 6e 67       fts3Pending
2cbd0 4c 69 73 74 41 70 70 65 6e 64 28 26 70 44 65 66  ListAppend(&pDef
2cbe0 2d 3e 70 4c 69 73 74 2c 20 69 44 6f 63 69 64 2c  ->pList, iDocid,
2cbf0 20 69 2c 20 69 50 6f 73 2c 20 26 72 63 29 3b 0a   i, iPos, &rc);.
2cc00 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2cc10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cc20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2cc30 70 54 43 20 29 20 70 4d 6f 64 75 6c 65 2d 3e 78  pTC ) pModule->x
2cc40 43 6c 6f 73 65 28 70 54 43 29 3b 0a 20 20 20 20  Close(pTC);.    
2cc50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2cc60 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53  TE_DONE ) rc = S
2cc70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2cc80 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  }.    }..    for
2cc90 28 70 44 65 66 3d 70 43 73 72 2d 3e 70 44 65 66  (pDef=pCsr->pDef
2cca0 65 72 72 65 64 3b 20 70 44 65 66 20 26 26 20 72  erred; pDef && r
2ccb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 44  c==SQLITE_OK; pD
2ccc0 65 66 3d 70 44 65 66 2d 3e 70 4e 65 78 74 29 7b  ef=pDef->pNext){
2ccd0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
2cce0 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  >pList ){.      
2ccf0 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69    rc = fts3Pendi
2cd00 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69  ngListAppendVari
2cd10 6e 74 28 26 70 44 65 66 2d 3e 70 4c 69 73 74 2c  nt(&pDef->pList,
2cd20 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
2cd30 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
2cd40 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69   rc;.}..int sqli
2cd50 74 65 33 46 74 73 33 44 65 66 65 72 72 65 64 54  te3Fts3DeferredT
2cd60 6f 6b 65 6e 4c 69 73 74 28 0a 20 20 46 74 73 33  okenList(.  Fts3
2cd70 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70  DeferredToken *p
2cd80 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 70 44 61  , .  char **ppDa
2cd90 74 61 2c 20 0a 20 20 69 6e 74 20 2a 70 6e 44 61  ta, .  int *pnDa
2cda0 74 61 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 52  ta.){.  char *pR
2cdb0 65 74 3b 0a 20 20 69 6e 74 20 6e 53 6b 69 70 3b  et;.  int nSkip;
2cdc0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
2cdd0 20 64 75 6d 6d 79 3b 0a 0a 20 20 2a 70 70 44 61   dummy;..  *ppDa
2cde0 74 61 20 3d 20 30 3b 0a 20 20 2a 70 6e 44 61 74  ta = 0;.  *pnDat
2cdf0 61 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d  a = 0;..  if( p-
2ce00 3e 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  >pList==0 ){.   
2ce10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2ce20 4b 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d  K;.  }..  pRet =
2ce30 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
2ce40 5f 6d 61 6c 6c 6f 63 28 70 2d 3e 70 4c 69 73 74  _malloc(p->pList
2ce50 2d 3e 6e 44 61 74 61 29 3b 0a 20 20 69 66 28 20  ->nData);.  if( 
2ce60 21 70 52 65 74 20 29 20 72 65 74 75 72 6e 20 53  !pRet ) return S
2ce70 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20  QLITE_NOMEM;..  
2ce80 6e 53 6b 69 70 20 3d 20 73 71 6c 69 74 65 33 46  nSkip = sqlite3F
2ce90 74 73 33 47 65 74 56 61 72 69 6e 74 28 70 2d 3e  ts3GetVarint(p->
2cea0 70 4c 69 73 74 2d 3e 61 44 61 74 61 2c 20 26 64  pList->aData, &d
2ceb0 75 6d 6d 79 29 3b 0a 20 20 2a 70 6e 44 61 74 61  ummy);.  *pnData
2cec0 20 3d 20 70 2d 3e 70 4c 69 73 74 2d 3e 6e 44 61   = p->pList->nDa
2ced0 74 61 20 2d 20 6e 53 6b 69 70 3b 0a 20 20 2a 70  ta - nSkip;.  *p
2cee0 70 44 61 74 61 20 3d 20 70 52 65 74 3b 0a 20 20  pData = pRet;.  
2cef0 0a 20 20 6d 65 6d 63 70 79 28 70 52 65 74 2c 20  .  memcpy(pRet, 
2cf00 26 70 2d 3e 70 4c 69 73 74 2d 3e 61 44 61 74 61  &p->pList->aData
2cf10 5b 6e 53 6b 69 70 5d 2c 20 2a 70 6e 44 61 74 61  [nSkip], *pnData
2cf20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
2cf30 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2cf40 41 64 64 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  Add an entry for
2cf50 20 74 6f 6b 65 6e 20 70 54 6f 6b 65 6e 20 74 6f   token pToken to
2cf60 20 74 68 65 20 70 43 73 72 2d 3e 70 44 65 66 65   the pCsr->pDefe
2cf70 72 72 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 69 6e  rred list..*/.in
2cf80 74 20 73 71 6c 69 74 65 33 46 74 73 33 44 65 66  t sqlite3Fts3Def
2cf90 65 72 54 6f 6b 65 6e 28 0a 20 20 46 74 73 33 43  erToken(.  Fts3C
2cfa0 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20  ursor *pCsr,    
2cfb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74             /* Ft
2cfc0 73 33 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20  s3 table cursor 
2cfd0 2a 2f 0a 20 20 46 74 73 33 50 68 72 61 73 65 54  */.  Fts3PhraseT
2cfe0 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20  oken *pToken,   
2cff0 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f       /* Token to
2d000 20 64 65 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20   defer */.  int 
2d010 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20  iCol            
2d020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2d030 6f 6c 75 6d 6e 20 74 68 61 74 20 74 6f 6b 65 6e  olumn that token
2d040 20 6d 75 73 74 20 61 70 70 65 61 72 20 69 6e 20   must appear in 
2d050 28 6f 72 20 2d 31 29 20 2a 2f 0a 29 7b 0a 20 20  (or -1) */.){.  
2d060 46 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65  Fts3DeferredToke
2d070 6e 20 2a 70 44 65 66 65 72 72 65 64 3b 0a 20 20  n *pDeferred;.  
2d080 70 44 65 66 65 72 72 65 64 20 3d 20 73 71 6c 69  pDeferred = sqli
2d090 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
2d0a0 66 28 2a 70 44 65 66 65 72 72 65 64 29 29 3b 0a  f(*pDeferred));.
2d0b0 20 20 69 66 28 20 21 70 44 65 66 65 72 72 65 64    if( !pDeferred
2d0c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2d0d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
2d0e0 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 66 65 72  .  memset(pDefer
2d0f0 72 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  red, 0, sizeof(*
2d100 70 44 65 66 65 72 72 65 64 29 29 3b 0a 20 20 70  pDeferred));.  p
2d110 44 65 66 65 72 72 65 64 2d 3e 70 54 6f 6b 65 6e  Deferred->pToken
2d120 20 3d 20 70 54 6f 6b 65 6e 3b 0a 20 20 70 44 65   = pToken;.  pDe
2d130 66 65 72 72 65 64 2d 3e 70 4e 65 78 74 20 3d 20  ferred->pNext = 
2d140 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64 3b  pCsr->pDeferred;
2d150 20 0a 20 20 70 44 65 66 65 72 72 65 64 2d 3e 69   .  pDeferred->i
2d160 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 70 43  Col = iCol;.  pC
2d170 73 72 2d 3e 70 44 65 66 65 72 72 65 64 20 3d 20  sr->pDeferred = 
2d180 70 44 65 66 65 72 72 65 64 3b 0a 0a 20 20 61 73  pDeferred;..  as
2d190 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 70 44  sert( pToken->pD
2d1a0 65 66 65 72 72 65 64 3d 3d 30 20 29 3b 0a 20 20  eferred==0 );.  
2d1b0 70 54 6f 6b 65 6e 2d 3e 70 44 65 66 65 72 72 65  pToken->pDeferre
2d1c0 64 20 3d 20 70 44 65 66 65 72 72 65 64 3b 0a 0a  d = pDeferred;..
2d1d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d1e0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
2d1f0 0a 2a 2a 20 53 51 4c 69 74 65 20 76 61 6c 75 65  .** SQLite value
2d200 20 70 52 6f 77 69 64 20 63 6f 6e 74 61 69 6e 73   pRowid contains
2d210 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 61 20   the rowid of a 
2d220 72 6f 77 20 74 68 61 74 20 6d 61 79 20 6f 72 20  row that may or 
2d230 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 70 72  may not be.** pr
2d240 65 73 65 6e 74 20 69 6e 20 74 68 65 20 46 54 53  esent in the FTS
2d250 33 20 74 61 62 6c 65 2e 20 49 66 20 69 74 20 69  3 table. If it i
2d260 73 2c 20 64 65 6c 65 74 65 20 69 74 20 61 6e 64  s, delete it and
2d270 20 61 64 6a 75 73 74 20 74 68 65 20 63 6f 6e 74   adjust the cont
2d280 65 6e 74 73 0a 2a 2a 20 6f 66 20 73 75 62 73 69  ents.** of subsi
2d290 64 75 61 72 79 20 64 61 74 61 20 73 74 72 75 63  duary data struc
2d2a0 74 75 72 65 73 20 61 63 63 6f 72 64 69 6e 67 6c  tures accordingl
2d2b0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
2d2c0 20 66 74 73 33 44 65 6c 65 74 65 42 79 52 6f 77   fts3DeleteByRow
2d2d0 69 64 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  id(.  Fts3Table 
2d2e0 2a 70 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76  *p, .  sqlite3_v
2d2f0 61 6c 75 65 20 2a 70 52 6f 77 69 64 2c 20 0a 20  alue *pRowid, . 
2d300 20 69 6e 74 20 2a 70 6e 43 68 6e 67 2c 20 20 20   int *pnChng,   
2d310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d320 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 44 65 63 72   /* IN/OUT: Decr
2d330 65 6d 65 6e 74 20 69 66 20 72 6f 77 20 69 73 20  ement if row is 
2d340 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 33 32  deleted */.  u32
2d350 20 2a 61 53 7a 44 65 6c 0a 29 7b 0a 20 20 69 6e   *aSzDel.){.  in
2d360 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2d370 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2d380 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2d390 20 20 69 6e 74 20 62 46 6f 75 6e 64 20 3d 20 30    int bFound = 0
2d3a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d3b0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2a 70 52    /* True if *pR
2d3c0 6f 77 69 64 20 72 65 61 6c 6c 79 20 69 73 20 69  owid really is i
2d3d0 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 0a  n the table */..
2d3e0 20 20 66 74 73 33 44 65 6c 65 74 65 54 65 72 6d    fts3DeleteTerm
2d3f0 73 28 26 72 63 2c 20 70 2c 20 70 52 6f 77 69 64  s(&rc, p, pRowid
2d400 2c 20 61 53 7a 44 65 6c 2c 20 26 62 46 6f 75 6e  , aSzDel, &bFoun
2d410 64 29 3b 0a 20 20 69 66 28 20 62 46 6f 75 6e 64  d);.  if( bFound
2d420 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2d430 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 45  K ){.    int isE
2d440 6d 70 74 79 20 3d 20 30 3b 20 20 20 20 20 20 20  mpty = 0;       
2d450 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 69         /* Deleti
2d460 6e 67 20 2a 70 52 6f 77 69 64 20 6c 65 61 76 65  ng *pRowid leave
2d470 73 20 74 68 65 20 74 61 62 6c 65 20 65 6d 70 74  s the table empt
2d480 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74  y */.    rc = ft
2d490 73 33 49 73 45 6d 70 74 79 28 70 2c 20 70 52 6f  s3IsEmpty(p, pRo
2d4a0 77 69 64 2c 20 26 69 73 45 6d 70 74 79 29 3b 0a  wid, &isEmpty);.
2d4b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2d4c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
2d4d0 66 28 20 69 73 45 6d 70 74 79 20 29 7b 0a 20 20  f( isEmpty ){.  
2d4e0 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 69 6e        /* Deletin
2d4f0 67 20 74 68 69 73 20 72 6f 77 20 6d 65 61 6e 73  g this row means
2d500 20 74 68 65 20 77 68 6f 6c 65 20 74 61 62 6c 65   the whole table
2d510 20 69 73 20 65 6d 70 74 79 2e 20 49 6e 20 74 68   is empty. In th
2d520 69 73 20 63 61 73 65 0a 20 20 20 20 20 20 20 20  is case.        
2d530 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 63 6f  ** delete the co
2d540 6e 74 65 6e 74 73 20 6f 66 20 61 6c 6c 20 74 68  ntents of all th
2d550 72 65 65 20 74 61 62 6c 65 73 20 61 6e 64 20 74  ree tables and t
2d560 68 72 6f 77 20 61 77 61 79 20 61 6e 79 0a 20 20  hrow away any.  
2d570 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69 6e        ** data in
2d580 20 74 68 65 20 70 65 6e 64 69 6e 67 54 65 72 6d   the pendingTerm
2d590 73 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 2a  s hash table.  *
2d5a0 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  /.        rc = f
2d5b0 74 73 33 44 65 6c 65 74 65 41 6c 6c 28 70 2c 20  ts3DeleteAll(p, 
2d5c0 31 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 6e 43  1);.        *pnC
2d5d0 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  hng = 0;.       
2d5e0 20 6d 65 6d 73 65 74 28 61 53 7a 44 65 6c 2c 20   memset(aSzDel, 
2d5f0 30 2c 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2a  0, sizeof(u32) *
2d600 20 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 20   (p->nColumn+1) 
2d610 2a 20 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  * 2);.      }els
2d620 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 6e 43 68  e{.        *pnCh
2d630 6e 67 20 3d 20 2a 70 6e 43 68 6e 67 20 2d 20 31  ng = *pnChng - 1
2d640 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
2d650 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d 30 20  >zContentTbl==0 
2d660 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  ){.          fts
2d670 33 53 71 6c 45 78 65 63 28 26 72 63 2c 20 70 2c  3SqlExec(&rc, p,
2d680 20 53 51 4c 5f 44 45 4c 45 54 45 5f 43 4f 4e 54   SQL_DELETE_CONT
2d690 45 4e 54 2c 20 26 70 52 6f 77 69 64 29 3b 0a 20  ENT, &pRowid);. 
2d6a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d6b0 20 69 66 28 20 70 2d 3e 62 48 61 73 44 6f 63 73   if( p->bHasDocs
2d6c0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
2d6d0 20 66 74 73 33 53 71 6c 45 78 65 63 28 26 72 63   fts3SqlExec(&rc
2d6e0 2c 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f  , p, SQL_DELETE_
2d6f0 44 4f 43 53 49 5a 45 2c 20 26 70 52 6f 77 69 64  DOCSIZE, &pRowid
2d700 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2d710 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2d720 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2d730 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2d740 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 77 6f 72  ion does the wor
2d750 6b 20 66 6f 72 20 74 68 65 20 78 55 70 64 61 74  k for the xUpdat
2d760 65 20 6d 65 74 68 6f 64 20 6f 66 20 46 54 53 33  e method of FTS3
2d770 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c   virtual.** tabl
2d780 65 73 2e 20 54 68 65 20 73 63 68 65 6d 61 20 6f  es. The schema o
2d790 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
2d7a0 62 6c 65 20 62 65 69 6e 67 3a 0a 2a 2a 0a 2a 2a  ble being:.**.**
2d7b0 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
2d7c0 45 20 3c 74 61 62 6c 65 20 6e 61 6d 65 3e 28 20  E <table name>( 
2d7d0 0a 2a 2a 20 20 20 20 20 20 20 3c 75 73 65 72 20  .**       <user 
2d7e0 63 6f 6c 75 6d 6e 73 3e 2c 0a 2a 2a 20 20 20 20  columns>,.**    
2d7f0 20 20 20 3c 74 61 62 6c 65 20 6e 61 6d 65 3e 20     <table name> 
2d800 48 49 44 44 45 4e 2c 20 0a 2a 2a 20 20 20 20 20  HIDDEN, .**     
2d810 20 20 64 6f 63 69 64 20 48 49 44 44 45 4e 2c 20    docid HIDDEN, 
2d820 0a 2a 2a 20 20 20 20 20 20 20 3c 6c 61 6e 67 69  .**       <langi
2d830 64 3e 20 48 49 44 44 45 4e 0a 2a 2a 20 20 20 20  d> HIDDEN.**    
2d840 20 29 3b 0a 2a 2a 0a 2a 2a 20 0a 2a 2f 0a 69 6e   );.**.** .*/.in
2d850 74 20 73 71 6c 69 74 65 33 46 74 73 33 55 70 64  t sqlite3Fts3Upd
2d860 61 74 65 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c  ateMethod(.  sql
2d870 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
2d880 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2d890 46 54 53 33 20 76 74 61 62 20 6f 62 6a 65 63 74  FTS3 vtab object
2d8a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20   */.  int nArg, 
2d8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d8c0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2d8d0 20 61 72 67 75 6d 65 6e 74 20 61 72 72 61 79 20   argument array 
2d8e0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
2d8f0 75 65 20 2a 2a 61 70 56 61 6c 2c 20 20 20 20 20  ue **apVal,     
2d900 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
2d910 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2d920 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52  sqlite_int64 *pR
2d930 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20  owid            
2d940 2f 2a 20 4f 55 54 3a 20 54 68 65 20 61 66 66 65  /* OUT: The affe
2d950 63 74 65 64 20 28 6f 72 20 65 66 66 65 63 74 65  cted (or effecte
2d960 64 29 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20  d) rowid */.){. 
2d970 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20 3d 20   Fts3Table *p = 
2d980 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 56 74  (Fts3Table *)pVt
2d990 61 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ab;.  int rc = S
2d9a0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2d9b0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2d9c0 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  Code */.  int is
2d9d0 52 65 6d 6f 76 65 20 3d 20 30 3b 20 20 20 20 20  Remove = 0;     
2d9e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2d9f0 65 20 66 6f 72 20 61 6e 20 55 50 44 41 54 45 20  e for an UPDATE 
2da00 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 75  or DELETE */.  u
2da10 33 32 20 2a 61 53 7a 49 6e 73 20 3d 20 30 3b 20  32 *aSzIns = 0; 
2da20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2da30 2a 20 53 69 7a 65 73 20 6f 66 20 69 6e 73 65 72  * Sizes of inser
2da40 74 65 64 20 64 6f 63 75 6d 65 6e 74 73 20 2a 2f  ted documents */
2da50 0a 20 20 75 33 32 20 2a 61 53 7a 44 65 6c 20 3d  .  u32 *aSzDel =
2da60 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2da70 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 64     /* Sizes of d
2da80 65 6c 65 74 65 64 20 64 6f 63 75 6d 65 6e 74 73  eleted documents
2da90 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20   */.  int nChng 
2daa0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2dab0 20 20 20 20 20 20 2f 2a 20 4e 65 74 20 63 68 61        /* Net cha
2dac0 6e 67 65 20 69 6e 20 6e 75 6d 62 65 72 20 6f 66  nge in number of
2dad0 20 64 6f 63 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   documents */.  
2dae0 69 6e 74 20 62 49 6e 73 65 72 74 44 6f 6e 65 20  int bInsertDone 
2daf0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68  = 0;..  /* At th
2db00 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 75 73 74  is point it must
2db10 20 62 65 20 6b 6e 6f 77 6e 20 69 66 20 74 68 65   be known if the
2db20 20 25 5f 73 74 61 74 20 74 61 62 6c 65 20 65 78   %_stat table ex
2db30 69 73 74 73 20 6f 72 20 6e 6f 74 2e 0a 20 20 2a  ists or not..  *
2db40 2a 20 53 6f 20 62 48 61 73 53 74 61 74 20 6d 61  * So bHasStat ma
2db50 79 20 6e 6f 74 20 62 65 20 32 2e 20 20 2a 2f 0a  y not be 2.  */.
2db60 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 48 61    assert( p->bHa
2db70 73 53 74 61 74 3d 3d 30 20 7c 7c 20 70 2d 3e 62  sStat==0 || p->b
2db80 48 61 73 53 74 61 74 3d 3d 31 20 29 3b 0a 0a 20  HasStat==1 );.. 
2db90 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 65 67   assert( p->pSeg
2dba0 6d 65 6e 74 73 3d 3d 30 20 29 3b 0a 20 20 61 73  ments==0 );.  as
2dbb0 73 65 72 74 28 20 0a 20 20 20 20 20 20 6e 41 72  sert( .      nAr
2dbc0 67 3d 3d 31 20 20 20 20 20 20 20 20 20 20 20 20  g==1            
2dbd0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 45 4c 45           /* DELE
2dbe0 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f  TE operations */
2dbf0 0a 20 20 20 7c 7c 20 6e 41 72 67 3d 3d 28 32 20  .   || nArg==(2 
2dc00 2b 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b 20 33  + p->nColumn + 3
2dc10 29 20 20 2f 2a 20 49 4e 53 45 52 54 20 6f 72 20  )  /* INSERT or 
2dc20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e  UPDATE operation
2dc30 73 20 2a 2f 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  s */.  );..  /* 
2dc40 43 68 65 63 6b 20 66 6f 72 20 61 20 22 73 70 65  Check for a "spe
2dc50 63 69 61 6c 22 20 49 4e 53 45 52 54 20 6f 70 65  cial" INSERT ope
2dc60 72 61 74 69 6f 6e 2e 20 4f 6e 65 20 6f 66 20 74  ration. One of t
2dc70 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20  he form:.  **.  
2dc80 2a 2a 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  **   INSERT INTO
2dc90 20 78 79 7a 28 78 79 7a 29 20 56 41 4c 55 45 53   xyz(xyz) VALUES
2dca0 28 27 63 6f 6d 6d 61 6e 64 27 29 3b 0a 20 20 2a  ('command');.  *
2dcb0 2f 0a 20 20 69 66 28 20 6e 41 72 67 3e 31 20 0a  /.  if( nArg>1 .
2dcc0 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61     && sqlite3_va
2dcd0 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 30  lue_type(apVal[0
2dce0 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  ])==SQLITE_NULL 
2dcf0 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 76  .   && sqlite3_v
2dd00 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b  alue_type(apVal[
2dd10 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 5d 29 21 3d  p->nColumn+2])!=
2dd20 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 0a 20 20 29  SQLITE_NULL .  )
2dd30 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53  {.    rc = fts3S
2dd40 70 65 63 69 61 6c 49 6e 73 65 72 74 28 70 2c 20  pecialInsert(p, 
2dd50 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e  apVal[p->nColumn
2dd60 2b 32 5d 29 3b 0a 20 20 20 20 67 6f 74 6f 20 75  +2]);.    goto u
2dd70 70 64 61 74 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  pdate_out;.  }..
2dd80 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26 20    if( nArg>1 && 
2dd90 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
2dda0 74 28 61 70 56 61 6c 5b 32 20 2b 20 70 2d 3e 6e  t(apVal[2 + p->n
2ddb0 43 6f 6c 75 6d 6e 20 2b 20 32 5d 29 3c 30 20 29  Column + 2])<0 )
2ddc0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
2ddd0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
2dde0 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 6f 75    goto update_ou
2ddf0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c  t;.  }..  /* All
2de00 6f 63 61 74 65 20 73 70 61 63 65 20 74 6f 20 68  ocate space to h
2de10 6f 6c 64 20 74 68 65 20 63 68 61 6e 67 65 20 69  old the change i
2de20 6e 20 64 6f 63 75 6d 65 6e 74 20 73 69 7a 65 73  n document sizes
2de30 20 2a 2f 0a 20 20 61 53 7a 44 65 6c 20 3d 20 73   */.  aSzDel = s
2de40 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
2de50 69 7a 65 6f 66 28 61 53 7a 44 65 6c 5b 30 5d 29  izeof(aSzDel[0])
2de60 2a 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 2a  *(p->nColumn+1)*
2de70 32 20 29 3b 0a 20 20 69 66 28 20 61 53 7a 44 65  2 );.  if( aSzDe
2de80 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
2de90 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2dea0 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 6f     goto update_o
2deb0 75 74 3b 0a 20 20 7d 0a 20 20 61 53 7a 49 6e 73  ut;.  }.  aSzIns
2dec0 20 3d 20 26 61 53 7a 44 65 6c 5b 70 2d 3e 6e 43   = &aSzDel[p->nC
2ded0 6f 6c 75 6d 6e 2b 31 5d 3b 0a 20 20 6d 65 6d 73  olumn+1];.  mems
2dee0 65 74 28 61 53 7a 44 65 6c 2c 20 30 2c 20 73 69  et(aSzDel, 0, si
2def0 7a 65 6f 66 28 61 53 7a 44 65 6c 5b 30 5d 29 2a  zeof(aSzDel[0])*
2df00 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 2a 32  (p->nColumn+1)*2
2df10 29 3b 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 57  );..  rc = fts3W
2df20 72 69 74 65 6c 6f 63 6b 28 70 29 3b 0a 20 20 69  ritelock(p);.  i
2df30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2df40 20 29 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 6f   ) goto update_o
2df50 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  ut;..  /* If thi
2df60 73 20 69 73 20 61 6e 20 49 4e 53 45 52 54 20 6f  s is an INSERT o
2df70 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 61 6e 20  peration, or an 
2df80 55 50 44 41 54 45 20 74 68 61 74 20 6d 6f 64 69  UPDATE that modi
2df90 66 69 65 73 20 74 68 65 20 72 6f 77 69 64 0a 20  fies the rowid. 
2dfa0 20 2a 2a 20 76 61 6c 75 65 2c 20 74 68 65 6e 20   ** value, then 
2dfb0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72  this operation r
2dfc0 65 71 75 69 72 65 73 20 63 6f 6e 73 74 72 61 69  equires constrai
2dfd0 6e 74 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 2a  nt handling..  *
2dfe0 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 6e  *.  ** If the on
2dff0 2d 63 6f 6e 66 6c 69 63 74 20 6d 6f 64 65 20 69  -conflict mode i
2e000 73 20 52 45 50 4c 41 43 45 2c 20 74 68 69 73 20  s REPLACE, this 
2e010 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 65  means that the e
2e020 78 69 73 74 69 6e 67 20 72 6f 77 0a 20 20 2a 2a  xisting row.  **
2e030 20 73 68 6f 75 6c 64 20 62 65 20 64 65 6c 65 74   should be delet
2e040 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
2e050 62 61 73 65 20 62 65 66 6f 72 65 20 69 6e 73 65  base before inse
2e060 72 74 69 6e 67 20 74 68 65 20 6e 65 77 20 72 6f  rting the new ro
2e070 77 2e 20 4f 72 2c 0a 20 20 2a 2a 20 69 66 20 74  w. Or,.  ** if t
2e080 68 65 20 6f 6e 2d 63 6f 6e 66 6c 69 63 74 20 6d  he on-conflict m
2e090 6f 64 65 20 69 73 20 6f 74 68 65 72 20 74 68 61  ode is other tha
2e0a0 6e 20 52 45 50 4c 41 43 45 2c 20 74 68 65 6e 20  n REPLACE, then 
2e0b0 74 68 69 73 20 6d 65 74 68 6f 64 20 6d 75 73 74  this method must
2e0c0 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 65  .  ** detect the
2e0d0 20 63 6f 6e 66 6c 69 63 74 20 61 6e 64 20 72 65   conflict and re
2e0e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
2e0f0 54 52 41 49 4e 54 20 62 65 66 6f 72 65 20 62 65  TRAINT before be
2e100 67 69 6e 6e 69 6e 67 20 74 6f 0a 20 20 2a 2a 20  ginning to.  ** 
2e110 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2e120 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
2e130 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26 20 70   if( nArg>1 && p
2e140 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d 30  ->zContentTbl==0
2e150 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20   ){.    /* Find 
2e160 74 68 65 20 76 61 6c 75 65 20 6f 62 6a 65 63 74  the value object
2e170 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
2e180 6e 65 77 20 72 6f 77 69 64 20 76 61 6c 75 65 2e  new rowid value.
2e190 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
2e1a0 76 61 6c 75 65 20 2a 70 4e 65 77 52 6f 77 69 64  value *pNewRowid
2e1b0 20 3d 20 61 70 56 61 6c 5b 33 2b 70 2d 3e 6e 43   = apVal[3+p->nC
2e1c0 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 69 66 28 20  olumn];.    if( 
2e1d0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
2e1e0 70 65 28 70 4e 65 77 52 6f 77 69 64 29 3d 3d 53  pe(pNewRowid)==S
2e1f0 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20  QLITE_NULL ){.  
2e200 20 20 20 20 70 4e 65 77 52 6f 77 69 64 20 3d 20      pNewRowid = 
2e210 61 70 56 61 6c 5b 31 5d 3b 0a 20 20 20 20 7d 0a  apVal[1];.    }.
2e220 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2e230 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 4e 65 77  _value_type(pNew
2e240 52 6f 77 69 64 29 21 3d 53 51 4c 49 54 45 5f 4e  Rowid)!=SQLITE_N
2e250 55 4c 4c 20 26 26 20 28 20 0a 20 20 20 20 20 20  ULL && ( .      
2e260 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
2e270 74 79 70 65 28 61 70 56 61 6c 5b 30 5d 29 3d 3d  type(apVal[0])==
2e280 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20 20 20 20  SQLITE_NULL.    
2e290 20 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   || sqlite3_valu
2e2a0 65 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b 30 5d  e_int64(apVal[0]
2e2b0 29 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  )!=sqlite3_value
2e2c0 5f 69 6e 74 36 34 28 70 4e 65 77 52 6f 77 69 64  _int64(pNewRowid
2e2d0 29 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20  ).    )){.      
2e2e0 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 77 69 64  /* The new rowid
2e2f0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 69 6e   is not NULL (in
2e300 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 72   this case the r
2e310 6f 77 69 64 20 77 69 6c 6c 20 62 65 0a 20 20 20  owid will be.   
2e320 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61     ** automatica
2e330 6c 6c 79 20 61 73 73 69 67 6e 65 64 20 61 6e 64  lly assigned and
2e340 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61   there is no cha
2e350 6e 63 65 20 6f 66 20 61 20 63 6f 6e 66 6c 69 63  nce of a conflic
2e360 74 29 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 2a  t), and .      *
2e370 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
2e380 69 73 20 65 69 74 68 65 72 20 61 6e 20 49 4e 53  is either an INS
2e390 45 52 54 20 6f 72 20 61 6e 20 55 50 44 41 54 45  ERT or an UPDATE
2e3a0 20 74 68 61 74 20 6d 6f 64 69 66 69 65 73 20 74   that modifies t
2e3b0 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77 69  he.      ** rowi
2e3c0 64 20 63 6f 6c 75 6d 6e 2e 20 53 6f 20 69 66 20  d column. So if 
2e3d0 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 6d 6f 64  the conflict mod
2e3e0 65 20 69 73 20 52 45 50 4c 41 43 45 2c 20 74 68  e is REPLACE, th
2e3f0 65 6e 20 64 65 6c 65 74 65 20 61 6e 79 0a 20 20  en delete any.  
2e400 20 20 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20      ** existing 
2e410 72 6f 77 20 77 69 74 68 20 72 6f 77 69 64 3d 70  row with rowid=p
2e420 4e 65 77 52 6f 77 69 64 2e 20 0a 20 20 20 20 20  NewRowid. .     
2e430 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 72 2c   **.      ** Or,
2e440 20 69 66 20 74 68 65 20 63 6f 6e 66 6c 69 63 74   if the conflict
2e450 20 6d 6f 64 65 20 69 73 20 6e 6f 74 20 52 45 50   mode is not REP
2e460 4c 41 43 45 2c 20 69 6e 73 65 72 74 20 74 68 65  LACE, insert the
2e470 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f   new record into
2e480 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 25   .      ** the %
2e490 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e 20  _content table. 
2e4a0 49 66 20 77 65 20 68 69 74 20 74 68 65 20 64 75  If we hit the du
2e4b0 70 6c 69 63 61 74 65 20 72 6f 77 69 64 20 63 6f  plicate rowid co
2e4c0 6e 73 74 72 61 69 6e 74 20 28 6f 72 20 61 6e 79  nstraint (or any
2e4d0 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
2e4e0 65 72 72 6f 72 29 20 77 68 69 6c 65 20 64 6f 69  error) while doi
2e4f0 6e 67 20 73 6f 2c 20 72 65 74 75 72 6e 20 69 6d  ng so, return im
2e500 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 20  mediately..     
2e510 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69   **.      ** Thi
2e520 73 20 62 72 61 6e 63 68 20 6d 61 79 20 61 6c 73  s branch may als
2e530 6f 20 72 75 6e 20 69 66 20 70 4e 65 77 52 6f 77  o run if pNewRow
2e540 69 64 20 63 6f 6e 74 61 69 6e 73 20 61 20 76 61  id contains a va
2e550 6c 75 65 20 74 68 61 74 20 63 61 6e 6e 6f 74 0a  lue that cannot.
2e560 20 20 20 20 20 20 2a 2a 20 62 65 20 6c 6f 73 73        ** be loss
2e570 6c 65 73 73 6c 79 20 63 6f 6e 76 65 72 74 65 64  lessly converted
2e580 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 20   to an integer. 
2e590 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
2e5a0 65 20 65 76 65 6e 74 75 61 6c 20 0a 20 20 20 20  e eventual .    
2e5b0 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 66 74 73    ** call to fts
2e5c0 33 49 6e 73 65 72 74 44 61 74 61 28 29 20 28 65  3InsertData() (e
2e5d0 69 74 68 65 72 20 6a 75 73 74 20 62 65 6c 6f 77  ither just below
2e5e0 20 6f 72 20 66 75 72 74 68 65 72 20 6f 6e 20 69   or further on i
2e5f0 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  n this.      ** 
2e600 66 75 6e 63 74 69 6f 6e 29 20 77 69 6c 6c 20 72  function) will r
2e610 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
2e620 4d 41 54 43 48 2e 20 49 66 20 66 74 73 33 44 65  MATCH. If fts3De
2e630 6c 65 74 65 42 79 52 6f 77 69 64 20 69 73 20 0a  leteByRowid is .
2e640 20 20 20 20 20 20 2a 2a 20 69 6e 76 6f 6b 65 64        ** invoked
2e650 2c 20 69 74 20 77 69 6c 6c 20 64 65 6c 65 74 65  , it will delete
2e660 20 7a 65 72 6f 20 72 6f 77 73 20 28 73 69 6e 63   zero rows (sinc
2e670 65 20 6e 6f 20 72 6f 77 20 77 69 6c 6c 20 68 61  e no row will ha
2e680 76 65 0a 20 20 20 20 20 20 2a 2a 20 64 6f 63 69  ve.      ** doci
2e690 64 3d 24 70 4e 65 77 52 6f 77 69 64 20 69 66 20  d=$pNewRowid if 
2e6a0 24 70 4e 65 77 52 6f 77 69 64 20 69 73 20 6e 6f  $pNewRowid is no
2e6b0 74 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c  t an integer val
2e6c0 75 65 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ue)..      */.  
2e6d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
2e6e0 76 74 61 62 5f 6f 6e 5f 63 6f 6e 66 6c 69 63 74  vtab_on_conflict
2e6f0 28 70 2d 3e 64 62 29 3d 3d 53 51 4c 49 54 45 5f  (p->db)==SQLITE_
2e700 52 45 50 4c 41 43 45 20 29 7b 0a 20 20 20 20 20  REPLACE ){.     
2e710 20 20 20 72 63 20 3d 20 66 74 73 33 44 65 6c 65     rc = fts3Dele
2e720 74 65 42 79 52 6f 77 69 64 28 70 2c 20 70 4e 65  teByRowid(p, pNe
2e730 77 52 6f 77 69 64 2c 20 26 6e 43 68 6e 67 2c 20  wRowid, &nChng, 
2e740 61 53 7a 44 65 6c 29 3b 0a 20 20 20 20 20 20 7d  aSzDel);.      }
2e750 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
2e760 20 3d 20 66 74 73 33 49 6e 73 65 72 74 44 61 74   = fts3InsertDat
2e770 61 28 70 2c 20 61 70 56 61 6c 2c 20 70 52 6f 77  a(p, apVal, pRow
2e780 69 64 29 3b 0a 20 20 20 20 20 20 20 20 62 49 6e  id);.        bIn
2e790 73 65 72 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20  sertDone = 1;.  
2e7a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2e7b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2e7c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
2e7d0 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20 20 7d 0a  update_out;.  }.
2e7e0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
2e7f0 20 61 20 44 45 4c 45 54 45 20 6f 72 20 55 50 44   a DELETE or UPD
2e800 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 2c 20 72  ATE operation, r
2e810 65 6d 6f 76 65 20 74 68 65 20 6f 6c 64 20 72 65  emove the old re
2e820 63 6f 72 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73  cord. */.  if( s
2e830 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
2e840 65 28 61 70 56 61 6c 5b 30 5d 29 21 3d 53 51 4c  e(apVal[0])!=SQL
2e850 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_NULL ){.    
2e860 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2e870 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c  value_type(apVal
2e880 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  [0])==SQLITE_INT
2e890 45 47 45 52 20 29 3b 0a 20 20 20 20 72 63 20 3d  EGER );.    rc =
2e8a0 20 66 74 73 33 44 65 6c 65 74 65 42 79 52 6f 77   fts3DeleteByRow
2e8b0 69 64 28 70 2c 20 61 70 56 61 6c 5b 30 5d 2c 20  id(p, apVal[0], 
2e8c0 26 6e 43 68 6e 67 2c 20 61 53 7a 44 65 6c 29 3b  &nChng, aSzDel);
2e8d0 0a 20 20 20 20 69 73 52 65 6d 6f 76 65 20 3d 20  .    isRemove = 
2e8e0 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49  1;.  }.  .  /* I
2e8f0 66 20 74 68 69 73 20 69 73 20 61 6e 20 49 4e 53  f this is an INS
2e900 45 52 54 20 6f 72 20 55 50 44 41 54 45 20 6f 70  ERT or UPDATE op
2e910 65 72 61 74 69 6f 6e 2c 20 69 6e 73 65 72 74 20  eration, insert 
2e920 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 2e 20  the new record. 
2e930 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3e 31 20  */.  if( nArg>1 
2e940 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
2e950 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 61 6e   ){.    int iLan
2e960 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  gid = sqlite3_va
2e970 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 32 20  lue_int(apVal[2 
2e980 2b 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b 20 32  + p->nColumn + 2
2e990 5d 29 3b 0a 20 20 20 20 69 66 28 20 62 49 6e 73  ]);.    if( bIns
2e9a0 65 72 74 44 6f 6e 65 3d 3d 30 20 29 7b 0a 20 20  ertDone==0 ){.  
2e9b0 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 73      rc = fts3Ins
2e9c0 65 72 74 44 61 74 61 28 70 2c 20 61 70 56 61 6c  ertData(p, apVal
2e9d0 2c 20 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  , pRowid);.     
2e9e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2e9f0 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70 2d  CONSTRAINT && p-
2ea00 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d 30 20  >zContentTbl==0 
2ea10 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2ea20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41 42  FTS_CORRUPT_VTAB
2ea30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2ea40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2ea50 54 45 5f 4f 4b 20 26 26 20 28 21 69 73 52 65 6d  TE_OK && (!isRem
2ea60 6f 76 65 20 7c 7c 20 2a 70 52 6f 77 69 64 21 3d  ove || *pRowid!=
2ea70 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 20 29 20  p->iPrevDocid ) 
2ea80 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  ){.      rc = ft
2ea90 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 44 6f  s3PendingTermsDo
2eaa0 63 69 64 28 70 2c 20 30 2c 20 69 4c 61 6e 67 69  cid(p, 0, iLangi
2eab0 64 2c 20 2a 70 52 6f 77 69 64 29 3b 0a 20 20 20  d, *pRowid);.   
2eac0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
2ead0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2eae0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 50 72    assert( p->iPr
2eaf0 65 76 44 6f 63 69 64 3d 3d 2a 70 52 6f 77 69 64  evDocid==*pRowid
2eb00 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   );.      rc = f
2eb10 74 73 33 49 6e 73 65 72 74 54 65 72 6d 73 28 70  ts3InsertTerms(p
2eb20 2c 20 69 4c 61 6e 67 69 64 2c 20 61 70 56 61 6c  , iLangid, apVal
2eb30 2c 20 61 53 7a 49 6e 73 29 3b 0a 20 20 20 20 7d  , aSzIns);.    }
2eb40 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 48 61 73  .    if( p->bHas
2eb50 44 6f 63 73 69 7a 65 20 29 7b 0a 20 20 20 20 20  Docsize ){.     
2eb60 20 66 74 73 33 49 6e 73 65 72 74 44 6f 63 73 69   fts3InsertDocsi
2eb70 7a 65 28 26 72 63 2c 20 70 2c 20 61 53 7a 49 6e  ze(&rc, p, aSzIn
2eb80 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43  s);.    }.    nC
2eb90 68 6e 67 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66  hng++;.  }..  if
2eba0 28 20 70 2d 3e 62 46 74 73 34 20 29 7b 0a 20 20  ( p->bFts4 ){.  
2ebb0 20 20 66 74 73 33 55 70 64 61 74 65 44 6f 63 54    fts3UpdateDocT
2ebc0 6f 74 61 6c 73 28 26 72 63 2c 20 70 2c 20 61 53  otals(&rc, p, aS
2ebd0 7a 49 6e 73 2c 20 61 53 7a 44 65 6c 2c 20 6e 43  zIns, aSzDel, nC
2ebe0 68 6e 67 29 3b 0a 20 20 7d 0a 0a 20 75 70 64 61  hng);.  }.. upda
2ebf0 74 65 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  te_out:.  sqlite
2ec00 33 5f 66 72 65 65 28 61 53 7a 44 65 6c 29 3b 0a  3_free(aSzDel);.
2ec10 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67    sqlite3Fts3Seg
2ec20 6d 65 6e 74 73 43 6c 6f 73 65 28 70 29 3b 0a 20  mentsClose(p);. 
2ec30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2ec40 2a 20 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20  * .** Flush any 
2ec50 64 61 74 61 20 69 6e 20 74 68 65 20 70 65 6e 64  data in the pend
2ec60 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20 74  ing-terms hash t
2ec70 61 62 6c 65 20 74 6f 20 64 69 73 6b 2e 20 49 66  able to disk. If
2ec80 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20   successful,.** 
2ec90 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d 65 6e  merge all segmen
2eca0 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ts in the databa
2ecb0 73 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 68  se (including th
2ecc0 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 2c 20 69  e new segment, i
2ecd0 66 20 0a 2a 2a 20 74 68 65 72 65 20 77 61 73 20  f .** there was 
2ece0 61 6e 79 20 64 61 74 61 20 74 6f 20 66 6c 75 73  any data to flus
2ecf0 68 29 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  h) into a single
2ed00 20 73 65 67 6d 65 6e 74 2e 20 0a 2a 2f 0a 69 6e   segment. .*/.in
2ed10 74 20 73 71 6c 69 74 65 33 46 74 73 33 4f 70 74  t sqlite3Fts3Opt
2ed20 69 6d 69 7a 65 28 46 74 73 33 54 61 62 6c 65 20  imize(Fts3Table 
2ed30 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
2ed40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
2ed50 65 63 28 70 2d 3e 64 62 2c 20 22 53 41 56 45 50  ec(p->db, "SAVEP
2ed60 4f 49 4e 54 20 66 74 73 33 22 2c 20 30 2c 20 30  OINT fts3", 0, 0
2ed70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
2ed80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ed90 20 72 63 20 3d 20 66 74 73 33 44 6f 4f 70 74 69   rc = fts3DoOpti
2eda0 6d 69 7a 65 28 70 2c 20 31 29 3b 0a 20 20 20 20  mize(p, 1);.    
2edb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2edc0 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
2edd0 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 6e  DONE ){.      in
2ede0 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f  t rc2 = sqlite3_
2edf0 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c  exec(p->db, "REL
2ee00 45 41 53 45 20 66 74 73 33 22 2c 20 30 2c 20 30  EASE fts3", 0, 0
2ee10 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2ee20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
2ee30 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
2ee40 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
2ee50 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
2ee60 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 66 74 73  "ROLLBACK TO fts
2ee70 33 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  3", 0, 0, 0);.  
2ee80 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
2ee90 28 70 2d 3e 64 62 2c 20 22 52 45 4c 45 41 53 45  (p->db, "RELEASE
2eea0 20 66 74 73 33 22 2c 20 30 2c 20 30 2c 20 30 29   fts3", 0, 0, 0)
2eeb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
2eec0 6c 69 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74  lite3Fts3Segment
2eed0 73 43 6c 6f 73 65 28 70 29 3b 0a 20 20 72 65 74  sClose(p);.  ret
2eee0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69  urn rc;.}..#endi
2eef0 66 0a                                            f.