/ Hex Artifact Content
Login

Artifact 05fd879124769bb59af4263c63a4c5bd6370e49b6dc906208150e3ad29ebf813:


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 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f   int f = SQLITE_
4050: 50 52 45 50 41 52 45 5f 50 45 52 53 49 53 54 45  PREPARE_PERSISTE
4060: 4e 54 7c 53 51 4c 49 54 45 5f 50 52 45 50 41 52  NT|SQLITE_PREPAR
4070: 45 5f 4e 4f 5f 56 54 41 42 3b 0a 20 20 20 20 63  E_NO_VTAB;.    c
4080: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 69  har *zSql;.    i
4090: 66 28 20 65 53 74 6d 74 3d 3d 53 51 4c 5f 43 4f  f( eStmt==SQL_CO
40a0: 4e 54 45 4e 54 5f 49 4e 53 45 52 54 20 29 7b 0a  NTENT_INSERT ){.
40b0: 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
40c0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 7a 53  ite3_mprintf(azS
40d0: 71 6c 5b 65 53 74 6d 74 5d 2c 20 70 2d 3e 7a 44  ql[eStmt], p->zD
40e0: 62 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70 2d 3e  b, p->zName, p->
40f0: 7a 57 72 69 74 65 45 78 70 72 6c 69 73 74 29 3b  zWriteExprlist);
4100: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
4110: 53 74 6d 74 3d 3d 53 51 4c 5f 53 45 4c 45 43 54  Stmt==SQL_SELECT
4120: 5f 43 4f 4e 54 45 4e 54 5f 42 59 5f 52 4f 57 49  _CONTENT_BY_ROWI
4130: 44 20 29 7b 0a 20 20 20 20 20 20 66 20 26 3d 20  D ){.      f &= 
4140: 7e 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f  ~SQLITE_PREPARE_
4150: 4e 4f 5f 56 54 41 42 3b 0a 20 20 20 20 20 20 7a  NO_VTAB;.      z
4160: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
4170: 72 69 6e 74 66 28 61 7a 53 71 6c 5b 65 53 74 6d  rintf(azSql[eStm
4180: 74 5d 2c 20 70 2d 3e 7a 52 65 61 64 45 78 70 72  t], p->zReadExpr
4190: 6c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  list);.    }else
41a0: 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73  {.      zSql = s
41b0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
41c0: 7a 53 71 6c 5b 65 53 74 6d 74 5d 2c 20 70 2d 3e  zSql[eStmt], p->
41d0: 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  zDb, p->zName);.
41e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a      }.    if( !z
41f0: 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Sql ){.      rc 
4200: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
4210: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4220: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
4230: 65 70 61 72 65 5f 76 33 28 70 2d 3e 64 62 2c 20  epare_v3(p->db, 
4240: 7a 53 71 6c 2c 20 2d 31 2c 20 66 2c 20 26 70 53  zSql, -1, f, &pS
4250: 74 6d 74 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  tmt, NULL);.    
4260: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
4270: 53 71 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Sql);.      asse
4280: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
4290: 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 20 29 3b  K || pStmt==0 );
42a0: 0a 20 20 20 20 20 20 70 2d 3e 61 53 74 6d 74 5b  .      p->aStmt[
42b0: 65 53 74 6d 74 5d 20 3d 20 70 53 74 6d 74 3b 0a  eStmt] = pStmt;.
42c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
42d0: 61 70 56 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  apVal ){.    int
42e0: 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 50 61 72   i;.    int nPar
42f0: 61 6d 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  am = sqlite3_bin
4300: 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e  d_parameter_coun
4310: 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 66 6f  t(pStmt);.    fo
4320: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
4330: 45 5f 4f 4b 20 26 26 20 69 3c 6e 50 61 72 61 6d  E_OK && i<nParam
4340: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63  ; i++){.      rc
4350: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
4360: 76 61 6c 75 65 28 70 53 74 6d 74 2c 20 69 2b 31  value(pStmt, i+1
4370: 2c 20 61 70 56 61 6c 5b 69 5d 29 3b 0a 20 20 20  , apVal[i]);.   
4380: 20 7d 0a 20 20 7d 0a 20 20 2a 70 70 20 3d 20 70   }.  }.  *pp = p
4390: 53 74 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 72  Stmt;.  return r
43a0: 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69 6e  c;.}...static in
43b0: 74 20 66 74 73 33 53 65 6c 65 63 74 44 6f 63 73  t fts3SelectDocs
43c0: 69 7a 65 28 0a 20 20 46 74 73 33 54 61 62 6c 65  ize(.  Fts3Table
43d0: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
43e0: 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74         /* FTS3 t
43f0: 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
4400: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
4410: 44 6f 63 69 64 2c 20 20 20 20 20 20 20 20 20 20  Docid,          
4420: 20 2f 2a 20 44 6f 63 69 64 20 74 6f 20 62 69 6e   /* Docid to bin
4430: 64 20 66 6f 72 20 53 51 4c 5f 53 45 4c 45 43 54  d for SQL_SELECT
4440: 5f 44 4f 43 53 49 5a 45 20 2a 2f 0a 20 20 73 71  _DOCSIZE */.  sq
4450: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53  lite3_stmt **ppS
4460: 74 6d 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a  tmt           /*
4470: 20 4f 55 54 3a 20 53 74 61 74 65 6d 65 6e 74 20   OUT: Statement 
4480: 68 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73  handle */.){.  s
4490: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
44a0: 6d 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  mt = 0;        /
44b0: 2a 20 53 74 61 74 65 6d 65 6e 74 20 72 65 71 75  * Statement requ
44c0: 65 73 74 65 64 20 66 72 6f 6d 20 66 74 73 33 53  ested from fts3S
44d0: 71 6c 53 74 6d 74 28 29 20 2a 2f 0a 20 20 69 6e  qlStmt() */.  in
44e0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4500: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
4510: 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
4520: 74 6d 74 28 70 54 61 62 2c 20 53 51 4c 5f 53 45  tmt(pTab, SQL_SE
4530: 4c 45 43 54 5f 44 4f 43 53 49 5a 45 2c 20 26 70  LECT_DOCSIZE, &p
4540: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  Stmt, 0);.  if( 
4550: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
4560: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
4570: 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31  d_int64(pStmt, 1
4580: 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 72  , iDocid);.    r
4590: 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
45a0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28  (pStmt);.    if(
45b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20   rc!=SQLITE_ROW 
45c0: 7c 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  || sqlite3_colum
45d0: 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 30 29  n_type(pStmt, 0)
45e0: 21 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b  !=SQLITE_BLOB ){
45f0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
4600: 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
4610: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
4620: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
4630: 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41   FTS_CORRUPT_VTA
4640: 42 3b 0a 20 20 20 20 20 20 70 53 74 6d 74 20 3d  B;.      pStmt =
4650: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
4660: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
4670: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  _OK;.    }.  }..
4680: 20 20 2a 70 70 53 74 6d 74 20 3d 20 70 53 74 6d    *ppStmt = pStm
4690: 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
46a0: 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  }..int sqlite3Ft
46b0: 73 33 53 65 6c 65 63 74 44 6f 63 74 6f 74 61 6c  s3SelectDoctotal
46c0: 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
46d0: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
46e0: 20 20 20 20 2f 2a 20 46 74 73 33 20 74 61 62 6c      /* Fts3 tabl
46f0: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71  e handle */.  sq
4700: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53  lite3_stmt **ppS
4710: 74 6d 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a  tmt           /*
4720: 20 4f 55 54 3a 20 53 74 61 74 65 6d 65 6e 74 20   OUT: Statement 
4730: 68 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73  handle */.){.  s
4740: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
4750: 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  mt = 0;.  int rc
4760: 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  ;.  rc = fts3Sql
4770: 53 74 6d 74 28 70 54 61 62 2c 20 53 51 4c 5f 53  Stmt(pTab, SQL_S
4780: 45 4c 45 43 54 5f 53 54 41 54 2c 20 26 70 53 74  ELECT_STAT, &pSt
4790: 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  mt, 0);.  if( rc
47a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
47b0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
47c0: 69 6e 74 28 70 53 74 6d 74 2c 20 31 2c 20 46 54  int(pStmt, 1, FT
47d0: 53 5f 53 54 41 54 5f 44 4f 43 54 4f 54 41 4c 29  S_STAT_DOCTOTAL)
47e0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
47f0: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 21 3d 53  3_step(pStmt)!=S
4800: 51 4c 49 54 45 5f 52 4f 57 0a 20 20 20 20 20 7c  QLITE_ROW.     |
4810: 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  | sqlite3_column
4820: 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 30 29 21  _type(pStmt, 0)!
4830: 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 0a 20 20 20  =SQLITE_BLOB.   
4840: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
4850: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
4860: 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  mt);.      if( r
4870: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
4880: 63 20 3d 20 46 54 53 5f 43 4f 52 52 55 50 54 5f  c = FTS_CORRUPT_
4890: 56 54 41 42 3b 0a 20 20 20 20 20 20 70 53 74 6d  VTAB;.      pStm
48a0: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
48b0: 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 70 53 74  .  *ppStmt = pSt
48c0: 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  mt;.  return rc;
48d0: 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .}..int sqlite3F
48e0: 74 73 33 53 65 6c 65 63 74 44 6f 63 73 69 7a 65  ts3SelectDocsize
48f0: 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
4900: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
4910: 20 20 20 20 2f 2a 20 46 74 73 33 20 74 61 62 6c      /* Fts3 tabl
4920: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71  e handle */.  sq
4930: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 6f 63  lite3_int64 iDoc
4940: 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  id,           /*
4950: 20 44 6f 63 69 64 20 74 6f 20 72 65 61 64 20 73   Docid to read s
4960: 69 7a 65 20 64 61 74 61 20 66 6f 72 20 2a 2f 0a  ize data for */.
4970: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
4980: 2a 70 70 53 74 6d 74 20 20 20 20 20 20 20 20 20  *ppStmt         
4990: 20 20 2f 2a 20 4f 55 54 3a 20 53 74 61 74 65 6d    /* OUT: Statem
49a0: 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 29 7b  ent handle */.){
49b0: 0a 20 20 72 65 74 75 72 6e 20 66 74 73 33 53 65  .  return fts3Se
49c0: 6c 65 63 74 44 6f 63 73 69 7a 65 28 70 54 61 62  lectDocsize(pTab
49d0: 2c 20 69 44 6f 63 69 64 2c 20 70 70 53 74 6d 74  , iDocid, ppStmt
49e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 69  );.}../*.** Simi
49f0: 6c 61 72 20 74 6f 20 66 74 73 33 53 71 6c 53 74  lar to fts3SqlSt
4a00: 6d 74 28 29 2e 20 45 78 63 65 70 74 2c 20 61 66  mt(). Except, af
4a10: 74 65 72 20 62 69 6e 64 69 6e 67 20 74 68 65 20  ter binding the 
4a20: 70 61 72 61 6d 65 74 65 72 73 20 69 6e 0a 2a 2a  parameters in.**
4a30: 20 61 72 72 61 79 20 61 70 56 61 6c 5b 5d 20 74   array apVal[] t
4a40: 6f 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  o the SQL statem
4a50: 65 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20 62  ent identified b
4a60: 79 20 65 53 74 6d 74 2c 20 74 68 65 20 73 74 61  y eStmt, the sta
4a70: 74 65 6d 65 6e 74 0a 2a 2a 20 69 73 20 65 78 65  tement.** is exe
4a80: 63 75 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  cuted..**.** Ret
4a90: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urns SQLITE_OK i
4aa0: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
4ab0: 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
4ac0: 65 78 65 63 75 74 65 64 2c 20 6f 72 20 61 6e 0a  executed, or an.
4ad0: 2a 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  ** SQLite error 
4ae0: 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
4af0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
4b00: 74 73 33 53 71 6c 45 78 65 63 28 0a 20 20 69 6e  ts3SqlExec(.  in
4b10: 74 20 2a 70 52 43 2c 20 20 20 20 20 20 20 20 20  t *pRC,         
4b20: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
4b30: 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 54   code */.  Fts3T
4b40: 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
4b50: 20 20 20 20 2f 2a 20 54 68 65 20 46 54 53 33 20      /* The FTS3 
4b60: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 65  table */.  int e
4b70: 53 74 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20  Stmt,           
4b80: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
4b90: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 76 61  statement to eva
4ba0: 6c 75 61 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74  luate */.  sqlit
4bb0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
4bc0: 20 20 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72      /* Parameter
4bd0: 73 20 74 6f 20 62 69 6e 64 20 2a 2f 0a 29 7b 0a  s to bind */.){.
4be0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
4bf0: 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b  pStmt;.  int rc;
4c00: 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
4c10: 74 75 72 6e 3b 0a 20 20 72 63 20 3d 20 66 74 73  turn;.  rc = fts
4c20: 33 53 71 6c 53 74 6d 74 28 70 2c 20 65 53 74 6d  3SqlStmt(p, eStm
4c30: 74 2c 20 26 70 53 74 6d 74 2c 20 61 70 56 61 6c  t, &pStmt, apVal
4c40: 29 3b 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ); .  if( rc==SQ
4c50: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
4c60: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
4c70: 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  t);.    rc = sql
4c80: 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
4c90: 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 43 20 3d 20  );.  }.  *pRC = 
4ca0: 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
4cb0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 6e 73 75  is function ensu
4cc0: 72 65 73 20 74 68 61 74 20 74 68 65 20 63 61 6c  res that the cal
4cd0: 6c 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65 64  ler has obtained
4ce0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 2a   an exclusive .*
4cf0: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
4d00: 61 62 6c 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  able-lock on the
4d10: 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 2e   %_segdir table.
4d20: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
4d30: 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20 77 72 69  d before .** wri
4d40: 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65  ting data to the
4d50: 20 66 74 73 33 20 74 61 62 6c 65 2e 20 49 66 20   fts3 table. If 
4d60: 74 68 69 73 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  this lock is not
4d70: 20 61 63 71 75 69 72 65 64 20 66 69 72 73 74 2c   acquired first,
4d80: 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c   then.** the cal
4d90: 6c 65 72 20 6d 61 79 20 65 6e 64 20 75 70 20 61  ler may end up a
4da0: 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 74 61 6b  ttempting to tak
4db0: 65 20 74 68 69 73 20 6c 6f 63 6b 20 61 73 20 70  e this lock as p
4dc0: 61 72 74 20 6f 66 20 63 6f 6d 6d 69 74 74 69 6e  art of committin
4dd0: 67 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  g.** a transacti
4de0: 6f 6e 2c 20 63 61 75 73 69 6e 67 20 53 51 4c 69  on, causing SQLi
4df0: 74 65 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c  te to return SQL
4e00: 49 54 45 5f 4c 4f 43 4b 45 44 20 6f 72 20 0a 2a  ITE_LOCKED or .*
4e10: 2a 20 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  * LOCKED_SHAREDC
4e20: 41 43 48 45 74 6f 20 61 20 43 4f 4d 4d 49 54 20  ACHEto a COMMIT 
4e30: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49  command..**.** I
4e40: 74 20 69 73 20 62 65 73 74 20 74 6f 20 61 76 6f  t is best to avo
4e50: 69 64 20 74 68 69 73 20 62 65 63 61 75 73 65 20  id this because 
4e60: 69 66 20 46 54 53 33 20 72 65 74 75 72 6e 73 20  if FTS3 returns 
4e70: 61 6e 79 20 65 72 72 6f 72 20 77 68 65 6e 20 0a  any error when .
4e80: 2a 2a 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  ** committing a 
4e90: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
4ea0: 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69   whole transacti
4eb0: 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65  on will be rolle
4ec0: 64 20 62 61 63 6b 2e 20 0a 2a 2a 20 41 6e 64 20  d back. .** And 
4ed0: 74 68 69 73 20 69 73 20 6e 6f 74 20 77 68 61 74  this is not what
4ee0: 20 75 73 65 72 73 20 65 78 70 65 63 74 20 77 68   users expect wh
4ef0: 65 6e 20 74 68 65 79 20 67 65 74 20 53 51 4c 49  en they get SQLI
4f00: 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
4f10: 43 41 43 48 45 2e 20 0a 2a 2a 20 49 74 20 63 61  CACHE. .** It ca
4f20: 6e 20 73 74 69 6c 6c 20 68 61 70 70 65 6e 20 69  n still happen i
4f30: 66 20 74 68 65 20 75 73 65 72 20 6c 6f 63 6b 73  f the user locks
4f40: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
4f50: 74 61 62 6c 65 73 20 64 69 72 65 63 74 6c 79 20  tables directly 
4f60: 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 61  .** instead of a
4f70: 63 63 65 73 73 69 6e 67 20 74 68 65 6d 20 76 69  ccessing them vi
4f80: 61 20 46 54 53 2e 0a 2a 2f 0a 73 74 61 74 69 63  a FTS..*/.static
4f90: 20 69 6e 74 20 66 74 73 33 57 72 69 74 65 6c 6f   int fts3Writelo
4fa0: 63 6b 28 46 74 73 33 54 61 62 6c 65 20 2a 70 29  ck(Fts3Table *p)
4fb0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
4fc0: 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28  ITE_OK;.  .  if(
4fd0: 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61   p->nPendingData
4fe0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
4ff0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
5000: 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c      rc = fts3Sql
5010: 53 74 6d 74 28 70 2c 20 53 51 4c 5f 44 45 4c 45  Stmt(p, SQL_DELE
5020: 54 45 5f 53 45 47 44 49 52 5f 4c 45 56 45 4c 2c  TE_SEGDIR_LEVEL,
5030: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
5040: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5050: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
5060: 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53  te3_bind_null(pS
5070: 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  tmt, 1);.      s
5080: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
5090: 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
50a0: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
50b0: 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mt);.    }.  }..
50c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
50d0: 2f 2a 0a 2a 2a 20 46 54 53 20 6d 61 69 6e 74 61  /*.** FTS mainta
50e0: 69 6e 73 20 61 20 73 65 70 61 72 61 74 65 20 69  ins a separate i
50f0: 6e 64 65 78 65 73 20 66 6f 72 20 65 61 63 68 20  ndexes for each 
5100: 6c 61 6e 67 75 61 67 65 2d 69 64 20 28 61 20 33  language-id (a 3
5110: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 29 2e 0a  2-bit integer)..
5120: 2a 2a 20 57 69 74 68 69 6e 20 65 61 63 68 20 6c  ** Within each l
5130: 61 6e 67 75 61 67 65 20 69 64 2c 20 61 20 73 65  anguage id, a se
5140: 70 61 72 61 74 65 20 69 6e 64 65 78 20 69 73 20  parate index is 
5150: 6d 61 69 6e 74 61 69 6e 65 64 20 74 6f 20 73 74  maintained to st
5160: 6f 72 65 20 74 68 65 0a 2a 2a 20 64 6f 63 75 6d  ore the.** docum
5170: 65 6e 74 20 74 65 72 6d 73 2c 20 61 6e 64 20 65  ent terms, and e
5180: 61 63 68 20 63 6f 6e 66 69 67 75 72 65 64 20 70  ach configured p
5190: 72 65 66 69 78 20 73 69 7a 65 20 28 63 6f 6e 66  refix size (conf
51a0: 69 67 75 72 65 64 20 74 68 65 20 46 54 53 20 0a  igured the FTS .
51b0: 2a 2a 20 22 70 72 65 66 69 78 3d 22 20 6f 70 74  ** "prefix=" opt
51c0: 69 6f 6e 29 2e 20 41 6e 64 20 65 61 63 68 20 69  ion). And each i
51d0: 6e 64 65 78 20 63 6f 6e 73 69 73 74 73 20 6f 66  ndex consists of
51e0: 20 6d 75 6c 74 69 70 6c 65 20 6c 65 76 65 6c 73   multiple levels
51f0: 20 28 22 72 65 6c 61 74 69 76 65 0a 2a 2a 20 6c   ("relative.** l
5200: 65 76 65 6c 73 22 29 2e 0a 2a 2a 0a 2a 2a 20 41  evels")..**.** A
5210: 6c 6c 20 74 68 72 65 65 20 6f 66 20 74 68 65 73  ll three of thes
5220: 65 20 76 61 6c 75 65 73 20 28 74 68 65 20 6c 61  e values (the la
5230: 6e 67 75 61 67 65 20 69 64 2c 20 74 68 65 20 73  nguage id, the s
5240: 70 65 63 69 66 69 63 20 69 6e 64 65 78 20 61 6e  pecific index an
5250: 64 20 74 68 65 0a 2a 2a 20 6c 65 76 65 6c 20 77  d the.** level w
5260: 69 74 68 69 6e 20 74 68 65 20 69 6e 64 65 78 29  ithin the index)
5270: 20 61 72 65 20 65 6e 63 6f 64 65 64 20 69 6e 20   are encoded in 
5280: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76  64-bit integer v
5290: 61 6c 75 65 73 20 73 74 6f 72 65 64 0a 2a 2a 20  alues stored.** 
52a0: 69 6e 20 74 68 65 20 25 5f 73 65 67 64 69 72 20  in the %_segdir 
52b0: 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54  table on disk. T
52c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
52d0: 75 73 65 64 20 74 6f 20 63 6f 6e 76 65 72 74 20  used to convert 
52e0: 74 68 72 65 65 0a 2a 2a 20 73 65 70 61 72 61 74  three.** separat
52f0: 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 76 61 6c 75  e component valu
5300: 65 73 20 69 6e 74 6f 20 74 68 65 20 73 69 6e 67  es into the sing
5310: 6c 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65  le 64-bit intege
5320: 72 20 76 61 6c 75 65 20 74 68 61 74 0a 2a 2a 20  r value that.** 
5330: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 71  can be used to q
5340: 75 65 72 79 20 74 68 65 20 25 5f 73 65 67 64 69  uery the %_segdi
5350: 72 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  r table..**.** S
5360: 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 65 61 63  pecifically, eac
5370: 68 20 6c 61 6e 67 75 61 67 65 2d 69 64 2f 69 6e  h language-id/in
5380: 64 65 78 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  dex combination 
5390: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 31 30 32  is allocated 102
53a0: 34 20 0a 2a 2a 20 36 34 2d 62 69 74 20 69 6e 74  4 .** 64-bit int
53b0: 65 67 65 72 20 6c 65 76 65 6c 20 76 61 6c 75 65  eger level value
53c0: 73 20 28 22 61 62 73 6f 6c 75 74 65 20 6c 65 76  s ("absolute lev
53d0: 65 6c 73 22 29 2e 20 54 68 65 20 6d 61 69 6e 20  els"). The main 
53e0: 74 65 72 6d 73 20 69 6e 64 65 78 0a 2a 2a 20 66  terms index.** f
53f0: 6f 72 20 6c 61 6e 67 75 61 67 65 2d 69 64 20 30  or language-id 0
5400: 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 76 61 6c   is allocate val
5410: 75 65 73 20 30 2d 31 30 32 33 2e 20 54 68 65 20  ues 0-1023. The 
5420: 66 69 72 73 74 20 70 72 65 66 69 78 20 69 6e 64  first prefix ind
5430: 65 78 0a 2a 2a 20 28 69 66 20 61 6e 79 29 20 66  ex.** (if any) f
5440: 6f 72 20 6c 61 6e 67 75 61 67 65 2d 69 64 20 30  or language-id 0
5450: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 76 61   is allocated va
5460: 6c 75 65 73 20 31 30 32 34 2d 32 30 34 37 2e 20  lues 1024-2047. 
5470: 41 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 20 4c 61  And so on..** La
5480: 6e 67 75 61 67 65 20 31 20 69 6e 64 65 78 65 73  nguage 1 indexes
5490: 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 69   are allocated i
54a0: 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
54b0: 77 69 6e 67 20 6c 61 6e 67 75 61 67 65 20 30 2e  wing language 0.
54c0: 0a 2a 2a 0a 2a 2a 20 53 6f 2c 20 66 6f 72 20 61  .**.** So, for a
54d0: 20 73 79 73 74 65 6d 20 77 69 74 68 20 6e 50 72   system with nPr
54e0: 65 66 69 78 20 70 72 65 66 69 78 20 69 6e 64 65  efix prefix inde
54f0: 78 65 73 20 63 6f 6e 66 69 67 75 72 65 64 2c 20  xes configured, 
5500: 74 68 65 20 62 6c 6f 63 6b 20 6f 66 0a 2a 2a 20  the block of.** 
5510: 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 73 20  absolute levels 
5520: 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
5530: 20 74 6f 20 6c 61 6e 67 75 61 67 65 2d 69 64 20   to language-id 
5540: 69 4c 61 6e 67 69 64 20 61 6e 64 20 69 6e 64 65  iLangid and inde
5550: 78 20 0a 2a 2a 20 69 49 6e 64 65 78 20 73 74 61  x .** iIndex sta
5560: 72 74 73 20 61 74 20 61 62 73 6f 6c 75 74 65 20  rts at absolute 
5570: 6c 65 76 65 6c 20 28 28 69 4c 61 6e 67 69 64 20  level ((iLangid 
5580: 2a 20 28 6e 50 72 65 66 69 78 2b 31 29 20 2b 20  * (nPrefix+1) + 
5590: 69 49 6e 64 65 78 29 20 2a 20 31 30 32 34 29 2e  iIndex) * 1024).
55a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
55b0: 65 33 5f 69 6e 74 36 34 20 67 65 74 41 62 73 6f  e3_int64 getAbso
55c0: 6c 75 74 65 4c 65 76 65 6c 28 0a 20 20 46 74 73  luteLevel(.  Fts
55d0: 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
55f0: 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c  FTS3 table handl
5600: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67  e */.  int iLang
5610: 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
5620: 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61         /* Langua
5630: 67 65 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69  ge id */.  int i
5640: 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20  Index,          
5650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
5660: 64 65 78 20 69 6e 20 70 2d 3e 61 49 6e 64 65 78  dex in p->aIndex
5670: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76  [] */.  int iLev
5680: 65 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  el              
5690: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c          /* Level
56a0: 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a   of segments */.
56b0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ){.  sqlite3_int
56c0: 36 34 20 69 42 61 73 65 3b 20 20 20 20 20 20 20  64 iBase;       
56d0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 62       /* First ab
56e0: 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 66 6f 72  solute level for
56f0: 20 69 4c 61 6e 67 69 64 2f 69 49 6e 64 65 78 20   iLangid/iIndex 
5700: 2a 2f 0a 20 20 61 73 73 65 72 74 5f 66 74 73 33  */.  assert_fts3
5710: 5f 6e 63 28 20 69 4c 61 6e 67 69 64 3e 3d 30 20  _nc( iLangid>=0 
5720: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
5730: 6e 49 6e 64 65 78 3e 30 20 29 3b 0a 20 20 61 73  nIndex>0 );.  as
5740: 73 65 72 74 28 20 69 49 6e 64 65 78 3e 3d 30 20  sert( iIndex>=0 
5750: 26 26 20 69 49 6e 64 65 78 3c 70 2d 3e 6e 49 6e  && iIndex<p->nIn
5760: 64 65 78 20 29 3b 0a 0a 20 20 69 42 61 73 65 20  dex );..  iBase 
5770: 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  = ((sqlite3_int6
5780: 34 29 69 4c 61 6e 67 69 64 20 2a 20 70 2d 3e 6e  4)iLangid * p->n
5790: 49 6e 64 65 78 20 2b 20 69 49 6e 64 65 78 29 20  Index + iIndex) 
57a0: 2a 20 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41  * FTS3_SEGDIR_MA
57b0: 58 4c 45 56 45 4c 3b 0a 20 20 72 65 74 75 72 6e  XLEVEL;.  return
57c0: 20 69 42 61 73 65 20 2b 20 69 4c 65 76 65 6c 3b   iBase + iLevel;
57d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  .}../*.** Set *p
57e0: 70 53 74 6d 74 20 74 6f 20 61 20 73 74 61 74 65  pStmt to a state
57f0: 6d 65 6e 74 20 68 61 6e 64 6c 65 20 74 68 61 74  ment handle that
5800: 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20   may be used to 
5810: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a  iterate through.
5820: 2a 2a 20 61 6c 6c 20 72 6f 77 73 20 69 6e 20 74  ** all rows in t
5830: 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c  he %_segdir tabl
5840: 65 2c 20 66 72 6f 6d 20 6f 6c 64 65 73 74 20 74  e, from oldest t
5850: 6f 20 6e 65 77 65 73 74 2e 20 49 66 20 73 75 63  o newest. If suc
5860: 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75  cessful,.** retu
5870: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  rn SQLITE_OK. If
5880: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
5890: 20 77 68 69 6c 65 20 70 72 65 70 61 72 69 6e 67   while preparing
58a0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
58b0: 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51  .** return an SQ
58c0: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
58d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
58e0: 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 69 6e  only ever one in
58f0: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 53  stance of this S
5900: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d  QL statement com
5910: 70 69 6c 65 64 20 66 6f 72 0a 2a 2a 20 65 61 63  piled for.** eac
5920: 68 20 46 54 53 33 20 74 61 62 6c 65 2e 0a 2a 2a  h FTS3 table..**
5930: 0a 2a 2a 20 54 68 65 20 73 74 61 74 65 6d 65 6e  .** The statemen
5940: 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 66 6f  t returns the fo
5950: 6c 6c 6f 77 69 6e 67 20 63 6f 6c 75 6d 6e 73 20  llowing columns 
5960: 66 72 6f 6d 20 74 68 65 20 25 5f 73 65 67 64 69  from the %_segdi
5970: 72 20 74 61 62 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  r table:.**.**  
5980: 20 30 3a 20 69 64 78 0a 2a 2a 20 20 20 31 3a 20   0: idx.**   1: 
5990: 73 74 61 72 74 5f 62 6c 6f 63 6b 0a 2a 2a 20 20  start_block.**  
59a0: 20 32 3a 20 6c 65 61 76 65 73 5f 65 6e 64 5f 62   2: leaves_end_b
59b0: 6c 6f 63 6b 0a 2a 2a 20 20 20 33 3a 20 65 6e 64  lock.**   3: end
59c0: 5f 62 6c 6f 63 6b 0a 2a 2a 20 20 20 34 3a 20 72  _block.**   4: r
59d0: 6f 6f 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  oot.*/.int sqlit
59e0: 65 33 46 74 73 33 41 6c 6c 53 65 67 64 69 72 73  e3Fts3AllSegdirs
59f0: 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
5a00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5a10: 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c      /* FTS3 tabl
5a20: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67  e */.  int iLang
5a30: 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
5a40: 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61         /* Langua
5a50: 67 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  ge being queried
5a60: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 78   */.  int iIndex
5a70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5a80: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66        /* Index f
5a90: 6f 72 20 70 2d 3e 61 49 6e 64 65 78 5b 5d 20 2a  or p->aIndex[] *
5aa0: 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20  /.  int iLevel, 
5ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ac0: 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20      /* Level to 
5ad0: 73 65 6c 65 63 74 20 28 72 65 6c 61 74 69 76 65  select (relative
5ae0: 20 6c 65 76 65 6c 29 20 2a 2f 0a 20 20 73 71 6c   level) */.  sql
5af0: 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
5b00: 6d 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mt           /* 
5b10: 4f 55 54 3a 20 43 6f 6d 70 69 6c 65 64 20 73 74  OUT: Compiled st
5b20: 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  atement */.){.  
5b30: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
5b40: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
5b50: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c  0;..  assert( iL
5b60: 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55  evel==FTS3_SEGCU
5b70: 52 53 4f 52 5f 41 4c 4c 20 7c 7c 20 69 4c 65 76  RSOR_ALL || iLev
5b80: 65 6c 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  el>=0 );.  asser
5b90: 74 28 20 69 4c 65 76 65 6c 3c 46 54 53 33 5f 53  t( iLevel<FTS3_S
5ba0: 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 20 29  EGDIR_MAXLEVEL )
5bb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 49 6e 64  ;.  assert( iInd
5bc0: 65 78 3e 3d 30 20 26 26 20 69 49 6e 64 65 78 3c  ex>=0 && iIndex<
5bd0: 70 2d 3e 6e 49 6e 64 65 78 20 29 3b 0a 0a 20 20  p->nIndex );..  
5be0: 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a  if( iLevel<0 ){.
5bf0: 20 20 20 20 2f 2a 20 22 53 45 4c 45 43 54 20 2a      /* "SELECT *
5c00: 20 46 52 4f 4d 20 25 5f 73 65 67 64 69 72 20 57   FROM %_segdir W
5c10: 48 45 52 45 20 6c 65 76 65 6c 20 42 45 54 57 45  HERE level BETWE
5c20: 45 4e 20 3f 20 41 4e 44 20 3f 20 4f 52 44 45 52  EN ? AND ? ORDER
5c30: 20 42 59 20 2e 2e 2e 22 20 2a 2f 0a 20 20 20 20   BY ..." */.    
5c40: 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
5c50: 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c  (p, SQL_SELECT_L
5c60: 45 56 45 4c 5f 52 41 4e 47 45 2c 20 26 70 53 74  EVEL_RANGE, &pSt
5c70: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mt, 0);.    if( 
5c80: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5c90: 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f   .      sqlite3_
5ca0: 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
5cb0: 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c 75 74 65  , 1, getAbsolute
5cc0: 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64  Level(p, iLangid
5cd0: 2c 20 69 49 6e 64 65 78 2c 20 30 29 29 3b 0a 20  , iIndex, 0));. 
5ce0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
5cf0: 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 32  d_int64(pStmt, 2
5d00: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74  , .          get
5d10: 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c  AbsoluteLevel(p,
5d20: 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78   iLangid, iIndex
5d30: 2c 20 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41  , FTS3_SEGDIR_MA
5d40: 58 4c 45 56 45 4c 2d 31 29 0a 20 20 20 20 20 20  XLEVEL-1).      
5d50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
5d60: 7b 0a 20 20 20 20 2f 2a 20 22 53 45 4c 45 43 54  {.    /* "SELECT
5d70: 20 2a 20 46 52 4f 4d 20 25 5f 73 65 67 64 69 72   * FROM %_segdir
5d80: 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f   WHERE level = ?
5d90: 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 22 20 2a   ORDER BY ..." *
5da0: 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53  /.    rc = fts3S
5db0: 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45  qlStmt(p, SQL_SE
5dc0: 4c 45 43 54 5f 4c 45 56 45 4c 2c 20 26 70 53 74  LECT_LEVEL, &pSt
5dd0: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mt, 0);.    if( 
5de0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5df0: 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f   .      sqlite3_
5e00: 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
5e10: 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c 75 74 65  , 1, getAbsolute
5e20: 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64  Level(p, iLangid
5e30: 2c 20 69 49 6e 64 65 78 2c 69 4c 65 76 65 6c 29  , iIndex,iLevel)
5e40: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
5e50: 70 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a  ppStmt = pStmt;.
5e60: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
5e70: 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
5e80: 73 69 6e 67 6c 65 20 76 61 72 69 6e 74 20 74 6f  single varint to
5e90: 20 61 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 62   a PendingList b
5ea0: 75 66 66 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b  uffer. SQLITE_OK
5eb0: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
5ec0: 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
5ed0: 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
5ee0: 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  r code otherwise
5ef0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
5f00: 63 74 69 6f 6e 20 61 6c 73 6f 20 73 65 72 76 65  ction also serve
5f10: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  s to allocate th
5f20: 65 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 73 74  e PendingList st
5f30: 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a  ructure itself..
5f40: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
5f50: 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
5f60: 50 65 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75  PendingList stru
5f70: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cture containing
5f80: 20 74 77 6f 0a 2a 2a 20 76 61 72 69 6e 74 73 3a   two.** varints:
5f90: 0a 2a 2a 0a 2a 2a 20 20 20 50 65 6e 64 69 6e 67  .**.**   Pending
5fa0: 4c 69 73 74 20 2a 70 20 3d 20 30 3b 0a 2a 2a 20  List *p = 0;.** 
5fb0: 20 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73    fts3PendingLis
5fc0: 74 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  tAppendVarint(&p
5fd0: 2c 20 31 29 3b 0a 2a 2a 20 20 20 66 74 73 33 50  , 1);.**   fts3P
5fe0: 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64  endingListAppend
5ff0: 56 61 72 69 6e 74 28 26 70 2c 20 32 29 3b 0a 2a  Varint(&p, 2);.*
6000: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
6010: 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65  3PendingListAppe
6020: 6e 64 56 61 72 69 6e 74 28 0a 20 20 50 65 6e 64  ndVarint(.  Pend
6030: 69 6e 67 4c 69 73 74 20 2a 2a 70 70 2c 20 20 20  ingList **pp,   
6040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
6050: 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74  N/OUT: Pointer t
6060: 6f 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 73 74  o PendingList st
6070: 72 75 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ruct */.  sqlite
6080: 33 5f 69 6e 74 36 34 20 69 20 20 20 20 20 20 20  3_int64 i       
6090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
60a0: 75 65 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  ue to append to 
60b0: 64 61 74 61 20 2a 2f 0a 29 7b 0a 20 20 50 65 6e  data */.){.  Pen
60c0: 64 69 6e 67 4c 69 73 74 20 2a 70 20 3d 20 2a 70  dingList *p = *p
60d0: 70 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  p;..  /* Allocat
60e0: 65 20 6f 72 20 67 72 6f 77 20 74 68 65 20 50 65  e or grow the Pe
60f0: 6e 64 69 6e 67 4c 69 73 74 20 61 73 20 72 65 71  ndingList as req
6100: 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  uired. */.  if( 
6110: 21 70 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71  !p ){.    p = sq
6120: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
6130: 65 6f 66 28 2a 70 29 20 2b 20 31 30 30 29 3b 0a  eof(*p) + 100);.
6140: 20 20 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20      if( !p ){.  
6150: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6160: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
6170: 20 20 20 70 2d 3e 6e 53 70 61 63 65 20 3d 20 31     p->nSpace = 1
6180: 30 30 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74 61  00;.    p->aData
6190: 20 3d 20 28 63 68 61 72 20 2a 29 26 70 5b 31 5d   = (char *)&p[1]
61a0: 3b 0a 20 20 20 20 70 2d 3e 6e 44 61 74 61 20 3d  ;.    p->nData =
61b0: 20 30 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69   0;.  }.  else i
61c0: 66 28 20 70 2d 3e 6e 44 61 74 61 2b 46 54 53 33  f( p->nData+FTS3
61d0: 5f 56 41 52 49 4e 54 5f 4d 41 58 2b 31 3e 70 2d  _VARINT_MAX+1>p-
61e0: 3e 6e 53 70 61 63 65 20 29 7b 0a 20 20 20 20 69  >nSpace ){.    i
61f0: 6e 74 20 6e 4e 65 77 20 3d 20 70 2d 3e 6e 53 70  nt nNew = p->nSp
6200: 61 63 65 20 2a 20 32 3b 0a 20 20 20 20 70 20 3d  ace * 2;.    p =
6210: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
6220: 28 70 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b  (p, sizeof(*p) +
6230: 20 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20   nNew);.    if( 
6240: 21 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  !p ){.      sqli
6250: 74 65 33 5f 66 72 65 65 28 2a 70 70 29 3b 0a 20  te3_free(*pp);. 
6260: 20 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20       *pp = 0;.  
6270: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6280: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
6290: 20 20 20 70 2d 3e 6e 53 70 61 63 65 20 3d 20 6e     p->nSpace = n
62a0: 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74  New;.    p->aDat
62b0: 61 20 3d 20 28 63 68 61 72 20 2a 29 26 70 5b 31  a = (char *)&p[1
62c0: 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70  ];.  }..  /* App
62d0: 65 6e 64 20 74 68 65 20 6e 65 77 20 73 65 72 69  end the new seri
62e0: 61 6c 69 7a 65 64 20 76 61 72 69 6e 74 20 74 6f  alized varint to
62f0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
6300: 6c 69 73 74 2e 20 2a 2f 0a 20 20 70 2d 3e 6e 44  list. */.  p->nD
6310: 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ata += sqlite3Ft
6320: 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 2d 3e  s3PutVarint(&p->
6330: 61 44 61 74 61 5b 70 2d 3e 6e 44 61 74 61 5d 2c  aData[p->nData],
6340: 20 69 29 3b 0a 20 20 70 2d 3e 61 44 61 74 61 5b   i);.  p->aData[
6350: 70 2d 3e 6e 44 61 74 61 5d 20 3d 20 27 5c 30 27  p->nData] = '\0'
6360: 3b 0a 20 20 2a 70 70 20 3d 20 70 3b 0a 20 20 72  ;.  *pp = p;.  r
6370: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6380: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
6390: 64 6f 63 69 64 2f 63 6f 6c 75 6d 6e 2f 70 6f 73  docid/column/pos
63a0: 69 74 69 6f 6e 20 65 6e 74 72 79 20 74 6f 20 61  ition entry to a
63b0: 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 73 74 72   PendingList str
63c0: 75 63 74 75 72 65 2e 20 4e 6f 6e 2d 7a 65 72 6f  ucture. Non-zero
63d0: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
63e0: 69 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  if the structure
63f0: 20 69 73 20 73 71 6c 69 74 65 33 5f 72 65 61 6c   is sqlite3_real
6400: 6c 6f 63 65 64 20 61 73 20 70 61 72 74 20 6f 66  loced as part of
6410: 20 61 64 64 69 6e 67 0a 2a 2a 20 74 68 65 20 65   adding.** the e
6420: 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c  ntry. Otherwise,
6430: 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   zero..**.** If 
6440: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  an OOM error occ
6450: 75 72 73 2c 20 2a 70 52 63 20 69 73 20 73 65 74  urs, *pRc is set
6460: 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   to SQLITE_NOMEM
6470: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
6480: 67 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 61 6c  g..** Zero is al
6490: 77 61 79 73 20 72 65 74 75 72 6e 65 64 20 69 6e  ways returned in
64a0: 20 74 68 69 73 20 63 61 73 65 2e 20 4f 74 68 65   this case. Othe
64b0: 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 4f 4f 4d  rwise, if no OOM
64c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a   error occurs,.*
64d0: 2a 20 69 74 20 69 73 20 73 65 74 20 74 6f 20 53  * it is set to S
64e0: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
64f0: 74 69 63 20 69 6e 74 20 66 74 73 33 50 65 6e 64  tic int fts3Pend
6500: 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 28 0a 20  ingListAppend(. 
6510: 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 2a 70   PendingList **p
6520: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
6530: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 65 6e 64   /* IN/OUT: Pend
6540: 69 6e 67 4c 69 73 74 20 73 74 72 75 63 74 75 72  ingList structur
6550: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
6560: 6e 74 36 34 20 69 44 6f 63 69 64 2c 20 20 20 20  nt64 iDocid,    
6570: 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 69 64 20         /* Docid 
6580: 66 6f 72 20 65 6e 74 72 79 20 74 6f 20 61 64 64  for entry to add
6590: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
65a0: 74 36 34 20 69 43 6f 6c 2c 20 20 20 20 20 20 20  t64 iCol,       
65b0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
65c0: 66 6f 72 20 65 6e 74 72 79 20 74 6f 20 61 64 64  for entry to add
65d0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
65e0: 74 36 34 20 69 50 6f 73 2c 20 20 20 20 20 20 20  t64 iPos,       
65f0: 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f        /* Positio
6600: 6e 20 6f 66 20 74 65 72 6d 20 66 6f 72 20 65 6e  n of term for en
6610: 74 72 79 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20  try to add */.  
6620: 69 6e 74 20 2a 70 52 63 20 20 20 20 20 20 20 20  int *pRc        
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6640: 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 63  /* OUT: Return c
6650: 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 50 65 6e 64  ode */.){.  Pend
6660: 69 6e 67 4c 69 73 74 20 2a 70 20 3d 20 2a 70 70  ingList *p = *pp
6670: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
6680: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
6690: 74 28 20 21 70 20 7c 7c 20 70 2d 3e 69 4c 61 73  t( !p || p->iLas
66a0: 74 44 6f 63 69 64 3c 3d 69 44 6f 63 69 64 20 29  tDocid<=iDocid )
66b0: 3b 0a 0a 20 20 69 66 28 20 21 70 20 7c 7c 20 70  ;..  if( !p || p
66c0: 2d 3e 69 4c 61 73 74 44 6f 63 69 64 21 3d 69 44  ->iLastDocid!=iD
66d0: 6f 63 69 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  ocid ){.    sqli
66e0: 74 65 33 5f 69 6e 74 36 34 20 69 44 65 6c 74 61  te3_int64 iDelta
66f0: 20 3d 20 69 44 6f 63 69 64 20 2d 20 28 70 20 3f   = iDocid - (p ?
6700: 20 70 2d 3e 69 4c 61 73 74 44 6f 63 69 64 20 3a   p->iLastDocid :
6710: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29   0);.    if( p )
6720: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
6730: 70 2d 3e 6e 44 61 74 61 3c 70 2d 3e 6e 53 70 61  p->nData<p->nSpa
6740: 63 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ce );.      asse
6750: 72 74 28 20 70 2d 3e 61 44 61 74 61 5b 70 2d 3e  rt( p->aData[p->
6760: 6e 44 61 74 61 5d 3d 3d 30 20 29 3b 0a 20 20 20  nData]==0 );.   
6770: 20 20 20 70 2d 3e 6e 44 61 74 61 2b 2b 3b 0a 20     p->nData++;. 
6780: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c     }.    if( SQL
6790: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 66 74  ITE_OK!=(rc = ft
67a0: 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70  s3PendingListApp
67b0: 65 6e 64 56 61 72 69 6e 74 28 26 70 2c 20 69 44  endVarint(&p, iD
67c0: 65 6c 74 61 29 29 20 29 7b 0a 20 20 20 20 20 20  elta)) ){.      
67d0: 67 6f 74 6f 20 70 65 6e 64 69 6e 67 6c 69 73 74  goto pendinglist
67e0: 61 70 70 65 6e 64 5f 6f 75 74 3b 0a 20 20 20 20  append_out;.    
67f0: 7d 0a 20 20 20 20 70 2d 3e 69 4c 61 73 74 43 6f  }.    p->iLastCo
6800: 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 70 2d 3e 69  l = -1;.    p->i
6810: 4c 61 73 74 50 6f 73 20 3d 20 30 3b 0a 20 20 20  LastPos = 0;.   
6820: 20 70 2d 3e 69 4c 61 73 74 44 6f 63 69 64 20 3d   p->iLastDocid =
6830: 20 69 44 6f 63 69 64 3b 0a 20 20 7d 0a 20 20 69   iDocid;.  }.  i
6840: 66 28 20 69 43 6f 6c 3e 30 20 26 26 20 70 2d 3e  f( iCol>0 && p->
6850: 69 4c 61 73 74 43 6f 6c 21 3d 69 43 6f 6c 20 29  iLastCol!=iCol )
6860: 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  {.    if( SQLITE
6870: 5f 4f 4b 21 3d 28 72 63 20 3d 20 66 74 73 33 50  _OK!=(rc = fts3P
6880: 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64  endingListAppend
6890: 56 61 72 69 6e 74 28 26 70 2c 20 31 29 29 0a 20  Varint(&p, 1)). 
68a0: 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b      || SQLITE_OK
68b0: 21 3d 28 72 63 20 3d 20 66 74 73 33 50 65 6e 64  !=(rc = fts3Pend
68c0: 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72  ingListAppendVar
68d0: 69 6e 74 28 26 70 2c 20 69 43 6f 6c 29 29 0a 20  int(&p, iCol)). 
68e0: 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
68f0: 20 70 65 6e 64 69 6e 67 6c 69 73 74 61 70 70 65   pendinglistappe
6900: 6e 64 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  nd_out;.    }.  
6910: 20 20 70 2d 3e 69 4c 61 73 74 43 6f 6c 20 3d 20    p->iLastCol = 
6920: 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 4c 61  iCol;.    p->iLa
6930: 73 74 50 6f 73 20 3d 20 30 3b 0a 20 20 7d 0a 20  stPos = 0;.  }. 
6940: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a   if( iCol>=0 ){.
6950: 20 20 20 20 61 73 73 65 72 74 28 20 69 50 6f 73      assert( iPos
6960: 3e 70 2d 3e 69 4c 61 73 74 50 6f 73 20 7c 7c 20  >p->iLastPos || 
6970: 28 69 50 6f 73 3d 3d 30 20 26 26 20 70 2d 3e 69  (iPos==0 && p->i
6980: 4c 61 73 74 50 6f 73 3d 3d 30 29 20 29 3b 0a 20  LastPos==0) );. 
6990: 20 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64     rc = fts3Pend
69a0: 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72  ingListAppendVar
69b0: 69 6e 74 28 26 70 2c 20 32 2b 69 50 6f 73 2d 70  int(&p, 2+iPos-p
69c0: 2d 3e 69 4c 61 73 74 50 6f 73 29 3b 0a 20 20 20  ->iLastPos);.   
69d0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
69e0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  OK ){.      p->i
69f0: 4c 61 73 74 50 6f 73 20 3d 20 69 50 6f 73 3b 0a  LastPos = iPos;.
6a00: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 70 65 6e 64      }.  }.. pend
6a10: 69 6e 67 6c 69 73 74 61 70 70 65 6e 64 5f 6f 75  inglistappend_ou
6a20: 74 3a 0a 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a  t:.  *pRc = rc;.
6a30: 20 20 69 66 28 20 70 21 3d 2a 70 70 20 29 7b 0a    if( p!=*pp ){.
6a40: 20 20 20 20 2a 70 70 20 3d 20 70 3b 0a 20 20 20      *pp = p;.   
6a50: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
6a60: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
6a70: 0a 2a 2a 20 46 72 65 65 20 61 20 50 65 6e 64 69  .** Free a Pendi
6a80: 6e 67 4c 69 73 74 20 6f 62 6a 65 63 74 20 61 6c  ngList object al
6a90: 6c 6f 63 61 74 65 64 20 62 79 20 66 74 73 33 50  located by fts3P
6aa0: 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64  endingListAppend
6ab0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
6ac0: 69 64 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69  id fts3PendingLi
6ad0: 73 74 44 65 6c 65 74 65 28 50 65 6e 64 69 6e 67  stDelete(Pending
6ae0: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
6af0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 69  sqlite3_free(pLi
6b00: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  st);.}../*.** Ad
6b10: 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 6f 6e  d an entry to on
6b20: 65 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67  e of the pending
6b30: 2d 74 65 72 6d 73 20 68 61 73 68 20 74 61 62 6c  -terms hash tabl
6b40: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
6b50: 74 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72  t fts3PendingTer
6b60: 6d 73 41 64 64 4f 6e 65 28 0a 20 20 46 74 73 33  msAddOne(.  Fts3
6b70: 54 61 62 6c 65 20 2a 70 2c 0a 20 20 69 6e 74 20  Table *p,.  int 
6b80: 69 43 6f 6c 2c 0a 20 20 69 6e 74 20 69 50 6f 73  iCol,.  int iPos
6b90: 2c 0a 20 20 46 74 73 33 48 61 73 68 20 2a 70 48  ,.  Fts3Hash *pH
6ba0: 61 73 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ash,            
6bb0: 20 20 20 20 2f 2a 20 50 65 6e 64 69 6e 67 20 74      /* Pending t
6bc0: 65 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65 20  erms hash table 
6bd0: 74 6f 20 61 64 64 20 65 6e 74 72 79 20 74 6f 20  to add entry to 
6be0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
6bf0: 2a 7a 54 6f 6b 65 6e 2c 0a 20 20 69 6e 74 20 6e  *zToken,.  int n
6c00: 54 6f 6b 65 6e 0a 29 7b 0a 20 20 50 65 6e 64 69  Token.){.  Pendi
6c10: 6e 67 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20  ngList *pList;. 
6c20: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
6c30: 5f 4f 4b 3b 0a 0a 20 20 70 4c 69 73 74 20 3d 20  _OK;..  pList = 
6c40: 28 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 29 66  (PendingList *)f
6c50: 74 73 33 48 61 73 68 46 69 6e 64 28 70 48 61 73  ts3HashFind(pHas
6c60: 68 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  h, zToken, nToke
6c70: 6e 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20  n);.  if( pList 
6c80: 29 7b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69  ){.    p->nPendi
6c90: 6e 67 44 61 74 61 20 2d 3d 20 28 70 4c 69 73 74  ngData -= (pList
6ca0: 2d 3e 6e 44 61 74 61 20 2b 20 6e 54 6f 6b 65 6e  ->nData + nToken
6cb0: 20 2b 20 73 69 7a 65 6f 66 28 46 74 73 33 48 61   + sizeof(Fts3Ha
6cc0: 73 68 45 6c 65 6d 29 29 3b 0a 20 20 7d 0a 20 20  shElem));.  }.  
6cd0: 69 66 28 20 66 74 73 33 50 65 6e 64 69 6e 67 4c  if( fts3PendingL
6ce0: 69 73 74 41 70 70 65 6e 64 28 26 70 4c 69 73 74  istAppend(&pList
6cf0: 2c 20 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 2c  , p->iPrevDocid,
6d00: 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 26 72 63   iCol, iPos, &rc
6d10: 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) ){.    if( pLi
6d20: 73 74 3d 3d 66 74 73 33 48 61 73 68 49 6e 73 65  st==fts3HashInse
6d30: 72 74 28 70 48 61 73 68 2c 20 7a 54 6f 6b 65 6e  rt(pHash, zToken
6d40: 2c 20 6e 54 6f 6b 65 6e 2c 20 70 4c 69 73 74 29  , nToken, pList)
6d50: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6c   ){.      /* Mal
6d60: 6c 6f 63 20 66 61 69 6c 65 64 20 77 68 69 6c 65  loc failed while
6d70: 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65 20 6e   inserting the n
6d80: 65 77 20 65 6e 74 72 79 2e 20 54 68 69 73 20 63  ew entry. This c
6d90: 61 6e 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 2a  an only .      *
6da0: 2a 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 72  * happen if ther
6db0: 65 20 77 61 73 20 6e 6f 20 70 72 65 76 69 6f 75  e was no previou
6dc0: 73 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73  s entry for this
6dd0: 20 74 6f 6b 65 6e 2e 0a 20 20 20 20 20 20 2a 2f   token..      */
6de0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
6df0: 3d 3d 66 74 73 33 48 61 73 68 46 69 6e 64 28 70  ==fts3HashFind(p
6e00: 48 61 73 68 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54  Hash, zToken, nT
6e10: 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20 20 20 73  oken) );.      s
6e20: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 69 73  qlite3_free(pLis
6e30: 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  t);.      rc = S
6e40: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
6e50: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
6e60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6e70: 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74    p->nPendingDat
6e80: 61 20 2b 3d 20 28 70 4c 69 73 74 2d 3e 6e 44 61  a += (pList->nDa
6e90: 74 61 20 2b 20 6e 54 6f 6b 65 6e 20 2b 20 73 69  ta + nToken + si
6ea0: 7a 65 6f 66 28 46 74 73 33 48 61 73 68 45 6c 65  zeof(Fts3HashEle
6eb0: 6d 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  m));.  }.  retur
6ec0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
6ed0: 6f 6b 65 6e 69 7a 65 20 74 68 65 20 6e 75 6c 2d  okenize the nul-
6ee0: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
6ef0: 67 20 7a 54 65 78 74 20 61 6e 64 20 61 64 64 20  g zText and add 
6f00: 61 6c 6c 20 74 6f 6b 65 6e 73 20 74 6f 20 74 68  all tokens to th
6f10: 65 0a 2a 2a 20 70 65 6e 64 69 6e 67 2d 74 65 72  e.** pending-ter
6f20: 6d 73 20 68 61 73 68 2d 74 61 62 6c 65 2e 20 54  ms hash-table. T
6f30: 68 65 20 64 6f 63 69 64 20 75 73 65 64 20 69 73  he docid used is
6f40: 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20   that currently 
6f50: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 70 2d 3e  stored in.** p->
6f60: 69 50 72 65 76 44 6f 63 69 64 2c 20 61 6e 64 20  iPrevDocid, and 
6f70: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 73 70  the column is sp
6f80: 65 63 69 66 69 65 64 20 62 79 20 61 72 67 75 6d  ecified by argum
6f90: 65 6e 74 20 69 43 6f 6c 2e 0a 2a 2a 0a 2a 2a 20  ent iCol..**.** 
6fa0: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
6fb0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
6fc0: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
6fd0: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
6fe0: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
6ff0: 20 69 6e 74 20 66 74 73 33 50 65 6e 64 69 6e 67   int fts3Pending
7000: 54 65 72 6d 73 41 64 64 28 0a 20 20 46 74 73 33  TermsAdd(.  Fts3
7010: 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
7020: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7030: 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20  able into which 
7040: 74 65 78 74 20 77 69 6c 6c 20 62 65 20 69 6e 73  text will be ins
7050: 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  erted */.  int i
7060: 4c 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20  Langid,         
7070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
7080: 6e 67 75 61 67 65 20 69 64 20 74 6f 20 75 73 65  nguage id to use
7090: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
70a0: 20 2a 7a 54 65 78 74 2c 20 20 20 20 20 20 20 20   *zText,        
70b0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
70c0: 20 64 6f 63 75 6d 65 6e 74 20 74 6f 20 62 65 20   document to be 
70d0: 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e  inserted */.  in
70e0: 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  t iCol,         
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7100: 20 43 6f 6c 75 6d 6e 20 69 6e 74 6f 20 77 68 69   Column into whi
7110: 63 68 20 74 65 78 74 20 69 73 20 62 65 69 6e 67  ch text is being
7120: 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 75   inserted */.  u
7130: 33 32 20 2a 70 6e 57 6f 72 64 20 20 20 20 20 20  32 *pnWord      
7140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7150: 2a 20 49 4e 2f 4f 55 54 3a 20 49 6e 63 72 2e 20  * IN/OUT: Incr. 
7160: 62 79 20 6e 75 6d 62 65 72 20 74 6f 6b 65 6e 73  by number tokens
7170: 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 29 7b 0a   inserted */.){.
7180: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
7190: 69 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 69 6e  iStart = 0;.  in
71a0: 74 20 69 45 6e 64 20 3d 20 30 3b 0a 20 20 69 6e  t iEnd = 0;.  in
71b0: 74 20 69 50 6f 73 20 3d 20 30 3b 0a 20 20 69 6e  t iPos = 0;.  in
71c0: 74 20 6e 57 6f 72 64 20 3d 20 30 3b 0a 0a 20 20  t nWord = 0;..  
71d0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 6f 6b  char const *zTok
71e0: 65 6e 3b 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e  en;.  int nToken
71f0: 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33   = 0;..  sqlite3
7200: 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b  _tokenizer *pTok
7210: 65 6e 69 7a 65 72 20 3d 20 70 2d 3e 70 54 6f 6b  enizer = p->pTok
7220: 65 6e 69 7a 65 72 3b 0a 20 20 73 71 6c 69 74 65  enizer;.  sqlite
7230: 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75  3_tokenizer_modu
7240: 6c 65 20 63 6f 6e 73 74 20 2a 70 4d 6f 64 75 6c  le const *pModul
7250: 65 20 3d 20 70 54 6f 6b 65 6e 69 7a 65 72 2d 3e  e = pTokenizer->
7260: 70 4d 6f 64 75 6c 65 3b 0a 20 20 73 71 6c 69 74  pModule;.  sqlit
7270: 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 63 75 72  e3_tokenizer_cur
7280: 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20 69 6e 74  sor *pCsr;.  int
7290: 20 28 2a 78 4e 65 78 74 29 28 73 71 6c 69 74 65   (*xNext)(sqlite
72a0: 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 63 75 72 73  3_tokenizer_curs
72b0: 6f 72 20 2a 70 43 75 72 73 6f 72 2c 0a 20 20 20  or *pCursor,.   
72c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 2a 2a 2c     const char**,
72d0: 69 6e 74 2a 2c 69 6e 74 2a 2c 69 6e 74 2a 2c 69  int*,int*,int*,i
72e0: 6e 74 2a 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  nt*);..  assert(
72f0: 20 70 54 6f 6b 65 6e 69 7a 65 72 20 26 26 20 70   pTokenizer && p
7300: 4d 6f 64 75 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20  Module );..  /* 
7310: 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20  If the user has 
7320: 69 6e 73 65 72 74 65 64 20 61 20 4e 55 4c 4c 20  inserted a NULL 
7330: 76 61 6c 75 65 2c 20 74 68 69 73 20 66 75 6e 63  value, this func
7340: 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
7350: 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 7a 54 65  ed with.  ** zTe
7360: 78 74 3d 3d 30 2e 20 49 6e 20 74 68 69 73 20 63  xt==0. In this c
7370: 61 73 65 2c 20 61 64 64 20 7a 65 72 6f 20 74 6f  ase, add zero to
7380: 6b 65 6e 20 65 6e 74 72 69 65 73 20 74 6f 20 74  ken entries to t
7390: 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e  he hash table an
73a0: 64 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 65  d .  ** return e
73b0: 61 72 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 7a  arly. */.  if( z
73c0: 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  Text==0 ){.    *
73d0: 70 6e 57 6f 72 64 20 3d 20 30 3b 0a 20 20 20 20  pnWord = 0;.    
73e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
73f0: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  ;.  }..  rc = sq
7400: 6c 69 74 65 33 46 74 73 33 4f 70 65 6e 54 6f 6b  lite3Fts3OpenTok
7410: 65 6e 69 7a 65 72 28 70 54 6f 6b 65 6e 69 7a 65  enizer(pTokenize
7420: 72 2c 20 69 4c 61 6e 67 69 64 2c 20 7a 54 65 78  r, iLangid, zTex
7430: 74 2c 20 2d 31 2c 20 26 70 43 73 72 29 3b 0a 20  t, -1, &pCsr);. 
7440: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7450: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
7460: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 78 4e 65 78   rc;.  }..  xNex
7470: 74 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65  t = pModule->xNe
7480: 78 74 3b 0a 20 20 77 68 69 6c 65 28 20 53 51 4c  xt;.  while( SQL
7490: 49 54 45 5f 4f 4b 3d 3d 72 63 0a 20 20 20 20 20  ITE_OK==rc.     
74a0: 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28   && SQLITE_OK==(
74b0: 72 63 20 3d 20 78 4e 65 78 74 28 70 43 73 72 2c  rc = xNext(pCsr,
74c0: 20 26 7a 54 6f 6b 65 6e 2c 20 26 6e 54 6f 6b 65   &zToken, &nToke
74d0: 6e 2c 20 26 69 53 74 61 72 74 2c 20 26 69 45 6e  n, &iStart, &iEn
74e0: 64 2c 20 26 69 50 6f 73 29 29 0a 20 20 29 7b 0a  d, &iPos)).  ){.
74f0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
7500: 66 28 20 69 50 6f 73 3e 3d 6e 57 6f 72 64 20 29  f( iPos>=nWord )
7510: 20 6e 57 6f 72 64 20 3d 20 69 50 6f 73 2b 31 3b   nWord = iPos+1;
7520: 0a 0a 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f  ..    /* Positio
7530: 6e 73 20 63 61 6e 6e 6f 74 20 62 65 20 6e 65 67  ns cannot be neg
7540: 61 74 69 76 65 3b 20 77 65 20 75 73 65 20 2d 31  ative; we use -1
7550: 20 61 73 20 61 20 74 65 72 6d 69 6e 61 74 6f 72   as a terminator
7560: 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 20   internally..   
7570: 20 2a 2a 20 54 6f 6b 65 6e 73 20 6d 75 73 74 20   ** Tokens must 
7580: 68 61 76 65 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  have a non-zero 
7590: 6c 65 6e 67 74 68 2e 0a 20 20 20 20 2a 2f 0a 20  length..    */. 
75a0: 20 20 20 69 66 28 20 69 50 6f 73 3c 30 20 7c 7c     if( iPos<0 ||
75b0: 20 21 7a 54 6f 6b 65 6e 20 7c 7c 20 6e 54 6f 6b   !zToken || nTok
75c0: 65 6e 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  en<=0 ){.      r
75d0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
75e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
75f0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
7600: 20 74 68 65 20 74 65 72 6d 20 74 6f 20 74 68 65   the term to the
7610: 20 74 65 72 6d 73 20 69 6e 64 65 78 20 2a 2f 0a   terms index */.
7620: 20 20 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e      rc = fts3Pen
7630: 64 69 6e 67 54 65 72 6d 73 41 64 64 4f 6e 65 28  dingTermsAddOne(
7640: 0a 20 20 20 20 20 20 20 20 70 2c 20 69 43 6f 6c  .        p, iCol
7650: 2c 20 69 50 6f 73 2c 20 26 70 2d 3e 61 49 6e 64  , iPos, &p->aInd
7660: 65 78 5b 30 5d 2e 68 50 65 6e 64 69 6e 67 2c 20  ex[0].hPending, 
7670: 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 0a 20  zToken, nToken. 
7680: 20 20 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 2f     );.    .    /
7690: 2a 20 41 64 64 20 74 68 65 20 74 65 72 6d 20 74  * Add the term t
76a0: 6f 20 65 61 63 68 20 6f 66 20 74 68 65 20 70 72  o each of the pr
76b0: 65 66 69 78 20 69 6e 64 65 78 65 73 20 74 68 61  efix indexes tha
76c0: 74 20 69 74 20 69 73 20 6e 6f 74 20 74 6f 6f 20  t it is not too 
76d0: 0a 20 20 20 20 2a 2a 20 73 68 6f 72 74 20 66 6f  .    ** short fo
76e0: 72 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  r. */.    for(i=
76f0: 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1; rc==SQLITE_OK
7700: 20 26 26 20 69 3c 70 2d 3e 6e 49 6e 64 65 78 3b   && i<p->nIndex;
7710: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
7720: 75 63 74 20 46 74 73 33 49 6e 64 65 78 20 2a 70  uct Fts3Index *p
7730: 49 6e 64 65 78 20 3d 20 26 70 2d 3e 61 49 6e 64  Index = &p->aInd
7740: 65 78 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  ex[i];.      if(
7750: 20 6e 54 6f 6b 65 6e 3c 70 49 6e 64 65 78 2d 3e   nToken<pIndex->
7760: 6e 50 72 65 66 69 78 20 29 20 63 6f 6e 74 69 6e  nPrefix ) contin
7770: 75 65 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  ue;.      rc = f
7780: 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 41  ts3PendingTermsA
7790: 64 64 4f 6e 65 28 0a 20 20 20 20 20 20 20 20 20  ddOne(.         
77a0: 20 70 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20   p, iCol, iPos, 
77b0: 26 70 49 6e 64 65 78 2d 3e 68 50 65 6e 64 69 6e  &pIndex->hPendin
77c0: 67 2c 20 7a 54 6f 6b 65 6e 2c 20 70 49 6e 64 65  g, zToken, pInde
77d0: 78 2d 3e 6e 50 72 65 66 69 78 0a 20 20 20 20 20  x->nPrefix.     
77e0: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   );.    }.  }.. 
77f0: 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65   pModule->xClose
7800: 28 70 43 73 72 29 3b 0a 20 20 2a 70 6e 57 6f 72  (pCsr);.  *pnWor
7810: 64 20 2b 3d 20 6e 57 6f 72 64 3b 0a 20 20 72 65  d += nWord;.  re
7820: 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
7830: 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f  _DONE ? SQLITE_O
7840: 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 20 0a  K : rc);.}../* .
7850: 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** Calling this 
7860: 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69 63 61 74  function indicat
7870: 65 73 20 74 68 61 74 20 73 75 62 73 65 71 75 65  es that subseque
7880: 6e 74 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20  nt calls to .** 
7890: 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73  fts3PendingTerms
78a0: 41 64 64 28 29 20 61 72 65 20 74 6f 20 61 64 64  Add() are to add
78b0: 20 74 65 72 6d 2f 70 6f 73 69 74 69 6f 6e 2d 6c   term/position-l
78c0: 69 73 74 20 70 61 69 72 73 20 66 6f 72 20 74 68  ist pairs for th
78d0: 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66  e.** contents of
78e0: 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69   the document wi
78f0: 74 68 20 64 6f 63 69 64 20 69 44 6f 63 69 64 2e  th docid iDocid.
7900: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
7910: 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 44  ts3PendingTermsD
7920: 6f 63 69 64 28 0a 20 20 46 74 73 33 54 61 62 6c  ocid(.  Fts3Tabl
7930: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
7940: 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 2d          /* Full-
7950: 74 65 78 74 20 74 61 62 6c 65 20 68 61 6e 64 6c  text table handl
7960: 65 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c 65  e */.  int bDele
7970: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
7980: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
7990: 66 20 74 68 69 73 20 6f 70 20 69 73 20 61 20 64  f this op is a d
79a0: 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69  elete */.  int i
79b0: 4c 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20  Langid,         
79c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
79d0: 6e 67 75 61 67 65 20 69 64 20 6f 66 20 72 6f 77  nguage id of row
79e0: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a   being written *
79f0: 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  /.  sqlite_int64
7a00: 20 69 44 6f 63 69 64 20 20 20 20 20 20 20 20 20   iDocid         
7a10: 20 20 20 20 2f 2a 20 44 6f 63 69 64 20 6f 66 20      /* Docid of 
7a20: 72 6f 77 20 62 65 69 6e 67 20 77 72 69 74 74 65  row being writte
7a30: 6e 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  n */.){.  assert
7a40: 28 20 69 4c 61 6e 67 69 64 3e 3d 30 20 29 3b 0a  ( iLangid>=0 );.
7a50: 20 20 61 73 73 65 72 74 28 20 62 44 65 6c 65 74    assert( bDelet
7a60: 65 3d 3d 31 20 7c 7c 20 62 44 65 6c 65 74 65 3d  e==1 || bDelete=
7a70: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f  =0 );..  /* TODO
7a80: 28 73 68 65 73 73 29 20 45 78 70 6c 6f 72 65 20  (shess) Explore 
7a90: 77 68 65 74 68 65 72 20 70 61 72 74 69 61 6c 6c  whether partiall
7aa0: 79 20 66 6c 75 73 68 69 6e 67 20 74 68 65 20 62  y flushing the b
7ab0: 75 66 66 65 72 20 6f 6e 0a 20 20 2a 2a 20 66 6f  uffer on.  ** fo
7ac0: 72 63 65 64 2d 66 6c 75 73 68 20 77 6f 75 6c 64  rced-flush would
7ad0: 20 70 72 6f 76 69 64 65 20 62 65 74 74 65 72 20   provide better 
7ae0: 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20 49 20  performance.  I 
7af0: 73 75 73 70 65 63 74 20 74 68 61 74 20 69 66 0a  suspect that if.
7b00: 20 20 2a 2a 20 77 65 20 6f 72 64 65 72 65 64 20    ** we ordered 
7b10: 74 68 65 20 64 6f 63 6c 69 73 74 73 20 62 79 20  the doclists by 
7b20: 73 69 7a 65 20 61 6e 64 20 66 6c 75 73 68 65 64  size and flushed
7b30: 20 74 68 65 20 6c 61 72 67 65 73 74 20 75 6e 74   the largest unt
7b40: 69 6c 20 74 68 65 0a 20 20 2a 2a 20 62 75 66 66  il the.  ** buff
7b50: 65 72 20 77 61 73 20 68 61 6c 66 20 65 6d 70 74  er was half empt
7b60: 79 2c 20 74 68 61 74 20 77 6f 75 6c 64 20 6c 65  y, that would le
7b70: 74 20 74 68 65 20 6c 65 73 73 20 66 72 65 71 75  t the less frequ
7b80: 65 6e 74 20 74 65 72 6d 73 0a 20 20 2a 2a 20 67  ent terms.  ** g
7b90: 65 6e 65 72 61 74 65 20 6c 6f 6e 67 65 72 20 64  enerate longer d
7ba0: 6f 63 6c 69 73 74 73 2e 0a 20 20 2a 2f 0a 20 20  oclists..  */.  
7bb0: 69 66 28 20 69 44 6f 63 69 64 3c 70 2d 3e 69 50  if( iDocid<p->iP
7bc0: 72 65 76 44 6f 63 69 64 20 0a 20 20 20 7c 7c 20  revDocid .   || 
7bd0: 28 69 44 6f 63 69 64 3d 3d 70 2d 3e 69 50 72 65  (iDocid==p->iPre
7be0: 76 44 6f 63 69 64 20 26 26 20 70 2d 3e 62 50 72  vDocid && p->bPr
7bf0: 65 76 44 65 6c 65 74 65 3d 3d 30 29 0a 20 20 20  evDelete==0).   
7c00: 7c 7c 20 70 2d 3e 69 50 72 65 76 4c 61 6e 67 69  || p->iPrevLangi
7c10: 64 21 3d 69 4c 61 6e 67 69 64 0a 20 20 20 7c 7c  d!=iLangid.   ||
7c20: 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61   p->nPendingData
7c30: 3e 70 2d 3e 6e 4d 61 78 50 65 6e 64 69 6e 67 44  >p->nMaxPendingD
7c40: 61 74 61 20 0a 20 20 29 7b 0a 20 20 20 20 69 6e  ata .  ){.    in
7c50: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  t rc = sqlite3Ft
7c60: 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 46 6c  s3PendingTermsFl
7c70: 75 73 68 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ush(p);.    if( 
7c80: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
7c90: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
7ca0: 20 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 20 3d   p->iPrevDocid =
7cb0: 20 69 44 6f 63 69 64 3b 0a 20 20 70 2d 3e 69 50   iDocid;.  p->iP
7cc0: 72 65 76 4c 61 6e 67 69 64 20 3d 20 69 4c 61 6e  revLangid = iLan
7cd0: 67 69 64 3b 0a 20 20 70 2d 3e 62 50 72 65 76 44  gid;.  p->bPrevD
7ce0: 65 6c 65 74 65 20 3d 20 62 44 65 6c 65 74 65 3b  elete = bDelete;
7cf0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7d00: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  _OK;.}../*.** Di
7d10: 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e  scard the conten
7d20: 74 73 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e  ts of the pendin
7d30: 67 2d 74 65 72 6d 73 20 68 61 73 68 20 74 61 62  g-terms hash tab
7d40: 6c 65 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  les. .*/.void sq
7d50: 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67  lite3Fts3Pending
7d60: 54 65 72 6d 73 43 6c 65 61 72 28 46 74 73 33 54  TermsClear(Fts3T
7d70: 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  able *p){.  int 
7d80: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
7d90: 70 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b 29 7b  p->nIndex; i++){
7da0: 0a 20 20 20 20 46 74 73 33 48 61 73 68 45 6c 65  .    Fts3HashEle
7db0: 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 20 20 46 74  m *pElem;.    Ft
7dc0: 73 33 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20  s3Hash *pHash = 
7dd0: 26 70 2d 3e 61 49 6e 64 65 78 5b 69 5d 2e 68 50  &p->aIndex[i].hP
7de0: 65 6e 64 69 6e 67 3b 0a 20 20 20 20 66 6f 72 28  ending;.    for(
7df0: 70 45 6c 65 6d 3d 66 74 73 33 48 61 73 68 46 69  pElem=fts3HashFi
7e00: 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65  rst(pHash); pEle
7e10: 6d 3b 20 70 45 6c 65 6d 3d 66 74 73 33 48 61 73  m; pElem=fts3Has
7e20: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
7e30: 20 20 20 20 20 50 65 6e 64 69 6e 67 4c 69 73 74       PendingList
7e40: 20 2a 70 4c 69 73 74 20 3d 20 28 50 65 6e 64 69   *pList = (Pendi
7e50: 6e 67 4c 69 73 74 20 2a 29 66 74 73 33 48 61 73  ngList *)fts3Has
7e60: 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
7e70: 20 20 20 20 66 74 73 33 50 65 6e 64 69 6e 67 4c      fts3PendingL
7e80: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
7e90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 33  ;.    }.    fts3
7ea0: 48 61 73 68 43 6c 65 61 72 28 70 48 61 73 68 29  HashClear(pHash)
7eb0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 50 65 6e 64  ;.  }.  p->nPend
7ec0: 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 7d 0a 0a  ingData = 0;.}..
7ed0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
7ee0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
7ef0: 20 74 68 65 20 78 55 70 64 61 74 65 28 29 20 6d   the xUpdate() m
7f00: 65 74 68 6f 64 20 61 73 20 70 61 72 74 20 6f 66  ethod as part of
7f10: 20 61 6e 20 49 4e 53 45 52 54 0a 2a 2a 20 6f 70   an INSERT.** op
7f20: 65 72 61 74 69 6f 6e 2e 20 49 74 20 61 64 64 73  eration. It adds
7f30: 20 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63   entries for eac
7f40: 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 6e 65  h term in the ne
7f50: 77 20 72 65 63 6f 72 64 20 74 6f 20 74 68 65 0a  w record to the.
7f60: 2a 2a 20 70 65 6e 64 69 6e 67 54 65 72 6d 73 20  ** pendingTerms 
7f70: 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  hash table..**.*
7f80: 2a 20 41 72 67 75 6d 65 6e 74 20 61 70 56 61 6c  * Argument apVal
7f90: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
7fa0: 74 68 65 20 73 69 6d 69 6c 61 72 6c 79 20 6e 61  the similarly na
7fb0: 6d 65 64 20 61 72 67 75 6d 65 6e 74 20 70 61 73  med argument pas
7fc0: 73 65 64 20 74 6f 0a 2a 2a 20 66 74 73 33 49 6e  sed to.** fts3In
7fd0: 73 65 72 74 44 61 74 61 28 29 2e 20 50 61 72 61  sertData(). Para
7fe0: 6d 65 74 65 72 20 69 44 6f 63 69 64 20 69 73 20  meter iDocid is 
7ff0: 74 68 65 20 64 6f 63 69 64 20 6f 66 20 74 68 65  the docid of the
8000: 20 6e 65 77 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61   new row..*/.sta
8010: 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 73 65  tic int fts3Inse
8020: 72 74 54 65 72 6d 73 28 0a 20 20 46 74 73 33 54  rtTerms(.  Fts3T
8030: 61 62 6c 65 20 2a 70 2c 20 0a 20 20 69 6e 74 20  able *p, .  int 
8040: 69 4c 61 6e 67 69 64 2c 20 0a 20 20 73 71 6c 69  iLangid, .  sqli
8050: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
8060: 6c 2c 20 0a 20 20 75 33 32 20 2a 61 53 7a 0a 29  l, .  u32 *aSz.)
8070: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
8080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8090: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
80a0: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 66 6f  variable */.  fo
80b0: 72 28 69 3d 32 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=2; i<p->nCol
80c0: 75 6d 6e 2b 32 3b 20 69 2b 2b 29 7b 0a 20 20 20  umn+2; i++){.   
80d0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 69 2d 32 3b   int iCol = i-2;
80e0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 62 4e 6f  .    if( p->abNo
80f0: 74 69 6e 64 65 78 65 64 5b 69 43 6f 6c 5d 3d 3d  tindexed[iCol]==
8100: 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  0 ){.      const
8110: 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d 20 28   char *zText = (
8120: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c  const char *)sql
8130: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
8140: 61 70 56 61 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  apVal[i]);.     
8150: 20 69 6e 74 20 72 63 20 3d 20 66 74 73 33 50 65   int rc = fts3Pe
8160: 6e 64 69 6e 67 54 65 72 6d 73 41 64 64 28 70 2c  ndingTermsAdd(p,
8170: 20 69 4c 61 6e 67 69 64 2c 20 7a 54 65 78 74 2c   iLangid, zText,
8180: 20 69 43 6f 6c 2c 20 26 61 53 7a 5b 69 43 6f 6c   iCol, &aSz[iCol
8190: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ]);.      if( rc
81a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
81b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
81c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
81d0: 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20  aSz[p->nColumn] 
81e0: 2b 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  += sqlite3_value
81f0: 5f 62 79 74 65 73 28 61 70 56 61 6c 5b 69 5d 29  _bytes(apVal[i])
8200: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
8210: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8220: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
8230: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
8240: 20 62 79 20 74 68 65 20 78 55 70 64 61 74 65 28   by the xUpdate(
8250: 29 20 6d 65 74 68 6f 64 20 66 6f 72 20 61 6e 20  ) method for an 
8260: 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e  INSERT operation
8270: 2e 0a 2a 2a 20 54 68 65 20 61 70 56 61 6c 20 70  ..** The apVal p
8280: 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73  arameter is pass
8290: 65 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ed a copy of the
82a0: 20 61 70 56 61 6c 20 61 72 67 75 6d 65 6e 74 20   apVal argument 
82b0: 70 61 73 73 65 64 20 62 79 0a 2a 2a 20 53 51 4c  passed by.** SQL
82c0: 69 74 65 20 74 6f 20 74 68 65 20 78 55 70 64 61  ite to the xUpda
82d0: 74 65 28 29 20 6d 65 74 68 6f 64 2e 20 69 2e 65  te() method. i.e
82e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 70 56 61 6c 5b  :.**.**   apVal[
82f0: 30 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0]              
8300: 20 20 4e 6f 74 20 75 73 65 64 20 66 6f 72 20 49    Not used for I
8310: 4e 53 45 52 54 2e 0a 2a 2a 20 20 20 61 70 56 61  NSERT..**   apVa
8320: 6c 5b 31 5d 20 20 20 20 20 20 20 20 20 20 20 20  l[1]            
8330: 20 20 20 20 72 6f 77 69 64 0a 2a 2a 20 20 20 61      rowid.**   a
8340: 70 56 61 6c 5b 32 5d 20 20 20 20 20 20 20 20 20  pVal[2]         
8350: 20 20 20 20 20 20 20 4c 65 66 74 2d 6d 6f 73 74         Left-most
8360: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 63 6f   user-defined co
8370: 6c 75 6d 6e 0a 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a  lumn.**   ....**
8380: 20 20 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c     apVal[p->nCol
8390: 75 6d 6e 2b 31 5d 20 20 20 20 20 52 69 67 68 74  umn+1]     Right
83a0: 2d 6d 6f 73 74 20 75 73 65 72 2d 64 65 66 69 6e  -most user-defin
83b0: 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 61  ed column.**   a
83c0: 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  pVal[p->nColumn+
83d0: 32 5d 20 20 20 20 20 48 69 64 64 65 6e 20 63 6f  2]     Hidden co
83e0: 6c 75 6d 6e 20 77 69 74 68 20 73 61 6d 65 20 6e  lumn with same n
83f0: 61 6d 65 20 61 73 20 74 61 62 6c 65 0a 2a 2a 20  ame as table.** 
8400: 20 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75    apVal[p->nColu
8410: 6d 6e 2b 33 5d 20 20 20 20 20 48 69 64 64 65 6e  mn+3]     Hidden
8420: 20 22 64 6f 63 69 64 22 20 63 6f 6c 75 6d 6e 20   "docid" column 
8430: 28 61 6c 69 61 73 20 66 6f 72 20 72 6f 77 69 64  (alias for rowid
8440: 29 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 70 2d 3e  ).**   apVal[p->
8450: 6e 43 6f 6c 75 6d 6e 2b 34 5d 20 20 20 20 20 48  nColumn+4]     H
8460: 69 64 64 65 6e 20 6c 61 6e 67 75 61 67 65 69 64  idden languageid
8470: 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69   column.*/.stati
8480: 63 20 69 6e 74 20 66 74 73 33 49 6e 73 65 72 74  c int fts3Insert
8490: 44 61 74 61 28 0a 20 20 46 74 73 33 54 61 62 6c  Data(.  Fts3Tabl
84a0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
84b0: 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 2d          /* Full-
84c0: 74 65 78 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  text table */.  
84d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
84e0: 61 70 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20  apVal,          
84f0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 76 61 6c 75  /* Array of valu
8500: 65 73 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a  es to insert */.
8510: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
8520: 2a 70 69 44 6f 63 69 64 20 20 20 20 20 20 20 20  *piDocid        
8530: 20 20 2f 2a 20 4f 55 54 3a 20 44 6f 63 69 64 20    /* OUT: Docid 
8540: 66 6f 72 20 72 6f 77 20 6a 75 73 74 20 69 6e 73  for row just ins
8550: 65 72 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  erted */.){.  in
8560: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
8570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8580: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
8590: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
85a0: 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 3b 20  pContentInsert; 
85b0: 20 20 2f 2a 20 49 4e 53 45 52 54 20 49 4e 54 4f    /* INSERT INTO
85c0: 20 25 5f 63 6f 6e 74 65 6e 74 20 56 41 4c 55 45   %_content VALUE
85d0: 53 28 2e 2e 2e 29 20 2a 2f 0a 0a 20 20 69 66 28  S(...) */..  if(
85e0: 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 20   p->zContentTbl 
85f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
8600: 61 6c 75 65 20 2a 70 52 6f 77 69 64 20 3d 20 61  alue *pRowid = a
8610: 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  pVal[p->nColumn+
8620: 33 5d 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  3];.    if( sqli
8630: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70  te3_value_type(p
8640: 52 6f 77 69 64 29 3d 3d 53 51 4c 49 54 45 5f 4e  Rowid)==SQLITE_N
8650: 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 52 6f  ULL ){.      pRo
8660: 77 69 64 20 3d 20 61 70 56 61 6c 5b 31 5d 3b 0a  wid = apVal[1];.
8670: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
8680: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
8690: 28 70 52 6f 77 69 64 29 21 3d 53 51 4c 49 54 45  (pRowid)!=SQLITE
86a0: 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
86b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
86c0: 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20  CONSTRAINT;.    
86d0: 7d 0a 20 20 20 20 2a 70 69 44 6f 63 69 64 20 3d  }.    *piDocid =
86e0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
86f0: 6e 74 36 34 28 70 52 6f 77 69 64 29 3b 0a 20 20  nt64(pRowid);.  
8700: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8710: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  OK;.  }..  /* Lo
8720: 63 61 74 65 20 74 68 65 20 73 74 61 74 65 6d 65  cate the stateme
8730: 6e 74 20 68 61 6e 64 6c 65 20 75 73 65 64 20 74  nt handle used t
8740: 6f 20 69 6e 73 65 72 74 20 64 61 74 61 20 69 6e  o insert data in
8750: 74 6f 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74  to the %_content
8760: 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65  .  ** table. The
8770: 20 53 51 4c 20 66 6f 72 20 74 68 69 73 20 73 74   SQL for this st
8780: 61 74 65 6d 65 6e 74 20 69 73 3a 0a 20 20 2a 2a  atement is:.  **
8790: 0a 20 20 2a 2a 20 20 20 49 4e 53 45 52 54 20 49  .  **   INSERT I
87a0: 4e 54 4f 20 25 5f 63 6f 6e 74 65 6e 74 20 56 41  NTO %_content VA
87b0: 4c 55 45 53 28 3f 2c 20 3f 2c 20 3f 2c 20 2e 2e  LUES(?, ?, ?, ..
87c0: 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  .).  **.  ** The
87d0: 20 73 74 61 74 65 6d 65 6e 74 20 66 65 61 74 75   statement featu
87e0: 72 65 73 20 4e 20 27 3f 27 20 76 61 72 69 61 62  res N '?' variab
87f0: 6c 65 73 2c 20 77 68 65 72 65 20 4e 20 69 73 20  les, where N is 
8800: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73  the number of us
8810: 65 72 0a 20 20 2a 2a 20 64 65 66 69 6e 65 64 20  er.  ** defined 
8820: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 46  columns in the F
8830: 54 53 33 20 74 61 62 6c 65 2c 20 70 6c 75 73 20  TS3 table, plus 
8840: 6f 6e 65 20 66 6f 72 20 74 68 65 20 64 6f 63 69  one for the doci
8850: 64 20 66 69 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20  d field..  */.  
8860: 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
8870: 28 70 2c 20 53 51 4c 5f 43 4f 4e 54 45 4e 54 5f  (p, SQL_CONTENT_
8880: 49 4e 53 45 52 54 2c 20 26 70 43 6f 6e 74 65 6e  INSERT, &pConten
8890: 74 49 6e 73 65 72 74 2c 20 26 61 70 56 61 6c 5b  tInsert, &apVal[
88a0: 31 5d 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  1]);.  if( rc==S
88b0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 7a  QLITE_OK && p->z
88c0: 4c 61 6e 67 75 61 67 65 69 64 20 29 7b 0a 20 20  Languageid ){.  
88d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
88e0: 69 6e 64 5f 69 6e 74 28 0a 20 20 20 20 20 20 20  ind_int(.       
88f0: 20 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 2c   pContentInsert,
8900: 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 2c 20 0a   p->nColumn+2, .
8910: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
8920: 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b  value_int(apVal[
8930: 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 34 5d 29 0a 20  p->nColumn+4]). 
8940: 20 20 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20     );.  }.  if( 
8950: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
8960: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
8970: 20 54 68 65 72 65 20 69 73 20 61 20 71 75 69 72   There is a quir
8980: 6b 20 68 65 72 65 2e 20 54 68 65 20 75 73 65 72  k here. The user
8990: 73 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  s INSERT stateme
89a0: 6e 74 20 6d 61 79 20 68 61 76 65 20 73 70 65 63  nt may have spec
89b0: 69 66 69 65 64 0a 20 20 2a 2a 20 61 20 76 61 6c  ified.  ** a val
89c0: 75 65 20 66 6f 72 20 74 68 65 20 22 72 6f 77 69  ue for the "rowi
89d0: 64 22 20 66 69 65 6c 64 2c 20 66 6f 72 20 74 68  d" field, for th
89e0: 65 20 22 64 6f 63 69 64 22 20 66 69 65 6c 64 2c  e "docid" field,
89f0: 20 6f 72 20 66 6f 72 20 62 6f 74 68 2e 0a 20 20   or for both..  
8a00: 2a 2a 20 57 68 69 63 68 20 69 73 20 61 20 70 72  ** Which is a pr
8a10: 6f 62 6c 65 6d 2c 20 73 69 6e 63 65 20 22 72 6f  oblem, since "ro
8a20: 77 69 64 22 20 61 6e 64 20 22 64 6f 63 69 64 22  wid" and "docid"
8a30: 20 61 72 65 20 61 6c 69 61 73 65 73 20 66 6f 72   are aliases for
8a40: 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 76   the.  ** same v
8a50: 61 6c 75 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c  alue. For exampl
8a60: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 49  e:.  **.  **   I
8a70: 4e 53 45 52 54 20 49 4e 54 4f 20 66 74 73 33 74  NSERT INTO fts3t
8a80: 62 6c 28 72 6f 77 69 64 2c 20 64 6f 63 69 64 29  bl(rowid, docid)
8a90: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
8aa0: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 46 54 53 33   **.  ** In FTS3
8ab0: 2c 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72  , this is an err
8ac0: 6f 72 2e 20 49 74 20 69 73 20 61 6e 20 65 72 72  or. It is an err
8ad0: 6f 72 20 74 6f 20 73 70 65 63 69 66 79 20 6e 6f  or to specify no
8ae0: 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 73 0a 20 20  n-NULL values.  
8af0: 2a 2a 20 66 6f 72 20 62 6f 74 68 20 64 6f 63 69  ** for both doci
8b00: 64 20 61 6e 64 20 73 6f 6d 65 20 6f 74 68 65 72  d and some other
8b10: 20 72 6f 77 69 64 20 61 6c 69 61 73 2e 0a 20 20   rowid alias..  
8b20: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
8b30: 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61  NULL!=sqlite3_va
8b40: 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 33  lue_type(apVal[3
8b50: 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 29 20 29 7b  +p->nColumn]) ){
8b60: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
8b70: 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61  NULL==sqlite3_va
8b80: 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 30  lue_type(apVal[0
8b90: 5d 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54  ]).     && SQLIT
8ba0: 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f  E_NULL!=sqlite3_
8bb0: 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c  value_type(apVal
8bc0: 5b 31 5d 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  [1]).    ){.    
8bd0: 20 20 2f 2a 20 41 20 72 6f 77 69 64 2f 64 6f 63    /* A rowid/doc
8be0: 69 64 20 63 6f 6e 66 6c 69 63 74 2e 20 2a 2f 0a  id conflict. */.
8bf0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8c00: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
8c10: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
8c20: 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 43 6f  3_bind_value(pCo
8c30: 6e 74 65 6e 74 49 6e 73 65 72 74 2c 20 31 2c 20  ntentInsert, 1, 
8c40: 61 70 56 61 6c 5b 33 2b 70 2d 3e 6e 43 6f 6c 75  apVal[3+p->nColu
8c50: 6d 6e 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  mn]);.    if( rc
8c60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
8c70: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
8c80: 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 73  /* Execute the s
8c90: 74 61 74 65 6d 65 6e 74 20 74 6f 20 69 6e 73 65  tatement to inse
8ca0: 72 74 20 74 68 65 20 72 65 63 6f 72 64 2e 20 53  rt the record. S
8cb0: 65 74 20 2a 70 69 44 6f 63 69 64 20 74 6f 20 74  et *piDocid to t
8cc0: 68 65 20 0a 20 20 2a 2a 20 6e 65 77 20 64 6f 63  he .  ** new doc
8cd0: 69 64 20 76 61 6c 75 65 2e 20 0a 20 20 2a 2f 0a  id value. .  */.
8ce0: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
8cf0: 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 29 3b 0a  ContentInsert);.
8d00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
8d10: 65 73 65 74 28 70 43 6f 6e 74 65 6e 74 49 6e 73  eset(pContentIns
8d20: 65 72 74 29 3b 0a 0a 20 20 2a 70 69 44 6f 63 69  ert);..  *piDoci
8d30: 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  d = sqlite3_last
8d40: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 70 2d  _insert_rowid(p-
8d50: 3e 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  >db);.  return r
8d60: 63 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  c;.}..../*.** Re
8d70: 6d 6f 76 65 20 61 6c 6c 20 64 61 74 61 20 66 72  move all data fr
8d80: 6f 6d 20 74 68 65 20 46 54 53 33 20 74 61 62 6c  om the FTS3 tabl
8d90: 65 2e 20 43 6c 65 61 72 20 74 68 65 20 68 61 73  e. Clear the has
8da0: 68 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  h table containi
8db0: 6e 67 0a 2a 2a 20 70 65 6e 64 69 6e 67 20 74 65  ng.** pending te
8dc0: 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rms..*/.static i
8dd0: 6e 74 20 66 74 73 33 44 65 6c 65 74 65 41 6c 6c  nt fts3DeleteAll
8de0: 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 69  (Fts3Table *p, i
8df0: 6e 74 20 62 43 6f 6e 74 65 6e 74 29 7b 0a 20 20  nt bContent){.  
8e00: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
8e10: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
8e20: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
8e30: 2f 0a 0a 20 20 2f 2a 20 44 69 73 63 61 72 64 20  /..  /* Discard 
8e40: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
8e50: 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d  the pending-term
8e60: 73 20 68 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f  s hash table. */
8e70: 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 50 65  .  sqlite3Fts3Pe
8e80: 6e 64 69 6e 67 54 65 72 6d 73 43 6c 65 61 72 28  ndingTermsClear(
8e90: 70 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  p);..  /* Delete
8ea0: 20 65 76 65 72 79 74 68 69 6e 67 20 66 72 6f 6d   everything from
8eb0: 20 74 68 65 20 73 68 61 64 6f 77 20 74 61 62 6c   the shadow tabl
8ec0: 65 73 2e 20 45 78 63 65 70 74 2c 20 6c 65 61 76  es. Except, leav
8ed0: 65 20 25 5f 63 6f 6e 74 65 6e 74 20 61 73 0a 20  e %_content as. 
8ee0: 20 2a 2a 20 69 73 20 69 66 20 62 43 6f 6e 74 65   ** is if bConte
8ef0: 6e 74 20 69 73 20 66 61 6c 73 65 2e 20 20 2a 2f  nt is false.  */
8f00: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 43  .  assert( p->zC
8f10: 6f 6e 74 65 6e 74 54 62 6c 3d 3d 30 20 7c 7c 20  ontentTbl==0 || 
8f20: 62 43 6f 6e 74 65 6e 74 3d 3d 30 20 29 3b 0a 20  bContent==0 );. 
8f30: 20 69 66 28 20 62 43 6f 6e 74 65 6e 74 20 29 20   if( bContent ) 
8f40: 66 74 73 33 53 71 6c 45 78 65 63 28 26 72 63 2c  fts3SqlExec(&rc,
8f50: 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41   p, SQL_DELETE_A
8f60: 4c 4c 5f 43 4f 4e 54 45 4e 54 2c 20 30 29 3b 0a  LL_CONTENT, 0);.
8f70: 20 20 66 74 73 33 53 71 6c 45 78 65 63 28 26 72    fts3SqlExec(&r
8f80: 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45  c, p, SQL_DELETE
8f90: 5f 41 4c 4c 5f 53 45 47 4d 45 4e 54 53 2c 20 30  _ALL_SEGMENTS, 0
8fa0: 29 3b 0a 20 20 66 74 73 33 53 71 6c 45 78 65 63  );.  fts3SqlExec
8fb0: 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c  (&rc, p, SQL_DEL
8fc0: 45 54 45 5f 41 4c 4c 5f 53 45 47 44 49 52 2c 20  ETE_ALL_SEGDIR, 
8fd0: 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 62 48 61  0);.  if( p->bHa
8fe0: 73 44 6f 63 73 69 7a 65 20 29 7b 0a 20 20 20 20  sDocsize ){.    
8ff0: 66 74 73 33 53 71 6c 45 78 65 63 28 26 72 63 2c  fts3SqlExec(&rc,
9000: 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41   p, SQL_DELETE_A
9010: 4c 4c 5f 44 4f 43 53 49 5a 45 2c 20 30 29 3b 0a  LL_DOCSIZE, 0);.
9020: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 62 48 61    }.  if( p->bHa
9030: 73 53 74 61 74 20 29 7b 0a 20 20 20 20 66 74 73  sStat ){.    fts
9040: 33 53 71 6c 45 78 65 63 28 26 72 63 2c 20 70 2c  3SqlExec(&rc, p,
9050: 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f   SQL_DELETE_ALL_
9060: 53 54 41 54 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  STAT, 0);.  }.  
9070: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
9080: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
9090: 74 20 6c 61 6e 67 69 64 46 72 6f 6d 53 65 6c 65  t langidFromSele
90a0: 63 74 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  ct(Fts3Table *p,
90b0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
90c0: 53 65 6c 65 63 74 29 7b 0a 20 20 69 6e 74 20 69  Select){.  int i
90d0: 4c 61 6e 67 69 64 20 3d 20 30 3b 0a 20 20 69 66  Langid = 0;.  if
90e0: 28 20 70 2d 3e 7a 4c 61 6e 67 75 61 67 65 69 64  ( p->zLanguageid
90f0: 20 29 20 69 4c 61 6e 67 69 64 20 3d 20 73 71 6c   ) iLangid = sql
9100: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
9110: 70 53 65 6c 65 63 74 2c 20 70 2d 3e 6e 43 6f 6c  pSelect, p->nCol
9120: 75 6d 6e 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e  umn+1);.  return
9130: 20 69 4c 61 6e 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a   iLangid;.}../*.
9140: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 65 6c 65  ** The first ele
9150: 6d 65 6e 74 20 69 6e 20 74 68 65 20 61 70 56 61  ment in the apVa
9160: 6c 5b 5d 20 61 72 72 61 79 20 69 73 20 61 73 73  l[] array is ass
9170: 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  umed to contain 
9180: 74 68 65 20 64 6f 63 69 64 0a 2a 2a 20 28 61 6e  the docid.** (an
9190: 20 69 6e 74 65 67 65 72 29 20 6f 66 20 61 20 72   integer) of a r
91a0: 6f 77 20 61 62 6f 75 74 20 74 6f 20 62 65 20 64  ow about to be d
91b0: 65 6c 65 74 65 64 2e 20 52 65 6d 6f 76 65 20 61  eleted. Remove a
91c0: 6c 6c 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68  ll terms from th
91d0: 65 0a 2a 2a 20 66 75 6c 6c 2d 74 65 78 74 20 69  e.** full-text i
91e0: 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
91f0: 76 6f 69 64 20 66 74 73 33 44 65 6c 65 74 65 54  void fts3DeleteT
9200: 65 72 6d 73 28 20 0a 20 20 69 6e 74 20 2a 70 52  erms( .  int *pR
9210: 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C,              
9220: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
9230: 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  */.  Fts3Table *
9240: 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
9250: 54 68 65 20 46 54 53 20 74 61 62 6c 65 20 74 6f  The FTS table to
9260: 20 64 65 6c 65 74 65 20 66 72 6f 6d 20 2a 2f 0a   delete from */.
9270: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
9280: 2a 70 52 6f 77 69 64 2c 20 20 2f 2a 20 54 68 65  *pRowid,  /* The
9290: 20 64 6f 63 69 64 20 74 6f 20 62 65 20 64 65 6c   docid to be del
92a0: 65 74 65 64 20 2a 2f 0a 20 20 75 33 32 20 2a 61  eted */.  u32 *a
92b0: 53 7a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Sz,             
92c0: 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 64 65    /* Sizes of de
92d0: 6c 65 74 65 64 20 64 6f 63 75 6d 65 6e 74 20 77  leted document w
92e0: 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20  ritten here */. 
92f0: 20 69 6e 74 20 2a 70 62 46 6f 75 6e 64 20 20 20   int *pbFound   
9300: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
9310: 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
9320: 72 6f 77 20 72 65 61 6c 6c 79 20 64 6f 65 73 20  row really does 
9330: 65 78 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  exist */.){.  in
9340: 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
9350: 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 3b 0a 0a  stmt *pSelect;..
9360: 20 20 61 73 73 65 72 74 28 20 2a 70 62 46 6f 75    assert( *pbFou
9370: 6e 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 2a  nd==0 );.  if( *
9380: 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pRC ) return;.  
9390: 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
93a0: 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 43  (p, SQL_SELECT_C
93b0: 4f 4e 54 45 4e 54 5f 42 59 5f 52 4f 57 49 44 2c  ONTENT_BY_ROWID,
93c0: 20 26 70 53 65 6c 65 63 74 2c 20 26 70 52 6f 77   &pSelect, &pRow
93d0: 69 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  id);.  if( rc==S
93e0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
93f0: 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
9400: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65  sqlite3_step(pSe
9410: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 69  lect) ){.      i
9420: 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt i;.      int 
9430: 69 4c 61 6e 67 69 64 20 3d 20 6c 61 6e 67 69 64  iLangid = langid
9440: 46 72 6f 6d 53 65 6c 65 63 74 28 70 2c 20 70 53  FromSelect(p, pS
9450: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 69 36  elect);.      i6
9460: 34 20 69 44 6f 63 69 64 20 3d 20 73 71 6c 69 74  4 iDocid = sqlit
9470: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
9480: 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
9490: 20 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64     rc = fts3Pend
94a0: 69 6e 67 54 65 72 6d 73 44 6f 63 69 64 28 70 2c  ingTermsDocid(p,
94b0: 20 31 2c 20 69 4c 61 6e 67 69 64 2c 20 69 44 6f   1, iLangid, iDo
94c0: 63 69 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  cid);.      for(
94d0: 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=1; rc==SQLITE_
94e0: 4f 4b 20 26 26 20 69 3c 3d 70 2d 3e 6e 43 6f 6c  OK && i<=p->nCol
94f0: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
9500: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 69 2d     int iCol = i-
9510: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  1;.        if( p
9520: 2d 3e 61 62 4e 6f 74 69 6e 64 65 78 65 64 5b 69  ->abNotindexed[i
9530: 43 6f 6c 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Col]==0 ){.     
9540: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
9550: 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20  *zText = (const 
9560: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63  char *)sqlite3_c
9570: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65  olumn_text(pSele
9580: 63 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  ct, i);.        
9590: 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69    rc = fts3Pendi
95a0: 6e 67 54 65 72 6d 73 41 64 64 28 70 2c 20 69 4c  ngTermsAdd(p, iL
95b0: 61 6e 67 69 64 2c 20 7a 54 65 78 74 2c 20 2d 31  angid, zText, -1
95c0: 2c 20 26 61 53 7a 5b 69 43 6f 6c 5d 29 3b 0a 20  , &aSz[iCol]);. 
95d0: 20 20 20 20 20 20 20 20 20 61 53 7a 5b 70 2d 3e           aSz[p->
95e0: 6e 43 6f 6c 75 6d 6e 5d 20 2b 3d 20 73 71 6c 69  nColumn] += sqli
95f0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
9600: 28 70 53 65 6c 65 63 74 2c 20 69 29 3b 0a 20 20  (pSelect, i);.  
9610: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9620: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
9630: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
9640: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74     sqlite3_reset
9650: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  (pSelect);.     
9660: 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
9670: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
9680: 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 62 46      }.      *pbF
9690: 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ound = 1;.    }.
96a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
96b0: 5f 72 65 73 65 74 28 70 53 65 6c 65 63 74 29 3b  _reset(pSelect);
96c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
96d0: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 65 6c  lite3_reset(pSel
96e0: 65 63 74 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 43  ect);.  }.  *pRC
96f0: 20 3d 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   = rc;.}../*.** 
9700: 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
9710: 69 6f 6e 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  ion to account f
9720: 6f 72 20 74 68 65 20 63 69 72 63 75 6c 61 72 20  or the circular 
9730: 64 65 70 65 6e 64 65 6e 63 79 20 62 65 74 77 65  dependency betwe
9740: 65 6e 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  en.** functions 
9750: 66 74 73 33 53 65 67 6d 65 6e 74 4d 65 72 67 65  fts3SegmentMerge
9760: 28 29 20 61 6e 64 20 66 74 73 33 41 6c 6c 6f 63  () and fts3Alloc
9770: 61 74 65 53 65 67 64 69 72 49 64 78 28 29 2e 0a  ateSegdirIdx()..
9780: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
9790: 73 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 46  s3SegmentMerge(F
97a0: 74 73 33 54 61 62 6c 65 20 2a 2c 20 69 6e 74 2c  ts3Table *, int,
97b0: 20 69 6e 74 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 20   int, int);../* 
97c0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
97d0: 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 6e 65  n allocates a ne
97e0: 77 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 69  w level iLevel i
97f0: 6e 64 65 78 20 69 6e 20 74 68 65 20 73 65 67 64  ndex in the segd
9800: 69 72 20 74 61 62 6c 65 2e 0a 2a 2a 20 55 73 75  ir table..** Usu
9810: 61 6c 6c 79 2c 20 69 6e 64 65 78 65 73 20 61 72  ally, indexes ar
9820: 65 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 74 68  e allocated with
9830: 69 6e 20 61 20 6c 65 76 65 6c 20 73 65 71 75 65  in a level seque
9840: 6e 74 69 61 6c 6c 79 20 73 74 61 72 74 69 6e 67  ntially starting
9850: 0a 2a 2a 20 77 69 74 68 20 30 2c 20 73 6f 20 74  .** with 0, so t
9860: 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 64  he allocated ind
9870: 65 78 20 69 73 20 6f 6e 65 20 67 72 65 61 74 65  ex is one greate
9880: 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65  r than the value
9890: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 62 79 3a   returned.** by:
98a0: 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
98b0: 6d 61 78 28 69 64 78 29 20 46 52 4f 4d 20 25 5f  max(idx) FROM %_
98c0: 73 65 67 64 69 72 20 57 48 45 52 45 20 6c 65 76  segdir WHERE lev
98d0: 65 6c 20 3d 20 3a 69 4c 65 76 65 6c 0a 2a 2a 0a  el = :iLevel.**.
98e0: 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  ** However, if t
98f0: 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79  here are already
9900: 20 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e   FTS3_MERGE_COUN
9910: 54 20 69 6e 64 65 78 65 73 20 61 74 20 74 68 65  T indexes at the
9920: 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 6c 65   requested.** le
9930: 76 65 6c 2c 20 74 68 65 79 20 61 72 65 20 6d 65  vel, they are me
9940: 72 67 65 64 20 69 6e 74 6f 20 61 20 73 69 6e 67  rged into a sing
9950: 6c 65 20 6c 65 76 65 6c 20 28 69 4c 65 76 65 6c  le level (iLevel
9960: 2b 31 29 20 73 65 67 6d 65 6e 74 20 61 6e 64 20  +1) segment and 
9970: 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  the .** allocate
9980: 64 20 69 6e 64 65 78 20 69 73 20 30 2e 0a 2a 2a  d index is 0..**
9990: 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
99a0: 6c 2c 20 2a 70 69 49 64 78 20 69 73 20 73 65 74  l, *piIdx is set
99b0: 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   to the allocate
99c0: 64 20 69 6e 64 65 78 20 73 6c 6f 74 20 61 6e 64  d index slot and
99d0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 72 65   SQLITE_OK.** re
99e0: 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
99f0: 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  e, an SQLite err
9a00: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
9a10: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
9a20: 6e 74 20 66 74 73 33 41 6c 6c 6f 63 61 74 65 53  nt fts3AllocateS
9a30: 65 67 64 69 72 49 64 78 28 0a 20 20 46 74 73 33  egdirIdx(.  Fts3
9a40: 54 61 62 6c 65 20 2a 70 2c 20 0a 20 20 69 6e 74  Table *p, .  int
9a50: 20 69 4c 61 6e 67 69 64 2c 20 20 20 20 20 20 20   iLangid,       
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9a70: 4c 61 6e 67 75 61 67 65 20 69 64 20 2a 2f 0a 20  Language id */. 
9a80: 20 69 6e 74 20 69 49 6e 64 65 78 2c 20 20 20 20   int iIndex,    
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9aa0: 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20 70 2d   /* Index for p-
9ab0: 3e 61 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  >aIndex */.  int
9ac0: 20 69 4c 65 76 65 6c 2c 20 0a 20 20 69 6e 74 20   iLevel, .  int 
9ad0: 2a 70 69 49 64 78 0a 29 7b 0a 20 20 69 6e 74 20  *piIdx.){.  int 
9ae0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
9af0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
9b00: 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
9b10: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 4e  sqlite3_stmt *pN
9b20: 65 78 74 49 64 78 3b 20 20 20 20 20 20 20 20 20  extIdx;         
9b30: 2f 2a 20 51 75 65 72 79 20 66 6f 72 20 6e 65 78  /* Query for nex
9b40: 74 20 69 64 78 20 61 74 20 6c 65 76 65 6c 20 69  t idx at level i
9b50: 4c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  Level */.  int i
9b60: 4e 65 78 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Next = 0;       
9b70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
9b80: 73 75 6c 74 20 6f 66 20 71 75 65 72 79 20 70 4e  sult of query pN
9b90: 65 78 74 49 64 78 20 2a 2f 0a 0a 20 20 61 73 73  extIdx */..  ass
9ba0: 65 72 74 28 20 69 4c 61 6e 67 69 64 3e 3d 30 20  ert( iLangid>=0 
9bb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
9bc0: 6e 49 6e 64 65 78 3e 3d 31 20 29 3b 0a 0a 20 20  nIndex>=1 );..  
9bd0: 2f 2a 20 53 65 74 20 76 61 72 69 61 62 6c 65 20  /* Set variable 
9be0: 69 4e 65 78 74 20 74 6f 20 74 68 65 20 6e 65 78  iNext to the nex
9bf0: 74 20 61 76 61 69 6c 61 62 6c 65 20 73 65 67 64  t available segd
9c00: 69 72 20 69 6e 64 65 78 20 61 74 20 6c 65 76 65  ir index at leve
9c10: 6c 20 69 4c 65 76 65 6c 2e 20 2a 2f 0a 20 20 72  l iLevel. */.  r
9c20: 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
9c30: 70 2c 20 53 51 4c 5f 4e 45 58 54 5f 53 45 47 4d  p, SQL_NEXT_SEGM
9c40: 45 4e 54 5f 49 4e 44 45 58 2c 20 26 70 4e 65 78  ENT_INDEX, &pNex
9c50: 74 49 64 78 2c 20 30 29 3b 0a 20 20 69 66 28 20  tIdx, 0);.  if( 
9c60: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
9c70: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
9c80: 64 5f 69 6e 74 36 34 28 0a 20 20 20 20 20 20 20  d_int64(.       
9c90: 20 70 4e 65 78 74 49 64 78 2c 20 31 2c 20 67 65   pNextIdx, 1, ge
9ca0: 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70  tAbsoluteLevel(p
9cb0: 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
9cc0: 78 2c 20 69 4c 65 76 65 6c 29 0a 20 20 20 20 29  x, iLevel).    )
9cd0: 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
9ce0: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
9cf0: 65 70 28 70 4e 65 78 74 49 64 78 29 20 29 7b 0a  ep(pNextIdx) ){.
9d00: 20 20 20 20 20 20 69 4e 65 78 74 20 3d 20 73 71        iNext = sq
9d10: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
9d20: 28 70 4e 65 78 74 49 64 78 2c 20 30 29 3b 0a 20  (pNextIdx, 0);. 
9d30: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
9d40: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 4e 65 78  lite3_reset(pNex
9d50: 74 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  tIdx);.  }..  if
9d60: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
9d70: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 4e 65  ){.    /* If iNe
9d80: 78 74 20 69 73 20 46 54 53 33 5f 4d 45 52 47 45  xt is FTS3_MERGE
9d90: 5f 43 4f 55 4e 54 2c 20 69 6e 64 69 63 61 74 69  _COUNT, indicati
9da0: 6e 67 20 74 68 61 74 20 6c 65 76 65 6c 20 69 4c  ng that level iL
9db0: 65 76 65 6c 20 69 73 20 61 6c 72 65 61 64 79 0a  evel is already.
9dc0: 20 20 20 20 2a 2a 20 66 75 6c 6c 2c 20 6d 65 72      ** full, mer
9dd0: 67 65 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20  ge all segments 
9de0: 69 6e 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20  in level iLevel 
9df0: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 4c  into a single iL
9e00: 65 76 65 6c 2b 31 0a 20 20 20 20 2a 2a 20 73 65  evel+1.    ** se
9e10: 67 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 6f 63 61  gment and alloca
9e20: 74 65 20 28 6e 65 77 6c 79 20 66 72 65 65 64 29  te (newly freed)
9e30: 20 69 6e 64 65 78 20 30 20 61 74 20 6c 65 76 65   index 0 at leve
9e40: 6c 20 69 4c 65 76 65 6c 2e 20 4f 74 68 65 72 77  l iLevel. Otherw
9e50: 69 73 65 2c 0a 20 20 20 20 2a 2a 20 69 66 20 69  ise,.    ** if i
9e60: 4e 65 78 74 20 69 73 20 6c 65 73 73 20 74 68 61  Next is less tha
9e70: 6e 20 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55  n FTS3_MERGE_COU
9e80: 4e 54 2c 20 61 6c 6c 6f 63 61 74 65 20 69 6e 64  NT, allocate ind
9e90: 65 78 20 69 4e 65 78 74 2e 0a 20 20 20 20 2a 2f  ex iNext..    */
9ea0: 0a 20 20 20 20 69 66 28 20 69 4e 65 78 74 3e 3d  .    if( iNext>=
9eb0: 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54  FTS3_MERGE_COUNT
9ec0: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 33 4c 6f   ){.      fts3Lo
9ed0: 67 4d 65 72 67 65 28 31 36 2c 20 67 65 74 41 62  gMerge(16, getAb
9ee0: 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69  soluteLevel(p, i
9ef0: 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20  Langid, iIndex, 
9f00: 69 4c 65 76 65 6c 29 29 3b 0a 20 20 20 20 20 20  iLevel));.      
9f10: 72 63 20 3d 20 66 74 73 33 53 65 67 6d 65 6e 74  rc = fts3Segment
9f20: 4d 65 72 67 65 28 70 2c 20 69 4c 61 6e 67 69 64  Merge(p, iLangid
9f30: 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c  , iIndex, iLevel
9f40: 29 3b 0a 20 20 20 20 20 20 2a 70 69 49 64 78 20  );.      *piIdx 
9f50: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
9f60: 20 20 20 20 20 20 2a 70 69 49 64 78 20 3d 20 69        *piIdx = i
9f70: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
9f80: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9f90: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 25 5f 73 65 67  ./*.** The %_seg
9fa0: 6d 65 6e 74 73 20 74 61 62 6c 65 20 69 73 20 64  ments table is d
9fb0: 65 63 6c 61 72 65 64 20 61 73 20 66 6f 6c 6c 6f  eclared as follo
9fc0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41  ws:.**.**   CREA
9fd0: 54 45 20 54 41 42 4c 45 20 25 5f 73 65 67 6d 65  TE TABLE %_segme
9fe0: 6e 74 73 28 62 6c 6f 63 6b 69 64 20 49 4e 54 45  nts(blockid INTE
9ff0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
a000: 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 0a 2a 2a 0a   block BLOB).**.
a010: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
a020: 20 72 65 61 64 73 20 64 61 74 61 20 66 72 6f 6d   reads data from
a030: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
a040: 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20   the %_segments 
a050: 74 61 62 6c 65 2e 20 54 68 65 0a 2a 2a 20 73 70  table. The.** sp
a060: 65 63 69 66 69 63 20 72 6f 77 20 69 73 20 69 64  ecific row is id
a070: 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20  entified by the 
a080: 69 42 6c 6f 63 6b 69 64 20 70 61 72 61 6d 65 74  iBlockid paramet
a090: 65 72 2e 20 49 66 20 70 61 42 6c 6f 62 20 69 73  er. If paBlob is
a0a0: 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68   not.** NULL, th
a0b0: 65 6e 20 61 20 62 75 66 66 65 72 20 69 73 20 61  en a buffer is a
a0c0: 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73  llocated using s
a0d0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20  qlite3_malloc() 
a0e0: 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 0a 2a 2a  and populated.**
a0f0: 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e   with the conten
a100: 74 73 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 73  ts of the blob s
a110: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 22 62 6c  tored in the "bl
a120: 6f 63 6b 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  ock" column of t
a130: 68 65 20 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65  he .** identifie
a140: 64 20 74 61 62 6c 65 20 72 6f 77 20 69 73 2e 20  d table row is. 
a150: 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 70  Whether or not p
a160: 61 42 6c 6f 62 20 69 73 20 4e 55 4c 4c 2c 20 2a  aBlob is NULL, *
a170: 70 6e 42 6c 6f 62 20 69 73 20 73 65 74 0a 2a 2a  pnBlob is set.**
a180: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
a190: 74 68 65 20 62 6c 6f 62 20 69 6e 20 62 79 74 65  the blob in byte
a1a0: 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
a1b0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
a1c0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6f 72  error occurs, or
a1d0: 20 74 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20   the table does 
a1e0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  not contain the 
a1f0: 73 70 65 63 69 66 69 65 64 20 72 6f 77 2c 0a 2a  specified row,.*
a200: 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  * an SQLite erro
a210: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
a220: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  ed. Otherwise, S
a230: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
a240: 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 70 61 42 6c  rned. If.** paBl
a250: 6f 62 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20  ob is non-NULL, 
a260: 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72  then it is the r
a270: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
a280: 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 0a 2a   the caller to.*
a290: 2a 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  * eventually fre
a2a0: 65 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 62  e the returned b
a2b0: 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  uffer..**.** Thi
a2c0: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6c  s function may l
a2d0: 65 61 76 65 20 61 6e 20 6f 70 65 6e 20 73 71 6c  eave an open sql
a2e0: 69 74 65 33 5f 62 6c 6f 62 2a 20 68 61 6e 64 6c  ite3_blob* handl
a2f0: 65 20 69 6e 20 74 68 65 0a 2a 2a 20 46 74 73 33  e in the.** Fts3
a300: 54 61 62 6c 65 2e 70 53 65 67 6d 65 6e 74 73 20  Table.pSegments 
a310: 76 61 72 69 61 62 6c 65 2e 20 54 68 69 73 20 68  variable. This h
a320: 61 6e 64 6c 65 20 69 73 20 72 65 75 73 65 64 20  andle is reused 
a330: 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  by subsequent ca
a340: 6c 6c 73 0a 2a 2a 20 74 6f 20 74 68 69 73 20 66  lls.** to this f
a350: 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 68 61 6e  unction. The han
a360: 64 6c 65 20 6d 61 79 20 62 65 20 63 6c 6f 73 65  dle may be close
a370: 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65  d by calling the
a380: 0a 2a 2a 20 73 71 6c 69 74 65 33 46 74 73 33 53  .** sqlite3Fts3S
a390: 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28 29 20 66  egmentsClose() f
a3a0: 75 6e 63 74 69 6f 6e 2e 20 52 65 75 73 69 6e 67  unction. Reusing
a3b0: 20 61 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 69   a blob handle i
a3c0: 73 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72  s a handy.** per
a3d0: 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65  formance improve
a3e0: 6d 65 6e 74 2c 20 62 75 74 20 74 68 65 20 62 6c  ment, but the bl
a3f0: 6f 62 20 68 61 6e 64 6c 65 20 73 68 6f 75 6c 64  ob handle should
a400: 20 61 6c 77 61 79 73 20 62 65 20 63 6c 6f 73 65   always be close
a410: 64 0a 2a 2a 20 62 65 66 6f 72 65 20 63 6f 6e 74  d.** before cont
a420: 72 6f 6c 20 69 73 20 72 65 74 75 72 6e 65 64 20  rol is returned 
a430: 74 6f 20 74 68 65 20 75 73 65 72 20 28 74 6f 20  to the user (to 
a440: 70 72 65 76 65 6e 74 20 61 20 6c 6f 63 6b 20 62  prevent a lock b
a450: 65 69 6e 67 20 68 65 6c 64 0a 2a 2a 20 6f 6e 20  eing held.** on 
a460: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
a470: 65 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  e for longer tha
a480: 6e 20 6e 65 63 65 73 73 61 72 79 29 2e 20 54 68  n necessary). Th
a490: 75 73 2c 20 61 6e 79 20 76 69 72 74 75 61 6c 20  us, any virtual 
a4a0: 74 61 62 6c 65 0a 2a 2a 20 6d 65 74 68 6f 64 20  table.** method 
a4b0: 28 78 46 69 6c 74 65 72 20 65 74 63 2e 29 20 74  (xFilter etc.) t
a4c0: 68 61 74 20 6d 61 79 20 64 69 72 65 63 74 6c 79  hat may directly
a4d0: 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 20 63   or indirectly c
a4e0: 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
a4f0: 6e 0a 2a 2a 20 6d 75 73 74 20 63 61 6c 6c 20 73  n.** must call s
a500: 71 6c 69 74 65 33 46 74 73 33 53 65 67 6d 65 6e  qlite3Fts3Segmen
a510: 74 73 43 6c 6f 73 65 28 29 20 62 65 66 6f 72 65  tsClose() before
a520: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69   returning..*/.i
a530: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 52 65  nt sqlite3Fts3Re
a540: 61 64 42 6c 6f 63 6b 28 0a 20 20 46 74 73 33 54  adBlock(.  Fts3T
a550: 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
a560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
a570: 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  S3 table handle 
a580: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
a590: 36 34 20 69 42 6c 6f 63 6b 69 64 2c 20 20 20 20  64 iBlockid,    
a5a0: 20 20 20 20 20 2f 2a 20 41 63 63 65 73 73 20 74       /* Access t
a5b0: 68 65 20 72 6f 77 20 77 69 74 68 20 62 6c 6f 63  he row with bloc
a5c0: 6b 69 64 3d 24 69 42 6c 6f 63 6b 69 64 20 2a 2f  kid=$iBlockid */
a5d0: 0a 20 20 63 68 61 72 20 2a 2a 70 61 42 6c 6f 62  .  char **paBlob
a5e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a5f0: 20 20 20 2f 2a 20 4f 55 54 3a 20 42 6c 6f 62 20     /* OUT: Blob 
a600: 64 61 74 61 20 69 6e 20 6d 61 6c 6c 6f 63 27 64  data in malloc'd
a610: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
a620: 20 2a 70 6e 42 6c 6f 62 2c 20 20 20 20 20 20 20   *pnBlob,       
a630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a640: 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 62 6c 6f  OUT: Size of blo
a650: 62 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  b data */.  int 
a660: 2a 70 6e 4c 6f 61 64 20 20 20 20 20 20 20 20 20  *pnLoad         
a670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
a680: 55 54 3a 20 42 79 74 65 73 20 61 63 74 75 61 6c  UT: Bytes actual
a690: 6c 79 20 6c 6f 61 64 65 64 20 2a 2f 0a 29 7b 0a  ly loaded */.){.
a6a0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6c0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
a6d0: 20 2a 2f 0a 0a 20 20 2f 2a 20 70 6e 42 6c 6f 62   */..  /* pnBlob
a6e0: 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 4e 55 4c   must be non-NUL
a6f0: 4c 2e 20 70 61 42 6c 6f 62 20 6d 61 79 20 62 65  L. paBlob may be
a700: 20 4e 55 4c 4c 20 6f 72 20 6e 6f 6e 2d 4e 55 4c   NULL or non-NUL
a710: 4c 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  L. */.  assert( 
a720: 70 6e 42 6c 6f 62 20 29 3b 0a 0a 20 20 69 66 28  pnBlob );..  if(
a730: 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73 20 29 7b   p->pSegments ){
a740: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
a750: 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 70 2d  3_blob_reopen(p-
a760: 3e 70 53 65 67 6d 65 6e 74 73 2c 20 69 42 6c 6f  >pSegments, iBlo
a770: 63 6b 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ckid);.  }else{.
a780: 20 20 20 20 69 66 28 20 30 3d 3d 70 2d 3e 7a 53      if( 0==p->zS
a790: 65 67 6d 65 6e 74 73 54 62 6c 20 29 7b 0a 20 20  egmentsTbl ){.  
a7a0: 20 20 20 20 70 2d 3e 7a 53 65 67 6d 65 6e 74 73      p->zSegments
a7b0: 54 62 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Tbl = sqlite3_mp
a7c0: 72 69 6e 74 66 28 22 25 73 5f 73 65 67 6d 65 6e  rintf("%s_segmen
a7d0: 74 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  ts", p->zName);.
a7e0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 2d 3e        if( 0==p->
a7f0: 7a 53 65 67 6d 65 6e 74 73 54 62 6c 20 29 20 72  zSegmentsTbl ) r
a800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
a810: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  EM;.    }.    rc
a820: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
a830: 6f 70 65 6e 28 0a 20 20 20 20 20 20 20 70 2d 3e  open(.       p->
a840: 64 62 2c 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a  db, p->zDb, p->z
a850: 53 65 67 6d 65 6e 74 73 54 62 6c 2c 20 22 62 6c  SegmentsTbl, "bl
a860: 6f 63 6b 22 2c 20 69 42 6c 6f 63 6b 69 64 2c 20  ock", iBlockid, 
a870: 30 2c 20 26 70 2d 3e 70 53 65 67 6d 65 6e 74 73  0, &p->pSegments
a880: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69  .    );.  }..  i
a890: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
a8a0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   ){.    int nByt
a8b0: 65 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  e = sqlite3_blob
a8c0: 5f 62 79 74 65 73 28 70 2d 3e 70 53 65 67 6d 65  _bytes(p->pSegme
a8d0: 6e 74 73 29 3b 0a 20 20 20 20 2a 70 6e 42 6c 6f  nts);.    *pnBlo
a8e0: 62 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 69  b = nByte;.    i
a8f0: 66 28 20 70 61 42 6c 6f 62 20 29 7b 0a 20 20 20  f( paBlob ){.   
a900: 20 20 20 63 68 61 72 20 2a 61 42 79 74 65 20 3d     char *aByte =
a910: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
a920: 6e 42 79 74 65 20 2b 20 46 54 53 33 5f 4e 4f 44  nByte + FTS3_NOD
a930: 45 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 20 20  E_PADDING);.    
a940: 20 20 69 66 28 20 21 61 42 79 74 65 20 29 7b 0a    if( !aByte ){.
a950: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
a960: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
a970: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a980: 69 66 28 20 70 6e 4c 6f 61 64 20 26 26 20 6e 42  if( pnLoad && nB
a990: 79 74 65 3e 28 46 54 53 33 5f 4e 4f 44 45 5f 43  yte>(FTS3_NODE_C
a9a0: 48 55 4e 4b 5f 54 48 52 45 53 48 4f 4c 44 29 20  HUNK_THRESHOLD) 
a9b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 79  ){.          nBy
a9c0: 74 65 20 3d 20 46 54 53 33 5f 4e 4f 44 45 5f 43  te = FTS3_NODE_C
a9d0: 48 55 4e 4b 53 49 5a 45 3b 0a 20 20 20 20 20 20  HUNKSIZE;.      
a9e0: 20 20 20 20 2a 70 6e 4c 6f 61 64 20 3d 20 6e 42      *pnLoad = nB
a9f0: 79 74 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  yte;.        }. 
aa00: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
aa10: 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d  te3_blob_read(p-
aa20: 3e 70 53 65 67 6d 65 6e 74 73 2c 20 61 42 79 74  >pSegments, aByt
aa30: 65 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20  e, nByte, 0);.  
aa40: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 42        memset(&aB
aa50: 79 74 65 5b 6e 42 79 74 65 5d 2c 20 30 2c 20 46  yte[nByte], 0, F
aa60: 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49 4e 47  TS3_NODE_PADDING
aa70: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
aa80: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
aa90: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
aaa0: 33 5f 66 72 65 65 28 61 42 79 74 65 29 3b 0a 20  3_free(aByte);. 
aab0: 20 20 20 20 20 20 20 20 20 61 42 79 74 65 20 3d           aByte =
aac0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
aad0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 61 42      }.      *paB
aae0: 6c 6f 62 20 3d 20 61 42 79 74 65 3b 0a 20 20 20  lob = aByte;.   
aaf0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
ab00: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c   rc;.}../*.** Cl
ab10: 6f 73 65 20 74 68 65 20 62 6c 6f 62 20 68 61 6e  ose the blob han
ab20: 64 6c 65 20 61 74 20 70 2d 3e 70 53 65 67 6d 65  dle at p->pSegme
ab30: 6e 74 73 2c 20 69 66 20 69 74 20 69 73 20 6f 70  nts, if it is op
ab40: 65 6e 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  en. See comments
ab50: 20 61 62 6f 76 65 0a 2a 2a 20 74 68 65 20 73 71   above.** the sq
ab60: 6c 69 74 65 33 46 74 73 33 52 65 61 64 42 6c 6f  lite3Fts3ReadBlo
ab70: 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ck() function fo
ab80: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f  r details..*/.vo
ab90: 69 64 20 73 71 6c 69 74 65 33 46 74 73 33 53 65  id sqlite3Fts3Se
aba0: 67 6d 65 6e 74 73 43 6c 6f 73 65 28 46 74 73 33  gmentsClose(Fts3
abb0: 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 73 71 6c  Table *p){.  sql
abc0: 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28  ite3_blob_close(
abd0: 70 2d 3e 70 53 65 67 6d 65 6e 74 73 29 3b 0a 20  p->pSegments);. 
abe0: 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73 20 3d 20   p->pSegments = 
abf0: 30 3b 0a 7d 0a 20 20 20 20 0a 73 74 61 74 69 63  0;.}.    .static
ac00: 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61 64   int fts3SegRead
ac10: 65 72 49 6e 63 72 52 65 61 64 28 46 74 73 33 53  erIncrRead(Fts3S
ac20: 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 65  egReader *pReade
ac30: 72 29 7b 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b  r){.  int nRead;
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ac60: 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61 64  of bytes to read
ac70: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac90: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
aca0: 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 52 65 61 64  code */..  nRead
acb0: 20 3d 20 4d 49 4e 28 70 52 65 61 64 65 72 2d 3e   = MIN(pReader->
acc0: 6e 4e 6f 64 65 20 2d 20 70 52 65 61 64 65 72 2d  nNode - pReader-
acd0: 3e 6e 50 6f 70 75 6c 61 74 65 2c 20 46 54 53 33  >nPopulate, FTS3
ace0: 5f 4e 4f 44 45 5f 43 48 55 4e 4b 53 49 5a 45 29  _NODE_CHUNKSIZE)
acf0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
ad00: 5f 62 6c 6f 62 5f 72 65 61 64 28 0a 20 20 20 20  _blob_read(.    
ad10: 20 20 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62    pReader->pBlob
ad20: 2c 20 0a 20 20 20 20 20 20 26 70 52 65 61 64 65  , .      &pReade
ad30: 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65 72  r->aNode[pReader
ad40: 2d 3e 6e 50 6f 70 75 6c 61 74 65 5d 2c 0a 20 20  ->nPopulate],.  
ad50: 20 20 20 20 6e 52 65 61 64 2c 0a 20 20 20 20 20      nRead,.     
ad60: 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c   pReader->nPopul
ad70: 61 74 65 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20  ate.  );..  if( 
ad80: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
ad90: 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 50  .    pReader->nP
ada0: 6f 70 75 6c 61 74 65 20 2b 3d 20 6e 52 65 61 64  opulate += nRead
adb0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 52  ;.    memset(&pR
adc0: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65  eader->aNode[pRe
add0: 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 5d  ader->nPopulate]
ade0: 2c 20 30 2c 20 46 54 53 33 5f 4e 4f 44 45 5f 50  , 0, FTS3_NODE_P
adf0: 41 44 44 49 4e 47 29 3b 0a 20 20 20 20 69 66 28  ADDING);.    if(
ae00: 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c   pReader->nPopul
ae10: 61 74 65 3d 3d 70 52 65 61 64 65 72 2d 3e 6e 4e  ate==pReader->nN
ae20: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ode ){.      sql
ae30: 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28  ite3_blob_close(
ae40: 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 29 3b  pReader->pBlob);
ae50: 0a 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e  .      pReader->
ae60: 70 42 6c 6f 62 20 3d 20 30 3b 0a 20 20 20 20 20  pBlob = 0;.     
ae70: 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c   pReader->nPopul
ae80: 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ate = 0;.    }. 
ae90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
aea0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
aeb0: 73 33 53 65 67 52 65 61 64 65 72 52 65 71 75 69  s3SegReaderRequi
aec0: 72 65 28 46 74 73 33 53 65 67 52 65 61 64 65 72  re(Fts3SegReader
aed0: 20 2a 70 52 65 61 64 65 72 2c 20 63 68 61 72 20   *pReader, char 
aee0: 2a 70 46 72 6f 6d 2c 20 69 6e 74 20 6e 42 79 74  *pFrom, int nByt
aef0: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
af00: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
af10: 72 74 28 20 21 70 52 65 61 64 65 72 2d 3e 70 42  rt( !pReader->pB
af20: 6c 6f 62 20 0a 20 20 20 20 20 20 20 7c 7c 20 28  lob .       || (
af30: 70 46 72 6f 6d 3e 3d 70 52 65 61 64 65 72 2d 3e  pFrom>=pReader->
af40: 61 4e 6f 64 65 20 26 26 20 70 46 72 6f 6d 3c 26  aNode && pFrom<&
af50: 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70  pReader->aNode[p
af60: 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 5d 29 0a  Reader->nNode]).
af70: 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 52    );.  while( pR
af80: 65 61 64 65 72 2d 3e 70 42 6c 6f 62 20 26 26 20  eader->pBlob && 
af90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20  rc==SQLITE_OK . 
afa0: 20 20 20 20 26 26 20 20 28 70 46 72 6f 6d 20 2d      &&  (pFrom -
afb0: 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20   pReader->aNode 
afc0: 2b 20 6e 42 79 74 65 29 3e 70 52 65 61 64 65 72  + nByte)>pReader
afd0: 2d 3e 6e 50 6f 70 75 6c 61 74 65 0a 20 20 29 7b  ->nPopulate.  ){
afe0: 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65  .    rc = fts3Se
aff0: 67 52 65 61 64 65 72 49 6e 63 72 52 65 61 64 28  gReaderIncrRead(
b000: 70 52 65 61 64 65 72 29 3b 0a 20 20 7d 0a 20 20  pReader);.  }.  
b010: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
b020: 0a 2a 2a 20 53 65 74 20 61 6e 20 46 74 73 33 53  .** Set an Fts3S
b030: 65 67 52 65 61 64 65 72 20 63 75 72 73 6f 72 20  egReader cursor 
b040: 74 6f 20 70 6f 69 6e 74 20 61 74 20 45 4f 46 2e  to point at EOF.
b050: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b060: 66 74 73 33 53 65 67 52 65 61 64 65 72 53 65 74  fts3SegReaderSet
b070: 45 6f 66 28 46 74 73 33 53 65 67 52 65 61 64 65  Eof(Fts3SegReade
b080: 72 20 2a 70 53 65 67 29 7b 0a 20 20 69 66 28 20  r *pSeg){.  if( 
b090: 21 66 74 73 33 53 65 67 52 65 61 64 65 72 49 73  !fts3SegReaderIs
b0a0: 52 6f 6f 74 4f 6e 6c 79 28 70 53 65 67 29 20 29  RootOnly(pSeg) )
b0b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
b0c0: 65 65 28 70 53 65 67 2d 3e 61 4e 6f 64 65 29 3b  ee(pSeg->aNode);
b0d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  .    sqlite3_blo
b0e0: 62 5f 63 6c 6f 73 65 28 70 53 65 67 2d 3e 70 42  b_close(pSeg->pB
b0f0: 6c 6f 62 29 3b 0a 20 20 20 20 70 53 65 67 2d 3e  lob);.    pSeg->
b100: 70 42 6c 6f 62 20 3d 20 30 3b 0a 20 20 7d 0a 20  pBlob = 0;.  }. 
b110: 20 70 53 65 67 2d 3e 61 4e 6f 64 65 20 3d 20 30   pSeg->aNode = 0
b120: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
b130: 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  the iterator pas
b140: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
b150: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
b160: 20 6e 65 78 74 20 74 65 72 6d 20 69 6e 20 74 68   next term in th
b170: 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 2e 20 49 66  e.** segment. If
b180: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
b190: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
b1a0: 65 64 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  ed. If there is 
b1b0: 6e 6f 20 6e 65 78 74 20 74 65 72 6d 2c 0a 2a 2a  no next term,.**
b1c0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 74   SQLITE_DONE. Ot
b1d0: 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69  herwise, an SQLi
b1e0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
b1f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
b200: 33 53 65 67 52 65 61 64 65 72 4e 65 78 74 28 0a  3SegReaderNext(.
b210: 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
b220: 0a 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72  .  Fts3SegReader
b230: 20 2a 70 52 65 61 64 65 72 2c 0a 20 20 69 6e 74   *pReader,.  int
b240: 20 62 49 6e 63 72 0a 29 7b 0a 20 20 69 6e 74 20   bIncr.){.  int 
b250: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
b260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
b270: 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 76 61  eturn code of va
b280: 72 69 6f 75 73 20 73 75 62 2d 72 6f 75 74 69 6e  rious sub-routin
b290: 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 4e  es */.  char *pN
b2a0: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
b2b0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
b2c0: 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
b2d0: 69 6e 74 20 6e 50 72 65 66 69 78 3b 20 20 20 20  int nPrefix;    
b2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
b300: 65 73 20 69 6e 20 74 65 72 6d 20 70 72 65 66 69  es in term prefi
b310: 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 66 66  x */.  int nSuff
b320: 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ix;             
b330: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b340: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 65 72   of bytes in ter
b350: 6d 20 73 75 66 66 69 78 20 2a 2f 0a 0a 20 20 69  m suffix */..  i
b360: 66 28 20 21 70 52 65 61 64 65 72 2d 3e 61 44 6f  f( !pReader->aDo
b370: 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 70 4e 65  clist ){.    pNe
b380: 78 74 20 3d 20 70 52 65 61 64 65 72 2d 3e 61 4e  xt = pReader->aN
b390: 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ode;.  }else{.  
b3a0: 20 20 70 4e 65 78 74 20 3d 20 26 70 52 65 61 64    pNext = &pRead
b3b0: 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b 70 52 65  er->aDoclist[pRe
b3c0: 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 5d 3b  ader->nDoclist];
b3d0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 4e 65  .  }..  if( !pNe
b3e0: 78 74 20 7c 7c 20 70 4e 65 78 74 3e 3d 26 70 52  xt || pNext>=&pR
b3f0: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65  eader->aNode[pRe
b400: 61 64 65 72 2d 3e 6e 4e 6f 64 65 5d 20 29 7b 0a  ader->nNode] ){.
b410: 0a 20 20 20 20 69 66 28 20 66 74 73 33 53 65 67  .    if( fts3Seg
b420: 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28  ReaderIsPending(
b430: 70 52 65 61 64 65 72 29 20 29 7b 0a 20 20 20 20  pReader) ){.    
b440: 20 20 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a    Fts3HashElem *
b450: 70 45 6c 65 6d 20 3d 20 2a 28 70 52 65 61 64 65  pElem = *(pReade
b460: 72 2d 3e 70 70 4e 65 78 74 45 6c 65 6d 29 3b 0a  r->ppNextElem);.
b470: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
b480: 65 65 28 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64  ee(pReader->aNod
b490: 65 29 3b 0a 20 20 20 20 20 20 70 52 65 61 64 65  e);.      pReade
b4a0: 72 2d 3e 61 4e 6f 64 65 20 3d 20 30 3b 0a 20 20  r->aNode = 0;.  
b4b0: 20 20 20 20 69 66 28 20 70 45 6c 65 6d 20 29 7b      if( pElem ){
b4c0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 61  .        char *a
b4d0: 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 50 65  Copy;.        Pe
b4e0: 6e 64 69 6e 67 4c 69 73 74 20 2a 70 4c 69 73 74  ndingList *pList
b4f0: 20 3d 20 28 50 65 6e 64 69 6e 67 4c 69 73 74 20   = (PendingList 
b500: 2a 29 66 74 73 33 48 61 73 68 44 61 74 61 28 70  *)fts3HashData(p
b510: 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 69  Elem);.        i
b520: 6e 74 20 6e 43 6f 70 79 20 3d 20 70 4c 69 73 74  nt nCopy = pList
b530: 2d 3e 6e 44 61 74 61 2b 31 3b 0a 20 20 20 20 20  ->nData+1;.     
b540: 20 20 20 70 52 65 61 64 65 72 2d 3e 7a 54 65 72     pReader->zTer
b550: 6d 20 3d 20 28 63 68 61 72 20 2a 29 66 74 73 33  m = (char *)fts3
b560: 48 61 73 68 4b 65 79 28 70 45 6c 65 6d 29 3b 0a  HashKey(pElem);.
b570: 20 20 20 20 20 20 20 20 70 52 65 61 64 65 72 2d          pReader-
b580: 3e 6e 54 65 72 6d 20 3d 20 66 74 73 33 48 61 73  >nTerm = fts3Has
b590: 68 4b 65 79 73 69 7a 65 28 70 45 6c 65 6d 29 3b  hKeysize(pElem);
b5a0: 0a 20 20 20 20 20 20 20 20 61 43 6f 70 79 20 3d  .        aCopy =
b5b0: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
b5c0: 6d 61 6c 6c 6f 63 28 6e 43 6f 70 79 29 3b 0a 20  malloc(nCopy);. 
b5d0: 20 20 20 20 20 20 20 69 66 28 20 21 61 43 6f 70         if( !aCop
b5e0: 79 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  y ) return SQLIT
b5f0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
b600: 20 6d 65 6d 63 70 79 28 61 43 6f 70 79 2c 20 70   memcpy(aCopy, p
b610: 4c 69 73 74 2d 3e 61 44 61 74 61 2c 20 6e 43 6f  List->aData, nCo
b620: 70 79 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65  py);.        pRe
b630: 61 64 65 72 2d 3e 6e 4e 6f 64 65 20 3d 20 70 52  ader->nNode = pR
b640: 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 20  eader->nDoclist 
b650: 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 20  = nCopy;.       
b660: 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20   pReader->aNode 
b670: 3d 20 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c  = pReader->aDocl
b680: 69 73 74 20 3d 20 61 43 6f 70 79 3b 0a 20 20 20  ist = aCopy;.   
b690: 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 70       pReader->pp
b6a0: 4e 65 78 74 45 6c 65 6d 2b 2b 3b 0a 20 20 20 20  NextElem++;.    
b6b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 61      assert( pRea
b6c0: 64 65 72 2d 3e 61 4e 6f 64 65 20 29 3b 0a 20 20  der->aNode );.  
b6d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
b6e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
b6f0: 20 20 7d 0a 0a 20 20 20 20 66 74 73 33 53 65 67    }..    fts3Seg
b700: 52 65 61 64 65 72 53 65 74 45 6f 66 28 70 52 65  ReaderSetEof(pRe
b710: 61 64 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ader);..    /* I
b720: 66 20 69 43 75 72 72 65 6e 74 42 6c 6f 63 6b 3e  f iCurrentBlock>
b730: 3d 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 2c 20  =iLeafEndBlock, 
b740: 74 68 69 73 20 69 73 20 61 6e 20 45 4f 46 20 63  this is an EOF c
b750: 6f 6e 64 69 74 69 6f 6e 2e 20 41 6c 6c 20 6c 65  ondition. All le
b760: 61 66 20 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  af .    ** block
b770: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
b780: 65 65 6e 20 74 72 61 76 65 72 73 65 64 2e 20 20  een traversed.  
b790: 2a 2f 0a 23 69 66 64 65 66 20 43 4f 52 52 55 50  */.#ifdef CORRUP
b7a0: 54 5f 44 42 0a 20 20 20 20 61 73 73 65 72 74 28  T_DB.    assert(
b7b0: 20 70 52 65 61 64 65 72 2d 3e 69 43 75 72 72 65   pReader->iCurre
b7c0: 6e 74 42 6c 6f 63 6b 3c 3d 70 52 65 61 64 65 72  ntBlock<=pReader
b7d0: 2d 3e 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 20  ->iLeafEndBlock 
b7e0: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
b7f0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
b800: 70 52 65 61 64 65 72 2d 3e 69 43 75 72 72 65 6e  pReader->iCurren
b810: 74 42 6c 6f 63 6b 3e 3d 70 52 65 61 64 65 72 2d  tBlock>=pReader-
b820: 3e 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 20 29  >iLeafEndBlock )
b830: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
b840: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
b850: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
b860: 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28 0a  3Fts3ReadBlock(.
b870: 20 20 20 20 20 20 20 20 70 2c 20 2b 2b 70 52 65          p, ++pRe
b880: 61 64 65 72 2d 3e 69 43 75 72 72 65 6e 74 42 6c  ader->iCurrentBl
b890: 6f 63 6b 2c 20 26 70 52 65 61 64 65 72 2d 3e 61  ock, &pReader->a
b8a0: 4e 6f 64 65 2c 20 26 70 52 65 61 64 65 72 2d 3e  Node, &pReader->
b8b0: 6e 4e 6f 64 65 2c 20 0a 20 20 20 20 20 20 20 20  nNode, .        
b8c0: 28 62 49 6e 63 72 20 3f 20 26 70 52 65 61 64 65  (bIncr ? &pReade
b8d0: 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 20 3a 20 30  r->nPopulate : 0
b8e0: 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
b8f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b900: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
b910: 61 73 73 65 72 74 28 20 70 52 65 61 64 65 72 2d  assert( pReader-
b920: 3e 70 42 6c 6f 62 3d 3d 30 20 29 3b 0a 20 20 20  >pBlob==0 );.   
b930: 20 69 66 28 20 62 49 6e 63 72 20 26 26 20 70 52   if( bIncr && pR
b940: 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65  eader->nPopulate
b950: 3c 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 20  <pReader->nNode 
b960: 29 7b 0a 20 20 20 20 20 20 70 52 65 61 64 65 72  ){.      pReader
b970: 2d 3e 70 42 6c 6f 62 20 3d 20 70 2d 3e 70 53 65  ->pBlob = p->pSe
b980: 67 6d 65 6e 74 73 3b 0a 20 20 20 20 20 20 70 2d  gments;.      p-
b990: 3e 70 53 65 67 6d 65 6e 74 73 20 3d 20 30 3b 0a  >pSegments = 0;.
b9a0: 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 78 74 20      }.    pNext 
b9b0: 3d 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65  = pReader->aNode
b9c0: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
b9d0: 20 21 66 74 73 33 53 65 67 52 65 61 64 65 72 49   !fts3SegReaderI
b9e0: 73 50 65 6e 64 69 6e 67 28 70 52 65 61 64 65 72  sPending(pReader
b9f0: 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 66 74 73  ) );..  rc = fts
ba00: 33 53 65 67 52 65 61 64 65 72 52 65 71 75 69 72  3SegReaderRequir
ba10: 65 28 70 52 65 61 64 65 72 2c 20 70 4e 65 78 74  e(pReader, pNext
ba20: 2c 20 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41  , FTS3_VARINT_MA
ba30: 58 2a 32 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  X*2);.  if( rc!=
ba40: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
ba50: 72 6e 20 72 63 3b 0a 20 20 0a 20 20 2f 2a 20 42  rn rc;.  .  /* B
ba60: 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 46 54  ecause of the FT
ba70: 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49 4e 47 20  S3_NODE_PADDING 
ba80: 62 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67  bytes of padding
ba90: 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
baa0: 69 73 20 0a 20 20 2a 2a 20 73 61 66 65 20 28 6e  is .  ** safe (n
bab0: 6f 20 72 69 73 6b 20 6f 66 20 6f 76 65 72 72 65  o risk of overre
bac0: 61 64 29 20 65 76 65 6e 20 69 66 20 74 68 65 20  ad) even if the 
bad0: 6e 6f 64 65 20 64 61 74 61 20 69 73 20 63 6f 72  node data is cor
bae0: 72 75 70 74 65 64 2e 20 2a 2f 0a 20 20 70 4e 65  rupted. */.  pNe
baf0: 78 74 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72  xt += fts3GetVar
bb00: 69 6e 74 33 32 28 70 4e 65 78 74 2c 20 26 6e 50  int32(pNext, &nP
bb10: 72 65 66 69 78 29 3b 0a 20 20 70 4e 65 78 74 20  refix);.  pNext 
bb20: 2b 3d 20 66 74 73 33 47 65 74 56 61 72 69 6e 74  += fts3GetVarint
bb30: 33 32 28 70 4e 65 78 74 2c 20 26 6e 53 75 66 66  32(pNext, &nSuff
bb40: 69 78 29 3b 0a 20 20 69 66 28 20 6e 53 75 66 66  ix);.  if( nSuff
bb50: 69 78 3c 3d 30 20 0a 20 20 20 7c 7c 20 28 26 70  ix<=0 .   || (&p
bb60: 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52  Reader->aNode[pR
bb70: 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 5d 20 2d 20  eader->nNode] - 
bb80: 70 4e 65 78 74 29 3c 6e 53 75 66 66 69 78 0a 20  pNext)<nSuffix. 
bb90: 20 20 7c 7c 20 6e 50 72 65 66 69 78 3e 70 52 65    || nPrefix>pRe
bba0: 61 64 65 72 2d 3e 6e 54 65 72 6d 41 6c 6c 6f 63  ader->nTermAlloc
bbb0: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
bbc0: 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41   FTS_CORRUPT_VTA
bbd0: 42 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 6f 74  B;.  }..  /* Bot
bbe0: 68 20 6e 50 72 65 66 69 78 20 61 6e 64 20 6e 53  h nPrefix and nS
bbf0: 75 66 66 69 78 20 77 65 72 65 20 72 65 61 64 20  uffix were read 
bc00: 62 79 20 66 74 73 33 47 65 74 56 61 72 69 6e 74  by fts3GetVarint
bc10: 33 32 28 29 20 61 6e 64 20 73 6f 20 61 72 65 0a  32() and so are.
bc20: 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 30 20 61    ** between 0 a
bc30: 6e 64 20 30 78 37 46 46 46 46 46 46 46 2e 20 42  nd 0x7FFFFFFF. B
bc40: 75 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  ut the sum of th
bc50: 65 20 74 77 6f 20 6d 61 79 20 63 61 75 73 65 20  e two may cause 
bc60: 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 6f 76 65  integer.  ** ove
bc70: 72 66 6c 6f 77 20 2d 20 68 65 6e 63 65 20 74 68  rflow - hence th
bc80: 65 20 28 69 36 34 29 20 63 61 73 74 73 2e 20 20  e (i64) casts.  
bc90: 2a 2f 0a 20 20 69 66 28 20 28 69 36 34 29 6e 50  */.  if( (i64)nP
bca0: 72 65 66 69 78 2b 6e 53 75 66 66 69 78 3e 28 69  refix+nSuffix>(i
bcb0: 36 34 29 70 52 65 61 64 65 72 2d 3e 6e 54 65 72  64)pReader->nTer
bcc0: 6d 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 36  mAlloc ){.    i6
bcd0: 34 20 6e 4e 65 77 20 3d 20 28 28 69 36 34 29 6e  4 nNew = ((i64)n
bce0: 50 72 65 66 69 78 2b 6e 53 75 66 66 69 78 29 2a  Prefix+nSuffix)*
bcf0: 32 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 65  2;.    char *zNe
bd00: 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
bd10: 6c 6f 63 36 34 28 70 52 65 61 64 65 72 2d 3e 7a  loc64(pReader->z
bd20: 54 65 72 6d 2c 20 6e 4e 65 77 29 3b 0a 20 20 20  Term, nNew);.   
bd30: 20 69 66 28 20 21 7a 4e 65 77 20 29 7b 0a 20 20   if( !zNew ){.  
bd40: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
bd50: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
bd60: 20 20 20 70 52 65 61 64 65 72 2d 3e 7a 54 65 72     pReader->zTer
bd70: 6d 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20 70 52  m = zNew;.    pR
bd80: 65 61 64 65 72 2d 3e 6e 54 65 72 6d 41 6c 6c 6f  eader->nTermAllo
bd90: 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 7d 0a 0a 20  c = nNew;.  }.. 
bda0: 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61   rc = fts3SegRea
bdb0: 64 65 72 52 65 71 75 69 72 65 28 70 52 65 61 64  derRequire(pRead
bdc0: 65 72 2c 20 70 4e 65 78 74 2c 20 6e 53 75 66 66  er, pNext, nSuff
bdd0: 69 78 2b 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d  ix+FTS3_VARINT_M
bde0: 41 58 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  AX);.  if( rc!=S
bdf0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
be00: 6e 20 72 63 3b 0a 0a 20 20 6d 65 6d 63 70 79 28  n rc;..  memcpy(
be10: 26 70 52 65 61 64 65 72 2d 3e 7a 54 65 72 6d 5b  &pReader->zTerm[
be20: 6e 50 72 65 66 69 78 5d 2c 20 70 4e 65 78 74 2c  nPrefix], pNext,
be30: 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 70 52 65   nSuffix);.  pRe
be40: 61 64 65 72 2d 3e 6e 54 65 72 6d 20 3d 20 6e 50  ader->nTerm = nP
be50: 72 65 66 69 78 2b 6e 53 75 66 66 69 78 3b 0a 20  refix+nSuffix;. 
be60: 20 70 4e 65 78 74 20 2b 3d 20 6e 53 75 66 66 69   pNext += nSuffi
be70: 78 3b 0a 20 20 70 4e 65 78 74 20 2b 3d 20 66 74  x;.  pNext += ft
be80: 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 70 4e  s3GetVarint32(pN
be90: 65 78 74 2c 20 26 70 52 65 61 64 65 72 2d 3e 6e  ext, &pReader->n
bea0: 44 6f 63 6c 69 73 74 29 3b 0a 20 20 70 52 65 61  Doclist);.  pRea
beb0: 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20  der->aDoclist = 
bec0: 70 4e 65 78 74 3b 0a 20 20 70 52 65 61 64 65 72  pNext;.  pReader
bed0: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20  ->pOffsetList = 
bee0: 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  0;..  /* Check t
bef0: 68 61 74 20 74 68 65 20 64 6f 63 6c 69 73 74 20  hat the doclist 
bf00: 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20  does not appear 
bf10: 74 6f 20 65 78 74 65 6e 64 20 70 61 73 74 20 74  to extend past t
bf20: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
bf30: 2a 2a 20 62 2d 74 72 65 65 20 6e 6f 64 65 2e 20  ** b-tree node. 
bf40: 41 6e 64 20 74 68 61 74 20 74 68 65 20 66 69 6e  And that the fin
bf50: 61 6c 20 62 79 74 65 20 6f 66 20 74 68 65 20 64  al byte of the d
bf60: 6f 63 6c 69 73 74 20 69 73 20 30 78 30 30 2e 20  oclist is 0x00. 
bf70: 49 66 20 65 69 74 68 65 72 20 0a 20 20 2a 2a 20  If either .  ** 
bf80: 6f 66 20 74 68 65 73 65 20 73 74 61 74 65 6d 65  of these stateme
bf90: 6e 74 73 20 69 73 20 75 6e 74 72 75 65 2c 20 74  nts is untrue, t
bfa0: 68 65 6e 20 74 68 65 20 64 61 74 61 20 73 74 72  hen the data str
bfb0: 75 63 74 75 72 65 20 69 73 20 63 6f 72 72 75 70  ucture is corrup
bfc0: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 52  t..  */.  if( pR
bfd0: 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 20  eader->nDoclist 
bfe0: 3e 20 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65  > pReader->nNode
bff0: 2d 28 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c  -(pReader->aDocl
c000: 69 73 74 2d 70 52 65 61 64 65 72 2d 3e 61 4e 6f  ist-pReader->aNo
c010: 64 65 29 0a 20 20 20 7c 7c 20 28 70 52 65 61 64  de).   || (pRead
c020: 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 3d 3d 30  er->nPopulate==0
c030: 20 26 26 20 70 52 65 61 64 65 72 2d 3e 61 44 6f   && pReader->aDo
c040: 63 6c 69 73 74 5b 70 52 65 61 64 65 72 2d 3e 6e  clist[pReader->n
c050: 44 6f 63 6c 69 73 74 2d 31 5d 29 0a 20 20 29 7b  Doclist-1]).  ){
c060: 0a 20 20 20 20 72 65 74 75 72 6e 20 46 54 53 5f  .    return FTS_
c070: 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20  CORRUPT_VTAB;.  
c080: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
c090: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
c0a0: 65 74 20 74 68 65 20 53 65 67 52 65 61 64 65 72  et the SegReader
c0b0: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
c0c0: 20 66 69 72 73 74 20 64 6f 63 69 64 20 69 6e 20   first docid in 
c0d0: 74 68 65 20 64 6f 63 6c 69 73 74 20 61 73 73 6f  the doclist asso
c0e0: 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
c0f0: 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 2e  he current term.
c100: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
c110: 74 73 33 53 65 67 52 65 61 64 65 72 46 69 72 73  ts3SegReaderFirs
c120: 74 44 6f 63 69 64 28 46 74 73 33 54 61 62 6c 65  tDocid(Fts3Table
c130: 20 2a 70 54 61 62 2c 20 46 74 73 33 53 65 67 52   *pTab, Fts3SegR
c140: 65 61 64 65 72 20 2a 70 52 65 61 64 65 72 29 7b  eader *pReader){
c150: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
c160: 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
c170: 20 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69   pReader->aDocli
c180: 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  st );.  assert( 
c190: 21 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65  !pReader->pOffse
c1a0: 74 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70  tList );.  if( p
c1b0: 54 61 62 2d 3e 62 44 65 73 63 49 64 78 20 26 26  Tab->bDescIdx &&
c1c0: 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49 73   fts3SegReaderIs
c1d0: 50 65 6e 64 69 6e 67 28 70 52 65 61 64 65 72 29  Pending(pReader)
c1e0: 20 29 7b 0a 20 20 20 20 75 38 20 62 45 6f 66 20   ){.    u8 bEof 
c1f0: 3d 20 30 3b 0a 20 20 20 20 70 52 65 61 64 65 72  = 0;.    pReader
c200: 2d 3e 69 44 6f 63 69 64 20 3d 20 30 3b 0a 20 20  ->iDocid = 0;.  
c210: 20 20 70 52 65 61 64 65 72 2d 3e 6e 4f 66 66 73    pReader->nOffs
c220: 65 74 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  etList = 0;.    
c230: 73 71 6c 69 74 65 33 46 74 73 33 44 6f 63 6c 69  sqlite3Fts3Docli
c240: 73 74 50 72 65 76 28 30 2c 0a 20 20 20 20 20 20  stPrev(0,.      
c250: 20 20 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c    pReader->aDocl
c260: 69 73 74 2c 20 70 52 65 61 64 65 72 2d 3e 6e 44  ist, pReader->nD
c270: 6f 63 6c 69 73 74 2c 20 26 70 52 65 61 64 65 72  oclist, &pReader
c280: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 2c 20 0a  ->pOffsetList, .
c290: 20 20 20 20 20 20 20 20 26 70 52 65 61 64 65 72          &pReader
c2a0: 2d 3e 69 44 6f 63 69 64 2c 20 26 70 52 65 61 64  ->iDocid, &pRead
c2b0: 65 72 2d 3e 6e 4f 66 66 73 65 74 4c 69 73 74 2c  er->nOffsetList,
c2c0: 20 26 62 45 6f 66 0a 20 20 20 20 29 3b 0a 20 20   &bEof.    );.  
c2d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
c2e0: 66 74 73 33 53 65 67 52 65 61 64 65 72 52 65 71  fts3SegReaderReq
c2f0: 75 69 72 65 28 70 52 65 61 64 65 72 2c 20 70 52  uire(pReader, pR
c300: 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 2c  eader->aDoclist,
c310: 20 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58   FTS3_VARINT_MAX
c320: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
c330: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c340: 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
c350: 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 70  3Fts3GetVarint(p
c360: 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74  Reader->aDoclist
c370: 2c 20 26 70 52 65 61 64 65 72 2d 3e 69 44 6f 63  , &pReader->iDoc
c380: 69 64 29 3b 0a 20 20 20 20 20 20 70 52 65 61 64  id);.      pRead
c390: 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20  er->pOffsetList 
c3a0: 3d 20 26 70 52 65 61 64 65 72 2d 3e 61 44 6f 63  = &pReader->aDoc
c3b0: 6c 69 73 74 5b 6e 5d 3b 0a 20 20 20 20 7d 0a 20  list[n];.    }. 
c3c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
c3d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
c3e0: 20 74 68 65 20 53 65 67 52 65 61 64 65 72 20 74   the SegReader t
c3f0: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
c400: 65 78 74 20 64 6f 63 69 64 20 69 6e 20 74 68 65  ext docid in the
c410: 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 61 73 73 6f   doclist.** asso
c420: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
c430: 63 75 72 72 65 6e 74 20 74 65 72 6d 2e 0a 2a 2a  current term..**
c440: 20 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74   .** If argument
c450: 73 20 70 70 4f 66 66 73 65 74 4c 69 73 74 20 61  s ppOffsetList a
c460: 6e 64 20 70 6e 4f 66 66 73 65 74 4c 69 73 74 20  nd pnOffsetList 
c470: 61 72 65 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68  are not NULL, th
c480: 65 6e 20 0a 2a 2a 20 2a 70 70 4f 66 66 73 65 74  en .** *ppOffset
c490: 4c 69 73 74 20 69 73 20 73 65 74 20 74 6f 20 70  List is set to p
c4a0: 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73  oint to the firs
c4b0: 74 20 63 6f 6c 75 6d 6e 2d 6f 66 66 73 65 74 20  t column-offset 
c4c0: 6c 69 73 74 0a 2a 2a 20 69 6e 20 74 68 65 20 64  list.** in the d
c4d0: 6f 63 6c 69 73 74 20 65 6e 74 72 79 20 28 69 2e  oclist entry (i.
c4e0: 65 2e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 70  e. immediately p
c4f0: 61 73 74 20 74 68 65 20 64 6f 63 69 64 20 76 61  ast the docid va
c500: 72 69 6e 74 29 2e 0a 2a 2a 20 2a 70 6e 4f 66 66  rint)..** *pnOff
c510: 73 65 74 4c 69 73 74 20 69 73 20 73 65 74 20 74  setList is set t
c520: 6f 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  o the length of 
c530: 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d  the set of colum
c540: 6e 2d 6f 66 66 73 65 74 0a 2a 2a 20 6c 69 73 74  n-offset.** list
c550: 73 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  s, not including
c560: 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61   the nul-termina
c570: 74 6f 72 20 62 79 74 65 2e 20 46 6f 72 20 65 78  tor byte. For ex
c580: 61 6d 70 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63  ample:.*/.static
c590: 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61 64   int fts3SegRead
c5a0: 65 72 4e 65 78 74 44 6f 63 69 64 28 0a 20 20 46  erNextDocid(.  F
c5b0: 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62 2c 0a  ts3Table *pTab,.
c5c0: 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
c5d0: 2a 70 52 65 61 64 65 72 2c 20 20 20 20 20 20 20  *pReader,       
c5e0: 20 20 2f 2a 20 52 65 61 64 65 72 20 74 6f 20 61    /* Reader to a
c5f0: 64 76 61 6e 63 65 20 74 6f 20 6e 65 78 74 20 64  dvance to next d
c600: 6f 63 69 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ocid */.  char *
c610: 2a 70 70 4f 66 66 73 65 74 4c 69 73 74 2c 20 20  *ppOffsetList,  
c620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
c630: 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72  : Pointer to cur
c640: 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 2d 6c 69  rent position-li
c650: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4f  st */.  int *pnO
c660: 66 66 73 65 74 4c 69 73 74 20 20 20 20 20 20 20  ffsetList       
c670: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
c680: 4c 65 6e 67 74 68 20 6f 66 20 2a 70 70 4f 66 66  Length of *ppOff
c690: 73 65 74 4c 69 73 74 20 69 6e 20 62 79 74 65 73  setList in bytes
c6a0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
c6b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
c6c0: 68 61 72 20 2a 70 20 3d 20 70 52 65 61 64 65 72  har *p = pReader
c6d0: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3b 0a 20  ->pOffsetList;. 
c6e0: 20 63 68 61 72 20 63 20 3d 20 30 3b 0a 0a 20 20   char c = 0;..  
c6f0: 61 73 73 65 72 74 28 20 70 20 29 3b 0a 0a 20 20  assert( p );..  
c700: 69 66 28 20 70 54 61 62 2d 3e 62 44 65 73 63 49  if( pTab->bDescI
c710: 64 78 20 26 26 20 66 74 73 33 53 65 67 52 65 61  dx && fts3SegRea
c720: 64 65 72 49 73 50 65 6e 64 69 6e 67 28 70 52 65  derIsPending(pRe
c730: 61 64 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ader) ){.    /* 
c740: 41 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20  A pending-terms 
c750: 73 65 67 2d 72 65 61 64 65 72 20 66 6f 72 20 61  seg-reader for a
c760: 6e 20 46 54 53 34 20 74 61 62 6c 65 20 74 68 61  n FTS4 table tha
c770: 74 20 75 73 65 73 20 6f 72 64 65 72 3d 64 65 73  t uses order=des
c780: 63 2e 0a 20 20 20 20 2a 2a 20 50 65 6e 64 69 6e  c..    ** Pendin
c790: 67 2d 74 65 72 6d 73 20 64 6f 63 6c 69 73 74 73  g-terms doclists
c7a0: 20 61 72 65 20 61 6c 77 61 79 73 20 62 75 69 6c   are always buil
c7b0: 74 20 75 70 20 69 6e 20 61 73 63 65 6e 64 69 6e  t up in ascendin
c7c0: 67 20 6f 72 64 65 72 2c 20 73 6f 0a 20 20 20 20  g order, so.    
c7d0: 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 69 74  ** we have to it
c7e0: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
c7f0: 65 6d 20 62 61 63 6b 77 61 72 64 73 20 68 65 72  em backwards her
c800: 65 2e 20 2a 2f 0a 20 20 20 20 75 38 20 62 45 6f  e. */.    u8 bEo
c810: 66 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  f = 0;.    if( p
c820: 70 4f 66 66 73 65 74 4c 69 73 74 20 29 7b 0a 20  pOffsetList ){. 
c830: 20 20 20 20 20 2a 70 70 4f 66 66 73 65 74 4c 69       *ppOffsetLi
c840: 73 74 20 3d 20 70 52 65 61 64 65 72 2d 3e 70 4f  st = pReader->pO
c850: 66 66 73 65 74 4c 69 73 74 3b 0a 20 20 20 20 20  ffsetList;.     
c860: 20 2a 70 6e 4f 66 66 73 65 74 4c 69 73 74 20 3d   *pnOffsetList =
c870: 20 70 52 65 61 64 65 72 2d 3e 6e 4f 66 66 73 65   pReader->nOffse
c880: 74 4c 69 73 74 20 2d 20 31 3b 0a 20 20 20 20 7d  tList - 1;.    }
c890: 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33  .    sqlite3Fts3
c8a0: 44 6f 63 6c 69 73 74 50 72 65 76 28 30 2c 0a 20  DoclistPrev(0,. 
c8b0: 20 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e         pReader->
c8c0: 61 44 6f 63 6c 69 73 74 2c 20 70 52 65 61 64 65  aDoclist, pReade
c8d0: 72 2d 3e 6e 44 6f 63 6c 69 73 74 2c 20 26 70 2c  r->nDoclist, &p,
c8e0: 20 26 70 52 65 61 64 65 72 2d 3e 69 44 6f 63 69   &pReader->iDoci
c8f0: 64 2c 0a 20 20 20 20 20 20 20 20 26 70 52 65 61  d,.        &pRea
c900: 64 65 72 2d 3e 6e 4f 66 66 73 65 74 4c 69 73 74  der->nOffsetList
c910: 2c 20 26 62 45 6f 66 0a 20 20 20 20 29 3b 0a 20  , &bEof.    );. 
c920: 20 20 20 69 66 28 20 62 45 6f 66 20 29 7b 0a 20     if( bEof ){. 
c930: 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 4f       pReader->pO
c940: 66 66 73 65 74 4c 69 73 74 20 3d 20 30 3b 0a 20  ffsetList = 0;. 
c950: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c960: 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74  pReader->pOffset
c970: 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a  List = p;.    }.
c980: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
c990: 72 20 2a 70 45 6e 64 20 3d 20 26 70 52 65 61 64  r *pEnd = &pRead
c9a0: 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b 70 52 65  er->aDoclist[pRe
c9b0: 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 5d 3b  ader->nDoclist];
c9c0: 0a 0a 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  ..    /* Pointer
c9d0: 20 70 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69   p currently poi
c9e0: 6e 74 73 20 61 74 20 74 68 65 20 66 69 72 73 74  nts at the first
c9f0: 20 62 79 74 65 20 6f 66 20 61 6e 20 6f 66 66 73   byte of an offs
ca00: 65 74 20 6c 69 73 74 2e 20 54 68 65 0a 20 20 20  et list. The.   
ca10: 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c   ** following bl
ca20: 6f 63 6b 20 61 64 76 61 6e 63 65 73 20 69 74 20  ock advances it 
ca30: 74 6f 20 70 6f 69 6e 74 20 6f 6e 65 20 62 79 74  to point one byt
ca40: 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
ca50: 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d  f.    ** the sam
ca60: 65 20 6f 66 66 73 65 74 20 6c 69 73 74 2e 20 2a  e offset list. *
ca70: 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20 29  /.    while( 1 )
ca80: 7b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 54 68  {.  .      /* Th
ca90: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 69 6e 65  e following line
caa0: 20 6f 66 20 63 6f 64 65 20 28 61 6e 64 20 74 68   of code (and th
cab0: 65 20 22 70 2b 2b 22 20 62 65 6c 6f 77 20 74 68  e "p++" below th
cac0: 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70 29 20  e while() loop) 
cad0: 69 73 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 72 6d  is.      ** norm
cae0: 61 6c 6c 79 20 61 6c 6c 20 74 68 61 74 20 69 73  ally all that is
caf0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 6d 6f 76   required to mov
cb00: 65 20 70 6f 69 6e 74 65 72 20 70 20 74 6f 20 74  e pointer p to t
cb10: 68 65 20 64 65 73 69 72 65 64 20 0a 20 20 20 20  he desired .    
cb20: 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 2e 20 54    ** position. T
cb30: 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20  he exception is 
cb40: 69 66 20 74 68 69 73 20 6e 6f 64 65 20 69 73 20  if this node is 
cb50: 62 65 69 6e 67 20 6c 6f 61 64 65 64 20 66 72 6f  being loaded fro
cb60: 6d 20 64 69 73 6b 0a 20 20 20 20 20 20 2a 2a 20  m disk.      ** 
cb70: 69 6e 63 72 65 6d 65 6e 74 61 6c 6c 79 20 61 6e  incrementally an
cb80: 64 20 70 6f 69 6e 74 65 72 20 22 70 22 20 6e 6f  d pointer "p" no
cb90: 77 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  w points to the 
cba0: 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 0a  first byte past.
cbb0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 70        ** the pop
cbc0: 75 6c 61 74 65 64 20 70 61 72 74 20 6f 66 20 70  ulated part of p
cbd0: 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 5d 2e  Reader->aNode[].
cbe0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
cbf0: 77 68 69 6c 65 28 20 2a 70 20 7c 20 63 20 29 20  while( *p | c ) 
cc00: 63 20 3d 20 2a 70 2b 2b 20 26 20 30 78 38 30 3b  c = *p++ & 0x80;
cc10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a  .      assert( *
cc20: 70 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 20  p==0 );.  .     
cc30: 20 69 66 28 20 70 52 65 61 64 65 72 2d 3e 70 42   if( pReader->pB
cc40: 6c 6f 62 3d 3d 30 20 7c 7c 20 70 3c 26 70 52 65  lob==0 || p<&pRe
cc50: 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61  ader->aNode[pRea
cc60: 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 5d 20  der->nPopulate] 
cc70: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 72  ) break;.      r
cc80: 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65  c = fts3SegReade
cc90: 72 49 6e 63 72 52 65 61 64 28 70 52 65 61 64 65  rIncrRead(pReade
cca0: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
ccb0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
ccc0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
ccd0: 20 20 20 70 2b 2b 3b 0a 20 20 0a 20 20 20 20 2f     p++;.  .    /
cce0: 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70  * If required, p
ccf0: 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 75 74 70  opulate the outp
cd00: 75 74 20 76 61 72 69 61 62 6c 65 73 20 77 69 74  ut variables wit
cd10: 68 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  h a pointer to a
cd20: 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 69  nd the.    ** si
cd30: 7a 65 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f  ze of the previo
cd40: 75 73 20 6f 66 66 73 65 74 2d 6c 69 73 74 2e 0a  us offset-list..
cd50: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
cd60: 70 4f 66 66 73 65 74 4c 69 73 74 20 29 7b 0a 20  pOffsetList ){. 
cd70: 20 20 20 20 20 2a 70 70 4f 66 66 73 65 74 4c 69       *ppOffsetLi
cd80: 73 74 20 3d 20 70 52 65 61 64 65 72 2d 3e 70 4f  st = pReader->pO
cd90: 66 66 73 65 74 4c 69 73 74 3b 0a 20 20 20 20 20  ffsetList;.     
cda0: 20 2a 70 6e 4f 66 66 73 65 74 4c 69 73 74 20 3d   *pnOffsetList =
cdb0: 20 28 69 6e 74 29 28 70 20 2d 20 70 52 65 61 64   (int)(p - pRead
cdc0: 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20  er->pOffsetList 
cdd0: 2d 20 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  - 1);.    }..   
cde0: 20 2f 2a 20 4c 69 73 74 20 6d 61 79 20 68 61 76   /* List may hav
cdf0: 65 20 62 65 65 6e 20 65 64 69 74 65 64 20 69 6e  e been edited in
ce00: 20 70 6c 61 63 65 20 62 79 20 66 74 73 33 45 76   place by fts3Ev
ce10: 61 6c 4e 65 61 72 54 72 69 6d 28 29 20 2a 2f 0a  alNearTrim() */.
ce20: 20 20 20 20 77 68 69 6c 65 28 20 70 3c 70 45 6e      while( p<pEn
ce30: 64 20 26 26 20 2a 70 3d 3d 30 20 29 20 70 2b 2b  d && *p==0 ) p++
ce40: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  ;.  .    /* If t
ce50: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
ce60: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
ce70: 64 6f 63 6c 69 73 74 2c 20 73 65 74 20 70 4f 66  doclist, set pOf
ce80: 66 73 65 74 4c 69 73 74 20 74 6f 0a 20 20 20 20  fsetList to.    
ce90: 2a 2a 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69  ** NULL. Otherwi
cea0: 73 65 2c 20 73 65 74 20 46 74 73 33 53 65 67 52  se, set Fts3SegR
ceb0: 65 61 64 65 72 2e 69 44 6f 63 69 64 20 74 6f 20  eader.iDocid to 
cec0: 74 68 65 20 6e 65 78 74 20 64 6f 63 69 64 20 61  the next docid a
ced0: 6e 64 0a 20 20 20 20 2a 2a 20 46 74 73 33 53 65  nd.    ** Fts3Se
cee0: 67 52 65 61 64 65 72 2e 70 4f 66 66 73 65 74 4c  gReader.pOffsetL
cef0: 69 73 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ist to point to 
cf00: 74 68 65 20 6e 65 78 74 20 6f 66 66 73 65 74 20  the next offset 
cf10: 6c 69 73 74 20 62 65 66 6f 72 65 0a 20 20 20 20  list before.    
cf20: 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20  ** returning..  
cf30: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 3e 3d    */.    if( p>=
cf40: 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 70 52  pEnd ){.      pR
cf50: 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69  eader->pOffsetLi
cf60: 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  st = 0;.    }els
cf70: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  e{.      rc = ft
cf80: 73 33 53 65 67 52 65 61 64 65 72 52 65 71 75 69  s3SegReaderRequi
cf90: 72 65 28 70 52 65 61 64 65 72 2c 20 70 2c 20 46  re(pReader, p, F
cfa0: 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 29 3b  TS3_VARINT_MAX);
cfb0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
cfc0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
cfd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
cfe0: 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  4 iDelta;.      
cff0: 20 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73    pReader->pOffs
d000: 65 74 4c 69 73 74 20 3d 20 70 20 2b 20 73 71 6c  etList = p + sql
d010: 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e  ite3Fts3GetVarin
d020: 74 28 70 2c 20 26 69 44 65 6c 74 61 29 3b 0a 20  t(p, &iDelta);. 
d030: 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d         if( pTab-
d040: 3e 62 44 65 73 63 49 64 78 20 29 7b 0a 20 20 20  >bDescIdx ){.   
d050: 20 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e         pReader->
d060: 69 44 6f 63 69 64 20 2d 3d 20 69 44 65 6c 74 61  iDocid -= iDelta
d070: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
d080: 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 61 64  .          pRead
d090: 65 72 2d 3e 69 44 6f 63 69 64 20 2b 3d 20 69 44  er->iDocid += iD
d0a0: 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a  elta;.        }.
d0b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d0c0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
d0d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 69 6e 74 20 73  TE_OK;.}...int s
d0e0: 71 6c 69 74 65 33 46 74 73 33 4d 73 72 4f 76 66  qlite3Fts3MsrOvf
d0f0: 6c 28 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20  l(.  Fts3Cursor 
d100: 2a 70 43 73 72 2c 20 0a 20 20 46 74 73 33 4d 75  *pCsr, .  Fts3Mu
d110: 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70 4d  ltiSegReader *pM
d120: 73 72 2c 0a 20 20 69 6e 74 20 2a 70 6e 4f 76 66  sr,.  int *pnOvf
d130: 6c 0a 29 7b 0a 20 20 46 74 73 33 54 61 62 6c 65  l.){.  Fts3Table
d140: 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65   *p = (Fts3Table
d150: 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74  *)pCsr->base.pVt
d160: 61 62 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 20  ab;.  int nOvfl 
d170: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20  = 0;.  int ii;. 
d180: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
d190: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 70 67 73 7a 20  _OK;.  int pgsz 
d1a0: 3d 20 70 2d 3e 6e 50 67 73 7a 3b 0a 0a 20 20 61  = p->nPgsz;..  a
d1b0: 73 73 65 72 74 28 20 70 2d 3e 62 46 74 73 34 20  ssert( p->bFts4 
d1c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 73  );.  assert( pgs
d1d0: 7a 3e 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69 69  z>0 );..  for(ii
d1e0: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
d1f0: 4b 20 26 26 20 69 69 3c 70 4d 73 72 2d 3e 6e 53  K && ii<pMsr->nS
d200: 65 67 6d 65 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  egment; ii++){. 
d210: 20 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72     Fts3SegReader
d220: 20 2a 70 52 65 61 64 65 72 20 3d 20 70 4d 73 72   *pReader = pMsr
d230: 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69 69 5d 3b  ->apSegment[ii];
d240: 0a 20 20 20 20 69 66 28 20 21 66 74 73 33 53 65  .    if( !fts3Se
d250: 67 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e 67  gReaderIsPending
d260: 28 70 52 65 61 64 65 72 29 20 0a 20 20 20 20 20  (pReader) .     
d270: 26 26 20 21 66 74 73 33 53 65 67 52 65 61 64 65  && !fts3SegReade
d280: 72 49 73 52 6f 6f 74 4f 6e 6c 79 28 70 52 65 61  rIsRootOnly(pRea
d290: 64 65 72 29 20 0a 20 20 20 20 29 7b 0a 20 20 20  der) .    ){.   
d2a0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
d2b0: 20 6a 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a   jj;.      for(j
d2c0: 6a 3d 70 52 65 61 64 65 72 2d 3e 69 53 74 61 72  j=pReader->iStar
d2d0: 74 42 6c 6f 63 6b 3b 20 6a 6a 3c 3d 70 52 65 61  tBlock; jj<=pRea
d2e0: 64 65 72 2d 3e 69 4c 65 61 66 45 6e 64 42 6c 6f  der->iLeafEndBlo
d2f0: 63 6b 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20  ck; jj++){.     
d300: 20 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 0a 20 20     int nBlob;.  
d310: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d320: 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28  e3Fts3ReadBlock(
d330: 70 2c 20 6a 6a 2c 20 30 2c 20 26 6e 42 6c 6f 62  p, jj, 0, &nBlob
d340: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
d350: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d360: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
d370: 20 69 66 28 20 28 6e 42 6c 6f 62 2b 33 35 29 3e   if( (nBlob+35)>
d380: 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  pgsz ){.        
d390: 20 20 6e 4f 76 66 6c 20 2b 3d 20 28 6e 42 6c 6f    nOvfl += (nBlo
d3a0: 62 20 2b 20 33 34 29 2f 70 67 73 7a 3b 0a 20 20  b + 34)/pgsz;.  
d3b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
d3c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 6e 4f      }.  }.  *pnO
d3d0: 76 66 6c 20 3d 20 6e 4f 76 66 6c 3b 0a 20 20 72  vfl = nOvfl;.  r
d3e0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
d3f0: 2a 2a 20 46 72 65 65 20 61 6c 6c 20 61 6c 6c 6f  ** Free all allo
d400: 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74  cations associat
d410: 65 64 20 77 69 74 68 20 74 68 65 20 69 74 65 72  ed with the iter
d420: 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
d430: 68 65 20 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72  he .** second ar
d440: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  gument..*/.void 
d450: 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
d460: 61 64 65 72 46 72 65 65 28 46 74 73 33 53 65 67  aderFree(Fts3Seg
d470: 52 65 61 64 65 72 20 2a 70 52 65 61 64 65 72 29  Reader *pReader)
d480: 7b 0a 20 20 69 66 28 20 70 52 65 61 64 65 72 20  {.  if( pReader 
d490: 29 7b 0a 20 20 20 20 69 66 28 20 21 66 74 73 33  ){.    if( !fts3
d4a0: 53 65 67 52 65 61 64 65 72 49 73 50 65 6e 64 69  SegReaderIsPendi
d4b0: 6e 67 28 70 52 65 61 64 65 72 29 20 29 7b 0a 20  ng(pReader) ){. 
d4c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
d4d0: 65 28 70 52 65 61 64 65 72 2d 3e 7a 54 65 72 6d  e(pReader->zTerm
d4e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
d4f0: 20 21 66 74 73 33 53 65 67 52 65 61 64 65 72 49   !fts3SegReaderI
d500: 73 52 6f 6f 74 4f 6e 6c 79 28 70 52 65 61 64 65  sRootOnly(pReade
d510: 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  r) ){.      sqli
d520: 74 65 33 5f 66 72 65 65 28 70 52 65 61 64 65 72  te3_free(pReader
d530: 2d 3e 61 4e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a  ->aNode);.    }.
d540: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62      sqlite3_blob
d550: 5f 63 6c 6f 73 65 28 70 52 65 61 64 65 72 2d 3e  _close(pReader->
d560: 70 42 6c 6f 62 29 3b 0a 20 20 7d 0a 20 20 73 71  pBlob);.  }.  sq
d570: 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65 61 64  lite3_free(pRead
d580: 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  er);.}../*.** Al
d590: 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 53 65 67  locate a new Seg
d5a0: 52 65 61 64 65 72 20 6f 62 6a 65 63 74 2e 0a 2a  Reader object..*
d5b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
d5c0: 33 53 65 67 52 65 61 64 65 72 4e 65 77 28 0a 20  3SegReaderNew(. 
d5d0: 20 69 6e 74 20 69 41 67 65 2c 20 20 20 20 20 20   int iAge,      
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5f0: 20 2f 2a 20 53 65 67 6d 65 6e 74 20 22 61 67 65   /* Segment "age
d600: 22 2e 20 2a 2f 0a 20 20 69 6e 74 20 62 4c 6f 6f  ". */.  int bLoo
d610: 6b 75 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  kup,            
d620: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
d630: 66 6f 72 20 61 20 6c 6f 6f 6b 75 70 20 6f 6e 6c  for a lookup onl
d640: 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  y */.  sqlite3_i
d650: 6e 74 36 34 20 69 53 74 61 72 74 4c 65 61 66 2c  nt64 iStartLeaf,
d660: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
d670: 6c 65 61 66 20 74 6f 20 74 72 61 76 65 72 73 65  leaf to traverse
d680: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
d690: 74 36 34 20 69 45 6e 64 4c 65 61 66 2c 20 20 20  t64 iEndLeaf,   
d6a0: 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6c        /* Final l
d6b0: 65 61 66 20 74 6f 20 74 72 61 76 65 72 73 65 20  eaf to traverse 
d6c0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
d6d0: 36 34 20 69 45 6e 64 42 6c 6f 63 6b 2c 20 20 20  64 iEndBlock,   
d6e0: 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 62 6c       /* Final bl
d6f0: 6f 63 6b 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a  ock of segment *
d700: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
d710: 7a 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20  zRoot,          
d720: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
d730: 6e 74 61 69 6e 69 6e 67 20 72 6f 6f 74 20 6e 6f  ntaining root no
d740: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f  de */.  int nRoo
d750: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
d760: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
d770: 6f 66 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  of buffer contai
d780: 6e 69 6e 67 20 72 6f 6f 74 20 6e 6f 64 65 20 2a  ning root node *
d790: 2f 0a 20 20 46 74 73 33 53 65 67 52 65 61 64 65  /.  Fts3SegReade
d7a0: 72 20 2a 2a 70 70 52 65 61 64 65 72 20 20 20 20  r **ppReader    
d7b0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 6c 6c 6f      /* OUT: Allo
d7c0: 63 61 74 65 64 20 46 74 73 33 53 65 67 52 65 61  cated Fts3SegRea
d7d0: 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33  der */.){.  Fts3
d7e0: 53 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64  SegReader *pRead
d7f0: 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  er;         /* N
d800: 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 53  ewly allocated S
d810: 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74 20  egReader object 
d820: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  */.  int nExtra 
d830: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
d840: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f       /* Bytes to
d850: 20 61 6c 6c 6f 63 61 74 65 20 73 65 67 6d 65 6e   allocate segmen
d860: 74 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 0a  t root node */..
d870: 20 20 61 73 73 65 72 74 28 20 7a 52 6f 6f 74 21    assert( zRoot!
d880: 3d 30 20 7c 7c 20 6e 52 6f 6f 74 3d 3d 30 20 29  =0 || nRoot==0 )
d890: 3b 0a 23 69 66 64 65 66 20 43 4f 52 52 55 50 54  ;.#ifdef CORRUPT
d8a0: 5f 44 42 0a 20 20 61 73 73 65 72 74 28 20 7a 52  _DB.  assert( zR
d8b0: 6f 6f 74 21 3d 30 20 7c 7c 20 43 4f 52 52 55 50  oot!=0 || CORRUP
d8c0: 54 5f 44 42 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  T_DB );.#endif..
d8d0: 20 20 69 66 28 20 69 53 74 61 72 74 4c 65 61 66    if( iStartLeaf
d8e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69  ==0 ){.    if( i
d8f0: 45 6e 64 4c 65 61 66 21 3d 30 20 29 20 72 65 74  EndLeaf!=0 ) ret
d900: 75 72 6e 20 46 54 53 5f 43 4f 52 52 55 50 54 5f  urn FTS_CORRUPT_
d910: 56 54 41 42 3b 0a 20 20 20 20 6e 45 78 74 72 61  VTAB;.    nExtra
d920: 20 3d 20 6e 52 6f 6f 74 20 2b 20 46 54 53 33 5f   = nRoot + FTS3_
d930: 4e 4f 44 45 5f 50 41 44 44 49 4e 47 3b 0a 20 20  NODE_PADDING;.  
d940: 7d 0a 0a 20 20 70 52 65 61 64 65 72 20 3d 20 28  }..  pReader = (
d950: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 29  Fts3SegReader *)
d960: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
d970: 69 7a 65 6f 66 28 46 74 73 33 53 65 67 52 65 61  izeof(Fts3SegRea
d980: 64 65 72 29 20 2b 20 6e 45 78 74 72 61 29 3b 0a  der) + nExtra);.
d990: 20 20 69 66 28 20 21 70 52 65 61 64 65 72 20 29    if( !pReader )
d9a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
d9b0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
d9c0: 20 6d 65 6d 73 65 74 28 70 52 65 61 64 65 72 2c   memset(pReader,
d9d0: 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 33 53   0, sizeof(Fts3S
d9e0: 65 67 52 65 61 64 65 72 29 29 3b 0a 20 20 70 52  egReader));.  pR
d9f0: 65 61 64 65 72 2d 3e 69 49 64 78 20 3d 20 69 41  eader->iIdx = iA
da00: 67 65 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 62  ge;.  pReader->b
da10: 4c 6f 6f 6b 75 70 20 3d 20 62 4c 6f 6f 6b 75 70  Lookup = bLookup
da20: 21 3d 30 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e  !=0;.  pReader->
da30: 69 53 74 61 72 74 42 6c 6f 63 6b 20 3d 20 69 53  iStartBlock = iS
da40: 74 61 72 74 4c 65 61 66 3b 0a 20 20 70 52 65 61  tartLeaf;.  pRea
da50: 64 65 72 2d 3e 69 4c 65 61 66 45 6e 64 42 6c 6f  der->iLeafEndBlo
da60: 63 6b 20 3d 20 69 45 6e 64 4c 65 61 66 3b 0a 20  ck = iEndLeaf;. 
da70: 20 70 52 65 61 64 65 72 2d 3e 69 45 6e 64 42 6c   pReader->iEndBl
da80: 6f 63 6b 20 3d 20 69 45 6e 64 42 6c 6f 63 6b 3b  ock = iEndBlock;
da90: 0a 0a 20 20 69 66 28 20 6e 45 78 74 72 61 20 29  ..  if( nExtra )
daa0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74  {.    /* The ent
dab0: 69 72 65 20 73 65 67 6d 65 6e 74 20 69 73 20 73  ire segment is s
dac0: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 72 6f 6f  tored in the roo
dad0: 74 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 70  t node. */.    p
dae0: 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20 3d 20  Reader->aNode = 
daf0: 28 63 68 61 72 20 2a 29 26 70 52 65 61 64 65 72  (char *)&pReader
db00: 5b 31 5d 3b 0a 20 20 20 20 70 52 65 61 64 65 72  [1];.    pReader
db10: 2d 3e 72 6f 6f 74 4f 6e 6c 79 20 3d 20 31 3b 0a  ->rootOnly = 1;.
db20: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 4e 6f      pReader->nNo
db30: 64 65 20 3d 20 6e 52 6f 6f 74 3b 0a 20 20 20 20  de = nRoot;.    
db40: 69 66 28 20 6e 52 6f 6f 74 20 29 20 6d 65 6d 63  if( nRoot ) memc
db50: 70 79 28 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64  py(pReader->aNod
db60: 65 2c 20 7a 52 6f 6f 74 2c 20 6e 52 6f 6f 74 29  e, zRoot, nRoot)
db70: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 52  ;.    memset(&pR
db80: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 6e 52 6f  eader->aNode[nRo
db90: 6f 74 5d 2c 20 30 2c 20 46 54 53 33 5f 4e 4f 44  ot], 0, FTS3_NOD
dba0: 45 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 7d 65  E_PADDING);.  }e
dbb0: 6c 73 65 7b 0a 20 20 20 20 70 52 65 61 64 65 72  lse{.    pReader
dbc0: 2d 3e 69 43 75 72 72 65 6e 74 42 6c 6f 63 6b 20  ->iCurrentBlock 
dbd0: 3d 20 69 53 74 61 72 74 4c 65 61 66 2d 31 3b 0a  = iStartLeaf-1;.
dbe0: 20 20 7d 0a 20 20 2a 70 70 52 65 61 64 65 72 20    }.  *ppReader 
dbf0: 3d 20 70 52 65 61 64 65 72 3b 0a 20 20 72 65 74  = pReader;.  ret
dc00: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
dc10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
dc20: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  a comparison fun
dc30: 63 74 69 6f 6e 20 75 73 65 64 20 61 73 20 61 20  ction used as a 
dc40: 71 73 6f 72 74 28 29 20 63 61 6c 6c 62 61 63 6b  qsort() callback
dc50: 20 77 68 65 6e 20 73 6f 72 74 69 6e 67 0a 2a 2a   when sorting.**
dc60: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 65 6e   an array of pen
dc70: 64 69 6e 67 20 74 65 72 6d 73 20 62 79 20 74 65  ding terms by te
dc80: 72 6d 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20  rm. This occurs 
dc90: 61 73 20 70 61 72 74 20 6f 66 20 66 6c 75 73 68  as part of flush
dca0: 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ing.** the conte
dcb0: 6e 74 73 20 6f 66 20 74 68 65 20 70 65 6e 64 69  nts of the pendi
dcc0: 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20 74 61  ng-terms hash ta
dcd0: 62 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ble to the datab
dce0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
dcf0: 6e 74 20 53 51 4c 49 54 45 5f 43 44 45 43 4c 20  nt SQLITE_CDECL 
dd00: 66 74 73 33 43 6f 6d 70 61 72 65 45 6c 65 6d 42  fts3CompareElemB
dd10: 79 54 65 72 6d 28 0a 20 20 63 6f 6e 73 74 20 76  yTerm(.  const v
dd20: 6f 69 64 20 2a 6c 68 73 2c 0a 20 20 63 6f 6e 73  oid *lhs,.  cons
dd30: 74 20 76 6f 69 64 20 2a 72 68 73 0a 29 7b 0a 20  t void *rhs.){. 
dd40: 20 63 68 61 72 20 2a 7a 31 20 3d 20 66 74 73 33   char *z1 = fts3
dd50: 48 61 73 68 4b 65 79 28 2a 28 46 74 73 33 48 61  HashKey(*(Fts3Ha
dd60: 73 68 45 6c 65 6d 20 2a 2a 29 6c 68 73 29 3b 0a  shElem **)lhs);.
dd70: 20 20 63 68 61 72 20 2a 7a 32 20 3d 20 66 74 73    char *z2 = fts
dd80: 33 48 61 73 68 4b 65 79 28 2a 28 46 74 73 33 48  3HashKey(*(Fts3H
dd90: 61 73 68 45 6c 65 6d 20 2a 2a 29 72 68 73 29 3b  ashElem **)rhs);
dda0: 0a 20 20 69 6e 74 20 6e 31 20 3d 20 66 74 73 33  .  int n1 = fts3
ddb0: 48 61 73 68 4b 65 79 73 69 7a 65 28 2a 28 46 74  HashKeysize(*(Ft
ddc0: 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29 6c 68  s3HashElem **)lh
ddd0: 73 29 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20 66  s);.  int n2 = f
dde0: 74 73 33 48 61 73 68 4b 65 79 73 69 7a 65 28 2a  ts3HashKeysize(*
ddf0: 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a  (Fts3HashElem **
de00: 29 72 68 73 29 3b 0a 0a 20 20 69 6e 74 20 6e 20  )rhs);..  int n 
de10: 3d 20 28 6e 31 3c 6e 32 20 3f 20 6e 31 20 3a 20  = (n1<n2 ? n1 : 
de20: 6e 32 29 3b 0a 20 20 69 6e 74 20 63 20 3d 20 6d  n2);.  int c = m
de30: 65 6d 63 6d 70 28 7a 31 2c 20 7a 32 2c 20 6e 29  emcmp(z1, z2, n)
de40: 3b 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a  ;.  if( c==0 ){.
de50: 20 20 20 20 63 20 3d 20 6e 31 20 2d 20 6e 32 3b      c = n1 - n2;
de60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 3b  .  }.  return c;
de70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
de80: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
de90: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 20 46  to allocate an F
dea0: 74 73 33 53 65 67 52 65 61 64 65 72 20 74 68 61  ts3SegReader tha
deb0: 74 20 69 74 65 72 61 74 65 73 20 74 68 72 6f 75  t iterates throu
dec0: 67 68 0a 2a 2a 20 61 20 73 75 62 73 65 74 20 6f  gh.** a subset o
ded0: 66 20 74 68 65 20 74 65 72 6d 73 20 73 74 6f 72  f the terms stor
dee0: 65 64 20 69 6e 20 74 68 65 20 46 74 73 33 54 61  ed in the Fts3Ta
def0: 62 6c 65 2e 70 65 6e 64 69 6e 67 54 65 72 6d 73  ble.pendingTerms
df00: 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66   array..**.** If
df10: 20 74 68 65 20 69 73 50 72 65 66 69 78 49 74 65   the isPrefixIte
df20: 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 7a  r parameter is z
df30: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ero, then the re
df40: 74 75 72 6e 65 64 20 53 65 67 52 65 61 64 65 72  turned SegReader
df50: 20 69 74 65 72 61 74 65 73 0a 2a 2a 20 74 68 72   iterates.** thr
df60: 6f 75 67 68 20 65 61 63 68 20 74 65 72 6d 20 69  ough each term i
df70: 6e 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65  n the pending-te
df80: 72 6d 73 20 74 61 62 6c 65 2e 20 4f 72 2c 20 69  rms table. Or, i
df90: 66 20 69 73 50 72 65 66 69 78 49 74 65 72 20 69  f isPrefixIter i
dfa0: 73 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69  s.** non-zero, i
dfb0: 74 20 69 74 65 72 61 74 65 73 20 74 68 72 6f 75  t iterates throu
dfc0: 67 68 20 65 61 63 68 20 74 65 72 6d 20 61 6e 64  gh each term and
dfd0: 20 69 74 73 20 70 72 65 66 69 78 65 73 2e 20 46   its prefixes. F
dfe0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a  or example, if.*
dff0: 2a 20 74 68 65 20 70 65 6e 64 69 6e 67 20 74 65  * the pending te
e000: 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65 20 63  rms hash table c
e010: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 72 6d  ontains the term
e020: 73 20 22 73 71 6c 69 74 65 22 2c 20 22 6d 79 73  s "sqlite", "mys
e030: 71 6c 22 20 61 6e 64 0a 2a 2a 20 22 66 69 72 65  ql" and.** "fire
e040: 62 69 72 64 22 2c 20 74 68 65 6e 20 74 68 65 20  bird", then the 
e050: 69 74 65 72 61 74 6f 72 20 76 69 73 69 74 73 20  iterator visits 
e060: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 27 74  the following 't
e070: 65 72 6d 73 27 20 28 69 6e 20 74 68 65 20 6f 72  erms' (in the or
e080: 64 65 72 0a 2a 2a 20 73 68 6f 77 6e 29 3a 0a 2a  der.** shown):.*
e090: 2a 0a 2a 2a 20 20 20 66 20 66 69 20 66 69 72 20  *.**   f fi fir 
e0a0: 66 69 72 65 20 66 69 72 65 62 20 66 69 72 65 62  fire fireb fireb
e0b0: 69 20 66 69 72 65 62 69 72 20 66 69 72 65 62 69  i firebir firebi
e0c0: 72 64 0a 2a 2a 20 20 20 6d 20 6d 79 20 6d 79 73  rd.**   m my mys
e0d0: 20 6d 79 73 71 20 6d 79 73 71 6c 0a 2a 2a 20 20   mysq mysql.**  
e0e0: 20 73 20 73 71 20 73 71 6c 20 73 71 6c 69 20 73   s sq sql sqli s
e0f0: 71 6c 69 74 20 73 71 6c 69 74 65 0a 2a 2a 0a 2a  qlit sqlite.**.*
e100: 2a 20 57 68 65 72 65 61 73 20 69 66 20 69 73 50  * Whereas if isP
e110: 72 65 66 69 78 49 74 65 72 20 69 73 20 7a 65 72  refixIter is zer
e120: 6f 2c 20 74 68 65 20 74 65 72 6d 73 20 76 69 73  o, the terms vis
e130: 69 74 65 64 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20  ited are:.**.** 
e140: 20 20 66 69 72 65 62 69 72 64 20 6d 79 73 71 6c    firebird mysql
e150: 20 73 71 6c 69 74 65 0a 2a 2f 0a 69 6e 74 20 73   sqlite.*/.int s
e160: 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61  qlite3Fts3SegRea
e170: 64 65 72 50 65 6e 64 69 6e 67 28 0a 20 20 46 74  derPending(.  Ft
e180: 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
e190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e1a0: 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68   Virtual table h
e1b0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  andle */.  int i
e1c0: 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20  Index,          
e1d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
e1e0: 64 65 78 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65  dex for p->aInde
e1f0: 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  x */.  const cha
e200: 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20  r *zTerm,       
e210: 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74         /* Term t
e220: 6f 20 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a  o search for */.
e230: 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20    int nTerm,    
e240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e250: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
e260: 66 65 72 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 69  fer zTerm */.  i
e270: 6e 74 20 62 50 72 65 66 69 78 2c 20 20 20 20 20  nt bPrefix,     
e280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e290: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 70 72 65  * True for a pre
e2a0: 66 69 78 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a  fix iterator */.
e2b0: 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
e2c0: 2a 2a 70 70 52 65 61 64 65 72 20 20 20 20 20 20  **ppReader      
e2d0: 20 20 2f 2a 20 4f 55 54 3a 20 53 65 67 52 65 61    /* OUT: SegRea
e2e0: 64 65 72 20 66 6f 72 20 70 65 6e 64 69 6e 67 2d  der for pending-
e2f0: 74 65 72 6d 73 20 2a 2f 0a 29 7b 0a 20 20 46 74  terms */.){.  Ft
e300: 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 65  s3SegReader *pRe
e310: 61 64 65 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a  ader = 0;     /*
e320: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 6f   Fts3SegReader o
e330: 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72 6e 20  bject to return 
e340: 2a 2f 0a 20 20 46 74 73 33 48 61 73 68 45 6c 65  */.  Fts3HashEle
e350: 6d 20 2a 70 45 3b 20 20 20 20 20 20 20 20 20 20  m *pE;          
e360: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
e370: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 46   variable */.  F
e380: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 61 45  ts3HashElem **aE
e390: 6c 65 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  lem = 0;       /
e3a0: 2a 20 41 72 72 61 79 20 6f 66 20 74 65 72 6d 20  * Array of term 
e3b0: 68 61 73 68 20 65 6e 74 72 69 65 73 20 74 6f 20  hash entries to 
e3c0: 73 63 61 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  scan */.  int nE
e3d0: 6c 65 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20  lem = 0;        
e3e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
e3f0: 65 20 6f 66 20 61 72 72 61 79 20 61 74 20 61 45  e of array at aE
e400: 6c 65 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  lem */.  int rc 
e410: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
e420: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
e430: 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 46 74 73  rn Code */.  Fts
e440: 33 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20  3Hash *pHash;.. 
e450: 20 70 48 61 73 68 20 3d 20 26 70 2d 3e 61 49 6e   pHash = &p->aIn
e460: 64 65 78 5b 69 49 6e 64 65 78 5d 2e 68 50 65 6e  dex[iIndex].hPen
e470: 64 69 6e 67 3b 0a 20 20 69 66 28 20 62 50 72 65  ding;.  if( bPre
e480: 66 69 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  fix ){.    int n
e490: 41 6c 6c 6f 63 20 3d 20 30 3b 20 20 20 20 20 20  Alloc = 0;      
e4a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
e4b0: 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 61 72   of allocated ar
e4c0: 72 61 79 20 61 74 20 61 45 6c 65 6d 20 2a 2f 0a  ray at aElem */.
e4d0: 0a 20 20 20 20 66 6f 72 28 70 45 3d 66 74 73 33  .    for(pE=fts3
e4e0: 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29  HashFirst(pHash)
e4f0: 3b 20 70 45 3b 20 70 45 3d 66 74 73 33 48 61 73  ; pE; pE=fts3Has
e500: 68 4e 65 78 74 28 70 45 29 29 7b 0a 20 20 20 20  hNext(pE)){.    
e510: 20 20 63 68 61 72 20 2a 7a 4b 65 79 20 3d 20 28    char *zKey = (
e520: 63 68 61 72 20 2a 29 66 74 73 33 48 61 73 68 4b  char *)fts3HashK
e530: 65 79 28 70 45 29 3b 0a 20 20 20 20 20 20 69 6e  ey(pE);.      in
e540: 74 20 6e 4b 65 79 20 3d 20 66 74 73 33 48 61 73  t nKey = fts3Has
e550: 68 4b 65 79 73 69 7a 65 28 70 45 29 3b 0a 20 20  hKeysize(pE);.  
e560: 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d 30      if( nTerm==0
e570: 20 7c 7c 20 28 6e 4b 65 79 3e 3d 6e 54 65 72 6d   || (nKey>=nTerm
e580: 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 4b   && 0==memcmp(zK
e590: 65 79 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  ey, zTerm, nTerm
e5a0: 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  )) ){.        if
e5b0: 28 20 6e 45 6c 65 6d 3d 3d 6e 41 6c 6c 6f 63 20  ( nElem==nAlloc 
e5c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 46 74 73  ){.          Fts
e5d0: 33 48 61 73 68 45 6c 65 6d 20 2a 2a 61 45 6c 65  3HashElem **aEle
e5e0: 6d 32 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 41  m2;.          nA
e5f0: 6c 6c 6f 63 20 2b 3d 20 31 36 3b 0a 20 20 20 20  lloc += 16;.    
e600: 20 20 20 20 20 20 61 45 6c 65 6d 32 20 3d 20 28        aElem2 = (
e610: 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29  Fts3HashElem **)
e620: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
e630: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
e640: 45 6c 65 6d 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a  Elem, nAlloc*siz
e650: 65 6f 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d  eof(Fts3HashElem
e660: 20 2a 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b   *).          );
e670: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
e680: 61 45 6c 65 6d 32 20 29 7b 0a 20 20 20 20 20 20  aElem2 ){.      
e690: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
e6a0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
e6b0: 20 20 20 20 20 6e 45 6c 65 6d 20 3d 20 30 3b 0a       nElem = 0;.
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
e6d0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
e6e0: 20 20 20 20 20 20 20 20 20 61 45 6c 65 6d 20 3d           aElem =
e6f0: 20 61 45 6c 65 6d 32 3b 0a 20 20 20 20 20 20 20   aElem2;.       
e700: 20 7d 0a 0a 20 20 20 20 20 20 20 20 61 45 6c 65   }..        aEle
e710: 6d 5b 6e 45 6c 65 6d 2b 2b 5d 20 3d 20 70 45 3b  m[nElem++] = pE;
e720: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
e730: 20 20 20 20 2f 2a 20 49 66 20 6d 6f 72 65 20 74      /* If more t
e740: 68 61 6e 20 6f 6e 65 20 74 65 72 6d 20 6d 61 74  han one term mat
e750: 63 68 65 73 20 74 68 65 20 70 72 65 66 69 78 2c  ches the prefix,
e760: 20 73 6f 72 74 20 74 68 65 20 46 74 73 33 48 61   sort the Fts3Ha
e770: 73 68 45 6c 65 6d 0a 20 20 20 20 2a 2a 20 6f 62  shElem.    ** ob
e780: 6a 65 63 74 73 20 69 6e 20 74 65 72 6d 20 6f 72  jects in term or
e790: 64 65 72 20 75 73 69 6e 67 20 71 73 6f 72 74 28  der using qsort(
e7a0: 29 2e 20 54 68 69 73 20 75 73 65 73 20 74 68 65  ). This uses the
e7b0: 20 73 61 6d 65 20 63 6f 6d 70 61 72 69 73 6f 6e   same comparison
e7c0: 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b  .    ** callback
e7d0: 20 61 73 20 69 73 20 75 73 65 64 20 77 68 65 6e   as is used when
e7e0: 20 66 6c 75 73 68 69 6e 67 20 74 65 72 6d 73 20   flushing terms 
e7f0: 74 6f 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a  to disk..    */.
e800: 20 20 20 20 69 66 28 20 6e 45 6c 65 6d 3e 31 20      if( nElem>1 
e810: 29 7b 0a 20 20 20 20 20 20 71 73 6f 72 74 28 61  ){.      qsort(a
e820: 45 6c 65 6d 2c 20 6e 45 6c 65 6d 2c 20 73 69 7a  Elem, nElem, siz
e830: 65 6f 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d  eof(Fts3HashElem
e840: 20 2a 29 2c 20 66 74 73 33 43 6f 6d 70 61 72 65   *), fts3Compare
e850: 45 6c 65 6d 42 79 54 65 72 6d 29 3b 0a 20 20 20  ElemByTerm);.   
e860: 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   }..  }else{.   
e870: 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20 69 73   /* The query is
e880: 20 61 20 73 69 6d 70 6c 65 20 74 65 72 6d 20 6c   a simple term l
e890: 6f 6f 6b 75 70 20 74 68 61 74 20 6d 61 74 63 68  ookup that match
e8a0: 65 73 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 74  es at most one t
e8b0: 65 72 6d 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  erm in.    ** th
e8c0: 65 20 69 6e 64 65 78 2e 20 41 6c 6c 20 74 68 61  e index. All tha
e8d0: 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69 73  t is required is
e8e0: 20 61 20 73 74 72 61 69 67 68 74 20 68 61 73 68   a straight hash
e8f0: 2d 6c 6f 6f 6b 75 70 2e 20 0a 20 20 20 20 2a 2a  -lookup. .    **
e900: 0a 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20  .    ** Because 
e910: 74 68 65 20 73 74 61 63 6b 20 61 64 64 72 65 73  the stack addres
e920: 73 20 6f 66 20 70 45 20 6d 61 79 20 62 65 20 61  s of pE may be a
e930: 63 63 65 73 73 65 64 20 76 69 61 20 74 68 65 20  ccessed via the 
e940: 61 45 6c 65 6d 20 70 6f 69 6e 74 65 72 0a 20 20  aElem pointer.  
e950: 20 20 2a 2a 20 62 65 6c 6f 77 2c 20 74 68 65 20    ** below, the 
e960: 22 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 70  "Fts3HashElem *p
e970: 45 22 20 6d 75 73 74 20 62 65 20 64 65 63 6c 61  E" must be decla
e980: 72 65 64 20 73 6f 20 74 68 61 74 20 69 74 20 69  red so that it i
e990: 73 20 76 61 6c 69 64 0a 20 20 20 20 2a 2a 20 77  s valid.    ** w
e9a0: 69 74 68 69 6e 20 74 68 69 73 20 65 6e 74 69 72  ithin this entir
e9b0: 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6e 6f 74 20  e function, not 
e9c0: 6a 75 73 74 20 74 68 69 73 20 22 65 6c 73 65 7b  just this "else{
e9d0: 2e 2e 2e 7d 22 20 62 6c 6f 63 6b 2e 0a 20 20 20  ...}" block..   
e9e0: 20 2a 2f 0a 20 20 20 20 70 45 20 3d 20 66 74 73   */.    pE = fts
e9f0: 33 48 61 73 68 46 69 6e 64 45 6c 65 6d 28 70 48  3HashFindElem(pH
ea00: 61 73 68 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  ash, zTerm, nTer
ea10: 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 45 20 29  m);.    if( pE )
ea20: 7b 0a 20 20 20 20 20 20 61 45 6c 65 6d 20 3d 20  {.      aElem = 
ea30: 26 70 45 3b 0a 20 20 20 20 20 20 6e 45 6c 65 6d  &pE;.      nElem
ea40: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
ea50: 0a 20 20 69 66 28 20 6e 45 6c 65 6d 3e 30 20 29  .  if( nElem>0 )
ea60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
ea70: 74 36 34 20 6e 42 79 74 65 3b 0a 20 20 20 20 6e  t64 nByte;.    n
ea80: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74  Byte = sizeof(Ft
ea90: 73 33 53 65 67 52 65 61 64 65 72 29 20 2b 20 28  s3SegReader) + (
eaa0: 6e 45 6c 65 6d 2b 31 29 2a 73 69 7a 65 6f 66 28  nElem+1)*sizeof(
eab0: 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 29 3b  Fts3HashElem *);
eac0: 0a 20 20 20 20 70 52 65 61 64 65 72 20 3d 20 28  .    pReader = (
ead0: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 29  Fts3SegReader *)
eae0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
eaf0: 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28  (nByte);.    if(
eb00: 20 21 70 52 65 61 64 65 72 20 29 7b 0a 20 20 20   !pReader ){.   
eb10: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
eb20: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
eb30: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 52  .      memset(pR
eb40: 65 61 64 65 72 2c 20 30 2c 20 6e 42 79 74 65 29  eader, 0, nByte)
eb50: 3b 0a 20 20 20 20 20 20 70 52 65 61 64 65 72 2d  ;.      pReader-
eb60: 3e 69 49 64 78 20 3d 20 30 78 37 46 46 46 46 46  >iIdx = 0x7FFFFF
eb70: 46 46 3b 0a 20 20 20 20 20 20 70 52 65 61 64 65  FF;.      pReade
eb80: 72 2d 3e 70 70 4e 65 78 74 45 6c 65 6d 20 3d 20  r->ppNextElem = 
eb90: 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a  (Fts3HashElem **
eba0: 29 26 70 52 65 61 64 65 72 5b 31 5d 3b 0a 20 20  )&pReader[1];.  
ebb0: 20 20 20 20 6d 65 6d 63 70 79 28 70 52 65 61 64      memcpy(pRead
ebc0: 65 72 2d 3e 70 70 4e 65 78 74 45 6c 65 6d 2c 20  er->ppNextElem, 
ebd0: 61 45 6c 65 6d 2c 20 6e 45 6c 65 6d 2a 73 69 7a  aElem, nElem*siz
ebe0: 65 6f 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d  eof(Fts3HashElem
ebf0: 20 2a 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   *));.    }.  }.
ec00: 0a 20 20 69 66 28 20 62 50 72 65 66 69 78 20 29  .  if( bPrefix )
ec10: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
ec20: 65 65 28 61 45 6c 65 6d 29 3b 0a 20 20 7d 0a 20  ee(aElem);.  }. 
ec30: 20 2a 70 70 52 65 61 64 65 72 20 3d 20 70 52 65   *ppReader = pRe
ec40: 61 64 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 72  ader;.  return r
ec50: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  c;.}../*.** Comp
ec60: 61 72 65 20 74 68 65 20 65 6e 74 72 69 65 73 20  are the entries 
ec70: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 77  pointed to by tw
ec80: 6f 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20  o Fts3SegReader 
ec90: 73 74 72 75 63 74 75 72 65 73 2e 20 0a 2a 2a 20  structures. .** 
eca0: 43 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 73  Comparison is as
ecb0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
ecc0: 20 20 31 29 20 45 4f 46 20 69 73 20 67 72 65 61    1) EOF is grea
ecd0: 74 65 72 20 74 68 61 6e 20 6e 6f 74 20 45 4f 46  ter than not EOF
ece0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 54 68 65  ..**.**   2) The
ecf0: 20 63 75 72 72 65 6e 74 20 74 65 72 6d 73 20 28   current terms (
ed00: 69 66 20 61 6e 79 29 20 61 72 65 20 63 6f 6d 70  if any) are comp
ed10: 61 72 65 64 20 75 73 69 6e 67 20 6d 65 6d 63 6d  ared using memcm
ed20: 70 28 29 2e 20 49 66 20 6f 6e 65 0a 2a 2a 20 20  p(). If one.**  
ed30: 20 20 20 20 74 65 72 6d 20 69 73 20 61 20 70 72      term is a pr
ed40: 65 66 69 78 20 6f 66 20 61 6e 6f 74 68 65 72 2c  efix of another,
ed50: 20 74 68 65 20 6c 6f 6e 67 65 72 20 74 65 72 6d   the longer term
ed60: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74   is considered t
ed70: 68 65 0a 2a 2a 20 20 20 20 20 20 6c 61 72 67 65  he.**      large
ed80: 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 29 20 42 79  r..**.**   3) By
ed90: 20 73 65 67 6d 65 6e 74 20 61 67 65 2e 20 41 6e   segment age. An
eda0: 20 6f 6c 64 65 72 20 73 65 67 6d 65 6e 74 20 69   older segment i
edb0: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 6c 61 72  s considered lar
edc0: 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ger..*/.static i
edd0: 6e 74 20 66 74 73 33 53 65 67 52 65 61 64 65 72  nt fts3SegReader
ede0: 43 6d 70 28 46 74 73 33 53 65 67 52 65 61 64 65  Cmp(Fts3SegReade
edf0: 72 20 2a 70 4c 68 73 2c 20 46 74 73 33 53 65 67  r *pLhs, Fts3Seg
ee00: 52 65 61 64 65 72 20 2a 70 52 68 73 29 7b 0a 20  Reader *pRhs){. 
ee10: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
ee20: 4c 68 73 2d 3e 61 4e 6f 64 65 20 26 26 20 70 52  Lhs->aNode && pR
ee30: 68 73 2d 3e 61 4e 6f 64 65 20 29 7b 0a 20 20 20  hs->aNode ){.   
ee40: 20 69 6e 74 20 72 63 32 20 3d 20 70 4c 68 73 2d   int rc2 = pLhs-
ee50: 3e 6e 54 65 72 6d 20 2d 20 70 52 68 73 2d 3e 6e  >nTerm - pRhs->n
ee60: 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 72 63  Term;.    if( rc
ee70: 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  2<0 ){.      rc 
ee80: 3d 20 6d 65 6d 63 6d 70 28 70 4c 68 73 2d 3e 7a  = memcmp(pLhs->z
ee90: 54 65 72 6d 2c 20 70 52 68 73 2d 3e 7a 54 65 72  Term, pRhs->zTer
eea0: 6d 2c 20 70 4c 68 73 2d 3e 6e 54 65 72 6d 29 3b  m, pLhs->nTerm);
eeb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
eec0: 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4c    rc = memcmp(pL
eed0: 68 73 2d 3e 7a 54 65 72 6d 2c 20 70 52 68 73 2d  hs->zTerm, pRhs-
eee0: 3e 7a 54 65 72 6d 2c 20 70 52 68 73 2d 3e 6e 54  >zTerm, pRhs->nT
eef0: 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  erm);.    }.    
ef00: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
ef10: 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
ef20: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
ef30: 72 63 20 3d 20 28 70 4c 68 73 2d 3e 61 4e 6f 64  rc = (pLhs->aNod
ef40: 65 3d 3d 30 29 20 2d 20 28 70 52 68 73 2d 3e 61  e==0) - (pRhs->a
ef50: 4e 6f 64 65 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20  Node==0);.  }.  
ef60: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
ef70: 20 72 63 20 3d 20 70 52 68 73 2d 3e 69 49 64 78   rc = pRhs->iIdx
ef80: 20 2d 20 70 4c 68 73 2d 3e 69 49 64 78 3b 0a 20   - pLhs->iIdx;. 
ef90: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21   }.  assert( rc!
efa0: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  =0 );.  return r
efb0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 64 69  c;.}../*.** A di
efc0: 66 66 65 72 65 6e 74 20 63 6f 6d 70 61 72 69 73  fferent comparis
efd0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  on function for 
efe0: 53 65 67 52 65 61 64 65 72 20 73 74 72 75 63 74  SegReader struct
eff0: 75 72 65 73 2e 20 49 6e 20 74 68 69 73 0a 2a 2a  ures. In this.**
f000: 20 76 65 72 73 69 6f 6e 2c 20 69 74 20 69 73 20   version, it is 
f010: 61 73 73 75 6d 65 64 20 74 68 61 74 20 65 61 63  assumed that eac
f020: 68 20 53 65 67 52 65 61 64 65 72 20 70 6f 69 6e  h SegReader poin
f030: 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 69  ts to an entry i
f040: 6e 0a 2a 2a 20 61 20 64 6f 63 6c 69 73 74 20 66  n.** a doclist f
f050: 6f 72 20 69 64 65 6e 74 69 63 61 6c 20 74 65 72  or identical ter
f060: 6d 73 2e 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69  ms. Comparison i
f070: 73 20 6d 61 64 65 20 61 73 20 66 6f 6c 6c 6f 77  s made as follow
f080: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 45 4f  s:.**.**   1) EO
f090: 46 20 28 65 6e 64 20 6f 66 20 64 6f 63 6c 69 73  F (end of doclis
f0a0: 74 20 69 6e 20 74 68 69 73 20 63 61 73 65 29 20  t in this case) 
f0b0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
f0c0: 6e 6f 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 20  not EOF..**.**  
f0d0: 20 32 29 20 42 79 20 63 75 72 72 65 6e 74 20 64   2) By current d
f0e0: 6f 63 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 29  ocid..**.**   3)
f0f0: 20 42 79 20 73 65 67 6d 65 6e 74 20 61 67 65 2e   By segment age.
f100: 20 41 6e 20 6f 6c 64 65 72 20 73 65 67 6d 65 6e   An older segmen
f110: 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  t is considered 
f120: 6c 61 72 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  larger..*/.stati
f130: 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61  c int fts3SegRea
f140: 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 28 46 74  derDoclistCmp(Ft
f150: 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 4c 68  s3SegReader *pLh
f160: 73 2c 20 46 74 73 33 53 65 67 52 65 61 64 65 72  s, Fts3SegReader
f170: 20 2a 70 52 68 73 29 7b 0a 20 20 69 6e 74 20 72   *pRhs){.  int r
f180: 63 20 3d 20 28 70 4c 68 73 2d 3e 70 4f 66 66 73  c = (pLhs->pOffs
f190: 65 74 4c 69 73 74 3d 3d 30 29 2d 28 70 52 68 73  etList==0)-(pRhs
f1a0: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30  ->pOffsetList==0
f1b0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  );.  if( rc==0 )
f1c0: 7b 0a 20 20 20 20 69 66 28 20 70 4c 68 73 2d 3e  {.    if( pLhs->
f1d0: 69 44 6f 63 69 64 3d 3d 70 52 68 73 2d 3e 69 44  iDocid==pRhs->iD
f1e0: 6f 63 69 64 20 29 7b 0a 20 20 20 20 20 20 72 63  ocid ){.      rc
f1f0: 20 3d 20 70 52 68 73 2d 3e 69 49 64 78 20 2d 20   = pRhs->iIdx - 
f200: 70 4c 68 73 2d 3e 69 49 64 78 3b 0a 20 20 20 20  pLhs->iIdx;.    
f210: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
f220: 3d 20 28 70 4c 68 73 2d 3e 69 44 6f 63 69 64 20  = (pLhs->iDocid 
f230: 3e 20 70 52 68 73 2d 3e 69 44 6f 63 69 64 29 20  > pRhs->iDocid) 
f240: 3f 20 31 20 3a 20 2d 31 3b 0a 20 20 20 20 7d 0a  ? 1 : -1;.    }.
f250: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c    }.  assert( pL
f260: 68 73 2d 3e 61 4e 6f 64 65 20 26 26 20 70 52 68  hs->aNode && pRh
f270: 73 2d 3e 61 4e 6f 64 65 20 29 3b 0a 20 20 72 65  s->aNode );.  re
f280: 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69  turn rc;.}.stati
f290: 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61  c int fts3SegRea
f2a0: 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 52 65 76  derDoclistCmpRev
f2b0: 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a  (Fts3SegReader *
f2c0: 70 4c 68 73 2c 20 46 74 73 33 53 65 67 52 65 61  pLhs, Fts3SegRea
f2d0: 64 65 72 20 2a 70 52 68 73 29 7b 0a 20 20 69 6e  der *pRhs){.  in
f2e0: 74 20 72 63 20 3d 20 28 70 4c 68 73 2d 3e 70 4f  t rc = (pLhs->pO
f2f0: 66 66 73 65 74 4c 69 73 74 3d 3d 30 29 2d 28 70  ffsetList==0)-(p
f300: 52 68 73 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74  Rhs->pOffsetList
f310: 3d 3d 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ==0);.  if( rc==
f320: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 68  0 ){.    if( pLh
f330: 73 2d 3e 69 44 6f 63 69 64 3d 3d 70 52 68 73 2d  s->iDocid==pRhs-
f340: 3e 69 44 6f 63 69 64 20 29 7b 0a 20 20 20 20 20  >iDocid ){.     
f350: 20 72 63 20 3d 20 70 52 68 73 2d 3e 69 49 64 78   rc = pRhs->iIdx
f360: 20 2d 20 70 4c 68 73 2d 3e 69 49 64 78 3b 0a 20   - pLhs->iIdx;. 
f370: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f380: 72 63 20 3d 20 28 70 4c 68 73 2d 3e 69 44 6f 63  rc = (pLhs->iDoc
f390: 69 64 20 3c 20 70 52 68 73 2d 3e 69 44 6f 63 69  id < pRhs->iDoci
f3a0: 64 29 20 3f 20 31 20 3a 20 2d 31 3b 0a 20 20 20  d) ? 1 : -1;.   
f3b0: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
f3c0: 20 70 4c 68 73 2d 3e 61 4e 6f 64 65 20 26 26 20   pLhs->aNode && 
f3d0: 70 52 68 73 2d 3e 61 4e 6f 64 65 20 29 3b 0a 20  pRhs->aNode );. 
f3e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
f3f0: 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
f400: 20 74 65 72 6d 20 74 68 61 74 20 74 68 65 20 46   term that the F
f410: 74 73 33 53 65 67 52 65 61 64 65 72 20 6f 62 6a  ts3SegReader obj
f420: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
f430: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
f440: 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 77 69  .** points to wi
f450: 74 68 20 74 68 65 20 74 65 72 6d 20 73 70 65 63  th the term spec
f460: 69 66 69 65 64 20 62 79 20 61 72 67 75 6d 65 6e  ified by argumen
f470: 74 73 20 7a 54 65 72 6d 20 61 6e 64 20 6e 54 65  ts zTerm and nTe
f480: 72 6d 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  rm. .**.** If th
f490: 65 20 70 53 65 67 20 69 74 65 72 61 74 6f 72 20  e pSeg iterator 
f4a0: 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 45 4f  is already at EO
f4b0: 46 2c 20 72 65 74 75 72 6e 20 30 2e 20 4f 74 68  F, return 0. Oth
f4c0: 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 0a 2a  erwise, return.*
f4d0: 2a 20 2d 76 65 20 69 66 20 74 68 65 20 70 53 65  * -ve if the pSe
f4e0: 67 20 74 65 72 6d 20 69 73 20 6c 65 73 73 20 74  g term is less t
f4f0: 68 61 6e 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2c  han zTerm/nTerm,
f500: 20 30 20 69 66 20 74 68 65 20 74 77 6f 20 74 65   0 if the two te
f510: 72 6d 73 20 61 72 65 0a 2a 2a 20 65 71 75 61 6c  rms are.** equal
f520: 2c 20 6f 72 20 2b 76 65 20 69 66 20 74 68 65 20  , or +ve if the 
f530: 70 53 65 67 20 74 65 72 6d 20 69 73 20 67 72 65  pSeg term is gre
f540: 61 74 65 72 20 74 68 61 6e 20 7a 54 65 72 6d 2f  ater than zTerm/
f550: 6e 54 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  nTerm..*/.static
f560: 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61 64   int fts3SegRead
f570: 65 72 54 65 72 6d 43 6d 70 28 0a 20 20 46 74 73  erTermCmp(.  Fts
f580: 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67  3SegReader *pSeg
f590: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
f5a0: 53 65 67 6d 65 6e 74 20 72 65 61 64 65 72 20 6f  Segment reader o
f5b0: 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  bject */.  const
f5c0: 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20   char *zTerm,   
f5d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
f5e0: 72 6d 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 6f  rm to compare to
f5f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 20   */.  int nTerm 
f600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f610: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
f620: 20 74 65 72 6d 20 7a 54 65 72 6d 20 69 6e 20 62   term zTerm in b
f630: 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ytes */.){.  int
f640: 20 72 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20   res = 0;.  if( 
f650: 70 53 65 67 2d 3e 61 4e 6f 64 65 20 29 7b 0a 20  pSeg->aNode ){. 
f660: 20 20 20 69 66 28 20 70 53 65 67 2d 3e 6e 54 65     if( pSeg->nTe
f670: 72 6d 3e 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20  rm>nTerm ){.    
f680: 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70    res = memcmp(p
f690: 53 65 67 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65 72  Seg->zTerm, zTer
f6a0: 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 7d  m, nTerm);.    }
f6b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20  else{.      res 
f6c0: 3d 20 6d 65 6d 63 6d 70 28 70 53 65 67 2d 3e 7a  = memcmp(pSeg->z
f6d0: 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 70 53 65  Term, zTerm, pSe
f6e0: 67 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20 7d  g->nTerm);.    }
f6f0: 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20  .    if( res==0 
f700: 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70  ){.      res = p
f710: 53 65 67 2d 3e 6e 54 65 72 6d 2d 6e 54 65 72 6d  Seg->nTerm-nTerm
f720: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
f730: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
f740: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 61 70 53 65  ** Argument apSe
f750: 67 6d 65 6e 74 20 69 73 20 61 6e 20 61 72 72 61  gment is an arra
f760: 79 20 6f 66 20 6e 53 65 67 6d 65 6e 74 20 65 6c  y of nSegment el
f770: 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 6b 6e  ements. It is kn
f780: 6f 77 6e 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  own that.** the 
f790: 66 69 6e 61 6c 20 28 6e 53 65 67 6d 65 6e 74 2d  final (nSegment-
f7a0: 6e 53 75 73 70 65 63 74 29 20 6d 65 6d 62 65 72  nSuspect) member
f7b0: 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  s are already in
f7c0: 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 2a 2a   sorted order.**
f7d0: 20 28 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74   (according to t
f7e0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  he comparison fu
f7f0: 6e 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 64 29  nction provided)
f800: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
f810: 73 68 75 66 66 6c 65 73 0a 2a 2a 20 74 68 65 20  shuffles.** the 
f820: 61 72 72 61 79 20 61 72 6f 75 6e 64 20 75 6e 74  array around unt
f830: 69 6c 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 61  il all entries a
f840: 72 65 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  re in sorted ord
f850: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
f860: 69 64 20 66 74 73 33 53 65 67 52 65 61 64 65 72  id fts3SegReader
f870: 53 6f 72 74 28 0a 20 20 46 74 73 33 53 65 67 52  Sort(.  Fts3SegR
f880: 65 61 64 65 72 20 2a 2a 61 70 53 65 67 6d 65 6e  eader **apSegmen
f890: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
f8a0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
f8b0: 74 6f 20 73 6f 72 74 20 65 6e 74 72 69 65 73 20  to sort entries 
f8c0: 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67  of */.  int nSeg
f8d0: 6d 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  ment,           
f8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8f0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
f900: 66 20 61 70 53 65 67 6d 65 6e 74 20 61 72 72 61  f apSegment arra
f910: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 73 70  y */.  int nSusp
f920: 65 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ect,            
f930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f940: 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f 72 74 65        /* Unsorte
f950: 64 20 65 6e 74 72 79 20 63 6f 75 6e 74 20 2a 2f  d entry count */
f960: 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70 29 28 46  .  int (*xCmp)(F
f970: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2c 20  ts3SegReader *, 
f980: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 29  Fts3SegReader *)
f990: 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
f9a0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  function */.){. 
f9b0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
f9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9d0: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
f9e0: 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65  iable */..  asse
f9f0: 72 74 28 20 6e 53 75 73 70 65 63 74 3c 3d 6e 53  rt( nSuspect<=nS
fa00: 65 67 6d 65 6e 74 20 29 3b 0a 0a 20 20 69 66 28  egment );..  if(
fa10: 20 6e 53 75 73 70 65 63 74 3d 3d 6e 53 65 67 6d   nSuspect==nSegm
fa20: 65 6e 74 20 29 20 6e 53 75 73 70 65 63 74 2d 2d  ent ) nSuspect--
fa30: 3b 0a 20 20 66 6f 72 28 69 3d 6e 53 75 73 70 65  ;.  for(i=nSuspe
fa40: 63 74 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ct-1; i>=0; i--)
fa50: 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20  {.    int j;.   
fa60: 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c 28 6e 53 65   for(j=i; j<(nSe
fa70: 67 6d 65 6e 74 2d 31 29 3b 20 6a 2b 2b 29 7b 0a  gment-1); j++){.
fa80: 20 20 20 20 20 20 46 74 73 33 53 65 67 52 65 61        Fts3SegRea
fa90: 64 65 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20  der *pTmp;.     
faa0: 20 69 66 28 20 78 43 6d 70 28 61 70 53 65 67 6d   if( xCmp(apSegm
fab0: 65 6e 74 5b 6a 5d 2c 20 61 70 53 65 67 6d 65 6e  ent[j], apSegmen
fac0: 74 5b 6a 2b 31 5d 29 3c 30 20 29 20 62 72 65 61  t[j+1])<0 ) brea
fad0: 6b 3b 0a 20 20 20 20 20 20 70 54 6d 70 20 3d 20  k;.      pTmp = 
fae0: 61 70 53 65 67 6d 65 6e 74 5b 6a 2b 31 5d 3b 0a  apSegment[j+1];.
faf0: 20 20 20 20 20 20 61 70 53 65 67 6d 65 6e 74 5b        apSegment[
fb00: 6a 2b 31 5d 20 3d 20 61 70 53 65 67 6d 65 6e 74  j+1] = apSegment
fb10: 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 70 53 65 67  [j];.      apSeg
fb20: 6d 65 6e 74 5b 6a 5d 20 3d 20 70 54 6d 70 3b 0a  ment[j] = pTmp;.
fb30: 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64      }.  }..#ifnd
fb40: 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 43  ef NDEBUG.  /* C
fb50: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c 69  heck that the li
fb60: 73 74 20 72 65 61 6c 6c 79 20 69 73 20 73 6f 72  st really is sor
fb70: 74 65 64 20 6e 6f 77 2e 20 2a 2f 0a 20 20 66 6f  ted now. */.  fo
fb80: 72 28 69 3d 30 3b 20 69 3c 28 6e 53 75 73 70 65  r(i=0; i<(nSuspe
fb90: 63 74 2d 31 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  ct-1); i++){.   
fba0: 20 61 73 73 65 72 74 28 20 78 43 6d 70 28 61 70   assert( xCmp(ap
fbb0: 53 65 67 6d 65 6e 74 5b 69 5d 2c 20 61 70 53 65  Segment[i], apSe
fbc0: 67 6d 65 6e 74 5b 69 2b 31 5d 29 3c 30 20 29 3b  gment[i+1])<0 );
fbd0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
fbe0: 2a 20 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 72  * .** Insert a r
fbf0: 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 25  ecord into the %
fc00: 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 2e  _segments table.
fc10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
fc20: 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28  ts3WriteSegment(
fc30: 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
fc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc50: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
fc60: 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
fc70: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 42  sqlite3_int64 iB
fc80: 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
fc90: 2f 2a 20 42 6c 6f 63 6b 20 69 64 20 66 6f 72 20  /* Block id for 
fca0: 6e 65 77 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 63  new block */.  c
fcb0: 68 61 72 20 2a 7a 2c 20 20 20 20 20 20 20 20 20  har *z,         
fcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fcd0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
fce0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 62  fer containing b
fcf0: 6c 6f 63 6b 20 64 61 74 61 20 2a 2f 0a 20 20 69  lock data */.  i
fd00: 6e 74 20 6e 20 20 20 20 20 20 20 20 20 20 20 20  nt n            
fd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fd20: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
fd30: 20 7a 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29   z in bytes */.)
fd40: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
fd50: 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
fd60: 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
fd70: 70 2c 20 53 51 4c 5f 49 4e 53 45 52 54 5f 53 45  p, SQL_INSERT_SE
fd80: 47 4d 45 4e 54 53 2c 20 26 70 53 74 6d 74 2c 20  GMENTS, &pStmt, 
fd90: 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
fda0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
fdb0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
fdc0: 34 28 70 53 74 6d 74 2c 20 31 2c 20 69 42 6c 6f  4(pStmt, 1, iBlo
fdd0: 63 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ck);.    sqlite3
fde0: 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74  _bind_blob(pStmt
fdf0: 2c 20 32 2c 20 7a 2c 20 6e 2c 20 53 51 4c 49 54  , 2, z, n, SQLIT
fe00: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  E_STATIC);.    s
fe10: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
fe20: 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  t);.    rc = sql
fe30: 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
fe40: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  );.    sqlite3_b
fe50: 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20  ind_null(pStmt, 
fe60: 32 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  2);.  }.  return
fe70: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69   rc;.}../*.** Fi
fe80: 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  nd the largest r
fe90: 65 6c 61 74 69 76 65 20 6c 65 76 65 6c 20 6e 75  elative level nu
fea0: 6d 62 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c  mber in the tabl
feb0: 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  e. If successful
fec0: 2c 20 73 65 74 0a 2a 2a 20 2a 70 6e 4d 61 78 20  , set.** *pnMax 
fed0: 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e  to this value an
fee0: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
fef0: 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  OK. Otherwise, i
ff00: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
ff10: 73 2c 0a 2a 2a 20 73 65 74 20 2a 70 6e 4d 61 78  s,.** set *pnMax
ff20: 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 72 65 74   to zero and ret
ff30: 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
ff40: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  ror code..*/.int
ff50: 20 73 71 6c 69 74 65 33 46 74 73 33 4d 61 78 4c   sqlite3Fts3MaxL
ff60: 65 76 65 6c 28 46 74 73 33 54 61 62 6c 65 20 2a  evel(Fts3Table *
ff70: 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 29 7b 0a  p, int *pnMax){.
ff80: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
ff90: 6d 78 4c 65 76 65 6c 20 3d 20 30 3b 0a 20 20 73  mxLevel = 0;.  s
ffa0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
ffb0: 6d 74 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20  mt = 0;..  rc = 
ffc0: 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
ffd0: 51 4c 5f 53 45 4c 45 43 54 5f 4d 58 4c 45 56 45  QL_SELECT_MXLEVE
ffe0: 4c 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  L, &pStmt, 0);. 
fff0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10000 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51  OK ){.    if( SQ
10010 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
10020 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
10030 0a 20 20 20 20 20 20 6d 78 4c 65 76 65 6c 20 3d  .      mxLevel =
10040 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
10050 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  int(pStmt, 0);. 
10060 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
10070 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
10080 74 29 3b 0a 20 20 7d 0a 20 20 2a 70 6e 4d 61 78  t);.  }.  *pnMax
10090 20 3d 20 6d 78 4c 65 76 65 6c 3b 0a 20 20 72 65   = mxLevel;.  re
100a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
100b0 2a 2a 20 49 6e 73 65 72 74 20 61 20 72 65 63 6f  ** Insert a reco
100c0 72 64 20 69 6e 74 6f 20 74 68 65 20 25 5f 73 65  rd into the %_se
100d0 67 64 69 72 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  gdir table..*/.s
100e0 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 57 72  tatic int fts3Wr
100f0 69 74 65 53 65 67 64 69 72 28 0a 20 20 46 74 73  iteSegdir(.  Fts
10100 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
10110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10120 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  Virtual table ha
10130 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ndle */.  sqlite
10140 33 5f 69 6e 74 36 34 20 69 4c 65 76 65 6c 2c 20  3_int64 iLevel, 
10150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
10160 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22 20 66  ue for "level" f
10170 69 65 6c 64 20 28 61 62 73 6f 6c 75 74 65 20 6c  ield (absolute l
10180 65 76 65 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 69  evel) */.  int i
10190 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
101a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
101b0 6c 75 65 20 66 6f 72 20 22 69 64 78 22 20 66 69  lue for "idx" fi
101c0 65 6c 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  eld */.  sqlite3
101d0 5f 69 6e 74 36 34 20 69 53 74 61 72 74 42 6c 6f  _int64 iStartBlo
101e0 63 6b 2c 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  ck,      /* Valu
101f0 65 20 66 6f 72 20 22 73 74 61 72 74 5f 62 6c 6f  e for "start_blo
10200 63 6b 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 73  ck" field */.  s
10210 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 65  qlite3_int64 iLe
10220 61 66 45 6e 64 42 6c 6f 63 6b 2c 20 20 20 20 2f  afEndBlock,    /
10230 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 6c 65 61  * Value for "lea
10240 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 22 20 66  ves_end_block" f
10250 69 65 6c 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ield */.  sqlite
10260 33 5f 69 6e 74 36 34 20 69 45 6e 64 42 6c 6f 63  3_int64 iEndBloc
10270 6b 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  k,        /* Val
10280 75 65 20 66 6f 72 20 22 65 6e 64 5f 62 6c 6f 63  ue for "end_bloc
10290 6b 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 73 71  k" field */.  sq
102a0 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4c 65 61  lite3_int64 nLea
102b0 66 44 61 74 61 2c 20 20 20 20 20 20 20 20 2f 2a  fData,        /*
102c0 20 42 79 74 65 73 20 6f 66 20 6c 65 61 66 20 64   Bytes of leaf d
102d0 61 74 61 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a  ata in segment *
102e0 2f 0a 20 20 63 68 61 72 20 2a 7a 52 6f 6f 74 2c  /.  char *zRoot,
102f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10300 20 20 20 20 2f 2a 20 42 6c 6f 62 20 76 61 6c 75      /* Blob valu
10310 65 20 66 6f 72 20 22 72 6f 6f 74 22 20 66 69 65  e for "root" fie
10320 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f  ld */.  int nRoo
10330 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
10340 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10350 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 62 75  r of bytes in bu
10360 66 66 65 72 20 7a 52 6f 6f 74 20 2a 2f 0a 29 7b  ffer zRoot */.){
10370 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
10380 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63  *pStmt;.  int rc
10390 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
103a0 2c 20 53 51 4c 5f 49 4e 53 45 52 54 5f 53 45 47  , SQL_INSERT_SEG
103b0 44 49 52 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  DIR, &pStmt, 0);
103c0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
103d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
103e0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
103f0 53 74 6d 74 2c 20 31 2c 20 69 4c 65 76 65 6c 29  Stmt, 1, iLevel)
10400 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
10410 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32 2c  nd_int(pStmt, 2,
10420 20 69 49 64 78 29 3b 0a 20 20 20 20 73 71 6c 69   iIdx);.    sqli
10430 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
10440 53 74 6d 74 2c 20 33 2c 20 69 53 74 61 72 74 42  Stmt, 3, iStartB
10450 6c 6f 63 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  lock);.    sqlit
10460 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
10470 74 6d 74 2c 20 34 2c 20 69 4c 65 61 66 45 6e 64  tmt, 4, iLeafEnd
10480 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  Block);.    if( 
10490 6e 4c 65 61 66 44 61 74 61 3d 3d 30 20 29 7b 0a  nLeafData==0 ){.
104a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
104b0 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  nd_int64(pStmt, 
104c0 35 2c 20 69 45 6e 64 42 6c 6f 63 6b 29 3b 0a 20  5, iEndBlock);. 
104d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
104e0 63 68 61 72 20 2a 7a 45 6e 64 20 3d 20 73 71 6c  char *zEnd = sql
104f0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 6c  ite3_mprintf("%l
10500 6c 64 20 25 6c 6c 64 22 2c 20 69 45 6e 64 42 6c  ld %lld", iEndBl
10510 6f 63 6b 2c 20 6e 4c 65 61 66 44 61 74 61 29 3b  ock, nLeafData);
10520 0a 20 20 20 20 20 20 69 66 28 20 21 7a 45 6e 64  .      if( !zEnd
10530 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
10540 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 73 71  _NOMEM;.      sq
10550 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
10560 70 53 74 6d 74 2c 20 35 2c 20 7a 45 6e 64 2c 20  pStmt, 5, zEnd, 
10570 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  -1, sqlite3_free
10580 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
10590 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
105a0 53 74 6d 74 2c 20 36 2c 20 7a 52 6f 6f 74 2c 20  Stmt, 6, zRoot, 
105b0 6e 52 6f 6f 74 2c 20 53 51 4c 49 54 45 5f 53 54  nRoot, SQLITE_ST
105c0 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  ATIC);.    sqlit
105d0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
105e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
105f0 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
10600 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
10610 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 36 29 3b 0a  null(pStmt, 6);.
10620 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
10630 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
10640 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
10650 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 28   common prefix (
10660 69 66 20 61 6e 79 29 20 73 68 61 72 65 64 20 62  if any) shared b
10670 79 20 7a 50 72 65 76 20 61 6e 64 0a 2a 2a 20 7a  y zPrev and.** z
10680 4e 65 78 74 2c 20 69 6e 20 62 79 74 65 73 2e 20  Next, in bytes. 
10690 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 0a 2a 2a  For example, .**
106a0 0a 2a 2a 20 20 20 66 74 73 33 50 72 65 66 69 78  .**   fts3Prefix
106b0 43 6f 6d 70 72 65 73 73 28 22 61 62 63 22 2c 20  Compress("abc", 
106c0 33 2c 20 22 61 62 63 64 65 66 22 2c 20 36 29 20  3, "abcdef", 6) 
106d0 20 20 2f 2f 20 72 65 74 75 72 6e 73 20 33 0a 2a    // returns 3.*
106e0 2a 20 20 20 66 74 73 33 50 72 65 66 69 78 43 6f  *   fts3PrefixCo
106f0 6d 70 72 65 73 73 28 22 61 62 58 22 2c 20 33 2c  mpress("abX", 3,
10700 20 22 61 62 63 64 65 66 22 2c 20 36 29 20 20 20   "abcdef", 6)   
10710 2f 2f 20 72 65 74 75 72 6e 73 20 32 0a 2a 2a 20  // returns 2.** 
10720 20 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70    fts3PrefixComp
10730 72 65 73 73 28 22 61 62 58 22 2c 20 33 2c 20 22  ress("abX", 3, "
10740 58 62 63 64 65 66 22 2c 20 36 29 20 20 20 2f 2f  Xbcdef", 6)   //
10750 20 72 65 74 75 72 6e 73 20 30 0a 2a 2f 0a 73 74   returns 0.*/.st
10760 61 74 69 63 20 69 6e 74 20 66 74 73 33 50 72 65  atic int fts3Pre
10770 66 69 78 43 6f 6d 70 72 65 73 73 28 0a 20 20 63  fixCompress(.  c
10780 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 65 76  onst char *zPrev
10790 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
107a0 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
107b0 69 6e 67 20 70 72 65 76 69 6f 75 73 20 74 65 72  ing previous ter
107c0 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 76  m */.  int nPrev
107d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
107e0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
107f0 66 20 62 75 66 66 65 72 20 7a 50 72 65 76 20 69  f buffer zPrev i
10800 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 6f 6e  n bytes */.  con
10810 73 74 20 63 68 61 72 20 2a 7a 4e 65 78 74 2c 20  st char *zNext, 
10820 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10830 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
10840 67 20 6e 65 78 74 20 74 65 72 6d 20 2a 2f 0a 20  g next term */. 
10850 20 69 6e 74 20 6e 4e 65 78 74 20 20 20 20 20 20   int nNext      
10860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10870 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66   /* Size of buff
10880 65 72 20 7a 4e 65 78 74 20 69 6e 20 62 79 74 65  er zNext in byte
10890 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b  s */.){.  int n;
108a0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
108b0 54 45 52 28 6e 4e 65 78 74 29 3b 0a 20 20 66 6f  TER(nNext);.  fo
108c0 72 28 6e 3d 30 3b 20 6e 3c 6e 50 72 65 76 20 26  r(n=0; n<nPrev &
108d0 26 20 7a 50 72 65 76 5b 6e 5d 3d 3d 7a 4e 65 78  & zPrev[n]==zNex
108e0 74 5b 6e 5d 3b 20 6e 2b 2b 29 3b 0a 20 20 72 65  t[n]; n++);.  re
108f0 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
10900 20 41 64 64 20 74 65 72 6d 20 7a 54 65 72 6d 20   Add term zTerm 
10910 74 6f 20 74 68 65 20 53 65 67 6d 65 6e 74 4e 6f  to the SegmentNo
10920 64 65 2e 20 49 74 20 69 73 20 67 75 61 72 61 6e  de. It is guaran
10930 74 65 65 64 20 74 68 61 74 20 7a 54 65 72 6d 20  teed that zTerm 
10940 69 73 20 6c 61 72 67 65 72 0a 2a 2a 20 28 61 63  is larger.** (ac
10950 63 6f 72 64 69 6e 67 20 74 6f 20 6d 65 6d 63 6d  cording to memcm
10960 70 29 20 74 68 61 6e 20 74 68 65 20 70 72 65 76  p) than the prev
10970 69 6f 75 73 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74  ious term..*/.st
10980 61 74 69 63 20 69 6e 74 20 66 74 73 33 4e 6f 64  atic int fts3Nod
10990 65 41 64 64 54 65 72 6d 28 0a 20 20 46 74 73 33  eAddTerm(.  Fts3
109a0 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
109b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
109c0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
109d0 64 6c 65 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74  dle */.  Segment
109e0 4e 6f 64 65 20 2a 2a 70 70 54 72 65 65 2c 20 20  Node **ppTree,  
109f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
10a00 55 54 3a 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20  UT: SegmentNode 
10a10 68 61 6e 64 6c 65 20 2a 2f 20 0a 20 20 69 6e 74  handle */ .  int
10a20 20 69 73 43 6f 70 79 54 65 72 6d 2c 20 20 20 20   isCopyTerm,    
10a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10a40 54 72 75 65 20 69 66 20 7a 54 65 72 6d 2f 6e 54  True if zTerm/nT
10a50 65 72 6d 20 69 73 20 74 72 61 6e 73 69 65 6e 74  erm is transient
10a60 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
10a70 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20   *zTerm,        
10a80 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
10a90 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
10aa0 69 6e 69 6e 67 20 74 65 72 6d 20 2a 2f 0a 20 20  ining term */.  
10ab0 69 6e 74 20 6e 54 65 72 6d 20 20 20 20 20 20 20  int nTerm       
10ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ad0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20  /* Size of term 
10ae0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20  in bytes */.){. 
10af0 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 54   SegmentNode *pT
10b00 72 65 65 20 3d 20 2a 70 70 54 72 65 65 3b 0a 20  ree = *ppTree;. 
10b10 20 69 6e 74 20 72 63 3b 0a 20 20 53 65 67 6d 65   int rc;.  Segme
10b20 6e 74 4e 6f 64 65 20 2a 70 4e 65 77 3b 0a 0a 20  ntNode *pNew;.. 
10b30 20 2f 2a 20 46 69 72 73 74 20 74 72 79 20 74 6f   /* First try to
10b40 20 61 70 70 65 6e 64 20 74 68 65 20 74 65 72 6d   append the term
10b50 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
10b60 6e 6f 64 65 2e 20 52 65 74 75 72 6e 20 65 61 72  node. Return ear
10b70 6c 79 20 69 66 20 0a 20 20 2a 2a 20 74 68 69 73  ly if .  ** this
10b80 20 69 73 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20   is possible..  
10b90 2a 2f 0a 20 20 69 66 28 20 70 54 72 65 65 20 29  */.  if( pTree )
10ba0 7b 0a 20 20 20 20 69 6e 74 20 6e 44 61 74 61 20  {.    int nData 
10bb0 3d 20 70 54 72 65 65 2d 3e 6e 44 61 74 61 3b 20  = pTree->nData; 
10bc0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73      /* Current s
10bd0 69 7a 65 20 6f 66 20 6e 6f 64 65 20 69 6e 20 62  ize of node in b
10be0 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ytes */.    int 
10bf0 6e 52 65 71 20 3d 20 6e 44 61 74 61 3b 20 20 20  nReq = nData;   
10c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71            /* Req
10c10 75 69 72 65 64 20 73 70 61 63 65 20 61 66 74 65  uired space afte
10c20 72 20 61 64 64 69 6e 67 20 7a 54 65 72 6d 20 2a  r adding zTerm *
10c30 2f 0a 20 20 20 20 69 6e 74 20 6e 50 72 65 66 69  /.    int nPrefi
10c40 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
10c50 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10c60 20 62 79 74 65 73 20 6f 66 20 70 72 65 66 69 78   bytes of prefix
10c70 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 2a 2f 0a   compression */.
10c80 20 20 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b      int nSuffix;
10c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ca0 20 20 2f 2a 20 53 75 66 66 69 78 20 6c 65 6e 67    /* Suffix leng
10cb0 74 68 20 2a 2f 0a 0a 20 20 20 20 6e 50 72 65 66  th */..    nPref
10cc0 69 78 20 3d 20 66 74 73 33 50 72 65 66 69 78 43  ix = fts3PrefixC
10cd0 6f 6d 70 72 65 73 73 28 70 54 72 65 65 2d 3e 7a  ompress(pTree->z
10ce0 54 65 72 6d 2c 20 70 54 72 65 65 2d 3e 6e 54 65  Term, pTree->nTe
10cf0 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  rm, zTerm, nTerm
10d00 29 3b 0a 20 20 20 20 6e 53 75 66 66 69 78 20 3d  );.    nSuffix =
10d10 20 6e 54 65 72 6d 2d 6e 50 72 65 66 69 78 3b 0a   nTerm-nPrefix;.
10d20 0a 20 20 20 20 6e 52 65 71 20 2b 3d 20 73 71 6c  .    nReq += sql
10d30 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65  ite3Fts3VarintLe
10d40 6e 28 6e 50 72 65 66 69 78 29 2b 73 71 6c 69 74  n(nPrefix)+sqlit
10d50 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28  e3Fts3VarintLen(
10d60 6e 53 75 66 66 69 78 29 2b 6e 53 75 66 66 69 78  nSuffix)+nSuffix
10d70 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 71 3c 3d  ;.    if( nReq<=
10d80 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 7c 7c 20  p->nNodeSize || 
10d90 21 70 54 72 65 65 2d 3e 7a 54 65 72 6d 20 29 7b  !pTree->zTerm ){
10da0 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 52 65 71  ..      if( nReq
10db0 3e 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 29 7b  >p->nNodeSize ){
10dc0 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 75  .        /* An u
10dd0 6e 75 73 75 61 6c 20 63 61 73 65 3a 20 74 68 69  nusual case: thi
10de0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74  s is the first t
10df0 65 72 6d 20 74 6f 20 62 65 20 61 64 64 65 64 20  erm to be added 
10e00 74 6f 20 74 68 65 20 6e 6f 64 65 0a 20 20 20 20  to the node.    
10e10 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 73      ** and the s
10e20 74 61 74 69 63 20 6e 6f 64 65 20 62 75 66 66 65  tatic node buffe
10e30 72 20 28 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20  r (p->nNodeSize 
10e40 62 79 74 65 73 29 20 69 73 20 6e 6f 74 20 6c 61  bytes) is not la
10e50 72 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  rge.        ** e
10e60 6e 6f 75 67 68 2e 20 55 73 65 20 61 20 73 65 70  nough. Use a sep
10e70 61 72 61 74 65 6c 79 20 6d 61 6c 6c 6f 63 65 64  arately malloced
10e80 20 62 75 66 66 65 72 20 69 6e 73 74 65 61 64 20   buffer instead 
10e90 54 68 69 73 20 77 61 73 74 65 73 0a 20 20 20 20  This wastes.    
10ea0 20 20 20 20 2a 2a 20 70 2d 3e 6e 4e 6f 64 65 53      ** p->nNodeS
10eb0 69 7a 65 20 62 79 74 65 73 2c 20 62 75 74 20 73  ize bytes, but s
10ec0 69 6e 63 65 20 74 68 69 73 20 73 63 65 6e 61 72  ince this scenar
10ed0 69 6f 20 6f 6e 6c 79 20 63 6f 6d 65 73 20 61 62  io only comes ab
10ee0 6f 75 74 20 77 68 65 6e 0a 20 20 20 20 20 20 20  out when.       
10ef0 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
10f00 20 63 6f 6e 74 61 69 6e 20 74 77 6f 20 74 65 72   contain two ter
10f10 6d 73 20 74 68 61 74 20 73 68 61 72 65 20 61 20  ms that share a 
10f20 70 72 65 66 69 78 20 6f 66 20 61 6c 6d 6f 73 74  prefix of almost
10f30 20 32 4b 42 2c 20 0a 20 20 20 20 20 20 20 20 2a   2KB, .        *
10f40 2a 20 74 68 69 73 20 69 73 20 6e 6f 74 20 65 78  * this is not ex
10f50 70 65 63 74 65 64 20 74 6f 20 62 65 20 61 20 73  pected to be a s
10f60 65 72 69 6f 75 73 20 70 72 6f 62 6c 65 6d 2e 20  erious problem. 
10f70 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
10f80 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 65      assert( pTre
10f90 65 2d 3e 61 44 61 74 61 3d 3d 28 63 68 61 72 20  e->aData==(char 
10fa0 2a 29 26 70 54 72 65 65 5b 31 5d 20 29 3b 0a 20  *)&pTree[1] );. 
10fb0 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e 61 44         pTree->aD
10fc0 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ata = (char *)sq
10fd0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 52 65  lite3_malloc(nRe
10fe0 71 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  q);.        if( 
10ff0 21 70 54 72 65 65 2d 3e 61 44 61 74 61 20 29 7b  !pTree->aData ){
11000 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
11010 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
11020 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11030 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 72  }..      if( pTr
11040 65 65 2d 3e 7a 54 65 72 6d 20 29 7b 0a 20 20 20  ee->zTerm ){.   
11050 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73       /* There is
11060 20 6e 6f 20 70 72 65 66 69 78 2d 6c 65 6e 67 74   no prefix-lengt
11070 68 20 66 69 65 6c 64 20 66 6f 72 20 66 69 72 73  h field for firs
11080 74 20 74 65 72 6d 20 69 6e 20 61 20 6e 6f 64 65  t term in a node
11090 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 44 61 74   */.        nDat
110a0 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  a += sqlite3Fts3
110b0 50 75 74 56 61 72 69 6e 74 28 26 70 54 72 65 65  PutVarint(&pTree
110c0 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20  ->aData[nData], 
110d0 6e 50 72 65 66 69 78 29 3b 0a 20 20 20 20 20 20  nPrefix);.      
110e0 7d 0a 0a 20 20 20 20 20 20 6e 44 61 74 61 20 2b  }..      nData +
110f0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74  = sqlite3Fts3Put
11100 56 61 72 69 6e 74 28 26 70 54 72 65 65 2d 3e 61  Varint(&pTree->a
11110 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 6e 53 75  Data[nData], nSu
11120 66 66 69 78 29 3b 0a 20 20 20 20 20 20 6d 65 6d  ffix);.      mem
11130 63 70 79 28 26 70 54 72 65 65 2d 3e 61 44 61 74  cpy(&pTree->aDat
11140 61 5b 6e 44 61 74 61 5d 2c 20 26 7a 54 65 72 6d  a[nData], &zTerm
11150 5b 6e 50 72 65 66 69 78 5d 2c 20 6e 53 75 66 66  [nPrefix], nSuff
11160 69 78 29 3b 0a 20 20 20 20 20 20 70 54 72 65 65  ix);.      pTree
11170 2d 3e 6e 44 61 74 61 20 3d 20 6e 44 61 74 61 20  ->nData = nData 
11180 2b 20 6e 53 75 66 66 69 78 3b 0a 20 20 20 20 20  + nSuffix;.     
11190 20 70 54 72 65 65 2d 3e 6e 45 6e 74 72 79 2b 2b   pTree->nEntry++
111a0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 73 43  ;..      if( isC
111b0 6f 70 79 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  opyTerm ){.     
111c0 20 20 20 69 66 28 20 70 54 72 65 65 2d 3e 6e 4d     if( pTree->nM
111d0 61 6c 6c 6f 63 3c 6e 54 65 72 6d 20 29 7b 0a 20  alloc<nTerm ){. 
111e0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
111f0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  New = sqlite3_re
11200 61 6c 6c 6f 63 28 70 54 72 65 65 2d 3e 7a 4d 61  alloc(pTree->zMa
11210 6c 6c 6f 63 2c 20 6e 54 65 72 6d 2a 32 29 3b 0a  lloc, nTerm*2);.
11220 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 7a            if( !z
11230 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  New ){.         
11240 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11250 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
11260 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54    }.          pT
11270 72 65 65 2d 3e 6e 4d 61 6c 6c 6f 63 20 3d 20 6e  ree->nMalloc = n
11280 54 65 72 6d 2a 32 3b 0a 20 20 20 20 20 20 20 20  Term*2;.        
11290 20 20 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63    pTree->zMalloc
112a0 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20 20 20 20   = zNew;.       
112b0 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 65 65   }.        pTree
112c0 2d 3e 7a 54 65 72 6d 20 3d 20 70 54 72 65 65 2d  ->zTerm = pTree-
112d0 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  >zMalloc;.      
112e0 20 20 6d 65 6d 63 70 79 28 70 54 72 65 65 2d 3e    memcpy(pTree->
112f0 7a 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54  zTerm, zTerm, nT
11300 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 70 54  erm);.        pT
11310 72 65 65 2d 3e 6e 54 65 72 6d 20 3d 20 6e 54 65  ree->nTerm = nTe
11320 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  rm;.      }else{
11330 0a 20 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e  .        pTree->
11340 7a 54 65 72 6d 20 3d 20 28 63 68 61 72 20 2a 29  zTerm = (char *)
11350 7a 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70  zTerm;.        p
11360 54 72 65 65 2d 3e 6e 54 65 72 6d 20 3d 20 6e 54  Tree->nTerm = nT
11370 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  erm;.      }.   
11380 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11390 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  _OK;.    }.  }..
113a0 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
113b0 66 6c 6f 77 73 20 74 6f 20 68 65 72 65 2c 20 69  flows to here, i
113c0 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62  t was not possib
113d0 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 7a 54 65  le to append zTe
113e0 72 6d 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 63  rm to the.  ** c
113f0 75 72 72 65 6e 74 20 6e 6f 64 65 2e 20 43 72 65  urrent node. Cre
11400 61 74 65 20 61 20 6e 65 77 20 6e 6f 64 65 20 28  ate a new node (
11410 61 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20  a right-sibling 
11420 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e  of the current n
11430 6f 64 65 29 2e 0a 20 20 2a 2a 20 49 66 20 74 68  ode)..  ** If th
11440 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
11450 6e 6f 64 65 20 69 6e 20 74 68 65 20 74 72 65 65  node in the tree
11460 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 64  , the term is ad
11470 64 65 64 20 74 6f 20 69 74 2e 0a 20 20 2a 2a 0a  ded to it..  **.
11480 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
11490 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  the term is not 
114a0 61 64 64 65 64 20 74 6f 20 74 68 65 20 6e 65 77  added to the new
114b0 20 6e 6f 64 65 2c 20 69 74 20 69 73 20 6c 65 66   node, it is lef
114c0 74 20 65 6d 70 74 79 20 66 6f 72 0a 20 20 2a 2a  t empty for.  **
114d0 20 6e 6f 77 2e 20 49 6e 73 74 65 61 64 2c 20 74   now. Instead, t
114e0 68 65 20 74 65 72 6d 20 69 73 20 69 6e 73 65 72  he term is inser
114f0 74 65 64 20 69 6e 74 6f 20 74 68 65 20 70 61 72  ted into the par
11500 65 6e 74 20 6f 66 20 70 54 72 65 65 2e 20 49 66  ent of pTree. If
11510 20 70 54 72 65 65 20 0a 20 20 2a 2a 20 68 61 73   pTree .  ** has
11520 20 6e 6f 20 70 61 72 65 6e 74 2c 20 6f 6e 65 20   no parent, one 
11530 69 73 20 63 72 65 61 74 65 64 20 68 65 72 65 2e  is created here.
11540 0a 20 20 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 28  .  */.  pNew = (
11550 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 29 73 71  SegmentNode *)sq
11560 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
11570 65 6f 66 28 53 65 67 6d 65 6e 74 4e 6f 64 65 29  eof(SegmentNode)
11580 20 2b 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 29   + p->nNodeSize)
11590 3b 0a 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b  ;.  if( !pNew ){
115a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
115b0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
115c0 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20  memset(pNew, 0, 
115d0 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e 74 4e 6f  sizeof(SegmentNo
115e0 64 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e 44  de));.  pNew->nD
115f0 61 74 61 20 3d 20 31 20 2b 20 46 54 53 33 5f 56  ata = 1 + FTS3_V
11600 41 52 49 4e 54 5f 4d 41 58 3b 0a 20 20 70 4e 65  ARINT_MAX;.  pNe
11610 77 2d 3e 61 44 61 74 61 20 3d 20 28 63 68 61 72  w->aData = (char
11620 20 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 0a 20 20   *)&pNew[1];..  
11630 69 66 28 20 70 54 72 65 65 20 29 7b 0a 20 20 20  if( pTree ){.   
11640 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 50   SegmentNode *pP
11650 61 72 65 6e 74 20 3d 20 70 54 72 65 65 2d 3e 70  arent = pTree->p
11660 50 61 72 65 6e 74 3b 0a 20 20 20 20 72 63 20 3d  Parent;.    rc =
11670 20 66 74 73 33 4e 6f 64 65 41 64 64 54 65 72 6d   fts3NodeAddTerm
11680 28 70 2c 20 26 70 50 61 72 65 6e 74 2c 20 69 73  (p, &pParent, is
11690 43 6f 70 79 54 65 72 6d 2c 20 7a 54 65 72 6d 2c  CopyTerm, zTerm,
116a0 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28   nTerm);.    if(
116b0 20 70 54 72 65 65 2d 3e 70 50 61 72 65 6e 74 3d   pTree->pParent=
116c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 54 72 65  =0 ){.      pTre
116d0 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61  e->pParent = pPa
116e0 72 65 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rent;.    }.    
116f0 70 54 72 65 65 2d 3e 70 52 69 67 68 74 20 3d 20  pTree->pRight = 
11700 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  pNew;.    pNew->
11710 70 4c 65 66 74 6d 6f 73 74 20 3d 20 70 54 72 65  pLeftmost = pTre
11720 65 2d 3e 70 4c 65 66 74 6d 6f 73 74 3b 0a 20 20  e->pLeftmost;.  
11730 20 20 70 4e 65 77 2d 3e 70 50 61 72 65 6e 74 20    pNew->pParent 
11740 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 70  = pParent;.    p
11750 4e 65 77 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 70  New->zMalloc = p
11760 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20  Tree->zMalloc;. 
11770 20 20 20 70 4e 65 77 2d 3e 6e 4d 61 6c 6c 6f 63     pNew->nMalloc
11780 20 3d 20 70 54 72 65 65 2d 3e 6e 4d 61 6c 6c 6f   = pTree->nMallo
11790 63 3b 0a 20 20 20 20 70 54 72 65 65 2d 3e 7a 4d  c;.    pTree->zM
117a0 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 65 6c  alloc = 0;.  }el
117b0 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4c  se{.    pNew->pL
117c0 65 66 74 6d 6f 73 74 20 3d 20 70 4e 65 77 3b 0a  eftmost = pNew;.
117d0 20 20 20 20 72 63 20 3d 20 66 74 73 33 4e 6f 64      rc = fts3Nod
117e0 65 41 64 64 54 65 72 6d 28 70 2c 20 26 70 4e 65  eAddTerm(p, &pNe
117f0 77 2c 20 69 73 43 6f 70 79 54 65 72 6d 2c 20 7a  w, isCopyTerm, z
11800 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 20 0a 20  Term, nTerm); . 
11810 20 7d 0a 0a 20 20 2a 70 70 54 72 65 65 20 3d 20   }..  *ppTree = 
11820 70 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 72  pNew;.  return r
11830 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  c;.}../*.** Help
11840 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er function for 
11850 66 74 73 33 4e 6f 64 65 57 72 69 74 65 28 29 2e  fts3NodeWrite().
11860 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
11870 74 73 33 54 72 65 65 46 69 6e 69 73 68 4e 6f 64  ts3TreeFinishNod
11880 65 28 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65  e(.  SegmentNode
11890 20 2a 70 54 72 65 65 2c 20 0a 20 20 69 6e 74 20   *pTree, .  int 
118a0 69 48 65 69 67 68 74 2c 20 0a 20 20 73 71 6c 69  iHeight, .  sqli
118b0 74 65 33 5f 69 6e 74 36 34 20 69 4c 65 66 74 43  te3_int64 iLeftC
118c0 68 69 6c 64 0a 29 7b 0a 20 20 69 6e 74 20 6e 53  hild.){.  int nS
118d0 74 61 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20  tart;.  assert( 
118e0 69 48 65 69 67 68 74 3e 3d 31 20 26 26 20 69 48  iHeight>=1 && iH
118f0 65 69 67 68 74 3c 31 32 38 20 29 3b 0a 20 20 6e  eight<128 );.  n
11900 53 74 61 72 74 20 3d 20 46 54 53 33 5f 56 41 52  Start = FTS3_VAR
11910 49 4e 54 5f 4d 41 58 20 2d 20 73 71 6c 69 74 65  INT_MAX - sqlite
11920 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 69  3Fts3VarintLen(i
11930 4c 65 66 74 43 68 69 6c 64 29 3b 0a 20 20 70 54  LeftChild);.  pT
11940 72 65 65 2d 3e 61 44 61 74 61 5b 6e 53 74 61 72  ree->aData[nStar
11950 74 5d 20 3d 20 28 63 68 61 72 29 69 48 65 69 67  t] = (char)iHeig
11960 68 74 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73  ht;.  sqlite3Fts
11970 33 50 75 74 56 61 72 69 6e 74 28 26 70 54 72 65  3PutVarint(&pTre
11980 65 2d 3e 61 44 61 74 61 5b 6e 53 74 61 72 74 2b  e->aData[nStart+
11990 31 5d 2c 20 69 4c 65 66 74 43 68 69 6c 64 29 3b  1], iLeftChild);
119a0 0a 20 20 72 65 74 75 72 6e 20 6e 53 74 61 72 74  .  return nStart
119b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
119c0 20 74 68 65 20 62 75 66 66 65 72 20 66 6f 72 20   the buffer for 
119d0 74 68 65 20 73 65 67 6d 65 6e 74 20 6e 6f 64 65  the segment node
119e0 20 70 54 72 65 65 20 61 6e 64 20 61 6c 6c 20 6f   pTree and all o
119f0 66 20 69 74 73 20 70 65 65 72 73 20 74 6f 20 74  f its peers to t
11a00 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  he.** database. 
11a10 54 68 65 6e 20 63 61 6c 6c 20 74 68 69 73 20 66  Then call this f
11a20 75 6e 63 74 69 6f 6e 20 72 65 63 75 72 73 69 76  unction recursiv
11a30 65 6c 79 20 74 6f 20 77 72 69 74 65 20 74 68 65  ely to write the
11a40 20 70 61 72 65 6e 74 20 6f 66 20 0a 2a 2a 20 70   parent of .** p
11a50 54 72 65 65 20 61 6e 64 20 69 74 73 20 70 65 65  Tree and its pee
11a60 72 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  rs to the databa
11a70 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70  se. .**.** Excep
11a80 74 2c 20 69 66 20 70 54 72 65 65 20 69 73 20 61  t, if pTree is a
11a90 20 72 6f 6f 74 20 6e 6f 64 65 2c 20 64 6f 20 6e   root node, do n
11aa0 6f 74 20 77 72 69 74 65 20 69 74 20 74 6f 20 74  ot write it to t
11ab0 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 6e 73  he database. Ins
11ac0 74 65 61 64 2c 0a 2a 2a 20 73 65 74 20 6f 75 74  tead,.** set out
11ad0 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 2a 70  put variables *p
11ae0 61 52 6f 6f 74 20 61 6e 64 20 2a 70 6e 52 6f 6f  aRoot and *pnRoo
11af0 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  t to contain the
11b00 20 72 6f 6f 74 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a   root node..**.*
11b10 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
11b20 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
11b30 74 75 72 6e 65 64 20 61 6e 64 20 6f 75 74 70 75  turned and outpu
11b40 74 20 76 61 72 69 61 62 6c 65 20 2a 70 69 4c 61  t variable *piLa
11b50 73 74 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  st is.** set to 
11b60 74 68 65 20 6c 61 72 67 65 73 74 20 62 6c 6f 63  the largest bloc
11b70 6b 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74  kid written to t
11b80 68 65 20 64 61 74 61 62 61 73 65 20 28 6f 72 20  he database (or 
11b90 7a 65 72 6f 20 69 66 20 6e 6f 0a 2a 2a 20 62 6c  zero if no.** bl
11ba0 6f 63 6b 73 20 77 65 72 65 20 77 72 69 74 74 65  ocks were writte
11bb0 6e 20 74 6f 20 74 68 65 20 64 62 29 2e 20 4f 74  n to the db). Ot
11bc0 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69  herwise, an SQLi
11bd0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
11be0 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a   .** returned..*
11bf0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
11c00 33 4e 6f 64 65 57 72 69 74 65 28 0a 20 20 46 74  3NodeWrite(.  Ft
11c10 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
11c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11c30 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68   Virtual table h
11c40 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 65 67 6d 65  andle */.  Segme
11c50 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65 2c 20 20  ntNode *pTree,  
11c60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
11c70 67 6d 65 6e 74 4e 6f 64 65 20 68 61 6e 64 6c 65  gmentNode handle
11c80 20 2a 2f 0a 20 20 69 6e 74 20 69 48 65 69 67 68   */.  int iHeigh
11c90 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
11ca0 20 20 20 20 20 20 2f 2a 20 48 65 69 67 68 74 20        /* Height 
11cb0 6f 66 20 74 68 69 73 20 6e 6f 64 65 20 69 6e 20  of this node in 
11cc0 74 72 65 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tree */.  sqlite
11cd0 33 5f 69 6e 74 36 34 20 69 4c 65 61 66 2c 20 20  3_int64 iLeaf,  
11ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f            /* Blo
11cf0 63 6b 20 69 64 20 6f 66 20 66 69 72 73 74 20 6c  ck id of first l
11d00 65 61 66 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71  eaf node */.  sq
11d10 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 46 72 65  lite3_int64 iFre
11d20 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
11d30 20 42 6c 6f 63 6b 20 69 64 20 6f 66 20 6e 65 78   Block id of nex
11d40 74 20 66 72 65 65 20 73 6c 6f 74 20 69 6e 20 25  t free slot in %
11d50 5f 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 73  _segments */.  s
11d60 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
11d70 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Last,          /
11d80 2a 20 4f 55 54 3a 20 42 6c 6f 63 6b 20 69 64 20  * OUT: Block id 
11d90 6f 66 20 6c 61 73 74 20 65 6e 74 72 79 20 77 72  of last entry wr
11da0 69 74 74 65 6e 20 2a 2f 0a 20 20 63 68 61 72 20  itten */.  char 
11db0 2a 2a 70 61 52 6f 6f 74 2c 20 20 20 20 20 20 20  **paRoot,       
11dc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
11dd0 54 3a 20 44 61 74 61 20 66 6f 72 20 72 6f 6f 74  T: Data for root
11de0 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   node */.  int *
11df0 70 6e 52 6f 6f 74 20 20 20 20 20 20 20 20 20 20  pnRoot          
11e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
11e10 54 3a 20 53 69 7a 65 20 6f 66 20 72 6f 6f 74 20  T: Size of root 
11e20 6e 6f 64 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  node in bytes */
11e30 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
11e40 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
11e50 20 21 70 54 72 65 65 2d 3e 70 50 61 72 65 6e 74   !pTree->pParent
11e60 20 29 7b 0a 20 20 20 20 2f 2a 20 52 6f 6f 74 20   ){.    /* Root 
11e70 6e 6f 64 65 20 6f 66 20 74 68 65 20 74 72 65 65  node of the tree
11e80 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 74  . */.    int nSt
11e90 61 72 74 20 3d 20 66 74 73 33 54 72 65 65 46 69  art = fts3TreeFi
11ea0 6e 69 73 68 4e 6f 64 65 28 70 54 72 65 65 2c 20  nishNode(pTree, 
11eb0 69 48 65 69 67 68 74 2c 20 69 4c 65 61 66 29 3b  iHeight, iLeaf);
11ec0 0a 20 20 20 20 2a 70 69 4c 61 73 74 20 3d 20 69  .    *piLast = i
11ed0 46 72 65 65 2d 31 3b 0a 20 20 20 20 2a 70 6e 52  Free-1;.    *pnR
11ee0 6f 6f 74 20 3d 20 70 54 72 65 65 2d 3e 6e 44 61  oot = pTree->nDa
11ef0 74 61 20 2d 20 6e 53 74 61 72 74 3b 0a 20 20 20  ta - nStart;.   
11f00 20 2a 70 61 52 6f 6f 74 20 3d 20 26 70 54 72 65   *paRoot = &pTre
11f10 65 2d 3e 61 44 61 74 61 5b 6e 53 74 61 72 74 5d  e->aData[nStart]
11f20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53  ;.  }else{.    S
11f30 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 49 74 65  egmentNode *pIte
11f40 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  r;.    sqlite3_i
11f50 6e 74 36 34 20 69 4e 65 78 74 46 72 65 65 20 3d  nt64 iNextFree =
11f60 20 69 46 72 65 65 3b 0a 20 20 20 20 73 71 6c 69   iFree;.    sqli
11f70 74 65 33 5f 69 6e 74 36 34 20 69 4e 65 78 74 4c  te3_int64 iNextL
11f80 65 61 66 20 3d 20 69 4c 65 61 66 3b 0a 20 20 20  eaf = iLeaf;.   
11f90 20 66 6f 72 28 70 49 74 65 72 3d 70 54 72 65 65   for(pIter=pTree
11fa0 2d 3e 70 4c 65 66 74 6d 6f 73 74 3b 20 70 49 74  ->pLeftmost; pIt
11fb0 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  er && rc==SQLITE
11fc0 5f 4f 4b 3b 20 70 49 74 65 72 3d 70 49 74 65 72  _OK; pIter=pIter
11fd0 2d 3e 70 52 69 67 68 74 29 7b 0a 20 20 20 20 20  ->pRight){.     
11fe0 20 69 6e 74 20 6e 53 74 61 72 74 20 3d 20 66 74   int nStart = ft
11ff0 73 33 54 72 65 65 46 69 6e 69 73 68 4e 6f 64 65  s3TreeFinishNode
12000 28 70 49 74 65 72 2c 20 69 48 65 69 67 68 74 2c  (pIter, iHeight,
12010 20 69 4e 65 78 74 4c 65 61 66 29 3b 0a 20 20 20   iNextLeaf);.   
12020 20 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20     int nWrite = 
12030 70 49 74 65 72 2d 3e 6e 44 61 74 61 20 2d 20 6e  pIter->nData - n
12040 53 74 61 72 74 3b 0a 20 20 0a 20 20 20 20 20 20  Start;.  .      
12050 72 63 20 3d 20 66 74 73 33 57 72 69 74 65 53 65  rc = fts3WriteSe
12060 67 6d 65 6e 74 28 70 2c 20 69 4e 65 78 74 46 72  gment(p, iNextFr
12070 65 65 2c 20 26 70 49 74 65 72 2d 3e 61 44 61 74  ee, &pIter->aDat
12080 61 5b 6e 53 74 61 72 74 5d 2c 20 6e 57 72 69 74  a[nStart], nWrit
12090 65 29 3b 0a 20 20 20 20 20 20 69 4e 65 78 74 46  e);.      iNextF
120a0 72 65 65 2b 2b 3b 0a 20 20 20 20 20 20 69 4e 65  ree++;.      iNe
120b0 78 74 4c 65 61 66 20 2b 3d 20 28 70 49 74 65 72  xtLeaf += (pIter
120c0 2d 3e 6e 45 6e 74 72 79 2b 31 29 3b 0a 20 20 20  ->nEntry+1);.   
120d0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
120e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
120f0 20 20 61 73 73 65 72 74 28 20 69 4e 65 78 74 4c    assert( iNextL
12100 65 61 66 3d 3d 69 46 72 65 65 20 29 3b 0a 20 20  eaf==iFree );.  
12110 20 20 20 20 72 63 20 3d 20 66 74 73 33 4e 6f 64      rc = fts3Nod
12120 65 57 72 69 74 65 28 0a 20 20 20 20 20 20 20 20  eWrite(.        
12130 20 20 70 2c 20 70 54 72 65 65 2d 3e 70 50 61 72    p, pTree->pPar
12140 65 6e 74 2c 20 69 48 65 69 67 68 74 2b 31 2c 20  ent, iHeight+1, 
12150 69 46 72 65 65 2c 20 69 4e 65 78 74 46 72 65 65  iFree, iNextFree
12160 2c 20 70 69 4c 61 73 74 2c 20 70 61 52 6f 6f 74  , piLast, paRoot
12170 2c 20 70 6e 52 6f 6f 74 0a 20 20 20 20 20 20 29  , pnRoot.      )
12180 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
12190 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
121a0 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  ** Free all memo
121b0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61  ry allocations a
121c0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
121d0 68 65 20 74 72 65 65 20 70 54 72 65 65 2e 0a 2a  he tree pTree..*
121e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
121f0 73 33 4e 6f 64 65 46 72 65 65 28 53 65 67 6d 65  s3NodeFree(Segme
12200 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65 29 7b 0a  ntNode *pTree){.
12210 20 20 69 66 28 20 70 54 72 65 65 20 29 7b 0a 20    if( pTree ){. 
12220 20 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a     SegmentNode *
12230 70 20 3d 20 70 54 72 65 65 2d 3e 70 4c 65 66 74  p = pTree->pLeft
12240 6d 6f 73 74 3b 0a 20 20 20 20 66 74 73 33 4e 6f  most;.    fts3No
12250 64 65 46 72 65 65 28 70 2d 3e 70 50 61 72 65 6e  deFree(p->pParen
12260 74 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  t);.    while( p
12270 20 29 7b 0a 20 20 20 20 20 20 53 65 67 6d 65 6e   ){.      Segmen
12280 74 4e 6f 64 65 20 2a 70 52 69 67 68 74 20 3d 20  tNode *pRight = 
12290 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  p->pRight;.     
122a0 20 69 66 28 20 70 2d 3e 61 44 61 74 61 21 3d 28   if( p->aData!=(
122b0 63 68 61 72 20 2a 29 26 70 5b 31 5d 20 29 7b 0a  char *)&p[1] ){.
122c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
122d0 66 72 65 65 28 70 2d 3e 61 44 61 74 61 29 3b 0a  free(p->aData);.
122e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
122f0 73 65 72 74 28 20 70 52 69 67 68 74 3d 3d 30 20  sert( pRight==0 
12300 7c 7c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 3d 3d 30  || p->zMalloc==0
12310 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
12320 33 5f 66 72 65 65 28 70 2d 3e 7a 4d 61 6c 6c 6f  3_free(p->zMallo
12330 63 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  c);.      sqlite
12340 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
12350 20 70 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20   p = pRight;.   
12360 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
12370 41 64 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68  Add a term to th
12380 65 20 73 65 67 6d 65 6e 74 20 62 65 69 6e 67 20  e segment being 
12390 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74  constructed by t
123a0 68 65 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72  he SegmentWriter
123b0 20 6f 62 6a 65 63 74 0a 2a 2a 20 2a 70 70 57 72   object.** *ppWr
123c0 69 74 65 72 2e 20 57 68 65 6e 20 61 64 64 69 6e  iter. When addin
123d0 67 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  g the first term
123e0 20 74 6f 20 61 20 73 65 67 6d 65 6e 74 2c 20 2a   to a segment, *
123f0 70 70 57 72 69 74 65 72 20 73 68 6f 75 6c 64 0a  ppWriter should.
12400 2a 2a 20 62 65 20 70 61 73 73 65 64 20 4e 55 4c  ** be passed NUL
12410 4c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  L. This function
12420 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74 65 20 61   will allocate a
12430 20 6e 65 77 20 53 65 67 6d 65 6e 74 57 72 69 74   new SegmentWrit
12440 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64  er object.** and
12450 20 72 65 74 75 72 6e 20 69 74 20 76 69 61 20 74   return it via t
12460 68 65 20 69 6e 70 75 74 2f 6f 75 74 70 75 74 20  he input/output 
12470 76 61 72 69 61 62 6c 65 20 2a 70 70 57 72 69 74  variable *ppWrit
12480 65 72 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  er in this case.
12490 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
124a0 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
124b0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
124c0 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74  erwise, an SQLit
124d0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
124e0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
124f0 53 65 67 57 72 69 74 65 72 41 64 64 28 0a 20 20  SegWriterAdd(.  
12500 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
12510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12520 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  /* Virtual table
12530 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 65 67   handle */.  Seg
12540 6d 65 6e 74 57 72 69 74 65 72 20 2a 2a 70 70 57  mentWriter **ppW
12550 72 69 74 65 72 2c 20 20 20 20 20 20 20 2f 2a 20  riter,       /* 
12560 49 4e 2f 4f 55 54 3a 20 53 65 67 6d 65 6e 74 57  IN/OUT: SegmentW
12570 72 69 74 65 72 20 68 61 6e 64 6c 65 20 2a 2f 20  riter handle */ 
12580 0a 20 20 69 6e 74 20 69 73 43 6f 70 79 54 65 72  .  int isCopyTer
12590 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
125a0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 62 75     /* True if bu
125b0 66 66 65 72 20 7a 54 65 72 6d 20 6d 75 73 74 20  ffer zTerm must 
125c0 62 65 20 63 6f 70 69 65 64 20 2a 2f 0a 20 20 63  be copied */.  c
125d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
125e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
125f0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
12600 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
12610 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  erm */.  int nTe
12620 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
12630 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
12640 20 6f 66 20 74 65 72 6d 20 69 6e 20 62 79 74 65   of term in byte
12650 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
12660 72 20 2a 61 44 6f 63 6c 69 73 74 2c 20 20 20 20  r *aDoclist,    
12670 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
12680 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74  r to buffer cont
12690 61 69 6e 69 6e 67 20 64 6f 63 6c 69 73 74 20 2a  aining doclist *
126a0 2f 0a 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74  /.  int nDoclist
126b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126c0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
126d0 6f 63 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20  oclist in bytes 
126e0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 72 65  */.){.  int nPre
126f0 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  fix;            
12700 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
12710 6f 66 20 74 65 72 6d 20 70 72 65 66 69 78 20 69  of term prefix i
12720 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
12730 20 6e 53 75 66 66 69 78 3b 20 20 20 20 20 20 20   nSuffix;       
12740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12750 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 73 75 66  Size of term suf
12760 66 69 78 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  fix in bytes */.
12770 20 20 69 6e 74 20 6e 52 65 71 3b 20 20 20 20 20    int nReq;     
12780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12790 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
127a0 79 74 65 73 20 72 65 71 75 69 72 65 64 20 6f 6e  ytes required on
127b0 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20   leaf page */.  
127c0 69 6e 74 20 6e 44 61 74 61 3b 0a 20 20 53 65 67  int nData;.  Seg
127d0 6d 65 6e 74 57 72 69 74 65 72 20 2a 70 57 72 69  mentWriter *pWri
127e0 74 65 72 20 3d 20 2a 70 70 57 72 69 74 65 72 3b  ter = *ppWriter;
127f0 0a 0a 20 20 69 66 28 20 21 70 57 72 69 74 65 72  ..  if( !pWriter
12800 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
12810 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
12820 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 20 20 2f 2a   *pStmt;..    /*
12830 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 53 65   Allocate the Se
12840 67 6d 65 6e 74 57 72 69 74 65 72 20 73 74 72 75  gmentWriter stru
12850 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 70 57 72  cture */.    pWr
12860 69 74 65 72 20 3d 20 28 53 65 67 6d 65 6e 74 57  iter = (SegmentW
12870 72 69 74 65 72 20 2a 29 73 71 6c 69 74 65 33 5f  riter *)sqlite3_
12880 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 53 65  malloc(sizeof(Se
12890 67 6d 65 6e 74 57 72 69 74 65 72 29 29 3b 0a 20  gmentWriter));. 
128a0 20 20 20 69 66 28 20 21 70 57 72 69 74 65 72 20     if( !pWriter 
128b0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
128c0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d 73 65  NOMEM;.    memse
128d0 74 28 70 57 72 69 74 65 72 2c 20 30 2c 20 73 69  t(pWriter, 0, si
128e0 7a 65 6f 66 28 53 65 67 6d 65 6e 74 57 72 69 74  zeof(SegmentWrit
128f0 65 72 29 29 3b 0a 20 20 20 20 2a 70 70 57 72 69  er));.    *ppWri
12900 74 65 72 20 3d 20 70 57 72 69 74 65 72 3b 0a 0a  ter = pWriter;..
12910 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20      /* Allocate 
12920 61 20 62 75 66 66 65 72 20 69 6e 20 77 68 69 63  a buffer in whic
12930 68 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20  h to accumulate 
12940 64 61 74 61 20 2a 2f 0a 20 20 20 20 70 57 72 69  data */.    pWri
12950 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 28 63 68  ter->aData = (ch
12960 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ar *)sqlite3_mal
12970 6c 6f 63 28 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65  loc(p->nNodeSize
12980 29 3b 0a 20 20 20 20 69 66 28 20 21 70 57 72 69  );.    if( !pWri
12990 74 65 72 2d 3e 61 44 61 74 61 20 29 20 72 65 74  ter->aData ) ret
129a0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
129b0 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e  ;.    pWriter->n
129c0 53 69 7a 65 20 3d 20 70 2d 3e 6e 4e 6f 64 65 53  Size = p->nNodeS
129d0 69 7a 65 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  ize;..    /* Fin
129e0 64 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 20  d the next free 
129f0 62 6c 6f 63 6b 69 64 20 69 6e 20 74 68 65 20 25  blockid in the %
12a00 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20  _segments table 
12a10 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  */.    rc = fts3
12a20 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 4e  SqlStmt(p, SQL_N
12a30 45 58 54 5f 53 45 47 4d 45 4e 54 53 5f 49 44 2c  EXT_SEGMENTS_ID,
12a40 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
12a50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12a60 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
12a70 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
12a80 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
12a90 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
12aa0 20 70 57 72 69 74 65 72 2d 3e 69 46 72 65 65 20   pWriter->iFree 
12ab0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
12ac0 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 30 29  _int64(pStmt, 0)
12ad0 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d  ;.      pWriter-
12ae0 3e 69 46 69 72 73 74 20 3d 20 70 57 72 69 74 65  >iFirst = pWrite
12af0 72 2d 3e 69 46 72 65 65 3b 0a 20 20 20 20 7d 0a  r->iFree;.    }.
12b00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12b10 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
12b20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12b30 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
12b40 3b 0a 20 20 7d 0a 20 20 6e 44 61 74 61 20 3d 20  ;.  }.  nData = 
12b50 70 57 72 69 74 65 72 2d 3e 6e 44 61 74 61 3b 0a  pWriter->nData;.
12b60 0a 20 20 6e 50 72 65 66 69 78 20 3d 20 66 74 73  .  nPrefix = fts
12b70 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28  3PrefixCompress(
12b80 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d 2c 20  pWriter->zTerm, 
12b90 70 57 72 69 74 65 72 2d 3e 6e 54 65 72 6d 2c 20  pWriter->nTerm, 
12ba0 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  zTerm, nTerm);. 
12bb0 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d   nSuffix = nTerm
12bc0 2d 6e 50 72 65 66 69 78 3b 0a 0a 20 20 2f 2a 20  -nPrefix;..  /* 
12bd0 49 66 20 6e 53 75 66 66 69 78 20 69 73 20 7a 65  If nSuffix is ze
12be0 72 6f 20 6f 72 20 6c 65 73 73 2c 20 74 68 65 6e  ro or less, then
12bf0 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 20 6d 75 73   zTerm/nTerm mus
12c00 74 20 62 65 20 61 20 70 72 65 66 69 78 20 6f 66  t be a prefix of
12c10 20 0a 20 20 2a 2a 20 70 57 72 69 74 65 72 2d 3e   .  ** pWriter->
12c20 7a 54 65 72 6d 2f 70 57 72 69 74 65 72 2d 3e 6e  zTerm/pWriter->n
12c30 54 65 72 6d 2e 20 69 2e 65 2e 20 6d 75 73 74 20  Term. i.e. must 
12c40 62 65 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 6c  be equal to or l
12c50 65 73 73 20 74 68 61 6e 20 77 68 65 6e 0a 20 20  ess than when.  
12c60 2a 2a 20 63 6f 6d 70 61 72 65 64 20 77 69 74 68  ** compared with
12c70 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f   BINARY collatio
12c80 6e 2e 20 54 68 69 73 20 69 6e 64 69 63 61 74 65  n. This indicate
12c90 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a  s corruption.  *
12ca0 2f 0a 20 20 69 66 28 20 6e 53 75 66 66 69 78 3c  /.  if( nSuffix<
12cb0 3d 30 20 29 20 72 65 74 75 72 6e 20 46 54 53 5f  =0 ) return FTS_
12cc0 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 0a 20  CORRUPT_VTAB;.. 
12cd0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
12ce0 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 61 72  ow many bytes ar
12cf0 65 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  e required by th
12d00 69 73 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a  is new entry */.
12d10 20 20 6e 52 65 71 20 3d 20 73 71 6c 69 74 65 33    nReq = sqlite3
12d20 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 50  Fts3VarintLen(nP
12d30 72 65 66 69 78 29 20 2b 20 20 20 20 2f 2a 20 76  refix) +    /* v
12d40 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67  arint containing
12d50 20 70 72 65 66 69 78 20 73 69 7a 65 20 2a 2f 0a   prefix size */.
12d60 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 56      sqlite3Fts3V
12d70 61 72 69 6e 74 4c 65 6e 28 6e 53 75 66 66 69 78  arintLen(nSuffix
12d80 29 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 76  ) +         /* v
12d90 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67  arint containing
12da0 20 73 75 66 66 69 78 20 73 69 7a 65 20 2a 2f 0a   suffix size */.
12db0 20 20 20 20 6e 53 75 66 66 69 78 20 2b 20 20 20      nSuffix +   
12dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12dd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12de0 65 72 6d 20 73 75 66 66 69 78 20 2a 2f 0a 20 20  erm suffix */.  
12df0 20 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72    sqlite3Fts3Var
12e00 69 6e 74 4c 65 6e 28 6e 44 6f 63 6c 69 73 74 29  intLen(nDoclist)
12e10 20 2b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a   +        /* Siz
12e20 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 2a 2f 0a  e of doclist */.
12e30 20 20 20 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20      nDoclist;   
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
12e60 6f 63 6c 69 73 74 20 64 61 74 61 20 2a 2f 0a 0a  oclist data */..
12e70 20 20 69 66 28 20 6e 44 61 74 61 3e 30 20 26 26    if( nData>0 &&
12e80 20 6e 44 61 74 61 2b 6e 52 65 71 3e 70 2d 3e 6e   nData+nReq>p->n
12e90 4e 6f 64 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  NodeSize ){.    
12ea0 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 2f 2a 20  int rc;..    /* 
12eb0 54 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  The current leaf
12ec0 20 6e 6f 64 65 20 69 73 20 66 75 6c 6c 2e 20 57   node is full. W
12ed0 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74  rite it out to t
12ee0 68 65 20 64 61 74 61 62 61 73 65 2e 20 2a 2f 0a  he database. */.
12ef0 20 20 20 20 72 63 20 3d 20 66 74 73 33 57 72 69      rc = fts3Wri
12f00 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 57 72  teSegment(p, pWr
12f10 69 74 65 72 2d 3e 69 46 72 65 65 2b 2b 2c 20 70  iter->iFree++, p
12f20 57 72 69 74 65 72 2d 3e 61 44 61 74 61 2c 20 6e  Writer->aData, n
12f30 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 72  Data);.    if( r
12f40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
12f50 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 2d  eturn rc;.    p-
12f60 3e 6e 4c 65 61 66 41 64 64 2b 2b 3b 0a 0a 20 20  >nLeafAdd++;..  
12f70 20 20 2f 2a 20 41 64 64 20 74 68 65 20 63 75 72    /* Add the cur
12f80 72 65 6e 74 20 74 65 72 6d 20 74 6f 20 74 68 65  rent term to the
12f90 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20 74   interior node t
12fa0 72 65 65 2e 20 54 68 65 20 74 65 72 6d 20 61 64  ree. The term ad
12fb0 64 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68  ded to.    ** th
12fc0 65 20 69 6e 74 65 72 69 6f 72 20 74 72 65 65 20  e interior tree 
12fd0 6d 75 73 74 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  must:.    **.   
12fe0 20 2a 2a 20 20 20 61 29 20 62 65 20 67 72 65 61   **   a) be grea
12ff0 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72  ter than the lar
13000 67 65 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65  gest term on the
13010 20 6c 65 61 66 20 6e 6f 64 65 20 6a 75 73 74 20   leaf node just 
13020 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 20  written.    **  
13030 20 20 20 20 74 6f 20 74 68 65 20 64 61 74 61 62      to the datab
13040 61 73 65 20 28 73 74 69 6c 6c 20 61 76 61 69 6c  ase (still avail
13050 61 62 6c 65 20 69 6e 20 70 57 72 69 74 65 72 2d  able in pWriter-
13060 3e 7a 54 65 72 6d 29 2c 20 61 6e 64 0a 20 20 20  >zTerm), and.   
13070 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 62 29 20   **.    **   b) 
13080 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  be less than or 
13090 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 65 72  equal to the ter
130a0 6d 20 61 62 6f 75 74 20 74 6f 20 62 65 20 61 64  m about to be ad
130b0 64 65 64 20 74 6f 20 74 68 65 20 6e 65 77 0a 20  ded to the new. 
130c0 20 20 20 2a 2a 20 20 20 20 20 20 6c 65 61 66 20     **      leaf 
130d0 6e 6f 64 65 20 28 7a 54 65 72 6d 2f 6e 54 65 72  node (zTerm/nTer
130e0 6d 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  m)..    **.    *
130f0 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
13100 2c 20 69 74 20 6d 75 73 74 20 62 65 20 74 68 65  , it must be the
13110 20 70 72 65 66 69 78 20 6f 66 20 7a 54 65 72 6d   prefix of zTerm
13120 20 31 20 62 79 74 65 20 6c 6f 6e 67 65 72 20 74   1 byte longer t
13130 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  han.    ** the c
13140 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 28 69 66  ommon prefix (if
13150 20 61 6e 79 29 20 6f 66 20 7a 54 65 72 6d 20 61   any) of zTerm a
13160 6e 64 20 70 57 72 69 74 65 72 2d 3e 7a 54 65 72  nd pWriter->zTer
13170 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  m..    */.    as
13180 73 65 72 74 28 20 6e 50 72 65 66 69 78 3c 6e 54  sert( nPrefix<nT
13190 65 72 6d 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  erm );.    rc = 
131a0 66 74 73 33 4e 6f 64 65 41 64 64 54 65 72 6d 28  fts3NodeAddTerm(
131b0 70 2c 20 26 70 57 72 69 74 65 72 2d 3e 70 54 72  p, &pWriter->pTr
131c0 65 65 2c 20 69 73 43 6f 70 79 54 65 72 6d 2c 20  ee, isCopyTerm, 
131d0 7a 54 65 72 6d 2c 20 6e 50 72 65 66 69 78 2b 31  zTerm, nPrefix+1
131e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
131f0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
13200 6e 20 72 63 3b 0a 0a 20 20 20 20 6e 44 61 74 61  n rc;..    nData
13210 20 3d 20 30 3b 0a 20 20 20 20 70 57 72 69 74 65   = 0;.    pWrite
13220 72 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 0a 20  r->nTerm = 0;.. 
13230 20 20 20 6e 50 72 65 66 69 78 20 3d 20 30 3b 0a     nPrefix = 0;.
13240 20 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54      nSuffix = nT
13250 65 72 6d 3b 0a 20 20 20 20 6e 52 65 71 20 3d 20  erm;.    nReq = 
13260 31 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  1 +             
13270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13280 20 2f 2a 20 76 61 72 69 6e 74 20 63 6f 6e 74 61   /* varint conta
13290 69 6e 69 6e 67 20 70 72 65 66 69 78 20 73 69 7a  ining prefix siz
132a0 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  e */.      sqlit
132b0 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28  e3Fts3VarintLen(
132c0 6e 54 65 72 6d 29 20 2b 20 20 20 20 20 20 20 20  nTerm) +        
132d0 20 2f 2a 20 76 61 72 69 6e 74 20 63 6f 6e 74 61   /* varint conta
132e0 69 6e 69 6e 67 20 73 75 66 66 69 78 20 73 69 7a  ining suffix siz
132f0 65 20 2a 2f 0a 20 20 20 20 20 20 6e 54 65 72 6d  e */.      nTerm
13300 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
13310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13320 20 2f 2a 20 54 65 72 6d 20 73 75 66 66 69 78 20   /* Term suffix 
13330 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
13340 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 44  Fts3VarintLen(nD
13350 6f 63 6c 69 73 74 29 20 2b 20 20 20 20 20 20 2f  oclist) +      /
13360 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73  * Size of doclis
13370 74 20 2a 2f 0a 20 20 20 20 20 20 6e 44 6f 63 6c  t */.      nDocl
13380 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
13390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133a0 20 2f 2a 20 44 6f 63 6c 69 73 74 20 64 61 74 61   /* Doclist data
133b0 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e   */.  }..  /* In
133c0 63 72 65 61 73 65 20 74 68 65 20 74 6f 74 61 6c  crease the total
133d0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
133e0 20 77 72 69 74 74 65 6e 20 74 6f 20 61 63 63 6f   written to acco
133f0 75 6e 74 20 66 6f 72 20 74 68 65 20 6e 65 77 20  unt for the new 
13400 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 70 57 72 69  entry. */.  pWri
13410 74 65 72 2d 3e 6e 4c 65 61 66 44 61 74 61 20 2b  ter->nLeafData +
13420 3d 20 6e 52 65 71 3b 0a 0a 20 20 2f 2a 20 49 66  = nReq;..  /* If
13430 20 74 68 65 20 62 75 66 66 65 72 20 63 75 72 72   the buffer curr
13440 65 6e 74 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  ently allocated 
13450 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72  is too small for
13460 20 74 68 69 73 20 65 6e 74 72 79 2c 20 72 65 61   this entry, rea
13470 6c 6c 6f 63 0a 20 20 2a 2a 20 74 68 65 20 62 75  lloc.  ** the bu
13480 66 66 65 72 20 74 6f 20 6d 61 6b 65 20 69 74 20  ffer to make it 
13490 6c 61 72 67 65 20 65 6e 6f 75 67 68 2e 0a 20 20  large enough..  
134a0 2a 2f 0a 20 20 69 66 28 20 6e 52 65 71 3e 70 57  */.  if( nReq>pW
134b0 72 69 74 65 72 2d 3e 6e 53 69 7a 65 20 29 7b 0a  riter->nSize ){.
134c0 20 20 20 20 63 68 61 72 20 2a 61 4e 65 77 20 3d      char *aNew =
134d0 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
134e0 28 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 2c  (pWriter->aData,
134f0 20 6e 52 65 71 29 3b 0a 20 20 20 20 69 66 28 20   nReq);.    if( 
13500 21 61 4e 65 77 20 29 20 72 65 74 75 72 6e 20 53  !aNew ) return S
13510 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
13520 20 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 20   pWriter->aData 
13530 3d 20 61 4e 65 77 3b 0a 20 20 20 20 70 57 72 69  = aNew;.    pWri
13540 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 6e 52 65  ter->nSize = nRe
13550 71 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  q;.  }.  assert(
13560 20 6e 44 61 74 61 2b 6e 52 65 71 3c 3d 70 57 72   nData+nReq<=pWr
13570 69 74 65 72 2d 3e 6e 53 69 7a 65 20 29 3b 0a 0a  iter->nSize );..
13580 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
13590 70 72 65 66 69 78 2d 63 6f 6d 70 72 65 73 73 65  prefix-compresse
135a0 64 20 74 65 72 6d 20 61 6e 64 20 64 6f 63 6c 69  d term and docli
135b0 73 74 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  st to the buffer
135c0 2e 20 2a 2f 0a 20 20 6e 44 61 74 61 20 2b 3d 20  . */.  nData += 
135d0 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
135e0 72 69 6e 74 28 26 70 57 72 69 74 65 72 2d 3e 61  rint(&pWriter->a
135f0 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 6e 50 72  Data[nData], nPr
13600 65 66 69 78 29 3b 0a 20 20 6e 44 61 74 61 20 2b  efix);.  nData +
13610 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74  = sqlite3Fts3Put
13620 56 61 72 69 6e 74 28 26 70 57 72 69 74 65 72 2d  Varint(&pWriter-
13630 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 6e  >aData[nData], n
13640 53 75 66 66 69 78 29 3b 0a 20 20 6d 65 6d 63 70  Suffix);.  memcp
13650 79 28 26 70 57 72 69 74 65 72 2d 3e 61 44 61 74  y(&pWriter->aDat
13660 61 5b 6e 44 61 74 61 5d 2c 20 26 7a 54 65 72 6d  a[nData], &zTerm
13670 5b 6e 50 72 65 66 69 78 5d 2c 20 6e 53 75 66 66  [nPrefix], nSuff
13680 69 78 29 3b 0a 20 20 6e 44 61 74 61 20 2b 3d 20  ix);.  nData += 
13690 6e 53 75 66 66 69 78 3b 0a 20 20 6e 44 61 74 61  nSuffix;.  nData
136a0 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50   += sqlite3Fts3P
136b0 75 74 56 61 72 69 6e 74 28 26 70 57 72 69 74 65  utVarint(&pWrite
136c0 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c  r->aData[nData],
136d0 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 6d 65   nDoclist);.  me
136e0 6d 63 70 79 28 26 70 57 72 69 74 65 72 2d 3e 61  mcpy(&pWriter->a
136f0 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 61 44 6f  Data[nData], aDo
13700 63 6c 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29  clist, nDoclist)
13710 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 44 61  ;.  pWriter->nDa
13720 74 61 20 3d 20 6e 44 61 74 61 20 2b 20 6e 44 6f  ta = nData + nDo
13730 63 6c 69 73 74 3b 0a 0a 20 20 2f 2a 20 53 61 76  clist;..  /* Sav
13740 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65  e the current te
13750 72 6d 20 73 6f 20 74 68 61 74 20 69 74 20 63 61  rm so that it ca
13760 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70 72 65  n be used to pre
13770 66 69 78 2d 63 6f 6d 70 72 65 73 73 20 74 68 65  fix-compress the
13780 20 6e 65 78 74 2e 0a 20 20 2a 2a 20 49 66 20 74   next..  ** If t
13790 68 65 20 69 73 43 6f 70 79 54 65 72 6d 20 70 61  he isCopyTerm pa
137a0 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2c  rameter is true,
137b0 20 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72   then the buffer
137c0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 20   pointed to by. 
137d0 20 2a 2a 20 7a 54 65 72 6d 20 69 73 20 74 72 61   ** zTerm is tra
137e0 6e 73 69 65 6e 74 2c 20 73 6f 20 74 61 6b 65 20  nsient, so take 
137f0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 74 65  a copy of the te
13800 72 6d 20 64 61 74 61 2e 20 4f 74 68 65 72 77 69  rm data. Otherwi
13810 73 65 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 73 74  se, just.  ** st
13820 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ore a copy of th
13830 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
13840 20 20 69 66 28 20 69 73 43 6f 70 79 54 65 72 6d    if( isCopyTerm
13850 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 54 65 72   ){.    if( nTer
13860 6d 3e 70 57 72 69 74 65 72 2d 3e 6e 4d 61 6c 6c  m>pWriter->nMall
13870 6f 63 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  oc ){.      char
13880 20 2a 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *zNew = sqlite3
13890 5f 72 65 61 6c 6c 6f 63 28 70 57 72 69 74 65 72  _realloc(pWriter
138a0 2d 3e 7a 4d 61 6c 6c 6f 63 2c 20 6e 54 65 72 6d  ->zMalloc, nTerm
138b0 2a 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  *2);.      if( !
138c0 7a 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  zNew ){.        
138d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
138e0 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
138f0 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 4d 61 6c     pWriter->nMal
13900 6c 6f 63 20 3d 20 6e 54 65 72 6d 2a 32 3b 0a 20  loc = nTerm*2;. 
13910 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 7a 4d       pWriter->zM
13920 61 6c 6c 6f 63 20 3d 20 7a 4e 65 77 3b 0a 20 20  alloc = zNew;.  
13930 20 20 20 20 70 57 72 69 74 65 72 2d 3e 7a 54 65      pWriter->zTe
13940 72 6d 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20 7d  rm = zNew;.    }
13950 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57 72  .    assert( pWr
13960 69 74 65 72 2d 3e 7a 54 65 72 6d 3d 3d 70 57 72  iter->zTerm==pWr
13970 69 74 65 72 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 3b  iter->zMalloc );
13980 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 57 72 69  .    memcpy(pWri
13990 74 65 72 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65 72  ter->zTerm, zTer
139a0 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 7d 65 6c  m, nTerm);.  }el
139b0 73 65 7b 0a 20 20 20 20 70 57 72 69 74 65 72 2d  se{.    pWriter-
139c0 3e 7a 54 65 72 6d 20 3d 20 28 63 68 61 72 20 2a  >zTerm = (char *
139d0 29 7a 54 65 72 6d 3b 0a 20 20 7d 0a 20 20 70 57  )zTerm;.  }.  pW
139e0 72 69 74 65 72 2d 3e 6e 54 65 72 6d 20 3d 20 6e  riter->nTerm = n
139f0 54 65 72 6d 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Term;..  return 
13a00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
13a10 0a 2a 2a 20 46 6c 75 73 68 20 61 6c 6c 20 64 61  .** Flush all da
13a20 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
13a30 74 68 20 74 68 65 20 53 65 67 6d 65 6e 74 57 72  th the SegmentWr
13a40 69 74 65 72 20 6f 62 6a 65 63 74 20 70 57 72 69  iter object pWri
13a50 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61  ter to the.** da
13a60 74 61 62 61 73 65 2e 20 54 68 69 73 20 66 75 6e  tabase. This fun
13a70 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 63 61  ction must be ca
13a80 6c 6c 65 64 20 61 66 74 65 72 20 61 6c 6c 20 74  lled after all t
13a90 65 72 6d 73 20 68 61 76 65 20 62 65 65 6e 20 61  erms have been a
13aa0 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73  dded.** to the s
13ab0 65 67 6d 65 6e 74 20 75 73 69 6e 67 20 66 74 73  egment using fts
13ac0 33 53 65 67 57 72 69 74 65 72 41 64 64 28 29 2e  3SegWriterAdd().
13ad0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
13ae0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a 20  SQLITE_OK is.** 
13af0 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
13b00 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ise, an SQLite e
13b10 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
13b20 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67  atic int fts3Seg
13b30 57 72 69 74 65 72 46 6c 75 73 68 28 0a 20 20 46  WriterFlush(.  F
13b40 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
13b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13b60 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * Virtual table 
13b70 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 65 67 6d  handle */.  Segm
13b80 65 6e 74 57 72 69 74 65 72 20 2a 70 57 72 69 74  entWriter *pWrit
13b90 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53  er,         /* S
13ba0 65 67 6d 65 6e 74 57 72 69 74 65 72 20 74 6f 20  egmentWriter to 
13bb0 66 6c 75 73 68 20 74 6f 20 74 68 65 20 64 62 20  flush to the db 
13bc0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
13bd0 36 34 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20  64 iLevel,      
13be0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
13bf0 72 20 27 6c 65 76 65 6c 27 20 63 6f 6c 75 6d 6e  r 'level' column
13c00 20 6f 66 20 25 5f 73 65 67 64 69 72 20 2a 2f 0a   of %_segdir */.
13c10 20 20 69 6e 74 20 69 49 64 78 20 20 20 20 20 20    int iIdx      
13c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c30 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 27    /* Value for '
13c40 69 64 78 27 20 63 6f 6c 75 6d 6e 20 6f 66 20 25  idx' column of %
13c50 5f 73 65 67 64 69 72 20 2a 2f 0a 29 7b 0a 20 20  _segdir */.){.  
13c60 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
13c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c80 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
13c90 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  /.  if( pWriter-
13ca0 3e 70 54 72 65 65 20 29 7b 0a 20 20 20 20 73 71  >pTree ){.    sq
13cb0 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 61 73  lite3_int64 iLas
13cc0 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4c  t = 0;      /* L
13cd0 61 72 67 65 73 74 20 62 6c 6f 63 6b 20 69 64 20  argest block id 
13ce0 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62  written to datab
13cf0 61 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ase */.    sqlit
13d00 65 33 5f 69 6e 74 36 34 20 69 4c 61 73 74 4c 65  e3_int64 iLastLe
13d10 61 66 3b 20 20 20 20 20 20 2f 2a 20 4c 61 72 67  af;      /* Larg
13d20 65 73 74 20 6c 65 61 66 20 62 6c 6f 63 6b 20 69  est leaf block i
13d30 64 20 77 72 69 74 74 65 6e 20 74 6f 20 64 62 20  d written to db 
13d40 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 6f  */.    char *zRo
13d50 6f 74 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20  ot = NULL;      
13d60 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
13d70 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
13d80 6e 69 6e 67 20 72 6f 6f 74 20 6e 6f 64 65 20 2a  ning root node *
13d90 2f 0a 20 20 20 20 69 6e 74 20 6e 52 6f 6f 74 20  /.    int nRoot 
13da0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
13db0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
13dc0 75 66 66 65 72 20 7a 52 6f 6f 74 20 2a 2f 0a 0a  uffer zRoot */..
13dd0 20 20 20 20 69 4c 61 73 74 4c 65 61 66 20 3d 20      iLastLeaf = 
13de0 70 57 72 69 74 65 72 2d 3e 69 46 72 65 65 3b 0a  pWriter->iFree;.
13df0 20 20 20 20 72 63 20 3d 20 66 74 73 33 57 72 69      rc = fts3Wri
13e00 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 57 72  teSegment(p, pWr
13e10 69 74 65 72 2d 3e 69 46 72 65 65 2b 2b 2c 20 70  iter->iFree++, p
13e20 57 72 69 74 65 72 2d 3e 61 44 61 74 61 2c 20 70  Writer->aData, p
13e30 57 72 69 74 65 72 2d 3e 6e 44 61 74 61 29 3b 0a  Writer->nData);.
13e40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
13e50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
13e60 63 20 3d 20 66 74 73 33 4e 6f 64 65 57 72 69 74  c = fts3NodeWrit
13e70 65 28 70 2c 20 70 57 72 69 74 65 72 2d 3e 70 54  e(p, pWriter->pT
13e80 72 65 65 2c 20 31 2c 0a 20 20 20 20 20 20 20 20  ree, 1,.        
13e90 20 20 70 57 72 69 74 65 72 2d 3e 69 46 69 72 73    pWriter->iFirs
13ea0 74 2c 20 70 57 72 69 74 65 72 2d 3e 69 46 72 65  t, pWriter->iFre
13eb0 65 2c 20 26 69 4c 61 73 74 2c 20 26 7a 52 6f 6f  e, &iLast, &zRoo
13ec0 74 2c 20 26 6e 52 6f 6f 74 29 3b 0a 20 20 20 20  t, &nRoot);.    
13ed0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
13ee0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13ef0 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65 53   rc = fts3WriteS
13f00 65 67 64 69 72 28 70 2c 20 69 4c 65 76 65 6c 2c  egdir(p, iLevel,
13f10 20 69 49 64 78 2c 20 0a 20 20 20 20 20 20 20 20   iIdx, .        
13f20 20 20 70 57 72 69 74 65 72 2d 3e 69 46 69 72 73    pWriter->iFirs
13f30 74 2c 20 69 4c 61 73 74 4c 65 61 66 2c 20 69 4c  t, iLastLeaf, iL
13f40 61 73 74 2c 20 70 57 72 69 74 65 72 2d 3e 6e 4c  ast, pWriter->nL
13f50 65 61 66 44 61 74 61 2c 20 7a 52 6f 6f 74 2c 20  eafData, zRoot, 
13f60 6e 52 6f 6f 74 29 3b 0a 20 20 20 20 7d 0a 20 20  nRoot);.    }.  
13f70 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
13f80 65 20 65 6e 74 69 72 65 20 74 72 65 65 20 66 69  e entire tree fi
13f90 74 73 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 6e  ts on the root n
13fa0 6f 64 65 2e 20 57 72 69 74 65 20 69 74 20 74 6f  ode. Write it to
13fb0 20 74 68 65 20 73 65 67 64 69 72 20 74 61 62 6c   the segdir tabl
13fc0 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66  e. */.    rc = f
13fd0 74 73 33 57 72 69 74 65 53 65 67 64 69 72 28 70  ts3WriteSegdir(p
13fe0 2c 20 69 4c 65 76 65 6c 2c 20 69 49 64 78 2c 20  , iLevel, iIdx, 
13ff0 0a 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30  .        0, 0, 0
14000 2c 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66  , pWriter->nLeaf
14010 44 61 74 61 2c 20 70 57 72 69 74 65 72 2d 3e 61  Data, pWriter->a
14020 44 61 74 61 2c 20 70 57 72 69 74 65 72 2d 3e 6e  Data, pWriter->n
14030 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Data);.  }.  p->
14040 6e 4c 65 61 66 41 64 64 2b 2b 3b 0a 20 20 72 65  nLeafAdd++;.  re
14050 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14060 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6d 65  * Release all me
14070 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68 65  mory held by the
14080 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 6f   SegmentWriter o
14090 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
140a0 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 61 72  the .** first ar
140b0 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
140c0 63 20 76 6f 69 64 20 66 74 73 33 53 65 67 57 72  c void fts3SegWr
140d0 69 74 65 72 46 72 65 65 28 53 65 67 6d 65 6e 74  iterFree(Segment
140e0 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29  Writer *pWriter)
140f0 7b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 20  {.  if( pWriter 
14100 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
14110 72 65 65 28 70 57 72 69 74 65 72 2d 3e 61 44 61  ree(pWriter->aDa
14120 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ta);.    sqlite3
14130 5f 66 72 65 65 28 70 57 72 69 74 65 72 2d 3e 7a  _free(pWriter->z
14140 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 66 74 73  Malloc);.    fts
14150 33 4e 6f 64 65 46 72 65 65 28 70 57 72 69 74 65  3NodeFree(pWrite
14160 72 2d 3e 70 54 72 65 65 29 3b 0a 20 20 20 20 73  r->pTree);.    s
14170 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57 72 69  qlite3_free(pWri
14180 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ter);.  }.}../*.
14190 2a 2a 20 54 68 65 20 66 69 72 73 74 20 76 61 6c  ** The first val
141a0 75 65 20 69 6e 20 74 68 65 20 61 70 56 61 6c 5b  ue in the apVal[
141b0 5d 20 61 72 72 61 79 20 69 73 20 61 73 73 75 6d  ] array is assum
141c0 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 6e  ed to contain an
141d0 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 20 54 68 69   integer..** Thi
141e0 73 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73  s function tests
141f0 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 20   if there exist 
14200 61 6e 79 20 64 6f 63 75 6d 65 6e 74 73 20 77 69  any documents wi
14210 74 68 20 64 6f 63 69 64 20 76 61 6c 75 65 73 20  th docid values 
14220 74 68 61 74 0a 2a 2a 20 61 72 65 20 64 69 66 66  that.** are diff
14230 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 61 74 20  erent from that 
14240 69 6e 74 65 67 65 72 2e 20 69 2e 65 2e 20 69 66  integer. i.e. if
14250 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 64 6f   deleting the do
14260 63 75 6d 65 6e 74 20 77 69 74 68 20 64 6f 63 69  cument with doci
14270 64 0a 2a 2a 20 70 52 6f 77 69 64 20 77 6f 75 6c  d.** pRowid woul
14280 64 20 6d 65 61 6e 20 74 68 65 20 46 54 53 33 20  d mean the FTS3 
14290 74 61 62 6c 65 20 77 65 72 65 20 65 6d 70 74 79  table were empty
142a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
142b0 73 73 66 75 6c 2c 20 2a 70 69 73 45 6d 70 74 79  ssful, *pisEmpty
142c0 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
142d0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
142e0 65 6d 70 74 79 20 65 78 63 65 70 74 20 66 6f 72  empty except for
142f0 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 20 70 52 6f  .** document pRo
14300 77 69 64 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  wid, or false ot
14310 68 65 72 77 69 73 65 2c 20 61 6e 64 20 53 51 4c  herwise, and SQL
14320 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
14330 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72  ed. If an.** err
14340 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51  or occurs, an SQ
14350 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
14360 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
14370 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49  static int fts3I
14380 73 45 6d 70 74 79 28 46 74 73 33 54 61 62 6c 65  sEmpty(Fts3Table
14390 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c   *p, sqlite3_val
143a0 75 65 20 2a 70 52 6f 77 69 64 2c 20 69 6e 74 20  ue *pRowid, int 
143b0 2a 70 69 73 45 6d 70 74 79 29 7b 0a 20 20 73 71  *pisEmpty){.  sq
143c0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
143d0 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  t;.  int rc;.  i
143e0 66 28 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62  f( p->zContentTb
143f0 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 75  l ){.    /* If u
14400 73 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  sing the content
14410 3d 78 78 78 20 6f 70 74 69 6f 6e 2c 20 61 73 73  =xxx option, ass
14420 75 6d 65 20 74 68 65 20 74 61 62 6c 65 20 69 73  ume the table is
14430 20 6e 65 76 65 72 20 65 6d 70 74 79 20 2a 2f 0a   never empty */.
14440 20 20 20 20 2a 70 69 73 45 6d 70 74 79 20 3d 20      *pisEmpty = 
14450 30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  0;.    rc = SQLI
14460 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
14470 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c      rc = fts3Sql
14480 53 74 6d 74 28 70 2c 20 53 51 4c 5f 49 53 5f 45  Stmt(p, SQL_IS_E
14490 4d 50 54 59 2c 20 26 70 53 74 6d 74 2c 20 26 70  MPTY, &pStmt, &p
144a0 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28 20  Rowid);.    if( 
144b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
144c0 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
144d0 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
144e0 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
144f0 20 20 20 20 20 20 2a 70 69 73 45 6d 70 74 79 20        *pisEmpty 
14500 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
14510 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  _int(pStmt, 0);.
14520 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
14530 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
14540 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20  (pStmt);.    }. 
14550 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
14560 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 6e  }../*.** Set *pn
14570 4d 61 78 20 74 6f 20 74 68 65 20 6c 61 72 67 65  Max to the large
14580 73 74 20 73 65 67 6d 65 6e 74 20 6c 65 76 65 6c  st segment level
14590 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
145a0 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 2a   for the index.*
145b0 2a 20 69 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  * iIndex..**.** 
145c0 53 65 67 6d 65 6e 74 20 6c 65 76 65 6c 73 20 61  Segment levels a
145d0 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
145e0 20 27 6c 65 76 65 6c 27 20 63 6f 6c 75 6d 6e 20   'level' column 
145f0 6f 66 20 74 68 65 20 25 5f 73 65 67 64 69 72 20  of the %_segdir 
14600 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  table..**.** Ret
14610 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
14620 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
14630 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
14640 63 6f 64 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  code if not..*/.
14650 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53  static int fts3S
14660 65 67 6d 65 6e 74 4d 61 78 4c 65 76 65 6c 28 0a  egmentMaxLevel(.
14670 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
14680 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 0a  .  int iLangid,.
14690 20 20 69 6e 74 20 69 49 6e 64 65 78 2c 20 0a 20    int iIndex, . 
146a0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
146b0 70 6e 4d 61 78 0a 29 7b 0a 20 20 73 71 6c 69 74  pnMax.){.  sqlit
146c0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
146d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
146e0 72 74 28 20 69 49 6e 64 65 78 3e 3d 30 20 26 26  rt( iIndex>=0 &&
146f0 20 69 49 6e 64 65 78 3c 70 2d 3e 6e 49 6e 64 65   iIndex<p->nInde
14700 78 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 70  x );..  /* Set p
14710 53 74 6d 74 20 74 6f 20 74 68 65 20 63 6f 6d 70  Stmt to the comp
14720 69 6c 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 3a  iled version of:
14730 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c  .  **.  **   SEL
14740 45 43 54 20 6d 61 78 28 6c 65 76 65 6c 29 20 46  ECT max(level) F
14750 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69  ROM %Q.'%q_segdi
14760 72 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20 42  r' WHERE level B
14770 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 0a 20  ETWEEN ? AND ?. 
14780 20 2a 2a 0a 20 20 2a 2a 20 28 31 30 32 34 20 69   **.  ** (1024 i
14790 73 20 61 63 74 75 61 6c 6c 79 20 74 68 65 20 76  s actually the v
147a0 61 6c 75 65 20 6f 66 20 6d 61 63 72 6f 20 46 54  alue of macro FT
147b0 53 33 5f 53 45 47 44 49 52 5f 50 52 45 46 49 58  S3_SEGDIR_PREFIX
147c0 4c 45 56 45 4c 5f 53 54 52 29 2e 0a 20 20 2a 2f  LEVEL_STR)..  */
147d0 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
147e0 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43  tmt(p, SQL_SELEC
147f0 54 5f 53 45 47 44 49 52 5f 4d 41 58 5f 4c 45 56  T_SEGDIR_MAX_LEV
14800 45 4c 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  EL, &pStmt, 0);.
14810 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14820 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
14830 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
14840 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20  int64(pStmt, 1, 
14850 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c  getAbsoluteLevel
14860 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e  (p, iLangid, iIn
14870 64 65 78 2c 20 30 29 29 3b 0a 20 20 73 71 6c 69  dex, 0));.  sqli
14880 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
14890 53 74 6d 74 2c 20 32 2c 20 0a 20 20 20 20 20 20  Stmt, 2, .      
148a0 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c  getAbsoluteLevel
148b0 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e  (p, iLangid, iIn
148c0 64 65 78 2c 20 46 54 53 33 5f 53 45 47 44 49 52  dex, FTS3_SEGDIR
148d0 5f 4d 41 58 4c 45 56 45 4c 2d 31 29 0a 20 20 29  _MAXLEVEL-1).  )
148e0 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52  ;.  if( SQLITE_R
148f0 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
14900 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 2a  (pStmt) ){.    *
14910 70 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 5f  pnMax = sqlite3_
14920 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74  column_int64(pSt
14930 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  mt, 0);.  }.  re
14940 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 72 65 73  turn sqlite3_res
14950 65 74 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a  et(pStmt);.}../*
14960 0a 2a 2a 20 69 41 62 73 4c 65 76 65 6c 20 69 73  .** iAbsLevel is
14970 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 6c 65 76   an absolute lev
14980 65 6c 20 74 68 61 74 20 6d 61 79 20 62 65 20 61  el that may be a
14990 73 73 75 6d 65 64 20 74 6f 20 65 78 69 73 74 20  ssumed to exist 
149a0 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 64 61  within.** the da
149b0 74 61 62 61 73 65 2e 20 54 68 69 73 20 66 75 6e  tabase. This fun
149c0 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20  ction checks if 
149d0 69 74 20 69 73 20 74 68 65 20 6c 61 72 67 65 73  it is the larges
149e0 74 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 0a 2a  t level number.*
149f0 2a 20 77 69 74 68 69 6e 20 69 74 73 20 69 6e 64  * within its ind
14a00 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20  ex. Assuming no 
14a10 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
14a20 62 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 31  bMax is set to 1
14a30 20 69 66 0a 2a 2a 20 69 41 62 73 4c 65 76 65 6c   if.** iAbsLevel
14a40 20 69 73 20 69 6e 64 65 65 64 20 74 68 65 20 6c   is indeed the l
14a50 61 72 67 65 73 74 20 6c 65 76 65 6c 2c 20 6f 72  argest level, or
14a60 20 30 20 6f 74 68 65 72 77 69 73 65 2c 20 61 6e   0 otherwise, an
14a70 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  d SQLITE_OK.** i
14a80 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
14a90 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
14aa0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
14ab0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
14ac0 65 0a 2a 2a 20 66 69 6e 61 6c 20 76 61 6c 75 65  e.** final value
14ad0 20 6f 66 20 2a 70 62 4d 61 78 20 69 73 20 75 6e   of *pbMax is un
14ae0 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
14af0 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 6d 65  ic int fts3Segme
14b00 6e 74 49 73 4d 61 78 4c 65 76 65 6c 28 46 74 73  ntIsMaxLevel(Fts
14b10 33 54 61 62 6c 65 20 2a 70 2c 20 69 36 34 20 69  3Table *p, i64 i
14b20 41 62 73 4c 65 76 65 6c 2c 20 69 6e 74 20 2a 70  AbsLevel, int *p
14b30 62 4d 61 78 29 7b 0a 0a 20 20 2f 2a 20 53 65 74  bMax){..  /* Set
14b40 20 70 53 74 6d 74 20 74 6f 20 74 68 65 20 63 6f   pStmt to the co
14b50 6d 70 69 6c 65 64 20 76 65 72 73 69 6f 6e 20 6f  mpiled version o
14b60 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53  f:.  **.  **   S
14b70 45 4c 45 43 54 20 6d 61 78 28 6c 65 76 65 6c 29  ELECT max(level)
14b80 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67   FROM %Q.'%q_seg
14b90 64 69 72 27 20 57 48 45 52 45 20 6c 65 76 65 6c  dir' WHERE level
14ba0 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f   BETWEEN ? AND ?
14bb0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 31 30 32 34  .  **.  ** (1024
14bc0 20 69 73 20 61 63 74 75 61 6c 6c 79 20 74 68 65   is actually the
14bd0 20 76 61 6c 75 65 20 6f 66 20 6d 61 63 72 6f 20   value of macro 
14be0 46 54 53 33 5f 53 45 47 44 49 52 5f 50 52 45 46  FTS3_SEGDIR_PREF
14bf0 49 58 4c 45 56 45 4c 5f 53 54 52 29 2e 0a 20 20  IXLEVEL_STR)..  
14c00 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
14c10 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
14c20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
14c30 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53  (p, SQL_SELECT_S
14c40 45 47 44 49 52 5f 4d 41 58 5f 4c 45 56 45 4c 2c  EGDIR_MAX_LEVEL,
14c50 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69   &pStmt, 0);.  i
14c60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14c70 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
14c80 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
14c90 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 69 41 62  64(pStmt, 1, iAb
14ca0 73 4c 65 76 65 6c 2b 31 29 3b 0a 20 20 73 71 6c  sLevel+1);.  sql
14cb0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
14cc0 70 53 74 6d 74 2c 20 32 2c 20 0a 20 20 20 20 20  pStmt, 2, .     
14cd0 20 28 28 69 41 62 73 4c 65 76 65 6c 2f 46 54 53   ((iAbsLevel/FTS
14ce0 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45  3_SEGDIR_MAXLEVE
14cf0 4c 29 2b 31 29 20 2a 20 46 54 53 33 5f 53 45 47  L)+1) * FTS3_SEG
14d00 44 49 52 5f 4d 41 58 4c 45 56 45 4c 0a 20 20 29  DIR_MAXLEVEL.  )
14d10 3b 0a 0a 20 20 2a 70 62 4d 61 78 20 3d 20 30 3b  ;..  *pbMax = 0;
14d20 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f  .  if( SQLITE_RO
14d30 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
14d40 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 2a 70  pStmt) ){.    *p
14d50 62 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 5f 63  bMax = sqlite3_c
14d60 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74  olumn_type(pStmt
14d70 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  , 0)==SQLITE_NUL
14d80 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  L;.  }.  return 
14d90 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
14da0 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  tmt);.}../*.** D
14db0 65 6c 65 74 65 20 61 6c 6c 20 65 6e 74 72 69 65  elete all entrie
14dc0 73 20 69 6e 20 74 68 65 20 25 5f 73 65 67 6d 65  s in the %_segme
14dd0 6e 74 73 20 74 61 62 6c 65 20 61 73 73 6f 63 69  nts table associ
14de0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 73 65  ated with the se
14df0 67 6d 65 6e 74 0a 2a 2a 20 6f 70 65 6e 65 64 20  gment.** opened 
14e00 77 69 74 68 20 73 65 67 2d 72 65 61 64 65 72 20  with seg-reader 
14e10 70 53 65 67 2e 20 54 68 69 73 20 66 75 6e 63 74  pSeg. This funct
14e20 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 66 66  ion does not aff
14e30 65 63 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ect the contents
14e40 0a 2a 2a 20 6f 66 20 74 68 65 20 25 5f 73 65 67  .** of the %_seg
14e50 64 69 72 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  dir table..*/.st
14e60 61 74 69 63 20 69 6e 74 20 66 74 73 33 44 65 6c  atic int fts3Del
14e70 65 74 65 53 65 67 6d 65 6e 74 28 0a 20 20 46 74  eteSegment(.  Ft
14e80 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
14e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14ea0 20 46 54 53 20 74 61 62 6c 65 20 68 61 6e 64 6c   FTS table handl
14eb0 65 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 52 65  e */.  Fts3SegRe
14ec0 61 64 65 72 20 2a 70 53 65 67 20 20 20 20 20 20  ader *pSeg      
14ed0 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e         /* Segmen
14ee0 74 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 29  t to delete */.)
14ef0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
14f00 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
14f10 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
14f20 64 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 65 67  de */.  if( pSeg
14f30 2d 3e 69 53 74 61 72 74 42 6c 6f 63 6b 20 29 7b  ->iStartBlock ){
14f40 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
14f50 74 20 2a 70 44 65 6c 65 74 65 3b 20 20 20 20 20  t *pDelete;     
14f60 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d     /* SQL statem
14f70 65 6e 74 20 74 6f 20 64 65 6c 65 74 65 20 72 6f  ent to delete ro
14f80 77 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66  ws */.    rc = f
14f90 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51  ts3SqlStmt(p, SQ
14fa0 4c 5f 44 45 4c 45 54 45 5f 53 45 47 4d 45 4e 54  L_DELETE_SEGMENT
14fb0 53 5f 52 41 4e 47 45 2c 20 26 70 44 65 6c 65 74  S_RANGE, &pDelet
14fc0 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
14fd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
14fe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
14ff0 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c 65 74 65  nd_int64(pDelete
15000 2c 20 31 2c 20 70 53 65 67 2d 3e 69 53 74 61 72  , 1, pSeg->iStar
15010 74 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 73  tBlock);.      s
15020 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
15030 34 28 70 44 65 6c 65 74 65 2c 20 32 2c 20 70 53  4(pDelete, 2, pS
15040 65 67 2d 3e 69 45 6e 64 42 6c 6f 63 6b 29 3b 0a  eg->iEndBlock);.
15050 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
15060 65 70 28 70 44 65 6c 65 74 65 29 3b 0a 20 20 20  ep(pDelete);.   
15070 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
15080 72 65 73 65 74 28 70 44 65 6c 65 74 65 29 3b 0a  reset(pDelete);.
15090 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
150a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
150b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
150c0 20 75 73 65 64 20 61 66 74 65 72 20 6d 65 72 67   used after merg
150d0 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 73 65 67  ing multiple seg
150e0 6d 65 6e 74 73 20 69 6e 74 6f 20 61 20 73 69 6e  ments into a sin
150f0 67 6c 65 20 6c 61 72 67 65 0a 2a 2a 20 73 65 67  gle large.** seg
15100 6d 65 6e 74 20 74 6f 20 64 65 6c 65 74 65 20 74  ment to delete t
15110 68 65 20 6f 6c 64 2c 20 6e 6f 77 20 72 65 64 75  he old, now redu
15120 6e 64 61 6e 74 2c 20 73 65 67 6d 65 6e 74 20 62  ndant, segment b
15130 2d 74 72 65 65 73 2e 20 53 70 65 63 69 66 69 63  -trees. Specific
15140 61 6c 6c 79 2c 0a 2a 2a 20 69 74 3a 0a 2a 2a 20  ally,.** it:.** 
15150 0a 2a 2a 20 20 20 31 29 20 44 65 6c 65 74 65 73  .**   1) Deletes
15160 20 61 6c 6c 20 25 5f 73 65 67 6d 65 6e 74 73 20   all %_segments 
15170 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
15180 73 65 67 6d 65 6e 74 73 20 61 73 73 6f 63 69 61  segments associa
15190 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 20  ted with .**    
151a0 20 20 65 61 63 68 20 6f 66 20 74 68 65 20 53 65    each of the Se
151b0 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74 73 20  gReader objects 
151c0 69 6e 20 74 68 65 20 61 72 72 61 79 20 70 61 73  in the array pas
151d0 73 65 64 20 61 73 20 74 68 65 20 74 68 69 72 64  sed as the third
151e0 20 0a 2a 2a 20 20 20 20 20 20 61 72 67 75 6d 65   .**      argume
151f0 6e 74 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  nt, and.**.**   
15200 32 29 20 64 65 6c 65 74 65 73 20 61 6c 6c 20 25  2) deletes all %
15210 5f 73 65 67 64 69 72 20 65 6e 74 72 69 65 73 20  _segdir entries 
15220 77 69 74 68 20 6c 65 76 65 6c 20 69 4c 65 76 65  with level iLeve
15230 6c 2c 20 6f 72 20 61 6c 6c 20 25 5f 73 65 67 64  l, or all %_segd
15240 69 72 0a 2a 2a 20 20 20 20 20 20 65 6e 74 72 69  ir.**      entri
15250 65 73 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  es regardless of
15260 20 6c 65 76 65 6c 20 69 66 20 28 69 4c 65 76 65   level if (iLeve
15270 6c 3c 30 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  l<0)..**.** SQLI
15280 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
15290 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  d if successful,
152a0 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51   otherwise an SQ
152b0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
152c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
152d0 74 73 33 44 65 6c 65 74 65 53 65 67 64 69 72 28  ts3DeleteSegdir(
152e0 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
152f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15300 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
15310 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
15320 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20 20 20  int iLangid,    
15330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15340 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64 20 2a  /* Language id *
15350 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 2c 20  /.  int iIndex, 
15360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15370 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72      /* Index for
15380 20 70 2d 3e 61 49 6e 64 65 78 20 2a 2f 0a 20 20   p->aIndex */.  
15390 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  int iLevel,     
153a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153b0 2f 2a 20 4c 65 76 65 6c 20 6f 66 20 25 5f 73 65  /* Level of %_se
153c0 67 64 69 72 20 65 6e 74 72 69 65 73 20 74 6f 20  gdir entries to 
153d0 64 65 6c 65 74 65 20 2a 2f 0a 20 20 46 74 73 33  delete */.  Fts3
153e0 53 65 67 52 65 61 64 65 72 20 2a 2a 61 70 53 65  SegReader **apSe
153f0 67 6d 65 6e 74 2c 20 20 20 20 20 20 2f 2a 20 41  gment,      /* A
15400 72 72 61 79 20 6f 66 20 53 65 67 52 65 61 64 65  rray of SegReade
15410 72 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 69  r objects */.  i
15420 6e 74 20 6e 52 65 61 64 65 72 20 20 20 20 20 20  nt nReader      
15430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15440 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20  * Size of array 
15450 61 70 53 65 67 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  apSegment */.){.
15460 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15470 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
15480 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
15490 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
154a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154b0 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
154c0 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
154d0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44  sqlite3_stmt *pD
154e0 65 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20  elete = 0;      
154f0 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  /* SQL statement
15500 20 74 6f 20 64 65 6c 65 74 65 20 72 6f 77 73 20   to delete rows 
15510 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72  */..  for(i=0; r
15520 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
15530 69 3c 6e 52 65 61 64 65 72 3b 20 69 2b 2b 29 7b  i<nReader; i++){
15540 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 65  .    rc = fts3De
15550 6c 65 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 61  leteSegment(p, a
15560 70 53 65 67 6d 65 6e 74 5b 69 5d 29 3b 0a 20 20  pSegment[i]);.  
15570 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
15580 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
15590 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61  urn rc;.  }..  a
155a0 73 73 65 72 74 28 20 69 4c 65 76 65 6c 3e 3d 30  ssert( iLevel>=0
155b0 20 7c 7c 20 69 4c 65 76 65 6c 3d 3d 46 54 53 33   || iLevel==FTS3
155c0 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c 20 29  _SEGCURSOR_ALL )
155d0 3b 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3d 3d  ;.  if( iLevel==
155e0 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 41  FTS3_SEGCURSOR_A
155f0 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  LL ){.    rc = f
15600 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51  ts3SqlStmt(p, SQ
15610 4c 5f 44 45 4c 45 54 45 5f 53 45 47 44 49 52 5f  L_DELETE_SEGDIR_
15620 52 41 4e 47 45 2c 20 26 70 44 65 6c 65 74 65 2c  RANGE, &pDelete,
15630 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
15640 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15650 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
15660 5f 69 6e 74 36 34 28 70 44 65 6c 65 74 65 2c 20  _int64(pDelete, 
15670 31 2c 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65  1, getAbsoluteLe
15680 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20  vel(p, iLangid, 
15690 69 49 6e 64 65 78 2c 20 30 29 29 3b 0a 20 20 20  iIndex, 0));.   
156a0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
156b0 69 6e 74 36 34 28 70 44 65 6c 65 74 65 2c 20 32  int64(pDelete, 2
156c0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74  , .          get
156d0 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c  AbsoluteLevel(p,
156e0 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78   iLangid, iIndex
156f0 2c 20 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41  , FTS3_SEGDIR_MA
15700 58 4c 45 56 45 4c 2d 31 29 0a 20 20 20 20 20 20  XLEVEL-1).      
15710 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
15720 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53  {.    rc = fts3S
15730 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 44 45  qlStmt(p, SQL_DE
15740 4c 45 54 45 5f 53 45 47 44 49 52 5f 4c 45 56 45  LETE_SEGDIR_LEVE
15750 4c 2c 20 26 70 44 65 6c 65 74 65 2c 20 30 29 3b  L, &pDelete, 0);
15760 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
15770 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15780 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
15790 36 34 28 0a 20 20 20 20 20 20 20 20 20 20 70 44  64(.          pD
157a0 65 6c 65 74 65 2c 20 31 2c 20 67 65 74 41 62 73  elete, 1, getAbs
157b0 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c  oluteLevel(p, iL
157c0 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69  angid, iIndex, i
157d0 4c 65 76 65 6c 29 0a 20 20 20 20 20 20 29 3b 0a  Level).      );.
157e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
157f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15800 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
15810 65 70 28 70 44 65 6c 65 74 65 29 3b 0a 20 20 20  ep(pDelete);.   
15820 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
15830 73 65 74 28 70 44 65 6c 65 74 65 29 3b 0a 20 20  set(pDelete);.  
15840 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
15850 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  }../*.** When th
15860 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
15870 61 6c 6c 65 64 2c 20 62 75 66 66 65 72 20 2a 70  alled, buffer *p
15880 70 4c 69 73 74 20 28 73 69 7a 65 20 2a 70 6e 4c  pList (size *pnL
15890 69 73 74 20 62 79 74 65 73 29 20 63 6f 6e 74 61  ist bytes) conta
158a0 69 6e 73 20 0a 2a 2a 20 61 20 70 6f 73 69 74 69  ins .** a positi
158b0 6f 6e 20 6c 69 73 74 20 74 68 61 74 20 6d 61 79  on list that may
158c0 20 28 6f 72 20 6d 61 79 20 6e 6f 74 29 20 66 65   (or may not) fe
158d0 61 74 75 72 65 20 6d 75 6c 74 69 70 6c 65 20 63  ature multiple c
158e0 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 0a 2a 2a 20  olumns. This.** 
158f0 66 75 6e 63 74 69 6f 6e 20 61 64 6a 75 73 74 73  function adjusts
15900 20 74 68 65 20 70 6f 69 6e 74 65 72 20 2a 70 70   the pointer *pp
15910 4c 69 73 74 20 61 6e 64 20 74 68 65 20 6c 65 6e  List and the len
15920 67 74 68 20 2a 70 6e 4c 69 73 74 20 73 6f 20 74  gth *pnList so t
15930 68 61 74 20 74 68 65 79 0a 2a 2a 20 69 64 65 6e  hat they.** iden
15940 74 69 66 79 20 74 68 65 20 73 75 62 73 65 74 20  tify the subset 
15950 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  of the position 
15960 6c 69 73 74 20 74 68 61 74 20 63 6f 72 72 65 73  list that corres
15970 70 6f 6e 64 73 20 74 6f 20 63 6f 6c 75 6d 6e 20  ponds to column 
15980 69 43 6f 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  iCol..**.** If t
15990 68 65 72 65 20 61 72 65 20 6e 6f 20 65 6e 74 72  here are no entr
159a0 69 65 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74  ies in the input
159b0 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 66   position list f
159c0 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20  or column iCol, 
159d0 74 68 65 6e 0a 2a 2a 20 2a 70 6e 4c 69 73 74 20  then.** *pnList 
159e0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 62  is set to zero b
159f0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
15a00 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
15a10 74 65 72 20 62 5a 65 72 6f 20 69 73 20 6e 6f 6e  ter bZero is non
15a20 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20  -zero, then any 
15a30 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 70 75  part of the inpu
15a40 74 20 6c 69 73 74 20 66 6f 6c 6c 6f 77 69 6e 67  t list following
15a50 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74  .** the end of t
15a60 68 65 20 6f 75 74 70 75 74 20 6c 69 73 74 20 69  he output list i
15a70 73 20 7a 65 72 6f 65 64 20 62 65 66 6f 72 65 20  s zeroed before 
15a80 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
15a90 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 43 6f  atic void fts3Co
15aa0 6c 75 6d 6e 46 69 6c 74 65 72 28 0a 20 20 69 6e  lumnFilter(.  in
15ab0 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  t iCol,         
15ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15ad0 20 43 6f 6c 75 6d 6e 20 74 6f 20 66 69 6c 74 65   Column to filte
15ae0 72 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 5a  r on */.  int bZ
15af0 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  ero,            
15b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72            /* Zer
15b10 6f 20 6f 75 74 20 61 6e 79 74 68 69 6e 67 20 66  o out anything f
15b20 6f 6c 6c 6f 77 69 6e 67 20 2a 70 70 4c 69 73 74  ollowing *ppList
15b30 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 4c   */.  char **ppL
15b40 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
15b50 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
15b60 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73 69   Pointer to posi
15b70 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 69  tion list */.  i
15b80 6e 74 20 2a 70 6e 4c 69 73 74 20 20 20 20 20 20  nt *pnList      
15b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15ba0 2a 20 49 4e 2f 4f 55 54 3a 20 53 69 7a 65 20 6f  * IN/OUT: Size o
15bb0 66 20 62 75 66 66 65 72 20 2a 70 70 4c 69 73 74  f buffer *ppList
15bc0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a   in bytes */.){.
15bd0 20 20 63 68 61 72 20 2a 70 4c 69 73 74 20 3d 20    char *pList = 
15be0 2a 70 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 6e  *ppList;.  int n
15bf0 4c 69 73 74 20 3d 20 2a 70 6e 4c 69 73 74 3b 0a  List = *pnList;.
15c00 20 20 63 68 61 72 20 2a 70 45 6e 64 20 3d 20 26    char *pEnd = &
15c10 70 4c 69 73 74 5b 6e 4c 69 73 74 5d 3b 0a 20 20  pList[nList];.  
15c20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30  int iCurrent = 0
15c30 3b 0a 20 20 63 68 61 72 20 2a 70 20 3d 20 70 4c  ;.  char *p = pL
15c40 69 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ist;..  assert( 
15c50 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 77 68 69  iCol>=0 );.  whi
15c60 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 63 68 61  le( 1 ){.    cha
15c70 72 20 63 20 3d 20 30 3b 0a 20 20 20 20 77 68 69  r c = 0;.    whi
15c80 6c 65 28 20 70 3c 70 45 6e 64 20 26 26 20 28 63  le( p<pEnd && (c
15c90 20 7c 20 2a 70 29 26 30 78 46 45 20 29 20 63 20   | *p)&0xFE ) c 
15ca0 3d 20 2a 70 2b 2b 20 26 20 30 78 38 30 3b 0a 20  = *p++ & 0x80;. 
15cb0 20 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d   .    if( iCol==
15cc0 69 43 75 72 72 65 6e 74 20 29 7b 0a 20 20 20 20  iCurrent ){.    
15cd0 20 20 6e 4c 69 73 74 20 3d 20 28 69 6e 74 29 28    nList = (int)(
15ce0 70 20 2d 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  p - pList);.    
15cf0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
15d00 20 20 20 20 6e 4c 69 73 74 20 2d 3d 20 28 69 6e      nList -= (in
15d10 74 29 28 70 20 2d 20 70 4c 69 73 74 29 3b 0a 20  t)(p - pList);. 
15d20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20     pList = p;.  
15d30 20 20 69 66 28 20 6e 4c 69 73 74 3c 3d 30 20 29    if( nList<=0 )
15d40 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
15d50 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 26 70 4c     }.    p = &pL
15d60 69 73 74 5b 31 5d 3b 0a 20 20 20 20 70 20 2b 3d  ist[1];.    p +=
15d70 20 66 74 73 33 47 65 74 56 61 72 69 6e 74 33 32   fts3GetVarint32
15d80 28 70 2c 20 26 69 43 75 72 72 65 6e 74 29 3b 0a  (p, &iCurrent);.
15d90 20 20 7d 0a 0a 20 20 69 66 28 20 62 5a 65 72 6f    }..  if( bZero
15da0 20 26 26 20 28 70 45 6e 64 20 2d 20 26 70 4c 69   && (pEnd - &pLi
15db0 73 74 5b 6e 4c 69 73 74 5d 29 3e 30 29 7b 0a 20  st[nList])>0){. 
15dc0 20 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74     memset(&pList
15dd0 5b 6e 4c 69 73 74 5d 2c 20 30 2c 20 70 45 6e 64  [nList], 0, pEnd
15de0 20 2d 20 26 70 4c 69 73 74 5b 6e 4c 69 73 74 5d   - &pList[nList]
15df0 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 4c 69 73 74  );.  }.  *ppList
15e00 20 3d 20 70 4c 69 73 74 3b 0a 20 20 2a 70 6e 4c   = pList;.  *pnL
15e10 69 73 74 20 3d 20 6e 4c 69 73 74 3b 0a 7d 0a 0a  ist = nList;.}..
15e20 2f 2a 0a 2a 2a 20 43 61 63 68 65 20 64 61 74 61  /*.** Cache data
15e30 20 69 6e 20 74 68 65 20 46 74 73 33 4d 75 6c 74   in the Fts3Mult
15e40 69 53 65 67 52 65 61 64 65 72 2e 61 42 75 66 66  iSegReader.aBuff
15e50 65 72 5b 5d 20 62 75 66 66 65 72 20 28 6f 76 65  er[] buffer (ove
15e60 72 77 72 69 74 69 6e 67 20 61 6e 79 0a 2a 2a 20  rwriting any.** 
15e70 65 78 69 73 74 69 6e 67 20 64 61 74 61 29 2e 20  existing data). 
15e80 47 72 6f 77 20 74 68 65 20 62 75 66 66 65 72 20  Grow the buffer 
15e90 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a  if required..**.
15ea0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
15eb0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
15ec0 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  OK. Otherwise, i
15ed0 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69  f an OOM error i
15ee0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2a  s encountered.**
15ef0 20 74 72 79 69 6e 67 20 74 6f 20 72 65 73 69 7a   trying to resiz
15f00 65 20 74 68 65 20 62 75 66 66 65 72 2c 20 72 65  e the buffer, re
15f10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
15f20 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  M..*/.static int
15f30 20 66 74 73 33 4d 73 72 42 75 66 66 65 72 44 61   fts3MsrBufferDa
15f40 74 61 28 0a 20 20 46 74 73 33 4d 75 6c 74 69 53  ta(.  Fts3MultiS
15f50 65 67 52 65 61 64 65 72 20 2a 70 4d 73 72 2c 20  egReader *pMsr, 
15f60 20 20 20 20 20 20 2f 2a 20 4d 75 6c 74 69 2d 73        /* Multi-s
15f70 65 67 6d 65 6e 74 2d 72 65 61 64 65 72 20 68 61  egment-reader ha
15f80 6e 64 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ndle */.  char *
15f90 70 4c 69 73 74 2c 0a 20 20 69 6e 74 20 6e 4c 69  pList,.  int nLi
15fa0 73 74 0a 29 7b 0a 20 20 69 66 28 20 6e 4c 69 73  st.){.  if( nLis
15fb0 74 3e 70 4d 73 72 2d 3e 6e 42 75 66 66 65 72 20  t>pMsr->nBuffer 
15fc0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65  ){.    char *pNe
15fd0 77 3b 0a 20 20 20 20 70 4d 73 72 2d 3e 6e 42 75  w;.    pMsr->nBu
15fe0 66 66 65 72 20 3d 20 6e 4c 69 73 74 2a 32 3b 0a  ffer = nList*2;.
15ff0 20 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61 72      pNew = (char
16000 20 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   *)sqlite3_reall
16010 6f 63 28 70 4d 73 72 2d 3e 61 42 75 66 66 65 72  oc(pMsr->aBuffer
16020 2c 20 70 4d 73 72 2d 3e 6e 42 75 66 66 65 72 29  , pMsr->nBuffer)
16030 3b 0a 20 20 20 20 69 66 28 20 21 70 4e 65 77 20  ;.    if( !pNew 
16040 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
16050 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 4d 73 72 2d  NOMEM;.    pMsr-
16060 3e 61 42 75 66 66 65 72 20 3d 20 70 4e 65 77 3b  >aBuffer = pNew;
16070 0a 20 20 7d 0a 0a 20 20 6d 65 6d 63 70 79 28 70  .  }..  memcpy(p
16080 4d 73 72 2d 3e 61 42 75 66 66 65 72 2c 20 70 4c  Msr->aBuffer, pL
16090 69 73 74 2c 20 6e 4c 69 73 74 29 3b 0a 20 20 72  ist, nList);.  r
160a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
160b0 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .}..int sqlite3F
160c0 74 73 33 4d 73 72 49 6e 63 72 4e 65 78 74 28 0a  ts3MsrIncrNext(.
160d0 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
160e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160f0 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
16100 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46  le handle */.  F
16110 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
16120 72 20 2a 70 4d 73 72 2c 20 20 20 20 20 20 20 2f  r *pMsr,       /
16130 2a 20 4d 75 6c 74 69 2d 73 65 67 6d 65 6e 74 2d  * Multi-segment-
16140 72 65 61 64 65 72 20 68 61 6e 64 6c 65 20 2a 2f  reader handle */
16150 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
16160 20 2a 70 69 44 6f 63 69 64 2c 20 20 20 20 20 20   *piDocid,      
16170 20 20 20 2f 2a 20 4f 55 54 3a 20 44 6f 63 69 64     /* OUT: Docid
16180 20 76 61 6c 75 65 20 2a 2f 0a 20 20 63 68 61 72   value */.  char
16190 20 2a 2a 70 61 50 6f 73 6c 69 73 74 2c 20 20 20   **paPoslist,   
161a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
161b0 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70  UT: Pointer to p
161c0 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  osition list */.
161d0 20 20 69 6e 74 20 2a 70 6e 50 6f 73 6c 69 73 74    int *pnPoslist
161e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161f0 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f    /* OUT: Size o
16200 66 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  f position list 
16210 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20  in bytes */.){. 
16220 20 69 6e 74 20 6e 4d 65 72 67 65 20 3d 20 70 4d   int nMerge = pM
16230 73 72 2d 3e 6e 41 64 76 61 6e 63 65 3b 0a 20 20  sr->nAdvance;.  
16240 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a  Fts3SegReader **
16250 61 70 53 65 67 6d 65 6e 74 20 3d 20 70 4d 73 72  apSegment = pMsr
16260 2d 3e 61 70 53 65 67 6d 65 6e 74 3b 0a 20 20 69  ->apSegment;.  i
16270 6e 74 20 28 2a 78 43 6d 70 29 28 46 74 73 33 53  nt (*xCmp)(Fts3S
16280 65 67 52 65 61 64 65 72 20 2a 2c 20 46 74 73 33  egReader *, Fts3
16290 53 65 67 52 65 61 64 65 72 20 2a 29 20 3d 20 28  SegReader *) = (
162a0 0a 20 20 20 20 70 2d 3e 62 44 65 73 63 49 64 78  .    p->bDescIdx
162b0 20 3f 20 66 74 73 33 53 65 67 52 65 61 64 65 72   ? fts3SegReader
162c0 44 6f 63 6c 69 73 74 43 6d 70 52 65 76 20 3a 20  DoclistCmpRev : 
162d0 66 74 73 33 53 65 67 52 65 61 64 65 72 44 6f 63  fts3SegReaderDoc
162e0 6c 69 73 74 43 6d 70 0a 20 20 29 3b 0a 0a 20 20  listCmp.  );..  
162f0 69 66 28 20 6e 4d 65 72 67 65 3d 3d 30 20 29 7b  if( nMerge==0 ){
16300 0a 20 20 20 20 2a 70 61 50 6f 73 6c 69 73 74 20  .    *paPoslist 
16310 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
16320 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
16330 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
16340 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
16350 2a 70 53 65 67 3b 0a 20 20 20 20 70 53 65 67 20  *pSeg;.    pSeg 
16360 3d 20 70 4d 73 72 2d 3e 61 70 53 65 67 6d 65 6e  = pMsr->apSegmen
16370 74 5b 30 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70  t[0];..    if( p
16380 53 65 67 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74  Seg->pOffsetList
16390 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 61  ==0 ){.      *pa
163a0 50 6f 73 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20  Poslist = 0;.   
163b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65     break;.    }e
163c0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  lse{.      int r
163d0 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  c;.      char *p
163e0 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  List;.      int 
163f0 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  nList;.      int
16400 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   j;.      sqlite
16410 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 20 3d  3_int64 iDocid =
16420 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 69   apSegment[0]->i
16430 44 6f 63 69 64 3b 0a 0a 20 20 20 20 20 20 72 63  Docid;..      rc
16440 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72   = fts3SegReader
16450 4e 65 78 74 44 6f 63 69 64 28 70 2c 20 61 70 53  NextDocid(p, apS
16460 65 67 6d 65 6e 74 5b 30 5d 2c 20 26 70 4c 69 73  egment[0], &pLis
16470 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20  t, &nList);.    
16480 20 20 6a 20 3d 20 31 3b 0a 20 20 20 20 20 20 77    j = 1;.      w
16490 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
164a0 5f 4f 4b 20 0a 20 20 20 20 20 20 20 20 26 26 20  _OK .        && 
164b0 6a 3c 6e 4d 65 72 67 65 0a 20 20 20 20 20 20 20  j<nMerge.       
164c0 20 26 26 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d   && apSegment[j]
164d0 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 0a 20 20  ->pOffsetList.  
164e0 20 20 20 20 20 20 26 26 20 61 70 53 65 67 6d 65        && apSegme
164f0 6e 74 5b 6a 5d 2d 3e 69 44 6f 63 69 64 3d 3d 69  nt[j]->iDocid==i
16500 44 6f 63 69 64 0a 20 20 20 20 20 20 29 7b 0a 20  Docid.      ){. 
16510 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33         rc = fts3
16520 53 65 67 52 65 61 64 65 72 4e 65 78 74 44 6f 63  SegReaderNextDoc
16530 69 64 28 70 2c 20 61 70 53 65 67 6d 65 6e 74 5b  id(p, apSegment[
16540 6a 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  j], 0, 0);.     
16550 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     j++;.      }.
16560 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
16570 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
16580 20 72 63 3b 0a 20 20 20 20 20 20 66 74 73 33 53   rc;.      fts3S
16590 65 67 52 65 61 64 65 72 53 6f 72 74 28 70 4d 73  egReaderSort(pMs
165a0 72 2d 3e 61 70 53 65 67 6d 65 6e 74 2c 20 6e 4d  r->apSegment, nM
165b0 65 72 67 65 2c 20 6a 2c 20 78 43 6d 70 29 3b 0a  erge, j, xCmp);.
165c0 0a 20 20 20 20 20 20 69 66 28 20 6e 4c 69 73 74  .      if( nList
165d0 3e 30 20 26 26 20 66 74 73 33 53 65 67 52 65 61  >0 && fts3SegRea
165e0 64 65 72 49 73 50 65 6e 64 69 6e 67 28 61 70 53  derIsPending(apS
165f0 65 67 6d 65 6e 74 5b 30 5d 29 20 29 7b 0a 20 20  egment[0]) ){.  
16600 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 4d        rc = fts3M
16610 73 72 42 75 66 66 65 72 44 61 74 61 28 70 4d 73  srBufferData(pMs
16620 72 2c 20 70 4c 69 73 74 2c 20 6e 4c 69 73 74 2b  r, pList, nList+
16630 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
16640 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
16650 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
16660 20 20 20 61 73 73 65 72 74 28 20 28 70 4d 73 72     assert( (pMsr
16670 2d 3e 61 42 75 66 66 65 72 5b 6e 4c 69 73 74 5d  ->aBuffer[nList]
16680 20 26 20 30 78 46 45 29 3d 3d 30 78 30 30 20 29   & 0xFE)==0x00 )
16690 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 20  ;.        pList 
166a0 3d 20 70 4d 73 72 2d 3e 61 42 75 66 66 65 72 3b  = pMsr->aBuffer;
166b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
166c0 69 66 28 20 70 4d 73 72 2d 3e 69 43 6f 6c 46 69  if( pMsr->iColFi
166d0 6c 74 65 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20  lter>=0 ){.     
166e0 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e 46 69 6c     fts3ColumnFil
166f0 74 65 72 28 70 4d 73 72 2d 3e 69 43 6f 6c 46 69  ter(pMsr->iColFi
16700 6c 74 65 72 2c 20 31 2c 20 26 70 4c 69 73 74 2c  lter, 1, &pList,
16710 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20   &nList);.      
16720 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 4c 69  }..      if( nLi
16730 73 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  st>0 ){.        
16740 2a 70 61 50 6f 73 6c 69 73 74 20 3d 20 70 4c 69  *paPoslist = pLi
16750 73 74 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 44  st;.        *piD
16760 6f 63 69 64 20 3d 20 69 44 6f 63 69 64 3b 0a 20  ocid = iDocid;. 
16770 20 20 20 20 20 20 20 2a 70 6e 50 6f 73 6c 69 73         *pnPoslis
16780 74 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20  t = nList;.     
16790 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
167a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
167b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
167c0 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
167d0 74 73 33 53 65 67 52 65 61 64 65 72 53 74 61 72  ts3SegReaderStar
167e0 74 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  t(.  Fts3Table *
167f0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
16800 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
16810 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
16820 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65    Fts3MultiSegRe
16830 61 64 65 72 20 2a 70 43 73 72 2c 20 20 20 20 20  ader *pCsr,     
16840 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65    /* Cursor obje
16850 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
16860 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20  ar *zTerm,      
16870 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20          /* Term 
16880 73 65 61 72 63 68 65 64 20 66 6f 72 20 28 6f 72  searched for (or
16890 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20   NULL) */.  int 
168a0 6e 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20  nTerm           
168b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
168c0 65 6e 67 74 68 20 6f 66 20 7a 54 65 72 6d 20 69  ength of zTerm i
168d0 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20  n bytes */.){.  
168e0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 53 65  int i;.  int nSe
168f0 67 20 3d 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65  g = pCsr->nSegme
16900 6e 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  nt;..  /* If the
16910 20 46 74 73 33 53 65 67 46 69 6c 74 65 72 20 64   Fts3SegFilter d
16920 65 66 69 6e 65 73 20 61 20 73 70 65 63 69 66 69  efines a specifi
16930 63 20 74 65 72 6d 20 28 6f 72 20 74 65 72 6d 20  c term (or term 
16940 70 72 65 66 69 78 29 20 74 6f 20 73 65 61 72 63  prefix) to searc
16950 68 20 0a 20 20 2a 2a 20 66 6f 72 2c 20 74 68 65  h .  ** for, the
16960 6e 20 61 64 76 61 6e 63 65 20 65 61 63 68 20 73  n advance each s
16970 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 20  egment iterator 
16980 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20  until it points 
16990 74 6f 20 61 20 74 65 72 6d 20 6f 66 0a 20 20 2a  to a term of.  *
169a0 2a 20 65 71 75 61 6c 20 6f 72 20 67 72 65 61 74  * equal or great
169b0 65 72 20 76 61 6c 75 65 20 74 68 61 6e 20 74 68  er value than th
169c0 65 20 73 70 65 63 69 66 69 65 64 20 74 65 72 6d  e specified term
169d0 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20  . This prevents 
169e0 6d 61 6e 79 0a 20 20 2a 2a 20 75 6e 6e 65 63 65  many.  ** unnece
169f0 73 73 61 72 79 20 6d 65 72 67 65 2f 73 6f 72 74  ssary merge/sort
16a00 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 6f 72 20   operations for 
16a10 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20 73  the case where s
16a20 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 0a 20 20  ingle segment.  
16a30 2a 2a 20 62 2d 74 72 65 65 20 6c 65 61 66 20 6e  ** b-tree leaf n
16a40 6f 64 65 73 20 63 6f 6e 74 61 69 6e 20 6d 6f 72  odes contain mor
16a50 65 20 74 68 61 6e 20 6f 6e 65 20 74 65 72 6d 2e  e than one term.
16a60 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
16a70 20 70 43 73 72 2d 3e 62 52 65 73 74 61 72 74 3d   pCsr->bRestart=
16a80 3d 30 20 26 26 20 69 3c 70 43 73 72 2d 3e 6e 53  =0 && i<pCsr->nS
16a90 65 67 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  egment; i++){.  
16aa0 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20    int res = 0;. 
16ab0 20 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72     Fts3SegReader
16ac0 20 2a 70 53 65 67 20 3d 20 70 43 73 72 2d 3e 61   *pSeg = pCsr->a
16ad0 70 53 65 67 6d 65 6e 74 5b 69 5d 3b 0a 20 20 20  pSegment[i];.   
16ae0 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 6e 74 20   do {.      int 
16af0 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64  rc = fts3SegRead
16b00 65 72 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20  erNext(p, pSeg, 
16b10 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
16b20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
16b30 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 77 68  turn rc;.    }wh
16b40 69 6c 65 28 20 7a 54 65 72 6d 20 26 26 20 28 72  ile( zTerm && (r
16b50 65 73 20 3d 20 66 74 73 33 53 65 67 52 65 61 64  es = fts3SegRead
16b60 65 72 54 65 72 6d 43 6d 70 28 70 53 65 67 2c 20  erTermCmp(pSeg, 
16b70 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 29 3c 30  zTerm, nTerm))<0
16b80 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 65   );..    if( pSe
16b90 67 2d 3e 62 4c 6f 6f 6b 75 70 20 26 26 20 72 65  g->bLookup && re
16ba0 73 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74  s!=0 ){.      ft
16bb0 73 33 53 65 67 52 65 61 64 65 72 53 65 74 45 6f  s3SegReaderSetEo
16bc0 66 28 70 53 65 67 29 3b 0a 20 20 20 20 7d 0a 20  f(pSeg);.    }. 
16bd0 20 7d 0a 20 20 66 74 73 33 53 65 67 52 65 61 64   }.  fts3SegRead
16be0 65 72 53 6f 72 74 28 70 43 73 72 2d 3e 61 70 53  erSort(pCsr->apS
16bf0 65 67 6d 65 6e 74 2c 20 6e 53 65 67 2c 20 6e 53  egment, nSeg, nS
16c00 65 67 2c 20 66 74 73 33 53 65 67 52 65 61 64 65  eg, fts3SegReade
16c10 72 43 6d 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e  rCmp);..  return
16c20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69   SQLITE_OK;.}..i
16c30 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 53 65  nt sqlite3Fts3Se
16c40 67 52 65 61 64 65 72 53 74 61 72 74 28 0a 20 20  gReaderStart(.  
16c50 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
16c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c70 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  /* Virtual table
16c80 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73   handle */.  Fts
16c90 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20  3MultiSegReader 
16ca0 2a 70 43 73 72 2c 20 20 20 20 20 20 20 2f 2a 20  *pCsr,       /* 
16cb0 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  Cursor object */
16cc0 0a 20 20 46 74 73 33 53 65 67 46 69 6c 74 65 72  .  Fts3SegFilter
16cd0 20 2a 70 46 69 6c 74 65 72 20 20 20 20 20 20 20   *pFilter       
16ce0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
16cf0 6e 73 20 6f 6e 20 72 61 6e 67 65 20 6f 66 20 69  ns on range of i
16d00 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  teration */.){. 
16d10 20 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 20 3d   pCsr->pFilter =
16d20 20 70 46 69 6c 74 65 72 3b 0a 20 20 72 65 74 75   pFilter;.  retu
16d30 72 6e 20 66 74 73 33 53 65 67 52 65 61 64 65 72  rn fts3SegReader
16d40 53 74 61 72 74 28 70 2c 20 70 43 73 72 2c 20 70  Start(p, pCsr, p
16d50 46 69 6c 74 65 72 2d 3e 7a 54 65 72 6d 2c 20 70  Filter->zTerm, p
16d60 46 69 6c 74 65 72 2d 3e 6e 54 65 72 6d 29 3b 0a  Filter->nTerm);.
16d70 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  }..int sqlite3Ft
16d80 73 33 4d 73 72 49 6e 63 72 53 74 61 72 74 28 0a  s3MsrIncrStart(.
16d90 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
16da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16db0 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
16dc0 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46  le handle */.  F
16dd0 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
16de0 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 2f  r *pCsr,       /
16df0 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  * Cursor object 
16e00 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
16e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
16e30 6f 20 6d 61 74 63 68 20 6f 6e 2e 20 2a 2f 0a 20  o match on. */. 
16e40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
16e50 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
16e60 20 2f 2a 20 54 65 72 6d 20 74 6f 20 69 74 65 72   /* Term to iter
16e70 61 74 65 20 74 68 72 6f 75 67 68 20 61 20 64 6f  ate through a do
16e80 63 6c 69 73 74 20 66 6f 72 20 2a 2f 0a 20 20 69  clist for */.  i
16e90 6e 74 20 6e 54 65 72 6d 20 20 20 20 20 20 20 20  nt nTerm        
16ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16eb0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
16ec0 73 20 69 6e 20 7a 54 65 72 6d 20 2a 2f 0a 29 7b  s in zTerm */.){
16ed0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
16ee0 72 63 3b 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65  rc;.  int nSegme
16ef0 6e 74 20 3d 20 70 43 73 72 2d 3e 6e 53 65 67 6d  nt = pCsr->nSegm
16f00 65 6e 74 3b 0a 20 20 69 6e 74 20 28 2a 78 43 6d  ent;.  int (*xCm
16f10 70 29 28 46 74 73 33 53 65 67 52 65 61 64 65 72  p)(Fts3SegReader
16f20 20 2a 2c 20 46 74 73 33 53 65 67 52 65 61 64 65   *, Fts3SegReade
16f30 72 20 2a 29 20 3d 20 28 0a 20 20 20 20 70 2d 3e  r *) = (.    p->
16f40 62 44 65 73 63 49 64 78 20 3f 20 66 74 73 33 53  bDescIdx ? fts3S
16f50 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43  egReaderDoclistC
16f60 6d 70 52 65 76 20 3a 20 66 74 73 33 53 65 67 52  mpRev : fts3SegR
16f70 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 0a  eaderDoclistCmp.
16f80 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20    );..  assert( 
16f90 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 3d 3d 30  pCsr->pFilter==0
16fa0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54   );.  assert( zT
16fb0 65 72 6d 20 26 26 20 6e 54 65 72 6d 3e 30 20 29  erm && nTerm>0 )
16fc0 3b 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20  ;..  /* Advance 
16fd0 65 61 63 68 20 73 65 67 6d 65 6e 74 20 69 74 65  each segment ite
16fe0 72 61 74 6f 72 20 75 6e 74 69 6c 20 69 74 20 70  rator until it p
16ff0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 65 72  oints to the ter
17000 6d 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 2a  m zTerm/nTerm. *
17010 2f 0a 20 20 72 63 20 3d 20 66 74 73 33 53 65 67  /.  rc = fts3Seg
17020 52 65 61 64 65 72 53 74 61 72 74 28 70 2c 20 70  ReaderStart(p, p
17030 43 73 72 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  Csr, zTerm, nTer
17040 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  m);.  if( rc!=SQ
17050 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
17060 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 72   rc;..  /* Deter
17070 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 6f 66  mine how many of
17080 20 74 68 65 20 73 65 67 6d 65 6e 74 73 20 61 63   the segments ac
17090 74 75 61 6c 6c 79 20 70 6f 69 6e 74 20 74 6f 20  tually point to 
170a0 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 2a 2f 0a  zTerm/nTerm. */.
170b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 65    for(i=0; i<nSe
170c0 67 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  gment; i++){.   
170d0 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
170e0 70 53 65 67 20 3d 20 70 43 73 72 2d 3e 61 70 53  pSeg = pCsr->apS
170f0 65 67 6d 65 6e 74 5b 69 5d 3b 0a 20 20 20 20 69  egment[i];.    i
17100 66 28 20 21 70 53 65 67 2d 3e 61 4e 6f 64 65 20  f( !pSeg->aNode 
17110 7c 7c 20 66 74 73 33 53 65 67 52 65 61 64 65 72  || fts3SegReader
17120 54 65 72 6d 43 6d 70 28 70 53 65 67 2c 20 7a 54  TermCmp(pSeg, zT
17130 65 72 6d 2c 20 6e 54 65 72 6d 29 20 29 7b 0a 20  erm, nTerm) ){. 
17140 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17150 7d 0a 20 20 7d 0a 20 20 70 43 73 72 2d 3e 6e 41  }.  }.  pCsr->nA
17160 64 76 61 6e 63 65 20 3d 20 69 3b 0a 0a 20 20 2f  dvance = i;..  /
17170 2a 20 41 64 76 61 6e 63 65 20 65 61 63 68 20 6f  * Advance each o
17180 66 20 74 68 65 20 73 65 67 6d 65 6e 74 73 20 74  f the segments t
17190 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  o point to the f
171a0 69 72 73 74 20 64 6f 63 69 64 2e 20 2a 2f 0a 20  irst docid. */. 
171b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72   for(i=0; i<pCsr
171c0 2d 3e 6e 41 64 76 61 6e 63 65 3b 20 69 2b 2b 29  ->nAdvance; i++)
171d0 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53  {.    rc = fts3S
171e0 65 67 52 65 61 64 65 72 46 69 72 73 74 44 6f 63  egReaderFirstDoc
171f0 69 64 28 70 2c 20 70 43 73 72 2d 3e 61 70 53 65  id(p, pCsr->apSe
17200 67 6d 65 6e 74 5b 69 5d 29 3b 0a 20 20 20 20 69  gment[i]);.    i
17210 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17220 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
17230 7d 0a 20 20 66 74 73 33 53 65 67 52 65 61 64 65  }.  fts3SegReade
17240 72 53 6f 72 74 28 70 43 73 72 2d 3e 61 70 53 65  rSort(pCsr->apSe
17250 67 6d 65 6e 74 2c 20 69 2c 20 69 2c 20 78 43 6d  gment, i, i, xCm
17260 70 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  p);..  assert( i
17270 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3c 70 2d  Col<0 || iCol<p-
17280 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 70 43  >nColumn );.  pC
17290 73 72 2d 3e 69 43 6f 6c 46 69 6c 74 65 72 20 3d  sr->iColFilter =
172a0 20 69 43 6f 6c 3b 0a 0a 20 20 72 65 74 75 72 6e   iCol;..  return
172b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
172c0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
172d0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  on is called on 
172e0 61 20 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  a MultiSegReader
172f0 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 73   that has been s
17300 74 61 72 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20  tarted using.** 
17310 73 71 6c 69 74 65 33 46 74 73 33 4d 73 72 49 6e  sqlite3Fts3MsrIn
17320 63 72 53 74 61 72 74 28 29 2e 20 4f 6e 65 20 6f  crStart(). One o
17330 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20  r more calls to 
17340 4d 73 72 49 6e 63 72 4e 65 78 74 28 29 20 6d 61  MsrIncrNext() ma
17350 79 20 61 6c 73 6f 0a 2a 2a 20 68 61 76 65 20 62  y also.** have b
17360 65 65 6e 20 6d 61 64 65 2e 20 43 61 6c 6c 69 6e  een made. Callin
17370 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  g this function 
17380 70 75 74 73 20 74 68 65 20 4d 75 6c 74 69 53 65  puts the MultiSe
17390 67 52 65 61 64 65 72 20 69 6e 20 73 75 63 68 0a  gReader in such.
173a0 2a 2a 20 61 20 73 74 61 74 65 20 74 68 61 74 20  ** a state that 
173b0 69 66 20 74 68 65 20 6e 65 78 74 20 74 77 6f 20  if the next two 
173c0 63 61 6c 6c 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a  calls are:.**.**
173d0 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65     sqlite3Fts3Se
173e0 67 52 65 61 64 65 72 53 74 61 72 74 28 29 0a 2a  gReaderStart().*
173f0 2a 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 53  *   sqlite3Fts3S
17400 65 67 52 65 61 64 65 72 53 74 65 70 28 29 0a 2a  egReaderStep().*
17410 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 65 6e  *.** then the en
17420 74 69 72 65 20 64 6f 63 6c 69 73 74 20 66 6f 72  tire doclist for
17430 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 76 61   the term is ava
17440 69 6c 61 62 6c 65 20 69 6e 20 0a 2a 2a 20 4d 75  ilable in .** Mu
17450 6c 74 69 53 65 67 52 65 61 64 65 72 2e 61 44 6f  ltiSegReader.aDo
17460 63 6c 69 73 74 2f 6e 44 6f 63 6c 69 73 74 2e 0a  clist/nDoclist..
17470 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
17480 73 33 4d 73 72 49 6e 63 72 52 65 73 74 61 72 74  s3MsrIncrRestart
17490 28 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61  (Fts3MultiSegRea
174a0 64 65 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e  der *pCsr){.  in
174b0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
174c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
174d0 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
174e0 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74   through segment
174f0 2d 72 65 61 64 65 72 73 20 2a 2f 0a 0a 20 20 61  -readers */..  a
17500 73 73 65 72 74 28 20 70 43 73 72 2d 3e 7a 54 65  ssert( pCsr->zTe
17510 72 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  rm==0 );.  asser
17520 74 28 20 70 43 73 72 2d 3e 6e 54 65 72 6d 3d 3d  t( pCsr->nTerm==
17530 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
17540 43 73 72 2d 3e 61 44 6f 63 6c 69 73 74 3d 3d 30  Csr->aDoclist==0
17550 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
17560 73 72 2d 3e 6e 44 6f 63 6c 69 73 74 3d 3d 30 20  sr->nDoclist==0 
17570 29 3b 0a 0a 20 20 70 43 73 72 2d 3e 6e 41 64 76  );..  pCsr->nAdv
17580 61 6e 63 65 20 3d 20 30 3b 0a 20 20 70 43 73 72  ance = 0;.  pCsr
17590 2d 3e 62 52 65 73 74 61 72 74 20 3d 20 31 3b 0a  ->bRestart = 1;.
175a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73    for(i=0; i<pCs
175b0 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 20 69 2b 2b  r->nSegment; i++
175c0 29 7b 0a 20 20 20 20 70 43 73 72 2d 3e 61 70 53  ){.    pCsr->apS
175d0 65 67 6d 65 6e 74 5b 69 5d 2d 3e 70 4f 66 66 73  egment[i]->pOffs
175e0 65 74 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  etList = 0;.    
175f0 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b  pCsr->apSegment[
17600 69 5d 2d 3e 6e 4f 66 66 73 65 74 4c 69 73 74 20  i]->nOffsetList 
17610 3d 20 30 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61  = 0;.    pCsr->a
17620 70 53 65 67 6d 65 6e 74 5b 69 5d 2d 3e 69 44 6f  pSegment[i]->iDo
17630 63 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  cid = 0;.  }..  
17640 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17650 3b 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65  ;.}...int sqlite
17660 33 46 74 73 33 53 65 67 52 65 61 64 65 72 53 74  3Fts3SegReaderSt
17670 65 70 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  ep(.  Fts3Table 
17680 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
17690 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c        /* Virtual
176a0 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   table handle */
176b0 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52  .  Fts3MultiSegR
176c0 65 61 64 65 72 20 2a 70 43 73 72 20 20 20 20 20  eader *pCsr     
176d0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a     /* Cursor obj
176e0 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ect */.){.  int 
176f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
17700 0a 20 20 69 6e 74 20 69 73 49 67 6e 6f 72 65 45  .  int isIgnoreE
17710 6d 70 74 79 20 3d 20 20 28 70 43 73 72 2d 3e 70  mpty =  (pCsr->p
17720 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26 20  Filter->flags & 
17730 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 49 47 4e  FTS3_SEGMENT_IGN
17740 4f 52 45 5f 45 4d 50 54 59 29 3b 0a 20 20 69 6e  ORE_EMPTY);.  in
17750 74 20 69 73 52 65 71 75 69 72 65 50 6f 73 20 3d  t isRequirePos =
17760 20 20 20 28 70 43 73 72 2d 3e 70 46 69 6c 74 65     (pCsr->pFilte
17770 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 33 5f  r->flags & FTS3_
17780 53 45 47 4d 45 4e 54 5f 52 45 51 55 49 52 45 5f  SEGMENT_REQUIRE_
17790 50 4f 53 29 3b 0a 20 20 69 6e 74 20 69 73 43 6f  POS);.  int isCo
177a0 6c 46 69 6c 74 65 72 20 3d 20 20 20 20 28 70 43  lFilter =    (pC
177b0 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e 66 6c 61  sr->pFilter->fla
177c0 67 73 20 26 20 46 54 53 33 5f 53 45 47 4d 45 4e  gs & FTS3_SEGMEN
177d0 54 5f 43 4f 4c 55 4d 4e 5f 46 49 4c 54 45 52 29  T_COLUMN_FILTER)
177e0 3b 0a 20 20 69 6e 74 20 69 73 50 72 65 66 69 78  ;.  int isPrefix
177f0 20 3d 20 20 20 20 20 20 20 28 70 43 73 72 2d 3e   =       (pCsr->
17800 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26  pFilter->flags &
17810 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 50 52   FTS3_SEGMENT_PR
17820 45 46 49 58 29 3b 0a 20 20 69 6e 74 20 69 73 53  EFIX);.  int isS
17830 63 61 6e 20 3d 20 20 20 20 20 20 20 20 20 28 70  can =         (p
17840 43 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e 66 6c  Csr->pFilter->fl
17850 61 67 73 20 26 20 46 54 53 33 5f 53 45 47 4d 45  ags & FTS3_SEGME
17860 4e 54 5f 53 43 41 4e 29 3b 0a 20 20 69 6e 74 20  NT_SCAN);.  int 
17870 69 73 46 69 72 73 74 20 3d 20 20 20 20 20 20 20  isFirst =       
17880 20 28 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 2d   (pCsr->pFilter-
17890 3e 66 6c 61 67 73 20 26 20 46 54 53 33 5f 53 45  >flags & FTS3_SE
178a0 47 4d 45 4e 54 5f 46 49 52 53 54 29 3b 0a 0a 20  GMENT_FIRST);.. 
178b0 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
178c0 2a 61 70 53 65 67 6d 65 6e 74 20 3d 20 70 43 73  *apSegment = pCs
178d0 72 2d 3e 61 70 53 65 67 6d 65 6e 74 3b 0a 20 20  r->apSegment;.  
178e0 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 70  int nSegment = p
178f0 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20  Csr->nSegment;. 
17900 20 46 74 73 33 53 65 67 46 69 6c 74 65 72 20 2a   Fts3SegFilter *
17910 70 46 69 6c 74 65 72 20 3d 20 70 43 73 72 2d 3e  pFilter = pCsr->
17920 70 46 69 6c 74 65 72 3b 0a 20 20 69 6e 74 20 28  pFilter;.  int (
17930 2a 78 43 6d 70 29 28 46 74 73 33 53 65 67 52 65  *xCmp)(Fts3SegRe
17940 61 64 65 72 20 2a 2c 20 46 74 73 33 53 65 67 52  ader *, Fts3SegR
17950 65 61 64 65 72 20 2a 29 20 3d 20 28 0a 20 20 20  eader *) = (.   
17960 20 70 2d 3e 62 44 65 73 63 49 64 78 20 3f 20 66   p->bDescIdx ? f
17970 74 73 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c  ts3SegReaderDocl
17980 69 73 74 43 6d 70 52 65 76 20 3a 20 66 74 73 33  istCmpRev : fts3
17990 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74  SegReaderDoclist
179a0 43 6d 70 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20  Cmp.  );..  if( 
179b0 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d  pCsr->nSegment==
179c0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
179d0 45 5f 4f 4b 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20  E_OK;..  do {.  
179e0 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b 0a 20 20    int nMerge;.  
179f0 20 20 69 6e 74 20 69 3b 0a 20 20 0a 20 20 20 20    int i;.  .    
17a00 2f 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 66  /* Advance the f
17a10 69 72 73 74 20 70 43 73 72 2d 3e 6e 41 64 76 61  irst pCsr->nAdva
17a20 6e 63 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  nce entries in t
17a30 68 65 20 61 70 53 65 67 6d 65 6e 74 5b 5d 20 61  he apSegment[] a
17a40 72 72 61 79 0a 20 20 20 20 2a 2a 20 66 6f 72 77  rray.    ** forw
17a50 61 72 64 2e 20 54 68 65 6e 20 73 6f 72 74 20 74  ard. Then sort t
17a60 68 65 20 6c 69 73 74 20 69 6e 20 6f 72 64 65 72  he list in order
17a70 20 6f 66 20 63 75 72 72 65 6e 74 20 74 65 72 6d   of current term
17a80 20 61 67 61 69 6e 2e 20 20 0a 20 20 20 20 2a 2f   again.  .    */
17a90 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
17aa0 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65 3b 20  pCsr->nAdvance; 
17ab0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 33  i++){.      Fts3
17ac0 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67 20  SegReader *pSeg 
17ad0 3d 20 61 70 53 65 67 6d 65 6e 74 5b 69 5d 3b 0a  = apSegment[i];.
17ae0 20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e        if( pSeg->
17af0 62 4c 6f 6f 6b 75 70 20 29 7b 0a 20 20 20 20 20  bLookup ){.     
17b00 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72     fts3SegReader
17b10 53 65 74 45 6f 66 28 70 53 65 67 29 3b 0a 20 20  SetEof(pSeg);.  
17b20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17b30 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52     rc = fts3SegR
17b40 65 61 64 65 72 4e 65 78 74 28 70 2c 20 70 53 65  eaderNext(p, pSe
17b50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  g, 0);.      }. 
17b60 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
17b70 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
17b80 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  rc;.    }.    ft
17b90 73 33 53 65 67 52 65 61 64 65 72 53 6f 72 74 28  s3SegReaderSort(
17ba0 61 70 53 65 67 6d 65 6e 74 2c 20 6e 53 65 67 6d  apSegment, nSegm
17bb0 65 6e 74 2c 20 70 43 73 72 2d 3e 6e 41 64 76 61  ent, pCsr->nAdva
17bc0 6e 63 65 2c 20 66 74 73 33 53 65 67 52 65 61 64  nce, fts3SegRead
17bd0 65 72 43 6d 70 29 3b 0a 20 20 20 20 70 43 73 72  erCmp);.    pCsr
17be0 2d 3e 6e 41 64 76 61 6e 63 65 20 3d 20 30 3b 0a  ->nAdvance = 0;.
17bf0 0a 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74  .    /* If all t
17c00 68 65 20 73 65 67 2d 72 65 61 64 65 72 73 20 61  he seg-readers a
17c10 72 65 20 61 74 20 45 4f 46 2c 20 77 65 27 72 65  re at EOF, we're
17c20 20 66 69 6e 69 73 68 65 64 2e 20 72 65 74 75 72   finished. retur
17c30 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 2a 2f 0a  n SQLITE_OK. */.
17c40 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
17c50 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
17c60 20 69 66 28 20 61 70 53 65 67 6d 65 6e 74 5b 30   if( apSegment[0
17c70 5d 2d 3e 61 4e 6f 64 65 3d 3d 30 20 29 20 62 72  ]->aNode==0 ) br
17c80 65 61 6b 3b 0a 0a 20 20 20 20 70 43 73 72 2d 3e  eak;..    pCsr->
17c90 6e 54 65 72 6d 20 3d 20 61 70 53 65 67 6d 65 6e  nTerm = apSegmen
17ca0 74 5b 30 5d 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20  t[0]->nTerm;.   
17cb0 20 70 43 73 72 2d 3e 7a 54 65 72 6d 20 3d 20 61   pCsr->zTerm = a
17cc0 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 7a 54 65  pSegment[0]->zTe
17cd0 72 6d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  rm;..    /* If t
17ce0 68 69 73 20 69 73 20 61 20 70 72 65 66 69 78 2d  his is a prefix-
17cf0 73 65 61 72 63 68 2c 20 61 6e 64 20 69 66 20 74  search, and if t
17d00 68 65 20 74 65 72 6d 20 74 68 61 74 20 61 70 53  he term that apS
17d10 65 67 6d 65 6e 74 5b 30 5d 20 70 6f 69 6e 74 73  egment[0] points
17d20 0a 20 20 20 20 2a 2a 20 74 6f 20 64 6f 65 73 20  .    ** to does 
17d30 6e 6f 74 20 73 68 61 72 65 20 61 20 73 75 66 66  not share a suff
17d40 69 78 20 77 69 74 68 20 70 46 69 6c 74 65 72 2d  ix with pFilter-
17d50 3e 7a 54 65 72 6d 2f 6e 54 65 72 6d 2c 20 74 68  >zTerm/nTerm, th
17d60 65 6e 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 72  en all .    ** r
17d70 65 71 75 69 72 65 64 20 63 61 6c 6c 62 61 63 6b  equired callback
17d80 73 20 68 61 76 65 20 62 65 65 6e 20 6d 61 64 65  s have been made
17d90 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 65  . In this case e
17da0 78 69 74 20 65 61 72 6c 79 2e 0a 20 20 20 20 2a  xit early..    *
17db0 2a 0a 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72  *.    ** Similar
17dc0 6c 79 2c 20 69 66 20 74 68 69 73 20 69 73 20 61  ly, if this is a
17dd0 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65   search for an e
17de0 78 61 63 74 20 6d 61 74 63 68 2c 20 61 6e 64 20  xact match, and 
17df0 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 0a 20  the first term. 
17e00 20 20 20 2a 2a 20 6f 66 20 73 65 67 6d 65 6e 74     ** of segment
17e10 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 20 69 73   apSegment[0] is
17e20 20 6e 6f 74 20 61 20 6d 61 74 63 68 2c 20 65 78   not a match, ex
17e30 69 74 20 65 61 72 6c 79 2e 0a 20 20 20 20 2a 2f  it early..    */
17e40 0a 20 20 20 20 69 66 28 20 70 46 69 6c 74 65 72  .    if( pFilter
17e50 2d 3e 7a 54 65 72 6d 20 26 26 20 21 69 73 53 63  ->zTerm && !isSc
17e60 61 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  an ){.      if( 
17e70 70 43 73 72 2d 3e 6e 54 65 72 6d 3c 70 46 69 6c  pCsr->nTerm<pFil
17e80 74 65 72 2d 3e 6e 54 65 72 6d 20 0a 20 20 20 20  ter->nTerm .    
17e90 20 20 20 7c 7c 20 28 21 69 73 50 72 65 66 69 78     || (!isPrefix
17ea0 20 26 26 20 70 43 73 72 2d 3e 6e 54 65 72 6d 3e   && pCsr->nTerm>
17eb0 70 46 69 6c 74 65 72 2d 3e 6e 54 65 72 6d 29 0a  pFilter->nTerm).
17ec0 20 20 20 20 20 20 20 7c 7c 20 6d 65 6d 63 6d 70         || memcmp
17ed0 28 70 43 73 72 2d 3e 7a 54 65 72 6d 2c 20 70 46  (pCsr->zTerm, pF
17ee0 69 6c 74 65 72 2d 3e 7a 54 65 72 6d 2c 20 70 46  ilter->zTerm, pF
17ef0 69 6c 74 65 72 2d 3e 6e 54 65 72 6d 29 20 0a 20  ilter->nTerm) . 
17f00 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
17f10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
17f20 20 20 20 7d 0a 0a 20 20 20 20 6e 4d 65 72 67 65     }..    nMerge
17f30 20 3d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 1;.    while(
17f40 20 6e 4d 65 72 67 65 3c 6e 53 65 67 6d 65 6e 74   nMerge<nSegment
17f50 20 0a 20 20 20 20 20 20 20 20 26 26 20 61 70 53   .        && apS
17f60 65 67 6d 65 6e 74 5b 6e 4d 65 72 67 65 5d 2d 3e  egment[nMerge]->
17f70 61 4e 6f 64 65 0a 20 20 20 20 20 20 20 20 26 26  aNode.        &&
17f80 20 61 70 53 65 67 6d 65 6e 74 5b 6e 4d 65 72 67   apSegment[nMerg
17f90 65 5d 2d 3e 6e 54 65 72 6d 3d 3d 70 43 73 72 2d  e]->nTerm==pCsr-
17fa0 3e 6e 54 65 72 6d 20 0a 20 20 20 20 20 20 20 20  >nTerm .        
17fb0 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 43 73  && 0==memcmp(pCs
17fc0 72 2d 3e 7a 54 65 72 6d 2c 20 61 70 53 65 67 6d  r->zTerm, apSegm
17fd0 65 6e 74 5b 6e 4d 65 72 67 65 5d 2d 3e 7a 54 65  ent[nMerge]->zTe
17fe0 72 6d 2c 20 70 43 73 72 2d 3e 6e 54 65 72 6d 29  rm, pCsr->nTerm)
17ff0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4d  .    ){.      nM
18000 65 72 67 65 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  erge++;.    }.. 
18010 20 20 20 61 73 73 65 72 74 28 20 69 73 49 67 6e     assert( isIgn
18020 6f 72 65 45 6d 70 74 79 20 7c 7c 20 28 69 73 52  oreEmpty || (isR
18030 65 71 75 69 72 65 50 6f 73 20 26 26 20 21 69 73  equirePos && !is
18040 43 6f 6c 46 69 6c 74 65 72 29 20 29 3b 0a 20 20  ColFilter) );.  
18050 20 20 69 66 28 20 6e 4d 65 72 67 65 3d 3d 31 20    if( nMerge==1 
18060 0a 20 20 20 20 20 26 26 20 21 69 73 49 67 6e 6f  .     && !isIgno
18070 72 65 45 6d 70 74 79 20 0a 20 20 20 20 20 26 26  reEmpty .     &&
18080 20 21 69 73 46 69 72 73 74 20 0a 20 20 20 20 20   !isFirst .     
18090 26 26 20 28 70 2d 3e 62 44 65 73 63 49 64 78 3d  && (p->bDescIdx=
180a0 3d 30 20 7c 7c 20 66 74 73 33 53 65 67 52 65 61  =0 || fts3SegRea
180b0 64 65 72 49 73 50 65 6e 64 69 6e 67 28 61 70 53  derIsPending(apS
180c0 65 67 6d 65 6e 74 5b 30 5d 29 3d 3d 30 29 0a 20  egment[0])==0). 
180d0 20 20 20 29 7b 0a 20 20 20 20 20 20 70 43 73 72     ){.      pCsr
180e0 2d 3e 6e 44 6f 63 6c 69 73 74 20 3d 20 61 70 53  ->nDoclist = apS
180f0 65 67 6d 65 6e 74 5b 30 5d 2d 3e 6e 44 6f 63 6c  egment[0]->nDocl
18100 69 73 74 3b 0a 20 20 20 20 20 20 69 66 28 20 66  ist;.      if( f
18110 74 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65  ts3SegReaderIsPe
18120 6e 64 69 6e 67 28 61 70 53 65 67 6d 65 6e 74 5b  nding(apSegment[
18130 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  0]) ){.        r
18140 63 20 3d 20 66 74 73 33 4d 73 72 42 75 66 66 65  c = fts3MsrBuffe
18150 72 44 61 74 61 28 70 43 73 72 2c 20 61 70 53 65  rData(pCsr, apSe
18160 67 6d 65 6e 74 5b 30 5d 2d 3e 61 44 6f 63 6c 69  gment[0]->aDocli
18170 73 74 2c 20 70 43 73 72 2d 3e 6e 44 6f 63 6c 69  st, pCsr->nDocli
18180 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 43 73  st);.        pCs
18190 72 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20 70 43  r->aDoclist = pC
181a0 73 72 2d 3e 61 42 75 66 66 65 72 3b 0a 20 20 20  sr->aBuffer;.   
181b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
181c0 20 20 70 43 73 72 2d 3e 61 44 6f 63 6c 69 73 74    pCsr->aDoclist
181d0 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d   = apSegment[0]-
181e0 3e 61 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20  >aDoclist;.     
181f0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
18200 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
18210 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20  = SQLITE_ROW;.  
18220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
18230 6e 74 20 6e 44 6f 63 6c 69 73 74 20 3d 20 30 3b  nt nDoclist = 0;
18240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
18250 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 2a 2f  ze of doclist */
18260 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
18270 6e 74 36 34 20 69 50 72 65 76 20 3d 20 30 3b 20  nt64 iPrev = 0; 
18280 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 64     /* Previous d
18290 6f 63 69 64 20 73 74 6f 72 65 64 20 69 6e 20 64  ocid stored in d
182a0 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20  oclist */..     
182b0 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   /* The current 
182c0 74 65 72 6d 20 6f 66 20 74 68 65 20 66 69 72 73  term of the firs
182d0 74 20 6e 4d 65 72 67 65 20 65 6e 74 72 69 65 73  t nMerge entries
182e0 20 69 6e 20 74 68 65 20 61 72 72 61 79 0a 20 20   in the array.  
182f0 20 20 20 20 2a 2a 20 6f 66 20 46 74 73 33 53 65      ** of Fts3Se
18300 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74 73 20  gReader objects 
18310 69 73 20 74 68 65 20 73 61 6d 65 2e 20 54 68 65  is the same. The
18320 20 64 6f 63 6c 69 73 74 73 20 6d 75 73 74 20 62   doclists must b
18330 65 20 6d 65 72 67 65 64 0a 20 20 20 20 20 20 2a  e merged.      *
18340 2a 20 61 6e 64 20 61 20 73 69 6e 67 6c 65 20 74  * and a single t
18350 65 72 6d 20 72 65 74 75 72 6e 65 64 20 77 69 74  erm returned wit
18360 68 20 74 68 65 20 6d 65 72 67 65 64 20 64 6f 63  h the merged doc
18370 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  list..      */. 
18380 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
18390 6e 4d 65 72 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  nMerge; i++){.  
183a0 20 20 20 20 20 20 66 74 73 33 53 65 67 52 65 61        fts3SegRea
183b0 64 65 72 46 69 72 73 74 44 6f 63 69 64 28 70 2c  derFirstDocid(p,
183c0 20 61 70 53 65 67 6d 65 6e 74 5b 69 5d 29 3b 0a   apSegment[i]);.
183d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
183e0 73 33 53 65 67 52 65 61 64 65 72 53 6f 72 74 28  s3SegReaderSort(
183f0 61 70 53 65 67 6d 65 6e 74 2c 20 6e 4d 65 72 67  apSegment, nMerg
18400 65 2c 20 6e 4d 65 72 67 65 2c 20 78 43 6d 70 29  e, nMerge, xCmp)
18410 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 61  ;.      while( a
18420 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 70 4f 66  pSegment[0]->pOf
18430 66 73 65 74 4c 69 73 74 20 29 7b 0a 20 20 20 20  fsetList ){.    
18440 20 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20      int j;      
18450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18460 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   Number of segme
18470 6e 74 73 20 74 68 61 74 20 73 68 61 72 65 20 61  nts that share a
18480 20 64 6f 63 69 64 20 2a 2f 0a 20 20 20 20 20 20   docid */.      
18490 20 20 63 68 61 72 20 2a 70 4c 69 73 74 20 3d 20    char *pList = 
184a0 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  0;.        int n
184b0 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
184c0 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20    int nByte;.   
184d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
184e0 36 34 20 69 44 6f 63 69 64 20 3d 20 61 70 53 65  64 iDocid = apSe
184f0 67 6d 65 6e 74 5b 30 5d 2d 3e 69 44 6f 63 69 64  gment[0]->iDocid
18500 3b 0a 20 20 20 20 20 20 20 20 66 74 73 33 53 65  ;.        fts3Se
18510 67 52 65 61 64 65 72 4e 65 78 74 44 6f 63 69 64  gReaderNextDocid
18520 28 70 2c 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d  (p, apSegment[0]
18530 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74  , &pList, &nList
18540 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 31  );.        j = 1
18550 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
18560 20 6a 3c 6e 4d 65 72 67 65 0a 20 20 20 20 20 20   j<nMerge.      
18570 20 20 20 20 20 20 26 26 20 61 70 53 65 67 6d 65        && apSegme
18580 6e 74 5b 6a 5d 2d 3e 70 4f 66 66 73 65 74 4c 69  nt[j]->pOffsetLi
18590 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  st.            &
185a0 26 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2d 3e  & apSegment[j]->
185b0 69 44 6f 63 69 64 3d 3d 69 44 6f 63 69 64 0a 20  iDocid==iDocid. 
185c0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
185d0 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65      fts3SegReade
185e0 72 4e 65 78 74 44 6f 63 69 64 28 70 2c 20 61 70  rNextDocid(p, ap
185f0 53 65 67 6d 65 6e 74 5b 6a 5d 2c 20 30 2c 20 30  Segment[j], 0, 0
18600 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 2b 2b  );.          j++
18610 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
18620 20 20 20 20 20 69 66 28 20 69 73 43 6f 6c 46 69       if( isColFi
18630 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  lter ){.        
18640 20 20 66 74 73 33 43 6f 6c 75 6d 6e 46 69 6c 74    fts3ColumnFilt
18650 65 72 28 70 46 69 6c 74 65 72 2d 3e 69 43 6f 6c  er(pFilter->iCol
18660 2c 20 30 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c  , 0, &pList, &nL
18670 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ist);.        }.
18680 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73  .        if( !is
18690 49 67 6e 6f 72 65 45 6d 70 74 79 20 7c 7c 20 6e  IgnoreEmpty || n
186a0 4c 69 73 74 3e 30 20 29 7b 0a 0a 20 20 20 20 20  List>0 ){..     
186b0 20 20 20 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74       /* Calculat
186c0 65 20 74 68 65 20 27 64 6f 63 69 64 27 20 64 65  e the 'docid' de
186d0 6c 74 61 20 76 61 6c 75 65 20 74 6f 20 77 72 69  lta value to wri
186e0 74 65 20 69 6e 74 6f 20 74 68 65 20 6d 65 72 67  te into the merg
186f0 65 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ed .          **
18700 20 64 6f 63 6c 69 73 74 2e 20 2a 2f 0a 20 20 20   doclist. */.   
18710 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
18720 6e 74 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20  nt64 iDelta;.   
18730 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 44         if( p->bD
18740 65 73 63 49 64 78 20 26 26 20 6e 44 6f 63 6c 69  escIdx && nDocli
18750 73 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  st>0 ){.        
18760 20 20 20 20 69 44 65 6c 74 61 20 3d 20 69 50 72      iDelta = iPr
18770 65 76 20 2d 20 69 44 6f 63 69 64 3b 0a 20 20 20  ev - iDocid;.   
18780 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
18790 20 20 20 20 20 20 20 20 20 20 69 44 65 6c 74 61            iDelta
187a0 20 3d 20 69 44 6f 63 69 64 20 2d 20 69 50 72 65   = iDocid - iPre
187b0 76 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  v;.          }. 
187c0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44 65           if( iDe
187d0 6c 74 61 3c 3d 30 20 26 26 20 28 6e 44 6f 63 6c  lta<=0 && (nDocl
187e0 69 73 74 3e 30 20 7c 7c 20 69 44 65 6c 74 61 21  ist>0 || iDelta!
187f0 3d 69 44 6f 63 69 64 29 20 29 7b 0a 20 20 20 20  =iDocid) ){.    
18800 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 46          return F
18810 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b  TS_CORRUPT_VTAB;
18820 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
18830 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
18840 44 6f 63 6c 69 73 74 3e 30 20 7c 7c 20 69 44 65  Doclist>0 || iDe
18850 6c 74 61 3d 3d 69 44 6f 63 69 64 20 29 3b 0a 0a  lta==iDocid );..
18860 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 20            nByte 
18870 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72  = sqlite3Fts3Var
18880 69 6e 74 4c 65 6e 28 69 44 65 6c 74 61 29 20 2b  intLen(iDelta) +
18890 20 28 69 73 52 65 71 75 69 72 65 50 6f 73 3f 6e   (isRequirePos?n
188a0 4c 69 73 74 2b 31 3a 30 29 3b 0a 20 20 20 20 20  List+1:0);.     
188b0 20 20 20 20 20 69 66 28 20 6e 44 6f 63 6c 69 73       if( nDoclis
188c0 74 2b 6e 42 79 74 65 3e 70 43 73 72 2d 3e 6e 42  t+nByte>pCsr->nB
188d0 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20  uffer ){.       
188e0 20 20 20 20 20 63 68 61 72 20 2a 61 4e 65 77 3b       char *aNew;
188f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 73  .            pCs
18900 72 2d 3e 6e 42 75 66 66 65 72 20 3d 20 28 6e 44  r->nBuffer = (nD
18910 6f 63 6c 69 73 74 2b 6e 42 79 74 65 29 2a 32 3b  oclist+nByte)*2;
18920 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 4e 65  .            aNe
18930 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
18940 6c 6f 63 28 70 43 73 72 2d 3e 61 42 75 66 66 65  loc(pCsr->aBuffe
18950 72 2c 20 70 43 73 72 2d 3e 6e 42 75 66 66 65 72  r, pCsr->nBuffer
18960 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
18970 66 28 20 21 61 4e 65 77 20 29 7b 0a 20 20 20 20  f( !aNew ){.    
18980 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
18990 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
189a0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
189b0 20 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 61           pCsr->a
189c0 42 75 66 66 65 72 20 3d 20 61 4e 65 77 3b 0a 20  Buffer = aNew;. 
189d0 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
189e0 20 20 20 20 20 20 69 66 28 20 69 73 46 69 72 73        if( isFirs
189f0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
18a00 20 63 68 61 72 20 2a 61 20 3d 20 26 70 43 73 72   char *a = &pCsr
18a10 2d 3e 61 42 75 66 66 65 72 5b 6e 44 6f 63 6c 69  ->aBuffer[nDocli
18a20 73 74 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  st];.           
18a30 20 69 6e 74 20 6e 57 72 69 74 65 3b 0a 20 20 20   int nWrite;.   
18a40 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
18a50 20 20 20 20 20 6e 57 72 69 74 65 20 3d 20 73 71       nWrite = sq
18a60 6c 69 74 65 33 46 74 73 33 46 69 72 73 74 46 69  lite3Fts3FirstFi
18a70 6c 74 65 72 28 69 44 65 6c 74 61 2c 20 70 4c 69  lter(iDelta, pLi
18a80 73 74 2c 20 6e 4c 69 73 74 2c 20 61 29 3b 0a 20  st, nList, a);. 
18a90 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e             if( n
18aa0 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 20  Write ){.       
18ab0 20 20 20 20 20 20 20 69 50 72 65 76 20 3d 20 69         iPrev = i
18ac0 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20 20  Docid;.         
18ad0 20 20 20 20 20 6e 44 6f 63 6c 69 73 74 20 2b 3d       nDoclist +=
18ae0 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20   nWrite;.       
18af0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
18b00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18b10 20 20 20 20 6e 44 6f 63 6c 69 73 74 20 2b 3d 20      nDoclist += 
18b20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
18b30 72 69 6e 74 28 26 70 43 73 72 2d 3e 61 42 75 66  rint(&pCsr->aBuf
18b40 66 65 72 5b 6e 44 6f 63 6c 69 73 74 5d 2c 20 69  fer[nDoclist], i
18b50 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20  Delta);.        
18b60 20 20 20 20 69 50 72 65 76 20 3d 20 69 44 6f 63      iPrev = iDoc
18b70 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  id;.            
18b80 69 66 28 20 69 73 52 65 71 75 69 72 65 50 6f 73  if( isRequirePos
18b90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
18ba0 20 20 6d 65 6d 63 70 79 28 26 70 43 73 72 2d 3e    memcpy(&pCsr->
18bb0 61 42 75 66 66 65 72 5b 6e 44 6f 63 6c 69 73 74  aBuffer[nDoclist
18bc0 5d 2c 20 70 4c 69 73 74 2c 20 6e 4c 69 73 74 29  ], pList, nList)
18bd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
18be0 6e 44 6f 63 6c 69 73 74 20 2b 3d 20 6e 4c 69 73  nDoclist += nLis
18bf0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
18c00 20 70 43 73 72 2d 3e 61 42 75 66 66 65 72 5b 6e   pCsr->aBuffer[n
18c10 44 6f 63 6c 69 73 74 2b 2b 5d 20 3d 20 27 5c 30  Doclist++] = '\0
18c20 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ';.            }
18c30 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
18c40 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
18c50 66 74 73 33 53 65 67 52 65 61 64 65 72 53 6f 72  fts3SegReaderSor
18c60 74 28 61 70 53 65 67 6d 65 6e 74 2c 20 6e 4d 65  t(apSegment, nMe
18c70 72 67 65 2c 20 6a 2c 20 78 43 6d 70 29 3b 0a 20  rge, j, xCmp);. 
18c80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18c90 20 6e 44 6f 63 6c 69 73 74 3e 30 20 29 7b 0a 20   nDoclist>0 ){. 
18ca0 20 20 20 20 20 20 20 70 43 73 72 2d 3e 61 44 6f         pCsr->aDo
18cb0 63 6c 69 73 74 20 3d 20 70 43 73 72 2d 3e 61 42  clist = pCsr->aB
18cc0 75 66 66 65 72 3b 0a 20 20 20 20 20 20 20 20 70  uffer;.        p
18cd0 43 73 72 2d 3e 6e 44 6f 63 6c 69 73 74 20 3d 20  Csr->nDoclist = 
18ce0 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20  nDoclist;.      
18cf0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f    rc = SQLITE_RO
18d00 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  W;.      }.    }
18d10 0a 20 20 20 20 70 43 73 72 2d 3e 6e 41 64 76 61  .    pCsr->nAdva
18d20 6e 63 65 20 3d 20 6e 4d 65 72 67 65 3b 0a 20 20  nce = nMerge;.  
18d30 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
18d40 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 72 65 74 75  TE_OK );..  retu
18d50 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 76 6f 69 64 20  rn rc;.}...void 
18d60 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
18d70 61 64 65 72 46 69 6e 69 73 68 28 0a 20 20 46 74  aderFinish(.  Ft
18d80 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
18d90 20 2a 70 43 73 72 20 20 20 20 20 20 20 2f 2a 20   *pCsr       /* 
18da0 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  Cursor object */
18db0 0a 29 7b 0a 20 20 69 66 28 20 70 43 73 72 20 29  .){.  if( pCsr )
18dc0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
18dd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72   for(i=0; i<pCsr
18de0 2d 3e 6e 53 65 67 6d 65 6e 74 3b 20 69 2b 2b 29  ->nSegment; i++)
18df0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  {.      sqlite3F
18e00 74 73 33 53 65 67 52 65 61 64 65 72 46 72 65 65  ts3SegReaderFree
18e10 28 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74  (pCsr->apSegment
18e20 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
18e30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73  sqlite3_free(pCs
18e40 72 2d 3e 61 70 53 65 67 6d 65 6e 74 29 3b 0a 20  r->apSegment);. 
18e50 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
18e60 70 43 73 72 2d 3e 61 42 75 66 66 65 72 29 3b 0a  pCsr->aBuffer);.
18e70 0a 20 20 20 20 70 43 73 72 2d 3e 6e 53 65 67 6d  .    pCsr->nSegm
18e80 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 43 73  ent = 0;.    pCs
18e90 72 2d 3e 61 70 53 65 67 6d 65 6e 74 20 3d 20 30  r->apSegment = 0
18ea0 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 42 75 66  ;.    pCsr->aBuf
18eb0 66 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  fer = 0;.  }.}..
18ec0 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65  /*.** Decode the
18ed0 20 22 65 6e 64 5f 62 6c 6f 63 6b 22 20 66 69 65   "end_block" fie
18ee0 6c 64 2c 20 73 65 6c 65 63 74 65 64 20 62 79 20  ld, selected by 
18ef0 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20 6f 66 20 74  column iCol of t
18f00 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74  he SELECT .** st
18f10 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
18f20 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
18f30 6d 65 6e 74 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ment. .**.** The
18f40 20 22 65 6e 64 5f 62 6c 6f 63 6b 22 20 66 69 65   "end_block" fie
18f50 6c 64 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65  ld may contain e
18f60 69 74 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72  ither an integer
18f70 2c 20 6f 72 20 61 20 74 65 78 74 20 66 69 65 6c  , or a text fiel
18f80 64 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20  d.** containing 
18f90 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65  the text represe
18fa0 6e 74 61 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6e  ntation of two n
18fb0 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65  on-negative inte
18fc0 67 65 72 73 20 73 65 70 61 72 61 74 65 64 20 0a  gers separated .
18fd0 2a 2a 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72  ** by one or mor
18fe0 65 20 73 70 61 63 65 20 28 30 78 32 30 29 20 63  e space (0x20) c
18ff0 68 61 72 61 63 74 65 72 73 2e 20 49 6e 20 74 68  haracters. In th
19000 65 20 66 69 72 73 74 20 63 61 73 65 2c 20 73 65  e first case, se
19010 74 20 2a 70 69 45 6e 64 42 6c 6f 63 6b 20 0a 2a  t *piEndBlock .*
19020 2a 20 74 6f 20 74 68 65 20 69 6e 74 65 67 65 72  * to the integer
19030 20 76 61 6c 75 65 20 61 6e 64 20 2a 70 6e 42 79   value and *pnBy
19040 74 65 20 74 6f 20 7a 65 72 6f 20 62 65 66 6f 72  te to zero befor
19050 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 49 6e 20  e returning. In 
19060 74 68 65 20 73 65 63 6f 6e 64 2c 20 0a 2a 2a 20  the second, .** 
19070 73 65 74 20 2a 70 69 45 6e 64 42 6c 6f 63 6b 20  set *piEndBlock 
19080 74 6f 20 74 68 65 20 66 69 72 73 74 20 76 61 6c  to the first val
19090 75 65 20 61 6e 64 20 2a 70 6e 42 79 74 65 20 74  ue and *pnByte t
190a0 6f 20 74 68 65 20 73 65 63 6f 6e 64 2e 0a 2a 2f  o the second..*/
190b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
190c0 33 52 65 61 64 45 6e 64 42 6c 6f 63 6b 46 69 65  3ReadEndBlockFie
190d0 6c 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  ld(.  sqlite3_st
190e0 6d 74 20 2a 70 53 74 6d 74 2c 20 0a 20 20 69 6e  mt *pStmt, .  in
190f0 74 20 69 43 6f 6c 2c 20 0a 20 20 69 36 34 20 2a  t iCol, .  i64 *
19100 70 69 45 6e 64 42 6c 6f 63 6b 2c 0a 20 20 69 36  piEndBlock,.  i6
19110 34 20 2a 70 6e 42 79 74 65 0a 29 7b 0a 20 20 63  4 *pnByte.){.  c
19120 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
19130 61 72 20 2a 7a 54 65 78 74 20 3d 20 73 71 6c 69  ar *zText = sqli
19140 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
19150 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20  pStmt, iCol);.  
19160 69 66 28 20 7a 54 65 78 74 20 29 7b 0a 20 20 20  if( zText ){.   
19170 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
19180 69 4d 75 6c 20 3d 20 31 3b 0a 20 20 20 20 69 36  iMul = 1;.    i6
19190 34 20 69 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20  4 iVal = 0;.    
191a0 66 6f 72 28 69 3d 30 3b 20 7a 54 65 78 74 5b 69  for(i=0; zText[i
191b0 5d 3e 3d 27 30 27 20 26 26 20 7a 54 65 78 74 5b  ]>='0' && zText[
191c0 69 5d 3c 3d 27 39 27 3b 20 69 2b 2b 29 7b 0a 20  i]<='9'; i++){. 
191d0 20 20 20 20 20 69 56 61 6c 20 3d 20 69 56 61 6c       iVal = iVal
191e0 2a 31 30 20 2b 20 28 7a 54 65 78 74 5b 69 5d 20  *10 + (zText[i] 
191f0 2d 20 27 30 27 29 3b 0a 20 20 20 20 7d 0a 20 20  - '0');.    }.  
19200 20 20 2a 70 69 45 6e 64 42 6c 6f 63 6b 20 3d 20    *piEndBlock = 
19210 69 56 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28  iVal;.    while(
19220 20 7a 54 65 78 74 5b 69 5d 3d 3d 27 20 27 20 29   zText[i]==' ' )
19230 20 69 2b 2b 3b 0a 20 20 20 20 69 56 61 6c 20 3d   i++;.    iVal =
19240 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 78   0;.    if( zTex
19250 74 5b 69 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  t[i]=='-' ){.   
19260 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 4d     i++;.      iM
19270 75 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  ul = -1;.    }. 
19280 20 20 20 66 6f 72 28 2f 2a 20 6e 6f 2d 6f 70 20     for(/* no-op 
19290 2a 2f 3b 20 7a 54 65 78 74 5b 69 5d 3e 3d 27 30  */; zText[i]>='0
192a0 27 20 26 26 20 7a 54 65 78 74 5b 69 5d 3c 3d 27  ' && zText[i]<='
192b0 39 27 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  9'; i++){.      
192c0 69 56 61 6c 20 3d 20 69 56 61 6c 2a 31 30 20 2b  iVal = iVal*10 +
192d0 20 28 7a 54 65 78 74 5b 69 5d 20 2d 20 27 30 27   (zText[i] - '0'
192e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e  );.    }.    *pn
192f0 42 79 74 65 20 3d 20 28 69 56 61 6c 20 2a 20 28  Byte = (iVal * (
19300 69 36 34 29 69 4d 75 6c 29 3b 0a 20 20 7d 0a 7d  i64)iMul);.  }.}
19310 0a 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 65 67 6d 65  .../*.** A segme
19320 6e 74 20 6f 66 20 73 69 7a 65 20 6e 42 79 74 65  nt of size nByte
19330 20 62 79 74 65 73 20 68 61 73 20 6a 75 73 74 20   bytes has just 
19340 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
19350 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 0a 2a  absolute level.*
19360 2a 20 69 41 62 73 4c 65 76 65 6c 2e 20 50 72 6f  * iAbsLevel. Pro
19370 6d 6f 74 65 20 61 6e 79 20 73 65 67 6d 65 6e 74  mote any segment
19380 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  s that should be
19390 20 70 72 6f 6d 6f 74 65 64 20 61 73 20 61 20 72   promoted as a r
193a0 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  esult..*/.static
193b0 20 69 6e 74 20 66 74 73 33 50 72 6f 6d 6f 74 65   int fts3Promote
193c0 53 65 67 6d 65 6e 74 73 28 0a 20 20 46 74 73 33  Segments(.  Fts3
193d0 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
193e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
193f0 54 53 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  TS table handle 
19400 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
19410 36 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20  64 iAbsLevel,   
19420 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65       /* Absolute
19430 20 6c 65 76 65 6c 20 6a 75 73 74 20 75 70 64 61   level just upda
19440 74 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ted */.  sqlite3
19450 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 20 20 20  _int64 nByte    
19460 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
19470 20 6f 66 20 6e 65 77 20 73 65 67 6d 65 6e 74 20   of new segment 
19480 61 74 20 69 41 62 73 4c 65 76 65 6c 20 2a 2f 0a  at iAbsLevel */.
19490 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
194a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74  LITE_OK;.  sqlit
194b0 65 33 5f 73 74 6d 74 20 2a 70 52 61 6e 67 65 3b  e3_stmt *pRange;
194c0 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  ..  rc = fts3Sql
194d0 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45  Stmt(p, SQL_SELE
194e0 43 54 5f 4c 45 56 45 4c 5f 52 41 4e 47 45 32 2c  CT_LEVEL_RANGE2,
194f0 20 26 70 52 61 6e 67 65 2c 20 30 29 3b 0a 0a 20   &pRange, 0);.. 
19500 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19510 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 4f  OK ){.    int bO
19520 6b 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 69  k = 0;.    i64 i
19530 4c 61 73 74 20 3d 20 28 69 41 62 73 4c 65 76 65  Last = (iAbsLeve
19540 6c 2f 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41  l/FTS3_SEGDIR_MA
19550 58 4c 45 56 45 4c 20 2b 20 31 29 20 2a 20 46 54  XLEVEL + 1) * FT
19560 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56  S3_SEGDIR_MAXLEV
19570 45 4c 20 2d 20 31 3b 0a 20 20 20 20 69 36 34 20  EL - 1;.    i64 
19580 6e 4c 69 6d 69 74 20 3d 20 28 6e 42 79 74 65 2a  nLimit = (nByte*
19590 33 29 2f 32 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f  3)/2;..    /* Lo
195a0 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 65  op through all e
195b0 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 25 5f  ntries in the %_
195c0 73 65 67 64 69 72 20 74 61 62 6c 65 20 63 6f 72  segdir table cor
195d0 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 0a 20  responding to . 
195e0 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 73 20 69     ** segments i
195f0 6e 20 74 68 69 73 20 69 6e 64 65 78 20 6f 6e 20  n this index on 
19600 6c 65 76 65 6c 73 20 67 72 65 61 74 65 72 20 74  levels greater t
19610 68 61 6e 20 69 41 62 73 4c 65 76 65 6c 2e 20 49  han iAbsLevel. I
19620 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a  f there is.    *
19630 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 73  * at least one s
19640 75 63 68 20 73 65 67 6d 65 6e 74 2c 20 61 6e 64  uch segment, and
19650 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
19660 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 61  to determine tha
19670 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 73 75  t all .    ** su
19680 63 68 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20  ch segments are 
19690 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6e 4c 69  smaller than nLi
196a0 6d 69 74 20 62 79 74 65 73 20 69 6e 20 73 69 7a  mit bytes in siz
196b0 65 2c 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20  e, they will be 
196c0 0a 20 20 20 20 2a 2a 20 70 72 6f 6d 6f 74 65 64  .    ** promoted
196d0 20 74 6f 20 6c 65 76 65 6c 20 69 41 62 73 4c 65   to level iAbsLe
196e0 76 65 6c 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c  vel.  */.    sql
196f0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
19700 70 52 61 6e 67 65 2c 20 31 2c 20 69 41 62 73 4c  pRange, 1, iAbsL
19710 65 76 65 6c 2b 31 29 3b 0a 20 20 20 20 73 71 6c  evel+1);.    sql
19720 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
19730 70 52 61 6e 67 65 2c 20 32 2c 20 69 4c 61 73 74  pRange, 2, iLast
19740 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51  );.    while( SQ
19750 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
19760 33 5f 73 74 65 70 28 70 52 61 6e 67 65 29 20 29  3_step(pRange) )
19770 7b 0a 20 20 20 20 20 20 69 36 34 20 6e 53 69 7a  {.      i64 nSiz
19780 65 20 3d 20 30 2c 20 64 75 6d 6d 79 3b 0a 20 20  e = 0, dummy;.  
19790 20 20 20 20 66 74 73 33 52 65 61 64 45 6e 64 42      fts3ReadEndB
197a0 6c 6f 63 6b 46 69 65 6c 64 28 70 52 61 6e 67 65  lockField(pRange
197b0 2c 20 32 2c 20 26 64 75 6d 6d 79 2c 20 26 6e 53  , 2, &dummy, &nS
197c0 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
197d0 6e 53 69 7a 65 3c 3d 30 20 7c 7c 20 6e 53 69 7a  nSize<=0 || nSiz
197e0 65 3e 6e 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  e>nLimit ){.    
197f0 20 20 20 20 2f 2a 20 49 66 20 6e 53 69 7a 65 3d      /* If nSize=
19800 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 25 5f 73  =0, then the %_s
19810 65 67 64 69 72 2e 65 6e 64 5f 62 6c 6f 63 6b 20  egdir.end_block 
19820 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6e  field does not n
19830 6f 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  ot .        ** c
19840 6f 6e 74 61 69 6e 20 61 20 73 69 7a 65 20 76 61  ontain a size va
19850 6c 75 65 2e 20 54 68 69 73 20 68 61 70 70 65 6e  lue. This happen
19860 73 20 69 66 20 69 74 20 77 61 73 20 77 72 69 74  s if it was writ
19870 74 65 6e 20 62 79 20 61 6e 0a 20 20 20 20 20 20  ten by an.      
19880 20 20 2a 2a 20 6f 6c 64 20 76 65 72 73 69 6f 6e    ** old version
19890 20 6f 66 20 46 54 53 2e 20 49 6e 20 74 68 69 73   of FTS. In this
198a0 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
198b0 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 74 65  possible to dete
198c0 72 6d 69 6e 65 0a 20 20 20 20 20 20 20 20 2a 2a  rmine.        **
198d0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
198e0 20 73 65 67 6d 65 6e 74 2c 20 61 6e 64 20 73 6f   segment, and so
198f0 20 73 65 67 6d 65 6e 74 20 70 72 6f 6d 6f 74 69   segment promoti
19900 6f 6e 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20  on does not.    
19910 20 20 20 20 2a 2a 20 74 61 6b 65 20 70 6c 61 63      ** take plac
19920 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  e.  */.        b
19930 4f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  Ok = 0;.        
19940 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
19950 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20 20       bOk = 1;.  
19960 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
19970 69 74 65 33 5f 72 65 73 65 74 28 70 52 61 6e 67  ite3_reset(pRang
19980 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 62 4f 6b  e);..    if( bOk
19990 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49   ){.      int iI
199a0 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  dx = 0;.      sq
199b0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 55 70 64  lite3_stmt *pUpd
199c0 61 74 65 31 20 3d 20 30 3b 0a 20 20 20 20 20 20  ate1 = 0;.      
199d0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 55  sqlite3_stmt *pU
199e0 70 64 61 74 65 32 20 3d 20 30 3b 0a 0a 20 20 20  pdate2 = 0;..   
199f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19a00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19a10 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
19a20 28 70 2c 20 53 51 4c 5f 55 50 44 41 54 45 5f 4c  (p, SQL_UPDATE_L
19a30 45 56 45 4c 5f 49 44 58 2c 20 26 70 55 70 64 61  EVEL_IDX, &pUpda
19a40 74 65 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  te1, 0);.      }
19a50 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
19a60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19a70 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c      rc = fts3Sql
19a80 53 74 6d 74 28 70 2c 20 53 51 4c 5f 55 50 44 41  Stmt(p, SQL_UPDA
19a90 54 45 5f 4c 45 56 45 4c 2c 20 26 70 55 70 64 61  TE_LEVEL, &pUpda
19aa0 74 65 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  te2, 0);.      }
19ab0 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ..      if( rc==
19ac0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20  SQLITE_OK ){..  
19ad0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
19ae0 72 6f 75 67 68 20 61 6c 6c 20 25 5f 73 65 67 64  rough all %_segd
19af0 69 72 20 65 6e 74 72 69 65 73 20 66 6f 72 20 73  ir entries for s
19b00 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20  egments in this 
19b10 69 6e 64 65 78 20 77 69 74 68 0a 20 20 20 20 20  index with.     
19b20 20 20 20 2a 2a 20 6c 65 76 65 6c 73 20 65 71 75     ** levels equ
19b30 61 6c 20 74 6f 20 6f 72 20 67 72 65 61 74 65 72  al to or greater
19b40 20 74 68 61 6e 20 69 41 62 73 4c 65 76 65 6c 2e   than iAbsLevel.
19b50 20 41 73 20 65 61 63 68 20 65 6e 74 72 79 20 69   As each entry i
19b60 73 20 76 69 73 69 74 65 64 2c 0a 20 20 20 20 20  s visited,.     
19b70 20 20 20 2a 2a 20 75 70 64 61 74 65 64 20 69 74     ** updated it
19b80 20 74 6f 20 73 65 74 20 28 6c 65 76 65 6c 20 3d   to set (level =
19b90 20 2d 31 29 20 61 6e 64 20 28 69 64 78 20 3d 20   -1) and (idx = 
19ba0 4e 29 2c 20 77 68 65 72 65 20 4e 20 69 73 20 30  N), where N is 0
19bb0 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 20   for the.       
19bc0 20 2a 2a 20 6f 6c 64 65 73 74 20 73 65 67 6d 65   ** oldest segme
19bd0 6e 74 20 69 6e 20 74 68 65 20 72 61 6e 67 65 2c  nt in the range,
19be0 20 31 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20   1 for the next 
19bf0 6f 6c 64 65 73 74 2c 20 61 6e 64 20 73 6f 20 6f  oldest, and so o
19c00 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  n..        **.  
19c10 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65        ** In othe
19c20 72 20 77 6f 72 64 73 2c 20 6d 6f 76 65 20 61 6c  r words, move al
19c30 6c 20 73 65 67 6d 65 6e 74 73 20 62 65 69 6e 67  l segments being
19c40 20 70 72 6f 6d 6f 74 65 64 20 74 6f 20 6c 65 76   promoted to lev
19c50 65 6c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 2a  el -1,.        *
19c60 2a 20 73 65 74 74 69 6e 67 20 74 68 65 20 22 69  * setting the "i
19c70 64 78 22 20 66 69 65 6c 64 73 20 61 73 20 61 70  dx" fields as ap
19c80 70 72 6f 70 72 69 61 74 65 20 74 6f 20 6b 65 65  propriate to kee
19c90 70 20 74 68 65 6d 20 69 6e 20 74 68 65 20 73 61  p them in the sa
19ca0 6d 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  me.        ** or
19cb0 64 65 72 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74  der. The content
19cc0 73 20 6f 66 20 6c 65 76 65 6c 20 2d 31 20 28 77  s of level -1 (w
19cd0 68 69 63 68 20 69 73 20 6e 65 76 65 72 20 75 73  hich is never us
19ce0 65 64 2c 20 65 78 63 65 70 74 0a 20 20 20 20 20  ed, except.     
19cf0 20 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 6c     ** transientl
19d00 79 20 68 65 72 65 29 2c 20 77 69 6c 6c 20 62 65  y here), will be
19d10 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 6c   moved back to l
19d20 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c 20 62  evel iAbsLevel b
19d30 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20  elow.  */.      
19d40 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
19d50 6e 74 36 34 28 70 52 61 6e 67 65 2c 20 31 2c 20  nt64(pRange, 1, 
19d60 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20  iAbsLevel);.    
19d70 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54      while( SQLIT
19d80 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
19d90 74 65 70 28 70 52 61 6e 67 65 29 20 29 7b 0a 20  tep(pRange) ){. 
19da0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
19db0 5f 62 69 6e 64 5f 69 6e 74 28 70 55 70 64 61 74  _bind_int(pUpdat
19dc0 65 31 2c 20 31 2c 20 69 49 64 78 2b 2b 29 3b 0a  e1, 1, iIdx++);.
19dd0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
19de0 33 5f 62 69 6e 64 5f 69 6e 74 28 70 55 70 64 61  3_bind_int(pUpda
19df0 74 65 31 2c 20 32 2c 20 73 71 6c 69 74 65 33 5f  te1, 2, sqlite3_
19e00 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 52 61 6e 67  column_int(pRang
19e10 65 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 20 20  e, 0));.        
19e20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
19e30 6e 74 28 70 55 70 64 61 74 65 31 2c 20 33 2c 20  nt(pUpdate1, 3, 
19e40 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
19e50 6e 74 28 70 52 61 6e 67 65 2c 20 31 29 29 3b 0a  nt(pRange, 1));.
19e60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
19e70 33 5f 73 74 65 70 28 70 55 70 64 61 74 65 31 29  3_step(pUpdate1)
19e80 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
19e90 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
19ea0 55 70 64 61 74 65 31 29 3b 0a 20 20 20 20 20 20  Update1);.      
19eb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19ec0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19ed0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
19ee0 65 74 28 70 52 61 6e 67 65 29 3b 0a 20 20 20 20  et(pRange);.    
19ef0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
19f00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
19f10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
19f20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19f30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19f40 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
19f50 65 74 28 70 52 61 6e 67 65 29 3b 0a 20 20 20 20  et(pRange);.    
19f60 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f    }..      /* Mo
19f70 76 65 20 6c 65 76 65 6c 20 2d 31 20 74 6f 20 6c  ve level -1 to l
19f80 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c 20 2a  evel iAbsLevel *
19f90 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  /.      if( rc==
19fa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19fb0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
19fc0 64 5f 69 6e 74 36 34 28 70 55 70 64 61 74 65 32  d_int64(pUpdate2
19fd0 2c 20 31 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b  , 1, iAbsLevel);
19fe0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19ff0 5f 73 74 65 70 28 70 55 70 64 61 74 65 32 29 3b  _step(pUpdate2);
1a000 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1a010 6c 69 74 65 33 5f 72 65 73 65 74 28 70 55 70 64  lite3_reset(pUpd
1a020 61 74 65 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ate2);.      }. 
1a030 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 72 65 74     }.  }...  ret
1a040 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1a050 20 4d 65 72 67 65 20 61 6c 6c 20 6c 65 76 65 6c   Merge all level
1a060 20 69 4c 65 76 65 6c 20 73 65 67 6d 65 6e 74 73   iLevel segments
1a070 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1a080 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 0a   into a single .
1a090 2a 2a 20 69 4c 65 76 65 6c 2b 31 20 73 65 67 6d  ** iLevel+1 segm
1a0a0 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 4c 65 76  ent. Or, if iLev
1a0b0 65 6c 3c 30 2c 20 6d 65 72 67 65 20 61 6c 6c 20  el<0, merge all 
1a0c0 73 65 67 6d 65 6e 74 73 20 69 6e 74 6f 20 61 0a  segments into a.
1a0d0 2a 2a 20 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e  ** single segmen
1a0e0 74 20 77 69 74 68 20 61 20 6c 65 76 65 6c 20 65  t with a level e
1a0f0 71 75 61 6c 20 74 6f 20 74 68 65 20 6e 75 6d 65  qual to the nume
1a100 72 69 63 61 6c 6c 79 20 6c 61 72 67 65 73 74 20  rically largest 
1a110 6c 65 76 65 6c 20 0a 2a 2a 20 63 75 72 72 65 6e  level .** curren
1a120 74 6c 79 20 70 72 65 73 65 6e 74 20 69 6e 20 74  tly present in t
1a130 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
1a140 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  ** If this funct
1a150 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 69  ion is called wi
1a160 74 68 20 69 4c 65 76 65 6c 3c 30 2c 20 62 75 74  th iLevel<0, but
1a170 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f   there is only o
1a180 6e 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 69 6e  ne.** segment in
1a190 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 53   the database, S
1a1a0 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65  QLITE_DONE is re
1a1b0 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  turned immediate
1a1c0 6c 79 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ly. .** Otherwis
1a1d0 65 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  e, if successful
1a1e0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1a1f0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
1a200 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 0a 2a 2a  rror occurs, .**
1a210 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1a220 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1a230 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1a240 20 66 74 73 33 53 65 67 6d 65 6e 74 4d 65 72 67   fts3SegmentMerg
1a250 65 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  e(.  Fts3Table *
1a260 70 2c 20 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69  p, .  int iLangi
1a270 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
1a280 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67        /* Languag
1a290 65 20 69 64 20 74 6f 20 6d 65 72 67 65 20 2a 2f  e id to merge */
1a2a0 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 2c 20 20  .  int iIndex,  
1a2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2c0 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
1a2d0 2d 3e 61 49 6e 64 65 78 5b 5d 20 74 6f 20 6d 65  ->aIndex[] to me
1a2e0 72 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  rge */.  int iLe
1a2f0 76 65 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  vel             
1a300 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65           /* Leve
1a310 6c 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29 7b  l to merge */.){
1a320 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1a330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a340 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1a350 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20  e */.  int iIdx 
1a360 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1a370 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1a380 6f 66 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 2a  of new segment *
1a390 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
1a3a0 34 20 69 4e 65 77 4c 65 76 65 6c 20 3d 20 30 3b  4 iNewLevel = 0;
1a3b0 20 20 20 20 2f 2a 20 4c 65 76 65 6c 2f 69 6e 64      /* Level/ind
1a3c0 65 78 20 74 6f 20 63 72 65 61 74 65 20 6e 65 77  ex to create new
1a3d0 20 73 65 67 6d 65 6e 74 20 61 74 20 2a 2f 0a 20   segment at */. 
1a3e0 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 2a   SegmentWriter *
1a3f0 70 57 72 69 74 65 72 20 3d 20 30 3b 20 20 20 20  pWriter = 0;    
1a400 20 2f 2a 20 55 73 65 64 20 74 6f 20 77 72 69 74   /* Used to writ
1a410 65 20 74 68 65 20 6e 65 77 2c 20 6d 65 72 67 65  e the new, merge
1a420 64 2c 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  d, segment */.  
1a430 46 74 73 33 53 65 67 46 69 6c 74 65 72 20 66 69  Fts3SegFilter fi
1a440 6c 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  lter;           
1a450 2f 2a 20 53 65 67 6d 65 6e 74 20 74 65 72 6d 20  /* Segment term 
1a460 66 69 6c 74 65 72 20 63 6f 6e 64 69 74 69 6f 6e  filter condition
1a470 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53   */.  Fts3MultiS
1a480 65 67 52 65 61 64 65 72 20 63 73 72 3b 20 20 20  egReader csr;   
1a490 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
1a4a0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
1a4b0 67 68 20 6c 65 76 65 6c 28 73 29 20 2a 2f 0a 20  gh level(s) */. 
1a4c0 20 69 6e 74 20 62 49 67 6e 6f 72 65 45 6d 70 74   int bIgnoreEmpt
1a4d0 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  y = 0;          
1a4e0 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 67 6e 6f   /* True to igno
1a4f0 72 65 20 65 6d 70 74 79 20 73 65 67 6d 65 6e 74  re empty segment
1a500 73 20 2a 2f 0a 20 20 69 36 34 20 69 4d 61 78 4c  s */.  i64 iMaxL
1a510 65 76 65 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  evel = 0;       
1a520 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 20 6c 65         /* Max le
1a530 76 65 6c 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  vel number for t
1a540 68 69 73 20 69 6e 64 65 78 2f 6c 61 6e 67 69 64  his index/langid
1a550 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
1a560 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43  Level==FTS3_SEGC
1a570 55 52 53 4f 52 5f 41 4c 4c 0a 20 20 20 20 20 20  URSOR_ALL.      
1a580 20 7c 7c 20 69 4c 65 76 65 6c 3d 3d 46 54 53 33   || iLevel==FTS3
1a590 5f 53 45 47 43 55 52 53 4f 52 5f 50 45 4e 44 49  _SEGCURSOR_PENDI
1a5a0 4e 47 0a 20 20 20 20 20 20 20 7c 7c 20 69 4c 65  NG.       || iLe
1a5b0 76 65 6c 3e 3d 30 0a 20 20 29 3b 0a 20 20 61 73  vel>=0.  );.  as
1a5c0 73 65 72 74 28 20 69 4c 65 76 65 6c 3c 46 54 53  sert( iLevel<FTS
1a5d0 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45  3_SEGDIR_MAXLEVE
1a5e0 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  L );.  assert( i
1a5f0 49 6e 64 65 78 3e 3d 30 20 26 26 20 69 49 6e 64  Index>=0 && iInd
1a600 65 78 3c 70 2d 3e 6e 49 6e 64 65 78 20 29 3b 0a  ex<p->nIndex );.
1a610 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46  .  rc = sqlite3F
1a620 74 73 33 53 65 67 52 65 61 64 65 72 43 75 72 73  ts3SegReaderCurs
1a630 6f 72 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69  or(p, iLangid, i
1a640 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 2c 20 30  Index, iLevel, 0
1a650 2c 20 30 2c 20 31 2c 20 30 2c 20 26 63 73 72 29  , 0, 1, 0, &csr)
1a660 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1a670 54 45 5f 4f 4b 20 7c 7c 20 63 73 72 2e 6e 53 65  TE_OK || csr.nSe
1a680 67 6d 65 6e 74 3d 3d 30 20 29 20 67 6f 74 6f 20  gment==0 ) goto 
1a690 66 69 6e 69 73 68 65 64 3b 0a 0a 20 20 69 66 28  finished;..  if(
1a6a0 20 69 4c 65 76 65 6c 21 3d 46 54 53 33 5f 53 45   iLevel!=FTS3_SE
1a6b0 47 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 20  GCURSOR_PENDING 
1a6c0 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  ){.    rc = fts3
1a6d0 53 65 67 6d 65 6e 74 4d 61 78 4c 65 76 65 6c 28  SegmentMaxLevel(
1a6e0 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64  p, iLangid, iInd
1a6f0 65 78 2c 20 26 69 4d 61 78 4c 65 76 65 6c 29 3b  ex, &iMaxLevel);
1a700 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1a710 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69  ITE_OK ) goto fi
1a720 6e 69 73 68 65 64 3b 0a 20 20 7d 0a 0a 20 20 69  nished;.  }..  i
1a730 66 28 20 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f  f( iLevel==FTS3_
1a740 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c 20 29 7b  SEGCURSOR_ALL ){
1a750 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c  .    /* This cal
1a760 6c 20 69 73 20 74 6f 20 6d 65 72 67 65 20 61 6c  l is to merge al
1a770 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68  l segments in th
1a780 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 20  e database to a 
1a790 73 69 6e 67 6c 65 0a 20 20 20 20 2a 2a 20 73 65  single.    ** se
1a7a0 67 6d 65 6e 74 2e 20 54 68 65 20 6c 65 76 65 6c  gment. The level
1a7b0 20 6f 66 20 74 68 65 20 6e 65 77 20 73 65 67 6d   of the new segm
1a7c0 65 6e 74 20 69 73 20 65 71 75 61 6c 20 74 6f 20  ent is equal to 
1a7d0 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 0a  the numerically.
1a7e0 20 20 20 20 2a 2a 20 67 72 65 61 74 65 73 74 20      ** greatest 
1a7f0 73 65 67 6d 65 6e 74 20 6c 65 76 65 6c 20 63 75  segment level cu
1a800 72 72 65 6e 74 6c 79 20 70 72 65 73 65 6e 74 20  rrently present 
1a810 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1a820 66 6f 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  for this.    ** 
1a830 69 6e 64 65 78 2e 20 54 68 65 20 69 64 78 20 6f  index. The idx o
1a840 66 20 74 68 65 20 6e 65 77 20 73 65 67 6d 65 6e  f the new segmen
1a850 74 20 69 73 20 61 6c 77 61 79 73 20 30 2e 20 20  t is always 0.  
1a860 2a 2f 0a 20 20 20 20 69 66 28 20 63 73 72 2e 6e  */.    if( csr.n
1a870 53 65 67 6d 65 6e 74 3d 3d 31 20 26 26 20 30 3d  Segment==1 && 0=
1a880 3d 66 74 73 33 53 65 67 52 65 61 64 65 72 49 73  =fts3SegReaderIs
1a890 50 65 6e 64 69 6e 67 28 63 73 72 2e 61 70 53 65  Pending(csr.apSe
1a8a0 67 6d 65 6e 74 5b 30 5d 29 20 29 7b 0a 20 20 20  gment[0]) ){.   
1a8b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
1a8c0 4f 4e 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ONE;.      goto 
1a8d0 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a  finished;.    }.
1a8e0 20 20 20 20 69 4e 65 77 4c 65 76 65 6c 20 3d 20      iNewLevel = 
1a8f0 69 4d 61 78 4c 65 76 65 6c 3b 0a 20 20 20 20 62  iMaxLevel;.    b
1a900 49 67 6e 6f 72 65 45 6d 70 74 79 20 3d 20 31 3b  IgnoreEmpty = 1;
1a910 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ..  }else{.    /
1a920 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 74  * This call is t
1a930 6f 20 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d  o merge all segm
1a940 65 6e 74 73 20 61 74 20 6c 65 76 65 6c 20 69 4c  ents at level iL
1a950 65 76 65 6c 2e 20 66 69 6e 64 20 74 68 65 20 6e  evel. find the n
1a960 65 78 74 0a 20 20 20 20 2a 2a 20 61 76 61 69 6c  ext.    ** avail
1a970 61 62 6c 65 20 73 65 67 6d 65 6e 74 20 69 6e 64  able segment ind
1a980 65 78 20 61 74 20 6c 65 76 65 6c 20 69 4c 65 76  ex at level iLev
1a990 65 6c 2b 31 2e 20 54 68 65 20 63 61 6c 6c 20 74  el+1. The call t
1a9a0 6f 0a 20 20 20 20 2a 2a 20 66 74 73 33 41 6c 6c  o.    ** fts3All
1a9b0 6f 63 61 74 65 53 65 67 64 69 72 49 64 78 28 29  ocateSegdirIdx()
1a9c0 20 77 69 6c 6c 20 6d 65 72 67 65 20 74 68 65 20   will merge the 
1a9d0 73 65 67 6d 65 6e 74 73 20 61 74 20 6c 65 76 65  segments at leve
1a9e0 6c 20 69 4c 65 76 65 6c 2b 31 20 74 6f 20 0a 20  l iLevel+1 to . 
1a9f0 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69     ** a single i
1aa00 4c 65 76 65 6c 2b 32 20 73 65 67 6d 65 6e 74 20  Level+2 segment 
1aa10 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 2a  if necessary.  *
1aa20 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 46 54  /.    assert( FT
1aa30 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 50 45 4e  S3_SEGCURSOR_PEN
1aa40 44 49 4e 47 3d 3d 2d 31 20 29 3b 0a 20 20 20 20  DING==-1 );.    
1aa50 69 4e 65 77 4c 65 76 65 6c 20 3d 20 67 65 74 41  iNewLevel = getA
1aa60 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20  bsoluteLevel(p, 
1aa70 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c  iLangid, iIndex,
1aa80 20 69 4c 65 76 65 6c 2b 31 29 3b 0a 20 20 20 20   iLevel+1);.    
1aa90 72 63 20 3d 20 66 74 73 33 41 6c 6c 6f 63 61 74  rc = fts3Allocat
1aaa0 65 53 65 67 64 69 72 49 64 78 28 70 2c 20 69 4c  eSegdirIdx(p, iL
1aab0 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69  angid, iIndex, i
1aac0 4c 65 76 65 6c 2b 31 2c 20 26 69 49 64 78 29 3b  Level+1, &iIdx);
1aad0 0a 20 20 20 20 62 49 67 6e 6f 72 65 45 6d 70 74  .    bIgnoreEmpt
1aae0 79 20 3d 20 28 69 4c 65 76 65 6c 21 3d 46 54 53  y = (iLevel!=FTS
1aaf0 33 5f 53 45 47 43 55 52 53 4f 52 5f 50 45 4e 44  3_SEGCURSOR_PEND
1ab00 49 4e 47 29 20 26 26 20 28 69 4e 65 77 4c 65 76  ING) && (iNewLev
1ab10 65 6c 3e 69 4d 61 78 4c 65 76 65 6c 29 3b 0a 20  el>iMaxLevel);. 
1ab20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
1ab30 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69  ITE_OK ) goto fi
1ab40 6e 69 73 68 65 64 3b 0a 0a 20 20 61 73 73 65 72  nished;..  asser
1ab50 74 28 20 63 73 72 2e 6e 53 65 67 6d 65 6e 74 3e  t( csr.nSegment>
1ab60 30 20 29 3b 0a 20 20 61 73 73 65 72 74 5f 66 74  0 );.  assert_ft
1ab70 73 33 5f 6e 63 28 20 69 4e 65 77 4c 65 76 65 6c  s3_nc( iNewLevel
1ab80 3e 3d 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76  >=getAbsoluteLev
1ab90 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69  el(p, iLangid, i
1aba0 49 6e 64 65 78 2c 20 30 29 20 29 3b 0a 20 20 61  Index, 0) );.  a
1abb0 73 73 65 72 74 5f 66 74 73 33 5f 6e 63 28 20 0a  ssert_fts3_nc( .
1abc0 20 20 20 20 69 4e 65 77 4c 65 76 65 6c 3c 67 65      iNewLevel<ge
1abd0 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70  tAbsoluteLevel(p
1abe0 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
1abf0 78 2c 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41  x,FTS3_SEGDIR_MA
1ac00 58 4c 45 56 45 4c 29 20 0a 20 20 29 3b 0a 0a 20  XLEVEL) .  );.. 
1ac10 20 6d 65 6d 73 65 74 28 26 66 69 6c 74 65 72 2c   memset(&filter,
1ac20 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 33 53   0, sizeof(Fts3S
1ac30 65 67 46 69 6c 74 65 72 29 29 3b 0a 20 20 66 69  egFilter));.  fi
1ac40 6c 74 65 72 2e 66 6c 61 67 73 20 3d 20 46 54 53  lter.flags = FTS
1ac50 33 5f 53 45 47 4d 45 4e 54 5f 52 45 51 55 49 52  3_SEGMENT_REQUIR
1ac60 45 5f 50 4f 53 3b 0a 20 20 66 69 6c 74 65 72 2e  E_POS;.  filter.
1ac70 66 6c 61 67 73 20 7c 3d 20 28 62 49 67 6e 6f 72  flags |= (bIgnor
1ac80 65 45 6d 70 74 79 20 3f 20 46 54 53 33 5f 53 45  eEmpty ? FTS3_SE
1ac90 47 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d 50  GMENT_IGNORE_EMP
1aca0 54 59 20 3a 20 30 29 3b 0a 0a 20 20 72 63 20 3d  TY : 0);..  rc =
1acb0 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
1acc0 65 61 64 65 72 53 74 61 72 74 28 70 2c 20 26 63  eaderStart(p, &c
1acd0 73 72 2c 20 26 66 69 6c 74 65 72 29 3b 0a 20 20  sr, &filter);.  
1ace0 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 4f 4b  while( SQLITE_OK
1acf0 3d 3d 72 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  ==rc ){.    rc =
1ad00 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
1ad10 65 61 64 65 72 53 74 65 70 28 70 2c 20 26 63 73  eaderStep(p, &cs
1ad20 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
1ad30 53 51 4c 49 54 45 5f 52 4f 57 20 29 20 62 72 65  SQLITE_ROW ) bre
1ad40 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73  ak;.    rc = fts
1ad50 33 53 65 67 57 72 69 74 65 72 41 64 64 28 70 2c  3SegWriterAdd(p,
1ad60 20 26 70 57 72 69 74 65 72 2c 20 31 2c 20 0a 20   &pWriter, 1, . 
1ad70 20 20 20 20 20 20 20 63 73 72 2e 7a 54 65 72 6d         csr.zTerm
1ad80 2c 20 63 73 72 2e 6e 54 65 72 6d 2c 20 63 73 72  , csr.nTerm, csr
1ad90 2e 61 44 6f 63 6c 69 73 74 2c 20 63 73 72 2e 6e  .aDoclist, csr.n
1ada0 44 6f 63 6c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  Doclist);.  }.  
1adb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1adc0 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69 73 68 65  K ) goto finishe
1add0 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 72  d;.  assert( pWr
1ade0 69 74 65 72 20 7c 7c 20 62 49 67 6e 6f 72 65 45  iter || bIgnoreE
1adf0 6d 70 74 79 20 29 3b 0a 0a 20 20 69 66 28 20 69  mpty );..  if( i
1ae00 4c 65 76 65 6c 21 3d 46 54 53 33 5f 53 45 47 43  Level!=FTS3_SEGC
1ae10 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 20 29 7b  URSOR_PENDING ){
1ae20 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 65  .    rc = fts3De
1ae30 6c 65 74 65 53 65 67 64 69 72 28 0a 20 20 20 20  leteSegdir(.    
1ae40 20 20 20 20 70 2c 20 69 4c 61 6e 67 69 64 2c 20      p, iLangid, 
1ae50 69 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 2c 20  iIndex, iLevel, 
1ae60 63 73 72 2e 61 70 53 65 67 6d 65 6e 74 2c 20 63  csr.apSegment, c
1ae70 73 72 2e 6e 53 65 67 6d 65 6e 74 0a 20 20 20 20  sr.nSegment.    
1ae80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1ae90 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1aea0 66 69 6e 69 73 68 65 64 3b 0a 20 20 7d 0a 20 20  finished;.  }.  
1aeb0 69 66 28 20 70 57 72 69 74 65 72 20 29 7b 0a 20  if( pWriter ){. 
1aec0 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 57     rc = fts3SegW
1aed0 72 69 74 65 72 46 6c 75 73 68 28 70 2c 20 70 57  riterFlush(p, pW
1aee0 72 69 74 65 72 2c 20 69 4e 65 77 4c 65 76 65 6c  riter, iNewLevel
1aef0 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 69 66 28  , iIdx);.    if(
1af00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1af10 7b 0a 20 20 20 20 20 20 69 66 28 20 69 4c 65 76  {.      if( iLev
1af20 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53  el==FTS3_SEGCURS
1af30 4f 52 5f 50 45 4e 44 49 4e 47 20 7c 7c 20 69 4e  OR_PENDING || iN
1af40 65 77 4c 65 76 65 6c 3c 69 4d 61 78 4c 65 76 65  ewLevel<iMaxLeve
1af50 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  l ){.        rc 
1af60 3d 20 66 74 73 33 50 72 6f 6d 6f 74 65 53 65 67  = fts3PromoteSeg
1af70 6d 65 6e 74 73 28 70 2c 20 69 4e 65 77 4c 65 76  ments(p, iNewLev
1af80 65 6c 2c 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65  el, pWriter->nLe
1af90 61 66 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d  afData);.      }
1afa0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 66 69 6e  .    }.  }.. fin
1afb0 69 73 68 65 64 3a 0a 20 20 66 74 73 33 53 65 67  ished:.  fts3Seg
1afc0 57 72 69 74 65 72 46 72 65 65 28 70 57 72 69 74  WriterFree(pWrit
1afd0 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74  er);.  sqlite3Ft
1afe0 73 33 53 65 67 52 65 61 64 65 72 46 69 6e 69 73  s3SegReaderFinis
1aff0 68 28 26 63 73 72 29 3b 0a 20 20 72 65 74 75 72  h(&csr);.  retur
1b000 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 20 0a 2a 2a  n rc;.}.../* .**
1b010 20 46 6c 75 73 68 20 74 68 65 20 63 6f 6e 74 65   Flush the conte
1b020 6e 74 73 20 6f 66 20 70 65 6e 64 69 6e 67 54 65  nts of pendingTe
1b030 72 6d 73 20 74 6f 20 6c 65 76 65 6c 20 30 20 73  rms to level 0 s
1b040 65 67 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 69 6e 74  egments. .*/.int
1b050 20 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64   sqlite3Fts3Pend
1b060 69 6e 67 54 65 72 6d 73 46 6c 75 73 68 28 46 74  ingTermsFlush(Ft
1b070 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69  s3Table *p){.  i
1b080 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1b090 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  K;.  int i;.    
1b0a0 20 20 20 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20      .  for(i=0; 
1b0b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1b0c0 20 69 3c 70 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b   i<p->nIndex; i+
1b0d0 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73  +){.    rc = fts
1b0e0 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 70 2c  3SegmentMerge(p,
1b0f0 20 70 2d 3e 69 50 72 65 76 4c 61 6e 67 69 64 2c   p->iPrevLangid,
1b100 20 69 2c 20 46 54 53 33 5f 53 45 47 43 55 52 53   i, FTS3_SEGCURS
1b110 4f 52 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 20  OR_PENDING);.   
1b120 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b130 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49  DONE ) rc = SQLI
1b140 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c  TE_OK;.  }.  sql
1b150 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67 54  ite3Fts3PendingT
1b160 65 72 6d 73 43 6c 65 61 72 28 70 29 3b 0a 0a 20  ermsClear(p);.. 
1b170 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68   /* Determine th
1b180 65 20 61 75 74 6f 2d 69 6e 63 72 2d 6d 65 72 67  e auto-incr-merg
1b190 65 20 73 65 74 74 69 6e 67 20 69 66 20 75 6e 6b  e setting if unk
1b1a0 6e 6f 77 6e 2e 20 20 49 66 20 65 6e 61 62 6c 65  nown.  If enable
1b1b0 64 2c 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74 65  d,.  ** estimate
1b1c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
1b1d0 65 61 66 20 62 6c 6f 63 6b 73 20 6f 66 20 63 6f  eaf blocks of co
1b1e0 6e 74 65 6e 74 20 74 6f 20 62 65 20 77 72 69 74  ntent to be writ
1b1f0 74 65 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ten.  */.  if( r
1b200 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1b210 70 2d 3e 62 48 61 73 53 74 61 74 0a 20 20 20 26  p->bHasStat.   &
1b220 26 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d 65  & p->nAutoincrme
1b230 72 67 65 3d 3d 30 78 66 66 20 26 26 20 70 2d 3e  rge==0xff && p->
1b240 6e 4c 65 61 66 41 64 64 3e 30 0a 20 20 29 7b 0a  nLeafAdd>0.  ){.
1b250 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
1b260 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20   *pStmt = 0;.   
1b270 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
1b280 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f  t(p, SQL_SELECT_
1b290 53 54 41 54 2c 20 26 70 53 74 6d 74 2c 20 30 29  STAT, &pStmt, 0)
1b2a0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1b2b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b2c0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
1b2d0 74 28 70 53 74 6d 74 2c 20 31 2c 20 46 54 53 5f  t(pStmt, 1, FTS_
1b2e0 53 54 41 54 5f 41 55 54 4f 49 4e 43 52 4d 45 52  STAT_AUTOINCRMER
1b2f0 47 45 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  GE);.      rc = 
1b300 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
1b310 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  mt);.      if( r
1b320 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  c==SQLITE_ROW ){
1b330 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 41 75 74  .        p->nAut
1b340 6f 69 6e 63 72 6d 65 72 67 65 20 3d 20 73 71 6c  oincrmerge = sql
1b350 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
1b360 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
1b370 20 20 20 69 66 28 20 70 2d 3e 6e 41 75 74 6f 69     if( p->nAutoi
1b380 6e 63 72 6d 65 72 67 65 3d 3d 31 20 29 20 70 2d  ncrmerge==1 ) p-
1b390 3e 6e 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 20  >nAutoincrmerge 
1b3a0 3d 20 38 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 8;.      }else
1b3b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b3c0 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
1b3d0 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d 65 72 67  p->nAutoincrmerg
1b3e0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
1b3f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1b400 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
1b410 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1b420 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1b430 45 6e 63 6f 64 65 20 4e 20 69 6e 74 65 67 65 72  Encode N integer
1b440 73 20 61 73 20 76 61 72 69 6e 74 73 20 69 6e 74  s as varints int
1b450 6f 20 61 20 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61  o a blob..*/.sta
1b460 74 69 63 20 76 6f 69 64 20 66 74 73 33 45 6e 63  tic void fts3Enc
1b470 6f 64 65 49 6e 74 41 72 72 61 79 28 0a 20 20 69  odeIntArray(.  i
1b480 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
1b490 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
1b4a0 6f 66 20 69 6e 74 65 67 65 72 73 20 74 6f 20 65  of integers to e
1b4b0 6e 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 2a  ncode */.  u32 *
1b4c0 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  a,            /*
1b4d0 20 54 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   The integer val
1b4e0 75 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ues */.  char *z
1b4f0 42 75 66 2c 20 20 20 20 20 20 20 20 2f 2a 20 57  Buf,        /* W
1b500 72 69 74 65 20 74 68 65 20 42 4c 4f 42 20 68 65  rite the BLOB he
1b510 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 42  re */.  int *pNB
1b520 75 66 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  uf         /* Wr
1b530 69 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  ite number of by
1b540 74 65 73 20 69 66 20 7a 42 75 66 5b 5d 20 75 73  tes if zBuf[] us
1b550 65 64 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ed here */.){.  
1b560 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28  int i, j;.  for(
1b570 69 3d 6a 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29  i=j=0; i<N; i++)
1b580 7b 0a 20 20 20 20 6a 20 2b 3d 20 73 71 6c 69 74  {.    j += sqlit
1b590 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28  e3Fts3PutVarint(
1b5a0 26 7a 42 75 66 5b 6a 5d 2c 20 28 73 71 6c 69 74  &zBuf[j], (sqlit
1b5b0 65 33 5f 69 6e 74 36 34 29 61 5b 69 5d 29 3b 0a  e3_int64)a[i]);.
1b5c0 20 20 7d 0a 20 20 2a 70 4e 42 75 66 20 3d 20 6a    }.  *pNBuf = j
1b5d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
1b5e0 65 20 61 20 62 6c 6f 62 20 6f 66 20 76 61 72 69  e a blob of vari
1b5f0 6e 74 73 20 69 6e 74 6f 20 4e 20 69 6e 74 65 67  nts into N integ
1b600 65 72 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ers.*/.static vo
1b610 69 64 20 66 74 73 33 44 65 63 6f 64 65 49 6e 74  id fts3DecodeInt
1b620 41 72 72 61 79 28 0a 20 20 69 6e 74 20 4e 2c 20  Array(.  int N, 
1b630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b640 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 74  he number of int
1b650 65 67 65 72 73 20 74 6f 20 64 65 63 6f 64 65 20  egers to decode 
1b660 2a 2f 0a 20 20 75 33 32 20 2a 61 2c 20 20 20 20  */.  u32 *a,    
1b670 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1b680 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
1b690 75 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ues */.  const c
1b6a0 68 61 72 20 2a 7a 42 75 66 2c 20 20 2f 2a 20 54  har *zBuf,  /* T
1b6b0 68 65 20 42 4c 4f 42 20 63 6f 6e 74 61 69 6e 69  he BLOB containi
1b6c0 6e 67 20 74 68 65 20 76 61 72 69 6e 74 73 20 2a  ng the varints *
1b6d0 2f 0a 20 20 69 6e 74 20 6e 42 75 66 20 20 20 20  /.  int nBuf    
1b6e0 20 20 20 20 20 20 20 2f 2a 20 73 69 7a 65 20 6f         /* size o
1b6f0 66 20 74 68 65 20 42 4c 4f 42 20 2a 2f 0a 29 7b  f the BLOB */.){
1b700 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
1b710 69 66 28 20 6e 42 75 66 20 26 26 20 28 7a 42 75  if( nBuf && (zBu
1b720 66 5b 6e 42 75 66 2d 31 5d 26 30 78 38 30 29 3d  f[nBuf-1]&0x80)=
1b730 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b  =0 ){.    int j;
1b740 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  .    for(i=j=0; 
1b750 69 3c 4e 20 26 26 20 6a 3c 6e 42 75 66 3b 20 69  i<N && j<nBuf; i
1b760 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
1b770 65 33 5f 69 6e 74 36 34 20 78 3b 0a 20 20 20 20  e3_int64 x;.    
1b780 20 20 6a 20 2b 3d 20 73 71 6c 69 74 65 33 46 74    j += sqlite3Ft
1b790 73 33 47 65 74 56 61 72 69 6e 74 28 26 7a 42 75  s3GetVarint(&zBu
1b7a0 66 5b 6a 5d 2c 20 26 78 29 3b 0a 20 20 20 20 20  f[j], &x);.     
1b7b0 20 61 5b 69 5d 20 3d 20 28 75 33 32 29 28 78 20   a[i] = (u32)(x 
1b7c0 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  & 0xffffffff);. 
1b7d0 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c 65     }.  }.  while
1b7e0 28 20 69 3c 4e 20 29 20 61 5b 69 2b 2b 5d 20 3d  ( i<N ) a[i++] =
1b7f0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73   0;.}../*.** Ins
1b800 65 72 74 20 74 68 65 20 73 69 7a 65 73 20 28 69  ert the sizes (i
1b810 6e 20 74 6f 6b 65 6e 73 29 20 66 6f 72 20 65 61  n tokens) for ea
1b820 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ch column of the
1b830 20 64 6f 63 75 6d 65 6e 74 0a 2a 2a 20 77 69 74   document.** wit
1b840 68 20 64 6f 63 69 64 20 65 71 75 61 6c 20 74 6f  h docid equal to
1b850 20 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 2e 20   p->iPrevDocid. 
1b860 20 54 68 65 20 73 69 7a 65 73 20 61 72 65 20 65   The sizes are e
1b870 6e 63 6f 64 65 64 20 61 73 0a 2a 2a 20 61 20 62  ncoded as.** a b
1b880 6c 6f 62 20 6f 66 20 76 61 72 69 6e 74 73 2e 0a  lob of varints..
1b890 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1b8a0 74 73 33 49 6e 73 65 72 74 44 6f 63 73 69 7a 65  ts3InsertDocsize
1b8b0 28 0a 20 20 69 6e 74 20 2a 70 52 43 2c 20 20 20  (.  int *pRC,   
1b8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8d0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
1b8e0 64 65 20 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c  de */.  Fts3Tabl
1b8f0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
1b900 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1b910 20 69 6e 74 6f 20 77 68 69 63 68 20 74 6f 20 69   into which to i
1b920 6e 73 65 72 74 20 2a 2f 0a 20 20 75 33 32 20 2a  nsert */.  u32 *
1b930 61 53 7a 20 20 20 20 20 20 20 20 20 20 20 20 20  aSz             
1b940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1b950 7a 65 73 20 6f 66 20 65 61 63 68 20 63 6f 6c 75  zes of each colu
1b960 6d 6e 2c 20 69 6e 20 74 6f 6b 65 6e 73 20 2a 2f  mn, in tokens */
1b970 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 42 6c 6f  .){.  char *pBlo
1b980 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b;             /
1b990 2a 20 54 68 65 20 42 4c 4f 42 20 65 6e 63 6f 64  * The BLOB encod
1b9a0 69 6e 67 20 6f 66 20 74 68 65 20 64 6f 63 75 6d  ing of the docum
1b9b0 65 6e 74 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e  ent size */.  in
1b9c0 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20  t nBlob;        
1b9d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1b9e0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
1b9f0 20 42 4c 4f 42 20 2a 2f 0a 20 20 73 71 6c 69 74   BLOB */.  sqlit
1ba00 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20  e3_stmt *pStmt; 
1ba10 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
1ba20 20 75 73 65 64 20 74 6f 20 69 6e 73 65 72 74 20   used to insert 
1ba30 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a  the encoding */.
1ba40 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1ba50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1ba60 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73  sult code from s
1ba70 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a  ubfunctions */..
1ba80 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
1ba90 75 72 6e 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 73  urn;.  pBlob = s
1baa0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
1bab0 20 31 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74   10*(sqlite3_int
1bac0 36 34 29 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  64)p->nColumn );
1bad0 0a 20 20 69 66 28 20 70 42 6c 6f 62 3d 3d 30 20  .  if( pBlob==0 
1bae0 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51  ){.    *pRC = SQ
1baf0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1bb00 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 74  return;.  }.  ft
1bb10 73 33 45 6e 63 6f 64 65 49 6e 74 41 72 72 61 79  s3EncodeIntArray
1bb20 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 61 53 7a  (p->nColumn, aSz
1bb30 2c 20 70 42 6c 6f 62 2c 20 26 6e 42 6c 6f 62 29  , pBlob, &nBlob)
1bb40 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  ;.  rc = fts3Sql
1bb50 53 74 6d 74 28 70 2c 20 53 51 4c 5f 52 45 50 4c  Stmt(p, SQL_REPL
1bb60 41 43 45 5f 44 4f 43 53 49 5a 45 2c 20 26 70 53  ACE_DOCSIZE, &pS
1bb70 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tmt, 0);.  if( r
1bb80 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
1bb90 5f 66 72 65 65 28 70 42 6c 6f 62 29 3b 0a 20 20  _free(pBlob);.  
1bba0 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
1bbb0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
1bbc0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
1bbd0 34 28 70 53 74 6d 74 2c 20 31 2c 20 70 2d 3e 69  4(pStmt, 1, p->i
1bbe0 50 72 65 76 44 6f 63 69 64 29 3b 0a 20 20 73 71  PrevDocid);.  sq
1bbf0 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28  lite3_bind_blob(
1bc00 70 53 74 6d 74 2c 20 32 2c 20 70 42 6c 6f 62 2c  pStmt, 2, pBlob,
1bc10 20 6e 42 6c 6f 62 2c 20 73 71 6c 69 74 65 33 5f   nBlob, sqlite3_
1bc20 66 72 65 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  free);.  sqlite3
1bc30 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
1bc40 2a 70 52 43 20 3d 20 73 71 6c 69 74 65 33 5f 72  *pRC = sqlite3_r
1bc50 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a  eset(pStmt);.}..
1bc60 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 30 20 6f  /*.** Record 0 o
1bc70 66 20 74 68 65 20 25 5f 73 74 61 74 20 74 61 62  f the %_stat tab
1bc80 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 62 6c  le contains a bl
1bc90 6f 62 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ob consisting of
1bca0 20 4e 20 76 61 72 69 6e 74 73 2c 0a 2a 2a 20 77   N varints,.** w
1bcb0 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75  here N is the nu
1bcc0 6d 62 65 72 20 6f 66 20 75 73 65 72 20 64 65 66  mber of user def
1bcd0 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  ined columns in 
1bce0 74 68 65 20 66 74 73 33 20 74 61 62 6c 65 20 70  the fts3 table p
1bcf0 6c 75 73 0a 2a 2a 20 74 77 6f 2e 20 49 66 20 6e  lus.** two. If n
1bd00 43 6f 6c 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Col is the numbe
1bd10 72 20 6f 66 20 75 73 65 72 20 64 65 66 69 6e 65  r of user define
1bd20 64 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  d columns, then 
1bd30 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 0a 2a  values of the .*
1bd40 2a 20 76 61 72 69 6e 74 73 20 61 72 65 20 73 65  * varints are se
1bd50 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  t as follows:.**
1bd60 0a 2a 2a 20 20 20 56 61 72 69 6e 74 20 30 3a 20  .**   Varint 0: 
1bd70 20 20 20 20 20 20 54 6f 74 61 6c 20 6e 75 6d 62        Total numb
1bd80 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
1bd90 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  e table..**.**  
1bda0 20 56 61 72 69 6e 74 20 31 2e 2e 6e 43 6f 6c 3a   Varint 1..nCol:
1bdb0 20 46 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   For each column
1bdc0 2c 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  , the total numb
1bdd0 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 73 74 6f  er of tokens sto
1bde0 72 65 64 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  red in.**       
1bdf0 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
1be00 63 6f 6c 75 6d 6e 20 66 6f 72 20 61 6c 6c 20 72  column for all r
1be10 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ows of the table
1be20 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 6e 74  ..**.**   Varint
1be30 20 31 2b 6e 43 6f 6c 3a 20 20 54 68 65 20 74 6f   1+nCol:  The to
1be40 74 61 6c 20 73 69 7a 65 2c 20 69 6e 20 62 79 74  tal size, in byt
1be50 65 73 2c 20 6f 66 20 61 6c 6c 20 74 65 78 74 20  es, of all text 
1be60 76 61 6c 75 65 73 20 69 6e 20 61 6c 6c 0a 2a 2a  values in all.**
1be70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be80 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 6c     columns of al
1be90 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61  l rows of the ta
1bea0 62 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  ble..**.*/.stati
1beb0 63 20 76 6f 69 64 20 66 74 73 33 55 70 64 61 74  c void fts3Updat
1bec0 65 44 6f 63 54 6f 74 61 6c 73 28 0a 20 20 69 6e  eDocTotals(.  in
1bed0 74 20 2a 70 52 43 2c 20 20 20 20 20 20 20 20 20  t *pRC,         
1bee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bef0 20 54 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   The result code
1bf00 20 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c 65 20   */.  Fts3Table 
1bf10 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1bf20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62        /* Table b
1bf30 65 69 6e 67 20 75 70 64 61 74 65 64 20 2a 2f 0a  eing updated */.
1bf40 20 20 75 33 32 20 2a 61 53 7a 49 6e 73 2c 20 20    u32 *aSzIns,  
1bf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf60 20 20 2f 2a 20 53 69 7a 65 20 69 6e 63 72 65 61    /* Size increa
1bf70 73 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 61 53  ses */.  u32 *aS
1bf80 7a 44 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  zDel,           
1bf90 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1bfa0 20 64 65 63 72 65 61 73 65 73 20 2a 2f 0a 20 20   decreases */.  
1bfb0 69 6e 74 20 6e 43 68 6e 67 20 20 20 20 20 20 20  int nChng       
1bfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfd0 2f 2a 20 43 68 61 6e 67 65 20 69 6e 20 74 68 65  /* Change in the
1bfe0 20 6e 75 6d 62 65 72 20 6f 66 20 64 6f 63 75 6d   number of docum
1bff0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  ents */.){.  cha
1c000 72 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20 20 20  r *pBlob;       
1c010 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 61 67 65        /* Storage
1c020 20 66 6f 72 20 42 4c 4f 42 20 77 72 69 74 74 65   for BLOB writte
1c030 6e 20 69 6e 74 6f 20 25 5f 73 74 61 74 20 2a 2f  n into %_stat */
1c040 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20  .  int nBlob;   
1c050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1c060 69 7a 65 20 6f 66 20 42 4c 4f 42 20 77 72 69 74  ize of BLOB writ
1c070 74 65 6e 20 69 6e 74 6f 20 25 5f 73 74 61 74 20  ten into %_stat 
1c080 2a 2f 0a 20 20 75 33 32 20 2a 61 3b 20 20 20 20  */.  u32 *a;    
1c090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c0a0 20 41 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65   Array of intege
1c0b0 72 73 20 74 68 61 74 20 62 65 63 6f 6d 65 73 20  rs that becomes 
1c0c0 74 68 65 20 42 4c 4f 42 20 2a 2f 0a 20 20 73 71  the BLOB */.  sq
1c0d0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1c0e0 74 3b 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d  t;     /* Statem
1c0f0 65 6e 74 20 66 6f 72 20 72 65 61 64 69 6e 67 20  ent for reading 
1c100 61 6e 64 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20  and writing */. 
1c110 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1c120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1c130 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
1c140 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1c150 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1c160 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66  t code from subf
1c170 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 63  unctions */..  c
1c180 6f 6e 73 74 20 69 6e 74 20 6e 53 74 61 74 20 3d  onst int nStat =
1c190 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 3b 0a 0a   p->nColumn+2;..
1c1a0 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
1c1b0 75 72 6e 3b 0a 20 20 61 20 3d 20 73 71 6c 69 74  urn;.  a = sqlit
1c1c0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 28 73 69  e3_malloc64( (si
1c1d0 7a 65 6f 66 28 75 33 32 29 2b 31 30 29 2a 28 73  zeof(u32)+10)*(s
1c1e0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 6e 53 74  qlite3_int64)nSt
1c1f0 61 74 20 29 3b 0a 20 20 69 66 28 20 61 3d 3d 30  at );.  if( a==0
1c200 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
1c210 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1c220 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
1c230 42 6c 6f 62 20 3d 20 28 63 68 61 72 2a 29 26 61  Blob = (char*)&a
1c240 5b 6e 53 74 61 74 5d 3b 0a 20 20 72 63 20 3d 20  [nStat];.  rc = 
1c250 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
1c260 51 4c 5f 53 45 4c 45 43 54 5f 53 54 41 54 2c 20  QL_SELECT_STAT, 
1c270 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66  &pStmt, 0);.  if
1c280 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( rc ){.    sqli
1c290 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20 20  te3_free(a);.   
1c2a0 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
1c2b0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
1c2c0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
1c2d0 53 74 6d 74 2c 20 31 2c 20 46 54 53 5f 53 54 41  Stmt, 1, FTS_STA
1c2e0 54 5f 44 4f 43 54 4f 54 41 4c 29 3b 0a 20 20 69  T_DOCTOTAL);.  i
1c2f0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  f( sqlite3_step(
1c300 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
1c310 4f 57 20 29 7b 0a 20 20 20 20 66 74 73 33 44 65  OW ){.    fts3De
1c320 63 6f 64 65 49 6e 74 41 72 72 61 79 28 6e 53 74  codeIntArray(nSt
1c330 61 74 2c 20 61 2c 0a 20 20 20 20 20 20 20 20 20  at, a,.         
1c340 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1c350 6c 6f 62 28 70 53 74 6d 74 2c 20 30 29 2c 0a 20  lob(pStmt, 0),. 
1c360 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1c370 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
1c380 6d 74 2c 20 30 29 29 3b 0a 20 20 7d 65 6c 73 65  mt, 0));.  }else
1c390 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 61 2c 20  {.    memset(a, 
1c3a0 30 2c 20 73 69 7a 65 6f 66 28 75 33 32 29 2a 28  0, sizeof(u32)*(
1c3b0 6e 53 74 61 74 29 20 29 3b 0a 20 20 7d 0a 20 20  nStat) );.  }.  
1c3c0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
1c3d0 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  et(pStmt);.  if(
1c3e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c3f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
1c400 65 65 28 61 29 3b 0a 20 20 20 20 2a 70 52 43 20  ee(a);.    *pRC 
1c410 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
1c420 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 43 68 6e  ;.  }.  if( nChn
1c430 67 3c 30 20 26 26 20 61 5b 30 5d 3c 28 75 33 32  g<0 && a[0]<(u32
1c440 29 28 2d 6e 43 68 6e 67 29 20 29 7b 0a 20 20 20  )(-nChng) ){.   
1c450 20 61 5b 30 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c   a[0] = 0;.  }el
1c460 73 65 7b 0a 20 20 20 20 61 5b 30 5d 20 2b 3d 20  se{.    a[0] += 
1c470 6e 43 68 6e 67 3b 0a 20 20 7d 0a 20 20 66 6f 72  nChng;.  }.  for
1c480 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 75  (i=0; i<p->nColu
1c490 6d 6e 2b 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mn+1; i++){.    
1c4a0 75 33 32 20 78 20 3d 20 61 5b 69 2b 31 5d 3b 0a  u32 x = a[i+1];.
1c4b0 20 20 20 20 69 66 28 20 78 2b 61 53 7a 49 6e 73      if( x+aSzIns
1c4c0 5b 69 5d 20 3c 20 61 53 7a 44 65 6c 5b 69 5d 20  [i] < aSzDel[i] 
1c4d0 29 7b 0a 20 20 20 20 20 20 78 20 3d 20 30 3b 0a  ){.      x = 0;.
1c4e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c4f0 20 78 20 3d 20 78 20 2b 20 61 53 7a 49 6e 73 5b   x = x + aSzIns[
1c500 69 5d 20 2d 20 61 53 7a 44 65 6c 5b 69 5d 3b 0a  i] - aSzDel[i];.
1c510 20 20 20 20 7d 0a 20 20 20 20 61 5b 69 2b 31 5d      }.    a[i+1]
1c520 20 3d 20 78 3b 0a 20 20 7d 0a 20 20 66 74 73 33   = x;.  }.  fts3
1c530 45 6e 63 6f 64 65 49 6e 74 41 72 72 61 79 28 6e  EncodeIntArray(n
1c540 53 74 61 74 2c 20 61 2c 20 70 42 6c 6f 62 2c 20  Stat, a, pBlob, 
1c550 26 6e 42 6c 6f 62 29 3b 0a 20 20 72 63 20 3d 20  &nBlob);.  rc = 
1c560 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
1c570 51 4c 5f 52 45 50 4c 41 43 45 5f 53 54 41 54 2c  QL_REPLACE_STAT,
1c580 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69   &pStmt, 0);.  i
1c590 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c  f( rc ){.    sql
1c5a0 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20  ite3_free(a);.  
1c5b0 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
1c5c0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
1c5d0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
1c5e0 70 53 74 6d 74 2c 20 31 2c 20 46 54 53 5f 53 54  pStmt, 1, FTS_ST
1c5f0 41 54 5f 44 4f 43 54 4f 54 41 4c 29 3b 0a 20 20  AT_DOCTOTAL);.  
1c600 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
1c610 62 28 70 53 74 6d 74 2c 20 32 2c 20 70 42 6c 6f  b(pStmt, 2, pBlo
1c620 62 2c 20 6e 42 6c 6f 62 2c 20 53 51 4c 49 54 45  b, nBlob, SQLITE
1c630 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69  _STATIC);.  sqli
1c640 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
1c650 0a 20 20 2a 70 52 43 20 3d 20 73 71 6c 69 74 65  .  *pRC = sqlite
1c660 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
1c670 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e    sqlite3_bind_n
1c680 75 6c 6c 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20  ull(pStmt, 2);. 
1c690 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29   sqlite3_free(a)
1c6a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65  ;.}../*.** Merge
1c6b0 20 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61   the entire data
1c6c0 62 61 73 65 20 73 6f 20 74 68 61 74 20 74 68 65  base so that the
1c6d0 72 65 20 69 73 20 6f 6e 65 20 73 65 67 6d 65 6e  re is one segmen
1c6e0 74 20 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20 69  t for each .** i
1c6f0 49 6e 64 65 78 2f 69 4c 61 6e 67 69 64 20 63 6f  Index/iLangid co
1c700 6d 62 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  mbination..*/.st
1c710 61 74 69 63 20 69 6e 74 20 66 74 73 33 44 6f 4f  atic int fts3DoO
1c720 70 74 69 6d 69 7a 65 28 46 74 73 33 54 61 62 6c  ptimize(Fts3Tabl
1c730 65 20 2a 70 2c 20 69 6e 74 20 62 52 65 74 75 72  e *p, int bRetur
1c740 6e 44 6f 6e 65 29 7b 0a 20 20 69 6e 74 20 62 53  nDone){.  int bS
1c750 65 65 6e 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 69  eenDone = 0;.  i
1c760 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
1c770 5f 73 74 6d 74 20 2a 70 41 6c 6c 4c 61 6e 67 69  _stmt *pAllLangi
1c780 64 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 66  d = 0;..  rc = f
1c790 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51  ts3SqlStmt(p, SQ
1c7a0 4c 5f 53 45 4c 45 43 54 5f 41 4c 4c 5f 4c 41 4e  L_SELECT_ALL_LAN
1c7b0 47 49 44 2c 20 26 70 41 6c 6c 4c 61 6e 67 69 64  GID, &pAllLangid
1c7c0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
1c7d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c7e0 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 73 71   int rc2;.    sq
1c7f0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
1c800 41 6c 6c 4c 61 6e 67 69 64 2c 20 31 2c 20 70 2d  AllLangid, 1, p-
1c810 3e 69 50 72 65 76 4c 61 6e 67 69 64 29 3b 0a 20  >iPrevLangid);. 
1c820 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
1c830 69 6e 74 28 70 41 6c 6c 4c 61 6e 67 69 64 2c 20  int(pAllLangid, 
1c840 32 2c 20 70 2d 3e 6e 49 6e 64 65 78 29 3b 0a 20  2, p->nIndex);. 
1c850 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
1c860 33 5f 73 74 65 70 28 70 41 6c 6c 4c 61 6e 67 69  3_step(pAllLangi
1c870 64 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  d)==SQLITE_ROW )
1c880 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
1c890 20 20 20 20 20 69 6e 74 20 69 4c 61 6e 67 69 64       int iLangid
1c8a0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
1c8b0 6e 5f 69 6e 74 28 70 41 6c 6c 4c 61 6e 67 69 64  n_int(pAllLangid
1c8c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  , 0);.      for(
1c8d0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
1c8e0 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 49 6e 64 65  OK && i<p->nInde
1c8f0 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  x; i++){.       
1c900 20 72 63 20 3d 20 66 74 73 33 53 65 67 6d 65 6e   rc = fts3Segmen
1c910 74 4d 65 72 67 65 28 70 2c 20 69 4c 61 6e 67 69  tMerge(p, iLangi
1c920 64 2c 20 69 2c 20 46 54 53 33 5f 53 45 47 43 55  d, i, FTS3_SEGCU
1c930 52 53 4f 52 5f 41 4c 4c 29 3b 0a 20 20 20 20 20  RSOR_ALL);.     
1c940 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c950 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
1c960 20 20 20 20 62 53 65 65 6e 44 6f 6e 65 20 3d 20      bSeenDone = 
1c970 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  1;.          rc 
1c980 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1c990 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1c9a0 20 20 20 7d 0a 20 20 20 20 72 63 32 20 3d 20 73     }.    rc2 = s
1c9b0 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 41 6c  qlite3_reset(pAl
1c9c0 6c 4c 61 6e 67 69 64 29 3b 0a 20 20 20 20 69 66  lLangid);.    if
1c9d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c9e0 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a  ) rc = rc2;.  }.
1c9f0 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65  .  sqlite3Fts3Se
1ca00 67 6d 65 6e 74 73 43 6c 6f 73 65 28 70 29 3b 0a  gmentsClose(p);.
1ca10 20 20 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e    sqlite3Fts3Pen
1ca20 64 69 6e 67 54 65 72 6d 73 43 6c 65 61 72 28 70  dingTermsClear(p
1ca30 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63  );..  return (rc
1ca40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
1ca50 52 65 74 75 72 6e 44 6f 6e 65 20 26 26 20 62 53  ReturnDone && bS
1ca60 65 65 6e 44 6f 6e 65 29 20 3f 20 53 51 4c 49 54  eenDone) ? SQLIT
1ca70 45 5f 44 4f 4e 45 20 3a 20 72 63 3b 0a 7d 0a 0a  E_DONE : rc;.}..
1ca80 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1ca90 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
1caa0 65 6e 20 74 68 65 20 75 73 65 72 20 65 78 65 63  en the user exec
1cab0 75 74 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  utes the followi
1cac0 6e 67 20 73 74 61 74 65 6d 65 6e 74 3a 0a 2a 2a  ng statement:.**
1cad0 0a 2a 2a 20 20 20 20 20 49 4e 53 45 52 54 20 49  .**     INSERT I
1cae0 4e 54 4f 20 3c 74 62 6c 3e 28 3c 74 62 6c 3e 29  NTO <tbl>(<tbl>)
1caf0 20 56 41 4c 55 45 53 28 27 72 65 62 75 69 6c 64   VALUES('rebuild
1cb00 27 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 6e  ');.**.** The en
1cb10 74 69 72 65 20 46 54 53 20 69 6e 64 65 78 20 69  tire FTS index i
1cb20 73 20 64 69 73 63 61 72 64 65 64 20 61 6e 64 20  s discarded and 
1cb30 72 65 62 75 69 6c 74 2e 20 49 66 20 74 68 65 20  rebuilt. If the 
1cb40 74 61 62 6c 65 20 69 73 20 6f 6e 65 20 0a 2a 2a  table is one .**
1cb50 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
1cb60 68 65 20 63 6f 6e 74 65 6e 74 3d 78 78 78 20 6f  he content=xxx o
1cb70 70 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20  ption, then the 
1cb80 6e 65 77 20 69 6e 64 65 78 20 69 73 20 62 61 73  new index is bas
1cb90 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72  ed on.** the cur
1cba0 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66  rent contents of
1cbb0 20 74 68 65 20 78 78 78 20 74 61 62 6c 65 2e 20   the xxx table. 
1cbc0 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 69 73  Otherwise, it is
1cbd0 20 72 65 62 75 69 6c 74 20 62 61 73 65 64 0a 2a   rebuilt based.*
1cbe0 2a 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  * on the content
1cbf0 73 20 6f 66 20 74 68 65 20 25 5f 63 6f 6e 74 65  s of the %_conte
1cc00 6e 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  nt table..*/.sta
1cc10 74 69 63 20 69 6e 74 20 66 74 73 33 44 6f 52 65  tic int fts3DoRe
1cc20 62 75 69 6c 64 28 46 74 73 33 54 61 62 6c 65 20  build(Fts3Table 
1cc30 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  *p){.  int rc;  
1cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc50 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1cc60 20 43 6f 64 65 20 2a 2f 0a 0a 20 20 72 63 20 3d   Code */..  rc =
1cc70 20 66 74 73 33 44 65 6c 65 74 65 41 6c 6c 28 70   fts3DeleteAll(p
1cc80 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
1cc90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cca0 20 75 33 32 20 2a 61 53 7a 20 3d 20 30 3b 0a 20   u32 *aSz = 0;. 
1ccb0 20 20 20 75 33 32 20 2a 61 53 7a 49 6e 73 20 3d     u32 *aSzIns =
1ccc0 20 30 3b 0a 20 20 20 20 75 33 32 20 2a 61 53 7a   0;.    u32 *aSz
1ccd0 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  Del = 0;.    sql
1cce0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1ccf0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 45   = 0;.    int nE
1cd00 6e 74 72 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  ntry = 0;..    /
1cd10 2a 20 43 6f 6d 70 6f 73 65 20 61 6e 64 20 70 72  * Compose and pr
1cd20 65 70 61 72 65 20 61 6e 20 53 51 4c 20 73 74 61  epare an SQL sta
1cd30 74 65 6d 65 6e 74 20 74 6f 20 6c 6f 6f 70 20 74  tement to loop t
1cd40 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 74 65  hrough the conte
1cd50 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  nt table */.    
1cd60 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c  char *zSql = sql
1cd70 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
1cd80 4c 45 43 54 20 25 73 22 20 2c 20 70 2d 3e 7a 52  LECT %s" , p->zR
1cd90 65 61 64 45 78 70 72 6c 69 73 74 29 3b 0a 20 20  eadExprlist);.  
1cda0 20 20 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20    if( !zSql ){. 
1cdb0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1cdc0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
1cdd0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
1cde0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
1cdf0 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  (p->db, zSql, -1
1ce00 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
1ce10 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1ce20 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20  (zSql);.    }.. 
1ce30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ce40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
1ce50 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74  lite3_int64 nByt
1ce60 65 20 3d 20 73 69 7a 65 6f 66 28 75 33 32 29 20  e = sizeof(u32) 
1ce70 2a 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  * ((sqlite3_int6
1ce80 34 29 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 2a  4)p->nColumn+1)*
1ce90 33 3b 0a 20 20 20 20 20 20 61 53 7a 20 3d 20 28  3;.      aSz = (
1cea0 75 33 32 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  u32 *)sqlite3_ma
1ceb0 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a 20  lloc64(nByte);. 
1cec0 20 20 20 20 20 69 66 28 20 61 53 7a 3d 3d 30 20       if( aSz==0 
1ced0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1cee0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1cef0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cf00 20 20 20 6d 65 6d 73 65 74 28 61 53 7a 2c 20 30     memset(aSz, 0
1cf10 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
1cf20 20 20 61 53 7a 49 6e 73 20 3d 20 26 61 53 7a 5b    aSzIns = &aSz[
1cf30 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 5d 3b 0a 20  p->nColumn+1];. 
1cf40 20 20 20 20 20 20 20 61 53 7a 44 65 6c 20 3d 20         aSzDel = 
1cf50 26 61 53 7a 49 6e 73 5b 70 2d 3e 6e 43 6f 6c 75  &aSzIns[p->nColu
1cf60 6d 6e 2b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  mn+1];.      }. 
1cf70 20 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28     }..    while(
1cf80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1cf90 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  & SQLITE_ROW==sq
1cfa0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
1cfb0 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
1cfc0 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Col;.      int i
1cfd0 4c 61 6e 67 69 64 20 3d 20 6c 61 6e 67 69 64 46  Langid = langidF
1cfe0 72 6f 6d 53 65 6c 65 63 74 28 70 2c 20 70 53 74  romSelect(p, pSt
1cff0 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  mt);.      rc = 
1d000 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73  fts3PendingTerms
1d010 44 6f 63 69 64 28 70 2c 20 30 2c 20 69 4c 61 6e  Docid(p, 0, iLan
1d020 67 69 64 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  gid, sqlite3_col
1d030 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
1d040 20 30 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73   0));.      mems
1d050 65 74 28 61 53 7a 2c 20 30 2c 20 73 69 7a 65 6f  et(aSz, 0, sizeo
1d060 66 28 61 53 7a 5b 30 5d 29 20 2a 20 28 70 2d 3e  f(aSz[0]) * (p->
1d070 6e 43 6f 6c 75 6d 6e 2b 31 29 29 3b 0a 20 20 20  nColumn+1));.   
1d080 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 72     for(iCol=0; r
1d090 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1d0a0 69 43 6f 6c 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b  iCol<p->nColumn;
1d0b0 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
1d0c0 20 20 69 66 28 20 70 2d 3e 61 62 4e 6f 74 69 6e    if( p->abNotin
1d0d0 64 65 78 65 64 5b 69 43 6f 6c 5d 3d 3d 30 20 29  dexed[iCol]==0 )
1d0e0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  {.          cons
1d0f0 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e  t char *z = (con
1d100 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c 69 74  st char *) sqlit
1d110 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
1d120 53 74 6d 74 2c 20 69 43 6f 6c 2b 31 29 3b 0a 20  Stmt, iCol+1);. 
1d130 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74           rc = ft
1d140 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 41 64  s3PendingTermsAd
1d150 64 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 7a 2c  d(p, iLangid, z,
1d160 20 69 43 6f 6c 2c 20 26 61 53 7a 5b 69 43 6f 6c   iCol, &aSz[iCol
1d170 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 53  ]);.          aS
1d180 7a 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 2b 3d  z[p->nColumn] +=
1d190 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1d1a0 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69 43 6f  bytes(pStmt, iCo
1d1b0 6c 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  l+1);.        }.
1d1c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1d1d0 28 20 70 2d 3e 62 48 61 73 44 6f 63 73 69 7a 65  ( p->bHasDocsize
1d1e0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 33   ){.        fts3
1d1f0 49 6e 73 65 72 74 44 6f 63 73 69 7a 65 28 26 72  InsertDocsize(&r
1d200 63 2c 20 70 2c 20 61 53 7a 29 3b 0a 20 20 20 20  c, p, aSz);.    
1d210 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
1d220 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d230 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
1d240 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
1d250 20 20 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20          pStmt = 
1d260 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
1d270 20 20 20 20 20 20 20 20 6e 45 6e 74 72 79 2b 2b          nEntry++
1d280 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 43  ;.        for(iC
1d290 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 3d 70 2d 3e 6e  ol=0; iCol<=p->n
1d2a0 43 6f 6c 75 6d 6e 3b 20 69 43 6f 6c 2b 2b 29 7b  Column; iCol++){
1d2b0 0a 20 20 20 20 20 20 20 20 20 20 61 53 7a 49 6e  .          aSzIn
1d2c0 73 5b 69 43 6f 6c 5d 20 2b 3d 20 61 53 7a 5b 69  s[iCol] += aSz[i
1d2d0 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Col];.        }.
1d2e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d2f0 20 20 69 66 28 20 70 2d 3e 62 46 74 73 34 20 29    if( p->bFts4 )
1d300 7b 0a 20 20 20 20 20 20 66 74 73 33 55 70 64 61  {.      fts3Upda
1d310 74 65 44 6f 63 54 6f 74 61 6c 73 28 26 72 63 2c  teDocTotals(&rc,
1d320 20 70 2c 20 61 53 7a 49 6e 73 2c 20 61 53 7a 44   p, aSzIns, aSzD
1d330 65 6c 2c 20 6e 45 6e 74 72 79 29 3b 0a 20 20 20  el, nEntry);.   
1d340 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
1d350 72 65 65 28 61 53 7a 29 3b 0a 0a 20 20 20 20 69  ree(aSz);..    i
1d360 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  f( pStmt ){.    
1d370 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69    int rc2 = sqli
1d380 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
1d390 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  mt);.      if( r
1d3a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d3b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32          rc = rc2
1d3c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d3d0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1d3e0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
1d3f0 20 66 75 6e 63 74 69 6f 6e 20 6f 70 65 6e 73 20   function opens 
1d400 61 20 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f  a cursor used to
1d410 20 72 65 61 64 20 74 68 65 20 69 6e 70 75 74 20   read the input 
1d420 64 61 74 61 20 66 6f 72 20 61 6e 20 0a 2a 2a 20  data for an .** 
1d430 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67  incremental merg
1d440 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53 70 65  e operation. Spe
1d450 63 69 66 69 63 61 6c 6c 79 2c 20 69 74 20 6f 70  cifically, it op
1d460 65 6e 73 20 61 20 63 75 72 73 6f 72 20 74 6f 20  ens a cursor to 
1d470 73 63 61 6e 0a 2a 2a 20 74 68 65 20 6f 6c 64 65  scan.** the olde
1d480 73 74 20 6e 53 65 67 20 73 65 67 6d 65 6e 74 73  st nSeg segments
1d490 20 28 69 64 78 3d 30 20 74 68 72 6f 75 67 68 20   (idx=0 through 
1d4a0 69 64 78 3d 28 6e 53 65 67 2d 31 29 29 20 69 6e  idx=(nSeg-1)) in
1d4b0 20 61 62 73 6f 6c 75 74 65 20 0a 2a 2a 20 6c 65   absolute .** le
1d4c0 76 65 6c 20 69 41 62 73 4c 65 76 65 6c 2e 0a 2a  vel iAbsLevel..*
1d4d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1d4e0 33 49 6e 63 72 6d 65 72 67 65 43 73 72 28 0a 20  3IncrmergeCsr(. 
1d4f0 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
1d500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d510 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20 68   /* FTS3 table h
1d520 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  andle */.  sqlit
1d530 65 33 5f 69 6e 74 36 34 20 69 41 62 73 4c 65 76  e3_int64 iAbsLev
1d540 65 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 62  el,        /* Ab
1d550 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 74 6f 20  solute level to 
1d560 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  open */.  int nS
1d570 65 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  eg,             
1d580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1d590 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
1d5a0 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74  to merge */.  Ft
1d5b0 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
1d5c0 20 2a 70 43 73 72 20 20 20 20 20 20 20 20 2f 2a   *pCsr        /*
1d5d0 20 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 74   Cursor object t
1d5e0 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b  o populate */.){
1d5f0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1d600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d610 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
1d620 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
1d630 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 20  tmt *pStmt = 0; 
1d640 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d         /* Statem
1d650 65 6e 74 20 75 73 65 64 20 74 6f 20 72 65 61 64  ent used to read
1d660 20 25 5f 73 65 67 64 69 72 20 65 6e 74 72 79 20   %_segdir entry 
1d670 2a 2f 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 69  */  .  sqlite3_i
1d680 6e 74 36 34 20 6e 42 79 74 65 3b 20 20 20 20 20  nt64 nByte;     
1d690 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
1d6a0 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 70 43 73  allocated at pCs
1d6b0 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 5d 20 2a  r->apSegment[] *
1d6c0 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
1d6d0 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 46   space for the F
1d6e0 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
1d6f0 72 2e 61 43 73 72 5b 5d 20 61 72 72 61 79 20 2a  r.aCsr[] array *
1d700 2f 0a 20 20 6d 65 6d 73 65 74 28 70 43 73 72 2c  /.  memset(pCsr,
1d710 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 73 72   0, sizeof(*pCsr
1d720 29 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69  ));.  nByte = si
1d730 7a 65 6f 66 28 46 74 73 33 53 65 67 52 65 61 64  zeof(Fts3SegRead
1d740 65 72 20 2a 29 20 2a 20 6e 53 65 67 3b 0a 20 20  er *) * nSeg;.  
1d750 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 20  pCsr->apSegment 
1d760 3d 20 28 46 74 73 33 53 65 67 52 65 61 64 65 72  = (Fts3SegReader
1d770 20 2a 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   **)sqlite3_mall
1d780 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a 0a 20 20  oc64(nByte);..  
1d790 69 66 28 20 70 43 73 72 2d 3e 61 70 53 65 67 6d  if( pCsr->apSegm
1d7a0 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ent==0 ){.    rc
1d7b0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1d7c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65  .  }else{.    me
1d7d0 6d 73 65 74 28 70 43 73 72 2d 3e 61 70 53 65 67  mset(pCsr->apSeg
1d7e0 6d 65 6e 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b  ment, 0, nByte);
1d7f0 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71  .    rc = fts3Sq
1d800 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c  lStmt(p, SQL_SEL
1d810 45 43 54 5f 4c 45 56 45 4c 2c 20 26 70 53 74 6d  ECT_LEVEL, &pStm
1d820 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  t, 0);.  }.  if(
1d830 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d840 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1d850 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 73 71   int rc2;.    sq
1d860 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
1d870 28 70 53 74 6d 74 2c 20 31 2c 20 69 41 62 73 4c  (pStmt, 1, iAbsL
1d880 65 76 65 6c 29 3b 0a 20 20 20 20 61 73 73 65 72  evel);.    asser
1d890 74 28 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e  t( pCsr->nSegmen
1d8a0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  t==0 );.    for(
1d8b0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
1d8c0 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  OK && sqlite3_st
1d8d0 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
1d8e0 45 5f 52 4f 57 20 26 26 20 69 3c 6e 53 65 67 3b  E_ROW && i<nSeg;
1d8f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20   i++){.      rc 
1d900 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  = sqlite3Fts3Seg
1d910 52 65 61 64 65 72 4e 65 77 28 69 2c 20 30 2c 0a  ReaderNew(i, 0,.
1d920 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1d930 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
1d940 53 74 6d 74 2c 20 31 29 2c 20 20 20 20 20 20 20  Stmt, 1),       
1d950 20 2f 2a 20 73 65 67 64 69 72 2e 73 74 61 72 74   /* segdir.start
1d960 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  _block */.      
1d970 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75      sqlite3_colu
1d980 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
1d990 32 29 2c 20 20 20 20 20 20 20 20 2f 2a 20 73 65  2),        /* se
1d9a0 67 64 69 72 2e 6c 65 61 76 65 73 5f 65 6e 64 5f  gdir.leaves_end_
1d9b0 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20  block */.       
1d9c0 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
1d9d0 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 33  n_int64(pStmt, 3
1d9e0 29 2c 20 20 20 20 20 20 20 20 2f 2a 20 73 65 67  ),        /* seg
1d9f0 64 69 72 2e 65 6e 64 5f 62 6c 6f 63 6b 20 2a 2f  dir.end_block */
1da00 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1da10 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
1da20 53 74 6d 74 2c 20 34 29 2c 20 20 20 20 20 20 20  Stmt, 4),       
1da30 20 20 2f 2a 20 73 65 67 64 69 72 2e 72 6f 6f 74    /* segdir.root
1da40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
1da50 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
1da60 65 73 28 70 53 74 6d 74 2c 20 34 29 2c 20 20 20  es(pStmt, 4),   
1da70 20 20 20 20 20 2f 2a 20 73 65 67 64 69 72 2e 72       /* segdir.r
1da80 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  oot */.         
1da90 20 26 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e   &pCsr->apSegmen
1daa0 74 5b 69 5d 0a 20 20 20 20 20 20 29 3b 0a 20 20  t[i].      );.  
1dab0 20 20 20 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65      pCsr->nSegme
1dac0 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nt++;.    }.    
1dad0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  rc2 = sqlite3_re
1dae0 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  set(pStmt);.    
1daf0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1db00 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20  K ) rc = rc2;.  
1db10 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1db20 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  }..typedef struc
1db30 74 20 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65  t IncrmergeWrite
1db40 72 20 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65  r IncrmergeWrite
1db50 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
1db60 74 20 4e 6f 64 65 57 72 69 74 65 72 20 4e 6f 64  t NodeWriter Nod
1db70 65 57 72 69 74 65 72 3b 0a 74 79 70 65 64 65 66  eWriter;.typedef
1db80 20 73 74 72 75 63 74 20 42 6c 6f 62 20 42 6c 6f   struct Blob Blo
1db90 62 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  b;.typedef struc
1dba0 74 20 4e 6f 64 65 52 65 61 64 65 72 20 4e 6f 64  t NodeReader Nod
1dbb0 65 52 65 61 64 65 72 3b 0a 0a 2f 2a 0a 2a 2a 20  eReader;../*.** 
1dbc0 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
1dbd0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
1dbe0 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20 61  ucture is used a
1dbf0 73 20 61 20 64 79 6e 61 6d 69 63 20 62 75 66 66  s a dynamic buff
1dc00 65 72 0a 2a 2a 20 74 6f 20 62 75 69 6c 64 20 75  er.** to build u
1dc10 70 20 6e 6f 64 65 73 20 6f 72 20 6f 74 68 65 72  p nodes or other
1dc20 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 69   blobs of data i
1dc30 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 75 6e  n..**.** The fun
1dc40 63 74 69 6f 6e 20 62 6c 6f 62 47 72 6f 77 42 75  ction blobGrowBu
1dc50 66 66 65 72 28 29 20 69 73 20 75 73 65 64 20 74  ffer() is used t
1dc60 6f 20 65 78 74 65 6e 64 20 74 68 65 20 61 6c 6c  o extend the all
1dc70 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75  ocation..*/.stru
1dc80 63 74 20 42 6c 6f 62 20 7b 0a 20 20 63 68 61 72  ct Blob {.  char
1dc90 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20 20   *a;            
1dca0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1dcb0 6f 69 6e 74 65 72 20 74 6f 20 61 6c 6c 6f 63 61  ointer to alloca
1dcc0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  tion */.  int n;
1dcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 76 61 6c 69 64 20 62 79 74  ber of valid byt
1dd00 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 61 5b  es of data in a[
1dd10 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f  ] */.  int nAllo
1dd20 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1dd30 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
1dd40 74 65 64 20 73 69 7a 65 20 6f 66 20 61 5b 5d 20  ted size of a[] 
1dd50 28 6e 41 6c 6c 6f 63 3e 3d 6e 29 20 2a 2f 0a 7d  (nAlloc>=n) */.}
1dd60 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 73 74  ;../*.** This st
1dd70 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20  ructure is used 
1dd80 74 6f 20 62 75 69 6c 64 20 75 70 20 62 75 66 66  to build up buff
1dd90 65 72 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73  ers containing s
1dda0 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 0a 2a  egment b-tree .*
1ddb0 2a 20 6e 6f 64 65 73 20 28 62 6c 6f 63 6b 73 29  * nodes (blocks)
1ddc0 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4e 6f 64 65  ..*/.struct Node
1ddd0 57 72 69 74 65 72 20 7b 0a 20 20 73 71 6c 69 74  Writer {.  sqlit
1dde0 65 33 5f 69 6e 74 36 34 20 69 42 6c 6f 63 6b 3b  e3_int64 iBlock;
1ddf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
1de00 72 72 65 6e 74 20 62 6c 6f 63 6b 20 69 64 20 2a  rrent block id *
1de10 2f 0a 20 20 42 6c 6f 62 20 6b 65 79 3b 20 20 20  /.  Blob key;   
1de20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de30 20 20 20 20 2f 2a 20 4c 61 73 74 20 6b 65 79 20      /* Last key 
1de40 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 63  written to the c
1de50 75 72 72 65 6e 74 20 62 6c 6f 63 6b 20 2a 2f 0a  urrent block */.
1de60 20 20 42 6c 6f 62 20 62 6c 6f 63 6b 3b 20 20 20    Blob block;   
1de70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de80 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 6c 6f    /* Current blo
1de90 63 6b 20 69 6d 61 67 65 20 2a 2f 0a 7d 3b 0a 0a  ck image */.};..
1dea0 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20  /*.** An object 
1deb0 6f 66 20 74 68 69 73 20 74 79 70 65 20 63 6f 6e  of this type con
1dec0 74 61 69 6e 73 20 74 68 65 20 73 74 61 74 65 20  tains the state 
1ded0 72 65 71 75 69 72 65 64 20 74 6f 20 63 72 65 61  required to crea
1dee0 74 65 20 6f 72 20 61 70 70 65 6e 64 0a 2a 2a 20  te or append.** 
1def0 74 6f 20 61 6e 20 61 70 70 65 6e 64 61 62 6c 65  to an appendable
1df00 20 62 2d 74 72 65 65 20 73 65 67 6d 65 6e 74 2e   b-tree segment.
1df10 0a 2a 2f 0a 73 74 72 75 63 74 20 49 6e 63 72 6d  .*/.struct Incrm
1df20 65 72 67 65 57 72 69 74 65 72 20 7b 0a 20 20 69  ergeWriter {.  i
1df30 6e 74 20 6e 4c 65 61 66 45 73 74 3b 20 20 20 20  nt nLeafEst;    
1df40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1df50 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  * Space allocate
1df60 64 20 66 6f 72 20 6c 65 61 66 20 62 6c 6f 63 6b  d for leaf block
1df70 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b  s */.  int nWork
1df80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1df90 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1dfa0 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 66   of leaf pages f
1dfb0 6c 75 73 68 65 64 20 2a 2f 0a 20 20 73 71 6c 69  lushed */.  sqli
1dfc0 74 65 33 5f 69 6e 74 36 34 20 69 41 62 73 4c 65  te3_int64 iAbsLe
1dfd0 76 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  vel;        /* A
1dfe0 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 6f 66  bsolute level of
1dff0 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
1e000 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 3b 20 20  */.  int iIdx;  
1e010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e020 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1e030 20 2a 6f 75 74 70 75 74 2a 20 73 65 67 6d 65 6e   *output* segmen
1e040 74 20 69 6e 20 69 41 62 73 4c 65 76 65 6c 2b 31  t in iAbsLevel+1
1e050 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
1e060 74 36 34 20 69 53 74 61 72 74 3b 20 20 20 20 20  t64 iStart;     
1e070 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 6e        /* Block n
1e080 75 6d 62 65 72 20 6f 66 20 66 69 72 73 74 20 61  umber of first a
1e090 6c 6c 6f 63 61 74 65 64 20 62 6c 6f 63 6b 20 2a  llocated block *
1e0a0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
1e0b0 34 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20  4 iEnd;         
1e0c0 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 6e 75 6d      /* Block num
1e0d0 62 65 72 20 6f 66 20 6c 61 73 74 20 61 6c 6c 6f  ber of last allo
1e0e0 63 61 74 65 64 20 62 6c 6f 63 6b 20 2a 2f 0a 20  cated block */. 
1e0f0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
1e100 4c 65 61 66 44 61 74 61 3b 20 20 20 20 20 20 20  LeafData;       
1e110 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6c 65 61   /* Bytes of lea
1e120 66 20 70 61 67 65 20 64 61 74 61 20 73 6f 20 66  f page data so f
1e130 61 72 20 2a 2f 0a 20 20 75 38 20 62 4e 6f 4c 65  ar */.  u8 bNoLe
1e140 61 66 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  afData;         
1e150 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
1e160 75 65 2c 20 73 74 6f 72 65 20 30 20 66 6f 72 20  ue, store 0 for 
1e170 73 65 67 6d 65 6e 74 20 73 69 7a 65 20 2a 2f 0a  segment size */.
1e180 20 20 4e 6f 64 65 57 72 69 74 65 72 20 61 4e 6f    NodeWriter aNo
1e190 64 65 57 72 69 74 65 72 5b 46 54 53 5f 4d 41 58  deWriter[FTS_MAX
1e1a0 5f 41 50 50 45 4e 44 41 42 4c 45 5f 48 45 49 47  _APPENDABLE_HEIG
1e1b0 48 54 5d 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  HT];.};../*.** A
1e1c0 6e 20 6f 62 6a 65 63 74 20 6f 66 20 74 68 65 20  n object of the 
1e1d0 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 69  following type i
1e1e0 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 64  s used to read d
1e1f0 61 74 61 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  ata from a singl
1e200 65 0a 2a 2a 20 46 54 53 20 73 65 67 6d 65 6e 74  e.** FTS segment
1e210 20 6e 6f 64 65 2e 20 53 65 65 20 74 68 65 20 66   node. See the f
1e220 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
1e230 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 6e 6f  ns:.**.**     no
1e240 64 65 52 65 61 64 65 72 49 6e 69 74 28 29 0a 2a  deReaderInit().*
1e250 2a 20 20 20 20 20 6e 6f 64 65 52 65 61 64 65 72  *     nodeReader
1e260 4e 65 78 74 28 29 0a 2a 2a 20 20 20 20 20 6e 6f  Next().**     no
1e270 64 65 52 65 61 64 65 72 52 65 6c 65 61 73 65 28  deReaderRelease(
1e280 29 0a 2a 2f 0a 73 74 72 75 63 74 20 4e 6f 64 65  ).*/.struct Node
1e290 52 65 61 64 65 72 20 7b 0a 20 20 63 6f 6e 73 74  Reader {.  const
1e2a0 20 63 68 61 72 20 2a 61 4e 6f 64 65 3b 0a 20 20   char *aNode;.  
1e2b0 69 6e 74 20 6e 4e 6f 64 65 3b 0a 20 20 69 6e 74  int nNode;.  int
1e2c0 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20   iOff;          
1e2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e2e0 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74 20 77  Current offset w
1e2f0 69 74 68 69 6e 20 61 4e 6f 64 65 5b 5d 20 2a 2f  ithin aNode[] */
1e300 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61  ..  /* Output va
1e310 72 69 61 62 6c 65 73 2e 20 43 6f 6e 74 61 69 6e  riables. Contain
1e320 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
1e330 6e 6f 64 65 20 65 6e 74 72 79 2e 20 2a 2f 0a 20  node entry. */. 
1e340 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1e350 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20  Child;          
1e360 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
1e370 68 69 6c 64 20 6e 6f 64 65 20 2a 2f 0a 20 20 42  hild node */.  B
1e380 6c 6f 62 20 74 65 72 6d 3b 20 20 20 20 20 20 20  lob term;       
1e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e3a0 2a 20 43 75 72 72 65 6e 74 20 74 65 72 6d 20 2a  * Current term *
1e3b0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1e3c0 61 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20  aDoclist;       
1e3d0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1e3e0 6f 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 69  o doclist */.  i
1e3f0 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20  nt nDoclist;    
1e400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e410 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73  * Size of doclis
1e420 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 7d 3b  t in bytes */.};
1e430 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20  ../*.** If *pRc 
1e440 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b  is not SQLITE_OK
1e450 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
1e460 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
1e470 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  t is a no-op..**
1e480 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1e490 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74  he allocation at
1e4a0 20 70 42 6c 6f 62 2d 3e 61 20 69 73 20 6e 6f 74   pBlob->a is not
1e4b0 20 61 6c 72 65 61 64 79 20 61 74 20 6c 65 61 73   already at leas
1e4c0 74 20 6e 4d 69 6e 0a 2a 2a 20 62 79 74 65 73 20  t nMin.** bytes 
1e4d0 69 6e 20 73 69 7a 65 2c 20 65 78 74 65 6e 64 20  in size, extend 
1e4e0 28 72 65 61 6c 6c 6f 63 29 20 69 74 20 74 6f 20  (realloc) it to 
1e4f0 62 65 20 73 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  be so..**.** If 
1e500 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  an OOM error occ
1e510 75 72 73 2c 20 73 65 74 20 2a 70 52 63 20 74 6f  urs, set *pRc to
1e520 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e   SQLITE_NOMEM an
1e530 64 20 6c 65 61 76 65 20 70 42 6c 6f 62 2d 3e 61  d leave pBlob->a
1e540 0a 2a 2a 20 75 6e 6d 6f 64 69 66 69 65 64 2e 20  .** unmodified. 
1e550 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
1e560 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 63  e allocation suc
1e570 63 65 65 64 73 2c 20 75 70 64 61 74 65 20 70 42  ceeds, update pB
1e580 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63 0a 2a 2a 20 74  lob->nAlloc.** t
1e590 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20 6e 65  o reflect the ne
1e5a0 77 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 42  w size of the pB
1e5b0 6c 6f 62 2d 3e 61 5b 5d 20 62 75 66 66 65 72 2e  lob->a[] buffer.
1e5c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e5d0 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28 42  blobGrowBuffer(B
1e5e0 6c 6f 62 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20  lob *pBlob, int 
1e5f0 6e 4d 69 6e 2c 20 69 6e 74 20 2a 70 52 63 29 7b  nMin, int *pRc){
1e600 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
1e610 49 54 45 5f 4f 4b 20 26 26 20 6e 4d 69 6e 3e 70  ITE_OK && nMin>p
1e620 42 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  Blob->nAlloc ){.
1e630 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d      int nAlloc =
1e640 20 6e 4d 69 6e 3b 0a 20 20 20 20 63 68 61 72 20   nMin;.    char 
1e650 2a 61 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  *a = (char *)sql
1e660 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 42 6c  ite3_realloc(pBl
1e670 6f 62 2d 3e 61 2c 20 6e 41 6c 6c 6f 63 29 3b 0a  ob->a, nAlloc);.
1e680 20 20 20 20 69 66 28 20 61 20 29 7b 0a 20 20 20      if( a ){.   
1e690 20 20 20 70 42 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63     pBlob->nAlloc
1e6a0 20 3d 20 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20   = nAlloc;.     
1e6b0 20 70 42 6c 6f 62 2d 3e 61 20 3d 20 61 3b 0a 20   pBlob->a = a;. 
1e6c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e6d0 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRc = SQLITE_NO
1e6e0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  MEM;.    }.  }.}
1e6f0 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
1e700 74 6f 20 61 64 76 61 6e 63 65 20 74 68 65 20 6e  to advance the n
1e710 6f 64 65 2d 72 65 61 64 65 72 20 6f 62 6a 65 63  ode-reader objec
1e720 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
1e730 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
1e740 6f 0a 2a 2a 20 74 68 65 20 6e 65 78 74 20 65 6e  o.** the next en
1e750 74 72 79 20 6f 6e 20 74 68 65 20 6e 6f 64 65 2e  try on the node.
1e760 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61   .**.** Return a
1e770 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
1e780 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
1e790 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73  (SQLITE_NOMEM is
1e7a0 20 70 6f 73 73 69 62 6c 65 29 2e 20 0a 2a 2a 20   possible). .** 
1e7b0 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e  Otherwise return
1e7c0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74   SQLITE_OK. If t
1e7d0 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 78 74 20  here is no next 
1e7e0 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 6e 6f 64  entry on the nod
1e7f0 65 0a 2a 2a 20 28 65 2e 67 2e 20 62 65 63 61 75  e.** (e.g. becau
1e800 73 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 65  se the current e
1e810 6e 74 72 79 20 69 73 20 74 68 65 20 6c 61 73 74  ntry is the last
1e820 29 20 73 65 74 20 4e 6f 64 65 52 65 61 64 65 72  ) set NodeReader
1e830 2d 3e 61 4e 6f 64 65 20 74 6f 0a 2a 2a 20 4e 55  ->aNode to.** NU
1e840 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 45  LL to indicate E
1e850 4f 46 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70  OF. Otherwise, p
1e860 6f 70 75 6c 61 74 65 20 74 68 65 20 4e 6f 64 65  opulate the Node
1e870 52 65 61 64 65 72 20 73 74 72 75 63 74 75 72 65  Reader structure
1e880 20 6f 75 74 70 75 74 20 0a 2a 2a 20 76 61 72 69   output .** vari
1e890 61 62 6c 65 73 20 66 6f 72 20 74 68 65 20 6e 65  ables for the ne
1e8a0 77 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74  w entry..*/.stat
1e8b0 69 63 20 69 6e 74 20 6e 6f 64 65 52 65 61 64 65  ic int nodeReade
1e8c0 72 4e 65 78 74 28 4e 6f 64 65 52 65 61 64 65 72  rNext(NodeReader
1e8d0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 62 46 69 72   *p){.  int bFir
1e8e0 73 74 20 3d 20 28 70 2d 3e 74 65 72 6d 2e 6e 3d  st = (p->term.n=
1e8f0 3d 30 29 3b 20 20 20 20 2f 2a 20 54 72 75 65 20  =0);    /* True 
1e900 66 6f 72 20 66 69 72 73 74 20 74 65 72 6d 20 6f  for first term o
1e910 6e 20 74 68 65 20 6e 6f 64 65 20 2a 2f 0a 20 20  n the node */.  
1e920 69 6e 74 20 6e 50 72 65 66 69 78 20 3d 20 30 3b  int nPrefix = 0;
1e930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e940 2f 2a 20 42 79 74 65 73 20 74 6f 20 63 6f 70 79  /* Bytes to copy
1e950 20 66 72 6f 6d 20 70 72 65 76 69 6f 75 73 20 74   from previous t
1e960 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  erm */.  int nSu
1e970 66 66 69 78 20 3d 20 30 3b 20 20 20 20 20 20 20  ffix = 0;       
1e980 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
1e990 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 74  s to append to t
1e9a0 68 65 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69  he prefix */.  i
1e9b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1e9c0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
1e9d0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1e9e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ..  assert( p->a
1e9f0 4e 6f 64 65 20 29 3b 0a 20 20 69 66 28 20 70 2d  Node );.  if( p-
1ea00 3e 69 43 68 69 6c 64 20 26 26 20 62 46 69 72 73  >iChild && bFirs
1ea10 74 3d 3d 30 20 29 20 70 2d 3e 69 43 68 69 6c 64  t==0 ) p->iChild
1ea20 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66  ++;.  if( p->iOf
1ea30 66 3e 3d 70 2d 3e 6e 4e 6f 64 65 20 29 7b 0a 20  f>=p->nNode ){. 
1ea40 20 20 20 2f 2a 20 45 4f 46 20 2a 2f 0a 20 20 20     /* EOF */.   
1ea50 20 70 2d 3e 61 4e 6f 64 65 20 3d 20 30 3b 0a 20   p->aNode = 0;. 
1ea60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
1ea70 62 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20  bFirst==0 ){.   
1ea80 20 20 20 70 2d 3e 69 4f 66 66 20 2b 3d 20 66 74     p->iOff += ft
1ea90 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s3GetVarint32(&p
1eaa0 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f 66 66 5d  ->aNode[p->iOff]
1eab0 2c 20 26 6e 50 72 65 66 69 78 29 3b 0a 20 20 20  , &nPrefix);.   
1eac0 20 7d 0a 20 20 20 20 70 2d 3e 69 4f 66 66 20 2b   }.    p->iOff +
1ead0 3d 20 66 74 73 33 47 65 74 56 61 72 69 6e 74 33  = fts3GetVarint3
1eae0 32 28 26 70 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69  2(&p->aNode[p->i
1eaf0 4f 66 66 5d 2c 20 26 6e 53 75 66 66 69 78 29 3b  Off], &nSuffix);
1eb00 0a 0a 20 20 20 20 69 66 28 20 6e 50 72 65 66 69  ..    if( nPrefi
1eb10 78 3e 70 2d 3e 74 65 72 6d 2e 6e 20 7c 7c 20 6e  x>p->term.n || n
1eb20 53 75 66 66 69 78 3e 70 2d 3e 6e 4e 6f 64 65 2d  Suffix>p->nNode-
1eb30 70 2d 3e 69 4f 66 66 20 7c 7c 20 6e 53 75 66 66  p->iOff || nSuff
1eb40 69 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ix==0 ){.      r
1eb50 65 74 75 72 6e 20 46 54 53 5f 43 4f 52 52 55 50  eturn FTS_CORRUP
1eb60 54 5f 56 54 41 42 3b 0a 20 20 20 20 7d 0a 20 20  T_VTAB;.    }.  
1eb70 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 72    blobGrowBuffer
1eb80 28 26 70 2d 3e 74 65 72 6d 2c 20 6e 50 72 65 66  (&p->term, nPref
1eb90 69 78 2b 6e 53 75 66 66 69 78 2c 20 26 72 63 29  ix+nSuffix, &rc)
1eba0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1ebb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ebc0 20 6d 65 6d 63 70 79 28 26 70 2d 3e 74 65 72 6d   memcpy(&p->term
1ebd0 2e 61 5b 6e 50 72 65 66 69 78 5d 2c 20 26 70 2d  .a[nPrefix], &p-
1ebe0 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f 66 66 5d 2c  >aNode[p->iOff],
1ebf0 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 20 20 20   nSuffix);.     
1ec00 20 70 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e 50 72   p->term.n = nPr
1ec10 65 66 69 78 2b 6e 53 75 66 66 69 78 3b 0a 20 20  efix+nSuffix;.  
1ec20 20 20 20 20 70 2d 3e 69 4f 66 66 20 2b 3d 20 6e      p->iOff += n
1ec30 53 75 66 66 69 78 3b 0a 20 20 20 20 20 20 69 66  Suffix;.      if
1ec40 28 20 70 2d 3e 69 43 68 69 6c 64 3d 3d 30 20 29  ( p->iChild==0 )
1ec50 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66  {.        p->iOf
1ec60 66 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72 69  f += fts3GetVari
1ec70 6e 74 33 32 28 26 70 2d 3e 61 4e 6f 64 65 5b 70  nt32(&p->aNode[p
1ec80 2d 3e 69 4f 66 66 5d 2c 20 26 70 2d 3e 6e 44 6f  ->iOff], &p->nDo
1ec90 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  clist);.        
1eca0 69 66 28 20 28 70 2d 3e 6e 4e 6f 64 65 2d 70 2d  if( (p->nNode-p-
1ecb0 3e 69 4f 66 66 29 3c 70 2d 3e 6e 44 6f 63 6c 69  >iOff)<p->nDocli
1ecc0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
1ecd0 72 65 74 75 72 6e 20 46 54 53 5f 43 4f 52 52 55  return FTS_CORRU
1ece0 50 54 5f 56 54 41 42 3b 0a 20 20 20 20 20 20 20  PT_VTAB;.       
1ecf0 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 44   }.        p->aD
1ed00 6f 63 6c 69 73 74 20 3d 20 26 70 2d 3e 61 4e 6f  oclist = &p->aNo
1ed10 64 65 5b 70 2d 3e 69 4f 66 66 5d 3b 0a 20 20 20  de[p->iOff];.   
1ed20 20 20 20 20 20 70 2d 3e 69 4f 66 66 20 2b 3d 20       p->iOff += 
1ed30 70 2d 3e 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 20  p->nDoclist;.   
1ed40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1ed50 20 20 61 73 73 65 72 74 5f 66 74 73 33 5f 6e 63    assert_fts3_nc
1ed60 28 20 70 2d 3e 69 4f 66 66 3c 3d 70 2d 3e 6e 4e  ( p->iOff<=p->nN
1ed70 6f 64 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ode );.  return 
1ed80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  rc;.}../*.** Rel
1ed90 65 61 73 65 20 61 6c 6c 20 64 79 6e 61 6d 69 63  ease all dynamic
1eda0 20 72 65 73 6f 75 72 63 65 73 20 68 65 6c 64 20   resources held 
1edb0 62 79 20 6e 6f 64 65 2d 72 65 61 64 65 72 20 6f  by node-reader o
1edc0 62 6a 65 63 74 20 2a 70 2e 0a 2a 2f 0a 73 74 61  bject *p..*/.sta
1edd0 74 69 63 20 76 6f 69 64 20 6e 6f 64 65 52 65 61  tic void nodeRea
1ede0 64 65 72 52 65 6c 65 61 73 65 28 4e 6f 64 65 52  derRelease(NodeR
1edf0 65 61 64 65 72 20 2a 70 29 7b 0a 20 20 73 71 6c  eader *p){.  sql
1ee00 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 74 65 72  ite3_free(p->ter
1ee10 6d 2e 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  m.a);.}../*.** I
1ee20 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 6f 64 65  nitialize a node
1ee30 2d 72 65 61 64 65 72 20 6f 62 6a 65 63 74 20 74  -reader object t
1ee40 6f 20 72 65 61 64 20 74 68 65 20 6e 6f 64 65 20  o read the node 
1ee50 69 6e 20 62 75 66 66 65 72 20 61 4e 6f 64 65 2f  in buffer aNode/
1ee60 6e 4e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nNode..**.** If 
1ee70 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
1ee80 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1ee90 64 20 61 6e 64 20 74 68 65 20 4e 6f 64 65 52 65  d and the NodeRe
1eea0 61 64 65 72 20 6f 62 6a 65 63 74 20 73 65 74 20  ader object set 
1eeb0 74 6f 20 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20  to .** point to 
1eec0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
1eed0 6f 6e 20 74 68 65 20 6e 6f 64 65 20 28 69 66 20  on the node (if 
1eee0 61 6e 79 29 2e 20 4f 74 68 65 72 77 69 73 65 2c  any). Otherwise,
1eef0 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72   an SQLite.** er
1ef00 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1ef10 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1ef20 69 6e 74 20 6e 6f 64 65 52 65 61 64 65 72 49 6e  int nodeReaderIn
1ef30 69 74 28 4e 6f 64 65 52 65 61 64 65 72 20 2a 70  it(NodeReader *p
1ef40 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 4e  , const char *aN
1ef50 6f 64 65 2c 20 69 6e 74 20 6e 4e 6f 64 65 29 7b  ode, int nNode){
1ef60 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
1ef70 73 69 7a 65 6f 66 28 4e 6f 64 65 52 65 61 64 65  sizeof(NodeReade
1ef80 72 29 29 3b 0a 20 20 70 2d 3e 61 4e 6f 64 65 20  r));.  p->aNode 
1ef90 3d 20 61 4e 6f 64 65 3b 0a 20 20 70 2d 3e 6e 4e  = aNode;.  p->nN
1efa0 6f 64 65 20 3d 20 6e 4e 6f 64 65 3b 0a 0a 20 20  ode = nNode;..  
1efb0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 69 66  /* Figure out if
1efc0 20 74 68 69 73 20 69 73 20 61 20 6c 65 61 66 20   this is a leaf 
1efd0 6f 72 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e  or an internal n
1efe0 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ode. */.  if( p-
1eff0 3e 61 4e 6f 64 65 5b 30 5d 20 29 7b 0a 20 20 20  >aNode[0] ){.   
1f000 20 2f 2a 20 41 6e 20 69 6e 74 65 72 6e 61 6c 20   /* An internal 
1f010 6e 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e  node. */.    p->
1f020 69 4f 66 66 20 3d 20 31 20 2b 20 73 71 6c 69 74  iOff = 1 + sqlit
1f030 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28  e3Fts3GetVarint(
1f040 26 70 2d 3e 61 4e 6f 64 65 5b 31 5d 2c 20 26 70  &p->aNode[1], &p
1f050 2d 3e 69 43 68 69 6c 64 29 3b 0a 20 20 7d 65 6c  ->iChild);.  }el
1f060 73 65 7b 0a 20 20 20 20 70 2d 3e 69 4f 66 66 20  se{.    p->iOff 
1f070 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 1;.  }..  retu
1f080 72 6e 20 6e 6f 64 65 52 65 61 64 65 72 4e 65 78  rn nodeReaderNex
1f090 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  t(p);.}../*.** T
1f0a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1f0b0 63 61 6c 6c 65 64 20 77 68 69 6c 65 20 77 72 69  called while wri
1f0c0 74 69 6e 67 20 61 6e 20 46 54 53 20 73 65 67 6d  ting an FTS segm
1f0d0 65 6e 74 20 65 61 63 68 20 74 69 6d 65 20 61 20  ent each time a 
1f0e0 6c 65 61 66 20 6f 0a 2a 2a 20 6e 6f 64 65 20 69  leaf o.** node i
1f0f0 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20 77  s finished and w
1f100 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20  ritten to disk. 
1f110 54 68 65 20 6b 65 79 20 28 7a 54 65 72 6d 2f 6e  The key (zTerm/n
1f120 54 65 72 6d 29 20 69 73 20 67 75 61 72 61 6e 74  Term) is guarant
1f130 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 67 72 65  eed.** to be gre
1f140 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61  ater than the la
1f150 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 74 68 65  rgest key on the
1f160 20 6e 6f 64 65 20 6a 75 73 74 20 77 72 69 74 74   node just writt
1f170 65 6e 2c 20 62 75 74 20 73 6d 61 6c 6c 65 72 0a  en, but smaller.
1f180 2a 2a 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ** than or equal
1f190 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 6b 65   to the first ke
1f1a0 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 77  y that will be w
1f1b0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6e 65  ritten to the ne
1f1c0 78 74 20 6c 65 61 66 0a 2a 2a 20 6e 6f 64 65 2e  xt leaf.** node.
1f1d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 6c 6f 63 6b  .**.** The block
1f1e0 20 69 64 20 6f 66 20 74 68 65 20 6c 65 61 66 20   id of the leaf 
1f1f0 6e 6f 64 65 20 6a 75 73 74 20 77 72 69 74 74 65  node just writte
1f200 6e 20 74 6f 20 64 69 73 6b 20 6d 61 79 20 62 65  n to disk may be
1f210 20 66 6f 75 6e 64 20 69 6e 0a 2a 2a 20 28 70 57   found in.** (pW
1f220 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74  riter->aNodeWrit
1f230 65 72 5b 30 5d 2e 69 42 6c 6f 63 6b 29 20 77 68  er[0].iBlock) wh
1f240 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1f250 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
1f260 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e  tatic int fts3In
1f270 63 72 6d 65 72 67 65 50 75 73 68 28 0a 20 20 46  crmergePush(.  F
1f280 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
1f290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f2a0 2a 20 46 74 73 33 20 74 61 62 6c 65 20 68 61 6e  * Fts3 table han
1f2b0 64 6c 65 20 2a 2f 0a 20 20 49 6e 63 72 6d 65 72  dle */.  Incrmer
1f2c0 67 65 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  geWriter *pWrite
1f2d0 72 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  r,       /* Writ
1f2e0 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  er object */.  c
1f2f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
1f300 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1f310 2a 20 54 65 72 6d 20 74 6f 20 77 72 69 74 65 20  * Term to write 
1f320 74 6f 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  to internal node
1f330 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 20   */.  int nTerm 
1f340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f350 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 61        /* Bytes a
1f360 74 20 7a 54 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20  t zTerm */.){.  
1f370 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50  sqlite3_int64 iP
1f380 74 72 20 3d 20 70 57 72 69 74 65 72 2d 3e 61 4e  tr = pWriter->aN
1f390 6f 64 65 57 72 69 74 65 72 5b 30 5d 2e 69 42 6c  odeWriter[0].iBl
1f3a0 6f 63 6b 3b 0a 20 20 69 6e 74 20 69 4c 61 79 65  ock;.  int iLaye
1f3b0 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 54  r;..  assert( nT
1f3c0 65 72 6d 3e 30 20 29 3b 0a 20 20 66 6f 72 28 69  erm>0 );.  for(i
1f3d0 4c 61 79 65 72 3d 31 3b 20 41 4c 57 41 59 53 28  Layer=1; ALWAYS(
1f3e0 69 4c 61 79 65 72 3c 46 54 53 5f 4d 41 58 5f 41  iLayer<FTS_MAX_A
1f3f0 50 50 45 4e 44 41 42 4c 45 5f 48 45 49 47 48 54  PPENDABLE_HEIGHT
1f400 29 3b 20 69 4c 61 79 65 72 2b 2b 29 7b 0a 20 20  ); iLayer++){.  
1f410 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1f420 69 4e 65 78 74 50 74 72 20 3d 20 30 3b 0a 20 20  iNextPtr = 0;.  
1f430 20 20 4e 6f 64 65 57 72 69 74 65 72 20 2a 70 4e    NodeWriter *pN
1f440 6f 64 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  ode = &pWriter->
1f450 61 4e 6f 64 65 57 72 69 74 65 72 5b 69 4c 61 79  aNodeWriter[iLay
1f460 65 72 5d 3b 0a 20 20 20 20 69 6e 74 20 72 63 20  er];.    int rc 
1f470 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1f480 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 0a 20 20   int nPrefix;.  
1f490 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 0a 20    int nSuffix;. 
1f4a0 20 20 20 69 6e 74 20 6e 53 70 61 63 65 3b 0a 0a     int nSpace;..
1f4b0 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
1f4c0 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65  t how much space
1f4d0 20 74 68 65 20 6b 65 79 20 77 69 6c 6c 20 63 6f   the key will co
1f4e0 6e 73 75 6d 65 20 69 66 20 69 74 20 69 73 20 77  nsume if it is w
1f4f0 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a  ritten to.    **
1f500 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64   the current nod
1f510 65 20 6f 66 20 6c 61 79 65 72 20 69 4c 61 79 65  e of layer iLaye
1f520 72 2e 20 44 75 65 20 74 6f 20 74 68 65 20 70 72  r. Due to the pr
1f530 65 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f 6e  efix compression
1f540 2c 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 70  , .    ** the sp
1f550 61 63 65 20 72 65 71 75 69 72 65 64 20 63 68 61  ace required cha
1f560 6e 67 65 73 20 64 65 70 65 6e 64 69 6e 67 20 6f  nges depending o
1f570 6e 20 77 68 69 63 68 20 6e 6f 64 65 20 74 68 65  n which node the
1f580 20 6b 65 79 20 69 73 20 74 6f 0a 20 20 20 20 2a   key is to.    *
1f590 2a 20 62 65 20 61 64 64 65 64 20 74 6f 2e 20 20  * be added to.  
1f5a0 2a 2f 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d  */.    nPrefix =
1f5b0 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72   fts3PrefixCompr
1f5c0 65 73 73 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e 61  ess(pNode->key.a
1f5d0 2c 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 2c 20  , pNode->key.n, 
1f5e0 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  zTerm, nTerm);. 
1f5f0 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65     nSuffix = nTe
1f600 72 6d 20 2d 20 6e 50 72 65 66 69 78 3b 0a 20 20  rm - nPrefix;.  
1f610 20 20 6e 53 70 61 63 65 20 20 3d 20 73 71 6c 69    nSpace  = sqli
1f620 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e  te3Fts3VarintLen
1f630 28 6e 50 72 65 66 69 78 29 3b 0a 20 20 20 20 6e  (nPrefix);.    n
1f640 53 70 61 63 65 20 2b 3d 20 73 71 6c 69 74 65 33  Space += sqlite3
1f650 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 53  Fts3VarintLen(nS
1f660 75 66 66 69 78 29 20 2b 20 6e 53 75 66 66 69 78  uffix) + nSuffix
1f670 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65  ;..    if( pNode
1f680 2d 3e 6b 65 79 2e 6e 3d 3d 30 20 7c 7c 20 28 70  ->key.n==0 || (p
1f690 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 20 2b 20  Node->block.n + 
1f6a0 6e 53 70 61 63 65 29 3c 3d 70 2d 3e 6e 4e 6f 64  nSpace)<=p->nNod
1f6b0 65 53 69 7a 65 20 29 7b 20 0a 20 20 20 20 20 20  eSize ){ .      
1f6c0 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  /* If the curren
1f6d0 74 20 6e 6f 64 65 20 6f 66 20 6c 61 79 65 72 20  t node of layer 
1f6e0 69 4c 61 79 65 72 20 63 6f 6e 74 61 69 6e 73 20  iLayer contains 
1f6f0 7a 65 72 6f 20 6b 65 79 73 2c 20 6f 72 20 69 66  zero keys, or if
1f700 20 61 64 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a   adding.      **
1f710 20 74 68 65 20 6b 65 79 20 74 6f 20 69 74 20 77   the key to it w
1f720 69 6c 6c 20 6e 6f 74 20 63 61 75 73 65 20 69 74  ill not cause it
1f730 20 74 6f 20 67 72 6f 77 20 74 6f 20 6c 61 72 67   to grow to larg
1f740 65 72 20 74 68 61 6e 20 6e 4e 6f 64 65 53 69 7a  er than nNodeSiz
1f750 65 20 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65  e .      ** byte
1f760 73 20 69 6e 20 73 69 7a 65 2c 20 77 72 69 74 65  s in size, write
1f770 20 74 68 65 20 6b 65 79 20 68 65 72 65 2e 20 20   the key here.  
1f780 2a 2f 0a 0a 20 20 20 20 20 20 42 6c 6f 62 20 2a  */..      Blob *
1f790 70 42 6c 6b 20 3d 20 26 70 4e 6f 64 65 2d 3e 62  pBlk = &pNode->b
1f7a0 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  lock;.      if( 
1f7b0 70 42 6c 6b 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20  pBlk->n==0 ){.  
1f7c0 20 20 20 20 20 20 62 6c 6f 62 47 72 6f 77 42 75        blobGrowBu
1f7d0 66 66 65 72 28 70 42 6c 6b 2c 20 70 2d 3e 6e 4e  ffer(pBlk, p->nN
1f7e0 6f 64 65 53 69 7a 65 2c 20 26 72 63 29 3b 0a 20  odeSize, &rc);. 
1f7f0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1f800 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f810 20 20 20 20 20 20 70 42 6c 6b 2d 3e 61 5b 30 5d        pBlk->a[0]
1f820 20 3d 20 28 63 68 61 72 29 69 4c 61 79 65 72 3b   = (char)iLayer;
1f830 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c 6b 2d  .          pBlk-
1f840 3e 6e 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  >n = 1 + sqlite3
1f850 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70  Fts3PutVarint(&p
1f860 42 6c 6b 2d 3e 61 5b 31 5d 2c 20 69 50 74 72 29  Blk->a[1], iPtr)
1f870 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1f880 20 20 7d 0a 20 20 20 20 20 20 62 6c 6f 62 47 72    }.      blobGr
1f890 6f 77 42 75 66 66 65 72 28 70 42 6c 6b 2c 20 70  owBuffer(pBlk, p
1f8a0 42 6c 6b 2d 3e 6e 20 2b 20 6e 53 70 61 63 65 2c  Blk->n + nSpace,
1f8b0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 62 6c 6f   &rc);.      blo
1f8c0 62 47 72 6f 77 42 75 66 66 65 72 28 26 70 4e 6f  bGrowBuffer(&pNo
1f8d0 64 65 2d 3e 6b 65 79 2c 20 6e 54 65 72 6d 2c 20  de->key, nTerm, 
1f8e0 26 72 63 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  &rc);..      if(
1f8f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f900 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  {.        if( pN
1f910 6f 64 65 2d 3e 6b 65 79 2e 6e 20 29 7b 0a 20 20  ode->key.n ){.  
1f920 20 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e 6e 20          pBlk->n 
1f930 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75  += sqlite3Fts3Pu
1f940 74 56 61 72 69 6e 74 28 26 70 42 6c 6b 2d 3e 61  tVarint(&pBlk->a
1f950 5b 70 42 6c 6b 2d 3e 6e 5d 2c 20 6e 50 72 65 66  [pBlk->n], nPref
1f960 69 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ix);.        }. 
1f970 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e 6e 20 2b         pBlk->n +
1f980 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74  = sqlite3Fts3Put
1f990 56 61 72 69 6e 74 28 26 70 42 6c 6b 2d 3e 61 5b  Varint(&pBlk->a[
1f9a0 70 42 6c 6b 2d 3e 6e 5d 2c 20 6e 53 75 66 66 69  pBlk->n], nSuffi
1f9b0 78 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  x);.        memc
1f9c0 70 79 28 26 70 42 6c 6b 2d 3e 61 5b 70 42 6c 6b  py(&pBlk->a[pBlk
1f9d0 2d 3e 6e 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50 72  ->n], &zTerm[nPr
1f9e0 65 66 69 78 5d 2c 20 6e 53 75 66 66 69 78 29 3b  efix], nSuffix);
1f9f0 0a 20 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e 6e  .        pBlk->n
1fa00 20 2b 3d 20 6e 53 75 66 66 69 78 3b 0a 0a 20 20   += nSuffix;..  
1fa10 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 6f        memcpy(pNo
1fa20 64 65 2d 3e 6b 65 79 2e 61 2c 20 7a 54 65 72 6d  de->key.a, zTerm
1fa30 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , nTerm);.      
1fa40 20 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 20 3d    pNode->key.n =
1fa50 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a   nTerm;.      }.
1fa60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1fa70 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66   /* Otherwise, f
1fa80 6c 75 73 68 20 74 68 65 20 63 75 72 72 65 6e 74  lush the current
1fa90 20 6e 6f 64 65 20 6f 66 20 6c 61 79 65 72 20 69   node of layer i
1faa0 4c 61 79 65 72 20 74 6f 20 64 69 73 6b 2e 0a 20  Layer to disk.. 
1fab0 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 61 6c 6c       ** Then all
1fac0 6f 63 61 74 65 20 61 20 6e 65 77 2c 20 65 6d 70  ocate a new, emp
1fad0 74 79 20 73 69 62 6c 69 6e 67 20 6e 6f 64 65 2e  ty sibling node.
1fae0 20 54 68 65 20 6b 65 79 20 77 69 6c 6c 20 62 65   The key will be
1faf0 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 2a   written.      *
1fb00 2a 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  * into the paren
1fb10 74 20 6f 66 20 74 68 69 73 20 6e 6f 64 65 2e 20  t of this node. 
1fb20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  */.      rc = ft
1fb30 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28 70  s3WriteSegment(p
1fb40 2c 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b 2c  , pNode->iBlock,
1fb50 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 2c   pNode->block.a,
1fb60 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 29   pNode->block.n)
1fb70 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
1fb80 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 41   pNode->block.nA
1fb90 6c 6c 6f 63 3e 3d 70 2d 3e 6e 4e 6f 64 65 53 69  lloc>=p->nNodeSi
1fba0 7a 65 20 29 3b 0a 20 20 20 20 20 20 70 4e 6f 64  ze );.      pNod
1fbb0 65 2d 3e 62 6c 6f 63 6b 2e 61 5b 30 5d 20 3d 20  e->block.a[0] = 
1fbc0 28 63 68 61 72 29 69 4c 61 79 65 72 3b 0a 20 20  (char)iLayer;.  
1fbd0 20 20 20 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b      pNode->block
1fbe0 2e 6e 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  .n = 1 + sqlite3
1fbf0 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70  Fts3PutVarint(&p
1fc00 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 5b 31 5d  Node->block.a[1]
1fc10 2c 20 69 50 74 72 2b 31 29 3b 0a 0a 20 20 20 20  , iPtr+1);..    
1fc20 20 20 69 4e 65 78 74 50 74 72 20 3d 20 70 4e 6f    iNextPtr = pNo
1fc30 64 65 2d 3e 69 42 6c 6f 63 6b 3b 0a 20 20 20 20  de->iBlock;.    
1fc40 20 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b 2b    pNode->iBlock+
1fc50 2b 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e  +;.      pNode->
1fc60 6b 65 79 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  key.n = 0;.    }
1fc70 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ..    if( rc!=SQ
1fc80 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 4e 65 78 74  LITE_OK || iNext
1fc90 50 74 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Ptr==0 ) return 
1fca0 72 63 3b 0a 20 20 20 20 69 50 74 72 20 3d 20 69  rc;.    iPtr = i
1fcb0 4e 65 78 74 50 74 72 3b 0a 20 20 7d 0a 0a 20 20  NextPtr;.  }..  
1fcc0 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 72  assert( 0 );.  r
1fcd0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1fce0 2a 20 41 70 70 65 6e 64 20 61 20 74 65 72 6d 20  * Append a term 
1fcf0 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29  and (optionally)
1fd00 20 64 6f 63 6c 69 73 74 20 74 6f 20 74 68 65 20   doclist to the 
1fd10 46 54 53 20 73 65 67 6d 65 6e 74 20 6e 6f 64 65  FTS segment node
1fd20 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 73 74   currently.** st
1fd30 6f 72 65 64 20 69 6e 20 62 6c 6f 62 20 2a 70 4e  ored in blob *pN
1fd40 6f 64 65 2e 20 54 68 65 20 6e 6f 64 65 20 6e 65  ode. The node ne
1fd50 65 64 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  ed not contain a
1fd60 6e 79 20 74 65 72 6d 73 2c 20 62 75 74 20 74 68  ny terms, but th
1fd70 65 0a 2a 2a 20 68 65 61 64 65 72 20 6d 75 73 74  e.** header must
1fd80 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f   be written befo
1fd90 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
1fda0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
1fdb0 2a 20 41 20 6e 6f 64 65 20 68 65 61 64 65 72 20  * A node header 
1fdc0 69 73 20 61 20 73 69 6e 67 6c 65 20 30 78 30 30  is a single 0x00
1fdd0 20 62 79 74 65 20 66 6f 72 20 61 20 6c 65 61 66   byte for a leaf
1fde0 20 6e 6f 64 65 2c 20 6f 72 20 61 20 68 65 69 67   node, or a heig
1fdf0 68 74 20 76 61 72 69 6e 74 0a 2a 2a 20 66 6f 6c  ht varint.** fol
1fe00 6c 6f 77 65 64 20 62 79 20 74 68 65 20 6c 65 66  lowed by the lef
1fe10 74 2d 68 61 6e 64 2d 63 68 69 6c 64 20 76 61 72  t-hand-child var
1fe20 69 6e 74 20 66 6f 72 20 61 6e 20 69 6e 74 65 72  int for an inter
1fe30 6e 61 6c 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  nal node..**.** 
1fe40 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61  The term to be a
1fe50 70 70 65 6e 64 65 64 20 69 73 20 70 61 73 73 65  ppended is passe
1fe60 64 20 76 69 61 20 61 72 67 75 6d 65 6e 74 73 20  d via arguments 
1fe70 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 46 6f 72  zTerm/nTerm. For
1fe80 20 61 20 0a 2a 2a 20 6c 65 61 66 20 6e 6f 64 65   a .** leaf node
1fe90 2c 20 74 68 65 20 64 6f 63 6c 69 73 74 20 69 73  , the doclist is
1fea0 20 70 61 73 73 65 64 20 61 73 20 61 44 6f 63 6c   passed as aDocl
1feb0 69 73 74 2f 6e 44 6f 63 6c 69 73 74 2e 20 46 6f  ist/nDoclist. Fo
1fec0 72 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a  r an internal.**
1fed0 20 6e 6f 64 65 2c 20 62 6f 74 68 20 61 44 6f 63   node, both aDoc
1fee0 6c 69 73 74 20 61 6e 64 20 6e 44 6f 63 6c 69 73  list and nDoclis
1fef0 74 20 6d 75 73 74 20 62 65 20 70 61 73 73 65 64  t must be passed
1ff00 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65   0..**.** If the
1ff10 20 73 69 7a 65 20 6f 66 20 74 68 65 20 76 61 6c   size of the val
1ff20 75 65 20 69 6e 20 62 6c 6f 62 20 70 50 72 65 76  ue in blob pPrev
1ff30 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   is zero, then t
1ff40 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
1ff50 0a 2a 2a 20 74 65 72 6d 20 77 72 69 74 74 65 6e  .** term written
1ff60 20 74 6f 20 74 68 65 20 6e 6f 64 65 2e 20 4f 74   to the node. Ot
1ff70 68 65 72 77 69 73 65 2c 20 70 50 72 65 76 20 63  herwise, pPrev c
1ff80 6f 6e 74 61 69 6e 73 20 61 20 63 6f 70 79 20 6f  ontains a copy o
1ff90 66 20 74 68 65 20 0a 2a 2a 20 70 72 65 76 69 6f  f the .** previo
1ffa0 75 73 20 74 65 72 6d 2e 20 42 65 66 6f 72 65 20  us term. Before 
1ffb0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
1ffc0 74 75 72 6e 73 2c 20 69 74 20 69 73 20 75 70 64  turns, it is upd
1ffd0 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ated to contain 
1ffe0 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 7a 54 65  a.** copy of zTe
1fff0 72 6d 2f 6e 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  rm/nTerm..**.** 
20000 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
20010 61 74 20 74 68 65 20 62 75 66 66 65 72 20 61 73  at the buffer as
20020 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 4e  sociated with pN
20030 6f 64 65 20 69 73 20 61 6c 72 65 61 64 79 20 6c  ode is already l
20040 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 74  arge.** enough t
20050 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68  o accommodate th
20060 65 20 6e 65 77 20 65 6e 74 72 79 2e 20 54 68 65  e new entry. The
20070 20 62 75 66 66 65 72 20 61 73 73 6f 63 69 61 74   buffer associat
20080 65 64 20 77 69 74 68 20 70 50 72 65 76 0a 2a 2a  ed with pPrev.**
20090 20 69 73 20 65 78 74 65 6e 64 65 64 20 62 79 20   is extended by 
200a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66  this function if
200b0 20 72 65 71 75 72 69 72 65 64 2e 0a 2a 2a 0a 2a   requrired..**.*
200c0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 28 69  * If an error (i
200d0 2e 65 2e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f  .e. OOM conditio
200e0 6e 29 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51  n) occurs, an SQ
200f0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
20100 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20  is.** returned. 
20110 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
20120 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
20130 69 6e 74 20 66 74 73 33 41 70 70 65 6e 64 54 6f  int fts3AppendTo
20140 4e 6f 64 65 28 0a 20 20 42 6c 6f 62 20 2a 70 4e  Node(.  Blob *pN
20150 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
20160 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
20170 6e 74 20 6e 6f 64 65 20 69 6d 61 67 65 20 74 6f  nt node image to
20180 20 61 70 70 65 6e 64 20 74 6f 20 2a 2f 0a 20 20   append to */.  
20190 42 6c 6f 62 20 2a 70 50 72 65 76 2c 20 20 20 20  Blob *pPrev,    
201a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201b0 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
201c0 6e 69 6e 67 20 70 72 65 76 69 6f 75 73 20 74 65  ning previous te
201d0 72 6d 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  rm written */.  
201e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72  const char *zTer
201f0 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
20200 2f 2a 20 4e 65 77 20 74 65 72 6d 20 74 6f 20 77  /* New term to w
20210 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  rite */.  int nT
20220 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
20230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
20240 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62 79  e of zTerm in by
20250 74 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  tes */.  const c
20260 68 61 72 20 2a 61 44 6f 63 6c 69 73 74 2c 20 20  har *aDoclist,  
20270 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c           /* Docl
20280 69 73 74 20 28 6f 72 20 4e 55 4c 4c 29 20 74 6f  ist (or NULL) to
20290 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20   write */.  int 
202a0 6e 44 6f 63 6c 69 73 74 20 20 20 20 20 20 20 20  nDoclist        
202b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
202c0 69 7a 65 20 6f 66 20 61 44 6f 63 6c 69 73 74 20  ize of aDoclist 
202d0 69 6e 20 62 79 74 65 73 20 2a 2f 20 0a 29 7b 0a  in bytes */ .){.
202e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
202f0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
20300 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
20310 20 2a 2f 0a 20 20 69 6e 74 20 62 46 69 72 73 74   */.  int bFirst
20320 20 3d 20 28 70 50 72 65 76 2d 3e 6e 3d 3d 30 29   = (pPrev->n==0)
20330 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
20340 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
20350 73 74 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20  st term written 
20360 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78  */.  int nPrefix
20370 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20380 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
20390 74 65 72 6d 20 70 72 65 66 69 78 20 69 6e 20 62  term prefix in b
203a0 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  ytes */.  int nS
203b0 75 66 66 69 78 3b 20 20 20 20 20 20 20 20 20 20  uffix;          
203c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
203d0 65 20 6f 66 20 74 65 72 6d 20 73 75 66 66 69 78  e of term suffix
203e0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20   in bytes */..  
203f0 2f 2a 20 4e 6f 64 65 20 6d 75 73 74 20 68 61 76  /* Node must hav
20400 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  e already been s
20410 74 61 72 74 65 64 2e 20 54 68 65 72 65 20 6d 75  tarted. There mu
20420 73 74 20 62 65 20 61 20 64 6f 63 6c 69 73 74 20  st be a doclist 
20430 66 6f 72 20 61 0a 20 20 2a 2a 20 6c 65 61 66 20  for a.  ** leaf 
20440 6e 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20  node, and there 
20450 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 20 64 6f  must not be a do
20460 63 6c 69 73 74 20 66 6f 72 20 61 6e 20 69 6e 74  clist for an int
20470 65 72 6e 61 6c 20 6e 6f 64 65 2e 20 20 2a 2f 0a  ernal node.  */.
20480 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d    assert( pNode-
20490 3e 6e 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  >n>0 );.  assert
204a0 28 20 28 70 4e 6f 64 65 2d 3e 61 5b 30 5d 3d 3d  ( (pNode->a[0]==
204b0 27 5c 30 27 29 3d 3d 28 61 44 6f 63 6c 69 73 74  '\0')==(aDoclist
204c0 21 3d 30 29 20 29 3b 0a 0a 20 20 62 6c 6f 62 47  !=0) );..  blobG
204d0 72 6f 77 42 75 66 66 65 72 28 70 50 72 65 76 2c  rowBuffer(pPrev,
204e0 20 6e 54 65 72 6d 2c 20 26 72 63 29 3b 0a 20 20   nTerm, &rc);.  
204f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20500 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
20510 20 20 6e 50 72 65 66 69 78 20 3d 20 66 74 73 33    nPrefix = fts3
20520 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70  PrefixCompress(p
20530 50 72 65 76 2d 3e 61 2c 20 70 50 72 65 76 2d 3e  Prev->a, pPrev->
20540 6e 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29  n, zTerm, nTerm)
20550 3b 0a 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54  ;.  nSuffix = nT
20560 65 72 6d 20 2d 20 6e 50 72 65 66 69 78 3b 0a 20  erm - nPrefix;. 
20570 20 6d 65 6d 63 70 79 28 70 50 72 65 76 2d 3e 61   memcpy(pPrev->a
20580 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b  , zTerm, nTerm);
20590 0a 20 20 70 50 72 65 76 2d 3e 6e 20 3d 20 6e 54  .  pPrev->n = nT
205a0 65 72 6d 3b 0a 0a 20 20 69 66 28 20 62 46 69 72  erm;..  if( bFir
205b0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 6f  st==0 ){.    pNo
205c0 64 65 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33  de->n += sqlite3
205d0 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70  Fts3PutVarint(&p
205e0 4e 6f 64 65 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e  Node->a[pNode->n
205f0 5d 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 7d  ], nPrefix);.  }
20600 0a 20 20 70 4e 6f 64 65 2d 3e 6e 20 2b 3d 20 73  .  pNode->n += s
20610 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72  qlite3Fts3PutVar
20620 69 6e 74 28 26 70 4e 6f 64 65 2d 3e 61 5b 70 4e  int(&pNode->a[pN
20630 6f 64 65 2d 3e 6e 5d 2c 20 6e 53 75 66 66 69 78  ode->n], nSuffix
20640 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 4e 6f  );.  memcpy(&pNo
20650 64 65 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d 2c  de->a[pNode->n],
20660 20 26 7a 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d   &zTerm[nPrefix]
20670 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 70 4e  , nSuffix);.  pN
20680 6f 64 65 2d 3e 6e 20 2b 3d 20 6e 53 75 66 66 69  ode->n += nSuffi
20690 78 3b 0a 0a 20 20 69 66 28 20 61 44 6f 63 6c 69  x;..  if( aDocli
206a0 73 74 20 29 7b 0a 20 20 20 20 70 4e 6f 64 65 2d  st ){.    pNode-
206b0 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  >n += sqlite3Fts
206c0 33 50 75 74 56 61 72 69 6e 74 28 26 70 4e 6f 64  3PutVarint(&pNod
206d0 65 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d 2c 20  e->a[pNode->n], 
206e0 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 6d  nDoclist);.    m
206f0 65 6d 63 70 79 28 26 70 4e 6f 64 65 2d 3e 61 5b  emcpy(&pNode->a[
20700 70 4e 6f 64 65 2d 3e 6e 5d 2c 20 61 44 6f 63 6c  pNode->n], aDocl
20710 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a  ist, nDoclist);.
20720 20 20 20 20 70 4e 6f 64 65 2d 3e 6e 20 2b 3d 20      pNode->n += 
20730 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20  nDoclist;.  }.. 
20740 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e   assert( pNode->
20750 6e 3c 3d 70 4e 6f 64 65 2d 3e 6e 41 6c 6c 6f 63  n<=pNode->nAlloc
20760 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51   );..  return SQ
20770 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
20780 2a 20 41 70 70 65 6e 64 20 74 68 65 20 63 75 72  * Append the cur
20790 72 65 6e 74 20 74 65 72 6d 20 61 6e 64 20 64 6f  rent term and do
207a0 63 6c 69 73 74 20 70 6f 69 6e 74 65 64 20 74 6f  clist pointed to
207b0 20 62 79 20 63 75 72 73 6f 72 20 70 43 73 72 20   by cursor pCsr 
207c0 74 6f 20 74 68 65 0a 2a 2a 20 61 70 70 65 6e 64  to the.** append
207d0 61 62 6c 65 20 62 2d 74 72 65 65 20 73 65 67 6d  able b-tree segm
207e0 65 6e 74 20 6f 70 65 6e 65 64 20 66 6f 72 20 77  ent opened for w
207f0 72 69 74 69 6e 67 20 62 79 20 70 57 72 69 74 65  riting by pWrite
20800 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
20810 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
20820 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
20830 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
20840 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
20850 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e  tatic int fts3In
20860 63 72 6d 65 72 67 65 41 70 70 65 6e 64 28 0a 20  crmergeAppend(. 
20870 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
20880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20890 20 2f 2a 20 46 74 73 33 20 74 61 62 6c 65 20 68   /* Fts3 table h
208a0 61 6e 64 6c 65 20 2a 2f 0a 20 20 49 6e 63 72 6d  andle */.  Incrm
208b0 65 72 67 65 57 72 69 74 65 72 20 2a 70 57 72 69  ergeWriter *pWri
208c0 74 65 72 2c 20 20 20 20 20 20 20 2f 2a 20 57 72  ter,       /* Wr
208d0 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  iter object */. 
208e0 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61   Fts3MultiSegRea
208f0 64 65 72 20 2a 70 43 73 72 20 20 20 20 20 20 20  der *pCsr       
20900 20 2f 2a 20 43 75 72 73 6f 72 20 63 6f 6e 74 61   /* Cursor conta
20910 69 6e 69 6e 67 20 74 65 72 6d 20 61 6e 64 20 64  ining term and d
20920 6f 63 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 63  oclist */.){.  c
20930 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
20940 20 3d 20 70 43 73 72 2d 3e 7a 54 65 72 6d 3b 0a   = pCsr->zTerm;.
20950 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70 43    int nTerm = pC
20960 73 72 2d 3e 6e 54 65 72 6d 3b 0a 20 20 63 6f 6e  sr->nTerm;.  con
20970 73 74 20 63 68 61 72 20 2a 61 44 6f 63 6c 69 73  st char *aDoclis
20980 74 20 3d 20 70 43 73 72 2d 3e 61 44 6f 63 6c 69  t = pCsr->aDocli
20990 73 74 3b 0a 20 20 69 6e 74 20 6e 44 6f 63 6c 69  st;.  int nDocli
209a0 73 74 20 3d 20 70 43 73 72 2d 3e 6e 44 6f 63 6c  st = pCsr->nDocl
209b0 69 73 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ist;.  int rc = 
209c0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
209d0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
209e0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70  ode */.  int nSp
209f0 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
20a00 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
20a10 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 72  space in bytes r
20a20 65 71 75 69 72 65 64 20 6f 6e 20 6c 65 61 66 20  equired on leaf 
20a30 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78  */.  int nPrefix
20a40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20a50 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 72     /* Size of pr
20a60 65 66 69 78 20 73 68 61 72 65 64 20 77 69 74 68  efix shared with
20a70 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 2a   previous term *
20a80 2f 0a 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b  /.  int nSuffix;
20a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20aa0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 75 66    /* Size of suf
20ab0 66 69 78 20 28 6e 54 65 72 6d 20 2d 20 6e 50 72  fix (nTerm - nPr
20ac0 65 66 69 78 29 20 2a 2f 0a 20 20 4e 6f 64 65 57  efix) */.  NodeW
20ad0 72 69 74 65 72 20 2a 70 4c 65 61 66 3b 20 20 20  riter *pLeaf;   
20ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65           /* Obje
20af0 63 74 20 75 73 65 64 20 74 6f 20 77 72 69 74 65  ct used to write
20b00 20 6c 65 61 66 20 6e 6f 64 65 73 20 2a 2f 0a 0a   leaf nodes */..
20b10 20 20 70 4c 65 61 66 20 3d 20 26 70 57 72 69 74    pLeaf = &pWrit
20b20 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b  er->aNodeWriter[
20b30 30 5d 3b 0a 20 20 6e 50 72 65 66 69 78 20 3d 20  0];.  nPrefix = 
20b40 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65  fts3PrefixCompre
20b50 73 73 28 70 4c 65 61 66 2d 3e 6b 65 79 2e 61 2c  ss(pLeaf->key.a,
20b60 20 70 4c 65 61 66 2d 3e 6b 65 79 2e 6e 2c 20 7a   pLeaf->key.n, z
20b70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20  Term, nTerm);.  
20b80 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d 20  nSuffix = nTerm 
20b90 2d 20 6e 50 72 65 66 69 78 3b 0a 0a 20 20 6e 53  - nPrefix;..  nS
20ba0 70 61 63 65 20 20 3d 20 73 71 6c 69 74 65 33 46  pace  = sqlite3F
20bb0 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 50 72  ts3VarintLen(nPr
20bc0 65 66 69 78 29 3b 0a 20 20 6e 53 70 61 63 65 20  efix);.  nSpace 
20bd0 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56 61  += sqlite3Fts3Va
20be0 72 69 6e 74 4c 65 6e 28 6e 53 75 66 66 69 78 29  rintLen(nSuffix)
20bf0 20 2b 20 6e 53 75 66 66 69 78 3b 0a 20 20 6e 53   + nSuffix;.  nS
20c00 70 61 63 65 20 2b 3d 20 73 71 6c 69 74 65 33 46  pace += sqlite3F
20c10 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 44 6f  ts3VarintLen(nDo
20c20 63 6c 69 73 74 29 20 2b 20 6e 44 6f 63 6c 69 73  clist) + nDoclis
20c30 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  t;..  /* If the 
20c40 63 75 72 72 65 6e 74 20 62 6c 6f 63 6b 20 69 73  current block is
20c50 20 6e 6f 74 20 65 6d 70 74 79 2c 20 61 6e 64 20   not empty, and 
20c60 69 66 20 61 64 64 69 6e 67 20 74 68 69 73 20 74  if adding this t
20c70 65 72 6d 2f 64 6f 63 6c 69 73 74 0a 20 20 2a 2a  erm/doclist.  **
20c80 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
20c90 62 6c 6f 63 6b 20 77 6f 75 6c 64 20 6d 61 6b 65  block would make
20ca0 20 69 74 20 6c 61 72 67 65 72 20 74 68 61 6e 20   it larger than 
20cb0 46 74 73 33 54 61 62 6c 65 2e 6e 4e 6f 64 65 53  Fts3Table.nNodeS
20cc0 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 2c 20  ize.  ** bytes, 
20cd0 77 72 69 74 65 20 74 68 69 73 20 62 6c 6f 63 6b  write this block
20ce0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
20cf0 62 61 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70  base. */.  if( p
20d00 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 3e 30 20  Leaf->block.n>0 
20d10 26 26 20 28 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b  && (pLeaf->block
20d20 2e 6e 20 2b 20 6e 53 70 61 63 65 29 3e 70 2d 3e  .n + nSpace)>p->
20d30 6e 4e 6f 64 65 53 69 7a 65 20 29 7b 0a 20 20 20  nNodeSize ){.   
20d40 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65 53   rc = fts3WriteS
20d50 65 67 6d 65 6e 74 28 70 2c 20 70 4c 65 61 66 2d  egment(p, pLeaf-
20d60 3e 69 42 6c 6f 63 6b 2c 20 70 4c 65 61 66 2d 3e  >iBlock, pLeaf->
20d70 62 6c 6f 63 6b 2e 61 2c 20 70 4c 65 61 66 2d 3e  block.a, pLeaf->
20d80 62 6c 6f 63 6b 2e 6e 29 3b 0a 20 20 20 20 70 57  block.n);.    pW
20d90 72 69 74 65 72 2d 3e 6e 57 6f 72 6b 2b 2b 3b 0a  riter->nWork++;.
20da0 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
20db0 63 75 72 72 65 6e 74 20 74 65 72 6d 20 74 6f 20  current term to 
20dc0 74 68 65 20 70 61 72 65 6e 74 20 6e 6f 64 65 2e  the parent node.
20dd0 20 54 68 65 20 74 65 72 6d 20 61 64 64 65 64 20   The term added 
20de0 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70  to the .    ** p
20df0 61 72 65 6e 74 20 6d 75 73 74 3a 0a 20 20 20 20  arent must:.    
20e00 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 61 29 20 62  **.    **   a) b
20e10 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  e greater than t
20e20 68 65 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20  he largest term 
20e30 6f 6e 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65  on the leaf node
20e40 20 6a 75 73 74 20 77 72 69 74 74 65 6e 0a 20 20   just written.  
20e50 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65    **      to the
20e60 20 64 61 74 61 62 61 73 65 20 28 73 74 69 6c 6c   database (still
20e70 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 4c   available in pL
20e80 65 61 66 2d 3e 6b 65 79 29 2c 20 61 6e 64 0a 20  eaf->key), and. 
20e90 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 62     **.    **   b
20ea0 29 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f  ) be less than o
20eb0 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74  r equal to the t
20ec0 65 72 6d 20 61 62 6f 75 74 20 74 6f 20 62 65 20  erm about to be 
20ed0 61 64 64 65 64 20 74 6f 20 74 68 65 20 6e 65 77  added to the new
20ee0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6c 65 61  .    **      lea
20ef0 66 20 6e 6f 64 65 20 28 7a 54 65 72 6d 2f 6e 54  f node (zTerm/nT
20f00 65 72 6d 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  erm)..    **.   
20f10 20 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72   ** In other wor
20f20 64 73 2c 20 69 74 20 6d 75 73 74 20 62 65 20 74  ds, it must be t
20f30 68 65 20 70 72 65 66 69 78 20 6f 66 20 7a 54 65  he prefix of zTe
20f40 72 6d 20 31 20 62 79 74 65 20 6c 6f 6e 67 65 72  rm 1 byte longer
20f50 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65   than.    ** the
20f60 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 28   common prefix (
20f70 69 66 20 61 6e 79 29 20 6f 66 20 7a 54 65 72 6d  if any) of zTerm
20f80 20 61 6e 64 20 70 57 72 69 74 65 72 2d 3e 7a 54   and pWriter->zT
20f90 65 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  erm..    */.    
20fa0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20fb0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
20fc0 66 74 73 33 49 6e 63 72 6d 65 72 67 65 50 75 73  fts3IncrmergePus
20fd0 68 28 70 2c 20 70 57 72 69 74 65 72 2c 20 7a 54  h(p, pWriter, zT
20fe0 65 72 6d 2c 20 6e 50 72 65 66 69 78 2b 31 29 3b  erm, nPrefix+1);
20ff0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
21000 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
21010 78 74 20 6f 75 74 70 75 74 20 62 6c 6f 63 6b 20  xt output block 
21020 2a 2f 0a 20 20 20 20 70 4c 65 61 66 2d 3e 69 42  */.    pLeaf->iB
21030 6c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 70 4c 65 61  lock++;.    pLea
21040 66 2d 3e 6b 65 79 2e 6e 20 3d 20 30 3b 0a 20 20  f->key.n = 0;.  
21050 20 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e    pLeaf->block.n
21060 20 3d 20 30 3b 0a 0a 20 20 20 20 6e 53 75 66 66   = 0;..    nSuff
21070 69 78 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20  ix = nTerm;.    
21080 6e 53 70 61 63 65 20 20 3d 20 31 3b 0a 20 20 20  nSpace  = 1;.   
21090 20 6e 53 70 61 63 65 20 2b 3d 20 73 71 6c 69 74   nSpace += sqlit
210a0 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28  e3Fts3VarintLen(
210b0 6e 53 75 66 66 69 78 29 20 2b 20 6e 53 75 66 66  nSuffix) + nSuff
210c0 69 78 3b 0a 20 20 20 20 6e 53 70 61 63 65 20 2b  ix;.    nSpace +
210d0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72  = sqlite3Fts3Var
210e0 69 6e 74 4c 65 6e 28 6e 44 6f 63 6c 69 73 74 29  intLen(nDoclist)
210f0 20 2b 20 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 7d   + nDoclist;.  }
21100 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65  ..  pWriter->nLe
21110 61 66 44 61 74 61 20 2b 3d 20 6e 53 70 61 63 65  afData += nSpace
21120 3b 0a 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66  ;.  blobGrowBuff
21130 65 72 28 26 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b  er(&pLeaf->block
21140 2c 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e  , pLeaf->block.n
21150 20 2b 20 6e 53 70 61 63 65 2c 20 26 72 63 29 3b   + nSpace, &rc);
21160 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
21170 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
21180 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 3d 3d  pLeaf->block.n==
21190 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 61 66  0 ){.      pLeaf
211a0 2d 3e 62 6c 6f 63 6b 2e 6e 20 3d 20 31 3b 0a 20  ->block.n = 1;. 
211b0 20 20 20 20 20 70 4c 65 61 66 2d 3e 62 6c 6f 63       pLeaf->bloc
211c0 6b 2e 61 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20  k.a[0] = '\0';. 
211d0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 66 74     }.    rc = ft
211e0 73 33 41 70 70 65 6e 64 54 6f 4e 6f 64 65 28 0a  s3AppendToNode(.
211f0 20 20 20 20 20 20 20 20 26 70 4c 65 61 66 2d 3e          &pLeaf->
21200 62 6c 6f 63 6b 2c 20 26 70 4c 65 61 66 2d 3e 6b  block, &pLeaf->k
21210 65 79 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  ey, zTerm, nTerm
21220 2c 20 61 44 6f 63 6c 69 73 74 2c 20 6e 44 6f 63  , aDoclist, nDoc
21230 6c 69 73 74 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  list.    );.  }.
21240 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21250 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
21260 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
21270 6f 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 64 79  o release all dy
21280 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 20  namic resources 
21290 68 65 6c 64 20 62 79 20 74 68 65 0a 2a 2a 20 6d  held by the.** m
212a0 65 72 67 65 2d 77 72 69 74 65 72 20 6f 62 6a 65  erge-writer obje
212b0 63 74 20 70 57 72 69 74 65 72 2c 20 61 6e 64 20  ct pWriter, and 
212c0 69 66 20 6e 6f 20 65 72 72 6f 72 20 68 61 73 20  if no error has 
212d0 6f 63 63 75 72 72 65 64 2c 20 74 6f 20 66 6c 75  occurred, to flu
212e0 73 68 0a 2a 2a 20 61 6c 6c 20 6f 75 74 73 74 61  sh.** all outsta
212f0 6e 64 69 6e 67 20 6e 6f 64 65 20 62 75 66 66 65  nding node buffe
21300 72 73 20 68 65 6c 64 20 62 79 20 70 57 72 69 74  rs held by pWrit
21310 65 72 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  er to disk..**.*
21320 2a 20 49 66 20 2a 70 52 63 20 69 73 20 6e 6f 74  * If *pRc is not
21330 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20   SQLITE_OK when 
21340 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
21350 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 6e 6f   called, then no
21360 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d   attempt.** is m
21370 61 64 65 20 74 6f 20 77 72 69 74 65 20 61 6e 79  ade to write any
21380 20 64 61 74 61 20 74 6f 20 64 69 73 6b 2e 20 49   data to disk. I
21390 6e 73 74 65 61 64 2c 20 74 68 69 73 20 66 75 6e  nstead, this fun
213a0 63 74 69 6f 6e 20 73 65 72 76 65 73 20 6f 6e 6c  ction serves onl
213b0 79 0a 2a 2a 20 74 6f 20 72 65 6c 65 61 73 65 20  y.** to release 
213c0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 73 6f  outstanding reso
213d0 75 72 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  urces..**.** Oth
213e0 65 72 77 69 73 65 2c 20 69 66 20 2a 70 52 63 20  erwise, if *pRc 
213f0 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 53 51 4c  is initially SQL
21400 49 54 45 5f 4f 4b 20 61 6e 64 20 61 6e 20 65 72  ITE_OK and an er
21410 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
21420 0a 2a 2a 20 66 6c 75 73 68 69 6e 67 20 62 75 66  .** flushing buf
21430 66 65 72 73 20 74 6f 20 64 69 73 6b 2c 20 2a 70  fers to disk, *p
21440 52 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  Rc is set to an 
21450 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
21460 65 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75  e before.** retu
21470 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
21480 20 76 6f 69 64 20 66 74 73 33 49 6e 63 72 6d 65   void fts3Incrme
21490 72 67 65 52 65 6c 65 61 73 65 28 0a 20 20 46 74  rgeRelease(.  Ft
214a0 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
214b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
214c0 20 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64   FTS3 table hand
214d0 6c 65 20 2a 2f 0a 20 20 49 6e 63 72 6d 65 72 67  le */.  Incrmerg
214e0 65 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  eWriter *pWriter
214f0 2c 20 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65  ,       /* Merge
21500 2d 77 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a  -writer object *
21510 2f 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20  /.  int *pRc    
21520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21530 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45      /* IN/OUT: E
21540 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 29 7b 0a  rror code */.){.
21550 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
21560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21570 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
21580 72 61 74 65 20 74 68 72 6f 75 67 68 20 6e 6f 6e  rate through non
21590 2d 72 6f 6f 74 20 6c 61 79 65 72 73 20 2a 2f 0a  -root layers */.
215a0 20 20 69 6e 74 20 69 52 6f 6f 74 3b 20 20 20 20    int iRoot;    
215b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215c0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 6f    /* Index of ro
215d0 6f 74 20 69 6e 20 70 57 72 69 74 65 72 2d 3e 61  ot in pWriter->a
215e0 4e 6f 64 65 57 72 69 74 65 72 20 2a 2f 0a 20 20  NodeWriter */.  
215f0 4e 6f 64 65 57 72 69 74 65 72 20 2a 70 52 6f 6f  NodeWriter *pRoo
21600 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
21610 2f 2a 20 4e 6f 64 65 57 72 69 74 65 72 20 66 6f  /* NodeWriter fo
21620 72 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20  r root node */. 
21630 20 69 6e 74 20 72 63 20 3d 20 2a 70 52 63 3b 20   int rc = *pRc; 
21640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21650 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a   /* Error code *
21660 2f 0a 0a 20 20 2f 2a 20 53 65 74 20 69 52 6f 6f  /..  /* Set iRoo
21670 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 69  t to the index i
21680 6e 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65  n pWriter->aNode
21690 57 72 69 74 65 72 5b 5d 20 6f 66 20 74 68 65 20  Writer[] of the 
216a0 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 0a  output segment .
216b0 20 20 2a 2a 20 72 6f 6f 74 20 6e 6f 64 65 2e 20    ** root node. 
216c0 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 66  If the segment f
216d0 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
216e0 61 20 73 69 6e 67 6c 65 20 6c 65 61 66 20 6e 6f  a single leaf no
216f0 64 65 2c 20 69 52 6f 6f 74 0a 20 20 2a 2a 20 77  de, iRoot.  ** w
21700 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 30 2e  ill be set to 0.
21710 20 49 66 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64   If the root nod
21720 65 20 69 73 20 74 68 65 20 70 61 72 65 6e 74 20  e is the parent 
21730 6f 66 20 74 68 65 20 6c 65 61 76 65 73 2c 20 69  of the leaves, i
21740 52 6f 6f 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  Root.  ** will b
21750 65 20 31 2e 20 41 6e 64 20 73 6f 20 6f 6e 2e 20  e 1. And so on. 
21760 20 2a 2f 0a 20 20 66 6f 72 28 69 52 6f 6f 74 3d   */.  for(iRoot=
21770 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42  FTS_MAX_APPENDAB
21780 4c 45 5f 48 45 49 47 48 54 2d 31 3b 20 69 52 6f  LE_HEIGHT-1; iRo
21790 6f 74 3e 3d 30 3b 20 69 52 6f 6f 74 2d 2d 29 7b  ot>=0; iRoot--){
217a0 0a 20 20 20 20 4e 6f 64 65 57 72 69 74 65 72 20  .    NodeWriter 
217b0 2a 70 4e 6f 64 65 20 3d 20 26 70 57 72 69 74 65  *pNode = &pWrite
217c0 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 69  r->aNodeWriter[i
217d0 52 6f 6f 74 5d 3b 0a 20 20 20 20 69 66 28 20 70  Root];.    if( p
217e0 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 3e 30 20  Node->block.n>0 
217f0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73  ) break;.    ass
21800 65 72 74 28 20 2a 70 52 63 20 7c 7c 20 70 4e 6f  ert( *pRc || pNo
21810 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 41 6c 6c 6f 63  de->block.nAlloc
21820 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
21830 74 28 20 2a 70 52 63 20 7c 7c 20 70 4e 6f 64 65  t( *pRc || pNode
21840 2d 3e 6b 65 79 2e 6e 41 6c 6c 6f 63 3d 3d 30 20  ->key.nAlloc==0 
21850 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
21860 72 65 65 28 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b  ree(pNode->block
21870 2e 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  .a);.    sqlite3
21880 5f 66 72 65 65 28 70 4e 6f 64 65 2d 3e 6b 65 79  _free(pNode->key
21890 2e 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45  .a);.  }..  /* E
218a0 6d 70 74 79 20 6f 75 74 70 75 74 20 73 65 67 6d  mpty output segm
218b0 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61 20 6e  ent. This is a n
218c0 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 69  o-op. */.  if( i
218d0 52 6f 6f 74 3c 30 20 29 20 72 65 74 75 72 6e 3b  Root<0 ) return;
218e0 0a 0a 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72  ..  /* The entir
218f0 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  e output segment
21900 20 66 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c   fits on a singl
21910 65 20 6e 6f 64 65 2e 20 4e 6f 72 6d 61 6c 6c 79  e node. Normally
21920 2c 20 74 68 69 73 20 6d 65 61 6e 73 0a 20 20 2a  , this means.  *
21930 2a 20 74 68 65 20 6e 6f 64 65 20 77 6f 75 6c 64  * the node would
21940 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20   be stored as a 
21950 62 6c 6f 62 20 69 6e 20 74 68 65 20 22 72 6f 6f  blob in the "roo
21960 74 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  t" column of the
21970 20 25 5f 73 65 67 64 69 72 0a 20 20 2a 2a 20 74   %_segdir.  ** t
21980 61 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 74  able. However, t
21990 68 69 73 20 69 73 20 6e 6f 74 20 70 65 72 6d 69  his is not permi
219a0 74 74 65 64 20 69 6e 20 74 68 69 73 20 63 61 73  tted in this cas
219b0 65 2e 20 54 68 65 20 70 72 6f 62 6c 65 6d 20 69  e. The problem i
219c0 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 73 70 61  s that .  ** spa
219d0 63 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ce has already b
219e0 65 65 6e 20 72 65 73 65 72 76 65 64 20 69 6e 20  een reserved in 
219f0 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74  the %_segments t
21a00 61 62 6c 65 2c 20 61 6e 64 20 73 6f 20 74 68 65  able, and so the
21a10 20 0a 20 20 2a 2a 20 73 74 61 72 74 5f 62 6c 6f   .  ** start_blo
21a20 63 6b 20 61 6e 64 20 65 6e 64 5f 62 6c 6f 63 6b  ck and end_block
21a30 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 25   fields of the %
21a40 5f 73 65 67 64 69 72 20 74 61 62 6c 65 20 6d 75  _segdir table mu
21a50 73 74 20 62 65 20 70 6f 70 75 6c 61 74 65 64 2e  st be populated.
21a60 20 0a 20 20 2a 2a 20 41 6e 64 2c 20 62 79 20 64   .  ** And, by d
21a70 65 73 69 67 6e 20 6f 72 20 62 79 20 61 63 63 69  esign or by acci
21a80 64 65 6e 74 2c 20 72 65 6c 65 61 73 65 64 20 76  dent, released v
21a90 65 72 73 69 6f 6e 73 20 6f 66 20 46 54 53 20 63  ersions of FTS c
21aa0 61 6e 6e 6f 74 20 68 61 6e 64 6c 65 20 0a 20 20  annot handle .  
21ab0 2a 2a 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74  ** segments that
21ac0 20 66 69 74 20 65 6e 74 69 72 65 6c 79 20 6f 6e   fit entirely on
21ad0 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 77   the root node w
21ae0 69 74 68 20 73 74 61 72 74 5f 62 6c 6f 63 6b 21  ith start_block!
21af0 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  =0..  **.  ** In
21b00 73 74 65 61 64 2c 20 63 72 65 61 74 65 20 61 20  stead, create a 
21b10 73 79 6e 74 68 65 74 69 63 20 72 6f 6f 74 20 6e  synthetic root n
21b20 6f 64 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ode that contain
21b30 73 20 6e 6f 74 68 69 6e 67 20 62 75 74 20 61 20  s nothing but a 
21b40 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f  .  ** pointer to
21b50 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6e 74   the single cont
21b60 65 6e 74 20 6e 6f 64 65 2e 20 53 6f 20 74 68 61  ent node. So tha
21b70 74 20 74 68 65 20 73 65 67 6d 65 6e 74 20 63 6f  t the segment co
21b80 6e 73 69 73 74 73 20 6f 66 20 61 0a 20 20 2a 2a  nsists of a.  **
21b90 20 73 69 6e 67 6c 65 20 6c 65 61 66 20 61 6e 64   single leaf and
21ba0 20 61 20 73 69 6e 67 6c 65 20 69 6e 74 65 72 69   a single interi
21bb0 6f 72 20 28 72 6f 6f 74 29 20 6e 6f 64 65 2e 0a  or (root) node..
21bc0 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 64 6f 3a 20    **.  ** Todo: 
21bd0 42 65 74 74 65 72 20 6d 69 67 68 74 20 62 65 20  Better might be 
21be0 74 6f 20 64 65 66 65 72 20 61 6c 6c 6f 63 61 74  to defer allocat
21bf0 69 6e 67 20 73 70 61 63 65 20 69 6e 20 74 68 65  ing space in the
21c00 20 25 5f 73 65 67 6d 65 6e 74 73 20 0a 20 20 2a   %_segments .  *
21c10 2a 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 77 65  * table until we
21c20 20 61 72 65 20 73 75 72 65 20 69 74 20 69 73 20   are sure it is 
21c30 6e 65 65 64 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  needed..  */.  i
21c40 66 28 20 69 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20  f( iRoot==0 ){. 
21c50 20 20 20 42 6c 6f 62 20 2a 70 42 6c 6f 63 6b 20     Blob *pBlock 
21c60 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64  = &pWriter->aNod
21c70 65 57 72 69 74 65 72 5b 31 5d 2e 62 6c 6f 63 6b  eWriter[1].block
21c80 3b 0a 20 20 20 20 62 6c 6f 62 47 72 6f 77 42 75  ;.    blobGrowBu
21c90 66 66 65 72 28 70 42 6c 6f 63 6b 2c 20 31 20 2b  ffer(pBlock, 1 +
21ca0 20 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58   FTS3_VARINT_MAX
21cb0 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20  , &rc);.    if( 
21cc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21cd0 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b 2d 3e 61  .      pBlock->a
21ce0 5b 30 5d 20 3d 20 30 78 30 31 3b 0a 20 20 20 20  [0] = 0x01;.    
21cf0 20 20 70 42 6c 6f 63 6b 2d 3e 6e 20 3d 20 31 20    pBlock->n = 1 
21d00 2b 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74  + sqlite3Fts3Put
21d10 56 61 72 69 6e 74 28 0a 20 20 20 20 20 20 20 20  Varint(.        
21d20 20 20 26 70 42 6c 6f 63 6b 2d 3e 61 5b 31 5d 2c    &pBlock->a[1],
21d30 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57   pWriter->aNodeW
21d40 72 69 74 65 72 5b 30 5d 2e 69 42 6c 6f 63 6b 0a  riter[0].iBlock.
21d50 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
21d60 20 20 20 69 52 6f 6f 74 20 3d 20 31 3b 0a 20 20     iRoot = 1;.  
21d70 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 26 70 57 72  }.  pRoot = &pWr
21d80 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65  iter->aNodeWrite
21d90 72 5b 69 52 6f 6f 74 5d 3b 0a 0a 20 20 2f 2a 20  r[iRoot];..  /* 
21da0 46 6c 75 73 68 20 61 6c 6c 20 63 75 72 72 65 6e  Flush all curren
21db0 74 6c 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  tly outstanding 
21dc0 6e 6f 64 65 73 20 74 6f 20 64 69 73 6b 2e 20 2a  nodes to disk. *
21dd0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 69  /.  for(i=0; i<i
21de0 52 6f 6f 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Root; i++){.    
21df0 4e 6f 64 65 57 72 69 74 65 72 20 2a 70 4e 6f 64  NodeWriter *pNod
21e00 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 4e  e = &pWriter->aN
21e10 6f 64 65 57 72 69 74 65 72 5b 69 5d 3b 0a 20 20  odeWriter[i];.  
21e20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 62 6c 6f    if( pNode->blo
21e30 63 6b 2e 6e 3e 30 20 26 26 20 72 63 3d 3d 53 51  ck.n>0 && rc==SQ
21e40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21e50 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65 53   rc = fts3WriteS
21e60 65 67 6d 65 6e 74 28 70 2c 20 70 4e 6f 64 65 2d  egment(p, pNode-
21e70 3e 69 42 6c 6f 63 6b 2c 20 70 4e 6f 64 65 2d 3e  >iBlock, pNode->
21e80 62 6c 6f 63 6b 2e 61 2c 20 70 4e 6f 64 65 2d 3e  block.a, pNode->
21e90 62 6c 6f 63 6b 2e 6e 29 3b 0a 20 20 20 20 7d 0a  block.n);.    }.
21ea0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
21eb0 28 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 29  (pNode->block.a)
21ec0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
21ed0 65 65 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e 61 29  ee(pNode->key.a)
21ee0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
21ef0 65 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 72  e the %_segdir r
21f00 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 69 66 28 20  ecord. */.  if( 
21f10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21f20 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 57 72  .    rc = fts3Wr
21f30 69 74 65 53 65 67 64 69 72 28 70 2c 20 0a 20 20  iteSegdir(p, .  
21f40 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69        pWriter->i
21f50 41 62 73 4c 65 76 65 6c 2b 31 2c 20 20 20 20 20  AbsLevel+1,     
21f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 65 76            /* lev
21f70 65 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57  el */.        pW
21f80 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 20 20 20  riter->iIdx,    
21f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fa0 20 20 2f 2a 20 69 64 78 20 2a 2f 0a 20 20 20 20    /* idx */.    
21fb0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 53 74      pWriter->iSt
21fc0 61 72 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  art,            
21fd0 20 20 20 20 20 20 20 20 2f 2a 20 73 74 61 72 74          /* start
21fe0 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  _block */.      
21ff0 20 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65    pWriter->aNode
22000 57 72 69 74 65 72 5b 30 5d 2e 69 42 6c 6f 63 6b  Writer[0].iBlock
22010 2c 20 20 20 20 20 2f 2a 20 6c 65 61 76 65 73 5f  ,     /* leaves_
22020 65 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20  end_block */.   
22030 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 45       pWriter->iE
22040 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nd,             
22050 20 20 20 20 20 20 20 20 20 2f 2a 20 65 6e 64 5f           /* end_
22060 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20  block */.       
22070 20 28 70 57 72 69 74 65 72 2d 3e 62 4e 6f 4c 65   (pWriter->bNoLe
22080 61 66 44 61 74 61 3d 3d 30 20 3f 20 70 57 72 69  afData==0 ? pWri
22090 74 65 72 2d 3e 6e 4c 65 61 66 44 61 74 61 20 3a  ter->nLeafData :
220a0 20 30 29 2c 20 20 20 2f 2a 20 65 6e 64 5f 62 6c   0),   /* end_bl
220b0 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ock */.        p
220c0 52 6f 6f 74 2d 3e 62 6c 6f 63 6b 2e 61 2c 20 70  Root->block.a, p
220d0 52 6f 6f 74 2d 3e 62 6c 6f 63 6b 2e 6e 20 20 20  Root->block.n   
220e0 20 20 20 2f 2a 20 72 6f 6f 74 20 2a 2f 0a 20 20     /* root */.  
220f0 20 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74    );.  }.  sqlit
22100 65 33 5f 66 72 65 65 28 70 52 6f 6f 74 2d 3e 62  e3_free(pRoot->b
22110 6c 6f 63 6b 2e 61 29 3b 0a 20 20 73 71 6c 69 74  lock.a);.  sqlit
22120 65 33 5f 66 72 65 65 28 70 52 6f 6f 74 2d 3e 6b  e3_free(pRoot->k
22130 65 79 2e 61 29 3b 0a 0a 20 20 2a 70 52 63 20 3d  ey.a);..  *pRc =
22140 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
22150 6d 70 61 72 65 20 74 68 65 20 74 65 72 6d 20 69  mpare the term i
22160 6e 20 62 75 66 66 65 72 20 7a 4c 68 73 20 28 73  n buffer zLhs (s
22170 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6e 4c 68  ize in bytes nLh
22180 73 29 20 77 69 74 68 20 74 68 61 74 20 69 6e 0a  s) with that in.
22190 2a 2a 20 7a 52 68 73 20 28 73 69 7a 65 20 69 6e  ** zRhs (size in
221a0 20 62 79 74 65 73 20 6e 52 68 73 29 20 75 73 69   bytes nRhs) usi
221b0 6e 67 20 6d 65 6d 63 6d 70 2e 20 49 66 20 6f 6e  ng memcmp. If on
221c0 65 20 74 65 72 6d 20 69 73 20 61 20 70 72 65 66  e term is a pref
221d0 69 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6f 74 68  ix of.** the oth
221e0 65 72 2c 20 69 74 20 69 73 20 63 6f 6e 73 69 64  er, it is consid
221f0 65 72 65 64 20 74 6f 20 62 65 20 73 6d 61 6c 6c  ered to be small
22200 65 72 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65  er than the othe
22210 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
22220 2d 76 65 20 69 66 20 7a 4c 68 73 20 69 73 20 73  -ve if zLhs is s
22230 6d 61 6c 6c 65 72 20 74 68 61 6e 20 7a 52 68 73  maller than zRhs
22240 2c 20 30 20 69 66 20 69 74 20 69 73 20 65 71 75  , 0 if it is equ
22250 61 6c 2c 20 6f 72 20 2b 76 65 0a 2a 2a 20 69 66  al, or +ve.** if
22260 20 69 74 20 69 73 20 67 72 65 61 74 65 72 2e 0a   it is greater..
22270 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
22280 73 33 54 65 72 6d 43 6d 70 28 0a 20 20 63 6f 6e  s3TermCmp(.  con
22290 73 74 20 63 68 61 72 20 2a 7a 4c 68 73 2c 20 69  st char *zLhs, i
222a0 6e 74 20 6e 4c 68 73 2c 20 20 20 20 20 2f 2a 20  nt nLhs,     /* 
222b0 4c 48 53 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  LHS of compariso
222c0 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
222d0 72 20 2a 7a 52 68 73 2c 20 69 6e 74 20 6e 52 68  r *zRhs, int nRh
222e0 73 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66  s      /* RHS of
222f0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 29   comparison */.)
22300 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d  {.  int nCmp = M
22310 49 4e 28 6e 4c 68 73 2c 20 6e 52 68 73 29 3b 0a  IN(nLhs, nRhs);.
22320 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 72 65    int res;..  re
22330 73 20 3d 20 6d 65 6d 63 6d 70 28 7a 4c 68 73 2c  s = memcmp(zLhs,
22340 20 7a 52 68 73 2c 20 6e 43 6d 70 29 3b 0a 20 20   zRhs, nCmp);.  
22350 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73  if( res==0 ) res
22360 20 3d 20 6e 4c 68 73 20 2d 20 6e 52 68 73 3b 0a   = nLhs - nRhs;.
22370 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
22380 0a 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  .../*.** Query t
22390 6f 20 73 65 65 20 69 66 20 74 68 65 20 65 6e 74  o see if the ent
223a0 72 79 20 69 6e 20 74 68 65 20 25 5f 73 65 67 6d  ry in the %_segm
223b0 65 6e 74 73 20 74 61 62 6c 65 20 77 69 74 68 20  ents table with 
223c0 62 6c 6f 63 6b 69 64 20 69 45 6e 64 20 69 73 20  blockid iEnd is 
223d0 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66 20 6e 6f 20  .** NULL. If no 
223e0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64  error occurs and
223f0 20 74 68 65 20 65 6e 74 72 79 20 69 73 20 4e 55   the entry is NU
22400 4c 4c 2c 20 73 65 74 20 2a 70 62 52 65 73 20 31  LL, set *pbRes 1
22410 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72   before.** retur
22420 6e 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c  ning. Otherwise,
22430 20 73 65 74 20 2a 70 62 52 65 73 20 74 6f 20 30   set *pbRes to 0
22440 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20  . .**.** Or, if 
22450 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
22460 77 68 69 6c 65 20 71 75 65 72 79 69 6e 67 20 74  while querying t
22470 68 65 20 64 61 74 61 62 61 73 65 2c 20 72 65 74  he database, ret
22480 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 0a 2a  urn an SQLite .*
22490 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68  * error code. Th
224a0 65 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  e final value of
224b0 20 2a 70 62 52 65 73 20 69 73 20 75 6e 64 65 66   *pbRes is undef
224c0 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73  ined in this cas
224d0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  e..**.** This is
224e0 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 69 66   used to test if
224f0 20 61 20 73 65 67 6d 65 6e 74 20 69 73 20 61 6e   a segment is an
22500 20 22 61 70 70 65 6e 64 61 62 6c 65 22 20 73 65   "appendable" se
22510 67 6d 65 6e 74 2e 20 49 66 20 69 74 0a 2a 2a 20  gment. If it.** 
22520 69 73 2c 20 74 68 65 6e 20 61 20 4e 55 4c 4c 20  is, then a NULL 
22530 65 6e 74 72 79 20 68 61 73 20 62 65 65 6e 20 69  entry has been i
22540 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65  nserted into the
22550 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c   %_segments tabl
22560 65 0a 2a 2a 20 77 69 74 68 20 62 6c 6f 63 6b 69  e.** with blocki
22570 64 20 25 5f 73 65 67 64 69 72 2e 65 6e 64 5f 62  d %_segdir.end_b
22580 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
22590 69 6e 74 20 66 74 73 33 49 73 41 70 70 65 6e 64  int fts3IsAppend
225a0 61 62 6c 65 28 46 74 73 33 54 61 62 6c 65 20 2a  able(Fts3Table *
225b0 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  p, sqlite3_int64
225c0 20 69 45 6e 64 2c 20 69 6e 74 20 2a 70 62 52 65   iEnd, int *pbRe
225d0 73 29 7b 0a 20 20 69 6e 74 20 62 52 65 73 20 3d  s){.  int bRes =
225e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
225f0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
22600 74 6f 20 73 65 74 20 2a 70 62 52 65 73 20 74 6f  to set *pbRes to
22610 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
22620 6d 74 20 2a 70 43 68 65 63 6b 20 3d 20 30 3b 20  mt *pCheck = 0; 
22630 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65        /* Stateme
22640 6e 74 20 74 6f 20 71 75 65 72 79 20 64 61 74 61  nt to query data
22650 62 61 73 65 20 77 69 74 68 20 2a 2f 0a 20 20 69  base with */.  i
22660 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
22670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22680 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
22690 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  ..  rc = fts3Sql
226a0 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 47 4d  Stmt(p, SQL_SEGM
226b0 45 4e 54 5f 49 53 5f 41 50 50 45 4e 44 41 42 4c  ENT_IS_APPENDABL
226c0 45 2c 20 26 70 43 68 65 63 6b 2c 20 30 29 3b 0a  E, &pCheck, 0);.
226d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
226e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
226f0 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 43  e3_bind_int64(pC
22700 68 65 63 6b 2c 20 31 2c 20 69 45 6e 64 29 3b 0a  heck, 1, iEnd);.
22710 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
22720 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
22730 28 70 43 68 65 63 6b 29 20 29 20 62 52 65 73 20  (pCheck) ) bRes 
22740 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 1;.    rc = sq
22750 6c 69 74 65 33 5f 72 65 73 65 74 28 70 43 68 65  lite3_reset(pChe
22760 63 6b 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2a 70  ck);.  }.  .  *p
22770 62 52 65 73 20 3d 20 62 52 65 73 3b 0a 20 20 72  bRes = bRes;.  r
22780 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22790 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
227a0 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
227b0 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 6e 20  initializing an 
227c0 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65 72 67  incremental-merg
227d0 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20  e operation..** 
227e0 49 74 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  It checks if the
227f0 20 65 78 69 73 74 69 6e 67 20 73 65 67 6d 65 6e   existing segmen
22800 74 20 77 69 74 68 20 69 6e 64 65 78 20 76 61 6c  t with index val
22810 75 65 20 69 49 64 78 20 61 74 20 61 62 73 6f 6c  ue iIdx at absol
22820 75 74 65 20 6c 65 76 65 6c 20 0a 2a 2a 20 28 69  ute level .** (i
22830 41 62 73 4c 65 76 65 6c 2b 31 29 20 63 61 6e 20  AbsLevel+1) can 
22840 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 62  be appended to b
22850 79 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  y the incrementa
22860 6c 20 6d 65 72 67 65 2e 20 49 66 20 69 74 20 63  l merge. If it c
22870 61 6e 2c 20 74 68 65 0a 2a 2a 20 6d 65 72 67 65  an, the.** merge
22880 2d 77 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a  -writer object *
22890 70 57 72 69 74 65 72 20 69 73 20 69 6e 69 74 69  pWriter is initi
228a0 61 6c 69 7a 65 64 20 74 6f 20 77 72 69 74 65 20  alized to write 
228b0 74 6f 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  to it..**.** An 
228c0 65 78 69 73 74 69 6e 67 20 73 65 67 6d 65 6e 74  existing segment
228d0 20 63 61 6e 20 62 65 20 61 70 70 65 6e 64 65 64   can be appended
228e0 20 74 6f 20 62 79 20 61 6e 20 69 6e 63 72 65 6d   to by an increm
228f0 65 6e 74 61 6c 20 6d 65 72 67 65 20 69 66 3a 0a  ental merge if:.
22900 2a 2a 0a 2a 2a 20 20 20 2a 20 49 74 20 77 61 73  **.**   * It was
22910 20 69 6e 69 74 69 61 6c 6c 79 20 63 72 65 61 74   initially creat
22920 65 64 20 61 73 20 61 6e 20 61 70 70 65 6e 64 61  ed as an appenda
22930 62 6c 65 20 73 65 67 6d 65 6e 74 20 28 77 69 74  ble segment (wit
22940 68 20 61 6c 6c 20 72 65 71 75 69 72 65 64 0a 2a  h all required.*
22950 2a 20 20 20 20 20 73 70 61 63 65 20 70 72 65 2d  *     space pre-
22960 61 6c 6c 6f 63 61 74 65 64 29 2c 20 61 6e 64 0a  allocated), and.
22970 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69  **.**   * The fi
22980 72 73 74 20 6b 65 79 20 72 65 61 64 20 66 72 6f  rst key read fro
22990 6d 20 74 68 65 20 69 6e 70 75 74 20 28 61 72 67  m the input (arg
229a0 75 6d 65 6e 74 73 20 7a 4b 65 79 20 61 6e 64 20  uments zKey and 
229b0 6e 4b 65 79 29 20 69 73 20 0a 2a 2a 20 20 20 20  nKey) is .**    
229c0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
229d0 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 63 75  e largest key cu
229e0 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
229f0 6e 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 0a  n the potential.
22a00 2a 2a 20 20 20 20 20 6f 75 74 70 75 74 20 73 65  **     output se
22a10 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  gment..*/.static
22a20 20 69 6e 74 20 66 74 73 33 49 6e 63 72 6d 65 72   int fts3Incrmer
22a30 67 65 4c 6f 61 64 28 0a 20 20 46 74 73 33 54 61  geLoad(.  Fts3Ta
22a40 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
22a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73            /* Fts
22a60 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  3 table handle *
22a70 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
22a80 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20  4 iAbsLevel,    
22a90 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20      /* Absolute 
22aa0 6c 65 76 65 6c 20 6f 66 20 69 6e 70 75 74 20 73  level of input s
22ab0 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  egments */.  int
22ac0 20 69 49 64 78 2c 20 20 20 20 20 20 20 20 20 20   iIdx,          
22ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22ae0 49 6e 64 65 78 20 6f 66 20 63 61 6e 64 69 64 61  Index of candida
22af0 74 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e  te output segmen
22b00 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
22b10 72 20 2a 7a 4b 65 79 2c 20 20 20 20 20 20 20 20  r *zKey,        
22b20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
22b30 6b 65 79 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  key to write */.
22b40 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20    int nKey,     
22b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b60 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
22b70 79 74 65 73 20 69 6e 20 6e 4b 65 79 20 2a 2f 0a  ytes in nKey */.
22b80 20 20 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65    IncrmergeWrite
22b90 72 20 2a 70 57 72 69 74 65 72 20 20 20 20 20 20  r *pWriter      
22ba0 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
22bb0 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  is object */.){.
22bc0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
22bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22be0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
22bf0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
22c00 6d 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 30 3b  mt *pSelect = 0;
22c10 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20        /* SELECT 
22c20 74 6f 20 72 65 61 64 20 25 5f 73 65 67 64 69 72  to read %_segdir
22c30 20 65 6e 74 72 79 20 2a 2f 0a 0a 20 20 72 63 20   entry */..  rc 
22c40 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
22c50 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 45 47 44   SQL_SELECT_SEGD
22c60 49 52 2c 20 26 70 53 65 6c 65 63 74 2c 20 30 29  IR, &pSelect, 0)
22c70 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
22c80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
22c90 69 74 65 33 5f 69 6e 74 36 34 20 69 53 74 61 72  ite3_int64 iStar
22ca0 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 56 61  t = 0;     /* Va
22cb0 6c 75 65 20 6f 66 20 25 5f 73 65 67 64 69 72 2e  lue of %_segdir.
22cc0 73 74 61 72 74 5f 62 6c 6f 63 6b 20 2a 2f 0a 20  start_block */. 
22cd0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
22ce0 20 69 4c 65 61 66 45 6e 64 20 3d 20 30 3b 20 20   iLeafEnd = 0;  
22cf0 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 25 5f 73   /* Value of %_s
22d00 65 67 64 69 72 2e 6c 65 61 76 65 73 5f 65 6e 64  egdir.leaves_end
22d10 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 73 71  _block */.    sq
22d20 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e 64  lite3_int64 iEnd
22d30 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 56   = 0;       /* V
22d40 61 6c 75 65 20 6f 66 20 25 5f 73 65 67 64 69 72  alue of %_segdir
22d50 2e 65 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20  .end_block */.  
22d60 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 52    const char *aR
22d70 6f 6f 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  oot = 0;        
22d80 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 25 5f  /* Pointer to %_
22d90 73 65 67 64 69 72 2e 72 6f 6f 74 20 62 75 66 66  segdir.root buff
22da0 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52  er */.    int nR
22db0 6f 6f 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  oot = 0;        
22dc0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
22dd0 6f 66 20 61 52 6f 6f 74 5b 5d 20 69 6e 20 62 79  of aRoot[] in by
22de0 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  tes */.    int r
22df0 63 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  c2;             
22e00 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
22e10 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c  rn code from sql
22e20 69 74 65 33 5f 72 65 73 65 74 28 29 20 2a 2f 0a  ite3_reset() */.
22e30 20 20 20 20 69 6e 74 20 62 41 70 70 65 6e 64 61      int bAppenda
22e40 62 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ble = 0;        
22e50 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65    /* Set to true
22e60 20 69 66 20 73 65 67 6d 65 6e 74 20 69 73 20 61   if segment is a
22e70 70 70 65 6e 64 61 62 6c 65 20 2a 2f 0a 0a 20 20  ppendable */..  
22e80 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 25 5f    /* Read the %_
22e90 73 65 67 64 69 72 20 65 6e 74 72 79 20 66 6f 72  segdir entry for
22ea0 20 69 6e 64 65 78 20 69 49 64 78 20 61 62 73 6f   index iIdx abso
22eb0 6c 75 74 65 20 6c 65 76 65 6c 20 28 69 41 62 73  lute level (iAbs
22ec0 4c 65 76 65 6c 2b 31 29 20 2a 2f 0a 20 20 20 20  Level+1) */.    
22ed0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
22ee0 36 34 28 70 53 65 6c 65 63 74 2c 20 31 2c 20 69  64(pSelect, 1, i
22ef0 41 62 73 4c 65 76 65 6c 2b 31 29 3b 0a 20 20 20  AbsLevel+1);.   
22f00 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
22f10 74 28 70 53 65 6c 65 63 74 2c 20 32 2c 20 69 49  t(pSelect, 2, iI
22f20 64 78 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  dx);.    if( sql
22f30 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63  ite3_step(pSelec
22f40 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
22f50 7b 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d  {.      iStart =
22f60 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
22f70 69 6e 74 36 34 28 70 53 65 6c 65 63 74 2c 20 31  int64(pSelect, 1
22f80 29 3b 0a 20 20 20 20 20 20 69 4c 65 61 66 45 6e  );.      iLeafEn
22f90 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
22fa0 6d 6e 5f 69 6e 74 36 34 28 70 53 65 6c 65 63 74  mn_int64(pSelect
22fb0 2c 20 32 29 3b 0a 20 20 20 20 20 20 66 74 73 33  , 2);.      fts3
22fc0 52 65 61 64 45 6e 64 42 6c 6f 63 6b 46 69 65 6c  ReadEndBlockFiel
22fd0 64 28 70 53 65 6c 65 63 74 2c 20 33 2c 20 26 69  d(pSelect, 3, &i
22fe0 45 6e 64 2c 20 26 70 57 72 69 74 65 72 2d 3e 6e  End, &pWriter->n
22ff0 4c 65 61 66 44 61 74 61 29 3b 0a 20 20 20 20 20  LeafData);.     
23000 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 6e 4c   if( pWriter->nL
23010 65 61 66 44 61 74 61 3c 30 20 29 7b 0a 20 20 20  eafData<0 ){.   
23020 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c       pWriter->nL
23030 65 61 66 44 61 74 61 20 3d 20 70 57 72 69 74 65  eafData = pWrite
23040 72 2d 3e 6e 4c 65 61 66 44 61 74 61 20 2a 20 2d  r->nLeafData * -
23050 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
23060 20 70 57 72 69 74 65 72 2d 3e 62 4e 6f 4c 65 61   pWriter->bNoLea
23070 66 44 61 74 61 20 3d 20 28 70 57 72 69 74 65 72  fData = (pWriter
23080 2d 3e 6e 4c 65 61 66 44 61 74 61 3d 3d 30 29 3b  ->nLeafData==0);
23090 0a 20 20 20 20 20 20 6e 52 6f 6f 74 20 3d 20 73  .      nRoot = s
230a0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
230b0 74 65 73 28 70 53 65 6c 65 63 74 2c 20 34 29 3b  tes(pSelect, 4);
230c0 0a 20 20 20 20 20 20 61 52 6f 6f 74 20 3d 20 73  .      aRoot = s
230d0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
230e0 6f 62 28 70 53 65 6c 65 63 74 2c 20 34 29 3b 0a  ob(pSelect, 4);.
230f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23100 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
23110 72 65 73 65 74 28 70 53 65 6c 65 63 74 29 3b 0a  reset(pSelect);.
23120 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
23130 65 63 6b 20 66 6f 72 20 74 68 65 20 7a 65 72 6f  eck for the zero
23140 2d 6c 65 6e 67 74 68 20 6d 61 72 6b 65 72 20 69  -length marker i
23150 6e 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73  n the %_segments
23160 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 72 63   table */.    rc
23170 20 3d 20 66 74 73 33 49 73 41 70 70 65 6e 64 61   = fts3IsAppenda
23180 62 6c 65 28 70 2c 20 69 45 6e 64 2c 20 26 62 41  ble(p, iEnd, &bA
23190 70 70 65 6e 64 61 62 6c 65 29 3b 0a 0a 20 20 20  ppendable);..   
231a0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 7a   /* Check that z
231b0 4b 65 79 2f 6e 4b 65 79 20 69 73 20 6c 61 72 67  Key/nKey is larg
231c0 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67  er than the larg
231d0 65 73 74 20 6b 65 79 20 74 68 65 20 63 61 6e 64  est key the cand
231e0 69 64 61 74 65 20 2a 2f 0a 20 20 20 20 69 66 28  idate */.    if(
231f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
23200 26 20 62 41 70 70 65 6e 64 61 62 6c 65 20 29 7b  & bAppendable ){
23210 0a 20 20 20 20 20 20 63 68 61 72 20 2a 61 4c 65  .      char *aLe
23220 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  af = 0;.      in
23230 74 20 6e 4c 65 61 66 20 3d 20 30 3b 0a 0a 20 20  t nLeaf = 0;..  
23240 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23250 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28 70 2c  Fts3ReadBlock(p,
23260 20 69 4c 65 61 66 45 6e 64 2c 20 26 61 4c 65 61   iLeafEnd, &aLea
23270 66 2c 20 26 6e 4c 65 61 66 2c 20 30 29 3b 0a 20  f, &nLeaf, 0);. 
23280 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
23290 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
232a0 20 20 4e 6f 64 65 52 65 61 64 65 72 20 72 65 61    NodeReader rea
232b0 64 65 72 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  der;.        for
232c0 28 72 63 20 3d 20 6e 6f 64 65 52 65 61 64 65 72  (rc = nodeReader
232d0 49 6e 69 74 28 26 72 65 61 64 65 72 2c 20 61 4c  Init(&reader, aL
232e0 65 61 66 2c 20 6e 4c 65 61 66 29 3b 0a 20 20 20  eaf, nLeaf);.   
232f0 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
23300 49 54 45 5f 4f 4b 20 26 26 20 72 65 61 64 65 72  ITE_OK && reader
23310 2e 61 4e 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  .aNode;.        
23320 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 52 65 61      rc = nodeRea
23330 64 65 72 4e 65 78 74 28 26 72 65 61 64 65 72 29  derNext(&reader)
23340 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
23350 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65        assert( re
23360 61 64 65 72 2e 61 4e 6f 64 65 20 29 3b 0a 20 20  ader.aNode );.  
23370 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23380 69 66 28 20 66 74 73 33 54 65 72 6d 43 6d 70 28  if( fts3TermCmp(
23390 7a 4b 65 79 2c 20 6e 4b 65 79 2c 20 72 65 61 64  zKey, nKey, read
233a0 65 72 2e 74 65 72 6d 2e 61 2c 20 72 65 61 64 65  er.term.a, reade
233b0 72 2e 74 65 72 6d 2e 6e 29 3c 3d 30 20 29 7b 0a  r.term.n)<=0 ){.
233c0 20 20 20 20 20 20 20 20 20 20 62 41 70 70 65 6e            bAppen
233d0 64 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20  dable = 0;.     
233e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 6f 64     }.        nod
233f0 65 52 65 61 64 65 72 52 65 6c 65 61 73 65 28 26  eReaderRelease(&
23400 72 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20 7d  reader);.      }
23410 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
23420 72 65 65 28 61 4c 65 61 66 29 3b 0a 20 20 20 20  ree(aLeaf);.    
23430 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
23440 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 41 70 70  QLITE_OK && bApp
23450 65 6e 64 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  endable ){.     
23460 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62   /* It is possib
23470 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  le to append to 
23480 74 68 69 73 20 73 65 67 6d 65 6e 74 2e 20 53 65  this segment. Se
23490 74 20 75 70 20 74 68 65 20 49 6e 63 72 6d 65 72  t up the Incrmer
234a0 67 65 57 72 69 74 65 72 0a 20 20 20 20 20 20 2a  geWriter.      *
234b0 2a 20 6f 62 6a 65 63 74 20 74 6f 20 64 6f 20 73  * object to do s
234c0 6f 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  o.  */.      int
234d0 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 48   i;.      int nH
234e0 65 69 67 68 74 20 3d 20 28 69 6e 74 29 61 52 6f  eight = (int)aRo
234f0 6f 74 5b 30 5d 3b 0a 20 20 20 20 20 20 4e 6f 64  ot[0];.      Nod
23500 65 57 72 69 74 65 72 20 2a 70 4e 6f 64 65 3b 0a  eWriter *pNode;.
23510 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e  .      pWriter->
23520 6e 4c 65 61 66 45 73 74 20 3d 20 28 69 6e 74 29  nLeafEst = (int)
23530 28 28 69 45 6e 64 20 2d 20 69 53 74 61 72 74 29  ((iEnd - iStart)
23540 20 2b 20 31 29 2f 46 54 53 5f 4d 41 58 5f 41 50   + 1)/FTS_MAX_AP
23550 50 45 4e 44 41 42 4c 45 5f 48 45 49 47 48 54 3b  PENDABLE_HEIGHT;
23560 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e  .      pWriter->
23570 69 53 74 61 72 74 20 3d 20 69 53 74 61 72 74 3b  iStart = iStart;
23580 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e  .      pWriter->
23590 69 45 6e 64 20 3d 20 69 45 6e 64 3b 0a 20 20 20  iEnd = iEnd;.   
235a0 20 20 20 70 57 72 69 74 65 72 2d 3e 69 41 62 73     pWriter->iAbs
235b0 4c 65 76 65 6c 20 3d 20 69 41 62 73 4c 65 76 65  Level = iAbsLeve
235c0 6c 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72  l;.      pWriter
235d0 2d 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a 0a  ->iIdx = iIdx;..
235e0 20 20 20 20 20 20 66 6f 72 28 69 3d 6e 48 65 69        for(i=nHei
235f0 67 68 74 2b 31 3b 20 69 3c 46 54 53 5f 4d 41 58  ght+1; i<FTS_MAX
23600 5f 41 50 50 45 4e 44 41 42 4c 45 5f 48 45 49 47  _APPENDABLE_HEIG
23610 48 54 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  HT; i++){.      
23620 20 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65    pWriter->aNode
23630 57 72 69 74 65 72 5b 69 5d 2e 69 42 6c 6f 63 6b  Writer[i].iBlock
23640 20 3d 20 70 57 72 69 74 65 72 2d 3e 69 53 74 61   = pWriter->iSta
23650 72 74 20 2b 20 69 2a 70 57 72 69 74 65 72 2d 3e  rt + i*pWriter->
23660 6e 4c 65 61 66 45 73 74 3b 0a 20 20 20 20 20 20  nLeafEst;.      
23670 7d 0a 0a 20 20 20 20 20 20 70 4e 6f 64 65 20 3d  }..      pNode =
23680 20 26 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65   &pWriter->aNode
23690 57 72 69 74 65 72 5b 6e 48 65 69 67 68 74 5d 3b  Writer[nHeight];
236a0 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 69 42  .      pNode->iB
236b0 6c 6f 63 6b 20 3d 20 70 57 72 69 74 65 72 2d 3e  lock = pWriter->
236c0 69 53 74 61 72 74 20 2b 20 70 57 72 69 74 65 72  iStart + pWriter
236d0 2d 3e 6e 4c 65 61 66 45 73 74 2a 6e 48 65 69 67  ->nLeafEst*nHeig
236e0 68 74 3b 0a 20 20 20 20 20 20 62 6c 6f 62 47 72  ht;.      blobGr
236f0 6f 77 42 75 66 66 65 72 28 26 70 4e 6f 64 65 2d  owBuffer(&pNode-
23700 3e 62 6c 6f 63 6b 2c 20 4d 41 58 28 6e 52 6f 6f  >block, MAX(nRoo
23710 74 2c 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 29  t, p->nNodeSize)
23720 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66  , &rc);.      if
23730 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23740 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
23750 79 28 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61  y(pNode->block.a
23760 2c 20 61 52 6f 6f 74 2c 20 6e 52 6f 6f 74 29 3b  , aRoot, nRoot);
23770 0a 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e  .        pNode->
23780 62 6c 6f 63 6b 2e 6e 20 3d 20 6e 52 6f 6f 74 3b  block.n = nRoot;
23790 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
237a0 66 6f 72 28 69 3d 6e 48 65 69 67 68 74 3b 20 69  for(i=nHeight; i
237b0 3e 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  >=0 && rc==SQLIT
237c0 45 5f 4f 4b 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  E_OK; i--){.    
237d0 20 20 20 20 4e 6f 64 65 52 65 61 64 65 72 20 72      NodeReader r
237e0 65 61 64 65 72 3b 0a 20 20 20 20 20 20 20 20 70  eader;.        p
237f0 4e 6f 64 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Node = &pWriter-
23800 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 69 5d 3b  >aNodeWriter[i];
23810 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e  ..        rc = n
23820 6f 64 65 52 65 61 64 65 72 49 6e 69 74 28 26 72  odeReaderInit(&r
23830 65 61 64 65 72 2c 20 70 4e 6f 64 65 2d 3e 62 6c  eader, pNode->bl
23840 6f 63 6b 2e 61 2c 20 70 4e 6f 64 65 2d 3e 62 6c  ock.a, pNode->bl
23850 6f 63 6b 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20  ock.n);.        
23860 77 68 69 6c 65 28 20 72 65 61 64 65 72 2e 61 4e  while( reader.aN
23870 6f 64 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ode && rc==SQLIT
23880 45 5f 4f 4b 20 29 20 72 63 20 3d 20 6e 6f 64 65  E_OK ) rc = node
23890 52 65 61 64 65 72 4e 65 78 74 28 26 72 65 61 64  ReaderNext(&read
238a0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 62 6c 6f  er);.        blo
238b0 62 47 72 6f 77 42 75 66 66 65 72 28 26 70 4e 6f  bGrowBuffer(&pNo
238c0 64 65 2d 3e 6b 65 79 2c 20 72 65 61 64 65 72 2e  de->key, reader.
238d0 74 65 72 6d 2e 6e 2c 20 26 72 63 29 3b 0a 20 20  term.n, &rc);.  
238e0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
238f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23900 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 6f 64       memcpy(pNod
23910 65 2d 3e 6b 65 79 2e 61 2c 20 72 65 61 64 65 72  e->key.a, reader
23920 2e 74 65 72 6d 2e 61 2c 20 72 65 61 64 65 72 2e  .term.a, reader.
23930 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 20  term.n);.       
23940 20 20 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 20     pNode->key.n 
23950 3d 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 6e 3b  = reader.term.n;
23960 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
23970 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
23980 20 20 63 68 61 72 20 2a 61 42 6c 6f 63 6b 20 3d    char *aBlock =
23990 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
239a0 69 6e 74 20 6e 42 6c 6f 63 6b 20 3d 20 30 3b 0a  int nBlock = 0;.
239b0 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 6f 64              pNod
239c0 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 4e  e = &pWriter->aN
239d0 6f 64 65 57 72 69 74 65 72 5b 69 2d 31 5d 3b 0a  odeWriter[i-1];.
239e0 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 6f 64              pNod
239f0 65 2d 3e 69 42 6c 6f 63 6b 20 3d 20 72 65 61 64  e->iBlock = read
23a00 65 72 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20 20  er.iChild;.     
23a10 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
23a20 74 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b  te3Fts3ReadBlock
23a30 28 70 2c 20 72 65 61 64 65 72 2e 69 43 68 69 6c  (p, reader.iChil
23a40 64 2c 20 26 61 42 6c 6f 63 6b 2c 20 26 6e 42 6c  d, &aBlock, &nBl
23a50 6f 63 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ock, 0);.       
23a60 20 20 20 20 20 62 6c 6f 62 47 72 6f 77 42 75 66       blobGrowBuf
23a70 66 65 72 28 26 70 4e 6f 64 65 2d 3e 62 6c 6f 63  fer(&pNode->bloc
23a80 6b 2c 20 4d 41 58 28 6e 42 6c 6f 63 6b 2c 20 70  k, MAX(nBlock, p
23a90 2d 3e 6e 4e 6f 64 65 53 69 7a 65 29 2c 20 26 72  ->nNodeSize), &r
23aa0 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  c);.            
23ab0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23ac0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
23ad0 20 20 20 6d 65 6d 63 70 79 28 70 4e 6f 64 65 2d     memcpy(pNode-
23ae0 3e 62 6c 6f 63 6b 2e 61 2c 20 61 42 6c 6f 63 6b  >block.a, aBlock
23af0 2c 20 6e 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20  , nBlock);.     
23b00 20 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e           pNode->
23b10 62 6c 6f 63 6b 2e 6e 20 3d 20 6e 42 6c 6f 63 6b  block.n = nBlock
23b20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
23b30 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
23b40 74 65 33 5f 66 72 65 65 28 61 42 6c 6f 63 6b 29  te3_free(aBlock)
23b50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
23b60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23b70 6e 6f 64 65 52 65 61 64 65 72 52 65 6c 65 61 73  nodeReaderReleas
23b80 65 28 26 72 65 61 64 65 72 29 3b 0a 20 20 20 20  e(&reader);.    
23b90 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72    }.    }..    r
23ba0 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  c2 = sqlite3_res
23bb0 65 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  et(pSelect);.   
23bc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23bd0 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
23be0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
23bf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
23c00 69 6e 65 20 74 68 65 20 6c 61 72 67 65 73 74 20  ine the largest 
23c10 73 65 67 6d 65 6e 74 20 69 6e 64 65 78 20 76 61  segment index va
23c20 6c 75 65 20 74 68 61 74 20 65 78 69 73 74 73 20  lue that exists 
23c30 77 69 74 68 69 6e 20 61 62 73 6f 6c 75 74 65 0a  within absolute.
23c40 2a 2a 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76  ** level iAbsLev
23c50 65 6c 2b 31 2e 20 49 66 20 6e 6f 20 65 72 72 6f  el+1. If no erro
23c60 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70  r occurs, set *p
23c70 69 49 64 78 20 74 6f 20 74 68 69 73 20 76 61 6c  iIdx to this val
23c80 75 65 20 70 6c 75 73 0a 2a 2a 20 6f 6e 65 20 62  ue plus.** one b
23c90 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
23ca0 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 72 2c 20 69  SQLITE_OK. Or, i
23cb0 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 73  f there are no s
23cc0 65 67 6d 65 6e 74 73 20 61 74 20 61 6c 6c 20 0a  egments at all .
23cd0 2a 2a 20 77 69 74 68 69 6e 20 6c 65 76 65 6c 20  ** within level 
23ce0 69 41 62 73 4c 65 76 65 6c 2c 20 73 65 74 20 2a  iAbsLevel, set *
23cf0 70 69 49 64 78 20 74 6f 20 7a 65 72 6f 2e 0a 2a  piIdx to zero..*
23d00 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
23d10 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
23d20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
23d30 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 20  code. The final 
23d40 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 2a 70 69 49  value of.** *piI
23d50 64 78 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  dx is undefined 
23d60 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
23d70 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
23d80 49 6e 63 72 6d 65 72 67 65 4f 75 74 70 75 74 49  IncrmergeOutputI
23d90 64 78 28 20 0a 20 20 46 74 73 33 54 61 62 6c 65  dx( .  Fts3Table
23da0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
23db0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20 54 61         /* FTS Ta
23dc0 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
23dd0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 41  sqlite3_int64 iA
23de0 62 73 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20  bsLevel,        
23df0 2f 2a 20 41 62 73 6f 6c 75 74 65 20 69 6e 64 65  /* Absolute inde
23e00 78 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65  x of input segme
23e10 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  nts */.  int *pi
23e20 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20  Idx             
23e30 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
23e40 20 4e 65 78 74 20 66 72 65 65 20 69 6e 64 65 78   Next free index
23e50 20 61 74 20 69 41 62 73 4c 65 76 65 6c 2b 31 20   at iAbsLevel+1 
23e60 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
23e70 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
23e80 70 4f 75 74 70 75 74 49 64 78 20 3d 20 30 3b 20  pOutputIdx = 0; 
23e90 20 20 2f 2a 20 53 51 4c 20 75 73 65 64 20 74 6f    /* SQL used to
23ea0 20 66 69 6e 64 20 6f 75 74 70 75 74 20 69 6e 64   find output ind
23eb0 65 78 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74  ex */..  rc = ft
23ec0 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
23ed0 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54 5f 49 4e  _NEXT_SEGMENT_IN
23ee0 44 45 58 2c 20 26 70 4f 75 74 70 75 74 49 64 78  DEX, &pOutputIdx
23ef0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
23f00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23f10 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
23f20 74 36 34 28 70 4f 75 74 70 75 74 49 64 78 2c 20  t64(pOutputIdx, 
23f30 31 2c 20 69 41 62 73 4c 65 76 65 6c 2b 31 29 3b  1, iAbsLevel+1);
23f40 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65  .    sqlite3_ste
23f50 70 28 70 4f 75 74 70 75 74 49 64 78 29 3b 0a 20  p(pOutputIdx);. 
23f60 20 20 20 2a 70 69 49 64 78 20 3d 20 73 71 6c 69     *piIdx = sqli
23f70 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
23f80 4f 75 74 70 75 74 49 64 78 2c 20 30 29 3b 0a 20  OutputIdx, 0);. 
23f90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
23fa0 72 65 73 65 74 28 70 4f 75 74 70 75 74 49 64 78  reset(pOutputIdx
23fb0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
23fc0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41   rc;.}../* .** A
23fd0 6c 6c 6f 63 61 74 65 20 61 6e 20 61 70 70 65 6e  llocate an appen
23fe0 64 61 62 6c 65 20 6f 75 74 70 75 74 20 73 65 67  dable output seg
23ff0 6d 65 6e 74 20 6f 6e 20 61 62 73 6f 6c 75 74 65  ment on absolute
24000 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c   level iAbsLevel
24010 2b 31 0a 2a 2a 20 77 69 74 68 20 69 64 78 20 76  +1.** with idx v
24020 61 6c 75 65 20 69 49 64 78 2e 0a 2a 2a 0a 2a 2a  alue iIdx..**.**
24030 20 49 6e 20 74 68 65 20 25 5f 73 65 67 64 69 72   In the %_segdir
24040 20 74 61 62 6c 65 2c 20 61 20 73 65 67 6d 65 6e   table, a segmen
24050 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
24060 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20 74 68  the values in th
24070 72 65 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 3a 0a  ree.** columns:.
24080 2a 2a 0a 2a 2a 20 20 20 20 20 73 74 61 72 74 5f  **.**     start_
24090 62 6c 6f 63 6b 0a 2a 2a 20 20 20 20 20 6c 65 61  block.**     lea
240a0 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 0a 2a 2a  ves_end_block.**
240b0 20 20 20 20 20 65 6e 64 5f 62 6c 6f 63 6b 0a 2a       end_block.*
240c0 2a 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 70 70  *.** When an app
240d0 65 6e 64 61 62 6c 65 20 73 65 67 6d 65 6e 74 20  endable segment 
240e0 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  is allocated, it
240f0 20 69 73 20 65 73 74 69 6d 61 74 65 64 20 74 68   is estimated th
24100 61 74 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75  at the.** maximu
24110 6d 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  m number of leaf
24120 20 62 6c 6f 63 6b 73 20 74 68 61 74 20 6d 61 79   blocks that may
24130 20 62 65 20 72 65 71 75 69 72 65 64 20 69 73 20   be required is 
24140 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 0a 2a  the sum of the.*
24150 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  * number of leaf
24160 20 62 6c 6f 63 6b 73 20 63 6f 6e 73 75 6d 65 64   blocks consumed
24170 20 62 79 20 74 68 65 20 69 6e 70 75 74 20 73 65   by the input se
24180 67 6d 65 6e 74 73 2c 20 70 6c 75 73 20 74 68 65  gments, plus the
24190 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 69 6e   number.** of in
241a0 70 75 74 20 73 65 67 6d 65 6e 74 73 2c 20 6d 75  put segments, mu
241b0 6c 74 69 70 6c 69 65 64 20 62 79 20 74 77 6f 2e  ltiplied by two.
241c0 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 73   This value is s
241d0 74 6f 72 65 64 20 69 6e 20 73 74 61 63 6b 20 0a  tored in stack .
241e0 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 4c 65 61  ** variable nLea
241f0 66 45 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f  fEst..**.** A to
24200 74 61 6c 20 6f 66 20 31 36 2a 6e 4c 65 61 66 45  tal of 16*nLeafE
24210 73 74 20 62 6c 6f 63 6b 73 20 61 72 65 20 61 6c  st blocks are al
24220 6c 6f 63 61 74 65 64 20 77 68 65 6e 20 61 6e 20  located when an 
24230 61 70 70 65 6e 64 61 62 6c 65 20 73 65 67 6d 65  appendable segme
24240 6e 74 0a 2a 2a 20 69 73 20 63 72 65 61 74 65 64  nt.** is created
24250 20 28 28 31 20 2b 20 65 6e 64 5f 62 6c 6f 63 6b   ((1 + end_block
24260 20 2d 20 73 74 61 72 74 5f 62 6c 6f 63 6b 29 3d   - start_block)=
24270 3d 31 36 2a 6e 4c 65 61 66 45 73 74 29 2e 20 54  =16*nLeafEst). T
24280 68 65 20 63 6f 6e 74 69 67 75 6f 75 73 0a 2a 2a  he contiguous.**
24290 20 61 72 72 61 79 20 6f 66 20 6c 65 61 66 20 6e   array of leaf n
242a0 6f 64 65 73 20 73 74 61 72 74 73 20 61 74 20 74  odes starts at t
242b0 68 65 20 66 69 72 73 74 20 62 6c 6f 63 6b 20 61  he first block a
242c0 6c 6c 6f 63 61 74 65 64 2e 20 54 68 65 20 61 72  llocated. The ar
242d0 72 61 79 0a 2a 2a 20 6f 66 20 69 6e 74 65 72 69  ray.** of interi
242e0 6f 72 20 6e 6f 64 65 73 20 74 68 61 74 20 61 72  or nodes that ar
242f0 65 20 70 61 72 65 6e 74 73 20 6f 66 20 74 68 65  e parents of the
24300 20 6c 65 61 66 20 6e 6f 64 65 73 20 73 74 61 72   leaf nodes star
24310 74 20 61 74 20 62 6c 6f 63 6b 0a 2a 2a 20 28 73  t at block.** (s
24320 74 61 72 74 5f 62 6c 6f 63 6b 20 2b 20 28 31 20  tart_block + (1 
24330 2b 20 65 6e 64 5f 62 6c 6f 63 6b 20 2d 20 73 74  + end_block - st
24340 61 72 74 5f 62 6c 6f 63 6b 29 20 2f 20 31 36 29  art_block) / 16)
24350 2e 20 41 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 0a  . And so on..**.
24360 2a 2a 20 49 6e 20 74 68 65 20 61 63 74 75 61 6c  ** In the actual
24370 20 63 6f 64 65 20 62 65 6c 6f 77 2c 20 74 68 65   code below, the
24380 20 76 61 6c 75 65 20 22 31 36 22 20 69 73 20 72   value "16" is r
24390 65 70 6c 61 63 65 64 20 77 69 74 68 20 74 68 65  eplaced with the
243a0 20 0a 2a 2a 20 70 72 65 2d 70 72 6f 63 65 73 73   .** pre-process
243b0 6f 72 20 6d 61 63 72 6f 20 46 54 53 5f 4d 41 58  or macro FTS_MAX
243c0 5f 41 50 50 45 4e 44 41 42 4c 45 5f 48 45 49 47  _APPENDABLE_HEIG
243d0 48 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  HT..*/.static in
243e0 74 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 57  t fts3IncrmergeW
243f0 72 69 74 65 72 28 20 0a 20 20 46 74 73 33 54 61  riter( .  Fts3Ta
24400 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
24410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73            /* Fts
24420 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  3 table handle *
24430 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
24440 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20  4 iAbsLevel,    
24450 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20      /* Absolute 
24460 6c 65 76 65 6c 20 6f 66 20 69 6e 70 75 74 20 73  level of input s
24470 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  egments */.  int
24480 20 69 49 64 78 2c 20 20 20 20 20 20 20 20 20 20   iIdx,          
24490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
244a0 49 6e 64 65 78 20 6f 66 20 6e 65 77 20 6f 75 74  Index of new out
244b0 70 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  put segment */. 
244c0 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61   Fts3MultiSegRea
244d0 64 65 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20  der *pCsr,      
244e0 20 2f 2a 20 43 75 72 73 6f 72 20 74 68 61 74 20   /* Cursor that 
244f0 64 61 74 61 20 77 69 6c 6c 20 62 65 20 72 65 61  data will be rea
24500 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 49 6e 63 72  d from */.  Incr
24510 6d 65 72 67 65 57 72 69 74 65 72 20 2a 70 57 72  mergeWriter *pWr
24520 69 74 65 72 20 20 20 20 20 20 20 20 2f 2a 20 50  iter        /* P
24530 6f 70 75 6c 61 74 65 20 74 68 69 73 20 6f 62 6a  opulate this obj
24540 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ect */.){.  int 
24550 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
24560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
24570 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
24580 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
24590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245a0 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
245b0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  able */.  int nL
245c0 65 61 66 45 73 74 20 3d 20 30 3b 20 20 20 20 20  eafEst = 0;     
245d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f            /* Blo
245e0 63 6b 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  cks allocated fo
245f0 72 20 6c 65 61 66 20 6e 6f 64 65 73 20 2a 2f 0a  r leaf nodes */.
24600 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
24610 70 4c 65 61 66 45 73 74 20 3d 20 30 3b 20 20 20  pLeafEst = 0;   
24620 20 20 2f 2a 20 53 51 4c 20 75 73 65 64 20 74 6f    /* SQL used to
24630 20 64 65 74 65 72 6d 69 6e 65 20 6e 4c 65 61 66   determine nLeaf
24640 45 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  Est */.  sqlite3
24650 5f 73 74 6d 74 20 2a 70 46 69 72 73 74 42 6c 6f  _stmt *pFirstBlo
24660 63 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 51 4c 20  ck = 0;  /* SQL 
24670 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
24680 65 20 66 69 72 73 74 20 62 6c 6f 63 6b 20 2a 2f  e first block */
24690 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65  ..  /* Calculate
246a0 20 6e 4c 65 61 66 45 73 74 2e 20 2a 2f 0a 20 20   nLeafEst. */.  
246b0 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
246c0 28 70 2c 20 53 51 4c 5f 4d 41 58 5f 4c 45 41 46  (p, SQL_MAX_LEAF
246d0 5f 4e 4f 44 45 5f 45 53 54 49 4d 41 54 45 2c 20  _NODE_ESTIMATE, 
246e0 26 70 4c 65 61 66 45 73 74 2c 20 30 29 3b 0a 20  &pLeafEst, 0);. 
246f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24700 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
24710 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 4c 65  3_bind_int64(pLe
24720 61 66 45 73 74 2c 20 31 2c 20 69 41 62 73 4c 65  afEst, 1, iAbsLe
24730 76 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  vel);.    sqlite
24740 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 4c 65  3_bind_int64(pLe
24750 61 66 45 73 74 2c 20 32 2c 20 70 43 73 72 2d 3e  afEst, 2, pCsr->
24760 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 69  nSegment);.    i
24770 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
24780 71 6c 69 74 65 33 5f 73 74 65 70 28 70 4c 65 61  qlite3_step(pLea
24790 66 45 73 74 29 20 29 7b 0a 20 20 20 20 20 20 6e  fEst) ){.      n
247a0 4c 65 61 66 45 73 74 20 3d 20 73 71 6c 69 74 65  LeafEst = sqlite
247b0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 4c 65  3_column_int(pLe
247c0 61 66 45 73 74 2c 20 30 29 3b 0a 20 20 20 20 7d  afEst, 0);.    }
247d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
247e0 33 5f 72 65 73 65 74 28 70 4c 65 61 66 45 73 74  3_reset(pLeafEst
247f0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
24800 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
24810 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 43 61  urn rc;..  /* Ca
24820 6c 63 75 6c 61 74 65 20 74 68 65 20 66 69 72 73  lculate the firs
24830 74 20 62 6c 6f 63 6b 20 74 6f 20 75 73 65 20 69  t block to use i
24840 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67  n the output seg
24850 6d 65 6e 74 20 2a 2f 0a 20 20 72 63 20 3d 20 66  ment */.  rc = f
24860 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51  ts3SqlStmt(p, SQ
24870 4c 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54 53 5f  L_NEXT_SEGMENTS_
24880 49 44 2c 20 26 70 46 69 72 73 74 42 6c 6f 63 6b  ID, &pFirstBlock
24890 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
248a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
248b0 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
248c0 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 46  =sqlite3_step(pF
248d0 69 72 73 74 42 6c 6f 63 6b 29 20 29 7b 0a 20 20  irstBlock) ){.  
248e0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 53 74      pWriter->iSt
248f0 61 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  art = sqlite3_co
24900 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 46 69 72 73  lumn_int64(pFirs
24910 74 42 6c 6f 63 6b 2c 20 30 29 3b 0a 20 20 20 20  tBlock, 0);.    
24920 20 20 70 57 72 69 74 65 72 2d 3e 69 45 6e 64 20    pWriter->iEnd 
24930 3d 20 70 57 72 69 74 65 72 2d 3e 69 53 74 61 72  = pWriter->iStar
24940 74 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 57 72  t - 1;.      pWr
24950 69 74 65 72 2d 3e 69 45 6e 64 20 2b 3d 20 6e 4c  iter->iEnd += nL
24960 65 61 66 45 73 74 20 2a 20 46 54 53 5f 4d 41 58  eafEst * FTS_MAX
24970 5f 41 50 50 45 4e 44 41 42 4c 45 5f 48 45 49 47  _APPENDABLE_HEIG
24980 48 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  HT;.    }.    rc
24990 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
249a0 28 70 46 69 72 73 74 42 6c 6f 63 6b 29 3b 0a 20  (pFirstBlock);. 
249b0 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
249c0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
249d0 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74  rc;..  /* Insert
249e0 20 74 68 65 20 6d 61 72 6b 65 72 20 69 6e 20 74   the marker in t
249f0 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61  he %_segments ta
24a00 62 6c 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ble to make sure
24a10 20 6e 6f 62 6f 64 79 20 74 72 69 65 73 0a 20 20   nobody tries.  
24a20 2a 2a 20 74 6f 20 73 74 65 61 6c 20 74 68 65 20  ** to steal the 
24a30 73 70 61 63 65 20 6a 75 73 74 20 61 6c 6c 6f 63  space just alloc
24a40 61 74 65 64 2e 20 54 68 69 73 20 69 73 20 61 6c  ated. This is al
24a50 73 6f 20 75 73 65 64 20 74 6f 20 69 64 65 6e 74  so used to ident
24a60 69 66 79 20 0a 20 20 2a 2a 20 61 70 70 65 6e 64  ify .  ** append
24a70 61 62 6c 65 20 73 65 67 6d 65 6e 74 73 2e 20 20  able segments.  
24a80 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73 33 57 72  */.  rc = fts3Wr
24a90 69 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 57  iteSegment(p, pW
24aa0 72 69 74 65 72 2d 3e 69 45 6e 64 2c 20 30 2c 20  riter->iEnd, 0, 
24ab0 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
24ac0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
24ad0 20 72 63 3b 0a 0a 20 20 70 57 72 69 74 65 72 2d   rc;..  pWriter-
24ae0 3e 69 41 62 73 4c 65 76 65 6c 20 3d 20 69 41 62  >iAbsLevel = iAb
24af0 73 4c 65 76 65 6c 3b 0a 20 20 70 57 72 69 74 65  sLevel;.  pWrite
24b00 72 2d 3e 6e 4c 65 61 66 45 73 74 20 3d 20 6e 4c  r->nLeafEst = nL
24b10 65 61 66 45 73 74 3b 0a 20 20 70 57 72 69 74 65  eafEst;.  pWrite
24b20 72 2d 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a  r->iIdx = iIdx;.
24b30 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65  .  /* Set up the
24b40 20 61 72 72 61 79 20 6f 66 20 4e 6f 64 65 57 72   array of NodeWr
24b50 69 74 65 72 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  iter objects */.
24b60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 46 54 53    for(i=0; i<FTS
24b70 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c 45 5f  _MAX_APPENDABLE_
24b80 48 45 49 47 48 54 3b 20 69 2b 2b 29 7b 0a 20 20  HEIGHT; i++){.  
24b90 20 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65    pWriter->aNode
24ba0 57 72 69 74 65 72 5b 69 5d 2e 69 42 6c 6f 63 6b  Writer[i].iBlock
24bb0 20 3d 20 70 57 72 69 74 65 72 2d 3e 69 53 74 61   = pWriter->iSta
24bc0 72 74 20 2b 20 69 2a 70 57 72 69 74 65 72 2d 3e  rt + i*pWriter->
24bd0 6e 4c 65 61 66 45 73 74 3b 0a 20 20 7d 0a 20 20  nLeafEst;.  }.  
24be0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24bf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
24c00 65 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20  e an entry from 
24c10 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62  the %_segdir tab
24c20 6c 65 2e 20 54 68 69 73 20 69 6e 76 6f 6c 76 65  le. This involve
24c30 73 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 0a 2a  s running the .*
24c40 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20  * following two 
24c50 73 74 61 74 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a  statements:.**.*
24c60 2a 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  *   DELETE FROM 
24c70 25 5f 73 65 67 64 69 72 20 57 48 45 52 45 20 6c  %_segdir WHERE l
24c80 65 76 65 6c 20 3d 20 3a 69 41 62 73 4c 65 76 65  evel = :iAbsLeve
24c90 6c 20 41 4e 44 20 69 64 78 20 3d 20 3a 69 49 64  l AND idx = :iId
24ca0 78 0a 2a 2a 20 20 20 55 50 44 41 54 45 20 25 5f  x.**   UPDATE %_
24cb0 73 65 67 64 69 72 20 53 45 54 20 69 64 78 20 3d  segdir SET idx =
24cc0 20 69 64 78 20 2d 20 31 20 57 48 45 52 45 20 6c   idx - 1 WHERE l
24cd0 65 76 65 6c 20 3d 20 3a 69 41 62 73 4c 65 76 65  evel = :iAbsLeve
24ce0 6c 20 41 4e 44 20 69 64 78 20 3e 20 3a 69 49 64  l AND idx > :iId
24cf0 78 0a 2a 2a 0a 2a 2a 20 54 68 65 20 44 45 4c 45  x.**.** The DELE
24d00 54 45 20 73 74 61 74 65 6d 65 6e 74 20 72 65 6d  TE statement rem
24d10 6f 76 65 73 20 74 68 65 20 73 70 65 63 69 66 69  oves the specifi
24d20 63 20 25 5f 73 65 67 64 69 72 20 6c 65 76 65 6c  c %_segdir level
24d30 2e 20 54 68 65 20 55 50 44 41 54 45 20 0a 2a 2a  . The UPDATE .**
24d40 20 73 74 61 74 65 6d 65 6e 74 20 65 6e 73 75 72   statement ensur
24d50 65 73 20 74 68 61 74 20 74 68 65 20 72 65 6d 61  es that the rema
24d60 69 6e 69 6e 67 20 73 65 67 6d 65 6e 74 73 20 68  ining segments h
24d70 61 76 65 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79  ave contiguously
24d80 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 69 64   allocated.** id
24d90 78 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61  x values..*/.sta
24da0 74 69 63 20 69 6e 74 20 66 74 73 33 52 65 6d 6f  tic int fts3Remo
24db0 76 65 53 65 67 64 69 72 45 6e 74 72 79 28 0a 20  veSegdirEntry(. 
24dc0 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
24dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24de0 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20 68   /* FTS3 table h
24df0 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  andle */.  sqlit
24e00 65 33 5f 69 6e 74 36 34 20 69 41 62 73 4c 65 76  e3_int64 iAbsLev
24e10 65 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 62  el,        /* Ab
24e20 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 74 6f 20  solute level to 
24e30 64 65 6c 65 74 65 20 66 72 6f 6d 20 2a 2f 0a 20  delete from */. 
24e40 20 69 6e 74 20 69 49 64 78 20 20 20 20 20 20 20   int iIdx       
24e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e60 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 25 5f 73   /* Index of %_s
24e70 65 67 64 69 72 20 65 6e 74 72 79 20 74 6f 20 64  egdir entry to d
24e80 65 6c 65 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  elete */.){.  in
24e90 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
24ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24eb0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
24ec0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
24ed0 70 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 20 20  pDelete = 0;    
24ee0 20 20 2f 2a 20 44 45 4c 45 54 45 20 73 74 61 74    /* DELETE stat
24ef0 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 72 63 20 3d  ement */..  rc =
24f00 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
24f10 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 44 49  SQL_DELETE_SEGDI
24f20 52 5f 45 4e 54 52 59 2c 20 26 70 44 65 6c 65 74  R_ENTRY, &pDelet
24f30 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  e, 0);.  if( rc=
24f40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24f50 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
24f60 6e 74 36 34 28 70 44 65 6c 65 74 65 2c 20 31 2c  nt64(pDelete, 1,
24f70 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20   iAbsLevel);.   
24f80 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
24f90 74 28 70 44 65 6c 65 74 65 2c 20 32 2c 20 69 49  t(pDelete, 2, iI
24fa0 64 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  dx);.    sqlite3
24fb0 5f 73 74 65 70 28 70 44 65 6c 65 74 65 29 3b 0a  _step(pDelete);.
24fc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24fd0 5f 72 65 73 65 74 28 70 44 65 6c 65 74 65 29 3b  _reset(pDelete);
24fe0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
24ff0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65 20  c;.}../*.** One 
25000 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73  or more segments
25010 20 68 61 76 65 20 6a 75 73 74 20 62 65 65 6e 20   have just been 
25020 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 61 62 73  removed from abs
25030 6f 6c 75 74 65 20 6c 65 76 65 6c 20 69 41 62 73  olute level iAbs
25040 4c 65 76 65 6c 2e 0a 2a 2a 20 55 70 64 61 74 65  Level..** Update
25050 20 74 68 65 20 27 69 64 78 27 20 76 61 6c 75 65   the 'idx' value
25060 73 20 6f 66 20 74 68 65 20 72 65 6d 61 69 6e 69  s of the remaini
25070 6e 67 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74  ng segments in t
25080 68 65 20 6c 65 76 65 6c 20 73 6f 20 74 68 61 74  he level so that
25090 0a 2a 2a 20 74 68 65 20 69 64 78 20 76 61 6c 75  .** the idx valu
250a0 65 73 20 61 72 65 20 61 20 63 6f 6e 74 69 67 75  es are a contigu
250b0 6f 75 73 20 73 65 71 75 65 6e 63 65 20 73 74 61  ous sequence sta
250c0 72 74 69 6e 67 20 66 72 6f 6d 20 30 2e 0a 2a 2f  rting from 0..*/
250d0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
250e0 52 65 70 61 63 6b 53 65 67 64 69 72 4c 65 76 65  RepackSegdirLeve
250f0 6c 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  l(.  Fts3Table *
25100 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
25110 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62       /* FTS3 tab
25120 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73  le handle */.  s
25130 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 41 62  qlite3_int64 iAb
25140 73 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20 2f  sLevel         /
25150 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c  * Absolute level
25160 20 74 6f 20 72 65 70 61 63 6b 20 2a 2f 0a 29 7b   to repack */.){
25170 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
25180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25190 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
251a0 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 49 64 78  e */.  int *aIdx
251b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
251c0 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
251d0 6f 66 20 72 65 6d 61 69 6e 69 6e 67 20 69 64 78  of remaining idx
251e0 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74   values */.  int
251f0 20 6e 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20   nIdx = 0;      
25200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25210 56 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e  Valid entries in
25220 20 61 49 64 78 5b 5d 20 2a 2f 0a 20 20 69 6e 74   aIdx[] */.  int
25230 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 20 20 20 20   nAlloc = 0;    
25240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25250 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f  Allocated size o
25260 66 20 61 49 64 78 5b 5d 20 2a 2f 0a 20 20 69 6e  f aIdx[] */.  in
25270 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
25280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25290 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
252a0 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
252b0 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 20 3d 20  stmt *pSelect = 
252c0 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63  0;      /* Selec
252d0 74 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72  t statement to r
252e0 65 61 64 20 69 64 78 20 76 61 6c 75 65 73 20 2a  ead idx values *
252f0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
25300 20 2a 70 55 70 64 61 74 65 20 3d 20 30 3b 20 20   *pUpdate = 0;  
25310 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 73 74      /* Update st
25320 61 74 65 6d 65 6e 74 20 74 6f 20 6d 6f 64 69 66  atement to modif
25330 79 20 69 64 78 20 76 61 6c 75 65 73 20 2a 2f 0a  y idx values */.
25340 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
25350 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43  tmt(p, SQL_SELEC
25360 54 5f 49 4e 44 45 58 45 53 2c 20 26 70 53 65 6c  T_INDEXES, &pSel
25370 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ect, 0);.  if( r
25380 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25390 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
253a0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
253b0 74 36 34 28 70 53 65 6c 65 63 74 2c 20 31 2c 20  t64(pSelect, 1, 
253c0 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20  iAbsLevel);.    
253d0 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f  while( SQLITE_RO
253e0 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
253f0 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  pSelect) ){.    
25400 20 20 69 66 28 20 6e 49 64 78 3e 3d 6e 41 6c 6c    if( nIdx>=nAll
25410 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  oc ){.        in
25420 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 20 20 20  t *aNew;.       
25430 20 6e 41 6c 6c 6f 63 20 2b 3d 20 31 36 3b 0a 20   nAlloc += 16;. 
25440 20 20 20 20 20 20 20 61 4e 65 77 20 3d 20 73 71         aNew = sq
25450 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61 49  lite3_realloc(aI
25460 64 78 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f  dx, nAlloc*sizeo
25470 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 20  f(int));.       
25480 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a 20 20   if( !aNew ){.  
25490 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
254a0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
254b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
254c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 49      }.        aI
254d0 64 78 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  dx = aNew;.     
254e0 20 7d 0a 20 20 20 20 20 20 61 49 64 78 5b 6e 49   }.      aIdx[nI
254f0 64 78 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 5f  dx++] = sqlite3_
25500 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 65 6c 65  column_int(pSele
25510 63 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ct, 0);.    }.  
25520 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
25530 72 65 73 65 74 28 70 53 65 6c 65 63 74 29 3b 0a  reset(pSelect);.
25540 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25550 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32  TE_OK ) rc = rc2
25560 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
25570 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25580 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
25590 6d 74 28 70 2c 20 53 51 4c 5f 53 48 49 46 54 5f  mt(p, SQL_SHIFT_
255a0 53 45 47 44 49 52 5f 45 4e 54 52 59 2c 20 26 70  SEGDIR_ENTRY, &p
255b0 55 70 64 61 74 65 2c 20 30 29 3b 0a 20 20 7d 0a  Update, 0);.  }.
255c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
255d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
255e0 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 55  e3_bind_int64(pU
255f0 70 64 61 74 65 2c 20 32 2c 20 69 41 62 73 4c 65  pdate, 2, iAbsLe
25600 76 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  vel);.  }..  ass
25610 65 72 74 28 20 70 2d 3e 62 49 67 6e 6f 72 65 53  ert( p->bIgnoreS
25620 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 3b 0a 20  avepoint==0 );. 
25630 20 70 2d 3e 62 49 67 6e 6f 72 65 53 61 76 65 70   p->bIgnoreSavep
25640 6f 69 6e 74 20 3d 20 31 3b 0a 20 20 66 6f 72 28  oint = 1;.  for(
25650 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
25660 4f 4b 20 26 26 20 69 3c 6e 49 64 78 3b 20 69 2b  OK && i<nIdx; i+
25670 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 49 64 78  +){.    if( aIdx
25680 5b 69 5d 21 3d 69 20 29 7b 0a 20 20 20 20 20 20  [i]!=i ){.      
25690 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
256a0 28 70 55 70 64 61 74 65 2c 20 33 2c 20 61 49 64  (pUpdate, 3, aId
256b0 78 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c  x[i]);.      sql
256c0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 55  ite3_bind_int(pU
256d0 70 64 61 74 65 2c 20 31 2c 20 69 29 3b 0a 20 20  pdate, 1, i);.  
256e0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
256f0 28 70 55 70 64 61 74 65 29 3b 0a 20 20 20 20 20  (pUpdate);.     
25700 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
25710 73 65 74 28 70 55 70 64 61 74 65 29 3b 0a 20 20  set(pUpdate);.  
25720 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 62 49 67    }.  }.  p->bIg
25730 6e 6f 72 65 53 61 76 65 70 6f 69 6e 74 20 3d 20  noreSavepoint = 
25740 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0;..  sqlite3_fr
25750 65 65 28 61 49 64 78 29 3b 0a 20 20 72 65 74 75  ee(aIdx);.  retu
25760 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
25770 20 76 6f 69 64 20 66 74 73 33 53 74 61 72 74 4e   void fts3StartN
25780 6f 64 65 28 42 6c 6f 62 20 2a 70 4e 6f 64 65 2c  ode(Blob *pNode,
25790 20 69 6e 74 20 69 48 65 69 67 68 74 2c 20 73 71   int iHeight, sq
257a0 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 43 68 69  lite3_int64 iChi
257b0 6c 64 29 7b 0a 20 20 70 4e 6f 64 65 2d 3e 61 5b  ld){.  pNode->a[
257c0 30 5d 20 3d 20 28 63 68 61 72 29 69 48 65 69 67  0] = (char)iHeig
257d0 68 74 3b 0a 20 20 69 66 28 20 69 43 68 69 6c 64  ht;.  if( iChild
257e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
257f0 70 4e 6f 64 65 2d 3e 6e 41 6c 6c 6f 63 3e 3d 31  pNode->nAlloc>=1
25800 2b 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69  +sqlite3Fts3Vari
25810 6e 74 4c 65 6e 28 69 43 68 69 6c 64 29 20 29 3b  ntLen(iChild) );
25820 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 6e 20 3d 20  .    pNode->n = 
25830 31 20 2b 20 73 71 6c 69 74 65 33 46 74 73 33 50  1 + sqlite3Fts3P
25840 75 74 56 61 72 69 6e 74 28 26 70 4e 6f 64 65 2d  utVarint(&pNode-
25850 3e 61 5b 31 5d 2c 20 69 43 68 69 6c 64 29 3b 0a  >a[1], iChild);.
25860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
25870 65 72 74 28 20 70 4e 6f 64 65 2d 3e 6e 41 6c 6c  ert( pNode->nAll
25880 6f 63 3e 3d 31 20 29 3b 0a 20 20 20 20 70 4e 6f  oc>=1 );.    pNo
25890 64 65 2d 3e 6e 20 3d 20 31 3b 0a 20 20 7d 0a 7d  de->n = 1;.  }.}
258a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
258b0 74 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 20  t two arguments 
258c0 61 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  are a pointer to
258d0 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
258e0 20 61 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65   a segment b-tre
258f0 65 0a 2a 2a 20 6e 6f 64 65 2e 20 54 68 65 20 6e  e.** node. The n
25900 6f 64 65 20 6d 61 79 20 62 65 20 61 20 6c 65 61  ode may be a lea
25910 66 20 6f 72 20 61 6e 20 69 6e 74 65 72 6e 61 6c  f or an internal
25920 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   node..**.** Thi
25930 73 20 66 75 6e 63 74 69 6f 6e 20 63 72 65 61 74  s function creat
25940 65 73 20 61 20 6e 65 77 20 6e 6f 64 65 20 69 6d  es a new node im
25950 61 67 65 20 69 6e 20 62 6c 6f 62 20 6f 62 6a 65  age in blob obje
25960 63 74 20 2a 70 4e 65 77 20 62 79 20 63 6f 70 79  ct *pNew by copy
25970 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73  ing.** all terms
25980 20 74 68 61 74 20 61 72 65 20 67 72 65 61 74 65   that are greate
25990 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
259a0 74 6f 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 20 28  to zTerm/nTerm (
259b0 66 6f 72 20 6c 65 61 66 20 6e 6f 64 65 73 29 0a  for leaf nodes).
259c0 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  ** or greater th
259d0 61 6e 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 20 28  an zTerm/nTerm (
259e0 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  for internal nod
259f0 65 73 29 20 66 72 6f 6d 20 61 4e 6f 64 65 2f 6e  es) from aNode/n
25a00 4e 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Node..*/.static 
25a10 69 6e 74 20 66 74 73 33 54 72 75 6e 63 61 74 65  int fts3Truncate
25a20 4e 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  Node(.  const ch
25a30 61 72 20 2a 61 4e 6f 64 65 2c 20 20 20 20 20 20  ar *aNode,      
25a40 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
25a50 6e 74 20 6e 6f 64 65 20 69 6d 61 67 65 20 2a 2f  nt node image */
25a60 0a 20 20 69 6e 74 20 6e 4e 6f 64 65 2c 20 20 20  .  int nNode,   
25a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a80 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 4e     /* Size of aN
25a90 6f 64 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ode in bytes */.
25aa0 20 20 42 6c 6f 62 20 2a 70 4e 65 77 2c 20 20 20    Blob *pNew,   
25ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ac0 20 20 2f 2a 20 4f 55 54 3a 20 57 72 69 74 65 20    /* OUT: Write 
25ad0 6e 65 77 20 6e 6f 64 65 20 69 6d 61 67 65 20 68  new node image h
25ae0 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
25af0 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20  har *zTerm,     
25b00 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6d 69 74           /* Omit
25b10 20 61 6c 6c 20 74 65 72 6d 73 20 73 6d 61 6c 6c   all terms small
25b20 65 72 20 74 68 61 6e 20 74 68 69 73 20 2a 2f 0a  er than this */.
25b30 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20    int nTerm,    
25b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b50 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65    /* Size of zTe
25b60 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  rm in bytes */. 
25b70 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
25b80 70 69 42 6c 6f 63 6b 20 20 20 20 20 20 20 20 20  piBlock         
25b90 20 2f 2a 20 4f 55 54 3a 20 42 6c 6f 63 6b 20 6e   /* OUT: Block n
25ba0 75 6d 62 65 72 20 69 6e 20 6e 65 78 74 20 6c 61  umber in next la
25bb0 79 65 72 20 64 6f 77 6e 20 2a 2f 0a 29 7b 0a 20  yer down */.){. 
25bc0 20 4e 6f 64 65 52 65 61 64 65 72 20 72 65 61 64   NodeReader read
25bd0 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
25be0 20 2f 2a 20 52 65 61 64 65 72 20 6f 62 6a 65 63   /* Reader objec
25bf0 74 20 2a 2f 0a 20 20 42 6c 6f 62 20 70 72 65 76  t */.  Blob prev
25c00 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 20 20 20   = {0, 0, 0};   
25c10 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
25c20 75 73 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20  us term written 
25c30 74 6f 20 6e 65 77 20 6e 6f 64 65 20 2a 2f 0a 20  to new node */. 
25c40 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
25c50 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
25c60 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
25c70 2a 2f 0a 20 20 69 6e 74 20 62 4c 65 61 66 20 3d  */.  int bLeaf =
25c80 20 61 4e 6f 64 65 5b 30 5d 3d 3d 27 5c 30 27 3b   aNode[0]=='\0';
25c90 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
25ca0 20 61 20 6c 65 61 66 20 6e 6f 64 65 20 2a 2f 0a   a leaf node */.
25cb0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72  .  /* Allocate r
25cc0 65 71 75 69 72 65 64 20 6f 75 74 70 75 74 20 73  equired output s
25cd0 70 61 63 65 20 2a 2f 0a 20 20 62 6c 6f 62 47 72  pace */.  blobGr
25ce0 6f 77 42 75 66 66 65 72 28 70 4e 65 77 2c 20 6e  owBuffer(pNew, n
25cf0 4e 6f 64 65 2c 20 26 72 63 29 3b 0a 20 20 69 66  Node, &rc);.  if
25d00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25d10 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
25d20 4e 65 77 2d 3e 6e 20 3d 20 30 3b 0a 0a 20 20 2f  New->n = 0;..  /
25d30 2a 20 50 6f 70 75 6c 61 74 65 20 6e 65 77 20 6e  * Populate new n
25d40 6f 64 65 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  ode buffer */.  
25d50 66 6f 72 28 72 63 20 3d 20 6e 6f 64 65 52 65 61  for(rc = nodeRea
25d60 64 65 72 49 6e 69 74 28 26 72 65 61 64 65 72 2c  derInit(&reader,
25d70 20 61 4e 6f 64 65 2c 20 6e 4e 6f 64 65 29 3b 20   aNode, nNode); 
25d80 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54  .      rc==SQLIT
25d90 45 5f 4f 4b 20 26 26 20 72 65 61 64 65 72 2e 61  E_OK && reader.a
25da0 4e 6f 64 65 3b 20 0a 20 20 20 20 20 20 72 63 20  Node; .      rc 
25db0 3d 20 6e 6f 64 65 52 65 61 64 65 72 4e 65 78 74  = nodeReaderNext
25dc0 28 26 72 65 61 64 65 72 29 0a 20 20 29 7b 0a 20  (&reader).  ){. 
25dd0 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 3d 3d     if( pNew->n==
25de0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  0 ){.      int r
25df0 65 73 20 3d 20 66 74 73 33 54 65 72 6d 43 6d 70  es = fts3TermCmp
25e00 28 72 65 61 64 65 72 2e 74 65 72 6d 2e 61 2c 20  (reader.term.a, 
25e10 72 65 61 64 65 72 2e 74 65 72 6d 2e 6e 2c 20 7a  reader.term.n, z
25e20 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20  Term, nTerm);.  
25e30 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 7c 7c      if( res<0 ||
25e40 20 28 62 4c 65 61 66 3d 3d 30 20 26 26 20 72 65   (bLeaf==0 && re
25e50 73 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  s==0) ) continue
25e60 3b 0a 20 20 20 20 20 20 66 74 73 33 53 74 61 72  ;.      fts3Star
25e70 74 4e 6f 64 65 28 70 4e 65 77 2c 20 28 69 6e 74  tNode(pNew, (int
25e80 29 61 4e 6f 64 65 5b 30 5d 2c 20 72 65 61 64 65  )aNode[0], reade
25e90 72 2e 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 20  r.iChild);.     
25ea0 20 2a 70 69 42 6c 6f 63 6b 20 3d 20 72 65 61 64   *piBlock = read
25eb0 65 72 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20 7d  er.iChild;.    }
25ec0 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 41 70  .    rc = fts3Ap
25ed0 70 65 6e 64 54 6f 4e 6f 64 65 28 0a 20 20 20 20  pendToNode(.    
25ee0 20 20 20 20 70 4e 65 77 2c 20 26 70 72 65 76 2c      pNew, &prev,
25ef0 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 61 2c 20   reader.term.a, 
25f00 72 65 61 64 65 72 2e 74 65 72 6d 2e 6e 2c 0a 20  reader.term.n,. 
25f10 20 20 20 20 20 20 20 72 65 61 64 65 72 2e 61 44         reader.aD
25f20 6f 63 6c 69 73 74 2c 20 72 65 61 64 65 72 2e 6e  oclist, reader.n
25f30 44 6f 63 6c 69 73 74 0a 20 20 20 20 29 3b 0a 20  Doclist.    );. 
25f40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
25f50 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20  E_OK ) break;.  
25f60 7d 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 3d  }.  if( pNew->n=
25f70 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 33 53 74  =0 ){.    fts3St
25f80 61 72 74 4e 6f 64 65 28 70 4e 65 77 2c 20 28 69  artNode(pNew, (i
25f90 6e 74 29 61 4e 6f 64 65 5b 30 5d 2c 20 72 65 61  nt)aNode[0], rea
25fa0 64 65 72 2e 69 43 68 69 6c 64 29 3b 0a 20 20 20  der.iChild);.   
25fb0 20 2a 70 69 42 6c 6f 63 6b 20 3d 20 72 65 61 64   *piBlock = read
25fc0 65 72 2e 69 43 68 69 6c 64 3b 0a 20 20 7d 0a 20  er.iChild;.  }. 
25fd0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
25fe0 3c 3d 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 29  <=pNew->nAlloc )
25ff0 3b 0a 0a 20 20 6e 6f 64 65 52 65 61 64 65 72 52  ;..  nodeReaderR
26000 65 6c 65 61 73 65 28 26 72 65 61 64 65 72 29 3b  elease(&reader);
26010 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
26020 70 72 65 76 2e 61 29 3b 0a 20 20 72 65 74 75 72  prev.a);.  retur
26030 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
26040 65 6d 6f 76 65 20 61 6c 6c 20 74 65 72 6d 73 20  emove all terms 
26050 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 7a 54 65  smaller than zTe
26060 72 6d 2f 6e 54 65 72 6d 20 66 72 6f 6d 20 73 65  rm/nTerm from se
26070 67 6d 65 6e 74 20 69 49 64 78 20 69 6e 20 61 62  gment iIdx in ab
26080 73 6f 6c 75 74 65 20 0a 2a 2a 20 6c 65 76 65 6c  solute .** level
26090 20 69 41 62 73 4c 65 76 65 6c 2e 20 54 68 69 73   iAbsLevel. This
260a0 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 64 65 6c   may involve del
260b0 65 74 69 6e 67 20 65 6e 74 72 69 65 73 20 66 72  eting entries fr
260c0 6f 6d 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74  om the %_segment
260d0 73 0a 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20  s.** table, and 
260e0 6d 6f 64 69 66 79 69 6e 67 20 65 78 69 73 74 69  modifying existi
260f0 6e 67 20 65 6e 74 72 69 65 73 20 69 6e 20 62 6f  ng entries in bo
26100 74 68 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74  th the %_segment
26110 73 20 61 6e 64 20 25 5f 73 65 67 64 69 72 0a 2a  s and %_segdir.*
26120 2a 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  * tables..**.** 
26130 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
26140 75 72 6e 65 64 20 69 66 20 74 68 65 20 73 65 67  urned if the seg
26150 6d 65 6e 74 20 69 73 20 75 70 64 61 74 65 64 20  ment is updated 
26160 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 4f 72  successfully. Or
26170 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72   an.** SQLite er
26180 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
26190 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
261a0 74 20 66 74 73 33 54 72 75 6e 63 61 74 65 53 65  t fts3TruncateSe
261b0 67 6d 65 6e 74 28 0a 20 20 46 74 73 33 54 61 62  gment(.  Fts3Tab
261c0 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
261d0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33           /* FTS3
261e0 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   table handle */
261f0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
26200 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 20   iAbsLevel,     
26210 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c     /* Absolute l
26220 65 76 65 6c 20 6f 66 20 73 65 67 6d 65 6e 74 20  evel of segment 
26230 74 6f 20 6d 6f 64 69 66 79 20 2a 2f 0a 20 20 69  to modify */.  i
26240 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20  nt iIdx,        
26250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26260 2a 20 49 6e 64 65 78 20 77 69 74 68 69 6e 20 6c  * Index within l
26270 65 76 65 6c 20 6f 66 20 73 65 67 6d 65 6e 74 20  evel of segment 
26280 74 6f 20 6d 6f 64 69 66 79 20 2a 2f 0a 20 20 63  to modify */.  c
26290 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
262a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
262b0 2a 20 52 65 6d 6f 76 65 20 74 65 72 6d 73 20 73  * Remove terms s
262c0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73  maller than this
262d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 20   */.  int nTerm 
262e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
26300 66 20 62 79 74 65 73 20 69 6e 20 62 75 66 66 65  f bytes in buffe
26310 72 20 7a 54 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20  r zTerm */.){.  
26320 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
26330 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
26340 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
26350 2f 0a 20 20 42 6c 6f 62 20 72 6f 6f 74 20 3d 20  /.  Blob root = 
26360 7b 30 2c 30 2c 30 7d 3b 20 20 20 20 20 20 20 20  {0,0,0};        
26370 20 20 20 20 2f 2a 20 4e 65 77 20 72 6f 6f 74 20      /* New root 
26380 70 61 67 65 20 69 6d 61 67 65 20 2a 2f 0a 20 20  page image */.  
26390 42 6c 6f 62 20 62 6c 6f 63 6b 20 3d 20 7b 30 2c  Blob block = {0,
263a0 30 2c 30 7d 3b 20 20 20 20 20 20 20 20 20 20 20  0,0};           
263b0 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64 20 66  /* Buffer used f
263c0 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 62 6c 6f  or any other blo
263d0 63 6b 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ck */.  sqlite3_
263e0 69 6e 74 36 34 20 69 42 6c 6f 63 6b 20 3d 20 30  int64 iBlock = 0
263f0 3b 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b  ;       /* Block
26400 20 69 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33   id */.  sqlite3
26410 5f 69 6e 74 36 34 20 69 4e 65 77 53 74 61 72 74  _int64 iNewStart
26420 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20   = 0;    /* New 
26430 76 61 6c 75 65 20 66 6f 72 20 69 53 74 61 72 74  value for iStart
26440 42 6c 6f 63 6b 20 2a 2f 0a 20 20 73 71 6c 69 74  Block */.  sqlit
26450 65 33 5f 69 6e 74 36 34 20 69 4f 6c 64 53 74 61  e3_int64 iOldSta
26460 72 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 6c  rt = 0;    /* Ol
26470 64 20 76 61 6c 75 65 20 66 6f 72 20 69 53 74 61  d value for iSta
26480 72 74 42 6c 6f 63 6b 20 2a 2f 0a 20 20 73 71 6c  rtBlock */.  sql
26490 69 74 65 33 5f 73 74 6d 74 20 2a 70 46 65 74 63  ite3_stmt *pFetc
264a0 68 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  h = 0;       /* 
264b0 53 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74  Statement used t
264c0 6f 20 66 65 74 63 68 20 73 65 67 64 69 72 20 2a  o fetch segdir *
264d0 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71  /..  rc = fts3Sq
264e0 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c  lStmt(p, SQL_SEL
264f0 45 43 54 5f 53 45 47 44 49 52 2c 20 26 70 46 65  ECT_SEGDIR, &pFe
26500 74 63 68 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tch, 0);.  if( r
26510 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26520 20 20 20 20 69 6e 74 20 72 63 32 3b 20 20 20 20      int rc2;    
26530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26540 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 72 65 73    /* sqlite3_res
26550 65 74 28 29 20 72 65 74 75 72 6e 20 63 6f 64 65  et() return code
26560 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
26570 62 69 6e 64 5f 69 6e 74 36 34 28 70 46 65 74 63  bind_int64(pFetc
26580 68 2c 20 31 2c 20 69 41 62 73 4c 65 76 65 6c 29  h, 1, iAbsLevel)
26590 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
265a0 6e 64 5f 69 6e 74 28 70 46 65 74 63 68 2c 20 32  nd_int(pFetch, 2
265b0 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 69 66 28  , iIdx);.    if(
265c0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
265d0 69 74 65 33 5f 73 74 65 70 28 70 46 65 74 63 68  ite3_step(pFetch
265e0 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ) ){.      const
265f0 20 63 68 61 72 20 2a 61 52 6f 6f 74 20 3d 20 73   char *aRoot = s
26600 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
26610 6f 62 28 70 46 65 74 63 68 2c 20 34 29 3b 0a 20  ob(pFetch, 4);. 
26620 20 20 20 20 20 69 6e 74 20 6e 52 6f 6f 74 20 3d       int nRoot =
26630 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
26640 62 79 74 65 73 28 70 46 65 74 63 68 2c 20 34 29  bytes(pFetch, 4)
26650 3b 0a 20 20 20 20 20 20 69 4f 6c 64 53 74 61 72  ;.      iOldStar
26660 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  t = sqlite3_colu
26670 6d 6e 5f 69 6e 74 36 34 28 70 46 65 74 63 68 2c  mn_int64(pFetch,
26680 20 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   1);.      rc = 
26690 66 74 73 33 54 72 75 6e 63 61 74 65 4e 6f 64 65  fts3TruncateNode
266a0 28 61 52 6f 6f 74 2c 20 6e 52 6f 6f 74 2c 20 26  (aRoot, nRoot, &
266b0 72 6f 6f 74 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  root, zTerm, nTe
266c0 72 6d 2c 20 26 69 42 6c 6f 63 6b 29 3b 0a 20 20  rm, &iBlock);.  
266d0 20 20 7d 0a 20 20 20 20 72 63 32 20 3d 20 73 71    }.    rc2 = sq
266e0 6c 69 74 65 33 5f 72 65 73 65 74 28 70 46 65 74  lite3_reset(pFet
266f0 63 68 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ch);.    if( rc=
26700 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
26710 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 77 68  = rc2;.  }..  wh
26720 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
26730 4f 4b 20 26 26 20 69 42 6c 6f 63 6b 20 29 7b 0a  OK && iBlock ){.
26740 20 20 20 20 63 68 61 72 20 2a 61 42 6c 6f 63 6b      char *aBlock
26750 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 42   = 0;.    int nB
26760 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 69 4e  lock = 0;.    iN
26770 65 77 53 74 61 72 74 20 3d 20 69 42 6c 6f 63 6b  ewStart = iBlock
26780 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
26790 74 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b  te3Fts3ReadBlock
267a0 28 70 2c 20 69 42 6c 6f 63 6b 2c 20 26 61 42 6c  (p, iBlock, &aBl
267b0 6f 63 6b 2c 20 26 6e 42 6c 6f 63 6b 2c 20 30 29  ock, &nBlock, 0)
267c0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
267d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
267e0 20 72 63 20 3d 20 66 74 73 33 54 72 75 6e 63 61   rc = fts3Trunca
267f0 74 65 4e 6f 64 65 28 61 42 6c 6f 63 6b 2c 20 6e  teNode(aBlock, n
26800 42 6c 6f 63 6b 2c 20 26 62 6c 6f 63 6b 2c 20 7a  Block, &block, z
26810 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 26 69 42  Term, nTerm, &iB
26820 6c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lock);.    }.   
26830 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26840 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
26850 20 66 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e   fts3WriteSegmen
26860 74 28 70 2c 20 69 4e 65 77 53 74 61 72 74 2c 20  t(p, iNewStart, 
26870 62 6c 6f 63 6b 2e 61 2c 20 62 6c 6f 63 6b 2e 6e  block.a, block.n
26880 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
26890 69 74 65 33 5f 66 72 65 65 28 61 42 6c 6f 63 6b  ite3_free(aBlock
268a0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 56 61 72  );.  }..  /* Var
268b0 69 61 62 6c 65 20 69 4e 65 77 53 74 61 72 74 20  iable iNewStart 
268c0 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  now contains the
268d0 20 66 69 72 73 74 20 76 61 6c 69 64 20 6c 65 61   first valid lea
268e0 66 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28  f node. */.  if(
268f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
26900 26 20 69 4e 65 77 53 74 61 72 74 20 29 7b 0a 20  & iNewStart ){. 
26910 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
26920 2a 70 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 72  *pDel = 0;.    r
26930 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
26940 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45  p, SQL_DELETE_SE
26950 47 4d 45 4e 54 53 5f 52 41 4e 47 45 2c 20 26 70  GMENTS_RANGE, &p
26960 44 65 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  Del, 0);.    if(
26970 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
26980 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
26990 62 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c 2c  bind_int64(pDel,
269a0 20 31 2c 20 69 4f 6c 64 53 74 61 72 74 29 3b 0a   1, iOldStart);.
269b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
269c0 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c 2c 20 32  nd_int64(pDel, 2
269d0 2c 20 69 4e 65 77 53 74 61 72 74 2d 31 29 3b 0a  , iNewStart-1);.
269e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
269f0 65 70 28 70 44 65 6c 29 3b 0a 20 20 20 20 20 20  ep(pDel);.      
26a00 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
26a10 65 74 28 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a  et(pDel);.    }.
26a20 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
26a30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26a40 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 43  sqlite3_stmt *pC
26a50 68 6f 6d 70 20 3d 20 30 3b 0a 20 20 20 20 72 63  homp = 0;.    rc
26a60 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
26a70 2c 20 53 51 4c 5f 43 48 4f 4d 50 5f 53 45 47 44  , SQL_CHOMP_SEGD
26a80 49 52 2c 20 26 70 43 68 6f 6d 70 2c 20 30 29 3b  IR, &pChomp, 0);
26a90 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
26aa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26ab0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
26ac0 36 34 28 70 43 68 6f 6d 70 2c 20 31 2c 20 69 4e  64(pChomp, 1, iN
26ad0 65 77 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20  ewStart);.      
26ae0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
26af0 62 28 70 43 68 6f 6d 70 2c 20 32 2c 20 72 6f 6f  b(pChomp, 2, roo
26b00 74 2e 61 2c 20 72 6f 6f 74 2e 6e 2c 20 53 51 4c  t.a, root.n, SQL
26b10 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
26b20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
26b30 69 6e 74 36 34 28 70 43 68 6f 6d 70 2c 20 33 2c  int64(pChomp, 3,
26b40 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20   iAbsLevel);.   
26b50 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
26b60 69 6e 74 28 70 43 68 6f 6d 70 2c 20 34 2c 20 69  int(pChomp, 4, i
26b70 49 64 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Idx);.      sqli
26b80 74 65 33 5f 73 74 65 70 28 70 43 68 6f 6d 70 29  te3_step(pChomp)
26b90 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
26ba0 69 74 65 33 5f 72 65 73 65 74 28 70 43 68 6f 6d  ite3_reset(pChom
26bb0 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
26bc0 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 43 68 6f  3_bind_null(pCho
26bd0 6d 70 2c 20 32 29 3b 0a 20 20 20 20 7d 0a 20 20  mp, 2);.    }.  
26be0 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  }..  sqlite3_fre
26bf0 65 28 72 6f 6f 74 2e 61 29 3b 0a 20 20 73 71 6c  e(root.a);.  sql
26c00 69 74 65 33 5f 66 72 65 65 28 62 6c 6f 63 6b 2e  ite3_free(block.
26c10 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  a);.  return rc;
26c20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
26c30 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
26c40 64 20 61 66 74 65 72 20 61 6e 20 69 6e 63 72 6d  d after an incrm
26c50 65 6e 74 61 6c 2d 6d 65 72 67 65 20 6f 70 65 72  ental-merge oper
26c60 61 74 69 6f 6e 20 68 61 73 20 72 75 6e 20 74 6f  ation has run to
26c70 0a 2a 2a 20 6d 65 72 67 65 20 28 6f 72 20 70 61  .** merge (or pa
26c80 72 74 69 61 6c 6c 79 20 6d 65 72 67 65 29 20 74  rtially merge) t
26c90 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65  wo or more segme
26ca0 6e 74 73 20 66 72 6f 6d 20 61 62 73 6f 6c 75 74  nts from absolut
26cb0 65 20 6c 65 76 65 6c 0a 2a 2a 20 69 41 62 73 4c  e level.** iAbsL
26cc0 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68  evel..**.** Each
26cd0 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 20 69   input segment i
26ce0 73 20 65 69 74 68 65 72 20 72 65 6d 6f 76 65 64  s either removed
26cf0 20 66 72 6f 6d 20 74 68 65 20 64 62 20 63 6f 6d   from the db com
26d00 70 6c 65 74 65 6c 79 20 28 69 66 20 61 6c 6c 20  pletely (if all 
26d10 6f 66 0a 2a 2a 20 69 74 73 20 64 61 74 61 20 77  of.** its data w
26d20 61 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65  as copied to the
26d30 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20   output segment 
26d40 62 79 20 74 68 65 20 69 6e 63 72 6d 65 72 67 65  by the incrmerge
26d50 20 6f 70 65 72 61 74 69 6f 6e 29 0a 2a 2a 20 6f   operation).** o
26d60 72 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 70 6c  r modified in pl
26d70 61 63 65 20 73 6f 20 74 68 61 74 20 69 74 20 6e  ace so that it n
26d80 6f 20 6c 6f 6e 67 65 72 20 63 6f 6e 74 61 69 6e  o longer contain
26d90 73 20 74 68 6f 73 65 20 65 6e 74 72 69 65 73 20  s those entries 
26da0 74 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65 65  that.** have bee
26db0 6e 20 64 75 70 6c 69 63 61 74 65 64 20 69 6e 20  n duplicated in 
26dc0 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65  the output segme
26dd0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
26de0 74 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 43  t fts3IncrmergeC
26df0 68 6f 6d 70 28 0a 20 20 46 74 73 33 54 61 62 6c  homp(.  Fts3Tabl
26e00 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
26e10 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20 74          /* FTS t
26e20 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
26e30 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
26e40 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  AbsLevel,       
26e50 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65 76   /* Absolute lev
26e60 65 6c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 65  el containing se
26e70 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73 33  gments */.  Fts3
26e80 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a  MultiSegReader *
26e90 70 43 73 72 2c 20 20 20 20 20 20 20 2f 2a 20 43  pCsr,       /* C
26ea0 68 6f 6d 70 20 61 6c 6c 20 73 65 67 6d 65 6e 74  homp all segment
26eb0 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73  s opened by this
26ec0 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e 74   cursor */.  int
26ed0 20 2a 70 6e 52 65 6d 20 20 20 20 20 20 20 20 20   *pnRem         
26ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26ef0 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e  Number of segmen
26f00 74 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 20 2a  ts not deleted *
26f10 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
26f20 69 6e 74 20 6e 52 65 6d 20 3d 20 30 3b 0a 20 20  int nRem = 0;.  
26f30 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
26f40 4f 4b 3b 0a 0a 20 20 66 6f 72 28 69 3d 70 43 73  OK;..  for(i=pCs
26f50 72 2d 3e 6e 53 65 67 6d 65 6e 74 2d 31 3b 20 69  r->nSegment-1; i
26f60 3e 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  >=0 && rc==SQLIT
26f70 45 5f 4f 4b 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  E_OK; i--){.    
26f80 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
26f90 53 65 67 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Seg = 0;.    int
26fa0 20 6a 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64   j;..    /* Find
26fb0 20 74 68 65 20 46 74 73 33 53 65 67 52 65 61 64   the Fts3SegRead
26fc0 65 72 20 6f 62 6a 65 63 74 20 77 69 74 68 20 46  er object with F
26fd0 74 73 33 53 65 67 52 65 61 64 65 72 2e 69 49 64  ts3SegReader.iId
26fe0 78 3d 3d 69 2e 20 49 74 20 69 73 20 68 69 64 69  x==i. It is hidi
26ff0 6e 67 0a 20 20 20 20 2a 2a 20 73 6f 6d 65 77 68  ng.    ** somewh
27000 65 72 65 20 69 6e 20 74 68 65 20 70 43 73 72 2d  ere in the pCsr-
27010 3e 61 70 53 65 67 6d 65 6e 74 5b 5d 20 61 72 72  >apSegment[] arr
27020 61 79 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ay.  */.    for(
27030 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 43  j=0; ALWAYS(j<pC
27040 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 29 3b 20 6a  sr->nSegment); j
27050 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 65 67 20  ++){.      pSeg 
27060 3d 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e  = pCsr->apSegmen
27070 74 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  t[j];.      if( 
27080 70 53 65 67 2d 3e 69 49 64 78 3d 3d 69 20 29 20  pSeg->iIdx==i ) 
27090 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
270a0 20 61 73 73 65 72 74 28 20 6a 3c 70 43 73 72 2d   assert( j<pCsr-
270b0 3e 6e 53 65 67 6d 65 6e 74 20 26 26 20 70 53 65  >nSegment && pSe
270c0 67 2d 3e 69 49 64 78 3d 3d 69 20 29 3b 0a 0a 20  g->iIdx==i );.. 
270d0 20 20 20 69 66 28 20 70 53 65 67 2d 3e 61 4e 6f     if( pSeg->aNo
270e0 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  de==0 ){.      /
270f0 2a 20 53 65 67 2d 72 65 61 64 65 72 20 69 73 20  * Seg-reader is 
27100 61 74 20 45 4f 46 2e 20 52 65 6d 6f 76 65 20 74  at EOF. Remove t
27110 68 65 20 65 6e 74 69 72 65 20 69 6e 70 75 74 20  he entire input 
27120 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20  segment. */.    
27130 20 20 72 63 20 3d 20 66 74 73 33 44 65 6c 65 74    rc = fts3Delet
27140 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 53 65 67  eSegment(p, pSeg
27150 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
27160 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27170 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 52        rc = fts3R
27180 65 6d 6f 76 65 53 65 67 64 69 72 45 6e 74 72 79  emoveSegdirEntry
27190 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 2c 20 70  (p, iAbsLevel, p
271a0 53 65 67 2d 3e 69 49 64 78 29 3b 0a 20 20 20 20  Seg->iIdx);.    
271b0 20 20 7d 0a 20 20 20 20 20 20 2a 70 6e 52 65 6d    }.      *pnRem
271c0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
271d0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e  .      /* The in
271e0 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20  cremental merge 
271f0 64 69 64 20 6e 6f 74 20 63 6f 70 79 20 61 6c 6c  did not copy all
27200 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d 20 74   the data from t
27210 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 73 65  his .      ** se
27220 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 75 70 70  gment to the upp
27230 65 72 20 6c 65 76 65 6c 2e 20 54 68 65 20 73 65  er level. The se
27240 67 6d 65 6e 74 20 69 73 20 6d 6f 64 69 66 69 65  gment is modifie
27250 64 20 69 6e 20 70 6c 61 63 65 0a 20 20 20 20 20  d in place.     
27260 20 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 63   ** so that it c
27270 6f 6e 74 61 69 6e 73 20 6e 6f 20 6b 65 79 73 20  ontains no keys 
27280 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 7a 54 65  smaller than zTe
27290 72 6d 2f 6e 54 65 72 6d 2e 20 2a 2f 20 0a 20 20  rm/nTerm. */ .  
272a0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
272b0 7a 54 65 72 6d 20 3d 20 70 53 65 67 2d 3e 7a 54  zTerm = pSeg->zT
272c0 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  erm;.      int n
272d0 54 65 72 6d 20 3d 20 70 53 65 67 2d 3e 6e 54 65  Term = pSeg->nTe
272e0 72 6d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  rm;.      rc = f
272f0 74 73 33 54 72 75 6e 63 61 74 65 53 65 67 6d 65  ts3TruncateSegme
27300 6e 74 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 2c  nt(p, iAbsLevel,
27310 20 70 53 65 67 2d 3e 69 49 64 78 2c 20 7a 54 65   pSeg->iIdx, zTe
27320 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20  rm, nTerm);.    
27330 20 20 6e 52 65 6d 2b 2b 3b 0a 20 20 20 20 7d 0a    nRem++;.    }.
27340 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
27350 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 52 65 6d  QLITE_OK && nRem
27360 21 3d 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74  !=pCsr->nSegment
27370 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
27380 33 52 65 70 61 63 6b 53 65 67 64 69 72 4c 65 76  3RepackSegdirLev
27390 65 6c 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 29  el(p, iAbsLevel)
273a0 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 52 65 6d 20  ;.  }..  *pnRem 
273b0 3d 20 6e 52 65 6d 3b 0a 20 20 72 65 74 75 72 6e  = nRem;.  return
273c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   rc;.}../*.** St
273d0 6f 72 65 20 61 6e 20 69 6e 63 72 2d 6d 65 72 67  ore an incr-merg
273e0 65 20 68 69 6e 74 20 69 6e 20 74 68 65 20 64 61  e hint in the da
273f0 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
27400 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72 6d 65  c int fts3Incrme
27410 72 67 65 48 69 6e 74 53 74 6f 72 65 28 46 74 73  rgeHintStore(Fts
27420 33 54 61 62 6c 65 20 2a 70 2c 20 42 6c 6f 62 20  3Table *p, Blob 
27430 2a 70 48 69 6e 74 29 7b 0a 20 20 73 71 6c 69 74  *pHint){.  sqlit
27440 65 33 5f 73 74 6d 74 20 2a 70 52 65 70 6c 61 63  e3_stmt *pReplac
27450 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  e = 0;.  int rc;
27460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27470 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
27480 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 72 63  rn code */..  rc
27490 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
274a0 2c 20 53 51 4c 5f 52 45 50 4c 41 43 45 5f 53 54  , SQL_REPLACE_ST
274b0 41 54 2c 20 26 70 52 65 70 6c 61 63 65 2c 20 30  AT, &pReplace, 0
274c0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
274d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
274e0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
274f0 52 65 70 6c 61 63 65 2c 20 31 2c 20 46 54 53 5f  Replace, 1, FTS_
27500 53 54 41 54 5f 49 4e 43 52 4d 45 52 47 45 48 49  STAT_INCRMERGEHI
27510 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
27520 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 52 65 70 6c  _bind_blob(pRepl
27530 61 63 65 2c 20 32 2c 20 70 48 69 6e 74 2d 3e 61  ace, 2, pHint->a
27540 2c 20 70 48 69 6e 74 2d 3e 6e 2c 20 53 51 4c 49  , pHint->n, SQLI
27550 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
27560 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 52 65  sqlite3_step(pRe
27570 70 6c 61 63 65 29 3b 0a 20 20 20 20 72 63 20 3d  place);.    rc =
27580 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
27590 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20 73 71  Replace);.    sq
275a0 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
275b0 70 52 65 70 6c 61 63 65 2c 20 32 29 3b 0a 20 20  pReplace, 2);.  
275c0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
275d0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 61 6e  }../*.** Load an
275e0 20 69 6e 63 72 2d 6d 65 72 67 65 20 68 69 6e 74   incr-merge hint
275f0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
27600 73 65 2e 20 54 68 65 20 69 6e 63 72 2d 6d 65 72  se. The incr-mer
27610 67 65 20 68 69 6e 74 2c 20 69 66 20 6f 6e 65 20  ge hint, if one 
27620 0a 2a 2a 20 65 78 69 73 74 73 2c 20 69 73 20 73  .** exists, is s
27630 74 6f 72 65 64 20 69 6e 20 74 68 65 20 72 6f 77  tored in the row
27640 69 64 3d 3d 31 20 72 6f 77 20 6f 66 20 74 68 65  id==1 row of the
27650 20 25 5f 73 74 61 74 20 74 61 62 6c 65 2e 0a 2a   %_stat table..*
27660 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
27670 75 6c 2c 20 70 6f 70 75 6c 61 74 65 20 62 6c 6f  ul, populate blo
27680 62 20 2a 70 48 69 6e 74 20 77 69 74 68 20 74 68  b *pHint with th
27690 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
276a0 6d 20 74 68 65 20 25 5f 73 74 61 74 0a 2a 2a 20  m the %_stat.** 
276b0 74 61 62 6c 65 20 61 6e 64 20 72 65 74 75 72 6e  table and return
276c0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65   SQLITE_OK. Othe
276d0 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72  rwise, if an err
276e0 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
276f0 6e 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 65  n an.** SQLite e
27700 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
27710 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63  atic int fts3Inc
27720 72 6d 65 72 67 65 48 69 6e 74 4c 6f 61 64 28 46  rmergeHintLoad(F
27730 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 42 6c 6f  ts3Table *p, Blo
27740 62 20 2a 70 48 69 6e 74 29 7b 0a 20 20 73 71 6c  b *pHint){.  sql
27750 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65  ite3_stmt *pSele
27760 63 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ct = 0;.  int rc
27770 3b 0a 0a 20 20 70 48 69 6e 74 2d 3e 6e 20 3d 20  ;..  pHint->n = 
27780 30 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71  0;.  rc = fts3Sq
27790 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c  lStmt(p, SQL_SEL
277a0 45 43 54 5f 53 54 41 54 2c 20 26 70 53 65 6c 65  ECT_STAT, &pSele
277b0 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ct, 0);.  if( rc
277c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
277d0 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20     int rc2;.    
277e0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
277f0 28 70 53 65 6c 65 63 74 2c 20 31 2c 20 46 54 53  (pSelect, 1, FTS
27800 5f 53 54 41 54 5f 49 4e 43 52 4d 45 52 47 45 48  _STAT_INCRMERGEH
27810 49 4e 54 29 3b 0a 20 20 20 20 69 66 28 20 53 51  INT);.    if( SQ
27820 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
27830 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29 20  3_step(pSelect) 
27840 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
27850 68 61 72 20 2a 61 48 69 6e 74 20 3d 20 73 71 6c  har *aHint = sql
27860 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
27870 28 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  (pSelect, 0);.  
27880 20 20 20 20 69 6e 74 20 6e 48 69 6e 74 20 3d 20      int nHint = 
27890 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
278a0 79 74 65 73 28 70 53 65 6c 65 63 74 2c 20 30 29  ytes(pSelect, 0)
278b0 3b 0a 20 20 20 20 20 20 69 66 28 20 61 48 69 6e  ;.      if( aHin
278c0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f  t ){.        blo
278d0 62 47 72 6f 77 42 75 66 66 65 72 28 70 48 69 6e  bGrowBuffer(pHin
278e0 74 2c 20 6e 48 69 6e 74 2c 20 26 72 63 29 3b 0a  t, nHint, &rc);.
278f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
27900 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27910 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48         memcpy(pH
27920 69 6e 74 2d 3e 61 2c 20 61 48 69 6e 74 2c 20 6e  int->a, aHint, n
27930 48 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Hint);.         
27940 20 70 48 69 6e 74 2d 3e 6e 20 3d 20 6e 48 69 6e   pHint->n = nHin
27950 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
27960 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
27970 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  c2 = sqlite3_res
27980 65 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  et(pSelect);.   
27990 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
279a0 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
279b0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
279c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 52  .}../*.** If *pR
279d0 63 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  c is not SQLITE_
279e0 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  OK when this fun
279f0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
27a00 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
27a10 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 70  ** Otherwise, ap
27a20 70 65 6e 64 20 61 6e 20 65 6e 74 72 79 20 74 6f  pend an entry to
27a30 20 74 68 65 20 68 69 6e 74 20 73 74 6f 72 65 64   the hint stored
27a40 20 69 6e 20 62 6c 6f 62 20 2a 70 48 69 6e 74 2e   in blob *pHint.
27a50 20 45 61 63 68 20 65 6e 74 72 79 0a 2a 2a 20 63   Each entry.** c
27a60 6f 6e 73 69 73 74 73 20 6f 66 20 74 77 6f 20 76  onsists of two v
27a70 61 72 69 6e 74 73 2c 20 74 68 65 20 61 62 73 6f  arints, the abso
27a80 6c 75 74 65 20 6c 65 76 65 6c 20 6e 75 6d 62 65  lute level numbe
27a90 72 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 73  r of the input s
27aa0 65 67 6d 65 6e 74 73 20 0a 2a 2a 20 61 6e 64 20  egments .** and 
27ab0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  the number of in
27ac0 70 75 74 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2a  put segments..**
27ad0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
27ae0 6c 2c 20 6c 65 61 76 65 20 2a 70 52 63 20 73 65  l, leave *pRc se
27af0 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 61  t to SQLITE_OK a
27b00 6e 64 20 72 65 74 75 72 6e 2e 20 49 66 20 61 6e  nd return. If an
27b10 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a   error occurs,.*
27b20 2a 20 73 65 74 20 2a 70 52 63 20 74 6f 20 61 6e  * set *pRc to an
27b30 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
27b40 64 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  de before return
27b50 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
27b60 6f 69 64 20 66 74 73 33 49 6e 63 72 6d 65 72 67  oid fts3Incrmerg
27b70 65 48 69 6e 74 50 75 73 68 28 0a 20 20 42 6c 6f  eHintPush(.  Blo
27b80 62 20 2a 70 48 69 6e 74 2c 20 20 20 20 20 20 20  b *pHint,       
27b90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27ba0 48 69 6e 74 20 62 6c 6f 62 20 74 6f 20 61 70 70  Hint blob to app
27bb0 65 6e 64 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20  end to */.  i64 
27bc0 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 20 20  iAbsLevel,      
27bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
27be0 69 72 73 74 20 76 61 72 69 6e 74 20 74 6f 20 73  irst varint to s
27bf0 74 6f 72 65 20 69 6e 20 68 69 6e 74 20 2a 2f 0a  tore in hint */.
27c00 20 20 69 6e 74 20 6e 49 6e 70 75 74 2c 20 20 20    int nInput,   
27c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 76 61 72 69    /* Second vari
27c30 6e 74 20 74 6f 20 73 74 6f 72 65 20 69 6e 20 68  nt to store in h
27c40 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  int */.  int *pR
27c50 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
27c60 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
27c70 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a  UT: Error code *
27c80 2f 0a 29 7b 0a 20 20 62 6c 6f 62 47 72 6f 77 42  /.){.  blobGrowB
27c90 75 66 66 65 72 28 70 48 69 6e 74 2c 20 70 48 69  uffer(pHint, pHi
27ca0 6e 74 2d 3e 6e 20 2b 20 32 2a 46 54 53 33 5f 56  nt->n + 2*FTS3_V
27cb0 41 52 49 4e 54 5f 4d 41 58 2c 20 70 52 63 29 3b  ARINT_MAX, pRc);
27cc0 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
27cd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 48  ITE_OK ){.    pH
27ce0 69 6e 74 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65  int->n += sqlite
27cf0 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26  3Fts3PutVarint(&
27d00 70 48 69 6e 74 2d 3e 61 5b 70 48 69 6e 74 2d 3e  pHint->a[pHint->
27d10 6e 5d 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a  n], iAbsLevel);.
27d20 20 20 20 20 70 48 69 6e 74 2d 3e 6e 20 2b 3d 20      pHint->n += 
27d30 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
27d40 72 69 6e 74 28 26 70 48 69 6e 74 2d 3e 61 5b 70  rint(&pHint->a[p
27d50 48 69 6e 74 2d 3e 6e 5d 2c 20 28 69 36 34 29 6e  Hint->n], (i64)n
27d60 49 6e 70 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Input);.  }.}../
27d70 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 6c 61  *.** Read the la
27d80 73 74 20 65 6e 74 72 79 20 28 6d 6f 73 74 20 72  st entry (most r
27d90 65 63 65 6e 74 6c 79 20 70 75 73 68 65 64 29 20  ecently pushed) 
27da0 66 72 6f 6d 20 74 68 65 20 68 69 6e 74 20 62 6c  from the hint bl
27db0 6f 62 20 2a 70 48 69 6e 74 0a 2a 2a 20 61 6e 64  ob *pHint.** and
27dc0 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65   then remove the
27dd0 20 65 6e 74 72 79 2e 20 57 72 69 74 65 20 74 68   entry. Write th
27de0 65 20 74 77 6f 20 76 61 6c 75 65 73 20 72 65 61  e two values rea
27df0 64 20 74 6f 20 2a 70 69 41 62 73 4c 65 76 65 6c  d to *piAbsLevel
27e00 20 61 6e 64 20 0a 2a 2a 20 2a 70 6e 49 6e 70 75   and .** *pnInpu
27e10 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  t before returni
27e20 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  ng..**.** If no 
27e30 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
27e40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
27e50 49 66 20 74 68 65 20 68 69 6e 74 20 62 6c 6f 62  If the hint blob
27e60 20 69 6e 20 2a 70 48 69 6e 74 20 64 6f 65 73 0a   in *pHint does.
27e70 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  ** not contain a
27e80 74 20 6c 65 61 73 74 20 74 77 6f 20 76 61 6c 69  t least two vali
27e90 64 20 76 61 72 69 6e 74 73 2c 20 72 65 74 75 72  d varints, retur
27ea0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
27eb0 5f 56 54 41 42 2e 0a 2a 2f 0a 73 74 61 74 69 63  _VTAB..*/.static
27ec0 20 69 6e 74 20 66 74 73 33 49 6e 63 72 6d 65 72   int fts3Incrmer
27ed0 67 65 48 69 6e 74 50 6f 70 28 42 6c 6f 62 20 2a  geHintPop(Blob *
27ee0 70 48 69 6e 74 2c 20 69 36 34 20 2a 70 69 41 62  pHint, i64 *piAb
27ef0 73 4c 65 76 65 6c 2c 20 69 6e 74 20 2a 70 6e 49  sLevel, int *pnI
27f00 6e 70 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20 69  nput){.  const i
27f10 6e 74 20 6e 48 69 6e 74 20 3d 20 70 48 69 6e 74  nt nHint = pHint
27f20 2d 3e 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  ->n;.  int i;.. 
27f30 20 69 20 3d 20 70 48 69 6e 74 2d 3e 6e 2d 32 3b   i = pHint->n-2;
27f40 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 26 26  .  while( i>0 &&
27f50 20 28 70 48 69 6e 74 2d 3e 61 5b 69 2d 31 5d 20   (pHint->a[i-1] 
27f60 26 20 30 78 38 30 29 20 29 20 69 2d 2d 3b 0a 20  & 0x80) ) i--;. 
27f70 20 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20 28   while( i>0 && (
27f80 70 48 69 6e 74 2d 3e 61 5b 69 2d 31 5d 20 26 20  pHint->a[i-1] & 
27f90 30 78 38 30 29 20 29 20 69 2d 2d 3b 0a 0a 20 20  0x80) ) i--;..  
27fa0 70 48 69 6e 74 2d 3e 6e 20 3d 20 69 3b 0a 20 20  pHint->n = i;.  
27fb0 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  i += sqlite3Fts3
27fc0 47 65 74 56 61 72 69 6e 74 28 26 70 48 69 6e 74  GetVarint(&pHint
27fd0 2d 3e 61 5b 69 5d 2c 20 70 69 41 62 73 4c 65 76  ->a[i], piAbsLev
27fe0 65 6c 29 3b 0a 20 20 69 20 2b 3d 20 66 74 73 33  el);.  i += fts3
27ff0 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 48 69  GetVarint32(&pHi
28000 6e 74 2d 3e 61 5b 69 5d 2c 20 70 6e 49 6e 70 75  nt->a[i], pnInpu
28010 74 29 3b 0a 20 20 69 66 28 20 69 21 3d 6e 48 69  t);.  if( i!=nHi
28020 6e 74 20 29 20 72 65 74 75 72 6e 20 46 54 53 5f  nt ) return FTS_
28030 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 0a 20  CORRUPT_VTAB;.. 
28040 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28050 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  K;.}.../*.** Att
28060 65 6d 70 74 20 61 6e 20 69 6e 63 72 65 6d 65 6e  empt an incremen
28070 74 61 6c 20 6d 65 72 67 65 20 74 68 61 74 20 77  tal merge that w
28080 72 69 74 65 73 20 6e 4d 65 72 67 65 20 6c 65 61  rites nMerge lea
28090 66 20 62 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  f blocks..**.** 
280a0 49 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67  Incremental merg
280b0 65 73 20 68 61 70 70 65 6e 20 6e 4d 69 6e 20 73  es happen nMin s
280c0 65 67 6d 65 6e 74 73 20 61 74 20 61 20 74 69 6d  egments at a tim
280d0 65 2e 20 54 68 65 20 73 65 67 6d 65 6e 74 73 20  e. The segments 
280e0 0a 2a 2a 20 74 6f 20 62 65 20 6d 65 72 67 65 64  .** to be merged
280f0 20 61 72 65 20 74 68 65 20 6e 4d 69 6e 20 6f 6c   are the nMin ol
28100 64 65 73 74 20 73 65 67 6d 65 6e 74 73 20 28 74  dest segments (t
28110 68 65 20 6f 6e 65 73 20 77 69 74 68 20 74 68 65  he ones with the
28120 20 73 6d 61 6c 6c 65 73 74 20 0a 2a 2a 20 76 61   smallest .** va
28130 6c 75 65 73 20 66 6f 72 20 74 68 65 20 5f 73 65  lues for the _se
28140 67 64 69 72 2e 69 64 78 20 66 69 65 6c 64 29 20  gdir.idx field) 
28150 69 6e 20 74 68 65 20 68 69 67 68 65 73 74 20 6c  in the highest l
28160 65 76 65 6c 20 74 68 61 74 20 63 6f 6e 74 61 69  evel that contai
28170 6e 73 20 0a 2a 2a 20 61 74 20 6c 65 61 73 74 20  ns .** at least 
28180 6e 4d 69 6e 20 73 65 67 6d 65 6e 74 73 2e 20 4d  nMin segments. M
28190 75 6c 74 69 70 6c 65 20 6d 65 72 67 65 73 20 6d  ultiple merges m
281a0 69 67 68 74 20 6f 63 63 75 72 20 69 6e 20 61 6e  ight occur in an
281b0 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20   attempt to .** 
281c0 77 72 69 74 65 20 74 68 65 20 71 75 6f 74 61 20  write the quota 
281d0 6f 66 20 6e 4d 65 72 67 65 20 6c 65 61 66 20 62  of nMerge leaf b
281e0 6c 6f 63 6b 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  locks..*/.int sq
281f0 6c 69 74 65 33 46 74 73 33 49 6e 63 72 6d 65 72  lite3Fts3Incrmer
28200 67 65 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  ge(Fts3Table *p,
28210 20 69 6e 74 20 6e 4d 65 72 67 65 2c 20 69 6e 74   int nMerge, int
28220 20 6e 4d 69 6e 29 7b 0a 20 20 69 6e 74 20 72 63   nMin){.  int rc
28230 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
28250 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
28260 74 20 6e 52 65 6d 20 3d 20 6e 4d 65 72 67 65 3b  t nRem = nMerge;
28270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28280 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   Number of leaf 
28290 70 61 67 65 73 20 79 65 74 20 74 6f 20 20 62 65  pages yet to  be
282a0 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 46 74   written */.  Ft
282b0 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
282c0 20 2a 70 43 73 72 3b 20 20 20 20 20 20 20 2f 2a   *pCsr;       /*
282d0 20 43 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20   Cursor used to 
282e0 72 65 61 64 20 69 6e 70 75 74 20 64 61 74 61 20  read input data 
282f0 2a 2f 0a 20 20 46 74 73 33 53 65 67 46 69 6c 74  */.  Fts3SegFilt
28300 65 72 20 2a 70 46 69 6c 74 65 72 3b 20 20 20 20  er *pFilter;    
28310 20 20 20 20 20 2f 2a 20 46 69 6c 74 65 72 20 75       /* Filter u
28320 73 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  sed with cursor 
28330 70 43 73 72 20 2a 2f 0a 20 20 49 6e 63 72 6d 65  pCsr */.  Incrme
28340 72 67 65 57 72 69 74 65 72 20 2a 70 57 72 69 74  rgeWriter *pWrit
28350 65 72 3b 20 20 20 20 20 20 20 2f 2a 20 57 72 69  er;       /* Wri
28360 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
28370 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b 20 20 20  int nSeg = 0;   
28380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28390 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70  /* Number of inp
283a0 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  ut segments */. 
283b0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
283c0 41 62 73 4c 65 76 65 6c 20 3d 20 30 3b 20 20 20  AbsLevel = 0;   
283d0 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65 76   /* Absolute lev
283e0 65 6c 20 6e 75 6d 62 65 72 20 74 6f 20 77 6f 72  el number to wor
283f0 6b 20 6f 6e 20 2a 2f 0a 20 20 42 6c 6f 62 20 68  k on */.  Blob h
28400 69 6e 74 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b  int = {0, 0, 0};
28410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 69 6e            /* Hin
28420 74 20 72 65 61 64 20 66 72 6f 6d 20 25 5f 73 74  t read from %_st
28430 61 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  at table */.  in
28440 74 20 62 44 69 72 74 79 48 69 6e 74 20 3d 20 30  t bDirtyHint = 0
28450 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
28460 20 54 72 75 65 20 69 66 20 62 6c 6f 62 20 27 68   True if blob 'h
28470 69 6e 74 27 20 68 61 73 20 62 65 65 6e 20 6d 6f  int' has been mo
28480 64 69 66 69 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  dified */..  /* 
28490 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
284a0 6f 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20 66  or the cursor, f
284b0 69 6c 74 65 72 20 61 6e 64 20 77 72 69 74 65 72  ilter and writer
284c0 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 63 6f   objects */.  co
284d0 6e 73 74 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d  nst int nAlloc =
284e0 20 73 69 7a 65 6f 66 28 2a 70 43 73 72 29 20 2b   sizeof(*pCsr) +
284f0 20 73 69 7a 65 6f 66 28 2a 70 46 69 6c 74 65 72   sizeof(*pFilter
28500 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 57 72 69  ) + sizeof(*pWri
28510 74 65 72 29 3b 0a 20 20 70 57 72 69 74 65 72 20  ter);.  pWriter 
28520 3d 20 28 49 6e 63 72 6d 65 72 67 65 57 72 69 74  = (IncrmergeWrit
28530 65 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  er *)sqlite3_mal
28540 6c 6f 63 28 6e 41 6c 6c 6f 63 29 3b 0a 20 20 69  loc(nAlloc);.  i
28550 66 28 20 21 70 57 72 69 74 65 72 20 29 20 72 65  f( !pWriter ) re
28560 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
28570 4d 3b 0a 20 20 70 46 69 6c 74 65 72 20 3d 20 28  M;.  pFilter = (
28580 46 74 73 33 53 65 67 46 69 6c 74 65 72 20 2a 29  Fts3SegFilter *)
28590 26 70 57 72 69 74 65 72 5b 31 5d 3b 0a 20 20 70  &pWriter[1];.  p
285a0 43 73 72 20 3d 20 28 46 74 73 33 4d 75 6c 74 69  Csr = (Fts3Multi
285b0 53 65 67 52 65 61 64 65 72 20 2a 29 26 70 46 69  SegReader *)&pFi
285c0 6c 74 65 72 5b 31 5d 3b 0a 0a 20 20 72 63 20 3d  lter[1];..  rc =
285d0 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 48 69   fts3IncrmergeHi
285e0 6e 74 4c 6f 61 64 28 70 2c 20 26 68 69 6e 74 29  ntLoad(p, &hint)
285f0 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
28600 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 52 65 6d  QLITE_OK && nRem
28610 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  >0 ){.    const 
28620 69 36 34 20 6e 4d 6f 64 20 3d 20 46 54 53 33 5f  i64 nMod = FTS3_
28630 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 20  SEGDIR_MAXLEVEL 
28640 2a 20 70 2d 3e 6e 49 6e 64 65 78 3b 0a 20 20 20  * p->nIndex;.   
28650 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
28660 46 69 6e 64 4c 65 76 65 6c 20 3d 20 30 3b 20 2f  FindLevel = 0; /
28670 2a 20 53 51 4c 20 75 73 65 64 20 74 6f 20 64 65  * SQL used to de
28680 74 65 72 6d 69 6e 65 20 69 41 62 73 4c 65 76 65  termine iAbsLeve
28690 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 55 73  l */.    int bUs
286a0 65 48 69 6e 74 20 3d 20 30 3b 20 20 20 20 20 20  eHint = 0;      
286b0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
286c0 66 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  f attempting to 
286d0 61 70 70 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e  append */.    in
286e0 74 20 69 49 64 78 20 3d 20 30 3b 20 20 20 20 20  t iIdx = 0;     
286f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
28700 61 72 67 65 73 74 20 69 64 78 20 69 6e 20 6c 65  argest idx in le
28710 76 65 6c 20 28 69 41 62 73 4c 65 76 65 6c 2b 31  vel (iAbsLevel+1
28720 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61  ) */..    /* Sea
28730 72 63 68 20 74 68 65 20 25 5f 73 65 67 64 69 72  rch the %_segdir
28740 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 61   table for the a
28750 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 77 69  bsolute level wi
28760 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 0a  th the smallest.
28770 20 20 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20      ** relative 
28780 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20 74 68 61  level number tha
28790 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65  t contains at le
287a0 61 73 74 20 6e 4d 69 6e 20 73 65 67 6d 65 6e 74  ast nMin segment
287b0 73 2c 20 69 66 20 61 6e 79 2e 0a 20 20 20 20 2a  s, if any..    *
287c0 2a 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e  * If one is foun
287d0 64 2c 20 73 65 74 20 69 41 62 73 4c 65 76 65 6c  d, set iAbsLevel
287e0 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65   to the absolute
287f0 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20 61 6e   level number an
28800 64 0a 20 20 20 20 2a 2a 20 6e 53 65 67 20 74 6f  d.    ** nSeg to
28810 20 6e 4d 69 6e 2e 20 49 66 20 6e 6f 20 6c 65 76   nMin. If no lev
28820 65 6c 20 77 69 74 68 20 61 74 20 6c 65 61 73 74  el with at least
28830 20 6e 4d 69 6e 20 73 65 67 6d 65 6e 74 73 20 63   nMin segments c
28840 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 0a 20 20  an be found, .  
28850 20 20 2a 2a 20 73 65 74 20 6e 53 65 67 20 74 6f    ** set nSeg to
28860 20 2d 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   -1..    */.    
28870 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
28880 28 70 2c 20 53 51 4c 5f 46 49 4e 44 5f 4d 45 52  (p, SQL_FIND_MER
28890 47 45 5f 4c 45 56 45 4c 2c 20 26 70 46 69 6e 64  GE_LEVEL, &pFind
288a0 4c 65 76 65 6c 2c 20 30 29 3b 0a 20 20 20 20 73  Level, 0);.    s
288b0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
288c0 70 46 69 6e 64 4c 65 76 65 6c 2c 20 31 2c 20 4d  pFindLevel, 1, M
288d0 41 58 28 32 2c 20 6e 4d 69 6e 29 29 3b 0a 20 20  AX(2, nMin));.  
288e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
288f0 65 70 28 70 46 69 6e 64 4c 65 76 65 6c 29 3d 3d  ep(pFindLevel)==
28900 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
28910 20 20 20 20 69 41 62 73 4c 65 76 65 6c 20 3d 20      iAbsLevel = 
28920 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
28930 6e 74 36 34 28 70 46 69 6e 64 4c 65 76 65 6c 2c  nt64(pFindLevel,
28940 20 30 29 3b 0a 20 20 20 20 20 20 6e 53 65 67 20   0);.      nSeg 
28950 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
28960 5f 69 6e 74 28 70 46 69 6e 64 4c 65 76 65 6c 2c  _int(pFindLevel,
28970 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   1);.      asser
28980 74 28 20 6e 53 65 67 3e 3d 32 20 29 3b 0a 20 20  t( nSeg>=2 );.  
28990 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
289a0 53 65 67 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  Seg = -1;.    }.
289b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
289c0 5f 72 65 73 65 74 28 70 46 69 6e 64 4c 65 76 65  _reset(pFindLeve
289d0 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  l);..    /* If t
289e0 68 65 20 68 69 6e 74 20 72 65 61 64 20 66 72 6f  he hint read fro
289f0 6d 20 74 68 65 20 25 5f 73 74 61 74 20 74 61 62  m the %_stat tab
28a00 6c 65 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c  le is not empty,
28a10 20 63 68 65 63 6b 20 69 66 20 74 68 65 0a 20 20   check if the.  
28a20 20 20 2a 2a 20 6c 61 73 74 20 65 6e 74 72 79 20    ** last entry 
28a30 69 6e 20 69 74 20 73 70 65 63 69 66 69 65 73 20  in it specifies 
28a40 61 20 72 65 6c 61 74 69 76 65 20 6c 65 76 65 6c  a relative level
28a50 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 72   smaller than or
28a60 20 65 71 75 61 6c 0a 20 20 20 20 2a 2a 20 74 6f   equal.    ** to
28a70 20 74 68 65 20 6c 65 76 65 6c 20 69 64 65 6e 74   the level ident
28a80 69 66 69 65 64 20 62 79 20 74 68 65 20 62 6c 6f  ified by the blo
28a90 63 6b 20 61 62 6f 76 65 20 28 69 66 20 61 6e 79  ck above (if any
28aa0 29 2e 20 49 66 20 73 6f 2c 20 74 68 69 73 20 0a  ). If so, this .
28ab0 20 20 20 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e      ** iteration
28ac0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 69 6c   of the loop wil
28ad0 6c 20 77 6f 72 6b 20 6f 6e 20 6d 65 72 67 69 6e  l work on mergin
28ae0 67 20 61 74 20 74 68 65 20 68 69 6e 74 65 64 20  g at the hinted 
28af0 6c 65 76 65 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  level..    */.  
28b00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28b10 5f 4f 4b 20 26 26 20 68 69 6e 74 2e 6e 20 29 7b  _OK && hint.n ){
28b20 0a 20 20 20 20 20 20 69 6e 74 20 6e 48 69 6e 74  .      int nHint
28b30 20 3d 20 68 69 6e 74 2e 6e 3b 0a 20 20 20 20 20   = hint.n;.     
28b40 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
28b50 48 69 6e 74 41 62 73 4c 65 76 65 6c 20 3d 20 30  HintAbsLevel = 0
28b60 3b 20 20 20 20 20 20 2f 2a 20 48 69 6e 74 20 6c  ;      /* Hint l
28b70 65 76 65 6c 20 2a 2f 0a 20 20 20 20 20 20 69 6e  evel */.      in
28b80 74 20 6e 48 69 6e 74 53 65 67 20 3d 20 30 3b 20  t nHintSeg = 0; 
28b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ba0 20 20 20 20 2f 2a 20 48 69 6e 74 20 6e 75 6d 62      /* Hint numb
28bb0 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a  er of segments *
28bc0 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  /..      rc = ft
28bd0 73 33 49 6e 63 72 6d 65 72 67 65 48 69 6e 74 50  s3IncrmergeHintP
28be0 6f 70 28 26 68 69 6e 74 2c 20 26 69 48 69 6e 74  op(&hint, &iHint
28bf0 41 62 73 4c 65 76 65 6c 2c 20 26 6e 48 69 6e 74  AbsLevel, &nHint
28c00 53 65 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Seg);.      if( 
28c10 6e 53 65 67 3c 30 20 7c 7c 20 28 69 41 62 73 4c  nSeg<0 || (iAbsL
28c20 65 76 65 6c 20 25 20 6e 4d 6f 64 29 20 3e 3d 20  evel % nMod) >= 
28c30 28 69 48 69 6e 74 41 62 73 4c 65 76 65 6c 20 25  (iHintAbsLevel %
28c40 20 6e 4d 6f 64 29 20 29 7b 0a 20 20 20 20 20 20   nMod) ){.      
28c50 20 20 69 41 62 73 4c 65 76 65 6c 20 3d 20 69 48    iAbsLevel = iH
28c60 69 6e 74 41 62 73 4c 65 76 65 6c 3b 0a 20 20 20  intAbsLevel;.   
28c70 20 20 20 20 20 6e 53 65 67 20 3d 20 6e 48 69 6e       nSeg = nHin
28c80 74 53 65 67 3b 0a 20 20 20 20 20 20 20 20 62 55  tSeg;.        bU
28c90 73 65 48 69 6e 74 20 3d 20 31 3b 0a 20 20 20 20  seHint = 1;.    
28ca0 20 20 20 20 62 44 69 72 74 79 48 69 6e 74 20 3d      bDirtyHint =
28cb0 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
28cc0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
28cd0 20 75 6e 64 6f 65 73 20 74 68 65 20 65 66 66 65   undoes the effe
28ce0 63 74 20 6f 66 20 74 68 65 20 48 69 6e 74 50 6f  ct of the HintPo
28cf0 70 28 29 20 61 62 6f 76 65 20 2d 20 73 6f 20 74  p() above - so t
28d00 68 61 74 20 6e 6f 20 65 6e 74 72 79 0a 20 20 20  hat no entry.   
28d10 20 20 20 20 20 2a 2a 20 69 73 20 72 65 6d 6f 76       ** is remov
28d20 65 64 20 66 72 6f 6d 20 74 68 65 20 68 69 6e 74  ed from the hint
28d30 20 62 6c 6f 62 2e 20 20 2a 2f 0a 20 20 20 20 20   blob.  */.     
28d40 20 20 20 68 69 6e 74 2e 6e 20 3d 20 6e 48 69 6e     hint.n = nHin
28d50 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
28d60 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 53 65 67  ..    /* If nSeg
28d70 20 69 73 20 6c 65 73 73 20 74 68 61 74 20 7a 65   is less that ze
28d80 72 6f 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69  ro, then there i
28d90 73 20 6e 6f 20 6c 65 76 65 6c 20 77 69 74 68 20  s no level with 
28da0 61 74 20 6c 65 61 73 74 0a 20 20 20 20 2a 2a 20  at least.    ** 
28db0 6e 4d 69 6e 20 73 65 67 6d 65 6e 74 73 20 61 6e  nMin segments an
28dc0 64 20 6e 6f 20 68 69 6e 74 20 69 6e 20 74 68 65  d no hint in the
28dd0 20 25 5f 73 74 61 74 20 74 61 62 6c 65 2e 20 4e   %_stat table. N
28de0 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 2e 0a 20 20  o work to do..  
28df0 20 20 2a 2a 20 45 78 69 74 20 65 61 72 6c 79 20    ** Exit early 
28e00 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a  in this case.  *
28e10 2f 0a 20 20 20 20 69 66 28 20 6e 53 65 67 3c 30  /.    if( nSeg<0
28e20 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f   ) break;..    /
28e30 2a 20 4f 70 65 6e 20 61 20 63 75 72 73 6f 72 20  * Open a cursor 
28e40 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
28e50 67 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  gh the contents 
28e60 6f 66 20 74 68 65 20 6f 6c 64 65 73 74 20 6e 53  of the oldest nS
28e70 65 67 20 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78  eg .    ** index
28e80 65 73 20 6f 66 20 61 62 73 6f 6c 75 74 65 20 6c  es of absolute l
28e90 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c 2e 20  evel iAbsLevel. 
28ea0 49 66 20 74 68 69 73 20 63 75 72 73 6f 72 20 69  If this cursor i
28eb0 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 0a  s opened using .
28ec0 20 20 20 20 2a 2a 20 74 68 65 20 27 68 69 6e 74      ** the 'hint
28ed0 27 20 70 61 72 61 6d 65 74 65 72 73 2c 20 69 74  ' parameters, it
28ee0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61   is possible tha
28ef0 74 20 74 68 65 72 65 20 61 72 65 20 6c 65 73 73  t there are less
28f00 20 74 68 61 6e 20 6e 53 65 67 0a 20 20 20 20 2a   than nSeg.    *
28f10 2a 20 73 65 67 6d 65 6e 74 73 20 61 76 61 69 6c  * segments avail
28f20 61 62 6c 65 20 69 6e 20 6c 65 76 65 6c 20 69 41  able in level iA
28f30 62 73 4c 65 76 65 6c 2e 20 49 6e 20 74 68 69 73  bsLevel. In this
28f40 20 63 61 73 65 2c 20 6e 6f 20 77 6f 72 6b 20 69   case, no work i
28f50 73 0a 20 20 20 20 2a 2a 20 64 6f 6e 65 20 6f 6e  s.    ** done on
28f60 20 69 41 62 73 4c 65 76 65 6c 20 2d 20 66 61 6c   iAbsLevel - fal
28f70 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
28f80 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
28f90 6f 66 20 74 68 65 20 6c 6f 6f 70 20 0a 20 20 20  of the loop .   
28fa0 20 2a 2a 20 74 6f 20 73 74 61 72 74 20 77 6f 72   ** to start wor
28fb0 6b 20 6f 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  k on some other 
28fc0 6c 65 76 65 6c 2e 20 20 2a 2f 0a 20 20 20 20 6d  level.  */.    m
28fd0 65 6d 73 65 74 28 70 57 72 69 74 65 72 2c 20 30  emset(pWriter, 0
28fe0 2c 20 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 70  , nAlloc);.    p
28ff0 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 3d 20  Filter->flags = 
29000 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 52 45 51  FTS3_SEGMENT_REQ
29010 55 49 52 45 5f 50 4f 53 3b 0a 0a 20 20 20 20 69  UIRE_POS;..    i
29020 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
29030 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
29040 74 73 33 49 6e 63 72 6d 65 72 67 65 4f 75 74 70  ts3IncrmergeOutp
29050 75 74 49 64 78 28 70 2c 20 69 41 62 73 4c 65 76  utIdx(p, iAbsLev
29060 65 6c 2c 20 26 69 49 64 78 29 3b 0a 20 20 20 20  el, &iIdx);.    
29070 20 20 61 73 73 65 72 74 28 20 62 55 73 65 48 69    assert( bUseHi
29080 6e 74 3d 3d 31 20 7c 7c 20 62 55 73 65 48 69 6e  nt==1 || bUseHin
29090 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  t==0 );.      if
290a0 28 20 69 49 64 78 3d 3d 30 20 7c 7c 20 28 62 55  ( iIdx==0 || (bU
290b0 73 65 48 69 6e 74 20 26 26 20 69 49 64 78 3d 3d  seHint && iIdx==
290c0 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  1) ){.        in
290d0 74 20 62 49 67 6e 6f 72 65 20 3d 20 30 3b 0a 20  t bIgnore = 0;. 
290e0 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33         rc = fts3
290f0 53 65 67 6d 65 6e 74 49 73 4d 61 78 4c 65 76 65  SegmentIsMaxLeve
29100 6c 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 2b 31  l(p, iAbsLevel+1
29110 2c 20 26 62 49 67 6e 6f 72 65 29 3b 0a 20 20 20  , &bIgnore);.   
29120 20 20 20 20 20 69 66 28 20 62 49 67 6e 6f 72 65       if( bIgnore
29130 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
29140 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  ilter->flags |= 
29150 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 49 47 4e  FTS3_SEGMENT_IGN
29160 4f 52 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20 20  ORE_EMPTY;.     
29170 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
29180 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
29190 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
291a0 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72     rc = fts3Incr
291b0 6d 65 72 67 65 43 73 72 28 70 2c 20 69 41 62 73  mergeCsr(p, iAbs
291c0 4c 65 76 65 6c 2c 20 6e 53 65 67 2c 20 70 43 73  Level, nSeg, pCs
291d0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
291e0 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20  ( SQLITE_OK==rc 
291f0 26 26 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e  && pCsr->nSegmen
29200 74 3d 3d 6e 53 65 67 0a 20 20 20 20 20 26 26 20  t==nSeg.     && 
29210 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
29220 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
29230 65 61 64 65 72 53 74 61 72 74 28 70 2c 20 70 43  eaderStart(p, pC
29240 73 72 2c 20 70 46 69 6c 74 65 72 29 29 0a 20 20  sr, pFilter)).  
29250 20 20 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57     && SQLITE_ROW
29260 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 46  ==(rc = sqlite3F
29270 74 73 33 53 65 67 52 65 61 64 65 72 53 74 65 70  ts3SegReaderStep
29280 28 70 2c 20 70 43 73 72 29 29 0a 20 20 20 20 29  (p, pCsr)).    )
29290 7b 0a 20 20 20 20 20 20 69 66 28 20 62 55 73 65  {.      if( bUse
292a0 48 69 6e 74 20 26 26 20 69 49 64 78 3e 30 20 29  Hint && iIdx>0 )
292b0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
292c0 63 68 61 72 20 2a 7a 4b 65 79 20 3d 20 70 43 73  char *zKey = pCs
292d0 72 2d 3e 7a 54 65 72 6d 3b 0a 20 20 20 20 20 20  r->zTerm;.      
292e0 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 43 73    int nKey = pCs
292f0 72 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20  r->nTerm;.      
29300 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72 6d    rc = fts3Incrm
29310 65 72 67 65 4c 6f 61 64 28 70 2c 20 69 41 62 73  ergeLoad(p, iAbs
29320 4c 65 76 65 6c 2c 20 69 49 64 78 2d 31 2c 20 7a  Level, iIdx-1, z
29330 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 57 72 69 74  Key, nKey, pWrit
29340 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  er);.      }else
29350 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
29360 74 73 33 49 6e 63 72 6d 65 72 67 65 57 72 69 74  ts3IncrmergeWrit
29370 65 72 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 2c  er(p, iAbsLevel,
29380 20 69 49 64 78 2c 20 70 43 73 72 2c 20 70 57 72   iIdx, pCsr, pWr
29390 69 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  iter);.      }..
293a0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
293b0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 57 72 69 74  LITE_OK && pWrit
293c0 65 72 2d 3e 6e 4c 65 61 66 45 73 74 20 29 7b 0a  er->nLeafEst ){.
293d0 20 20 20 20 20 20 20 20 66 74 73 33 4c 6f 67 4d          fts3LogM
293e0 65 72 67 65 28 6e 53 65 67 2c 20 69 41 62 73 4c  erge(nSeg, iAbsL
293f0 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 64  evel);.        d
29400 6f 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  o {.          rc
29410 20 3d 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65   = fts3Incrmerge
29420 41 70 70 65 6e 64 28 70 2c 20 70 57 72 69 74 65  Append(p, pWrite
29430 72 2c 20 70 43 73 72 29 3b 0a 20 20 20 20 20 20  r, pCsr);.      
29440 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
29450 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71 6c  TE_OK ) rc = sql
29460 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
29470 72 53 74 65 70 28 70 2c 20 70 43 73 72 29 3b 0a  rStep(p, pCsr);.
29480 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 57            if( pW
29490 72 69 74 65 72 2d 3e 6e 57 6f 72 6b 3e 3d 6e 52  riter->nWork>=nR
294a0 65 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  em && rc==SQLITE
294b0 5f 52 4f 57 20 29 20 72 63 20 3d 20 53 51 4c 49  _ROW ) rc = SQLI
294c0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  TE_OK;.        }
294d0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
294e0 45 5f 52 4f 57 20 29 3b 0a 0a 20 20 20 20 20 20  E_ROW );..      
294f0 20 20 2f 2a 20 55 70 64 61 74 65 20 6f 72 20 64    /* Update or d
29500 65 6c 65 74 65 20 74 68 65 20 69 6e 70 75 74 20  elete the input 
29510 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  segments */.    
29520 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
29530 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
29540 20 20 20 6e 52 65 6d 20 2d 3d 20 28 31 20 2b 20     nRem -= (1 + 
29550 70 57 72 69 74 65 72 2d 3e 6e 57 6f 72 6b 29 3b  pWriter->nWork);
29560 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
29570 66 74 73 33 49 6e 63 72 6d 65 72 67 65 43 68 6f  fts3IncrmergeCho
29580 6d 70 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 2c  mp(p, iAbsLevel,
29590 20 70 43 73 72 2c 20 26 6e 53 65 67 29 3b 0a 20   pCsr, &nSeg);. 
295a0 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 53 65           if( nSe
295b0 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g!=0 ){.        
295c0 20 20 20 20 62 44 69 72 74 79 48 69 6e 74 20 3d      bDirtyHint =
295d0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
295e0 66 74 73 33 49 6e 63 72 6d 65 72 67 65 48 69 6e  fts3IncrmergeHin
295f0 74 50 75 73 68 28 26 68 69 6e 74 2c 20 69 41 62  tPush(&hint, iAb
29600 73 4c 65 76 65 6c 2c 20 6e 53 65 67 2c 20 26 72  sLevel, nSeg, &r
29610 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  c);.          }.
29620 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29630 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 53 65  }..      if( nSe
29640 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g!=0 ){.        
29650 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61  pWriter->nLeafDa
29660 74 61 20 3d 20 70 57 72 69 74 65 72 2d 3e 6e 4c  ta = pWriter->nL
29670 65 61 66 44 61 74 61 20 2a 20 2d 31 3b 0a 20 20  eafData * -1;.  
29680 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 33      }.      fts3
29690 49 6e 63 72 6d 65 72 67 65 52 65 6c 65 61 73 65  IncrmergeRelease
296a0 28 70 2c 20 70 57 72 69 74 65 72 2c 20 26 72 63  (p, pWriter, &rc
296b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 53 65  );.      if( nSe
296c0 67 3d 3d 30 20 26 26 20 70 57 72 69 74 65 72 2d  g==0 && pWriter-
296d0 3e 62 4e 6f 4c 65 61 66 44 61 74 61 3d 3d 30 20  >bNoLeafData==0 
296e0 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 33 50  ){.        fts3P
296f0 72 6f 6d 6f 74 65 53 65 67 6d 65 6e 74 73 28 70  romoteSegments(p
29700 2c 20 69 41 62 73 4c 65 76 65 6c 2b 31 2c 20 70  , iAbsLevel+1, p
29710 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61 74  Writer->nLeafDat
29720 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  a);.      }.    
29730 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  }..    sqlite3Ft
29740 73 33 53 65 67 52 65 61 64 65 72 46 69 6e 69 73  s3SegReaderFinis
29750 68 28 70 43 73 72 29 3b 0a 20 20 7d 0a 0a 20 20  h(pCsr);.  }..  
29760 2f 2a 20 57 72 69 74 65 20 74 68 65 20 68 69 6e  /* Write the hin
29770 74 20 76 61 6c 75 65 73 20 69 6e 74 6f 20 74 68  t values into th
29780 65 20 25 5f 73 74 61 74 20 74 61 62 6c 65 20 66  e %_stat table f
29790 6f 72 20 74 68 65 20 6e 65 78 74 20 69 6e 63 72  or the next incr
297a0 2d 6d 65 72 67 65 72 20 2a 2f 0a 20 20 69 66 28  -merger */.  if(
297b0 20 62 44 69 72 74 79 48 69 6e 74 20 26 26 20 72   bDirtyHint && r
297c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
297d0 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63      rc = fts3Inc
297e0 72 6d 65 72 67 65 48 69 6e 74 53 74 6f 72 65 28  rmergeHintStore(
297f0 70 2c 20 26 68 69 6e 74 29 3b 0a 20 20 7d 0a 0a  p, &hint);.  }..
29800 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
29810 57 72 69 74 65 72 29 3b 0a 20 20 73 71 6c 69 74  Writer);.  sqlit
29820 65 33 5f 66 72 65 65 28 68 69 6e 74 2e 61 29 3b  e3_free(hint.a);
29830 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
29840 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74  ./*.** Convert t
29850 68 65 20 74 65 78 74 20 62 65 67 69 6e 6e 69 6e  he text beginnin
29860 67 20 61 74 20 2a 70 7a 20 69 6e 74 6f 20 61 6e  g at *pz into an
29870 20 69 6e 74 65 67 65 72 20 61 6e 64 20 72 65 74   integer and ret
29880 75 72 6e 0a 2a 2a 20 69 74 73 20 76 61 6c 75 65  urn.** its value
29890 2e 20 20 41 64 76 61 6e 63 65 20 2a 70 7a 20 74  .  Advance *pz t
298a0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  o point to the f
298b0 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20 70  irst character p
298c0 61 73 74 0a 2a 2a 20 74 68 65 20 69 6e 74 65 67  ast.** the integ
298d0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  er..**.** This f
298e0 75 6e 63 74 69 6f 6e 20 75 73 65 64 20 66 6f 72  unction used for
298f0 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 6d   parameters to m
29900 65 72 67 65 3d 20 61 6e 64 20 69 6e 63 72 6d 65  erge= and incrme
29910 72 67 65 3d 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 73  rge=.** commands
29920 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
29930 20 66 74 73 33 47 65 74 69 6e 74 28 63 6f 6e 73   fts3Getint(cons
29940 74 20 63 68 61 72 20 2a 2a 70 7a 29 7b 0a 20 20  t char **pz){.  
29950 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
29960 2a 70 7a 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30  *pz;.  int i = 0
29970 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a 7a 29 3e  ;.  while( (*z)>
29980 3d 27 30 27 20 26 26 20 28 2a 7a 29 3c 3d 27 39  ='0' && (*z)<='9
29990 27 20 26 26 20 69 3c 32 31 34 37 34 38 33 36 33  ' && i<214748363
299a0 20 29 20 69 20 3d 20 31 30 2a 69 20 2b 20 2a 28   ) i = 10*i + *(
299b0 7a 2b 2b 29 20 2d 20 27 30 27 3b 0a 20 20 2a 70  z++) - '0';.  *p
299c0 7a 20 3d 20 7a 3b 0a 20 20 72 65 74 75 72 6e 20  z = z;.  return 
299d0 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63  i;.}../*.** Proc
299e0 65 73 73 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  ess statements o
299f0 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
29a00 2a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  *    INSERT INTO
29a10 20 74 61 62 6c 65 28 74 61 62 6c 65 29 20 56 41   table(table) VA
29a20 4c 55 45 53 28 27 6d 65 72 67 65 3d 41 2c 42 27  LUES('merge=A,B'
29a30 29 3b 0a 2a 2a 0a 2a 2a 20 41 20 61 6e 64 20 42  );.**.** A and B
29a40 20 61 72 65 20 69 6e 74 65 67 65 72 73 20 74 68   are integers th
29a50 61 74 20 64 65 63 6f 64 65 20 74 6f 20 62 65 20  at decode to be 
29a60 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  the number of le
29a70 61 66 20 70 61 67 65 73 0a 2a 2a 20 77 72 69 74  af pages.** writ
29a80 74 65 6e 20 66 6f 72 20 74 68 65 20 6d 65 72 67  ten for the merg
29a90 65 2c 20 61 6e 64 20 74 68 65 20 6d 69 6e 69 6d  e, and the minim
29aa0 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67  um number of seg
29ab0 6d 65 6e 74 73 20 6f 6e 20 61 20 6c 65 76 65 6c  ments on a level
29ac0 0a 2a 2a 20 62 65 66 6f 72 65 20 69 74 20 77 69  .** before it wi
29ad0 6c 6c 20 62 65 20 73 65 6c 65 63 74 65 64 20 66  ll be selected f
29ae0 6f 72 20 61 20 6d 65 72 67 65 2c 20 72 65 73 70  or a merge, resp
29af0 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 73 74 61  ectively..*/.sta
29b00 74 69 63 20 69 6e 74 20 66 74 73 33 44 6f 49 6e  tic int fts3DoIn
29b10 63 72 6d 65 72 67 65 28 0a 20 20 46 74 73 33 54  crmerge(.  Fts3T
29b20 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
29b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
29b40 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  S3 table handle 
29b50 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
29b60 2a 7a 50 61 72 61 6d 20 20 20 20 20 20 20 20 20  *zParam         
29b70 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d       /* Nul-term
29b80 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f  inated string co
29b90 6e 74 61 69 6e 69 6e 67 20 22 41 2c 42 22 20 2a  ntaining "A,B" *
29ba0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
29bb0 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 28 46 54 53   int nMin = (FTS
29bc0 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 20 2f 20  3_MERGE_COUNT / 
29bd0 32 29 3b 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65  2);.  int nMerge
29be0 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68   = 0;.  const ch
29bf0 61 72 20 2a 7a 20 3d 20 7a 50 61 72 61 6d 3b 0a  ar *z = zParam;.
29c00 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66  .  /* Read the f
29c10 69 72 73 74 20 69 6e 74 65 67 65 72 20 76 61 6c  irst integer val
29c20 75 65 20 2a 2f 0a 20 20 6e 4d 65 72 67 65 20 3d  ue */.  nMerge =
29c30 20 66 74 73 33 47 65 74 69 6e 74 28 26 7a 29 3b   fts3Getint(&z);
29c40 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69  ..  /* If the fi
29c50 72 73 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75  rst integer valu
29c60 65 20 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79  e is followed by
29c70 20 61 20 27 2c 27 2c 20 20 72 65 61 64 20 74 68   a ',',  read th
29c80 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 69 6e  e second.  ** in
29c90 74 65 67 65 72 20 76 61 6c 75 65 2e 20 2a 2f 0a  teger value. */.
29ca0 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2c 27 20    if( z[0]==',' 
29cb0 26 26 20 7a 5b 31 5d 21 3d 27 5c 30 27 20 29 7b  && z[1]!='\0' ){
29cc0 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 6e 4d  .    z++;.    nM
29cd0 69 6e 20 3d 20 66 74 73 33 47 65 74 69 6e 74 28  in = fts3Getint(
29ce0 26 7a 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  &z);.  }..  if( 
29cf0 7a 5b 30 5d 21 3d 27 5c 30 27 20 7c 7c 20 6e 4d  z[0]!='\0' || nM
29d00 69 6e 3c 32 20 29 7b 0a 20 20 20 20 72 63 20 3d  in<2 ){.    rc =
29d10 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
29d20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
29d30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
29d40 69 66 28 20 21 70 2d 3e 62 48 61 73 53 74 61 74  if( !p->bHasStat
29d50 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
29d60 28 20 70 2d 3e 62 46 74 73 34 3d 3d 30 20 29 3b  ( p->bFts4==0 );
29d70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
29d80 73 33 43 72 65 61 74 65 53 74 61 74 54 61 62 6c  s3CreateStatTabl
29d90 65 28 26 72 63 2c 20 70 29 3b 0a 20 20 20 20 7d  e(&rc, p);.    }
29da0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
29db0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29dc0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
29dd0 49 6e 63 72 6d 65 72 67 65 28 70 2c 20 6e 4d 65  Incrmerge(p, nMe
29de0 72 67 65 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20  rge, nMin);.    
29df0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  }.    sqlite3Fts
29e00 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28 70  3SegmentsClose(p
29e10 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
29e20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  rc;.}../*.** Pro
29e30 63 65 73 73 20 73 74 61 74 65 6d 65 6e 74 73 20  cess statements 
29e40 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
29e50 2a 2a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  **    INSERT INT
29e60 4f 20 74 61 62 6c 65 28 74 61 62 6c 65 29 20 56  O table(table) V
29e70 41 4c 55 45 53 28 27 61 75 74 6f 6d 65 72 67 65  ALUES('automerge
29e80 3d 58 27 29 3b 0a 2a 2a 0a 2a 2a 20 77 68 65 72  =X');.**.** wher
29e90 65 20 58 20 69 73 20 61 6e 20 69 6e 74 65 67 65  e X is an intege
29ea0 72 2e 20 20 58 3d 3d 30 20 6d 65 61 6e 73 20 74  r.  X==0 means t
29eb0 6f 20 74 75 72 6e 20 61 75 74 6f 6d 65 72 67 65  o turn automerge
29ec0 20 6f 66 66 2e 20 20 58 21 3d 30 20 6d 65 61 6e   off.  X!=0 mean
29ed0 73 0a 2a 2a 20 74 75 72 6e 20 69 74 20 6f 6e 2e  s.** turn it on.
29ee0 20 20 54 68 65 20 73 65 74 74 69 6e 67 20 69 73    The setting is
29ef0 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a   persistent..*/.
29f00 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 44  static int fts3D
29f10 6f 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 28 0a  oAutoincrmerge(.
29f20 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
29f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f40 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20    /* FTS3 table 
29f50 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  handle */.  cons
29f60 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 20 20  t char *zParam  
29f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
29f80 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
29f90 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
29fa0 62 6f 6f 6c 65 61 6e 20 2a 2f 0a 29 7b 0a 20 20  boolean */.){.  
29fb0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
29fc0 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  OK;.  sqlite3_st
29fd0 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
29fe0 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d 65 72   p->nAutoincrmer
29ff0 67 65 20 3d 20 66 74 73 33 47 65 74 69 6e 74 28  ge = fts3Getint(
2a000 26 7a 50 61 72 61 6d 29 3b 0a 20 20 69 66 28 20  &zParam);.  if( 
2a010 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d 65 72 67  p->nAutoincrmerg
2a020 65 3d 3d 31 20 7c 7c 20 70 2d 3e 6e 41 75 74 6f  e==1 || p->nAuto
2a030 69 6e 63 72 6d 65 72 67 65 3e 46 54 53 33 5f 4d  incrmerge>FTS3_M
2a040 45 52 47 45 5f 43 4f 55 4e 54 20 29 7b 0a 20 20  ERGE_COUNT ){.  
2a050 20 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d 65    p->nAutoincrme
2a060 72 67 65 20 3d 20 38 3b 0a 20 20 7d 0a 20 20 69  rge = 8;.  }.  i
2a070 66 28 20 21 70 2d 3e 62 48 61 73 53 74 61 74 20  f( !p->bHasStat 
2a080 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2a090 2d 3e 62 46 74 73 34 3d 3d 30 20 29 3b 0a 20 20  ->bFts4==0 );.  
2a0a0 20 20 73 71 6c 69 74 65 33 46 74 73 33 43 72 65    sqlite3Fts3Cre
2a0b0 61 74 65 53 74 61 74 54 61 62 6c 65 28 26 72 63  ateStatTable(&rc
2a0c0 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , p);.    if( rc
2a0d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2a0e0 7d 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  }.  rc = fts3Sql
2a0f0 53 74 6d 74 28 70 2c 20 53 51 4c 5f 52 45 50 4c  Stmt(p, SQL_REPL
2a100 41 43 45 5f 53 54 41 54 2c 20 26 70 53 74 6d 74  ACE_STAT, &pStmt
2a110 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
2a120 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 73 71   return rc;.  sq
2a130 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
2a140 53 74 6d 74 2c 20 31 2c 20 46 54 53 5f 53 54 41  Stmt, 1, FTS_STA
2a150 54 5f 41 55 54 4f 49 4e 43 52 4d 45 52 47 45 29  T_AUTOINCRMERGE)
2a160 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ;.  sqlite3_bind
2a170 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32 2c 20 70  _int(pStmt, 2, p
2a180 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d 65 72 67 65  ->nAutoincrmerge
2a190 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65  );.  sqlite3_ste
2a1a0 70 28 70 53 74 6d 74 29 3b 0a 20 20 72 63 20 3d  p(pStmt);.  rc =
2a1b0 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
2a1c0 53 74 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  Stmt);.  return 
2a1d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
2a1e0 75 72 6e 20 61 20 36 34 2d 62 69 74 20 63 68 65  urn a 64-bit che
2a1f0 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 46 54  cksum for the FT
2a200 53 20 69 6e 64 65 78 20 65 6e 74 72 79 20 73 70  S index entry sp
2a210 65 63 69 66 69 65 64 20 62 79 20 74 68 65 0a 2a  ecified by the.*
2a220 2a 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  * arguments to t
2a230 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
2a240 0a 73 74 61 74 69 63 20 75 36 34 20 66 74 73 33  .static u64 fts3
2a250 43 68 65 63 6b 73 75 6d 45 6e 74 72 79 28 0a 20  ChecksumEntry(. 
2a260 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
2a270 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
2a280 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
2a290 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
2a2a0 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e   term */.  int n
2a2b0 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
2a2c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2a2d0 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62  ze of zTerm in b
2a2e0 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ytes */.  int iL
2a2f0 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20 20  angid,          
2a300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e            /* Lan
2a310 67 75 61 67 65 20 69 64 20 66 6f 72 20 63 75 72  guage id for cur
2a320 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  rent row */.  in
2a330 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20 20 20  t iIndex,       
2a340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a350 20 49 6e 64 65 78 20 28 30 2e 2e 46 74 73 33 54   Index (0..Fts3T
2a360 61 62 6c 65 2e 6e 49 6e 64 65 78 2d 31 29 20 2a  able.nIndex-1) *
2a370 2f 0a 20 20 69 36 34 20 69 44 6f 63 69 64 2c 20  /.  i64 iDocid, 
2a380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a390 20 20 20 20 2f 2a 20 44 6f 63 69 64 20 66 6f 72      /* Docid for
2a3a0 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 2a 2f   current row. */
2a3b0 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20  .  int iCol,    
2a3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3d0 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
2a3e0 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f  ber */.  int iPo
2a3f0 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
2a400 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69           /* Posi
2a410 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  tion */.){.  int
2a420 20 69 3b 0a 20 20 75 36 34 20 72 65 74 20 3d 20   i;.  u64 ret = 
2a430 28 75 36 34 29 69 44 6f 63 69 64 3b 0a 0a 20 20  (u64)iDocid;..  
2a440 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20  ret += (ret<<3) 
2a450 2b 20 69 4c 61 6e 67 69 64 3b 0a 20 20 72 65 74  + iLangid;.  ret
2a460 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 69   += (ret<<3) + i
2a470 49 6e 64 65 78 3b 0a 20 20 72 65 74 20 2b 3d 20  Index;.  ret += 
2a480 28 72 65 74 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b  (ret<<3) + iCol;
2a490 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c  .  ret += (ret<<
2a4a0 33 29 20 2b 20 69 50 6f 73 3b 0a 20 20 66 6f 72  3) + iPos;.  for
2a4b0 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69  (i=0; i<nTerm; i
2a4c0 2b 2b 29 20 72 65 74 20 2b 3d 20 28 72 65 74 3c  ++) ret += (ret<
2a4d0 3c 33 29 20 2b 20 7a 54 65 72 6d 5b 69 5d 3b 0a  <3) + zTerm[i];.
2a4e0 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
2a4f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
2a500 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 61 6c 6c   checksum of all
2a510 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
2a520 46 54 53 20 69 6e 64 65 78 20 74 68 61 74 20 63  FTS index that c
2a530 6f 72 72 65 73 70 6f 6e 64 20 74 6f 0a 2a 2a 20  orrespond to.** 
2a540 6c 61 6e 67 75 61 67 65 20 69 64 20 69 4c 61 6e  language id iLan
2a550 67 69 64 2e 20 54 68 65 20 63 68 65 63 6b 73 75  gid. The checksu
2a560 6d 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20  m is calculated 
2a570 62 79 20 58 4f 52 69 6e 67 20 74 68 65 20 63 68  by XORing the ch
2a580 65 63 6b 73 75 6d 73 0a 2a 2a 20 6f 66 20 65 61  ecksums.** of ea
2a590 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 65 6e  ch individual en
2a5a0 74 72 79 20 28 73 65 65 20 66 74 73 33 43 68 65  try (see fts3Che
2a5b0 63 6b 73 75 6d 45 6e 74 72 79 28 29 29 20 74 6f  cksumEntry()) to
2a5c0 67 65 74 68 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  gether..**.** If
2a5d0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65   successful, the
2a5e0 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   checksum value 
2a5f0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
2a600 2a 70 52 63 20 73 65 74 20 74 6f 20 53 51 4c 49  *pRc set to SQLI
2a610 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77  TE_OK..** Otherw
2a620 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  ise, if an error
2a630 20 6f 63 63 75 72 73 2c 20 2a 70 52 63 20 69 73   occurs, *pRc is
2a640 20 73 65 74 20 74 6f 20 61 6e 20 53 51 4c 69 74   set to an SQLit
2a650 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68  e error code. Th
2a660 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  e.** return valu
2a670 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69  e is undefined i
2a680 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
2a690 73 74 61 74 69 63 20 75 36 34 20 66 74 73 33 43  static u64 fts3C
2a6a0 68 65 63 6b 73 75 6d 49 6e 64 65 78 28 0a 20 20  hecksumIndex(.  
2a6b0 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
2a6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6d0 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20 68 61  /* FTS3 table ha
2a6e0 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ndle */.  int iL
2a6f0 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20 20  angid,          
2a700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e            /* Lan
2a710 67 75 61 67 65 20 69 64 20 74 6f 20 72 65 74 75  guage id to retu
2a720 72 6e 20 63 6b 73 75 6d 20 66 6f 72 20 2a 2f 0a  rn cksum for */.
2a730 20 20 69 6e 74 20 69 49 6e 64 65 78 2c 20 20 20    int iIndex,   
2a740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a750 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63 6b    /* Index to ck
2a760 73 75 6d 20 28 30 2e 2e 70 2d 3e 6e 49 6e 64 65  sum (0..p->nInde
2a770 78 2d 31 29 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  x-1) */.  int *p
2a780 52 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc              
2a790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2a7a0 3a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  : Return code */
2a7b0 0a 29 7b 0a 20 20 46 74 73 33 53 65 67 46 69 6c  .){.  Fts3SegFil
2a7c0 74 65 72 20 66 69 6c 74 65 72 3b 0a 20 20 46 74  ter filter;.  Ft
2a7d0 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
2a7e0 20 63 73 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   csr;.  int rc;.
2a7f0 20 20 75 36 34 20 63 6b 73 75 6d 20 3d 20 30 3b    u64 cksum = 0;
2a800 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 63  ..  assert( *pRc
2a810 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
2a820 20 20 6d 65 6d 73 65 74 28 26 66 69 6c 74 65 72    memset(&filter
2a830 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c 74  , 0, sizeof(filt
2a840 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  er));.  memset(&
2a850 63 73 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63  csr, 0, sizeof(c
2a860 73 72 29 29 3b 0a 20 20 66 69 6c 74 65 72 2e 66  sr));.  filter.f
2a870 6c 61 67 73 20 3d 20 20 46 54 53 33 5f 53 45 47  lags =  FTS3_SEG
2a880 4d 45 4e 54 5f 52 45 51 55 49 52 45 5f 50 4f 53  MENT_REQUIRE_POS
2a890 7c 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 49 47  |FTS3_SEGMENT_IG
2a8a0 4e 4f 52 45 5f 45 4d 50 54 59 3b 0a 20 20 66 69  NORE_EMPTY;.  fi
2a8b0 6c 74 65 72 2e 66 6c 61 67 73 20 7c 3d 20 46 54  lter.flags |= FT
2a8c0 53 33 5f 53 45 47 4d 45 4e 54 5f 53 43 41 4e 3b  S3_SEGMENT_SCAN;
2a8d0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
2a8e0 46 74 73 33 53 65 67 52 65 61 64 65 72 43 75 72  Fts3SegReaderCur
2a8f0 73 6f 72 28 0a 20 20 20 20 20 20 70 2c 20 69 4c  sor(.      p, iL
2a900 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 46  angid, iIndex, F
2a910 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c  TS3_SEGCURSOR_AL
2a920 4c 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 26 63  L, 0, 0, 0, 1,&c
2a930 73 72 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  sr.  );.  if( rc
2a940 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2a950 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
2a960 74 73 33 53 65 67 52 65 61 64 65 72 53 74 61 72  ts3SegReaderStar
2a970 74 28 70 2c 20 26 63 73 72 2c 20 26 66 69 6c 74  t(p, &csr, &filt
2a980 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  er);.  }..  if( 
2a990 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2a9a0 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49  .    while( SQLI
2a9b0 54 45 5f 52 4f 57 3d 3d 28 72 63 20 3d 20 73 71  TE_ROW==(rc = sq
2a9c0 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64  lite3Fts3SegRead
2a9d0 65 72 53 74 65 70 28 70 2c 20 26 63 73 72 29 29  erStep(p, &csr))
2a9e0 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
2a9f0 70 43 73 72 20 3d 20 63 73 72 2e 61 44 6f 63 6c  pCsr = csr.aDocl
2aa00 69 73 74 3b 0a 20 20 20 20 20 20 63 68 61 72 20  ist;.      char 
2aa10 2a 70 45 6e 64 20 3d 20 26 70 43 73 72 5b 63 73  *pEnd = &pCsr[cs
2aa20 72 2e 6e 44 6f 63 6c 69 73 74 5d 3b 0a 0a 20 20  r.nDoclist];..  
2aa30 20 20 20 20 69 36 34 20 69 44 6f 63 69 64 20 3d      i64 iDocid =
2aa40 20 30 3b 0a 20 20 20 20 20 20 69 36 34 20 69 43   0;.      i64 iC
2aa50 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 36  ol = 0;.      i6
2aa60 34 20 69 50 6f 73 20 3d 20 30 3b 0a 0a 20 20 20  4 iPos = 0;..   
2aa70 20 20 20 70 43 73 72 20 2b 3d 20 73 71 6c 69 74     pCsr += sqlit
2aa80 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28  e3Fts3GetVarint(
2aa90 70 43 73 72 2c 20 26 69 44 6f 63 69 64 29 3b 0a  pCsr, &iDocid);.
2aaa0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43 73        while( pCs
2aab0 72 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  r<pEnd ){.      
2aac0 20 20 69 36 34 20 69 56 61 6c 20 3d 20 30 3b 0a    i64 iVal = 0;.
2aad0 20 20 20 20 20 20 20 20 70 43 73 72 20 2b 3d 20          pCsr += 
2aae0 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61  sqlite3Fts3GetVa
2aaf0 72 69 6e 74 28 70 43 73 72 2c 20 26 69 56 61 6c  rint(pCsr, &iVal
2ab00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2ab10 43 73 72 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20  Csr<pEnd ){.    
2ab20 20 20 20 20 20 20 69 66 28 20 69 56 61 6c 3d 3d        if( iVal==
2ab30 30 20 7c 7c 20 69 56 61 6c 3d 3d 31 20 29 7b 0a  0 || iVal==1 ){.
2ab40 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c              iCol
2ab50 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2ab60 20 20 69 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20    iPos = 0;.    
2ab70 20 20 20 20 20 20 20 20 69 66 28 20 69 56 61 6c          if( iVal
2ab80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2ab90 20 20 70 43 73 72 20 2b 3d 20 73 71 6c 69 74 65    pCsr += sqlite
2aba0 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 70  3Fts3GetVarint(p
2abb0 43 73 72 2c 20 26 69 43 6f 6c 29 3b 0a 20 20 20  Csr, &iCol);.   
2abc0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2abd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2abe0 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  sr += sqlite3Fts
2abf0 33 47 65 74 56 61 72 69 6e 74 28 70 43 73 72 2c  3GetVarint(pCsr,
2ac00 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 20   &iVal);.       
2ac10 20 20 20 20 20 20 20 69 44 6f 63 69 64 20 2b 3d         iDocid +=
2ac20 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20   iVal;.         
2ac30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2ac40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2ac50 20 20 69 50 6f 73 20 2b 3d 20 28 69 56 61 6c 20    iPos += (iVal 
2ac60 2d 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  - 2);.          
2ac70 20 20 63 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 20    cksum = cksum 
2ac80 5e 20 66 74 73 33 43 68 65 63 6b 73 75 6d 45 6e  ^ fts3ChecksumEn
2ac90 74 72 79 28 0a 20 20 20 20 20 20 20 20 20 20 20  try(.           
2aca0 20 20 20 20 20 63 73 72 2e 7a 54 65 72 6d 2c 20       csr.zTerm, 
2acb0 63 73 72 2e 6e 54 65 72 6d 2c 20 69 4c 61 6e 67  csr.nTerm, iLang
2acc0 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 44 6f 63  id, iIndex, iDoc
2acd0 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  id,.            
2ace0 20 20 20 20 28 69 6e 74 29 69 43 6f 6c 2c 20 28      (int)iCol, (
2acf0 69 6e 74 29 69 50 6f 73 0a 20 20 20 20 20 20 20  int)iPos.       
2ad00 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
2ad10 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2ad20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2ad30 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67    sqlite3Fts3Seg
2ad40 52 65 61 64 65 72 46 69 6e 69 73 68 28 26 63 73  ReaderFinish(&cs
2ad50 72 29 3b 0a 0a 20 20 2a 70 52 63 20 3d 20 72 63  r);..  *pRc = rc
2ad60 3b 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d  ;.  return cksum
2ad70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
2ad80 20 69 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   if the contents
2ad90 20 6f 66 20 74 68 65 20 46 54 53 20 69 6e 64 65   of the FTS inde
2ada0 78 20 6d 61 74 63 68 20 74 68 65 20 63 75 72 72  x match the curr
2adb0 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ent contents of 
2adc0 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 74  the.** content t
2add0 61 62 6c 65 2e 20 49 66 20 6e 6f 20 65 72 72 6f  able. If no erro
2ade0 72 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  r occurs and the
2adf0 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6d 61 74   contents do mat
2ae00 63 68 2c 20 73 65 74 20 2a 70 62 4f 6b 0a 2a 2a  ch, set *pbOk.**
2ae10 20 74 6f 20 74 72 75 65 20 61 6e 64 20 72 65 74   to true and ret
2ae20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  urn SQLITE_OK. O
2ae30 72 20 69 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  r if the content
2ae40 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2c 20  s do not match, 
2ae50 73 65 74 20 2a 70 62 4f 6b 0a 2a 2a 20 74 6f 20  set *pbOk.** to 
2ae60 66 61 6c 73 65 20 62 65 66 6f 72 65 20 72 65 74  false before ret
2ae70 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
2ae80 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2ae90 20 28 65 2e 67 2e 20 61 6e 20 4f 4f 4d 20 6f 72   (e.g. an OOM or
2aea0 20 49 4f 20 65 72 72 6f 72 29 2c 20 72 65 74 75   IO error), retu
2aeb0 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
2aec0 6f 72 20 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65  or .** code. The
2aed0 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20   final value of 
2aee0 2a 70 62 4f 6b 20 69 73 20 75 6e 64 65 66 69 6e  *pbOk is undefin
2aef0 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
2af00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
2af10 74 73 33 49 6e 74 65 67 72 69 74 79 43 68 65 63  ts3IntegrityChec
2af20 6b 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20  k(Fts3Table *p, 
2af30 69 6e 74 20 2a 70 62 4f 6b 29 7b 0a 20 20 69 6e  int *pbOk){.  in
2af40 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2af50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2af60 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2af70 20 20 75 36 34 20 63 6b 73 75 6d 31 20 3d 20 30    u64 cksum1 = 0
2af80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2af90 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61    /* Checksum ba
2afa0 73 65 64 20 6f 6e 20 46 54 53 20 69 6e 64 65 78  sed on FTS index
2afb0 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 75   contents */.  u
2afc0 36 34 20 63 6b 73 75 6d 32 20 3d 20 30 3b 20 20  64 cksum2 = 0;  
2afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2afe0 2a 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65 64  * Checksum based
2aff0 20 6f 6e 20 25 5f 63 6f 6e 74 65 6e 74 20 63 6f   on %_content co
2b000 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 73 71 6c 69  ntents */.  sqli
2b010 74 65 33 5f 73 74 6d 74 20 2a 70 41 6c 6c 4c 61  te3_stmt *pAllLa
2b020 6e 67 69 64 20 3d 20 30 3b 20 20 20 2f 2a 20 53  ngid = 0;   /* S
2b030 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 65 74 75  tatement to retu
2b040 72 6e 20 61 6c 6c 20 6c 61 6e 67 75 61 67 65 2d  rn all language-
2b050 69 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69  ids */..  /* Thi
2b060 73 20 62 6c 6f 63 6b 20 63 61 6c 63 75 6c 61 74  s block calculat
2b070 65 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  es the checksum 
2b080 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
2b090 20 46 54 53 20 69 6e 64 65 78 2e 20 2a 2f 0a 20   FTS index. */. 
2b0a0 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
2b0b0 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f  t(p, SQL_SELECT_
2b0c0 41 4c 4c 5f 4c 41 4e 47 49 44 2c 20 26 70 41 6c  ALL_LANGID, &pAl
2b0d0 6c 4c 61 6e 67 69 64 2c 20 30 29 3b 0a 20 20 69  lLangid, 0);.  i
2b0e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b0f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
2b100 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
2b110 64 5f 69 6e 74 28 70 41 6c 6c 4c 61 6e 67 69 64  d_int(pAllLangid
2b120 2c 20 31 2c 20 70 2d 3e 69 50 72 65 76 4c 61 6e  , 1, p->iPrevLan
2b130 67 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  gid);.    sqlite
2b140 33 5f 62 69 6e 64 5f 69 6e 74 28 70 41 6c 6c 4c  3_bind_int(pAllL
2b150 61 6e 67 69 64 2c 20 32 2c 20 70 2d 3e 6e 49 6e  angid, 2, p->nIn
2b160 64 65 78 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  dex);.    while(
2b170 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2b180 26 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  & sqlite3_step(p
2b190 41 6c 6c 4c 61 6e 67 69 64 29 3d 3d 53 51 4c 49  AllLangid)==SQLI
2b1a0 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
2b1b0 69 6e 74 20 69 4c 61 6e 67 69 64 20 3d 20 73 71  int iLangid = sq
2b1c0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
2b1d0 28 70 41 6c 6c 4c 61 6e 67 69 64 2c 20 30 29 3b  (pAllLangid, 0);
2b1e0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
2b1f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2b200 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a  ->nIndex; i++){.
2b210 20 20 20 20 20 20 20 20 63 6b 73 75 6d 31 20 3d          cksum1 =
2b220 20 63 6b 73 75 6d 31 20 5e 20 66 74 73 33 43 68   cksum1 ^ fts3Ch
2b230 65 63 6b 73 75 6d 49 6e 64 65 78 28 70 2c 20 69  ecksumIndex(p, i
2b240 4c 61 6e 67 69 64 2c 20 69 2c 20 26 72 63 29 3b  Langid, i, &rc);
2b250 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2b260 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
2b270 5f 72 65 73 65 74 28 70 41 6c 6c 4c 61 6e 67 69  _reset(pAllLangi
2b280 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
2b290 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
2b2a0 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   rc2;.  }..  /* 
2b2b0 54 68 69 73 20 62 6c 6f 63 6b 20 63 61 6c 63 75  This block calcu
2b2c0 6c 61 74 65 73 20 74 68 65 20 63 68 65 63 6b 73  lates the checks
2b2d0 75 6d 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  um according to 
2b2e0 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61  the %_content ta
2b2f0 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ble */.  if( rc=
2b300 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b310 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69    sqlite3_tokeni
2b320 7a 65 72 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73 74  zer_module const
2b330 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 2d 3e 70   *pModule = p->p
2b340 54 6f 6b 65 6e 69 7a 65 72 2d 3e 70 4d 6f 64 75  Tokenizer->pModu
2b350 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  le;.    sqlite3_
2b360 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
2b370 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  .    char *zSql;
2b380 0a 20 20 20 0a 20 20 20 20 7a 53 71 6c 20 3d 20  .   .    zSql = 
2b390 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2b3a0 22 53 45 4c 45 43 54 20 25 73 22 20 2c 20 70 2d  "SELECT %s" , p-
2b3b0 3e 7a 52 65 61 64 45 78 70 72 6c 69 73 74 29 3b  >zReadExprlist);
2b3c0 0a 20 20 20 20 69 66 28 20 21 7a 53 71 6c 20 29  .    if( !zSql )
2b3d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2b3e0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
2b3f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
2b400 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
2b410 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
2b420 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
2b430 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2b440 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  ree(zSql);.    }
2b450 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ..    while( rc=
2b460 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51  =SQLITE_OK && SQ
2b470 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
2b480 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
2b490 0a 20 20 20 20 20 20 69 36 34 20 69 44 6f 63 69  .      i64 iDoci
2b4a0 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
2b4b0 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
2b4c0 30 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c  0);.      int iL
2b4d0 61 6e 67 20 3d 20 6c 61 6e 67 69 64 46 72 6f 6d  ang = langidFrom
2b4e0 53 65 6c 65 63 74 28 70 2c 20 70 53 74 6d 74 29  Select(p, pStmt)
2b4f0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  ;.      int iCol
2b500 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f  ;..      for(iCo
2b510 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  l=0; rc==SQLITE_
2b520 4f 4b 20 26 26 20 69 43 6f 6c 3c 70 2d 3e 6e 43  OK && iCol<p->nC
2b530 6f 6c 75 6d 6e 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  olumn; iCol++){.
2b540 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
2b550 62 4e 6f 74 69 6e 64 65 78 65 64 5b 69 43 6f 6c  bNotindexed[iCol
2b560 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
2b570 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
2b580 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ext = (const cha
2b590 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r *)sqlite3_colu
2b5a0 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  mn_text(pStmt, i
2b5b0 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  Col+1);.        
2b5c0 20 20 69 6e 74 20 6e 54 65 78 74 20 3d 20 73 71    int nText = sq
2b5d0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
2b5e0 65 73 28 70 53 74 6d 74 2c 20 69 43 6f 6c 2b 31  es(pStmt, iCol+1
2b5f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
2b600 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 63  ite3_tokenizer_c
2b610 75 72 73 6f 72 20 2a 70 54 20 3d 20 30 3b 0a 0a  ursor *pT = 0;..
2b620 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2b630 71 6c 69 74 65 33 46 74 73 33 4f 70 65 6e 54 6f  qlite3Fts3OpenTo
2b640 6b 65 6e 69 7a 65 72 28 70 2d 3e 70 54 6f 6b 65  kenizer(p->pToke
2b650 6e 69 7a 65 72 2c 20 69 4c 61 6e 67 2c 20 7a 54  nizer, iLang, zT
2b660 65 78 74 2c 20 6e 54 65 78 74 2c 26 70 54 29 3b  ext, nText,&pT);
2b670 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
2b680 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b690 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
2b6a0 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 6f 6b 65  har const *zToke
2b6b0 6e 3b 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66  n;       /* Buff
2b6c0 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 6f  er containing to
2b6d0 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ken */.         
2b6e0 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 3d 20     int nToken = 
2b6f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
2b700 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
2b710 69 6e 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20  in token */.    
2b720 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 75 6d          int iDum
2b730 31 20 3d 20 30 2c 20 69 44 75 6d 32 20 3d 20 30  1 = 0, iDum2 = 0
2b740 3b 20 2f 2a 20 44 75 6d 6d 79 20 76 61 72 69 61  ; /* Dummy varia
2b750 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  bles */.        
2b760 20 20 20 20 69 6e 74 20 69 50 6f 73 20 3d 20 30      int iPos = 0
2b770 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2b780 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b   Position of tok
2b790 65 6e 20 69 6e 20 7a 54 65 78 74 20 2a 2f 0a 0a  en in zText */..
2b7a0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2b7b0 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78 74 28   pModule->xNext(
2b7c0 70 54 2c 20 26 7a 54 6f 6b 65 6e 2c 20 26 6e 54  pT, &zToken, &nT
2b7d0 6f 6b 65 6e 2c 20 26 69 44 75 6d 31 2c 20 26 69  oken, &iDum1, &i
2b7e0 44 75 6d 32 2c 20 26 69 50 6f 73 29 3b 0a 20 20  Dum2, &iPos);.  
2b7f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2b800 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b810 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
2b820 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
2b830 20 20 63 6b 73 75 6d 32 20 3d 20 63 6b 73 75 6d    cksum2 = cksum
2b840 32 20 5e 20 66 74 73 33 43 68 65 63 6b 73 75 6d  2 ^ fts3Checksum
2b850 45 6e 74 72 79 28 0a 20 20 20 20 20 20 20 20 20  Entry(.         
2b860 20 20 20 20 20 20 20 20 20 7a 54 6f 6b 65 6e 2c           zToken,
2b870 20 6e 54 6f 6b 65 6e 2c 20 69 4c 61 6e 67 2c 20   nToken, iLang, 
2b880 30 2c 20 69 44 6f 63 69 64 2c 20 69 43 6f 6c 2c  0, iDocid, iCol,
2b890 20 69 50 6f 73 0a 20 20 20 20 20 20 20 20 20 20   iPos.          
2b8a0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
2b8b0 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
2b8c0 70 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b 29 7b  p->nIndex; i++){
2b8d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b8e0 20 69 66 28 20 70 2d 3e 61 49 6e 64 65 78 5b 69   if( p->aIndex[i
2b8f0 5d 2e 6e 50 72 65 66 69 78 3c 3d 6e 54 6f 6b 65  ].nPrefix<=nToke
2b900 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
2b910 20 20 20 20 20 20 20 63 6b 73 75 6d 32 20 3d 20         cksum2 = 
2b920 63 6b 73 75 6d 32 20 5e 20 66 74 73 33 43 68 65  cksum2 ^ fts3Che
2b930 63 6b 73 75 6d 45 6e 74 72 79 28 0a 20 20 20 20  cksumEntry(.    
2b940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b950 20 20 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 61 49 6e    zToken, p->aIn
2b960 64 65 78 5b 69 5d 2e 6e 50 72 65 66 69 78 2c 20  dex[i].nPrefix, 
2b970 69 4c 61 6e 67 2c 20 69 2c 20 69 44 6f 63 69 64  iLang, i, iDocid
2b980 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 0a 20 20 20  , iCol, iPos.   
2b990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29                 )
2b9a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2b9b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2b9c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2b9d0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2b9e0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 20 29          if( pT )
2b9f0 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65   pModule->xClose
2ba00 28 70 54 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (pT);.          
2ba10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
2ba20 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ONE ) rc = SQLIT
2ba30 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  E_OK;.        }.
2ba40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2ba50 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
2ba60 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a  ize(pStmt);.  }.
2ba70 0a 20 20 2a 70 62 4f 6b 20 3d 20 28 63 6b 73 75  .  *pbOk = (cksu
2ba80 6d 31 3d 3d 63 6b 73 75 6d 32 29 3b 0a 20 20 72  m1==cksum2);.  r
2ba90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2baa0 2a 2a 20 52 75 6e 20 74 68 65 20 69 6e 74 65 67  ** Run the integ
2bab0 72 69 74 79 2d 63 68 65 63 6b 2e 20 49 66 20 6e  rity-check. If n
2bac0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61  o error occurs a
2bad0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  nd the current c
2bae0 6f 6e 74 65 6e 74 73 20 6f 66 0a 2a 2a 20 74 68  ontents of.** th
2baf0 65 20 46 54 53 20 69 6e 64 65 78 20 61 72 65 20  e FTS index are 
2bb00 63 6f 72 72 65 63 74 2c 20 72 65 74 75 72 6e 20  correct, return 
2bb10 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 72 2c 20 69  SQLITE_OK. Or, i
2bb20 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  f the contents o
2bb30 66 20 74 68 65 0a 2a 2a 20 46 54 53 20 69 6e 64  f the.** FTS ind
2bb40 65 78 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74  ex are incorrect
2bb50 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
2bb60 43 4f 52 52 55 50 54 5f 56 54 41 42 2e 0a 2a 2a  CORRUPT_VTAB..**
2bb70 0a 2a 2a 20 4f 72 2c 20 69 66 20 61 6e 20 65 72  .** Or, if an er
2bb80 72 6f 72 20 28 65 2e 67 2e 20 61 6e 20 4f 4f 4d  ror (e.g. an OOM
2bb90 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 6f 63   or IO error) oc
2bba0 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20  curs, return an 
2bbb0 53 51 4c 69 74 65 20 0a 2a 2a 20 65 72 72 6f 72  SQLite .** error
2bbc0 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   code..**.** The
2bbd0 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b   integrity-check
2bbe0 20 77 6f 72 6b 73 20 61 73 20 66 6f 6c 6c 6f 77   works as follow
2bbf0 73 2e 20 46 6f 72 20 65 61 63 68 20 74 6f 6b 65  s. For each toke
2bc00 6e 20 61 6e 64 20 69 6e 64 65 78 65 64 20 74 6f  n and indexed to
2bc10 6b 65 6e 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e  ken.** prefix in
2bc20 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 73 65   the document se
2bc30 74 2c 20 61 20 36 34 2d 62 69 74 20 63 68 65 63  t, a 64-bit chec
2bc40 6b 73 75 6d 20 69 73 20 63 61 6c 63 75 6c 61 74  ksum is calculat
2bc50 65 64 20 28 62 79 20 63 6f 64 65 0a 2a 2a 20 69  ed (by code.** i
2bc60 6e 20 66 74 73 33 43 68 65 63 6b 73 75 6d 45 6e  n fts3ChecksumEn
2bc70 74 72 79 28 29 29 20 62 61 73 65 64 20 6f 6e 20  try()) based on 
2bc80 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
2bc90 2a 0a 2a 2a 20 20 20 20 20 2b 20 54 68 65 20 69  *.**     + The i
2bca0 6e 64 65 78 20 6e 75 6d 62 65 72 20 28 30 20 66  ndex number (0 f
2bcb0 6f 72 20 74 68 65 20 6d 61 69 6e 20 69 6e 64 65  or the main inde
2bcc0 78 2c 20 31 20 66 6f 72 20 74 68 65 20 66 69 72  x, 1 for the fir
2bcd0 73 74 20 70 72 65 66 69 78 0a 2a 2a 20 20 20 20  st prefix.**    
2bce0 20 20 20 69 6e 64 65 78 20 65 74 63 2e 29 2c 0a     index etc.),.
2bcf0 2a 2a 20 20 20 20 20 2b 20 54 68 65 20 74 6f 6b  **     + The tok
2bd00 65 6e 20 28 6f 72 20 74 6f 6b 65 6e 20 70 72 65  en (or token pre
2bd10 66 69 78 29 20 74 65 78 74 20 69 74 73 65 6c 66  fix) text itself
2bd20 2c 20 0a 2a 2a 20 20 20 20 20 2b 20 54 68 65 20  , .**     + The 
2bd30 6c 61 6e 67 75 61 67 65 2d 69 64 20 6f 66 20 74  language-id of t
2bd40 68 65 20 72 6f 77 20 69 74 20 61 70 70 65 61 72  he row it appear
2bd50 73 20 69 6e 2c 0a 2a 2a 20 20 20 20 20 2b 20 54  s in,.**     + T
2bd60 68 65 20 64 6f 63 69 64 20 6f 66 20 74 68 65 20  he docid of the 
2bd70 72 6f 77 20 69 74 20 61 70 70 65 61 72 73 20 69  row it appears i
2bd80 6e 2c 0a 2a 2a 20 20 20 20 20 2b 20 54 68 65 20  n,.**     + The 
2bd90 63 6f 6c 75 6d 6e 20 69 74 20 61 70 70 65 61 72  column it appear
2bda0 73 20 69 6e 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  s in, and.**    
2bdb0 20 2b 20 54 68 65 20 74 6f 6b 65 6e 73 20 70 6f   + The tokens po
2bdc0 73 69 74 69 6f 6e 20 77 69 74 68 69 6e 20 74 68  sition within th
2bdd0 61 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a  at column..**.**
2bde0 20 54 68 65 20 63 68 65 63 6b 73 75 6d 73 20 66   The checksums f
2bdf0 6f 72 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  or all entries i
2be00 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20  n the index are 
2be10 58 4f 52 65 64 20 74 6f 67 65 74 68 65 72 20 74  XORed together t
2be20 6f 20 63 72 65 61 74 65 0a 2a 2a 20 61 20 73 69  o create.** a si
2be30 6e 67 6c 65 20 63 68 65 63 6b 73 75 6d 20 66 6f  ngle checksum fo
2be40 72 20 74 68 65 20 65 6e 74 69 72 65 20 69 6e 64  r the entire ind
2be50 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ex..**.** The in
2be60 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 63 6f  tegrity-check co
2be70 64 65 20 63 61 6c 63 75 6c 61 74 65 73 20 74 68  de calculates th
2be80 65 20 73 61 6d 65 20 63 68 65 63 6b 73 75 6d 20  e same checksum 
2be90 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a 2a 0a  in two ways:.**.
2bea0 2a 2a 20 20 20 20 20 31 2e 20 42 79 20 73 63 61  **     1. By sca
2beb0 6e 6e 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  nning the conten
2bec0 74 73 20 6f 66 20 74 68 65 20 46 54 53 20 69 6e  ts of the FTS in
2bed0 64 65 78 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20  dex, and .**    
2bee0 20 32 2e 20 42 79 20 73 63 61 6e 6e 69 6e 67 20   2. By scanning 
2bef0 61 6e 64 20 74 6f 6b 65 6e 69 7a 69 6e 67 20 74  and tokenizing t
2bf00 68 65 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65  he content table
2bf10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74  ..**.** If the t
2bf20 77 6f 20 63 68 65 63 6b 73 75 6d 73 20 61 72 65  wo checksums are
2bf30 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 20   identical, the 
2bf40 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20  integrity-check 
2bf50 69 73 20 64 65 65 6d 65 64 20 74 6f 20 68 61 76  is deemed to hav
2bf60 65 0a 2a 2a 20 70 61 73 73 65 64 2e 0a 2a 2f 0a  e.** passed..*/.
2bf70 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 44  static int fts3D
2bf80 6f 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28  oIntegrityCheck(
2bf90 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20  .  Fts3Table *p 
2bfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bfb0 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65     /* FTS3 table
2bfc0 20 68 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a 20 20   handle */.){.  
2bfd0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 4f  int rc;.  int bO
2bfe0 6b 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 66 74  k = 0;.  rc = ft
2bff0 73 33 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  s3IntegrityCheck
2c000 28 70 2c 20 26 62 4f 6b 29 3b 0a 20 20 69 66 28  (p, &bOk);.  if(
2c010 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2c020 26 20 62 4f 6b 3d 3d 30 20 29 20 72 63 20 3d 20  & bOk==0 ) rc = 
2c030 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41 42  FTS_CORRUPT_VTAB
2c040 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2c050 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20 61  ../*.** Handle a
2c060 20 27 73 70 65 63 69 61 6c 27 20 49 4e 53 45 52   'special' INSER
2c070 54 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  T of the form:.*
2c080 2a 0a 2a 2a 20 20 20 22 49 4e 53 45 52 54 20 49  *.**   "INSERT I
2c090 4e 54 4f 20 74 62 6c 28 74 62 6c 29 20 56 41 4c  NTO tbl(tbl) VAL
2c0a0 55 45 53 28 3c 65 78 70 72 3e 29 22 0a 2a 2a 0a  UES(<expr>)".**.
2c0b0 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 56 61 6c  ** Argument pVal
2c0c0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72 65   contains the re
2c0d0 73 75 6c 74 20 6f 66 20 3c 65 78 70 72 3e 2e 20  sult of <expr>. 
2c0e0 43 75 72 72 65 6e 74 6c 79 20 74 68 65 20 6f 6e  Currently the on
2c0f0 6c 79 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 66 75  ly .** meaningfu
2c100 6c 20 76 61 6c 75 65 20 74 6f 20 69 6e 73 65 72  l value to inser
2c110 74 20 69 73 20 74 68 65 20 74 65 78 74 20 27 6f  t is the text 'o
2c120 70 74 69 6d 69 7a 65 27 2e 0a 2a 2f 0a 73 74 61  ptimize'..*/.sta
2c130 74 69 63 20 69 6e 74 20 66 74 73 33 53 70 65 63  tic int fts3Spec
2c140 69 61 6c 49 6e 73 65 72 74 28 46 74 73 33 54 61  ialInsert(Fts3Ta
2c150 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  ble *p, sqlite3_
2c160 76 61 6c 75 65 20 2a 70 56 61 6c 29 7b 0a 20 20  value *pVal){.  
2c170 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
2c180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c190 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
2c1a0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2c1b0 7a 56 61 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68  zVal = (const ch
2c1c0 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  ar *)sqlite3_val
2c1d0 75 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a 20  ue_text(pVal);. 
2c1e0 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69   int nVal = sqli
2c1f0 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
2c200 70 56 61 6c 29 3b 0a 0a 20 20 69 66 28 20 21 7a  pVal);..  if( !z
2c210 56 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Val ){.    retur
2c220 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2c230 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 61 6c    }else if( nVal
2c240 3d 3d 38 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  ==8 && 0==sqlite
2c250 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c  3_strnicmp(zVal,
2c260 20 22 6f 70 74 69 6d 69 7a 65 22 2c 20 38 29 20   "optimize", 8) 
2c270 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  ){.    rc = fts3
2c280 44 6f 4f 70 74 69 6d 69 7a 65 28 70 2c 20 30 29  DoOptimize(p, 0)
2c290 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56  ;.  }else if( nV
2c2a0 61 6c 3d 3d 37 20 26 26 20 30 3d 3d 73 71 6c 69  al==7 && 0==sqli
2c2b0 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61  te3_strnicmp(zVa
2c2c0 6c 2c 20 22 72 65 62 75 69 6c 64 22 2c 20 37 29  l, "rebuild", 7)
2c2d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
2c2e0 33 44 6f 52 65 62 75 69 6c 64 28 70 29 3b 0a 20  3DoRebuild(p);. 
2c2f0 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 61 6c 3d   }else if( nVal=
2c300 3d 31 35 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  =15 && 0==sqlite
2c310 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c  3_strnicmp(zVal,
2c320 20 22 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63   "integrity-chec
2c330 6b 22 2c 20 31 35 29 20 29 7b 0a 20 20 20 20 72  k", 15) ){.    r
2c340 63 20 3d 20 66 74 73 33 44 6f 49 6e 74 65 67 72  c = fts3DoIntegr
2c350 69 74 79 43 68 65 63 6b 28 70 29 3b 0a 20 20 7d  ityCheck(p);.  }
2c360 65 6c 73 65 20 69 66 28 20 6e 56 61 6c 3e 36 20  else if( nVal>6 
2c370 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  && 0==sqlite3_st
2c380 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22 6d 65  rnicmp(zVal, "me
2c390 72 67 65 3d 22 2c 20 36 29 20 29 7b 0a 20 20 20  rge=", 6) ){.   
2c3a0 20 72 63 20 3d 20 66 74 73 33 44 6f 49 6e 63 72   rc = fts3DoIncr
2c3b0 6d 65 72 67 65 28 70 2c 20 26 7a 56 61 6c 5b 36  merge(p, &zVal[6
2c3c0 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ]);.  }else if( 
2c3d0 6e 56 61 6c 3e 31 30 20 26 26 20 30 3d 3d 73 71  nVal>10 && 0==sq
2c3e0 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a  lite3_strnicmp(z
2c3f0 56 61 6c 2c 20 22 61 75 74 6f 6d 65 72 67 65 3d  Val, "automerge=
2c400 22 2c 20 31 30 29 20 29 7b 0a 20 20 20 20 72 63  ", 10) ){.    rc
2c410 20 3d 20 66 74 73 33 44 6f 41 75 74 6f 69 6e 63   = fts3DoAutoinc
2c420 72 6d 65 72 67 65 28 70 2c 20 26 7a 56 61 6c 5b  rmerge(p, &zVal[
2c430 31 30 5d 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  10]);.#ifdef SQL
2c440 49 54 45 5f 54 45 53 54 0a 20 20 7d 65 6c 73 65  ITE_TEST.  }else
2c450 20 69 66 28 20 6e 56 61 6c 3e 39 20 26 26 20 30   if( nVal>9 && 0
2c460 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ==sqlite3_strnic
2c470 6d 70 28 7a 56 61 6c 2c 20 22 6e 6f 64 65 73 69  mp(zVal, "nodesi
2c480 7a 65 3d 22 2c 20 39 29 20 29 7b 0a 20 20 20 20  ze=", 9) ){.    
2c490 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 3d 20 61  p->nNodeSize = a
2c4a0 74 6f 69 28 26 7a 56 61 6c 5b 39 5d 29 3b 0a 20  toi(&zVal[9]);. 
2c4b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2c4c0 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  K;.  }else if( n
2c4d0 56 61 6c 3e 31 31 20 26 26 20 30 3d 3d 73 71 6c  Val>11 && 0==sql
2c4e0 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56  ite3_strnicmp(zV
2c4f0 61 6c 2c 20 22 6d 61 78 70 65 6e 64 69 6e 67 3d  al, "maxpending=
2c500 22 2c 20 39 29 20 29 7b 0a 20 20 20 20 70 2d 3e  ", 9) ){.    p->
2c510 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61 74 61 20  nMaxPendingData 
2c520 3d 20 61 74 6f 69 28 26 7a 56 61 6c 5b 31 31 5d  = atoi(&zVal[11]
2c530 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
2c540 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
2c550 66 28 20 6e 56 61 6c 3e 32 31 20 26 26 20 30 3d  f( nVal>21 && 0=
2c560 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d  =sqlite3_strnicm
2c570 70 28 7a 56 61 6c 2c 20 22 74 65 73 74 2d 6e 6f  p(zVal, "test-no
2c580 2d 69 6e 63 72 2d 64 6f 63 6c 69 73 74 3d 22 2c  -incr-doclist=",
2c590 20 32 31 29 20 29 7b 0a 20 20 20 20 70 2d 3e 62   21) ){.    p->b
2c5a0 4e 6f 49 6e 63 72 44 6f 63 6c 69 73 74 20 3d 20  NoIncrDoclist = 
2c5b0 61 74 6f 69 28 26 7a 56 61 6c 5b 32 31 5d 29 3b  atoi(&zVal[21]);
2c5c0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2c5d0 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  _OK;.#endif.  }e
2c5e0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
2c5f0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
2c600 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2c610 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2c620 44 49 53 41 42 4c 45 5f 46 54 53 34 5f 44 45 46  DISABLE_FTS4_DEF
2c630 45 52 52 45 44 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  ERRED./*.** Dele
2c640 74 65 20 61 6c 6c 20 63 61 63 68 65 64 20 64 65  te all cached de
2c650 66 65 72 72 65 64 20 64 6f 63 6c 69 73 74 73 2e  ferred doclists.
2c660 20 44 65 66 65 72 72 65 64 20 64 6f 63 6c 69 73   Deferred doclis
2c670 74 73 20 61 72 65 20 63 61 63 68 65 64 0a 2a 2a  ts are cached.**
2c680 20 28 61 6c 6c 6f 63 61 74 65 64 29 20 62 79 20   (allocated) by 
2c690 74 68 65 20 73 71 6c 69 74 65 33 46 74 73 33 43  the sqlite3Fts3C
2c6a0 61 63 68 65 44 65 66 65 72 72 65 64 44 6f 63 6c  acheDeferredDocl
2c6b0 69 73 74 73 28 29 20 66 75 6e 63 74 69 6f 6e 2e  ists() function.
2c6c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2c6d0 46 74 73 33 46 72 65 65 44 65 66 65 72 72 65 64  Fts3FreeDeferred
2c6e0 44 6f 63 6c 69 73 74 73 28 46 74 73 33 43 75 72  Doclists(Fts3Cur
2c6f0 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 46 74  sor *pCsr){.  Ft
2c700 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20  s3DeferredToken 
2c710 2a 70 44 65 66 3b 0a 20 20 66 6f 72 28 70 44 65  *pDef;.  for(pDe
2c720 66 3d 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65  f=pCsr->pDeferre
2c730 64 3b 20 70 44 65 66 3b 20 70 44 65 66 3d 70 44  d; pDef; pDef=pD
2c740 65 66 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ef->pNext){.    
2c750 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 44  fts3PendingListD
2c760 65 6c 65 74 65 28 70 44 65 66 2d 3e 70 4c 69 73  elete(pDef->pLis
2c770 74 29 3b 0a 20 20 20 20 70 44 65 66 2d 3e 70 4c  t);.    pDef->pL
2c780 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ist = 0;.  }.}..
2c790 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 65  /*.** Free all e
2c7a0 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 70 43  ntries in the pC
2c7b0 73 72 2d 3e 70 44 65 66 66 65 72 65 64 20 6c 69  sr->pDeffered li
2c7c0 73 74 2e 20 45 6e 74 72 69 65 73 20 61 72 65 20  st. Entries are 
2c7d0 61 64 64 65 64 20 74 6f 20 0a 2a 2a 20 74 68 69  added to .** thi
2c7e0 73 20 6c 69 73 74 20 75 73 69 6e 67 20 73 71 6c  s list using sql
2c7f0 69 74 65 33 46 74 73 33 44 65 66 65 72 54 6f 6b  ite3Fts3DeferTok
2c800 65 6e 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  en()..*/.void sq
2c810 6c 69 74 65 33 46 74 73 33 46 72 65 65 44 65 66  lite3Fts3FreeDef
2c820 65 72 72 65 64 54 6f 6b 65 6e 73 28 46 74 73 33  erredTokens(Fts3
2c830 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20  Cursor *pCsr){. 
2c840 20 46 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b   Fts3DeferredTok
2c850 65 6e 20 2a 70 44 65 66 3b 0a 20 20 46 74 73 33  en *pDef;.  Fts3
2c860 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70  DeferredToken *p
2c870 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 44 65 66  Next;.  for(pDef
2c880 3d 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64  =pCsr->pDeferred
2c890 3b 20 70 44 65 66 3b 20 70 44 65 66 3d 70 4e 65  ; pDef; pDef=pNe
2c8a0 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
2c8b0 20 70 44 65 66 2d 3e 70 4e 65 78 74 3b 0a 20 20   pDef->pNext;.  
2c8c0 20 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73    fts3PendingLis
2c8d0 74 44 65 6c 65 74 65 28 70 44 65 66 2d 3e 70 4c  tDelete(pDef->pL
2c8e0 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
2c8f0 33 5f 66 72 65 65 28 70 44 65 66 29 3b 0a 20 20  3_free(pDef);.  
2c900 7d 0a 20 20 70 43 73 72 2d 3e 70 44 65 66 65 72  }.  pCsr->pDefer
2c910 72 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  red = 0;.}../*.*
2c920 2a 20 47 65 6e 65 72 61 74 65 20 64 65 66 65 72  * Generate defer
2c930 72 65 64 2d 64 6f 63 6c 69 73 74 73 20 66 6f 72  red-doclists for
2c940 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 69 6e 20 74   all tokens in t
2c950 68 65 20 70 43 73 72 2d 3e 70 44 65 66 65 72 72  he pCsr->pDeferr
2c960 65 64 20 6c 69 73 74 0a 2a 2a 20 62 61 73 65 64  ed list.** based
2c970 20 6f 6e 20 74 68 65 20 72 6f 77 20 74 68 61 74   on the row that
2c980 20 70 43 73 72 20 63 75 72 72 65 6e 74 6c 79 20   pCsr currently 
2c990 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a  points to..**.**
2c9a0 20 41 20 64 65 66 65 72 72 65 64 2d 64 6f 63 6c   A deferred-docl
2c9b0 69 73 74 20 69 73 20 6c 69 6b 65 20 61 6e 79 20  ist is like any 
2c9c0 6f 74 68 65 72 20 64 6f 63 6c 69 73 74 20 77 69  other doclist wi
2c9d0 74 68 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f  th position info
2c9e0 72 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 63 6c 75  rmation.** inclu
2c9f0 64 65 64 2c 20 65 78 63 65 70 74 20 74 68 61 74  ded, except that
2ca00 20 69 74 20 6f 6e 6c 79 20 63 6f 6e 74 61 69 6e   it only contain
2ca10 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 20  s entries for a 
2ca20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
2ca30 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 6e 6f 74 20  e.** table, not 
2ca40 66 6f 72 20 61 6c 6c 20 72 6f 77 73 2e 0a 2a 2f  for all rows..*/
2ca50 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
2ca60 43 61 63 68 65 44 65 66 65 72 72 65 64 44 6f 63  CacheDeferredDoc
2ca70 6c 69 73 74 73 28 46 74 73 33 43 75 72 73 6f 72  lists(Fts3Cursor
2ca80 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74 20 72   *pCsr){.  int r
2ca90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2caa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2cab0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
2cac0 66 28 20 70 43 73 72 2d 3e 70 44 65 66 65 72 72  f( pCsr->pDeferr
2cad0 65 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ed ){.    int i;
2cae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2caf0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
2cb00 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
2cb10 67 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  gh table columns
2cb20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
2cb30 69 6e 74 36 34 20 69 44 6f 63 69 64 3b 20 20 20  int64 iDocid;   
2cb40 20 20 20 20 20 20 2f 2a 20 44 6f 63 69 64 20 6f        /* Docid o
2cb50 66 20 74 68 65 20 72 6f 77 20 70 43 73 72 20 70  f the row pCsr p
2cb60 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 20 20 20 20  oints to */.    
2cb70 46 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65  Fts3DeferredToke
2cb80 6e 20 2a 70 44 65 66 3b 20 20 20 20 20 20 2f 2a  n *pDef;      /*
2cb90 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
2cba0 20 74 68 72 6f 75 67 68 20 64 65 66 65 72 72 65   through deferre
2cbb0 64 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20 0a 20  d tokens */.  . 
2cbc0 20 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20     Fts3Table *p 
2cbd0 3d 20 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70  = (Fts3Table *)p
2cbe0 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b  Csr->base.pVtab;
2cbf0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b  .    sqlite3_tok
2cc00 65 6e 69 7a 65 72 20 2a 70 54 20 3d 20 70 2d 3e  enizer *pT = p->
2cc10 70 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 20 20  pTokenizer;.    
2cc20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65  sqlite3_tokenize
2cc30 72 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73 74 20 2a  r_module const *
2cc40 70 4d 6f 64 75 6c 65 20 3d 20 70 54 2d 3e 70 4d  pModule = pT->pM
2cc50 6f 64 75 6c 65 3b 0a 20 20 20 0a 20 20 20 20 61  odule;.   .    a
2cc60 73 73 65 72 74 28 20 70 43 73 72 2d 3e 69 73 52  ssert( pCsr->isR
2cc70 65 71 75 69 72 65 53 65 65 6b 3d 3d 30 20 29 3b  equireSeek==0 );
2cc80 0a 20 20 20 20 69 44 6f 63 69 64 20 3d 20 73 71  .    iDocid = sq
2cc90 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
2cca0 36 34 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20  64(pCsr->pStmt, 
2ccb0 30 29 3b 0a 20 20 0a 20 20 20 20 66 6f 72 28 69  0);.  .    for(i
2ccc0 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e  =0; i<p->nColumn
2ccd0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2cce0 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  K; i++){.      i
2ccf0 66 28 20 70 2d 3e 61 62 4e 6f 74 69 6e 64 65 78  f( p->abNotindex
2cd00 65 64 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ed[i]==0 ){.    
2cd10 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2cd20 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63  zText = (const c
2cd30 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f  har *)sqlite3_co
2cd40 6c 75 6d 6e 5f 74 65 78 74 28 70 43 73 72 2d 3e  lumn_text(pCsr->
2cd50 70 53 74 6d 74 2c 20 69 2b 31 29 3b 0a 20 20 20  pStmt, i+1);.   
2cd60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b       sqlite3_tok
2cd70 65 6e 69 7a 65 72 5f 63 75 72 73 6f 72 20 2a 70  enizer_cursor *p
2cd80 54 43 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20  TC = 0;..       
2cd90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
2cda0 33 4f 70 65 6e 54 6f 6b 65 6e 69 7a 65 72 28 70  3OpenTokenizer(p
2cdb0 54 2c 20 70 43 73 72 2d 3e 69 4c 61 6e 67 69 64  T, pCsr->iLangid
2cdc0 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26 70 54  , zText, -1, &pT
2cdd0 43 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  C);.        whil
2cde0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
2cdf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68   ){.          ch
2ce00 61 72 20 63 6f 6e 73 74 20 2a 7a 54 6f 6b 65 6e  ar const *zToken
2ce10 3b 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65  ;       /* Buffe
2ce20 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 6f 6b  r containing tok
2ce30 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  en */.          
2ce40 69 6e 74 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 20  int nToken = 0; 
2ce50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2ce60 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
2ce70 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20  token */.       
2ce80 20 20 20 69 6e 74 20 69 44 75 6d 31 20 3d 20 30     int iDum1 = 0
2ce90 2c 20 69 44 75 6d 32 20 3d 20 30 3b 20 2f 2a 20  , iDum2 = 0; /* 
2cea0 44 75 6d 6d 79 20 76 61 72 69 61 62 6c 65 73 20  Dummy variables 
2ceb0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  */.          int
2cec0 20 69 50 6f 73 20 3d 20 30 3b 20 20 20 20 20 20   iPos = 0;      
2ced0 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69         /* Positi
2cee0 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20 7a  on of token in z
2cef0 54 65 78 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20  Text */..       
2cf00 20 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d     rc = pModule-
2cf10 3e 78 4e 65 78 74 28 70 54 43 2c 20 26 7a 54 6f  >xNext(pTC, &zTo
2cf20 6b 65 6e 2c 20 26 6e 54 6f 6b 65 6e 2c 20 26 69  ken, &nToken, &i
2cf30 44 75 6d 31 2c 20 26 69 44 75 6d 32 2c 20 26 69  Dum1, &iDum2, &i
2cf40 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Pos);.          
2cf50 66 6f 72 28 70 44 65 66 3d 70 43 73 72 2d 3e 70  for(pDef=pCsr->p
2cf60 44 65 66 65 72 72 65 64 3b 20 70 44 65 66 20 26  Deferred; pDef &
2cf70 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
2cf80 20 70 44 65 66 3d 70 44 65 66 2d 3e 70 4e 65 78   pDef=pDef->pNex
2cf90 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t){.            
2cfa0 46 74 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20  Fts3PhraseToken 
2cfb0 2a 70 50 54 20 3d 20 70 44 65 66 2d 3e 70 54 6f  *pPT = pDef->pTo
2cfc0 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ken;.           
2cfd0 20 69 66 28 20 28 70 44 65 66 2d 3e 69 43 6f 6c   if( (pDef->iCol
2cfe0 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 7c 7c 20  >=p->nColumn || 
2cff0 70 44 65 66 2d 3e 69 43 6f 6c 3d 3d 69 29 0a 20  pDef->iCol==i). 
2d000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
2d010 26 20 28 70 50 54 2d 3e 62 46 69 72 73 74 3d 3d  & (pPT->bFirst==
2d020 30 20 7c 7c 20 69 50 6f 73 3d 3d 30 29 0a 20 20  0 || iPos==0).  
2d030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
2d040 20 28 70 50 54 2d 3e 6e 3d 3d 6e 54 6f 6b 65 6e   (pPT->n==nToken
2d050 20 7c 7c 20 28 70 50 54 2d 3e 69 73 50 72 65 66   || (pPT->isPref
2d060 69 78 20 26 26 20 70 50 54 2d 3e 6e 3c 6e 54 6f  ix && pPT->n<nTo
2d070 6b 65 6e 29 29 0a 20 20 20 20 20 20 20 20 20 20  ken)).          
2d080 20 20 20 20 20 20 26 26 20 28 30 3d 3d 6d 65 6d        && (0==mem
2d090 63 6d 70 28 7a 54 6f 6b 65 6e 2c 20 70 50 54 2d  cmp(zToken, pPT-
2d0a0 3e 7a 2c 20 70 50 54 2d 3e 6e 29 29 0a 20 20 20  >z, pPT->n)).   
2d0b0 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
2d0c0 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 33              fts3
2d0d0 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e  PendingListAppen
2d0e0 64 28 26 70 44 65 66 2d 3e 70 4c 69 73 74 2c 20  d(&pDef->pList, 
2d0f0 69 44 6f 63 69 64 2c 20 69 2c 20 69 50 6f 73 2c  iDocid, i, iPos,
2d100 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20   &rc);.         
2d110 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2d120 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d130 20 20 20 69 66 28 20 70 54 43 20 29 20 70 4d 6f     if( pTC ) pMo
2d140 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 54 43  dule->xClose(pTC
2d150 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2d160 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
2d170 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2d180 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2d190 20 20 20 20 66 6f 72 28 70 44 65 66 3d 70 43 73      for(pDef=pCs
2d1a0 72 2d 3e 70 44 65 66 65 72 72 65 64 3b 20 70 44  r->pDeferred; pD
2d1b0 65 66 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ef && rc==SQLITE
2d1c0 5f 4f 4b 3b 20 70 44 65 66 3d 70 44 65 66 2d 3e  _OK; pDef=pDef->
2d1d0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
2d1e0 28 20 70 44 65 66 2d 3e 70 4c 69 73 74 20 29 7b  ( pDef->pList ){
2d1f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74  .        rc = ft
2d200 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70  s3PendingListApp
2d210 65 6e 64 56 61 72 69 6e 74 28 26 70 44 65 66 2d  endVarint(&pDef-
2d220 3e 70 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20  >pList, 0);.    
2d230 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2d240 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69   return rc;.}..i
2d250 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 44 65  nt sqlite3Fts3De
2d260 66 65 72 72 65 64 54 6f 6b 65 6e 4c 69 73 74 28  ferredTokenList(
2d270 0a 20 20 46 74 73 33 44 65 66 65 72 72 65 64 54  .  Fts3DeferredT
2d280 6f 6b 65 6e 20 2a 70 2c 20 0a 20 20 63 68 61 72  oken *p, .  char
2d290 20 2a 2a 70 70 44 61 74 61 2c 20 0a 20 20 69 6e   **ppData, .  in
2d2a0 74 20 2a 70 6e 44 61 74 61 0a 29 7b 0a 20 20 63  t *pnData.){.  c
2d2b0 68 61 72 20 2a 70 52 65 74 3b 0a 20 20 69 6e 74  har *pRet;.  int
2d2c0 20 6e 53 6b 69 70 3b 0a 20 20 73 71 6c 69 74 65   nSkip;.  sqlite
2d2d0 33 5f 69 6e 74 36 34 20 64 75 6d 6d 79 3b 0a 0a  3_int64 dummy;..
2d2e0 20 20 2a 70 70 44 61 74 61 20 3d 20 30 3b 0a 20    *ppData = 0;. 
2d2f0 20 2a 70 6e 44 61 74 61 20 3d 20 30 3b 0a 0a 20   *pnData = 0;.. 
2d300 20 69 66 28 20 70 2d 3e 70 4c 69 73 74 3d 3d 30   if( p->pList==0
2d310 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2d320 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
2d330 20 70 52 65 74 20 3d 20 28 63 68 61 72 20 2a 29   pRet = (char *)
2d340 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70  sqlite3_malloc(p
2d350 2d 3e 70 4c 69 73 74 2d 3e 6e 44 61 74 61 29 3b  ->pList->nData);
2d360 0a 20 20 69 66 28 20 21 70 52 65 74 20 29 20 72  .  if( !pRet ) r
2d370 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2d380 45 4d 3b 0a 0a 20 20 6e 53 6b 69 70 20 3d 20 73  EM;..  nSkip = s
2d390 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
2d3a0 69 6e 74 28 70 2d 3e 70 4c 69 73 74 2d 3e 61 44  int(p->pList->aD
2d3b0 61 74 61 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  ata, &dummy);.  
2d3c0 2a 70 6e 44 61 74 61 20 3d 20 70 2d 3e 70 4c 69  *pnData = p->pLi
2d3d0 73 74 2d 3e 6e 44 61 74 61 20 2d 20 6e 53 6b 69  st->nData - nSki
2d3e0 70 3b 0a 20 20 2a 70 70 44 61 74 61 20 3d 20 70  p;.  *ppData = p
2d3f0 52 65 74 3b 0a 20 20 0a 20 20 6d 65 6d 63 70 79  Ret;.  .  memcpy
2d400 28 70 52 65 74 2c 20 26 70 2d 3e 70 4c 69 73 74  (pRet, &p->pList
2d410 2d 3e 61 44 61 74 61 5b 6e 53 6b 69 70 5d 2c 20  ->aData[nSkip], 
2d420 2a 70 6e 44 61 74 61 29 3b 0a 20 20 72 65 74 75  *pnData);.  retu
2d430 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2d440 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e  ./*.** Add an en
2d450 74 72 79 20 66 6f 72 20 74 6f 6b 65 6e 20 70 54  try for token pT
2d460 6f 6b 65 6e 20 74 6f 20 74 68 65 20 70 43 73 72  oken to the pCsr
2d470 2d 3e 70 44 65 66 65 72 72 65 64 20 6c 69 73 74  ->pDeferred list
2d480 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2d490 46 74 73 33 44 65 66 65 72 54 6f 6b 65 6e 28 0a  Fts3DeferToken(.
2d4a0 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43    Fts3Cursor *pC
2d4b0 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sr,             
2d4c0 20 20 2f 2a 20 46 74 73 33 20 74 61 62 6c 65 20    /* Fts3 table 
2d4d0 63 75 72 73 6f 72 20 2a 2f 0a 20 20 46 74 73 33  cursor */.  Fts3
2d4e0 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70 54 6f  PhraseToken *pTo
2d4f0 6b 65 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ken,        /* T
2d500 6f 6b 65 6e 20 74 6f 20 64 65 66 65 72 20 2a 2f  oken to defer */
2d510 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20  .  int iCol     
2d520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d530 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 68 61     /* Column tha
2d540 74 20 74 6f 6b 65 6e 20 6d 75 73 74 20 61 70 70  t token must app
2d550 65 61 72 20 69 6e 20 28 6f 72 20 2d 31 29 20 2a  ear in (or -1) *
2d560 2f 0a 29 7b 0a 20 20 46 74 73 33 44 65 66 65 72  /.){.  Fts3Defer
2d570 72 65 64 54 6f 6b 65 6e 20 2a 70 44 65 66 65 72  redToken *pDefer
2d580 72 65 64 3b 0a 20 20 70 44 65 66 65 72 72 65 64  red;.  pDeferred
2d590 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
2d5a0 63 28 73 69 7a 65 6f 66 28 2a 70 44 65 66 65 72  c(sizeof(*pDefer
2d5b0 72 65 64 29 29 3b 0a 20 20 69 66 28 20 21 70 44  red));.  if( !pD
2d5c0 65 66 65 72 72 65 64 20 29 7b 0a 20 20 20 20 72  eferred ){.    r
2d5d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2d5e0 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  EM;.  }.  memset
2d5f0 28 70 44 65 66 65 72 72 65 64 2c 20 30 2c 20 73  (pDeferred, 0, s
2d600 69 7a 65 6f 66 28 2a 70 44 65 66 65 72 72 65 64  izeof(*pDeferred
2d610 29 29 3b 0a 20 20 70 44 65 66 65 72 72 65 64 2d  ));.  pDeferred-
2d620 3e 70 54 6f 6b 65 6e 20 3d 20 70 54 6f 6b 65 6e  >pToken = pToken
2d630 3b 0a 20 20 70 44 65 66 65 72 72 65 64 2d 3e 70  ;.  pDeferred->p
2d640 4e 65 78 74 20 3d 20 70 43 73 72 2d 3e 70 44 65  Next = pCsr->pDe
2d650 66 65 72 72 65 64 3b 20 0a 20 20 70 44 65 66 65  ferred; .  pDefe
2d660 72 72 65 64 2d 3e 69 43 6f 6c 20 3d 20 69 43 6f  rred->iCol = iCo
2d670 6c 3b 0a 20 20 70 43 73 72 2d 3e 70 44 65 66 65  l;.  pCsr->pDefe
2d680 72 72 65 64 20 3d 20 70 44 65 66 65 72 72 65 64  rred = pDeferred
2d690 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  ;..  assert( pTo
2d6a0 6b 65 6e 2d 3e 70 44 65 66 65 72 72 65 64 3d 3d  ken->pDeferred==
2d6b0 30 20 29 3b 0a 20 20 70 54 6f 6b 65 6e 2d 3e 70  0 );.  pToken->p
2d6c0 44 65 66 65 72 72 65 64 20 3d 20 70 44 65 66 65  Deferred = pDefe
2d6d0 72 72 65 64 3b 0a 0a 20 20 72 65 74 75 72 6e 20  rred;..  return 
2d6e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
2d6f0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74  dif../*.** SQLit
2d700 65 20 76 61 6c 75 65 20 70 52 6f 77 69 64 20 63  e value pRowid c
2d710 6f 6e 74 61 69 6e 73 20 74 68 65 20 72 6f 77 69  ontains the rowi
2d720 64 20 6f 66 20 61 20 72 6f 77 20 74 68 61 74 20  d of a row that 
2d730 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
2d740 65 0a 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20  e.** present in 
2d750 74 68 65 20 46 54 53 33 20 74 61 62 6c 65 2e 20  the FTS3 table. 
2d760 49 66 20 69 74 20 69 73 2c 20 64 65 6c 65 74 65  If it is, delete
2d770 20 69 74 20 61 6e 64 20 61 64 6a 75 73 74 20 74   it and adjust t
2d780 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  he contents.** o
2d790 66 20 73 75 62 73 69 64 75 61 72 79 20 64 61 74  f subsiduary dat
2d7a0 61 20 73 74 72 75 63 74 75 72 65 73 20 61 63 63  a structures acc
2d7b0 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61  ordingly..*/.sta
2d7c0 74 69 63 20 69 6e 74 20 66 74 73 33 44 65 6c 65  tic int fts3Dele
2d7d0 74 65 42 79 52 6f 77 69 64 28 0a 20 20 46 74 73  teByRowid(.  Fts
2d7e0 33 54 61 62 6c 65 20 2a 70 2c 20 0a 20 20 73 71  3Table *p, .  sq
2d7f0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 6f  lite3_value *pRo
2d800 77 69 64 2c 20 0a 20 20 69 6e 74 20 2a 70 6e 43  wid, .  int *pnC
2d810 68 6e 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  hng,            
2d820 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
2d830 54 3a 20 44 65 63 72 65 6d 65 6e 74 20 69 66 20  T: Decrement if 
2d840 72 6f 77 20 69 73 20 64 65 6c 65 74 65 64 20 2a  row is deleted *
2d850 2f 0a 20 20 75 33 32 20 2a 61 53 7a 44 65 6c 0a  /.  u32 *aSzDel.
2d860 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2d870 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2d880 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2d890 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 62 46 6f  ode */.  int bFo
2d8a0 75 6e 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  und = 0;        
2d8b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2d8c0 20 69 66 20 2a 70 52 6f 77 69 64 20 72 65 61 6c   if *pRowid real
2d8d0 6c 79 20 69 73 20 69 6e 20 74 68 65 20 74 61 62  ly is in the tab
2d8e0 6c 65 20 2a 2f 0a 0a 20 20 66 74 73 33 44 65 6c  le */..  fts3Del
2d8f0 65 74 65 54 65 72 6d 73 28 26 72 63 2c 20 70 2c  eteTerms(&rc, p,
2d900 20 70 52 6f 77 69 64 2c 20 61 53 7a 44 65 6c 2c   pRowid, aSzDel,
2d910 20 26 62 46 6f 75 6e 64 29 3b 0a 20 20 69 66 28   &bFound);.  if(
2d920 20 62 46 6f 75 6e 64 20 26 26 20 72 63 3d 3d 53   bFound && rc==S
2d930 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d940 69 6e 74 20 69 73 45 6d 70 74 79 20 3d 20 30 3b  int isEmpty = 0;
2d950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d960 20 44 65 6c 65 74 69 6e 67 20 2a 70 52 6f 77 69   Deleting *pRowi
2d970 64 20 6c 65 61 76 65 73 20 74 68 65 20 74 61 62  d leaves the tab
2d980 6c 65 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20  le empty */.    
2d990 72 63 20 3d 20 66 74 73 33 49 73 45 6d 70 74 79  rc = fts3IsEmpty
2d9a0 28 70 2c 20 70 52 6f 77 69 64 2c 20 26 69 73 45  (p, pRowid, &isE
2d9b0 6d 70 74 79 29 3b 0a 20 20 20 20 69 66 28 20 72  mpty);.    if( r
2d9c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2d9d0 20 20 20 20 20 20 69 66 28 20 69 73 45 6d 70 74        if( isEmpt
2d9e0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  y ){.        /* 
2d9f0 44 65 6c 65 74 69 6e 67 20 74 68 69 73 20 72 6f  Deleting this ro
2da00 77 20 6d 65 61 6e 73 20 74 68 65 20 77 68 6f 6c  w means the whol
2da10 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
2da20 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20  . In this case. 
2da30 20 20 20 20 20 20 20 2a 2a 20 64 65 6c 65 74 65         ** delete
2da40 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2da50 20 61 6c 6c 20 74 68 72 65 65 20 74 61 62 6c 65   all three table
2da60 73 20 61 6e 64 20 74 68 72 6f 77 20 61 77 61 79  s and throw away
2da70 20 61 6e 79 0a 20 20 20 20 20 20 20 20 2a 2a 20   any.        ** 
2da80 64 61 74 61 20 69 6e 20 74 68 65 20 70 65 6e 64  data in the pend
2da90 69 6e 67 54 65 72 6d 73 20 68 61 73 68 20 74 61  ingTerms hash ta
2daa0 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ble.  */.       
2dab0 20 72 63 20 3d 20 66 74 73 33 44 65 6c 65 74 65   rc = fts3Delete
2dac0 41 6c 6c 28 70 2c 20 31 29 3b 0a 20 20 20 20 20  All(p, 1);.     
2dad0 20 20 20 2a 70 6e 43 68 6e 67 20 3d 20 30 3b 0a     *pnChng = 0;.
2dae0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61          memset(a
2daf0 53 7a 44 65 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  SzDel, 0, sizeof
2db00 28 75 33 32 29 20 2a 20 28 70 2d 3e 6e 43 6f 6c  (u32) * (p->nCol
2db10 75 6d 6e 2b 31 29 20 2a 20 32 29 3b 0a 20 20 20  umn+1) * 2);.   
2db20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2db30 20 20 2a 70 6e 43 68 6e 67 20 3d 20 2a 70 6e 43    *pnChng = *pnC
2db40 68 6e 67 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  hng - 1;.       
2db50 20 69 66 28 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74   if( p->zContent
2db60 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tbl==0 ){.      
2db70 20 20 20 20 66 74 73 33 53 71 6c 45 78 65 63 28      fts3SqlExec(
2db80 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c 45  &rc, p, SQL_DELE
2db90 54 45 5f 43 4f 4e 54 45 4e 54 2c 20 26 70 52 6f  TE_CONTENT, &pRo
2dba0 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  wid);.        }.
2dbb0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62          if( p->b
2dbc0 48 61 73 44 6f 63 73 69 7a 65 20 29 7b 0a 20 20  HasDocsize ){.  
2dbd0 20 20 20 20 20 20 20 20 66 74 73 33 53 71 6c 45          fts3SqlE
2dbe0 78 65 63 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f  xec(&rc, p, SQL_
2dbf0 44 45 4c 45 54 45 5f 44 4f 43 53 49 5a 45 2c 20  DELETE_DOCSIZE, 
2dc00 26 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  &pRowid);.      
2dc10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2dc20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
2dc30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2dc40 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
2dc50 74 68 65 20 77 6f 72 6b 20 66 6f 72 20 74 68 65  the work for the
2dc60 20 78 55 70 64 61 74 65 20 6d 65 74 68 6f 64 20   xUpdate method 
2dc70 6f 66 20 46 54 53 33 20 76 69 72 74 75 61 6c 0a  of FTS3 virtual.
2dc80 2a 2a 20 74 61 62 6c 65 73 2e 20 54 68 65 20 73  ** tables. The s
2dc90 63 68 65 6d 61 20 6f 66 20 74 68 65 20 76 69 72  chema of the vir
2dca0 74 75 61 6c 20 74 61 62 6c 65 20 62 65 69 6e 67  tual table being
2dcb0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41  :.**.**     CREA
2dcc0 54 45 20 54 41 42 4c 45 20 3c 74 61 62 6c 65 20  TE TABLE <table 
2dcd0 6e 61 6d 65 3e 28 20 0a 2a 2a 20 20 20 20 20 20  name>( .**      
2dce0 20 3c 75 73 65 72 20 63 6f 6c 75 6d 6e 73 3e 2c   <user columns>,
2dcf0 0a 2a 2a 20 20 20 20 20 20 20 3c 74 61 62 6c 65  .**       <table
2dd00 20 6e 61 6d 65 3e 20 48 49 44 44 45 4e 2c 20 0a   name> HIDDEN, .
2dd10 2a 2a 20 20 20 20 20 20 20 64 6f 63 69 64 20 48  **       docid H
2dd20 49 44 44 45 4e 2c 20 0a 2a 2a 20 20 20 20 20 20  IDDEN, .**      
2dd30 20 3c 6c 61 6e 67 69 64 3e 20 48 49 44 44 45 4e   <langid> HIDDEN
2dd40 0a 2a 2a 20 20 20 20 20 29 3b 0a 2a 2a 0a 2a 2a  .**     );.**.**
2dd50 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
2dd60 46 74 73 33 55 70 64 61 74 65 4d 65 74 68 6f 64  Fts3UpdateMethod
2dd70 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  (.  sqlite3_vtab
2dd80 20 2a 70 56 74 61 62 2c 20 20 20 20 20 20 20 20   *pVtab,        
2dd90 20 20 20 20 2f 2a 20 46 54 53 33 20 76 74 61 62      /* FTS3 vtab
2dda0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
2ddb0 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20   nArg,          
2ddc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ddd0 53 69 7a 65 20 6f 66 20 61 72 67 75 6d 65 6e 74  Size of argument
2dde0 20 61 72 72 61 79 20 2a 2f 0a 20 20 73 71 6c 69   array */.  sqli
2ddf0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
2de00 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  l,          /* A
2de10 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74  rray of argument
2de20 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e  s */.  sqlite_in
2de30 74 36 34 20 2a 70 52 6f 77 69 64 20 20 20 20 20  t64 *pRowid     
2de40 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54         /* OUT: T
2de50 68 65 20 61 66 66 65 63 74 65 64 20 28 6f 72 20  he affected (or 
2de60 65 66 66 65 63 74 65 64 29 20 72 6f 77 69 64 20  effected) rowid 
2de70 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 54 61 62 6c  */.){.  Fts3Tabl
2de80 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c  e *p = (Fts3Tabl
2de90 65 20 2a 29 70 56 74 61 62 3b 0a 20 20 69 6e 74  e *)pVtab;.  int
2dea0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2deb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2dec0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
2ded0 20 75 33 32 20 2a 61 53 7a 49 6e 73 20 3d 20 30   u32 *aSzIns = 0
2dee0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2def0 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 69 6e 73   /* Sizes of ins
2df00 65 72 74 65 64 20 64 6f 63 75 6d 65 6e 74 73 20  erted documents 
2df10 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a 44 65 6c  */.  u32 *aSzDel
2df20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2df30 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66       /* Sizes of
2df40 20 64 65 6c 65 74 65 64 20 64 6f 63 75 6d 65 6e   deleted documen
2df50 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 6e  ts */.  int nChn
2df60 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
2df70 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 74 20 63          /* Net c
2df80 68 61 6e 67 65 20 69 6e 20 6e 75 6d 62 65 72 20  hange in number 
2df90 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 2a 2f 0a  of documents */.
2dfa0 20 20 69 6e 74 20 62 49 6e 73 65 72 74 44 6f 6e    int bInsertDon
2dfb0 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 41 74 20  e = 0;..  /* At 
2dfc0 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 75  this point it mu
2dfd0 73 74 20 62 65 20 6b 6e 6f 77 6e 20 69 66 20 74  st be known if t
2dfe0 68 65 20 25 5f 73 74 61 74 20 74 61 62 6c 65 20  he %_stat table 
2dff0 65 78 69 73 74 73 20 6f 72 20 6e 6f 74 2e 0a 20  exists or not.. 
2e000 20 2a 2a 20 53 6f 20 62 48 61 73 53 74 61 74 20   ** So bHasStat 
2e010 6d 61 79 20 6e 6f 74 20 62 65 20 32 2e 20 20 2a  may not be 2.  *
2e020 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62  /.  assert( p->b
2e030 48 61 73 53 74 61 74 3d 3d 30 20 7c 7c 20 70 2d  HasStat==0 || p-
2e040 3e 62 48 61 73 53 74 61 74 3d 3d 31 20 29 3b 0a  >bHasStat==1 );.
2e050 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53  .  assert( p->pS
2e060 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b 0a 20 20  egments==0 );.  
2e070 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20 6e  assert( .      n
2e080 41 72 67 3d 3d 31 20 20 20 20 20 20 20 20 20 20  Arg==1          
2e090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 45             /* DE
2e0a0 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20  LETE operations 
2e0b0 2a 2f 0a 20 20 20 7c 7c 20 6e 41 72 67 3d 3d 28  */.   || nArg==(
2e0c0 32 20 2b 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b  2 + p->nColumn +
2e0d0 20 33 29 20 20 2f 2a 20 49 4e 53 45 52 54 20 6f   3)  /* INSERT o
2e0e0 72 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69  r UPDATE operati
2e0f0 6f 6e 73 20 2a 2f 0a 20 20 29 3b 0a 0a 20 20 2f  ons */.  );..  /
2e100 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20 22 73  * Check for a "s
2e110 70 65 63 69 61 6c 22 20 49 4e 53 45 52 54 20 6f  pecial" INSERT o
2e120 70 65 72 61 74 69 6f 6e 2e 20 4f 6e 65 20 6f 66  peration. One of
2e130 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a   the form:.  **.
2e140 20 20 2a 2a 20 20 20 49 4e 53 45 52 54 20 49 4e    **   INSERT IN
2e150 54 4f 20 78 79 7a 28 78 79 7a 29 20 56 41 4c 55  TO xyz(xyz) VALU
2e160 45 53 28 27 63 6f 6d 6d 61 6e 64 27 29 3b 0a 20  ES('command');. 
2e170 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3e 31   */.  if( nArg>1
2e180 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f   .   && sqlite3_
2e190 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c  value_type(apVal
2e1a0 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  [0])==SQLITE_NUL
2e1b0 4c 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  L .   && sqlite3
2e1c0 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61  _value_type(apVa
2e1d0 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 5d 29  l[p->nColumn+2])
2e1e0 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 0a 20  !=SQLITE_NULL . 
2e1f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
2e200 33 53 70 65 63 69 61 6c 49 6e 73 65 72 74 28 70  3SpecialInsert(p
2e210 2c 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75  , apVal[p->nColu
2e220 6d 6e 2b 32 5d 29 3b 0a 20 20 20 20 67 6f 74 6f  mn+2]);.    goto
2e230 20 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20 20 7d   update_out;.  }
2e240 0a 0a 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26  ..  if( nArg>1 &
2e250 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  & sqlite3_value_
2e260 69 6e 74 28 61 70 56 61 6c 5b 32 20 2b 20 70 2d  int(apVal[2 + p-
2e270 3e 6e 43 6f 6c 75 6d 6e 20 2b 20 32 5d 29 3c 30  >nColumn + 2])<0
2e280 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
2e290 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
2e2a0 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f      goto update_
2e2b0 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  out;.  }..  /* A
2e2c0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 74 6f  llocate space to
2e2d0 20 68 6f 6c 64 20 74 68 65 20 63 68 61 6e 67 65   hold the change
2e2e0 20 69 6e 20 64 6f 63 75 6d 65 6e 74 20 73 69 7a   in document siz
2e2f0 65 73 20 2a 2f 0a 20 20 61 53 7a 44 65 6c 20 3d  es */.  aSzDel =
2e300 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
2e310 34 28 73 69 7a 65 6f 66 28 61 53 7a 44 65 6c 5b  4(sizeof(aSzDel[
2e320 30 5d 29 2a 28 28 73 71 6c 69 74 65 33 5f 69 6e  0])*((sqlite3_in
2e330 74 36 34 29 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31  t64)p->nColumn+1
2e340 29 2a 32 29 3b 0a 20 20 69 66 28 20 61 53 7a 44  )*2);.  if( aSzD
2e350 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  el==0 ){.    rc 
2e360 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2e370 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f      goto update_
2e380 6f 75 74 3b 0a 20 20 7d 0a 20 20 61 53 7a 49 6e  out;.  }.  aSzIn
2e390 73 20 3d 20 26 61 53 7a 44 65 6c 5b 70 2d 3e 6e  s = &aSzDel[p->n
2e3a0 43 6f 6c 75 6d 6e 2b 31 5d 3b 0a 20 20 6d 65 6d  Column+1];.  mem
2e3b0 73 65 74 28 61 53 7a 44 65 6c 2c 20 30 2c 20 73  set(aSzDel, 0, s
2e3c0 69 7a 65 6f 66 28 61 53 7a 44 65 6c 5b 30 5d 29  izeof(aSzDel[0])
2e3d0 2a 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 2a  *(p->nColumn+1)*
2e3e0 32 29 3b 0a 0a 20 20 72 63 20 3d 20 66 74 73 33  2);..  rc = fts3
2e3f0 57 72 69 74 65 6c 6f 63 6b 28 70 29 3b 0a 20 20  Writelock(p);.  
2e400 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2e410 4b 20 29 20 67 6f 74 6f 20 75 70 64 61 74 65 5f  K ) goto update_
2e420 6f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  out;..  /* If th
2e430 69 73 20 69 73 20 61 6e 20 49 4e 53 45 52 54 20  is is an INSERT 
2e440 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 61 6e  operation, or an
2e450 20 55 50 44 41 54 45 20 74 68 61 74 20 6d 6f 64   UPDATE that mod
2e460 69 66 69 65 73 20 74 68 65 20 72 6f 77 69 64 0a  ifies the rowid.
2e470 20 20 2a 2a 20 76 61 6c 75 65 2c 20 74 68 65 6e    ** value, then
2e480 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
2e490 72 65 71 75 69 72 65 73 20 63 6f 6e 73 74 72 61  requires constra
2e4a0 69 6e 74 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20  int handling..  
2e4b0 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 6f  **.  ** If the o
2e4c0 6e 2d 63 6f 6e 66 6c 69 63 74 20 6d 6f 64 65 20  n-conflict mode 
2e4d0 69 73 20 52 45 50 4c 41 43 45 2c 20 74 68 69 73  is REPLACE, this
2e4e0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
2e4f0 65 78 69 73 74 69 6e 67 20 72 6f 77 0a 20 20 2a  existing row.  *
2e500 2a 20 73 68 6f 75 6c 64 20 62 65 20 64 65 6c 65  * should be dele
2e510 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ted from the dat
2e520 61 62 61 73 65 20 62 65 66 6f 72 65 20 69 6e 73  abase before ins
2e530 65 72 74 69 6e 67 20 74 68 65 20 6e 65 77 20 72  erting the new r
2e540 6f 77 2e 20 4f 72 2c 0a 20 20 2a 2a 20 69 66 20  ow. Or,.  ** if 
2e550 74 68 65 20 6f 6e 2d 63 6f 6e 66 6c 69 63 74 20  the on-conflict 
2e560 6d 6f 64 65 20 69 73 20 6f 74 68 65 72 20 74 68  mode is other th
2e570 61 6e 20 52 45 50 4c 41 43 45 2c 20 74 68 65 6e  an REPLACE, then
2e580 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6d 75 73   this method mus
2e590 74 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68  t.  ** detect th
2e5a0 65 20 63 6f 6e 66 6c 69 63 74 20 61 6e 64 20 72  e conflict and r
2e5b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
2e5c0 53 54 52 41 49 4e 54 20 62 65 66 6f 72 65 20 62  STRAINT before b
2e5d0 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 20 20 2a 2a  eginning to.  **
2e5e0 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2e5f0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
2e600 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26 20    if( nArg>1 && 
2e610 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d  p->zContentTbl==
2e620 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 6e 64  0 ){.    /* Find
2e630 20 74 68 65 20 76 61 6c 75 65 20 6f 62 6a 65 63   the value objec
2e640 74 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  t that holds the
2e650 20 6e 65 77 20 72 6f 77 69 64 20 76 61 6c 75 65   new rowid value
2e660 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
2e670 5f 76 61 6c 75 65 20 2a 70 4e 65 77 52 6f 77 69  _value *pNewRowi
2e680 64 20 3d 20 61 70 56 61 6c 5b 33 2b 70 2d 3e 6e  d = apVal[3+p->n
2e690 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 69 66 28  Column];.    if(
2e6a0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
2e6b0 79 70 65 28 70 4e 65 77 52 6f 77 69 64 29 3d 3d  ype(pNewRowid)==
2e6c0 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20  SQLITE_NULL ){. 
2e6d0 20 20 20 20 20 70 4e 65 77 52 6f 77 69 64 20 3d       pNewRowid =
2e6e0 20 61 70 56 61 6c 5b 31 5d 3b 0a 20 20 20 20 7d   apVal[1];.    }
2e6f0 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ..    if( sqlite
2e700 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 4e 65  3_value_type(pNe
2e710 77 52 6f 77 69 64 29 21 3d 53 51 4c 49 54 45 5f  wRowid)!=SQLITE_
2e720 4e 55 4c 4c 20 26 26 20 28 20 0a 20 20 20 20 20  NULL && ( .     
2e730 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
2e740 5f 74 79 70 65 28 61 70 56 61 6c 5b 30 5d 29 3d  _type(apVal[0])=
2e750 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20 20 20  =SQLITE_NULL.   
2e760 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c    || sqlite3_val
2e770 75 65 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b 30  ue_int64(apVal[0
2e780 5d 29 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  ])!=sqlite3_valu
2e790 65 5f 69 6e 74 36 34 28 70 4e 65 77 52 6f 77 69  e_int64(pNewRowi
2e7a0 64 29 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20  d).    )){.     
2e7b0 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 77 69   /* The new rowi
2e7c0 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 69  d is not NULL (i
2e7d0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
2e7e0 72 6f 77 69 64 20 77 69 6c 6c 20 62 65 0a 20 20  rowid will be.  
2e7f0 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
2e800 61 6c 6c 79 20 61 73 73 69 67 6e 65 64 20 61 6e  ally assigned an
2e810 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  d there is no ch
2e820 61 6e 63 65 20 6f 66 20 61 20 63 6f 6e 66 6c 69  ance of a confli
2e830 63 74 29 2c 20 61 6e 64 20 0a 20 20 20 20 20 20  ct), and .      
2e840 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
2e850 20 69 73 20 65 69 74 68 65 72 20 61 6e 20 49 4e   is either an IN
2e860 53 45 52 54 20 6f 72 20 61 6e 20 55 50 44 41 54  SERT or an UPDAT
2e870 45 20 74 68 61 74 20 6d 6f 64 69 66 69 65 73 20  E that modifies 
2e880 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77  the.      ** row
2e890 69 64 20 63 6f 6c 75 6d 6e 2e 20 53 6f 20 69 66  id column. So if
2e8a0 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 6d 6f   the conflict mo
2e8b0 64 65 20 69 73 20 52 45 50 4c 41 43 45 2c 20 74  de is REPLACE, t
2e8c0 68 65 6e 20 64 65 6c 65 74 65 20 61 6e 79 0a 20  hen delete any. 
2e8d0 20 20 20 20 20 2a 2a 20 65 78 69 73 74 69 6e 67       ** existing
2e8e0 20 72 6f 77 20 77 69 74 68 20 72 6f 77 69 64 3d   row with rowid=
2e8f0 70 4e 65 77 52 6f 77 69 64 2e 20 0a 20 20 20 20  pNewRowid. .    
2e900 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 72    **.      ** Or
2e910 2c 20 69 66 20 74 68 65 20 63 6f 6e 66 6c 69 63  , if the conflic
2e920 74 20 6d 6f 64 65 20 69 73 20 6e 6f 74 20 52 45  t mode is not RE
2e930 50 4c 41 43 45 2c 20 69 6e 73 65 72 74 20 74 68  PLACE, insert th
2e940 65 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74  e new record int
2e950 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  o .      ** the 
2e960 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e  %_content table.
2e970 20 49 66 20 77 65 20 68 69 74 20 74 68 65 20 64   If we hit the d
2e980 75 70 6c 69 63 61 74 65 20 72 6f 77 69 64 20 63  uplicate rowid c
2e990 6f 6e 73 74 72 61 69 6e 74 20 28 6f 72 20 61 6e  onstraint (or an
2e9a0 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  y.      ** other
2e9b0 20 65 72 72 6f 72 29 20 77 68 69 6c 65 20 64 6f   error) while do
2e9c0 69 6e 67 20 73 6f 2c 20 72 65 74 75 72 6e 20 69  ing so, return i
2e9d0 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
2e9e0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
2e9f0 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20 61 6c  is branch may al
2ea00 73 6f 20 72 75 6e 20 69 66 20 70 4e 65 77 52 6f  so run if pNewRo
2ea10 77 69 64 20 63 6f 6e 74 61 69 6e 73 20 61 20 76  wid contains a v
2ea20 61 6c 75 65 20 74 68 61 74 20 63 61 6e 6e 6f 74  alue that cannot
2ea30 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 6c 6f 73  .      ** be los
2ea40 73 6c 65 73 73 6c 79 20 63 6f 6e 76 65 72 74 65  slessly converte
2ea50 64 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e  d to an integer.
2ea60 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
2ea70 68 65 20 65 76 65 6e 74 75 61 6c 20 0a 20 20 20  he eventual .   
2ea80 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 66 74     ** call to ft
2ea90 73 33 49 6e 73 65 72 74 44 61 74 61 28 29 20 28  s3InsertData() (
2eaa0 65 69 74 68 65 72 20 6a 75 73 74 20 62 65 6c 6f  either just belo
2eab0 77 20 6f 72 20 66 75 72 74 68 65 72 20 6f 6e 20  w or further on 
2eac0 69 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a  in this.      **
2ead0 20 66 75 6e 63 74 69 6f 6e 29 20 77 69 6c 6c 20   function) will 
2eae0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
2eaf0 53 4d 41 54 43 48 2e 20 49 66 20 66 74 73 33 44  SMATCH. If fts3D
2eb00 65 6c 65 74 65 42 79 52 6f 77 69 64 20 69 73 20  eleteByRowid is 
2eb10 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 6f 6b 65  .      ** invoke
2eb20 64 2c 20 69 74 20 77 69 6c 6c 20 64 65 6c 65 74  d, it will delet
2eb30 65 20 7a 65 72 6f 20 72 6f 77 73 20 28 73 69 6e  e zero rows (sin
2eb40 63 65 20 6e 6f 20 72 6f 77 20 77 69 6c 6c 20 68  ce no row will h
2eb50 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 64 6f 63  ave.      ** doc
2eb60 69 64 3d 24 70 4e 65 77 52 6f 77 69 64 20 69 66  id=$pNewRowid if
2eb70 20 24 70 4e 65 77 52 6f 77 69 64 20 69 73 20 6e   $pNewRowid is n
2eb80 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61  ot an integer va
2eb90 6c 75 65 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lue)..      */. 
2eba0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2ebb0 5f 76 74 61 62 5f 6f 6e 5f 63 6f 6e 66 6c 69 63  _vtab_on_conflic
2ebc0 74 28 70 2d 3e 64 62 29 3d 3d 53 51 4c 49 54 45  t(p->db)==SQLITE
2ebd0 5f 52 45 50 4c 41 43 45 20 29 7b 0a 20 20 20 20  _REPLACE ){.    
2ebe0 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 65 6c      rc = fts3Del
2ebf0 65 74 65 42 79 52 6f 77 69 64 28 70 2c 20 70 4e  eteByRowid(p, pN
2ec00 65 77 52 6f 77 69 64 2c 20 26 6e 43 68 6e 67 2c  ewRowid, &nChng,
2ec10 20 61 53 7a 44 65 6c 29 3b 0a 20 20 20 20 20 20   aSzDel);.      
2ec20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
2ec30 63 20 3d 20 66 74 73 33 49 6e 73 65 72 74 44 61  c = fts3InsertDa
2ec40 74 61 28 70 2c 20 61 70 56 61 6c 2c 20 70 52 6f  ta(p, apVal, pRo
2ec50 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 62 49  wid);.        bI
2ec60 6e 73 65 72 74 44 6f 6e 65 20 3d 20 31 3b 0a 20  nsertDone = 1;. 
2ec70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2ec80 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2ec90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
2eca0 20 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20 20 7d   update_out;.  }
2ecb0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
2ecc0 73 20 61 20 44 45 4c 45 54 45 20 6f 72 20 55 50  s a DELETE or UP
2ecd0 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 2c 20  DATE operation, 
2ece0 72 65 6d 6f 76 65 20 74 68 65 20 6f 6c 64 20 72  remove the old r
2ecf0 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 69 66 28 20  ecord. */.  if( 
2ed00 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
2ed10 70 65 28 61 70 56 61 6c 5b 30 5d 29 21 3d 53 51  pe(apVal[0])!=SQ
2ed20 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20  LITE_NULL ){.   
2ed30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2ed40 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61  _value_type(apVa
2ed50 6c 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 49 4e  l[0])==SQLITE_IN
2ed60 54 45 47 45 52 20 29 3b 0a 20 20 20 20 72 63 20  TEGER );.    rc 
2ed70 3d 20 66 74 73 33 44 65 6c 65 74 65 42 79 52 6f  = fts3DeleteByRo
2ed80 77 69 64 28 70 2c 20 61 70 56 61 6c 5b 30 5d 2c  wid(p, apVal[0],
2ed90 20 26 6e 43 68 6e 67 2c 20 61 53 7a 44 65 6c 29   &nChng, aSzDel)
2eda0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66  ;.  }.  .  /* If
2edb0 20 74 68 69 73 20 69 73 20 61 6e 20 49 4e 53 45   this is an INSE
2edc0 52 54 20 6f 72 20 55 50 44 41 54 45 20 6f 70 65  RT or UPDATE ope
2edd0 72 61 74 69 6f 6e 2c 20 69 6e 73 65 72 74 20 74  ration, insert t
2ede0 68 65 20 6e 65 77 20 72 65 63 6f 72 64 2e 20 2a  he new record. *
2edf0 2f 0a 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26  /.  if( nArg>1 &
2ee00 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
2ee10 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 61 6e 67  ){.    int iLang
2ee20 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  id = sqlite3_val
2ee30 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 32 20 2b  ue_int(apVal[2 +
2ee40 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b 20 32 5d   p->nColumn + 2]
2ee50 29 3b 0a 20 20 20 20 69 66 28 20 62 49 6e 73 65  );.    if( bInse
2ee60 72 74 44 6f 6e 65 3d 3d 30 20 29 7b 0a 20 20 20  rtDone==0 ){.   
2ee70 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 73 65     rc = fts3Inse
2ee80 72 74 44 61 74 61 28 70 2c 20 61 70 56 61 6c 2c  rtData(p, apVal,
2ee90 20 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20   pRowid);.      
2eea0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  if( rc==SQLITE_C
2eeb0 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70 2d 3e  ONSTRAINT && p->
2eec0 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d 30 20 29  zContentTbl==0 )
2eed0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 46  {.        rc = F
2eee0 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b  TS_CORRUPT_VTAB;
2eef0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2ef00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2ef10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
2ef20 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65   = fts3PendingTe
2ef30 72 6d 73 44 6f 63 69 64 28 70 2c 20 30 2c 20 69  rmsDocid(p, 0, i
2ef40 4c 61 6e 67 69 64 2c 20 2a 70 52 6f 77 69 64 29  Langid, *pRowid)
2ef50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2ef60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2ef70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2ef80 2d 3e 69 50 72 65 76 44 6f 63 69 64 3d 3d 2a 70  ->iPrevDocid==*p
2ef90 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 72  Rowid );.      r
2efa0 63 20 3d 20 66 74 73 33 49 6e 73 65 72 74 54 65  c = fts3InsertTe
2efb0 72 6d 73 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20  rms(p, iLangid, 
2efc0 61 70 56 61 6c 2c 20 61 53 7a 49 6e 73 29 3b 0a  apVal, aSzIns);.
2efd0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
2efe0 3e 62 48 61 73 44 6f 63 73 69 7a 65 20 29 7b 0a  >bHasDocsize ){.
2eff0 20 20 20 20 20 20 66 74 73 33 49 6e 73 65 72 74        fts3Insert
2f000 44 6f 63 73 69 7a 65 28 26 72 63 2c 20 70 2c 20  Docsize(&rc, p, 
2f010 61 53 7a 49 6e 73 29 3b 0a 20 20 20 20 7d 0a 20  aSzIns);.    }. 
2f020 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20 7d 0a     nChng++;.  }.
2f030 0a 20 20 69 66 28 20 70 2d 3e 62 46 74 73 34 20  .  if( p->bFts4 
2f040 29 7b 0a 20 20 20 20 66 74 73 33 55 70 64 61 74  ){.    fts3Updat
2f050 65 44 6f 63 54 6f 74 61 6c 73 28 26 72 63 2c 20  eDocTotals(&rc, 
2f060 70 2c 20 61 53 7a 49 6e 73 2c 20 61 53 7a 44 65  p, aSzIns, aSzDe
2f070 6c 2c 20 6e 43 68 6e 67 29 3b 0a 20 20 7d 0a 0a  l, nChng);.  }..
2f080 20 75 70 64 61 74 65 5f 6f 75 74 3a 0a 20 20 73   update_out:.  s
2f090 71 6c 69 74 65 33 5f 66 72 65 65 28 61 53 7a 44  qlite3_free(aSzD
2f0a0 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74  el);.  sqlite3Ft
2f0b0 73 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28  s3SegmentsClose(
2f0c0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
2f0d0 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 46 6c 75 73 68  .}../* .** Flush
2f0e0 20 61 6e 79 20 64 61 74 61 20 69 6e 20 74 68 65   any data in the
2f0f0 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68   pending-terms h
2f100 61 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73  ash table to dis
2f110 6b 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  k. If successful
2f120 2c 0a 2a 2a 20 6d 65 72 67 65 20 61 6c 6c 20 73  ,.** merge all s
2f130 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 64  egments in the d
2f140 61 74 61 62 61 73 65 20 28 69 6e 63 6c 75 64 69  atabase (includi
2f150 6e 67 20 74 68 65 20 6e 65 77 20 73 65 67 6d 65  ng the new segme
2f160 6e 74 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65  nt, if .** there
2f170 20 77 61 73 20 61 6e 79 20 64 61 74 61 20 74 6f   was any data to
2f180 20 66 6c 75 73 68 29 20 69 6e 74 6f 20 61 20 73   flush) into a s
2f190 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 2e 20 0a  ingle segment. .
2f1a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
2f1b0 73 33 4f 70 74 69 6d 69 7a 65 28 46 74 73 33 54  s3Optimize(Fts3T
2f1c0 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  able *p){.  int 
2f1d0 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
2f1e0 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
2f1f0 53 41 56 45 50 4f 49 4e 54 20 66 74 73 33 22 2c  SAVEPOINT fts3",
2f200 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28   0, 0, 0);.  if(
2f210 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2f220 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 44  {.    rc = fts3D
2f230 6f 4f 70 74 69 6d 69 7a 65 28 70 2c 20 31 29 3b  oOptimize(p, 1);
2f240 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2f250 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
2f260 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
2f270 20 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c     int rc2 = sql
2f280 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
2f290 20 22 52 45 4c 45 41 53 45 20 66 74 73 33 22 2c   "RELEASE fts3",
2f2a0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
2f2b0 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45   if( rc2!=SQLITE
2f2c0 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
2f2d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f2e0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
2f2f0 3e 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 20 54  >db, "ROLLBACK T
2f300 4f 20 66 74 73 33 22 2c 20 30 2c 20 30 2c 20 30  O fts3", 0, 0, 0
2f310 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2f320 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 52 45  _exec(p->db, "RE
2f330 4c 45 41 53 45 20 66 74 73 33 22 2c 20 30 2c 20  LEASE fts3", 0, 
2f340 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
2f350 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65  .  sqlite3Fts3Se
2f360 67 6d 65 6e 74 73 43 6c 6f 73 65 28 70 29 3b 0a  gmentsClose(p);.
2f370 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2f380 23 65 6e 64 69 66 0a                             #endif.