/ Hex Artifact Content
Login

Artifact a85bc4885fde7f1b44c9de013b62f7cd3332dc59e208053d878729b1d04745bc:


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 53 75 66 66 69 78 3c 3d 30 20 0a 20 20 20 7c  nSuffix<=0 .   |
bb00: 7c 20 28 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f  | (&pReader->aNo
bb10: 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64  de[pReader->nNod
bb20: 65 5d 20 2d 20 70 4e 65 78 74 29 3c 6e 53 75 66  e] - pNext)<nSuf
bb30: 66 69 78 0a 20 20 20 7c 7c 20 6e 50 72 65 66 69  fix.   || nPrefi
bb40: 78 3e 70 52 65 61 64 65 72 2d 3e 6e 54 65 72 6d  x>pReader->nTerm
bb50: 41 6c 6c 6f 63 0a 20 20 29 7b 0a 20 20 20 20 72  Alloc.  ){.    r
bb60: 65 74 75 72 6e 20 46 54 53 5f 43 4f 52 52 55 50  eturn FTS_CORRUP
bb70: 54 5f 56 54 41 42 3b 0a 20 20 7d 0a 0a 20 20 2f  T_VTAB;.  }..  /
bb80: 2a 20 42 6f 74 68 20 6e 50 72 65 66 69 78 20 61  * Both nPrefix a
bb90: 6e 64 20 6e 53 75 66 66 69 78 20 77 65 72 65 20  nd nSuffix were 
bba0: 72 65 61 64 20 62 79 20 66 74 73 33 47 65 74 56  read by fts3GetV
bbb0: 61 72 69 6e 74 33 32 28 29 20 61 6e 64 20 73 6f  arint32() and so
bbc0: 20 61 72 65 0a 20 20 2a 2a 20 62 65 74 77 65 65   are.  ** betwee
bbd0: 6e 20 30 20 61 6e 64 20 30 78 37 46 46 46 46 46  n 0 and 0x7FFFFF
bbe0: 46 46 2e 20 42 75 74 20 74 68 65 20 73 75 6d 20  FF. But the sum 
bbf0: 6f 66 20 74 68 65 20 74 77 6f 20 6d 61 79 20 63  of the two may c
bc00: 61 75 73 65 20 69 6e 74 65 67 65 72 0a 20 20 2a  ause integer.  *
bc10: 2a 20 6f 76 65 72 66 6c 6f 77 20 2d 20 68 65 6e  * overflow - hen
bc20: 63 65 20 74 68 65 20 28 69 36 34 29 20 63 61 73  ce the (i64) cas
bc30: 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 69  ts.  */.  if( (i
bc40: 36 34 29 6e 50 72 65 66 69 78 2b 6e 53 75 66 66  64)nPrefix+nSuff
bc50: 69 78 3e 28 69 36 34 29 70 52 65 61 64 65 72 2d  ix>(i64)pReader-
bc60: 3e 6e 54 65 72 6d 41 6c 6c 6f 63 20 29 7b 0a 20  >nTermAlloc ){. 
bc70: 20 20 20 69 36 34 20 6e 4e 65 77 20 3d 20 28 28     i64 nNew = ((
bc80: 69 36 34 29 6e 50 72 65 66 69 78 2b 6e 53 75 66  i64)nPrefix+nSuf
bc90: 66 69 78 29 2a 32 3b 0a 20 20 20 20 63 68 61 72  fix)*2;.    char
bca0: 20 2a 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *zNew = sqlite3
bcb0: 5f 72 65 61 6c 6c 6f 63 36 34 28 70 52 65 61 64  _realloc64(pRead
bcc0: 65 72 2d 3e 7a 54 65 72 6d 2c 20 6e 4e 65 77 29  er->zTerm, nNew)
bcd0: 3b 0a 20 20 20 20 69 66 28 20 21 7a 4e 65 77 20  ;.    if( !zNew 
bce0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
bcf0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
bd00: 20 20 7d 0a 20 20 20 20 70 52 65 61 64 65 72 2d    }.    pReader-
bd10: 3e 7a 54 65 72 6d 20 3d 20 7a 4e 65 77 3b 0a 20  >zTerm = zNew;. 
bd20: 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 54 65 72     pReader->nTer
bd30: 6d 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20  mAlloc = nNew;. 
bd40: 20 7d 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53   }..  rc = fts3S
bd50: 65 67 52 65 61 64 65 72 52 65 71 75 69 72 65 28  egReaderRequire(
bd60: 70 52 65 61 64 65 72 2c 20 70 4e 65 78 74 2c 20  pReader, pNext, 
bd70: 6e 53 75 66 66 69 78 2b 46 54 53 33 5f 56 41 52  nSuffix+FTS3_VAR
bd80: 49 4e 54 5f 4d 41 58 29 3b 0a 20 20 69 66 28 20  INT_MAX);.  if( 
bd90: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
bda0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 6d 65  return rc;..  me
bdb0: 6d 63 70 79 28 26 70 52 65 61 64 65 72 2d 3e 7a  mcpy(&pReader->z
bdc0: 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 2c 20 70  Term[nPrefix], p
bdd0: 4e 65 78 74 2c 20 6e 53 75 66 66 69 78 29 3b 0a  Next, nSuffix);.
bde0: 20 20 70 52 65 61 64 65 72 2d 3e 6e 54 65 72 6d    pReader->nTerm
bdf0: 20 3d 20 6e 50 72 65 66 69 78 2b 6e 53 75 66 66   = nPrefix+nSuff
be00: 69 78 3b 0a 20 20 70 4e 65 78 74 20 2b 3d 20 6e  ix;.  pNext += n
be10: 53 75 66 66 69 78 3b 0a 20 20 70 4e 65 78 74 20  Suffix;.  pNext 
be20: 2b 3d 20 66 74 73 33 47 65 74 56 61 72 69 6e 74  += fts3GetVarint
be30: 33 32 28 70 4e 65 78 74 2c 20 26 70 52 65 61 64  32(pNext, &pRead
be40: 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 29 3b 0a 20  er->nDoclist);. 
be50: 20 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69   pReader->aDocli
be60: 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 70 52  st = pNext;.  pR
be70: 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69  eader->pOffsetLi
be80: 73 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 68  st = 0;..  /* Ch
be90: 65 63 6b 20 74 68 61 74 20 74 68 65 20 64 6f 63  eck that the doc
bea0: 6c 69 73 74 20 64 6f 65 73 20 6e 6f 74 20 61 70  list does not ap
beb0: 70 65 61 72 20 74 6f 20 65 78 74 65 6e 64 20 70  pear to extend p
bec0: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
bed0: 68 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 6e  he.  ** b-tree n
bee0: 6f 64 65 2e 20 41 6e 64 20 74 68 61 74 20 74 68  ode. And that th
bef0: 65 20 66 69 6e 61 6c 20 62 79 74 65 20 6f 66 20  e final byte of 
bf00: 74 68 65 20 64 6f 63 6c 69 73 74 20 69 73 20 30  the doclist is 0
bf10: 78 30 30 2e 20 49 66 20 65 69 74 68 65 72 20 0a  x00. If either .
bf20: 20 20 2a 2a 20 6f 66 20 74 68 65 73 65 20 73 74    ** of these st
bf30: 61 74 65 6d 65 6e 74 73 20 69 73 20 75 6e 74 72  atements is untr
bf40: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ue, then the dat
bf50: 61 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  a structure is c
bf60: 6f 72 72 75 70 74 2e 0a 20 20 2a 2f 0a 20 20 69  orrupt..  */.  i
bf70: 66 28 20 28 26 70 52 65 61 64 65 72 2d 3e 61 4e  f( (&pReader->aN
bf80: 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e 4e 6f  ode[pReader->nNo
bf90: 64 65 5d 20 2d 20 70 52 65 61 64 65 72 2d 3e 61  de] - pReader->a
bfa0: 44 6f 63 6c 69 73 74 29 3c 70 52 65 61 64 65 72  Doclist)<pReader
bfb0: 2d 3e 6e 44 6f 63 6c 69 73 74 0a 20 20 20 7c 7c  ->nDoclist.   ||
bfc0: 20 28 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75   (pReader->nPopu
bfd0: 6c 61 74 65 3d 3d 30 20 26 26 20 70 52 65 61 64  late==0 && pRead
bfe0: 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b 70 52 65  er->aDoclist[pRe
bff0: 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 2d 31  ader->nDoclist-1
c000: 5d 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  ]).  ){.    retu
c010: 72 6e 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56  rn FTS_CORRUPT_V
c020: 54 41 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  TAB;.  }.  retur
c030: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
c040: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 53 65  /*.** Set the Se
c050: 67 52 65 61 64 65 72 20 74 6f 20 70 6f 69 6e 74  gReader to point
c060: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 64 6f   to the first do
c070: 63 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69  cid in the docli
c080: 73 74 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  st associated.**
c090: 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e   with the curren
c0a0: 74 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69  t term..*/.stati
c0b0: 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61  c int fts3SegRea
c0c0: 64 65 72 46 69 72 73 74 44 6f 63 69 64 28 46 74  derFirstDocid(Ft
c0d0: 73 33 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 46  s3Table *pTab, F
c0e0: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 52  ts3SegReader *pR
c0f0: 65 61 64 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  eader){.  int rc
c100: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
c110: 61 73 73 65 72 74 28 20 70 52 65 61 64 65 72 2d  assert( pReader-
c120: 3e 61 44 6f 63 6c 69 73 74 20 29 3b 0a 20 20 61  >aDoclist );.  a
c130: 73 73 65 72 74 28 20 21 70 52 65 61 64 65 72 2d  ssert( !pReader-
c140: 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 29 3b 0a  >pOffsetList );.
c150: 20 20 69 66 28 20 70 54 61 62 2d 3e 62 44 65 73    if( pTab->bDes
c160: 63 49 64 78 20 26 26 20 66 74 73 33 53 65 67 52  cIdx && fts3SegR
c170: 65 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28 70  eaderIsPending(p
c180: 52 65 61 64 65 72 29 20 29 7b 0a 20 20 20 20 75  Reader) ){.    u
c190: 38 20 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20 20  8 bEof = 0;.    
c1a0: 70 52 65 61 64 65 72 2d 3e 69 44 6f 63 69 64 20  pReader->iDocid 
c1b0: 3d 20 30 3b 0a 20 20 20 20 70 52 65 61 64 65 72  = 0;.    pReader
c1c0: 2d 3e 6e 4f 66 66 73 65 74 4c 69 73 74 20 3d 20  ->nOffsetList = 
c1d0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  0;.    sqlite3Ft
c1e0: 73 33 44 6f 63 6c 69 73 74 50 72 65 76 28 30 2c  s3DoclistPrev(0,
c1f0: 0a 20 20 20 20 20 20 20 20 70 52 65 61 64 65 72  .        pReader
c200: 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 70 52 65 61  ->aDoclist, pRea
c210: 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 2c 20 26  der->nDoclist, &
c220: 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74  pReader->pOffset
c230: 4c 69 73 74 2c 20 0a 20 20 20 20 20 20 20 20 26  List, .        &
c240: 70 52 65 61 64 65 72 2d 3e 69 44 6f 63 69 64 2c  pReader->iDocid,
c250: 20 26 70 52 65 61 64 65 72 2d 3e 6e 4f 66 66 73   &pReader->nOffs
c260: 65 74 4c 69 73 74 2c 20 26 62 45 6f 66 0a 20 20  etList, &bEof.  
c270: 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    );.  }else{.  
c280: 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65    rc = fts3SegRe
c290: 61 64 65 72 52 65 71 75 69 72 65 28 70 52 65 61  aderRequire(pRea
c2a0: 64 65 72 2c 20 70 52 65 61 64 65 72 2d 3e 61 44  der, pReader->aD
c2b0: 6f 63 6c 69 73 74 2c 20 46 54 53 33 5f 56 41 52  oclist, FTS3_VAR
c2c0: 49 4e 54 5f 4d 41 58 29 3b 0a 20 20 20 20 69 66  INT_MAX);.    if
c2d0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
c2e0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
c2f0: 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56   sqlite3Fts3GetV
c300: 61 72 69 6e 74 28 70 52 65 61 64 65 72 2d 3e 61  arint(pReader->a
c310: 44 6f 63 6c 69 73 74 2c 20 26 70 52 65 61 64 65  Doclist, &pReade
c320: 72 2d 3e 69 44 6f 63 69 64 29 3b 0a 20 20 20 20  r->iDocid);.    
c330: 20 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73    pReader->pOffs
c340: 65 74 4c 69 73 74 20 3d 20 26 70 52 65 61 64 65  etList = &pReade
c350: 72 2d 3e 61 44 6f 63 6c 69 73 74 5b 6e 5d 3b 0a  r->aDoclist[n];.
c360: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
c370: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
c380: 41 64 76 61 6e 63 65 20 74 68 65 20 53 65 67 52  Advance the SegR
c390: 65 61 64 65 72 20 74 6f 20 70 6f 69 6e 74 20 74  eader to point t
c3a0: 6f 20 74 68 65 20 6e 65 78 74 20 64 6f 63 69 64  o the next docid
c3b0: 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 0a   in the doclist.
c3c0: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ** associated wi
c3d0: 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  th the current t
c3e0: 65 72 6d 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 61  erm..** .** If a
c3f0: 72 67 75 6d 65 6e 74 73 20 70 70 4f 66 66 73 65  rguments ppOffse
c400: 74 4c 69 73 74 20 61 6e 64 20 70 6e 4f 66 66 73  tList and pnOffs
c410: 65 74 4c 69 73 74 20 61 72 65 20 6e 6f 74 20 4e  etList are not N
c420: 55 4c 4c 2c 20 74 68 65 6e 20 0a 2a 2a 20 2a 70  ULL, then .** *p
c430: 70 4f 66 66 73 65 74 4c 69 73 74 20 69 73 20 73  pOffsetList is s
c440: 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
c450: 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 2d  he first column-
c460: 6f 66 66 73 65 74 20 6c 69 73 74 0a 2a 2a 20 69  offset list.** i
c470: 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20 65 6e  n the doclist en
c480: 74 72 79 20 28 69 2e 65 2e 20 69 6d 6d 65 64 69  try (i.e. immedi
c490: 61 74 65 6c 79 20 70 61 73 74 20 74 68 65 20 64  ately past the d
c4a0: 6f 63 69 64 20 76 61 72 69 6e 74 29 2e 0a 2a 2a  ocid varint)..**
c4b0: 20 2a 70 6e 4f 66 66 73 65 74 4c 69 73 74 20 69   *pnOffsetList i
c4c0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c 65 6e  s set to the len
c4d0: 67 74 68 20 6f 66 20 74 68 65 20 73 65 74 20 6f  gth of the set o
c4e0: 66 20 63 6f 6c 75 6d 6e 2d 6f 66 66 73 65 74 0a  f column-offset.
c4f0: 2a 2a 20 6c 69 73 74 73 2c 20 6e 6f 74 20 69 6e  ** lists, not in
c500: 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 75 6c 2d  cluding the nul-
c510: 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 2e  terminator byte.
c520: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2f   For example:.*/
c530: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
c540: 53 65 67 52 65 61 64 65 72 4e 65 78 74 44 6f 63  SegReaderNextDoc
c550: 69 64 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  id(.  Fts3Table 
c560: 2a 70 54 61 62 2c 0a 20 20 46 74 73 33 53 65 67  *pTab,.  Fts3Seg
c570: 52 65 61 64 65 72 20 2a 70 52 65 61 64 65 72 2c  Reader *pReader,
c580: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
c590: 65 72 20 74 6f 20 61 64 76 61 6e 63 65 20 74 6f  er to advance to
c5a0: 20 6e 65 78 74 20 64 6f 63 69 64 20 2a 2f 0a 20   next docid */. 
c5b0: 20 63 68 61 72 20 2a 2a 70 70 4f 66 66 73 65 74   char **ppOffset
c5c0: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
c5d0: 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72   /* OUT: Pointer
c5e0: 20 74 6f 20 63 75 72 72 65 6e 74 20 70 6f 73 69   to current posi
c5f0: 74 69 6f 6e 2d 6c 69 73 74 20 2a 2f 0a 20 20 69  tion-list */.  i
c600: 6e 74 20 2a 70 6e 4f 66 66 73 65 74 4c 69 73 74  nt *pnOffsetList
c610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c620: 2a 20 4f 55 54 3a 20 4c 65 6e 67 74 68 20 6f 66  * OUT: Length of
c630: 20 2a 70 70 4f 66 66 73 65 74 4c 69 73 74 20 69   *ppOffsetList i
c640: 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20  n bytes */.){.  
c650: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
c660: 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 70 20 3d 20  OK;.  char *p = 
c670: 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74  pReader->pOffset
c680: 4c 69 73 74 3b 0a 20 20 63 68 61 72 20 63 20 3d  List;.  char c =
c690: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
c6a0: 20 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 2d   );..  if( pTab-
c6b0: 3e 62 44 65 73 63 49 64 78 20 26 26 20 66 74 73  >bDescIdx && fts
c6c0: 33 53 65 67 52 65 61 64 65 72 49 73 50 65 6e 64  3SegReaderIsPend
c6d0: 69 6e 67 28 70 52 65 61 64 65 72 29 20 29 7b 0a  ing(pReader) ){.
c6e0: 20 20 20 20 2f 2a 20 41 20 70 65 6e 64 69 6e 67      /* A pending
c6f0: 2d 74 65 72 6d 73 20 73 65 67 2d 72 65 61 64 65  -terms seg-reade
c700: 72 20 66 6f 72 20 61 6e 20 46 54 53 34 20 74 61  r for an FTS4 ta
c710: 62 6c 65 20 74 68 61 74 20 75 73 65 73 20 6f 72  ble that uses or
c720: 64 65 72 3d 64 65 73 63 2e 0a 20 20 20 20 2a 2a  der=desc..    **
c730: 20 50 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 64   Pending-terms d
c740: 6f 63 6c 69 73 74 73 20 61 72 65 20 61 6c 77 61  oclists are alwa
c750: 79 73 20 62 75 69 6c 74 20 75 70 20 69 6e 20 61  ys built up in a
c760: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2c 20  scending order, 
c770: 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20 68 61 76  so.    ** we hav
c780: 65 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  e to iterate thr
c790: 6f 75 67 68 20 74 68 65 6d 20 62 61 63 6b 77 61  ough them backwa
c7a0: 72 64 73 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20  rds here. */.   
c7b0: 20 75 38 20 62 45 6f 66 20 3d 20 30 3b 0a 20 20   u8 bEof = 0;.  
c7c0: 20 20 69 66 28 20 70 70 4f 66 66 73 65 74 4c 69    if( ppOffsetLi
c7d0: 73 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 4f  st ){.      *ppO
c7e0: 66 66 73 65 74 4c 69 73 74 20 3d 20 70 52 65 61  ffsetList = pRea
c7f0: 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74  der->pOffsetList
c800: 3b 0a 20 20 20 20 20 20 2a 70 6e 4f 66 66 73 65  ;.      *pnOffse
c810: 74 4c 69 73 74 20 3d 20 70 52 65 61 64 65 72 2d  tList = pReader-
c820: 3e 6e 4f 66 66 73 65 74 4c 69 73 74 20 2d 20 31  >nOffsetList - 1
c830: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
c840: 74 65 33 46 74 73 33 44 6f 63 6c 69 73 74 50 72  te3Fts3DoclistPr
c850: 65 76 28 30 2c 0a 20 20 20 20 20 20 20 20 70 52  ev(0,.        pR
c860: 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 2c  eader->aDoclist,
c870: 20 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69   pReader->nDocli
c880: 73 74 2c 20 26 70 2c 20 26 70 52 65 61 64 65 72  st, &p, &pReader
c890: 2d 3e 69 44 6f 63 69 64 2c 0a 20 20 20 20 20 20  ->iDocid,.      
c8a0: 20 20 26 70 52 65 61 64 65 72 2d 3e 6e 4f 66 66    &pReader->nOff
c8b0: 73 65 74 4c 69 73 74 2c 20 26 62 45 6f 66 0a 20  setList, &bEof. 
c8c0: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 62 45     );.    if( bE
c8d0: 6f 66 20 29 7b 0a 20 20 20 20 20 20 70 52 65 61  of ){.      pRea
c8e0: 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74  der->pOffsetList
c8f0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
c900: 0a 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e  .      pReader->
c910: 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 70 3b  pOffsetList = p;
c920: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
c930: 20 20 20 20 63 68 61 72 20 2a 70 45 6e 64 20 3d      char *pEnd =
c940: 20 26 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c   &pReader->aDocl
c950: 69 73 74 5b 70 52 65 61 64 65 72 2d 3e 6e 44 6f  ist[pReader->nDo
c960: 63 6c 69 73 74 5d 3b 0a 0a 20 20 20 20 2f 2a 20  clist];..    /* 
c970: 50 6f 69 6e 74 65 72 20 70 20 63 75 72 72 65 6e  Pointer p curren
c980: 74 6c 79 20 70 6f 69 6e 74 73 20 61 74 20 74 68  tly points at th
c990: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
c9a0: 61 6e 20 6f 66 66 73 65 74 20 6c 69 73 74 2e 20  an offset list. 
c9b0: 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  The.    ** follo
c9c0: 77 69 6e 67 20 62 6c 6f 63 6b 20 61 64 76 61 6e  wing block advan
c9d0: 63 65 73 20 69 74 20 74 6f 20 70 6f 69 6e 74 20  ces it to point 
c9e0: 6f 6e 65 20 62 79 74 65 20 70 61 73 74 20 74 68  one byte past th
c9f0: 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a 2a 20  e end of.    ** 
ca00: 74 68 65 20 73 61 6d 65 20 6f 66 66 73 65 74 20  the same offset 
ca10: 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 77 68 69  list. */.    whi
ca20: 6c 65 28 20 31 20 29 7b 0a 20 20 0a 20 20 20 20  le( 1 ){.  .    
ca30: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
ca40: 6e 67 20 6c 69 6e 65 20 6f 66 20 63 6f 64 65 20  ng line of code 
ca50: 28 61 6e 64 20 74 68 65 20 22 70 2b 2b 22 20 62  (and the "p++" b
ca60: 65 6c 6f 77 20 74 68 65 20 77 68 69 6c 65 28 29  elow the while()
ca70: 20 6c 6f 6f 70 29 20 69 73 0a 20 20 20 20 20 20   loop) is.      
ca80: 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 6c 6c 20  ** normally all 
ca90: 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
caa0: 20 74 6f 20 6d 6f 76 65 20 70 6f 69 6e 74 65 72   to move pointer
cab0: 20 70 20 74 6f 20 74 68 65 20 64 65 73 69 72 65   p to the desire
cac0: 64 20 0a 20 20 20 20 20 20 2a 2a 20 70 6f 73 69  d .      ** posi
cad0: 74 69 6f 6e 2e 20 54 68 65 20 65 78 63 65 70 74  tion. The except
cae0: 69 6f 6e 20 69 73 20 69 66 20 74 68 69 73 20 6e  ion is if this n
caf0: 6f 64 65 20 69 73 20 62 65 69 6e 67 20 6c 6f 61  ode is being loa
cb00: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 0a 20 20  ded from disk.  
cb10: 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74      ** increment
cb20: 61 6c 6c 79 20 61 6e 64 20 70 6f 69 6e 74 65 72  ally and pointer
cb30: 20 22 70 22 20 6e 6f 77 20 70 6f 69 6e 74 73 20   "p" now points 
cb40: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
cb50: 65 20 70 61 73 74 0a 20 20 20 20 20 20 2a 2a 20  e past.      ** 
cb60: 74 68 65 20 70 6f 70 75 6c 61 74 65 64 20 70 61  the populated pa
cb70: 72 74 20 6f 66 20 70 52 65 61 64 65 72 2d 3e 61  rt of pReader->a
cb80: 4e 6f 64 65 5b 5d 2e 0a 20 20 20 20 20 20 2a 2f  Node[]..      */
cb90: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 70  .      while( *p
cba0: 20 7c 20 63 20 29 20 63 20 3d 20 2a 70 2b 2b 20   | c ) c = *p++ 
cbb0: 26 20 30 78 38 30 3b 0a 20 20 20 20 20 20 61 73  & 0x80;.      as
cbc0: 73 65 72 74 28 20 2a 70 3d 3d 30 20 29 3b 0a 20  sert( *p==0 );. 
cbd0: 20 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 61   .      if( pRea
cbe0: 64 65 72 2d 3e 70 42 6c 6f 62 3d 3d 30 20 7c 7c  der->pBlob==0 ||
cbf0: 20 70 3c 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f   p<&pReader->aNo
cc00: 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70  de[pReader->nPop
cc10: 75 6c 61 74 65 5d 20 29 20 62 72 65 61 6b 3b 0a  ulate] ) break;.
cc20: 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 53        rc = fts3S
cc30: 65 67 52 65 61 64 65 72 49 6e 63 72 52 65 61 64  egReaderIncrRead
cc40: 28 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20  (pReader);.     
cc50: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
cc60: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
cc70: 20 20 20 20 7d 0a 20 20 20 20 70 2b 2b 3b 0a 20      }.    p++;. 
cc80: 20 0a 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75   .    /* If requ
cc90: 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74  ired, populate t
cca0: 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  he output variab
ccb0: 6c 65 73 20 77 69 74 68 20 61 20 70 6f 69 6e 74  les with a point
ccc0: 65 72 20 74 6f 20 61 6e 64 20 74 68 65 0a 20 20  er to and the.  
ccd0: 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65    ** size of the
cce0: 20 70 72 65 76 69 6f 75 73 20 6f 66 66 73 65 74   previous offset
ccf0: 2d 6c 69 73 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  -list..    */.  
cd00: 20 20 69 66 28 20 70 70 4f 66 66 73 65 74 4c 69    if( ppOffsetLi
cd10: 73 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 4f  st ){.      *ppO
cd20: 66 66 73 65 74 4c 69 73 74 20 3d 20 70 52 65 61  ffsetList = pRea
cd30: 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74  der->pOffsetList
cd40: 3b 0a 20 20 20 20 20 20 2a 70 6e 4f 66 66 73 65  ;.      *pnOffse
cd50: 74 4c 69 73 74 20 3d 20 28 69 6e 74 29 28 70 20  tList = (int)(p 
cd60: 2d 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73  - pReader->pOffs
cd70: 65 74 4c 69 73 74 20 2d 20 31 29 3b 0a 20 20 20  etList - 1);.   
cd80: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 73 74 20   }..    /* List 
cd90: 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 65 64  may have been ed
cda0: 69 74 65 64 20 69 6e 20 70 6c 61 63 65 20 62 79  ited in place by
cdb0: 20 66 74 73 33 45 76 61 6c 4e 65 61 72 54 72 69   fts3EvalNearTri
cdc0: 6d 28 29 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65  m() */.    while
cdd0: 28 20 70 3c 70 45 6e 64 20 26 26 20 2a 70 3d 3d  ( p<pEnd && *p==
cde0: 30 20 29 20 70 2b 2b 3b 0a 20 20 0a 20 20 20 20  0 ) p++;.  .    
cdf0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
ce00: 6e 6f 20 6d 6f 72 65 20 65 6e 74 72 69 65 73 20  no more entries 
ce10: 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 2c 20  in the doclist, 
ce20: 73 65 74 20 70 4f 66 66 73 65 74 4c 69 73 74 20  set pOffsetList 
ce30: 74 6f 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2e 20  to.    ** NULL. 
ce40: 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 46  Otherwise, set F
ce50: 74 73 33 53 65 67 52 65 61 64 65 72 2e 69 44 6f  ts3SegReader.iDo
ce60: 63 69 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  cid to the next 
ce70: 64 6f 63 69 64 20 61 6e 64 0a 20 20 20 20 2a 2a  docid and.    **
ce80: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 2e 70   Fts3SegReader.p
ce90: 4f 66 66 73 65 74 4c 69 73 74 20 74 6f 20 70 6f  OffsetList to po
cea0: 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20  int to the next 
ceb0: 6f 66 66 73 65 74 20 6c 69 73 74 20 62 65 66 6f  offset list befo
cec0: 72 65 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  re.    ** return
ced0: 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
cee0: 69 66 28 20 70 3e 3d 70 45 6e 64 20 29 7b 0a 20  if( p>=pEnd ){. 
cef0: 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 4f       pReader->pO
cf00: 66 66 73 65 74 4c 69 73 74 20 3d 20 30 3b 0a 20  ffsetList = 0;. 
cf10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cf20: 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64  rc = fts3SegRead
cf30: 65 72 52 65 71 75 69 72 65 28 70 52 65 61 64 65  erRequire(pReade
cf40: 72 2c 20 70 2c 20 46 54 53 33 5f 56 41 52 49 4e  r, p, FTS3_VARIN
cf50: 54 5f 4d 41 58 29 3b 0a 20 20 20 20 20 20 69 66  T_MAX);.      if
cf60: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
cf70: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
cf80: 65 33 5f 69 6e 74 36 34 20 69 44 65 6c 74 61 3b  e3_int64 iDelta;
cf90: 0a 20 20 20 20 20 20 20 20 70 52 65 61 64 65 72  .        pReader
cfa0: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20  ->pOffsetList = 
cfb0: 70 20 2b 20 73 71 6c 69 74 65 33 46 74 73 33 47  p + sqlite3Fts3G
cfc0: 65 74 56 61 72 69 6e 74 28 70 2c 20 26 69 44 65  etVarint(p, &iDe
cfd0: 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66  lta);.        if
cfe0: 28 20 70 54 61 62 2d 3e 62 44 65 73 63 49 64 78  ( pTab->bDescIdx
cff0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52   ){.          pR
d000: 65 61 64 65 72 2d 3e 69 44 6f 63 69 64 20 2d 3d  eader->iDocid -=
d010: 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20   iDelta;.       
d020: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d030: 20 20 70 52 65 61 64 65 72 2d 3e 69 44 6f 63 69    pReader->iDoci
d040: 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20  d += iDelta;.   
d050: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
d060: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
d070: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
d080: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
d090: 33 4d 73 72 4f 76 66 6c 28 0a 20 20 46 74 73 33  3MsrOvfl(.  Fts3
d0a0: 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 0a 20  Cursor *pCsr, . 
d0b0: 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61   Fts3MultiSegRea
d0c0: 64 65 72 20 2a 70 4d 73 72 2c 0a 20 20 69 6e 74  der *pMsr,.  int
d0d0: 20 2a 70 6e 4f 76 66 6c 0a 29 7b 0a 20 20 46 74   *pnOvfl.){.  Ft
d0e0: 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74  s3Table *p = (Ft
d0f0: 73 33 54 61 62 6c 65 2a 29 70 43 73 72 2d 3e 62  s3Table*)pCsr->b
d100: 61 73 65 2e 70 56 74 61 62 3b 0a 20 20 69 6e 74  ase.pVtab;.  int
d110: 20 6e 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e   nOvfl = 0;.  in
d120: 74 20 69 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d  t ii;.  int rc =
d130: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
d140: 74 20 70 67 73 7a 20 3d 20 70 2d 3e 6e 50 67 73  t pgsz = p->nPgs
d150: 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  z;..  assert( p-
d160: 3e 62 46 74 73 34 20 29 3b 0a 20 20 61 73 73 65  >bFts4 );.  asse
d170: 72 74 28 20 70 67 73 7a 3e 30 20 29 3b 0a 0a 20  rt( pgsz>0 );.. 
d180: 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53   for(ii=0; rc==S
d190: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70  QLITE_OK && ii<p
d1a0: 4d 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 20 69  Msr->nSegment; i
d1b0: 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 33 53 65  i++){.    Fts3Se
d1c0: 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 65 72  gReader *pReader
d1d0: 20 3d 20 70 4d 73 72 2d 3e 61 70 53 65 67 6d 65   = pMsr->apSegme
d1e0: 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20  nt[ii];.    if( 
d1f0: 21 66 74 73 33 53 65 67 52 65 61 64 65 72 49 73  !fts3SegReaderIs
d200: 50 65 6e 64 69 6e 67 28 70 52 65 61 64 65 72 29  Pending(pReader)
d210: 20 0a 20 20 20 20 20 26 26 20 21 66 74 73 33 53   .     && !fts3S
d220: 65 67 52 65 61 64 65 72 49 73 52 6f 6f 74 4f 6e  egReaderIsRootOn
d230: 6c 79 28 70 52 65 61 64 65 72 29 20 0a 20 20 20  ly(pReader) .   
d240: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d250: 33 5f 69 6e 74 36 34 20 6a 6a 3b 0a 20 20 20 20  3_int64 jj;.    
d260: 20 20 66 6f 72 28 6a 6a 3d 70 52 65 61 64 65 72    for(jj=pReader
d270: 2d 3e 69 53 74 61 72 74 42 6c 6f 63 6b 3b 20 6a  ->iStartBlock; j
d280: 6a 3c 3d 70 52 65 61 64 65 72 2d 3e 69 4c 65 61  j<=pReader->iLea
d290: 66 45 6e 64 42 6c 6f 63 6b 3b 20 6a 6a 2b 2b 29  fEndBlock; jj++)
d2a0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42  {.        int nB
d2b0: 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 72 63 20  lob;.        rc 
d2c0: 3d 20 73 71 6c 69 74 65 33 46 74 73 33 52 65 61  = sqlite3Fts3Rea
d2d0: 64 42 6c 6f 63 6b 28 70 2c 20 6a 6a 2c 20 30 2c  dBlock(p, jj, 0,
d2e0: 20 26 6e 42 6c 6f 62 2c 20 30 29 3b 0a 20 20 20   &nBlob, 0);.   
d2f0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
d300: 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a  ITE_OK ) break;.
d310: 20 20 20 20 20 20 20 20 69 66 28 20 28 6e 42 6c          if( (nBl
d320: 6f 62 2b 33 35 29 3e 70 67 73 7a 20 29 7b 0a 20  ob+35)>pgsz ){. 
d330: 20 20 20 20 20 20 20 20 20 6e 4f 76 66 6c 20 2b           nOvfl +
d340: 3d 20 28 6e 42 6c 6f 62 20 2b 20 33 34 29 2f 70  = (nBlob + 34)/p
d350: 67 73 7a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  gsz;.        }. 
d360: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
d370: 0a 20 20 2a 70 6e 4f 76 66 6c 20 3d 20 6e 4f 76  .  *pnOvfl = nOv
d380: 66 6c 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  fl;.  return rc;
d390: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
d3a0: 6c 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61  ll allocations a
d3b0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
d3c0: 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
d3d0: 65 64 20 61 73 20 74 68 65 20 0a 2a 2a 20 73 65  ed as the .** se
d3e0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
d3f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
d400: 73 33 53 65 67 52 65 61 64 65 72 46 72 65 65 28  s3SegReaderFree(
d410: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
d420: 52 65 61 64 65 72 29 7b 0a 20 20 69 66 28 20 70  Reader){.  if( p
d430: 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 69 66  Reader ){.    if
d440: 28 20 21 66 74 73 33 53 65 67 52 65 61 64 65 72  ( !fts3SegReader
d450: 49 73 50 65 6e 64 69 6e 67 28 70 52 65 61 64 65  IsPending(pReade
d460: 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  r) ){.      sqli
d470: 74 65 33 5f 66 72 65 65 28 70 52 65 61 64 65 72  te3_free(pReader
d480: 2d 3e 7a 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a  ->zTerm);.    }.
d490: 20 20 20 20 69 66 28 20 21 66 74 73 33 53 65 67      if( !fts3Seg
d4a0: 52 65 61 64 65 72 49 73 52 6f 6f 74 4f 6e 6c 79  ReaderIsRootOnly
d4b0: 28 70 52 65 61 64 65 72 29 20 29 7b 0a 20 20 20  (pReader) ){.   
d4c0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
d4d0: 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 29 3b  pReader->aNode);
d4e0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
d4f0: 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 52  e3_blob_close(pR
d500: 65 61 64 65 72 2d 3e 70 42 6c 6f 62 29 3b 0a 20  eader->pBlob);. 
d510: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
d520: 65 28 70 52 65 61 64 65 72 29 3b 0a 7d 0a 0a 2f  e(pReader);.}../
d530: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
d540: 6e 65 77 20 53 65 67 52 65 61 64 65 72 20 6f 62  new SegReader ob
d550: 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ject..*/.int sql
d560: 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
d570: 72 4e 65 77 28 0a 20 20 69 6e 74 20 69 41 67 65  rNew(.  int iAge
d580: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d590: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65          /* Segme
d5a0: 6e 74 20 22 61 67 65 22 2e 20 2a 2f 0a 20 20 69  nt "age". */.  i
d5b0: 6e 74 20 62 4c 6f 6f 6b 75 70 2c 20 20 20 20 20  nt bLookup,     
d5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d5d0: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 6c 6f 6f  * True for a loo
d5e0: 6b 75 70 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 71  kup only */.  sq
d5f0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 53 74 61  lite3_int64 iSta
d600: 72 74 4c 65 61 66 2c 20 20 20 20 20 20 20 2f 2a  rtLeaf,       /*
d610: 20 46 69 72 73 74 20 6c 65 61 66 20 74 6f 20 74   First leaf to t
d620: 72 61 76 65 72 73 65 20 2a 2f 0a 20 20 73 71 6c  raverse */.  sql
d630: 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 4c  ite3_int64 iEndL
d640: 65 61 66 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  eaf,         /* 
d650: 46 69 6e 61 6c 20 6c 65 61 66 20 74 6f 20 74 72  Final leaf to tr
d660: 61 76 65 72 73 65 20 2a 2f 0a 20 20 73 71 6c 69  averse */.  sqli
d670: 74 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 42 6c  te3_int64 iEndBl
d680: 6f 63 6b 2c 20 20 20 20 20 20 20 20 2f 2a 20 46  ock,        /* F
d690: 69 6e 61 6c 20 62 6c 6f 63 6b 20 6f 66 20 73 65  inal block of se
d6a0: 67 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  gment */.  const
d6b0: 20 63 68 61 72 20 2a 7a 52 6f 6f 74 2c 20 20 20   char *zRoot,   
d6c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
d6d0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
d6e0: 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 69  root node */.  i
d6f0: 6e 74 20 6e 52 6f 6f 74 2c 20 20 20 20 20 20 20  nt nRoot,       
d700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d710: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
d720: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 72 6f 6f 74   containing root
d730: 20 6e 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 53   node */.  Fts3S
d740: 65 67 52 65 61 64 65 72 20 2a 2a 70 70 52 65 61  egReader **ppRea
d750: 64 65 72 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  der        /* OU
d760: 54 3a 20 41 6c 6c 6f 63 61 74 65 64 20 46 74 73  T: Allocated Fts
d770: 33 53 65 67 52 65 61 64 65 72 20 2a 2f 0a 29 7b  3SegReader */.){
d780: 0a 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72  .  Fts3SegReader
d790: 20 2a 70 52 65 61 64 65 72 3b 20 20 20 20 20 20   *pReader;      
d7a0: 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f     /* Newly allo
d7b0: 63 61 74 65 64 20 53 65 67 52 65 61 64 65 72 20  cated SegReader 
d7c0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
d7d0: 6e 45 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20  nExtra = 0;     
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
d7f0: 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
d800: 20 73 65 67 6d 65 6e 74 20 72 6f 6f 74 20 6e 6f   segment root no
d810: 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  de */..  assert(
d820: 20 69 53 74 61 72 74 4c 65 61 66 3c 3d 69 45 6e   iStartLeaf<=iEn
d830: 64 4c 65 61 66 20 29 3b 0a 20 20 69 66 28 20 69  dLeaf );.  if( i
d840: 53 74 61 72 74 4c 65 61 66 3d 3d 30 20 29 7b 0a  StartLeaf==0 ){.
d850: 20 20 20 20 6e 45 78 74 72 61 20 3d 20 6e 52 6f      nExtra = nRo
d860: 6f 74 20 2b 20 46 54 53 33 5f 4e 4f 44 45 5f 50  ot + FTS3_NODE_P
d870: 41 44 44 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20 70  ADDING;.  }..  p
d880: 52 65 61 64 65 72 20 3d 20 28 46 74 73 33 53 65  Reader = (Fts3Se
d890: 67 52 65 61 64 65 72 20 2a 29 73 71 6c 69 74 65  gReader *)sqlite
d8a0: 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
d8b0: 46 74 73 33 53 65 67 52 65 61 64 65 72 29 20 2b  Fts3SegReader) +
d8c0: 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20   nExtra);.  if( 
d8d0: 21 70 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20  !pReader ){.    
d8e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
d8f0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  MEM;.  }.  memse
d900: 74 28 70 52 65 61 64 65 72 2c 20 30 2c 20 73 69  t(pReader, 0, si
d910: 7a 65 6f 66 28 46 74 73 33 53 65 67 52 65 61 64  zeof(Fts3SegRead
d920: 65 72 29 29 3b 0a 20 20 70 52 65 61 64 65 72 2d  er));.  pReader-
d930: 3e 69 49 64 78 20 3d 20 69 41 67 65 3b 0a 20 20  >iIdx = iAge;.  
d940: 70 52 65 61 64 65 72 2d 3e 62 4c 6f 6f 6b 75 70  pReader->bLookup
d950: 20 3d 20 62 4c 6f 6f 6b 75 70 21 3d 30 3b 0a 20   = bLookup!=0;. 
d960: 20 70 52 65 61 64 65 72 2d 3e 69 53 74 61 72 74   pReader->iStart
d970: 42 6c 6f 63 6b 20 3d 20 69 53 74 61 72 74 4c 65  Block = iStartLe
d980: 61 66 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 69  af;.  pReader->i
d990: 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 20 3d 20 69  LeafEndBlock = i
d9a0: 45 6e 64 4c 65 61 66 3b 0a 20 20 70 52 65 61 64  EndLeaf;.  pRead
d9b0: 65 72 2d 3e 69 45 6e 64 42 6c 6f 63 6b 20 3d 20  er->iEndBlock = 
d9c0: 69 45 6e 64 42 6c 6f 63 6b 3b 0a 0a 20 20 69 66  iEndBlock;..  if
d9d0: 28 20 6e 45 78 74 72 61 20 29 7b 0a 20 20 20 20  ( nExtra ){.    
d9e0: 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 73 65  /* The entire se
d9f0: 67 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20  gment is stored 
da00: 69 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  in the root node
da10: 2e 20 2a 2f 0a 20 20 20 20 70 52 65 61 64 65 72  . */.    pReader
da20: 2d 3e 61 4e 6f 64 65 20 3d 20 28 63 68 61 72 20  ->aNode = (char 
da30: 2a 29 26 70 52 65 61 64 65 72 5b 31 5d 3b 0a 20  *)&pReader[1];. 
da40: 20 20 20 70 52 65 61 64 65 72 2d 3e 72 6f 6f 74     pReader->root
da50: 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 70 52  Only = 1;.    pR
da60: 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 20 3d 20 6e  eader->nNode = n
da70: 52 6f 6f 74 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Root;.    memcpy
da80: 28 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 2c  (pReader->aNode,
da90: 20 7a 52 6f 6f 74 2c 20 6e 52 6f 6f 74 29 3b 0a   zRoot, nRoot);.
daa0: 20 20 20 20 6d 65 6d 73 65 74 28 26 70 52 65 61      memset(&pRea
dab0: 64 65 72 2d 3e 61 4e 6f 64 65 5b 6e 52 6f 6f 74  der->aNode[nRoot
dac0: 5d 2c 20 30 2c 20 46 54 53 33 5f 4e 4f 44 45 5f  ], 0, FTS3_NODE_
dad0: 50 41 44 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73  PADDING);.  }els
dae0: 65 7b 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e  e{.    pReader->
daf0: 69 43 75 72 72 65 6e 74 42 6c 6f 63 6b 20 3d 20  iCurrentBlock = 
db00: 69 53 74 61 72 74 4c 65 61 66 2d 31 3b 0a 20 20  iStartLeaf-1;.  
db10: 7d 0a 20 20 2a 70 70 52 65 61 64 65 72 20 3d 20  }.  *ppReader = 
db20: 70 52 65 61 64 65 72 3b 0a 20 20 72 65 74 75 72  pReader;.  retur
db30: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
db40: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
db50: 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
db60: 69 6f 6e 20 75 73 65 64 20 61 73 20 61 20 71 73  ion used as a qs
db70: 6f 72 74 28 29 20 63 61 6c 6c 62 61 63 6b 20 77  ort() callback w
db80: 68 65 6e 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 61  hen sorting.** a
db90: 6e 20 61 72 72 61 79 20 6f 66 20 70 65 6e 64 69  n array of pendi
dba0: 6e 67 20 74 65 72 6d 73 20 62 79 20 74 65 72 6d  ng terms by term
dbb0: 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 61 73  . This occurs as
dbc0: 20 70 61 72 74 20 6f 66 20 66 6c 75 73 68 69 6e   part of flushin
dbd0: 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  g.** the content
dbe0: 73 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67  s of the pending
dbf0: 2d 74 65 72 6d 73 20 68 61 73 68 20 74 61 62 6c  -terms hash tabl
dc00: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
dc10: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
dc20: 20 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 66 74   SQLITE_CDECL ft
dc30: 73 33 43 6f 6d 70 61 72 65 45 6c 65 6d 42 79 54  s3CompareElemByT
dc40: 65 72 6d 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69  erm(.  const voi
dc50: 64 20 2a 6c 68 73 2c 0a 20 20 63 6f 6e 73 74 20  d *lhs,.  const 
dc60: 76 6f 69 64 20 2a 72 68 73 0a 29 7b 0a 20 20 63  void *rhs.){.  c
dc70: 68 61 72 20 2a 7a 31 20 3d 20 66 74 73 33 48 61  har *z1 = fts3Ha
dc80: 73 68 4b 65 79 28 2a 28 46 74 73 33 48 61 73 68  shKey(*(Fts3Hash
dc90: 45 6c 65 6d 20 2a 2a 29 6c 68 73 29 3b 0a 20 20  Elem **)lhs);.  
dca0: 63 68 61 72 20 2a 7a 32 20 3d 20 66 74 73 33 48  char *z2 = fts3H
dcb0: 61 73 68 4b 65 79 28 2a 28 46 74 73 33 48 61 73  ashKey(*(Fts3Has
dcc0: 68 45 6c 65 6d 20 2a 2a 29 72 68 73 29 3b 0a 20  hElem **)rhs);. 
dcd0: 20 69 6e 74 20 6e 31 20 3d 20 66 74 73 33 48 61   int n1 = fts3Ha
dce0: 73 68 4b 65 79 73 69 7a 65 28 2a 28 46 74 73 33  shKeysize(*(Fts3
dcf0: 48 61 73 68 45 6c 65 6d 20 2a 2a 29 6c 68 73 29  HashElem **)lhs)
dd00: 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20 66 74 73  ;.  int n2 = fts
dd10: 33 48 61 73 68 4b 65 79 73 69 7a 65 28 2a 28 46  3HashKeysize(*(F
dd20: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29 72  ts3HashElem **)r
dd30: 68 73 29 3b 0a 0a 20 20 69 6e 74 20 6e 20 3d 20  hs);..  int n = 
dd40: 28 6e 31 3c 6e 32 20 3f 20 6e 31 20 3a 20 6e 32  (n1<n2 ? n1 : n2
dd50: 29 3b 0a 20 20 69 6e 74 20 63 20 3d 20 6d 65 6d  );.  int c = mem
dd60: 63 6d 70 28 7a 31 2c 20 7a 32 2c 20 6e 29 3b 0a  cmp(z1, z2, n);.
dd70: 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
dd80: 20 20 63 20 3d 20 6e 31 20 2d 20 6e 32 3b 0a 20    c = n1 - n2;. 
dd90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d   }.  return c;.}
dda0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
ddb0: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
ddc0: 20 61 6c 6c 6f 63 61 74 65 20 61 6e 20 46 74 73   allocate an Fts
ddd0: 33 53 65 67 52 65 61 64 65 72 20 74 68 61 74 20  3SegReader that 
dde0: 69 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68  iterates through
ddf0: 0a 2a 2a 20 61 20 73 75 62 73 65 74 20 6f 66 20  .** a subset of 
de00: 74 68 65 20 74 65 72 6d 73 20 73 74 6f 72 65 64  the terms stored
de10: 20 69 6e 20 74 68 65 20 46 74 73 33 54 61 62 6c   in the Fts3Tabl
de20: 65 2e 70 65 6e 64 69 6e 67 54 65 72 6d 73 20 61  e.pendingTerms a
de30: 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rray..**.** If t
de40: 68 65 20 69 73 50 72 65 66 69 78 49 74 65 72 20  he isPrefixIter 
de50: 70 61 72 61 6d 65 74 65 72 20 69 73 20 7a 65 72  parameter is zer
de60: 6f 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  o, then the retu
de70: 72 6e 65 64 20 53 65 67 52 65 61 64 65 72 20 69  rned SegReader i
de80: 74 65 72 61 74 65 73 0a 2a 2a 20 74 68 72 6f 75  terates.** throu
de90: 67 68 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20  gh each term in 
dea0: 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d  the pending-term
deb0: 73 20 74 61 62 6c 65 2e 20 4f 72 2c 20 69 66 20  s table. Or, if 
dec0: 69 73 50 72 65 66 69 78 49 74 65 72 20 69 73 0a  isPrefixIter is.
ded0: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20  ** non-zero, it 
dee0: 69 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68  iterates through
def0: 20 65 61 63 68 20 74 65 72 6d 20 61 6e 64 20 69   each term and i
df00: 74 73 20 70 72 65 66 69 78 65 73 2e 20 46 6f 72  ts prefixes. For
df10: 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20   example, if.** 
df20: 74 68 65 20 70 65 6e 64 69 6e 67 20 74 65 72 6d  the pending term
df30: 73 20 68 61 73 68 20 74 61 62 6c 65 20 63 6f 6e  s hash table con
df40: 74 61 69 6e 73 20 74 68 65 20 74 65 72 6d 73 20  tains the terms 
df50: 22 73 71 6c 69 74 65 22 2c 20 22 6d 79 73 71 6c  "sqlite", "mysql
df60: 22 20 61 6e 64 0a 2a 2a 20 22 66 69 72 65 62 69  " and.** "firebi
df70: 72 64 22 2c 20 74 68 65 6e 20 74 68 65 20 69 74  rd", then the it
df80: 65 72 61 74 6f 72 20 76 69 73 69 74 73 20 74 68  erator visits th
df90: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 27 74 65 72  e following 'ter
dfa0: 6d 73 27 20 28 69 6e 20 74 68 65 20 6f 72 64 65  ms' (in the orde
dfb0: 72 0a 2a 2a 20 73 68 6f 77 6e 29 3a 0a 2a 2a 0a  r.** shown):.**.
dfc0: 2a 2a 20 20 20 66 20 66 69 20 66 69 72 20 66 69  **   f fi fir fi
dfd0: 72 65 20 66 69 72 65 62 20 66 69 72 65 62 69 20  re fireb firebi 
dfe0: 66 69 72 65 62 69 72 20 66 69 72 65 62 69 72 64  firebir firebird
dff0: 0a 2a 2a 20 20 20 6d 20 6d 79 20 6d 79 73 20 6d  .**   m my mys m
e000: 79 73 71 20 6d 79 73 71 6c 0a 2a 2a 20 20 20 73  ysq mysql.**   s
e010: 20 73 71 20 73 71 6c 20 73 71 6c 69 20 73 71 6c   sq sql sqli sql
e020: 69 74 20 73 71 6c 69 74 65 0a 2a 2a 0a 2a 2a 20  it sqlite.**.** 
e030: 57 68 65 72 65 61 73 20 69 66 20 69 73 50 72 65  Whereas if isPre
e040: 66 69 78 49 74 65 72 20 69 73 20 7a 65 72 6f 2c  fixIter is zero,
e050: 20 74 68 65 20 74 65 72 6d 73 20 76 69 73 69 74   the terms visit
e060: 65 64 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  ed are:.**.**   
e070: 66 69 72 65 62 69 72 64 20 6d 79 73 71 6c 20 73  firebird mysql s
e080: 71 6c 69 74 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c  qlite.*/.int sql
e090: 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
e0a0: 72 50 65 6e 64 69 6e 67 28 0a 20 20 46 74 73 33  rPending(.  Fts3
e0b0: 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
e0d0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
e0e0: 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e  dle */.  int iIn
e0f0: 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  dex,            
e100: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
e110: 78 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65 78 20  x for p->aIndex 
e120: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
e130: 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  *zTerm,         
e140: 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20       /* Term to 
e150: 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a 20 20  search for */.  
e160: 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 20  int nTerm,      
e170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e180: 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
e190: 72 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  r zTerm */.  int
e1a0: 20 62 50 72 65 66 69 78 2c 20 20 20 20 20 20 20   bPrefix,       
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e1c0: 54 72 75 65 20 66 6f 72 20 61 20 70 72 65 66 69  True for a prefi
e1d0: 78 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20  x iterator */.  
e1e0: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a  Fts3SegReader **
e1f0: 70 70 52 65 61 64 65 72 20 20 20 20 20 20 20 20  ppReader        
e200: 2f 2a 20 4f 55 54 3a 20 53 65 67 52 65 61 64 65  /* OUT: SegReade
e210: 72 20 66 6f 72 20 70 65 6e 64 69 6e 67 2d 74 65  r for pending-te
e220: 72 6d 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33  rms */.){.  Fts3
e230: 53 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64  SegReader *pRead
e240: 65 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46  er = 0;     /* F
e250: 74 73 33 53 65 67 52 65 61 64 65 72 20 6f 62 6a  ts3SegReader obj
e260: 65 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ect to return */
e270: 0a 20 20 46 74 73 33 48 61 73 68 45 6c 65 6d 20  .  Fts3HashElem 
e280: 2a 70 45 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pE;            
e290: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
e2a0: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 46 74 73  ariable */.  Fts
e2b0: 33 48 61 73 68 45 6c 65 6d 20 2a 2a 61 45 6c 65  3HashElem **aEle
e2c0: 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  m = 0;       /* 
e2d0: 41 72 72 61 79 20 6f 66 20 74 65 72 6d 20 68 61  Array of term ha
e2e0: 73 68 20 65 6e 74 72 69 65 73 20 74 6f 20 73 63  sh entries to sc
e2f0: 61 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6c 65  an */.  int nEle
e300: 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  m = 0;          
e310: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
e320: 6f 66 20 61 72 72 61 79 20 61 74 20 61 45 6c 65  of array at aEle
e330: 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  m */.  int rc = 
e340: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
e350: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
e360: 20 43 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 48   Code */.  Fts3H
e370: 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 70  ash *pHash;..  p
e380: 48 61 73 68 20 3d 20 26 70 2d 3e 61 49 6e 64 65  Hash = &p->aInde
e390: 78 5b 69 49 6e 64 65 78 5d 2e 68 50 65 6e 64 69  x[iIndex].hPendi
e3a0: 6e 67 3b 0a 20 20 69 66 28 20 62 50 72 65 66 69  ng;.  if( bPrefi
e3b0: 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 6c  x ){.    int nAl
e3c0: 6c 6f 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20  loc = 0;        
e3d0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
e3e0: 66 20 61 6c 6c 6f 63 61 74 65 64 20 61 72 72 61  f allocated arra
e3f0: 79 20 61 74 20 61 45 6c 65 6d 20 2a 2f 0a 0a 20  y at aElem */.. 
e400: 20 20 20 66 6f 72 28 70 45 3d 66 74 73 33 48 61     for(pE=fts3Ha
e410: 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20  shFirst(pHash); 
e420: 70 45 3b 20 70 45 3d 66 74 73 33 48 61 73 68 4e  pE; pE=fts3HashN
e430: 65 78 74 28 70 45 29 29 7b 0a 20 20 20 20 20 20  ext(pE)){.      
e440: 63 68 61 72 20 2a 7a 4b 65 79 20 3d 20 28 63 68  char *zKey = (ch
e450: 61 72 20 2a 29 66 74 73 33 48 61 73 68 4b 65 79  ar *)fts3HashKey
e460: 28 70 45 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  (pE);.      int 
e470: 6e 4b 65 79 20 3d 20 66 74 73 33 48 61 73 68 4b  nKey = fts3HashK
e480: 65 79 73 69 7a 65 28 70 45 29 3b 0a 20 20 20 20  eysize(pE);.    
e490: 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d 30 20 7c    if( nTerm==0 |
e4a0: 7c 20 28 6e 4b 65 79 3e 3d 6e 54 65 72 6d 20 26  | (nKey>=nTerm &
e4b0: 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 4b 65 79  & 0==memcmp(zKey
e4c0: 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 29  , zTerm, nTerm))
e4d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
e4e0: 6e 45 6c 65 6d 3d 3d 6e 41 6c 6c 6f 63 20 29 7b  nElem==nAlloc ){
e4f0: 0a 20 20 20 20 20 20 20 20 20 20 46 74 73 33 48  .          Fts3H
e500: 61 73 68 45 6c 65 6d 20 2a 2a 61 45 6c 65 6d 32  ashElem **aElem2
e510: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 41 6c 6c  ;.          nAll
e520: 6f 63 20 2b 3d 20 31 36 3b 0a 20 20 20 20 20 20  oc += 16;.      
e530: 20 20 20 20 61 45 6c 65 6d 32 20 3d 20 28 46 74      aElem2 = (Ft
e540: 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29 73 71  s3HashElem **)sq
e550: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20  lite3_realloc(. 
e560: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 45 6c               aEl
e570: 65 6d 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f  em, nAlloc*sizeo
e580: 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a  f(Fts3HashElem *
e590: 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ).          );. 
e5a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 61 45           if( !aE
e5b0: 6c 65 6d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  lem2 ){.        
e5c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e5d0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
e5e0: 20 20 20 6e 45 6c 65 6d 20 3d 20 30 3b 0a 20 20     nElem = 0;.  
e5f0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
e600: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
e610: 20 20 20 20 20 20 20 61 45 6c 65 6d 20 3d 20 61         aElem = a
e620: 45 6c 65 6d 32 3b 0a 20 20 20 20 20 20 20 20 7d  Elem2;.        }
e630: 0a 0a 20 20 20 20 20 20 20 20 61 45 6c 65 6d 5b  ..        aElem[
e640: 6e 45 6c 65 6d 2b 2b 5d 20 3d 20 70 45 3b 0a 20  nElem++] = pE;. 
e650: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
e660: 20 20 2f 2a 20 49 66 20 6d 6f 72 65 20 74 68 61    /* If more tha
e670: 6e 20 6f 6e 65 20 74 65 72 6d 20 6d 61 74 63 68  n one term match
e680: 65 73 20 74 68 65 20 70 72 65 66 69 78 2c 20 73  es the prefix, s
e690: 6f 72 74 20 74 68 65 20 46 74 73 33 48 61 73 68  ort the Fts3Hash
e6a0: 45 6c 65 6d 0a 20 20 20 20 2a 2a 20 6f 62 6a 65  Elem.    ** obje
e6b0: 63 74 73 20 69 6e 20 74 65 72 6d 20 6f 72 64 65  cts in term orde
e6c0: 72 20 75 73 69 6e 67 20 71 73 6f 72 74 28 29 2e  r using qsort().
e6d0: 20 54 68 69 73 20 75 73 65 73 20 74 68 65 20 73   This uses the s
e6e0: 61 6d 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20  ame comparison. 
e6f0: 20 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 61     ** callback a
e700: 73 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 66  s is used when f
e710: 6c 75 73 68 69 6e 67 20 74 65 72 6d 73 20 74 6f  lushing terms to
e720: 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   disk..    */.  
e730: 20 20 69 66 28 20 6e 45 6c 65 6d 3e 31 20 29 7b    if( nElem>1 ){
e740: 0a 20 20 20 20 20 20 71 73 6f 72 74 28 61 45 6c  .      qsort(aEl
e750: 65 6d 2c 20 6e 45 6c 65 6d 2c 20 73 69 7a 65 6f  em, nElem, sizeo
e760: 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a  f(Fts3HashElem *
e770: 29 2c 20 66 74 73 33 43 6f 6d 70 61 72 65 45 6c  ), fts3CompareEl
e780: 65 6d 42 79 54 65 72 6d 29 3b 0a 20 20 20 20 7d  emByTerm);.    }
e790: 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ..  }else{.    /
e7a0: 2a 20 54 68 65 20 71 75 65 72 79 20 69 73 20 61  * The query is a
e7b0: 20 73 69 6d 70 6c 65 20 74 65 72 6d 20 6c 6f 6f   simple term loo
e7c0: 6b 75 70 20 74 68 61 74 20 6d 61 74 63 68 65 73  kup that matches
e7d0: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 74 65 72   at most one ter
e7e0: 6d 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  m in.    ** the 
e7f0: 69 6e 64 65 78 2e 20 41 6c 6c 20 74 68 61 74 20  index. All that 
e800: 69 73 20 72 65 71 75 69 72 65 64 20 69 73 20 61  is required is a
e810: 20 73 74 72 61 69 67 68 74 20 68 61 73 68 2d 6c   straight hash-l
e820: 6f 6f 6b 75 70 2e 20 0a 20 20 20 20 2a 2a 0a 20  ookup. .    **. 
e830: 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68     ** Because th
e840: 65 20 73 74 61 63 6b 20 61 64 64 72 65 73 73 20  e stack address 
e850: 6f 66 20 70 45 20 6d 61 79 20 62 65 20 61 63 63  of pE may be acc
e860: 65 73 73 65 64 20 76 69 61 20 74 68 65 20 61 45  essed via the aE
e870: 6c 65 6d 20 70 6f 69 6e 74 65 72 0a 20 20 20 20  lem pointer.    
e880: 2a 2a 20 62 65 6c 6f 77 2c 20 74 68 65 20 22 46  ** below, the "F
e890: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 70 45 22  ts3HashElem *pE"
e8a0: 20 6d 75 73 74 20 62 65 20 64 65 63 6c 61 72 65   must be declare
e8b0: 64 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20  d so that it is 
e8c0: 76 61 6c 69 64 0a 20 20 20 20 2a 2a 20 77 69 74  valid.    ** wit
e8d0: 68 69 6e 20 74 68 69 73 20 65 6e 74 69 72 65 20  hin this entire 
e8e0: 66 75 6e 63 74 69 6f 6e 2c 20 6e 6f 74 20 6a 75  function, not ju
e8f0: 73 74 20 74 68 69 73 20 22 65 6c 73 65 7b 2e 2e  st this "else{..
e900: 2e 7d 22 20 62 6c 6f 63 6b 2e 0a 20 20 20 20 2a  .}" block..    *
e910: 2f 0a 20 20 20 20 70 45 20 3d 20 66 74 73 33 48  /.    pE = fts3H
e920: 61 73 68 46 69 6e 64 45 6c 65 6d 28 70 48 61 73  ashFindElem(pHas
e930: 68 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29  h, zTerm, nTerm)
e940: 3b 0a 20 20 20 20 69 66 28 20 70 45 20 29 7b 0a  ;.    if( pE ){.
e950: 20 20 20 20 20 20 61 45 6c 65 6d 20 3d 20 26 70        aElem = &p
e960: 45 3b 0a 20 20 20 20 20 20 6e 45 6c 65 6d 20 3d  E;.      nElem =
e970: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
e980: 20 69 66 28 20 6e 45 6c 65 6d 3e 30 20 29 7b 0a   if( nElem>0 ){.
e990: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
e9a0: 73 69 7a 65 6f 66 28 46 74 73 33 53 65 67 52 65  sizeof(Fts3SegRe
e9b0: 61 64 65 72 29 20 2b 20 28 6e 45 6c 65 6d 2b 31  ader) + (nElem+1
e9c0: 29 2a 73 69 7a 65 6f 66 28 46 74 73 33 48 61 73  )*sizeof(Fts3Has
e9d0: 68 45 6c 65 6d 20 2a 29 3b 0a 20 20 20 20 70 52  hElem *);.    pR
e9e0: 65 61 64 65 72 20 3d 20 28 46 74 73 33 53 65 67  eader = (Fts3Seg
e9f0: 52 65 61 64 65 72 20 2a 29 73 71 6c 69 74 65 33  Reader *)sqlite3
ea00: 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a  _malloc(nByte);.
ea10: 20 20 20 20 69 66 28 20 21 70 52 65 61 64 65 72      if( !pReader
ea20: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
ea30: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
ea40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
ea50: 6d 73 65 74 28 70 52 65 61 64 65 72 2c 20 30 2c  mset(pReader, 0,
ea60: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70   nByte);.      p
ea70: 52 65 61 64 65 72 2d 3e 69 49 64 78 20 3d 20 30  Reader->iIdx = 0
ea80: 78 37 46 46 46 46 46 46 46 3b 0a 20 20 20 20 20  x7FFFFFFF;.     
ea90: 20 70 52 65 61 64 65 72 2d 3e 70 70 4e 65 78 74   pReader->ppNext
eaa0: 45 6c 65 6d 20 3d 20 28 46 74 73 33 48 61 73 68  Elem = (Fts3Hash
eab0: 45 6c 65 6d 20 2a 2a 29 26 70 52 65 61 64 65 72  Elem **)&pReader
eac0: 5b 31 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  [1];.      memcp
ead0: 79 28 70 52 65 61 64 65 72 2d 3e 70 70 4e 65 78  y(pReader->ppNex
eae0: 74 45 6c 65 6d 2c 20 61 45 6c 65 6d 2c 20 6e 45  tElem, aElem, nE
eaf0: 6c 65 6d 2a 73 69 7a 65 6f 66 28 46 74 73 33 48  lem*sizeof(Fts3H
eb00: 61 73 68 45 6c 65 6d 20 2a 29 29 3b 0a 20 20 20  ashElem *));.   
eb10: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 50   }.  }..  if( bP
eb20: 72 65 66 69 78 20 29 7b 0a 20 20 20 20 73 71 6c  refix ){.    sql
eb30: 69 74 65 33 5f 66 72 65 65 28 61 45 6c 65 6d 29  ite3_free(aElem)
eb40: 3b 0a 20 20 7d 0a 20 20 2a 70 70 52 65 61 64 65  ;.  }.  *ppReade
eb50: 72 20 3d 20 70 52 65 61 64 65 72 3b 0a 20 20 72  r = pReader;.  r
eb60: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
eb70: 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 65  ** Compare the e
eb80: 6e 74 72 69 65 73 20 70 6f 69 6e 74 65 64 20 74  ntries pointed t
eb90: 6f 20 62 79 20 74 77 6f 20 46 74 73 33 53 65 67  o by two Fts3Seg
eba0: 52 65 61 64 65 72 20 73 74 72 75 63 74 75 72 65  Reader structure
ebb0: 73 2e 20 0a 2a 2a 20 43 6f 6d 70 61 72 69 73 6f  s. .** Compariso
ebc0: 6e 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  n is as follows:
ebd0: 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 45 4f 46 20  .**.**   1) EOF 
ebe0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
ebf0: 6e 6f 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 20  not EOF..**.**  
ec00: 20 32 29 20 54 68 65 20 63 75 72 72 65 6e 74 20   2) The current 
ec10: 74 65 72 6d 73 20 28 69 66 20 61 6e 79 29 20 61  terms (if any) a
ec20: 72 65 20 63 6f 6d 70 61 72 65 64 20 75 73 69 6e  re compared usin
ec30: 67 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66 20 6f  g memcmp(). If o
ec40: 6e 65 0a 2a 2a 20 20 20 20 20 20 74 65 72 6d 20  ne.**      term 
ec50: 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 61  is a prefix of a
ec60: 6e 6f 74 68 65 72 2c 20 74 68 65 20 6c 6f 6e 67  nother, the long
ec70: 65 72 20 74 65 72 6d 20 69 73 20 63 6f 6e 73 69  er term is consi
ec80: 64 65 72 65 64 20 74 68 65 0a 2a 2a 20 20 20 20  dered the.**    
ec90: 20 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20    larger..**.** 
eca0: 20 20 33 29 20 42 79 20 73 65 67 6d 65 6e 74 20    3) By segment 
ecb0: 61 67 65 2e 20 41 6e 20 6f 6c 64 65 72 20 73 65  age. An older se
ecc0: 67 6d 65 6e 74 20 69 73 20 63 6f 6e 73 69 64 65  gment is conside
ecd0: 72 65 64 20 6c 61 72 67 65 72 2e 0a 2a 2f 0a 73  red larger..*/.s
ece0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65  tatic int fts3Se
ecf0: 67 52 65 61 64 65 72 43 6d 70 28 46 74 73 33 53  gReaderCmp(Fts3S
ed00: 65 67 52 65 61 64 65 72 20 2a 70 4c 68 73 2c 20  egReader *pLhs, 
ed10: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
ed20: 52 68 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Rhs){.  int rc;.
ed30: 20 20 69 66 28 20 70 4c 68 73 2d 3e 61 4e 6f 64    if( pLhs->aNod
ed40: 65 20 26 26 20 70 52 68 73 2d 3e 61 4e 6f 64 65  e && pRhs->aNode
ed50: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20   ){.    int rc2 
ed60: 3d 20 70 4c 68 73 2d 3e 6e 54 65 72 6d 20 2d 20  = pLhs->nTerm - 
ed70: 70 52 68 73 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20  pRhs->nTerm;.   
ed80: 20 69 66 28 20 72 63 32 3c 30 20 29 7b 0a 20 20   if( rc2<0 ){.  
ed90: 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28      rc = memcmp(
eda0: 70 4c 68 73 2d 3e 7a 54 65 72 6d 2c 20 70 52 68  pLhs->zTerm, pRh
edb0: 73 2d 3e 7a 54 65 72 6d 2c 20 70 4c 68 73 2d 3e  s->zTerm, pLhs->
edc0: 6e 54 65 72 6d 29 3b 0a 20 20 20 20 7d 65 6c 73  nTerm);.    }els
edd0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 65  e{.      rc = me
ede0: 6d 63 6d 70 28 70 4c 68 73 2d 3e 7a 54 65 72 6d  mcmp(pLhs->zTerm
edf0: 2c 20 70 52 68 73 2d 3e 7a 54 65 72 6d 2c 20 70  , pRhs->zTerm, p
ee00: 52 68 73 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20  Rhs->nTerm);.   
ee10: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 30   }.    if( rc==0
ee20: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
ee30: 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  c2;.    }.  }els
ee40: 65 7b 0a 20 20 20 20 72 63 20 3d 20 28 70 4c 68  e{.    rc = (pLh
ee50: 73 2d 3e 61 4e 6f 64 65 3d 3d 30 29 20 2d 20 28  s->aNode==0) - (
ee60: 70 52 68 73 2d 3e 61 4e 6f 64 65 3d 3d 30 29 3b  pRhs->aNode==0);
ee70: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30  .  }.  if( rc==0
ee80: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 52 68   ){.    rc = pRh
ee90: 73 2d 3e 69 49 64 78 20 2d 20 70 4c 68 73 2d 3e  s->iIdx - pLhs->
eea0: 69 49 64 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65  iIdx;.  }.  asse
eeb0: 72 74 28 20 72 63 21 3d 30 20 29 3b 0a 20 20 72  rt( rc!=0 );.  r
eec0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
eed0: 2a 2a 20 41 20 64 69 66 66 65 72 65 6e 74 20 63  ** A different c
eee0: 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
eef0: 6f 6e 20 66 6f 72 20 53 65 67 52 65 61 64 65 72  on for SegReader
ef00: 20 73 74 72 75 63 74 75 72 65 73 2e 20 49 6e 20   structures. In 
ef10: 74 68 69 73 0a 2a 2a 20 76 65 72 73 69 6f 6e 2c  this.** version,
ef20: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
ef30: 68 61 74 20 65 61 63 68 20 53 65 67 52 65 61 64  hat each SegRead
ef40: 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  er points to an 
ef50: 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 61 20 64 6f  entry in.** a do
ef60: 63 6c 69 73 74 20 66 6f 72 20 69 64 65 6e 74 69  clist for identi
ef70: 63 61 6c 20 74 65 72 6d 73 2e 20 43 6f 6d 70 61  cal terms. Compa
ef80: 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 73  rison is made as
ef90: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
efa0: 20 20 31 29 20 45 4f 46 20 28 65 6e 64 20 6f 66    1) EOF (end of
efb0: 20 64 6f 63 6c 69 73 74 20 69 6e 20 74 68 69 73   doclist in this
efc0: 20 63 61 73 65 29 20 69 73 20 67 72 65 61 74 65   case) is greate
efd0: 72 20 74 68 61 6e 20 6e 6f 74 20 45 4f 46 2e 0a  r than not EOF..
efe0: 2a 2a 0a 2a 2a 20 20 20 32 29 20 42 79 20 63 75  **.**   2) By cu
eff0: 72 72 65 6e 74 20 64 6f 63 69 64 2e 0a 2a 2a 0a  rrent docid..**.
f000: 2a 2a 20 20 20 33 29 20 42 79 20 73 65 67 6d 65  **   3) By segme
f010: 6e 74 20 61 67 65 2e 20 41 6e 20 6f 6c 64 65 72  nt age. An older
f020: 20 73 65 67 6d 65 6e 74 20 69 73 20 63 6f 6e 73   segment is cons
f030: 69 64 65 72 65 64 20 6c 61 72 67 65 72 2e 0a 2a  idered larger..*
f040: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
f050: 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73  3SegReaderDoclis
f060: 74 43 6d 70 28 46 74 73 33 53 65 67 52 65 61 64  tCmp(Fts3SegRead
f070: 65 72 20 2a 70 4c 68 73 2c 20 46 74 73 33 53 65  er *pLhs, Fts3Se
f080: 67 52 65 61 64 65 72 20 2a 70 52 68 73 29 7b 0a  gReader *pRhs){.
f090: 20 20 69 6e 74 20 72 63 20 3d 20 28 70 4c 68 73    int rc = (pLhs
f0a0: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30  ->pOffsetList==0
f0b0: 29 2d 28 70 52 68 73 2d 3e 70 4f 66 66 73 65 74  )-(pRhs->pOffset
f0c0: 4c 69 73 74 3d 3d 30 29 3b 0a 20 20 69 66 28 20  List==0);.  if( 
f0d0: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  rc==0 ){.    if(
f0e0: 20 70 4c 68 73 2d 3e 69 44 6f 63 69 64 3d 3d 70   pLhs->iDocid==p
f0f0: 52 68 73 2d 3e 69 44 6f 63 69 64 20 29 7b 0a 20  Rhs->iDocid ){. 
f100: 20 20 20 20 20 72 63 20 3d 20 70 52 68 73 2d 3e       rc = pRhs->
f110: 69 49 64 78 20 2d 20 70 4c 68 73 2d 3e 69 49 64  iIdx - pLhs->iId
f120: 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  x;.    }else{.  
f130: 20 20 20 20 72 63 20 3d 20 28 70 4c 68 73 2d 3e      rc = (pLhs->
f140: 69 44 6f 63 69 64 20 3e 20 70 52 68 73 2d 3e 69  iDocid > pRhs->i
f150: 44 6f 63 69 64 29 20 3f 20 31 20 3a 20 2d 31 3b  Docid) ? 1 : -1;
f160: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
f170: 65 72 74 28 20 70 4c 68 73 2d 3e 61 4e 6f 64 65  ert( pLhs->aNode
f180: 20 26 26 20 70 52 68 73 2d 3e 61 4e 6f 64 65 20   && pRhs->aNode 
f190: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
f1a0: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  }.static int fts
f1b0: 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73  3SegReaderDoclis
f1c0: 74 43 6d 70 52 65 76 28 46 74 73 33 53 65 67 52  tCmpRev(Fts3SegR
f1d0: 65 61 64 65 72 20 2a 70 4c 68 73 2c 20 46 74 73  eader *pLhs, Fts
f1e0: 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 68 73  3SegReader *pRhs
f1f0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 28 70  ){.  int rc = (p
f200: 4c 68 73 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74  Lhs->pOffsetList
f210: 3d 3d 30 29 2d 28 70 52 68 73 2d 3e 70 4f 66 66  ==0)-(pRhs->pOff
f220: 73 65 74 4c 69 73 74 3d 3d 30 29 3b 0a 20 20 69  setList==0);.  i
f230: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
f240: 69 66 28 20 70 4c 68 73 2d 3e 69 44 6f 63 69 64  if( pLhs->iDocid
f250: 3d 3d 70 52 68 73 2d 3e 69 44 6f 63 69 64 20 29  ==pRhs->iDocid )
f260: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 52 68  {.      rc = pRh
f270: 73 2d 3e 69 49 64 78 20 2d 20 70 4c 68 73 2d 3e  s->iIdx - pLhs->
f280: 69 49 64 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  iIdx;.    }else{
f290: 0a 20 20 20 20 20 20 72 63 20 3d 20 28 70 4c 68  .      rc = (pLh
f2a0: 73 2d 3e 69 44 6f 63 69 64 20 3c 20 70 52 68 73  s->iDocid < pRhs
f2b0: 2d 3e 69 44 6f 63 69 64 29 20 3f 20 31 20 3a 20  ->iDocid) ? 1 : 
f2c0: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  -1;.    }.  }.  
f2d0: 61 73 73 65 72 74 28 20 70 4c 68 73 2d 3e 61 4e  assert( pLhs->aN
f2e0: 6f 64 65 20 26 26 20 70 52 68 73 2d 3e 61 4e 6f  ode && pRhs->aNo
f2f0: 64 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  de );.  return r
f300: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  c;.}../*.** Comp
f310: 61 72 65 20 74 68 65 20 74 65 72 6d 20 74 68 61  are the term tha
f320: 74 20 74 68 65 20 46 74 73 33 53 65 67 52 65 61  t the Fts3SegRea
f330: 64 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  der object passe
f340: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
f350: 72 67 75 6d 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74  rgument.** point
f360: 73 20 74 6f 20 77 69 74 68 20 74 68 65 20 74 65  s to with the te
f370: 72 6d 20 73 70 65 63 69 66 69 65 64 20 62 79 20  rm specified by 
f380: 61 72 67 75 6d 65 6e 74 73 20 7a 54 65 72 6d 20  arguments zTerm 
f390: 61 6e 64 20 6e 54 65 72 6d 2e 20 0a 2a 2a 0a 2a  and nTerm. .**.*
f3a0: 2a 20 49 66 20 74 68 65 20 70 53 65 67 20 69 74  * If the pSeg it
f3b0: 65 72 61 74 6f 72 20 69 73 20 61 6c 72 65 61 64  erator is alread
f3c0: 79 20 61 74 20 45 4f 46 2c 20 72 65 74 75 72 6e  y at EOF, return
f3d0: 20 30 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72   0. Otherwise, r
f3e0: 65 74 75 72 6e 0a 2a 2a 20 2d 76 65 20 69 66 20  eturn.** -ve if 
f3f0: 74 68 65 20 70 53 65 67 20 74 65 72 6d 20 69 73  the pSeg term is
f400: 20 6c 65 73 73 20 74 68 61 6e 20 7a 54 65 72 6d   less than zTerm
f410: 2f 6e 54 65 72 6d 2c 20 30 20 69 66 20 74 68 65  /nTerm, 0 if the
f420: 20 74 77 6f 20 74 65 72 6d 73 20 61 72 65 0a 2a   two terms are.*
f430: 2a 20 65 71 75 61 6c 2c 20 6f 72 20 2b 76 65 20  * equal, or +ve 
f440: 69 66 20 74 68 65 20 70 53 65 67 20 74 65 72 6d  if the pSeg term
f450: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
f460: 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 0a 2a 2f   zTerm/nTerm..*/
f470: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
f480: 53 65 67 52 65 61 64 65 72 54 65 72 6d 43 6d 70  SegReaderTermCmp
f490: 28 0a 20 20 46 74 73 33 53 65 67 52 65 61 64 65  (.  Fts3SegReade
f4a0: 72 20 2a 70 53 65 67 2c 20 20 20 20 20 20 20 20  r *pSeg,        
f4b0: 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 72      /* Segment r
f4c0: 65 61 64 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  eader object */.
f4d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
f4e0: 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
f4f0: 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 63 6f 6d    /* Term to com
f500: 70 61 72 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  pare to */.  int
f510: 20 6e 54 65 72 6d 20 20 20 20 20 20 20 20 20 20   nTerm          
f520: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f530: 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 7a 54 65  Size of term zTe
f540: 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29  rm in bytes */.)
f550: 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b  {.  int res = 0;
f560: 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 61 4e 6f  .  if( pSeg->aNo
f570: 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  de ){.    if( pS
f580: 65 67 2d 3e 6e 54 65 72 6d 3e 6e 54 65 72 6d 20  eg->nTerm>nTerm 
f590: 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6d  ){.      res = m
f5a0: 65 6d 63 6d 70 28 70 53 65 67 2d 3e 7a 54 65 72  emcmp(pSeg->zTer
f5b0: 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29  m, zTerm, nTerm)
f5c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f5d0: 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28     res = memcmp(
f5e0: 70 53 65 67 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65  pSeg->zTerm, zTe
f5f0: 72 6d 2c 20 70 53 65 67 2d 3e 6e 54 65 72 6d 29  rm, pSeg->nTerm)
f600: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f610: 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
f620: 72 65 73 20 3d 20 70 53 65 67 2d 3e 6e 54 65 72  res = pSeg->nTer
f630: 6d 2d 6e 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20  m-nTerm;.    }. 
f640: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b   }.  return res;
f650: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
f660: 6e 74 20 61 70 53 65 67 6d 65 6e 74 20 69 73 20  nt apSegment is 
f670: 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 53 65 67  an array of nSeg
f680: 6d 65 6e 74 20 65 6c 65 6d 65 6e 74 73 2e 20 49  ment elements. I
f690: 74 20 69 73 20 6b 6e 6f 77 6e 20 74 68 61 74 0a  t is known that.
f6a0: 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 28 6e 53  ** the final (nS
f6b0: 65 67 6d 65 6e 74 2d 6e 53 75 73 70 65 63 74 29  egment-nSuspect)
f6c0: 20 6d 65 6d 62 65 72 73 20 61 72 65 20 61 6c 72   members are alr
f6d0: 65 61 64 79 20 69 6e 20 73 6f 72 74 65 64 20 6f  eady in sorted o
f6e0: 72 64 65 72 0a 2a 2a 20 28 61 63 63 6f 72 64 69  rder.** (accordi
f6f0: 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 70 61 72  ng to the compar
f700: 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 72  ison function pr
f710: 6f 76 69 64 65 64 29 2e 20 54 68 69 73 20 66 75  ovided). This fu
f720: 6e 63 74 69 6f 6e 20 73 68 75 66 66 6c 65 73 0a  nction shuffles.
f730: 2a 2a 20 74 68 65 20 61 72 72 61 79 20 61 72 6f  ** the array aro
f740: 75 6e 64 20 75 6e 74 69 6c 20 61 6c 6c 20 65 6e  und until all en
f750: 74 72 69 65 73 20 61 72 65 20 69 6e 20 73 6f 72  tries are in sor
f760: 74 65 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ted order..*/.st
f770: 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 53 65  atic void fts3Se
f780: 67 52 65 61 64 65 72 53 6f 72 74 28 0a 20 20 46  gReaderSort(.  F
f790: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a 61  ts3SegReader **a
f7a0: 70 53 65 67 6d 65 6e 74 2c 20 20 20 20 20 20 20  pSegment,       
f7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f7c0: 20 41 72 72 61 79 20 74 6f 20 73 6f 72 74 20 65   Array to sort e
f7d0: 6e 74 72 69 65 73 20 6f 66 20 2a 2f 0a 20 20 69  ntries of */.  i
f7e0: 6e 74 20 6e 53 65 67 6d 65 6e 74 2c 20 20 20 20  nt nSegment,    
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f810: 20 53 69 7a 65 20 6f 66 20 61 70 53 65 67 6d 65   Size of apSegme
f820: 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  nt array */.  in
f830: 74 20 6e 53 75 73 70 65 63 74 2c 20 20 20 20 20  t nSuspect,     
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f860: 55 6e 73 6f 72 74 65 64 20 65 6e 74 72 79 20 63  Unsorted entry c
f870: 6f 75 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  ount */.  int (*
f880: 78 43 6d 70 29 28 46 74 73 33 53 65 67 52 65 61  xCmp)(Fts3SegRea
f890: 64 65 72 20 2a 2c 20 46 74 73 33 53 65 67 52 65  der *, Fts3SegRe
f8a0: 61 64 65 72 20 2a 29 20 20 2f 2a 20 43 6f 6d 70  ader *)  /* Comp
f8b0: 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
f8c0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
f8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8e0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
f8f0: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
f900: 0a 20 20 61 73 73 65 72 74 28 20 6e 53 75 73 70  .  assert( nSusp
f910: 65 63 74 3c 3d 6e 53 65 67 6d 65 6e 74 20 29 3b  ect<=nSegment );
f920: 0a 0a 20 20 69 66 28 20 6e 53 75 73 70 65 63 74  ..  if( nSuspect
f930: 3d 3d 6e 53 65 67 6d 65 6e 74 20 29 20 6e 53 75  ==nSegment ) nSu
f940: 73 70 65 63 74 2d 2d 3b 0a 20 20 66 6f 72 28 69  spect--;.  for(i
f950: 3d 6e 53 75 73 70 65 63 74 2d 31 3b 20 69 3e 3d  =nSuspect-1; i>=
f960: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
f970: 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b   j;.    for(j=i;
f980: 20 6a 3c 28 6e 53 65 67 6d 65 6e 74 2d 31 29 3b   j<(nSegment-1);
f990: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73   j++){.      Fts
f9a0: 33 53 65 67 52 65 61 64 65 72 20 2a 70 54 6d 70  3SegReader *pTmp
f9b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 78 43 6d 70  ;.      if( xCmp
f9c0: 28 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2c 20 61  (apSegment[j], a
f9d0: 70 53 65 67 6d 65 6e 74 5b 6a 2b 31 5d 29 3c 30  pSegment[j+1])<0
f9e0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
f9f0: 70 54 6d 70 20 3d 20 61 70 53 65 67 6d 65 6e 74  pTmp = apSegment
fa00: 5b 6a 2b 31 5d 3b 0a 20 20 20 20 20 20 61 70 53  [j+1];.      apS
fa10: 65 67 6d 65 6e 74 5b 6a 2b 31 5d 20 3d 20 61 70  egment[j+1] = ap
fa20: 53 65 67 6d 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20  Segment[j];.    
fa30: 20 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 20 3d    apSegment[j] =
fa40: 20 70 54 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 7d   pTmp;.    }.  }
fa50: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
fa60: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
fa70: 20 74 68 65 20 6c 69 73 74 20 72 65 61 6c 6c 79   the list really
fa80: 20 69 73 20 73 6f 72 74 65 64 20 6e 6f 77 2e 20   is sorted now. 
fa90: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
faa0: 28 6e 53 75 73 70 65 63 74 2d 31 29 3b 20 69 2b  (nSuspect-1); i+
fab0: 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
fac0: 78 43 6d 70 28 61 70 53 65 67 6d 65 6e 74 5b 69  xCmp(apSegment[i
fad0: 5d 2c 20 61 70 53 65 67 6d 65 6e 74 5b 69 2b 31  ], apSegment[i+1
fae0: 5d 29 3c 30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ])<0 );.  }.#end
faf0: 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 49 6e 73  if.}../* .** Ins
fb00: 65 72 74 20 61 20 72 65 63 6f 72 64 20 69 6e 74  ert a record int
fb10: 6f 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73  o the %_segments
fb20: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
fb30: 63 20 69 6e 74 20 66 74 73 33 57 72 69 74 65 53  c int fts3WriteS
fb40: 65 67 6d 65 6e 74 28 0a 20 20 46 74 73 33 54 61  egment(.  Fts3Ta
fb50: 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
fb60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
fb70: 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
fb80: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
fb90: 6e 74 36 34 20 69 42 6c 6f 63 6b 2c 20 20 20 20  nt64 iBlock,    
fba0: 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20         /* Block 
fbb0: 69 64 20 66 6f 72 20 6e 65 77 20 62 6c 6f 63 6b  id for new block
fbc0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 2c 20 20   */.  char *z,  
fbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbe0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
fbf0: 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
fc00: 69 6e 69 6e 67 20 62 6c 6f 63 6b 20 64 61 74 61  ining block data
fc10: 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20 20 20   */.  int n     
fc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc30: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
fc40: 20 62 75 66 66 65 72 20 7a 20 69 6e 20 62 79 74   buffer z in byt
fc50: 65 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  es */.){.  sqlit
fc60: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
fc70: 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73 33 53    int rc = fts3S
fc80: 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 49 4e  qlStmt(p, SQL_IN
fc90: 53 45 52 54 5f 53 45 47 4d 45 4e 54 53 2c 20 26  SERT_SEGMENTS, &
fca0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
fcb0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
fcc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  {.    sqlite3_bi
fcd0: 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  nd_int64(pStmt, 
fce0: 31 2c 20 69 42 6c 6f 63 6b 29 3b 0a 20 20 20 20  1, iBlock);.    
fcf0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
fd00: 62 28 70 53 74 6d 74 2c 20 32 2c 20 7a 2c 20 6e  b(pStmt, 2, z, n
fd10: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
fd20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
fd30: 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 72  ep(pStmt);.    r
fd40: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
fd50: 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71  t(pStmt);.    sq
fd60: 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
fd70: 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20 7d 0a 20  pStmt, 2);.  }. 
fd80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
fd90: 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 6c 61  *.** Find the la
fda0: 72 67 65 73 74 20 72 65 6c 61 74 69 76 65 20 6c  rgest relative l
fdb0: 65 76 65 6c 20 6e 75 6d 62 65 72 20 69 6e 20 74  evel number in t
fdc0: 68 65 20 74 61 62 6c 65 2e 20 49 66 20 73 75 63  he table. If suc
fdd0: 63 65 73 73 66 75 6c 2c 20 73 65 74 0a 2a 2a 20  cessful, set.** 
fde0: 2a 70 6e 4d 61 78 20 74 6f 20 74 68 69 73 20 76  *pnMax to this v
fdf0: 61 6c 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20  alue and return 
fe00: 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72  SQLITE_OK. Other
fe10: 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f  wise, if an erro
fe20: 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 65 74  r occurs,.** set
fe30: 20 2a 70 6e 4d 61 78 20 74 6f 20 7a 65 72 6f 20   *pnMax to zero 
fe40: 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51  and return an SQ
fe50: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
fe60: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
fe70: 74 73 33 4d 61 78 4c 65 76 65 6c 28 46 74 73 33  ts3MaxLevel(Fts3
fe80: 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 2a 70  Table *p, int *p
fe90: 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 72 63 3b  nMax){.  int rc;
fea0: 0a 20 20 69 6e 74 20 6d 78 4c 65 76 65 6c 20 3d  .  int mxLevel =
feb0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
fec0: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 0a  mt *pStmt = 0;..
fed0: 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
fee0: 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54  mt(p, SQL_SELECT
fef0: 5f 4d 58 4c 45 56 45 4c 2c 20 26 70 53 74 6d 74  _MXLEVEL, &pStmt
ff00: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
ff10: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ff20: 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
ff30: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
ff40: 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 6d 78  tmt) ){.      mx
ff50: 4c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 5f  Level = sqlite3_
ff60: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
ff70: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
ff80: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
ff90: 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20  et(pStmt);.  }. 
ffa0: 20 2a 70 6e 4d 61 78 20 3d 20 6d 78 4c 65 76 65   *pnMax = mxLeve
ffb0: 6c 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  l;.  return rc;.
ffc0: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 49 6e 73 65 72 74  }../* .** Insert
ffd0: 20 61 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74   a record into t
ffe0: 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c  he %_segdir tabl
fff0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
10000 20 66 74 73 33 57 72 69 74 65 53 65 67 64 69 72   fts3WriteSegdir
10010 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
10020 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10030 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74      /* Virtual t
10040 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
10050 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
10060 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
10070 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 6c   /* Value for "l
10080 65 76 65 6c 22 20 66 69 65 6c 64 20 28 61 62 73  evel" field (abs
10090 6f 6c 75 74 65 20 6c 65 76 65 6c 29 20 2a 2f 0a  olute level) */.
100a0 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20    int iIdx,     
100b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100c0 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22    /* Value for "
100d0 69 64 78 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20  idx" field */.  
100e0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 53  sqlite3_int64 iS
100f0 74 61 72 74 42 6c 6f 63 6b 2c 20 20 20 20 20 20  tartBlock,      
10100 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 73 74  /* Value for "st
10110 61 72 74 5f 62 6c 6f 63 6b 22 20 66 69 65 6c 64  art_block" field
10120 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
10130 74 36 34 20 69 4c 65 61 66 45 6e 64 42 6c 6f 63  t64 iLeafEndBloc
10140 6b 2c 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66  k,    /* Value f
10150 6f 72 20 22 6c 65 61 76 65 73 5f 65 6e 64 5f 62  or "leaves_end_b
10160 6c 6f 63 6b 22 20 66 69 65 6c 64 20 2a 2f 0a 20  lock" field */. 
10170 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
10180 45 6e 64 42 6c 6f 63 6b 2c 20 20 20 20 20 20 20  EndBlock,       
10190 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 65   /* Value for "e
101a0 6e 64 5f 62 6c 6f 63 6b 22 20 66 69 65 6c 64 20  nd_block" field 
101b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
101c0 36 34 20 6e 4c 65 61 66 44 61 74 61 2c 20 20 20  64 nLeafData,   
101d0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
101e0 20 6c 65 61 66 20 64 61 74 61 20 69 6e 20 73 65   leaf data in se
101f0 67 6d 65 6e 74 20 2a 2f 0a 20 20 63 68 61 72 20  gment */.  char 
10200 2a 7a 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20  *zRoot,         
10210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c             /* Bl
10220 6f 62 20 76 61 6c 75 65 20 66 6f 72 20 22 72 6f  ob value for "ro
10230 6f 74 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69  ot" field */.  i
10240 6e 74 20 6e 52 6f 6f 74 20 20 20 20 20 20 20 20  nt nRoot        
10250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10260 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
10270 73 20 69 6e 20 62 75 66 66 65 72 20 7a 52 6f 6f  s in buffer zRoo
10280 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
10290 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
102a0 20 69 6e 74 20 72 63 20 3d 20 66 74 73 33 53 71   int rc = fts3Sq
102b0 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 49 4e 53  lStmt(p, SQL_INS
102c0 45 52 54 5f 53 45 47 44 49 52 2c 20 26 70 53 74  ERT_SEGDIR, &pSt
102d0 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  mt, 0);.  if( rc
102e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
102f0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
10300 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20  int64(pStmt, 1, 
10310 69 4c 65 76 65 6c 29 3b 0a 20 20 20 20 73 71 6c  iLevel);.    sql
10320 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53  ite3_bind_int(pS
10330 74 6d 74 2c 20 32 2c 20 69 49 64 78 29 3b 0a 20  tmt, 2, iIdx);. 
10340 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
10350 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 33 2c 20  int64(pStmt, 3, 
10360 69 53 74 61 72 74 42 6c 6f 63 6b 29 3b 0a 20 20  iStartBlock);.  
10370 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
10380 6e 74 36 34 28 70 53 74 6d 74 2c 20 34 2c 20 69  nt64(pStmt, 4, i
10390 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 29 3b 0a 20  LeafEndBlock);. 
103a0 20 20 20 69 66 28 20 6e 4c 65 61 66 44 61 74 61     if( nLeafData
103b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
103c0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
103d0 70 53 74 6d 74 2c 20 35 2c 20 69 45 6e 64 42 6c  pStmt, 5, iEndBl
103e0 6f 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ock);.    }else{
103f0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 6e  .      char *zEn
10400 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  d = sqlite3_mpri
10410 6e 74 66 28 22 25 6c 6c 64 20 25 6c 6c 64 22 2c  ntf("%lld %lld",
10420 20 69 45 6e 64 42 6c 6f 63 6b 2c 20 6e 4c 65 61   iEndBlock, nLea
10430 66 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66  fData);.      if
10440 28 20 21 7a 45 6e 64 20 29 20 72 65 74 75 72 6e  ( !zEnd ) return
10450 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
10460 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
10470 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 35 2c  d_text(pStmt, 5,
10480 20 7a 45 6e 64 2c 20 2d 31 2c 20 73 71 6c 69 74   zEnd, -1, sqlit
10490 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a  e3_free);.    }.
104a0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
104b0 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 36 2c 20  _blob(pStmt, 6, 
104c0 7a 52 6f 6f 74 2c 20 6e 52 6f 6f 74 2c 20 53 51  zRoot, nRoot, SQ
104d0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
104e0 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
104f0 53 74 6d 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  Stmt);.    rc = 
10500 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
10510 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  tmt);.    sqlite
10520 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d  3_bind_null(pStm
10530 74 2c 20 36 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t, 6);.  }.  ret
10540 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
10550 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
10560 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70   of the common p
10570 72 65 66 69 78 20 28 69 66 20 61 6e 79 29 20 73  refix (if any) s
10580 68 61 72 65 64 20 62 79 20 7a 50 72 65 76 20 61  hared by zPrev a
10590 6e 64 0a 2a 2a 20 7a 4e 65 78 74 2c 20 69 6e 20  nd.** zNext, in 
105a0 62 79 74 65 73 2e 20 46 6f 72 20 65 78 61 6d 70  bytes. For examp
105b0 6c 65 2c 20 0a 2a 2a 0a 2a 2a 20 20 20 66 74 73  le, .**.**   fts
105c0 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28  3PrefixCompress(
105d0 22 61 62 63 22 2c 20 33 2c 20 22 61 62 63 64 65  "abc", 3, "abcde
105e0 66 22 2c 20 36 29 20 20 20 2f 2f 20 72 65 74 75  f", 6)   // retu
105f0 72 6e 73 20 33 0a 2a 2a 20 20 20 66 74 73 33 50  rns 3.**   fts3P
10600 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 22 61  refixCompress("a
10610 62 58 22 2c 20 33 2c 20 22 61 62 63 64 65 66 22  bX", 3, "abcdef"
10620 2c 20 36 29 20 20 20 2f 2f 20 72 65 74 75 72 6e  , 6)   // return
10630 73 20 32 0a 2a 2a 20 20 20 66 74 73 33 50 72 65  s 2.**   fts3Pre
10640 66 69 78 43 6f 6d 70 72 65 73 73 28 22 61 62 58  fixCompress("abX
10650 22 2c 20 33 2c 20 22 58 62 63 64 65 66 22 2c 20  ", 3, "Xbcdef", 
10660 36 29 20 20 20 2f 2f 20 72 65 74 75 72 6e 73 20  6)   // returns 
10670 30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  0.*/.static int 
10680 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65  fts3PrefixCompre
10690 73 73 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ss(.  const char
106a0 20 2a 7a 50 72 65 76 2c 20 20 20 20 20 20 20 20   *zPrev,        
106b0 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
106c0 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69  containing previ
106d0 6f 75 73 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  ous term */.  in
106e0 74 20 6e 50 72 65 76 2c 20 20 20 20 20 20 20 20  t nPrev,        
106f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10700 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
10710 7a 50 72 65 76 20 69 6e 20 62 79 74 65 73 20 2a  zPrev in bytes *
10720 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
10730 7a 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20 20  zNext,          
10740 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
10750 6e 74 61 69 6e 69 6e 67 20 6e 65 78 74 20 74 65  ntaining next te
10760 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 78  rm */.  int nNex
10770 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
10780 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10790 6f 66 20 62 75 66 66 65 72 20 7a 4e 65 78 74 20  of buffer zNext 
107a0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20  in bytes */.){. 
107b0 20 69 6e 74 20 6e 3b 0a 20 20 55 4e 55 53 45 44   int n;.  UNUSED
107c0 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 65 78 74  _PARAMETER(nNext
107d0 29 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c  );.  for(n=0; n<
107e0 6e 50 72 65 76 20 26 26 20 7a 50 72 65 76 5b 6e  nPrev && zPrev[n
107f0 5d 3d 3d 7a 4e 65 78 74 5b 6e 5d 3b 20 6e 2b 2b  ]==zNext[n]; n++
10800 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
10810 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 65 72 6d  ../*.** Add term
10820 20 7a 54 65 72 6d 20 74 6f 20 74 68 65 20 53 65   zTerm to the Se
10830 67 6d 65 6e 74 4e 6f 64 65 2e 20 49 74 20 69 73  gmentNode. It is
10840 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
10850 20 7a 54 65 72 6d 20 69 73 20 6c 61 72 67 65 72   zTerm is larger
10860 0a 2a 2a 20 28 61 63 63 6f 72 64 69 6e 67 20 74  .** (according t
10870 6f 20 6d 65 6d 63 6d 70 29 20 74 68 61 6e 20 74  o memcmp) than t
10880 68 65 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  he previous term
10890 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
108a0 66 74 73 33 4e 6f 64 65 41 64 64 54 65 72 6d 28  fts3NodeAddTerm(
108b0 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
108c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108d0 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
108e0 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
108f0 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 2a 70 70  SegmentNode **pp
10900 54 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20  Tree,           
10910 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 65 67 6d 65  /* IN/OUT: Segme
10920 6e 74 4e 6f 64 65 20 68 61 6e 64 6c 65 20 2a 2f  ntNode handle */
10930 20 0a 20 20 69 6e 74 20 69 73 43 6f 70 79 54 65   .  int isCopyTe
10940 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
10950 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 7a      /* True if z
10960 54 65 72 6d 2f 6e 54 65 72 6d 20 69 73 20 74 72  Term/nTerm is tr
10970 61 6e 73 69 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e  ansient */.  con
10980 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20  st char *zTerm, 
10990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
109a0 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
109b0 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72  r containing ter
109c0 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  m */.  int nTerm
109d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109e0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
109f0 66 20 74 65 72 6d 20 69 6e 20 62 79 74 65 73 20  f term in bytes 
10a00 2a 2f 0a 29 7b 0a 20 20 53 65 67 6d 65 6e 74 4e  */.){.  SegmentN
10a10 6f 64 65 20 2a 70 54 72 65 65 20 3d 20 2a 70 70  ode *pTree = *pp
10a20 54 72 65 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Tree;.  int rc;.
10a30 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70    SegmentNode *p
10a40 4e 65 77 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74  New;..  /* First
10a50 20 74 72 79 20 74 6f 20 61 70 70 65 6e 64 20 74   try to append t
10a60 68 65 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63  he term to the c
10a70 75 72 72 65 6e 74 20 6e 6f 64 65 2e 20 52 65 74  urrent node. Ret
10a80 75 72 6e 20 65 61 72 6c 79 20 69 66 20 0a 20 20  urn early if .  
10a90 2a 2a 20 74 68 69 73 20 69 73 20 70 6f 73 73 69  ** this is possi
10aa0 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
10ab0 70 54 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74  pTree ){.    int
10ac0 20 6e 44 61 74 61 20 3d 20 70 54 72 65 65 2d 3e   nData = pTree->
10ad0 6e 44 61 74 61 3b 20 20 20 20 20 2f 2a 20 43 75  nData;     /* Cu
10ae0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 6e 6f  rrent size of no
10af0 64 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  de in bytes */. 
10b00 20 20 20 69 6e 74 20 6e 52 65 71 20 3d 20 6e 44     int nReq = nD
10b10 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
10b20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 73 70 61   /* Required spa
10b30 63 65 20 61 66 74 65 72 20 61 64 64 69 6e 67 20  ce after adding 
10b40 7a 54 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74  zTerm */.    int
10b50 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20 20   nPrefix;       
10b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10b70 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
10b80 20 70 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73   prefix compress
10b90 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ion */.    int n
10ba0 53 75 66 66 69 78 3b 20 20 20 20 20 20 20 20 20  Suffix;         
10bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 66 66           /* Suff
10bc0 69 78 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a 20 20  ix length */..  
10bd0 20 20 6e 50 72 65 66 69 78 20 3d 20 66 74 73 33    nPrefix = fts3
10be0 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70  PrefixCompress(p
10bf0 54 72 65 65 2d 3e 7a 54 65 72 6d 2c 20 70 54 72  Tree->zTerm, pTr
10c00 65 65 2d 3e 6e 54 65 72 6d 2c 20 7a 54 65 72 6d  ee->nTerm, zTerm
10c10 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 6e 53  , nTerm);.    nS
10c20 75 66 66 69 78 20 3d 20 6e 54 65 72 6d 2d 6e 50  uffix = nTerm-nP
10c30 72 65 66 69 78 3b 0a 0a 20 20 20 20 6e 52 65 71  refix;..    nReq
10c40 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56   += sqlite3Fts3V
10c50 61 72 69 6e 74 4c 65 6e 28 6e 50 72 65 66 69 78  arintLen(nPrefix
10c60 29 2b 73 71 6c 69 74 65 33 46 74 73 33 56 61 72  )+sqlite3Fts3Var
10c70 69 6e 74 4c 65 6e 28 6e 53 75 66 66 69 78 29 2b  intLen(nSuffix)+
10c80 6e 53 75 66 66 69 78 3b 0a 20 20 20 20 69 66 28  nSuffix;.    if(
10c90 20 6e 52 65 71 3c 3d 70 2d 3e 6e 4e 6f 64 65 53   nReq<=p->nNodeS
10ca0 69 7a 65 20 7c 7c 20 21 70 54 72 65 65 2d 3e 7a  ize || !pTree->z
10cb0 54 65 72 6d 20 29 7b 0a 0a 20 20 20 20 20 20 69  Term ){..      i
10cc0 66 28 20 6e 52 65 71 3e 70 2d 3e 6e 4e 6f 64 65  f( nReq>p->nNode
10cd0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
10ce0 2f 2a 20 41 6e 20 75 6e 75 73 75 61 6c 20 63 61  /* An unusual ca
10cf0 73 65 3a 20 74 68 69 73 20 69 73 20 74 68 65 20  se: this is the 
10d00 66 69 72 73 74 20 74 65 72 6d 20 74 6f 20 62 65  first term to be
10d10 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6e 6f   added to the no
10d20 64 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  de.        ** an
10d30 64 20 74 68 65 20 73 74 61 74 69 63 20 6e 6f 64  d the static nod
10d40 65 20 62 75 66 66 65 72 20 28 70 2d 3e 6e 4e 6f  e buffer (p->nNo
10d50 64 65 53 69 7a 65 20 62 79 74 65 73 29 20 69 73  deSize bytes) is
10d60 20 6e 6f 74 20 6c 61 72 67 65 0a 20 20 20 20 20   not large.     
10d70 20 20 20 2a 2a 20 65 6e 6f 75 67 68 2e 20 55 73     ** enough. Us
10d80 65 20 61 20 73 65 70 61 72 61 74 65 6c 79 20 6d  e a separately m
10d90 61 6c 6c 6f 63 65 64 20 62 75 66 66 65 72 20 69  alloced buffer i
10da0 6e 73 74 65 61 64 20 54 68 69 73 20 77 61 73 74  nstead This wast
10db0 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 2d  es.        ** p-
10dc0 3e 6e 4e 6f 64 65 53 69 7a 65 20 62 79 74 65 73  >nNodeSize bytes
10dd0 2c 20 62 75 74 20 73 69 6e 63 65 20 74 68 69 73  , but since this
10de0 20 73 63 65 6e 61 72 69 6f 20 6f 6e 6c 79 20 63   scenario only c
10df0 6f 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e 0a  omes about when.
10e00 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64          ** the d
10e10 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 20  atabase contain 
10e20 74 77 6f 20 74 65 72 6d 73 20 74 68 61 74 20 73  two terms that s
10e30 68 61 72 65 20 61 20 70 72 65 66 69 78 20 6f 66  hare a prefix of
10e40 20 61 6c 6d 6f 73 74 20 32 4b 42 2c 20 0a 20 20   almost 2KB, .  
10e50 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73        ** this is
10e60 20 6e 6f 74 20 65 78 70 65 63 74 65 64 20 74 6f   not expected to
10e70 20 62 65 20 61 20 73 65 72 69 6f 75 73 20 70 72   be a serious pr
10e80 6f 62 6c 65 6d 2e 20 0a 20 20 20 20 20 20 20 20  oblem. .        
10e90 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
10ea0 74 28 20 70 54 72 65 65 2d 3e 61 44 61 74 61 3d  t( pTree->aData=
10eb0 3d 28 63 68 61 72 20 2a 29 26 70 54 72 65 65 5b  =(char *)&pTree[
10ec0 31 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54  1] );.        pT
10ed0 72 65 65 2d 3e 61 44 61 74 61 20 3d 20 28 63 68  ree->aData = (ch
10ee0 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ar *)sqlite3_mal
10ef0 6c 6f 63 28 6e 52 65 71 29 3b 0a 20 20 20 20 20  loc(nReq);.     
10f00 20 20 20 69 66 28 20 21 70 54 72 65 65 2d 3e 61     if( !pTree->a
10f10 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
10f20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10f30 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d  NOMEM;.        }
10f40 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
10f50 69 66 28 20 70 54 72 65 65 2d 3e 7a 54 65 72 6d  if( pTree->zTerm
10f60 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
10f70 68 65 72 65 20 69 73 20 6e 6f 20 70 72 65 66 69  here is no prefi
10f80 78 2d 6c 65 6e 67 74 68 20 66 69 65 6c 64 20 66  x-length field f
10f90 6f 72 20 66 69 72 73 74 20 74 65 72 6d 20 69 6e  or first term in
10fa0 20 61 20 6e 6f 64 65 20 2a 2f 0a 20 20 20 20 20   a node */.     
10fb0 20 20 20 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69     nData += sqli
10fc0 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74  te3Fts3PutVarint
10fd0 28 26 70 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e  (&pTree->aData[n
10fe0 44 61 74 61 5d 2c 20 6e 50 72 65 66 69 78 29 3b  Data], nPrefix);
10ff0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
11000 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 33  nData += sqlite3
11010 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70  Fts3PutVarint(&p
11020 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e 44 61 74  Tree->aData[nDat
11030 61 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20  a], nSuffix);.  
11040 20 20 20 20 6d 65 6d 63 70 79 28 26 70 54 72 65      memcpy(&pTre
11050 65 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c  e->aData[nData],
11060 20 26 7a 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d   &zTerm[nPrefix]
11070 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 20 20  , nSuffix);.    
11080 20 20 70 54 72 65 65 2d 3e 6e 44 61 74 61 20 3d    pTree->nData =
11090 20 6e 44 61 74 61 20 2b 20 6e 53 75 66 66 69 78   nData + nSuffix
110a0 3b 0a 20 20 20 20 20 20 70 54 72 65 65 2d 3e 6e  ;.      pTree->n
110b0 45 6e 74 72 79 2b 2b 3b 0a 0a 20 20 20 20 20 20  Entry++;..      
110c0 69 66 28 20 69 73 43 6f 70 79 54 65 72 6d 20 29  if( isCopyTerm )
110d0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  {.        if( pT
110e0 72 65 65 2d 3e 6e 4d 61 6c 6c 6f 63 3c 6e 54 65  ree->nMalloc<nTe
110f0 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rm ){.          
11100 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20 73 71 6c  char *zNew = sql
11110 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 54 72  ite3_realloc(pTr
11120 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 2c 20 6e 54 65  ee->zMalloc, nTe
11130 72 6d 2a 32 29 3b 0a 20 20 20 20 20 20 20 20 20  rm*2);.         
11140 20 69 66 28 20 21 7a 4e 65 77 20 29 7b 0a 20 20   if( !zNew ){.  
11150 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
11160 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
11170 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
11180 20 20 20 20 20 70 54 72 65 65 2d 3e 6e 4d 61 6c       pTree->nMal
11190 6c 6f 63 20 3d 20 6e 54 65 72 6d 2a 32 3b 0a 20  loc = nTerm*2;. 
111a0 20 20 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e           pTree->
111b0 7a 4d 61 6c 6c 6f 63 20 3d 20 7a 4e 65 77 3b 0a  zMalloc = zNew;.
111c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
111d0 20 20 70 54 72 65 65 2d 3e 7a 54 65 72 6d 20 3d    pTree->zTerm =
111e0 20 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 3b   pTree->zMalloc;
111f0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
11200 70 54 72 65 65 2d 3e 7a 54 65 72 6d 2c 20 7a 54  pTree->zTerm, zT
11210 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20  erm, nTerm);.   
11220 20 20 20 20 20 70 54 72 65 65 2d 3e 6e 54 65 72       pTree->nTer
11230 6d 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20  m = nTerm;.     
11240 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11250 70 54 72 65 65 2d 3e 7a 54 65 72 6d 20 3d 20 28  pTree->zTerm = (
11260 63 68 61 72 20 2a 29 7a 54 65 72 6d 3b 0a 20 20  char *)zTerm;.  
11270 20 20 20 20 20 20 70 54 72 65 65 2d 3e 6e 54 65        pTree->nTe
11280 72 6d 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20  rm = nTerm;.    
11290 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
112a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
112b0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63  }.  }..  /* If c
112c0 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20  ontrol flows to 
112d0 68 65 72 65 2c 20 69 74 20 77 61 73 20 6e 6f 74  here, it was not
112e0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 70 70   possible to app
112f0 65 6e 64 20 7a 54 65 72 6d 20 74 6f 20 74 68 65  end zTerm to the
11300 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 6e 6f  .  ** current no
11310 64 65 2e 20 43 72 65 61 74 65 20 61 20 6e 65 77  de. Create a new
11320 20 6e 6f 64 65 20 28 61 20 72 69 67 68 74 2d 73   node (a right-s
11330 69 62 6c 69 6e 67 20 6f 66 20 74 68 65 20 63 75  ibling of the cu
11340 72 72 65 6e 74 20 6e 6f 64 65 29 2e 0a 20 20 2a  rrent node)..  *
11350 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
11360 20 66 69 72 73 74 20 6e 6f 64 65 20 69 6e 20 74   first node in t
11370 68 65 20 74 72 65 65 2c 20 74 68 65 20 74 65 72  he tree, the ter
11380 6d 20 69 73 20 61 64 64 65 64 20 74 6f 20 69 74  m is added to it
11390 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 74 68 65  ..  **.  ** Othe
113a0 72 77 69 73 65 2c 20 74 68 65 20 74 65 72 6d 20  rwise, the term 
113b0 69 73 20 6e 6f 74 20 61 64 64 65 64 20 74 6f 20  is not added to 
113c0 74 68 65 20 6e 65 77 20 6e 6f 64 65 2c 20 69 74  the new node, it
113d0 20 69 73 20 6c 65 66 74 20 65 6d 70 74 79 20 66   is left empty f
113e0 6f 72 0a 20 20 2a 2a 20 6e 6f 77 2e 20 49 6e 73  or.  ** now. Ins
113f0 74 65 61 64 2c 20 74 68 65 20 74 65 72 6d 20 69  tead, the term i
11400 73 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  s inserted into 
11410 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70 54  the parent of pT
11420 72 65 65 2e 20 49 66 20 70 54 72 65 65 20 0a 20  ree. If pTree . 
11430 20 2a 2a 20 68 61 73 20 6e 6f 20 70 61 72 65 6e   ** has no paren
11440 74 2c 20 6f 6e 65 20 69 73 20 63 72 65 61 74 65  t, one is create
11450 64 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70  d here..  */.  p
11460 4e 65 77 20 3d 20 28 53 65 67 6d 65 6e 74 4e 6f  New = (SegmentNo
11470 64 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  de *)sqlite3_mal
11480 6c 6f 63 28 73 69 7a 65 6f 66 28 53 65 67 6d 65  loc(sizeof(Segme
11490 6e 74 4e 6f 64 65 29 20 2b 20 70 2d 3e 6e 4e 6f  ntNode) + p->nNo
114a0 64 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 21  deSize);.  if( !
114b0 70 4e 65 77 20 29 7b 0a 20 20 20 20 72 65 74 75  pNew ){.    retu
114c0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
114d0 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e  .  }.  memset(pN
114e0 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 65  ew, 0, sizeof(Se
114f0 67 6d 65 6e 74 4e 6f 64 65 29 29 3b 0a 20 20 70  gmentNode));.  p
11500 4e 65 77 2d 3e 6e 44 61 74 61 20 3d 20 31 20 2b  New->nData = 1 +
11510 20 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58   FTS3_VARINT_MAX
11520 3b 0a 20 20 70 4e 65 77 2d 3e 61 44 61 74 61 20  ;.  pNew->aData 
11530 3d 20 28 63 68 61 72 20 2a 29 26 70 4e 65 77 5b  = (char *)&pNew[
11540 31 5d 3b 0a 0a 20 20 69 66 28 20 70 54 72 65 65  1];..  if( pTree
11550 20 29 7b 0a 20 20 20 20 53 65 67 6d 65 6e 74 4e   ){.    SegmentN
11560 6f 64 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 70  ode *pParent = p
11570 54 72 65 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  Tree->pParent;. 
11580 20 20 20 72 63 20 3d 20 66 74 73 33 4e 6f 64 65     rc = fts3Node
11590 41 64 64 54 65 72 6d 28 70 2c 20 26 70 50 61 72  AddTerm(p, &pPar
115a0 65 6e 74 2c 20 69 73 43 6f 70 79 54 65 72 6d 2c  ent, isCopyTerm,
115b0 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   zTerm, nTerm);.
115c0 20 20 20 20 69 66 28 20 70 54 72 65 65 2d 3e 70      if( pTree->p
115d0 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  Parent==0 ){.   
115e0 20 20 20 70 54 72 65 65 2d 3e 70 50 61 72 65 6e     pTree->pParen
115f0 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 20  t = pParent;.   
11600 20 7d 0a 20 20 20 20 70 54 72 65 65 2d 3e 70 52   }.    pTree->pR
11610 69 67 68 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20  ight = pNew;.   
11620 20 70 4e 65 77 2d 3e 70 4c 65 66 74 6d 6f 73 74   pNew->pLeftmost
11630 20 3d 20 70 54 72 65 65 2d 3e 70 4c 65 66 74 6d   = pTree->pLeftm
11640 6f 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  ost;.    pNew->p
11650 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74  Parent = pParent
11660 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4d 61 6c  ;.    pNew->zMal
11670 6c 6f 63 20 3d 20 70 54 72 65 65 2d 3e 7a 4d 61  loc = pTree->zMa
11680 6c 6c 6f 63 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  lloc;.    pNew->
11690 6e 4d 61 6c 6c 6f 63 20 3d 20 70 54 72 65 65 2d  nMalloc = pTree-
116a0 3e 6e 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20 70 54  >nMalloc;.    pT
116b0 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30  ree->zMalloc = 0
116c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
116d0 4e 65 77 2d 3e 70 4c 65 66 74 6d 6f 73 74 20 3d  New->pLeftmost =
116e0 20 70 4e 65 77 3b 0a 20 20 20 20 72 63 20 3d 20   pNew;.    rc = 
116f0 66 74 73 33 4e 6f 64 65 41 64 64 54 65 72 6d 28  fts3NodeAddTerm(
11700 70 2c 20 26 70 4e 65 77 2c 20 69 73 43 6f 70 79  p, &pNew, isCopy
11710 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  Term, zTerm, nTe
11720 72 6d 29 3b 20 0a 20 20 7d 0a 0a 20 20 2a 70 70  rm); .  }..  *pp
11730 54 72 65 65 20 3d 20 70 4e 65 77 3b 0a 20 20 72  Tree = pNew;.  r
11740 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11750 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
11760 6f 6e 20 66 6f 72 20 66 74 73 33 4e 6f 64 65 57  on for fts3NodeW
11770 72 69 74 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  rite()..*/.stati
11780 63 20 69 6e 74 20 66 74 73 33 54 72 65 65 46 69  c int fts3TreeFi
11790 6e 69 73 68 4e 6f 64 65 28 0a 20 20 53 65 67 6d  nishNode(.  Segm
117a0 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65 2c 20  entNode *pTree, 
117b0 0a 20 20 69 6e 74 20 69 48 65 69 67 68 74 2c 20  .  int iHeight, 
117c0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
117d0 20 69 4c 65 66 74 43 68 69 6c 64 0a 29 7b 0a 20   iLeftChild.){. 
117e0 20 69 6e 74 20 6e 53 74 61 72 74 3b 0a 20 20 61   int nStart;.  a
117f0 73 73 65 72 74 28 20 69 48 65 69 67 68 74 3e 3d  ssert( iHeight>=
11800 31 20 26 26 20 69 48 65 69 67 68 74 3c 31 32 38  1 && iHeight<128
11810 20 29 3b 0a 20 20 6e 53 74 61 72 74 20 3d 20 46   );.  nStart = F
11820 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 20 2d  TS3_VARINT_MAX -
11830 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69   sqlite3Fts3Vari
11840 6e 74 4c 65 6e 28 69 4c 65 66 74 43 68 69 6c 64  ntLen(iLeftChild
11850 29 3b 0a 20 20 70 54 72 65 65 2d 3e 61 44 61 74  );.  pTree->aDat
11860 61 5b 6e 53 74 61 72 74 5d 20 3d 20 28 63 68 61  a[nStart] = (cha
11870 72 29 69 48 65 69 67 68 74 3b 0a 20 20 73 71 6c  r)iHeight;.  sql
11880 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e  ite3Fts3PutVarin
11890 74 28 26 70 54 72 65 65 2d 3e 61 44 61 74 61 5b  t(&pTree->aData[
118a0 6e 53 74 61 72 74 2b 31 5d 2c 20 69 4c 65 66 74  nStart+1], iLeft
118b0 43 68 69 6c 64 29 3b 0a 20 20 72 65 74 75 72 6e  Child);.  return
118c0 20 6e 53 74 61 72 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   nStart;.}../*.*
118d0 2a 20 57 72 69 74 65 20 74 68 65 20 62 75 66 66  * Write the buff
118e0 65 72 20 66 6f 72 20 74 68 65 20 73 65 67 6d 65  er for the segme
118f0 6e 74 20 6e 6f 64 65 20 70 54 72 65 65 20 61 6e  nt node pTree an
11900 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 70 65 65  d all of its pee
11910 72 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74  rs to the.** dat
11920 61 62 61 73 65 2e 20 54 68 65 6e 20 63 61 6c 6c  abase. Then call
11930 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
11940 65 63 75 72 73 69 76 65 6c 79 20 74 6f 20 77 72  ecursively to wr
11950 69 74 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f  ite the parent o
11960 66 20 0a 2a 2a 20 70 54 72 65 65 20 61 6e 64 20  f .** pTree and 
11970 69 74 73 20 70 65 65 72 73 20 74 6f 20 74 68 65  its peers to the
11980 20 64 61 74 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a   database. .**.*
11990 2a 20 45 78 63 65 70 74 2c 20 69 66 20 70 54 72  * Except, if pTr
119a0 65 65 20 69 73 20 61 20 72 6f 6f 74 20 6e 6f 64  ee is a root nod
119b0 65 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  e, do not write 
119c0 69 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  it to the databa
119d0 73 65 2e 20 49 6e 73 74 65 61 64 2c 0a 2a 2a 20  se. Instead,.** 
119e0 73 65 74 20 6f 75 74 70 75 74 20 76 61 72 69 61  set output varia
119f0 62 6c 65 73 20 2a 70 61 52 6f 6f 74 20 61 6e 64  bles *paRoot and
11a00 20 2a 70 6e 52 6f 6f 74 20 74 6f 20 63 6f 6e 74   *pnRoot to cont
11a10 61 69 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64  ain the root nod
11a20 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  e..**.** If succ
11a30 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
11a40 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  K is returned an
11a50 64 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  d output variabl
11a60 65 20 2a 70 69 4c 61 73 74 20 69 73 0a 2a 2a 20  e *piLast is.** 
11a70 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65  set to the large
11a80 73 74 20 62 6c 6f 63 6b 69 64 20 77 72 69 74 74  st blockid writt
11a90 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
11aa0 73 65 20 28 6f 72 20 7a 65 72 6f 20 69 66 20 6e  se (or zero if n
11ab0 6f 0a 2a 2a 20 62 6c 6f 63 6b 73 20 77 65 72 65  o.** blocks were
11ac0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
11ad0 64 62 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  db). Otherwise, 
11ae0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
11af0 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75  code is .** retu
11b00 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
11b10 69 6e 74 20 66 74 73 33 4e 6f 64 65 57 72 69 74  int fts3NodeWrit
11b20 65 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  e(.  Fts3Table *
11b30 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
11b40 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
11b50 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
11b60 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70    SegmentNode *p
11b70 54 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20  Tree,           
11b80 20 20 2f 2a 20 53 65 67 6d 65 6e 74 4e 6f 64 65    /* SegmentNode
11b90 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
11ba0 20 69 48 65 69 67 68 74 2c 20 20 20 20 20 20 20   iHeight,       
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11bc0 48 65 69 67 68 74 20 6f 66 20 74 68 69 73 20 6e  Height of this n
11bd0 6f 64 65 20 69 6e 20 74 72 65 65 20 2a 2f 0a 20  ode in tree */. 
11be0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
11bf0 4c 65 61 66 2c 20 20 20 20 20 20 20 20 20 20 20  Leaf,           
11c00 20 2f 2a 20 42 6c 6f 63 6b 20 69 64 20 6f 66 20   /* Block id of 
11c10 66 69 72 73 74 20 6c 65 61 66 20 6e 6f 64 65 20  first leaf node 
11c20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
11c30 36 34 20 69 46 72 65 65 2c 20 20 20 20 20 20 20  64 iFree,       
11c40 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 69 64       /* Block id
11c50 20 6f 66 20 6e 65 78 74 20 66 72 65 65 20 73 6c   of next free sl
11c60 6f 74 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73  ot in %_segments
11c70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
11c80 74 36 34 20 2a 70 69 4c 61 73 74 2c 20 20 20 20  t64 *piLast,    
11c90 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42 6c        /* OUT: Bl
11ca0 6f 63 6b 20 69 64 20 6f 66 20 6c 61 73 74 20 65  ock id of last e
11cb0 6e 74 72 79 20 77 72 69 74 74 65 6e 20 2a 2f 0a  ntry written */.
11cc0 20 20 63 68 61 72 20 2a 2a 70 61 52 6f 6f 74 2c    char **paRoot,
11cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ce0 20 20 2f 2a 20 4f 55 54 3a 20 44 61 74 61 20 66    /* OUT: Data f
11cf0 6f 72 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a  or root node */.
11d00 20 20 69 6e 74 20 2a 70 6e 52 6f 6f 74 20 20 20    int *pnRoot   
11d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f    /* OUT: Size o
11d30 66 20 72 6f 6f 74 20 6e 6f 64 65 20 69 6e 20 62  f root node in b
11d40 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ytes */.){.  int
11d50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11d60 0a 0a 20 20 69 66 28 20 21 70 54 72 65 65 2d 3e  ..  if( !pTree->
11d70 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 2f  pParent ){.    /
11d80 2a 20 52 6f 6f 74 20 6e 6f 64 65 20 6f 66 20 74  * Root node of t
11d90 68 65 20 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20  he tree. */.    
11da0 69 6e 74 20 6e 53 74 61 72 74 20 3d 20 66 74 73  int nStart = fts
11db0 33 54 72 65 65 46 69 6e 69 73 68 4e 6f 64 65 28  3TreeFinishNode(
11dc0 70 54 72 65 65 2c 20 69 48 65 69 67 68 74 2c 20  pTree, iHeight, 
11dd0 69 4c 65 61 66 29 3b 0a 20 20 20 20 2a 70 69 4c  iLeaf);.    *piL
11de0 61 73 74 20 3d 20 69 46 72 65 65 2d 31 3b 0a 20  ast = iFree-1;. 
11df0 20 20 20 2a 70 6e 52 6f 6f 74 20 3d 20 70 54 72     *pnRoot = pTr
11e00 65 65 2d 3e 6e 44 61 74 61 20 2d 20 6e 53 74 61  ee->nData - nSta
11e10 72 74 3b 0a 20 20 20 20 2a 70 61 52 6f 6f 74 20  rt;.    *paRoot 
11e20 3d 20 26 70 54 72 65 65 2d 3e 61 44 61 74 61 5b  = &pTree->aData[
11e30 6e 53 74 61 72 74 5d 3b 0a 20 20 7d 65 6c 73 65  nStart];.  }else
11e40 7b 0a 20 20 20 20 53 65 67 6d 65 6e 74 4e 6f 64  {.    SegmentNod
11e50 65 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 73 71  e *pIter;.    sq
11e60 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4e 65 78  lite3_int64 iNex
11e70 74 46 72 65 65 20 3d 20 69 46 72 65 65 3b 0a 20  tFree = iFree;. 
11e80 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
11e90 20 69 4e 65 78 74 4c 65 61 66 20 3d 20 69 4c 65   iNextLeaf = iLe
11ea0 61 66 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65  af;.    for(pIte
11eb0 72 3d 70 54 72 65 65 2d 3e 70 4c 65 66 74 6d 6f  r=pTree->pLeftmo
11ec0 73 74 3b 20 70 49 74 65 72 20 26 26 20 72 63 3d  st; pIter && rc=
11ed0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 49 74 65  =SQLITE_OK; pIte
11ee0 72 3d 70 49 74 65 72 2d 3e 70 52 69 67 68 74 29  r=pIter->pRight)
11ef0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 74 61  {.      int nSta
11f00 72 74 20 3d 20 66 74 73 33 54 72 65 65 46 69 6e  rt = fts3TreeFin
11f10 69 73 68 4e 6f 64 65 28 70 49 74 65 72 2c 20 69  ishNode(pIter, i
11f20 48 65 69 67 68 74 2c 20 69 4e 65 78 74 4c 65 61  Height, iNextLea
11f30 66 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 57  f);.      int nW
11f40 72 69 74 65 20 3d 20 70 49 74 65 72 2d 3e 6e 44  rite = pIter->nD
11f50 61 74 61 20 2d 20 6e 53 74 61 72 74 3b 0a 20 20  ata - nStart;.  
11f60 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33  .      rc = fts3
11f70 57 72 69 74 65 53 65 67 6d 65 6e 74 28 70 2c 20  WriteSegment(p, 
11f80 69 4e 65 78 74 46 72 65 65 2c 20 26 70 49 74 65  iNextFree, &pIte
11f90 72 2d 3e 61 44 61 74 61 5b 6e 53 74 61 72 74 5d  r->aData[nStart]
11fa0 2c 20 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 20  , nWrite);.     
11fb0 20 69 4e 65 78 74 46 72 65 65 2b 2b 3b 0a 20 20   iNextFree++;.  
11fc0 20 20 20 20 69 4e 65 78 74 4c 65 61 66 20 2b 3d      iNextLeaf +=
11fd0 20 28 70 49 74 65 72 2d 3e 6e 45 6e 74 72 79 2b   (pIter->nEntry+
11fe0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
11ff0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12000 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
12010 20 69 4e 65 78 74 4c 65 61 66 3d 3d 69 46 72 65   iNextLeaf==iFre
12020 65 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  e );.      rc = 
12030 66 74 73 33 4e 6f 64 65 57 72 69 74 65 28 0a 20  fts3NodeWrite(. 
12040 20 20 20 20 20 20 20 20 20 70 2c 20 70 54 72 65           p, pTre
12050 65 2d 3e 70 50 61 72 65 6e 74 2c 20 69 48 65 69  e->pParent, iHei
12060 67 68 74 2b 31 2c 20 69 46 72 65 65 2c 20 69 4e  ght+1, iFree, iN
12070 65 78 74 46 72 65 65 2c 20 70 69 4c 61 73 74 2c  extFree, piLast,
12080 20 70 61 52 6f 6f 74 2c 20 70 6e 52 6f 6f 74 0a   paRoot, pnRoot.
12090 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
120a0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
120b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
120c0 6c 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ll memory alloca
120d0 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
120e0 20 77 69 74 68 20 74 68 65 20 74 72 65 65 20 70   with the tree p
120f0 54 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Tree..*/.static 
12100 76 6f 69 64 20 66 74 73 33 4e 6f 64 65 46 72 65  void fts3NodeFre
12110 65 28 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70  e(SegmentNode *p
12120 54 72 65 65 29 7b 0a 20 20 69 66 28 20 70 54 72  Tree){.  if( pTr
12130 65 65 20 29 7b 0a 20 20 20 20 53 65 67 6d 65 6e  ee ){.    Segmen
12140 74 4e 6f 64 65 20 2a 70 20 3d 20 70 54 72 65 65  tNode *p = pTree
12150 2d 3e 70 4c 65 66 74 6d 6f 73 74 3b 0a 20 20 20  ->pLeftmost;.   
12160 20 66 74 73 33 4e 6f 64 65 46 72 65 65 28 70 2d   fts3NodeFree(p-
12170 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 77  >pParent);.    w
12180 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 20  hile( p ){.     
12190 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 52   SegmentNode *pR
121a0 69 67 68 74 20 3d 20 70 2d 3e 70 52 69 67 68 74  ight = p->pRight
121b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61  ;.      if( p->a
121c0 44 61 74 61 21 3d 28 63 68 61 72 20 2a 29 26 70  Data!=(char *)&p
121d0 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73  [1] ){.        s
121e0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
121f0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Data);.      }. 
12200 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69       assert( pRi
12210 67 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 4d 61  ght==0 || p->zMa
12220 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lloc==0 );.     
12230 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
12240 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
12250 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
12260 3b 0a 20 20 20 20 20 20 70 20 3d 20 70 52 69 67  ;.      p = pRig
12270 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ht;.    }.  }.}.
12280 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 74 65 72  ./*.** Add a ter
12290 6d 20 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74  m to the segment
122a0 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
122b0 65 64 20 62 79 20 74 68 65 20 53 65 67 6d 65 6e  ed by the Segmen
122c0 74 57 72 69 74 65 72 20 6f 62 6a 65 63 74 0a 2a  tWriter object.*
122d0 2a 20 2a 70 70 57 72 69 74 65 72 2e 20 57 68 65  * *ppWriter. Whe
122e0 6e 20 61 64 64 69 6e 67 20 74 68 65 20 66 69 72  n adding the fir
122f0 73 74 20 74 65 72 6d 20 74 6f 20 61 20 73 65 67  st term to a seg
12300 6d 65 6e 74 2c 20 2a 70 70 57 72 69 74 65 72 20  ment, *ppWriter 
12310 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 70 61 73  should.** be pas
12320 73 65 64 20 4e 55 4c 4c 2e 20 54 68 69 73 20 66  sed NULL. This f
12330 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61 6c 6c  unction will all
12340 6f 63 61 74 65 20 61 20 6e 65 77 20 53 65 67 6d  ocate a new Segm
12350 65 6e 74 57 72 69 74 65 72 20 6f 62 6a 65 63 74  entWriter object
12360 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 69  .** and return i
12370 74 20 76 69 61 20 74 68 65 20 69 6e 70 75 74 2f  t via the input/
12380 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20  output variable 
12390 2a 70 70 57 72 69 74 65 72 20 69 6e 20 74 68 69  *ppWriter in thi
123a0 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
123b0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
123c0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
123d0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ed. Otherwise, a
123e0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
123f0 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
12400 6e 74 20 66 74 73 33 53 65 67 57 72 69 74 65 72  nt fts3SegWriter
12410 41 64 64 28 0a 20 20 46 74 73 33 54 61 62 6c 65  Add(.  Fts3Table
12420 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
12430 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61         /* Virtua
12440 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  l table handle *
12450 2f 0a 20 20 53 65 67 6d 65 6e 74 57 72 69 74 65  /.  SegmentWrite
12460 72 20 2a 2a 70 70 57 72 69 74 65 72 2c 20 20 20  r **ppWriter,   
12470 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53      /* IN/OUT: S
12480 65 67 6d 65 6e 74 57 72 69 74 65 72 20 68 61 6e  egmentWriter han
12490 64 6c 65 20 2a 2f 20 0a 20 20 69 6e 74 20 69 73  dle */ .  int is
124a0 43 6f 70 79 54 65 72 6d 2c 20 20 20 20 20 20 20  CopyTerm,       
124b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
124c0 65 20 69 66 20 62 75 66 66 65 72 20 7a 54 65 72  e if buffer zTer
124d0 6d 20 6d 75 73 74 20 62 65 20 63 6f 70 69 65 64  m must be copied
124e0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
124f0 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20   *zTerm,        
12500 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
12510 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
12520 69 6e 69 6e 67 20 74 65 72 6d 20 2a 2f 0a 20 20  ining term */.  
12530 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 20  int nTerm,      
12540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12550 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20  /* Size of term 
12560 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 6f  in bytes */.  co
12570 6e 73 74 20 63 68 61 72 20 2a 61 44 6f 63 6c 69  nst char *aDocli
12580 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st,           /*
12590 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
125a0 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 64 6f  er containing do
125b0 63 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  clist */.  int n
125c0 44 6f 63 6c 69 73 74 20 20 20 20 20 20 20 20 20  Doclist         
125d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
125e0 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e  ze of doclist in
125f0 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69   bytes */.){.  i
12600 6e 74 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20  nt nPrefix;     
12610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12620 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 70  * Size of term p
12630 72 65 66 69 78 20 69 6e 20 62 79 74 65 73 20 2a  refix in bytes *
12640 2f 0a 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b  /.  int nSuffix;
12650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12660 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
12670 65 72 6d 20 73 75 66 66 69 78 20 69 6e 20 62 79  erm suffix in by
12680 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  tes */.  int nRe
12690 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
126a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
126b0 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75  er of bytes requ
126c0 69 72 65 64 20 6f 6e 20 6c 65 61 66 20 70 61 67  ired on leaf pag
126d0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61  e */.  int nData
126e0 3b 0a 20 20 53 65 67 6d 65 6e 74 57 72 69 74 65  ;.  SegmentWrite
126f0 72 20 2a 70 57 72 69 74 65 72 20 3d 20 2a 70 70  r *pWriter = *pp
12700 57 72 69 74 65 72 3b 0a 0a 20 20 69 66 28 20 21  Writer;..  if( !
12710 70 57 72 69 74 65 72 20 29 7b 0a 20 20 20 20 69  pWriter ){.    i
12720 6e 74 20 72 63 3b 0a 20 20 20 20 73 71 6c 69 74  nt rc;.    sqlit
12730 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
12740 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  .    /* Allocate
12750 20 74 68 65 20 53 65 67 6d 65 6e 74 57 72 69 74   the SegmentWrit
12760 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  er structure */.
12770 20 20 20 20 70 57 72 69 74 65 72 20 3d 20 28 53      pWriter = (S
12780 65 67 6d 65 6e 74 57 72 69 74 65 72 20 2a 29 73  egmentWriter *)s
12790 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
127a0 7a 65 6f 66 28 53 65 67 6d 65 6e 74 57 72 69 74  zeof(SegmentWrit
127b0 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70  er));.    if( !p
127c0 57 72 69 74 65 72 20 29 20 72 65 74 75 72 6e 20  Writer ) return 
127d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
127e0 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65 72    memset(pWriter
127f0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 65 67 6d  , 0, sizeof(Segm
12800 65 6e 74 57 72 69 74 65 72 29 29 3b 0a 20 20 20  entWriter));.   
12810 20 2a 70 70 57 72 69 74 65 72 20 3d 20 70 57 72   *ppWriter = pWr
12820 69 74 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c  iter;..    /* Al
12830 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20  locate a buffer 
12840 69 6e 20 77 68 69 63 68 20 74 6f 20 61 63 63 75  in which to accu
12850 6d 75 6c 61 74 65 20 64 61 74 61 20 2a 2f 0a 20  mulate data */. 
12860 20 20 20 70 57 72 69 74 65 72 2d 3e 61 44 61 74     pWriter->aDat
12870 61 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  a = (char *)sqli
12880 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 2d 3e 6e 4e  te3_malloc(p->nN
12890 6f 64 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  odeSize);.    if
128a0 28 20 21 70 57 72 69 74 65 72 2d 3e 61 44 61 74  ( !pWriter->aDat
128b0 61 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  a ) return SQLIT
128c0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 57 72  E_NOMEM;.    pWr
128d0 69 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 70 2d  iter->nSize = p-
128e0 3e 6e 4e 6f 64 65 53 69 7a 65 3b 0a 0a 20 20 20  >nNodeSize;..   
128f0 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78   /* Find the nex
12900 74 20 66 72 65 65 20 62 6c 6f 63 6b 69 64 20 69  t free blockid i
12910 6e 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73  n the %_segments
12920 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 72 63   table */.    rc
12930 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
12940 2c 20 53 51 4c 5f 4e 45 58 54 5f 53 45 47 4d 45  , SQL_NEXT_SEGME
12950 4e 54 53 5f 49 44 2c 20 26 70 53 74 6d 74 2c 20  NTS_ID, &pStmt, 
12960 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
12970 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
12980 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 53  rn rc;.    if( S
12990 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
129a0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
129b0 7b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d  {.      pWriter-
129c0 3e 69 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33  >iFree = sqlite3
129d0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
129e0 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  tmt, 0);.      p
129f0 57 72 69 74 65 72 2d 3e 69 46 69 72 73 74 20 3d  Writer->iFirst =
12a00 20 70 57 72 69 74 65 72 2d 3e 69 46 72 65 65 3b   pWriter->iFree;
12a10 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
12a20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
12a30 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  tmt);.    if( rc
12a40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
12a50 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6e  turn rc;.  }.  n
12a60 44 61 74 61 20 3d 20 70 57 72 69 74 65 72 2d 3e  Data = pWriter->
12a70 6e 44 61 74 61 3b 0a 0a 20 20 6e 50 72 65 66 69  nData;..  nPrefi
12a80 78 20 3d 20 66 74 73 33 50 72 65 66 69 78 43 6f  x = fts3PrefixCo
12a90 6d 70 72 65 73 73 28 70 57 72 69 74 65 72 2d 3e  mpress(pWriter->
12aa0 7a 54 65 72 6d 2c 20 70 57 72 69 74 65 72 2d 3e  zTerm, pWriter->
12ab0 6e 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54  nTerm, zTerm, nT
12ac0 65 72 6d 29 3b 0a 20 20 6e 53 75 66 66 69 78 20  erm);.  nSuffix 
12ad0 3d 20 6e 54 65 72 6d 2d 6e 50 72 65 66 69 78 3b  = nTerm-nPrefix;
12ae0 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
12af0 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73  t how many bytes
12b00 20 61 72 65 20 72 65 71 75 69 72 65 64 20 62 79   are required by
12b10 20 74 68 69 73 20 6e 65 77 20 65 6e 74 72 79 20   this new entry 
12b20 2a 2f 0a 20 20 6e 52 65 71 20 3d 20 73 71 6c 69  */.  nReq = sqli
12b30 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e  te3Fts3VarintLen
12b40 28 6e 50 72 65 66 69 78 29 20 2b 20 20 20 20 2f  (nPrefix) +    /
12b50 2a 20 76 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e  * varint contain
12b60 69 6e 67 20 70 72 65 66 69 78 20 73 69 7a 65 20  ing prefix size 
12b70 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  */.    sqlite3Ft
12b80 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 53 75 66  s3VarintLen(nSuf
12b90 66 69 78 29 20 2b 20 20 20 20 20 20 20 20 20 2f  fix) +         /
12ba0 2a 20 76 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e  * varint contain
12bb0 69 6e 67 20 73 75 66 66 69 78 20 73 69 7a 65 20  ing suffix size 
12bc0 2a 2f 0a 20 20 20 20 6e 53 75 66 66 69 78 20 2b  */.    nSuffix +
12bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12bf0 2a 20 54 65 72 6d 20 73 75 66 66 69 78 20 2a 2f  * Term suffix */
12c00 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33  .    sqlite3Fts3
12c10 56 61 72 69 6e 74 4c 65 6e 28 6e 44 6f 63 6c 69  VarintLen(nDocli
12c20 73 74 29 20 2b 20 20 20 20 20 20 20 20 2f 2a 20  st) +        /* 
12c30 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20  Size of doclist 
12c40 2a 2f 0a 20 20 20 20 6e 44 6f 63 6c 69 73 74 3b  */.    nDoclist;
12c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12c70 2a 20 44 6f 63 6c 69 73 74 20 64 61 74 61 20 2a  * Doclist data *
12c80 2f 0a 0a 20 20 69 66 28 20 6e 44 61 74 61 3e 30  /..  if( nData>0
12c90 20 26 26 20 6e 44 61 74 61 2b 6e 52 65 71 3e 70   && nData+nReq>p
12ca0 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 29 7b 0a 20  ->nNodeSize ){. 
12cb0 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20     int rc;..    
12cc0 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c  /* The current l
12cd0 65 61 66 20 6e 6f 64 65 20 69 73 20 66 75 6c 6c  eaf node is full
12ce0 2e 20 57 72 69 74 65 20 69 74 20 6f 75 74 20 74  . Write it out t
12cf0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
12d00 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  */.    rc = fts3
12d10 57 72 69 74 65 53 65 67 6d 65 6e 74 28 70 2c 20  WriteSegment(p, 
12d20 70 57 72 69 74 65 72 2d 3e 69 46 72 65 65 2b 2b  pWriter->iFree++
12d30 2c 20 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61  , pWriter->aData
12d40 2c 20 6e 44 61 74 61 29 3b 0a 20 20 20 20 69 66  , nData);.    if
12d50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12d60 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
12d70 20 70 2d 3e 6e 4c 65 61 66 41 64 64 2b 2b 3b 0a   p->nLeafAdd++;.
12d80 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
12d90 63 75 72 72 65 6e 74 20 74 65 72 6d 20 74 6f 20  current term to 
12da0 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64  the interior nod
12db0 65 20 74 72 65 65 2e 20 54 68 65 20 74 65 72 6d  e tree. The term
12dc0 20 61 64 64 65 64 20 74 6f 0a 20 20 20 20 2a 2a   added to.    **
12dd0 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 74 72   the interior tr
12de0 65 65 20 6d 75 73 74 3a 0a 20 20 20 20 2a 2a 0a  ee must:.    **.
12df0 20 20 20 20 2a 2a 20 20 20 61 29 20 62 65 20 67      **   a) be g
12e00 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
12e10 6c 61 72 67 65 73 74 20 74 65 72 6d 20 6f 6e 20  largest term on 
12e20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 6a 75  the leaf node ju
12e30 73 74 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a  st written.    *
12e40 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 64 61  *      to the da
12e50 74 61 62 61 73 65 20 28 73 74 69 6c 6c 20 61 76  tabase (still av
12e60 61 69 6c 61 62 6c 65 20 69 6e 20 70 57 72 69 74  ailable in pWrit
12e70 65 72 2d 3e 7a 54 65 72 6d 29 2c 20 61 6e 64 0a  er->zTerm), and.
12e80 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
12e90 62 29 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  b) be less than 
12ea0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
12eb0 74 65 72 6d 20 61 62 6f 75 74 20 74 6f 20 62 65  term about to be
12ec0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6e 65   added to the ne
12ed0 77 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6c 65  w.    **      le
12ee0 61 66 20 6e 6f 64 65 20 28 7a 54 65 72 6d 2f 6e  af node (zTerm/n
12ef0 54 65 72 6d 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  Term)..    **.  
12f00 20 20 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f    ** In other wo
12f10 72 64 73 2c 20 69 74 20 6d 75 73 74 20 62 65 20  rds, it must be 
12f20 74 68 65 20 70 72 65 66 69 78 20 6f 66 20 7a 54  the prefix of zT
12f30 65 72 6d 20 31 20 62 79 74 65 20 6c 6f 6e 67 65  erm 1 byte longe
12f40 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68  r than.    ** th
12f50 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20  e common prefix 
12f60 28 69 66 20 61 6e 79 29 20 6f 66 20 7a 54 65 72  (if any) of zTer
12f70 6d 20 61 6e 64 20 70 57 72 69 74 65 72 2d 3e 7a  m and pWriter->z
12f80 54 65 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Term..    */.   
12f90 20 61 73 73 65 72 74 28 20 6e 50 72 65 66 69 78   assert( nPrefix
12fa0 3c 6e 54 65 72 6d 20 29 3b 0a 20 20 20 20 72 63  <nTerm );.    rc
12fb0 20 3d 20 66 74 73 33 4e 6f 64 65 41 64 64 54 65   = fts3NodeAddTe
12fc0 72 6d 28 70 2c 20 26 70 57 72 69 74 65 72 2d 3e  rm(p, &pWriter->
12fd0 70 54 72 65 65 2c 20 69 73 43 6f 70 79 54 65 72  pTree, isCopyTer
12fe0 6d 2c 20 7a 54 65 72 6d 2c 20 6e 50 72 65 66 69  m, zTerm, nPrefi
12ff0 78 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63  x+1);.    if( rc
13000 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
13010 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 6e 44  turn rc;..    nD
13020 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 57 72  ata = 0;.    pWr
13030 69 74 65 72 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b  iter->nTerm = 0;
13040 0a 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20  ..    nPrefix = 
13050 30 3b 0a 20 20 20 20 6e 53 75 66 66 69 78 20 3d  0;.    nSuffix =
13060 20 6e 54 65 72 6d 3b 0a 20 20 20 20 6e 52 65 71   nTerm;.    nReq
13070 20 3d 20 31 20 2b 20 20 20 20 20 20 20 20 20 20   = 1 +          
13080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13090 20 20 20 20 2f 2a 20 76 61 72 69 6e 74 20 63 6f      /* varint co
130a0 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69 78 20  ntaining prefix 
130b0 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  size */.      sq
130c0 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c  lite3Fts3VarintL
130d0 65 6e 28 6e 54 65 72 6d 29 20 2b 20 20 20 20 20  en(nTerm) +     
130e0 20 20 20 20 2f 2a 20 76 61 72 69 6e 74 20 63 6f      /* varint co
130f0 6e 74 61 69 6e 69 6e 67 20 73 75 66 66 69 78 20  ntaining suffix 
13100 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 6e 54  size */.      nT
13110 65 72 6d 20 2b 20 20 20 20 20 20 20 20 20 20 20  erm +           
13120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13130 20 20 20 20 2f 2a 20 54 65 72 6d 20 73 75 66 66      /* Term suff
13140 69 78 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ix */.      sqli
13150 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e  te3Fts3VarintLen
13160 28 6e 44 6f 63 6c 69 73 74 29 20 2b 20 20 20 20  (nDoclist) +    
13170 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63    /* Size of doc
13180 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 6e 44  list */.      nD
13190 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20  oclist;         
131a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131b0 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 64      /* Doclist d
131c0 61 74 61 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  ata */.  }..  /*
131d0 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 74 6f   Increase the to
131e0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  tal number of by
131f0 74 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 61  tes written to a
13200 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 6e  ccount for the n
13210 65 77 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 70  ew entry. */.  p
13220 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61 74  Writer->nLeafDat
13230 61 20 2b 3d 20 6e 52 65 71 3b 0a 0a 20 20 2f 2a  a += nReq;..  /*
13240 20 49 66 20 74 68 65 20 62 75 66 66 65 72 20 63   If the buffer c
13250 75 72 72 65 6e 74 6c 79 20 61 6c 6c 6f 63 61 74  urrently allocat
13260 65 64 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20  ed is too small 
13270 66 6f 72 20 74 68 69 73 20 65 6e 74 72 79 2c 20  for this entry, 
13280 72 65 61 6c 6c 6f 63 0a 20 20 2a 2a 20 74 68 65  realloc.  ** the
13290 20 62 75 66 66 65 72 20 74 6f 20 6d 61 6b 65 20   buffer to make 
132a0 69 74 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2e  it large enough.
132b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 52 65 71  .  */.  if( nReq
132c0 3e 70 57 72 69 74 65 72 2d 3e 6e 53 69 7a 65 20  >pWriter->nSize 
132d0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 61 4e 65  ){.    char *aNe
132e0 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
132f0 6c 6f 63 28 70 57 72 69 74 65 72 2d 3e 61 44 61  loc(pWriter->aDa
13300 74 61 2c 20 6e 52 65 71 29 3b 0a 20 20 20 20 69  ta, nReq);.    i
13310 66 28 20 21 61 4e 65 77 20 29 20 72 65 74 75 72  f( !aNew ) retur
13320 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
13330 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61 44 61      pWriter->aDa
13340 74 61 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 70  ta = aNew;.    p
13350 57 72 69 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20  Writer->nSize = 
13360 6e 52 65 71 3b 0a 20 20 7d 0a 20 20 61 73 73 65  nReq;.  }.  asse
13370 72 74 28 20 6e 44 61 74 61 2b 6e 52 65 71 3c 3d  rt( nData+nReq<=
13380 70 57 72 69 74 65 72 2d 3e 6e 53 69 7a 65 20 29  pWriter->nSize )
13390 3b 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74  ;..  /* Append t
133a0 68 65 20 70 72 65 66 69 78 2d 63 6f 6d 70 72 65  he prefix-compre
133b0 73 73 65 64 20 74 65 72 6d 20 61 6e 64 20 64 6f  ssed term and do
133c0 63 6c 69 73 74 20 74 6f 20 74 68 65 20 62 75 66  clist to the buf
133d0 66 65 72 2e 20 2a 2f 0a 20 20 6e 44 61 74 61 20  fer. */.  nData 
133e0 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75  += sqlite3Fts3Pu
133f0 74 56 61 72 69 6e 74 28 26 70 57 72 69 74 65 72  tVarint(&pWriter
13400 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20  ->aData[nData], 
13410 6e 50 72 65 66 69 78 29 3b 0a 20 20 6e 44 61 74  nPrefix);.  nDat
13420 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  a += sqlite3Fts3
13430 50 75 74 56 61 72 69 6e 74 28 26 70 57 72 69 74  PutVarint(&pWrit
13440 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d  er->aData[nData]
13450 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 6d 65  , nSuffix);.  me
13460 6d 63 70 79 28 26 70 57 72 69 74 65 72 2d 3e 61  mcpy(&pWriter->a
13470 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 26 7a 54  Data[nData], &zT
13480 65 72 6d 5b 6e 50 72 65 66 69 78 5d 2c 20 6e 53  erm[nPrefix], nS
13490 75 66 66 69 78 29 3b 0a 20 20 6e 44 61 74 61 20  uffix);.  nData 
134a0 2b 3d 20 6e 53 75 66 66 69 78 3b 0a 20 20 6e 44  += nSuffix;.  nD
134b0 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ata += sqlite3Ft
134c0 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 57 72  s3PutVarint(&pWr
134d0 69 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74  iter->aData[nDat
134e0 61 5d 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20  a], nDoclist);. 
134f0 20 6d 65 6d 63 70 79 28 26 70 57 72 69 74 65 72   memcpy(&pWriter
13500 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20  ->aData[nData], 
13510 61 44 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c 69  aDoclist, nDocli
13520 73 74 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  st);.  pWriter->
13530 6e 44 61 74 61 20 3d 20 6e 44 61 74 61 20 2b 20  nData = nData + 
13540 6e 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 2f 2a 20  nDoclist;..  /* 
13550 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  Save the current
13560 20 74 65 72 6d 20 73 6f 20 74 68 61 74 20 69 74   term so that it
13570 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
13580 70 72 65 66 69 78 2d 63 6f 6d 70 72 65 73 73 20  prefix-compress 
13590 74 68 65 20 6e 65 78 74 2e 0a 20 20 2a 2a 20 49  the next..  ** I
135a0 66 20 74 68 65 20 69 73 43 6f 70 79 54 65 72 6d  f the isCopyTerm
135b0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72   parameter is tr
135c0 75 65 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66  ue, then the buf
135d0 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
135e0 79 0a 20 20 2a 2a 20 7a 54 65 72 6d 20 69 73 20  y.  ** zTerm is 
135f0 74 72 61 6e 73 69 65 6e 74 2c 20 73 6f 20 74 61  transient, so ta
13600 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
13610 20 74 65 72 6d 20 64 61 74 61 2e 20 4f 74 68 65   term data. Othe
13620 72 77 69 73 65 2c 20 6a 75 73 74 0a 20 20 2a 2a  rwise, just.  **
13630 20 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66   store a copy of
13640 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20   the pointer..  
13650 2a 2f 0a 20 20 69 66 28 20 69 73 43 6f 70 79 54  */.  if( isCopyT
13660 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  erm ){.    if( n
13670 54 65 72 6d 3e 70 57 72 69 74 65 72 2d 3e 6e 4d  Term>pWriter->nM
13680 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 63  alloc ){.      c
13690 68 61 72 20 2a 7a 4e 65 77 20 3d 20 73 71 6c 69  har *zNew = sqli
136a0 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 57 72 69  te3_realloc(pWri
136b0 74 65 72 2d 3e 7a 4d 61 6c 6c 6f 63 2c 20 6e 54  ter->zMalloc, nT
136c0 65 72 6d 2a 32 29 3b 0a 20 20 20 20 20 20 69 66  erm*2);.      if
136d0 28 20 21 7a 4e 65 77 20 29 7b 0a 20 20 20 20 20  ( !zNew ){.     
136e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
136f0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
13700 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e        pWriter->n
13710 4d 61 6c 6c 6f 63 20 3d 20 6e 54 65 72 6d 2a 32  Malloc = nTerm*2
13720 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d  ;.      pWriter-
13730 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 7a 4e 65 77 3b  >zMalloc = zNew;
13740 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e  .      pWriter->
13750 7a 54 65 72 6d 20 3d 20 7a 4e 65 77 3b 0a 20 20  zTerm = zNew;.  
13760 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
13770 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d 3d 3d  pWriter->zTerm==
13780 70 57 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c 6f 63  pWriter->zMalloc
13790 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   );.    memcpy(p
137a0 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d 2c 20 7a  Writer->zTerm, z
137b0 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20  Term, nTerm);.  
137c0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 72 69 74  }else{.    pWrit
137d0 65 72 2d 3e 7a 54 65 72 6d 20 3d 20 28 63 68 61  er->zTerm = (cha
137e0 72 20 2a 29 7a 54 65 72 6d 3b 0a 20 20 7d 0a 20  r *)zTerm;.  }. 
137f0 20 70 57 72 69 74 65 72 2d 3e 6e 54 65 72 6d 20   pWriter->nTerm 
13800 3d 20 6e 54 65 72 6d 3b 0a 0a 20 20 72 65 74 75  = nTerm;..  retu
13810 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
13820 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6c 6c  ./*.** Flush all
13830 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64   data associated
13840 20 77 69 74 68 20 74 68 65 20 53 65 67 6d 65 6e   with the Segmen
13850 74 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 70  tWriter object p
13860 57 72 69 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a  Writer to the.**
13870 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20   database. This 
13880 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
13890 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6c   called after al
138a0 6c 20 74 65 72 6d 73 20 68 61 76 65 20 62 65 65  l terms have bee
138b0 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68  n added.** to th
138c0 65 20 73 65 67 6d 65 6e 74 20 75 73 69 6e 67 20  e segment using 
138d0 66 74 73 33 53 65 67 57 72 69 74 65 72 41 64 64  fts3SegWriterAdd
138e0 28 29 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  (). If successfu
138f0 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a  l, SQLITE_OK is.
13900 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  ** returned. Oth
13910 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74  erwise, an SQLit
13920 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
13930 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
13940 53 65 67 57 72 69 74 65 72 46 6c 75 73 68 28 0a  SegWriterFlush(.
13950 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
13960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13970 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
13980 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53  le handle */.  S
13990 65 67 6d 65 6e 74 57 72 69 74 65 72 20 2a 70 57  egmentWriter *pW
139a0 72 69 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f  riter,         /
139b0 2a 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20  * SegmentWriter 
139c0 74 6f 20 66 6c 75 73 68 20 74 6f 20 74 68 65 20  to flush to the 
139d0 64 62 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  db */.  sqlite3_
139e0 69 6e 74 36 34 20 69 4c 65 76 65 6c 2c 20 20 20  int64 iLevel,   
139f0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
13a00 20 66 6f 72 20 27 6c 65 76 65 6c 27 20 63 6f 6c   for 'level' col
13a10 75 6d 6e 20 6f 66 20 25 5f 73 65 67 64 69 72 20  umn of %_segdir 
13a20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 20 20  */.  int iIdx   
13a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a40 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
13a50 72 20 27 69 64 78 27 20 63 6f 6c 75 6d 6e 20 6f  r 'idx' column o
13a60 66 20 25 5f 73 65 67 64 69 72 20 2a 2f 0a 29 7b  f %_segdir */.){
13a70 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
13a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a90 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
13aa0 65 20 2a 2f 0a 20 20 69 66 28 20 70 57 72 69 74  e */.  if( pWrit
13ab0 65 72 2d 3e 70 54 72 65 65 20 29 7b 0a 20 20 20  er->pTree ){.   
13ac0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
13ad0 4c 61 73 74 20 3d 20 30 3b 20 20 20 20 20 20 2f  Last = 0;      /
13ae0 2a 20 4c 61 72 67 65 73 74 20 62 6c 6f 63 6b 20  * Largest block 
13af0 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61  id written to da
13b00 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 73 71  tabase */.    sq
13b10 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 61 73  lite3_int64 iLas
13b20 74 4c 65 61 66 3b 20 20 20 20 20 20 2f 2a 20 4c  tLeaf;      /* L
13b30 61 72 67 65 73 74 20 6c 65 61 66 20 62 6c 6f 63  argest leaf bloc
13b40 6b 20 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20  k id written to 
13b50 64 62 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  db */.    char *
13b60 7a 52 6f 6f 74 20 3d 20 4e 55 4c 4c 3b 20 20 20  zRoot = NULL;   
13b70 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
13b80 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e  er to buffer con
13b90 74 61 69 6e 69 6e 67 20 72 6f 6f 74 20 6e 6f 64  taining root nod
13ba0 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 6f  e */.    int nRo
13bb0 6f 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ot = 0;         
13bc0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
13bd0 66 20 62 75 66 66 65 72 20 7a 52 6f 6f 74 20 2a  f buffer zRoot *
13be0 2f 0a 0a 20 20 20 20 69 4c 61 73 74 4c 65 61 66  /..    iLastLeaf
13bf0 20 3d 20 70 57 72 69 74 65 72 2d 3e 69 46 72 65   = pWriter->iFre
13c00 65 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  e;.    rc = fts3
13c10 57 72 69 74 65 53 65 67 6d 65 6e 74 28 70 2c 20  WriteSegment(p, 
13c20 70 57 72 69 74 65 72 2d 3e 69 46 72 65 65 2b 2b  pWriter->iFree++
13c30 2c 20 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61  , pWriter->aData
13c40 2c 20 70 57 72 69 74 65 72 2d 3e 6e 44 61 74 61  , pWriter->nData
13c50 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
13c60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13c70 20 20 72 63 20 3d 20 66 74 73 33 4e 6f 64 65 57    rc = fts3NodeW
13c80 72 69 74 65 28 70 2c 20 70 57 72 69 74 65 72 2d  rite(p, pWriter-
13c90 3e 70 54 72 65 65 2c 20 31 2c 0a 20 20 20 20 20  >pTree, 1,.     
13ca0 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 46       pWriter->iF
13cb0 69 72 73 74 2c 20 70 57 72 69 74 65 72 2d 3e 69  irst, pWriter->i
13cc0 46 72 65 65 2c 20 26 69 4c 61 73 74 2c 20 26 7a  Free, &iLast, &z
13cd0 52 6f 6f 74 2c 20 26 6e 52 6f 6f 74 29 3b 0a 20  Root, &nRoot);. 
13ce0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
13cf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13d00 20 20 20 20 72 63 20 3d 20 66 74 73 33 57 72 69      rc = fts3Wri
13d10 74 65 53 65 67 64 69 72 28 70 2c 20 69 4c 65 76  teSegdir(p, iLev
13d20 65 6c 2c 20 69 49 64 78 2c 20 0a 20 20 20 20 20  el, iIdx, .     
13d30 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 46       pWriter->iF
13d40 69 72 73 74 2c 20 69 4c 61 73 74 4c 65 61 66 2c  irst, iLastLeaf,
13d50 20 69 4c 61 73 74 2c 20 70 57 72 69 74 65 72 2d   iLast, pWriter-
13d60 3e 6e 4c 65 61 66 44 61 74 61 2c 20 7a 52 6f 6f  >nLeafData, zRoo
13d70 74 2c 20 6e 52 6f 6f 74 29 3b 0a 20 20 20 20 7d  t, nRoot);.    }
13d80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
13d90 20 54 68 65 20 65 6e 74 69 72 65 20 74 72 65 65   The entire tree
13da0 20 66 69 74 73 20 6f 6e 20 74 68 65 20 72 6f 6f   fits on the roo
13db0 74 20 6e 6f 64 65 2e 20 57 72 69 74 65 20 69 74  t node. Write it
13dc0 20 74 6f 20 74 68 65 20 73 65 67 64 69 72 20 74   to the segdir t
13dd0 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20  able. */.    rc 
13de0 3d 20 66 74 73 33 57 72 69 74 65 53 65 67 64 69  = fts3WriteSegdi
13df0 72 28 70 2c 20 69 4c 65 76 65 6c 2c 20 69 49 64  r(p, iLevel, iId
13e00 78 2c 20 0a 20 20 20 20 20 20 20 20 30 2c 20 30  x, .        0, 0
13e10 2c 20 30 2c 20 70 57 72 69 74 65 72 2d 3e 6e 4c  , 0, pWriter->nL
13e20 65 61 66 44 61 74 61 2c 20 70 57 72 69 74 65 72  eafData, pWriter
13e30 2d 3e 61 44 61 74 61 2c 20 70 57 72 69 74 65 72  ->aData, pWriter
13e40 2d 3e 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20  ->nData);.  }.  
13e50 70 2d 3e 6e 4c 65 61 66 41 64 64 2b 2b 3b 0a 20  p->nLeafAdd++;. 
13e60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
13e70 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c  *.** Release all
13e80 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20   memory held by 
13e90 74 68 65 20 53 65 67 6d 65 6e 74 57 72 69 74 65  the SegmentWrite
13ea0 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
13eb0 61 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74  as the .** first
13ec0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
13ed0 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 53 65  atic void fts3Se
13ee0 67 57 72 69 74 65 72 46 72 65 65 28 53 65 67 6d  gWriterFree(Segm
13ef0 65 6e 74 57 72 69 74 65 72 20 2a 70 57 72 69 74  entWriter *pWrit
13f00 65 72 29 7b 0a 20 20 69 66 28 20 70 57 72 69 74  er){.  if( pWrit
13f10 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
13f20 33 5f 66 72 65 65 28 70 57 72 69 74 65 72 2d 3e  3_free(pWriter->
13f30 61 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69  aData);.    sqli
13f40 74 65 33 5f 66 72 65 65 28 70 57 72 69 74 65 72  te3_free(pWriter
13f50 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  ->zMalloc);.    
13f60 66 74 73 33 4e 6f 64 65 46 72 65 65 28 70 57 72  fts3NodeFree(pWr
13f70 69 74 65 72 2d 3e 70 54 72 65 65 29 3b 0a 20 20  iter->pTree);.  
13f80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
13f90 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  Writer);.  }.}..
13fa0 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
13fb0 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61 70 56  value in the apV
13fc0 61 6c 5b 5d 20 61 72 72 61 79 20 69 73 20 61 73  al[] array is as
13fd0 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  sumed to contain
13fe0 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 20   an integer..** 
13ff0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 65  This function te
14000 73 74 73 20 69 66 20 74 68 65 72 65 20 65 78 69  sts if there exi
14010 73 74 20 61 6e 79 20 64 6f 63 75 6d 65 6e 74 73  st any documents
14020 20 77 69 74 68 20 64 6f 63 69 64 20 76 61 6c 75   with docid valu
14030 65 73 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 64  es that.** are d
14040 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
14050 61 74 20 69 6e 74 65 67 65 72 2e 20 69 2e 65 2e  at integer. i.e.
14060 20 69 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65   if deleting the
14070 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 64   document with d
14080 6f 63 69 64 0a 2a 2a 20 70 52 6f 77 69 64 20 77  ocid.** pRowid w
14090 6f 75 6c 64 20 6d 65 61 6e 20 74 68 65 20 46 54  ould mean the FT
140a0 53 33 20 74 61 62 6c 65 20 77 65 72 65 20 65 6d  S3 table were em
140b0 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  pty..**.** If su
140c0 63 63 65 73 73 66 75 6c 2c 20 2a 70 69 73 45 6d  ccessful, *pisEm
140d0 70 74 79 20 69 73 20 73 65 74 20 74 6f 20 74 72  pty is set to tr
140e0 75 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ue if the table 
140f0 69 73 20 65 6d 70 74 79 20 65 78 63 65 70 74 20  is empty except 
14100 66 6f 72 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 20  for.** document 
14110 70 52 6f 77 69 64 2c 20 6f 72 20 66 61 6c 73 65  pRowid, or false
14120 20 6f 74 68 65 72 77 69 73 65 2c 20 61 6e 64 20   otherwise, and 
14130 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
14140 75 72 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20  urned. If an.** 
14150 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
14160 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
14170 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
14180 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
14190 73 33 49 73 45 6d 70 74 79 28 46 74 73 33 54 61  s3IsEmpty(Fts3Ta
141a0 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  ble *p, sqlite3_
141b0 76 61 6c 75 65 20 2a 70 52 6f 77 69 64 2c 20 69  value *pRowid, i
141c0 6e 74 20 2a 70 69 73 45 6d 70 74 79 29 7b 0a 20  nt *pisEmpty){. 
141d0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
141e0 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Stmt;.  int rc;.
141f0 20 20 69 66 28 20 70 2d 3e 7a 43 6f 6e 74 65 6e    if( p->zConten
14200 74 54 62 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 49  tTbl ){.    /* I
14210 66 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6e 74  f using the cont
14220 65 6e 74 3d 78 78 78 20 6f 70 74 69 6f 6e 2c 20  ent=xxx option, 
14230 61 73 73 75 6d 65 20 74 68 65 20 74 61 62 6c 65  assume the table
14240 20 69 73 20 6e 65 76 65 72 20 65 6d 70 74 79 20   is never empty 
14250 2a 2f 0a 20 20 20 20 2a 70 69 73 45 6d 70 74 79  */.    *pisEmpty
14260 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 53   = 0;.    rc = S
14270 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
14280 65 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  e{.    rc = fts3
14290 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 49  SqlStmt(p, SQL_I
142a0 53 5f 45 4d 50 54 59 2c 20 26 70 53 74 6d 74 2c  S_EMPTY, &pStmt,
142b0 20 26 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 69   &pRowid);.    i
142c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
142d0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51   ){.      if( SQ
142e0 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
142f0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
14300 0a 20 20 20 20 20 20 20 20 2a 70 69 73 45 6d 70  .        *pisEmp
14310 74 79 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ty = sqlite3_col
14320 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30  umn_int(pStmt, 0
14330 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
14340 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
14350 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  set(pStmt);.    
14360 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
14370 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
14380 2a 70 6e 4d 61 78 20 74 6f 20 74 68 65 20 6c 61  *pnMax to the la
14390 72 67 65 73 74 20 73 65 67 6d 65 6e 74 20 6c 65  rgest segment le
143a0 76 65 6c 20 69 6e 20 74 68 65 20 64 61 74 61 62  vel in the datab
143b0 61 73 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65  ase for the inde
143c0 78 0a 2a 2a 20 69 49 6e 64 65 78 2e 0a 2a 2a 0a  x.** iIndex..**.
143d0 2a 2a 20 53 65 67 6d 65 6e 74 20 6c 65 76 65 6c  ** Segment level
143e0 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
143f0 74 68 65 20 27 6c 65 76 65 6c 27 20 63 6f 6c 75  the 'level' colu
14400 6d 6e 20 6f 66 20 74 68 65 20 25 5f 73 65 67 64  mn of the %_segd
14410 69 72 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ir table..**.** 
14420 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
14430 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
14440 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
14450 6f 72 20 63 6f 64 65 20 69 66 20 6e 6f 74 2e 0a  or code if not..
14460 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
14470 73 33 53 65 67 6d 65 6e 74 4d 61 78 4c 65 76 65  s3SegmentMaxLeve
14480 6c 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  l(.  Fts3Table *
14490 70 2c 20 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69  p, .  int iLangi
144a0 64 2c 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 2c  d,.  int iIndex,
144b0 20 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36   .  sqlite3_int6
144c0 34 20 2a 70 6e 4d 61 78 0a 29 7b 0a 20 20 73 71  4 *pnMax.){.  sq
144d0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
144e0 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  t;.  int rc;.  a
144f0 73 73 65 72 74 28 20 69 49 6e 64 65 78 3e 3d 30  ssert( iIndex>=0
14500 20 26 26 20 69 49 6e 64 65 78 3c 70 2d 3e 6e 49   && iIndex<p->nI
14510 6e 64 65 78 20 29 3b 0a 0a 20 20 2f 2a 20 53 65  ndex );..  /* Se
14520 74 20 70 53 74 6d 74 20 74 6f 20 74 68 65 20 63  t pStmt to the c
14530 6f 6d 70 69 6c 65 64 20 76 65 72 73 69 6f 6e 20  ompiled version 
14540 6f 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  of:.  **.  **   
14550 53 45 4c 45 43 54 20 6d 61 78 28 6c 65 76 65 6c  SELECT max(level
14560 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65  ) FROM %Q.'%q_se
14570 67 64 69 72 27 20 57 48 45 52 45 20 6c 65 76 65  gdir' WHERE leve
14580 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20  l BETWEEN ? AND 
14590 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 31 30 32  ?.  **.  ** (102
145a0 34 20 69 73 20 61 63 74 75 61 6c 6c 79 20 74 68  4 is actually th
145b0 65 20 76 61 6c 75 65 20 6f 66 20 6d 61 63 72 6f  e value of macro
145c0 20 46 54 53 33 5f 53 45 47 44 49 52 5f 50 52 45   FTS3_SEGDIR_PRE
145d0 46 49 58 4c 45 56 45 4c 5f 53 54 52 29 2e 0a 20  FIXLEVEL_STR).. 
145e0 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73 33 53   */.  rc = fts3S
145f0 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45  qlStmt(p, SQL_SE
14600 4c 45 43 54 5f 53 45 47 44 49 52 5f 4d 41 58 5f  LECT_SEGDIR_MAX_
14610 4c 45 56 45 4c 2c 20 26 70 53 74 6d 74 2c 20 30  LEVEL, &pStmt, 0
14620 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
14630 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
14640 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69  rc;.  sqlite3_bi
14650 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  nd_int64(pStmt, 
14660 31 2c 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65  1, getAbsoluteLe
14670 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20  vel(p, iLangid, 
14680 69 49 6e 64 65 78 2c 20 30 29 29 3b 0a 20 20 73  iIndex, 0));.  s
14690 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
146a0 34 28 70 53 74 6d 74 2c 20 32 2c 20 0a 20 20 20  4(pStmt, 2, .   
146b0 20 20 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65     getAbsoluteLe
146c0 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20  vel(p, iLangid, 
146d0 69 49 6e 64 65 78 2c 20 46 54 53 33 5f 53 45 47  iIndex, FTS3_SEG
146e0 44 49 52 5f 4d 41 58 4c 45 56 45 4c 2d 31 29 0a  DIR_MAXLEVEL-1).
146f0 20 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54    );.  if( SQLIT
14700 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
14710 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
14720 20 20 2a 70 6e 4d 61 78 20 3d 20 73 71 6c 69 74    *pnMax = sqlit
14730 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
14740 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20  pStmt, 0);.  }. 
14750 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
14760 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 7d 0a  reset(pStmt);.}.
14770 0a 2f 2a 0a 2a 2a 20 69 41 62 73 4c 65 76 65 6c  ./*.** iAbsLevel
14780 20 69 73 20 61 6e 20 61 62 73 6f 6c 75 74 65 20   is an absolute 
14790 6c 65 76 65 6c 20 74 68 61 74 20 6d 61 79 20 62  level that may b
147a0 65 20 61 73 73 75 6d 65 64 20 74 6f 20 65 78 69  e assumed to exi
147b0 73 74 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65  st within.** the
147c0 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20   database. This 
147d0 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
147e0 69 66 20 69 74 20 69 73 20 74 68 65 20 6c 61 72  if it is the lar
147f0 67 65 73 74 20 6c 65 76 65 6c 20 6e 75 6d 62 65  gest level numbe
14800 72 0a 2a 2a 20 77 69 74 68 69 6e 20 69 74 73 20  r.** within its 
14810 69 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e 67 20  index. Assuming 
14820 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
14830 20 2a 70 62 4d 61 78 20 69 73 20 73 65 74 20 74   *pbMax is set t
14840 6f 20 31 20 69 66 0a 2a 2a 20 69 41 62 73 4c 65  o 1 if.** iAbsLe
14850 76 65 6c 20 69 73 20 69 6e 64 65 65 64 20 74 68  vel is indeed th
14860 65 20 6c 61 72 67 65 73 74 20 6c 65 76 65 6c 2c  e largest level,
14870 20 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65 2c   or 0 otherwise,
14880 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a   and SQLITE_OK.*
14890 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  * is returned. I
148a0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
148b0 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
148c0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
148d0 20 74 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 76 61   the.** final va
148e0 6c 75 65 20 6f 66 20 2a 70 62 4d 61 78 20 69 73  lue of *pbMax is
148f0 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73   undefined..*/.s
14900 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65  tatic int fts3Se
14910 67 6d 65 6e 74 49 73 4d 61 78 4c 65 76 65 6c 28  gmentIsMaxLevel(
14920 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 69 36  Fts3Table *p, i6
14930 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 69 6e 74  4 iAbsLevel, int
14940 20 2a 70 62 4d 61 78 29 7b 0a 0a 20 20 2f 2a 20   *pbMax){..  /* 
14950 53 65 74 20 70 53 74 6d 74 20 74 6f 20 74 68 65  Set pStmt to the
14960 20 63 6f 6d 70 69 6c 65 64 20 76 65 72 73 69 6f   compiled versio
14970 6e 20 6f 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  n of:.  **.  ** 
14980 20 20 53 45 4c 45 43 54 20 6d 61 78 28 6c 65 76    SELECT max(lev
14990 65 6c 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  el) FROM %Q.'%q_
149a0 73 65 67 64 69 72 27 20 57 48 45 52 45 20 6c 65  segdir' WHERE le
149b0 76 65 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e  vel BETWEEN ? AN
149c0 44 20 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 31  D ?.  **.  ** (1
149d0 30 32 34 20 69 73 20 61 63 74 75 61 6c 6c 79 20  024 is actually 
149e0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 61 63  the value of mac
149f0 72 6f 20 46 54 53 33 5f 53 45 47 44 49 52 5f 50  ro FTS3_SEGDIR_P
14a00 52 45 46 49 58 4c 45 56 45 4c 5f 53 54 52 29 2e  REFIXLEVEL_STR).
14a10 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
14a20 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
14a30 6e 74 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  nt rc = fts3SqlS
14a40 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43  tmt(p, SQL_SELEC
14a50 54 5f 53 45 47 44 49 52 5f 4d 41 58 5f 4c 45 56  T_SEGDIR_MAX_LEV
14a60 45 4c 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  EL, &pStmt, 0);.
14a70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14a80 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
14a90 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
14aa0 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20  int64(pStmt, 1, 
14ab0 69 41 62 73 4c 65 76 65 6c 2b 31 29 3b 0a 20 20  iAbsLevel+1);.  
14ac0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
14ad0 36 34 28 70 53 74 6d 74 2c 20 32 2c 20 0a 20 20  64(pStmt, 2, .  
14ae0 20 20 20 20 28 28 69 41 62 73 4c 65 76 65 6c 2f      ((iAbsLevel/
14af0 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c  FTS3_SEGDIR_MAXL
14b00 45 56 45 4c 29 2b 31 29 20 2a 20 46 54 53 33 5f  EVEL)+1) * FTS3_
14b10 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 0a  SEGDIR_MAXLEVEL.
14b20 20 20 29 3b 0a 0a 20 20 2a 70 62 4d 61 78 20 3d    );..  *pbMax =
14b30 20 30 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45   0;.  if( SQLITE
14b40 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
14b50 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
14b60 20 2a 70 62 4d 61 78 20 3d 20 73 71 6c 69 74 65   *pbMax = sqlite
14b70 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53  3_column_type(pS
14b80 74 6d 74 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f  tmt, 0)==SQLITE_
14b90 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  NULL;.  }.  retu
14ba0 72 6e 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74  rn sqlite3_reset
14bb0 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pStmt);.}../*.*
14bc0 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 65 6e 74  * Delete all ent
14bd0 72 69 65 73 20 69 6e 20 74 68 65 20 25 5f 73 65  ries in the %_se
14be0 67 6d 65 6e 74 73 20 74 61 62 6c 65 20 61 73 73  gments table ass
14bf0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
14c00 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 6f 70 65 6e   segment.** open
14c10 65 64 20 77 69 74 68 20 73 65 67 2d 72 65 61 64  ed with seg-read
14c20 65 72 20 70 53 65 67 2e 20 54 68 69 73 20 66 75  er pSeg. This fu
14c30 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
14c40 61 66 66 65 63 74 20 74 68 65 20 63 6f 6e 74 65  affect the conte
14c50 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 25 5f  nts.** of the %_
14c60 73 65 67 64 69 72 20 74 61 62 6c 65 2e 0a 2a 2f  segdir table..*/
14c70 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
14c80 44 65 6c 65 74 65 53 65 67 6d 65 6e 74 28 0a 20  DeleteSegment(. 
14c90 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
14ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cb0 20 2f 2a 20 46 54 53 20 74 61 62 6c 65 20 68 61   /* FTS table ha
14cc0 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 53 65  ndle */.  Fts3Se
14cd0 67 52 65 61 64 65 72 20 2a 70 53 65 67 20 20 20  gReader *pSeg   
14ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67            /* Seg
14cf0 6d 65 6e 74 20 74 6f 20 64 65 6c 65 74 65 20 2a  ment to delete *
14d00 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
14d10 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
14d20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
14d30 20 63 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20 70   code */.  if( p
14d40 53 65 67 2d 3e 69 53 74 61 72 74 42 6c 6f 63 6b  Seg->iStartBlock
14d50 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
14d60 73 74 6d 74 20 2a 70 44 65 6c 65 74 65 3b 20 20  stmt *pDelete;  
14d70 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61        /* SQL sta
14d80 74 65 6d 65 6e 74 20 74 6f 20 64 65 6c 65 74 65  tement to delete
14d90 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 72 63 20   rows */.    rc 
14da0 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
14db0 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 4d   SQL_DELETE_SEGM
14dc0 45 4e 54 53 5f 52 41 4e 47 45 2c 20 26 70 44 65  ENTS_RANGE, &pDe
14dd0 6c 65 74 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  lete, 0);.    if
14de0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
14df0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14e00 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c  _bind_int64(pDel
14e10 65 74 65 2c 20 31 2c 20 70 53 65 67 2d 3e 69 53  ete, 1, pSeg->iS
14e20 74 61 72 74 42 6c 6f 63 6b 29 3b 0a 20 20 20 20  tartBlock);.    
14e30 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
14e40 6e 74 36 34 28 70 44 65 6c 65 74 65 2c 20 32 2c  nt64(pDelete, 2,
14e50 20 70 53 65 67 2d 3e 69 45 6e 64 42 6c 6f 63 6b   pSeg->iEndBlock
14e60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14e70 5f 73 74 65 70 28 70 44 65 6c 65 74 65 29 3b 0a  _step(pDelete);.
14e80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14e90 65 33 5f 72 65 73 65 74 28 70 44 65 6c 65 74 65  e3_reset(pDelete
14ea0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
14eb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14ec0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
14ed0 20 69 73 20 75 73 65 64 20 61 66 74 65 72 20 6d   is used after m
14ee0 65 72 67 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20  erging multiple 
14ef0 73 65 67 6d 65 6e 74 73 20 69 6e 74 6f 20 61 20  segments into a 
14f00 73 69 6e 67 6c 65 20 6c 61 72 67 65 0a 2a 2a 20  single large.** 
14f10 73 65 67 6d 65 6e 74 20 74 6f 20 64 65 6c 65 74  segment to delet
14f20 65 20 74 68 65 20 6f 6c 64 2c 20 6e 6f 77 20 72  e the old, now r
14f30 65 64 75 6e 64 61 6e 74 2c 20 73 65 67 6d 65 6e  edundant, segmen
14f40 74 20 62 2d 74 72 65 65 73 2e 20 53 70 65 63 69  t b-trees. Speci
14f50 66 69 63 61 6c 6c 79 2c 0a 2a 2a 20 69 74 3a 0a  fically,.** it:.
14f60 2a 2a 20 0a 2a 2a 20 20 20 31 29 20 44 65 6c 65  ** .**   1) Dele
14f70 74 65 73 20 61 6c 6c 20 25 5f 73 65 67 6d 65 6e  tes all %_segmen
14f80 74 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  ts entries for t
14f90 68 65 20 73 65 67 6d 65 6e 74 73 20 61 73 73 6f  he segments asso
14fa0 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20  ciated with .** 
14fb0 20 20 20 20 20 65 61 63 68 20 6f 66 20 74 68 65       each of the
14fc0 20 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63   SegReader objec
14fd0 74 73 20 69 6e 20 74 68 65 20 61 72 72 61 79 20  ts in the array 
14fe0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 74 68  passed as the th
14ff0 69 72 64 20 0a 2a 2a 20 20 20 20 20 20 61 72 67  ird .**      arg
15000 75 6d 65 6e 74 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  ument, and.**.**
15010 20 20 20 32 29 20 64 65 6c 65 74 65 73 20 61 6c     2) deletes al
15020 6c 20 25 5f 73 65 67 64 69 72 20 65 6e 74 72 69  l %_segdir entri
15030 65 73 20 77 69 74 68 20 6c 65 76 65 6c 20 69 4c  es with level iL
15040 65 76 65 6c 2c 20 6f 72 20 61 6c 6c 20 25 5f 73  evel, or all %_s
15050 65 67 64 69 72 0a 2a 2a 20 20 20 20 20 20 65 6e  egdir.**      en
15060 74 72 69 65 73 20 72 65 67 61 72 64 6c 65 73 73  tries regardless
15070 20 6f 66 20 6c 65 76 65 6c 20 69 66 20 28 69 4c   of level if (iL
15080 65 76 65 6c 3c 30 29 2e 0a 2a 2a 0a 2a 2a 20 53  evel<0)..**.** S
15090 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
150a0 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73 66  rned if successf
150b0 75 6c 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e  ul, otherwise an
150c0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
150d0 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
150e0 74 20 66 74 73 33 44 65 6c 65 74 65 53 65 67 64  t fts3DeleteSegd
150f0 69 72 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  ir(.  Fts3Table 
15100 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
15110 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c        /* Virtual
15120 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   table handle */
15130 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20  .  int iLangid, 
15140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15150 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69     /* Language i
15160 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65  d */.  int iInde
15170 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
15180 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
15190 66 6f 72 20 70 2d 3e 61 49 6e 64 65 78 20 2a 2f  for p->aIndex */
151a0 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20  .  int iLevel,  
151b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151c0 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 20 25     /* Level of %
151d0 5f 73 65 67 64 69 72 20 65 6e 74 72 69 65 73 20  _segdir entries 
151e0 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 46  to delete */.  F
151f0 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a 61  ts3SegReader **a
15200 70 53 65 67 6d 65 6e 74 2c 20 20 20 20 20 20 2f  pSegment,      /
15210 2a 20 41 72 72 61 79 20 6f 66 20 53 65 67 52 65  * Array of SegRe
15220 61 64 65 72 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  ader objects */.
15230 20 20 69 6e 74 20 6e 52 65 61 64 65 72 20 20 20    int nReader   
15240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15250 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72    /* Size of arr
15260 61 79 20 61 70 53 65 67 6d 65 6e 74 20 2a 2f 0a  ay apSegment */.
15270 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
15280 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
15290 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
152a0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ode */.  int i; 
152b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
152d0 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
152e0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
152f0 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 20  *pDelete = 0;   
15300 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d     /* SQL statem
15310 65 6e 74 20 74 6f 20 64 65 6c 65 74 65 20 72 6f  ent to delete ro
15320 77 73 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 30  ws */..  for(i=0
15330 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
15340 26 26 20 69 3c 6e 52 65 61 64 65 72 3b 20 69 2b  && i<nReader; i+
15350 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73  +){.    rc = fts
15360 33 44 65 6c 65 74 65 53 65 67 6d 65 6e 74 28 70  3DeleteSegment(p
15370 2c 20 61 70 53 65 67 6d 65 6e 74 5b 69 5d 29 3b  , apSegment[i]);
15380 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
15390 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
153a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
153b0 20 20 61 73 73 65 72 74 28 20 69 4c 65 76 65 6c    assert( iLevel
153c0 3e 3d 30 20 7c 7c 20 69 4c 65 76 65 6c 3d 3d 46  >=0 || iLevel==F
153d0 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c  TS3_SEGCURSOR_AL
153e0 4c 20 29 3b 0a 20 20 69 66 28 20 69 4c 65 76 65  L );.  if( iLeve
153f0 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f  l==FTS3_SEGCURSO
15400 52 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20  R_ALL ){.    rc 
15410 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
15420 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 44   SQL_DELETE_SEGD
15430 49 52 5f 52 41 4e 47 45 2c 20 26 70 44 65 6c 65  IR_RANGE, &pDele
15440 74 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  te, 0);.    if( 
15450 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15460 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
15470 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c 65 74  ind_int64(pDelet
15480 65 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c 75 74  e, 1, getAbsolut
15490 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69  eLevel(p, iLangi
154a0 64 2c 20 69 49 6e 64 65 78 2c 20 30 29 29 3b 0a  d, iIndex, 0));.
154b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
154c0 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c 65 74 65  nd_int64(pDelete
154d0 2c 20 32 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 2, .          
154e0 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c  getAbsoluteLevel
154f0 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e  (p, iLangid, iIn
15500 64 65 78 2c 20 46 54 53 33 5f 53 45 47 44 49 52  dex, FTS3_SEGDIR
15510 5f 4d 41 58 4c 45 56 45 4c 2d 31 29 0a 20 20 20  _MAXLEVEL-1).   
15520 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65     );.    }.  }e
15530 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  lse{.    rc = ft
15540 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
15550 5f 44 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 4c  _DELETE_SEGDIR_L
15560 45 56 45 4c 2c 20 26 70 44 65 6c 65 74 65 2c 20  EVEL, &pDelete, 
15570 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
15580 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15590 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
155a0 69 6e 74 36 34 28 0a 20 20 20 20 20 20 20 20 20  int64(.         
155b0 20 70 44 65 6c 65 74 65 2c 20 31 2c 20 67 65 74   pDelete, 1, get
155c0 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c  AbsoluteLevel(p,
155d0 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78   iLangid, iIndex
155e0 2c 20 69 4c 65 76 65 6c 29 0a 20 20 20 20 20 20  , iLevel).      
155f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
15600 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15610 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
15620 5f 73 74 65 70 28 70 44 65 6c 65 74 65 29 3b 0a  _step(pDelete);.
15630 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15640 5f 72 65 73 65 74 28 70 44 65 6c 65 74 65 29 3b  _reset(pDelete);
15650 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
15660 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  c;.}../*.** When
15670 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
15680 73 20 63 61 6c 6c 65 64 2c 20 62 75 66 66 65 72  s called, buffer
15690 20 2a 70 70 4c 69 73 74 20 28 73 69 7a 65 20 2a   *ppList (size *
156a0 70 6e 4c 69 73 74 20 62 79 74 65 73 29 20 63 6f  pnList bytes) co
156b0 6e 74 61 69 6e 73 20 0a 2a 2a 20 61 20 70 6f 73  ntains .** a pos
156c0 69 74 69 6f 6e 20 6c 69 73 74 20 74 68 61 74 20  ition list that 
156d0 6d 61 79 20 28 6f 72 20 6d 61 79 20 6e 6f 74 29  may (or may not)
156e0 20 66 65 61 74 75 72 65 20 6d 75 6c 74 69 70 6c   feature multipl
156f0 65 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 0a  e columns. This.
15700 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 64 6a 75  ** function adju
15710 73 74 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  sts the pointer 
15720 2a 70 70 4c 69 73 74 20 61 6e 64 20 74 68 65 20  *ppList and the 
15730 6c 65 6e 67 74 68 20 2a 70 6e 4c 69 73 74 20 73  length *pnList s
15740 6f 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 69  o that they.** i
15750 64 65 6e 74 69 66 79 20 74 68 65 20 73 75 62 73  dentify the subs
15760 65 74 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69  et of the positi
15770 6f 6e 20 6c 69 73 74 20 74 68 61 74 20 63 6f 72  on list that cor
15780 72 65 73 70 6f 6e 64 73 20 74 6f 20 63 6f 6c 75  responds to colu
15790 6d 6e 20 69 43 6f 6c 2e 0a 2a 2a 0a 2a 2a 20 49  mn iCol..**.** I
157a0 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 65  f there are no e
157b0 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 69 6e  ntries in the in
157c0 70 75 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  put position lis
157d0 74 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f  t for column iCo
157e0 6c 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 6e 4c 69  l, then.** *pnLi
157f0 73 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  st is set to zer
15800 6f 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  o before returni
15810 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ng..**.** If par
15820 61 6d 65 74 65 72 20 62 5a 65 72 6f 20 69 73 20  ameter bZero is 
15830 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
15840 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  ny part of the i
15850 6e 70 75 74 20 6c 69 73 74 20 66 6f 6c 6c 6f 77  nput list follow
15860 69 6e 67 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f  ing.** the end o
15870 66 20 74 68 65 20 6f 75 74 70 75 74 20 6c 69 73  f the output lis
15880 74 20 69 73 20 7a 65 72 6f 65 64 20 62 65 66 6f  t is zeroed befo
15890 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
158a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
158b0 33 43 6f 6c 75 6d 6e 46 69 6c 74 65 72 28 0a 20  3ColumnFilter(. 
158c0 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20   int iCol,      
158d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158e0 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 66 69   /* Column to fi
158f0 6c 74 65 72 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74  lter on */.  int
15900 20 62 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20   bZero,         
15910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15920 5a 65 72 6f 20 6f 75 74 20 61 6e 79 74 68 69 6e  Zero out anythin
15930 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 70 70 4c  g following *ppL
15940 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ist */.  char **
15950 70 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  ppList,         
15960 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
15970 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70  UT: Pointer to p
15980 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  osition list */.
15990 20 20 69 6e 74 20 2a 70 6e 4c 69 73 74 20 20 20    int *pnList   
159a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159b0 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 69 7a    /* IN/OUT: Siz
159c0 65 20 6f 66 20 62 75 66 66 65 72 20 2a 70 70 4c  e of buffer *ppL
159d0 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ist in bytes */.
159e0 29 7b 0a 20 20 63 68 61 72 20 2a 70 4c 69 73 74  ){.  char *pList
159f0 20 3d 20 2a 70 70 4c 69 73 74 3b 0a 20 20 69 6e   = *ppList;.  in
15a00 74 20 6e 4c 69 73 74 20 3d 20 2a 70 6e 4c 69 73  t nList = *pnLis
15a10 74 3b 0a 20 20 63 68 61 72 20 2a 70 45 6e 64 20  t;.  char *pEnd 
15a20 3d 20 26 70 4c 69 73 74 5b 6e 4c 69 73 74 5d 3b  = &pList[nList];
15a30 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20  .  int iCurrent 
15a40 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 70 20 3d  = 0;.  char *p =
15a50 20 70 4c 69 73 74 3b 0a 0a 20 20 61 73 73 65 72   pList;..  asser
15a60 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20  t( iCol>=0 );.  
15a70 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
15a80 63 68 61 72 20 63 20 3d 20 30 3b 0a 20 20 20 20  char c = 0;.    
15a90 77 68 69 6c 65 28 20 70 3c 70 45 6e 64 20 26 26  while( p<pEnd &&
15aa0 20 28 63 20 7c 20 2a 70 29 26 30 78 46 45 20 29   (c | *p)&0xFE )
15ab0 20 63 20 3d 20 2a 70 2b 2b 20 26 20 30 78 38 30   c = *p++ & 0x80
15ac0 3b 0a 20 20 0a 20 20 20 20 69 66 28 20 69 43 6f  ;.  .    if( iCo
15ad0 6c 3d 3d 69 43 75 72 72 65 6e 74 20 29 7b 0a 20  l==iCurrent ){. 
15ae0 20 20 20 20 20 6e 4c 69 73 74 20 3d 20 28 69 6e       nList = (in
15af0 74 29 28 70 20 2d 20 70 4c 69 73 74 29 3b 0a 20  t)(p - pList);. 
15b00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15b10 7d 0a 0a 20 20 20 20 6e 4c 69 73 74 20 2d 3d 20  }..    nList -= 
15b20 28 69 6e 74 29 28 70 20 2d 20 70 4c 69 73 74 29  (int)(p - pList)
15b30 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b  ;.    pList = p;
15b40 0a 20 20 20 20 69 66 28 20 6e 4c 69 73 74 3d 3d  .    if( nList==
15b50 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 ){.      break
15b60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20  ;.    }.    p = 
15b70 26 70 4c 69 73 74 5b 31 5d 3b 0a 20 20 20 20 70  &pList[1];.    p
15b80 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72 69 6e   += fts3GetVarin
15b90 74 33 32 28 70 2c 20 26 69 43 75 72 72 65 6e 74  t32(p, &iCurrent
15ba0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 5a  );.  }..  if( bZ
15bb0 65 72 6f 20 26 26 20 26 70 4c 69 73 74 5b 6e 4c  ero && &pList[nL
15bc0 69 73 74 5d 21 3d 70 45 6e 64 20 29 7b 0a 20 20  ist]!=pEnd ){.  
15bd0 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 5b    memset(&pList[
15be0 6e 4c 69 73 74 5d 2c 20 30 2c 20 70 45 6e 64 20  nList], 0, pEnd 
15bf0 2d 20 26 70 4c 69 73 74 5b 6e 4c 69 73 74 5d 29  - &pList[nList])
15c00 3b 0a 20 20 7d 0a 20 20 2a 70 70 4c 69 73 74 20  ;.  }.  *ppList 
15c10 3d 20 70 4c 69 73 74 3b 0a 20 20 2a 70 6e 4c 69  = pList;.  *pnLi
15c20 73 74 20 3d 20 6e 4c 69 73 74 3b 0a 7d 0a 0a 2f  st = nList;.}../
15c30 2a 0a 2a 2a 20 43 61 63 68 65 20 64 61 74 61 20  *.** Cache data 
15c40 69 6e 20 74 68 65 20 46 74 73 33 4d 75 6c 74 69  in the Fts3Multi
15c50 53 65 67 52 65 61 64 65 72 2e 61 42 75 66 66 65  SegReader.aBuffe
15c60 72 5b 5d 20 62 75 66 66 65 72 20 28 6f 76 65 72  r[] buffer (over
15c70 77 72 69 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 65  writing any.** e
15c80 78 69 73 74 69 6e 67 20 64 61 74 61 29 2e 20 47  xisting data). G
15c90 72 6f 77 20 74 68 65 20 62 75 66 66 65 72 20 69  row the buffer i
15ca0 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a  f required..**.*
15cb0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
15cc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15cd0 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  K. Otherwise, if
15ce0 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73   an OOM error is
15cf0 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2a 20   encountered.** 
15d00 74 72 79 69 6e 67 20 74 6f 20 72 65 73 69 7a 65  trying to resize
15d10 20 74 68 65 20 62 75 66 66 65 72 2c 20 72 65 74   the buffer, ret
15d20 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
15d30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15d40 66 74 73 33 4d 73 72 42 75 66 66 65 72 44 61 74  fts3MsrBufferDat
15d50 61 28 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65  a(.  Fts3MultiSe
15d60 67 52 65 61 64 65 72 20 2a 70 4d 73 72 2c 20 20  gReader *pMsr,  
15d70 20 20 20 20 20 2f 2a 20 4d 75 6c 74 69 2d 73 65       /* Multi-se
15d80 67 6d 65 6e 74 2d 72 65 61 64 65 72 20 68 61 6e  gment-reader han
15d90 64 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  dle */.  char *p
15da0 4c 69 73 74 2c 0a 20 20 69 6e 74 20 6e 4c 69 73  List,.  int nLis
15db0 74 0a 29 7b 0a 20 20 69 66 28 20 6e 4c 69 73 74  t.){.  if( nList
15dc0 3e 70 4d 73 72 2d 3e 6e 42 75 66 66 65 72 20 29  >pMsr->nBuffer )
15dd0 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77  {.    char *pNew
15de0 3b 0a 20 20 20 20 70 4d 73 72 2d 3e 6e 42 75 66  ;.    pMsr->nBuf
15df0 66 65 72 20 3d 20 6e 4c 69 73 74 2a 32 3b 0a 20  fer = nList*2;. 
15e00 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20     pNew = (char 
15e10 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
15e20 63 28 70 4d 73 72 2d 3e 61 42 75 66 66 65 72 2c  c(pMsr->aBuffer,
15e30 20 70 4d 73 72 2d 3e 6e 42 75 66 66 65 72 29 3b   pMsr->nBuffer);
15e40 0a 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29  .    if( !pNew )
15e50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
15e60 4f 4d 45 4d 3b 0a 20 20 20 20 70 4d 73 72 2d 3e  OMEM;.    pMsr->
15e70 61 42 75 66 66 65 72 20 3d 20 70 4e 65 77 3b 0a  aBuffer = pNew;.
15e80 20 20 7d 0a 0a 20 20 6d 65 6d 63 70 79 28 70 4d    }..  memcpy(pM
15e90 73 72 2d 3e 61 42 75 66 66 65 72 2c 20 70 4c 69  sr->aBuffer, pLi
15ea0 73 74 2c 20 6e 4c 69 73 74 29 3b 0a 20 20 72 65  st, nList);.  re
15eb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15ec0 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  }..int sqlite3Ft
15ed0 73 33 4d 73 72 49 6e 63 72 4e 65 78 74 28 0a 20  s3MsrIncrNext(. 
15ee0 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
15ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f00 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
15f10 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74  e handle */.  Ft
15f20 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
15f30 20 2a 70 4d 73 72 2c 20 20 20 20 20 20 20 2f 2a   *pMsr,       /*
15f40 20 4d 75 6c 74 69 2d 73 65 67 6d 65 6e 74 2d 72   Multi-segment-r
15f50 65 61 64 65 72 20 68 61 6e 64 6c 65 20 2a 2f 0a  eader handle */.
15f60 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
15f70 2a 70 69 44 6f 63 69 64 2c 20 20 20 20 20 20 20  *piDocid,       
15f80 20 20 2f 2a 20 4f 55 54 3a 20 44 6f 63 69 64 20    /* OUT: Docid 
15f90 76 61 6c 75 65 20 2a 2f 0a 20 20 63 68 61 72 20  value */.  char 
15fa0 2a 2a 70 61 50 6f 73 6c 69 73 74 2c 20 20 20 20  **paPoslist,    
15fb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
15fc0 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f  T: Pointer to po
15fd0 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20  sition list */. 
15fe0 20 69 6e 74 20 2a 70 6e 50 6f 73 6c 69 73 74 20   int *pnPoslist 
15ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16000 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66   /* OUT: Size of
16010 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 69   position list i
16020 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20  n bytes */.){.  
16030 69 6e 74 20 6e 4d 65 72 67 65 20 3d 20 70 4d 73  int nMerge = pMs
16040 72 2d 3e 6e 41 64 76 61 6e 63 65 3b 0a 20 20 46  r->nAdvance;.  F
16050 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a 61  ts3SegReader **a
16060 70 53 65 67 6d 65 6e 74 20 3d 20 70 4d 73 72 2d  pSegment = pMsr-
16070 3e 61 70 53 65 67 6d 65 6e 74 3b 0a 20 20 69 6e  >apSegment;.  in
16080 74 20 28 2a 78 43 6d 70 29 28 46 74 73 33 53 65  t (*xCmp)(Fts3Se
16090 67 52 65 61 64 65 72 20 2a 2c 20 46 74 73 33 53  gReader *, Fts3S
160a0 65 67 52 65 61 64 65 72 20 2a 29 20 3d 20 28 0a  egReader *) = (.
160b0 20 20 20 20 70 2d 3e 62 44 65 73 63 49 64 78 20      p->bDescIdx 
160c0 3f 20 66 74 73 33 53 65 67 52 65 61 64 65 72 44  ? fts3SegReaderD
160d0 6f 63 6c 69 73 74 43 6d 70 52 65 76 20 3a 20 66  oclistCmpRev : f
160e0 74 73 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c  ts3SegReaderDocl
160f0 69 73 74 43 6d 70 0a 20 20 29 3b 0a 0a 20 20 69  istCmp.  );..  i
16100 66 28 20 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a  f( nMerge==0 ){.
16110 20 20 20 20 2a 70 61 50 6f 73 6c 69 73 74 20 3d      *paPoslist =
16120 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
16130 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
16140 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
16150 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
16160 70 53 65 67 3b 0a 20 20 20 20 70 53 65 67 20 3d  pSeg;.    pSeg =
16170 20 70 4d 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74   pMsr->apSegment
16180 5b 30 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70 53  [0];..    if( pS
16190 65 67 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3d  eg->pOffsetList=
161a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 61 50  =0 ){.      *paP
161b0 6f 73 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  oslist = 0;.    
161c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c    break;.    }el
161d0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  se{.      int rc
161e0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 4c  ;.      char *pL
161f0 69 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ist;.      int n
16200 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  List;.      int 
16210 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  j;.      sqlite3
16220 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 20 3d 20  _int64 iDocid = 
16230 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 69 44  apSegment[0]->iD
16240 6f 63 69 64 3b 0a 0a 20 20 20 20 20 20 72 63 20  ocid;..      rc 
16250 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e  = fts3SegReaderN
16260 65 78 74 44 6f 63 69 64 28 70 2c 20 61 70 53 65  extDocid(p, apSe
16270 67 6d 65 6e 74 5b 30 5d 2c 20 26 70 4c 69 73 74  gment[0], &pList
16280 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20  , &nList);.     
16290 20 6a 20 3d 20 31 3b 0a 20 20 20 20 20 20 77 68   j = 1;.      wh
162a0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
162b0 4f 4b 20 0a 20 20 20 20 20 20 20 20 26 26 20 6a  OK .        && j
162c0 3c 6e 4d 65 72 67 65 0a 20 20 20 20 20 20 20 20  <nMerge.        
162d0 26 26 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2d  && apSegment[j]-
162e0 3e 70 4f 66 66 73 65 74 4c 69 73 74 0a 20 20 20  >pOffsetList.   
162f0 20 20 20 20 20 26 26 20 61 70 53 65 67 6d 65 6e       && apSegmen
16300 74 5b 6a 5d 2d 3e 69 44 6f 63 69 64 3d 3d 69 44  t[j]->iDocid==iD
16310 6f 63 69 64 0a 20 20 20 20 20 20 29 7b 0a 20 20  ocid.      ){.  
16320 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 53        rc = fts3S
16330 65 67 52 65 61 64 65 72 4e 65 78 74 44 6f 63 69  egReaderNextDoci
16340 64 28 70 2c 20 61 70 53 65 67 6d 65 6e 74 5b 6a  d(p, apSegment[j
16350 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  ], 0, 0);.      
16360 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    j++;.      }. 
16370 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
16380 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
16390 72 63 3b 0a 20 20 20 20 20 20 66 74 73 33 53 65  rc;.      fts3Se
163a0 67 52 65 61 64 65 72 53 6f 72 74 28 70 4d 73 72  gReaderSort(pMsr
163b0 2d 3e 61 70 53 65 67 6d 65 6e 74 2c 20 6e 4d 65  ->apSegment, nMe
163c0 72 67 65 2c 20 6a 2c 20 78 43 6d 70 29 3b 0a 0a  rge, j, xCmp);..
163d0 20 20 20 20 20 20 69 66 28 20 6e 4c 69 73 74 3e        if( nList>
163e0 30 20 26 26 20 66 74 73 33 53 65 67 52 65 61 64  0 && fts3SegRead
163f0 65 72 49 73 50 65 6e 64 69 6e 67 28 61 70 53 65  erIsPending(apSe
16400 67 6d 65 6e 74 5b 30 5d 29 20 29 7b 0a 20 20 20  gment[0]) ){.   
16410 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 4d 73       rc = fts3Ms
16420 72 42 75 66 66 65 72 44 61 74 61 28 70 4d 73 72  rBufferData(pMsr
16430 2c 20 70 4c 69 73 74 2c 20 6e 4c 69 73 74 2b 31  , pList, nList+1
16440 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
16450 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
16460 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
16470 20 20 61 73 73 65 72 74 28 20 28 70 4d 73 72 2d    assert( (pMsr-
16480 3e 61 42 75 66 66 65 72 5b 6e 4c 69 73 74 5d 20  >aBuffer[nList] 
16490 26 20 30 78 46 45 29 3d 3d 30 78 30 30 20 29 3b  & 0xFE)==0x00 );
164a0 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d  .        pList =
164b0 20 70 4d 73 72 2d 3e 61 42 75 66 66 65 72 3b 0a   pMsr->aBuffer;.
164c0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
164d0 66 28 20 70 4d 73 72 2d 3e 69 43 6f 6c 46 69 6c  f( pMsr->iColFil
164e0 74 65 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ter>=0 ){.      
164f0 20 20 66 74 73 33 43 6f 6c 75 6d 6e 46 69 6c 74    fts3ColumnFilt
16500 65 72 28 70 4d 73 72 2d 3e 69 43 6f 6c 46 69 6c  er(pMsr->iColFil
16510 74 65 72 2c 20 31 2c 20 26 70 4c 69 73 74 2c 20  ter, 1, &pList, 
16520 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d  &nList);.      }
16530 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 4c 69 73  ..      if( nLis
16540 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  t>0 ){.        *
16550 70 61 50 6f 73 6c 69 73 74 20 3d 20 70 4c 69 73  paPoslist = pLis
16560 74 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 44 6f  t;.        *piDo
16570 63 69 64 20 3d 20 69 44 6f 63 69 64 3b 0a 20 20  cid = iDocid;.  
16580 20 20 20 20 20 20 2a 70 6e 50 6f 73 6c 69 73 74        *pnPoslist
16590 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20   = nList;.      
165a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
165b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
165c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
165d0 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
165e0 73 33 53 65 67 52 65 61 64 65 72 53 74 61 72 74  s3SegReaderStart
165f0 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
16600 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16610 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74      /* Virtual t
16620 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
16630 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61   Fts3MultiSegRea
16640 64 65 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20  der *pCsr,      
16650 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65 63   /* Cursor objec
16660 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
16670 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20  r *zTerm,       
16680 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 73         /* Term s
16690 65 61 72 63 68 65 64 20 66 6f 72 20 28 6f 72 20  earched for (or 
166a0 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 6e  NULL) */.  int n
166b0 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
166c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
166d0 6e 67 74 68 20 6f 66 20 7a 54 65 72 6d 20 69 6e  ngth of zTerm in
166e0 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69   bytes */.){.  i
166f0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 53 65 67  nt i;.  int nSeg
16700 20 3d 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e   = pCsr->nSegmen
16710 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  t;..  /* If the 
16720 46 74 73 33 53 65 67 46 69 6c 74 65 72 20 64 65  Fts3SegFilter de
16730 66 69 6e 65 73 20 61 20 73 70 65 63 69 66 69 63  fines a specific
16740 20 74 65 72 6d 20 28 6f 72 20 74 65 72 6d 20 70   term (or term p
16750 72 65 66 69 78 29 20 74 6f 20 73 65 61 72 63 68  refix) to search
16760 20 0a 20 20 2a 2a 20 66 6f 72 2c 20 74 68 65 6e   .  ** for, then
16770 20 61 64 76 61 6e 63 65 20 65 61 63 68 20 73 65   advance each se
16780 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 20 75  gment iterator u
16790 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74  ntil it points t
167a0 6f 20 61 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a  o a term of.  **
167b0 20 65 71 75 61 6c 20 6f 72 20 67 72 65 61 74 65   equal or greate
167c0 72 20 76 61 6c 75 65 20 74 68 61 6e 20 74 68 65  r value than the
167d0 20 73 70 65 63 69 66 69 65 64 20 74 65 72 6d 2e   specified term.
167e0 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 6d   This prevents m
167f0 61 6e 79 0a 20 20 2a 2a 20 75 6e 6e 65 63 65 73  any.  ** unneces
16800 73 61 72 79 20 6d 65 72 67 65 2f 73 6f 72 74 20  sary merge/sort 
16810 6f 70 65 72 61 74 69 6f 6e 73 20 66 6f 72 20 74  operations for t
16820 68 65 20 63 61 73 65 20 77 68 65 72 65 20 73 69  he case where si
16830 6e 67 6c 65 20 73 65 67 6d 65 6e 74 0a 20 20 2a  ngle segment.  *
16840 2a 20 62 2d 74 72 65 65 20 6c 65 61 66 20 6e 6f  * b-tree leaf no
16850 64 65 73 20 63 6f 6e 74 61 69 6e 20 6d 6f 72 65  des contain more
16860 20 74 68 61 6e 20 6f 6e 65 20 74 65 72 6d 2e 0a   than one term..
16870 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
16880 70 43 73 72 2d 3e 62 52 65 73 74 61 72 74 3d 3d  pCsr->bRestart==
16890 30 20 26 26 20 69 3c 70 43 73 72 2d 3e 6e 53 65  0 && i<pCsr->nSe
168a0 67 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  gment; i++){.   
168b0 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20   int res = 0;.  
168c0 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
168d0 2a 70 53 65 67 20 3d 20 70 43 73 72 2d 3e 61 70  *pSeg = pCsr->ap
168e0 53 65 67 6d 65 6e 74 5b 69 5d 3b 0a 20 20 20 20  Segment[i];.    
168f0 64 6f 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  do {.      int r
16900 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65  c = fts3SegReade
16910 72 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 30  rNext(p, pSeg, 0
16920 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
16930 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
16940 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 77 68 69  urn rc;.    }whi
16950 6c 65 28 20 7a 54 65 72 6d 20 26 26 20 28 72 65  le( zTerm && (re
16960 73 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65  s = fts3SegReade
16970 72 54 65 72 6d 43 6d 70 28 70 53 65 67 2c 20 7a  rTermCmp(pSeg, z
16980 54 65 72 6d 2c 20 6e 54 65 72 6d 29 29 3c 30 20  Term, nTerm))<0 
16990 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 65 67  );..    if( pSeg
169a0 2d 3e 62 4c 6f 6f 6b 75 70 20 26 26 20 72 65 73  ->bLookup && res
169b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73  !=0 ){.      fts
169c0 33 53 65 67 52 65 61 64 65 72 53 65 74 45 6f 66  3SegReaderSetEof
169d0 28 70 53 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20  (pSeg);.    }.  
169e0 7d 0a 20 20 66 74 73 33 53 65 67 52 65 61 64 65  }.  fts3SegReade
169f0 72 53 6f 72 74 28 70 43 73 72 2d 3e 61 70 53 65  rSort(pCsr->apSe
16a00 67 6d 65 6e 74 2c 20 6e 53 65 67 2c 20 6e 53 65  gment, nSeg, nSe
16a10 67 2c 20 66 74 73 33 53 65 67 52 65 61 64 65 72  g, fts3SegReader
16a20 43 6d 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Cmp);..  return 
16a30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e  SQLITE_OK;.}..in
16a40 74 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  t sqlite3Fts3Seg
16a50 52 65 61 64 65 72 53 74 61 72 74 28 0a 20 20 46  ReaderStart(.  F
16a60 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
16a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16a80 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * Virtual table 
16a90 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33  handle */.  Fts3
16aa0 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a  MultiSegReader *
16ab0 70 43 73 72 2c 20 20 20 20 20 20 20 2f 2a 20 43  pCsr,       /* C
16ac0 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  ursor object */.
16ad0 20 20 46 74 73 33 53 65 67 46 69 6c 74 65 72 20    Fts3SegFilter 
16ae0 2a 70 46 69 6c 74 65 72 20 20 20 20 20 20 20 20  *pFilter        
16af0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
16b00 73 20 6f 6e 20 72 61 6e 67 65 20 6f 66 20 69 74  s on range of it
16b10 65 72 61 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  eration */.){.  
16b20 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 20 3d 20  pCsr->pFilter = 
16b30 70 46 69 6c 74 65 72 3b 0a 20 20 72 65 74 75 72  pFilter;.  retur
16b40 6e 20 66 74 73 33 53 65 67 52 65 61 64 65 72 53  n fts3SegReaderS
16b50 74 61 72 74 28 70 2c 20 70 43 73 72 2c 20 70 46  tart(p, pCsr, pF
16b60 69 6c 74 65 72 2d 3e 7a 54 65 72 6d 2c 20 70 46  ilter->zTerm, pF
16b70 69 6c 74 65 72 2d 3e 6e 54 65 72 6d 29 3b 0a 7d  ilter->nTerm);.}
16b80 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
16b90 33 4d 73 72 49 6e 63 72 53 74 61 72 74 28 0a 20  3MsrIncrStart(. 
16ba0 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
16bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bc0 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
16bd0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74  e handle */.  Ft
16be0 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
16bf0 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 2f 2a   *pCsr,       /*
16c00 20 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a   Cursor object *
16c10 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  /.  int iCol,   
16c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c30 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f      /* Column to
16c40 20 6d 61 74 63 68 20 6f 6e 2e 20 2a 2f 0a 20 20   match on. */.  
16c50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72  const char *zTer
16c60 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
16c70 2f 2a 20 54 65 72 6d 20 74 6f 20 69 74 65 72 61  /* Term to itera
16c80 74 65 20 74 68 72 6f 75 67 68 20 61 20 64 6f 63  te through a doc
16c90 6c 69 73 74 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  list for */.  in
16ca0 74 20 6e 54 65 72 6d 20 20 20 20 20 20 20 20 20  t nTerm         
16cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16cc0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
16cd0 20 69 6e 20 7a 54 65 72 6d 20 2a 2f 0a 29 7b 0a   in zTerm */.){.
16ce0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
16cf0 63 3b 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e  c;.  int nSegmen
16d00 74 20 3d 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65  t = pCsr->nSegme
16d10 6e 74 3b 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70  nt;.  int (*xCmp
16d20 29 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20  )(Fts3SegReader 
16d30 2a 2c 20 46 74 73 33 53 65 67 52 65 61 64 65 72  *, Fts3SegReader
16d40 20 2a 29 20 3d 20 28 0a 20 20 20 20 70 2d 3e 62   *) = (.    p->b
16d50 44 65 73 63 49 64 78 20 3f 20 66 74 73 33 53 65  DescIdx ? fts3Se
16d60 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d  gReaderDoclistCm
16d70 70 52 65 76 20 3a 20 66 74 73 33 53 65 67 52 65  pRev : fts3SegRe
16d80 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 0a 20  aderDoclistCmp. 
16d90 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
16da0 43 73 72 2d 3e 70 46 69 6c 74 65 72 3d 3d 30 20  Csr->pFilter==0 
16db0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54 65  );.  assert( zTe
16dc0 72 6d 20 26 26 20 6e 54 65 72 6d 3e 30 20 29 3b  rm && nTerm>0 );
16dd0 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 65  ..  /* Advance e
16de0 61 63 68 20 73 65 67 6d 65 6e 74 20 69 74 65 72  ach segment iter
16df0 61 74 6f 72 20 75 6e 74 69 6c 20 69 74 20 70 6f  ator until it po
16e00 69 6e 74 73 20 74 6f 20 74 68 65 20 74 65 72 6d  ints to the term
16e10 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 2a 2f   zTerm/nTerm. */
16e20 0a 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52  .  rc = fts3SegR
16e30 65 61 64 65 72 53 74 61 72 74 28 70 2c 20 70 43  eaderStart(p, pC
16e40 73 72 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  sr, zTerm, nTerm
16e50 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
16e60 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
16e70 72 63 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d  rc;..  /* Determ
16e80 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 6f 66 20  ine how many of 
16e90 74 68 65 20 73 65 67 6d 65 6e 74 73 20 61 63 74  the segments act
16ea0 75 61 6c 6c 79 20 70 6f 69 6e 74 20 74 6f 20 7a  ually point to z
16eb0 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 2a 2f 0a 20  Term/nTerm. */. 
16ec0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 65 67   for(i=0; i<nSeg
16ed0 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ment; i++){.    
16ee0 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
16ef0 53 65 67 20 3d 20 70 43 73 72 2d 3e 61 70 53 65  Seg = pCsr->apSe
16f00 67 6d 65 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66  gment[i];.    if
16f10 28 20 21 70 53 65 67 2d 3e 61 4e 6f 64 65 20 7c  ( !pSeg->aNode |
16f20 7c 20 66 74 73 33 53 65 67 52 65 61 64 65 72 54  | fts3SegReaderT
16f30 65 72 6d 43 6d 70 28 70 53 65 67 2c 20 7a 54 65  ermCmp(pSeg, zTe
16f40 72 6d 2c 20 6e 54 65 72 6d 29 20 29 7b 0a 20 20  rm, nTerm) ){.  
16f50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16f60 0a 20 20 7d 0a 20 20 70 43 73 72 2d 3e 6e 41 64  .  }.  pCsr->nAd
16f70 76 61 6e 63 65 20 3d 20 69 3b 0a 0a 20 20 2f 2a  vance = i;..  /*
16f80 20 41 64 76 61 6e 63 65 20 65 61 63 68 20 6f 66   Advance each of
16f90 20 74 68 65 20 73 65 67 6d 65 6e 74 73 20 74 6f   the segments to
16fa0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69   point to the fi
16fb0 72 73 74 20 64 6f 63 69 64 2e 20 2a 2f 0a 20 20  rst docid. */.  
16fc0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d  for(i=0; i<pCsr-
16fd0 3e 6e 41 64 76 61 6e 63 65 3b 20 69 2b 2b 29 7b  >nAdvance; i++){
16fe0 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65  .    rc = fts3Se
16ff0 67 52 65 61 64 65 72 46 69 72 73 74 44 6f 63 69  gReaderFirstDoci
17000 64 28 70 2c 20 70 43 73 72 2d 3e 61 70 53 65 67  d(p, pCsr->apSeg
17010 6d 65 6e 74 5b 69 5d 29 3b 0a 20 20 20 20 69 66  ment[i]);.    if
17020 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17030 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
17040 0a 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72  .  fts3SegReader
17050 53 6f 72 74 28 70 43 73 72 2d 3e 61 70 53 65 67  Sort(pCsr->apSeg
17060 6d 65 6e 74 2c 20 69 2c 20 69 2c 20 78 43 6d 70  ment, i, i, xCmp
17070 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 43  );..  assert( iC
17080 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3c 70 2d 3e  ol<0 || iCol<p->
17090 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 70 43 73  nColumn );.  pCs
170a0 72 2d 3e 69 43 6f 6c 46 69 6c 74 65 72 20 3d 20  r->iColFilter = 
170b0 69 43 6f 6c 3b 0a 0a 20 20 72 65 74 75 72 6e 20  iCol;..  return 
170c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
170d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
170e0 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61  n is called on a
170f0 20 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20   MultiSegReader 
17100 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 73 74  that has been st
17110 61 72 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73  arted using.** s
17120 71 6c 69 74 65 33 46 74 73 33 4d 73 72 49 6e 63  qlite3Fts3MsrInc
17130 72 53 74 61 72 74 28 29 2e 20 4f 6e 65 20 6f 72  rStart(). One or
17140 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20 4d   more calls to M
17150 73 72 49 6e 63 72 4e 65 78 74 28 29 20 6d 61 79  srIncrNext() may
17160 20 61 6c 73 6f 0a 2a 2a 20 68 61 76 65 20 62 65   also.** have be
17170 65 6e 20 6d 61 64 65 2e 20 43 61 6c 6c 69 6e 67  en made. Calling
17180 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70   this function p
17190 75 74 73 20 74 68 65 20 4d 75 6c 74 69 53 65 67  uts the MultiSeg
171a0 52 65 61 64 65 72 20 69 6e 20 73 75 63 68 0a 2a  Reader in such.*
171b0 2a 20 61 20 73 74 61 74 65 20 74 68 61 74 20 69  * a state that i
171c0 66 20 74 68 65 20 6e 65 78 74 20 74 77 6f 20 63  f the next two c
171d0 61 6c 6c 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20  alls are:.**.** 
171e0 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67    sqlite3Fts3Seg
171f0 52 65 61 64 65 72 53 74 61 72 74 28 29 0a 2a 2a  ReaderStart().**
17200 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65     sqlite3Fts3Se
17210 67 52 65 61 64 65 72 53 74 65 70 28 29 0a 2a 2a  gReaderStep().**
17220 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 65 6e 74  .** then the ent
17230 69 72 65 20 64 6f 63 6c 69 73 74 20 66 6f 72 20  ire doclist for 
17240 74 68 65 20 74 65 72 6d 20 69 73 20 61 76 61 69  the term is avai
17250 6c 61 62 6c 65 20 69 6e 20 0a 2a 2a 20 4d 75 6c  lable in .** Mul
17260 74 69 53 65 67 52 65 61 64 65 72 2e 61 44 6f 63  tiSegReader.aDoc
17270 6c 69 73 74 2f 6e 44 6f 63 6c 69 73 74 2e 0a 2a  list/nDoclist..*
17280 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
17290 33 4d 73 72 49 6e 63 72 52 65 73 74 61 72 74 28  3MsrIncrRestart(
172a0 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
172b0 65 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74  er *pCsr){.  int
172c0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
172d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
172e0 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
172f0 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 2d  through segment-
17300 72 65 61 64 65 72 73 20 2a 2f 0a 0a 20 20 61 73  readers */..  as
17310 73 65 72 74 28 20 70 43 73 72 2d 3e 7a 54 65 72  sert( pCsr->zTer
17320 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  m==0 );.  assert
17330 28 20 70 43 73 72 2d 3e 6e 54 65 72 6d 3d 3d 30  ( pCsr->nTerm==0
17340 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
17350 73 72 2d 3e 61 44 6f 63 6c 69 73 74 3d 3d 30 20  sr->aDoclist==0 
17360 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 73  );.  assert( pCs
17370 72 2d 3e 6e 44 6f 63 6c 69 73 74 3d 3d 30 20 29  r->nDoclist==0 )
17380 3b 0a 0a 20 20 70 43 73 72 2d 3e 6e 41 64 76 61  ;..  pCsr->nAdva
17390 6e 63 65 20 3d 20 30 3b 0a 20 20 70 43 73 72 2d  nce = 0;.  pCsr-
173a0 3e 62 52 65 73 74 61 72 74 20 3d 20 31 3b 0a 20  >bRestart = 1;. 
173b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72   for(i=0; i<pCsr
173c0 2d 3e 6e 53 65 67 6d 65 6e 74 3b 20 69 2b 2b 29  ->nSegment; i++)
173d0 7b 0a 20 20 20 20 70 43 73 72 2d 3e 61 70 53 65  {.    pCsr->apSe
173e0 67 6d 65 6e 74 5b 69 5d 2d 3e 70 4f 66 66 73 65  gment[i]->pOffse
173f0 74 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 70  tList = 0;.    p
17400 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69  Csr->apSegment[i
17410 5d 2d 3e 6e 4f 66 66 73 65 74 4c 69 73 74 20 3d  ]->nOffsetList =
17420 20 30 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 70   0;.    pCsr->ap
17430 53 65 67 6d 65 6e 74 5b 69 5d 2d 3e 69 44 6f 63  Segment[i]->iDoc
17440 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72  id = 0;.  }..  r
17450 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17460 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  .}...int sqlite3
17470 46 74 73 33 53 65 67 52 65 61 64 65 72 53 74 65  Fts3SegReaderSte
17480 70 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  p(.  Fts3Table *
17490 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
174a0 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
174b0 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
174c0 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65    Fts3MultiSegRe
174d0 61 64 65 72 20 2a 70 43 73 72 20 20 20 20 20 20  ader *pCsr      
174e0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65    /* Cursor obje
174f0 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ct */.){.  int r
17500 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
17510 20 20 69 6e 74 20 69 73 49 67 6e 6f 72 65 45 6d    int isIgnoreEm
17520 70 74 79 20 3d 20 20 28 70 43 73 72 2d 3e 70 46  pty =  (pCsr->pF
17530 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  ilter->flags & F
17540 54 53 33 5f 53 45 47 4d 45 4e 54 5f 49 47 4e 4f  TS3_SEGMENT_IGNO
17550 52 45 5f 45 4d 50 54 59 29 3b 0a 20 20 69 6e 74  RE_EMPTY);.  int
17560 20 69 73 52 65 71 75 69 72 65 50 6f 73 20 3d 20   isRequirePos = 
17570 20 20 28 70 43 73 72 2d 3e 70 46 69 6c 74 65 72    (pCsr->pFilter
17580 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 33 5f 53  ->flags & FTS3_S
17590 45 47 4d 45 4e 54 5f 52 45 51 55 49 52 45 5f 50  EGMENT_REQUIRE_P
175a0 4f 53 29 3b 0a 20 20 69 6e 74 20 69 73 43 6f 6c  OS);.  int isCol
175b0 46 69 6c 74 65 72 20 3d 20 20 20 20 28 70 43 73  Filter =    (pCs
175c0 72 2d 3e 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67  r->pFilter->flag
175d0 73 20 26 20 46 54 53 33 5f 53 45 47 4d 45 4e 54  s & FTS3_SEGMENT
175e0 5f 43 4f 4c 55 4d 4e 5f 46 49 4c 54 45 52 29 3b  _COLUMN_FILTER);
175f0 0a 20 20 69 6e 74 20 69 73 50 72 65 66 69 78 20  .  int isPrefix 
17600 3d 20 20 20 20 20 20 20 28 70 43 73 72 2d 3e 70  =       (pCsr->p
17610 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26 20  Filter->flags & 
17620 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 50 52 45  FTS3_SEGMENT_PRE
17630 46 49 58 29 3b 0a 20 20 69 6e 74 20 69 73 53 63  FIX);.  int isSc
17640 61 6e 20 3d 20 20 20 20 20 20 20 20 20 28 70 43  an =         (pC
17650 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e 66 6c 61  sr->pFilter->fla
17660 67 73 20 26 20 46 54 53 33 5f 53 45 47 4d 45 4e  gs & FTS3_SEGMEN
17670 54 5f 53 43 41 4e 29 3b 0a 20 20 69 6e 74 20 69  T_SCAN);.  int i
17680 73 46 69 72 73 74 20 3d 20 20 20 20 20 20 20 20  sFirst =        
17690 28 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e  (pCsr->pFilter->
176a0 66 6c 61 67 73 20 26 20 46 54 53 33 5f 53 45 47  flags & FTS3_SEG
176b0 4d 45 4e 54 5f 46 49 52 53 54 29 3b 0a 0a 20 20  MENT_FIRST);..  
176c0 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a  Fts3SegReader **
176d0 61 70 53 65 67 6d 65 6e 74 20 3d 20 70 43 73 72  apSegment = pCsr
176e0 2d 3e 61 70 53 65 67 6d 65 6e 74 3b 0a 20 20 69  ->apSegment;.  i
176f0 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 70 43  nt nSegment = pC
17700 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20  sr->nSegment;.  
17710 46 74 73 33 53 65 67 46 69 6c 74 65 72 20 2a 70  Fts3SegFilter *p
17720 46 69 6c 74 65 72 20 3d 20 70 43 73 72 2d 3e 70  Filter = pCsr->p
17730 46 69 6c 74 65 72 3b 0a 20 20 69 6e 74 20 28 2a  Filter;.  int (*
17740 78 43 6d 70 29 28 46 74 73 33 53 65 67 52 65 61  xCmp)(Fts3SegRea
17750 64 65 72 20 2a 2c 20 46 74 73 33 53 65 67 52 65  der *, Fts3SegRe
17760 61 64 65 72 20 2a 29 20 3d 20 28 0a 20 20 20 20  ader *) = (.    
17770 70 2d 3e 62 44 65 73 63 49 64 78 20 3f 20 66 74  p->bDescIdx ? ft
17780 73 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69  s3SegReaderDocli
17790 73 74 43 6d 70 52 65 76 20 3a 20 66 74 73 33 53  stCmpRev : fts3S
177a0 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43  egReaderDoclistC
177b0 6d 70 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 70  mp.  );..  if( p
177c0 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 30  Csr->nSegment==0
177d0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
177e0 5f 4f 4b 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20  _OK;..  do {.   
177f0 20 69 6e 74 20 6e 4d 65 72 67 65 3b 0a 20 20 20   int nMerge;.   
17800 20 69 6e 74 20 69 3b 0a 20 20 0a 20 20 20 20 2f   int i;.  .    /
17810 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 66 69  * Advance the fi
17820 72 73 74 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e  rst pCsr->nAdvan
17830 63 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ce entries in th
17840 65 20 61 70 53 65 67 6d 65 6e 74 5b 5d 20 61 72  e apSegment[] ar
17850 72 61 79 0a 20 20 20 20 2a 2a 20 66 6f 72 77 61  ray.    ** forwa
17860 72 64 2e 20 54 68 65 6e 20 73 6f 72 74 20 74 68  rd. Then sort th
17870 65 20 6c 69 73 74 20 69 6e 20 6f 72 64 65 72 20  e list in order 
17880 6f 66 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20  of current term 
17890 61 67 61 69 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a  again.  .    */.
178a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
178b0 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65 3b 20 69  Csr->nAdvance; i
178c0 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 33 53  ++){.      Fts3S
178d0 65 67 52 65 61 64 65 72 20 2a 70 53 65 67 20 3d  egReader *pSeg =
178e0 20 61 70 53 65 67 6d 65 6e 74 5b 69 5d 3b 0a 20   apSegment[i];. 
178f0 20 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 62       if( pSeg->b
17900 4c 6f 6f 6b 75 70 20 29 7b 0a 20 20 20 20 20 20  Lookup ){.      
17910 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72 53    fts3SegReaderS
17920 65 74 45 6f 66 28 70 53 65 67 29 3b 0a 20 20 20  etEof(pSeg);.   
17930 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17940 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65    rc = fts3SegRe
17950 61 64 65 72 4e 65 78 74 28 70 2c 20 70 53 65 67  aderNext(p, pSeg
17960 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
17970 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17980 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
17990 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  c;.    }.    fts
179a0 33 53 65 67 52 65 61 64 65 72 53 6f 72 74 28 61  3SegReaderSort(a
179b0 70 53 65 67 6d 65 6e 74 2c 20 6e 53 65 67 6d 65  pSegment, nSegme
179c0 6e 74 2c 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e  nt, pCsr->nAdvan
179d0 63 65 2c 20 66 74 73 33 53 65 67 52 65 61 64 65  ce, fts3SegReade
179e0 72 43 6d 70 29 3b 0a 20 20 20 20 70 43 73 72 2d  rCmp);.    pCsr-
179f0 3e 6e 41 64 76 61 6e 63 65 20 3d 20 30 3b 0a 0a  >nAdvance = 0;..
17a00 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68      /* If all th
17a10 65 20 73 65 67 2d 72 65 61 64 65 72 73 20 61 72  e seg-readers ar
17a20 65 20 61 74 20 45 4f 46 2c 20 77 65 27 72 65 20  e at EOF, we're 
17a30 66 69 6e 69 73 68 65 64 2e 20 72 65 74 75 72 6e  finished. return
17a40 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 2a 2f 0a 20   SQLITE_OK. */. 
17a50 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
17a60 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
17a70 69 66 28 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d  if( apSegment[0]
17a80 2d 3e 61 4e 6f 64 65 3d 3d 30 20 29 20 62 72 65  ->aNode==0 ) bre
17a90 61 6b 3b 0a 0a 20 20 20 20 70 43 73 72 2d 3e 6e  ak;..    pCsr->n
17aa0 54 65 72 6d 20 3d 20 61 70 53 65 67 6d 65 6e 74  Term = apSegment
17ab0 5b 30 5d 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20  [0]->nTerm;.    
17ac0 70 43 73 72 2d 3e 7a 54 65 72 6d 20 3d 20 61 70  pCsr->zTerm = ap
17ad0 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 7a 54 65 72  Segment[0]->zTer
17ae0 6d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  m;..    /* If th
17af0 69 73 20 69 73 20 61 20 70 72 65 66 69 78 2d 73  is is a prefix-s
17b00 65 61 72 63 68 2c 20 61 6e 64 20 69 66 20 74 68  earch, and if th
17b10 65 20 74 65 72 6d 20 74 68 61 74 20 61 70 53 65  e term that apSe
17b20 67 6d 65 6e 74 5b 30 5d 20 70 6f 69 6e 74 73 0a  gment[0] points.
17b30 20 20 20 20 2a 2a 20 74 6f 20 64 6f 65 73 20 6e      ** to does n
17b40 6f 74 20 73 68 61 72 65 20 61 20 73 75 66 66 69  ot share a suffi
17b50 78 20 77 69 74 68 20 70 46 69 6c 74 65 72 2d 3e  x with pFilter->
17b60 7a 54 65 72 6d 2f 6e 54 65 72 6d 2c 20 74 68 65  zTerm/nTerm, the
17b70 6e 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 72 65  n all .    ** re
17b80 71 75 69 72 65 64 20 63 61 6c 6c 62 61 63 6b 73  quired callbacks
17b90 20 68 61 76 65 20 62 65 65 6e 20 6d 61 64 65 2e   have been made.
17ba0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 65 78   In this case ex
17bb0 69 74 20 65 61 72 6c 79 2e 0a 20 20 20 20 2a 2a  it early..    **
17bc0 0a 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c  .    ** Similarl
17bd0 79 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  y, if this is a 
17be0 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78  search for an ex
17bf0 61 63 74 20 6d 61 74 63 68 2c 20 61 6e 64 20 74  act match, and t
17c00 68 65 20 66 69 72 73 74 20 74 65 72 6d 0a 20 20  he first term.  
17c10 20 20 2a 2a 20 6f 66 20 73 65 67 6d 65 6e 74 20    ** of segment 
17c20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 20 69 73 20  apSegment[0] is 
17c30 6e 6f 74 20 61 20 6d 61 74 63 68 2c 20 65 78 69  not a match, exi
17c40 74 20 65 61 72 6c 79 2e 0a 20 20 20 20 2a 2f 0a  t early..    */.
17c50 20 20 20 20 69 66 28 20 70 46 69 6c 74 65 72 2d      if( pFilter-
17c60 3e 7a 54 65 72 6d 20 26 26 20 21 69 73 53 63 61  >zTerm && !isSca
17c70 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  n ){.      if( p
17c80 43 73 72 2d 3e 6e 54 65 72 6d 3c 70 46 69 6c 74  Csr->nTerm<pFilt
17c90 65 72 2d 3e 6e 54 65 72 6d 20 0a 20 20 20 20 20  er->nTerm .     
17ca0 20 20 7c 7c 20 28 21 69 73 50 72 65 66 69 78 20    || (!isPrefix 
17cb0 26 26 20 70 43 73 72 2d 3e 6e 54 65 72 6d 3e 70  && pCsr->nTerm>p
17cc0 46 69 6c 74 65 72 2d 3e 6e 54 65 72 6d 29 0a 20  Filter->nTerm). 
17cd0 20 20 20 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28        || memcmp(
17ce0 70 43 73 72 2d 3e 7a 54 65 72 6d 2c 20 70 46 69  pCsr->zTerm, pFi
17cf0 6c 74 65 72 2d 3e 7a 54 65 72 6d 2c 20 70 46 69  lter->zTerm, pFi
17d00 6c 74 65 72 2d 3e 6e 54 65 72 6d 29 20 0a 20 20  lter->nTerm) .  
17d10 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62      ){.        b
17d20 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
17d30 20 20 7d 0a 0a 20 20 20 20 6e 4d 65 72 67 65 20    }..    nMerge 
17d40 3d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 1;.    while( 
17d50 6e 4d 65 72 67 65 3c 6e 53 65 67 6d 65 6e 74 20  nMerge<nSegment 
17d60 0a 20 20 20 20 20 20 20 20 26 26 20 61 70 53 65  .        && apSe
17d70 67 6d 65 6e 74 5b 6e 4d 65 72 67 65 5d 2d 3e 61  gment[nMerge]->a
17d80 4e 6f 64 65 0a 20 20 20 20 20 20 20 20 26 26 20  Node.        && 
17d90 61 70 53 65 67 6d 65 6e 74 5b 6e 4d 65 72 67 65  apSegment[nMerge
17da0 5d 2d 3e 6e 54 65 72 6d 3d 3d 70 43 73 72 2d 3e  ]->nTerm==pCsr->
17db0 6e 54 65 72 6d 20 0a 20 20 20 20 20 20 20 20 26  nTerm .        &
17dc0 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 43 73 72  & 0==memcmp(pCsr
17dd0 2d 3e 7a 54 65 72 6d 2c 20 61 70 53 65 67 6d 65  ->zTerm, apSegme
17de0 6e 74 5b 6e 4d 65 72 67 65 5d 2d 3e 7a 54 65 72  nt[nMerge]->zTer
17df0 6d 2c 20 70 43 73 72 2d 3e 6e 54 65 72 6d 29 0a  m, pCsr->nTerm).
17e00 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4d 65      ){.      nMe
17e10 72 67 65 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  rge++;.    }..  
17e20 20 20 61 73 73 65 72 74 28 20 69 73 49 67 6e 6f    assert( isIgno
17e30 72 65 45 6d 70 74 79 20 7c 7c 20 28 69 73 52 65  reEmpty || (isRe
17e40 71 75 69 72 65 50 6f 73 20 26 26 20 21 69 73 43  quirePos && !isC
17e50 6f 6c 46 69 6c 74 65 72 29 20 29 3b 0a 20 20 20  olFilter) );.   
17e60 20 69 66 28 20 6e 4d 65 72 67 65 3d 3d 31 20 0a   if( nMerge==1 .
17e70 20 20 20 20 20 26 26 20 21 69 73 49 67 6e 6f 72       && !isIgnor
17e80 65 45 6d 70 74 79 20 0a 20 20 20 20 20 26 26 20  eEmpty .     && 
17e90 21 69 73 46 69 72 73 74 20 0a 20 20 20 20 20 26  !isFirst .     &
17ea0 26 20 28 70 2d 3e 62 44 65 73 63 49 64 78 3d 3d  & (p->bDescIdx==
17eb0 30 20 7c 7c 20 66 74 73 33 53 65 67 52 65 61 64  0 || fts3SegRead
17ec0 65 72 49 73 50 65 6e 64 69 6e 67 28 61 70 53 65  erIsPending(apSe
17ed0 67 6d 65 6e 74 5b 30 5d 29 3d 3d 30 29 0a 20 20  gment[0])==0).  
17ee0 20 20 29 7b 0a 20 20 20 20 20 20 70 43 73 72 2d    ){.      pCsr-
17ef0 3e 6e 44 6f 63 6c 69 73 74 20 3d 20 61 70 53 65  >nDoclist = apSe
17f00 67 6d 65 6e 74 5b 30 5d 2d 3e 6e 44 6f 63 6c 69  gment[0]->nDocli
17f10 73 74 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74  st;.      if( ft
17f20 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65 6e  s3SegReaderIsPen
17f30 64 69 6e 67 28 61 70 53 65 67 6d 65 6e 74 5b 30  ding(apSegment[0
17f40 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ]) ){.        rc
17f50 20 3d 20 66 74 73 33 4d 73 72 42 75 66 66 65 72   = fts3MsrBuffer
17f60 44 61 74 61 28 70 43 73 72 2c 20 61 70 53 65 67  Data(pCsr, apSeg
17f70 6d 65 6e 74 5b 30 5d 2d 3e 61 44 6f 63 6c 69 73  ment[0]->aDoclis
17f80 74 2c 20 70 43 73 72 2d 3e 6e 44 6f 63 6c 69 73  t, pCsr->nDoclis
17f90 74 29 3b 0a 20 20 20 20 20 20 20 20 70 43 73 72  t);.        pCsr
17fa0 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20 70 43 73  ->aDoclist = pCs
17fb0 72 2d 3e 61 42 75 66 66 65 72 3b 0a 20 20 20 20  r->aBuffer;.    
17fc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17fd0 20 70 43 73 72 2d 3e 61 44 6f 63 6c 69 73 74 20   pCsr->aDoclist 
17fe0 3d 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e  = apSegment[0]->
17ff0 61 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20  aDoclist;.      
18000 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
18010 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
18020 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 20   SQLITE_ROW;.   
18030 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
18040 74 20 6e 44 6f 63 6c 69 73 74 20 3d 20 30 3b 20  t nDoclist = 0; 
18050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
18060 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 2a 2f 0a  e of doclist */.
18070 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
18080 74 36 34 20 69 50 72 65 76 20 3d 20 30 3b 20 20  t64 iPrev = 0;  
18090 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 64 6f    /* Previous do
180a0 63 69 64 20 73 74 6f 72 65 64 20 69 6e 20 64 6f  cid stored in do
180b0 63 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20  clist */..      
180c0 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 74  /* The current t
180d0 65 72 6d 20 6f 66 20 74 68 65 20 66 69 72 73 74  erm of the first
180e0 20 6e 4d 65 72 67 65 20 65 6e 74 72 69 65 73 20   nMerge entries 
180f0 69 6e 20 74 68 65 20 61 72 72 61 79 0a 20 20 20  in the array.   
18100 20 20 20 2a 2a 20 6f 66 20 46 74 73 33 53 65 67     ** of Fts3Seg
18110 52 65 61 64 65 72 20 6f 62 6a 65 63 74 73 20 69  Reader objects i
18120 73 20 74 68 65 20 73 61 6d 65 2e 20 54 68 65 20  s the same. The 
18130 64 6f 63 6c 69 73 74 73 20 6d 75 73 74 20 62 65  doclists must be
18140 20 6d 65 72 67 65 64 0a 20 20 20 20 20 20 2a 2a   merged.      **
18150 20 61 6e 64 20 61 20 73 69 6e 67 6c 65 20 74 65   and a single te
18160 72 6d 20 72 65 74 75 72 6e 65 64 20 77 69 74 68  rm returned with
18170 20 74 68 65 20 6d 65 72 67 65 64 20 64 6f 63 6c   the merged docl
18180 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ist..      */.  
18190 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
181a0 4d 65 72 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  Merge; i++){.   
181b0 20 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64       fts3SegRead
181c0 65 72 46 69 72 73 74 44 6f 63 69 64 28 70 2c 20  erFirstDocid(p, 
181d0 61 70 53 65 67 6d 65 6e 74 5b 69 5d 29 3b 0a 20  apSegment[i]);. 
181e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73       }.      fts
181f0 33 53 65 67 52 65 61 64 65 72 53 6f 72 74 28 61  3SegReaderSort(a
18200 70 53 65 67 6d 65 6e 74 2c 20 6e 4d 65 72 67 65  pSegment, nMerge
18210 2c 20 6e 4d 65 72 67 65 2c 20 78 43 6d 70 29 3b  , nMerge, xCmp);
18220 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 61 70  .      while( ap
18230 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 70 4f 66 66  Segment[0]->pOff
18240 73 65 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  setList ){.     
18250 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20     int j;       
18260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18270 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e  Number of segmen
18280 74 73 20 74 68 61 74 20 73 68 61 72 65 20 61 20  ts that share a 
18290 64 6f 63 69 64 20 2a 2f 0a 20 20 20 20 20 20 20  docid */.       
182a0 20 63 68 61 72 20 2a 70 4c 69 73 74 20 3d 20 30   char *pList = 0
182b0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4c  ;.        int nL
182c0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
182d0 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20 20   int nByte;.    
182e0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
182f0 34 20 69 44 6f 63 69 64 20 3d 20 61 70 53 65 67  4 iDocid = apSeg
18300 6d 65 6e 74 5b 30 5d 2d 3e 69 44 6f 63 69 64 3b  ment[0]->iDocid;
18310 0a 20 20 20 20 20 20 20 20 66 74 73 33 53 65 67  .        fts3Seg
18320 52 65 61 64 65 72 4e 65 78 74 44 6f 63 69 64 28  ReaderNextDocid(
18330 70 2c 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2c  p, apSegment[0],
18340 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29   &pList, &nList)
18350 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 31 3b  ;.        j = 1;
18360 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
18370 6a 3c 6e 4d 65 72 67 65 0a 20 20 20 20 20 20 20  j<nMerge.       
18380 20 20 20 20 20 26 26 20 61 70 53 65 67 6d 65 6e       && apSegmen
18390 74 5b 6a 5d 2d 3e 70 4f 66 66 73 65 74 4c 69 73  t[j]->pOffsetLis
183a0 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  t.            &&
183b0 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2d 3e 69   apSegment[j]->i
183c0 44 6f 63 69 64 3d 3d 69 44 6f 63 69 64 0a 20 20  Docid==iDocid.  
183d0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
183e0 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72     fts3SegReader
183f0 4e 65 78 74 44 6f 63 69 64 28 70 2c 20 61 70 53  NextDocid(p, apS
18400 65 67 6d 65 6e 74 5b 6a 5d 2c 20 30 2c 20 30 29  egment[j], 0, 0)
18410 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b  ;.          j++;
18420 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
18430 20 20 20 20 69 66 28 20 69 73 43 6f 6c 46 69 6c      if( isColFil
18440 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ter ){.         
18450 20 66 74 73 33 43 6f 6c 75 6d 6e 46 69 6c 74 65   fts3ColumnFilte
18460 72 28 70 46 69 6c 74 65 72 2d 3e 69 43 6f 6c 2c  r(pFilter->iCol,
18470 20 30 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69   0, &pList, &nLi
18480 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  st);.        }..
18490 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73 49          if( !isI
184a0 67 6e 6f 72 65 45 6d 70 74 79 20 7c 7c 20 6e 4c  gnoreEmpty || nL
184b0 69 73 74 3e 30 20 29 7b 0a 0a 20 20 20 20 20 20  ist>0 ){..      
184c0 20 20 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65      /* Calculate
184d0 20 74 68 65 20 27 64 6f 63 69 64 27 20 64 65 6c   the 'docid' del
184e0 74 61 20 76 61 6c 75 65 20 74 6f 20 77 72 69 74  ta value to writ
184f0 65 20 69 6e 74 6f 20 74 68 65 20 6d 65 72 67 65  e into the merge
18500 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  d .          ** 
18510 64 6f 63 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20  doclist. */.    
18520 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
18530 74 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20  t64 iDelta;.    
18540 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 44 65        if( p->bDe
18550 73 63 49 64 78 20 26 26 20 6e 44 6f 63 6c 69 73  scIdx && nDoclis
18560 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  t>0 ){.         
18570 20 20 20 69 44 65 6c 74 61 20 3d 20 69 50 72 65     iDelta = iPre
18580 76 20 2d 20 69 44 6f 63 69 64 3b 0a 20 20 20 20  v - iDocid;.    
18590 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
185a0 20 20 20 20 20 20 20 20 20 69 44 65 6c 74 61 20           iDelta 
185b0 3d 20 69 44 6f 63 69 64 20 2d 20 69 50 72 65 76  = iDocid - iPrev
185c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
185d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
185e0 69 44 65 6c 74 61 3e 30 20 7c 7c 20 28 6e 44 6f  iDelta>0 || (nDo
185f0 63 6c 69 73 74 3d 3d 30 20 26 26 20 69 44 65 6c  clist==0 && iDel
18600 74 61 3d 3d 69 44 6f 63 69 64 29 20 29 3b 0a 20  ta==iDocid) );. 
18610 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
18620 20 6e 44 6f 63 6c 69 73 74 3e 30 20 7c 7c 20 69   nDoclist>0 || i
18630 44 65 6c 74 61 3d 3d 69 44 6f 63 69 64 20 29 3b  Delta==iDocid );
18640 0a 0a 20 20 20 20 20 20 20 20 20 20 6e 42 79 74  ..          nByt
18650 65 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56  e = sqlite3Fts3V
18660 61 72 69 6e 74 4c 65 6e 28 69 44 65 6c 74 61 29  arintLen(iDelta)
18670 20 2b 20 28 69 73 52 65 71 75 69 72 65 50 6f 73   + (isRequirePos
18680 3f 6e 4c 69 73 74 2b 31 3a 30 29 3b 0a 20 20 20  ?nList+1:0);.   
18690 20 20 20 20 20 20 20 69 66 28 20 6e 44 6f 63 6c         if( nDocl
186a0 69 73 74 2b 6e 42 79 74 65 3e 70 43 73 72 2d 3e  ist+nByte>pCsr->
186b0 6e 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20  nBuffer ){.     
186c0 20 20 20 20 20 20 20 63 68 61 72 20 2a 61 4e 65         char *aNe
186d0 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  w;.            p
186e0 43 73 72 2d 3e 6e 42 75 66 66 65 72 20 3d 20 28  Csr->nBuffer = (
186f0 6e 44 6f 63 6c 69 73 74 2b 6e 42 79 74 65 29 2a  nDoclist+nByte)*
18700 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  2;.            a
18710 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  New = sqlite3_re
18720 61 6c 6c 6f 63 28 70 43 73 72 2d 3e 61 42 75 66  alloc(pCsr->aBuf
18730 66 65 72 2c 20 70 43 73 72 2d 3e 6e 42 75 66 66  fer, pCsr->nBuff
18740 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  er);.           
18750 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a 20 20   if( !aNew ){.  
18760 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
18770 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
18780 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
18790 20 20 20 20 20 20 20 20 20 20 20 70 43 73 72 2d             pCsr-
187a0 3e 61 42 75 66 66 65 72 20 3d 20 61 4e 65 77 3b  >aBuffer = aNew;
187b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
187c0 20 20 20 20 20 20 20 20 69 66 28 20 69 73 46 69          if( isFi
187d0 72 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rst ){.         
187e0 20 20 20 63 68 61 72 20 2a 61 20 3d 20 26 70 43     char *a = &pC
187f0 73 72 2d 3e 61 42 75 66 66 65 72 5b 6e 44 6f 63  sr->aBuffer[nDoc
18800 6c 69 73 74 5d 3b 0a 20 20 20 20 20 20 20 20 20  list];.         
18810 20 20 20 69 6e 74 20 6e 57 72 69 74 65 3b 0a 20     int nWrite;. 
18820 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
18830 20 20 20 20 20 20 20 6e 57 72 69 74 65 20 3d 20         nWrite = 
18840 73 71 6c 69 74 65 33 46 74 73 33 46 69 72 73 74  sqlite3Fts3First
18850 46 69 6c 74 65 72 28 69 44 65 6c 74 61 2c 20 70  Filter(iDelta, p
18860 4c 69 73 74 2c 20 6e 4c 69 73 74 2c 20 61 29 3b  List, nList, a);
18870 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
18880 20 6e 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20   nWrite ){.     
18890 20 20 20 20 20 20 20 20 20 69 50 72 65 76 20 3d           iPrev =
188a0 20 69 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20   iDocid;.       
188b0 20 20 20 20 20 20 20 6e 44 6f 63 6c 69 73 74 20         nDoclist 
188c0 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20  += nWrite;.     
188d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
188e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
188f0 20 20 20 20 20 20 6e 44 6f 63 6c 69 73 74 20 2b        nDoclist +
18900 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74  = sqlite3Fts3Put
18910 56 61 72 69 6e 74 28 26 70 43 73 72 2d 3e 61 42  Varint(&pCsr->aB
18920 75 66 66 65 72 5b 6e 44 6f 63 6c 69 73 74 5d 2c  uffer[nDoclist],
18930 20 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20   iDelta);.      
18940 20 20 20 20 20 20 69 50 72 65 76 20 3d 20 69 44        iPrev = iD
18950 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20  ocid;.          
18960 20 20 69 66 28 20 69 73 52 65 71 75 69 72 65 50    if( isRequireP
18970 6f 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  os ){.          
18980 20 20 20 20 6d 65 6d 63 70 79 28 26 70 43 73 72      memcpy(&pCsr
18990 2d 3e 61 42 75 66 66 65 72 5b 6e 44 6f 63 6c 69  ->aBuffer[nDocli
189a0 73 74 5d 2c 20 70 4c 69 73 74 2c 20 6e 4c 69 73  st], pList, nLis
189b0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
189c0 20 20 6e 44 6f 63 6c 69 73 74 20 2b 3d 20 6e 4c    nDoclist += nL
189d0 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ist;.           
189e0 20 20 20 70 43 73 72 2d 3e 61 42 75 66 66 65 72     pCsr->aBuffer
189f0 5b 6e 44 6f 63 6c 69 73 74 2b 2b 5d 20 3d 20 27  [nDoclist++] = '
18a00 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20  \0';.           
18a10 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
18a20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
18a30 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72 53    fts3SegReaderS
18a40 6f 72 74 28 61 70 53 65 67 6d 65 6e 74 2c 20 6e  ort(apSegment, n
18a50 4d 65 72 67 65 2c 20 6a 2c 20 78 43 6d 70 29 3b  Merge, j, xCmp);
18a60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
18a70 66 28 20 6e 44 6f 63 6c 69 73 74 3e 30 20 29 7b  f( nDoclist>0 ){
18a80 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 61  .        pCsr->a
18a90 44 6f 63 6c 69 73 74 20 3d 20 70 43 73 72 2d 3e  Doclist = pCsr->
18aa0 61 42 75 66 66 65 72 3b 0a 20 20 20 20 20 20 20  aBuffer;.       
18ab0 20 70 43 73 72 2d 3e 6e 44 6f 63 6c 69 73 74 20   pCsr->nDoclist 
18ac0 3d 20 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20  = nDoclist;.    
18ad0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18ae0 52 4f 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROW;.      }.   
18af0 20 7d 0a 20 20 20 20 70 43 73 72 2d 3e 6e 41 64   }.    pCsr->nAd
18b00 76 61 6e 63 65 20 3d 20 6e 4d 65 72 67 65 3b 0a  vance = nMerge;.
18b10 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
18b20 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 72 65  LITE_OK );..  re
18b30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 76 6f 69  turn rc;.}...voi
18b40 64 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  d sqlite3Fts3Seg
18b50 52 65 61 64 65 72 46 69 6e 69 73 68 28 0a 20 20  ReaderFinish(.  
18b60 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
18b70 65 72 20 2a 70 43 73 72 20 20 20 20 20 20 20 2f  er *pCsr       /
18b80 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  * Cursor object 
18b90 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 43 73 72  */.){.  if( pCsr
18ba0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
18bb0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
18bc0 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 20 69 2b  sr->nSegment; i+
18bd0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
18be0 33 46 74 73 33 53 65 67 52 65 61 64 65 72 46 72  3Fts3SegReaderFr
18bf0 65 65 28 70 43 73 72 2d 3e 61 70 53 65 67 6d 65  ee(pCsr->apSegme
18c00 6e 74 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  nt[i]);.    }.  
18c10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
18c20 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 29 3b  Csr->apSegment);
18c30 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
18c40 65 28 70 43 73 72 2d 3e 61 42 75 66 66 65 72 29  e(pCsr->aBuffer)
18c50 3b 0a 0a 20 20 20 20 70 43 73 72 2d 3e 6e 53 65  ;..    pCsr->nSe
18c60 67 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70  gment = 0;.    p
18c70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 20 3d  Csr->apSegment =
18c80 20 30 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 42   0;.    pCsr->aB
18c90 75 66 66 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 7d  uffer = 0;.  }.}
18ca0 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74  ../*.** Decode t
18cb0 68 65 20 22 65 6e 64 5f 62 6c 6f 63 6b 22 20 66  he "end_block" f
18cc0 69 65 6c 64 2c 20 73 65 6c 65 63 74 65 64 20 62  ield, selected b
18cd0 79 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20 6f 66  y column iCol of
18ce0 20 74 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20   the SELECT .** 
18cf0 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
18d00 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
18d10 67 75 6d 65 6e 74 2e 20 0a 2a 2a 0a 2a 2a 20 54  gument. .**.** T
18d20 68 65 20 22 65 6e 64 5f 62 6c 6f 63 6b 22 20 66  he "end_block" f
18d30 69 65 6c 64 20 6d 61 79 20 63 6f 6e 74 61 69 6e  ield may contain
18d40 20 65 69 74 68 65 72 20 61 6e 20 69 6e 74 65 67   either an integ
18d50 65 72 2c 20 6f 72 20 61 20 74 65 78 74 20 66 69  er, or a text fi
18d60 65 6c 64 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e  eld.** containin
18d70 67 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65  g the text repre
18d80 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 77 6f  sentation of two
18d90 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e   non-negative in
18da0 74 65 67 65 72 73 20 73 65 70 61 72 61 74 65 64  tegers separated
18db0 20 0a 2a 2a 20 62 79 20 6f 6e 65 20 6f 72 20 6d   .** by one or m
18dc0 6f 72 65 20 73 70 61 63 65 20 28 30 78 32 30 29  ore space (0x20)
18dd0 20 63 68 61 72 61 63 74 65 72 73 2e 20 49 6e 20   characters. In 
18de0 74 68 65 20 66 69 72 73 74 20 63 61 73 65 2c 20  the first case, 
18df0 73 65 74 20 2a 70 69 45 6e 64 42 6c 6f 63 6b 20  set *piEndBlock 
18e00 0a 2a 2a 20 74 6f 20 74 68 65 20 69 6e 74 65 67  .** to the integ
18e10 65 72 20 76 61 6c 75 65 20 61 6e 64 20 2a 70 6e  er value and *pn
18e20 42 79 74 65 20 74 6f 20 7a 65 72 6f 20 62 65 66  Byte to zero bef
18e30 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 49  ore returning. I
18e40 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 0a 2a  n the second, .*
18e50 2a 20 73 65 74 20 2a 70 69 45 6e 64 42 6c 6f 63  * set *piEndBloc
18e60 6b 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 76  k to the first v
18e70 61 6c 75 65 20 61 6e 64 20 2a 70 6e 42 79 74 65  alue and *pnByte
18e80 20 74 6f 20 74 68 65 20 73 65 63 6f 6e 64 2e 0a   to the second..
18e90 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
18ea0 74 73 33 52 65 61 64 45 6e 64 42 6c 6f 63 6b 46  ts3ReadEndBlockF
18eb0 69 65 6c 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  ield(.  sqlite3_
18ec0 73 74 6d 74 20 2a 70 53 74 6d 74 2c 20 0a 20 20  stmt *pStmt, .  
18ed0 69 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69 36 34  int iCol, .  i64
18ee0 20 2a 70 69 45 6e 64 42 6c 6f 63 6b 2c 0a 20 20   *piEndBlock,.  
18ef0 69 36 34 20 2a 70 6e 42 79 74 65 0a 29 7b 0a 20  i64 *pnByte.){. 
18f00 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
18f10 63 68 61 72 20 2a 7a 54 65 78 74 20 3d 20 73 71  char *zText = sq
18f20 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
18f30 74 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a  t(pStmt, iCol);.
18f40 20 20 69 66 28 20 7a 54 65 78 74 20 29 7b 0a 20    if( zText ){. 
18f50 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
18f60 74 20 69 4d 75 6c 20 3d 20 31 3b 0a 20 20 20 20  t iMul = 1;.    
18f70 69 36 34 20 69 56 61 6c 20 3d 20 30 3b 0a 20 20  i64 iVal = 0;.  
18f80 20 20 66 6f 72 28 69 3d 30 3b 20 7a 54 65 78 74    for(i=0; zText
18f90 5b 69 5d 3e 3d 27 30 27 20 26 26 20 7a 54 65 78  [i]>='0' && zTex
18fa0 74 5b 69 5d 3c 3d 27 39 27 3b 20 69 2b 2b 29 7b  t[i]<='9'; i++){
18fb0 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20 69 56  .      iVal = iV
18fc0 61 6c 2a 31 30 20 2b 20 28 7a 54 65 78 74 5b 69  al*10 + (zText[i
18fd0 5d 20 2d 20 27 30 27 29 3b 0a 20 20 20 20 7d 0a  ] - '0');.    }.
18fe0 20 20 20 20 2a 70 69 45 6e 64 42 6c 6f 63 6b 20      *piEndBlock 
18ff0 3d 20 69 56 61 6c 3b 0a 20 20 20 20 77 68 69 6c  = iVal;.    whil
19000 65 28 20 7a 54 65 78 74 5b 69 5d 3d 3d 27 20 27  e( zText[i]==' '
19010 20 29 20 69 2b 2b 3b 0a 20 20 20 20 69 56 61 6c   ) i++;.    iVal
19020 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 54   = 0;.    if( zT
19030 65 78 74 5b 69 5d 3d 3d 27 2d 27 20 29 7b 0a 20  ext[i]=='-' ){. 
19040 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
19050 69 4d 75 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  iMul = -1;.    }
19060 0a 20 20 20 20 66 6f 72 28 2f 2a 20 6e 6f 2d 6f  .    for(/* no-o
19070 70 20 2a 2f 3b 20 7a 54 65 78 74 5b 69 5d 3e 3d  p */; zText[i]>=
19080 27 30 27 20 26 26 20 7a 54 65 78 74 5b 69 5d 3c  '0' && zText[i]<
19090 3d 27 39 27 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ='9'; i++){.    
190a0 20 20 69 56 61 6c 20 3d 20 69 56 61 6c 2a 31 30    iVal = iVal*10
190b0 20 2b 20 28 7a 54 65 78 74 5b 69 5d 20 2d 20 27   + (zText[i] - '
190c0 30 27 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  0');.    }.    *
190d0 70 6e 42 79 74 65 20 3d 20 28 69 56 61 6c 20 2a  pnByte = (iVal *
190e0 20 28 69 36 34 29 69 4d 75 6c 29 3b 0a 20 20 7d   (i64)iMul);.  }
190f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 65 67  .}.../*.** A seg
19100 6d 65 6e 74 20 6f 66 20 73 69 7a 65 20 6e 42 79  ment of size nBy
19110 74 65 20 62 79 74 65 73 20 68 61 73 20 6a 75 73  te bytes has jus
19120 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  t been written t
19130 6f 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c  o absolute level
19140 0a 2a 2a 20 69 41 62 73 4c 65 76 65 6c 2e 20 50  .** iAbsLevel. P
19150 72 6f 6d 6f 74 65 20 61 6e 79 20 73 65 67 6d 65  romote any segme
19160 6e 74 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20  nts that should 
19170 62 65 20 70 72 6f 6d 6f 74 65 64 20 61 73 20 61  be promoted as a
19180 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74   result..*/.stat
19190 69 63 20 69 6e 74 20 66 74 73 33 50 72 6f 6d 6f  ic int fts3Promo
191a0 74 65 53 65 67 6d 65 6e 74 73 28 0a 20 20 46 74  teSegments(.  Ft
191b0 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
191c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
191d0 20 46 54 53 20 74 61 62 6c 65 20 68 61 6e 64 6c   FTS table handl
191e0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
191f0 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c 2c 20  nt64 iAbsLevel, 
19200 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75         /* Absolu
19210 74 65 20 6c 65 76 65 6c 20 6a 75 73 74 20 75 70  te level just up
19220 64 61 74 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  dated */.  sqlit
19230 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 20  e3_int64 nByte  
19240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
19250 7a 65 20 6f 66 20 6e 65 77 20 73 65 67 6d 65 6e  ze of new segmen
19260 74 20 61 74 20 69 41 62 73 4c 65 76 65 6c 20 2a  t at iAbsLevel *
19270 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
19280 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c  SQLITE_OK;.  sql
19290 69 74 65 33 5f 73 74 6d 74 20 2a 70 52 61 6e 67  ite3_stmt *pRang
192a0 65 3b 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53  e;..  rc = fts3S
192b0 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45  qlStmt(p, SQL_SE
192c0 4c 45 43 54 5f 4c 45 56 45 4c 5f 52 41 4e 47 45  LECT_LEVEL_RANGE
192d0 32 2c 20 26 70 52 61 6e 67 65 2c 20 30 29 3b 0a  2, &pRange, 0);.
192e0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
192f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
19300 62 4f 6b 20 3d 20 30 3b 0a 20 20 20 20 69 36 34  bOk = 0;.    i64
19310 20 69 4c 61 73 74 20 3d 20 28 69 41 62 73 4c 65   iLast = (iAbsLe
19320 76 65 6c 2f 46 54 53 33 5f 53 45 47 44 49 52 5f  vel/FTS3_SEGDIR_
19330 4d 41 58 4c 45 56 45 4c 20 2b 20 31 29 20 2a 20  MAXLEVEL + 1) * 
19340 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c  FTS3_SEGDIR_MAXL
19350 45 56 45 4c 20 2d 20 31 3b 0a 20 20 20 20 69 36  EVEL - 1;.    i6
19360 34 20 6e 4c 69 6d 69 74 20 3d 20 28 6e 42 79 74  4 nLimit = (nByt
19370 65 2a 33 29 2f 32 3b 0a 0a 20 20 20 20 2f 2a 20  e*3)/2;..    /* 
19380 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
19390 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
193a0 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 20 63  %_segdir table c
193b0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
193c0 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 73  .    ** segments
193d0 20 69 6e 20 74 68 69 73 20 69 6e 64 65 78 20 6f   in this index o
193e0 6e 20 6c 65 76 65 6c 73 20 67 72 65 61 74 65 72  n levels greater
193f0 20 74 68 61 6e 20 69 41 62 73 4c 65 76 65 6c 2e   than iAbsLevel.
19400 20 49 66 20 74 68 65 72 65 20 69 73 0a 20 20 20   If there is.   
19410 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
19420 20 73 75 63 68 20 73 65 67 6d 65 6e 74 2c 20 61   such segment, a
19430 6e 64 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  nd it is possibl
19440 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  e to determine t
19450 68 61 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20  hat all .    ** 
19460 73 75 63 68 20 73 65 67 6d 65 6e 74 73 20 61 72  such segments ar
19470 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6e  e smaller than n
19480 4c 69 6d 69 74 20 62 79 74 65 73 20 69 6e 20 73  Limit bytes in s
19490 69 7a 65 2c 20 74 68 65 79 20 77 69 6c 6c 20 62  ize, they will b
194a0 65 20 0a 20 20 20 20 2a 2a 20 70 72 6f 6d 6f 74  e .    ** promot
194b0 65 64 20 74 6f 20 6c 65 76 65 6c 20 69 41 62 73  ed to level iAbs
194c0 4c 65 76 65 6c 2e 20 20 2a 2f 0a 20 20 20 20 73  Level.  */.    s
194d0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
194e0 34 28 70 52 61 6e 67 65 2c 20 31 2c 20 69 41 62  4(pRange, 1, iAb
194f0 73 4c 65 76 65 6c 2b 31 29 3b 0a 20 20 20 20 73  sLevel+1);.    s
19500 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
19510 34 28 70 52 61 6e 67 65 2c 20 32 2c 20 69 4c 61  4(pRange, 2, iLa
19520 73 74 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  st);.    while( 
19530 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
19540 74 65 33 5f 73 74 65 70 28 70 52 61 6e 67 65 29  te3_step(pRange)
19550 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6e 53   ){.      i64 nS
19560 69 7a 65 20 3d 20 30 2c 20 64 75 6d 6d 79 3b 0a  ize = 0, dummy;.
19570 20 20 20 20 20 20 66 74 73 33 52 65 61 64 45 6e        fts3ReadEn
19580 64 42 6c 6f 63 6b 46 69 65 6c 64 28 70 52 61 6e  dBlockField(pRan
19590 67 65 2c 20 32 2c 20 26 64 75 6d 6d 79 2c 20 26  ge, 2, &dummy, &
195a0 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  nSize);.      if
195b0 28 20 6e 53 69 7a 65 3c 3d 30 20 7c 7c 20 6e 53  ( nSize<=0 || nS
195c0 69 7a 65 3e 6e 4c 69 6d 69 74 20 29 7b 0a 20 20  ize>nLimit ){.  
195d0 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 53 69 7a        /* If nSiz
195e0 65 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 25  e==0, then the %
195f0 5f 73 65 67 64 69 72 2e 65 6e 64 5f 62 6c 6f 63  _segdir.end_bloc
19600 6b 20 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74  k field does not
19610 20 6e 6f 74 20 0a 20 20 20 20 20 20 20 20 2a 2a   not .        **
19620 20 63 6f 6e 74 61 69 6e 20 61 20 73 69 7a 65 20   contain a size 
19630 76 61 6c 75 65 2e 20 54 68 69 73 20 68 61 70 70  value. This happ
19640 65 6e 73 20 69 66 20 69 74 20 77 61 73 20 77 72  ens if it was wr
19650 69 74 74 65 6e 20 62 79 20 61 6e 0a 20 20 20 20  itten by an.    
19660 20 20 20 20 2a 2a 20 6f 6c 64 20 76 65 72 73 69      ** old versi
19670 6f 6e 20 6f 66 20 46 54 53 2e 20 49 6e 20 74 68  on of FTS. In th
19680 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f  is case it is no
19690 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  t possible to de
196a0 74 65 72 6d 69 6e 65 0a 20 20 20 20 20 20 20 20  termine.        
196b0 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ** the size of t
196c0 68 65 20 73 65 67 6d 65 6e 74 2c 20 61 6e 64 20  he segment, and 
196d0 73 6f 20 73 65 67 6d 65 6e 74 20 70 72 6f 6d 6f  so segment promo
196e0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0a 20 20  tion does not.  
196f0 20 20 20 20 20 20 2a 2a 20 74 61 6b 65 20 70 6c        ** take pl
19700 61 63 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ace.  */.       
19710 20 62 4f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20   bOk = 0;.      
19720 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
19730 0a 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a  .      bOk = 1;.
19740 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
19750 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 52 61  qlite3_reset(pRa
19760 6e 67 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 62  nge);..    if( b
19770 4f 6b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  Ok ){.      int 
19780 69 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  iIdx = 0;.      
19790 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 55  sqlite3_stmt *pU
197a0 70 64 61 74 65 31 20 3d 20 30 3b 0a 20 20 20 20  pdate1 = 0;.    
197b0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
197c0 70 55 70 64 61 74 65 32 20 3d 20 30 3b 0a 0a 20  pUpdate2 = 0;.. 
197d0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
197e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
197f0 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
19800 6d 74 28 70 2c 20 53 51 4c 5f 55 50 44 41 54 45  mt(p, SQL_UPDATE
19810 5f 4c 45 56 45 4c 5f 49 44 58 2c 20 26 70 55 70  _LEVEL_IDX, &pUp
19820 64 61 74 65 31 2c 20 30 29 3b 0a 20 20 20 20 20  date1, 0);.     
19830 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
19840 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19850 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 53        rc = fts3S
19860 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 55 50  qlStmt(p, SQL_UP
19870 44 41 54 45 5f 4c 45 56 45 4c 2c 20 26 70 55 70  DATE_LEVEL, &pUp
19880 64 61 74 65 32 2c 20 30 29 3b 0a 20 20 20 20 20  date2, 0);.     
19890 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
198a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a  ==SQLITE_OK ){..
198b0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
198c0 74 68 72 6f 75 67 68 20 61 6c 6c 20 25 5f 73 65  through all %_se
198d0 67 64 69 72 20 65 6e 74 72 69 65 73 20 66 6f 72  gdir entries for
198e0 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 69   segments in thi
198f0 73 20 69 6e 64 65 78 20 77 69 74 68 0a 20 20 20  s index with.   
19900 20 20 20 20 20 2a 2a 20 6c 65 76 65 6c 73 20 65       ** levels e
19910 71 75 61 6c 20 74 6f 20 6f 72 20 67 72 65 61 74  qual to or great
19920 65 72 20 74 68 61 6e 20 69 41 62 73 4c 65 76 65  er than iAbsLeve
19930 6c 2e 20 41 73 20 65 61 63 68 20 65 6e 74 72 79  l. As each entry
19940 20 69 73 20 76 69 73 69 74 65 64 2c 0a 20 20 20   is visited,.   
19950 20 20 20 20 20 2a 2a 20 75 70 64 61 74 65 64 20       ** updated 
19960 69 74 20 74 6f 20 73 65 74 20 28 6c 65 76 65 6c  it to set (level
19970 20 3d 20 2d 31 29 20 61 6e 64 20 28 69 64 78 20   = -1) and (idx 
19980 3d 20 4e 29 2c 20 77 68 65 72 65 20 4e 20 69 73  = N), where N is
19990 20 30 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20   0 for the.     
199a0 20 20 20 2a 2a 20 6f 6c 64 65 73 74 20 73 65 67     ** oldest seg
199b0 6d 65 6e 74 20 69 6e 20 74 68 65 20 72 61 6e 67  ment in the rang
199c0 65 2c 20 31 20 66 6f 72 20 74 68 65 20 6e 65 78  e, 1 for the nex
199d0 74 20 6f 6c 64 65 73 74 2c 20 61 6e 64 20 73 6f  t oldest, and so
199e0 20 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a   on..        **.
199f0 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 74          ** In ot
19a00 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f 76 65 20  her words, move 
19a10 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 62 65 69  all segments bei
19a20 6e 67 20 70 72 6f 6d 6f 74 65 64 20 74 6f 20 6c  ng promoted to l
19a30 65 76 65 6c 20 2d 31 2c 0a 20 20 20 20 20 20 20  evel -1,.       
19a40 20 2a 2a 20 73 65 74 74 69 6e 67 20 74 68 65 20   ** setting the 
19a50 22 69 64 78 22 20 66 69 65 6c 64 73 20 61 73 20  "idx" fields as 
19a60 61 70 70 72 6f 70 72 69 61 74 65 20 74 6f 20 6b  appropriate to k
19a70 65 65 70 20 74 68 65 6d 20 69 6e 20 74 68 65 20  eep them in the 
19a80 73 61 6d 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  same.        ** 
19a90 6f 72 64 65 72 2e 20 54 68 65 20 63 6f 6e 74 65  order. The conte
19aa0 6e 74 73 20 6f 66 20 6c 65 76 65 6c 20 2d 31 20  nts of level -1 
19ab0 28 77 68 69 63 68 20 69 73 20 6e 65 76 65 72 20  (which is never 
19ac0 75 73 65 64 2c 20 65 78 63 65 70 74 0a 20 20 20  used, except.   
19ad0 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e       ** transien
19ae0 74 6c 79 20 68 65 72 65 29 2c 20 77 69 6c 6c 20  tly here), will 
19af0 62 65 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f  be moved back to
19b00 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c   level iAbsLevel
19b10 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20   below.  */.    
19b20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
19b30 5f 69 6e 74 36 34 28 70 52 61 6e 67 65 2c 20 31  _int64(pRange, 1
19b40 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20  , iAbsLevel);.  
19b50 20 20 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c        while( SQL
19b60 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
19b70 5f 73 74 65 70 28 70 52 61 6e 67 65 29 20 29 7b  _step(pRange) ){
19b80 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
19b90 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 55 70 64  e3_bind_int(pUpd
19ba0 61 74 65 31 2c 20 31 2c 20 69 49 64 78 2b 2b 29  ate1, 1, iIdx++)
19bb0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
19bc0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 55 70  te3_bind_int(pUp
19bd0 64 61 74 65 31 2c 20 32 2c 20 73 71 6c 69 74 65  date1, 2, sqlite
19be0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 52 61  3_column_int(pRa
19bf0 6e 67 65 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  nge, 0));.      
19c00 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
19c10 5f 69 6e 74 28 70 55 70 64 61 74 65 31 2c 20 33  _int(pUpdate1, 3
19c20 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
19c30 5f 69 6e 74 28 70 52 61 6e 67 65 2c 20 31 29 29  _int(pRange, 1))
19c40 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
19c50 74 65 33 5f 73 74 65 70 28 70 55 70 64 61 74 65  te3_step(pUpdate
19c60 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  1);.          rc
19c70 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
19c80 28 70 55 70 64 61 74 65 31 29 3b 0a 20 20 20 20  (pUpdate1);.    
19c90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
19ca0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19cb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
19cc0 65 73 65 74 28 70 52 61 6e 67 65 29 3b 0a 20 20  eset(pRange);.  
19cd0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
19ce0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
19cf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
19d00 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
19d10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19d20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
19d30 65 73 65 74 28 70 52 61 6e 67 65 29 3b 0a 20 20  eset(pRange);.  
19d40 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
19d50 4d 6f 76 65 20 6c 65 76 65 6c 20 2d 31 20 74 6f  Move level -1 to
19d60 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c   level iAbsLevel
19d70 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63   */.      if( rc
19d80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19d90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
19da0 69 6e 64 5f 69 6e 74 36 34 28 70 55 70 64 61 74  ind_int64(pUpdat
19db0 65 32 2c 20 31 2c 20 69 41 62 73 4c 65 76 65 6c  e2, 1, iAbsLevel
19dc0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
19dd0 65 33 5f 73 74 65 70 28 70 55 70 64 61 74 65 32  e3_step(pUpdate2
19de0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
19df0 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 55  sqlite3_reset(pU
19e00 70 64 61 74 65 32 29 3b 0a 20 20 20 20 20 20 7d  pdate2);.      }
19e10 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 72  .    }.  }...  r
19e20 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19e30 2a 2a 20 4d 65 72 67 65 20 61 6c 6c 20 6c 65 76  ** Merge all lev
19e40 65 6c 20 69 4c 65 76 65 6c 20 73 65 67 6d 65 6e  el iLevel segmen
19e50 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ts in the databa
19e60 73 65 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  se into a single
19e70 20 0a 2a 2a 20 69 4c 65 76 65 6c 2b 31 20 73 65   .** iLevel+1 se
19e80 67 6d 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 4c  gment. Or, if iL
19e90 65 76 65 6c 3c 30 2c 20 6d 65 72 67 65 20 61 6c  evel<0, merge al
19ea0 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 74 6f 20  l segments into 
19eb0 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 73 65 67 6d  a.** single segm
19ec0 65 6e 74 20 77 69 74 68 20 61 20 6c 65 76 65 6c  ent with a level
19ed0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6e 75   equal to the nu
19ee0 6d 65 72 69 63 61 6c 6c 79 20 6c 61 72 67 65 73  merically larges
19ef0 74 20 6c 65 76 65 6c 20 0a 2a 2a 20 63 75 72 72  t level .** curr
19f00 65 6e 74 6c 79 20 70 72 65 73 65 6e 74 20 69 6e  ently present in
19f10 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
19f20 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e  *.** If this fun
19f30 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
19f40 77 69 74 68 20 69 4c 65 76 65 6c 3c 30 2c 20 62  with iLevel<0, b
19f50 75 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79  ut there is only
19f60 20 6f 6e 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 20   one.** segment 
19f70 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  in the database,
19f80 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
19f90 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61  returned immedia
19fa0 74 65 6c 79 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  tely. .** Otherw
19fb0 69 73 65 2c 20 69 66 20 73 75 63 63 65 73 73 66  ise, if successf
19fc0 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
19fd0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
19fe0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 0a   error occurs, .
19ff0 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  ** an SQLite err
1a000 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1a010 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
1a020 6e 74 20 66 74 73 33 53 65 67 6d 65 6e 74 4d 65  nt fts3SegmentMe
1a030 72 67 65 28 0a 20 20 46 74 73 33 54 61 62 6c 65  rge(.  Fts3Table
1a040 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 4c 61 6e   *p, .  int iLan
1a050 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  gid,            
1a060 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75          /* Langu
1a070 61 67 65 20 69 64 20 74 6f 20 6d 65 72 67 65 20  age id to merge 
1a080 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 2c  */.  int iIndex,
1a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0a0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
1a0b0 20 70 2d 3e 61 49 6e 64 65 78 5b 5d 20 74 6f 20   p->aIndex[] to 
1a0c0 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69  merge */.  int i
1a0d0 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20 20 20  Level           
1a0e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
1a0f0 76 65 6c 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a  vel to merge */.
1a100 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1a110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a120 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1a130 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ode */.  int iId
1a140 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  x = 0;          
1a150 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1a160 78 20 6f 66 20 6e 65 77 20 73 65 67 6d 65 6e 74  x of new segment
1a170 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
1a180 74 36 34 20 69 4e 65 77 4c 65 76 65 6c 20 3d 20  t64 iNewLevel = 
1a190 30 3b 20 20 20 20 2f 2a 20 4c 65 76 65 6c 2f 69  0;    /* Level/i
1a1a0 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 6e  ndex to create n
1a1b0 65 77 20 73 65 67 6d 65 6e 74 20 61 74 20 2a 2f  ew segment at */
1a1c0 0a 20 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72  .  SegmentWriter
1a1d0 20 2a 70 57 72 69 74 65 72 20 3d 20 30 3b 20 20   *pWriter = 0;  
1a1e0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 77 72     /* Used to wr
1a1f0 69 74 65 20 74 68 65 20 6e 65 77 2c 20 6d 65 72  ite the new, mer
1a200 67 65 64 2c 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  ged, segment */.
1a210 20 20 46 74 73 33 53 65 67 46 69 6c 74 65 72 20    Fts3SegFilter 
1a220 66 69 6c 74 65 72 3b 20 20 20 20 20 20 20 20 20  filter;         
1a230 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 65 72    /* Segment ter
1a240 6d 20 66 69 6c 74 65 72 20 63 6f 6e 64 69 74 69  m filter conditi
1a250 6f 6e 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74  on */.  Fts3Mult
1a260 69 53 65 67 52 65 61 64 65 72 20 63 73 72 3b 20  iSegReader csr; 
1a270 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
1a280 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  r to iterate thr
1a290 6f 75 67 68 20 6c 65 76 65 6c 28 73 29 20 2a 2f  ough level(s) */
1a2a0 0a 20 20 69 6e 74 20 62 49 67 6e 6f 72 65 45 6d  .  int bIgnoreEm
1a2b0 70 74 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  pty = 0;        
1a2c0 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 67     /* True to ig
1a2d0 6e 6f 72 65 20 65 6d 70 74 79 20 73 65 67 6d 65  nore empty segme
1a2e0 6e 74 73 20 2a 2f 0a 20 20 69 36 34 20 69 4d 61  nts */.  i64 iMa
1a2f0 78 4c 65 76 65 6c 20 3d 20 30 3b 20 20 20 20 20  xLevel = 0;     
1a300 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 20           /* Max 
1a310 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20 66 6f 72  level number for
1a320 20 74 68 69 73 20 69 6e 64 65 78 2f 6c 61 6e 67   this index/lang
1a330 69 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  id */..  assert(
1a340 20 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45   iLevel==FTS3_SE
1a350 47 43 55 52 53 4f 52 5f 41 4c 4c 0a 20 20 20 20  GCURSOR_ALL.    
1a360 20 20 20 7c 7c 20 69 4c 65 76 65 6c 3d 3d 46 54     || iLevel==FT
1a370 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 50 45 4e  S3_SEGCURSOR_PEN
1a380 44 49 4e 47 0a 20 20 20 20 20 20 20 7c 7c 20 69  DING.       || i
1a390 4c 65 76 65 6c 3e 3d 30 0a 20 20 29 3b 0a 20 20  Level>=0.  );.  
1a3a0 61 73 73 65 72 74 28 20 69 4c 65 76 65 6c 3c 46  assert( iLevel<F
1a3b0 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45  TS3_SEGDIR_MAXLE
1a3c0 56 45 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  VEL );.  assert(
1a3d0 20 69 49 6e 64 65 78 3e 3d 30 20 26 26 20 69 49   iIndex>=0 && iI
1a3e0 6e 64 65 78 3c 70 2d 3e 6e 49 6e 64 65 78 20 29  ndex<p->nIndex )
1a3f0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
1a400 33 46 74 73 33 53 65 67 52 65 61 64 65 72 43 75  3Fts3SegReaderCu
1a410 72 73 6f 72 28 70 2c 20 69 4c 61 6e 67 69 64 2c  rsor(p, iLangid,
1a420 20 69 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 2c   iIndex, iLevel,
1a430 20 30 2c 20 30 2c 20 31 2c 20 30 2c 20 26 63 73   0, 0, 1, 0, &cs
1a440 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
1a450 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 73 72 2e 6e  LITE_OK || csr.n
1a460 53 65 67 6d 65 6e 74 3d 3d 30 20 29 20 67 6f 74  Segment==0 ) got
1a470 6f 20 66 69 6e 69 73 68 65 64 3b 0a 0a 20 20 69  o finished;..  i
1a480 66 28 20 69 4c 65 76 65 6c 21 3d 46 54 53 33 5f  f( iLevel!=FTS3_
1a490 53 45 47 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e  SEGCURSOR_PENDIN
1a4a0 47 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  G ){.    rc = ft
1a4b0 73 33 53 65 67 6d 65 6e 74 4d 61 78 4c 65 76 65  s3SegmentMaxLeve
1a4c0 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49  l(p, iLangid, iI
1a4d0 6e 64 65 78 2c 20 26 69 4d 61 78 4c 65 76 65 6c  ndex, &iMaxLevel
1a4e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1a4f0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1a500 66 69 6e 69 73 68 65 64 3b 0a 20 20 7d 0a 0a 20  finished;.  }.. 
1a510 20 69 66 28 20 69 4c 65 76 65 6c 3d 3d 46 54 53   if( iLevel==FTS
1a520 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c 20  3_SEGCURSOR_ALL 
1a530 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
1a540 61 6c 6c 20 69 73 20 74 6f 20 6d 65 72 67 65 20  all is to merge 
1a550 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20  all segments in 
1a560 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
1a570 61 20 73 69 6e 67 6c 65 0a 20 20 20 20 2a 2a 20  a single.    ** 
1a580 73 65 67 6d 65 6e 74 2e 20 54 68 65 20 6c 65 76  segment. The lev
1a590 65 6c 20 6f 66 20 74 68 65 20 6e 65 77 20 73 65  el of the new se
1a5a0 67 6d 65 6e 74 20 69 73 20 65 71 75 61 6c 20 74  gment is equal t
1a5b0 6f 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c  o the numericall
1a5c0 79 0a 20 20 20 20 2a 2a 20 67 72 65 61 74 65 73  y.    ** greates
1a5d0 74 20 73 65 67 6d 65 6e 74 20 6c 65 76 65 6c 20  t segment level 
1a5e0 63 75 72 72 65 6e 74 6c 79 20 70 72 65 73 65 6e  currently presen
1a5f0 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
1a600 65 20 66 6f 72 20 74 68 69 73 0a 20 20 20 20 2a  e for this.    *
1a610 2a 20 69 6e 64 65 78 2e 20 54 68 65 20 69 64 78  * index. The idx
1a620 20 6f 66 20 74 68 65 20 6e 65 77 20 73 65 67 6d   of the new segm
1a630 65 6e 74 20 69 73 20 61 6c 77 61 79 73 20 30 2e  ent is always 0.
1a640 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 73 72    */.    if( csr
1a650 2e 6e 53 65 67 6d 65 6e 74 3d 3d 31 20 26 26 20  .nSegment==1 && 
1a660 30 3d 3d 66 74 73 33 53 65 67 52 65 61 64 65 72  0==fts3SegReader
1a670 49 73 50 65 6e 64 69 6e 67 28 63 73 72 2e 61 70  IsPending(csr.ap
1a680 53 65 67 6d 65 6e 74 5b 30 5d 29 20 29 7b 0a 20  Segment[0]) ){. 
1a690 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1a6a0 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 67 6f 74  _DONE;.      got
1a6b0 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  o finished;.    
1a6c0 7d 0a 20 20 20 20 69 4e 65 77 4c 65 76 65 6c 20  }.    iNewLevel 
1a6d0 3d 20 69 4d 61 78 4c 65 76 65 6c 3b 0a 20 20 20  = iMaxLevel;.   
1a6e0 20 62 49 67 6e 6f 72 65 45 6d 70 74 79 20 3d 20   bIgnoreEmpty = 
1a6f0 31 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1;..  }else{.   
1a700 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73   /* This call is
1a710 20 74 6f 20 6d 65 72 67 65 20 61 6c 6c 20 73 65   to merge all se
1a720 67 6d 65 6e 74 73 20 61 74 20 6c 65 76 65 6c 20  gments at level 
1a730 69 4c 65 76 65 6c 2e 20 66 69 6e 64 20 74 68 65  iLevel. find the
1a740 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 61 76 61   next.    ** ava
1a750 69 6c 61 62 6c 65 20 73 65 67 6d 65 6e 74 20 69  ilable segment i
1a760 6e 64 65 78 20 61 74 20 6c 65 76 65 6c 20 69 4c  ndex at level iL
1a770 65 76 65 6c 2b 31 2e 20 54 68 65 20 63 61 6c 6c  evel+1. The call
1a780 20 74 6f 0a 20 20 20 20 2a 2a 20 66 74 73 33 41   to.    ** fts3A
1a790 6c 6c 6f 63 61 74 65 53 65 67 64 69 72 49 64 78  llocateSegdirIdx
1a7a0 28 29 20 77 69 6c 6c 20 6d 65 72 67 65 20 74 68  () will merge th
1a7b0 65 20 73 65 67 6d 65 6e 74 73 20 61 74 20 6c 65  e segments at le
1a7c0 76 65 6c 20 69 4c 65 76 65 6c 2b 31 20 74 6f 20  vel iLevel+1 to 
1a7d0 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65  .    ** a single
1a7e0 20 69 4c 65 76 65 6c 2b 32 20 73 65 67 6d 65 6e   iLevel+2 segmen
1a7f0 74 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20  t if necessary. 
1a800 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1a810 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 50  FTS3_SEGCURSOR_P
1a820 45 4e 44 49 4e 47 3d 3d 2d 31 20 29 3b 0a 20 20  ENDING==-1 );.  
1a830 20 20 69 4e 65 77 4c 65 76 65 6c 20 3d 20 67 65    iNewLevel = ge
1a840 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70  tAbsoluteLevel(p
1a850 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
1a860 78 2c 20 69 4c 65 76 65 6c 2b 31 29 3b 0a 20 20  x, iLevel+1);.  
1a870 20 20 72 63 20 3d 20 66 74 73 33 41 6c 6c 6f 63    rc = fts3Alloc
1a880 61 74 65 53 65 67 64 69 72 49 64 78 28 70 2c 20  ateSegdirIdx(p, 
1a890 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c  iLangid, iIndex,
1a8a0 20 69 4c 65 76 65 6c 2b 31 2c 20 26 69 49 64 78   iLevel+1, &iIdx
1a8b0 29 3b 0a 20 20 20 20 62 49 67 6e 6f 72 65 45 6d  );.    bIgnoreEm
1a8c0 70 74 79 20 3d 20 28 69 4c 65 76 65 6c 21 3d 46  pty = (iLevel!=F
1a8d0 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 50 45  TS3_SEGCURSOR_PE
1a8e0 4e 44 49 4e 47 29 20 26 26 20 28 69 4e 65 77 4c  NDING) && (iNewL
1a8f0 65 76 65 6c 3e 69 4d 61 78 4c 65 76 65 6c 29 3b  evel>iMaxLevel);
1a900 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
1a910 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1a920 66 69 6e 69 73 68 65 64 3b 0a 0a 20 20 61 73 73  finished;..  ass
1a930 65 72 74 28 20 63 73 72 2e 6e 53 65 67 6d 65 6e  ert( csr.nSegmen
1a940 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
1a950 20 69 4e 65 77 4c 65 76 65 6c 3e 3d 67 65 74 41   iNewLevel>=getA
1a960 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20  bsoluteLevel(p, 
1a970 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c  iLangid, iIndex,
1a980 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28   0) );.  assert(
1a990 20 69 4e 65 77 4c 65 76 65 6c 3c 67 65 74 41 62   iNewLevel<getAb
1a9a0 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69  soluteLevel(p, i
1a9b0 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 46  Langid, iIndex,F
1a9c0 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45  TS3_SEGDIR_MAXLE
1a9d0 56 45 4c 29 20 29 3b 0a 0a 20 20 6d 65 6d 73 65  VEL) );..  memse
1a9e0 74 28 26 66 69 6c 74 65 72 2c 20 30 2c 20 73 69  t(&filter, 0, si
1a9f0 7a 65 6f 66 28 46 74 73 33 53 65 67 46 69 6c 74  zeof(Fts3SegFilt
1aa00 65 72 29 29 3b 0a 20 20 66 69 6c 74 65 72 2e 66  er));.  filter.f
1aa10 6c 61 67 73 20 3d 20 46 54 53 33 5f 53 45 47 4d  lags = FTS3_SEGM
1aa20 45 4e 54 5f 52 45 51 55 49 52 45 5f 50 4f 53 3b  ENT_REQUIRE_POS;
1aa30 0a 20 20 66 69 6c 74 65 72 2e 66 6c 61 67 73 20  .  filter.flags 
1aa40 7c 3d 20 28 62 49 67 6e 6f 72 65 45 6d 70 74 79  |= (bIgnoreEmpty
1aa50 20 3f 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f   ? FTS3_SEGMENT_
1aa60 49 47 4e 4f 52 45 5f 45 4d 50 54 59 20 3a 20 30  IGNORE_EMPTY : 0
1aa70 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
1aa80 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 53  e3Fts3SegReaderS
1aa90 74 61 72 74 28 70 2c 20 26 63 73 72 2c 20 26 66  tart(p, &csr, &f
1aaa0 69 6c 74 65 72 29 3b 0a 20 20 77 68 69 6c 65 28  ilter);.  while(
1aab0 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 29   SQLITE_OK==rc )
1aac0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1aad0 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 53  e3Fts3SegReaderS
1aae0 74 65 70 28 70 2c 20 26 63 73 72 29 3b 0a 20 20  tep(p, &csr);.  
1aaf0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ab00 5f 52 4f 57 20 29 20 62 72 65 61 6b 3b 0a 20 20  _ROW ) break;.  
1ab10 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 57 72    rc = fts3SegWr
1ab20 69 74 65 72 41 64 64 28 70 2c 20 26 70 57 72 69  iterAdd(p, &pWri
1ab30 74 65 72 2c 20 31 2c 20 0a 20 20 20 20 20 20 20  ter, 1, .       
1ab40 20 63 73 72 2e 7a 54 65 72 6d 2c 20 63 73 72 2e   csr.zTerm, csr.
1ab50 6e 54 65 72 6d 2c 20 63 73 72 2e 61 44 6f 63 6c  nTerm, csr.aDocl
1ab60 69 73 74 2c 20 63 73 72 2e 6e 44 6f 63 6c 69 73  ist, csr.nDoclis
1ab70 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  t);.  }.  if( rc
1ab80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1ab90 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 61  to finished;.  a
1aba0 73 73 65 72 74 28 20 70 57 72 69 74 65 72 20 7c  ssert( pWriter |
1abb0 7c 20 62 49 67 6e 6f 72 65 45 6d 70 74 79 20 29  | bIgnoreEmpty )
1abc0 3b 0a 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 21  ;..  if( iLevel!
1abd0 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f  =FTS3_SEGCURSOR_
1abe0 50 45 4e 44 49 4e 47 20 29 7b 0a 20 20 20 20 72  PENDING ){.    r
1abf0 63 20 3d 20 66 74 73 33 44 65 6c 65 74 65 53 65  c = fts3DeleteSe
1ac00 67 64 69 72 28 0a 20 20 20 20 20 20 20 20 70 2c  gdir(.        p,
1ac10 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78   iLangid, iIndex
1ac20 2c 20 69 4c 65 76 65 6c 2c 20 63 73 72 2e 61 70  , iLevel, csr.ap
1ac30 53 65 67 6d 65 6e 74 2c 20 63 73 72 2e 6e 53 65  Segment, csr.nSe
1ac40 67 6d 65 6e 74 0a 20 20 20 20 29 3b 0a 20 20 20  gment.    );.   
1ac50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ac60 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69 73 68  OK ) goto finish
1ac70 65 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 57  ed;.  }.  if( pW
1ac80 72 69 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20  riter ){.    rc 
1ac90 3d 20 66 74 73 33 53 65 67 57 72 69 74 65 72 46  = fts3SegWriterF
1aca0 6c 75 73 68 28 70 2c 20 70 57 72 69 74 65 72 2c  lush(p, pWriter,
1acb0 20 69 4e 65 77 4c 65 76 65 6c 2c 20 69 49 64 78   iNewLevel, iIdx
1acc0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1acd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ace0 20 20 69 66 28 20 69 4c 65 76 65 6c 3d 3d 46 54    if( iLevel==FT
1acf0 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 50 45 4e  S3_SEGCURSOR_PEN
1ad00 44 49 4e 47 20 7c 7c 20 69 4e 65 77 4c 65 76 65  DING || iNewLeve
1ad10 6c 3c 69 4d 61 78 4c 65 76 65 6c 20 29 7b 0a 20  l<iMaxLevel ){. 
1ad20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33         rc = fts3
1ad30 50 72 6f 6d 6f 74 65 53 65 67 6d 65 6e 74 73 28  PromoteSegments(
1ad40 70 2c 20 69 4e 65 77 4c 65 76 65 6c 2c 20 70 57  p, iNewLevel, pW
1ad50 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61 74 61  riter->nLeafData
1ad60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1ad70 0a 20 20 7d 0a 0a 20 66 69 6e 69 73 68 65 64 3a  .  }.. finished:
1ad80 0a 20 20 66 74 73 33 53 65 67 57 72 69 74 65 72  .  fts3SegWriter
1ad90 46 72 65 65 28 70 57 72 69 74 65 72 29 3b 0a 20  Free(pWriter);. 
1ada0 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
1adb0 65 61 64 65 72 46 69 6e 69 73 68 28 26 63 73 72  eaderFinish(&csr
1adc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1add0 7d 0a 0a 0a 2f 2a 20 0a 2a 2a 20 46 6c 75 73 68  }.../* .** Flush
1ade0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1adf0 20 70 65 6e 64 69 6e 67 54 65 72 6d 73 20 74 6f   pendingTerms to
1ae00 20 6c 65 76 65 6c 20 30 20 73 65 67 6d 65 6e 74   level 0 segment
1ae10 73 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  s. .*/.int sqlit
1ae20 65 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72  e3Fts3PendingTer
1ae30 6d 73 46 6c 75 73 68 28 46 74 73 33 54 61 62 6c  msFlush(Fts3Tabl
1ae40 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  e *p){.  int rc 
1ae50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
1ae60 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 0a 20  nt i;.        . 
1ae70 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
1ae80 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e  LITE_OK && i<p->
1ae90 6e 49 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20  nIndex; i++){.  
1aea0 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 6d 65    rc = fts3Segme
1aeb0 6e 74 4d 65 72 67 65 28 70 2c 20 70 2d 3e 69 50  ntMerge(p, p->iP
1aec0 72 65 76 4c 61 6e 67 69 64 2c 20 69 2c 20 46 54  revLangid, i, FT
1aed0 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 50 45 4e  S3_SEGCURSOR_PEN
1aee0 44 49 4e 47 29 3b 0a 20 20 20 20 69 66 28 20 72  DING);.    if( r
1aef0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
1af00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1af10 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 46 74  .  }.  sqlite3Ft
1af20 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 43 6c  s3PendingTermsCl
1af30 65 61 72 28 70 29 3b 0a 0a 20 20 2f 2a 20 44 65  ear(p);..  /* De
1af40 74 65 72 6d 69 6e 65 20 74 68 65 20 61 75 74 6f  termine the auto
1af50 2d 69 6e 63 72 2d 6d 65 72 67 65 20 73 65 74 74  -incr-merge sett
1af60 69 6e 67 20 69 66 20 75 6e 6b 6e 6f 77 6e 2e 20  ing if unknown. 
1af70 20 49 66 20 65 6e 61 62 6c 65 64 2c 0a 20 20 2a   If enabled,.  *
1af80 2a 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e  * estimate the n
1af90 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 62 6c  umber of leaf bl
1afa0 6f 63 6b 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20  ocks of content 
1afb0 74 6f 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20  to be written.  
1afc0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
1afd0 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 62 48 61  ITE_OK && p->bHa
1afe0 73 53 74 61 74 0a 20 20 20 26 26 20 70 2d 3e 6e  sStat.   && p->n
1aff0 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 3d 3d 30  Autoincrmerge==0
1b000 78 66 66 20 26 26 20 70 2d 3e 6e 4c 65 61 66 41  xff && p->nLeafA
1b010 64 64 3e 30 0a 20 20 29 7b 0a 20 20 20 20 73 71  dd>0.  ){.    sq
1b020 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1b030 74 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  t = 0;.    rc = 
1b040 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
1b050 51 4c 5f 53 45 4c 45 43 54 5f 53 54 41 54 2c 20  QL_SELECT_STAT, 
1b060 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
1b070 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b080 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
1b090 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d  e3_bind_int(pStm
1b0a0 74 2c 20 31 2c 20 46 54 53 5f 53 54 41 54 5f 41  t, 1, FTS_STAT_A
1b0b0 55 54 4f 49 4e 43 52 4d 45 52 47 45 29 3b 0a 20  UTOINCRMERGE);. 
1b0c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1b0d0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
1b0e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1b0f0 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
1b100 20 20 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d     p->nAutoincrm
1b110 65 72 67 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  erge = sqlite3_c
1b120 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
1b130 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
1b140 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d 65 72   p->nAutoincrmer
1b150 67 65 3d 3d 31 20 29 20 70 2d 3e 6e 41 75 74 6f  ge==1 ) p->nAuto
1b160 69 6e 63 72 6d 65 72 67 65 20 3d 20 38 3b 0a 20  incrmerge = 8;. 
1b170 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
1b180 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
1b190 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 41 75  {.        p->nAu
1b1a0 74 6f 69 6e 63 72 6d 65 72 67 65 20 3d 20 30 3b  toincrmerge = 0;
1b1b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1b1c0 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
1b1d0 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a  t(pStmt);.    }.
1b1e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1b1f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 63 6f 64 65  .}../*.** Encode
1b200 20 4e 20 69 6e 74 65 67 65 72 73 20 61 73 20 76   N integers as v
1b210 61 72 69 6e 74 73 20 69 6e 74 6f 20 61 20 62 6c  arints into a bl
1b220 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ob..*/.static vo
1b230 69 64 20 66 74 73 33 45 6e 63 6f 64 65 49 6e 74  id fts3EncodeInt
1b240 41 72 72 61 79 28 0a 20 20 69 6e 74 20 4e 2c 20  Array(.  int N, 
1b250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b260 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 74  he number of int
1b270 65 67 65 72 73 20 74 6f 20 65 6e 63 6f 64 65 20  egers to encode 
1b280 2a 2f 0a 20 20 75 33 32 20 2a 61 2c 20 20 20 20  */.  u32 *a,    
1b290 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
1b2a0 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 2a 2f  nteger values */
1b2b0 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 20  .  char *zBuf,  
1b2c0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
1b2d0 68 65 20 42 4c 4f 42 20 68 65 72 65 20 2a 2f 0a  he BLOB here */.
1b2e0 20 20 69 6e 74 20 2a 70 4e 42 75 66 20 20 20 20    int *pNBuf    
1b2f0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 75       /* Write nu
1b300 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 66  mber of bytes if
1b310 20 7a 42 75 66 5b 5d 20 75 73 65 64 20 68 65 72   zBuf[] used her
1b320 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  e */.){.  int i,
1b330 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b   j;.  for(i=j=0;
1b340 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<N; i++){.    
1b350 6a 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  j += sqlite3Fts3
1b360 50 75 74 56 61 72 69 6e 74 28 26 7a 42 75 66 5b  PutVarint(&zBuf[
1b370 6a 5d 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  j], (sqlite3_int
1b380 36 34 29 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  64)a[i]);.  }.  
1b390 2a 70 4e 42 75 66 20 3d 20 6a 3b 0a 7d 0a 0a 2f  *pNBuf = j;.}../
1b3a0 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 62 6c  *.** Decode a bl
1b3b0 6f 62 20 6f 66 20 76 61 72 69 6e 74 73 20 69 6e  ob of varints in
1b3c0 74 6f 20 4e 20 69 6e 74 65 67 65 72 73 0a 2a 2f  to N integers.*/
1b3d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1b3e0 33 44 65 63 6f 64 65 49 6e 74 41 72 72 61 79 28  3DecodeIntArray(
1b3f0 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20  .  int N,       
1b400 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
1b410 62 65 72 20 6f 66 20 69 6e 74 65 67 65 72 73 20  ber of integers 
1b420 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a 20 20 75  to decode */.  u
1b430 33 32 20 2a 61 2c 20 20 20 20 20 20 20 20 20 20  32 *a,          
1b440 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69    /* Write the i
1b450 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 2a 2f  nteger values */
1b460 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1b470 42 75 66 2c 20 20 2f 2a 20 54 68 65 20 42 4c 4f  Buf,  /* The BLO
1b480 42 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  B containing the
1b490 20 76 61 72 69 6e 74 73 20 2a 2f 0a 20 20 69 6e   varints */.  in
1b4a0 74 20 6e 42 75 66 20 20 20 20 20 20 20 20 20 20  t nBuf          
1b4b0 20 2f 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20   /* size of the 
1b4c0 42 4c 4f 42 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  BLOB */.){.  int
1b4d0 20 69 2c 20 6a 3b 0a 20 20 55 4e 55 53 45 44 5f   i, j;.  UNUSED_
1b4e0 50 41 52 41 4d 45 54 45 52 28 6e 42 75 66 29 3b  PARAMETER(nBuf);
1b4f0 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
1b500 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  N; i++){.    sql
1b510 69 74 65 33 5f 69 6e 74 36 34 20 78 3b 0a 20 20  ite3_int64 x;.  
1b520 20 20 6a 20 2b 3d 20 73 71 6c 69 74 65 33 46 74    j += sqlite3Ft
1b530 73 33 47 65 74 56 61 72 69 6e 74 28 26 7a 42 75  s3GetVarint(&zBu
1b540 66 5b 6a 5d 2c 20 26 78 29 3b 0a 20 20 20 20 61  f[j], &x);.    a
1b550 73 73 65 72 74 28 6a 3c 3d 6e 42 75 66 29 3b 0a  ssert(j<=nBuf);.
1b560 20 20 20 20 61 5b 69 5d 20 3d 20 28 75 33 32 29      a[i] = (u32)
1b570 28 78 20 26 20 30 78 66 66 66 66 66 66 66 66 29  (x & 0xffffffff)
1b580 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
1b590 6e 73 65 72 74 20 74 68 65 20 73 69 7a 65 73 20  nsert the sizes 
1b5a0 28 69 6e 20 74 6f 6b 65 6e 73 29 20 66 6f 72 20  (in tokens) for 
1b5b0 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  each column of t
1b5c0 68 65 20 64 6f 63 75 6d 65 6e 74 0a 2a 2a 20 77  he document.** w
1b5d0 69 74 68 20 64 6f 63 69 64 20 65 71 75 61 6c 20  ith docid equal 
1b5e0 74 6f 20 70 2d 3e 69 50 72 65 76 44 6f 63 69 64  to p->iPrevDocid
1b5f0 2e 20 20 54 68 65 20 73 69 7a 65 73 20 61 72 65  .  The sizes are
1b600 20 65 6e 63 6f 64 65 64 20 61 73 0a 2a 2a 20 61   encoded as.** a
1b610 20 62 6c 6f 62 20 6f 66 20 76 61 72 69 6e 74 73   blob of varints
1b620 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1b630 20 66 74 73 33 49 6e 73 65 72 74 44 6f 63 73 69   fts3InsertDocsi
1b640 7a 65 28 0a 20 20 69 6e 74 20 2a 70 52 43 2c 20  ze(.  int *pRC, 
1b650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b660 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
1b670 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 54 61  code */.  Fts3Ta
1b680 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
1b690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
1b6a0 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 74 6f  le into which to
1b6b0 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 75 33 32   insert */.  u32
1b6c0 20 2a 61 53 7a 20 20 20 20 20 20 20 20 20 20 20   *aSz           
1b6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b6e0 53 69 7a 65 73 20 6f 66 20 65 61 63 68 20 63 6f  Sizes of each co
1b6f0 6c 75 6d 6e 2c 20 69 6e 20 74 6f 6b 65 6e 73 20  lumn, in tokens 
1b700 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 42  */.){.  char *pB
1b710 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  lob;            
1b720 20 2f 2a 20 54 68 65 20 42 4c 4f 42 20 65 6e 63   /* The BLOB enc
1b730 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 64 6f 63  oding of the doc
1b740 75 6d 65 6e 74 20 73 69 7a 65 20 2a 2f 0a 20 20  ument size */.  
1b750 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20  int nBlob;      
1b760 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1b770 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
1b780 68 65 20 42 4c 4f 42 20 2a 2f 0a 20 20 73 71 6c  he BLOB */.  sql
1b790 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1b7a0 3b 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65  ;     /* Stateme
1b7b0 6e 74 20 75 73 65 64 20 74 6f 20 69 6e 73 65 72  nt used to inser
1b7c0 74 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 2a  t the encoding *
1b7d0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1b7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b7f0 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
1b800 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
1b810 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
1b820 65 74 75 72 6e 3b 0a 20 20 70 42 6c 6f 62 20 3d  eturn;.  pBlob =
1b830 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
1b840 20 31 30 2a 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29   10*p->nColumn )
1b850 3b 0a 20 20 69 66 28 20 70 42 6c 6f 62 3d 3d 30  ;.  if( pBlob==0
1b860 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
1b870 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1b880 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66   return;.  }.  f
1b890 74 73 33 45 6e 63 6f 64 65 49 6e 74 41 72 72 61  ts3EncodeIntArra
1b8a0 79 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 61 53  y(p->nColumn, aS
1b8b0 7a 2c 20 70 42 6c 6f 62 2c 20 26 6e 42 6c 6f 62  z, pBlob, &nBlob
1b8c0 29 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71  );.  rc = fts3Sq
1b8d0 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 52 45 50  lStmt(p, SQL_REP
1b8e0 4c 41 43 45 5f 44 4f 43 53 49 5a 45 2c 20 26 70  LACE_DOCSIZE, &p
1b8f0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  Stmt, 0);.  if( 
1b900 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rc ){.    sqlite
1b910 33 5f 66 72 65 65 28 70 42 6c 6f 62 29 3b 0a 20  3_free(pBlob);. 
1b920 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
1b930 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1b940 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
1b950 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 70 2d 3e  64(pStmt, 1, p->
1b960 69 50 72 65 76 44 6f 63 69 64 29 3b 0a 20 20 73  iPrevDocid);.  s
1b970 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
1b980 28 70 53 74 6d 74 2c 20 32 2c 20 70 42 6c 6f 62  (pStmt, 2, pBlob
1b990 2c 20 6e 42 6c 6f 62 2c 20 73 71 6c 69 74 65 33  , nBlob, sqlite3
1b9a0 5f 66 72 65 65 29 3b 0a 20 20 73 71 6c 69 74 65  _free);.  sqlite
1b9b0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
1b9c0 20 2a 70 52 43 20 3d 20 73 71 6c 69 74 65 33 5f   *pRC = sqlite3_
1b9d0 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 7d 0a  reset(pStmt);.}.
1b9e0 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 30 20  ./*.** Record 0 
1b9f0 6f 66 20 74 68 65 20 25 5f 73 74 61 74 20 74 61  of the %_stat ta
1ba00 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 62  ble contains a b
1ba10 6c 6f 62 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f  lob consisting o
1ba20 66 20 4e 20 76 61 72 69 6e 74 73 2c 0a 2a 2a 20  f N varints,.** 
1ba30 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e  where N is the n
1ba40 75 6d 62 65 72 20 6f 66 20 75 73 65 72 20 64 65  umber of user de
1ba50 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e  fined columns in
1ba60 20 74 68 65 20 66 74 73 33 20 74 61 62 6c 65 20   the fts3 table 
1ba70 70 6c 75 73 0a 2a 2a 20 74 77 6f 2e 20 49 66 20  plus.** two. If 
1ba80 6e 43 6f 6c 20 69 73 20 74 68 65 20 6e 75 6d 62  nCol is the numb
1ba90 65 72 20 6f 66 20 75 73 65 72 20 64 65 66 69 6e  er of user defin
1baa0 65 64 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  ed columns, then
1bab0 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 0a   values of the .
1bac0 2a 2a 20 76 61 72 69 6e 74 73 20 61 72 65 20 73  ** varints are s
1bad0 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  et as follows:.*
1bae0 2a 0a 2a 2a 20 20 20 56 61 72 69 6e 74 20 30 3a  *.**   Varint 0:
1baf0 20 20 20 20 20 20 20 54 6f 74 61 6c 20 6e 75 6d         Total num
1bb00 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1bb10 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
1bb20 20 20 56 61 72 69 6e 74 20 31 2e 2e 6e 43 6f 6c    Varint 1..nCol
1bb30 3a 20 46 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  : For each colum
1bb40 6e 2c 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  n, the total num
1bb50 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 73 74  ber of tokens st
1bb60 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 20 20 20  ored in.**      
1bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
1bb80 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 61 6c 6c 20   column for all 
1bb90 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c  rows of the tabl
1bba0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 6e  e..**.**   Varin
1bbb0 74 20 31 2b 6e 43 6f 6c 3a 20 20 54 68 65 20 74  t 1+nCol:  The t
1bbc0 6f 74 61 6c 20 73 69 7a 65 2c 20 69 6e 20 62 79  otal size, in by
1bbd0 74 65 73 2c 20 6f 66 20 61 6c 6c 20 74 65 78 74  tes, of all text
1bbe0 20 76 61 6c 75 65 73 20 69 6e 20 61 6c 6c 0a 2a   values in all.*
1bbf0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1bc00 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61      columns of a
1bc10 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74  ll rows of the t
1bc20 61 62 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  able..**.*/.stat
1bc30 69 63 20 76 6f 69 64 20 66 74 73 33 55 70 64 61  ic void fts3Upda
1bc40 74 65 44 6f 63 54 6f 74 61 6c 73 28 0a 20 20 69  teDocTotals(.  i
1bc50 6e 74 20 2a 70 52 43 2c 20 20 20 20 20 20 20 20  nt *pRC,        
1bc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bc70 2a 20 54 68 65 20 72 65 73 75 6c 74 20 63 6f 64  * The result cod
1bc80 65 20 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c 65  e */.  Fts3Table
1bc90 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1bca0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
1bcb0 62 65 69 6e 67 20 75 70 64 61 74 65 64 20 2a 2f  being updated */
1bcc0 0a 20 20 75 33 32 20 2a 61 53 7a 49 6e 73 2c 20  .  u32 *aSzIns, 
1bcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bce0 20 20 20 2f 2a 20 53 69 7a 65 20 69 6e 63 72 65     /* Size incre
1bcf0 61 73 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 61  ases */.  u32 *a
1bd00 53 7a 44 65 6c 2c 20 20 20 20 20 20 20 20 20 20  SzDel,          
1bd10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1bd20 65 20 64 65 63 72 65 61 73 65 73 20 2a 2f 0a 20  e decreases */. 
1bd30 20 69 6e 74 20 6e 43 68 6e 67 20 20 20 20 20 20   int nChng      
1bd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd50 20 2f 2a 20 43 68 61 6e 67 65 20 69 6e 20 74 68   /* Change in th
1bd60 65 20 6e 75 6d 62 65 72 20 6f 66 20 64 6f 63 75  e number of docu
1bd70 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68  ments */.){.  ch
1bd80 61 72 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20 20  ar *pBlob;      
1bd90 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 61 67         /* Storag
1bda0 65 20 66 6f 72 20 42 4c 4f 42 20 77 72 69 74 74  e for BLOB writt
1bdb0 65 6e 20 69 6e 74 6f 20 25 5f 73 74 61 74 20 2a  en into %_stat *
1bdc0 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20 20  /.  int nBlob;  
1bdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bde0 53 69 7a 65 20 6f 66 20 42 4c 4f 42 20 77 72 69  Size of BLOB wri
1bdf0 74 74 65 6e 20 69 6e 74 6f 20 25 5f 73 74 61 74  tten into %_stat
1be00 20 2a 2f 0a 20 20 75 33 32 20 2a 61 3b 20 20 20   */.  u32 *a;   
1be10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1be20 2a 20 41 72 72 61 79 20 6f 66 20 69 6e 74 65 67  * Array of integ
1be30 65 72 73 20 74 68 61 74 20 62 65 63 6f 6d 65 73  ers that becomes
1be40 20 74 68 65 20 42 4c 4f 42 20 2a 2f 0a 20 20 73   the BLOB */.  s
1be50 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1be60 6d 74 3b 20 20 20 20 20 2f 2a 20 53 74 61 74 65  mt;     /* State
1be70 6d 65 6e 74 20 66 6f 72 20 72 65 61 64 69 6e 67  ment for reading
1be80 20 61 6e 64 20 77 72 69 74 69 6e 67 20 2a 2f 0a   and writing */.
1be90 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1bea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1beb0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1bec0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1bed0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
1bee0 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  lt code from sub
1bef0 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
1bf00 63 6f 6e 73 74 20 69 6e 74 20 6e 53 74 61 74 20  const int nStat 
1bf10 3d 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 3b 0a  = p->nColumn+2;.
1bf20 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
1bf30 74 75 72 6e 3b 0a 20 20 61 20 3d 20 73 71 6c 69  turn;.  a = sqli
1bf40 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 28 73 69 7a  te3_malloc( (siz
1bf50 65 6f 66 28 75 33 32 29 2b 31 30 29 2a 6e 53 74  eof(u32)+10)*nSt
1bf60 61 74 20 29 3b 0a 20 20 69 66 28 20 61 3d 3d 30  at );.  if( a==0
1bf70 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
1bf80 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1bf90 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
1bfa0 42 6c 6f 62 20 3d 20 28 63 68 61 72 2a 29 26 61  Blob = (char*)&a
1bfb0 5b 6e 53 74 61 74 5d 3b 0a 20 20 72 63 20 3d 20  [nStat];.  rc = 
1bfc0 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
1bfd0 51 4c 5f 53 45 4c 45 43 54 5f 53 54 41 54 2c 20  QL_SELECT_STAT, 
1bfe0 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66  &pStmt, 0);.  if
1bff0 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( rc ){.    sqli
1c000 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20 20  te3_free(a);.   
1c010 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
1c020 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
1c030 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
1c040 53 74 6d 74 2c 20 31 2c 20 46 54 53 5f 53 54 41  Stmt, 1, FTS_STA
1c050 54 5f 44 4f 43 54 4f 54 41 4c 29 3b 0a 20 20 69  T_DOCTOTAL);.  i
1c060 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  f( sqlite3_step(
1c070 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
1c080 4f 57 20 29 7b 0a 20 20 20 20 66 74 73 33 44 65  OW ){.    fts3De
1c090 63 6f 64 65 49 6e 74 41 72 72 61 79 28 6e 53 74  codeIntArray(nSt
1c0a0 61 74 2c 20 61 2c 0a 20 20 20 20 20 20 20 20 20  at, a,.         
1c0b0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1c0c0 6c 6f 62 28 70 53 74 6d 74 2c 20 30 29 2c 0a 20  lob(pStmt, 0),. 
1c0d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1c0e0 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
1c0f0 6d 74 2c 20 30 29 29 3b 0a 20 20 7d 65 6c 73 65  mt, 0));.  }else
1c100 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 61 2c 20  {.    memset(a, 
1c110 30 2c 20 73 69 7a 65 6f 66 28 75 33 32 29 2a 28  0, sizeof(u32)*(
1c120 6e 53 74 61 74 29 20 29 3b 0a 20 20 7d 0a 20 20  nStat) );.  }.  
1c130 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
1c140 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  et(pStmt);.  if(
1c150 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c160 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
1c170 65 65 28 61 29 3b 0a 20 20 20 20 2a 70 52 43 20  ee(a);.    *pRC 
1c180 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
1c190 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 43 68 6e  ;.  }.  if( nChn
1c1a0 67 3c 30 20 26 26 20 61 5b 30 5d 3c 28 75 33 32  g<0 && a[0]<(u32
1c1b0 29 28 2d 6e 43 68 6e 67 29 20 29 7b 0a 20 20 20  )(-nChng) ){.   
1c1c0 20 61 5b 30 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c   a[0] = 0;.  }el
1c1d0 73 65 7b 0a 20 20 20 20 61 5b 30 5d 20 2b 3d 20  se{.    a[0] += 
1c1e0 6e 43 68 6e 67 3b 0a 20 20 7d 0a 20 20 66 6f 72  nChng;.  }.  for
1c1f0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 75  (i=0; i<p->nColu
1c200 6d 6e 2b 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mn+1; i++){.    
1c210 75 33 32 20 78 20 3d 20 61 5b 69 2b 31 5d 3b 0a  u32 x = a[i+1];.
1c220 20 20 20 20 69 66 28 20 78 2b 61 53 7a 49 6e 73      if( x+aSzIns
1c230 5b 69 5d 20 3c 20 61 53 7a 44 65 6c 5b 69 5d 20  [i] < aSzDel[i] 
1c240 29 7b 0a 20 20 20 20 20 20 78 20 3d 20 30 3b 0a  ){.      x = 0;.
1c250 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c260 20 78 20 3d 20 78 20 2b 20 61 53 7a 49 6e 73 5b   x = x + aSzIns[
1c270 69 5d 20 2d 20 61 53 7a 44 65 6c 5b 69 5d 3b 0a  i] - aSzDel[i];.
1c280 20 20 20 20 7d 0a 20 20 20 20 61 5b 69 2b 31 5d      }.    a[i+1]
1c290 20 3d 20 78 3b 0a 20 20 7d 0a 20 20 66 74 73 33   = x;.  }.  fts3
1c2a0 45 6e 63 6f 64 65 49 6e 74 41 72 72 61 79 28 6e  EncodeIntArray(n
1c2b0 53 74 61 74 2c 20 61 2c 20 70 42 6c 6f 62 2c 20  Stat, a, pBlob, 
1c2c0 26 6e 42 6c 6f 62 29 3b 0a 20 20 72 63 20 3d 20  &nBlob);.  rc = 
1c2d0 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
1c2e0 51 4c 5f 52 45 50 4c 41 43 45 5f 53 54 41 54 2c  QL_REPLACE_STAT,
1c2f0 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69   &pStmt, 0);.  i
1c300 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c  f( rc ){.    sql
1c310 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20  ite3_free(a);.  
1c320 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
1c330 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
1c340 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
1c350 70 53 74 6d 74 2c 20 31 2c 20 46 54 53 5f 53 54  pStmt, 1, FTS_ST
1c360 41 54 5f 44 4f 43 54 4f 54 41 4c 29 3b 0a 20 20  AT_DOCTOTAL);.  
1c370 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
1c380 62 28 70 53 74 6d 74 2c 20 32 2c 20 70 42 6c 6f  b(pStmt, 2, pBlo
1c390 62 2c 20 6e 42 6c 6f 62 2c 20 53 51 4c 49 54 45  b, nBlob, SQLITE
1c3a0 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69  _STATIC);.  sqli
1c3b0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
1c3c0 0a 20 20 2a 70 52 43 20 3d 20 73 71 6c 69 74 65  .  *pRC = sqlite
1c3d0 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
1c3e0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e    sqlite3_bind_n
1c3f0 75 6c 6c 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20  ull(pStmt, 2);. 
1c400 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29   sqlite3_free(a)
1c410 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65  ;.}../*.** Merge
1c420 20 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61   the entire data
1c430 62 61 73 65 20 73 6f 20 74 68 61 74 20 74 68 65  base so that the
1c440 72 65 20 69 73 20 6f 6e 65 20 73 65 67 6d 65 6e  re is one segmen
1c450 74 20 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20 69  t for each .** i
1c460 49 6e 64 65 78 2f 69 4c 61 6e 67 69 64 20 63 6f  Index/iLangid co
1c470 6d 62 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  mbination..*/.st
1c480 61 74 69 63 20 69 6e 74 20 66 74 73 33 44 6f 4f  atic int fts3DoO
1c490 70 74 69 6d 69 7a 65 28 46 74 73 33 54 61 62 6c  ptimize(Fts3Tabl
1c4a0 65 20 2a 70 2c 20 69 6e 74 20 62 52 65 74 75 72  e *p, int bRetur
1c4b0 6e 44 6f 6e 65 29 7b 0a 20 20 69 6e 74 20 62 53  nDone){.  int bS
1c4c0 65 65 6e 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 69  eenDone = 0;.  i
1c4d0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
1c4e0 5f 73 74 6d 74 20 2a 70 41 6c 6c 4c 61 6e 67 69  _stmt *pAllLangi
1c4f0 64 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 66  d = 0;..  rc = f
1c500 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51  ts3SqlStmt(p, SQ
1c510 4c 5f 53 45 4c 45 43 54 5f 41 4c 4c 5f 4c 41 4e  L_SELECT_ALL_LAN
1c520 47 49 44 2c 20 26 70 41 6c 6c 4c 61 6e 67 69 64  GID, &pAllLangid
1c530 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
1c540 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c550 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 73 71   int rc2;.    sq
1c560 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
1c570 41 6c 6c 4c 61 6e 67 69 64 2c 20 31 2c 20 70 2d  AllLangid, 1, p-
1c580 3e 69 50 72 65 76 4c 61 6e 67 69 64 29 3b 0a 20  >iPrevLangid);. 
1c590 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
1c5a0 69 6e 74 28 70 41 6c 6c 4c 61 6e 67 69 64 2c 20  int(pAllLangid, 
1c5b0 32 2c 20 70 2d 3e 6e 49 6e 64 65 78 29 3b 0a 20  2, p->nIndex);. 
1c5c0 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
1c5d0 33 5f 73 74 65 70 28 70 41 6c 6c 4c 61 6e 67 69  3_step(pAllLangi
1c5e0 64 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  d)==SQLITE_ROW )
1c5f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
1c600 20 20 20 20 20 69 6e 74 20 69 4c 61 6e 67 69 64       int iLangid
1c610 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
1c620 6e 5f 69 6e 74 28 70 41 6c 6c 4c 61 6e 67 69 64  n_int(pAllLangid
1c630 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  , 0);.      for(
1c640 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
1c650 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 49 6e 64 65  OK && i<p->nInde
1c660 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  x; i++){.       
1c670 20 72 63 20 3d 20 66 74 73 33 53 65 67 6d 65 6e   rc = fts3Segmen
1c680 74 4d 65 72 67 65 28 70 2c 20 69 4c 61 6e 67 69  tMerge(p, iLangi
1c690 64 2c 20 69 2c 20 46 54 53 33 5f 53 45 47 43 55  d, i, FTS3_SEGCU
1c6a0 52 53 4f 52 5f 41 4c 4c 29 3b 0a 20 20 20 20 20  RSOR_ALL);.     
1c6b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c6c0 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
1c6d0 20 20 20 20 62 53 65 65 6e 44 6f 6e 65 20 3d 20      bSeenDone = 
1c6e0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  1;.          rc 
1c6f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1c700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1c710 20 20 20 7d 0a 20 20 20 20 72 63 32 20 3d 20 73     }.    rc2 = s
1c720 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 41 6c  qlite3_reset(pAl
1c730 6c 4c 61 6e 67 69 64 29 3b 0a 20 20 20 20 69 66  lLangid);.    if
1c740 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c750 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a  ) rc = rc2;.  }.
1c760 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65  .  sqlite3Fts3Se
1c770 67 6d 65 6e 74 73 43 6c 6f 73 65 28 70 29 3b 0a  gmentsClose(p);.
1c780 20 20 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e    sqlite3Fts3Pen
1c790 64 69 6e 67 54 65 72 6d 73 43 6c 65 61 72 28 70  dingTermsClear(p
1c7a0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63  );..  return (rc
1c7b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
1c7c0 52 65 74 75 72 6e 44 6f 6e 65 20 26 26 20 62 53  ReturnDone && bS
1c7d0 65 65 6e 44 6f 6e 65 29 20 3f 20 53 51 4c 49 54  eenDone) ? SQLIT
1c7e0 45 5f 44 4f 4e 45 20 3a 20 72 63 3b 0a 7d 0a 0a  E_DONE : rc;.}..
1c7f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1c800 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
1c810 65 6e 20 74 68 65 20 75 73 65 72 20 65 78 65 63  en the user exec
1c820 75 74 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  utes the followi
1c830 6e 67 20 73 74 61 74 65 6d 65 6e 74 3a 0a 2a 2a  ng statement:.**
1c840 0a 2a 2a 20 20 20 20 20 49 4e 53 45 52 54 20 49  .**     INSERT I
1c850 4e 54 4f 20 3c 74 62 6c 3e 28 3c 74 62 6c 3e 29  NTO <tbl>(<tbl>)
1c860 20 56 41 4c 55 45 53 28 27 72 65 62 75 69 6c 64   VALUES('rebuild
1c870 27 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 6e  ');.**.** The en
1c880 74 69 72 65 20 46 54 53 20 69 6e 64 65 78 20 69  tire FTS index i
1c890 73 20 64 69 73 63 61 72 64 65 64 20 61 6e 64 20  s discarded and 
1c8a0 72 65 62 75 69 6c 74 2e 20 49 66 20 74 68 65 20  rebuilt. If the 
1c8b0 74 61 62 6c 65 20 69 73 20 6f 6e 65 20 0a 2a 2a  table is one .**
1c8c0 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
1c8d0 68 65 20 63 6f 6e 74 65 6e 74 3d 78 78 78 20 6f  he content=xxx o
1c8e0 70 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20  ption, then the 
1c8f0 6e 65 77 20 69 6e 64 65 78 20 69 73 20 62 61 73  new index is bas
1c900 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72  ed on.** the cur
1c910 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66  rent contents of
1c920 20 74 68 65 20 78 78 78 20 74 61 62 6c 65 2e 20   the xxx table. 
1c930 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 69 73  Otherwise, it is
1c940 20 72 65 62 75 69 6c 74 20 62 61 73 65 64 0a 2a   rebuilt based.*
1c950 2a 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  * on the content
1c960 73 20 6f 66 20 74 68 65 20 25 5f 63 6f 6e 74 65  s of the %_conte
1c970 6e 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  nt table..*/.sta
1c980 74 69 63 20 69 6e 74 20 66 74 73 33 44 6f 52 65  tic int fts3DoRe
1c990 62 75 69 6c 64 28 46 74 73 33 54 61 62 6c 65 20  build(Fts3Table 
1c9a0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  *p){.  int rc;  
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9c0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1c9d0 20 43 6f 64 65 20 2a 2f 0a 0a 20 20 72 63 20 3d   Code */..  rc =
1c9e0 20 66 74 73 33 44 65 6c 65 74 65 41 6c 6c 28 70   fts3DeleteAll(p
1c9f0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
1ca00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ca10 20 75 33 32 20 2a 61 53 7a 20 3d 20 30 3b 0a 20   u32 *aSz = 0;. 
1ca20 20 20 20 75 33 32 20 2a 61 53 7a 49 6e 73 20 3d     u32 *aSzIns =
1ca30 20 30 3b 0a 20 20 20 20 75 33 32 20 2a 61 53 7a   0;.    u32 *aSz
1ca40 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  Del = 0;.    sql
1ca50 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1ca60 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 45   = 0;.    int nE
1ca70 6e 74 72 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  ntry = 0;..    /
1ca80 2a 20 43 6f 6d 70 6f 73 65 20 61 6e 64 20 70 72  * Compose and pr
1ca90 65 70 61 72 65 20 61 6e 20 53 51 4c 20 73 74 61  epare an SQL sta
1caa0 74 65 6d 65 6e 74 20 74 6f 20 6c 6f 6f 70 20 74  tement to loop t
1cab0 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 74 65  hrough the conte
1cac0 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  nt table */.    
1cad0 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c  char *zSql = sql
1cae0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
1caf0 4c 45 43 54 20 25 73 22 20 2c 20 70 2d 3e 7a 52  LECT %s" , p->zR
1cb00 65 61 64 45 78 70 72 6c 69 73 74 29 3b 0a 20 20  eadExprlist);.  
1cb10 20 20 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20    if( !zSql ){. 
1cb20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1cb30 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
1cb40 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
1cb50 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
1cb60 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  (p->db, zSql, -1
1cb70 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
1cb80 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1cb90 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20  (zSql);.    }.. 
1cba0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1cbb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
1cbc0 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66  t nByte = sizeof
1cbd0 28 75 33 32 29 20 2a 20 28 70 2d 3e 6e 43 6f 6c  (u32) * (p->nCol
1cbe0 75 6d 6e 2b 31 29 2a 33 3b 0a 20 20 20 20 20 20  umn+1)*3;.      
1cbf0 61 53 7a 20 3d 20 28 75 33 32 20 2a 29 73 71 6c  aSz = (u32 *)sql
1cc00 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74  ite3_malloc(nByt
1cc10 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53  e);.      if( aS
1cc20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  z==0 ){.        
1cc30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1cc40 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  M;.      }else{.
1cc50 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61          memset(a
1cc60 53 7a 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20  Sz, 0, nByte);. 
1cc70 20 20 20 20 20 20 20 61 53 7a 49 6e 73 20 3d 20         aSzIns = 
1cc80 26 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  &aSz[p->nColumn+
1cc90 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 53 7a 44  1];.        aSzD
1cca0 65 6c 20 3d 20 26 61 53 7a 49 6e 73 5b 70 2d 3e  el = &aSzIns[p->
1ccb0 6e 43 6f 6c 75 6d 6e 2b 31 5d 3b 0a 20 20 20 20  nColumn+1];.    
1ccc0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77    }.    }..    w
1ccd0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
1cce0 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  _OK && SQLITE_RO
1ccf0 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
1cd00 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20  pStmt) ){.      
1cd10 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  int iCol;.      
1cd20 69 6e 74 20 69 4c 61 6e 67 69 64 20 3d 20 6c 61  int iLangid = la
1cd30 6e 67 69 64 46 72 6f 6d 53 65 6c 65 63 74 28 70  ngidFromSelect(p
1cd40 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  , pStmt);.      
1cd50 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67  rc = fts3Pending
1cd60 54 65 72 6d 73 44 6f 63 69 64 28 70 2c 20 30 2c  TermsDocid(p, 0,
1cd70 20 69 4c 61 6e 67 69 64 2c 20 73 71 6c 69 74 65   iLangid, sqlite
1cd80 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
1cd90 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 20 20 20  Stmt, 0));.     
1cda0 20 6d 65 6d 73 65 74 28 61 53 7a 2c 20 30 2c 20   memset(aSz, 0, 
1cdb0 73 69 7a 65 6f 66 28 61 53 7a 5b 30 5d 29 20 2a  sizeof(aSz[0]) *
1cdc0 20 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 29   (p->nColumn+1))
1cdd0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c  ;.      for(iCol
1cde0 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
1cdf0 4b 20 26 26 20 69 43 6f 6c 3c 70 2d 3e 6e 43 6f  K && iCol<p->nCo
1ce00 6c 75 6d 6e 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  lumn; iCol++){. 
1ce10 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 62         if( p->ab
1ce20 4e 6f 74 69 6e 64 65 78 65 64 5b 69 43 6f 6c 5d  Notindexed[iCol]
1ce30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1ce40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
1ce50 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
1ce60 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
1ce70 65 78 74 28 70 53 74 6d 74 2c 20 69 43 6f 6c 2b  ext(pStmt, iCol+
1ce80 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  1);.          rc
1ce90 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65   = fts3PendingTe
1cea0 72 6d 73 41 64 64 28 70 2c 20 69 4c 61 6e 67 69  rmsAdd(p, iLangi
1ceb0 64 2c 20 7a 2c 20 69 43 6f 6c 2c 20 26 61 53 7a  d, z, iCol, &aSz
1cec0 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20 20 20 20 20  [iCol]);.       
1ced0 20 20 20 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75 6d     aSz[p->nColum
1cee0 6e 5d 20 2b 3d 20 73 71 6c 69 74 65 33 5f 63 6f  n] += sqlite3_co
1cef0 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
1cf00 2c 20 69 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20  , iCol+1);.     
1cf10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1cf20 20 20 20 69 66 28 20 70 2d 3e 62 48 61 73 44 6f     if( p->bHasDo
1cf30 63 73 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  csize ){.       
1cf40 20 66 74 73 33 49 6e 73 65 72 74 44 6f 63 73 69   fts3InsertDocsi
1cf50 7a 65 28 26 72 63 2c 20 70 2c 20 61 53 7a 29 3b  ze(&rc, p, aSz);
1cf60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1cf70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1cf80 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1cf90 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
1cfa0 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70 53 74  mt);.        pSt
1cfb0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  mt = 0;.      }e
1cfc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 45 6e  lse{.        nEn
1cfd0 74 72 79 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66  try++;.        f
1cfe0 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
1cff0 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 43 6f  =p->nColumn; iCo
1d000 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l++){.          
1d010 61 53 7a 49 6e 73 5b 69 43 6f 6c 5d 20 2b 3d 20  aSzIns[iCol] += 
1d020 61 53 7a 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20  aSz[iCol];.     
1d030 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1d040 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 46   }.    if( p->bF
1d050 74 73 34 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ts4 ){.      fts
1d060 33 55 70 64 61 74 65 44 6f 63 54 6f 74 61 6c 73  3UpdateDocTotals
1d070 28 26 72 63 2c 20 70 2c 20 61 53 7a 49 6e 73 2c  (&rc, p, aSzIns,
1d080 20 61 53 7a 44 65 6c 2c 20 6e 45 6e 74 72 79 29   aSzDel, nEntry)
1d090 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1d0a0 74 65 33 5f 66 72 65 65 28 61 53 7a 29 3b 0a 0a  te3_free(aSz);..
1d0b0 20 20 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b      if( pStmt ){
1d0c0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d  .      int rc2 =
1d0d0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
1d0e0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
1d0f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d100 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
1d110 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20  = rc2;.      }. 
1d120 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
1d130 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1d140 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f   This function o
1d150 70 65 6e 73 20 61 20 63 75 72 73 6f 72 20 75 73  pens a cursor us
1d160 65 64 20 74 6f 20 72 65 61 64 20 74 68 65 20 69  ed to read the i
1d170 6e 70 75 74 20 64 61 74 61 20 66 6f 72 20 61 6e  nput data for an
1d180 20 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c   .** incremental
1d190 20 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e   merge operation
1d1a0 2e 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20  . Specifically, 
1d1b0 69 74 20 6f 70 65 6e 73 20 61 20 63 75 72 73 6f  it opens a curso
1d1c0 72 20 74 6f 20 73 63 61 6e 0a 2a 2a 20 74 68 65  r to scan.** the
1d1d0 20 6f 6c 64 65 73 74 20 6e 53 65 67 20 73 65 67   oldest nSeg seg
1d1e0 6d 65 6e 74 73 20 28 69 64 78 3d 30 20 74 68 72  ments (idx=0 thr
1d1f0 6f 75 67 68 20 69 64 78 3d 28 6e 53 65 67 2d 31  ough idx=(nSeg-1
1d200 29 29 20 69 6e 20 61 62 73 6f 6c 75 74 65 20 0a  )) in absolute .
1d210 2a 2a 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76  ** level iAbsLev
1d220 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
1d230 74 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 43  t fts3IncrmergeC
1d240 73 72 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  sr(.  Fts3Table 
1d250 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1d260 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61        /* FTS3 ta
1d270 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
1d280 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 41  sqlite3_int64 iA
1d290 62 73 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20  bsLevel,        
1d2a0 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65 76 65  /* Absolute leve
1d2b0 6c 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  l to open */.  i
1d2c0 6e 74 20 6e 53 65 67 2c 20 20 20 20 20 20 20 20  nt nSeg,        
1d2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d2e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  * Number of segm
1d2f0 65 6e 74 73 20 74 6f 20 6d 65 72 67 65 20 2a 2f  ents to merge */
1d300 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52  .  Fts3MultiSegR
1d310 65 61 64 65 72 20 2a 70 43 73 72 20 20 20 20 20  eader *pCsr     
1d320 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a     /* Cursor obj
1d330 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  ect to populate 
1d340 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
1d350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d360 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1d370 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n Code */.  sqli
1d380 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
1d390 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  = 0;        /* S
1d3a0 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f  tatement used to
1d3b0 20 72 65 61 64 20 25 5f 73 65 67 64 69 72 20 65   read %_segdir e
1d3c0 6e 74 72 79 20 2a 2f 20 20 0a 20 20 69 6e 74 20  ntry */  .  int 
1d3d0 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
1d3e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1d3f0 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  ytes allocated a
1d400 74 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e  t pCsr->apSegmen
1d410 74 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  t[] */..  /* All
1d420 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
1d430 74 68 65 20 46 74 73 33 4d 75 6c 74 69 53 65 67  the Fts3MultiSeg
1d440 52 65 61 64 65 72 2e 61 43 73 72 5b 5d 20 61 72  Reader.aCsr[] ar
1d450 72 61 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ray */.  memset(
1d460 70 43 73 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCsr, 0, sizeof(
1d470 2a 70 43 73 72 29 29 3b 0a 20 20 6e 42 79 74 65  *pCsr));.  nByte
1d480 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 33 53 65   = sizeof(Fts3Se
1d490 67 52 65 61 64 65 72 20 2a 29 20 2a 20 6e 53 65  gReader *) * nSe
1d4a0 67 3b 0a 20 20 70 43 73 72 2d 3e 61 70 53 65 67  g;.  pCsr->apSeg
1d4b0 6d 65 6e 74 20 3d 20 28 46 74 73 33 53 65 67 52  ment = (Fts3SegR
1d4c0 65 61 64 65 72 20 2a 2a 29 73 71 6c 69 74 65 33  eader **)sqlite3
1d4d0 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a  _malloc(nByte);.
1d4e0 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 61 70 53  .  if( pCsr->apS
1d4f0 65 67 6d 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  egment==0 ){.   
1d500 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1d510 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EM;.  }else{.   
1d520 20 6d 65 6d 73 65 74 28 70 43 73 72 2d 3e 61 70   memset(pCsr->ap
1d530 53 65 67 6d 65 6e 74 2c 20 30 2c 20 6e 42 79 74  Segment, 0, nByt
1d540 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73  e);.    rc = fts
1d550 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
1d560 53 45 4c 45 43 54 5f 4c 45 56 45 4c 2c 20 26 70  SELECT_LEVEL, &p
1d570 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Stmt, 0);.  }.  
1d580 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d590 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  K ){.    int i;.
1d5a0 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
1d5b0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
1d5c0 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 69 41  t64(pStmt, 1, iA
1d5d0 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20 61 73  bsLevel);.    as
1d5e0 73 65 72 74 28 20 70 43 73 72 2d 3e 6e 53 65 67  sert( pCsr->nSeg
1d5f0 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 66  ment==0 );.    f
1d600 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
1d610 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33  TE_OK && sqlite3
1d620 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
1d630 4c 49 54 45 5f 52 4f 57 20 26 26 20 69 3c 6e 53  LITE_ROW && i<nS
1d640 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  eg; i++){.      
1d650 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
1d660 53 65 67 52 65 61 64 65 72 4e 65 77 28 69 2c 20  SegReaderNew(i, 
1d670 30 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  0,.          sql
1d680 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
1d690 34 28 70 53 74 6d 74 2c 20 31 29 2c 20 20 20 20  4(pStmt, 1),    
1d6a0 20 20 20 20 2f 2a 20 73 65 67 64 69 72 2e 73 74      /* segdir.st
1d6b0 61 72 74 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20  art_block */.   
1d6c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
1d6d0 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d  olumn_int64(pStm
1d6e0 74 2c 20 32 29 2c 20 20 20 20 20 20 20 20 2f 2a  t, 2),        /*
1d6f0 20 73 65 67 64 69 72 2e 6c 65 61 76 65 73 5f 65   segdir.leaves_e
1d700 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  nd_block */.    
1d710 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
1d720 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
1d730 2c 20 33 29 2c 20 20 20 20 20 20 20 20 2f 2a 20  , 3),        /* 
1d740 73 65 67 64 69 72 2e 65 6e 64 5f 62 6c 6f 63 6b  segdir.end_block
1d750 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
1d760 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
1d770 62 28 70 53 74 6d 74 2c 20 34 29 2c 20 20 20 20  b(pStmt, 4),    
1d780 20 20 20 20 20 2f 2a 20 73 65 67 64 69 72 2e 72       /* segdir.r
1d790 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  oot */.         
1d7a0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1d7b0 62 79 74 65 73 28 70 53 74 6d 74 2c 20 34 29 2c  bytes(pStmt, 4),
1d7c0 20 20 20 20 20 20 20 20 2f 2a 20 73 65 67 64 69          /* segdi
1d7d0 72 2e 72 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20  r.root */.      
1d7e0 20 20 20 20 26 70 43 73 72 2d 3e 61 70 53 65 67      &pCsr->apSeg
1d7f0 6d 65 6e 74 5b 69 5d 0a 20 20 20 20 20 20 29 3b  ment[i].      );
1d800 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 6e 53 65  .      pCsr->nSe
1d810 67 6d 65 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20  gment++;.    }. 
1d820 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
1d830 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
1d840 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d850 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b  E_OK ) rc = rc2;
1d860 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1d870 63 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74  c;.}..typedef st
1d880 72 75 63 74 20 49 6e 63 72 6d 65 72 67 65 57 72  ruct IncrmergeWr
1d890 69 74 65 72 20 49 6e 63 72 6d 65 72 67 65 57 72  iter IncrmergeWr
1d8a0 69 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74  iter;.typedef st
1d8b0 72 75 63 74 20 4e 6f 64 65 57 72 69 74 65 72 20  ruct NodeWriter 
1d8c0 4e 6f 64 65 57 72 69 74 65 72 3b 0a 74 79 70 65  NodeWriter;.type
1d8d0 64 65 66 20 73 74 72 75 63 74 20 42 6c 6f 62 20  def struct Blob 
1d8e0 42 6c 6f 62 3b 0a 74 79 70 65 64 65 66 20 73 74  Blob;.typedef st
1d8f0 72 75 63 74 20 4e 6f 64 65 52 65 61 64 65 72 20  ruct NodeReader 
1d900 4e 6f 64 65 52 65 61 64 65 72 3b 0a 0a 2f 2a 0a  NodeReader;../*.
1d910 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
1d920 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1d930 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65  structure is use
1d940 64 20 61 73 20 61 20 64 79 6e 61 6d 69 63 20 62  d as a dynamic b
1d950 75 66 66 65 72 0a 2a 2a 20 74 6f 20 62 75 69 6c  uffer.** to buil
1d960 64 20 75 70 20 6e 6f 64 65 73 20 6f 72 20 6f 74  d up nodes or ot
1d970 68 65 72 20 62 6c 6f 62 73 20 6f 66 20 64 61 74  her blobs of dat
1d980 61 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  a in..**.** The 
1d990 66 75 6e 63 74 69 6f 6e 20 62 6c 6f 62 47 72 6f  function blobGro
1d9a0 77 42 75 66 66 65 72 28 29 20 69 73 20 75 73 65  wBuffer() is use
1d9b0 64 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20  d to extend the 
1d9c0 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  allocation..*/.s
1d9d0 74 72 75 63 74 20 42 6c 6f 62 20 7b 0a 20 20 63  truct Blob {.  c
1d9e0 68 61 72 20 2a 61 3b 20 20 20 20 20 20 20 20 20  har *a;         
1d9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1da00 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 6c 6c  * Pointer to all
1da10 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ocation */.  int
1da20 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
1da30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1da40 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  Number of valid 
1da50 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e  bytes of data in
1da60 20 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 41   a[] */.  int nA
1da70 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20  lloc;           
1da80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
1da90 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61  ocated size of a
1daa0 5b 5d 20 28 6e 41 6c 6c 6f 63 3e 3d 6e 29 20 2a  [] (nAlloc>=n) *
1dab0 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  /.};../*.** This
1dac0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73   structure is us
1dad0 65 64 20 74 6f 20 62 75 69 6c 64 20 75 70 20 62  ed to build up b
1dae0 75 66 66 65 72 73 20 63 6f 6e 74 61 69 6e 69 6e  uffers containin
1daf0 67 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  g segment b-tree
1db00 20 0a 2a 2a 20 6e 6f 64 65 73 20 28 62 6c 6f 63   .** nodes (bloc
1db10 6b 73 29 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4e  ks)..*/.struct N
1db20 6f 64 65 57 72 69 74 65 72 20 7b 0a 20 20 73 71  odeWriter {.  sq
1db30 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 42 6c 6f  lite3_int64 iBlo
1db40 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ck;           /*
1db50 20 43 75 72 72 65 6e 74 20 62 6c 6f 63 6b 20 69   Current block i
1db60 64 20 2a 2f 0a 20 20 42 6c 6f 62 20 6b 65 79 3b  d */.  Blob key;
1db70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db80 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 6b         /* Last k
1db90 65 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ey written to th
1dba0 65 20 63 75 72 72 65 6e 74 20 62 6c 6f 63 6b 20  e current block 
1dbb0 2a 2f 0a 20 20 42 6c 6f 62 20 62 6c 6f 63 6b 3b  */.  Blob block;
1dbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbd0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
1dbe0 62 6c 6f 63 6b 20 69 6d 61 67 65 20 2a 2f 0a 7d  block image */.}
1dbf0 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65  ;../*.** An obje
1dc00 63 74 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ct of this type 
1dc10 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 74 61  contains the sta
1dc20 74 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  te required to c
1dc30 72 65 61 74 65 20 6f 72 20 61 70 70 65 6e 64 0a  reate or append.
1dc40 2a 2a 20 74 6f 20 61 6e 20 61 70 70 65 6e 64 61  ** to an appenda
1dc50 62 6c 65 20 62 2d 74 72 65 65 20 73 65 67 6d 65  ble b-tree segme
1dc60 6e 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 49 6e  nt..*/.struct In
1dc70 63 72 6d 65 72 67 65 57 72 69 74 65 72 20 7b 0a  crmergeWriter {.
1dc80 20 20 69 6e 74 20 6e 4c 65 61 66 45 73 74 3b 20    int nLeafEst; 
1dc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dca0 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63    /* Space alloc
1dcb0 61 74 65 64 20 66 6f 72 20 6c 65 61 66 20 62 6c  ated for leaf bl
1dcc0 6f 63 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 57  ocks */.  int nW
1dcd0 6f 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ork;            
1dce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1dcf0 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65  ber of leaf page
1dd00 73 20 66 6c 75 73 68 65 64 20 2a 2f 0a 20 20 73  s flushed */.  s
1dd10 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 41 62  qlite3_int64 iAb
1dd20 73 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 2f  sLevel;        /
1dd30 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c  * Absolute level
1dd40 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e   of input segmen
1dd50 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ts */.  int iIdx
1dd60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dd70 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1dd80 20 6f 66 20 2a 6f 75 74 70 75 74 2a 20 73 65 67   of *output* seg
1dd90 6d 65 6e 74 20 69 6e 20 69 41 62 73 4c 65 76 65  ment in iAbsLeve
1dda0 6c 2b 31 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  l+1 */.  sqlite3
1ddb0 5f 69 6e 74 36 34 20 69 53 74 61 72 74 3b 20 20  _int64 iStart;  
1ddc0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63           /* Bloc
1ddd0 6b 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 72 73  k number of firs
1dde0 74 20 61 6c 6c 6f 63 61 74 65 64 20 62 6c 6f 63  t allocated bloc
1ddf0 6b 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  k */.  sqlite3_i
1de00 6e 74 36 34 20 69 45 6e 64 3b 20 20 20 20 20 20  nt64 iEnd;      
1de10 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20         /* Block 
1de20 6e 75 6d 62 65 72 20 6f 66 20 6c 61 73 74 20 61  number of last a
1de30 6c 6c 6f 63 61 74 65 64 20 62 6c 6f 63 6b 20 2a  llocated block *
1de40 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
1de50 34 20 6e 4c 65 61 66 44 61 74 61 3b 20 20 20 20  4 nLeafData;    
1de60 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
1de70 6c 65 61 66 20 70 61 67 65 20 64 61 74 61 20 73  leaf page data s
1de80 6f 20 66 61 72 20 2a 2f 0a 20 20 75 38 20 62 4e  o far */.  u8 bN
1de90 6f 4c 65 61 66 44 61 74 61 3b 20 20 20 20 20 20  oLeafData;      
1dea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
1deb0 20 74 72 75 65 2c 20 73 74 6f 72 65 20 30 20 66   true, store 0 f
1dec0 6f 72 20 73 65 67 6d 65 6e 74 20 73 69 7a 65 20  or segment size 
1ded0 2a 2f 0a 20 20 4e 6f 64 65 57 72 69 74 65 72 20  */.  NodeWriter 
1dee0 61 4e 6f 64 65 57 72 69 74 65 72 5b 46 54 53 5f  aNodeWriter[FTS_
1def0 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c 45 5f 48  MAX_APPENDABLE_H
1df00 45 49 47 48 54 5d 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a  EIGHT];.};../*.*
1df10 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66 20 74  * An object of t
1df20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70  he following typ
1df30 65 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  e is used to rea
1df40 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 73 69  d data from a si
1df50 6e 67 6c 65 0a 2a 2a 20 46 54 53 20 73 65 67 6d  ngle.** FTS segm
1df60 65 6e 74 20 6e 6f 64 65 2e 20 53 65 65 20 74 68  ent node. See th
1df70 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
1df80 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tions:.**.**    
1df90 20 6e 6f 64 65 52 65 61 64 65 72 49 6e 69 74 28   nodeReaderInit(
1dfa0 29 0a 2a 2a 20 20 20 20 20 6e 6f 64 65 52 65 61  ).**     nodeRea
1dfb0 64 65 72 4e 65 78 74 28 29 0a 2a 2a 20 20 20 20  derNext().**    
1dfc0 20 6e 6f 64 65 52 65 61 64 65 72 52 65 6c 65 61   nodeReaderRelea
1dfd0 73 65 28 29 0a 2a 2f 0a 73 74 72 75 63 74 20 4e  se().*/.struct N
1dfe0 6f 64 65 52 65 61 64 65 72 20 7b 0a 20 20 63 6f  odeReader {.  co
1dff0 6e 73 74 20 63 68 61 72 20 2a 61 4e 6f 64 65 3b  nst char *aNode;
1e000 0a 20 20 69 6e 74 20 6e 4e 6f 64 65 3b 0a 20 20  .  int nNode;.  
1e010 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20 20  int iOff;       
1e020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e030 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65  /* Current offse
1e040 74 20 77 69 74 68 69 6e 20 61 4e 6f 64 65 5b 5d  t within aNode[]
1e050 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74   */..  /* Output
1e060 20 76 61 72 69 61 62 6c 65 73 2e 20 43 6f 6e 74   variables. Cont
1e070 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65  aining the curre
1e080 6e 74 20 6e 6f 64 65 20 65 6e 74 72 79 2e 20 2a  nt node entry. *
1e090 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
1e0a0 34 20 69 43 68 69 6c 64 3b 20 20 20 20 20 20 20  4 iChild;       
1e0b0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1e0c0 6f 20 63 68 69 6c 64 20 6e 6f 64 65 20 2a 2f 0a  o child node */.
1e0d0 20 20 42 6c 6f 62 20 74 65 72 6d 3b 20 20 20 20    Blob term;    
1e0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0f0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74 65 72    /* Current ter
1e100 6d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  m */.  const cha
1e110 72 20 2a 61 44 6f 63 6c 69 73 74 3b 20 20 20 20  r *aDoclist;    
1e120 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1e130 72 20 74 6f 20 64 6f 63 6c 69 73 74 20 2a 2f 0a  r to doclist */.
1e140 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 20    int nDoclist; 
1e150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e160 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63    /* Size of doc
1e170 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  list in bytes */
1e180 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70  .};../*.** If *p
1e190 52 63 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45  Rc is not SQLITE
1e1a0 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  _OK when this fu
1e1b0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1e1c0 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
1e1d0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
1e1e0 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  f the allocation
1e1f0 20 61 74 20 70 42 6c 6f 62 2d 3e 61 20 69 73 20   at pBlob->a is 
1e200 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 74 20 6c  not already at l
1e210 65 61 73 74 20 6e 4d 69 6e 0a 2a 2a 20 62 79 74  east nMin.** byt
1e220 65 73 20 69 6e 20 73 69 7a 65 2c 20 65 78 74 65  es in size, exte
1e230 6e 64 20 28 72 65 61 6c 6c 6f 63 29 20 69 74 20  nd (realloc) it 
1e240 74 6f 20 62 65 20 73 6f 2e 0a 2a 2a 0a 2a 2a 20  to be so..**.** 
1e250 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
1e260 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 52 63  occurs, set *pRc
1e270 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   to SQLITE_NOMEM
1e280 20 61 6e 64 20 6c 65 61 76 65 20 70 42 6c 6f 62   and leave pBlob
1e290 2d 3e 61 0a 2a 2a 20 75 6e 6d 6f 64 69 66 69 65  ->a.** unmodifie
1e2a0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
1e2b0 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
1e2c0 73 75 63 63 65 65 64 73 2c 20 75 70 64 61 74 65  succeeds, update
1e2d0 20 70 42 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63 0a 2a   pBlob->nAlloc.*
1e2e0 2a 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65  * to reflect the
1e2f0 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 74 68 65   new size of the
1e300 20 70 42 6c 6f 62 2d 3e 61 5b 5d 20 62 75 66 66   pBlob->a[] buff
1e310 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
1e320 69 64 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65  id blobGrowBuffe
1e330 72 28 42 6c 6f 62 20 2a 70 42 6c 6f 62 2c 20 69  r(Blob *pBlob, i
1e340 6e 74 20 6e 4d 69 6e 2c 20 69 6e 74 20 2a 70 52  nt nMin, int *pR
1e350 63 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d  c){.  if( *pRc==
1e360 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 4d 69  SQLITE_OK && nMi
1e370 6e 3e 70 42 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63 20  n>pBlob->nAlloc 
1e380 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f  ){.    int nAllo
1e390 63 20 3d 20 6e 4d 69 6e 3b 0a 20 20 20 20 63 68  c = nMin;.    ch
1e3a0 61 72 20 2a 61 20 3d 20 28 63 68 61 72 20 2a 29  ar *a = (char *)
1e3b0 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
1e3c0 70 42 6c 6f 62 2d 3e 61 2c 20 6e 41 6c 6c 6f 63  pBlob->a, nAlloc
1e3d0 29 3b 0a 20 20 20 20 69 66 28 20 61 20 29 7b 0a  );.    if( a ){.
1e3e0 20 20 20 20 20 20 70 42 6c 6f 62 2d 3e 6e 41 6c        pBlob->nAl
1e3f0 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 3b 0a 20 20  loc = nAlloc;.  
1e400 20 20 20 20 70 42 6c 6f 62 2d 3e 61 20 3d 20 61      pBlob->a = a
1e410 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e420 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
1e430 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
1e440 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  }.}../*.** Attem
1e450 70 74 20 74 6f 20 61 64 76 61 6e 63 65 20 74 68  pt to advance th
1e460 65 20 6e 6f 64 65 2d 72 65 61 64 65 72 20 6f 62  e node-reader ob
1e470 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
1e480 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
1e490 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 78 74  t to.** the next
1e4a0 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 6e 6f   entry on the no
1e4b0 64 65 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  de. .**.** Retur
1e4c0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
1e4d0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
1e4e0 72 73 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rs (SQLITE_NOMEM
1e4f0 20 69 73 20 70 6f 73 73 69 62 6c 65 29 2e 20 0a   is possible). .
1e500 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65 74  ** Otherwise ret
1e510 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  urn SQLITE_OK. I
1e520 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  f there is no ne
1e530 78 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20  xt entry on the 
1e540 6e 6f 64 65 0a 2a 2a 20 28 65 2e 67 2e 20 62 65  node.** (e.g. be
1e550 63 61 75 73 65 20 74 68 65 20 63 75 72 72 65 6e  cause the curren
1e560 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6c  t entry is the l
1e570 61 73 74 29 20 73 65 74 20 4e 6f 64 65 52 65 61  ast) set NodeRea
1e580 64 65 72 2d 3e 61 4e 6f 64 65 20 74 6f 0a 2a 2a  der->aNode to.**
1e590 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74   NULL to indicat
1e5a0 65 20 45 4f 46 2e 20 4f 74 68 65 72 77 69 73 65  e EOF. Otherwise
1e5b0 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 4e  , populate the N
1e5c0 6f 64 65 52 65 61 64 65 72 20 73 74 72 75 63 74  odeReader struct
1e5d0 75 72 65 20 6f 75 74 70 75 74 20 0a 2a 2a 20 76  ure output .** v
1e5e0 61 72 69 61 62 6c 65 73 20 66 6f 72 20 74 68 65  ariables for the
1e5f0 20 6e 65 77 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73   new entry..*/.s
1e600 74 61 74 69 63 20 69 6e 74 20 6e 6f 64 65 52 65  tatic int nodeRe
1e610 61 64 65 72 4e 65 78 74 28 4e 6f 64 65 52 65 61  aderNext(NodeRea
1e620 64 65 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 62  der *p){.  int b
1e630 46 69 72 73 74 20 3d 20 28 70 2d 3e 74 65 72 6d  First = (p->term
1e640 2e 6e 3d 3d 30 29 3b 20 20 20 20 2f 2a 20 54 72  .n==0);    /* Tr
1e650 75 65 20 66 6f 72 20 66 69 72 73 74 20 74 65 72  ue for first ter
1e660 6d 20 6f 6e 20 74 68 65 20 6e 6f 64 65 20 2a 2f  m on the node */
1e670 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 20 3d  .  int nPrefix =
1e680 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1e690 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 63     /* Bytes to c
1e6a0 6f 70 79 20 66 72 6f 6d 20 70 72 65 76 69 6f 75  opy from previou
1e6b0 73 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  s term */.  int 
1e6c0 6e 53 75 66 66 69 78 20 3d 20 30 3b 20 20 20 20  nSuffix = 0;    
1e6d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1e6e0 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74  ytes to append t
1e6f0 6f 20 74 68 65 20 70 72 65 66 69 78 20 2a 2f 0a  o the prefix */.
1e700 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1e710 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
1e720 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1e730 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1e740 2d 3e 61 4e 6f 64 65 20 29 3b 0a 20 20 69 66 28  ->aNode );.  if(
1e750 20 70 2d 3e 69 43 68 69 6c 64 20 26 26 20 62 46   p->iChild && bF
1e760 69 72 73 74 3d 3d 30 20 29 20 70 2d 3e 69 43 68  irst==0 ) p->iCh
1e770 69 6c 64 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e  ild++;.  if( p->
1e780 69 4f 66 66 3e 3d 70 2d 3e 6e 4e 6f 64 65 20 29  iOff>=p->nNode )
1e790 7b 0a 20 20 20 20 2f 2a 20 45 4f 46 20 2a 2f 0a  {.    /* EOF */.
1e7a0 20 20 20 20 70 2d 3e 61 4e 6f 64 65 20 3d 20 30      p->aNode = 0
1e7b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1e7c0 66 28 20 62 46 69 72 73 74 3d 3d 30 20 29 7b 0a  f( bFirst==0 ){.
1e7d0 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 20 2b 3d        p->iOff +=
1e7e0 20 66 74 73 33 47 65 74 56 61 72 69 6e 74 33 32   fts3GetVarint32
1e7f0 28 26 70 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f  (&p->aNode[p->iO
1e800 66 66 5d 2c 20 26 6e 50 72 65 66 69 78 29 3b 0a  ff], &nPrefix);.
1e810 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 4f 66      }.    p->iOf
1e820 66 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72 69  f += fts3GetVari
1e830 6e 74 33 32 28 26 70 2d 3e 61 4e 6f 64 65 5b 70  nt32(&p->aNode[p
1e840 2d 3e 69 4f 66 66 5d 2c 20 26 6e 53 75 66 66 69  ->iOff], &nSuffi
1e850 78 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 50 72  x);..    if( nPr
1e860 65 66 69 78 3e 70 2d 3e 69 4f 66 66 20 7c 7c 20  efix>p->iOff || 
1e870 6e 53 75 66 66 69 78 3e 70 2d 3e 6e 4e 6f 64 65  nSuffix>p->nNode
1e880 2d 70 2d 3e 69 4f 66 66 20 29 7b 0a 20 20 20 20  -p->iOff ){.    
1e890 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e8a0 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20  CORRUPT_VTAB;.  
1e8b0 20 20 7d 0a 20 20 20 20 62 6c 6f 62 47 72 6f 77    }.    blobGrow
1e8c0 42 75 66 66 65 72 28 26 70 2d 3e 74 65 72 6d 2c  Buffer(&p->term,
1e8d0 20 6e 50 72 65 66 69 78 2b 6e 53 75 66 66 69 78   nPrefix+nSuffix
1e8e0 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20  , &rc);.    if( 
1e8f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e900 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70  .      memcpy(&p
1e910 2d 3e 74 65 72 6d 2e 61 5b 6e 50 72 65 66 69 78  ->term.a[nPrefix
1e920 5d 2c 20 26 70 2d 3e 61 4e 6f 64 65 5b 70 2d 3e  ], &p->aNode[p->
1e930 69 4f 66 66 5d 2c 20 6e 53 75 66 66 69 78 29 3b  iOff], nSuffix);
1e940 0a 20 20 20 20 20 20 70 2d 3e 74 65 72 6d 2e 6e  .      p->term.n
1e950 20 3d 20 6e 50 72 65 66 69 78 2b 6e 53 75 66 66   = nPrefix+nSuff
1e960 69 78 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66  ix;.      p->iOf
1e970 66 20 2b 3d 20 6e 53 75 66 66 69 78 3b 0a 20 20  f += nSuffix;.  
1e980 20 20 20 20 69 66 28 20 70 2d 3e 69 43 68 69 6c      if( p->iChil
1e990 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
1e9a0 70 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 33 47  p->iOff += fts3G
1e9b0 65 74 56 61 72 69 6e 74 33 32 28 26 70 2d 3e 61  etVarint32(&p->a
1e9c0 4e 6f 64 65 5b 70 2d 3e 69 4f 66 66 5d 2c 20 26  Node[p->iOff], &
1e9d0 70 2d 3e 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20  p->nDoclist);.  
1e9e0 20 20 20 20 20 20 69 66 28 20 28 70 2d 3e 6e 4e        if( (p->nN
1e9f0 6f 64 65 2d 70 2d 3e 69 4f 66 66 29 3c 70 2d 3e  ode-p->iOff)<p->
1ea00 6e 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20  nDoclist ){.    
1ea10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1ea20 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42  ITE_CORRUPT_VTAB
1ea30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ea40 20 20 20 20 70 2d 3e 61 44 6f 63 6c 69 73 74 20      p->aDoclist 
1ea50 3d 20 26 70 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69  = &p->aNode[p->i
1ea60 4f 66 66 5d 3b 0a 20 20 20 20 20 20 20 20 70 2d  Off];.        p-
1ea70 3e 69 4f 66 66 20 2b 3d 20 70 2d 3e 6e 44 6f 63  >iOff += p->nDoc
1ea80 6c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  list;.      }.  
1ea90 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
1eaa0 74 28 20 70 2d 3e 69 4f 66 66 3c 3d 70 2d 3e 6e  t( p->iOff<=p->n
1eab0 4e 6f 64 65 20 29 3b 0a 20 20 72 65 74 75 72 6e  Node );.  return
1eac0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1ead0 6c 65 61 73 65 20 61 6c 6c 20 64 79 6e 61 6d 69  lease all dynami
1eae0 63 20 72 65 73 6f 75 72 63 65 73 20 68 65 6c 64  c resources held
1eaf0 20 62 79 20 6e 6f 64 65 2d 72 65 61 64 65 72 20   by node-reader 
1eb00 6f 62 6a 65 63 74 20 2a 70 2e 0a 2a 2f 0a 73 74  object *p..*/.st
1eb10 61 74 69 63 20 76 6f 69 64 20 6e 6f 64 65 52 65  atic void nodeRe
1eb20 61 64 65 72 52 65 6c 65 61 73 65 28 4e 6f 64 65  aderRelease(Node
1eb30 52 65 61 64 65 72 20 2a 70 29 7b 0a 20 20 73 71  Reader *p){.  sq
1eb40 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 74 65  lite3_free(p->te
1eb50 72 6d 2e 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rm.a);.}../*.** 
1eb60 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 6f 64  Initialize a nod
1eb70 65 2d 72 65 61 64 65 72 20 6f 62 6a 65 63 74 20  e-reader object 
1eb80 74 6f 20 72 65 61 64 20 74 68 65 20 6e 6f 64 65  to read the node
1eb90 20 69 6e 20 62 75 66 66 65 72 20 61 4e 6f 64 65   in buffer aNode
1eba0 2f 6e 4e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  /nNode..**.** If
1ebb0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
1ebc0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1ebd0 65 64 20 61 6e 64 20 74 68 65 20 4e 6f 64 65 52  ed and the NodeR
1ebe0 65 61 64 65 72 20 6f 62 6a 65 63 74 20 73 65 74  eader object set
1ebf0 20 74 6f 20 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f   to .** point to
1ec00 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1ec10 20 6f 6e 20 74 68 65 20 6e 6f 64 65 20 28 69 66   on the node (if
1ec20 20 61 6e 79 29 2e 20 4f 74 68 65 72 77 69 73 65   any). Otherwise
1ec30 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65  , an SQLite.** e
1ec40 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1ec50 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1ec60 20 69 6e 74 20 6e 6f 64 65 52 65 61 64 65 72 49   int nodeReaderI
1ec70 6e 69 74 28 4e 6f 64 65 52 65 61 64 65 72 20 2a  nit(NodeReader *
1ec80 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  p, const char *a
1ec90 4e 6f 64 65 2c 20 69 6e 74 20 6e 4e 6f 64 65 29  Node, int nNode)
1eca0 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
1ecb0 20 73 69 7a 65 6f 66 28 4e 6f 64 65 52 65 61 64   sizeof(NodeRead
1ecc0 65 72 29 29 3b 0a 20 20 70 2d 3e 61 4e 6f 64 65  er));.  p->aNode
1ecd0 20 3d 20 61 4e 6f 64 65 3b 0a 20 20 70 2d 3e 6e   = aNode;.  p->n
1ece0 4e 6f 64 65 20 3d 20 6e 4e 6f 64 65 3b 0a 0a 20  Node = nNode;.. 
1ecf0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 69   /* Figure out i
1ed00 66 20 74 68 69 73 20 69 73 20 61 20 6c 65 61 66  f this is a leaf
1ed10 20 6f 72 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   or an internal 
1ed20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70  node. */.  if( p
1ed30 2d 3e 61 4e 6f 64 65 5b 30 5d 20 29 7b 0a 20 20  ->aNode[0] ){.  
1ed40 20 20 2f 2a 20 41 6e 20 69 6e 74 65 72 6e 61 6c    /* An internal
1ed50 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 70 2d   node. */.    p-
1ed60 3e 69 4f 66 66 20 3d 20 31 20 2b 20 73 71 6c 69  >iOff = 1 + sqli
1ed70 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74  te3Fts3GetVarint
1ed80 28 26 70 2d 3e 61 4e 6f 64 65 5b 31 5d 2c 20 26  (&p->aNode[1], &
1ed90 70 2d 3e 69 43 68 69 6c 64 29 3b 0a 20 20 7d 65  p->iChild);.  }e
1eda0 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 69 4f 66 66  lse{.    p->iOff
1edb0 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   = 1;.  }..  ret
1edc0 75 72 6e 20 6e 6f 64 65 52 65 61 64 65 72 4e 65  urn nodeReaderNe
1edd0 78 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xt(p);.}../*.** 
1ede0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1edf0 20 63 61 6c 6c 65 64 20 77 68 69 6c 65 20 77 72   called while wr
1ee00 69 74 69 6e 67 20 61 6e 20 46 54 53 20 73 65 67  iting an FTS seg
1ee10 6d 65 6e 74 20 65 61 63 68 20 74 69 6d 65 20 61  ment each time a
1ee20 20 6c 65 61 66 20 6f 0a 2a 2a 20 6e 6f 64 65 20   leaf o.** node 
1ee30 69 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20  is finished and 
1ee40 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
1ee50 20 54 68 65 20 6b 65 79 20 28 7a 54 65 72 6d 2f   The key (zTerm/
1ee60 6e 54 65 72 6d 29 20 69 73 20 67 75 61 72 61 6e  nTerm) is guaran
1ee70 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 67 72  teed.** to be gr
1ee80 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c  eater than the l
1ee90 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 74 68  argest key on th
1eea0 65 20 6e 6f 64 65 20 6a 75 73 74 20 77 72 69 74  e node just writ
1eeb0 74 65 6e 2c 20 62 75 74 20 73 6d 61 6c 6c 65 72  ten, but smaller
1eec0 0a 2a 2a 20 74 68 61 6e 20 6f 72 20 65 71 75 61  .** than or equa
1eed0 6c 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 6b  l to the first k
1eee0 65 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ey that will be 
1eef0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6e  written to the n
1ef00 65 78 74 20 6c 65 61 66 0a 2a 2a 20 6e 6f 64 65  ext leaf.** node
1ef10 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 6c 6f 63  ..**.** The bloc
1ef20 6b 20 69 64 20 6f 66 20 74 68 65 20 6c 65 61 66  k id of the leaf
1ef30 20 6e 6f 64 65 20 6a 75 73 74 20 77 72 69 74 74   node just writt
1ef40 65 6e 20 74 6f 20 64 69 73 6b 20 6d 61 79 20 62  en to disk may b
1ef50 65 20 66 6f 75 6e 64 20 69 6e 0a 2a 2a 20 28 70  e found in.** (p
1ef60 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69  Writer->aNodeWri
1ef70 74 65 72 5b 30 5d 2e 69 42 6c 6f 63 6b 29 20 77  ter[0].iBlock) w
1ef80 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1ef90 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  n is called..*/.
1efa0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49  static int fts3I
1efb0 6e 63 72 6d 65 72 67 65 50 75 73 68 28 0a 20 20  ncrmergePush(.  
1efc0 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
1efd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efe0 2f 2a 20 46 74 73 33 20 74 61 62 6c 65 20 68 61  /* Fts3 table ha
1eff0 6e 64 6c 65 20 2a 2f 0a 20 20 49 6e 63 72 6d 65  ndle */.  Incrme
1f000 72 67 65 57 72 69 74 65 72 20 2a 70 57 72 69 74  rgeWriter *pWrit
1f010 65 72 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69  er,       /* Wri
1f020 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
1f030 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72  const char *zTer
1f040 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
1f050 2f 2a 20 54 65 72 6d 20 74 6f 20 77 72 69 74 65  /* Term to write
1f060 20 74 6f 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64   to internal nod
1f070 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  e */.  int nTerm
1f080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f090 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
1f0a0 61 74 20 7a 54 65 72 6d 20 2a 2f 0a 29 7b 0a 20  at zTerm */.){. 
1f0b0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1f0c0 50 74 72 20 3d 20 70 57 72 69 74 65 72 2d 3e 61  Ptr = pWriter->a
1f0d0 4e 6f 64 65 57 72 69 74 65 72 5b 30 5d 2e 69 42  NodeWriter[0].iB
1f0e0 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 69 4c 61 79  lock;.  int iLay
1f0f0 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  er;..  assert( n
1f100 54 65 72 6d 3e 30 20 29 3b 0a 20 20 66 6f 72 28  Term>0 );.  for(
1f110 69 4c 61 79 65 72 3d 31 3b 20 41 4c 57 41 59 53  iLayer=1; ALWAYS
1f120 28 69 4c 61 79 65 72 3c 46 54 53 5f 4d 41 58 5f  (iLayer<FTS_MAX_
1f130 41 50 50 45 4e 44 41 42 4c 45 5f 48 45 49 47 48  APPENDABLE_HEIGH
1f140 54 29 3b 20 69 4c 61 79 65 72 2b 2b 29 7b 0a 20  T); iLayer++){. 
1f150 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
1f160 20 69 4e 65 78 74 50 74 72 20 3d 20 30 3b 0a 20   iNextPtr = 0;. 
1f170 20 20 20 4e 6f 64 65 57 72 69 74 65 72 20 2a 70     NodeWriter *p
1f180 4e 6f 64 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Node = &pWriter-
1f190 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 69 4c 61  >aNodeWriter[iLa
1f1a0 79 65 72 5d 3b 0a 20 20 20 20 69 6e 74 20 72 63  yer];.    int rc
1f1b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1f1c0 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 0a 20    int nPrefix;. 
1f1d0 20 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 0a     int nSuffix;.
1f1e0 20 20 20 20 69 6e 74 20 6e 53 70 61 63 65 3b 0a      int nSpace;.
1f1f0 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
1f200 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63  ut how much spac
1f210 65 20 74 68 65 20 6b 65 79 20 77 69 6c 6c 20 63  e the key will c
1f220 6f 6e 73 75 6d 65 20 69 66 20 69 74 20 69 73 20  onsume if it is 
1f230 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a  written to.    *
1f240 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f  * the current no
1f250 64 65 20 6f 66 20 6c 61 79 65 72 20 69 4c 61 79  de of layer iLay
1f260 65 72 2e 20 44 75 65 20 74 6f 20 74 68 65 20 70  er. Due to the p
1f270 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f  refix compressio
1f280 6e 2c 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  n, .    ** the s
1f290 70 61 63 65 20 72 65 71 75 69 72 65 64 20 63 68  pace required ch
1f2a0 61 6e 67 65 73 20 64 65 70 65 6e 64 69 6e 67 20  anges depending 
1f2b0 6f 6e 20 77 68 69 63 68 20 6e 6f 64 65 20 74 68  on which node th
1f2c0 65 20 6b 65 79 20 69 73 20 74 6f 0a 20 20 20 20  e key is to.    
1f2d0 2a 2a 20 62 65 20 61 64 64 65 64 20 74 6f 2e 20  ** be added to. 
1f2e0 20 2a 2f 0a 20 20 20 20 6e 50 72 65 66 69 78 20   */.    nPrefix 
1f2f0 3d 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70  = fts3PrefixComp
1f300 72 65 73 73 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e  ress(pNode->key.
1f310 61 2c 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 2c  a, pNode->key.n,
1f320 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   zTerm, nTerm);.
1f330 20 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54      nSuffix = nT
1f340 65 72 6d 20 2d 20 6e 50 72 65 66 69 78 3b 0a 20  erm - nPrefix;. 
1f350 20 20 20 6e 53 70 61 63 65 20 20 3d 20 73 71 6c     nSpace  = sql
1f360 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65  ite3Fts3VarintLe
1f370 6e 28 6e 50 72 65 66 69 78 29 3b 0a 20 20 20 20  n(nPrefix);.    
1f380 6e 53 70 61 63 65 20 2b 3d 20 73 71 6c 69 74 65  nSpace += sqlite
1f390 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e  3Fts3VarintLen(n
1f3a0 53 75 66 66 69 78 29 20 2b 20 6e 53 75 66 66 69  Suffix) + nSuffi
1f3b0 78 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 6f 64  x;..    if( pNod
1f3c0 65 2d 3e 6b 65 79 2e 6e 3d 3d 30 20 7c 7c 20 28  e->key.n==0 || (
1f3d0 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 20 2b  pNode->block.n +
1f3e0 20 6e 53 70 61 63 65 29 3c 3d 70 2d 3e 6e 4e 6f   nSpace)<=p->nNo
1f3f0 64 65 53 69 7a 65 20 29 7b 20 0a 20 20 20 20 20  deSize ){ .     
1f400 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65   /* If the curre
1f410 6e 74 20 6e 6f 64 65 20 6f 66 20 6c 61 79 65 72  nt node of layer
1f420 20 69 4c 61 79 65 72 20 63 6f 6e 74 61 69 6e 73   iLayer contains
1f430 20 7a 65 72 6f 20 6b 65 79 73 2c 20 6f 72 20 69   zero keys, or i
1f440 66 20 61 64 64 69 6e 67 0a 20 20 20 20 20 20 2a  f adding.      *
1f450 2a 20 74 68 65 20 6b 65 79 20 74 6f 20 69 74 20  * the key to it 
1f460 77 69 6c 6c 20 6e 6f 74 20 63 61 75 73 65 20 69  will not cause i
1f470 74 20 74 6f 20 67 72 6f 77 20 74 6f 20 6c 61 72  t to grow to lar
1f480 67 65 72 20 74 68 61 6e 20 6e 4e 6f 64 65 53 69  ger than nNodeSi
1f490 7a 65 20 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  ze .      ** byt
1f4a0 65 73 20 69 6e 20 73 69 7a 65 2c 20 77 72 69 74  es in size, writ
1f4b0 65 20 74 68 65 20 6b 65 79 20 68 65 72 65 2e 20  e the key here. 
1f4c0 20 2a 2f 0a 0a 20 20 20 20 20 20 42 6c 6f 62 20   */..      Blob 
1f4d0 2a 70 42 6c 6b 20 3d 20 26 70 4e 6f 64 65 2d 3e  *pBlk = &pNode->
1f4e0 62 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 69 66 28  block;.      if(
1f4f0 20 70 42 6c 6b 2d 3e 6e 3d 3d 30 20 29 7b 0a 20   pBlk->n==0 ){. 
1f500 20 20 20 20 20 20 20 62 6c 6f 62 47 72 6f 77 42         blobGrowB
1f510 75 66 66 65 72 28 70 42 6c 6b 2c 20 70 2d 3e 6e  uffer(pBlk, p->n
1f520 4e 6f 64 65 53 69 7a 65 2c 20 26 72 63 29 3b 0a  NodeSize, &rc);.
1f530 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1f540 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f550 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e 61 5b 30         pBlk->a[0
1f560 5d 20 3d 20 28 63 68 61 72 29 69 4c 61 79 65 72  ] = (char)iLayer
1f570 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c 6b  ;.          pBlk
1f580 2d 3e 6e 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ->n = 1 + sqlite
1f590 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26  3Fts3PutVarint(&
1f5a0 70 42 6c 6b 2d 3e 61 5b 31 5d 2c 20 69 50 74 72  pBlk->a[1], iPtr
1f5b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1f5c0 20 20 20 7d 0a 20 20 20 20 20 20 62 6c 6f 62 47     }.      blobG
1f5d0 72 6f 77 42 75 66 66 65 72 28 70 42 6c 6b 2c 20  rowBuffer(pBlk, 
1f5e0 70 42 6c 6b 2d 3e 6e 20 2b 20 6e 53 70 61 63 65  pBlk->n + nSpace
1f5f0 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 62 6c  , &rc);.      bl
1f600 6f 62 47 72 6f 77 42 75 66 66 65 72 28 26 70 4e  obGrowBuffer(&pN
1f610 6f 64 65 2d 3e 6b 65 79 2c 20 6e 54 65 72 6d 2c  ode->key, nTerm,
1f620 20 26 72 63 29 3b 0a 0a 20 20 20 20 20 20 69 66   &rc);..      if
1f630 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f640 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1f650 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 20 29 7b 0a 20  Node->key.n ){. 
1f660 20 20 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e 6e           pBlk->n
1f670 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50   += sqlite3Fts3P
1f680 75 74 56 61 72 69 6e 74 28 26 70 42 6c 6b 2d 3e  utVarint(&pBlk->
1f690 61 5b 70 42 6c 6b 2d 3e 6e 5d 2c 20 6e 50 72 65  a[pBlk->n], nPre
1f6a0 66 69 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  fix);.        }.
1f6b0 20 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e 6e 20          pBlk->n 
1f6c0 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75  += sqlite3Fts3Pu
1f6d0 74 56 61 72 69 6e 74 28 26 70 42 6c 6b 2d 3e 61  tVarint(&pBlk->a
1f6e0 5b 70 42 6c 6b 2d 3e 6e 5d 2c 20 6e 53 75 66 66  [pBlk->n], nSuff
1f6f0 69 78 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ix);.        mem
1f700 63 70 79 28 26 70 42 6c 6b 2d 3e 61 5b 70 42 6c  cpy(&pBlk->a[pBl
1f710 6b 2d 3e 6e 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50  k->n], &zTerm[nP
1f720 72 65 66 69 78 5d 2c 20 6e 53 75 66 66 69 78 29  refix], nSuffix)
1f730 3b 0a 20 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e  ;.        pBlk->
1f740 6e 20 2b 3d 20 6e 53 75 66 66 69 78 3b 0a 0a 20  n += nSuffix;.. 
1f750 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e         memcpy(pN
1f760 6f 64 65 2d 3e 6b 65 79 2e 61 2c 20 7a 54 65 72  ode->key.a, zTer
1f770 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20  m, nTerm);.     
1f780 20 20 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 20     pNode->key.n 
1f790 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = nTerm;.      }
1f7a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f7b0 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    /* Otherwise, 
1f7c0 66 6c 75 73 68 20 74 68 65 20 63 75 72 72 65 6e  flush the curren
1f7d0 74 20 6e 6f 64 65 20 6f 66 20 6c 61 79 65 72 20  t node of layer 
1f7e0 69 4c 61 79 65 72 20 74 6f 20 64 69 73 6b 2e 0a  iLayer to disk..
1f7f0 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 61 6c        ** Then al
1f800 6c 6f 63 61 74 65 20 61 20 6e 65 77 2c 20 65 6d  locate a new, em
1f810 70 74 79 20 73 69 62 6c 69 6e 67 20 6e 6f 64 65  pty sibling node
1f820 2e 20 54 68 65 20 6b 65 79 20 77 69 6c 6c 20 62  . The key will b
1f830 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20  e written.      
1f840 2a 2a 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ** into the pare
1f850 6e 74 20 6f 66 20 74 68 69 73 20 6e 6f 64 65 2e  nt of this node.
1f860 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 66   */.      rc = f
1f870 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28  ts3WriteSegment(
1f880 70 2c 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b  p, pNode->iBlock
1f890 2c 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61  , pNode->block.a
1f8a0 2c 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e  , pNode->block.n
1f8b0 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  );..      assert
1f8c0 28 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e  ( pNode->block.n
1f8d0 41 6c 6c 6f 63 3e 3d 70 2d 3e 6e 4e 6f 64 65 53  Alloc>=p->nNodeS
1f8e0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 70 4e 6f  ize );.      pNo
1f8f0 64 65 2d 3e 62 6c 6f 63 6b 2e 61 5b 30 5d 20 3d  de->block.a[0] =
1f900 20 28 63 68 61 72 29 69 4c 61 79 65 72 3b 0a 20   (char)iLayer;. 
1f910 20 20 20 20 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63       pNode->bloc
1f920 6b 2e 6e 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  k.n = 1 + sqlite
1f930 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26  3Fts3PutVarint(&
1f940 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 5b 31  pNode->block.a[1
1f950 5d 2c 20 69 50 74 72 2b 31 29 3b 0a 0a 20 20 20  ], iPtr+1);..   
1f960 20 20 20 69 4e 65 78 74 50 74 72 20 3d 20 70 4e     iNextPtr = pN
1f970 6f 64 65 2d 3e 69 42 6c 6f 63 6b 3b 0a 20 20 20  ode->iBlock;.   
1f980 20 20 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b     pNode->iBlock
1f990 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d  ++;.      pNode-
1f9a0 3e 6b 65 79 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  >key.n = 0;.    
1f9b0 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  }..    if( rc!=S
1f9c0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 4e 65 78  QLITE_OK || iNex
1f9d0 74 50 74 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  tPtr==0 ) return
1f9e0 20 72 63 3b 0a 20 20 20 20 69 50 74 72 20 3d 20   rc;.    iPtr = 
1f9f0 69 4e 65 78 74 50 74 72 3b 0a 20 20 7d 0a 0a 20  iNextPtr;.  }.. 
1fa00 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20   assert( 0 );.  
1fa10 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1fa20 2a 2a 20 41 70 70 65 6e 64 20 61 20 74 65 72 6d  ** Append a term
1fa30 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79   and (optionally
1fa40 29 20 64 6f 63 6c 69 73 74 20 74 6f 20 74 68 65  ) doclist to the
1fa50 20 46 54 53 20 73 65 67 6d 65 6e 74 20 6e 6f 64   FTS segment nod
1fa60 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 73  e currently.** s
1fa70 74 6f 72 65 64 20 69 6e 20 62 6c 6f 62 20 2a 70  tored in blob *p
1fa80 4e 6f 64 65 2e 20 54 68 65 20 6e 6f 64 65 20 6e  Node. The node n
1fa90 65 65 64 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  eed not contain 
1faa0 61 6e 79 20 74 65 72 6d 73 2c 20 62 75 74 20 74  any terms, but t
1fab0 68 65 0a 2a 2a 20 68 65 61 64 65 72 20 6d 75 73  he.** header mus
1fac0 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 66  t be written bef
1fad0 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
1fae0 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
1faf0 2a 2a 20 41 20 6e 6f 64 65 20 68 65 61 64 65 72  ** A node header
1fb00 20 69 73 20 61 20 73 69 6e 67 6c 65 20 30 78 30   is a single 0x0
1fb10 30 20 62 79 74 65 20 66 6f 72 20 61 20 6c 65 61  0 byte for a lea
1fb20 66 20 6e 6f 64 65 2c 20 6f 72 20 61 20 68 65 69  f node, or a hei
1fb30 67 68 74 20 76 61 72 69 6e 74 0a 2a 2a 20 66 6f  ght varint.** fo
1fb40 6c 6c 6f 77 65 64 20 62 79 20 74 68 65 20 6c 65  llowed by the le
1fb50 66 74 2d 68 61 6e 64 2d 63 68 69 6c 64 20 76 61  ft-hand-child va
1fb60 72 69 6e 74 20 66 6f 72 20 61 6e 20 69 6e 74 65  rint for an inte
1fb70 72 6e 61 6c 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rnal node..**.**
1fb80 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   The term to be 
1fb90 61 70 70 65 6e 64 65 64 20 69 73 20 70 61 73 73  appended is pass
1fba0 65 64 20 76 69 61 20 61 72 67 75 6d 65 6e 74 73  ed via arguments
1fbb0 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 46 6f   zTerm/nTerm. Fo
1fbc0 72 20 61 20 0a 2a 2a 20 6c 65 61 66 20 6e 6f 64  r a .** leaf nod
1fbd0 65 2c 20 74 68 65 20 64 6f 63 6c 69 73 74 20 69  e, the doclist i
1fbe0 73 20 70 61 73 73 65 64 20 61 73 20 61 44 6f 63  s passed as aDoc
1fbf0 6c 69 73 74 2f 6e 44 6f 63 6c 69 73 74 2e 20 46  list/nDoclist. F
1fc00 6f 72 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a 2a  or an internal.*
1fc10 2a 20 6e 6f 64 65 2c 20 62 6f 74 68 20 61 44 6f  * node, both aDo
1fc20 63 6c 69 73 74 20 61 6e 64 20 6e 44 6f 63 6c 69  clist and nDocli
1fc30 73 74 20 6d 75 73 74 20 62 65 20 70 61 73 73 65  st must be passe
1fc40 64 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  d 0..**.** If th
1fc50 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 76 61  e size of the va
1fc60 6c 75 65 20 69 6e 20 62 6c 6f 62 20 70 50 72 65  lue in blob pPre
1fc70 76 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  v is zero, then 
1fc80 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1fc90 74 0a 2a 2a 20 74 65 72 6d 20 77 72 69 74 74 65  t.** term writte
1fca0 6e 20 74 6f 20 74 68 65 20 6e 6f 64 65 2e 20 4f  n to the node. O
1fcb0 74 68 65 72 77 69 73 65 2c 20 70 50 72 65 76 20  therwise, pPrev 
1fcc0 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 70 79 20  contains a copy 
1fcd0 6f 66 20 74 68 65 20 0a 2a 2a 20 70 72 65 76 69  of the .** previ
1fce0 6f 75 73 20 74 65 72 6d 2e 20 42 65 66 6f 72 65  ous term. Before
1fcf0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
1fd00 65 74 75 72 6e 73 2c 20 69 74 20 69 73 20 75 70  eturns, it is up
1fd10 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  dated to contain
1fd20 20 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 7a 54   a.** copy of zT
1fd30 65 72 6d 2f 6e 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a  erm/nTerm..**.**
1fd40 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
1fd50 68 61 74 20 74 68 65 20 62 75 66 66 65 72 20 61  hat the buffer a
1fd60 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
1fd70 4e 6f 64 65 20 69 73 20 61 6c 72 65 61 64 79 20  Node is already 
1fd80 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20  large.** enough 
1fd90 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74  to accommodate t
1fda0 68 65 20 6e 65 77 20 65 6e 74 72 79 2e 20 54 68  he new entry. Th
1fdb0 65 20 62 75 66 66 65 72 20 61 73 73 6f 63 69 61  e buffer associa
1fdc0 74 65 64 20 77 69 74 68 20 70 50 72 65 76 0a 2a  ted with pPrev.*
1fdd0 2a 20 69 73 20 65 78 74 65 6e 64 65 64 20 62 79  * is extended by
1fde0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1fdf0 66 20 72 65 71 75 72 69 72 65 64 2e 0a 2a 2a 0a  f requrired..**.
1fe00 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 28  ** If an error (
1fe10 69 2e 65 2e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69  i.e. OOM conditi
1fe20 6f 6e 29 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  on) occurs, an S
1fe30 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1fe40 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
1fe50 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
1fe60 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
1fe70 20 69 6e 74 20 66 74 73 33 41 70 70 65 6e 64 54   int fts3AppendT
1fe80 6f 4e 6f 64 65 28 0a 20 20 42 6c 6f 62 20 2a 70  oNode(.  Blob *p
1fe90 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  Node,           
1fea0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
1feb0 65 6e 74 20 6e 6f 64 65 20 69 6d 61 67 65 20 74  ent node image t
1fec0 6f 20 61 70 70 65 6e 64 20 74 6f 20 2a 2f 0a 20  o append to */. 
1fed0 20 42 6c 6f 62 20 2a 70 50 72 65 76 2c 20 20 20   Blob *pPrev,   
1fee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fef0 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
1ff00 69 6e 69 6e 67 20 70 72 65 76 69 6f 75 73 20 74  ining previous t
1ff10 65 72 6d 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  erm written */. 
1ff20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
1ff30 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
1ff40 20 2f 2a 20 4e 65 77 20 74 65 72 6d 20 74 6f 20   /* New term to 
1ff50 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  write */.  int n
1ff60 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
1ff70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1ff80 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62  ze of zTerm in b
1ff90 79 74 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ytes */.  const 
1ffa0 63 68 61 72 20 2a 61 44 6f 63 6c 69 73 74 2c 20  char *aDoclist, 
1ffb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63            /* Doc
1ffc0 6c 69 73 74 20 28 6f 72 20 4e 55 4c 4c 29 20 74  list (or NULL) t
1ffd0 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74  o write */.  int
1ffe0 20 6e 44 6f 63 6c 69 73 74 20 20 20 20 20 20 20   nDoclist       
1fff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20000 53 69 7a 65 20 6f 66 20 61 44 6f 63 6c 69 73 74  Size of aDoclist
20010 20 69 6e 20 62 79 74 65 73 20 2a 2f 20 0a 29 7b   in bytes */ .){
20020 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
20030 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
20040 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
20050 65 20 2a 2f 0a 20 20 69 6e 74 20 62 46 69 72 73  e */.  int bFirs
20060 74 20 3d 20 28 70 50 72 65 76 2d 3e 6e 3d 3d 30  t = (pPrev->n==0
20070 29 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  );     /* True i
20080 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
20090 72 73 74 20 74 65 72 6d 20 77 72 69 74 74 65 6e  rst term written
200a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69   */.  int nPrefi
200b0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
200c0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
200d0 20 74 65 72 6d 20 70 72 65 66 69 78 20 69 6e 20   term prefix in 
200e0 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  bytes */.  int n
200f0 53 75 66 66 69 78 3b 20 20 20 20 20 20 20 20 20  Suffix;         
20100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
20110 7a 65 20 6f 66 20 74 65 72 6d 20 73 75 66 66 69  ze of term suffi
20120 78 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20  x in bytes */.. 
20130 20 2f 2a 20 4e 6f 64 65 20 6d 75 73 74 20 68 61   /* Node must ha
20140 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
20150 73 74 61 72 74 65 64 2e 20 54 68 65 72 65 20 6d  started. There m
20160 75 73 74 20 62 65 20 61 20 64 6f 63 6c 69 73 74  ust be a doclist
20170 20 66 6f 72 20 61 0a 20 20 2a 2a 20 6c 65 61 66   for a.  ** leaf
20180 20 6e 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65   node, and there
20190 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 20 64   must not be a d
201a0 6f 63 6c 69 73 74 20 66 6f 72 20 61 6e 20 69 6e  oclist for an in
201b0 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 20 20 2a 2f  ternal node.  */
201c0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65  .  assert( pNode
201d0 2d 3e 6e 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ->n>0 );.  asser
201e0 74 28 20 28 70 4e 6f 64 65 2d 3e 61 5b 30 5d 3d  t( (pNode->a[0]=
201f0 3d 27 5c 30 27 29 3d 3d 28 61 44 6f 63 6c 69 73  ='\0')==(aDoclis
20200 74 21 3d 30 29 20 29 3b 0a 0a 20 20 62 6c 6f 62  t!=0) );..  blob
20210 47 72 6f 77 42 75 66 66 65 72 28 70 50 72 65 76  GrowBuffer(pPrev
20220 2c 20 6e 54 65 72 6d 2c 20 26 72 63 29 3b 0a 20  , nTerm, &rc);. 
20230 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20240 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
20250 0a 20 20 6e 50 72 65 66 69 78 20 3d 20 66 74 73  .  nPrefix = fts
20260 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28  3PrefixCompress(
20270 70 50 72 65 76 2d 3e 61 2c 20 70 50 72 65 76 2d  pPrev->a, pPrev-
20280 3e 6e 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  >n, zTerm, nTerm
20290 29 3b 0a 20 20 6e 53 75 66 66 69 78 20 3d 20 6e  );.  nSuffix = n
202a0 54 65 72 6d 20 2d 20 6e 50 72 65 66 69 78 3b 0a  Term - nPrefix;.
202b0 20 20 6d 65 6d 63 70 79 28 70 50 72 65 76 2d 3e    memcpy(pPrev->
202c0 61 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29  a, zTerm, nTerm)
202d0 3b 0a 20 20 70 50 72 65 76 2d 3e 6e 20 3d 20 6e  ;.  pPrev->n = n
202e0 54 65 72 6d 3b 0a 0a 20 20 69 66 28 20 62 46 69  Term;..  if( bFi
202f0 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e  rst==0 ){.    pN
20300 6f 64 65 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65  ode->n += sqlite
20310 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26  3Fts3PutVarint(&
20320 70 4e 6f 64 65 2d 3e 61 5b 70 4e 6f 64 65 2d 3e  pNode->a[pNode->
20330 6e 5d 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20  n], nPrefix);.  
20340 7d 0a 20 20 70 4e 6f 64 65 2d 3e 6e 20 2b 3d 20  }.  pNode->n += 
20350 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
20360 72 69 6e 74 28 26 70 4e 6f 64 65 2d 3e 61 5b 70  rint(&pNode->a[p
20370 4e 6f 64 65 2d 3e 6e 5d 2c 20 6e 53 75 66 66 69  Node->n], nSuffi
20380 78 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 4e  x);.  memcpy(&pN
20390 6f 64 65 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d  ode->a[pNode->n]
203a0 2c 20 26 7a 54 65 72 6d 5b 6e 50 72 65 66 69 78  , &zTerm[nPrefix
203b0 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 70  ], nSuffix);.  p
203c0 4e 6f 64 65 2d 3e 6e 20 2b 3d 20 6e 53 75 66 66  Node->n += nSuff
203d0 69 78 3b 0a 0a 20 20 69 66 28 20 61 44 6f 63 6c  ix;..  if( aDocl
203e0 69 73 74 20 29 7b 0a 20 20 20 20 70 4e 6f 64 65  ist ){.    pNode
203f0 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ->n += sqlite3Ft
20400 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 4e 6f  s3PutVarint(&pNo
20410 64 65 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d 2c  de->a[pNode->n],
20420 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20   nDoclist);.    
20430 6d 65 6d 63 70 79 28 26 70 4e 6f 64 65 2d 3e 61  memcpy(&pNode->a
20440 5b 70 4e 6f 64 65 2d 3e 6e 5d 2c 20 61 44 6f 63  [pNode->n], aDoc
20450 6c 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b  list, nDoclist);
20460 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 6e 20 2b 3d  .    pNode->n +=
20470 20 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a 0a   nDoclist;.  }..
20480 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d    assert( pNode-
20490 3e 6e 3c 3d 70 4e 6f 64 65 2d 3e 6e 41 6c 6c 6f  >n<=pNode->nAllo
204a0 63 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  c );..  return S
204b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
204c0 2a 2a 20 41 70 70 65 6e 64 20 74 68 65 20 63 75  ** Append the cu
204d0 72 72 65 6e 74 20 74 65 72 6d 20 61 6e 64 20 64  rrent term and d
204e0 6f 63 6c 69 73 74 20 70 6f 69 6e 74 65 64 20 74  oclist pointed t
204f0 6f 20 62 79 20 63 75 72 73 6f 72 20 70 43 73 72  o by cursor pCsr
20500 20 74 6f 20 74 68 65 0a 2a 2a 20 61 70 70 65 6e   to the.** appen
20510 64 61 62 6c 65 20 62 2d 74 72 65 65 20 73 65 67  dable b-tree seg
20520 6d 65 6e 74 20 6f 70 65 6e 65 64 20 66 6f 72 20  ment opened for 
20530 77 72 69 74 69 6e 67 20 62 79 20 70 57 72 69 74  writing by pWrit
20540 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
20550 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
20560 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
20570 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
20580 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
20590 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49  static int fts3I
205a0 6e 63 72 6d 65 72 67 65 41 70 70 65 6e 64 28 0a  ncrmergeAppend(.
205b0 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
205c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205d0 20 20 2f 2a 20 46 74 73 33 20 74 61 62 6c 65 20    /* Fts3 table 
205e0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 49 6e 63 72  handle */.  Incr
205f0 6d 65 72 67 65 57 72 69 74 65 72 20 2a 70 57 72  mergeWriter *pWr
20600 69 74 65 72 2c 20 20 20 20 20 20 20 2f 2a 20 57  iter,       /* W
20610 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  riter object */.
20620 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65    Fts3MultiSegRe
20630 61 64 65 72 20 2a 70 43 73 72 20 20 20 20 20 20  ader *pCsr      
20640 20 20 2f 2a 20 43 75 72 73 6f 72 20 63 6f 6e 74    /* Cursor cont
20650 61 69 6e 69 6e 67 20 74 65 72 6d 20 61 6e 64 20  aining term and 
20660 64 6f 63 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20  doclist */.){.  
20670 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72  const char *zTer
20680 6d 20 3d 20 70 43 73 72 2d 3e 7a 54 65 72 6d 3b  m = pCsr->zTerm;
20690 0a 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70  .  int nTerm = p
206a0 43 73 72 2d 3e 6e 54 65 72 6d 3b 0a 20 20 63 6f  Csr->nTerm;.  co
206b0 6e 73 74 20 63 68 61 72 20 2a 61 44 6f 63 6c 69  nst char *aDocli
206c0 73 74 20 3d 20 70 43 73 72 2d 3e 61 44 6f 63 6c  st = pCsr->aDocl
206d0 69 73 74 3b 0a 20 20 69 6e 74 20 6e 44 6f 63 6c  ist;.  int nDocl
206e0 69 73 74 20 3d 20 70 43 73 72 2d 3e 6e 44 6f 63  ist = pCsr->nDoc
206f0 6c 69 73 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  list;.  int rc =
20700 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
20710 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
20720 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  code */.  int nS
20730 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
20740 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
20750 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20   space in bytes 
20760 72 65 71 75 69 72 65 64 20 6f 6e 20 6c 65 61 66  required on leaf
20770 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69   */.  int nPrefi
20780 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
20790 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70      /* Size of p
207a0 72 65 66 69 78 20 73 68 61 72 65 64 20 77 69 74  refix shared wit
207b0 68 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20  h previous term 
207c0 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 66 66 69 78  */.  int nSuffix
207d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
207e0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 75     /* Size of su
207f0 66 66 69 78 20 28 6e 54 65 72 6d 20 2d 20 6e 50  ffix (nTerm - nP
20800 72 65 66 69 78 29 20 2a 2f 0a 20 20 4e 6f 64 65  refix) */.  Node
20810 57 72 69 74 65 72 20 2a 70 4c 65 61 66 3b 20 20  Writer *pLeaf;  
20820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a            /* Obj
20830 65 63 74 20 75 73 65 64 20 74 6f 20 77 72 69 74  ect used to writ
20840 65 20 6c 65 61 66 20 6e 6f 64 65 73 20 2a 2f 0a  e leaf nodes */.
20850 0a 20 20 70 4c 65 61 66 20 3d 20 26 70 57 72 69  .  pLeaf = &pWri
20860 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72  ter->aNodeWriter
20870 5b 30 5d 3b 0a 20 20 6e 50 72 65 66 69 78 20 3d  [0];.  nPrefix =
20880 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72   fts3PrefixCompr
20890 65 73 73 28 70 4c 65 61 66 2d 3e 6b 65 79 2e 61  ess(pLeaf->key.a
208a0 2c 20 70 4c 65 61 66 2d 3e 6b 65 79 2e 6e 2c 20  , pLeaf->key.n, 
208b0 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  zTerm, nTerm);. 
208c0 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d   nSuffix = nTerm
208d0 20 2d 20 6e 50 72 65 66 69 78 3b 0a 0a 20 20 6e   - nPrefix;..  n
208e0 53 70 61 63 65 20 20 3d 20 73 71 6c 69 74 65 33  Space  = sqlite3
208f0 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 50  Fts3VarintLen(nP
20900 72 65 66 69 78 29 3b 0a 20 20 6e 53 70 61 63 65  refix);.  nSpace
20910 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56   += sqlite3Fts3V
20920 61 72 69 6e 74 4c 65 6e 28 6e 53 75 66 66 69 78  arintLen(nSuffix
20930 29 20 2b 20 6e 53 75 66 66 69 78 3b 0a 20 20 6e  ) + nSuffix;.  n
20940 53 70 61 63 65 20 2b 3d 20 73 71 6c 69 74 65 33  Space += sqlite3
20950 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 44  Fts3VarintLen(nD
20960 6f 63 6c 69 73 74 29 20 2b 20 6e 44 6f 63 6c 69  oclist) + nDocli
20970 73 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  st;..  /* If the
20980 20 63 75 72 72 65 6e 74 20 62 6c 6f 63 6b 20 69   current block i
20990 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 61 6e 64  s not empty, and
209a0 20 69 66 20 61 64 64 69 6e 67 20 74 68 69 73 20   if adding this 
209b0 74 65 72 6d 2f 64 6f 63 6c 69 73 74 0a 20 20 2a  term/doclist.  *
209c0 2a 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  * to the current
209d0 20 62 6c 6f 63 6b 20 77 6f 75 6c 64 20 6d 61 6b   block would mak
209e0 65 20 69 74 20 6c 61 72 67 65 72 20 74 68 61 6e  e it larger than
209f0 20 46 74 73 33 54 61 62 6c 65 2e 6e 4e 6f 64 65   Fts3Table.nNode
20a00 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 2c  Size.  ** bytes,
20a10 20 77 72 69 74 65 20 74 68 69 73 20 62 6c 6f 63   write this bloc
20a20 6b 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  k out to the dat
20a30 61 62 61 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20  abase. */.  if( 
20a40 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 3e 30  pLeaf->block.n>0
20a50 20 26 26 20 28 70 4c 65 61 66 2d 3e 62 6c 6f 63   && (pLeaf->bloc
20a60 6b 2e 6e 20 2b 20 6e 53 70 61 63 65 29 3e 70 2d  k.n + nSpace)>p-
20a70 3e 6e 4e 6f 64 65 53 69 7a 65 20 29 7b 0a 20 20  >nNodeSize ){.  
20a80 20 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65    rc = fts3Write
20a90 53 65 67 6d 65 6e 74 28 70 2c 20 70 4c 65 61 66  Segment(p, pLeaf
20aa0 2d 3e 69 42 6c 6f 63 6b 2c 20 70 4c 65 61 66 2d  ->iBlock, pLeaf-
20ab0 3e 62 6c 6f 63 6b 2e 61 2c 20 70 4c 65 61 66 2d  >block.a, pLeaf-
20ac0 3e 62 6c 6f 63 6b 2e 6e 29 3b 0a 20 20 20 20 70  >block.n);.    p
20ad0 57 72 69 74 65 72 2d 3e 6e 57 6f 72 6b 2b 2b 3b  Writer->nWork++;
20ae0 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
20af0 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 74 6f   current term to
20b00 20 74 68 65 20 70 61 72 65 6e 74 20 6e 6f 64 65   the parent node
20b10 2e 20 54 68 65 20 74 65 72 6d 20 61 64 64 65 64  . The term added
20b20 20 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   to the .    ** 
20b30 70 61 72 65 6e 74 20 6d 75 73 74 3a 0a 20 20 20  parent must:.   
20b40 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 61 29 20   **.    **   a) 
20b50 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
20b60 74 68 65 20 6c 61 72 67 65 73 74 20 74 65 72 6d  the largest term
20b70 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 6e 6f 64   on the leaf nod
20b80 65 20 6a 75 73 74 20 77 72 69 74 74 65 6e 0a 20  e just written. 
20b90 20 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 74 68     **      to th
20ba0 65 20 64 61 74 61 62 61 73 65 20 28 73 74 69 6c  e database (stil
20bb0 6c 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70  l available in p
20bc0 4c 65 61 66 2d 3e 6b 65 79 29 2c 20 61 6e 64 0a  Leaf->key), and.
20bd0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
20be0 62 29 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  b) be less than 
20bf0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
20c00 74 65 72 6d 20 61 62 6f 75 74 20 74 6f 20 62 65  term about to be
20c10 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6e 65   added to the ne
20c20 77 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6c 65  w.    **      le
20c30 61 66 20 6e 6f 64 65 20 28 7a 54 65 72 6d 2f 6e  af node (zTerm/n
20c40 54 65 72 6d 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  Term)..    **.  
20c50 20 20 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f    ** In other wo
20c60 72 64 73 2c 20 69 74 20 6d 75 73 74 20 62 65 20  rds, it must be 
20c70 74 68 65 20 70 72 65 66 69 78 20 6f 66 20 7a 54  the prefix of zT
20c80 65 72 6d 20 31 20 62 79 74 65 20 6c 6f 6e 67 65  erm 1 byte longe
20c90 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68  r than.    ** th
20ca0 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20  e common prefix 
20cb0 28 69 66 20 61 6e 79 29 20 6f 66 20 7a 54 65 72  (if any) of zTer
20cc0 6d 20 61 6e 64 20 70 57 72 69 74 65 72 2d 3e 7a  m and pWriter->z
20cd0 54 65 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Term..    */.   
20ce0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20cf0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
20d00 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 50 75   fts3IncrmergePu
20d10 73 68 28 70 2c 20 70 57 72 69 74 65 72 2c 20 7a  sh(p, pWriter, z
20d20 54 65 72 6d 2c 20 6e 50 72 65 66 69 78 2b 31 29  Term, nPrefix+1)
20d30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
20d40 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  Advance to the n
20d50 65 78 74 20 6f 75 74 70 75 74 20 62 6c 6f 63 6b  ext output block
20d60 20 2a 2f 0a 20 20 20 20 70 4c 65 61 66 2d 3e 69   */.    pLeaf->i
20d70 42 6c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 70 4c 65  Block++;.    pLe
20d80 61 66 2d 3e 6b 65 79 2e 6e 20 3d 20 30 3b 0a 20  af->key.n = 0;. 
20d90 20 20 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e     pLeaf->block.
20da0 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 6e 53 75 66  n = 0;..    nSuf
20db0 66 69 78 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20  fix = nTerm;.   
20dc0 20 6e 53 70 61 63 65 20 20 3d 20 31 3b 0a 20 20   nSpace  = 1;.  
20dd0 20 20 6e 53 70 61 63 65 20 2b 3d 20 73 71 6c 69    nSpace += sqli
20de0 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e  te3Fts3VarintLen
20df0 28 6e 53 75 66 66 69 78 29 20 2b 20 6e 53 75 66  (nSuffix) + nSuf
20e00 66 69 78 3b 0a 20 20 20 20 6e 53 70 61 63 65 20  fix;.    nSpace 
20e10 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56 61  += sqlite3Fts3Va
20e20 72 69 6e 74 4c 65 6e 28 6e 44 6f 63 6c 69 73 74  rintLen(nDoclist
20e30 29 20 2b 20 6e 44 6f 63 6c 69 73 74 3b 0a 20 20  ) + nDoclist;.  
20e40 7d 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c  }..  pWriter->nL
20e50 65 61 66 44 61 74 61 20 2b 3d 20 6e 53 70 61 63  eafData += nSpac
20e60 65 3b 0a 20 20 62 6c 6f 62 47 72 6f 77 42 75 66  e;.  blobGrowBuf
20e70 66 65 72 28 26 70 4c 65 61 66 2d 3e 62 6c 6f 63  fer(&pLeaf->bloc
20e80 6b 2c 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e  k, pLeaf->block.
20e90 6e 20 2b 20 6e 53 70 61 63 65 2c 20 26 72 63 29  n + nSpace, &rc)
20ea0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
20eb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
20ec0 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 3d   pLeaf->block.n=
20ed0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 61  =0 ){.      pLea
20ee0 66 2d 3e 62 6c 6f 63 6b 2e 6e 20 3d 20 31 3b 0a  f->block.n = 1;.
20ef0 20 20 20 20 20 20 70 4c 65 61 66 2d 3e 62 6c 6f        pLeaf->blo
20f00 63 6b 2e 61 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ck.a[0] = '\0';.
20f10 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 66      }.    rc = f
20f20 74 73 33 41 70 70 65 6e 64 54 6f 4e 6f 64 65 28  ts3AppendToNode(
20f30 0a 20 20 20 20 20 20 20 20 26 70 4c 65 61 66 2d  .        &pLeaf-
20f40 3e 62 6c 6f 63 6b 2c 20 26 70 4c 65 61 66 2d 3e  >block, &pLeaf->
20f50 6b 65 79 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  key, zTerm, nTer
20f60 6d 2c 20 61 44 6f 63 6c 69 73 74 2c 20 6e 44 6f  m, aDoclist, nDo
20f70 63 6c 69 73 74 0a 20 20 20 20 29 3b 0a 20 20 7d  clist.    );.  }
20f80 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
20f90 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20fa0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
20fb0 74 6f 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 64  to release all d
20fc0 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73  ynamic resources
20fd0 20 68 65 6c 64 20 62 79 20 74 68 65 0a 2a 2a 20   held by the.** 
20fe0 6d 65 72 67 65 2d 77 72 69 74 65 72 20 6f 62 6a  merge-writer obj
20ff0 65 63 74 20 70 57 72 69 74 65 72 2c 20 61 6e 64  ect pWriter, and
21000 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 68 61 73   if no error has
21010 20 6f 63 63 75 72 72 65 64 2c 20 74 6f 20 66 6c   occurred, to fl
21020 75 73 68 0a 2a 2a 20 61 6c 6c 20 6f 75 74 73 74  ush.** all outst
21030 61 6e 64 69 6e 67 20 6e 6f 64 65 20 62 75 66 66  anding node buff
21040 65 72 73 20 68 65 6c 64 20 62 79 20 70 57 72 69  ers held by pWri
21050 74 65 72 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ter to disk..**.
21060 2a 2a 20 49 66 20 2a 70 52 63 20 69 73 20 6e 6f  ** If *pRc is no
21070 74 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e  t SQLITE_OK when
21080 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
21090 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 6e  s called, then n
210a0 6f 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20  o attempt.** is 
210b0 6d 61 64 65 20 74 6f 20 77 72 69 74 65 20 61 6e  made to write an
210c0 79 20 64 61 74 61 20 74 6f 20 64 69 73 6b 2e 20  y data to disk. 
210d0 49 6e 73 74 65 61 64 2c 20 74 68 69 73 20 66 75  Instead, this fu
210e0 6e 63 74 69 6f 6e 20 73 65 72 76 65 73 20 6f 6e  nction serves on
210f0 6c 79 0a 2a 2a 20 74 6f 20 72 65 6c 65 61 73 65  ly.** to release
21100 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 73   outstanding res
21110 6f 75 72 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74  ources..**.** Ot
21120 68 65 72 77 69 73 65 2c 20 69 66 20 2a 70 52 63  herwise, if *pRc
21130 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 53 51   is initially SQ
21140 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 61 6e 20 65  LITE_OK and an e
21150 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
21160 65 0a 2a 2a 20 66 6c 75 73 68 69 6e 67 20 62 75  e.** flushing bu
21170 66 66 65 72 73 20 74 6f 20 64 69 73 6b 2c 20 2a  ffers to disk, *
21180 70 52 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e  pRc is set to an
21190 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
211a0 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74  de before.** ret
211b0 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
211c0 63 20 76 6f 69 64 20 66 74 73 33 49 6e 63 72 6d  c void fts3Incrm
211d0 65 72 67 65 52 65 6c 65 61 73 65 28 0a 20 20 46  ergeRelease(.  F
211e0 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
211f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21200 2a 20 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e  * FTS3 table han
21210 64 6c 65 20 2a 2f 0a 20 20 49 6e 63 72 6d 65 72  dle */.  Incrmer
21220 67 65 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  geWriter *pWrite
21230 72 2c 20 20 20 20 20 20 20 2f 2a 20 4d 65 72 67  r,       /* Merg
21240 65 2d 77 72 69 74 65 72 20 6f 62 6a 65 63 74 20  e-writer object 
21250 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20  */.  int *pRc   
21260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21270 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
21280 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 29 7b  Error code */.){
21290 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
212a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212b0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
212c0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6e 6f  erate through no
212d0 6e 2d 72 6f 6f 74 20 6c 61 79 65 72 73 20 2a 2f  n-root layers */
212e0 0a 20 20 69 6e 74 20 69 52 6f 6f 74 3b 20 20 20  .  int iRoot;   
212f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21300 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72     /* Index of r
21310 6f 6f 74 20 69 6e 20 70 57 72 69 74 65 72 2d 3e  oot in pWriter->
21320 61 4e 6f 64 65 57 72 69 74 65 72 20 2a 2f 0a 20  aNodeWriter */. 
21330 20 4e 6f 64 65 57 72 69 74 65 72 20 2a 70 52 6f   NodeWriter *pRo
21340 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ot;             
21350 20 2f 2a 20 4e 6f 64 65 57 72 69 74 65 72 20 66   /* NodeWriter f
21360 6f 72 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a  or root node */.
21370 20 20 69 6e 74 20 72 63 20 3d 20 2a 70 52 63 3b    int rc = *pRc;
21380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21390 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
213a0 2a 2f 0a 0a 20 20 2f 2a 20 53 65 74 20 69 52 6f  */..  /* Set iRo
213b0 6f 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ot to the index 
213c0 69 6e 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64  in pWriter->aNod
213d0 65 57 72 69 74 65 72 5b 5d 20 6f 66 20 74 68 65  eWriter[] of the
213e0 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20   output segment 
213f0 0a 20 20 2a 2a 20 72 6f 6f 74 20 6e 6f 64 65 2e  .  ** root node.
21400 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20   If the segment 
21410 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
21420 20 61 20 73 69 6e 67 6c 65 20 6c 65 61 66 20 6e   a single leaf n
21430 6f 64 65 2c 20 69 52 6f 6f 74 0a 20 20 2a 2a 20  ode, iRoot.  ** 
21440 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 30  will be set to 0
21450 2e 20 49 66 20 74 68 65 20 72 6f 6f 74 20 6e 6f  . If the root no
21460 64 65 20 69 73 20 74 68 65 20 70 61 72 65 6e 74  de is the parent
21470 20 6f 66 20 74 68 65 20 6c 65 61 76 65 73 2c 20   of the leaves, 
21480 69 52 6f 6f 74 0a 20 20 2a 2a 20 77 69 6c 6c 20  iRoot.  ** will 
21490 62 65 20 31 2e 20 41 6e 64 20 73 6f 20 6f 6e 2e  be 1. And so on.
214a0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 52 6f 6f 74    */.  for(iRoot
214b0 3d 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41  =FTS_MAX_APPENDA
214c0 42 4c 45 5f 48 45 49 47 48 54 2d 31 3b 20 69 52  BLE_HEIGHT-1; iR
214d0 6f 6f 74 3e 3d 30 3b 20 69 52 6f 6f 74 2d 2d 29  oot>=0; iRoot--)
214e0 7b 0a 20 20 20 20 4e 6f 64 65 57 72 69 74 65 72  {.    NodeWriter
214f0 20 2a 70 4e 6f 64 65 20 3d 20 26 70 57 72 69 74   *pNode = &pWrit
21500 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b  er->aNodeWriter[
21510 69 52 6f 6f 74 5d 3b 0a 20 20 20 20 69 66 28 20  iRoot];.    if( 
21520 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 3e 30  pNode->block.n>0
21530 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73   ) break;.    as
21540 73 65 72 74 28 20 2a 70 52 63 20 7c 7c 20 70 4e  sert( *pRc || pN
21550 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 41 6c 6c 6f  ode->block.nAllo
21560 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
21570 72 74 28 20 2a 70 52 63 20 7c 7c 20 70 4e 6f 64  rt( *pRc || pNod
21580 65 2d 3e 6b 65 79 2e 6e 41 6c 6c 6f 63 3d 3d 30  e->key.nAlloc==0
21590 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
215a0 66 72 65 65 28 70 4e 6f 64 65 2d 3e 62 6c 6f 63  free(pNode->bloc
215b0 6b 2e 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  k.a);.    sqlite
215c0 33 5f 66 72 65 65 28 70 4e 6f 64 65 2d 3e 6b 65  3_free(pNode->ke
215d0 79 2e 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  y.a);.  }..  /* 
215e0 45 6d 70 74 79 20 6f 75 74 70 75 74 20 73 65 67  Empty output seg
215f0 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61 20  ment. This is a 
21600 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20  no-op. */.  if( 
21610 69 52 6f 6f 74 3c 30 20 29 20 72 65 74 75 72 6e  iRoot<0 ) return
21620 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 6e 74 69  ;..  /* The enti
21630 72 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e  re output segmen
21640 74 20 66 69 74 73 20 6f 6e 20 61 20 73 69 6e 67  t fits on a sing
21650 6c 65 20 6e 6f 64 65 2e 20 4e 6f 72 6d 61 6c 6c  le node. Normall
21660 79 2c 20 74 68 69 73 20 6d 65 61 6e 73 0a 20 20  y, this means.  
21670 2a 2a 20 74 68 65 20 6e 6f 64 65 20 77 6f 75 6c  ** the node woul
21680 64 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61  d be stored as a
21690 20 62 6c 6f 62 20 69 6e 20 74 68 65 20 22 72 6f   blob in the "ro
216a0 6f 74 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ot" column of th
216b0 65 20 25 5f 73 65 67 64 69 72 0a 20 20 2a 2a 20  e %_segdir.  ** 
216c0 74 61 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20  table. However, 
216d0 74 68 69 73 20 69 73 20 6e 6f 74 20 70 65 72 6d  this is not perm
216e0 69 74 74 65 64 20 69 6e 20 74 68 69 73 20 63 61  itted in this ca
216f0 73 65 2e 20 54 68 65 20 70 72 6f 62 6c 65 6d 20  se. The problem 
21700 69 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 73 70  is that .  ** sp
21710 61 63 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ace has already 
21720 62 65 65 6e 20 72 65 73 65 72 76 65 64 20 69 6e  been reserved in
21730 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20   the %_segments 
21740 74 61 62 6c 65 2c 20 61 6e 64 20 73 6f 20 74 68  table, and so th
21750 65 20 0a 20 20 2a 2a 20 73 74 61 72 74 5f 62 6c  e .  ** start_bl
21760 6f 63 6b 20 61 6e 64 20 65 6e 64 5f 62 6c 6f 63  ock and end_bloc
21770 6b 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  k fields of the 
21780 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 20 6d  %_segdir table m
21790 75 73 74 20 62 65 20 70 6f 70 75 6c 61 74 65 64  ust be populated
217a0 2e 20 0a 20 20 2a 2a 20 41 6e 64 2c 20 62 79 20  . .  ** And, by 
217b0 64 65 73 69 67 6e 20 6f 72 20 62 79 20 61 63 63  design or by acc
217c0 69 64 65 6e 74 2c 20 72 65 6c 65 61 73 65 64 20  ident, released 
217d0 76 65 72 73 69 6f 6e 73 20 6f 66 20 46 54 53 20  versions of FTS 
217e0 63 61 6e 6e 6f 74 20 68 61 6e 64 6c 65 20 0a 20  cannot handle . 
217f0 20 2a 2a 20 73 65 67 6d 65 6e 74 73 20 74 68 61   ** segments tha
21800 74 20 66 69 74 20 65 6e 74 69 72 65 6c 79 20 6f  t fit entirely o
21810 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20  n the root node 
21820 77 69 74 68 20 73 74 61 72 74 5f 62 6c 6f 63 6b  with start_block
21830 21 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  !=0..  **.  ** I
21840 6e 73 74 65 61 64 2c 20 63 72 65 61 74 65 20 61  nstead, create a
21850 20 73 79 6e 74 68 65 74 69 63 20 72 6f 6f 74 20   synthetic root 
21860 6e 6f 64 65 20 74 68 61 74 20 63 6f 6e 74 61 69  node that contai
21870 6e 73 20 6e 6f 74 68 69 6e 67 20 62 75 74 20 61  ns nothing but a
21880 20 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74   .  ** pointer t
21890 6f 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6e  o the single con
218a0 74 65 6e 74 20 6e 6f 64 65 2e 20 53 6f 20 74 68  tent node. So th
218b0 61 74 20 74 68 65 20 73 65 67 6d 65 6e 74 20 63  at the segment c
218c0 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 20 20 2a  onsists of a.  *
218d0 2a 20 73 69 6e 67 6c 65 20 6c 65 61 66 20 61 6e  * single leaf an
218e0 64 20 61 20 73 69 6e 67 6c 65 20 69 6e 74 65 72  d a single inter
218f0 69 6f 72 20 28 72 6f 6f 74 29 20 6e 6f 64 65 2e  ior (root) node.
21900 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 64 6f 3a  .  **.  ** Todo:
21910 20 42 65 74 74 65 72 20 6d 69 67 68 74 20 62 65   Better might be
21920 20 74 6f 20 64 65 66 65 72 20 61 6c 6c 6f 63 61   to defer alloca
21930 74 69 6e 67 20 73 70 61 63 65 20 69 6e 20 74 68  ting space in th
21940 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 0a 20 20  e %_segments .  
21950 2a 2a 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 77  ** table until w
21960 65 20 61 72 65 20 73 75 72 65 20 69 74 20 69 73  e are sure it is
21970 20 6e 65 65 64 65 64 2e 0a 20 20 2a 2f 0a 20 20   needed..  */.  
21980 69 66 28 20 69 52 6f 6f 74 3d 3d 30 20 29 7b 0a  if( iRoot==0 ){.
21990 20 20 20 20 42 6c 6f 62 20 2a 70 42 6c 6f 63 6b      Blob *pBlock
219a0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 4e 6f   = &pWriter->aNo
219b0 64 65 57 72 69 74 65 72 5b 31 5d 2e 62 6c 6f 63  deWriter[1].bloc
219c0 6b 3b 0a 20 20 20 20 62 6c 6f 62 47 72 6f 77 42  k;.    blobGrowB
219d0 75 66 66 65 72 28 70 42 6c 6f 63 6b 2c 20 31 20  uffer(pBlock, 1 
219e0 2b 20 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41  + FTS3_VARINT_MA
219f0 58 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  X, &rc);.    if(
21a00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21a10 7b 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b 2d 3e  {.      pBlock->
21a20 61 5b 30 5d 20 3d 20 30 78 30 31 3b 0a 20 20 20  a[0] = 0x01;.   
21a30 20 20 20 70 42 6c 6f 63 6b 2d 3e 6e 20 3d 20 31     pBlock->n = 1
21a40 20 2b 20 73 71 6c 69 74 65 33 46 74 73 33 50 75   + sqlite3Fts3Pu
21a50 74 56 61 72 69 6e 74 28 0a 20 20 20 20 20 20 20  tVarint(.       
21a60 20 20 20 26 70 42 6c 6f 63 6b 2d 3e 61 5b 31 5d     &pBlock->a[1]
21a70 2c 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65  , pWriter->aNode
21a80 57 72 69 74 65 72 5b 30 5d 2e 69 42 6c 6f 63 6b  Writer[0].iBlock
21a90 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
21aa0 20 20 20 20 69 52 6f 6f 74 20 3d 20 31 3b 0a 20      iRoot = 1;. 
21ab0 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 26 70 57   }.  pRoot = &pW
21ac0 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74  riter->aNodeWrit
21ad0 65 72 5b 69 52 6f 6f 74 5d 3b 0a 0a 20 20 2f 2a  er[iRoot];..  /*
21ae0 20 46 6c 75 73 68 20 61 6c 6c 20 63 75 72 72 65   Flush all curre
21af0 6e 74 6c 79 20 6f 75 74 73 74 61 6e 64 69 6e 67  ntly outstanding
21b00 20 6e 6f 64 65 73 20 74 6f 20 64 69 73 6b 2e 20   nodes to disk. 
21b10 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
21b20 69 52 6f 6f 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  iRoot; i++){.   
21b30 20 4e 6f 64 65 57 72 69 74 65 72 20 2a 70 4e 6f   NodeWriter *pNo
21b40 64 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  de = &pWriter->a
21b50 4e 6f 64 65 57 72 69 74 65 72 5b 69 5d 3b 0a 20  NodeWriter[i];. 
21b60 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 62 6c     if( pNode->bl
21b70 6f 63 6b 2e 6e 3e 30 20 26 26 20 72 63 3d 3d 53  ock.n>0 && rc==S
21b80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21b90 20 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65    rc = fts3Write
21ba0 53 65 67 6d 65 6e 74 28 70 2c 20 70 4e 6f 64 65  Segment(p, pNode
21bb0 2d 3e 69 42 6c 6f 63 6b 2c 20 70 4e 6f 64 65 2d  ->iBlock, pNode-
21bc0 3e 62 6c 6f 63 6b 2e 61 2c 20 70 4e 6f 64 65 2d  >block.a, pNode-
21bd0 3e 62 6c 6f 63 6b 2e 6e 29 3b 0a 20 20 20 20 7d  >block.n);.    }
21be0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
21bf0 65 28 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61  e(pNode->block.a
21c00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
21c10 72 65 65 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e 61  ree(pNode->key.a
21c20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69  );.  }..  /* Wri
21c30 74 65 20 74 68 65 20 25 5f 73 65 67 64 69 72 20  te the %_segdir 
21c40 72 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 69 66 28  record. */.  if(
21c50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21c60 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 57  {.    rc = fts3W
21c70 72 69 74 65 53 65 67 64 69 72 28 70 2c 20 0a 20  riteSegdir(p, . 
21c80 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e         pWriter->
21c90 69 41 62 73 4c 65 76 65 6c 2b 31 2c 20 20 20 20  iAbsLevel+1,    
21ca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 65             /* le
21cb0 76 65 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  vel */.        p
21cc0 57 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 20 20  Writer->iIdx,   
21cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ce0 20 20 20 2f 2a 20 69 64 78 20 2a 2f 0a 20 20 20     /* idx */.   
21cf0 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 53       pWriter->iS
21d00 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 20 20  tart,           
21d10 20 20 20 20 20 20 20 20 20 2f 2a 20 73 74 61 72           /* star
21d20 74 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  t_block */.     
21d30 20 20 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64     pWriter->aNod
21d40 65 57 72 69 74 65 72 5b 30 5d 2e 69 42 6c 6f 63  eWriter[0].iBloc
21d50 6b 2c 20 20 20 20 20 2f 2a 20 6c 65 61 76 65 73  k,     /* leaves
21d60 5f 65 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20  _end_block */.  
21d70 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69        pWriter->i
21d80 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  End,            
21d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 65 6e 64            /* end
21da0 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  _block */.      
21db0 20 20 28 70 57 72 69 74 65 72 2d 3e 62 4e 6f 4c    (pWriter->bNoL
21dc0 65 61 66 44 61 74 61 3d 3d 30 20 3f 20 70 57 72  eafData==0 ? pWr
21dd0 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61 74 61 20  iter->nLeafData 
21de0 3a 20 30 29 2c 20 20 20 2f 2a 20 65 6e 64 5f 62  : 0),   /* end_b
21df0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
21e00 70 52 6f 6f 74 2d 3e 62 6c 6f 63 6b 2e 61 2c 20  pRoot->block.a, 
21e10 70 52 6f 6f 74 2d 3e 62 6c 6f 63 6b 2e 6e 20 20  pRoot->block.n  
21e20 20 20 20 20 2f 2a 20 72 6f 6f 74 20 2a 2f 0a 20      /* root */. 
21e30 20 20 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69     );.  }.  sqli
21e40 74 65 33 5f 66 72 65 65 28 70 52 6f 6f 74 2d 3e  te3_free(pRoot->
21e50 62 6c 6f 63 6b 2e 61 29 3b 0a 20 20 73 71 6c 69  block.a);.  sqli
21e60 74 65 33 5f 66 72 65 65 28 70 52 6f 6f 74 2d 3e  te3_free(pRoot->
21e70 6b 65 79 2e 61 29 3b 0a 0a 20 20 2a 70 52 63 20  key.a);..  *pRc 
21e80 3d 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  = rc;.}../*.** C
21e90 6f 6d 70 61 72 65 20 74 68 65 20 74 65 72 6d 20  ompare the term 
21ea0 69 6e 20 62 75 66 66 65 72 20 7a 4c 68 73 20 28  in buffer zLhs (
21eb0 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6e 4c  size in bytes nL
21ec0 68 73 29 20 77 69 74 68 20 74 68 61 74 20 69 6e  hs) with that in
21ed0 0a 2a 2a 20 7a 52 68 73 20 28 73 69 7a 65 20 69  .** zRhs (size i
21ee0 6e 20 62 79 74 65 73 20 6e 52 68 73 29 20 75 73  n bytes nRhs) us
21ef0 69 6e 67 20 6d 65 6d 63 6d 70 2e 20 49 66 20 6f  ing memcmp. If o
21f00 6e 65 20 74 65 72 6d 20 69 73 20 61 20 70 72 65  ne term is a pre
21f10 66 69 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6f 74  fix of.** the ot
21f20 68 65 72 2c 20 69 74 20 69 73 20 63 6f 6e 73 69  her, it is consi
21f30 64 65 72 65 64 20 74 6f 20 62 65 20 73 6d 61 6c  dered to be smal
21f40 6c 65 72 20 74 68 61 6e 20 74 68 65 20 6f 74 68  ler than the oth
21f50 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
21f60 20 2d 76 65 20 69 66 20 7a 4c 68 73 20 69 73 20   -ve if zLhs is 
21f70 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 7a 52 68  smaller than zRh
21f80 73 2c 20 30 20 69 66 20 69 74 20 69 73 20 65 71  s, 0 if it is eq
21f90 75 61 6c 2c 20 6f 72 20 2b 76 65 0a 2a 2a 20 69  ual, or +ve.** i
21fa0 66 20 69 74 20 69 73 20 67 72 65 61 74 65 72 2e  f it is greater.
21fb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
21fc0 74 73 33 54 65 72 6d 43 6d 70 28 0a 20 20 63 6f  ts3TermCmp(.  co
21fd0 6e 73 74 20 63 68 61 72 20 2a 7a 4c 68 73 2c 20  nst char *zLhs, 
21fe0 69 6e 74 20 6e 4c 68 73 2c 20 20 20 20 20 2f 2a  int nLhs,     /*
21ff0 20 4c 48 53 20 6f 66 20 63 6f 6d 70 61 72 69 73   LHS of comparis
22000 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
22010 61 72 20 2a 7a 52 68 73 2c 20 69 6e 74 20 6e 52  ar *zRhs, int nR
22020 68 73 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f  hs      /* RHS o
22030 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a  f comparison */.
22040 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20  ){.  int nCmp = 
22050 4d 49 4e 28 6e 4c 68 73 2c 20 6e 52 68 73 29 3b  MIN(nLhs, nRhs);
22060 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 72  .  int res;..  r
22070 65 73 20 3d 20 6d 65 6d 63 6d 70 28 7a 4c 68 73  es = memcmp(zLhs
22080 2c 20 7a 52 68 73 2c 20 6e 43 6d 70 29 3b 0a 20  , zRhs, nCmp);. 
22090 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65   if( res==0 ) re
220a0 73 20 3d 20 6e 4c 68 73 20 2d 20 6e 52 68 73 3b  s = nLhs - nRhs;
220b0 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ..  return res;.
220c0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20  }.../*.** Query 
220d0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 65 6e  to see if the en
220e0 74 72 79 20 69 6e 20 74 68 65 20 25 5f 73 65 67  try in the %_seg
220f0 6d 65 6e 74 73 20 74 61 62 6c 65 20 77 69 74 68  ments table with
22100 20 62 6c 6f 63 6b 69 64 20 69 45 6e 64 20 69 73   blockid iEnd is
22110 20 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66 20 6e 6f   .** NULL. If no
22120 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e   error occurs an
22130 64 20 74 68 65 20 65 6e 74 72 79 20 69 73 20 4e  d the entry is N
22140 55 4c 4c 2c 20 73 65 74 20 2a 70 62 52 65 73 20  ULL, set *pbRes 
22150 31 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75  1 before.** retu
22160 72 6e 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65  rning. Otherwise
22170 2c 20 73 65 74 20 2a 70 62 52 65 73 20 74 6f 20  , set *pbRes to 
22180 30 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  0. .**.** Or, if
22190 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
221a0 20 77 68 69 6c 65 20 71 75 65 72 79 69 6e 67 20   while querying 
221b0 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 72 65  the database, re
221c0 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 0a  turn an SQLite .
221d0 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54  ** error code. T
221e0 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f  he final value o
221f0 66 20 2a 70 62 52 65 73 20 69 73 20 75 6e 64 65  f *pbRes is unde
22200 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  fined in this ca
22210 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  se..**.** This i
22220 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 69  s used to test i
22230 66 20 61 20 73 65 67 6d 65 6e 74 20 69 73 20 61  f a segment is a
22240 6e 20 22 61 70 70 65 6e 64 61 62 6c 65 22 20 73  n "appendable" s
22250 65 67 6d 65 6e 74 2e 20 49 66 20 69 74 0a 2a 2a  egment. If it.**
22260 20 69 73 2c 20 74 68 65 6e 20 61 20 4e 55 4c 4c   is, then a NULL
22270 20 65 6e 74 72 79 20 68 61 73 20 62 65 65 6e 20   entry has been 
22280 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
22290 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62  e %_segments tab
222a0 6c 65 0a 2a 2a 20 77 69 74 68 20 62 6c 6f 63 6b  le.** with block
222b0 69 64 20 25 5f 73 65 67 64 69 72 2e 65 6e 64 5f  id %_segdir.end_
222c0 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  block..*/.static
222d0 20 69 6e 74 20 66 74 73 33 49 73 41 70 70 65 6e   int fts3IsAppen
222e0 64 61 62 6c 65 28 46 74 73 33 54 61 62 6c 65 20  dable(Fts3Table 
222f0 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  *p, sqlite3_int6
22300 34 20 69 45 6e 64 2c 20 69 6e 74 20 2a 70 62 52  4 iEnd, int *pbR
22310 65 73 29 7b 0a 20 20 69 6e 74 20 62 52 65 73 20  es){.  int bRes 
22320 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
22330 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
22340 20 74 6f 20 73 65 74 20 2a 70 62 52 65 73 20 74   to set *pbRes t
22350 6f 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  o */.  sqlite3_s
22360 74 6d 74 20 2a 70 43 68 65 63 6b 20 3d 20 30 3b  tmt *pCheck = 0;
22370 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d         /* Statem
22380 65 6e 74 20 74 6f 20 71 75 65 72 79 20 64 61 74  ent to query dat
22390 61 62 61 73 65 20 77 69 74 68 20 2a 2f 0a 20 20  abase with */.  
223a0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
223b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223c0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
223d0 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71  /..  rc = fts3Sq
223e0 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 47  lStmt(p, SQL_SEG
223f0 4d 45 4e 54 5f 49 53 5f 41 50 50 45 4e 44 41 42  MENT_IS_APPENDAB
22400 4c 45 2c 20 26 70 43 68 65 63 6b 2c 20 30 29 3b  LE, &pCheck, 0);
22410 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
22420 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
22430 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
22440 43 68 65 63 6b 2c 20 31 2c 20 69 45 6e 64 29 3b  Check, 1, iEnd);
22450 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
22460 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
22470 70 28 70 43 68 65 63 6b 29 20 29 20 62 52 65 73  p(pCheck) ) bRes
22480 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 1;.    rc = s
22490 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 43 68  qlite3_reset(pCh
224a0 65 63 6b 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2a  eck);.  }.  .  *
224b0 70 62 52 65 73 20 3d 20 62 52 65 73 3b 0a 20 20  pbRes = bRes;.  
224c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
224d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
224e0 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
224f0 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 6e   initializing an
22500 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65 72   incremental-mer
22510 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  ge operation..**
22520 20 49 74 20 63 68 65 63 6b 73 20 69 66 20 74 68   It checks if th
22530 65 20 65 78 69 73 74 69 6e 67 20 73 65 67 6d 65  e existing segme
22540 6e 74 20 77 69 74 68 20 69 6e 64 65 78 20 76 61  nt with index va
22550 6c 75 65 20 69 49 64 78 20 61 74 20 61 62 73 6f  lue iIdx at abso
22560 6c 75 74 65 20 6c 65 76 65 6c 20 0a 2a 2a 20 28  lute level .** (
22570 69 41 62 73 4c 65 76 65 6c 2b 31 29 20 63 61 6e  iAbsLevel+1) can
22580 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20   be appended to 
22590 62 79 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74  by the increment
225a0 61 6c 20 6d 65 72 67 65 2e 20 49 66 20 69 74 20  al merge. If it 
225b0 63 61 6e 2c 20 74 68 65 0a 2a 2a 20 6d 65 72 67  can, the.** merg
225c0 65 2d 77 72 69 74 65 72 20 6f 62 6a 65 63 74 20  e-writer object 
225d0 2a 70 57 72 69 74 65 72 20 69 73 20 69 6e 69 74  *pWriter is init
225e0 69 61 6c 69 7a 65 64 20 74 6f 20 77 72 69 74 65  ialized to write
225f0 20 74 6f 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 41 6e   to it..**.** An
22600 20 65 78 69 73 74 69 6e 67 20 73 65 67 6d 65 6e   existing segmen
22610 74 20 63 61 6e 20 62 65 20 61 70 70 65 6e 64 65  t can be appende
22620 64 20 74 6f 20 62 79 20 61 6e 20 69 6e 63 72 65  d to by an incre
22630 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 69 66 3a  mental merge if:
22640 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 74 20 77 61  .**.**   * It wa
22650 73 20 69 6e 69 74 69 61 6c 6c 79 20 63 72 65 61  s initially crea
22660 74 65 64 20 61 73 20 61 6e 20 61 70 70 65 6e 64  ted as an append
22670 61 62 6c 65 20 73 65 67 6d 65 6e 74 20 28 77 69  able segment (wi
22680 74 68 20 61 6c 6c 20 72 65 71 75 69 72 65 64 0a  th all required.
22690 2a 2a 20 20 20 20 20 73 70 61 63 65 20 70 72 65  **     space pre
226a0 2d 61 6c 6c 6f 63 61 74 65 64 29 2c 20 61 6e 64  -allocated), and
226b0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66  .**.**   * The f
226c0 69 72 73 74 20 6b 65 79 20 72 65 61 64 20 66 72  irst key read fr
226d0 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 28 61 72  om the input (ar
226e0 67 75 6d 65 6e 74 73 20 7a 4b 65 79 20 61 6e 64  guments zKey and
226f0 20 6e 4b 65 79 29 20 69 73 20 0a 2a 2a 20 20 20   nKey) is .**   
22700 20 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74    greater than t
22710 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 63  he largest key c
22720 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
22730 69 6e 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c  in the potential
22740 0a 2a 2a 20 20 20 20 20 6f 75 74 70 75 74 20 73  .**     output s
22750 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  egment..*/.stati
22760 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72 6d 65  c int fts3Incrme
22770 72 67 65 4c 6f 61 64 28 0a 20 20 46 74 73 33 54  rgeLoad(.  Fts3T
22780 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
22790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74             /* Ft
227a0 73 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  s3 table handle 
227b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
227c0 36 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20  64 iAbsLevel,   
227d0 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65       /* Absolute
227e0 20 6c 65 76 65 6c 20 6f 66 20 69 6e 70 75 74 20   level of input 
227f0 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e  segments */.  in
22800 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20 20  t iIdx,         
22810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22820 20 49 6e 64 65 78 20 6f 66 20 63 61 6e 64 69 64   Index of candid
22830 61 74 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65  ate output segme
22840 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nt */.  const ch
22850 61 72 20 2a 7a 4b 65 79 2c 20 20 20 20 20 20 20  ar *zKey,       
22860 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
22870 20 6b 65 79 20 74 6f 20 77 72 69 74 65 20 2a 2f   key to write */
22880 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20  .  int nKey,    
22890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
228b0 62 79 74 65 73 20 69 6e 20 6e 4b 65 79 20 2a 2f  bytes in nKey */
228c0 0a 20 20 49 6e 63 72 6d 65 72 67 65 57 72 69 74  .  IncrmergeWrit
228d0 65 72 20 2a 70 57 72 69 74 65 72 20 20 20 20 20  er *pWriter     
228e0 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
228f0 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  his object */.){
22900 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
22910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22920 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
22930 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
22940 74 6d 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 30  tmt *pSelect = 0
22950 3b 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54  ;      /* SELECT
22960 20 74 6f 20 72 65 61 64 20 25 5f 73 65 67 64 69   to read %_segdi
22970 72 20 65 6e 74 72 79 20 2a 2f 0a 0a 20 20 72 63  r entry */..  rc
22980 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
22990 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 45 47  , SQL_SELECT_SEG
229a0 44 49 52 2c 20 26 70 53 65 6c 65 63 74 2c 20 30  DIR, &pSelect, 0
229b0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
229c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
229d0 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 53 74 61  lite3_int64 iSta
229e0 72 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 56  rt = 0;     /* V
229f0 61 6c 75 65 20 6f 66 20 25 5f 73 65 67 64 69 72  alue of %_segdir
22a00 2e 73 74 61 72 74 5f 62 6c 6f 63 6b 20 2a 2f 0a  .start_block */.
22a10 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
22a20 34 20 69 4c 65 61 66 45 6e 64 20 3d 20 30 3b 20  4 iLeafEnd = 0; 
22a30 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 25 5f    /* Value of %_
22a40 73 65 67 64 69 72 2e 6c 65 61 76 65 73 5f 65 6e  segdir.leaves_en
22a50 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 73  d_block */.    s
22a60 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e  qlite3_int64 iEn
22a70 64 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  d = 0;       /* 
22a80 56 61 6c 75 65 20 6f 66 20 25 5f 73 65 67 64 69  Value of %_segdi
22a90 72 2e 65 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20  r.end_block */. 
22aa0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61     const char *a
22ab0 52 6f 6f 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Root = 0;       
22ac0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 25   /* Pointer to %
22ad0 5f 73 65 67 64 69 72 2e 72 6f 6f 74 20 62 75 66  _segdir.root buf
22ae0 66 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  fer */.    int n
22af0 52 6f 6f 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Root = 0;       
22b00 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
22b10 20 6f 66 20 61 52 6f 6f 74 5b 5d 20 69 6e 20 62   of aRoot[] in b
22b20 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ytes */.    int 
22b30 72 63 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  rc2;            
22b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
22b50 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 71  urn code from sq
22b60 6c 69 74 65 33 5f 72 65 73 65 74 28 29 20 2a 2f  lite3_reset() */
22b70 0a 20 20 20 20 69 6e 74 20 62 41 70 70 65 6e 64  .    int bAppend
22b80 61 62 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20  able = 0;       
22b90 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75     /* Set to tru
22ba0 65 20 69 66 20 73 65 67 6d 65 6e 74 20 69 73 20  e if segment is 
22bb0 61 70 70 65 6e 64 61 62 6c 65 20 2a 2f 0a 0a 20  appendable */.. 
22bc0 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 25     /* Read the %
22bd0 5f 73 65 67 64 69 72 20 65 6e 74 72 79 20 66 6f  _segdir entry fo
22be0 72 20 69 6e 64 65 78 20 69 49 64 78 20 61 62 73  r index iIdx abs
22bf0 6f 6c 75 74 65 20 6c 65 76 65 6c 20 28 69 41 62  olute level (iAb
22c00 73 4c 65 76 65 6c 2b 31 29 20 2a 2f 0a 20 20 20  sLevel+1) */.   
22c10 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
22c20 74 36 34 28 70 53 65 6c 65 63 74 2c 20 31 2c 20  t64(pSelect, 1, 
22c30 69 41 62 73 4c 65 76 65 6c 2b 31 29 3b 0a 20 20  iAbsLevel+1);.  
22c40 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
22c50 6e 74 28 70 53 65 6c 65 63 74 2c 20 32 2c 20 69  nt(pSelect, 2, i
22c60 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 73 71  Idx);.    if( sq
22c70 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65  lite3_step(pSele
22c80 63 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  ct)==SQLITE_ROW 
22c90 29 7b 0a 20 20 20 20 20 20 69 53 74 61 72 74 20  ){.      iStart 
22ca0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
22cb0 5f 69 6e 74 36 34 28 70 53 65 6c 65 63 74 2c 20  _int64(pSelect, 
22cc0 31 29 3b 0a 20 20 20 20 20 20 69 4c 65 61 66 45  1);.      iLeafE
22cd0 6e 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  nd = sqlite3_col
22ce0 75 6d 6e 5f 69 6e 74 36 34 28 70 53 65 6c 65 63  umn_int64(pSelec
22cf0 74 2c 20 32 29 3b 0a 20 20 20 20 20 20 66 74 73  t, 2);.      fts
22d00 33 52 65 61 64 45 6e 64 42 6c 6f 63 6b 46 69 65  3ReadEndBlockFie
22d10 6c 64 28 70 53 65 6c 65 63 74 2c 20 33 2c 20 26  ld(pSelect, 3, &
22d20 69 45 6e 64 2c 20 26 70 57 72 69 74 65 72 2d 3e  iEnd, &pWriter->
22d30 6e 4c 65 61 66 44 61 74 61 29 3b 0a 20 20 20 20  nLeafData);.    
22d40 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 6e    if( pWriter->n
22d50 4c 65 61 66 44 61 74 61 3c 30 20 29 7b 0a 20 20  LeafData<0 ){.  
22d60 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e        pWriter->n
22d70 4c 65 61 66 44 61 74 61 20 3d 20 70 57 72 69 74  LeafData = pWrit
22d80 65 72 2d 3e 6e 4c 65 61 66 44 61 74 61 20 2a 20  er->nLeafData * 
22d90 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
22da0 20 20 70 57 72 69 74 65 72 2d 3e 62 4e 6f 4c 65    pWriter->bNoLe
22db0 61 66 44 61 74 61 20 3d 20 28 70 57 72 69 74 65  afData = (pWrite
22dc0 72 2d 3e 6e 4c 65 61 66 44 61 74 61 3d 3d 30 29  r->nLeafData==0)
22dd0 3b 0a 20 20 20 20 20 20 6e 52 6f 6f 74 20 3d 20  ;.      nRoot = 
22de0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
22df0 79 74 65 73 28 70 53 65 6c 65 63 74 2c 20 34 29  ytes(pSelect, 4)
22e00 3b 0a 20 20 20 20 20 20 61 52 6f 6f 74 20 3d 20  ;.      aRoot = 
22e10 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
22e20 6c 6f 62 28 70 53 65 6c 65 63 74 2c 20 34 29 3b  lob(pSelect, 4);
22e30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22e40 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
22e50 5f 72 65 73 65 74 28 70 53 65 6c 65 63 74 29 3b  _reset(pSelect);
22e60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
22e70 68 65 63 6b 20 66 6f 72 20 74 68 65 20 7a 65 72  heck for the zer
22e80 6f 2d 6c 65 6e 67 74 68 20 6d 61 72 6b 65 72 20  o-length marker 
22e90 69 6e 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74  in the %_segment
22ea0 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 72  s table */.    r
22eb0 63 20 3d 20 66 74 73 33 49 73 41 70 70 65 6e 64  c = fts3IsAppend
22ec0 61 62 6c 65 28 70 2c 20 69 45 6e 64 2c 20 26 62  able(p, iEnd, &b
22ed0 41 70 70 65 6e 64 61 62 6c 65 29 3b 0a 0a 20 20  Appendable);..  
22ee0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
22ef0 7a 4b 65 79 2f 6e 4b 65 79 20 69 73 20 6c 61 72  zKey/nKey is lar
22f00 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72  ger than the lar
22f10 67 65 73 74 20 6b 65 79 20 74 68 65 20 63 61 6e  gest key the can
22f20 64 69 64 61 74 65 20 2a 2f 0a 20 20 20 20 69 66  didate */.    if
22f30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22f40 26 26 20 62 41 70 70 65 6e 64 61 62 6c 65 20 29  && bAppendable )
22f50 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 61 4c  {.      char *aL
22f60 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  eaf = 0;.      i
22f70 6e 74 20 6e 4c 65 61 66 20 3d 20 30 3b 0a 0a 20  nt nLeaf = 0;.. 
22f80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22f90 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28 70  3Fts3ReadBlock(p
22fa0 2c 20 69 4c 65 61 66 45 6e 64 2c 20 26 61 4c 65  , iLeafEnd, &aLe
22fb0 61 66 2c 20 26 6e 4c 65 61 66 2c 20 30 29 3b 0a  af, &nLeaf, 0);.
22fc0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
22fd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22fe0 20 20 20 4e 6f 64 65 52 65 61 64 65 72 20 72 65     NodeReader re
22ff0 61 64 65 72 3b 0a 20 20 20 20 20 20 20 20 66 6f  ader;.        fo
23000 72 28 72 63 20 3d 20 6e 6f 64 65 52 65 61 64 65  r(rc = nodeReade
23010 72 49 6e 69 74 28 26 72 65 61 64 65 72 2c 20 61  rInit(&reader, a
23020 4c 65 61 66 2c 20 6e 4c 65 61 66 29 3b 0a 20 20  Leaf, nLeaf);.  
23030 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51            rc==SQ
23040 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 61 64 65  LITE_OK && reade
23050 72 2e 61 4e 6f 64 65 3b 0a 20 20 20 20 20 20 20  r.aNode;.       
23060 20 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 52 65       rc = nodeRe
23070 61 64 65 72 4e 65 78 74 28 26 72 65 61 64 65 72  aderNext(&reader
23080 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
23090 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
230a0 65 61 64 65 72 2e 61 4e 6f 64 65 20 29 3b 0a 20  eader.aNode );. 
230b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
230c0 20 69 66 28 20 66 74 73 33 54 65 72 6d 43 6d 70   if( fts3TermCmp
230d0 28 7a 4b 65 79 2c 20 6e 4b 65 79 2c 20 72 65 61  (zKey, nKey, rea
230e0 64 65 72 2e 74 65 72 6d 2e 61 2c 20 72 65 61 64  der.term.a, read
230f0 65 72 2e 74 65 72 6d 2e 6e 29 3c 3d 30 20 29 7b  er.term.n)<=0 ){
23100 0a 20 20 20 20 20 20 20 20 20 20 62 41 70 70 65  .          bAppe
23110 6e 64 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  ndable = 0;.    
23120 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 6f      }.        no
23130 64 65 52 65 61 64 65 72 52 65 6c 65 61 73 65 28  deReaderRelease(
23140 26 72 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20  &reader);.      
23150 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
23160 66 72 65 65 28 61 4c 65 61 66 29 3b 0a 20 20 20  free(aLeaf);.   
23170 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
23180 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 41 70  SQLITE_OK && bAp
23190 70 65 6e 64 61 62 6c 65 20 29 7b 0a 20 20 20 20  pendable ){.    
231a0 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69    /* It is possi
231b0 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 74 6f  ble to append to
231c0 20 74 68 69 73 20 73 65 67 6d 65 6e 74 2e 20 53   this segment. S
231d0 65 74 20 75 70 20 74 68 65 20 49 6e 63 72 6d 65  et up the Incrme
231e0 72 67 65 57 72 69 74 65 72 0a 20 20 20 20 20 20  rgeWriter.      
231f0 2a 2a 20 6f 62 6a 65 63 74 20 74 6f 20 64 6f 20  ** object to do 
23200 73 6f 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e  so.  */.      in
23210 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  t i;.      int n
23220 48 65 69 67 68 74 20 3d 20 28 69 6e 74 29 61 52  Height = (int)aR
23230 6f 6f 74 5b 30 5d 3b 0a 20 20 20 20 20 20 4e 6f  oot[0];.      No
23240 64 65 57 72 69 74 65 72 20 2a 70 4e 6f 64 65 3b  deWriter *pNode;
23250 0a 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d  ..      pWriter-
23260 3e 6e 4c 65 61 66 45 73 74 20 3d 20 28 69 6e 74  >nLeafEst = (int
23270 29 28 28 69 45 6e 64 20 2d 20 69 53 74 61 72 74  )((iEnd - iStart
23280 29 20 2b 20 31 29 2f 46 54 53 5f 4d 41 58 5f 41  ) + 1)/FTS_MAX_A
23290 50 50 45 4e 44 41 42 4c 45 5f 48 45 49 47 48 54  PPENDABLE_HEIGHT
232a0 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d  ;.      pWriter-
232b0 3e 69 53 74 61 72 74 20 3d 20 69 53 74 61 72 74  >iStart = iStart
232c0 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d  ;.      pWriter-
232d0 3e 69 45 6e 64 20 3d 20 69 45 6e 64 3b 0a 20 20  >iEnd = iEnd;.  
232e0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 41 62      pWriter->iAb
232f0 73 4c 65 76 65 6c 20 3d 20 69 41 62 73 4c 65 76  sLevel = iAbsLev
23300 65 6c 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65  el;.      pWrite
23310 72 2d 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a  r->iIdx = iIdx;.
23320 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 6e 48 65  .      for(i=nHe
23330 69 67 68 74 2b 31 3b 20 69 3c 46 54 53 5f 4d 41  ight+1; i<FTS_MA
23340 58 5f 41 50 50 45 4e 44 41 42 4c 45 5f 48 45 49  X_APPENDABLE_HEI
23350 47 48 54 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  GHT; i++){.     
23360 20 20 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64     pWriter->aNod
23370 65 57 72 69 74 65 72 5b 69 5d 2e 69 42 6c 6f 63  eWriter[i].iBloc
23380 6b 20 3d 20 70 57 72 69 74 65 72 2d 3e 69 53 74  k = pWriter->iSt
23390 61 72 74 20 2b 20 69 2a 70 57 72 69 74 65 72 2d  art + i*pWriter-
233a0 3e 6e 4c 65 61 66 45 73 74 3b 0a 20 20 20 20 20  >nLeafEst;.     
233b0 20 7d 0a 0a 20 20 20 20 20 20 70 4e 6f 64 65 20   }..      pNode 
233c0 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64  = &pWriter->aNod
233d0 65 57 72 69 74 65 72 5b 6e 48 65 69 67 68 74 5d  eWriter[nHeight]
233e0 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 69  ;.      pNode->i
233f0 42 6c 6f 63 6b 20 3d 20 70 57 72 69 74 65 72 2d  Block = pWriter-
23400 3e 69 53 74 61 72 74 20 2b 20 70 57 72 69 74 65  >iStart + pWrite
23410 72 2d 3e 6e 4c 65 61 66 45 73 74 2a 6e 48 65 69  r->nLeafEst*nHei
23420 67 68 74 3b 0a 20 20 20 20 20 20 62 6c 6f 62 47  ght;.      blobG
23430 72 6f 77 42 75 66 66 65 72 28 26 70 4e 6f 64 65  rowBuffer(&pNode
23440 2d 3e 62 6c 6f 63 6b 2c 20 4d 41 58 28 6e 52 6f  ->block, MAX(nRo
23450 6f 74 2c 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65  ot, p->nNodeSize
23460 29 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69  ), &rc);.      i
23470 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23480 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
23490 70 79 28 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e  py(pNode->block.
234a0 61 2c 20 61 52 6f 6f 74 2c 20 6e 52 6f 6f 74 29  a, aRoot, nRoot)
234b0 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d  ;.        pNode-
234c0 3e 62 6c 6f 63 6b 2e 6e 20 3d 20 6e 52 6f 6f 74  >block.n = nRoot
234d0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
234e0 20 66 6f 72 28 69 3d 6e 48 65 69 67 68 74 3b 20   for(i=nHeight; 
234f0 69 3e 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49  i>=0 && rc==SQLI
23500 54 45 5f 4f 4b 3b 20 69 2d 2d 29 7b 0a 20 20 20  TE_OK; i--){.   
23510 20 20 20 20 20 4e 6f 64 65 52 65 61 64 65 72 20       NodeReader 
23520 72 65 61 64 65 72 3b 0a 20 20 20 20 20 20 20 20  reader;.        
23530 70 4e 6f 64 65 20 3d 20 26 70 57 72 69 74 65 72  pNode = &pWriter
23540 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 69 5d  ->aNodeWriter[i]
23550 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ;..        rc = 
23560 6e 6f 64 65 52 65 61 64 65 72 49 6e 69 74 28 26  nodeReaderInit(&
23570 72 65 61 64 65 72 2c 20 70 4e 6f 64 65 2d 3e 62  reader, pNode->b
23580 6c 6f 63 6b 2e 61 2c 20 70 4e 6f 64 65 2d 3e 62  lock.a, pNode->b
23590 6c 6f 63 6b 2e 6e 29 3b 0a 20 20 20 20 20 20 20  lock.n);.       
235a0 20 77 68 69 6c 65 28 20 72 65 61 64 65 72 2e 61   while( reader.a
235b0 4e 6f 64 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  Node && rc==SQLI
235c0 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 6e 6f 64  TE_OK ) rc = nod
235d0 65 52 65 61 64 65 72 4e 65 78 74 28 26 72 65 61  eReaderNext(&rea
235e0 64 65 72 29 3b 0a 20 20 20 20 20 20 20 20 62 6c  der);.        bl
235f0 6f 62 47 72 6f 77 42 75 66 66 65 72 28 26 70 4e  obGrowBuffer(&pN
23600 6f 64 65 2d 3e 6b 65 79 2c 20 72 65 61 64 65 72  ode->key, reader
23610 2e 74 65 72 6d 2e 6e 2c 20 26 72 63 29 3b 0a 20  .term.n, &rc);. 
23620 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
23630 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23640 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 6f        memcpy(pNo
23650 64 65 2d 3e 6b 65 79 2e 61 2c 20 72 65 61 64 65  de->key.a, reade
23660 72 2e 74 65 72 6d 2e 61 2c 20 72 65 61 64 65 72  r.term.a, reader
23670 2e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20  .term.n);.      
23680 20 20 20 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e      pNode->key.n
23690 20 3d 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 6e   = reader.term.n
236a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
236b0 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  i>0 ){.         
236c0 20 20 20 63 68 61 72 20 2a 61 42 6c 6f 63 6b 20     char *aBlock 
236d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
236e0 20 69 6e 74 20 6e 42 6c 6f 63 6b 20 3d 20 30 3b   int nBlock = 0;
236f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 6f  .            pNo
23700 64 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  de = &pWriter->a
23710 4e 6f 64 65 57 72 69 74 65 72 5b 69 2d 31 5d 3b  NodeWriter[i-1];
23720 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 6f  .            pNo
23730 64 65 2d 3e 69 42 6c 6f 63 6b 20 3d 20 72 65 61  de->iBlock = rea
23740 64 65 72 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20  der.iChild;.    
23750 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
23760 69 74 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63  ite3Fts3ReadBloc
23770 6b 28 70 2c 20 72 65 61 64 65 72 2e 69 43 68 69  k(p, reader.iChi
23780 6c 64 2c 20 26 61 42 6c 6f 63 6b 2c 20 26 6e 42  ld, &aBlock, &nB
23790 6c 6f 63 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  lock, 0);.      
237a0 20 20 20 20 20 20 62 6c 6f 62 47 72 6f 77 42 75        blobGrowBu
237b0 66 66 65 72 28 26 70 4e 6f 64 65 2d 3e 62 6c 6f  ffer(&pNode->blo
237c0 63 6b 2c 20 4d 41 58 28 6e 42 6c 6f 63 6b 2c 20  ck, MAX(nBlock, 
237d0 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 29 2c 20 26  p->nNodeSize), &
237e0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rc);.           
237f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23800 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
23810 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 6f 64 65      memcpy(pNode
23820 2d 3e 62 6c 6f 63 6b 2e 61 2c 20 61 42 6c 6f 63  ->block.a, aBloc
23830 6b 2c 20 6e 42 6c 6f 63 6b 29 3b 0a 20 20 20 20  k, nBlock);.    
23840 20 20 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d            pNode-
23850 3e 62 6c 6f 63 6b 2e 6e 20 3d 20 6e 42 6c 6f 63  >block.n = nBloc
23860 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
23870 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
23880 69 74 65 33 5f 66 72 65 65 28 61 42 6c 6f 63 6b  ite3_free(aBlock
23890 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
238a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
238b0 20 6e 6f 64 65 52 65 61 64 65 72 52 65 6c 65 61   nodeReaderRelea
238c0 73 65 28 26 72 65 61 64 65 72 29 3b 0a 20 20 20  se(&reader);.   
238d0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
238e0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  rc2 = sqlite3_re
238f0 73 65 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  set(pSelect);.  
23900 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
23910 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
23920 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
23930 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  ;.}../*.** Deter
23940 6d 69 6e 65 20 74 68 65 20 6c 61 72 67 65 73 74  mine the largest
23950 20 73 65 67 6d 65 6e 74 20 69 6e 64 65 78 20 76   segment index v
23960 61 6c 75 65 20 74 68 61 74 20 65 78 69 73 74 73  alue that exists
23970 20 77 69 74 68 69 6e 20 61 62 73 6f 6c 75 74 65   within absolute
23980 0a 2a 2a 20 6c 65 76 65 6c 20 69 41 62 73 4c 65  .** level iAbsLe
23990 76 65 6c 2b 31 2e 20 49 66 20 6e 6f 20 65 72 72  vel+1. If no err
239a0 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a  or occurs, set *
239b0 70 69 49 64 78 20 74 6f 20 74 68 69 73 20 76 61  piIdx to this va
239c0 6c 75 65 20 70 6c 75 73 0a 2a 2a 20 6f 6e 65 20  lue plus.** one 
239d0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
239e0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 72 2c 20   SQLITE_OK. Or, 
239f0 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
23a00 73 65 67 6d 65 6e 74 73 20 61 74 20 61 6c 6c 20  segments at all 
23a10 0a 2a 2a 20 77 69 74 68 69 6e 20 6c 65 76 65 6c  .** within level
23a20 20 69 41 62 73 4c 65 76 65 6c 2c 20 73 65 74 20   iAbsLevel, set 
23a30 2a 70 69 49 64 78 20 74 6f 20 7a 65 72 6f 2e 0a  *piIdx to zero..
23a40 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
23a50 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
23a60 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
23a70 20 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c   code. The final
23a80 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 2a 70 69   value of.** *pi
23a90 49 64 78 20 69 73 20 75 6e 64 65 66 69 6e 65 64  Idx is undefined
23aa0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
23ab0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
23ac0 33 49 6e 63 72 6d 65 72 67 65 4f 75 74 70 75 74  3IncrmergeOutput
23ad0 49 64 78 28 20 0a 20 20 46 74 73 33 54 61 62 6c  Idx( .  Fts3Tabl
23ae0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
23af0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20 54          /* FTS T
23b00 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
23b10 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
23b20 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  AbsLevel,       
23b30 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 69 6e 64   /* Absolute ind
23b40 65 78 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d  ex of input segm
23b50 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ents */.  int *p
23b60 69 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20  iIdx            
23b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
23b80 3a 20 4e 65 78 74 20 66 72 65 65 20 69 6e 64 65  : Next free inde
23b90 78 20 61 74 20 69 41 62 73 4c 65 76 65 6c 2b 31  x at iAbsLevel+1
23ba0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
23bb0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
23bc0 2a 70 4f 75 74 70 75 74 49 64 78 20 3d 20 30 3b  *pOutputIdx = 0;
23bd0 20 20 20 2f 2a 20 53 51 4c 20 75 73 65 64 20 74     /* SQL used t
23be0 6f 20 66 69 6e 64 20 6f 75 74 70 75 74 20 69 6e  o find output in
23bf0 64 65 78 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66  dex */..  rc = f
23c00 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51  ts3SqlStmt(p, SQ
23c10 4c 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54 5f 49  L_NEXT_SEGMENT_I
23c20 4e 44 45 58 2c 20 26 70 4f 75 74 70 75 74 49 64  NDEX, &pOutputId
23c30 78 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  x, 0);.  if( rc=
23c40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23c50 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
23c60 6e 74 36 34 28 70 4f 75 74 70 75 74 49 64 78 2c  nt64(pOutputIdx,
23c70 20 31 2c 20 69 41 62 73 4c 65 76 65 6c 2b 31 29   1, iAbsLevel+1)
23c80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
23c90 65 70 28 70 4f 75 74 70 75 74 49 64 78 29 3b 0a  ep(pOutputIdx);.
23ca0 20 20 20 20 2a 70 69 49 64 78 20 3d 20 73 71 6c      *piIdx = sql
23cb0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
23cc0 70 4f 75 74 70 75 74 49 64 78 2c 20 30 29 3b 0a  pOutputIdx, 0);.
23cd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23ce0 5f 72 65 73 65 74 28 70 4f 75 74 70 75 74 49 64  _reset(pOutputId
23cf0 78 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  x);.  }..  retur
23d00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  n rc;.}../* .** 
23d10 41 6c 6c 6f 63 61 74 65 20 61 6e 20 61 70 70 65  Allocate an appe
23d20 6e 64 61 62 6c 65 20 6f 75 74 70 75 74 20 73 65  ndable output se
23d30 67 6d 65 6e 74 20 6f 6e 20 61 62 73 6f 6c 75 74  gment on absolut
23d40 65 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65  e level iAbsLeve
23d50 6c 2b 31 0a 2a 2a 20 77 69 74 68 20 69 64 78 20  l+1.** with idx 
23d60 76 61 6c 75 65 20 69 49 64 78 2e 0a 2a 2a 0a 2a  value iIdx..**.*
23d70 2a 20 49 6e 20 74 68 65 20 25 5f 73 65 67 64 69  * In the %_segdi
23d80 72 20 74 61 62 6c 65 2c 20 61 20 73 65 67 6d 65  r table, a segme
23d90 6e 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  nt is defined by
23da0 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20 74   the values in t
23db0 68 72 65 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 3a  hree.** columns:
23dc0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 74 61 72 74  .**.**     start
23dd0 5f 62 6c 6f 63 6b 0a 2a 2a 20 20 20 20 20 6c 65  _block.**     le
23de0 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 0a 2a  aves_end_block.*
23df0 2a 20 20 20 20 20 65 6e 64 5f 62 6c 6f 63 6b 0a  *     end_block.
23e00 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 70  **.** When an ap
23e10 70 65 6e 64 61 62 6c 65 20 73 65 67 6d 65 6e 74  pendable segment
23e20 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69   is allocated, i
23e30 74 20 69 73 20 65 73 74 69 6d 61 74 65 64 20 74  t is estimated t
23e40 68 61 74 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d  hat the.** maxim
23e50 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61  um number of lea
23e60 66 20 62 6c 6f 63 6b 73 20 74 68 61 74 20 6d 61  f blocks that ma
23e70 79 20 62 65 20 72 65 71 75 69 72 65 64 20 69 73  y be required is
23e80 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 0a   the sum of the.
23e90 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61  ** number of lea
23ea0 66 20 62 6c 6f 63 6b 73 20 63 6f 6e 73 75 6d 65  f blocks consume
23eb0 64 20 62 79 20 74 68 65 20 69 6e 70 75 74 20 73  d by the input s
23ec0 65 67 6d 65 6e 74 73 2c 20 70 6c 75 73 20 74 68  egments, plus th
23ed0 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 69  e number.** of i
23ee0 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 2c 20 6d  nput segments, m
23ef0 75 6c 74 69 70 6c 69 65 64 20 62 79 20 74 77 6f  ultiplied by two
23f00 2e 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20  . This value is 
23f10 73 74 6f 72 65 64 20 69 6e 20 73 74 61 63 6b 20  stored in stack 
23f20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 4c 65  .** variable nLe
23f30 61 66 45 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  afEst..**.** A t
23f40 6f 74 61 6c 20 6f 66 20 31 36 2a 6e 4c 65 61 66  otal of 16*nLeaf
23f50 45 73 74 20 62 6c 6f 63 6b 73 20 61 72 65 20 61  Est blocks are a
23f60 6c 6c 6f 63 61 74 65 64 20 77 68 65 6e 20 61 6e  llocated when an
23f70 20 61 70 70 65 6e 64 61 62 6c 65 20 73 65 67 6d   appendable segm
23f80 65 6e 74 0a 2a 2a 20 69 73 20 63 72 65 61 74 65  ent.** is create
23f90 64 20 28 28 31 20 2b 20 65 6e 64 5f 62 6c 6f 63  d ((1 + end_bloc
23fa0 6b 20 2d 20 73 74 61 72 74 5f 62 6c 6f 63 6b 29  k - start_block)
23fb0 3d 3d 31 36 2a 6e 4c 65 61 66 45 73 74 29 2e 20  ==16*nLeafEst). 
23fc0 54 68 65 20 63 6f 6e 74 69 67 75 6f 75 73 0a 2a  The contiguous.*
23fd0 2a 20 61 72 72 61 79 20 6f 66 20 6c 65 61 66 20  * array of leaf 
23fe0 6e 6f 64 65 73 20 73 74 61 72 74 73 20 61 74 20  nodes starts at 
23ff0 74 68 65 20 66 69 72 73 74 20 62 6c 6f 63 6b 20  the first block 
24000 61 6c 6c 6f 63 61 74 65 64 2e 20 54 68 65 20 61  allocated. The a
24010 72 72 61 79 0a 2a 2a 20 6f 66 20 69 6e 74 65 72  rray.** of inter
24020 69 6f 72 20 6e 6f 64 65 73 20 74 68 61 74 20 61  ior nodes that a
24030 72 65 20 70 61 72 65 6e 74 73 20 6f 66 20 74 68  re parents of th
24040 65 20 6c 65 61 66 20 6e 6f 64 65 73 20 73 74 61  e leaf nodes sta
24050 72 74 20 61 74 20 62 6c 6f 63 6b 0a 2a 2a 20 28  rt at block.** (
24060 73 74 61 72 74 5f 62 6c 6f 63 6b 20 2b 20 28 31  start_block + (1
24070 20 2b 20 65 6e 64 5f 62 6c 6f 63 6b 20 2d 20 73   + end_block - s
24080 74 61 72 74 5f 62 6c 6f 63 6b 29 20 2f 20 31 36  tart_block) / 16
24090 29 2e 20 41 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a  ). And so on..**
240a0 0a 2a 2a 20 49 6e 20 74 68 65 20 61 63 74 75 61  .** In the actua
240b0 6c 20 63 6f 64 65 20 62 65 6c 6f 77 2c 20 74 68  l code below, th
240c0 65 20 76 61 6c 75 65 20 22 31 36 22 20 69 73 20  e value "16" is 
240d0 72 65 70 6c 61 63 65 64 20 77 69 74 68 20 74 68  replaced with th
240e0 65 20 0a 2a 2a 20 70 72 65 2d 70 72 6f 63 65 73  e .** pre-proces
240f0 73 6f 72 20 6d 61 63 72 6f 20 46 54 53 5f 4d 41  sor macro FTS_MA
24100 58 5f 41 50 50 45 4e 44 41 42 4c 45 5f 48 45 49  X_APPENDABLE_HEI
24110 47 48 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  GHT..*/.static i
24120 6e 74 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65  nt fts3Incrmerge
24130 57 72 69 74 65 72 28 20 0a 20 20 46 74 73 33 54  Writer( .  Fts3T
24140 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
24150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74             /* Ft
24160 73 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  s3 table handle 
24170 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
24180 36 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20  64 iAbsLevel,   
24190 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65       /* Absolute
241a0 20 6c 65 76 65 6c 20 6f 66 20 69 6e 70 75 74 20   level of input 
241b0 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e  segments */.  in
241c0 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20 20  t iIdx,         
241d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
241e0 20 49 6e 64 65 78 20 6f 66 20 6e 65 77 20 6f 75   Index of new ou
241f0 74 70 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  tput segment */.
24200 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65    Fts3MultiSegRe
24210 61 64 65 72 20 2a 70 43 73 72 2c 20 20 20 20 20  ader *pCsr,     
24220 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 68 61 74    /* Cursor that
24230 20 64 61 74 61 20 77 69 6c 6c 20 62 65 20 72 65   data will be re
24240 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 49 6e 63  ad from */.  Inc
24250 72 6d 65 72 67 65 57 72 69 74 65 72 20 2a 70 57  rmergeWriter *pW
24260 72 69 74 65 72 20 20 20 20 20 20 20 20 2f 2a 20  riter        /* 
24270 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 6f 62  Populate this ob
24280 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ject */.){.  int
24290 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
242a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
242b0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
242c0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
242d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242e0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
242f0 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  iable */.  int n
24300 4c 65 61 66 45 73 74 20 3d 20 30 3b 20 20 20 20  LeafEst = 0;    
24310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c             /* Bl
24320 6f 63 6b 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  ocks allocated f
24330 6f 72 20 6c 65 61 66 20 6e 6f 64 65 73 20 2a 2f  or leaf nodes */
24340 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
24350 2a 70 4c 65 61 66 45 73 74 20 3d 20 30 3b 20 20  *pLeafEst = 0;  
24360 20 20 20 2f 2a 20 53 51 4c 20 75 73 65 64 20 74     /* SQL used t
24370 6f 20 64 65 74 65 72 6d 69 6e 65 20 6e 4c 65 61  o determine nLea
24380 66 45 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  fEst */.  sqlite
24390 33 5f 73 74 6d 74 20 2a 70 46 69 72 73 74 42 6c  3_stmt *pFirstBl
243a0 6f 63 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 51 4c  ock = 0;  /* SQL
243b0 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
243c0 6e 65 20 66 69 72 73 74 20 62 6c 6f 63 6b 20 2a  ne first block *
243d0 2f 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74  /..  /* Calculat
243e0 65 20 6e 4c 65 61 66 45 73 74 2e 20 2a 2f 0a 20  e nLeafEst. */. 
243f0 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
24400 74 28 70 2c 20 53 51 4c 5f 4d 41 58 5f 4c 45 41  t(p, SQL_MAX_LEA
24410 46 5f 4e 4f 44 45 5f 45 53 54 49 4d 41 54 45 2c  F_NODE_ESTIMATE,
24420 20 26 70 4c 65 61 66 45 73 74 2c 20 30 29 3b 0a   &pLeafEst, 0);.
24430 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24440 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
24450 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 4c  e3_bind_int64(pL
24460 65 61 66 45 73 74 2c 20 31 2c 20 69 41 62 73 4c  eafEst, 1, iAbsL
24470 65 76 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  evel);.    sqlit
24480 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 4c  e3_bind_int64(pL
24490 65 61 66 45 73 74 2c 20 32 2c 20 70 43 73 72 2d  eafEst, 2, pCsr-
244a0 3e 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20  >nSegment);.    
244b0 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
244c0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 4c 65  sqlite3_step(pLe
244d0 61 66 45 73 74 29 20 29 7b 0a 20 20 20 20 20 20  afEst) ){.      
244e0 6e 4c 65 61 66 45 73 74 20 3d 20 73 71 6c 69 74  nLeafEst = sqlit
244f0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 4c  e3_column_int(pL
24500 65 61 66 45 73 74 2c 20 30 29 3b 0a 20 20 20 20  eafEst, 0);.    
24510 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
24520 65 33 5f 72 65 73 65 74 28 70 4c 65 61 66 45 73  e3_reset(pLeafEs
24530 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  t);.  }.  if( rc
24540 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
24550 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 43  turn rc;..  /* C
24560 61 6c 63 75 6c 61 74 65 20 74 68 65 20 66 69 72  alculate the fir
24570 73 74 20 62 6c 6f 63 6b 20 74 6f 20 75 73 65 20  st block to use 
24580 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 65  in the output se
24590 67 6d 65 6e 74 20 2a 2f 0a 20 20 72 63 20 3d 20  gment */.  rc = 
245a0 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
245b0 51 4c 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54 53  QL_NEXT_SEGMENTS
245c0 5f 49 44 2c 20 26 70 46 69 72 73 74 42 6c 6f 63  _ID, &pFirstBloc
245d0 6b 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  k, 0);.  if( rc=
245e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
245f0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
24600 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
24610 46 69 72 73 74 42 6c 6f 63 6b 29 20 29 7b 0a 20  FirstBlock) ){. 
24620 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 53       pWriter->iS
24630 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 63  tart = sqlite3_c
24640 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 46 69 72  olumn_int64(pFir
24650 73 74 42 6c 6f 63 6b 2c 20 30 29 3b 0a 20 20 20  stBlock, 0);.   
24660 20 20 20 70 57 72 69 74 65 72 2d 3e 69 45 6e 64     pWriter->iEnd
24670 20 3d 20 70 57 72 69 74 65 72 2d 3e 69 53 74 61   = pWriter->iSta
24680 72 74 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 57  rt - 1;.      pW
24690 72 69 74 65 72 2d 3e 69 45 6e 64 20 2b 3d 20 6e  riter->iEnd += n
246a0 4c 65 61 66 45 73 74 20 2a 20 46 54 53 5f 4d 41  LeafEst * FTS_MA
246b0 58 5f 41 50 50 45 4e 44 41 42 4c 45 5f 48 45 49  X_APPENDABLE_HEI
246c0 47 48 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  GHT;.    }.    r
246d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
246e0 74 28 70 46 69 72 73 74 42 6c 6f 63 6b 29 3b 0a  t(pFirstBlock);.
246f0 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
24700 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
24710 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65 72   rc;..  /* Inser
24720 74 20 74 68 65 20 6d 61 72 6b 65 72 20 69 6e 20  t the marker in 
24730 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74  the %_segments t
24740 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  able to make sur
24750 65 20 6e 6f 62 6f 64 79 20 74 72 69 65 73 0a 20  e nobody tries. 
24760 20 2a 2a 20 74 6f 20 73 74 65 61 6c 20 74 68 65   ** to steal the
24770 20 73 70 61 63 65 20 6a 75 73 74 20 61 6c 6c 6f   space just allo
24780 63 61 74 65 64 2e 20 54 68 69 73 20 69 73 20 61  cated. This is a
24790 6c 73 6f 20 75 73 65 64 20 74 6f 20 69 64 65 6e  lso used to iden
247a0 74 69 66 79 20 0a 20 20 2a 2a 20 61 70 70 65 6e  tify .  ** appen
247b0 64 61 62 6c 65 20 73 65 67 6d 65 6e 74 73 2e 20  dable segments. 
247c0 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73 33 57   */.  rc = fts3W
247d0 72 69 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 70  riteSegment(p, p
247e0 57 72 69 74 65 72 2d 3e 69 45 6e 64 2c 20 30 2c  Writer->iEnd, 0,
247f0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
24800 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
24810 6e 20 72 63 3b 0a 0a 20 20 70 57 72 69 74 65 72  n rc;..  pWriter
24820 2d 3e 69 41 62 73 4c 65 76 65 6c 20 3d 20 69 41  ->iAbsLevel = iA
24830 62 73 4c 65 76 65 6c 3b 0a 20 20 70 57 72 69 74  bsLevel;.  pWrit
24840 65 72 2d 3e 6e 4c 65 61 66 45 73 74 20 3d 20 6e  er->nLeafEst = n
24850 4c 65 61 66 45 73 74 3b 0a 20 20 70 57 72 69 74  LeafEst;.  pWrit
24860 65 72 2d 3e 69 49 64 78 20 3d 20 69 49 64 78 3b  er->iIdx = iIdx;
24870 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68  ..  /* Set up th
24880 65 20 61 72 72 61 79 20 6f 66 20 4e 6f 64 65 57  e array of NodeW
24890 72 69 74 65 72 20 6f 62 6a 65 63 74 73 20 2a 2f  riter objects */
248a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 46 54  .  for(i=0; i<FT
248b0 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c 45  S_MAX_APPENDABLE
248c0 5f 48 45 49 47 48 54 3b 20 69 2b 2b 29 7b 0a 20  _HEIGHT; i++){. 
248d0 20 20 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64     pWriter->aNod
248e0 65 57 72 69 74 65 72 5b 69 5d 2e 69 42 6c 6f 63  eWriter[i].iBloc
248f0 6b 20 3d 20 70 57 72 69 74 65 72 2d 3e 69 53 74  k = pWriter->iSt
24900 61 72 74 20 2b 20 69 2a 70 57 72 69 74 65 72 2d  art + i*pWriter-
24910 3e 6e 4c 65 61 66 45 73 74 3b 0a 20 20 7d 0a 20  >nLeafEst;.  }. 
24920 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
24930 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  K;.}../*.** Remo
24940 76 65 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  ve an entry from
24950 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61   the %_segdir ta
24960 62 6c 65 2e 20 54 68 69 73 20 69 6e 76 6f 6c 76  ble. This involv
24970 65 73 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 0a  es running the .
24980 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f  ** following two
24990 20 73 74 61 74 65 6d 65 6e 74 73 3a 0a 2a 2a 0a   statements:.**.
249a0 2a 2a 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  **   DELETE FROM
249b0 20 25 5f 73 65 67 64 69 72 20 57 48 45 52 45 20   %_segdir WHERE 
249c0 6c 65 76 65 6c 20 3d 20 3a 69 41 62 73 4c 65 76  level = :iAbsLev
249d0 65 6c 20 41 4e 44 20 69 64 78 20 3d 20 3a 69 49  el AND idx = :iI
249e0 64 78 0a 2a 2a 20 20 20 55 50 44 41 54 45 20 25  dx.**   UPDATE %
249f0 5f 73 65 67 64 69 72 20 53 45 54 20 69 64 78 20  _segdir SET idx 
24a00 3d 20 69 64 78 20 2d 20 31 20 57 48 45 52 45 20  = idx - 1 WHERE 
24a10 6c 65 76 65 6c 20 3d 20 3a 69 41 62 73 4c 65 76  level = :iAbsLev
24a20 65 6c 20 41 4e 44 20 69 64 78 20 3e 20 3a 69 49  el AND idx > :iI
24a30 64 78 0a 2a 2a 0a 2a 2a 20 54 68 65 20 44 45 4c  dx.**.** The DEL
24a40 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 72 65  ETE statement re
24a50 6d 6f 76 65 73 20 74 68 65 20 73 70 65 63 69 66  moves the specif
24a60 69 63 20 25 5f 73 65 67 64 69 72 20 6c 65 76 65  ic %_segdir leve
24a70 6c 2e 20 54 68 65 20 55 50 44 41 54 45 20 0a 2a  l. The UPDATE .*
24a80 2a 20 73 74 61 74 65 6d 65 6e 74 20 65 6e 73 75  * statement ensu
24a90 72 65 73 20 74 68 61 74 20 74 68 65 20 72 65 6d  res that the rem
24aa0 61 69 6e 69 6e 67 20 73 65 67 6d 65 6e 74 73 20  aining segments 
24ab0 68 61 76 65 20 63 6f 6e 74 69 67 75 6f 75 73 6c  have contiguousl
24ac0 79 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 69  y allocated.** i
24ad0 64 78 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74  dx values..*/.st
24ae0 61 74 69 63 20 69 6e 74 20 66 74 73 33 52 65 6d  atic int fts3Rem
24af0 6f 76 65 53 65 67 64 69 72 45 6e 74 72 79 28 0a  oveSegdirEntry(.
24b00 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
24b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b20 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20    /* FTS3 table 
24b30 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69  handle */.  sqli
24b40 74 65 33 5f 69 6e 74 36 34 20 69 41 62 73 4c 65  te3_int64 iAbsLe
24b50 76 65 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 41  vel,        /* A
24b60 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 74 6f  bsolute level to
24b70 20 64 65 6c 65 74 65 20 66 72 6f 6d 20 2a 2f 0a   delete from */.
24b80 20 20 69 6e 74 20 69 49 64 78 20 20 20 20 20 20    int iIdx      
24b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ba0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 25 5f    /* Index of %_
24bb0 73 65 67 64 69 72 20 65 6e 74 72 79 20 74 6f 20  segdir entry to 
24bc0 64 65 6c 65 74 65 20 2a 2f 0a 29 7b 0a 20 20 69  delete */.){.  i
24bd0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
24be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24bf0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
24c00 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
24c10 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 20  *pDelete = 0;   
24c20 20 20 20 2f 2a 20 44 45 4c 45 54 45 20 73 74 61     /* DELETE sta
24c30 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 72 63 20  tement */..  rc 
24c40 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
24c50 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 44   SQL_DELETE_SEGD
24c60 49 52 5f 45 4e 54 52 59 2c 20 26 70 44 65 6c 65  IR_ENTRY, &pDele
24c70 74 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  te, 0);.  if( rc
24c80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24c90 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
24ca0 69 6e 74 36 34 28 70 44 65 6c 65 74 65 2c 20 31  int64(pDelete, 1
24cb0 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20  , iAbsLevel);.  
24cc0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
24cd0 6e 74 28 70 44 65 6c 65 74 65 2c 20 32 2c 20 69  nt(pDelete, 2, i
24ce0 49 64 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Idx);.    sqlite
24cf0 33 5f 73 74 65 70 28 70 44 65 6c 65 74 65 29 3b  3_step(pDelete);
24d00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
24d10 33 5f 72 65 73 65 74 28 70 44 65 6c 65 74 65 29  3_reset(pDelete)
24d20 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
24d30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65  rc;.}../*.** One
24d40 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74   or more segment
24d50 73 20 68 61 76 65 20 6a 75 73 74 20 62 65 65 6e  s have just been
24d60 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 61 62   removed from ab
24d70 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 69 41 62  solute level iAb
24d80 73 4c 65 76 65 6c 2e 0a 2a 2a 20 55 70 64 61 74  sLevel..** Updat
24d90 65 20 74 68 65 20 27 69 64 78 27 20 76 61 6c 75  e the 'idx' valu
24da0 65 73 20 6f 66 20 74 68 65 20 72 65 6d 61 69 6e  es of the remain
24db0 69 6e 67 20 73 65 67 6d 65 6e 74 73 20 69 6e 20  ing segments in 
24dc0 74 68 65 20 6c 65 76 65 6c 20 73 6f 20 74 68 61  the level so tha
24dd0 74 0a 2a 2a 20 74 68 65 20 69 64 78 20 76 61 6c  t.** the idx val
24de0 75 65 73 20 61 72 65 20 61 20 63 6f 6e 74 69 67  ues are a contig
24df0 75 6f 75 73 20 73 65 71 75 65 6e 63 65 20 73 74  uous sequence st
24e00 61 72 74 69 6e 67 20 66 72 6f 6d 20 30 2e 0a 2a  arting from 0..*
24e10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
24e20 33 52 65 70 61 63 6b 53 65 67 64 69 72 4c 65 76  3RepackSegdirLev
24e30 65 6c 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  el(.  Fts3Table 
24e40 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
24e50 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61        /* FTS3 ta
24e60 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
24e70 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 41  sqlite3_int64 iA
24e80 62 73 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20  bsLevel         
24e90 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65 76 65  /* Absolute leve
24ea0 6c 20 74 6f 20 72 65 70 61 63 6b 20 2a 2f 0a 29  l to repack */.)
24eb0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
24ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ed0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
24ee0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 49 64  de */.  int *aId
24ef0 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  x = 0;          
24f00 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
24f10 20 6f 66 20 72 65 6d 61 69 6e 69 6e 67 20 69 64   of remaining id
24f20 78 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  x values */.  in
24f30 74 20 6e 49 64 78 20 3d 20 30 3b 20 20 20 20 20  t nIdx = 0;     
24f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24f50 20 56 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69   Valid entries i
24f60 6e 20 61 49 64 78 5b 5d 20 2a 2f 0a 20 20 69 6e  n aIdx[] */.  in
24f70 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 20 20 20  t nAlloc = 0;   
24f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24f90 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   Allocated size 
24fa0 6f 66 20 61 49 64 78 5b 5d 20 2a 2f 0a 20 20 69  of aIdx[] */.  i
24fb0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
24fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24fd0 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
24fe0 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
24ff0 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 20 3d  _stmt *pSelect =
25000 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 6c 65   0;      /* Sele
25010 63 74 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  ct statement to 
25020 72 65 61 64 20 69 64 78 20 76 61 6c 75 65 73 20  read idx values 
25030 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
25040 74 20 2a 70 55 70 64 61 74 65 20 3d 20 30 3b 20  t *pUpdate = 0; 
25050 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 73       /* Update s
25060 74 61 74 65 6d 65 6e 74 20 74 6f 20 6d 6f 64 69  tatement to modi
25070 66 79 20 69 64 78 20 76 61 6c 75 65 73 20 2a 2f  fy idx values */
25080 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  ..  rc = fts3Sql
25090 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45  Stmt(p, SQL_SELE
250a0 43 54 5f 49 4e 44 45 58 45 53 2c 20 26 70 53 65  CT_INDEXES, &pSe
250b0 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  lect, 0);.  if( 
250c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
250d0 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20  .    int rc2;.  
250e0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
250f0 6e 74 36 34 28 70 53 65 6c 65 63 74 2c 20 31 2c  nt64(pSelect, 1,
25100 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20   iAbsLevel);.   
25110 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52   while( SQLITE_R
25120 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
25130 28 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  (pSelect) ){.   
25140 20 20 20 69 66 28 20 6e 49 64 78 3e 3d 6e 41 6c     if( nIdx>=nAl
25150 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69  loc ){.        i
25160 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 20 20  nt *aNew;.      
25170 20 20 6e 41 6c 6c 6f 63 20 2b 3d 20 31 36 3b 0a    nAlloc += 16;.
25180 20 20 20 20 20 20 20 20 61 4e 65 77 20 3d 20 73          aNew = s
25190 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61  qlite3_realloc(a
251a0 49 64 78 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65  Idx, nAlloc*size
251b0 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20  of(int));.      
251c0 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a 20    if( !aNew ){. 
251d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
251e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
251f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
25210 49 64 78 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20  Idx = aNew;.    
25220 20 20 7d 0a 20 20 20 20 20 20 61 49 64 78 5b 6e    }.      aIdx[n
25230 49 64 78 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33  Idx++] = sqlite3
25240 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 65 6c  _column_int(pSel
25250 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ect, 0);.    }. 
25260 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
25270 5f 72 65 73 65 74 28 70 53 65 6c 65 63 74 29 3b  _reset(pSelect);
25280 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
25290 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
252a0 32 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  2;.  }..  if( rc
252b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
252c0 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53     rc = fts3SqlS
252d0 74 6d 74 28 70 2c 20 53 51 4c 5f 53 48 49 46 54  tmt(p, SQL_SHIFT
252e0 5f 53 45 47 44 49 52 5f 45 4e 54 52 59 2c 20 26  _SEGDIR_ENTRY, &
252f0 70 55 70 64 61 74 65 2c 20 30 29 3b 0a 20 20 7d  pUpdate, 0);.  }
25300 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
25310 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
25320 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
25330 55 70 64 61 74 65 2c 20 32 2c 20 69 41 62 73 4c  Update, 2, iAbsL
25340 65 76 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  evel);.  }..  as
25350 73 65 72 74 28 20 70 2d 3e 62 49 67 6e 6f 72 65  sert( p->bIgnore
25360 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 3b 0a  Savepoint==0 );.
25370 20 20 70 2d 3e 62 49 67 6e 6f 72 65 53 61 76 65    p->bIgnoreSave
25380 70 6f 69 6e 74 20 3d 20 31 3b 0a 20 20 66 6f 72  point = 1;.  for
25390 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
253a0 5f 4f 4b 20 26 26 20 69 3c 6e 49 64 78 3b 20 69  _OK && i<nIdx; i
253b0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 49 64  ++){.    if( aId
253c0 78 5b 69 5d 21 3d 69 20 29 7b 0a 20 20 20 20 20  x[i]!=i ){.     
253d0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
253e0 74 28 70 55 70 64 61 74 65 2c 20 33 2c 20 61 49  t(pUpdate, 3, aI
253f0 64 78 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 71  dx[i]);.      sq
25400 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
25410 55 70 64 61 74 65 2c 20 31 2c 20 69 29 3b 0a 20  Update, 1, i);. 
25420 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65       sqlite3_ste
25430 70 28 70 55 70 64 61 74 65 29 3b 0a 20 20 20 20  p(pUpdate);.    
25440 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
25450 65 73 65 74 28 70 55 70 64 61 74 65 29 3b 0a 20  eset(pUpdate);. 
25460 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 62 49     }.  }.  p->bI
25470 67 6e 6f 72 65 53 61 76 65 70 6f 69 6e 74 20 3d  gnoreSavepoint =
25480 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66   0;..  sqlite3_f
25490 72 65 65 28 61 49 64 78 29 3b 0a 20 20 72 65 74  ree(aIdx);.  ret
254a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
254b0 63 20 76 6f 69 64 20 66 74 73 33 53 74 61 72 74  c void fts3Start
254c0 4e 6f 64 65 28 42 6c 6f 62 20 2a 70 4e 6f 64 65  Node(Blob *pNode
254d0 2c 20 69 6e 74 20 69 48 65 69 67 68 74 2c 20 73  , int iHeight, s
254e0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 43 68  qlite3_int64 iCh
254f0 69 6c 64 29 7b 0a 20 20 70 4e 6f 64 65 2d 3e 61  ild){.  pNode->a
25500 5b 30 5d 20 3d 20 28 63 68 61 72 29 69 48 65 69  [0] = (char)iHei
25510 67 68 74 3b 0a 20 20 69 66 28 20 69 43 68 69 6c  ght;.  if( iChil
25520 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
25530 20 70 4e 6f 64 65 2d 3e 6e 41 6c 6c 6f 63 3e 3d   pNode->nAlloc>=
25540 31 2b 73 71 6c 69 74 65 33 46 74 73 33 56 61 72  1+sqlite3Fts3Var
25550 69 6e 74 4c 65 6e 28 69 43 68 69 6c 64 29 20 29  intLen(iChild) )
25560 3b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 6e 20 3d  ;.    pNode->n =
25570 20 31 20 2b 20 73 71 6c 69 74 65 33 46 74 73 33   1 + sqlite3Fts3
25580 50 75 74 56 61 72 69 6e 74 28 26 70 4e 6f 64 65  PutVarint(&pNode
25590 2d 3e 61 5b 31 5d 2c 20 69 43 68 69 6c 64 29 3b  ->a[1], iChild);
255a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
255b0 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 6e 41 6c  sert( pNode->nAl
255c0 6c 6f 63 3e 3d 31 20 29 3b 0a 20 20 20 20 70 4e  loc>=1 );.    pN
255d0 6f 64 65 2d 3e 6e 20 3d 20 31 3b 0a 20 20 7d 0a  ode->n = 1;.  }.
255e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72  }../*.** The fir
255f0 73 74 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73  st two arguments
25600 20 61 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74   are a pointer t
25610 6f 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  o and the size o
25620 66 20 61 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  f a segment b-tr
25630 65 65 0a 2a 2a 20 6e 6f 64 65 2e 20 54 68 65 20  ee.** node. The 
25640 6e 6f 64 65 20 6d 61 79 20 62 65 20 61 20 6c 65  node may be a le
25650 61 66 20 6f 72 20 61 6e 20 69 6e 74 65 72 6e 61  af or an interna
25660 6c 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  l node..**.** Th
25670 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 72 65 61  is function crea
25680 74 65 73 20 61 20 6e 65 77 20 6e 6f 64 65 20 69  tes a new node i
25690 6d 61 67 65 20 69 6e 20 62 6c 6f 62 20 6f 62 6a  mage in blob obj
256a0 65 63 74 20 2a 70 4e 65 77 20 62 79 20 63 6f 70  ect *pNew by cop
256b0 79 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d  ying.** all term
256c0 73 20 74 68 61 74 20 61 72 65 20 67 72 65 61 74  s that are great
256d0 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
256e0 20 74 6f 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 20   to zTerm/nTerm 
256f0 28 66 6f 72 20 6c 65 61 66 20 6e 6f 64 65 73 29  (for leaf nodes)
25700 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74  .** or greater t
25710 68 61 6e 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 20  han zTerm/nTerm 
25720 28 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  (for internal no
25730 64 65 73 29 20 66 72 6f 6d 20 61 4e 6f 64 65 2f  des) from aNode/
25740 6e 4e 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  nNode..*/.static
25750 20 69 6e 74 20 66 74 73 33 54 72 75 6e 63 61 74   int fts3Truncat
25760 65 4e 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 63  eNode(.  const c
25770 68 61 72 20 2a 61 4e 6f 64 65 2c 20 20 20 20 20  har *aNode,     
25780 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
25790 65 6e 74 20 6e 6f 64 65 20 69 6d 61 67 65 20 2a  ent node image *
257a0 2f 0a 20 20 69 6e 74 20 6e 4e 6f 64 65 2c 20 20  /.  int nNode,  
257b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257c0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
257d0 4e 6f 64 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  Node in bytes */
257e0 0a 20 20 42 6c 6f 62 20 2a 70 4e 65 77 2c 20 20  .  Blob *pNew,  
257f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25800 20 20 20 2f 2a 20 4f 55 54 3a 20 57 72 69 74 65     /* OUT: Write
25810 20 6e 65 77 20 6e 6f 64 65 20 69 6d 61 67 65 20   new node image 
25820 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
25830 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20  char *zTerm,    
25840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6d 69            /* Omi
25850 74 20 61 6c 6c 20 74 65 72 6d 73 20 73 6d 61 6c  t all terms smal
25860 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20 2a 2f  ler than this */
25870 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20  .  int nTerm,   
25880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25890 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54     /* Size of zT
258a0 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  erm in bytes */.
258b0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
258c0 2a 70 69 42 6c 6f 63 6b 20 20 20 20 20 20 20 20  *piBlock        
258d0 20 20 2f 2a 20 4f 55 54 3a 20 42 6c 6f 63 6b 20    /* OUT: Block 
258e0 6e 75 6d 62 65 72 20 69 6e 20 6e 65 78 74 20 6c  number in next l
258f0 61 79 65 72 20 64 6f 77 6e 20 2a 2f 0a 29 7b 0a  ayer down */.){.
25900 20 20 4e 6f 64 65 52 65 61 64 65 72 20 72 65 61    NodeReader rea
25910 64 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  der;            
25920 20 20 2f 2a 20 52 65 61 64 65 72 20 6f 62 6a 65    /* Reader obje
25930 63 74 20 2a 2f 0a 20 20 42 6c 6f 62 20 70 72 65  ct */.  Blob pre
25940 76 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 20 20  v = {0, 0, 0};  
25950 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
25960 6f 75 73 20 74 65 72 6d 20 77 72 69 74 74 65 6e  ous term written
25970 20 74 6f 20 6e 65 77 20 6e 6f 64 65 20 2a 2f 0a   to new node */.
25980 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
25990 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
259a0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
259b0 20 2a 2f 0a 20 20 69 6e 74 20 62 4c 65 61 66 20   */.  int bLeaf 
259c0 3d 20 61 4e 6f 64 65 5b 30 5d 3d 3d 27 5c 30 27  = aNode[0]=='\0'
259d0 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f  ;     /* True fo
259e0 72 20 61 20 6c 65 61 66 20 6e 6f 64 65 20 2a 2f  r a leaf node */
259f0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
25a00 72 65 71 75 69 72 65 64 20 6f 75 74 70 75 74 20  required output 
25a10 73 70 61 63 65 20 2a 2f 0a 20 20 62 6c 6f 62 47  space */.  blobG
25a20 72 6f 77 42 75 66 66 65 72 28 70 4e 65 77 2c 20  rowBuffer(pNew, 
25a30 6e 4e 6f 64 65 2c 20 26 72 63 29 3b 0a 20 20 69  nNode, &rc);.  i
25a40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25a50 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
25a60 70 4e 65 77 2d 3e 6e 20 3d 20 30 3b 0a 0a 20 20  pNew->n = 0;..  
25a70 2f 2a 20 50 6f 70 75 6c 61 74 65 20 6e 65 77 20  /* Populate new 
25a80 6e 6f 64 65 20 62 75 66 66 65 72 20 2a 2f 0a 20  node buffer */. 
25a90 20 66 6f 72 28 72 63 20 3d 20 6e 6f 64 65 52 65   for(rc = nodeRe
25aa0 61 64 65 72 49 6e 69 74 28 26 72 65 61 64 65 72  aderInit(&reader
25ab0 2c 20 61 4e 6f 64 65 2c 20 6e 4e 6f 64 65 29 3b  , aNode, nNode);
25ac0 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49   .      rc==SQLI
25ad0 54 45 5f 4f 4b 20 26 26 20 72 65 61 64 65 72 2e  TE_OK && reader.
25ae0 61 4e 6f 64 65 3b 20 0a 20 20 20 20 20 20 72 63  aNode; .      rc
25af0 20 3d 20 6e 6f 64 65 52 65 61 64 65 72 4e 65 78   = nodeReaderNex
25b00 74 28 26 72 65 61 64 65 72 29 0a 20 20 29 7b 0a  t(&reader).  ){.
25b10 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 3d      if( pNew->n=
25b20 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
25b30 72 65 73 20 3d 20 66 74 73 33 54 65 72 6d 43 6d  res = fts3TermCm
25b40 70 28 72 65 61 64 65 72 2e 74 65 72 6d 2e 61 2c  p(reader.term.a,
25b50 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 6e 2c 20   reader.term.n, 
25b60 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  zTerm, nTerm);. 
25b70 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 7c       if( res<0 |
25b80 7c 20 28 62 4c 65 61 66 3d 3d 30 20 26 26 20 72  | (bLeaf==0 && r
25b90 65 73 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75  es==0) ) continu
25ba0 65 3b 0a 20 20 20 20 20 20 66 74 73 33 53 74 61  e;.      fts3Sta
25bb0 72 74 4e 6f 64 65 28 70 4e 65 77 2c 20 28 69 6e  rtNode(pNew, (in
25bc0 74 29 61 4e 6f 64 65 5b 30 5d 2c 20 72 65 61 64  t)aNode[0], read
25bd0 65 72 2e 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  er.iChild);.    
25be0 20 20 2a 70 69 42 6c 6f 63 6b 20 3d 20 72 65 61    *piBlock = rea
25bf0 64 65 72 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20  der.iChild;.    
25c00 7d 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 41  }.    rc = fts3A
25c10 70 70 65 6e 64 54 6f 4e 6f 64 65 28 0a 20 20 20  ppendToNode(.   
25c20 20 20 20 20 20 70 4e 65 77 2c 20 26 70 72 65 76       pNew, &prev
25c30 2c 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 61 2c  , reader.term.a,
25c40 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 6e 2c 0a   reader.term.n,.
25c50 20 20 20 20 20 20 20 20 72 65 61 64 65 72 2e 61          reader.a
25c60 44 6f 63 6c 69 73 74 2c 20 72 65 61 64 65 72 2e  Doclist, reader.
25c70 6e 44 6f 63 6c 69 73 74 0a 20 20 20 20 29 3b 0a  nDoclist.    );.
25c80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25c90 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20  TE_OK ) break;. 
25ca0 20 7d 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e   }.  if( pNew->n
25cb0 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 33 53  ==0 ){.    fts3S
25cc0 74 61 72 74 4e 6f 64 65 28 70 4e 65 77 2c 20 28  tartNode(pNew, (
25cd0 69 6e 74 29 61 4e 6f 64 65 5b 30 5d 2c 20 72 65  int)aNode[0], re
25ce0 61 64 65 72 2e 69 43 68 69 6c 64 29 3b 0a 20 20  ader.iChild);.  
25cf0 20 20 2a 70 69 42 6c 6f 63 6b 20 3d 20 72 65 61    *piBlock = rea
25d00 64 65 72 2e 69 43 68 69 6c 64 3b 0a 20 20 7d 0a  der.iChild;.  }.
25d10 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
25d20 6e 3c 3d 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20  n<=pNew->nAlloc 
25d30 29 3b 0a 0a 20 20 6e 6f 64 65 52 65 61 64 65 72  );..  nodeReader
25d40 52 65 6c 65 61 73 65 28 26 72 65 61 64 65 72 29  Release(&reader)
25d50 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
25d60 28 70 72 65 76 2e 61 29 3b 0a 20 20 72 65 74 75  (prev.a);.  retu
25d70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
25d80 52 65 6d 6f 76 65 20 61 6c 6c 20 74 65 72 6d 73  Remove all terms
25d90 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 7a 54   smaller than zT
25da0 65 72 6d 2f 6e 54 65 72 6d 20 66 72 6f 6d 20 73  erm/nTerm from s
25db0 65 67 6d 65 6e 74 20 69 49 64 78 20 69 6e 20 61  egment iIdx in a
25dc0 62 73 6f 6c 75 74 65 20 0a 2a 2a 20 6c 65 76 65  bsolute .** leve
25dd0 6c 20 69 41 62 73 4c 65 76 65 6c 2e 20 54 68 69  l iAbsLevel. Thi
25de0 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 64 65  s may involve de
25df0 6c 65 74 69 6e 67 20 65 6e 74 72 69 65 73 20 66  leting entries f
25e00 72 6f 6d 20 74 68 65 20 25 5f 73 65 67 6d 65 6e  rom the %_segmen
25e10 74 73 0a 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64  ts.** table, and
25e20 20 6d 6f 64 69 66 79 69 6e 67 20 65 78 69 73 74   modifying exist
25e30 69 6e 67 20 65 6e 74 72 69 65 73 20 69 6e 20 62  ing entries in b
25e40 6f 74 68 20 74 68 65 20 25 5f 73 65 67 6d 65 6e  oth the %_segmen
25e50 74 73 20 61 6e 64 20 25 5f 73 65 67 64 69 72 0a  ts and %_segdir.
25e60 2a 2a 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ** tables..**.**
25e70 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
25e80 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 73 65  turned if the se
25e90 67 6d 65 6e 74 20 69 73 20 75 70 64 61 74 65 64  gment is updated
25ea0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 4f   successfully. O
25eb0 72 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 65  r an.** SQLite e
25ec0 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
25ed0 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
25ee0 6e 74 20 66 74 73 33 54 72 75 6e 63 61 74 65 53  nt fts3TruncateS
25ef0 65 67 6d 65 6e 74 28 0a 20 20 46 74 73 33 54 61  egment(.  Fts3Ta
25f00 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
25f10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
25f20 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  3 table handle *
25f30 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
25f40 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20  4 iAbsLevel,    
25f50 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20      /* Absolute 
25f60 6c 65 76 65 6c 20 6f 66 20 73 65 67 6d 65 6e 74  level of segment
25f70 20 74 6f 20 6d 6f 64 69 66 79 20 2a 2f 0a 20 20   to modify */.  
25f80 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20  int iIdx,       
25f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fa0 2f 2a 20 49 6e 64 65 78 20 77 69 74 68 69 6e 20  /* Index within 
25fb0 6c 65 76 65 6c 20 6f 66 20 73 65 67 6d 65 6e 74  level of segment
25fc0 20 74 6f 20 6d 6f 64 69 66 79 20 2a 2f 0a 20 20   to modify */.  
25fd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72  const char *zTer
25fe0 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
25ff0 2f 2a 20 52 65 6d 6f 76 65 20 74 65 72 6d 73 20  /* Remove terms 
26000 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69  smaller than thi
26010 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  s */.  int nTerm
26020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26030 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
26040 6f 66 20 62 79 74 65 73 20 69 6e 20 62 75 66 66  of bytes in buff
26050 65 72 20 7a 54 65 72 6d 20 2a 2f 0a 29 7b 0a 20  er zTerm */.){. 
26060 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
26070 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
26080 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
26090 2a 2f 0a 20 20 42 6c 6f 62 20 72 6f 6f 74 20 3d  */.  Blob root =
260a0 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 20 20 20 20   {0,0,0};       
260b0 20 20 20 20 20 2f 2a 20 4e 65 77 20 72 6f 6f 74       /* New root
260c0 20 70 61 67 65 20 69 6d 61 67 65 20 2a 2f 0a 20   page image */. 
260d0 20 42 6c 6f 62 20 62 6c 6f 63 6b 20 3d 20 7b 30   Blob block = {0
260e0 2c 30 2c 30 7d 3b 20 20 20 20 20 20 20 20 20 20  ,0,0};          
260f0 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64 20   /* Buffer used 
26100 66 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 62 6c  for any other bl
26110 6f 63 6b 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ock */.  sqlite3
26120 5f 69 6e 74 36 34 20 69 42 6c 6f 63 6b 20 3d 20  _int64 iBlock = 
26130 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63  0;       /* Bloc
26140 6b 20 69 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  k id */.  sqlite
26150 33 5f 69 6e 74 36 34 20 69 4e 65 77 53 74 61 72  3_int64 iNewStar
26160 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77  t = 0;    /* New
26170 20 76 61 6c 75 65 20 66 6f 72 20 69 53 74 61 72   value for iStar
26180 74 42 6c 6f 63 6b 20 2a 2f 0a 20 20 73 71 6c 69  tBlock */.  sqli
26190 74 65 33 5f 69 6e 74 36 34 20 69 4f 6c 64 53 74  te3_int64 iOldSt
261a0 61 72 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f  art = 0;    /* O
261b0 6c 64 20 76 61 6c 75 65 20 66 6f 72 20 69 53 74  ld value for iSt
261c0 61 72 74 42 6c 6f 63 6b 20 2a 2f 0a 20 20 73 71  artBlock */.  sq
261d0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 46 65 74  lite3_stmt *pFet
261e0 63 68 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ch = 0;       /*
261f0 20 53 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20   Statement used 
26200 74 6f 20 66 65 74 63 68 20 73 65 67 64 69 72 20  to fetch segdir 
26210 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53  */..  rc = fts3S
26220 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45  qlStmt(p, SQL_SE
26230 4c 45 43 54 5f 53 45 47 44 49 52 2c 20 26 70 46  LECT_SEGDIR, &pF
26240 65 74 63 68 2c 20 30 29 3b 0a 20 20 69 66 28 20  etch, 0);.  if( 
26250 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26260 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 20 20 20  .    int rc2;   
26270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26280 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 72 65     /* sqlite3_re
26290 73 65 74 28 29 20 72 65 74 75 72 6e 20 63 6f 64  set() return cod
262a0 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
262b0 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 46 65 74  _bind_int64(pFet
262c0 63 68 2c 20 31 2c 20 69 41 62 73 4c 65 76 65 6c  ch, 1, iAbsLevel
262d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  );.    sqlite3_b
262e0 69 6e 64 5f 69 6e 74 28 70 46 65 74 63 68 2c 20  ind_int(pFetch, 
262f0 32 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 69 66  2, iIdx);.    if
26300 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
26310 6c 69 74 65 33 5f 73 74 65 70 28 70 46 65 74 63  lite3_step(pFetc
26320 68 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  h) ){.      cons
26330 74 20 63 68 61 72 20 2a 61 52 6f 6f 74 20 3d 20  t char *aRoot = 
26340 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
26350 6c 6f 62 28 70 46 65 74 63 68 2c 20 34 29 3b 0a  lob(pFetch, 4);.
26360 20 20 20 20 20 20 69 6e 74 20 6e 52 6f 6f 74 20        int nRoot 
26370 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
26380 5f 62 79 74 65 73 28 70 46 65 74 63 68 2c 20 34  _bytes(pFetch, 4
26390 29 3b 0a 20 20 20 20 20 20 69 4f 6c 64 53 74 61  );.      iOldSta
263a0 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  rt = sqlite3_col
263b0 75 6d 6e 5f 69 6e 74 36 34 28 70 46 65 74 63 68  umn_int64(pFetch
263c0 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , 1);.      rc =
263d0 20 66 74 73 33 54 72 75 6e 63 61 74 65 4e 6f 64   fts3TruncateNod
263e0 65 28 61 52 6f 6f 74 2c 20 6e 52 6f 6f 74 2c 20  e(aRoot, nRoot, 
263f0 26 72 6f 6f 74 2c 20 7a 54 65 72 6d 2c 20 6e 54  &root, zTerm, nT
26400 65 72 6d 2c 20 26 69 42 6c 6f 63 6b 29 3b 0a 20  erm, &iBlock);. 
26410 20 20 20 7d 0a 20 20 20 20 72 63 32 20 3d 20 73     }.    rc2 = s
26420 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 46 65  qlite3_reset(pFe
26430 74 63 68 29 3b 0a 20 20 20 20 69 66 28 20 72 63  tch);.    if( rc
26440 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
26450 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 77   = rc2;.  }..  w
26460 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
26470 5f 4f 4b 20 26 26 20 69 42 6c 6f 63 6b 20 29 7b  _OK && iBlock ){
26480 0a 20 20 20 20 63 68 61 72 20 2a 61 42 6c 6f 63  .    char *aBloc
26490 6b 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  k = 0;.    int n
264a0 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 69  Block = 0;.    i
264b0 4e 65 77 53 74 61 72 74 20 3d 20 69 42 6c 6f 63  NewStart = iBloc
264c0 6b 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  k;..    rc = sql
264d0 69 74 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63  ite3Fts3ReadBloc
264e0 6b 28 70 2c 20 69 42 6c 6f 63 6b 2c 20 26 61 42  k(p, iBlock, &aB
264f0 6c 6f 63 6b 2c 20 26 6e 42 6c 6f 63 6b 2c 20 30  lock, &nBlock, 0
26500 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
26510 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26520 20 20 72 63 20 3d 20 66 74 73 33 54 72 75 6e 63    rc = fts3Trunc
26530 61 74 65 4e 6f 64 65 28 61 42 6c 6f 63 6b 2c 20  ateNode(aBlock, 
26540 6e 42 6c 6f 63 6b 2c 20 26 62 6c 6f 63 6b 2c 20  nBlock, &block, 
26550 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 26 69  zTerm, nTerm, &i
26560 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  Block);.    }.  
26570 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26580 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
26590 3d 20 66 74 73 33 57 72 69 74 65 53 65 67 6d 65  = fts3WriteSegme
265a0 6e 74 28 70 2c 20 69 4e 65 77 53 74 61 72 74 2c  nt(p, iNewStart,
265b0 20 62 6c 6f 63 6b 2e 61 2c 20 62 6c 6f 63 6b 2e   block.a, block.
265c0 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  n);.    }.    sq
265d0 6c 69 74 65 33 5f 66 72 65 65 28 61 42 6c 6f 63  lite3_free(aBloc
265e0 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 56 61  k);.  }..  /* Va
265f0 72 69 61 62 6c 65 20 69 4e 65 77 53 74 61 72 74  riable iNewStart
26600 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68   now contains th
26610 65 20 66 69 72 73 74 20 76 61 6c 69 64 20 6c 65  e first valid le
26620 61 66 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 66  af node. */.  if
26630 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26640 26 26 20 69 4e 65 77 53 74 61 72 74 20 29 7b 0a  && iNewStart ){.
26650 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
26660 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20   *pDel = 0;.    
26670 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
26680 28 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53  (p, SQL_DELETE_S
26690 45 47 4d 45 4e 54 53 5f 52 41 4e 47 45 2c 20 26  EGMENTS_RANGE, &
266a0 70 44 65 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66  pDel, 0);.    if
266b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
266c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
266d0 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c  _bind_int64(pDel
266e0 2c 20 31 2c 20 69 4f 6c 64 53 74 61 72 74 29 3b  , 1, iOldStart);
266f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
26700 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c 2c 20  ind_int64(pDel, 
26710 32 2c 20 69 4e 65 77 53 74 61 72 74 2d 31 29 3b  2, iNewStart-1);
26720 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
26730 74 65 70 28 70 44 65 6c 29 3b 0a 20 20 20 20 20  tep(pDel);.     
26740 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
26750 73 65 74 28 70 44 65 6c 29 3b 0a 20 20 20 20 7d  set(pDel);.    }
26760 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
26770 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26780 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
26790 43 68 6f 6d 70 20 3d 20 30 3b 0a 20 20 20 20 72  Chomp = 0;.    r
267a0 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
267b0 70 2c 20 53 51 4c 5f 43 48 4f 4d 50 5f 53 45 47  p, SQL_CHOMP_SEG
267c0 44 49 52 2c 20 26 70 43 68 6f 6d 70 2c 20 30 29  DIR, &pChomp, 0)
267d0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
267e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
267f0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
26800 74 36 34 28 70 43 68 6f 6d 70 2c 20 31 2c 20 69  t64(pChomp, 1, i
26810 4e 65 77 53 74 61 72 74 29 3b 0a 20 20 20 20 20  NewStart);.     
26820 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
26830 6f 62 28 70 43 68 6f 6d 70 2c 20 32 2c 20 72 6f  ob(pChomp, 2, ro
26840 6f 74 2e 61 2c 20 72 6f 6f 74 2e 6e 2c 20 53 51  ot.a, root.n, SQ
26850 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
26860 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
26870 5f 69 6e 74 36 34 28 70 43 68 6f 6d 70 2c 20 33  _int64(pChomp, 3
26880 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20  , iAbsLevel);.  
26890 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
268a0 5f 69 6e 74 28 70 43 68 6f 6d 70 2c 20 34 2c 20  _int(pChomp, 4, 
268b0 69 49 64 78 29 3b 0a 20 20 20 20 20 20 73 71 6c  iIdx);.      sql
268c0 69 74 65 33 5f 73 74 65 70 28 70 43 68 6f 6d 70  ite3_step(pChomp
268d0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
268e0 6c 69 74 65 33 5f 72 65 73 65 74 28 70 43 68 6f  lite3_reset(pCho
268f0 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  mp);.      sqlit
26900 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 43 68  e3_bind_null(pCh
26910 6f 6d 70 2c 20 32 29 3b 0a 20 20 20 20 7d 0a 20  omp, 2);.    }. 
26920 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   }..  sqlite3_fr
26930 65 65 28 72 6f 6f 74 2e 61 29 3b 0a 20 20 73 71  ee(root.a);.  sq
26940 6c 69 74 65 33 5f 66 72 65 65 28 62 6c 6f 63 6b  lite3_free(block
26950 2e 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  .a);.  return rc
26960 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
26970 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
26980 65 64 20 61 66 74 65 72 20 61 6e 20 69 6e 63 72  ed after an incr
26990 6d 65 6e 74 61 6c 2d 6d 65 72 67 65 20 6f 70 65  mental-merge ope
269a0 72 61 74 69 6f 6e 20 68 61 73 20 72 75 6e 20 74  ration has run t
269b0 6f 0a 2a 2a 20 6d 65 72 67 65 20 28 6f 72 20 70  o.** merge (or p
269c0 61 72 74 69 61 6c 6c 79 20 6d 65 72 67 65 29 20  artially merge) 
269d0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d  two or more segm
269e0 65 6e 74 73 20 66 72 6f 6d 20 61 62 73 6f 6c 75  ents from absolu
269f0 74 65 20 6c 65 76 65 6c 0a 2a 2a 20 69 41 62 73  te level.** iAbs
26a00 4c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 45 61 63  Level..**.** Eac
26a10 68 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 20  h input segment 
26a20 69 73 20 65 69 74 68 65 72 20 72 65 6d 6f 76 65  is either remove
26a30 64 20 66 72 6f 6d 20 74 68 65 20 64 62 20 63 6f  d from the db co
26a40 6d 70 6c 65 74 65 6c 79 20 28 69 66 20 61 6c 6c  mpletely (if all
26a50 20 6f 66 0a 2a 2a 20 69 74 73 20 64 61 74 61 20   of.** its data 
26a60 77 61 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68  was copied to th
26a70 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  e output segment
26a80 20 62 79 20 74 68 65 20 69 6e 63 72 6d 65 72 67   by the incrmerg
26a90 65 20 6f 70 65 72 61 74 69 6f 6e 29 0a 2a 2a 20  e operation).** 
26aa0 6f 72 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 70  or modified in p
26ab0 6c 61 63 65 20 73 6f 20 74 68 61 74 20 69 74 20  lace so that it 
26ac0 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f 6e 74 61 69  no longer contai
26ad0 6e 73 20 74 68 6f 73 65 20 65 6e 74 72 69 65 73  ns those entries
26ae0 20 74 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65   that.** have be
26af0 65 6e 20 64 75 70 6c 69 63 61 74 65 64 20 69 6e  en duplicated in
26b00 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d   the output segm
26b10 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
26b20 6e 74 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65  nt fts3Incrmerge
26b30 43 68 6f 6d 70 28 0a 20 20 46 74 73 33 54 61 62  Chomp(.  Fts3Tab
26b40 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
26b50 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20           /* FTS 
26b60 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
26b70 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
26b80 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 20 20  iAbsLevel,      
26b90 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65    /* Absolute le
26ba0 76 65 6c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73  vel containing s
26bb0 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73  egments */.  Fts
26bc0 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20  3MultiSegReader 
26bd0 2a 70 43 73 72 2c 20 20 20 20 20 20 20 2f 2a 20  *pCsr,       /* 
26be0 43 68 6f 6d 70 20 61 6c 6c 20 73 65 67 6d 65 6e  Chomp all segmen
26bf0 74 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69  ts opened by thi
26c00 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e  s cursor */.  in
26c10 74 20 2a 70 6e 52 65 6d 20 20 20 20 20 20 20 20  t *pnRem        
26c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26c30 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   Number of segme
26c40 6e 74 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 20  nts not deleted 
26c50 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
26c60 20 69 6e 74 20 6e 52 65 6d 20 3d 20 30 3b 0a 20   int nRem = 0;. 
26c70 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
26c80 5f 4f 4b 3b 0a 0a 20 20 66 6f 72 28 69 3d 70 43  _OK;..  for(i=pC
26c90 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 2d 31 3b 20  sr->nSegment-1; 
26ca0 69 3e 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49  i>=0 && rc==SQLI
26cb0 54 45 5f 4f 4b 3b 20 69 2d 2d 29 7b 0a 20 20 20  TE_OK; i--){.   
26cc0 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
26cd0 70 53 65 67 20 3d 20 30 3b 0a 20 20 20 20 69 6e  pSeg = 0;.    in
26ce0 74 20 6a 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  t j;..    /* Fin
26cf0 64 20 74 68 65 20 46 74 73 33 53 65 67 52 65 61  d the Fts3SegRea
26d00 64 65 72 20 6f 62 6a 65 63 74 20 77 69 74 68 20  der object with 
26d10 46 74 73 33 53 65 67 52 65 61 64 65 72 2e 69 49  Fts3SegReader.iI
26d20 64 78 3d 3d 69 2e 20 49 74 20 69 73 20 68 69 64  dx==i. It is hid
26d30 69 6e 67 0a 20 20 20 20 2a 2a 20 73 6f 6d 65 77  ing.    ** somew
26d40 68 65 72 65 20 69 6e 20 74 68 65 20 70 43 73 72  here in the pCsr
26d50 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 5d 20 61 72  ->apSegment[] ar
26d60 72 61 79 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ray.  */.    for
26d70 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70  (j=0; ALWAYS(j<p
26d80 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 29 3b 20  Csr->nSegment); 
26d90 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 65 67  j++){.      pSeg
26da0 20 3d 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65   = pCsr->apSegme
26db0 6e 74 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28  nt[j];.      if(
26dc0 20 70 53 65 67 2d 3e 69 49 64 78 3d 3d 69 20 29   pSeg->iIdx==i )
26dd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
26de0 20 20 61 73 73 65 72 74 28 20 6a 3c 70 43 73 72    assert( j<pCsr
26df0 2d 3e 6e 53 65 67 6d 65 6e 74 20 26 26 20 70 53  ->nSegment && pS
26e00 65 67 2d 3e 69 49 64 78 3d 3d 69 20 29 3b 0a 0a  eg->iIdx==i );..
26e10 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 61 4e      if( pSeg->aN
26e20 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
26e30 2f 2a 20 53 65 67 2d 72 65 61 64 65 72 20 69 73  /* Seg-reader is
26e40 20 61 74 20 45 4f 46 2e 20 52 65 6d 6f 76 65 20   at EOF. Remove 
26e50 74 68 65 20 65 6e 74 69 72 65 20 69 6e 70 75 74  the entire input
26e60 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20   segment. */.   
26e70 20 20 20 72 63 20 3d 20 66 74 73 33 44 65 6c 65     rc = fts3Dele
26e80 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 53 65  teSegment(p, pSe
26e90 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
26ea0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26eb0 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33         rc = fts3
26ec0 52 65 6d 6f 76 65 53 65 67 64 69 72 45 6e 74 72  RemoveSegdirEntr
26ed0 79 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 2c 20  y(p, iAbsLevel, 
26ee0 70 53 65 67 2d 3e 69 49 64 78 29 3b 0a 20 20 20  pSeg->iIdx);.   
26ef0 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 6e 52 65     }.      *pnRe
26f00 6d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  m = 0;.    }else
26f10 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  {.      /* The i
26f20 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65  ncremental merge
26f30 20 64 69 64 20 6e 6f 74 20 63 6f 70 79 20 61 6c   did not copy al
26f40 6c 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d 20  l the data from 
26f50 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 73  this .      ** s
26f60 65 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 75 70  egment to the up
26f70 70 65 72 20 6c 65 76 65 6c 2e 20 54 68 65 20 73  per level. The s
26f80 65 67 6d 65 6e 74 20 69 73 20 6d 6f 64 69 66 69  egment is modifi
26f90 65 64 20 69 6e 20 70 6c 61 63 65 0a 20 20 20 20  ed in place.    
26fa0 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20    ** so that it 
26fb0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 6b 65 79 73  contains no keys
26fc0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 7a 54   smaller than zT
26fd0 65 72 6d 2f 6e 54 65 72 6d 2e 20 2a 2f 20 0a 20  erm/nTerm. */ . 
26fe0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
26ff0 2a 7a 54 65 72 6d 20 3d 20 70 53 65 67 2d 3e 7a  *zTerm = pSeg->z
27000 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Term;.      int 
27010 6e 54 65 72 6d 20 3d 20 70 53 65 67 2d 3e 6e 54  nTerm = pSeg->nT
27020 65 72 6d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  erm;.      rc = 
27030 66 74 73 33 54 72 75 6e 63 61 74 65 53 65 67 6d  fts3TruncateSegm
27040 65 6e 74 28 70 2c 20 69 41 62 73 4c 65 76 65 6c  ent(p, iAbsLevel
27050 2c 20 70 53 65 67 2d 3e 69 49 64 78 2c 20 7a 54  , pSeg->iIdx, zT
27060 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20  erm, nTerm);.   
27070 20 20 20 6e 52 65 6d 2b 2b 3b 0a 20 20 20 20 7d     nRem++;.    }
27080 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
27090 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 52 65  SQLITE_OK && nRe
270a0 6d 21 3d 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e  m!=pCsr->nSegmen
270b0 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  t ){.    rc = ft
270c0 73 33 52 65 70 61 63 6b 53 65 67 64 69 72 4c 65  s3RepackSegdirLe
270d0 76 65 6c 28 70 2c 20 69 41 62 73 4c 65 76 65 6c  vel(p, iAbsLevel
270e0 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 52 65 6d  );.  }..  *pnRem
270f0 20 3d 20 6e 52 65 6d 3b 0a 20 20 72 65 74 75 72   = nRem;.  retur
27100 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
27110 74 6f 72 65 20 61 6e 20 69 6e 63 72 2d 6d 65 72  tore an incr-mer
27120 67 65 20 68 69 6e 74 20 69 6e 20 74 68 65 20 64  ge hint in the d
27130 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
27140 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72 6d  ic int fts3Incrm
27150 65 72 67 65 48 69 6e 74 53 74 6f 72 65 28 46 74  ergeHintStore(Ft
27160 73 33 54 61 62 6c 65 20 2a 70 2c 20 42 6c 6f 62  s3Table *p, Blob
27170 20 2a 70 48 69 6e 74 29 7b 0a 20 20 73 71 6c 69   *pHint){.  sqli
27180 74 65 33 5f 73 74 6d 74 20 2a 70 52 65 70 6c 61  te3_stmt *pRepla
27190 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ce = 0;.  int rc
271a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
271b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
271c0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 72  urn code */..  r
271d0 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
271e0 70 2c 20 53 51 4c 5f 52 45 50 4c 41 43 45 5f 53  p, SQL_REPLACE_S
271f0 54 41 54 2c 20 26 70 52 65 70 6c 61 63 65 2c 20  TAT, &pReplace, 
27200 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
27210 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
27220 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
27230 70 52 65 70 6c 61 63 65 2c 20 31 2c 20 46 54 53  pReplace, 1, FTS
27240 5f 53 54 41 54 5f 49 4e 43 52 4d 45 52 47 45 48  _STAT_INCRMERGEH
27250 49 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  INT);.    sqlite
27260 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 52 65 70  3_bind_blob(pRep
27270 6c 61 63 65 2c 20 32 2c 20 70 48 69 6e 74 2d 3e  lace, 2, pHint->
27280 61 2c 20 70 48 69 6e 74 2d 3e 6e 2c 20 53 51 4c  a, pHint->n, SQL
27290 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
272a0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 52   sqlite3_step(pR
272b0 65 70 6c 61 63 65 29 3b 0a 20 20 20 20 72 63 20  eplace);.    rc 
272c0 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
272d0 70 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20 73  pReplace);.    s
272e0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
272f0 28 70 52 65 70 6c 61 63 65 2c 20 32 29 3b 0a 20  (pReplace, 2);. 
27300 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
27310 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 61  .}../*.** Load a
27320 6e 20 69 6e 63 72 2d 6d 65 72 67 65 20 68 69 6e  n incr-merge hin
27330 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  t from the datab
27340 61 73 65 2e 20 54 68 65 20 69 6e 63 72 2d 6d 65  ase. The incr-me
27350 72 67 65 20 68 69 6e 74 2c 20 69 66 20 6f 6e 65  rge hint, if one
27360 20 0a 2a 2a 20 65 78 69 73 74 73 2c 20 69 73 20   .** exists, is 
27370 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 72 6f  stored in the ro
27380 77 69 64 3d 3d 31 20 72 6f 77 20 6f 66 20 74 68  wid==1 row of th
27390 65 20 25 5f 73 74 61 74 20 74 61 62 6c 65 2e 0a  e %_stat table..
273a0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
273b0 66 75 6c 2c 20 70 6f 70 75 6c 61 74 65 20 62 6c  ful, populate bl
273c0 6f 62 20 2a 70 48 69 6e 74 20 77 69 74 68 20 74  ob *pHint with t
273d0 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
273e0 6f 6d 20 74 68 65 20 25 5f 73 74 61 74 0a 2a 2a  om the %_stat.**
273f0 20 74 61 62 6c 65 20 61 6e 64 20 72 65 74 75 72   table and retur
27400 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68  n SQLITE_OK. Oth
27410 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72  erwise, if an er
27420 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
27430 72 6e 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20  rn an.** SQLite 
27440 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
27450 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e  tatic int fts3In
27460 63 72 6d 65 72 67 65 48 69 6e 74 4c 6f 61 64 28  crmergeHintLoad(
27470 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 42 6c  Fts3Table *p, Bl
27480 6f 62 20 2a 70 48 69 6e 74 29 7b 0a 20 20 73 71  ob *pHint){.  sq
27490 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c  lite3_stmt *pSel
274a0 65 63 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ect = 0;.  int r
274b0 63 3b 0a 0a 20 20 70 48 69 6e 74 2d 3e 6e 20 3d  c;..  pHint->n =
274c0 20 30 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53   0;.  rc = fts3S
274d0 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45  qlStmt(p, SQL_SE
274e0 4c 45 43 54 5f 53 54 41 54 2c 20 26 70 53 65 6c  LECT_STAT, &pSel
274f0 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ect, 0);.  if( r
27500 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27510 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
27520 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
27530 74 28 70 53 65 6c 65 63 74 2c 20 31 2c 20 46 54  t(pSelect, 1, FT
27540 53 5f 53 54 41 54 5f 49 4e 43 52 4d 45 52 47 45  S_STAT_INCRMERGE
27550 48 49 4e 54 29 3b 0a 20 20 20 20 69 66 28 20 53  HINT);.    if( S
27560 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
27570 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29  e3_step(pSelect)
27580 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
27590 63 68 61 72 20 2a 61 48 69 6e 74 20 3d 20 73 71  char *aHint = sq
275a0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
275b0 62 28 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  b(pSelect, 0);. 
275c0 20 20 20 20 20 69 6e 74 20 6e 48 69 6e 74 20 3d       int nHint =
275d0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
275e0 62 79 74 65 73 28 70 53 65 6c 65 63 74 2c 20 30  bytes(pSelect, 0
275f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 48 69  );.      if( aHi
27600 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 62 6c  nt ){.        bl
27610 6f 62 47 72 6f 77 42 75 66 66 65 72 28 70 48 69  obGrowBuffer(pHi
27620 6e 74 2c 20 6e 48 69 6e 74 2c 20 26 72 63 29 3b  nt, nHint, &rc);
27630 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
27640 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27650 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
27660 48 69 6e 74 2d 3e 61 2c 20 61 48 69 6e 74 2c 20  Hint->a, aHint, 
27670 6e 48 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  nHint);.        
27680 20 20 70 48 69 6e 74 2d 3e 6e 20 3d 20 6e 48 69    pHint->n = nHi
27690 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nt;.        }.  
276a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
276b0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  rc2 = sqlite3_re
276c0 73 65 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  set(pSelect);.  
276d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
276e0 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
276f0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
27700 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70  ;.}../*.** If *p
27710 52 63 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45  Rc is not SQLITE
27720 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  _OK when this fu
27730 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
27740 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
27750 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
27760 70 70 65 6e 64 20 61 6e 20 65 6e 74 72 79 20 74  ppend an entry t
27770 6f 20 74 68 65 20 68 69 6e 74 20 73 74 6f 72 65  o the hint store
27780 64 20 69 6e 20 62 6c 6f 62 20 2a 70 48 69 6e 74  d in blob *pHint
27790 2e 20 45 61 63 68 20 65 6e 74 72 79 0a 2a 2a 20  . Each entry.** 
277a0 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 77 6f 20  consists of two 
277b0 76 61 72 69 6e 74 73 2c 20 74 68 65 20 61 62 73  varints, the abs
277c0 6f 6c 75 74 65 20 6c 65 76 65 6c 20 6e 75 6d 62  olute level numb
277d0 65 72 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  er of the input 
277e0 73 65 67 6d 65 6e 74 73 20 0a 2a 2a 20 61 6e 64  segments .** and
277f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   the number of i
27800 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 2e 0a 2a  nput segments..*
27810 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
27820 75 6c 2c 20 6c 65 61 76 65 20 2a 70 52 63 20 73  ul, leave *pRc s
27830 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
27840 61 6e 64 20 72 65 74 75 72 6e 2e 20 49 66 20 61  and return. If a
27850 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a  n error occurs,.
27860 2a 2a 20 73 65 74 20 2a 70 52 63 20 74 6f 20 61  ** set *pRc to a
27870 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
27880 6f 64 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ode before retur
27890 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
278a0 76 6f 69 64 20 66 74 73 33 49 6e 63 72 6d 65 72  void fts3Incrmer
278b0 67 65 48 69 6e 74 50 75 73 68 28 0a 20 20 42 6c  geHintPush(.  Bl
278c0 6f 62 20 2a 70 48 69 6e 74 2c 20 20 20 20 20 20  ob *pHint,      
278d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
278e0 20 48 69 6e 74 20 62 6c 6f 62 20 74 6f 20 61 70   Hint blob to ap
278f0 70 65 6e 64 20 74 6f 20 2a 2f 0a 20 20 69 36 34  pend to */.  i64
27900 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 20   iAbsLevel,     
27910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27920 46 69 72 73 74 20 76 61 72 69 6e 74 20 74 6f 20  First varint to 
27930 73 74 6f 72 65 20 69 6e 20 68 69 6e 74 20 2a 2f  store in hint */
27940 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74 2c 20 20  .  int nInput,  
27950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27960 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 76 61 72     /* Second var
27970 69 6e 74 20 74 6f 20 73 74 6f 72 65 20 69 6e 20  int to store in 
27980 68 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  hint */.  int *p
27990 52 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc              
279a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
279b0 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20  OUT: Error code 
279c0 2a 2f 0a 29 7b 0a 20 20 62 6c 6f 62 47 72 6f 77  */.){.  blobGrow
279d0 42 75 66 66 65 72 28 70 48 69 6e 74 2c 20 70 48  Buffer(pHint, pH
279e0 69 6e 74 2d 3e 6e 20 2b 20 32 2a 46 54 53 33 5f  int->n + 2*FTS3_
279f0 56 41 52 49 4e 54 5f 4d 41 58 2c 20 70 52 63 29  VARINT_MAX, pRc)
27a00 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51  ;.  if( *pRc==SQ
27a10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
27a20 48 69 6e 74 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  Hint->n += sqlit
27a30 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28  e3Fts3PutVarint(
27a40 26 70 48 69 6e 74 2d 3e 61 5b 70 48 69 6e 74 2d  &pHint->a[pHint-
27a50 3e 6e 5d 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b  >n], iAbsLevel);
27a60 0a 20 20 20 20 70 48 69 6e 74 2d 3e 6e 20 2b 3d  .    pHint->n +=
27a70 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56   sqlite3Fts3PutV
27a80 61 72 69 6e 74 28 26 70 48 69 6e 74 2d 3e 61 5b  arint(&pHint->a[
27a90 70 48 69 6e 74 2d 3e 6e 5d 2c 20 28 69 36 34 29  pHint->n], (i64)
27aa0 6e 49 6e 70 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  nInput);.  }.}..
27ab0 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 6c  /*.** Read the l
27ac0 61 73 74 20 65 6e 74 72 79 20 28 6d 6f 73 74 20  ast entry (most 
27ad0 72 65 63 65 6e 74 6c 79 20 70 75 73 68 65 64 29  recently pushed)
27ae0 20 66 72 6f 6d 20 74 68 65 20 68 69 6e 74 20 62   from the hint b
27af0 6c 6f 62 20 2a 70 48 69 6e 74 0a 2a 2a 20 61 6e  lob *pHint.** an
27b00 64 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68  d then remove th
27b10 65 20 65 6e 74 72 79 2e 20 57 72 69 74 65 20 74  e entry. Write t
27b20 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20 72 65  he two values re
27b30 61 64 20 74 6f 20 2a 70 69 41 62 73 4c 65 76 65  ad to *piAbsLeve
27b40 6c 20 61 6e 64 20 0a 2a 2a 20 2a 70 6e 49 6e 70  l and .** *pnInp
27b50 75 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ut before return
27b60 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ing..**.** If no
27b70 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
27b80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
27b90 20 49 66 20 74 68 65 20 68 69 6e 74 20 62 6c 6f   If the hint blo
27ba0 62 20 69 6e 20 2a 70 48 69 6e 74 20 64 6f 65 73  b in *pHint does
27bb0 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
27bc0 61 74 20 6c 65 61 73 74 20 74 77 6f 20 76 61 6c  at least two val
27bd0 69 64 20 76 61 72 69 6e 74 73 2c 20 72 65 74 75  id varints, retu
27be0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
27bf0 54 5f 56 54 41 42 2e 0a 2a 2f 0a 73 74 61 74 69  T_VTAB..*/.stati
27c00 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72 6d 65  c int fts3Incrme
27c10 72 67 65 48 69 6e 74 50 6f 70 28 42 6c 6f 62 20  rgeHintPop(Blob 
27c20 2a 70 48 69 6e 74 2c 20 69 36 34 20 2a 70 69 41  *pHint, i64 *piA
27c30 62 73 4c 65 76 65 6c 2c 20 69 6e 74 20 2a 70 6e  bsLevel, int *pn
27c40 49 6e 70 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20  Input){.  const 
27c50 69 6e 74 20 6e 48 69 6e 74 20 3d 20 70 48 69 6e  int nHint = pHin
27c60 74 2d 3e 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  t->n;.  int i;..
27c70 20 20 69 20 3d 20 70 48 69 6e 74 2d 3e 6e 2d 32    i = pHint->n-2
27c80 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 26  ;.  while( i>0 &
27c90 26 20 28 70 48 69 6e 74 2d 3e 61 5b 69 2d 31 5d  & (pHint->a[i-1]
27ca0 20 26 20 30 78 38 30 29 20 29 20 69 2d 2d 3b 0a   & 0x80) ) i--;.
27cb0 20 20 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20    while( i>0 && 
27cc0 28 70 48 69 6e 74 2d 3e 61 5b 69 2d 31 5d 20 26  (pHint->a[i-1] &
27cd0 20 30 78 38 30 29 20 29 20 69 2d 2d 3b 0a 0a 20   0x80) ) i--;.. 
27ce0 20 70 48 69 6e 74 2d 3e 6e 20 3d 20 69 3b 0a 20   pHint->n = i;. 
27cf0 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73   i += sqlite3Fts
27d00 33 47 65 74 56 61 72 69 6e 74 28 26 70 48 69 6e  3GetVarint(&pHin
27d10 74 2d 3e 61 5b 69 5d 2c 20 70 69 41 62 73 4c 65  t->a[i], piAbsLe
27d20 76 65 6c 29 3b 0a 20 20 69 20 2b 3d 20 66 74 73  vel);.  i += fts
27d30 33 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 48  3GetVarint32(&pH
27d40 69 6e 74 2d 3e 61 5b 69 5d 2c 20 70 6e 49 6e 70  int->a[i], pnInp
27d50 75 74 29 3b 0a 20 20 69 66 28 20 69 21 3d 6e 48  ut);.  if( i!=nH
27d60 69 6e 74 20 29 20 72 65 74 75 72 6e 20 46 54 53  int ) return FTS
27d70 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 0a  _CORRUPT_VTAB;..
27d80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27d90 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 74  OK;.}.../*.** At
27da0 74 65 6d 70 74 20 61 6e 20 69 6e 63 72 65 6d 65  tempt an increme
27db0 6e 74 61 6c 20 6d 65 72 67 65 20 74 68 61 74 20  ntal merge that 
27dc0 77 72 69 74 65 73 20 6e 4d 65 72 67 65 20 6c 65  writes nMerge le
27dd0 61 66 20 62 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a  af blocks..**.**
27de0 20 49 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72   Incremental mer
27df0 67 65 73 20 68 61 70 70 65 6e 20 6e 4d 69 6e 20  ges happen nMin 
27e00 73 65 67 6d 65 6e 74 73 20 61 74 20 61 20 74 69  segments at a ti
27e10 6d 65 2e 20 54 68 65 20 73 65 67 6d 65 6e 74 73  me. The segments
27e20 20 0a 2a 2a 20 74 6f 20 62 65 20 6d 65 72 67 65   .** to be merge
27e30 64 20 61 72 65 20 74 68 65 20 6e 4d 69 6e 20 6f  d are the nMin o
27e40 6c 64 65 73 74 20 73 65 67 6d 65 6e 74 73 20 28  ldest segments (
27e50 74 68 65 20 6f 6e 65 73 20 77 69 74 68 20 74 68  the ones with th
27e60 65 20 73 6d 61 6c 6c 65 73 74 20 0a 2a 2a 20 76  e smallest .** v
27e70 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 5f 73  alues for the _s
27e80 65 67 64 69 72 2e 69 64 78 20 66 69 65 6c 64 29  egdir.idx field)
27e90 20 69 6e 20 74 68 65 20 68 69 67 68 65 73 74 20   in the highest 
27ea0 6c 65 76 65 6c 20 74 68 61 74 20 63 6f 6e 74 61  level that conta
27eb0 69 6e 73 20 0a 2a 2a 20 61 74 20 6c 65 61 73 74  ins .** at least
27ec0 20 6e 4d 69 6e 20 73 65 67 6d 65 6e 74 73 2e 20   nMin segments. 
27ed0 4d 75 6c 74 69 70 6c 65 20 6d 65 72 67 65 73 20  Multiple merges 
27ee0 6d 69 67 68 74 20 6f 63 63 75 72 20 69 6e 20 61  might occur in a
27ef0 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a  n attempt to .**
27f00 20 77 72 69 74 65 20 74 68 65 20 71 75 6f 74 61   write the quota
27f10 20 6f 66 20 6e 4d 65 72 67 65 20 6c 65 61 66 20   of nMerge leaf 
27f20 62 6c 6f 63 6b 73 2e 0a 2a 2f 0a 69 6e 74 20 73  blocks..*/.int s
27f30 71 6c 69 74 65 33 46 74 73 33 49 6e 63 72 6d 65  qlite3Fts3Incrme
27f40 72 67 65 28 46 74 73 33 54 61 62 6c 65 20 2a 70  rge(Fts3Table *p
27f50 2c 20 69 6e 74 20 6e 4d 65 72 67 65 2c 20 69 6e  , int nMerge, in
27f60 74 20 6e 4d 69 6e 29 7b 0a 20 20 69 6e 74 20 72  t nMin){.  int r
27f70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
27f80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
27f90 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
27fa0 6e 74 20 6e 52 65 6d 20 3d 20 6e 4d 65 72 67 65  nt nRem = nMerge
27fb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
27fc0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  * Number of leaf
27fd0 20 70 61 67 65 73 20 79 65 74 20 74 6f 20 20 62   pages yet to  b
27fe0 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 46  e written */.  F
27ff0 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
28000 72 20 2a 70 43 73 72 3b 20 20 20 20 20 20 20 2f  r *pCsr;       /
28010 2a 20 43 75 72 73 6f 72 20 75 73 65 64 20 74 6f  * Cursor used to
28020 20 72 65 61 64 20 69 6e 70 75 74 20 64 61 74 61   read input data
28030 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 46 69 6c   */.  Fts3SegFil
28040 74 65 72 20 2a 70 46 69 6c 74 65 72 3b 20 20 20  ter *pFilter;   
28050 20 20 20 20 20 20 2f 2a 20 46 69 6c 74 65 72 20        /* Filter 
28060 75 73 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  used with cursor
28070 20 70 43 73 72 20 2a 2f 0a 20 20 49 6e 63 72 6d   pCsr */.  Incrm
28080 65 72 67 65 57 72 69 74 65 72 20 2a 70 57 72 69  ergeWriter *pWri
28090 74 65 72 3b 20 20 20 20 20 20 20 2f 2a 20 57 72  ter;       /* Wr
280a0 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  iter object */. 
280b0 20 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b 20 20   int nSeg = 0;  
280c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
280e0 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  put segments */.
280f0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
28100 69 41 62 73 4c 65 76 65 6c 20 3d 20 30 3b 20 20  iAbsLevel = 0;  
28110 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65    /* Absolute le
28120 76 65 6c 20 6e 75 6d 62 65 72 20 74 6f 20 77 6f  vel number to wo
28130 72 6b 20 6f 6e 20 2a 2f 0a 20 20 42 6c 6f 62 20  rk on */.  Blob 
28140 68 69 6e 74 20 3d 20 7b 30 2c 20 30 2c 20 30 7d  hint = {0, 0, 0}
28150 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 69  ;          /* Hi
28160 6e 74 20 72 65 61 64 20 66 72 6f 6d 20 25 5f 73  nt read from %_s
28170 74 61 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  tat table */.  i
28180 6e 74 20 62 44 69 72 74 79 48 69 6e 74 20 3d 20  nt bDirtyHint = 
28190 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
281a0 2a 20 54 72 75 65 20 69 66 20 62 6c 6f 62 20 27  * True if blob '
281b0 68 69 6e 74 27 20 68 61 73 20 62 65 65 6e 20 6d  hint' has been m
281c0 6f 64 69 66 69 65 64 20 2a 2f 0a 0a 20 20 2f 2a  odified */..  /*
281d0 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
281e0 66 6f 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20  for the cursor, 
281f0 66 69 6c 74 65 72 20 61 6e 64 20 77 72 69 74 65  filter and write
28200 72 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 63  r objects */.  c
28210 6f 6e 73 74 20 69 6e 74 20 6e 41 6c 6c 6f 63 20  onst int nAlloc 
28220 3d 20 73 69 7a 65 6f 66 28 2a 70 43 73 72 29 20  = sizeof(*pCsr) 
28230 2b 20 73 69 7a 65 6f 66 28 2a 70 46 69 6c 74 65  + sizeof(*pFilte
28240 72 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 57 72  r) + sizeof(*pWr
28250 69 74 65 72 29 3b 0a 20 20 70 57 72 69 74 65 72  iter);.  pWriter
28260 20 3d 20 28 49 6e 63 72 6d 65 72 67 65 57 72 69   = (IncrmergeWri
28270 74 65 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  ter *)sqlite3_ma
28280 6c 6c 6f 63 28 6e 41 6c 6c 6f 63 29 3b 0a 20 20  lloc(nAlloc);.  
28290 69 66 28 20 21 70 57 72 69 74 65 72 20 29 20 72  if( !pWriter ) r
282a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
282b0 45 4d 3b 0a 20 20 70 46 69 6c 74 65 72 20 3d 20  EM;.  pFilter = 
282c0 28 46 74 73 33 53 65 67 46 69 6c 74 65 72 20 2a  (Fts3SegFilter *
282d0 29 26 70 57 72 69 74 65 72 5b 31 5d 3b 0a 20 20  )&pWriter[1];.  
282e0 70 43 73 72 20 3d 20 28 46 74 73 33 4d 75 6c 74  pCsr = (Fts3Mult
282f0 69 53 65 67 52 65 61 64 65 72 20 2a 29 26 70 46  iSegReader *)&pF
28300 69 6c 74 65 72 5b 31 5d 3b 0a 0a 20 20 72 63 20  ilter[1];..  rc 
28310 3d 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 48  = fts3IncrmergeH
28320 69 6e 74 4c 6f 61 64 28 70 2c 20 26 68 69 6e 74  intLoad(p, &hint
28330 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
28340 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 52 65  SQLITE_OK && nRe
28350 6d 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  m>0 ){.    const
28360 20 69 36 34 20 6e 4d 6f 64 20 3d 20 46 54 53 33   i64 nMod = FTS3
28370 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c  _SEGDIR_MAXLEVEL
28380 20 2a 20 70 2d 3e 6e 49 6e 64 65 78 3b 0a 20 20   * p->nIndex;.  
28390 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
283a0 70 46 69 6e 64 4c 65 76 65 6c 20 3d 20 30 3b 20  pFindLevel = 0; 
283b0 2f 2a 20 53 51 4c 20 75 73 65 64 20 74 6f 20 64  /* SQL used to d
283c0 65 74 65 72 6d 69 6e 65 20 69 41 62 73 4c 65 76  etermine iAbsLev
283d0 65 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 55  el */.    int bU
283e0 73 65 48 69 6e 74 20 3d 20 30 3b 20 20 20 20 20  seHint = 0;     
283f0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
28400 69 66 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  if attempting to
28410 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 20 20 69   append */.    i
28420 6e 74 20 69 49 64 78 20 3d 20 30 3b 20 20 20 20  nt iIdx = 0;    
28430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28440 4c 61 72 67 65 73 74 20 69 64 78 20 69 6e 20 6c  Largest idx in l
28450 65 76 65 6c 20 28 69 41 62 73 4c 65 76 65 6c 2b  evel (iAbsLevel+
28460 31 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  1) */..    /* Se
28470 61 72 63 68 20 74 68 65 20 25 5f 73 65 67 64 69  arch the %_segdi
28480 72 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20  r table for the 
28490 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 77  absolute level w
284a0 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  ith the smallest
284b0 0a 20 20 20 20 2a 2a 20 72 65 6c 61 74 69 76 65  .    ** relative
284c0 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20 74 68   level number th
284d0 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c  at contains at l
284e0 65 61 73 74 20 6e 4d 69 6e 20 73 65 67 6d 65 6e  east nMin segmen
284f0 74 73 2c 20 69 66 20 61 6e 79 2e 0a 20 20 20 20  ts, if any..    
28500 2a 2a 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75  ** If one is fou
28510 6e 64 2c 20 73 65 74 20 69 41 62 73 4c 65 76 65  nd, set iAbsLeve
28520 6c 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74  l to the absolut
28530 65 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20 61  e level number a
28540 6e 64 0a 20 20 20 20 2a 2a 20 6e 53 65 67 20 74  nd.    ** nSeg t
28550 6f 20 6e 4d 69 6e 2e 20 49 66 20 6e 6f 20 6c 65  o nMin. If no le
28560 76 65 6c 20 77 69 74 68 20 61 74 20 6c 65 61 73  vel with at leas
28570 74 20 6e 4d 69 6e 20 73 65 67 6d 65 6e 74 73 20  t nMin segments 
28580 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 0a 20  can be found, . 
28590 20 20 20 2a 2a 20 73 65 74 20 6e 53 65 67 20 74     ** set nSeg t
285a0 6f 20 2d 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o -1..    */.   
285b0 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
285c0 74 28 70 2c 20 53 51 4c 5f 46 49 4e 44 5f 4d 45  t(p, SQL_FIND_ME
285d0 52 47 45 5f 4c 45 56 45 4c 2c 20 26 70 46 69 6e  RGE_LEVEL, &pFin
285e0 64 4c 65 76 65 6c 2c 20 30 29 3b 0a 20 20 20 20  dLevel, 0);.    
285f0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
28600 28 70 46 69 6e 64 4c 65 76 65 6c 2c 20 31 2c 20  (pFindLevel, 1, 
28610 4d 41 58 28 32 2c 20 6e 4d 69 6e 29 29 3b 0a 20  MAX(2, nMin));. 
28620 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
28630 74 65 70 28 70 46 69 6e 64 4c 65 76 65 6c 29 3d  tep(pFindLevel)=
28640 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
28650 20 20 20 20 20 69 41 62 73 4c 65 76 65 6c 20 3d       iAbsLevel =
28660 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
28670 69 6e 74 36 34 28 70 46 69 6e 64 4c 65 76 65 6c  int64(pFindLevel
28680 2c 20 30 29 3b 0a 20 20 20 20 20 20 6e 53 65 67  , 0);.      nSeg
28690 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
286a0 6e 5f 69 6e 74 28 70 46 69 6e 64 4c 65 76 65 6c  n_int(pFindLevel
286b0 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 1);.      asse
286c0 72 74 28 20 6e 53 65 67 3e 3d 32 20 29 3b 0a 20  rt( nSeg>=2 );. 
286d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
286e0 6e 53 65 67 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  nSeg = -1;.    }
286f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
28700 33 5f 72 65 73 65 74 28 70 46 69 6e 64 4c 65 76  3_reset(pFindLev
28710 65 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  el);..    /* If 
28720 74 68 65 20 68 69 6e 74 20 72 65 61 64 20 66 72  the hint read fr
28730 6f 6d 20 74 68 65 20 25 5f 73 74 61 74 20 74 61  om the %_stat ta
28740 62 6c 65 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  ble is not empty
28750 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 0a 20  , check if the. 
28760 20 20 20 2a 2a 20 6c 61 73 74 20 65 6e 74 72 79     ** last entry
28770 20 69 6e 20 69 74 20 73 70 65 63 69 66 69 65 73   in it specifies
28780 20 61 20 72 65 6c 61 74 69 76 65 20 6c 65 76 65   a relative leve
28790 6c 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f  l smaller than o
287a0 72 20 65 71 75 61 6c 0a 20 20 20 20 2a 2a 20 74  r equal.    ** t
287b0 6f 20 74 68 65 20 6c 65 76 65 6c 20 69 64 65 6e  o the level iden
287c0 74 69 66 69 65 64 20 62 79 20 74 68 65 20 62 6c  tified by the bl
287d0 6f 63 6b 20 61 62 6f 76 65 20 28 69 66 20 61 6e  ock above (if an
287e0 79 29 2e 20 49 66 20 73 6f 2c 20 74 68 69 73 20  y). If so, this 
287f0 0a 20 20 20 20 2a 2a 20 69 74 65 72 61 74 69 6f  .    ** iteratio
28800 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 69  n of the loop wi
28810 6c 6c 20 77 6f 72 6b 20 6f 6e 20 6d 65 72 67 69  ll work on mergi
28820 6e 67 20 61 74 20 74 68 65 20 68 69 6e 74 65 64  ng at the hinted
28830 20 6c 65 76 65 6c 2e 0a 20 20 20 20 2a 2f 0a 20   level..    */. 
28840 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
28850 45 5f 4f 4b 20 26 26 20 68 69 6e 74 2e 6e 20 29  E_OK && hint.n )
28860 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 48 69 6e  {.      int nHin
28870 74 20 3d 20 68 69 6e 74 2e 6e 3b 0a 20 20 20 20  t = hint.n;.    
28880 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
28890 69 48 69 6e 74 41 62 73 4c 65 76 65 6c 20 3d 20  iHintAbsLevel = 
288a0 30 3b 20 20 20 20 20 20 2f 2a 20 48 69 6e 74 20  0;      /* Hint 
288b0 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 20 20 69  level */.      i
288c0 6e 74 20 6e 48 69 6e 74 53 65 67 20 3d 20 30 3b  nt nHintSeg = 0;
288d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288e0 20 20 20 20 20 2f 2a 20 48 69 6e 74 20 6e 75 6d       /* Hint num
288f0 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
28900 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 66  */..      rc = f
28910 74 73 33 49 6e 63 72 6d 65 72 67 65 48 69 6e 74  ts3IncrmergeHint
28920 50 6f 70 28 26 68 69 6e 74 2c 20 26 69 48 69 6e  Pop(&hint, &iHin
28930 74 41 62 73 4c 65 76 65 6c 2c 20 26 6e 48 69 6e  tAbsLevel, &nHin
28940 74 53 65 67 29 3b 0a 20 20 20 20 20 20 69 66 28  tSeg);.      if(
28950 20 6e 53 65 67 3c 30 20 7c 7c 20 28 69 41 62 73   nSeg<0 || (iAbs
28960 4c 65 76 65 6c 20 25 20 6e 4d 6f 64 29 20 3e 3d  Level % nMod) >=
28970 20 28 69 48 69 6e 74 41 62 73 4c 65 76 65 6c 20   (iHintAbsLevel 
28980 25 20 6e 4d 6f 64 29 20 29 7b 0a 20 20 20 20 20  % nMod) ){.     
28990 20 20 20 69 41 62 73 4c 65 76 65 6c 20 3d 20 69     iAbsLevel = i
289a0 48 69 6e 74 41 62 73 4c 65 76 65 6c 3b 0a 20 20  HintAbsLevel;.  
289b0 20 20 20 20 20 20 6e 53 65 67 20 3d 20 6e 48 69        nSeg = nHi
289c0 6e 74 53 65 67 3b 0a 20 20 20 20 20 20 20 20 62  ntSeg;.        b
289d0 55 73 65 48 69 6e 74 20 3d 20 31 3b 0a 20 20 20  UseHint = 1;.   
289e0 20 20 20 20 20 62 44 69 72 74 79 48 69 6e 74 20       bDirtyHint 
289f0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
28a00 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
28a10 73 20 75 6e 64 6f 65 73 20 74 68 65 20 65 66 66  s undoes the eff
28a20 65 63 74 20 6f 66 20 74 68 65 20 48 69 6e 74 50  ect of the HintP
28a30 6f 70 28 29 20 61 62 6f 76 65 20 2d 20 73 6f 20  op() above - so 
28a40 74 68 61 74 20 6e 6f 20 65 6e 74 72 79 0a 20 20  that no entry.  
28a50 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 6d 6f        ** is remo
28a60 76 65 64 20 66 72 6f 6d 20 74 68 65 20 68 69 6e  ved from the hin
28a70 74 20 62 6c 6f 62 2e 20 20 2a 2f 0a 20 20 20 20  t blob.  */.    
28a80 20 20 20 20 68 69 6e 74 2e 6e 20 3d 20 6e 48 69      hint.n = nHi
28a90 6e 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nt;.      }.    
28aa0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 53 65  }..    /* If nSe
28ab0 67 20 69 73 20 6c 65 73 73 20 74 68 61 74 20 7a  g is less that z
28ac0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ero, then there 
28ad0 69 73 20 6e 6f 20 6c 65 76 65 6c 20 77 69 74 68  is no level with
28ae0 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 2a 2a   at least.    **
28af0 20 6e 4d 69 6e 20 73 65 67 6d 65 6e 74 73 20 61   nMin segments a
28b00 6e 64 20 6e 6f 20 68 69 6e 74 20 69 6e 20 74 68  nd no hint in th
28b10 65 20 25 5f 73 74 61 74 20 74 61 62 6c 65 2e 20  e %_stat table. 
28b20 4e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 2e 0a 20  No work to do.. 
28b30 20 20 20 2a 2a 20 45 78 69 74 20 65 61 72 6c 79     ** Exit early
28b40 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
28b50 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53 65 67 3c  */.    if( nSeg<
28b60 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  0 ) break;..    
28b70 2f 2a 20 4f 70 65 6e 20 61 20 63 75 72 73 6f 72  /* Open a cursor
28b80 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
28b90 75 67 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ugh the contents
28ba0 20 6f 66 20 74 68 65 20 6f 6c 64 65 73 74 20 6e   of the oldest n
28bb0 53 65 67 20 0a 20 20 20 20 2a 2a 20 69 6e 64 65  Seg .    ** inde
28bc0 78 65 73 20 6f 66 20 61 62 73 6f 6c 75 74 65 20  xes of absolute 
28bd0 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c 2e  level iAbsLevel.
28be0 20 49 66 20 74 68 69 73 20 63 75 72 73 6f 72 20   If this cursor 
28bf0 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  is opened using 
28c00 0a 20 20 20 20 2a 2a 20 74 68 65 20 27 68 69 6e  .    ** the 'hin
28c10 74 27 20 70 61 72 61 6d 65 74 65 72 73 2c 20 69  t' parameters, i
28c20 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
28c30 61 74 20 74 68 65 72 65 20 61 72 65 20 6c 65 73  at there are les
28c40 73 20 74 68 61 6e 20 6e 53 65 67 0a 20 20 20 20  s than nSeg.    
28c50 2a 2a 20 73 65 67 6d 65 6e 74 73 20 61 76 61 69  ** segments avai
28c60 6c 61 62 6c 65 20 69 6e 20 6c 65 76 65 6c 20 69  lable in level i
28c70 41 62 73 4c 65 76 65 6c 2e 20 49 6e 20 74 68 69  AbsLevel. In thi
28c80 73 20 63 61 73 65 2c 20 6e 6f 20 77 6f 72 6b 20  s case, no work 
28c90 69 73 0a 20 20 20 20 2a 2a 20 64 6f 6e 65 20 6f  is.    ** done o
28ca0 6e 20 69 41 62 73 4c 65 76 65 6c 20 2d 20 66 61  n iAbsLevel - fa
28cb0 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
28cc0 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
28cd0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 0a 20 20   of the loop .  
28ce0 20 20 2a 2a 20 74 6f 20 73 74 61 72 74 20 77 6f    ** to start wo
28cf0 72 6b 20 6f 6e 20 73 6f 6d 65 20 6f 74 68 65 72  rk on some other
28d00 20 6c 65 76 65 6c 2e 20 20 2a 2f 0a 20 20 20 20   level.  */.    
28d10 6d 65 6d 73 65 74 28 70 57 72 69 74 65 72 2c 20  memset(pWriter, 
28d20 30 2c 20 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  0, nAlloc);.    
28d30 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 3d  pFilter->flags =
28d40 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 52 45   FTS3_SEGMENT_RE
28d50 51 55 49 52 45 5f 50 4f 53 3b 0a 0a 20 20 20 20  QUIRE_POS;..    
28d60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28d70 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
28d80 66 74 73 33 49 6e 63 72 6d 65 72 67 65 4f 75 74  fts3IncrmergeOut
28d90 70 75 74 49 64 78 28 70 2c 20 69 41 62 73 4c 65  putIdx(p, iAbsLe
28da0 76 65 6c 2c 20 26 69 49 64 78 29 3b 0a 20 20 20  vel, &iIdx);.   
28db0 20 20 20 61 73 73 65 72 74 28 20 62 55 73 65 48     assert( bUseH
28dc0 69 6e 74 3d 3d 31 20 7c 7c 20 62 55 73 65 48 69  int==1 || bUseHi
28dd0 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  nt==0 );.      i
28de0 66 28 20 69 49 64 78 3d 3d 30 20 7c 7c 20 28 62  f( iIdx==0 || (b
28df0 55 73 65 48 69 6e 74 20 26 26 20 69 49 64 78 3d  UseHint && iIdx=
28e00 3d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  =1) ){.        i
28e10 6e 74 20 62 49 67 6e 6f 72 65 20 3d 20 30 3b 0a  nt bIgnore = 0;.
28e20 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
28e30 33 53 65 67 6d 65 6e 74 49 73 4d 61 78 4c 65 76  3SegmentIsMaxLev
28e40 65 6c 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 2b  el(p, iAbsLevel+
28e50 31 2c 20 26 62 49 67 6e 6f 72 65 29 3b 0a 20 20  1, &bIgnore);.  
28e60 20 20 20 20 20 20 69 66 28 20 62 49 67 6e 6f 72        if( bIgnor
28e70 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e ){.          p
28e80 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d  Filter->flags |=
28e90 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 49 47   FTS3_SEGMENT_IG
28ea0 4e 4f 52 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20  NORE_EMPTY;.    
28eb0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
28ec0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
28ed0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28ee0 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63      rc = fts3Inc
28ef0 72 6d 65 72 67 65 43 73 72 28 70 2c 20 69 41 62  rmergeCsr(p, iAb
28f00 73 4c 65 76 65 6c 2c 20 6e 53 65 67 2c 20 70 43  sLevel, nSeg, pC
28f10 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  sr);.    }.    i
28f20 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63  f( SQLITE_OK==rc
28f30 20 26 26 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65   && pCsr->nSegme
28f40 6e 74 3d 3d 6e 53 65 67 0a 20 20 20 20 20 26 26  nt==nSeg.     &&
28f50 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
28f60 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  = sqlite3Fts3Seg
28f70 52 65 61 64 65 72 53 74 61 72 74 28 70 2c 20 70  ReaderStart(p, p
28f80 43 73 72 2c 20 70 46 69 6c 74 65 72 29 29 0a 20  Csr, pFilter)). 
28f90 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 52 4f      && SQLITE_RO
28fa0 57 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  W==(rc = sqlite3
28fb0 46 74 73 33 53 65 67 52 65 61 64 65 72 53 74 65  Fts3SegReaderSte
28fc0 70 28 70 2c 20 70 43 73 72 29 29 0a 20 20 20 20  p(p, pCsr)).    
28fd0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 55 73  ){.      if( bUs
28fe0 65 48 69 6e 74 20 26 26 20 69 49 64 78 3e 30 20  eHint && iIdx>0 
28ff0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
29000 20 63 68 61 72 20 2a 7a 4b 65 79 20 3d 20 70 43   char *zKey = pC
29010 73 72 2d 3e 7a 54 65 72 6d 3b 0a 20 20 20 20 20  sr->zTerm;.     
29020 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 43     int nKey = pC
29030 73 72 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20  sr->nTerm;.     
29040 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72     rc = fts3Incr
29050 6d 65 72 67 65 4c 6f 61 64 28 70 2c 20 69 41 62  mergeLoad(p, iAb
29060 73 4c 65 76 65 6c 2c 20 69 49 64 78 2d 31 2c 20  sLevel, iIdx-1, 
29070 7a 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 57 72 69  zKey, nKey, pWri
29080 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ter);.      }els
29090 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
290a0 66 74 73 33 49 6e 63 72 6d 65 72 67 65 57 72 69  fts3IncrmergeWri
290b0 74 65 72 28 70 2c 20 69 41 62 73 4c 65 76 65 6c  ter(p, iAbsLevel
290c0 2c 20 69 49 64 78 2c 20 70 43 73 72 2c 20 70 57  , iIdx, pCsr, pW
290d0 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  riter);.      }.
290e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
290f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 57 72 69  QLITE_OK && pWri
29100 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74 20 29 7b  ter->nLeafEst ){
29110 0a 20 20 20 20 20 20 20 20 66 74 73 33 4c 6f 67  .        fts3Log
29120 4d 65 72 67 65 28 6e 53 65 67 2c 20 69 41 62 73  Merge(nSeg, iAbs
29130 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 20 20  Level);.        
29140 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72  do {.          r
29150 63 20 3d 20 66 74 73 33 49 6e 63 72 6d 65 72 67  c = fts3Incrmerg
29160 65 41 70 70 65 6e 64 28 70 2c 20 70 57 72 69 74  eAppend(p, pWrit
29170 65 72 2c 20 70 43 73 72 29 3b 0a 20 20 20 20 20  er, pCsr);.     
29180 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
29190 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71  ITE_OK ) rc = sq
291a0 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64  lite3Fts3SegRead
291b0 65 72 53 74 65 70 28 70 2c 20 70 43 73 72 29 3b  erStep(p, pCsr);
291c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
291d0 57 72 69 74 65 72 2d 3e 6e 57 6f 72 6b 3e 3d 6e  Writer->nWork>=n
291e0 52 65 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  Rem && rc==SQLIT
291f0 45 5f 52 4f 57 20 29 20 72 63 20 3d 20 53 51 4c  E_ROW ) rc = SQL
29200 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
29210 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
29220 54 45 5f 52 4f 57 20 29 3b 0a 0a 20 20 20 20 20  TE_ROW );..     
29230 20 20 20 2f 2a 20 55 70 64 61 74 65 20 6f 72 20     /* Update or 
29240 64 65 6c 65 74 65 20 74 68 65 20 69 6e 70 75 74  delete the input
29250 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   segments */.   
29260 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
29270 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29280 20 20 20 20 6e 52 65 6d 20 2d 3d 20 28 31 20 2b      nRem -= (1 +
29290 20 70 57 72 69 74 65 72 2d 3e 6e 57 6f 72 6b 29   pWriter->nWork)
292a0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
292b0 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 43 68   fts3IncrmergeCh
292c0 6f 6d 70 28 70 2c 20 69 41 62 73 4c 65 76 65 6c  omp(p, iAbsLevel
292d0 2c 20 70 43 73 72 2c 20 26 6e 53 65 67 29 3b 0a  , pCsr, &nSeg);.
292e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 53            if( nS
292f0 65 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  eg!=0 ){.       
29300 20 20 20 20 20 62 44 69 72 74 79 48 69 6e 74 20       bDirtyHint 
29310 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
29320 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 48 69   fts3IncrmergeHi
29330 6e 74 50 75 73 68 28 26 68 69 6e 74 2c 20 69 41  ntPush(&hint, iA
29340 62 73 4c 65 76 65 6c 2c 20 6e 53 65 67 2c 20 26  bsLevel, nSeg, &
29350 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rc);.          }
29360 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29370 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 53   }..      if( nS
29380 65 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  eg!=0 ){.       
29390 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44   pWriter->nLeafD
293a0 61 74 61 20 3d 20 70 57 72 69 74 65 72 2d 3e 6e  ata = pWriter->n
293b0 4c 65 61 66 44 61 74 61 20 2a 20 2d 31 3b 0a 20  LeafData * -1;. 
293c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73       }.      fts
293d0 33 49 6e 63 72 6d 65 72 67 65 52 65 6c 65 61 73  3IncrmergeReleas
293e0 65 28 70 2c 20 70 57 72 69 74 65 72 2c 20 26 72  e(p, pWriter, &r
293f0 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 53  c);.      if( nS
29400 65 67 3d 3d 30 20 26 26 20 70 57 72 69 74 65 72  eg==0 && pWriter
29410 2d 3e 62 4e 6f 4c 65 61 66 44 61 74 61 3d 3d 30  ->bNoLeafData==0
29420 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 33   ){.        fts3
29430 50 72 6f 6d 6f 74 65 53 65 67 6d 65 6e 74 73 28  PromoteSegments(
29440 70 2c 20 69 41 62 73 4c 65 76 65 6c 2b 31 2c 20  p, iAbsLevel+1, 
29450 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61  pWriter->nLeafDa
29460 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ta);.      }.   
29470 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46   }..    sqlite3F
29480 74 73 33 53 65 67 52 65 61 64 65 72 46 69 6e 69  ts3SegReaderFini
29490 73 68 28 70 43 73 72 29 3b 0a 20 20 7d 0a 0a 20  sh(pCsr);.  }.. 
294a0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 68 69   /* Write the hi
294b0 6e 74 20 76 61 6c 75 65 73 20 69 6e 74 6f 20 74  nt values into t
294c0 68 65 20 25 5f 73 74 61 74 20 74 61 62 6c 65 20  he %_stat table 
294d0 66 6f 72 20 74 68 65 20 6e 65 78 74 20 69 6e 63  for the next inc
294e0 72 2d 6d 65 72 67 65 72 20 2a 2f 0a 20 20 69 66  r-merger */.  if
294f0 28 20 62 44 69 72 74 79 48 69 6e 74 20 26 26 20  ( bDirtyHint && 
29500 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
29510 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e  .    rc = fts3In
29520 63 72 6d 65 72 67 65 48 69 6e 74 53 74 6f 72 65  crmergeHintStore
29530 28 70 2c 20 26 68 69 6e 74 29 3b 0a 20 20 7d 0a  (p, &hint);.  }.
29540 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
29550 70 57 72 69 74 65 72 29 3b 0a 20 20 73 71 6c 69  pWriter);.  sqli
29560 74 65 33 5f 66 72 65 65 28 68 69 6e 74 2e 61 29  te3_free(hint.a)
29570 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
29580 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
29590 74 68 65 20 74 65 78 74 20 62 65 67 69 6e 6e 69  the text beginni
295a0 6e 67 20 61 74 20 2a 70 7a 20 69 6e 74 6f 20 61  ng at *pz into a
295b0 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 20 72 65  n integer and re
295c0 74 75 72 6e 0a 2a 2a 20 69 74 73 20 76 61 6c 75  turn.** its valu
295d0 65 2e 20 20 41 64 76 61 6e 63 65 20 2a 70 7a 20  e.  Advance *pz 
295e0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
295f0 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20  first character 
29600 70 61 73 74 0a 2a 2a 20 74 68 65 20 69 6e 74 65  past.** the inte
29610 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ger..**.** This 
29620 66 75 6e 63 74 69 6f 6e 20 75 73 65 64 20 66 6f  function used fo
29630 72 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20  r parameters to 
29640 6d 65 72 67 65 3d 20 61 6e 64 20 69 6e 63 72 6d  merge= and incrm
29650 65 72 67 65 3d 0a 2a 2a 20 63 6f 6d 6d 61 6e 64  erge=.** command
29660 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  s. .*/.static in
29670 74 20 66 74 73 33 47 65 74 69 6e 74 28 63 6f 6e  t fts3Getint(con
29680 73 74 20 63 68 61 72 20 2a 2a 70 7a 29 7b 0a 20  st char **pz){. 
29690 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
296a0 20 2a 70 7a 3b 0a 20 20 69 6e 74 20 69 20 3d 20   *pz;.  int i = 
296b0 30 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a 7a 29  0;.  while( (*z)
296c0 3e 3d 27 30 27 20 26 26 20 28 2a 7a 29 3c 3d 27  >='0' && (*z)<='
296d0 39 27 20 26 26 20 69 3c 32 31 34 37 34 38 33 36  9' && i<21474836
296e0 33 20 29 20 69 20 3d 20 31 30 2a 69 20 2b 20 2a  3 ) i = 10*i + *
296f0 28 7a 2b 2b 29 20 2d 20 27 30 27 3b 0a 20 20 2a  (z++) - '0';.  *
29700 70 7a 20 3d 20 7a 3b 0a 20 20 72 65 74 75 72 6e  pz = z;.  return
29710 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f   i;.}../*.** Pro
29720 63 65 73 73 20 73 74 61 74 65 6d 65 6e 74 73 20  cess statements 
29730 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
29740 2a 2a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  **    INSERT INT
29750 4f 20 74 61 62 6c 65 28 74 61 62 6c 65 29 20 56  O table(table) V
29760 41 4c 55 45 53 28 27 6d 65 72 67 65 3d 41 2c 42  ALUES('merge=A,B
29770 27 29 3b 0a 2a 2a 0a 2a 2a 20 41 20 61 6e 64 20  ');.**.** A and 
29780 42 20 61 72 65 20 69 6e 74 65 67 65 72 73 20 74  B are integers t
29790 68 61 74 20 64 65 63 6f 64 65 20 74 6f 20 62 65  hat decode to be
297a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
297b0 65 61 66 20 70 61 67 65 73 0a 2a 2a 20 77 72 69  eaf pages.** wri
297c0 74 74 65 6e 20 66 6f 72 20 74 68 65 20 6d 65 72  tten for the mer
297d0 67 65 2c 20 61 6e 64 20 74 68 65 20 6d 69 6e 69  ge, and the mini
297e0 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  mum number of se
297f0 67 6d 65 6e 74 73 20 6f 6e 20 61 20 6c 65 76 65  gments on a leve
29800 6c 0a 2a 2a 20 62 65 66 6f 72 65 20 69 74 20 77  l.** before it w
29810 69 6c 6c 20 62 65 20 73 65 6c 65 63 74 65 64 20  ill be selected 
29820 66 6f 72 20 61 20 6d 65 72 67 65 2c 20 72 65 73  for a merge, res
29830 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 73 74  pectively..*/.st
29840 61 74 69 63 20 69 6e 74 20 66 74 73 33 44 6f 49  atic int fts3DoI
29850 6e 63 72 6d 65 72 67 65 28 0a 20 20 46 74 73 33  ncrmerge(.  Fts3
29860 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
29870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
29880 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  TS3 table handle
29890 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
298a0 20 2a 7a 50 61 72 61 6d 20 20 20 20 20 20 20 20   *zParam        
298b0 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72        /* Nul-ter
298c0 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63  minated string c
298d0 6f 6e 74 61 69 6e 69 6e 67 20 22 41 2c 42 22 20  ontaining "A,B" 
298e0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
298f0 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 28 46 54    int nMin = (FT
29900 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 20 2f  S3_MERGE_COUNT /
29910 20 32 29 3b 0a 20 20 69 6e 74 20 6e 4d 65 72 67   2);.  int nMerg
29920 65 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63  e = 0;.  const c
29930 68 61 72 20 2a 7a 20 3d 20 7a 50 61 72 61 6d 3b  har *z = zParam;
29940 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
29950 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 76 61  first integer va
29960 6c 75 65 20 2a 2f 0a 20 20 6e 4d 65 72 67 65 20  lue */.  nMerge 
29970 3d 20 66 74 73 33 47 65 74 69 6e 74 28 26 7a 29  = fts3Getint(&z)
29980 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66  ;..  /* If the f
29990 69 72 73 74 20 69 6e 74 65 67 65 72 20 76 61 6c  irst integer val
299a0 75 65 20 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62  ue is followed b
299b0 79 20 61 20 27 2c 27 2c 20 20 72 65 61 64 20 74  y a ',',  read t
299c0 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 69  he second.  ** i
299d0 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 20 2a 2f  nteger value. */
299e0 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2c 27  .  if( z[0]==','
299f0 20 26 26 20 7a 5b 31 5d 21 3d 27 5c 30 27 20 29   && z[1]!='\0' )
29a00 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 6e  {.    z++;.    n
29a10 4d 69 6e 20 3d 20 66 74 73 33 47 65 74 69 6e 74  Min = fts3Getint
29a20 28 26 7a 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  (&z);.  }..  if(
29a30 20 7a 5b 30 5d 21 3d 27 5c 30 27 20 7c 7c 20 6e   z[0]!='\0' || n
29a40 4d 69 6e 3c 32 20 29 7b 0a 20 20 20 20 72 63 20  Min<2 ){.    rc 
29a50 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
29a60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
29a70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
29a80 20 69 66 28 20 21 70 2d 3e 62 48 61 73 53 74 61   if( !p->bHasSta
29a90 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
29aa0 74 28 20 70 2d 3e 62 46 74 73 34 3d 3d 30 20 29  t( p->bFts4==0 )
29ab0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
29ac0 74 73 33 43 72 65 61 74 65 53 74 61 74 54 61 62  ts3CreateStatTab
29ad0 6c 65 28 26 72 63 2c 20 70 29 3b 0a 20 20 20 20  le(&rc, p);.    
29ae0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
29af0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29b00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
29b10 33 49 6e 63 72 6d 65 72 67 65 28 70 2c 20 6e 4d  3Incrmerge(p, nM
29b20 65 72 67 65 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20  erge, nMin);.   
29b30 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74   }.    sqlite3Ft
29b40 73 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28  s3SegmentsClose(
29b50 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
29b60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72   rc;.}../*.** Pr
29b70 6f 63 65 73 73 20 73 74 61 74 65 6d 65 6e 74 73  ocess statements
29b80 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
29b90 0a 2a 2a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .**    INSERT IN
29ba0 54 4f 20 74 61 62 6c 65 28 74 61 62 6c 65 29 20  TO table(table) 
29bb0 56 41 4c 55 45 53 28 27 61 75 74 6f 6d 65 72 67  VALUES('automerg
29bc0 65 3d 58 27 29 3b 0a 2a 2a 0a 2a 2a 20 77 68 65  e=X');.**.** whe
29bd0 72 65 20 58 20 69 73 20 61 6e 20 69 6e 74 65 67  re X is an integ
29be0 65 72 2e 20 20 58 3d 3d 30 20 6d 65 61 6e 73 20  er.  X==0 means 
29bf0 74 6f 20 74 75 72 6e 20 61 75 74 6f 6d 65 72 67  to turn automerg
29c00 65 20 6f 66 66 2e 20 20 58 21 3d 30 20 6d 65 61  e off.  X!=0 mea
29c10 6e 73 0a 2a 2a 20 74 75 72 6e 20 69 74 20 6f 6e  ns.** turn it on
29c20 2e 20 20 54 68 65 20 73 65 74 74 69 6e 67 20 69  .  The setting i
29c30 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f  s persistent..*/
29c40 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
29c50 44 6f 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 28  DoAutoincrmerge(
29c60 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
29c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c80 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65     /* FTS3 table
29c90 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e   handle */.  con
29ca0 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 20  st char *zParam 
29cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29cc0 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  Nul-terminated s
29cd0 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
29ce0 20 62 6f 6f 6c 65 61 6e 20 2a 2f 0a 29 7b 0a 20   boolean */.){. 
29cf0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
29d00 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  _OK;.  sqlite3_s
29d10 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
29d20 20 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d 65    p->nAutoincrme
29d30 72 67 65 20 3d 20 66 74 73 33 47 65 74 69 6e 74  rge = fts3Getint
29d40 28 26 7a 50 61 72 61 6d 29 3b 0a 20 20 69 66 28  (&zParam);.  if(
29d50 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d 65 72   p->nAutoincrmer
29d60 67 65 3d 3d 31 20 7c 7c 20 70 2d 3e 6e 41 75 74  ge==1 || p->nAut
29d70 6f 69 6e 63 72 6d 65 72 67 65 3e 46 54 53 33 5f  oincrmerge>FTS3_
29d80 4d 45 52 47 45 5f 43 4f 55 4e 54 20 29 7b 0a 20  MERGE_COUNT ){. 
29d90 20 20 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d     p->nAutoincrm
29da0 65 72 67 65 20 3d 20 38 3b 0a 20 20 7d 0a 20 20  erge = 8;.  }.  
29db0 69 66 28 20 21 70 2d 3e 62 48 61 73 53 74 61 74  if( !p->bHasStat
29dc0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
29dd0 70 2d 3e 62 46 74 73 34 3d 3d 30 20 29 3b 0a 20  p->bFts4==0 );. 
29de0 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 43 72     sqlite3Fts3Cr
29df0 65 61 74 65 53 74 61 74 54 61 62 6c 65 28 26 72  eateStatTable(&r
29e00 63 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 72  c, p);.    if( r
29e10 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
29e20 20 7d 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71   }.  rc = fts3Sq
29e30 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 52 45 50  lStmt(p, SQL_REP
29e40 4c 41 43 45 5f 53 54 41 54 2c 20 26 70 53 74 6d  LACE_STAT, &pStm
29e50 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  t, 0);.  if( rc 
29e60 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 73  ) return rc;.  s
29e70 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
29e80 70 53 74 6d 74 2c 20 31 2c 20 46 54 53 5f 53 54  pStmt, 1, FTS_ST
29e90 41 54 5f 41 55 54 4f 49 4e 43 52 4d 45 52 47 45  AT_AUTOINCRMERGE
29ea0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  );.  sqlite3_bin
29eb0 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32 2c 20  d_int(pStmt, 2, 
29ec0 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d 65 72 67  p->nAutoincrmerg
29ed0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  e);.  sqlite3_st
29ee0 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 72 63 20  ep(pStmt);.  rc 
29ef0 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
29f00 70 53 74 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e  pStmt);.  return
29f10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
29f20 74 75 72 6e 20 61 20 36 34 2d 62 69 74 20 63 68  turn a 64-bit ch
29f30 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 46  ecksum for the F
29f40 54 53 20 69 6e 64 65 78 20 65 6e 74 72 79 20 73  TS index entry s
29f50 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 0a  pecified by the.
29f60 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  ** arguments to 
29f70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
29f80 2f 0a 73 74 61 74 69 63 20 75 36 34 20 66 74 73  /.static u64 fts
29f90 33 43 68 65 63 6b 73 75 6d 45 6e 74 72 79 28 0a  3ChecksumEntry(.
29fa0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
29fb0 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
29fc0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
29fd0 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
29fe0 67 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  g term */.  int 
29ff0 6e 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  nTerm,          
2a000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2a010 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20  ize of zTerm in 
2a020 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  bytes */.  int i
2a030 4c 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20  Langid,         
2a040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
2a050 6e 67 75 61 67 65 20 69 64 20 66 6f 72 20 63 75  nguage id for cu
2a060 72 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 69  rrent row */.  i
2a070 6e 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20 20  nt iIndex,      
2a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a090 2a 20 49 6e 64 65 78 20 28 30 2e 2e 46 74 73 33  * Index (0..Fts3
2a0a0 54 61 62 6c 65 2e 6e 49 6e 64 65 78 2d 31 29 20  Table.nIndex-1) 
2a0b0 2a 2f 0a 20 20 69 36 34 20 69 44 6f 63 69 64 2c  */.  i64 iDocid,
2a0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0d0 20 20 20 20 20 2f 2a 20 44 6f 63 69 64 20 66 6f       /* Docid fo
2a0e0 72 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 2a  r current row. *
2a0f0 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  /.  int iCol,   
2a100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a110 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75      /* Column nu
2a120 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 50  mber */.  int iP
2a130 6f 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  os              
2a140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73            /* Pos
2a150 69 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ition */.){.  in
2a160 74 20 69 3b 0a 20 20 75 36 34 20 72 65 74 20 3d  t i;.  u64 ret =
2a170 20 28 75 36 34 29 69 44 6f 63 69 64 3b 0a 0a 20   (u64)iDocid;.. 
2a180 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29   ret += (ret<<3)
2a190 20 2b 20 69 4c 61 6e 67 69 64 3b 0a 20 20 72 65   + iLangid;.  re
2a1a0 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20  t += (ret<<3) + 
2a1b0 69 49 6e 64 65 78 3b 0a 20 20 72 65 74 20 2b 3d  iIndex;.  ret +=
2a1c0 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 43 6f 6c   (ret<<3) + iCol
2a1d0 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c  ;.  ret += (ret<
2a1e0 3c 33 29 20 2b 20 69 50 6f 73 3b 0a 20 20 66 6f  <3) + iPos;.  fo
2a1f0 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20  r(i=0; i<nTerm; 
2a200 69 2b 2b 29 20 72 65 74 20 2b 3d 20 28 72 65 74  i++) ret += (ret
2a210 3c 3c 33 29 20 2b 20 7a 54 65 72 6d 5b 69 5d 3b  <<3) + zTerm[i];
2a220 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  ..  return ret;.
2a230 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2a240 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 61 6c  a checksum of al
2a250 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  l entries in the
2a260 20 46 54 53 20 69 6e 64 65 78 20 74 68 61 74 20   FTS index that 
2a270 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 0a 2a 2a  correspond to.**
2a280 20 6c 61 6e 67 75 61 67 65 20 69 64 20 69 4c 61   language id iLa
2a290 6e 67 69 64 2e 20 54 68 65 20 63 68 65 63 6b 73  ngid. The checks
2a2a0 75 6d 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64  um is calculated
2a2b0 20 62 79 20 58 4f 52 69 6e 67 20 74 68 65 20 63   by XORing the c
2a2c0 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 6f 66 20 65  hecksums.** of e
2a2d0 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 65  ach individual e
2a2e0 6e 74 72 79 20 28 73 65 65 20 66 74 73 33 43 68  ntry (see fts3Ch
2a2f0 65 63 6b 73 75 6d 45 6e 74 72 79 28 29 29 20 74  ecksumEntry()) t
2a300 6f 67 65 74 68 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  ogether..**.** I
2a310 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  f successful, th
2a320 65 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  e checksum value
2a330 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
2a340 20 2a 70 52 63 20 73 65 74 20 74 6f 20 53 51 4c   *pRc set to SQL
2a350 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72  ITE_OK..** Other
2a360 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f  wise, if an erro
2a370 72 20 6f 63 63 75 72 73 2c 20 2a 70 52 63 20 69  r occurs, *pRc i
2a380 73 20 73 65 74 20 74 6f 20 61 6e 20 53 51 4c 69  s set to an SQLi
2a390 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54  te error code. T
2a3a0 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
2a3b0 75 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  ue is undefined 
2a3c0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
2a3d0 0a 73 74 61 74 69 63 20 75 36 34 20 66 74 73 33  .static u64 fts3
2a3e0 43 68 65 63 6b 73 75 6d 49 6e 64 65 78 28 0a 20  ChecksumIndex(. 
2a3f0 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
2a400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a410 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20 68   /* FTS3 table h
2a420 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  andle */.  int i
2a430 4c 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20  Langid,         
2a440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
2a450 6e 67 75 61 67 65 20 69 64 20 74 6f 20 72 65 74  nguage id to ret
2a460 75 72 6e 20 63 6b 73 75 6d 20 66 6f 72 20 2a 2f  urn cksum for */
2a470 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 2c 20 20  .  int iIndex,  
2a480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a490 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63     /* Index to c
2a4a0 6b 73 75 6d 20 28 30 2e 2e 70 2d 3e 6e 49 6e 64  ksum (0..p->nInd
2a4b0 65 78 2d 31 29 20 2a 2f 0a 20 20 69 6e 74 20 2a  ex-1) */.  int *
2a4c0 70 52 63 20 20 20 20 20 20 20 20 20 20 20 20 20  pRc             
2a4d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
2a4e0 54 3a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  T: Return code *
2a4f0 2f 0a 29 7b 0a 20 20 46 74 73 33 53 65 67 46 69  /.){.  Fts3SegFi
2a500 6c 74 65 72 20 66 69 6c 74 65 72 3b 0a 20 20 46  lter filter;.  F
2a510 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
2a520 72 20 63 73 72 3b 0a 20 20 69 6e 74 20 72 63 3b  r csr;.  int rc;
2a530 0a 20 20 75 36 34 20 63 6b 73 75 6d 20 3d 20 30  .  u64 cksum = 0
2a540 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52  ;..  assert( *pR
2a550 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
2a560 0a 20 20 6d 65 6d 73 65 74 28 26 66 69 6c 74 65  .  memset(&filte
2a570 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c  r, 0, sizeof(fil
2a580 74 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ter));.  memset(
2a590 26 63 73 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &csr, 0, sizeof(
2a5a0 63 73 72 29 29 3b 0a 20 20 66 69 6c 74 65 72 2e  csr));.  filter.
2a5b0 66 6c 61 67 73 20 3d 20 20 46 54 53 33 5f 53 45  flags =  FTS3_SE
2a5c0 47 4d 45 4e 54 5f 52 45 51 55 49 52 45 5f 50 4f  GMENT_REQUIRE_PO
2a5d0 53 7c 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 49  S|FTS3_SEGMENT_I
2a5e0 47 4e 4f 52 45 5f 45 4d 50 54 59 3b 0a 20 20 66  GNORE_EMPTY;.  f
2a5f0 69 6c 74 65 72 2e 66 6c 61 67 73 20 7c 3d 20 46  ilter.flags |= F
2a600 54 53 33 5f 53 45 47 4d 45 4e 54 5f 53 43 41 4e  TS3_SEGMENT_SCAN
2a610 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
2a620 33 46 74 73 33 53 65 67 52 65 61 64 65 72 43 75  3Fts3SegReaderCu
2a630 72 73 6f 72 28 0a 20 20 20 20 20 20 70 2c 20 69  rsor(.      p, i
2a640 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20  Langid, iIndex, 
2a650 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 41  FTS3_SEGCURSOR_A
2a660 4c 4c 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 26  LL, 0, 0, 0, 1,&
2a670 63 73 72 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  csr.  );.  if( r
2a680 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2a690 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a6a0 46 74 73 33 53 65 67 52 65 61 64 65 72 53 74 61  Fts3SegReaderSta
2a6b0 72 74 28 70 2c 20 26 63 73 72 2c 20 26 66 69 6c  rt(p, &csr, &fil
2a6c0 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ter);.  }..  if(
2a6d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2a6e0 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c  {.    while( SQL
2a6f0 49 54 45 5f 52 4f 57 3d 3d 28 72 63 20 3d 20 73  ITE_ROW==(rc = s
2a700 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61  qlite3Fts3SegRea
2a710 64 65 72 53 74 65 70 28 70 2c 20 26 63 73 72 29  derStep(p, &csr)
2a720 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ) ){.      char 
2a730 2a 70 43 73 72 20 3d 20 63 73 72 2e 61 44 6f 63  *pCsr = csr.aDoc
2a740 6c 69 73 74 3b 0a 20 20 20 20 20 20 63 68 61 72  list;.      char
2a750 20 2a 70 45 6e 64 20 3d 20 26 70 43 73 72 5b 63   *pEnd = &pCsr[c
2a760 73 72 2e 6e 44 6f 63 6c 69 73 74 5d 3b 0a 0a 20  sr.nDoclist];.. 
2a770 20 20 20 20 20 69 36 34 20 69 44 6f 63 69 64 20       i64 iDocid 
2a780 3d 20 30 3b 0a 20 20 20 20 20 20 69 36 34 20 69  = 0;.      i64 i
2a790 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  Col = 0;.      i
2a7a0 36 34 20 69 50 6f 73 20 3d 20 30 3b 0a 0a 20 20  64 iPos = 0;..  
2a7b0 20 20 20 20 70 43 73 72 20 2b 3d 20 73 71 6c 69      pCsr += sqli
2a7c0 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74  te3Fts3GetVarint
2a7d0 28 70 43 73 72 2c 20 26 69 44 6f 63 69 64 29 3b  (pCsr, &iDocid);
2a7e0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43  .      while( pC
2a7f0 73 72 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  sr<pEnd ){.     
2a800 20 20 20 69 36 34 20 69 56 61 6c 20 3d 20 30 3b     i64 iVal = 0;
2a810 0a 20 20 20 20 20 20 20 20 70 43 73 72 20 2b 3d  .        pCsr +=
2a820 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56   sqlite3Fts3GetV
2a830 61 72 69 6e 74 28 70 43 73 72 2c 20 26 69 56 61  arint(pCsr, &iVa
2a840 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
2a850 70 43 73 72 3c 70 45 6e 64 20 29 7b 0a 20 20 20  pCsr<pEnd ){.   
2a860 20 20 20 20 20 20 20 69 66 28 20 69 56 61 6c 3d         if( iVal=
2a870 3d 30 20 7c 7c 20 69 56 61 6c 3d 3d 31 20 29 7b  =0 || iVal==1 ){
2a880 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f  .            iCo
2a890 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  l = 0;.         
2a8a0 20 20 20 69 50 6f 73 20 3d 20 30 3b 0a 20 20 20     iPos = 0;.   
2a8b0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 56 61           if( iVa
2a8c0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
2a8d0 20 20 20 70 43 73 72 20 2b 3d 20 73 71 6c 69 74     pCsr += sqlit
2a8e0 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28  e3Fts3GetVarint(
2a8f0 70 43 73 72 2c 20 26 69 43 6f 6c 29 3b 0a 20 20  pCsr, &iCol);.  
2a900 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2a910 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2a920 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  Csr += sqlite3Ft
2a930 73 33 47 65 74 56 61 72 69 6e 74 28 70 43 73 72  s3GetVarint(pCsr
2a940 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 20 20  , &iVal);.      
2a950 20 20 20 20 20 20 20 20 69 44 6f 63 69 64 20 2b          iDocid +
2a960 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 20 20  = iVal;.        
2a970 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2a980 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2a990 20 20 20 69 50 6f 73 20 2b 3d 20 28 69 56 61 6c     iPos += (iVal
2a9a0 20 2d 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20   - 2);.         
2a9b0 20 20 20 63 6b 73 75 6d 20 3d 20 63 6b 73 75 6d     cksum = cksum
2a9c0 20 5e 20 66 74 73 33 43 68 65 63 6b 73 75 6d 45   ^ fts3ChecksumE
2a9d0 6e 74 72 79 28 0a 20 20 20 20 20 20 20 20 20 20  ntry(.          
2a9e0 20 20 20 20 20 20 63 73 72 2e 7a 54 65 72 6d 2c        csr.zTerm,
2a9f0 20 63 73 72 2e 6e 54 65 72 6d 2c 20 69 4c 61 6e   csr.nTerm, iLan
2aa00 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 44 6f  gid, iIndex, iDo
2aa10 63 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cid,.           
2aa20 20 20 20 20 20 28 69 6e 74 29 69 43 6f 6c 2c 20       (int)iCol, 
2aa30 28 69 6e 74 29 69 50 6f 73 0a 20 20 20 20 20 20  (int)iPos.      
2aa40 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
2aa50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2aa60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2aa70 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65  .  sqlite3Fts3Se
2aa80 67 52 65 61 64 65 72 46 69 6e 69 73 68 28 26 63  gReaderFinish(&c
2aa90 73 72 29 3b 0a 0a 20 20 2a 70 52 63 20 3d 20 72  sr);..  *pRc = r
2aaa0 63 3b 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75  c;.  return cksu
2aab0 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  m;.}../*.** Chec
2aac0 6b 20 69 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  k if the content
2aad0 73 20 6f 66 20 74 68 65 20 46 54 53 20 69 6e 64  s of the FTS ind
2aae0 65 78 20 6d 61 74 63 68 20 74 68 65 20 63 75 72  ex match the cur
2aaf0 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66  rent contents of
2ab00 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
2ab10 74 61 62 6c 65 2e 20 49 66 20 6e 6f 20 65 72 72  table. If no err
2ab20 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  or occurs and th
2ab30 65 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6d 61  e contents do ma
2ab40 74 63 68 2c 20 73 65 74 20 2a 70 62 4f 6b 0a 2a  tch, set *pbOk.*
2ab50 2a 20 74 6f 20 74 72 75 65 20 61 6e 64 20 72 65  * to true and re
2ab60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
2ab70 4f 72 20 69 66 20 74 68 65 20 63 6f 6e 74 65 6e  Or if the conten
2ab80 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2c  ts do not match,
2ab90 20 73 65 74 20 2a 70 62 4f 6b 0a 2a 2a 20 74 6f   set *pbOk.** to
2aba0 20 66 61 6c 73 65 20 62 65 66 6f 72 65 20 72 65   false before re
2abb0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
2abc0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2abd0 73 20 28 65 2e 67 2e 20 61 6e 20 4f 4f 4d 20 6f  s (e.g. an OOM o
2abe0 72 20 49 4f 20 65 72 72 6f 72 29 2c 20 72 65 74  r IO error), ret
2abf0 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
2ac00 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 2e 20 54 68  ror .** code. Th
2ac10 65 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  e final value of
2ac20 20 2a 70 62 4f 6b 20 69 73 20 75 6e 64 65 66 69   *pbOk is undefi
2ac30 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ned in this case
2ac40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2ac50 66 74 73 33 49 6e 74 65 67 72 69 74 79 43 68 65  fts3IntegrityChe
2ac60 63 6b 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  ck(Fts3Table *p,
2ac70 20 69 6e 74 20 2a 70 62 4f 6b 29 7b 0a 20 20 69   int *pbOk){.  i
2ac80 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2ac90 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
2aca0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2acb0 0a 20 20 75 36 34 20 63 6b 73 75 6d 31 20 3d 20  .  u64 cksum1 = 
2acc0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2acd0 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62     /* Checksum b
2ace0 61 73 65 64 20 6f 6e 20 46 54 53 20 69 6e 64 65  ased on FTS inde
2acf0 78 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20  x contents */.  
2ad00 75 36 34 20 63 6b 73 75 6d 32 20 3d 20 30 3b 20  u64 cksum2 = 0; 
2ad10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65  /* Checksum base
2ad30 64 20 6f 6e 20 25 5f 63 6f 6e 74 65 6e 74 20 63  d on %_content c
2ad40 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 73 71 6c  ontents */.  sql
2ad50 69 74 65 33 5f 73 74 6d 74 20 2a 70 41 6c 6c 4c  ite3_stmt *pAllL
2ad60 61 6e 67 69 64 20 3d 20 30 3b 20 20 20 2f 2a 20  angid = 0;   /* 
2ad70 53 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 65 74  Statement to ret
2ad80 75 72 6e 20 61 6c 6c 20 6c 61 6e 67 75 61 67 65  urn all language
2ad90 2d 69 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  -ids */..  /* Th
2ada0 69 73 20 62 6c 6f 63 6b 20 63 61 6c 63 75 6c 61  is block calcula
2adb0 74 65 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d  tes the checksum
2adc0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
2add0 65 20 46 54 53 20 69 6e 64 65 78 2e 20 2a 2f 0a  e FTS index. */.
2ade0 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
2adf0 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54  mt(p, SQL_SELECT
2ae00 5f 41 4c 4c 5f 4c 41 4e 47 49 44 2c 20 26 70 41  _ALL_LANGID, &pA
2ae10 6c 6c 4c 61 6e 67 69 64 2c 20 30 29 3b 0a 20 20  llLangid, 0);.  
2ae20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2ae30 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  K ){.    int rc2
2ae40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
2ae50 6e 64 5f 69 6e 74 28 70 41 6c 6c 4c 61 6e 67 69  nd_int(pAllLangi
2ae60 64 2c 20 31 2c 20 70 2d 3e 69 50 72 65 76 4c 61  d, 1, p->iPrevLa
2ae70 6e 67 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ngid);.    sqlit
2ae80 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 41 6c 6c  e3_bind_int(pAll
2ae90 4c 61 6e 67 69 64 2c 20 32 2c 20 70 2d 3e 6e 49  Langid, 2, p->nI
2aea0 6e 64 65 78 29 3b 0a 20 20 20 20 77 68 69 6c 65  ndex);.    while
2aeb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2aec0 26 26 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  && sqlite3_step(
2aed0 70 41 6c 6c 4c 61 6e 67 69 64 29 3d 3d 53 51 4c  pAllLangid)==SQL
2aee0 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
2aef0 20 69 6e 74 20 69 4c 61 6e 67 69 64 20 3d 20 73   int iLangid = s
2af00 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
2af10 74 28 70 41 6c 6c 4c 61 6e 67 69 64 2c 20 30 29  t(pAllLangid, 0)
2af20 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
2af30 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2af40 70 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b 29 7b  p->nIndex; i++){
2af50 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 31 20  .        cksum1 
2af60 3d 20 63 6b 73 75 6d 31 20 5e 20 66 74 73 33 43  = cksum1 ^ fts3C
2af70 68 65 63 6b 73 75 6d 49 6e 64 65 78 28 70 2c 20  hecksumIndex(p, 
2af80 69 4c 61 6e 67 69 64 2c 20 69 2c 20 26 72 63 29  iLangid, i, &rc)
2af90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2afa0 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
2afb0 33 5f 72 65 73 65 74 28 70 41 6c 6c 4c 61 6e 67  3_reset(pAllLang
2afc0 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  id);.    if( rc=
2afd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
2afe0 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  = rc2;.  }..  /*
2aff0 20 54 68 69 73 20 62 6c 6f 63 6b 20 63 61 6c 63   This block calc
2b000 75 6c 61 74 65 73 20 74 68 65 20 63 68 65 63 6b  ulates the check
2b010 73 75 6d 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  sum according to
2b020 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74   the %_content t
2b030 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 72 63  able */.  if( rc
2b040 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b050 20 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e     sqlite3_token
2b060 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73  izer_module cons
2b070 74 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 2d 3e  t *pModule = p->
2b080 70 54 6f 6b 65 6e 69 7a 65 72 2d 3e 70 4d 6f 64  pTokenizer->pMod
2b090 75 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ule;.    sqlite3
2b0a0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
2b0b0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c  ;.    char *zSql
2b0c0 3b 0a 20 20 20 0a 20 20 20 20 7a 53 71 6c 20 3d  ;.   .    zSql =
2b0d0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2b0e0 28 22 53 45 4c 45 43 54 20 25 73 22 20 2c 20 70  ("SELECT %s" , p
2b0f0 2d 3e 7a 52 65 61 64 45 78 70 72 6c 69 73 74 29  ->zReadExprlist)
2b100 3b 0a 20 20 20 20 69 66 28 20 21 7a 53 71 6c 20  ;.    if( !zSql 
2b110 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
2b120 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2b130 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2b140 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
2b150 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
2b160 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
2b170 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2b180 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
2b190 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  }..    while( rc
2b1a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
2b1b0 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
2b1c0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
2b1d0 7b 0a 20 20 20 20 20 20 69 36 34 20 69 44 6f 63  {.      i64 iDoc
2b1e0 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  id = sqlite3_col
2b1f0 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
2b200 20 30 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69   0);.      int i
2b210 4c 61 6e 67 20 3d 20 6c 61 6e 67 69 64 46 72 6f  Lang = langidFro
2b220 6d 53 65 6c 65 63 74 28 70 2c 20 70 53 74 6d 74  mSelect(p, pStmt
2b230 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  );.      int iCo
2b240 6c 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 43  l;..      for(iC
2b250 6f 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ol=0; rc==SQLITE
2b260 5f 4f 4b 20 26 26 20 69 43 6f 6c 3c 70 2d 3e 6e  _OK && iCol<p->n
2b270 43 6f 6c 75 6d 6e 3b 20 69 43 6f 6c 2b 2b 29 7b  Column; iCol++){
2b280 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
2b290 61 62 4e 6f 74 69 6e 64 65 78 65 64 5b 69 43 6f  abNotindexed[iCo
2b2a0 6c 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l]==0 ){.       
2b2b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2b2c0 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63 68  Text = (const ch
2b2d0 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  ar *)sqlite3_col
2b2e0 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
2b2f0 69 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20 20  iCol+1);.       
2b300 20 20 20 69 6e 74 20 6e 54 65 78 74 20 3d 20 73     int nText = s
2b310 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
2b320 74 65 73 28 70 53 74 6d 74 2c 20 69 43 6f 6c 2b  tes(pStmt, iCol+
2b330 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  1);.          sq
2b340 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
2b350 63 75 72 73 6f 72 20 2a 70 54 20 3d 20 30 3b 0a  cursor *pT = 0;.
2b360 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2b370 73 71 6c 69 74 65 33 46 74 73 33 4f 70 65 6e 54  sqlite3Fts3OpenT
2b380 6f 6b 65 6e 69 7a 65 72 28 70 2d 3e 70 54 6f 6b  okenizer(p->pTok
2b390 65 6e 69 7a 65 72 2c 20 69 4c 61 6e 67 2c 20 7a  enizer, iLang, z
2b3a0 54 65 78 74 2c 20 6e 54 65 78 74 2c 26 70 54 29  Text, nText,&pT)
2b3b0 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  ;.          whil
2b3c0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
2b3d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b3e0 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 6f 6b  char const *zTok
2b3f0 65 6e 3b 20 20 20 20 20 20 20 2f 2a 20 42 75 66  en;       /* Buf
2b400 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
2b410 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  oken */.        
2b420 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 3d      int nToken =
2b430 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
2b440 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2b450 20 69 6e 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20   in token */.   
2b460 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 75           int iDu
2b470 6d 31 20 3d 20 30 2c 20 69 44 75 6d 32 20 3d 20  m1 = 0, iDum2 = 
2b480 30 3b 20 2f 2a 20 44 75 6d 6d 79 20 76 61 72 69  0; /* Dummy vari
2b490 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  ables */.       
2b4a0 20 20 20 20 20 69 6e 74 20 69 50 6f 73 20 3d 20       int iPos = 
2b4b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2b4c0 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f  * Position of to
2b4d0 6b 65 6e 20 69 6e 20 7a 54 65 78 74 20 2a 2f 0a  ken in zText */.
2b4e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2b4f0 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78 74  = pModule->xNext
2b500 28 70 54 2c 20 26 7a 54 6f 6b 65 6e 2c 20 26 6e  (pT, &zToken, &n
2b510 54 6f 6b 65 6e 2c 20 26 69 44 75 6d 31 2c 20 26  Token, &iDum1, &
2b520 69 44 75 6d 32 2c 20 26 69 50 6f 73 29 3b 0a 20  iDum2, &iPos);. 
2b530 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
2b540 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2b550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
2b560 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t i;.           
2b570 20 20 20 63 6b 73 75 6d 32 20 3d 20 63 6b 73 75     cksum2 = cksu
2b580 6d 32 20 5e 20 66 74 73 33 43 68 65 63 6b 73 75  m2 ^ fts3Checksu
2b590 6d 45 6e 74 72 79 28 0a 20 20 20 20 20 20 20 20  mEntry(.        
2b5a0 20 20 20 20 20 20 20 20 20 20 7a 54 6f 6b 65 6e            zToken
2b5b0 2c 20 6e 54 6f 6b 65 6e 2c 20 69 4c 61 6e 67 2c  , nToken, iLang,
2b5c0 20 30 2c 20 69 44 6f 63 69 64 2c 20 69 43 6f 6c   0, iDocid, iCol
2b5d0 2c 20 69 50 6f 73 0a 20 20 20 20 20 20 20 20 20  , iPos.         
2b5e0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
2b5f0 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
2b600 3c 70 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b 29  <p->nIndex; i++)
2b610 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2b620 20 20 69 66 28 20 70 2d 3e 61 49 6e 64 65 78 5b    if( p->aIndex[
2b630 69 5d 2e 6e 50 72 65 66 69 78 3c 3d 6e 54 6f 6b  i].nPrefix<=nTok
2b640 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
2b650 20 20 20 20 20 20 20 20 63 6b 73 75 6d 32 20 3d          cksum2 =
2b660 20 63 6b 73 75 6d 32 20 5e 20 66 74 73 33 43 68   cksum2 ^ fts3Ch
2b670 65 63 6b 73 75 6d 45 6e 74 72 79 28 0a 20 20 20  ecksumEntry(.   
2b680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b690 20 20 20 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 61 49     zToken, p->aI
2b6a0 6e 64 65 78 5b 69 5d 2e 6e 50 72 65 66 69 78 2c  ndex[i].nPrefix,
2b6b0 20 69 4c 61 6e 67 2c 20 69 2c 20 69 44 6f 63 69   iLang, i, iDoci
2b6c0 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 0a 20 20  d, iCol, iPos.  
2b6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b6e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2b6f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2b700 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2b710 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2b720 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 20           if( pT 
2b730 29 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73  ) pModule->xClos
2b740 65 28 70 54 29 3b 0a 20 20 20 20 20 20 20 20 20  e(pT);.         
2b750 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b760 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49  DONE ) rc = SQLI
2b770 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  TE_OK;.        }
2b780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2b790 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
2b7a0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d  lize(pStmt);.  }
2b7b0 0a 0a 20 20 2a 70 62 4f 6b 20 3d 20 28 63 6b 73  ..  *pbOk = (cks
2b7c0 75 6d 31 3d 3d 63 6b 73 75 6d 32 29 3b 0a 20 20  um1==cksum2);.  
2b7d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2b7e0 0a 2a 2a 20 52 75 6e 20 74 68 65 20 69 6e 74 65  .** Run the inte
2b7f0 67 72 69 74 79 2d 63 68 65 63 6b 2e 20 49 66 20  grity-check. If 
2b800 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  no error occurs 
2b810 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  and the current 
2b820 63 6f 6e 74 65 6e 74 73 20 6f 66 0a 2a 2a 20 74  contents of.** t
2b830 68 65 20 46 54 53 20 69 6e 64 65 78 20 61 72 65  he FTS index are
2b840 20 63 6f 72 72 65 63 74 2c 20 72 65 74 75 72 6e   correct, return
2b850 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 72 2c 20   SQLITE_OK. Or, 
2b860 69 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  if the contents 
2b870 6f 66 20 74 68 65 0a 2a 2a 20 46 54 53 20 69 6e  of the.** FTS in
2b880 64 65 78 20 61 72 65 20 69 6e 63 6f 72 72 65 63  dex are incorrec
2b890 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
2b8a0 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 2e 0a 2a  _CORRUPT_VTAB..*
2b8b0 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 61 6e 20 65  *.** Or, if an e
2b8c0 72 72 6f 72 20 28 65 2e 67 2e 20 61 6e 20 4f 4f  rror (e.g. an OO
2b8d0 4d 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 6f  M or IO error) o
2b8e0 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e  ccurs, return an
2b8f0 20 53 51 4c 69 74 65 20 0a 2a 2a 20 65 72 72 6f   SQLite .** erro
2b900 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r code..**.** Th
2b910 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63  e integrity-chec
2b920 6b 20 77 6f 72 6b 73 20 61 73 20 66 6f 6c 6c 6f  k works as follo
2b930 77 73 2e 20 46 6f 72 20 65 61 63 68 20 74 6f 6b  ws. For each tok
2b940 65 6e 20 61 6e 64 20 69 6e 64 65 78 65 64 20 74  en and indexed t
2b950 6f 6b 65 6e 0a 2a 2a 20 70 72 65 66 69 78 20 69  oken.** prefix i
2b960 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 73  n the document s
2b970 65 74 2c 20 61 20 36 34 2d 62 69 74 20 63 68 65  et, a 64-bit che
2b980 63 6b 73 75 6d 20 69 73 20 63 61 6c 63 75 6c 61  cksum is calcula
2b990 74 65 64 20 28 62 79 20 63 6f 64 65 0a 2a 2a 20  ted (by code.** 
2b9a0 69 6e 20 66 74 73 33 43 68 65 63 6b 73 75 6d 45  in fts3ChecksumE
2b9b0 6e 74 72 79 28 29 29 20 62 61 73 65 64 20 6f 6e  ntry()) based on
2b9c0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
2b9d0 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20 54 68 65 20  **.**     + The 
2b9e0 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 28 30 20  index number (0 
2b9f0 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 69 6e 64  for the main ind
2ba00 65 78 2c 20 31 20 66 6f 72 20 74 68 65 20 66 69  ex, 1 for the fi
2ba10 72 73 74 20 70 72 65 66 69 78 0a 2a 2a 20 20 20  rst prefix.**   
2ba20 20 20 20 20 69 6e 64 65 78 20 65 74 63 2e 29 2c      index etc.),
2ba30 0a 2a 2a 20 20 20 20 20 2b 20 54 68 65 20 74 6f  .**     + The to
2ba40 6b 65 6e 20 28 6f 72 20 74 6f 6b 65 6e 20 70 72  ken (or token pr
2ba50 65 66 69 78 29 20 74 65 78 74 20 69 74 73 65 6c  efix) text itsel
2ba60 66 2c 20 0a 2a 2a 20 20 20 20 20 2b 20 54 68 65  f, .**     + The
2ba70 20 6c 61 6e 67 75 61 67 65 2d 69 64 20 6f 66 20   language-id of 
2ba80 74 68 65 20 72 6f 77 20 69 74 20 61 70 70 65 61  the row it appea
2ba90 72 73 20 69 6e 2c 0a 2a 2a 20 20 20 20 20 2b 20  rs in,.**     + 
2baa0 54 68 65 20 64 6f 63 69 64 20 6f 66 20 74 68 65  The docid of the
2bab0 20 72 6f 77 20 69 74 20 61 70 70 65 61 72 73 20   row it appears 
2bac0 69 6e 2c 0a 2a 2a 20 20 20 20 20 2b 20 54 68 65  in,.**     + The
2bad0 20 63 6f 6c 75 6d 6e 20 69 74 20 61 70 70 65 61   column it appea
2bae0 72 73 20 69 6e 2c 20 61 6e 64 0a 2a 2a 20 20 20  rs in, and.**   
2baf0 20 20 2b 20 54 68 65 20 74 6f 6b 65 6e 73 20 70    + The tokens p
2bb00 6f 73 69 74 69 6f 6e 20 77 69 74 68 69 6e 20 74  osition within t
2bb10 68 61 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a  hat column..**.*
2bb20 2a 20 54 68 65 20 63 68 65 63 6b 73 75 6d 73 20  * The checksums 
2bb30 66 6f 72 20 61 6c 6c 20 65 6e 74 72 69 65 73 20  for all entries 
2bb40 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72 65  in the index are
2bb50 20 58 4f 52 65 64 20 74 6f 67 65 74 68 65 72 20   XORed together 
2bb60 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20 61 20 73  to create.** a s
2bb70 69 6e 67 6c 65 20 63 68 65 63 6b 73 75 6d 20 66  ingle checksum f
2bb80 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 69 6e  or the entire in
2bb90 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  dex..**.** The i
2bba0 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 63  ntegrity-check c
2bbb0 6f 64 65 20 63 61 6c 63 75 6c 61 74 65 73 20 74  ode calculates t
2bbc0 68 65 20 73 61 6d 65 20 63 68 65 63 6b 73 75 6d  he same checksum
2bbd0 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a 2a   in two ways:.**
2bbe0 0a 2a 2a 20 20 20 20 20 31 2e 20 42 79 20 73 63  .**     1. By sc
2bbf0 61 6e 6e 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  anning the conte
2bc00 6e 74 73 20 6f 66 20 74 68 65 20 46 54 53 20 69  nts of the FTS i
2bc10 6e 64 65 78 2c 20 61 6e 64 20 0a 2a 2a 20 20 20  ndex, and .**   
2bc20 20 20 32 2e 20 42 79 20 73 63 61 6e 6e 69 6e 67    2. By scanning
2bc30 20 61 6e 64 20 74 6f 6b 65 6e 69 7a 69 6e 67 20   and tokenizing 
2bc40 74 68 65 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c  the content tabl
2bc50 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
2bc60 74 77 6f 20 63 68 65 63 6b 73 75 6d 73 20 61 72  two checksums ar
2bc70 65 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65  e identical, the
2bc80 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b   integrity-check
2bc90 20 69 73 20 64 65 65 6d 65 64 20 74 6f 20 68 61   is deemed to ha
2bca0 76 65 0a 2a 2a 20 70 61 73 73 65 64 2e 0a 2a 2f  ve.** passed..*/
2bcb0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
2bcc0 44 6f 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  DoIntegrityCheck
2bcd0 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
2bce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bcf0 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c      /* FTS3 tabl
2bd00 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a 20  e handle */.){. 
2bd10 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62   int rc;.  int b
2bd20 4f 6b 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 66  Ok = 0;.  rc = f
2bd30 74 73 33 49 6e 74 65 67 72 69 74 79 43 68 65 63  ts3IntegrityChec
2bd40 6b 28 70 2c 20 26 62 4f 6b 29 3b 0a 20 20 69 66  k(p, &bOk);.  if
2bd50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2bd60 26 26 20 62 4f 6b 3d 3d 30 20 29 20 72 63 20 3d  && bOk==0 ) rc =
2bd70 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41   FTS_CORRUPT_VTA
2bd80 42 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  B;.  return rc;.
2bd90 7d 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20  }../*.** Handle 
2bda0 61 20 27 73 70 65 63 69 61 6c 27 20 49 4e 53 45  a 'special' INSE
2bdb0 52 54 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  RT of the form:.
2bdc0 2a 2a 0a 2a 2a 20 20 20 22 49 4e 53 45 52 54 20  **.**   "INSERT 
2bdd0 49 4e 54 4f 20 74 62 6c 28 74 62 6c 29 20 56 41  INTO tbl(tbl) VA
2bde0 4c 55 45 53 28 3c 65 78 70 72 3e 29 22 0a 2a 2a  LUES(<expr>)".**
2bdf0 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 56 61  .** Argument pVa
2be00 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72  l contains the r
2be10 65 73 75 6c 74 20 6f 66 20 3c 65 78 70 72 3e 2e  esult of <expr>.
2be20 20 43 75 72 72 65 6e 74 6c 79 20 74 68 65 20 6f   Currently the o
2be30 6e 6c 79 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 66  nly .** meaningf
2be40 75 6c 20 76 61 6c 75 65 20 74 6f 20 69 6e 73 65  ul value to inse
2be50 72 74 20 69 73 20 74 68 65 20 74 65 78 74 20 27  rt is the text '
2be60 6f 70 74 69 6d 69 7a 65 27 2e 0a 2a 2f 0a 73 74  optimize'..*/.st
2be70 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 70 65  atic int fts3Spe
2be80 63 69 61 6c 49 6e 73 65 72 74 28 46 74 73 33 54  cialInsert(Fts3T
2be90 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74 65 33  able *p, sqlite3
2bea0 5f 76 61 6c 75 65 20 2a 70 56 61 6c 29 7b 0a 20  _value *pVal){. 
2beb0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2bec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bed0 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
2bee0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2bef0 2a 7a 56 61 6c 20 3d 20 28 63 6f 6e 73 74 20 63  *zVal = (const c
2bf00 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  har *)sqlite3_va
2bf10 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a  lue_text(pVal);.
2bf20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c    int nVal = sql
2bf30 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
2bf40 28 70 56 61 6c 29 3b 0a 0a 20 20 69 66 28 20 21  (pVal);..  if( !
2bf50 7a 56 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  zVal ){.    retu
2bf60 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2bf70 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 61  .  }else if( nVa
2bf80 6c 3d 3d 38 20 26 26 20 30 3d 3d 73 71 6c 69 74  l==8 && 0==sqlit
2bf90 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c  e3_strnicmp(zVal
2bfa0 2c 20 22 6f 70 74 69 6d 69 7a 65 22 2c 20 38 29  , "optimize", 8)
2bfb0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
2bfc0 33 44 6f 4f 70 74 69 6d 69 7a 65 28 70 2c 20 30  3DoOptimize(p, 0
2bfd0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  );.  }else if( n
2bfe0 56 61 6c 3d 3d 37 20 26 26 20 30 3d 3d 73 71 6c  Val==7 && 0==sql
2bff0 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56  ite3_strnicmp(zV
2c000 61 6c 2c 20 22 72 65 62 75 69 6c 64 22 2c 20 37  al, "rebuild", 7
2c010 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  ) ){.    rc = ft
2c020 73 33 44 6f 52 65 62 75 69 6c 64 28 70 29 3b 0a  s3DoRebuild(p);.
2c030 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 61 6c    }else if( nVal
2c040 3d 3d 31 35 20 26 26 20 30 3d 3d 73 71 6c 69 74  ==15 && 0==sqlit
2c050 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c  e3_strnicmp(zVal
2c060 2c 20 22 69 6e 74 65 67 72 69 74 79 2d 63 68 65  , "integrity-che
2c070 63 6b 22 2c 20 31 35 29 20 29 7b 0a 20 20 20 20  ck", 15) ){.    
2c080 72 63 20 3d 20 66 74 73 33 44 6f 49 6e 74 65 67  rc = fts3DoInteg
2c090 72 69 74 79 43 68 65 63 6b 28 70 29 3b 0a 20 20  rityCheck(p);.  
2c0a0 7d 65 6c 73 65 20 69 66 28 20 6e 56 61 6c 3e 36  }else if( nVal>6
2c0b0 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73   && 0==sqlite3_s
2c0c0 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22 6d  trnicmp(zVal, "m
2c0d0 65 72 67 65 3d 22 2c 20 36 29 20 29 7b 0a 20 20  erge=", 6) ){.  
2c0e0 20 20 72 63 20 3d 20 66 74 73 33 44 6f 49 6e 63    rc = fts3DoInc
2c0f0 72 6d 65 72 67 65 28 70 2c 20 26 7a 56 61 6c 5b  rmerge(p, &zVal[
2c100 36 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  6]);.  }else if(
2c110 20 6e 56 61 6c 3e 31 30 20 26 26 20 30 3d 3d 73   nVal>10 && 0==s
2c120 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
2c130 7a 56 61 6c 2c 20 22 61 75 74 6f 6d 65 72 67 65  zVal, "automerge
2c140 3d 22 2c 20 31 30 29 20 29 7b 0a 20 20 20 20 72  =", 10) ){.    r
2c150 63 20 3d 20 66 74 73 33 44 6f 41 75 74 6f 69 6e  c = fts3DoAutoin
2c160 63 72 6d 65 72 67 65 28 70 2c 20 26 7a 56 61 6c  crmerge(p, &zVal
2c170 5b 31 30 5d 29 3b 0a 23 69 66 64 65 66 20 53 51  [10]);.#ifdef SQ
2c180 4c 49 54 45 5f 54 45 53 54 0a 20 20 7d 65 6c 73  LITE_TEST.  }els
2c190 65 20 69 66 28 20 6e 56 61 6c 3e 39 20 26 26 20  e if( nVal>9 && 
2c1a0 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  0==sqlite3_strni
2c1b0 63 6d 70 28 7a 56 61 6c 2c 20 22 6e 6f 64 65 73  cmp(zVal, "nodes
2c1c0 69 7a 65 3d 22 2c 20 39 29 20 29 7b 0a 20 20 20  ize=", 9) ){.   
2c1d0 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 3d 20   p->nNodeSize = 
2c1e0 61 74 6f 69 28 26 7a 56 61 6c 5b 39 5d 29 3b 0a  atoi(&zVal[9]);.
2c1f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2c200 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
2c210 6e 56 61 6c 3e 31 31 20 26 26 20 30 3d 3d 73 71  nVal>11 && 0==sq
2c220 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a  lite3_strnicmp(z
2c230 56 61 6c 2c 20 22 6d 61 78 70 65 6e 64 69 6e 67  Val, "maxpending
2c240 3d 22 2c 20 39 29 20 29 7b 0a 20 20 20 20 70 2d  =", 9) ){.    p-
2c250 3e 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61 74 61  >nMaxPendingData
2c260 20 3d 20 61 74 6f 69 28 26 7a 56 61 6c 5b 31 31   = atoi(&zVal[11
2c270 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ]);.    rc = SQL
2c280 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20  ITE_OK;.  }else 
2c290 69 66 28 20 6e 56 61 6c 3e 32 31 20 26 26 20 30  if( nVal>21 && 0
2c2a0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ==sqlite3_strnic
2c2b0 6d 70 28 7a 56 61 6c 2c 20 22 74 65 73 74 2d 6e  mp(zVal, "test-n
2c2c0 6f 2d 69 6e 63 72 2d 64 6f 63 6c 69 73 74 3d 22  o-incr-doclist="
2c2d0 2c 20 32 31 29 20 29 7b 0a 20 20 20 20 70 2d 3e  , 21) ){.    p->
2c2e0 62 4e 6f 49 6e 63 72 44 6f 63 6c 69 73 74 20 3d  bNoIncrDoclist =
2c2f0 20 61 74 6f 69 28 26 7a 56 61 6c 5b 32 31 5d 29   atoi(&zVal[21])
2c300 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
2c310 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  E_OK;.#endif.  }
2c320 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
2c330 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
2c340 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2c350 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c360 5f 44 49 53 41 42 4c 45 5f 46 54 53 34 5f 44 45  _DISABLE_FTS4_DE
2c370 46 45 52 52 45 44 0a 2f 2a 0a 2a 2a 20 44 65 6c  FERRED./*.** Del
2c380 65 74 65 20 61 6c 6c 20 63 61 63 68 65 64 20 64  ete all cached d
2c390 65 66 65 72 72 65 64 20 64 6f 63 6c 69 73 74 73  eferred doclists
2c3a0 2e 20 44 65 66 65 72 72 65 64 20 64 6f 63 6c 69  . Deferred docli
2c3b0 73 74 73 20 61 72 65 20 63 61 63 68 65 64 0a 2a  sts are cached.*
2c3c0 2a 20 28 61 6c 6c 6f 63 61 74 65 64 29 20 62 79  * (allocated) by
2c3d0 20 74 68 65 20 73 71 6c 69 74 65 33 46 74 73 33   the sqlite3Fts3
2c3e0 43 61 63 68 65 44 65 66 65 72 72 65 64 44 6f 63  CacheDeferredDoc
2c3f0 6c 69 73 74 73 28 29 20 66 75 6e 63 74 69 6f 6e  lists() function
2c400 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2c410 33 46 74 73 33 46 72 65 65 44 65 66 65 72 72 65  3Fts3FreeDeferre
2c420 64 44 6f 63 6c 69 73 74 73 28 46 74 73 33 43 75  dDoclists(Fts3Cu
2c430 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 46  rsor *pCsr){.  F
2c440 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e  ts3DeferredToken
2c450 20 2a 70 44 65 66 3b 0a 20 20 66 6f 72 28 70 44   *pDef;.  for(pD
2c460 65 66 3d 70 43 73 72 2d 3e 70 44 65 66 65 72 72  ef=pCsr->pDeferr
2c470 65 64 3b 20 70 44 65 66 3b 20 70 44 65 66 3d 70  ed; pDef; pDef=p
2c480 44 65 66 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Def->pNext){.   
2c490 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74   fts3PendingList
2c4a0 44 65 6c 65 74 65 28 70 44 65 66 2d 3e 70 4c 69  Delete(pDef->pLi
2c4b0 73 74 29 3b 0a 20 20 20 20 70 44 65 66 2d 3e 70  st);.    pDef->p
2c4c0 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  List = 0;.  }.}.
2c4d0 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
2c4e0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 70  entries in the p
2c4f0 43 73 72 2d 3e 70 44 65 66 66 65 72 65 64 20 6c  Csr->pDeffered l
2c500 69 73 74 2e 20 45 6e 74 72 69 65 73 20 61 72 65  ist. Entries are
2c510 20 61 64 64 65 64 20 74 6f 20 0a 2a 2a 20 74 68   added to .** th
2c520 69 73 20 6c 69 73 74 20 75 73 69 6e 67 20 73 71  is list using sq
2c530 6c 69 74 65 33 46 74 73 33 44 65 66 65 72 54 6f  lite3Fts3DeferTo
2c540 6b 65 6e 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ken()..*/.void s
2c550 71 6c 69 74 65 33 46 74 73 33 46 72 65 65 44 65  qlite3Fts3FreeDe
2c560 66 65 72 72 65 64 54 6f 6b 65 6e 73 28 46 74 73  ferredTokens(Fts
2c570 33 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a  3Cursor *pCsr){.
2c580 20 20 46 74 73 33 44 65 66 65 72 72 65 64 54 6f    Fts3DeferredTo
2c590 6b 65 6e 20 2a 70 44 65 66 3b 0a 20 20 46 74 73  ken *pDef;.  Fts
2c5a0 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a  3DeferredToken *
2c5b0 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 44 65  pNext;.  for(pDe
2c5c0 66 3d 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65  f=pCsr->pDeferre
2c5d0 64 3b 20 70 44 65 66 3b 20 70 44 65 66 3d 70 4e  d; pDef; pDef=pN
2c5e0 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
2c5f0 3d 20 70 44 65 66 2d 3e 70 4e 65 78 74 3b 0a 20  = pDef->pNext;. 
2c600 20 20 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69     fts3PendingLi
2c610 73 74 44 65 6c 65 74 65 28 70 44 65 66 2d 3e 70  stDelete(pDef->p
2c620 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  List);.    sqlit
2c630 65 33 5f 66 72 65 65 28 70 44 65 66 29 3b 0a 20  e3_free(pDef);. 
2c640 20 7d 0a 20 20 70 43 73 72 2d 3e 70 44 65 66 65   }.  pCsr->pDefe
2c650 72 72 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  rred = 0;.}../*.
2c660 2a 2a 20 47 65 6e 65 72 61 74 65 20 64 65 66 65  ** Generate defe
2c670 72 72 65 64 2d 64 6f 63 6c 69 73 74 73 20 66 6f  rred-doclists fo
2c680 72 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 69 6e 20  r all tokens in 
2c690 74 68 65 20 70 43 73 72 2d 3e 70 44 65 66 65 72  the pCsr->pDefer
2c6a0 72 65 64 20 6c 69 73 74 0a 2a 2a 20 62 61 73 65  red list.** base
2c6b0 64 20 6f 6e 20 74 68 65 20 72 6f 77 20 74 68 61  d on the row tha
2c6c0 74 20 70 43 73 72 20 63 75 72 72 65 6e 74 6c 79  t pCsr currently
2c6d0 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a   points to..**.*
2c6e0 2a 20 41 20 64 65 66 65 72 72 65 64 2d 64 6f 63  * A deferred-doc
2c6f0 6c 69 73 74 20 69 73 20 6c 69 6b 65 20 61 6e 79  list is like any
2c700 20 6f 74 68 65 72 20 64 6f 63 6c 69 73 74 20 77   other doclist w
2c710 69 74 68 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66  ith position inf
2c720 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 63 6c  ormation.** incl
2c730 75 64 65 64 2c 20 65 78 63 65 70 74 20 74 68 61  uded, except tha
2c740 74 20 69 74 20 6f 6e 6c 79 20 63 6f 6e 74 61 69  t it only contai
2c750 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ns entries for a
2c760 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
2c770 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 6e 6f 74  he.** table, not
2c780 20 66 6f 72 20 61 6c 6c 20 72 6f 77 73 2e 0a 2a   for all rows..*
2c790 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
2c7a0 33 43 61 63 68 65 44 65 66 65 72 72 65 64 44 6f  3CacheDeferredDo
2c7b0 63 6c 69 73 74 73 28 46 74 73 33 43 75 72 73 6f  clists(Fts3Curso
2c7c0 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74 20  r *pCsr){.  int 
2c7d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2c7e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2c7f0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2c800 69 66 28 20 70 43 73 72 2d 3e 70 44 65 66 65 72  if( pCsr->pDefer
2c810 72 65 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  red ){.    int i
2c820 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c830 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
2c840 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
2c850 75 67 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ugh table column
2c860 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
2c870 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 3b 20 20  _int64 iDocid;  
2c880 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 69 64 20         /* Docid 
2c890 6f 66 20 74 68 65 20 72 6f 77 20 70 43 73 72 20  of the row pCsr 
2c8a0 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 20 20 20  points to */.   
2c8b0 20 46 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b   Fts3DeferredTok
2c8c0 65 6e 20 2a 70 44 65 66 3b 20 20 20 20 20 20 2f  en *pDef;      /
2c8d0 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
2c8e0 65 20 74 68 72 6f 75 67 68 20 64 65 66 65 72 72  e through deferr
2c8f0 65 64 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20 0a  ed tokens */.  .
2c900 20 20 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70      Fts3Table *p
2c910 20 3d 20 28 46 74 73 33 54 61 62 6c 65 20 2a 29   = (Fts3Table *)
2c920 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62  pCsr->base.pVtab
2c930 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 6f  ;.    sqlite3_to
2c940 6b 65 6e 69 7a 65 72 20 2a 70 54 20 3d 20 70 2d  kenizer *pT = p-
2c950 3e 70 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 20  >pTokenizer;.   
2c960 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a   sqlite3_tokeniz
2c970 65 72 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73 74 20  er_module const 
2c980 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 54 2d 3e 70  *pModule = pT->p
2c990 4d 6f 64 75 6c 65 3b 0a 20 20 20 0a 20 20 20 20  Module;.   .    
2c9a0 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 69 73  assert( pCsr->is
2c9b0 52 65 71 75 69 72 65 53 65 65 6b 3d 3d 30 20 29  RequireSeek==0 )
2c9c0 3b 0a 20 20 20 20 69 44 6f 63 69 64 20 3d 20 73  ;.    iDocid = s
2c9d0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
2c9e0 74 36 34 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c  t64(pCsr->pStmt,
2c9f0 20 30 29 3b 0a 20 20 0a 20 20 20 20 66 6f 72 28   0);.  .    for(
2ca00 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d  i=0; i<p->nColum
2ca10 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
2ca20 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  OK; i++){.      
2ca30 69 66 28 20 70 2d 3e 61 62 4e 6f 74 69 6e 64 65  if( p->abNotinde
2ca40 78 65 64 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20  xed[i]==0 ){.   
2ca50 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2ca60 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20  *zText = (const 
2ca70 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63  char *)sqlite3_c
2ca80 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 43 73 72 2d  olumn_text(pCsr-
2ca90 3e 70 53 74 6d 74 2c 20 69 2b 31 29 3b 0a 20 20  >pStmt, i+1);.  
2caa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 6f        sqlite3_to
2cab0 6b 65 6e 69 7a 65 72 5f 63 75 72 73 6f 72 20 2a  kenizer_cursor *
2cac0 70 54 43 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  pTC = 0;..      
2cad0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
2cae0 73 33 4f 70 65 6e 54 6f 6b 65 6e 69 7a 65 72 28  s3OpenTokenizer(
2caf0 70 54 2c 20 70 43 73 72 2d 3e 69 4c 61 6e 67 69  pT, pCsr->iLangi
2cb00 64 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26 70  d, zText, -1, &p
2cb10 54 43 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69  TC);.        whi
2cb20 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
2cb30 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  K ){.          c
2cb40 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 6f 6b 65  har const *zToke
2cb50 6e 3b 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66  n;       /* Buff
2cb60 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 6f  er containing to
2cb70 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ken */.         
2cb80 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b   int nToken = 0;
2cb90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2cba0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
2cbb0 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20   token */.      
2cbc0 20 20 20 20 69 6e 74 20 69 44 75 6d 31 20 3d 20      int iDum1 = 
2cbd0 30 2c 20 69 44 75 6d 32 20 3d 20 30 3b 20 2f 2a  0, iDum2 = 0; /*
2cbe0 20 44 75 6d 6d 79 20 76 61 72 69 61 62 6c 65 73   Dummy variables
2cbf0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e   */.          in
2cc00 74 20 69 50 6f 73 20 3d 20 30 3b 20 20 20 20 20  t iPos = 0;     
2cc10 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74          /* Posit
2cc20 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20  ion of token in 
2cc30 7a 54 65 78 74 20 2a 2f 0a 0a 20 20 20 20 20 20  zText */..      
2cc40 20 20 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65      rc = pModule
2cc50 2d 3e 78 4e 65 78 74 28 70 54 43 2c 20 26 7a 54  ->xNext(pTC, &zT
2cc60 6f 6b 65 6e 2c 20 26 6e 54 6f 6b 65 6e 2c 20 26  oken, &nToken, &
2cc70 69 44 75 6d 31 2c 20 26 69 44 75 6d 32 2c 20 26  iDum1, &iDum2, &
2cc80 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 20  iPos);.         
2cc90 20 66 6f 72 28 70 44 65 66 3d 70 43 73 72 2d 3e   for(pDef=pCsr->
2cca0 70 44 65 66 65 72 72 65 64 3b 20 70 44 65 66 20  pDeferred; pDef 
2ccb0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
2ccc0 3b 20 70 44 65 66 3d 70 44 65 66 2d 3e 70 4e 65  ; pDef=pDef->pNe
2ccd0 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  xt){.           
2cce0 20 46 74 73 33 50 68 72 61 73 65 54 6f 6b 65 6e   Fts3PhraseToken
2ccf0 20 2a 70 50 54 20 3d 20 70 44 65 66 2d 3e 70 54   *pPT = pDef->pT
2cd00 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  oken;.          
2cd10 20 20 69 66 28 20 28 70 44 65 66 2d 3e 69 43 6f    if( (pDef->iCo
2cd20 6c 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 7c 7c  l>=p->nColumn ||
2cd30 20 70 44 65 66 2d 3e 69 43 6f 6c 3d 3d 69 29 0a   pDef->iCol==i).
2cd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd50 26 26 20 28 70 50 54 2d 3e 62 46 69 72 73 74 3d  && (pPT->bFirst=
2cd60 3d 30 20 7c 7c 20 69 50 6f 73 3d 3d 30 29 0a 20  =0 || iPos==0). 
2cd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
2cd80 26 20 28 70 50 54 2d 3e 6e 3d 3d 6e 54 6f 6b 65  & (pPT->n==nToke
2cd90 6e 20 7c 7c 20 28 70 50 54 2d 3e 69 73 50 72 65  n || (pPT->isPre
2cda0 66 69 78 20 26 26 20 70 50 54 2d 3e 6e 3c 6e 54  fix && pPT->n<nT
2cdb0 6f 6b 65 6e 29 29 0a 20 20 20 20 20 20 20 20 20  oken)).         
2cdc0 20 20 20 20 20 20 20 26 26 20 28 30 3d 3d 6d 65         && (0==me
2cdd0 6d 63 6d 70 28 7a 54 6f 6b 65 6e 2c 20 70 50 54  mcmp(zToken, pPT
2cde0 2d 3e 7a 2c 20 70 50 54 2d 3e 6e 29 29 0a 20 20  ->z, pPT->n)).  
2cdf0 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
2ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73               fts
2ce10 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65  3PendingListAppe
2ce20 6e 64 28 26 70 44 65 66 2d 3e 70 4c 69 73 74 2c  nd(&pDef->pList,
2ce30 20 69 44 6f 63 69 64 2c 20 69 2c 20 69 50 6f 73   iDocid, i, iPos
2ce40 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
2ce50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2ce60 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2ce70 20 20 20 20 69 66 28 20 70 54 43 20 29 20 70 4d      if( pTC ) pM
2ce80 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 54  odule->xClose(pT
2ce90 43 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  C);.        if( 
2cea0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
2ceb0 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
2cec0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2ced0 0a 20 20 20 20 66 6f 72 28 70 44 65 66 3d 70 43  .    for(pDef=pC
2cee0 73 72 2d 3e 70 44 65 66 65 72 72 65 64 3b 20 70  sr->pDeferred; p
2cef0 44 65 66 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  Def && rc==SQLIT
2cf00 45 5f 4f 4b 3b 20 70 44 65 66 3d 70 44 65 66 2d  E_OK; pDef=pDef-
2cf10 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
2cf20 66 28 20 70 44 65 66 2d 3e 70 4c 69 73 74 20 29  f( pDef->pList )
2cf30 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
2cf40 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70  ts3PendingListAp
2cf50 70 65 6e 64 56 61 72 69 6e 74 28 26 70 44 65 66  pendVarint(&pDef
2cf60 2d 3e 70 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20  ->pList, 0);.   
2cf70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2cf80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2cf90 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 44  int sqlite3Fts3D
2cfa0 65 66 65 72 72 65 64 54 6f 6b 65 6e 4c 69 73 74  eferredTokenList
2cfb0 28 0a 20 20 46 74 73 33 44 65 66 65 72 72 65 64  (.  Fts3Deferred
2cfc0 54 6f 6b 65 6e 20 2a 70 2c 20 0a 20 20 63 68 61  Token *p, .  cha
2cfd0 72 20 2a 2a 70 70 44 61 74 61 2c 20 0a 20 20 69  r **ppData, .  i
2cfe0 6e 74 20 2a 70 6e 44 61 74 61 0a 29 7b 0a 20 20  nt *pnData.){.  
2cff0 63 68 61 72 20 2a 70 52 65 74 3b 0a 20 20 69 6e  char *pRet;.  in
2d000 74 20 6e 53 6b 69 70 3b 0a 20 20 73 71 6c 69 74  t nSkip;.  sqlit
2d010 65 33 5f 69 6e 74 36 34 20 64 75 6d 6d 79 3b 0a  e3_int64 dummy;.
2d020 0a 20 20 2a 70 70 44 61 74 61 20 3d 20 30 3b 0a  .  *ppData = 0;.
2d030 20 20 2a 70 6e 44 61 74 61 20 3d 20 30 3b 0a 0a    *pnData = 0;..
2d040 20 20 69 66 28 20 70 2d 3e 70 4c 69 73 74 3d 3d    if( p->pList==
2d050 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2d060 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
2d070 20 20 70 52 65 74 20 3d 20 28 63 68 61 72 20 2a    pRet = (char *
2d080 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
2d090 70 2d 3e 70 4c 69 73 74 2d 3e 6e 44 61 74 61 29  p->pList->nData)
2d0a0 3b 0a 20 20 69 66 28 20 21 70 52 65 74 20 29 20  ;.  if( !pRet ) 
2d0b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2d0c0 4d 45 4d 3b 0a 0a 20 20 6e 53 6b 69 70 20 3d 20  MEM;..  nSkip = 
2d0d0 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61  sqlite3Fts3GetVa
2d0e0 72 69 6e 74 28 70 2d 3e 70 4c 69 73 74 2d 3e 61  rint(p->pList->a
2d0f0 44 61 74 61 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  Data, &dummy);. 
2d100 20 2a 70 6e 44 61 74 61 20 3d 20 70 2d 3e 70 4c   *pnData = p->pL
2d110 69 73 74 2d 3e 6e 44 61 74 61 20 2d 20 6e 53 6b  ist->nData - nSk
2d120 69 70 3b 0a 20 20 2a 70 70 44 61 74 61 20 3d 20  ip;.  *ppData = 
2d130 70 52 65 74 3b 0a 20 20 0a 20 20 6d 65 6d 63 70  pRet;.  .  memcp
2d140 79 28 70 52 65 74 2c 20 26 70 2d 3e 70 4c 69 73  y(pRet, &p->pLis
2d150 74 2d 3e 61 44 61 74 61 5b 6e 53 6b 69 70 5d 2c  t->aData[nSkip],
2d160 20 2a 70 6e 44 61 74 61 29 3b 0a 20 20 72 65 74   *pnData);.  ret
2d170 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2d180 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65  ../*.** Add an e
2d190 6e 74 72 79 20 66 6f 72 20 74 6f 6b 65 6e 20 70  ntry for token p
2d1a0 54 6f 6b 65 6e 20 74 6f 20 74 68 65 20 70 43 73  Token to the pCs
2d1b0 72 2d 3e 70 44 65 66 65 72 72 65 64 20 6c 69 73  r->pDeferred lis
2d1c0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
2d1d0 33 46 74 73 33 44 65 66 65 72 54 6f 6b 65 6e 28  3Fts3DeferToken(
2d1e0 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70  .  Fts3Cursor *p
2d1f0 43 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Csr,            
2d200 20 20 20 2f 2a 20 46 74 73 33 20 74 61 62 6c 65     /* Fts3 table
2d210 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 46 74 73   cursor */.  Fts
2d220 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70 54  3PhraseToken *pT
2d230 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20  oken,        /* 
2d240 54 6f 6b 65 6e 20 74 6f 20 64 65 66 65 72 20 2a  Token to defer *
2d250 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20  /.  int iCol    
2d260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d270 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 68      /* Column th
2d280 61 74 20 74 6f 6b 65 6e 20 6d 75 73 74 20 61 70  at token must ap
2d290 70 65 61 72 20 69 6e 20 28 6f 72 20 2d 31 29 20  pear in (or -1) 
2d2a0 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 44 65 66 65  */.){.  Fts3Defe
2d2b0 72 72 65 64 54 6f 6b 65 6e 20 2a 70 44 65 66 65  rredToken *pDefe
2d2c0 72 72 65 64 3b 0a 20 20 70 44 65 66 65 72 72 65  rred;.  pDeferre
2d2d0 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  d = sqlite3_mall
2d2e0 6f 63 28 73 69 7a 65 6f 66 28 2a 70 44 65 66 65  oc(sizeof(*pDefe
2d2f0 72 72 65 64 29 29 3b 0a 20 20 69 66 28 20 21 70  rred));.  if( !p
2d300 44 65 66 65 72 72 65 64 20 29 7b 0a 20 20 20 20  Deferred ){.    
2d310 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2d320 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  MEM;.  }.  memse
2d330 74 28 70 44 65 66 65 72 72 65 64 2c 20 30 2c 20  t(pDeferred, 0, 
2d340 73 69 7a 65 6f 66 28 2a 70 44 65 66 65 72 72 65  sizeof(*pDeferre
2d350 64 29 29 3b 0a 20 20 70 44 65 66 65 72 72 65 64  d));.  pDeferred
2d360 2d 3e 70 54 6f 6b 65 6e 20 3d 20 70 54 6f 6b 65  ->pToken = pToke
2d370 6e 3b 0a 20 20 70 44 65 66 65 72 72 65 64 2d 3e  n;.  pDeferred->
2d380 70 4e 65 78 74 20 3d 20 70 43 73 72 2d 3e 70 44  pNext = pCsr->pD
2d390 65 66 65 72 72 65 64 3b 20 0a 20 20 70 44 65 66  eferred; .  pDef
2d3a0 65 72 72 65 64 2d 3e 69 43 6f 6c 20 3d 20 69 43  erred->iCol = iC
2d3b0 6f 6c 3b 0a 20 20 70 43 73 72 2d 3e 70 44 65 66  ol;.  pCsr->pDef
2d3c0 65 72 72 65 64 20 3d 20 70 44 65 66 65 72 72 65  erred = pDeferre
2d3d0 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  d;..  assert( pT
2d3e0 6f 6b 65 6e 2d 3e 70 44 65 66 65 72 72 65 64 3d  oken->pDeferred=
2d3f0 3d 30 20 29 3b 0a 20 20 70 54 6f 6b 65 6e 2d 3e  =0 );.  pToken->
2d400 70 44 65 66 65 72 72 65 64 20 3d 20 70 44 65 66  pDeferred = pDef
2d410 65 72 72 65 64 3b 0a 0a 20 20 72 65 74 75 72 6e  erred;..  return
2d420 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2d430 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69  ndif../*.** SQLi
2d440 74 65 20 76 61 6c 75 65 20 70 52 6f 77 69 64 20  te value pRowid 
2d450 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72 6f 77  contains the row
2d460 69 64 20 6f 66 20 61 20 72 6f 77 20 74 68 61 74  id of a row that
2d470 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
2d480 62 65 0a 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e  be.** present in
2d490 20 74 68 65 20 46 54 53 33 20 74 61 62 6c 65 2e   the FTS3 table.
2d4a0 20 49 66 20 69 74 20 69 73 2c 20 64 65 6c 65 74   If it is, delet
2d4b0 65 20 69 74 20 61 6e 64 20 61 64 6a 75 73 74 20  e it and adjust 
2d4c0 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
2d4d0 6f 66 20 73 75 62 73 69 64 75 61 72 79 20 64 61  of subsiduary da
2d4e0 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61 63  ta structures ac
2d4f0 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74  cordingly..*/.st
2d500 61 74 69 63 20 69 6e 74 20 66 74 73 33 44 65 6c  atic int fts3Del
2d510 65 74 65 42 79 52 6f 77 69 64 28 0a 20 20 46 74  eteByRowid(.  Ft
2d520 73 33 54 61 62 6c 65 20 2a 70 2c 20 0a 20 20 73  s3Table *p, .  s
2d530 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52  qlite3_value *pR
2d540 6f 77 69 64 2c 20 0a 20 20 69 6e 74 20 2a 70 6e  owid, .  int *pn
2d550 43 68 6e 67 2c 20 20 20 20 20 20 20 20 20 20 20  Chng,           
2d560 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
2d570 55 54 3a 20 44 65 63 72 65 6d 65 6e 74 20 69 66  UT: Decrement if
2d580 20 72 6f 77 20 69 73 20 64 65 6c 65 74 65 64 20   row is deleted 
2d590 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a 44 65 6c  */.  u32 *aSzDel
2d5a0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
2d5b0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2d5c0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2d5d0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 62 46  code */.  int bF
2d5e0 6f 75 6e 64 20 3d 20 30 3b 20 20 20 20 20 20 20  ound = 0;       
2d5f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2d600 65 20 69 66 20 2a 70 52 6f 77 69 64 20 72 65 61  e if *pRowid rea
2d610 6c 6c 79 20 69 73 20 69 6e 20 74 68 65 20 74 61  lly is in the ta
2d620 62 6c 65 20 2a 2f 0a 0a 20 20 66 74 73 33 44 65  ble */..  fts3De
2d630 6c 65 74 65 54 65 72 6d 73 28 26 72 63 2c 20 70  leteTerms(&rc, p
2d640 2c 20 70 52 6f 77 69 64 2c 20 61 53 7a 44 65 6c  , pRowid, aSzDel
2d650 2c 20 26 62 46 6f 75 6e 64 29 3b 0a 20 20 69 66  , &bFound);.  if
2d660 28 20 62 46 6f 75 6e 64 20 26 26 20 72 63 3d 3d  ( bFound && rc==
2d670 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d680 20 69 6e 74 20 69 73 45 6d 70 74 79 20 3d 20 30   int isEmpty = 0
2d690 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2d6a0 2a 20 44 65 6c 65 74 69 6e 67 20 2a 70 52 6f 77  * Deleting *pRow
2d6b0 69 64 20 6c 65 61 76 65 73 20 74 68 65 20 74 61  id leaves the ta
2d6c0 62 6c 65 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20  ble empty */.   
2d6d0 20 72 63 20 3d 20 66 74 73 33 49 73 45 6d 70 74   rc = fts3IsEmpt
2d6e0 79 28 70 2c 20 70 52 6f 77 69 64 2c 20 26 69 73  y(p, pRowid, &is
2d6f0 45 6d 70 74 79 29 3b 0a 20 20 20 20 69 66 28 20  Empty);.    if( 
2d700 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2d710 0a 20 20 20 20 20 20 69 66 28 20 69 73 45 6d 70  .      if( isEmp
2d720 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ty ){.        /*
2d730 20 44 65 6c 65 74 69 6e 67 20 74 68 69 73 20 72   Deleting this r
2d740 6f 77 20 6d 65 61 6e 73 20 74 68 65 20 77 68 6f  ow means the who
2d750 6c 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  le table is empt
2d760 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a  y. In this case.
2d770 20 20 20 20 20 20 20 20 2a 2a 20 64 65 6c 65 74          ** delet
2d780 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
2d790 66 20 61 6c 6c 20 74 68 72 65 65 20 74 61 62 6c  f all three tabl
2d7a0 65 73 20 61 6e 64 20 74 68 72 6f 77 20 61 77 61  es and throw awa
2d7b0 79 20 61 6e 79 0a 20 20 20 20 20 20 20 20 2a 2a  y any.        **
2d7c0 20 64 61 74 61 20 69 6e 20 74 68 65 20 70 65 6e   data in the pen
2d7d0 64 69 6e 67 54 65 72 6d 73 20 68 61 73 68 20 74  dingTerms hash t
2d7e0 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  able.  */.      
2d7f0 20 20 72 63 20 3d 20 66 74 73 33 44 65 6c 65 74    rc = fts3Delet
2d800 65 41 6c 6c 28 70 2c 20 31 29 3b 0a 20 20 20 20  eAll(p, 1);.    
2d810 20 20 20 20 2a 70 6e 43 68 6e 67 20 3d 20 30 3b      *pnChng = 0;
2d820 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
2d830 61 53 7a 44 65 6c 2c 20 30 2c 20 73 69 7a 65 6f  aSzDel, 0, sizeo
2d840 66 28 75 33 32 29 20 2a 20 28 70 2d 3e 6e 43 6f  f(u32) * (p->nCo
2d850 6c 75 6d 6e 2b 31 29 20 2a 20 32 29 3b 0a 20 20  lumn+1) * 2);.  
2d860 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d870 20 20 20 2a 70 6e 43 68 6e 67 20 3d 20 2a 70 6e     *pnChng = *pn
2d880 43 68 6e 67 20 2d 20 31 3b 0a 20 20 20 20 20 20  Chng - 1;.      
2d890 20 20 69 66 28 20 70 2d 3e 7a 43 6f 6e 74 65 6e    if( p->zConten
2d8a0 74 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tTbl==0 ){.     
2d8b0 20 20 20 20 20 66 74 73 33 53 71 6c 45 78 65 63       fts3SqlExec
2d8c0 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c  (&rc, p, SQL_DEL
2d8d0 45 54 45 5f 43 4f 4e 54 45 4e 54 2c 20 26 70 52  ETE_CONTENT, &pR
2d8e0 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 7d  owid);.        }
2d8f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
2d900 62 48 61 73 44 6f 63 73 69 7a 65 20 29 7b 0a 20  bHasDocsize ){. 
2d910 20 20 20 20 20 20 20 20 20 66 74 73 33 53 71 6c           fts3Sql
2d920 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53 51 4c  Exec(&rc, p, SQL
2d930 5f 44 45 4c 45 54 45 5f 44 4f 43 53 49 5a 45 2c  _DELETE_DOCSIZE,
2d940 20 26 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 20   &pRowid);.     
2d950 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2d960 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
2d970 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
2d980 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
2d990 20 74 68 65 20 77 6f 72 6b 20 66 6f 72 20 74 68   the work for th
2d9a0 65 20 78 55 70 64 61 74 65 20 6d 65 74 68 6f 64  e xUpdate method
2d9b0 20 6f 66 20 46 54 53 33 20 76 69 72 74 75 61 6c   of FTS3 virtual
2d9c0 0a 2a 2a 20 74 61 62 6c 65 73 2e 20 54 68 65 20  .** tables. The 
2d9d0 73 63 68 65 6d 61 20 6f 66 20 74 68 65 20 76 69  schema of the vi
2d9e0 72 74 75 61 6c 20 74 61 62 6c 65 20 62 65 69 6e  rtual table bein
2d9f0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45  g:.**.**     CRE
2da00 41 54 45 20 54 41 42 4c 45 20 3c 74 61 62 6c 65  ATE TABLE <table
2da10 20 6e 61 6d 65 3e 28 20 0a 2a 2a 20 20 20 20 20   name>( .**     
2da20 20 20 3c 75 73 65 72 20 63 6f 6c 75 6d 6e 73 3e    <user columns>
2da30 2c 0a 2a 2a 20 20 20 20 20 20 20 3c 74 61 62 6c  ,.**       <tabl
2da40 65 20 6e 61 6d 65 3e 20 48 49 44 44 45 4e 2c 20  e name> HIDDEN, 
2da50 0a 2a 2a 20 20 20 20 20 20 20 64 6f 63 69 64 20  .**       docid 
2da60 48 49 44 44 45 4e 2c 20 0a 2a 2a 20 20 20 20 20  HIDDEN, .**     
2da70 20 20 3c 6c 61 6e 67 69 64 3e 20 48 49 44 44 45    <langid> HIDDE
2da80 4e 0a 2a 2a 20 20 20 20 20 29 3b 0a 2a 2a 0a 2a  N.**     );.**.*
2da90 2a 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  * .*/.int sqlite
2daa0 33 46 74 73 33 55 70 64 61 74 65 4d 65 74 68 6f  3Fts3UpdateMetho
2dab0 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  d(.  sqlite3_vta
2dac0 62 20 2a 70 56 74 61 62 2c 20 20 20 20 20 20 20  b *pVtab,       
2dad0 20 20 20 20 20 2f 2a 20 46 54 53 33 20 76 74 61       /* FTS3 vta
2dae0 62 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  b object */.  in
2daf0 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20  t nArg,         
2db00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2db10 20 53 69 7a 65 20 6f 66 20 61 72 67 75 6d 65 6e   Size of argumen
2db20 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 73 71 6c  t array */.  sql
2db30 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56  ite3_value **apV
2db40 61 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  al,          /* 
2db50 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e  Array of argumen
2db60 74 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 69  ts */.  sqlite_i
2db70 6e 74 36 34 20 2a 70 52 6f 77 69 64 20 20 20 20  nt64 *pRowid    
2db80 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2db90 54 68 65 20 61 66 66 65 63 74 65 64 20 28 6f 72  The affected (or
2dba0 20 65 66 66 65 63 74 65 64 29 20 72 6f 77 69 64   effected) rowid
2dbb0 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 54 61 62   */.){.  Fts3Tab
2dbc0 6c 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62  le *p = (Fts3Tab
2dbd0 6c 65 20 2a 29 70 56 74 61 62 3b 0a 20 20 69 6e  le *)pVtab;.  in
2dbe0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2dbf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2dc00 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
2dc10 20 20 75 33 32 20 2a 61 53 7a 49 6e 73 20 3d 20    u32 *aSzIns = 
2dc20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2dc30 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 69 6e    /* Sizes of in
2dc40 73 65 72 74 65 64 20 64 6f 63 75 6d 65 6e 74 73  serted documents
2dc50 20 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a 44 65   */.  u32 *aSzDe
2dc60 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
2dc70 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f        /* Sizes o
2dc80 66 20 64 65 6c 65 74 65 64 20 64 6f 63 75 6d 65  f deleted docume
2dc90 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68  nts */.  int nCh
2dca0 6e 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ng = 0;         
2dcb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 74 20           /* Net 
2dcc0 63 68 61 6e 67 65 20 69 6e 20 6e 75 6d 62 65 72  change in number
2dcd0 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 2a 2f   of documents */
2dce0 0a 20 20 69 6e 74 20 62 49 6e 73 65 72 74 44 6f  .  int bInsertDo
2dcf0 6e 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 41 74  ne = 0;..  /* At
2dd00 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d   this point it m
2dd10 75 73 74 20 62 65 20 6b 6e 6f 77 6e 20 69 66 20  ust be known if 
2dd20 74 68 65 20 25 5f 73 74 61 74 20 74 61 62 6c 65  the %_stat table
2dd30 20 65 78 69 73 74 73 20 6f 72 20 6e 6f 74 2e 0a   exists or not..
2dd40 20 20 2a 2a 20 53 6f 20 62 48 61 73 53 74 61 74    ** So bHasStat
2dd50 20 6d 61 79 20 6e 6f 74 20 62 65 20 32 2e 20 20   may not be 2.  
2dd60 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
2dd70 62 48 61 73 53 74 61 74 3d 3d 30 20 7c 7c 20 70  bHasStat==0 || p
2dd80 2d 3e 62 48 61 73 53 74 61 74 3d 3d 31 20 29 3b  ->bHasStat==1 );
2dd90 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
2dda0 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b 0a 20  Segments==0 );. 
2ddb0 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20   assert( .      
2ddc0 6e 41 72 67 3d 3d 31 20 20 20 20 20 20 20 20 20  nArg==1         
2ddd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2dde0 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73  ELETE operations
2ddf0 20 2a 2f 0a 20 20 20 7c 7c 20 6e 41 72 67 3d 3d   */.   || nArg==
2de00 28 32 20 2b 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20  (2 + p->nColumn 
2de10 2b 20 33 29 20 20 2f 2a 20 49 4e 53 45 52 54 20  + 3)  /* INSERT 
2de20 6f 72 20 55 50 44 41 54 45 20 6f 70 65 72 61 74  or UPDATE operat
2de30 69 6f 6e 73 20 2a 2f 0a 20 20 29 3b 0a 0a 20 20  ions */.  );..  
2de40 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20 22  /* Check for a "
2de50 73 70 65 63 69 61 6c 22 20 49 4e 53 45 52 54 20  special" INSERT 
2de60 6f 70 65 72 61 74 69 6f 6e 2e 20 4f 6e 65 20 6f  operation. One o
2de70 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a  f the form:.  **
2de80 0a 20 20 2a 2a 20 20 20 49 4e 53 45 52 54 20 49  .  **   INSERT I
2de90 4e 54 4f 20 78 79 7a 28 78 79 7a 29 20 56 41 4c  NTO xyz(xyz) VAL
2dea0 55 45 53 28 27 63 6f 6d 6d 61 6e 64 27 29 3b 0a  UES('command');.
2deb0 20 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3e    */.  if( nArg>
2dec0 31 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  1 .   && sqlite3
2ded0 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61  _value_type(apVa
2dee0 6c 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55  l[0])==SQLITE_NU
2def0 4c 4c 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65  LL .   && sqlite
2df00 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56  3_value_type(apV
2df10 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 5d  al[p->nColumn+2]
2df20 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 0a  )!=SQLITE_NULL .
2df30 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74    ){.    rc = ft
2df40 73 33 53 70 65 63 69 61 6c 49 6e 73 65 72 74 28  s3SpecialInsert(
2df50 70 2c 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c  p, apVal[p->nCol
2df60 75 6d 6e 2b 32 5d 29 3b 0a 20 20 20 20 67 6f 74  umn+2]);.    got
2df70 6f 20 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20 20  o update_out;.  
2df80 7d 0a 0a 20 20 69 66 28 20 6e 41 72 67 3e 31 20  }..  if( nArg>1 
2df90 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  && sqlite3_value
2dfa0 5f 69 6e 74 28 61 70 56 61 6c 5b 32 20 2b 20 70  _int(apVal[2 + p
2dfb0 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b 20 32 5d 29 3c  ->nColumn + 2])<
2dfc0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
2dfd0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
2dfe0 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65  .    goto update
2dff0 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
2e000 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 74  Allocate space t
2e010 6f 20 68 6f 6c 64 20 74 68 65 20 63 68 61 6e 67  o hold the chang
2e020 65 20 69 6e 20 64 6f 63 75 6d 65 6e 74 20 73 69  e in document si
2e030 7a 65 73 20 2a 2f 0a 20 20 61 53 7a 44 65 6c 20  zes */.  aSzDel 
2e040 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
2e050 28 20 73 69 7a 65 6f 66 28 61 53 7a 44 65 6c 5b  ( sizeof(aSzDel[
2e060 30 5d 29 2a 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  0])*(p->nColumn+
2e070 31 29 2a 32 20 29 3b 0a 20 20 69 66 28 20 61 53  1)*2 );.  if( aS
2e080 7a 44 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  zDel==0 ){.    r
2e090 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2e0a0 3b 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74  ;.    goto updat
2e0b0 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 61 53 7a  e_out;.  }.  aSz
2e0c0 49 6e 73 20 3d 20 26 61 53 7a 44 65 6c 5b 70 2d  Ins = &aSzDel[p-
2e0d0 3e 6e 43 6f 6c 75 6d 6e 2b 31 5d 3b 0a 20 20 6d  >nColumn+1];.  m
2e0e0 65 6d 73 65 74 28 61 53 7a 44 65 6c 2c 20 30 2c  emset(aSzDel, 0,
2e0f0 20 73 69 7a 65 6f 66 28 61 53 7a 44 65 6c 5b 30   sizeof(aSzDel[0
2e100 5d 29 2a 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31  ])*(p->nColumn+1
2e110 29 2a 32 29 3b 0a 0a 20 20 72 63 20 3d 20 66 74  )*2);..  rc = ft
2e120 73 33 57 72 69 74 65 6c 6f 63 6b 28 70 29 3b 0a  s3Writelock(p);.
2e130 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2e140 5f 4f 4b 20 29 20 67 6f 74 6f 20 75 70 64 61 74  _OK ) goto updat
2e150 65 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  e_out;..  /* If 
2e160 74 68 69 73 20 69 73 20 61 6e 20 49 4e 53 45 52  this is an INSER
2e170 54 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20  T operation, or 
2e180 61 6e 20 55 50 44 41 54 45 20 74 68 61 74 20 6d  an UPDATE that m
2e190 6f 64 69 66 69 65 73 20 74 68 65 20 72 6f 77 69  odifies the rowi
2e1a0 64 0a 20 20 2a 2a 20 76 61 6c 75 65 2c 20 74 68  d.  ** value, th
2e1b0 65 6e 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  en this operatio
2e1c0 6e 20 72 65 71 75 69 72 65 73 20 63 6f 6e 73 74  n requires const
2e1d0 72 61 69 6e 74 20 68 61 6e 64 6c 69 6e 67 2e 0a  raint handling..
2e1e0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
2e1f0 20 6f 6e 2d 63 6f 6e 66 6c 69 63 74 20 6d 6f 64   on-conflict mod
2e200 65 20 69 73 20 52 45 50 4c 41 43 45 2c 20 74 68  e is REPLACE, th
2e210 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
2e220 65 20 65 78 69 73 74 69 6e 67 20 72 6f 77 0a 20  e existing row. 
2e230 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 64 65   ** should be de
2e240 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64  leted from the d
2e250 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 69  atabase before i
2e260 6e 73 65 72 74 69 6e 67 20 74 68 65 20 6e 65 77  nserting the new
2e270 20 72 6f 77 2e 20 4f 72 2c 0a 20 20 2a 2a 20 69   row. Or,.  ** i
2e280 66 20 74 68 65 20 6f 6e 2d 63 6f 6e 66 6c 69 63  f the on-conflic
2e290 74 20 6d 6f 64 65 20 69 73 20 6f 74 68 65 72 20  t mode is other 
2e2a0 74 68 61 6e 20 52 45 50 4c 41 43 45 2c 20 74 68  than REPLACE, th
2e2b0 65 6e 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6d  en this method m
2e2c0 75 73 74 0a 20 20 2a 2a 20 64 65 74 65 63 74 20  ust.  ** detect 
2e2d0 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6e 64  the conflict and
2e2e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2e2f0 4f 4e 53 54 52 41 49 4e 54 20 62 65 66 6f 72 65  ONSTRAINT before
2e300 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 20 20   beginning to.  
2e310 2a 2a 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61  ** modify the da
2e320 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
2e330 2f 0a 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26  /.  if( nArg>1 &
2e340 26 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c  & p->zContentTbl
2e350 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69  ==0 ){.    /* Fi
2e360 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 62 6a  nd the value obj
2e370 65 63 74 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ect that holds t
2e380 68 65 20 6e 65 77 20 72 6f 77 69 64 20 76 61 6c  he new rowid val
2e390 75 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ue. */.    sqlit
2e3a0 65 33 5f 76 61 6c 75 65 20 2a 70 4e 65 77 52 6f  e3_value *pNewRo
2e3b0 77 69 64 20 3d 20 61 70 56 61 6c 5b 33 2b 70 2d  wid = apVal[3+p-
2e3c0 3e 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 69  >nColumn];.    i
2e3d0 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
2e3e0 5f 74 79 70 65 28 70 4e 65 77 52 6f 77 69 64 29  _type(pNewRowid)
2e3f0 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b  ==SQLITE_NULL ){
2e400 0a 20 20 20 20 20 20 70 4e 65 77 52 6f 77 69 64  .      pNewRowid
2e410 20 3d 20 61 70 56 61 6c 5b 31 5d 3b 0a 20 20 20   = apVal[1];.   
2e420 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69   }..    if( sqli
2e430 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70  te3_value_type(p
2e440 4e 65 77 52 6f 77 69 64 29 21 3d 53 51 4c 49 54  NewRowid)!=SQLIT
2e450 45 5f 4e 55 4c 4c 20 26 26 20 28 20 0a 20 20 20  E_NULL && ( .   
2e460 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
2e470 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 30 5d  ue_type(apVal[0]
2e480 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20  )==SQLITE_NULL. 
2e490 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 76      || sqlite3_v
2e4a0 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 56 61 6c  alue_int64(apVal
2e4b0 5b 30 5d 29 21 3d 73 71 6c 69 74 65 33 5f 76 61  [0])!=sqlite3_va
2e4c0 6c 75 65 5f 69 6e 74 36 34 28 70 4e 65 77 52 6f  lue_int64(pNewRo
2e4d0 77 69 64 29 0a 20 20 20 20 29 29 7b 0a 20 20 20  wid).    )){.   
2e4e0 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f     /* The new ro
2e4f0 77 69 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  wid is not NULL 
2e500 28 69 6e 20 74 68 69 73 20 63 61 73 65 20 74 68  (in this case th
2e510 65 20 72 6f 77 69 64 20 77 69 6c 6c 20 62 65 0a  e rowid will be.
2e520 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74        ** automat
2e530 69 63 61 6c 6c 79 20 61 73 73 69 67 6e 65 64 20  ically assigned 
2e540 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
2e550 63 68 61 6e 63 65 20 6f 66 20 61 20 63 6f 6e 66  chance of a conf
2e560 6c 69 63 74 29 2c 20 61 6e 64 20 0a 20 20 20 20  lict), and .    
2e570 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
2e580 6e 74 20 69 73 20 65 69 74 68 65 72 20 61 6e 20  nt is either an 
2e590 49 4e 53 45 52 54 20 6f 72 20 61 6e 20 55 50 44  INSERT or an UPD
2e5a0 41 54 45 20 74 68 61 74 20 6d 6f 64 69 66 69 65  ATE that modifie
2e5b0 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72  s the.      ** r
2e5c0 6f 77 69 64 20 63 6f 6c 75 6d 6e 2e 20 53 6f 20  owid column. So 
2e5d0 69 66 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20  if the conflict 
2e5e0 6d 6f 64 65 20 69 73 20 52 45 50 4c 41 43 45 2c  mode is REPLACE,
2e5f0 20 74 68 65 6e 20 64 65 6c 65 74 65 20 61 6e 79   then delete any
2e600 0a 20 20 20 20 20 20 2a 2a 20 65 78 69 73 74 69  .      ** existi
2e610 6e 67 20 72 6f 77 20 77 69 74 68 20 72 6f 77 69  ng row with rowi
2e620 64 3d 70 4e 65 77 52 6f 77 69 64 2e 20 0a 20 20  d=pNewRowid. .  
2e630 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2e640 4f 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 66 6c  Or, if the confl
2e650 69 63 74 20 6d 6f 64 65 20 69 73 20 6e 6f 74 20  ict mode is not 
2e660 52 45 50 4c 41 43 45 2c 20 69 6e 73 65 72 74 20  REPLACE, insert 
2e670 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 69  the new record i
2e680 6e 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  nto .      ** th
2e690 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c  e %_content tabl
2e6a0 65 2e 20 49 66 20 77 65 20 68 69 74 20 74 68 65  e. If we hit the
2e6b0 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77 69 64   duplicate rowid
2e6c0 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 6f 72 20   constraint (or 
2e6d0 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  any.      ** oth
2e6e0 65 72 20 65 72 72 6f 72 29 20 77 68 69 6c 65 20  er error) while 
2e6f0 64 6f 69 6e 67 20 73 6f 2c 20 72 65 74 75 72 6e  doing so, return
2e700 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
2e710 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2e720 54 68 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20  This branch may 
2e730 61 6c 73 6f 20 72 75 6e 20 69 66 20 70 4e 65 77  also run if pNew
2e740 52 6f 77 69 64 20 63 6f 6e 74 61 69 6e 73 20 61  Rowid contains a
2e750 20 76 61 6c 75 65 20 74 68 61 74 20 63 61 6e 6e   value that cann
2e760 6f 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 6c  ot.      ** be l
2e770 6f 73 73 6c 65 73 73 6c 79 20 63 6f 6e 76 65 72  osslessly conver
2e780 74 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  ted to an intege
2e790 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  r. In this case,
2e7a0 20 74 68 65 20 65 76 65 6e 74 75 61 6c 20 0a 20   the eventual . 
2e7b0 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
2e7c0 66 74 73 33 49 6e 73 65 72 74 44 61 74 61 28 29  fts3InsertData()
2e7d0 20 28 65 69 74 68 65 72 20 6a 75 73 74 20 62 65   (either just be
2e7e0 6c 6f 77 20 6f 72 20 66 75 72 74 68 65 72 20 6f  low or further o
2e7f0 6e 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 20  n in this.      
2e800 2a 2a 20 66 75 6e 63 74 69 6f 6e 29 20 77 69 6c  ** function) wil
2e810 6c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  l return SQLITE_
2e820 4d 49 53 4d 41 54 43 48 2e 20 49 66 20 66 74 73  MISMATCH. If fts
2e830 33 44 65 6c 65 74 65 42 79 52 6f 77 69 64 20 69  3DeleteByRowid i
2e840 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 6f  s .      ** invo
2e850 6b 65 64 2c 20 69 74 20 77 69 6c 6c 20 64 65 6c  ked, it will del
2e860 65 74 65 20 7a 65 72 6f 20 72 6f 77 73 20 28 73  ete zero rows (s
2e870 69 6e 63 65 20 6e 6f 20 72 6f 77 20 77 69 6c 6c  ince no row will
2e880 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 64   have.      ** d
2e890 6f 63 69 64 3d 24 70 4e 65 77 52 6f 77 69 64 20  ocid=$pNewRowid 
2e8a0 69 66 20 24 70 4e 65 77 52 6f 77 69 64 20 69 73  if $pNewRowid is
2e8b0 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
2e8c0 76 61 6c 75 65 29 2e 0a 20 20 20 20 20 20 2a 2f  value)..      */
2e8d0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2e8e0 65 33 5f 76 74 61 62 5f 6f 6e 5f 63 6f 6e 66 6c  e3_vtab_on_confl
2e8f0 69 63 74 28 70 2d 3e 64 62 29 3d 3d 53 51 4c 49  ict(p->db)==SQLI
2e900 54 45 5f 52 45 50 4c 41 43 45 20 29 7b 0a 20 20  TE_REPLACE ){.  
2e910 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 44        rc = fts3D
2e920 65 6c 65 74 65 42 79 52 6f 77 69 64 28 70 2c 20  eleteByRowid(p, 
2e930 70 4e 65 77 52 6f 77 69 64 2c 20 26 6e 43 68 6e  pNewRowid, &nChn
2e940 67 2c 20 61 53 7a 44 65 6c 29 3b 0a 20 20 20 20  g, aSzDel);.    
2e950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2e960 20 72 63 20 3d 20 66 74 73 33 49 6e 73 65 72 74   rc = fts3Insert
2e970 44 61 74 61 28 70 2c 20 61 70 56 61 6c 2c 20 70  Data(p, apVal, p
2e980 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
2e990 62 49 6e 73 65 72 74 44 6f 6e 65 20 3d 20 31 3b  bInsertDone = 1;
2e9a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2e9b0 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
2e9c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
2e9d0 74 6f 20 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20  to update_out;. 
2e9e0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
2e9f0 20 69 73 20 61 20 44 45 4c 45 54 45 20 6f 72 20   is a DELETE or 
2ea00 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e  UPDATE operation
2ea10 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 6c 64  , remove the old
2ea20 20 72 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 69 66   record. */.  if
2ea30 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
2ea40 74 79 70 65 28 61 70 56 61 6c 5b 30 5d 29 21 3d  type(apVal[0])!=
2ea50 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20  SQLITE_NULL ){. 
2ea60 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2ea70 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70  e3_value_type(ap
2ea80 56 61 6c 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f  Val[0])==SQLITE_
2ea90 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 72  INTEGER );.    r
2eaa0 63 20 3d 20 66 74 73 33 44 65 6c 65 74 65 42 79  c = fts3DeleteBy
2eab0 52 6f 77 69 64 28 70 2c 20 61 70 56 61 6c 5b 30  Rowid(p, apVal[0
2eac0 5d 2c 20 26 6e 43 68 6e 67 2c 20 61 53 7a 44 65  ], &nChng, aSzDe
2ead0 6c 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  l);.  }.  .  /* 
2eae0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 49 4e  If this is an IN
2eaf0 53 45 52 54 20 6f 72 20 55 50 44 41 54 45 20 6f  SERT or UPDATE o
2eb00 70 65 72 61 74 69 6f 6e 2c 20 69 6e 73 65 72 74  peration, insert
2eb10 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 2e   the new record.
2eb20 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3e 31   */.  if( nArg>1
2eb30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2eb40 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 61  K ){.    int iLa
2eb50 6e 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76  ngid = sqlite3_v
2eb60 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 32  alue_int(apVal[2
2eb70 20 2b 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b 20   + p->nColumn + 
2eb80 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 62 49 6e  2]);.    if( bIn
2eb90 73 65 72 74 44 6f 6e 65 3d 3d 30 20 29 7b 0a 20  sertDone==0 ){. 
2eba0 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e       rc = fts3In
2ebb0 73 65 72 74 44 61 74 61 28 70 2c 20 61 70 56 61  sertData(p, apVa
2ebc0 6c 2c 20 70 52 6f 77 69 64 29 3b 0a 20 20 20 20  l, pRowid);.    
2ebd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ebe0 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70  _CONSTRAINT && p
2ebf0 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d 30  ->zContentTbl==0
2ec00 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2ec10 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41   FTS_CORRUPT_VTA
2ec20 42 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  B;.      }.    }
2ec30 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2ec40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ec50 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67  rc = fts3Pending
2ec60 54 65 72 6d 73 44 6f 63 69 64 28 70 2c 20 30 2c  TermsDocid(p, 0,
2ec70 20 69 4c 61 6e 67 69 64 2c 20 2a 70 52 6f 77 69   iLangid, *pRowi
2ec80 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  d);.    }.    if
2ec90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2eca0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2ecb0 20 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 3d 3d   p->iPrevDocid==
2ecc0 2a 70 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20  *pRowid );.     
2ecd0 20 72 63 20 3d 20 66 74 73 33 49 6e 73 65 72 74   rc = fts3Insert
2ece0 54 65 72 6d 73 28 70 2c 20 69 4c 61 6e 67 69 64  Terms(p, iLangid
2ecf0 2c 20 61 70 56 61 6c 2c 20 61 53 7a 49 6e 73 29  , apVal, aSzIns)
2ed00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2ed10 70 2d 3e 62 48 61 73 44 6f 63 73 69 7a 65 20 29  p->bHasDocsize )
2ed20 7b 0a 20 20 20 20 20 20 66 74 73 33 49 6e 73 65  {.      fts3Inse
2ed30 72 74 44 6f 63 73 69 7a 65 28 26 72 63 2c 20 70  rtDocsize(&rc, p
2ed40 2c 20 61 53 7a 49 6e 73 29 3b 0a 20 20 20 20 7d  , aSzIns);.    }
2ed50 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20  .    nChng++;.  
2ed60 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 62 46 74 73  }..  if( p->bFts
2ed70 34 20 29 7b 0a 20 20 20 20 66 74 73 33 55 70 64  4 ){.    fts3Upd
2ed80 61 74 65 44 6f 63 54 6f 74 61 6c 73 28 26 72 63  ateDocTotals(&rc
2ed90 2c 20 70 2c 20 61 53 7a 49 6e 73 2c 20 61 53 7a  , p, aSzIns, aSz
2eda0 44 65 6c 2c 20 6e 43 68 6e 67 29 3b 0a 20 20 7d  Del, nChng);.  }
2edb0 0a 0a 20 75 70 64 61 74 65 5f 6f 75 74 3a 0a 20  .. update_out:. 
2edc0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 53   sqlite3_free(aS
2edd0 7a 44 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  zDel);.  sqlite3
2ede0 46 74 73 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73  Fts3SegmentsClos
2edf0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
2ee00 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 46 6c 75  c;.}../* .** Flu
2ee10 73 68 20 61 6e 79 20 64 61 74 61 20 69 6e 20 74  sh any data in t
2ee20 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73  he pending-terms
2ee30 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 64   hash table to d
2ee40 69 73 6b 2e 20 49 66 20 73 75 63 63 65 73 73 66  isk. If successf
2ee50 75 6c 2c 0a 2a 2a 20 6d 65 72 67 65 20 61 6c 6c  ul,.** merge all
2ee60 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 65   segments in the
2ee70 20 64 61 74 61 62 61 73 65 20 28 69 6e 63 6c 75   database (inclu
2ee80 64 69 6e 67 20 74 68 65 20 6e 65 77 20 73 65 67  ding the new seg
2ee90 6d 65 6e 74 2c 20 69 66 20 0a 2a 2a 20 74 68 65  ment, if .** the
2eea0 72 65 20 77 61 73 20 61 6e 79 20 64 61 74 61 20  re was any data 
2eeb0 74 6f 20 66 6c 75 73 68 29 20 69 6e 74 6f 20 61  to flush) into a
2eec0 20 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 2e   single segment.
2eed0 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
2eee0 46 74 73 33 4f 70 74 69 6d 69 7a 65 28 46 74 73  Fts3Optimize(Fts
2eef0 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e  3Table *p){.  in
2ef00 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  t rc;.  rc = sql
2ef10 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
2ef20 20 22 53 41 56 45 50 4f 49 4e 54 20 66 74 73 33   "SAVEPOINT fts3
2ef30 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69  ", 0, 0, 0);.  i
2ef40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ef50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
2ef60 33 44 6f 4f 70 74 69 6d 69 7a 65 28 70 2c 20 31  3DoOptimize(p, 1
2ef70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2ef80 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  QLITE_OK || rc==
2ef90 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
2efa0 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 73       int rc2 = s
2efb0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
2efc0 62 2c 20 22 52 45 4c 45 41 53 45 20 66 74 73 33  b, "RELEASE fts3
2efd0 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
2efe0 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49     if( rc2!=SQLI
2eff0 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32  TE_OK ) rc = rc2
2f000 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2f010 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
2f020 70 2d 3e 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b  p->db, "ROLLBACK
2f030 20 54 4f 20 66 74 73 33 22 2c 20 30 2c 20 30 2c   TO fts3", 0, 0,
2f040 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
2f050 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
2f060 52 45 4c 45 41 53 45 20 66 74 73 33 22 2c 20 30  RELEASE fts3", 0
2f070 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
2f080 20 7d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33   }.  sqlite3Fts3
2f090 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28 70 29  SegmentsClose(p)
2f0a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2f0b0 0a 0a 23 65 6e 64 69 66 0a                       ..#endif.