/ Hex Artifact Content
Login

Artifact c3863f23b6b4623c8b9d5cf31c12ce4469f78ca9:


0000: 2f 2a 0a 2a 2a 20 32 30 30 39 20 4f 63 74 20 32  /*.** 2009 Oct 2
0010: 33 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  3.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 69 73 20 70 61 72 74 20 6f 66   file is part of
0190: 20 74 68 65 20 53 51 4c 69 74 65 20 46 54 53 33   the SQLite FTS3
01a0: 20 65 78 74 65 6e 73 69 6f 6e 20 6d 6f 64 75 6c   extension modul
01b0: 65 2e 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c  e. Specifically,
01c0: 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 20 63 6f  .** this file co
01d0: 6e 74 61 69 6e 73 20 63 6f 64 65 20 74 6f 20 69  ntains code to i
01e0: 6e 73 65 72 74 2c 20 75 70 64 61 74 65 20 61 6e  nsert, update an
01f0: 64 20 64 65 6c 65 74 65 20 72 6f 77 73 20 66 72  d delete rows fr
0200: 6f 6d 20 46 54 53 33 0a 2a 2a 20 74 61 62 6c 65  om FTS3.** table
0210: 73 2e 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61  s. It also conta
0220: 69 6e 73 20 63 6f 64 65 20 74 6f 20 6d 65 72 67  ins code to merg
0230: 65 20 46 54 53 33 20 62 2d 74 72 65 65 20 73 65  e FTS3 b-tree se
0240: 67 6d 65 6e 74 73 2e 20 53 6f 6d 65 0a 2a 2a 20  gments. Some.** 
0250: 6f 66 20 74 68 65 20 73 75 62 2d 72 6f 75 74 69  of the sub-routi
0260: 6e 65 73 20 75 73 65 64 20 74 6f 20 6d 65 72 67  nes used to merg
0270: 65 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20 61  e segments are a
0280: 6c 73 6f 20 75 73 65 64 20 62 79 20 74 68 65 20  lso used by the 
0290: 71 75 65 72 79 20 0a 2a 2a 20 63 6f 64 65 20 69  query .** code i
02a0: 6e 20 66 74 73 33 2e 63 2e 0a 2a 2f 0a 0a 23 69  n fts3.c..*/..#i
02b0: 6e 63 6c 75 64 65 20 22 66 74 73 33 49 6e 74 2e  nclude "fts3Int.
02c0: 68 22 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  h".#if !defined(
02d0: 53 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20  SQLITE_CORE) || 
02e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
02f0: 4e 41 42 4c 45 5f 46 54 53 33 29 0a 0a 23 69 6e  NABLE_FTS3)..#in
0300: 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e  clude <string.h>
0310: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  .#include <asser
0320: 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  t.h>.#include <s
0330: 74 64 6c 69 62 2e 68 3e 0a 0a 0a 23 64 65 66 69  tdlib.h>...#defi
0340: 6e 65 20 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e  ne FTS_MAX_APPEN
0350: 44 41 42 4c 45 5f 48 45 49 47 48 54 20 31 36 0a  DABLE_HEIGHT 16.
0360: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 66 75 6c 6c  ./*.** When full
0370: 2d 74 65 78 74 20 69 6e 64 65 78 20 6e 6f 64 65  -text index node
0380: 73 20 61 72 65 20 6c 6f 61 64 65 64 20 66 72 6f  s are loaded fro
0390: 6d 20 64 69 73 6b 2c 20 74 68 65 20 62 75 66 66  m disk, the buff
03a0: 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20  er that they.** 
03b0: 61 72 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20  are loaded into 
03c0: 68 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  has the followin
03d0: 67 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  g number of byte
03e0: 73 20 6f 66 20 70 61 64 64 69 6e 67 20 61 74 20  s of padding at 
03f0: 74 68 65 20 65 6e 64 20 0a 2a 2a 20 6f 66 20 69  the end .** of i
0400: 74 2e 20 69 2e 65 2e 20 69 66 20 61 20 66 75 6c  t. i.e. if a ful
0410: 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 6e 6f 64  l-text index nod
0420: 65 20 69 73 20 39 30 30 20 62 79 74 65 73 20 69  e is 900 bytes i
0430: 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 61 20 62  n size, then a b
0440: 75 66 66 65 72 0a 2a 2a 20 6f 66 20 39 32 30 20  uffer.** of 920 
0450: 62 79 74 65 73 20 69 73 20 61 6c 6c 6f 63 61 74  bytes is allocat
0460: 65 64 20 66 6f 72 20 69 74 2e 0a 2a 2a 0a 2a 2a  ed for it..**.**
0470: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
0480: 20 69 66 20 77 65 20 68 61 76 65 20 61 20 70 6f   if we have a po
0490: 69 6e 74 65 72 20 69 6e 74 6f 20 61 20 62 75 66  inter into a buf
04a0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e  fer containing n
04b0: 6f 64 65 20 64 61 74 61 2c 0a 2a 2a 20 69 74 20  ode data,.** it 
04c0: 69 73 20 61 6c 77 61 79 73 20 73 61 66 65 20 74  is always safe t
04d0: 6f 20 72 65 61 64 20 75 70 20 74 6f 20 74 77 6f  o read up to two
04e0: 20 76 61 72 69 6e 74 73 20 66 72 6f 6d 20 69 74   varints from it
04f0: 20 77 69 74 68 6f 75 74 20 72 69 73 6b 69 6e 67   without risking
0500: 20 61 6e 0a 2a 2a 20 6f 76 65 72 72 65 61 64 2c   an.** overread,
0510: 20 65 76 65 6e 20 69 66 20 74 68 65 20 6e 6f 64   even if the nod
0520: 65 20 64 61 74 61 20 69 73 20 63 6f 72 72 75 70  e data is corrup
0530: 74 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ted..*/.#define 
0540: 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49 4e  FTS3_NODE_PADDIN
0550: 47 20 28 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d  G (FTS3_VARINT_M
0560: 41 58 2a 32 29 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64  AX*2)../*.** Und
0570: 65 72 20 63 65 72 74 61 69 6e 20 63 69 72 63 75  er certain circu
0580: 6d 73 74 61 6e 63 65 73 2c 20 62 2d 74 72 65 65  mstances, b-tree
0590: 20 6e 6f 64 65 73 20 28 64 6f 63 6c 69 73 74 73   nodes (doclists
05a0: 29 20 63 61 6e 20 62 65 20 6c 6f 61 64 65 64 20  ) can be loaded 
05b0: 69 6e 74 6f 0a 2a 2a 20 6d 65 6d 6f 72 79 20 69  into.** memory i
05c0: 6e 63 72 65 6d 65 6e 74 61 6c 6c 79 20 69 6e 73  ncrementally ins
05d0: 74 65 61 64 20 6f 66 20 61 6c 6c 20 61 74 20 6f  tead of all at o
05e0: 6e 63 65 2e 20 54 68 69 73 20 63 61 6e 20 62 65  nce. This can be
05f0: 20 61 20 62 69 67 20 70 65 72 66 6f 72 6d 61 6e   a big performan
0600: 63 65 0a 2a 2a 20 77 69 6e 20 28 72 65 64 75 63  ce.** win (reduc
0610: 65 64 20 49 4f 20 61 6e 64 20 43 50 55 29 20 69  ed IO and CPU) i
0620: 66 20 53 51 4c 69 74 65 20 73 74 6f 70 73 20 63  f SQLite stops c
0630: 61 6c 6c 69 6e 67 20 74 68 65 20 76 69 72 74 75  alling the virtu
0640: 61 6c 20 74 61 62 6c 65 20 78 4e 65 78 74 28 29  al table xNext()
0650: 0a 2a 2a 20 6d 65 74 68 6f 64 20 62 65 66 6f 72  .** method befor
0660: 65 20 72 65 74 72 69 65 76 69 6e 67 20 61 6c 6c  e retrieving all
0670: 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 28   query results (
0680: 61 73 20 6d 61 79 20 68 61 70 70 65 6e 2c 20 66  as may happen, f
0690: 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 69  or example,.** i
06a0: 66 20 61 20 71 75 65 72 79 20 68 61 73 20 61 20  f a query has a 
06b0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 29 2e 0a 2a  LIMIT clause)..*
06c0: 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 61 6c  *.** Incremental
06d0: 20 6c 6f 61 64 69 6e 67 20 69 73 20 75 73 65 64   loading is used
06e0: 20 66 6f 72 20 62 2d 74 72 65 65 20 6e 6f 64 65   for b-tree node
06f0: 73 20 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e  s FTS3_NODE_CHUN
0700: 4b 5f 54 48 52 45 53 48 4f 4c 44 20 0a 2a 2a 20  K_THRESHOLD .** 
0710: 62 79 74 65 73 20 61 6e 64 20 6c 61 72 67 65 72  bytes and larger
0720: 2e 20 4e 6f 64 65 73 20 61 72 65 20 6c 6f 61 64  . Nodes are load
0730: 65 64 20 69 6e 20 63 68 75 6e 6b 73 20 6f 66 20  ed in chunks of 
0740: 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 53  FTS3_NODE_CHUNKS
0750: 49 5a 45 20 62 79 74 65 73 2e 0a 2a 2a 20 54 68  IZE bytes..** Th
0760: 65 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  e code is writte
0770: 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 68 61  n so that the ha
0780: 72 64 20 6c 6f 77 65 72 2d 6c 69 6d 69 74 20 66  rd lower-limit f
0790: 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 73 65  or each of these
07a0: 20 76 61 6c 75 65 73 20 0a 2a 2a 20 69 73 20 31   values .** is 1
07b0: 2e 20 43 6c 65 61 72 6c 79 20 73 75 63 68 20 73  . Clearly such s
07c0: 6d 61 6c 6c 20 76 61 6c 75 65 73 20 77 6f 75 6c  mall values woul
07d0: 64 20 62 65 20 69 6e 65 66 66 69 63 69 65 6e 74  d be inefficient
07e0: 2c 20 62 75 74 20 63 61 6e 20 62 65 20 75 73 65  , but can be use
07f0: 66 75 6c 20 0a 2a 2a 20 66 6f 72 20 74 65 73 74  ful .** for test
0800: 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2a  ing purposes..**
0810: 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 6f 64 75  .** If this modu
0820: 6c 65 20 69 73 20 62 75 69 6c 74 20 77 69 74 68  le is built with
0830: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 64 65 66   SQLITE_TEST def
0840: 69 6e 65 64 2c 20 74 68 65 73 65 20 63 6f 6e 73  ined, these cons
0850: 74 61 6e 74 73 20 6d 61 79 0a 2a 2a 20 62 65 20  tants may.** be 
0860: 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75  overridden at ru
0870: 6e 74 69 6d 65 20 66 6f 72 20 74 65 73 74 69 6e  ntime for testin
0880: 67 20 70 75 72 70 6f 73 65 73 2e 20 46 69 6c 65  g purposes. File
0890: 20 66 74 73 33 5f 74 65 73 74 2e 63 20 63 6f 6e   fts3_test.c con
08a0: 74 61 69 6e 73 0a 2a 2a 20 61 20 54 63 6c 20 69  tains.** a Tcl i
08b0: 6e 74 65 72 66 61 63 65 20 74 6f 20 72 65 61 64  nterface to read
08c0: 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 76   and write the v
08d0: 61 6c 75 65 73 2e 0a 2a 2f 0a 23 69 66 64 65 66  alues..*/.#ifdef
08e0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
08f0: 20 74 65 73 74 5f 66 74 73 33 5f 6e 6f 64 65 5f   test_fts3_node_
0900: 63 68 75 6e 6b 73 69 7a 65 20 3d 20 28 34 2a 31  chunksize = (4*1
0910: 30 32 34 29 3b 0a 69 6e 74 20 74 65 73 74 5f 66  024);.int test_f
0920: 74 73 33 5f 6e 6f 64 65 5f 63 68 75 6e 6b 5f 74  ts3_node_chunk_t
0930: 68 72 65 73 68 6f 6c 64 20 3d 20 28 34 2a 31 30  hreshold = (4*10
0940: 32 34 29 2a 34 3b 0a 23 20 64 65 66 69 6e 65 20  24)*4;.# define 
0950: 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 53  FTS3_NODE_CHUNKS
0960: 49 5a 45 20 20 20 20 20 20 20 74 65 73 74 5f 66  IZE       test_f
0970: 74 73 33 5f 6e 6f 64 65 5f 63 68 75 6e 6b 73 69  ts3_node_chunksi
0980: 7a 65 0a 23 20 64 65 66 69 6e 65 20 46 54 53 33  ze.# define FTS3
0990: 5f 4e 4f 44 45 5f 43 48 55 4e 4b 5f 54 48 52 45  _NODE_CHUNK_THRE
09a0: 53 48 4f 4c 44 20 74 65 73 74 5f 66 74 73 33 5f  SHOLD test_fts3_
09b0: 6e 6f 64 65 5f 63 68 75 6e 6b 5f 74 68 72 65 73  node_chunk_thres
09c0: 68 6f 6c 64 0a 23 65 6c 73 65 0a 23 20 64 65 66  hold.#else.# def
09d0: 69 6e 65 20 46 54 53 33 5f 4e 4f 44 45 5f 43 48  ine FTS3_NODE_CH
09e0: 55 4e 4b 53 49 5a 45 20 28 34 2a 31 30 32 34 29  UNKSIZE (4*1024)
09f0: 20 0a 23 20 64 65 66 69 6e 65 20 46 54 53 33 5f   .# define FTS3_
0a00: 4e 4f 44 45 5f 43 48 55 4e 4b 5f 54 48 52 45 53  NODE_CHUNK_THRES
0a10: 48 4f 4c 44 20 28 46 54 53 33 5f 4e 4f 44 45 5f  HOLD (FTS3_NODE_
0a20: 43 48 55 4e 4b 53 49 5a 45 2a 34 29 0a 23 65 6e  CHUNKSIZE*4).#en
0a30: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  dif../*.** The t
0a40: 77 6f 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d  wo values that m
0a50: 61 79 20 62 65 20 6d 65 61 6e 69 6e 67 66 75 6c  ay be meaningful
0a60: 6c 79 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 20  ly bound to the 
0a70: 3a 31 20 70 61 72 61 6d 65 74 65 72 20 69 6e 0a  :1 parameter in.
0a80: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 53 51  ** statements SQ
0a90: 4c 5f 52 45 50 4c 41 43 45 5f 53 54 41 54 20 61  L_REPLACE_STAT a
0aa0: 6e 64 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 54  nd SQL_SELECT_ST
0ab0: 41 54 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46  AT..*/.#define F
0ac0: 54 53 5f 53 54 41 54 5f 44 4f 43 54 4f 54 41 4c  TS_STAT_DOCTOTAL
0ad0: 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20        0.#define 
0ae0: 46 54 53 5f 53 54 41 54 5f 49 4e 43 52 4d 45 52  FTS_STAT_INCRMER
0af0: 47 45 48 49 4e 54 20 31 0a 23 64 65 66 69 6e 65  GEHINT 1.#define
0b00: 20 46 54 53 5f 53 54 41 54 5f 41 55 54 4f 49 4e   FTS_STAT_AUTOIN
0b10: 43 52 4d 45 52 47 45 20 32 0a 0a 2f 2a 0a 2a 2a  CRMERGE 2../*.**
0b20: 20 49 66 20 46 54 53 5f 4c 4f 47 5f 4d 45 52 47   If FTS_LOG_MERG
0b30: 45 53 20 69 73 20 64 65 66 69 6e 65 64 2c 20 63  ES is defined, c
0b40: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  all sqlite3_log(
0b50: 29 20 74 6f 20 72 65 70 6f 72 74 20 65 61 63 68  ) to report each
0b60: 20 61 75 74 6f 6d 61 74 69 63 0a 2a 2a 20 61 6e   automatic.** an
0b70: 64 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  d incremental me
0b80: 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 20 74 68  rge operation th
0b90: 61 74 20 74 61 6b 65 73 20 70 6c 61 63 65 2e 20  at takes place. 
0ba0: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
0bb0: 20 0a 2a 2a 20 64 65 62 75 67 67 69 6e 67 20 46   .** debugging F
0bc0: 54 53 20 6f 6e 6c 79 2c 20 69 74 20 73 68 6f 75  TS only, it shou
0bd0: 6c 64 20 6e 6f 74 20 75 73 75 61 6c 6c 79 20 62  ld not usually b
0be0: 65 20 74 75 72 6e 65 64 20 6f 6e 20 69 6e 20 70  e turned on in p
0bf0: 72 6f 64 75 63 74 69 6f 6e 0a 2a 2a 20 73 79 73  roduction.** sys
0c00: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  tems..*/.#ifdef 
0c10: 46 54 53 33 5f 4c 4f 47 5f 4d 45 52 47 45 53 0a  FTS3_LOG_MERGES.
0c20: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
0c30: 4c 6f 67 4d 65 72 67 65 28 69 6e 74 20 6e 4d 65  LogMerge(int nMe
0c40: 72 67 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  rge, sqlite3_int
0c50: 36 34 20 69 41 62 73 4c 65 76 65 6c 29 7b 0a 20  64 iAbsLevel){. 
0c60: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
0c70: 49 54 45 5f 4f 4b 2c 20 22 25 64 2d 77 61 79 20  ITE_OK, "%d-way 
0c80: 6d 65 72 67 65 20 66 72 6f 6d 20 6c 65 76 65 6c  merge from level
0c90: 20 25 64 22 2c 20 6e 4d 65 72 67 65 2c 20 28 69   %d", nMerge, (i
0ca0: 6e 74 29 69 41 62 73 4c 65 76 65 6c 29 3b 0a 7d  nt)iAbsLevel);.}
0cb0: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 66  .#else.#define f
0cc0: 74 73 33 4c 6f 67 4d 65 72 67 65 28 78 2c 20 79  ts3LogMerge(x, y
0cd0: 29 0a 23 65 6e 64 69 66 0a 0a 0a 74 79 70 65 64  ).#endif...typed
0ce0: 65 66 20 73 74 72 75 63 74 20 50 65 6e 64 69 6e  ef struct Pendin
0cf0: 67 4c 69 73 74 20 50 65 6e 64 69 6e 67 4c 69 73  gList PendingLis
0d00: 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  t;.typedef struc
0d10: 74 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 53 65  t SegmentNode Se
0d20: 67 6d 65 6e 74 4e 6f 64 65 3b 0a 74 79 70 65 64  gmentNode;.typed
0d30: 65 66 20 73 74 72 75 63 74 20 53 65 67 6d 65 6e  ef struct Segmen
0d40: 74 57 72 69 74 65 72 20 53 65 67 6d 65 6e 74 57  tWriter SegmentW
0d50: 72 69 74 65 72 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  riter;../*.** An
0d60: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
0d70: 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 61 74 61 20   following data 
0d80: 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65  structure is use
0d90: 64 20 74 6f 20 62 75 69 6c 64 20 64 6f 63 6c 69  d to build docli
0da0: 73 74 73 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74  sts.** increment
0db0: 61 6c 6c 79 2e 20 53 65 65 20 66 75 6e 63 74 69  ally. See functi
0dc0: 6f 6e 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69  on fts3PendingLi
0dd0: 73 74 41 70 70 65 6e 64 28 29 20 66 6f 72 20 64  stAppend() for d
0de0: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 73 74 72 75 63  etails..*/.struc
0df0: 74 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 7b 0a  t PendingList {.
0e00: 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20 20 63    int nData;.  c
0e10: 68 61 72 20 2a 61 44 61 74 61 3b 0a 20 20 69 6e  har *aData;.  in
0e20: 74 20 6e 53 70 61 63 65 3b 0a 20 20 73 71 6c 69  t nSpace;.  sqli
0e30: 74 65 33 5f 69 6e 74 36 34 20 69 4c 61 73 74 44  te3_int64 iLastD
0e40: 6f 63 69 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ocid;.  sqlite3_
0e50: 69 6e 74 36 34 20 69 4c 61 73 74 43 6f 6c 3b 0a  int64 iLastCol;.
0e60: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
0e70: 69 4c 61 73 74 50 6f 73 3b 0a 7d 3b 0a 0a 0a 2f  iLastPos;.};.../
0e80: 2a 0a 2a 2a 20 45 61 63 68 20 63 75 72 73 6f 72  *.** Each cursor
0e90: 20 68 61 73 20 61 20 28 70 6f 73 73 69 62 6c 79   has a (possibly
0ea0: 20 65 6d 70 74 79 29 20 6c 69 6e 6b 65 64 20 6c   empty) linked l
0eb0: 69 73 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ist of the follo
0ec0: 77 69 6e 67 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f  wing objects..*/
0ed0: 0a 73 74 72 75 63 74 20 46 74 73 33 44 65 66 65  .struct Fts3Defe
0ee0: 72 72 65 64 54 6f 6b 65 6e 20 7b 0a 20 20 46 74  rredToken {.  Ft
0ef0: 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70  s3PhraseToken *p
0f00: 54 6f 6b 65 6e 3b 20 20 20 20 20 20 20 20 2f 2a  Token;        /*
0f10: 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 6f 72 72   Pointer to corr
0f20: 65 73 70 6f 6e 64 69 6e 67 20 65 78 70 72 20 74  esponding expr t
0f30: 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43  oken */.  int iC
0f40: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
0f50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
0f60: 75 6d 6e 20 74 6f 6b 65 6e 20 6d 75 73 74 20 6f  umn token must o
0f70: 63 63 75 72 20 69 6e 20 2a 2f 0a 20 20 46 74 73  ccur in */.  Fts
0f80: 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a  3DeferredToken *
0f90: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20  pNext;       /* 
0fa0: 4e 65 78 74 20 69 6e 20 6c 69 73 74 20 6f 66 20  Next in list of 
0fb0: 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 73 20  deferred tokens 
0fc0: 2a 2f 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73 74  */.  PendingList
0fd0: 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20   *pList;        
0fe0: 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20       /* Doclist 
0ff0: 69 73 20 61 73 73 65 6d 62 6c 65 64 20 68 65 72  is assembled her
1000: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  e */.};../*.** A
1010: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
1020: 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
1030: 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
1040: 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 72 6d  through the term
1050: 73 20 6f 6e 0a 2a 2a 20 61 20 63 6f 6e 74 69 67  s on.** a contig
1060: 75 6f 75 73 20 73 65 74 20 6f 66 20 73 65 67 6d  uous set of segm
1070: 65 6e 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20  ent b-tree leaf 
1080: 6e 6f 64 65 73 2e 20 41 6c 74 68 6f 75 67 68 20  nodes. Although 
1090: 74 68 65 20 64 65 74 61 69 6c 73 20 6f 66 0a 2a  the details of.*
10a0: 2a 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  * this structure
10b0: 20 61 72 65 20 6f 6e 6c 79 20 6d 61 6e 69 70 75   are only manipu
10c0: 6c 61 74 65 64 20 62 79 20 63 6f 64 65 20 69 6e  lated by code in
10d0: 20 74 68 69 73 20 66 69 6c 65 2c 20 6f 70 61 71   this file, opaq
10e0: 75 65 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 6f 66  ue handles.** of
10f0: 20 74 79 70 65 20 46 74 73 33 53 65 67 52 65 61   type Fts3SegRea
1100: 64 65 72 2a 20 61 72 65 20 61 6c 73 6f 20 75 73  der* are also us
1110: 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20 66 74  ed by code in ft
1120: 73 33 2e 63 20 74 6f 20 69 74 65 72 61 74 65 20  s3.c to iterate 
1130: 74 68 72 6f 75 67 68 0a 2a 2a 20 74 65 72 6d 73  through.** terms
1140: 20 77 68 65 6e 20 71 75 65 72 79 69 6e 67 20 74   when querying t
1150: 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  he full-text ind
1160: 65 78 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e  ex. See function
1170: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69 74  s:.**.**   sqlit
1180: 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 4e  e3Fts3SegReaderN
1190: 65 77 28 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ew().**   sqlite
11a0: 33 46 74 73 33 53 65 67 52 65 61 64 65 72 46 72  3Fts3SegReaderFr
11b0: 65 65 28 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ee().**   sqlite
11c0: 33 46 74 73 33 53 65 67 52 65 61 64 65 72 49 74  3Fts3SegReaderIt
11d0: 65 72 61 74 65 28 29 0a 2a 2a 0a 2a 2a 20 4d 65  erate().**.** Me
11e0: 74 68 6f 64 73 20 75 73 65 64 20 74 6f 20 6d 61  thods used to ma
11f0: 6e 69 70 75 6c 61 74 65 20 46 74 73 33 53 65 67  nipulate Fts3Seg
1200: 52 65 61 64 65 72 20 73 74 72 75 63 74 75 72 65  Reader structure
1210: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 66 74 73 33 53  s:.**.**   fts3S
1220: 65 67 52 65 61 64 65 72 4e 65 78 74 28 29 0a 2a  egReaderNext().*
1230: 2a 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65  *   fts3SegReade
1240: 72 46 69 72 73 74 44 6f 63 69 64 28 29 0a 2a 2a  rFirstDocid().**
1250: 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72     fts3SegReader
1260: 4e 65 78 74 44 6f 63 69 64 28 29 0a 2a 2f 0a 73  NextDocid().*/.s
1270: 74 72 75 63 74 20 46 74 73 33 53 65 67 52 65 61  truct Fts3SegRea
1280: 64 65 72 20 7b 0a 20 20 69 6e 74 20 69 49 64 78  der {.  int iIdx
1290: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12a0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
12b0: 20 77 69 74 68 69 6e 20 6c 65 76 65 6c 2c 20 6f   within level, o
12c0: 72 20 30 78 37 46 46 46 46 46 46 46 20 66 6f 72  r 0x7FFFFFFF for
12d0: 20 50 54 20 2a 2f 0a 20 20 75 38 20 62 4c 6f 6f   PT */.  u8 bLoo
12e0: 6b 75 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  kup;            
12f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1300: 20 66 6f 72 20 61 20 6c 6f 6f 6b 75 70 20 6f 6e   for a lookup on
1310: 6c 79 20 2a 2f 0a 20 20 75 38 20 72 6f 6f 74 4f  ly */.  u8 rootO
1320: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
1330: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1340: 66 6f 72 20 61 20 72 6f 6f 74 2d 6f 6e 6c 79 20  for a root-only 
1350: 72 65 61 64 65 72 20 2a 2f 0a 0a 20 20 73 71 6c  reader */..  sql
1360: 69 74 65 33 5f 69 6e 74 36 34 20 69 53 74 61 72  ite3_int64 iStar
1370: 74 42 6c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20  tBlock;      /* 
1380: 52 6f 77 69 64 20 6f 66 20 66 69 72 73 74 20 6c  Rowid of first l
1390: 65 61 66 20 62 6c 6f 63 6b 20 74 6f 20 74 72 61  eaf block to tra
13a0: 76 65 72 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  verse */.  sqlit
13b0: 65 33 5f 69 6e 74 36 34 20 69 4c 65 61 66 45 6e  e3_int64 iLeafEn
13c0: 64 42 6c 6f 63 6b 3b 20 20 20 20 2f 2a 20 52 6f  dBlock;    /* Ro
13d0: 77 69 64 20 6f 66 20 66 69 6e 61 6c 20 6c 65 61  wid of final lea
13e0: 66 20 62 6c 6f 63 6b 20 74 6f 20 74 72 61 76 65  f block to trave
13f0: 72 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rse */.  sqlite3
1400: 5f 69 6e 74 36 34 20 69 45 6e 64 42 6c 6f 63 6b  _int64 iEndBlock
1410: 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  ;        /* Rowi
1420: 64 20 6f 66 20 66 69 6e 61 6c 20 62 6c 6f 63 6b  d of final block
1430: 20 69 6e 20 73 65 67 6d 65 6e 74 20 28 6f 72 20   in segment (or 
1440: 30 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  0) */.  sqlite3_
1450: 69 6e 74 36 34 20 69 43 75 72 72 65 6e 74 42 6c  int64 iCurrentBl
1460: 6f 63 6b 3b 20 20 20 20 2f 2a 20 43 75 72 72 65  ock;    /* Curre
1470: 6e 74 20 6c 65 61 66 20 62 6c 6f 63 6b 20 28 6f  nt leaf block (o
1480: 72 20 30 29 20 2a 2f 0a 0a 20 20 63 68 61 72 20  r 0) */..  char 
1490: 2a 61 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  *aNode;         
14a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
14b0: 69 6e 74 65 72 20 74 6f 20 6e 6f 64 65 20 64 61  inter to node da
14c0: 74 61 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  ta (or NULL) */.
14d0: 20 20 69 6e 74 20 6e 4e 6f 64 65 3b 20 20 20 20    int nNode;    
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
1500: 66 65 72 20 61 74 20 61 4e 6f 64 65 20 28 6f 72  fer at aNode (or
1510: 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f   0) */.  int nPo
1520: 70 75 6c 61 74 65 3b 20 20 20 20 20 20 20 20 20  pulate;         
1530: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e           /* If >
1540: 30 2c 20 62 79 74 65 73 20 6f 66 20 62 75 66 66  0, bytes of buff
1550: 65 72 20 61 4e 6f 64 65 5b 5d 20 6c 6f 61 64 65  er aNode[] loade
1560: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62  d */.  sqlite3_b
1570: 6c 6f 62 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20  lob *pBlob;     
1580: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74         /* If not
1590: 20 4e 55 4c 4c 2c 20 62 6c 6f 62 20 68 61 6e 64   NULL, blob hand
15a0: 6c 65 20 74 6f 20 72 65 61 64 20 6e 6f 64 65 20  le to read node 
15b0: 2a 2f 0a 0a 20 20 46 74 73 33 48 61 73 68 45 6c  */..  Fts3HashEl
15c0: 65 6d 20 2a 2a 70 70 4e 65 78 74 45 6c 65 6d 3b  em **ppNextElem;
15d0: 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73  ..  /* Variables
15e0: 20 73 65 74 20 62 79 20 66 74 73 33 53 65 67 52   set by fts3SegR
15f0: 65 61 64 65 72 4e 65 78 74 28 29 2e 20 54 68 65  eaderNext(). The
1600: 73 65 20 6d 61 79 20 62 65 20 72 65 61 64 20 64  se may be read d
1610: 69 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20  irectly.  ** by 
1620: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65 79  the caller. They
1630: 20 61 72 65 20 76 61 6c 69 64 20 66 72 6f 6d 20   are valid from 
1640: 74 68 65 20 74 69 6d 65 20 53 65 67 6d 65 6e 74  the time Segment
1650: 52 65 61 64 65 72 4e 65 77 28 29 20 72 65 74 75  ReaderNew() retu
1660: 72 6e 73 0a 20 20 2a 2a 20 75 6e 74 69 6c 20 53  rns.  ** until S
1670: 65 67 6d 65 6e 74 52 65 61 64 65 72 4e 65 78 74  egmentReaderNext
1680: 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74  () returns somet
1690: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
16a0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 2a 2a 20 28  SQLITE_OK.  ** (
16b0: 69 2e 65 2e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  i.e. SQLITE_DONE
16c0: 29 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  )..  */.  int nT
16d0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
16e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
16f0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
1700: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a  current term */.
1710: 20 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20    char *zTerm;  
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1730: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1740: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a  current term */.
1750: 20 20 69 6e 74 20 6e 54 65 72 6d 41 6c 6c 6f 63    int nTermAlloc
1760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1770: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
1780: 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 62 75 66  ize of zTerm buf
1790: 66 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  fer */.  char *a
17a0: 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20  Doclist;        
17b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
17c0: 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 20 6f  ter to doclist o
17d0: 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  f current entry 
17e0: 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73  */.  int nDoclis
17f0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1800: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1810: 64 6f 63 6c 69 73 74 20 69 6e 20 63 75 72 72 65  doclist in curre
1820: 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 0a 20 20 2f  nt entry */..  /
1830: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1840: 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 75 73  variables are us
1850: 65 64 20 62 79 20 66 74 73 33 53 65 67 52 65 61  ed by fts3SegRea
1860: 64 65 72 4e 65 78 74 44 6f 63 69 64 28 29 20 74  derNextDocid() t
1870: 6f 20 69 74 65 72 61 74 65 20 0a 20 20 2a 2a 20  o iterate .  ** 
1880: 74 68 72 6f 75 67 68 20 74 68 65 20 63 75 72 72  through the curr
1890: 65 6e 74 20 64 6f 63 6c 69 73 74 20 28 61 44 6f  ent doclist (aDo
18a0: 63 6c 69 73 74 2f 6e 44 6f 63 6c 69 73 74 29 2e  clist/nDoclist).
18b0: 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 4f  .  */.  char *pO
18c0: 66 66 73 65 74 4c 69 73 74 3b 0a 20 20 69 6e 74  ffsetList;.  int
18d0: 20 6e 4f 66 66 73 65 74 4c 69 73 74 3b 20 20 20   nOffsetList;   
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18f0: 46 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20 70  For descending p
1900: 65 6e 64 69 6e 67 20 73 65 67 2d 72 65 61 64 65  ending seg-reade
1910: 72 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 71 6c  rs only */.  sql
1920: 69 74 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 69  ite3_int64 iDoci
1930: 64 3b 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 66  d;.};..#define f
1940: 74 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65  ts3SegReaderIsPe
1950: 6e 64 69 6e 67 28 70 29 20 28 28 70 29 2d 3e 70  nding(p) ((p)->p
1960: 70 4e 65 78 74 45 6c 65 6d 21 3d 30 29 0a 23 64  pNextElem!=0).#d
1970: 65 66 69 6e 65 20 66 74 73 33 53 65 67 52 65 61  efine fts3SegRea
1980: 64 65 72 49 73 52 6f 6f 74 4f 6e 6c 79 28 70 29  derIsRootOnly(p)
1990: 20 28 28 70 29 2d 3e 72 6f 6f 74 4f 6e 6c 79 21   ((p)->rootOnly!
19a0: 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  =0)../*.** An in
19b0: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
19c0: 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64  tructure is used
19d0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 73 65 67   to create a seg
19e0: 6d 65 6e 74 20 62 2d 74 72 65 65 20 69 6e 20 74  ment b-tree in t
19f0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  he.** database. 
1a00: 54 68 65 20 69 6e 74 65 72 6e 61 6c 20 64 65 74  The internal det
1a10: 61 69 6c 73 20 6f 66 20 74 68 69 73 20 74 79 70  ails of this typ
1a20: 65 20 61 72 65 20 6f 6e 6c 79 20 61 63 63 65 73  e are only acces
1a30: 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 66 6f  sed by the.** fo
1a40: 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
1a50: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 66 74 73 33 53  s:.**.**   fts3S
1a60: 65 67 57 72 69 74 65 72 41 64 64 28 29 0a 2a 2a  egWriterAdd().**
1a70: 20 20 20 66 74 73 33 53 65 67 57 72 69 74 65 72     fts3SegWriter
1a80: 46 6c 75 73 68 28 29 0a 2a 2a 20 20 20 66 74 73  Flush().**   fts
1a90: 33 53 65 67 57 72 69 74 65 72 46 72 65 65 28 29  3SegWriterFree()
1aa0: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 65 67 6d 65  .*/.struct Segme
1ab0: 6e 74 57 72 69 74 65 72 20 7b 0a 20 20 53 65 67  ntWriter {.  Seg
1ac0: 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65 3b  mentNode *pTree;
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ae0: 50 6f 69 6e 74 65 72 20 74 6f 20 69 6e 74 65 72  Pointer to inter
1af0: 69 6f 72 20 74 72 65 65 20 73 74 72 75 63 74 75  ior tree structu
1b00: 72 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  re */.  sqlite3_
1b10: 69 6e 74 36 34 20 69 46 69 72 73 74 3b 20 20 20  int64 iFirst;   
1b20: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1b30: 20 73 6c 6f 74 20 69 6e 20 25 5f 73 65 67 6d 65   slot in %_segme
1b40: 6e 74 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  nts written */. 
1b50: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1b60: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  Free;           
1b70: 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73 6c   /* Next free sl
1b80: 6f 74 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73  ot in %_segments
1b90: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 72   */.  char *zTer
1ba0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1bb0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1bc0: 20 74 6f 20 70 72 65 76 69 6f 75 73 20 74 65 72   to previous ter
1bd0: 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  m buffer */.  in
1be0: 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20  t nTerm;        
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c00: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1c10: 20 69 6e 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 69   in zTerm */.  i
1c20: 6e 74 20 6e 4d 61 6c 6c 6f 63 3b 20 20 20 20 20  nt nMalloc;     
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c40: 2a 20 53 69 7a 65 20 6f 66 20 6d 61 6c 6c 6f 63  * Size of malloc
1c50: 27 64 20 62 75 66 66 65 72 20 61 74 20 7a 4d 61  'd buffer at zMa
1c60: 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lloc */.  char *
1c70: 7a 4d 61 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20  zMalloc;        
1c80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6c            /* Mal
1c90: 6c 6f 63 27 64 20 73 70 61 63 65 20 28 70 6f 73  loc'd space (pos
1ca0: 73 69 62 6c 79 29 20 75 73 65 64 20 66 6f 72 20  sibly) used for 
1cb0: 7a 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e  zTerm */.  int n
1cc0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1cd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1ce0: 7a 65 20 6f 66 20 61 6c 6c 6f 63 61 74 69 6f 6e  ze of allocation
1cf0: 20 61 74 20 61 44 61 74 61 20 2a 2f 0a 20 20 69   at aData */.  i
1d00: 6e 74 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20  nt nData;       
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d20: 2a 20 42 79 74 65 73 20 6f 66 20 64 61 74 61 20  * Bytes of data 
1d30: 69 6e 20 61 44 61 74 61 20 2a 2f 0a 20 20 63 68  in aData */.  ch
1d40: 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20  ar *aData;      
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d60: 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 6c 6f 63   Pointer to bloc
1d70: 6b 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20  k from malloc() 
1d80: 2a 2f 0a 20 20 69 36 34 20 6e 4c 65 61 66 44 61  */.  i64 nLeafDa
1d90: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
1da0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1db0: 66 20 62 79 74 65 73 20 6f 66 20 6c 65 61 66 20  f bytes of leaf 
1dc0: 64 61 74 61 20 77 72 69 74 74 65 6e 20 2a 2f 0a  data written */.
1dd0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 79 70 65 20 53  };../*.** Type S
1de0: 65 67 6d 65 6e 74 4e 6f 64 65 20 69 73 20 75 73  egmentNode is us
1df0: 65 64 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77  ed by the follow
1e00: 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74 69  ing three functi
1e10: 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a  ons to create.**
1e20: 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 70 61   the interior pa
1e30: 72 74 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e  rt of the segmen
1e40: 74 20 62 2b 2d 74 72 65 65 20 73 74 72 75 63 74  t b+-tree struct
1e50: 75 72 65 73 20 28 65 76 65 72 79 74 68 69 6e 67  ures (everything
1e60: 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 65 20 6c   except.** the l
1e70: 65 61 66 20 6e 6f 64 65 73 29 2e 20 54 68 65 73  eaf nodes). Thes
1e80: 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  e functions and 
1e90: 74 79 70 65 20 61 72 65 20 6f 6e 6c 79 20 65 76  type are only ev
1ea0: 65 72 20 75 73 65 64 20 62 79 20 63 6f 64 65 0a  er used by code.
1eb0: 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 66 74  ** within the ft
1ec0: 73 33 53 65 67 57 72 69 74 65 72 58 58 58 28 29  s3SegWriterXXX()
1ed0: 20 66 61 6d 69 6c 79 20 6f 66 20 66 75 6e 63 74   family of funct
1ee0: 69 6f 6e 73 20 64 65 73 63 72 69 62 65 64 20 61  ions described a
1ef0: 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 66 74  bove..**.**   ft
1f00: 73 33 4e 6f 64 65 41 64 64 54 65 72 6d 28 29 0a  s3NodeAddTerm().
1f10: 2a 2a 20 20 20 66 74 73 33 4e 6f 64 65 57 72 69  **   fts3NodeWri
1f20: 74 65 28 29 0a 2a 2a 20 20 20 66 74 73 33 4e 6f  te().**   fts3No
1f30: 64 65 46 72 65 65 28 29 0a 2a 2a 0a 2a 2a 20 57  deFree().**.** W
1f40: 68 65 6e 20 61 20 62 2b 74 72 65 65 20 69 73 20  hen a b+tree is 
1f50: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
1f60: 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20  atabase (either 
1f70: 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61  as a result of a
1f80: 20 6d 65 72 67 65 0a 2a 2a 20 6f 72 20 74 68 65   merge.** or the
1f90: 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 74   pending-terms t
1fa0: 61 62 6c 65 20 62 65 69 6e 67 20 66 6c 75 73 68  able being flush
1fb0: 65 64 29 2c 20 6c 65 61 76 65 73 20 61 72 65 20  ed), leaves are 
1fc0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1fd0: 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
1fe0: 6c 65 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  le as soon as th
1ff0: 65 79 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c  ey are completel
2000: 79 20 70 6f 70 75 6c 61 74 65 64 2e 20 54 68 65  y populated. The
2010: 20 69 6e 74 65 72 69 6f 72 20 6f 66 0a 2a 2a 20   interior of.** 
2020: 74 68 65 20 74 72 65 65 20 69 73 20 61 73 73 65  the tree is asse
2030: 6d 62 6c 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  mbled in memory 
2040: 61 6e 64 20 77 72 69 74 74 65 6e 20 6f 75 74 20  and written out 
2050: 6f 6e 6c 79 20 6f 6e 63 65 20 61 6c 6c 20 6c 65  only once all le
2060: 61 76 65 73 20 68 61 76 65 0a 2a 2a 20 62 65 65  aves have.** bee
2070: 6e 20 70 6f 70 75 6c 61 74 65 64 20 61 6e 64 20  n populated and 
2080: 73 74 6f 72 65 64 2e 20 54 68 69 73 20 69 73 20  stored. This is 
2090: 4f 6b 2c 20 61 73 20 74 68 65 20 62 2b 2d 74 72  Ok, as the b+-tr
20a0: 65 65 20 66 61 6e 6f 75 74 20 69 73 20 75 73 75  ee fanout is usu
20b0: 61 6c 6c 79 0a 2a 2a 20 76 65 72 79 20 6c 61 72  ally.** very lar
20c0: 67 65 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ge, meaning that
20d0: 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6f 66   the interior of
20e0: 20 74 68 65 20 74 72 65 65 20 63 6f 6e 73 75 6d   the tree consum
20f0: 65 73 20 72 65 6c 61 74 69 76 65 6c 79 20 0a 2a  es relatively .*
2100: 2a 20 6c 69 74 74 6c 65 20 6d 65 6d 6f 72 79 2e  * little memory.
2110: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 65 67 6d 65  .*/.struct Segme
2120: 6e 74 4e 6f 64 65 20 7b 0a 20 20 53 65 67 6d 65  ntNode {.  Segme
2130: 6e 74 4e 6f 64 65 20 2a 70 50 61 72 65 6e 74 3b  ntNode *pParent;
2140: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2150: 72 65 6e 74 20 6e 6f 64 65 20 28 6f 72 20 4e 55  rent node (or NU
2160: 4c 4c 20 66 6f 72 20 72 6f 6f 74 20 6e 6f 64 65  LL for root node
2170: 29 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e 6f  ) */.  SegmentNo
2180: 64 65 20 2a 70 52 69 67 68 74 3b 20 20 20 20 20  de *pRight;     
2190: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
21a0: 72 20 74 6f 20 72 69 67 68 74 2d 73 69 62 6c 69  r to right-sibli
21b0: 6e 67 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e  ng */.  SegmentN
21c0: 6f 64 65 20 2a 70 4c 65 66 74 6d 6f 73 74 3b 20  ode *pLeftmost; 
21d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
21e0: 65 72 20 74 6f 20 6c 65 66 74 2d 6d 6f 73 74 20  er to left-most 
21f0: 6e 6f 64 65 20 6f 66 20 74 68 69 73 20 64 65 70  node of this dep
2200: 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6e 74  th */.  int nEnt
2210: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ry;             
2220: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2230: 72 20 6f 66 20 74 65 72 6d 73 20 77 72 69 74 74  r of terms writt
2240: 65 6e 20 74 6f 20 6e 6f 64 65 20 73 6f 20 66 61  en to node so fa
2250: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65  r */.  char *zTe
2260: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
2270: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
2280: 72 20 74 6f 20 70 72 65 76 69 6f 75 73 20 74 65  r to previous te
2290: 72 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  rm buffer */.  i
22a0: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
22d0: 73 20 69 6e 20 7a 54 65 72 6d 20 2a 2f 0a 20 20  s in zTerm */.  
22e0: 69 6e 74 20 6e 4d 61 6c 6c 6f 63 3b 20 20 20 20  int nMalloc;    
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 6c 6c 6f  /* Size of mallo
2310: 63 27 64 20 62 75 66 66 65 72 20 61 74 20 7a 4d  c'd buffer at zM
2320: 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20  alloc */.  char 
2330: 2a 7a 4d 61 6c 6c 6f 63 3b 20 20 20 20 20 20 20  *zMalloc;       
2340: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
2350: 6c 6c 6f 63 27 64 20 73 70 61 63 65 20 28 70 6f  lloc'd space (po
2360: 73 73 69 62 6c 79 29 20 75 73 65 64 20 66 6f 72  ssibly) used for
2370: 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20   zTerm */.  int 
2380: 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  nData;          
2390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
23a0: 79 74 65 73 20 6f 66 20 76 61 6c 69 64 20 64 61  ytes of valid da
23b0: 74 61 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63  ta so far */.  c
23c0: 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20  har *aData;     
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23e0: 2a 20 4e 6f 64 65 20 64 61 74 61 20 2a 2f 0a 7d  * Node data */.}
23f0: 3b 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 20 76  ;../*.** Valid v
2400: 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 73 65  alues for the se
2410: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
2420: 20 66 74 73 33 53 71 6c 53 74 6d 74 28 29 2e 0a   fts3SqlStmt()..
2430: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44  */.#define SQL_D
2440: 45 4c 45 54 45 5f 43 4f 4e 54 45 4e 54 20 20 20  ELETE_CONTENT   
2450: 20 20 20 20 20 20 20 20 20 20 30 0a 23 64 65 66            0.#def
2460: 69 6e 65 20 53 51 4c 5f 49 53 5f 45 4d 50 54 59  ine SQL_IS_EMPTY
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 53 51 4c     1.#define SQL
2490: 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 43 4f 4e 54  _DELETE_ALL_CONT
24a0: 45 4e 54 20 20 20 20 20 20 20 20 20 32 20 0a 23  ENT         2 .#
24b0: 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54  define SQL_DELET
24c0: 45 5f 41 4c 4c 5f 53 45 47 4d 45 4e 54 53 20 20  E_ALL_SEGMENTS  
24d0: 20 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20        3.#define 
24e0: 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 53  SQL_DELETE_ALL_S
24f0: 45 47 44 49 52 20 20 20 20 20 20 20 20 20 20 34  EGDIR          4
2500: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c  .#define SQL_DEL
2510: 45 54 45 5f 41 4c 4c 5f 44 4f 43 53 49 5a 45 20  ETE_ALL_DOCSIZE 
2520: 20 20 20 20 20 20 20 20 35 0a 23 64 65 66 69 6e          5.#defin
2530: 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c  e SQL_DELETE_ALL
2540: 5f 53 54 41 54 20 20 20 20 20 20 20 20 20 20 20  _STAT           
2550: 20 36 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53   6.#define SQL_S
2560: 45 4c 45 43 54 5f 43 4f 4e 54 45 4e 54 5f 42 59  ELECT_CONTENT_BY
2570: 5f 52 4f 57 49 44 20 20 20 20 37 0a 23 64 65 66  _ROWID    7.#def
2580: 69 6e 65 20 53 51 4c 5f 4e 45 58 54 5f 53 45 47  ine SQL_NEXT_SEG
2590: 4d 45 4e 54 5f 49 4e 44 45 58 20 20 20 20 20 20  MENT_INDEX      
25a0: 20 20 20 38 0a 23 64 65 66 69 6e 65 20 53 51 4c     8.#define SQL
25b0: 5f 49 4e 53 45 52 54 5f 53 45 47 4d 45 4e 54 53  _INSERT_SEGMENTS
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 39 0a 23 64              9.#d
25d0: 65 66 69 6e 65 20 53 51 4c 5f 4e 45 58 54 5f 53  efine SQL_NEXT_S
25e0: 45 47 4d 45 4e 54 53 5f 49 44 20 20 20 20 20 20  EGMENTS_ID      
25f0: 20 20 20 20 31 30 0a 23 64 65 66 69 6e 65 20 53      10.#define S
2600: 51 4c 5f 49 4e 53 45 52 54 5f 53 45 47 44 49 52  QL_INSERT_SEGDIR
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 31 0a               11.
2620: 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45  #define SQL_SELE
2630: 43 54 5f 4c 45 56 45 4c 20 20 20 20 20 20 20 20  CT_LEVEL        
2640: 20 20 20 20 20 20 31 32 0a 23 64 65 66 69 6e 65        12.#define
2650: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c 45 56 45   SQL_SELECT_LEVE
2660: 4c 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20 31  L_RANGE        1
2670: 33 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45  3.#define SQL_SE
2680: 4c 45 43 54 5f 4c 45 56 45 4c 5f 43 4f 55 4e 54  LECT_LEVEL_COUNT
2690: 20 20 20 20 20 20 20 20 31 34 0a 23 64 65 66 69          14.#defi
26a0: 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 45  ne SQL_SELECT_SE
26b0: 47 44 49 52 5f 4d 41 58 5f 4c 45 56 45 4c 20 20  GDIR_MAX_LEVEL  
26c0: 20 31 35 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f   15.#define SQL_
26d0: 44 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 4c 45  DELETE_SEGDIR_LE
26e0: 56 45 4c 20 20 20 20 20 20 20 31 36 0a 23 64 65  VEL       16.#de
26f0: 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f  fine SQL_DELETE_
2700: 53 45 47 4d 45 4e 54 53 5f 52 41 4e 47 45 20 20  SEGMENTS_RANGE  
2710: 20 20 20 31 37 0a 23 64 65 66 69 6e 65 20 53 51     17.#define SQ
2720: 4c 5f 43 4f 4e 54 45 4e 54 5f 49 4e 53 45 52 54  L_CONTENT_INSERT
2730: 20 20 20 20 20 20 20 20 20 20 20 20 31 38 0a 23              18.#
2740: 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54  define SQL_DELET
2750: 45 5f 44 4f 43 53 49 5a 45 20 20 20 20 20 20 20  E_DOCSIZE       
2760: 20 20 20 20 20 31 39 0a 23 64 65 66 69 6e 65 20       19.#define 
2770: 53 51 4c 5f 52 45 50 4c 41 43 45 5f 44 4f 43 53  SQL_REPLACE_DOCS
2780: 49 5a 45 20 20 20 20 20 20 20 20 20 20 20 32 30  IZE           20
2790: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c  .#define SQL_SEL
27a0: 45 43 54 5f 44 4f 43 53 49 5a 45 20 20 20 20 20  ECT_DOCSIZE     
27b0: 20 20 20 20 20 20 20 32 31 0a 23 64 65 66 69 6e         21.#defin
27c0: 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 54 41  e SQL_SELECT_STA
27d0: 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T               
27e0: 32 32 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 52  22.#define SQL_R
27f0: 45 50 4c 41 43 45 5f 53 54 41 54 20 20 20 20 20  EPLACE_STAT     
2800: 20 20 20 20 20 20 20 20 20 32 33 0a 0a 23 64 65           23..#de
2810: 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f  fine SQL_SELECT_
2820: 41 4c 4c 5f 50 52 45 46 49 58 5f 4c 45 56 45 4c  ALL_PREFIX_LEVEL
2830: 20 20 20 32 34 0a 23 64 65 66 69 6e 65 20 53 51     24.#define SQ
2840: 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 54 45 52  L_DELETE_ALL_TER
2850: 4d 53 5f 53 45 47 44 49 52 20 20 20 32 35 0a 23  MS_SEGDIR   25.#
2860: 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54  define SQL_DELET
2870: 45 5f 53 45 47 44 49 52 5f 52 41 4e 47 45 20 20  E_SEGDIR_RANGE  
2880: 20 20 20 20 20 32 36 0a 23 64 65 66 69 6e 65 20       26.#define 
2890: 53 51 4c 5f 53 45 4c 45 43 54 5f 41 4c 4c 5f 4c  SQL_SELECT_ALL_L
28a0: 41 4e 47 49 44 20 20 20 20 20 20 20 20 20 32 37  ANGID         27
28b0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 46 49 4e  .#define SQL_FIN
28c0: 44 5f 4d 45 52 47 45 5f 4c 45 56 45 4c 20 20 20  D_MERGE_LEVEL   
28d0: 20 20 20 20 20 20 20 32 38 0a 23 64 65 66 69 6e         28.#defin
28e0: 65 20 53 51 4c 5f 4d 41 58 5f 4c 45 41 46 5f 4e  e SQL_MAX_LEAF_N
28f0: 4f 44 45 5f 45 53 54 49 4d 41 54 45 20 20 20 20  ODE_ESTIMATE    
2900: 32 39 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44  29.#define SQL_D
2910: 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 45 4e 54  ELETE_SEGDIR_ENT
2920: 52 59 20 20 20 20 20 20 20 33 30 0a 23 64 65 66  RY       30.#def
2930: 69 6e 65 20 53 51 4c 5f 53 48 49 46 54 5f 53 45  ine SQL_SHIFT_SE
2940: 47 44 49 52 5f 45 4e 54 52 59 20 20 20 20 20 20  GDIR_ENTRY      
2950: 20 20 33 31 0a 23 64 65 66 69 6e 65 20 53 51 4c    31.#define SQL
2960: 5f 53 45 4c 45 43 54 5f 53 45 47 44 49 52 20 20  _SELECT_SEGDIR  
2970: 20 20 20 20 20 20 20 20 20 20 20 33 32 0a 23 64             32.#d
2980: 65 66 69 6e 65 20 53 51 4c 5f 43 48 4f 4d 50 5f  efine SQL_CHOMP_
2990: 53 45 47 44 49 52 20 20 20 20 20 20 20 20 20 20  SEGDIR          
29a0: 20 20 20 20 33 33 0a 23 64 65 66 69 6e 65 20 53      33.#define S
29b0: 51 4c 5f 53 45 47 4d 45 4e 54 5f 49 53 5f 41 50  QL_SEGMENT_IS_AP
29c0: 50 45 4e 44 41 42 4c 45 20 20 20 20 20 33 34 0a  PENDABLE     34.
29d0: 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45  #define SQL_SELE
29e0: 43 54 5f 49 4e 44 45 58 45 53 20 20 20 20 20 20  CT_INDEXES      
29f0: 20 20 20 20 20 20 33 35 0a 23 64 65 66 69 6e 65        35.#define
2a00: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4d 58 4c 45   SQL_SELECT_MXLE
2a10: 56 45 4c 20 20 20 20 20 20 20 20 20 20 20 20 33  VEL            3
2a20: 36 0a 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53  6..#define SQL_S
2a30: 45 4c 45 43 54 5f 4c 45 56 45 4c 5f 52 41 4e 47  ELECT_LEVEL_RANG
2a40: 45 32 20 20 20 20 20 20 20 33 37 0a 23 64 65 66  E2       37.#def
2a50: 69 6e 65 20 53 51 4c 5f 55 50 44 41 54 45 5f 4c  ine SQL_UPDATE_L
2a60: 45 56 45 4c 5f 49 44 58 20 20 20 20 20 20 20 20  EVEL_IDX        
2a70: 20 20 33 38 0a 23 64 65 66 69 6e 65 20 53 51 4c    38.#define SQL
2a80: 5f 55 50 44 41 54 45 5f 4c 45 56 45 4c 20 20 20  _UPDATE_LEVEL   
2a90: 20 20 20 20 20 20 20 20 20 20 20 33 39 0a 0a 2f             39../
2aa0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2ab0: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6f 62  on is used to ob
2ac0: 74 61 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 70  tain an SQLite p
2ad0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
2ae0: 74 20 68 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72 20  t handle.** for 
2af0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 64  the statement id
2b00: 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20  entified by the 
2b10: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
2b20: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a   If successful,.
2b30: 2a 2a 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  ** *pp is set to
2b40: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
2b50: 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20  tatement handle 
2b60: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
2b70: 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72  turned..** Other
2b80: 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20  wise, an SQLite 
2b90: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2ba0: 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69  turned and *pp i
2bb0: 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a  s set to 0..**.*
2bc0: 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 61 70  * If argument ap
2bd0: 56 61 6c 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  Val is not NULL,
2be0: 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 70 6f   then it must po
2bf0: 69 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20  int to an array 
2c00: 77 69 74 68 0a 2a 2a 20 61 74 20 6c 65 61 73 74  with.** at least
2c10: 20 61 73 20 6d 61 6e 79 20 65 6e 74 72 69 65 73   as many entries
2c20: 20 61 73 20 74 68 65 20 72 65 71 75 65 73 74 65   as the requeste
2c30: 64 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20  d statement has 
2c40: 62 6f 75 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65  bound .** parame
2c50: 74 65 72 73 2e 20 54 68 65 20 76 61 6c 75 65 73  ters. The values
2c60: 20 61 72 65 20 62 6f 75 6e 64 20 74 6f 20 74 68   are bound to th
2c70: 65 20 73 74 61 74 65 6d 65 6e 74 73 20 70 61 72  e statements par
2c80: 61 6d 65 74 65 72 73 20 62 65 66 6f 72 65 0a 2a  ameters before.*
2c90: 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  * returning..*/.
2ca0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53  static int fts3S
2cb0: 71 6c 53 74 6d 74 28 0a 20 20 46 74 73 33 54 61  qlStmt(.  Fts3Ta
2cc0: 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
2cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
2ce0: 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
2cf0: 65 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74 6d 74  e */.  int eStmt
2d00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d10: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
2d20: 20 74 68 65 20 53 51 4c 5f 58 58 58 20 63 6f 6e   the SQL_XXX con
2d30: 73 74 61 6e 74 73 20 61 62 6f 76 65 20 2a 2f 0a  stants above */.
2d40: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2d50: 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pp,            
2d60: 20 20 2f 2a 20 4f 55 54 3a 20 53 74 61 74 65 6d    /* OUT: Statem
2d70: 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ent handle */.  
2d80: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
2d90: 61 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20  apVal           
2da0: 2f 2a 20 56 61 6c 75 65 73 20 74 6f 20 62 69 6e  /* Values to bin
2db0: 64 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 20 2a  d to statement *
2dc0: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
2dd0: 72 20 2a 61 7a 53 71 6c 5b 5d 20 3d 20 7b 0a 2f  r *azSql[] = {./
2de0: 2a 20 30 20 20 2a 2f 20 20 22 44 45 4c 45 54 45  * 0  */  "DELETE
2df0: 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 63 6f 6e   FROM %Q.'%q_con
2e00: 74 65 6e 74 27 20 57 48 45 52 45 20 72 6f 77 69  tent' WHERE rowi
2e10: 64 20 3d 20 3f 22 2c 0a 2f 2a 20 31 20 20 2a 2f  d = ?",./* 1  */
2e20: 20 20 22 53 45 4c 45 43 54 20 4e 4f 54 20 45 58    "SELECT NOT EX
2e30: 49 53 54 53 28 53 45 4c 45 43 54 20 64 6f 63 69  ISTS(SELECT doci
2e40: 64 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 63 6f  d FROM %Q.'%q_co
2e50: 6e 74 65 6e 74 27 20 57 48 45 52 45 20 72 6f 77  ntent' WHERE row
2e60: 69 64 21 3d 3f 29 22 2c 0a 2f 2a 20 32 20 20 2a  id!=?)",./* 2  *
2e70: 2f 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  /  "DELETE FROM 
2e80: 25 51 2e 27 25 71 5f 63 6f 6e 74 65 6e 74 27 22  %Q.'%q_content'"
2e90: 2c 0a 2f 2a 20 33 20 20 2a 2f 20 20 22 44 45 4c  ,./* 3  */  "DEL
2ea0: 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  ETE FROM %Q.'%q_
2eb0: 73 65 67 6d 65 6e 74 73 27 22 2c 0a 2f 2a 20 34  segments'",./* 4
2ec0: 20 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46 52    */  "DELETE FR
2ed0: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72  OM %Q.'%q_segdir
2ee0: 27 22 2c 0a 2f 2a 20 35 20 20 2a 2f 20 20 22 44  '",./* 5  */  "D
2ef0: 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25  ELETE FROM %Q.'%
2f00: 71 5f 64 6f 63 73 69 7a 65 27 22 2c 0a 2f 2a 20  q_docsize'",./* 
2f10: 36 20 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46  6  */  "DELETE F
2f20: 52 4f 4d 20 25 51 2e 27 25 71 5f 73 74 61 74 27  ROM %Q.'%q_stat'
2f30: 22 2c 0a 2f 2a 20 37 20 20 2a 2f 20 20 22 53 45  ",./* 7  */  "SE
2f40: 4c 45 43 54 20 25 73 20 57 48 45 52 45 20 72 6f  LECT %s WHERE ro
2f50: 77 69 64 3d 3f 22 2c 0a 2f 2a 20 38 20 20 2a 2f  wid=?",./* 8  */
2f60: 20 20 22 53 45 4c 45 43 54 20 28 53 45 4c 45 43    "SELECT (SELEC
2f70: 54 20 6d 61 78 28 69 64 78 29 20 46 52 4f 4d 20  T max(idx) FROM 
2f80: 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57  %Q.'%q_segdir' W
2f90: 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f 29 20  HERE level = ?) 
2fa0: 2b 20 31 22 2c 0a 2f 2a 20 39 20 20 2a 2f 20 20  + 1",./* 9  */  
2fb0: 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 51  "REPLACE INTO %Q
2fc0: 2e 27 25 71 5f 73 65 67 6d 65 6e 74 73 27 28 62  .'%q_segments'(b
2fd0: 6c 6f 63 6b 69 64 2c 20 62 6c 6f 63 6b 29 20 56  lockid, block) V
2fe0: 41 4c 55 45 53 28 3f 2c 20 3f 29 22 2c 0a 2f 2a  ALUES(?, ?)",./*
2ff0: 20 31 30 20 2a 2f 20 20 22 53 45 4c 45 43 54 20   10 */  "SELECT 
3000: 63 6f 61 6c 65 73 63 65 28 28 53 45 4c 45 43 54  coalesce((SELECT
3010: 20 6d 61 78 28 62 6c 6f 63 6b 69 64 29 20 46 52   max(blockid) FR
3020: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 6d 65 6e  OM %Q.'%q_segmen
3030: 74 73 27 29 20 2b 20 31 2c 20 31 29 22 2c 0a 2f  ts') + 1, 1)",./
3040: 2a 20 31 31 20 2a 2f 20 20 22 52 45 50 4c 41 43  * 11 */  "REPLAC
3050: 45 20 49 4e 54 4f 20 25 51 2e 27 25 71 5f 73 65  E INTO %Q.'%q_se
3060: 67 64 69 72 27 20 56 41 4c 55 45 53 28 3f 2c 3f  gdir' VALUES(?,?
3070: 2c 3f 2c 3f 2c 3f 2c 3f 29 22 2c 0a 0a 20 20 20  ,?,?,?,?)",..   
3080: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
3090: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6f 72 64   segments in ord
30a0: 65 72 20 66 72 6f 6d 20 6f 6c 64 65 73 74 20 74  er from oldest t
30b0: 6f 20 6e 65 77 65 73 74 2e 2a 2f 20 0a 2f 2a 20  o newest.*/ ./* 
30c0: 31 32 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 69  12 */  "SELECT i
30d0: 64 78 2c 20 73 74 61 72 74 5f 62 6c 6f 63 6b 2c  dx, start_block,
30e0: 20 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63   leaves_end_bloc
30f0: 6b 2c 20 65 6e 64 5f 62 6c 6f 63 6b 2c 20 72 6f  k, end_block, ro
3100: 6f 74 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ot ".           
3110: 20 22 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65   "FROM %Q.'%q_se
3120: 67 64 69 72 27 20 57 48 45 52 45 20 6c 65 76 65  gdir' WHERE leve
3130: 6c 20 3d 20 3f 20 4f 52 44 45 52 20 42 59 20 69  l = ? ORDER BY i
3140: 64 78 20 41 53 43 22 2c 0a 2f 2a 20 31 33 20 2a  dx ASC",./* 13 *
3150: 2f 20 20 22 53 45 4c 45 43 54 20 69 64 78 2c 20  /  "SELECT idx, 
3160: 73 74 61 72 74 5f 62 6c 6f 63 6b 2c 20 6c 65 61  start_block, lea
3170: 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 2c 20 65  ves_end_block, e
3180: 6e 64 5f 62 6c 6f 63 6b 2c 20 72 6f 6f 74 20 22  nd_block, root "
3190: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 46 52  .            "FR
31a0: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72  OM %Q.'%q_segdir
31b0: 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20 42 45  ' WHERE level BE
31c0: 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 22 0a 20  TWEEN ? AND ?". 
31d0: 20 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45             "ORDE
31e0: 52 20 42 59 20 6c 65 76 65 6c 20 44 45 53 43 2c  R BY level DESC,
31f0: 20 69 64 78 20 41 53 43 22 2c 0a 0a 2f 2a 20 31   idx ASC",../* 1
3200: 34 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 63 6f  4 */  "SELECT co
3210: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 51 2e 27  unt(*) FROM %Q.'
3220: 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52 45  %q_segdir' WHERE
3230: 20 6c 65 76 65 6c 20 3d 20 3f 22 2c 0a 2f 2a 20   level = ?",./* 
3240: 31 35 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 6d  15 */  "SELECT m
3250: 61 78 28 6c 65 76 65 6c 29 20 46 52 4f 4d 20 25  ax(level) FROM %
3260: 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57 48  Q.'%q_segdir' WH
3270: 45 52 45 20 6c 65 76 65 6c 20 42 45 54 57 45 45  ERE level BETWEE
3280: 4e 20 3f 20 41 4e 44 20 3f 22 2c 0a 0a 2f 2a 20  N ? AND ?",../* 
3290: 31 36 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46  16 */  "DELETE F
32a0: 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69  ROM %Q.'%q_segdi
32b0: 72 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d  r' WHERE level =
32c0: 20 3f 22 2c 0a 2f 2a 20 31 37 20 2a 2f 20 20 22   ?",./* 17 */  "
32d0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 27  DELETE FROM %Q.'
32e0: 25 71 5f 73 65 67 6d 65 6e 74 73 27 20 57 48 45  %q_segments' WHE
32f0: 52 45 20 62 6c 6f 63 6b 69 64 20 42 45 54 57 45  RE blockid BETWE
3300: 45 4e 20 3f 20 41 4e 44 20 3f 22 2c 0a 2f 2a 20  EN ? AND ?",./* 
3310: 31 38 20 2a 2f 20 20 22 49 4e 53 45 52 54 20 49  18 */  "INSERT I
3320: 4e 54 4f 20 25 51 2e 27 25 71 5f 63 6f 6e 74 65  NTO %Q.'%q_conte
3330: 6e 74 27 20 56 41 4c 55 45 53 28 25 73 29 22 2c  nt' VALUES(%s)",
3340: 0a 2f 2a 20 31 39 20 2a 2f 20 20 22 44 45 4c 45  ./* 19 */  "DELE
3350: 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 64  TE FROM %Q.'%q_d
3360: 6f 63 73 69 7a 65 27 20 57 48 45 52 45 20 64 6f  ocsize' WHERE do
3370: 63 69 64 20 3d 20 3f 22 2c 0a 2f 2a 20 32 30 20  cid = ?",./* 20 
3380: 2a 2f 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54  */  "REPLACE INT
3390: 4f 20 25 51 2e 27 25 71 5f 64 6f 63 73 69 7a 65  O %Q.'%q_docsize
33a0: 27 20 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 0a  ' VALUES(?,?)",.
33b0: 2f 2a 20 32 31 20 2a 2f 20 20 22 53 45 4c 45 43  /* 21 */  "SELEC
33c0: 54 20 73 69 7a 65 20 46 52 4f 4d 20 25 51 2e 27  T size FROM %Q.'
33d0: 25 71 5f 64 6f 63 73 69 7a 65 27 20 57 48 45 52  %q_docsize' WHER
33e0: 45 20 64 6f 63 69 64 3d 3f 22 2c 0a 2f 2a 20 32  E docid=?",./* 2
33f0: 32 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 76 61  2 */  "SELECT va
3400: 6c 75 65 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  lue FROM %Q.'%q_
3410: 73 74 61 74 27 20 57 48 45 52 45 20 69 64 3d 3f  stat' WHERE id=?
3420: 22 2c 0a 2f 2a 20 32 33 20 2a 2f 20 20 22 52 45  ",./* 23 */  "RE
3430: 50 4c 41 43 45 20 49 4e 54 4f 20 25 51 2e 27 25  PLACE INTO %Q.'%
3440: 71 5f 73 74 61 74 27 20 56 41 4c 55 45 53 28 3f  q_stat' VALUES(?
3450: 2c 3f 29 22 2c 0a 2f 2a 20 32 34 20 2a 2f 20 20  ,?)",./* 24 */  
3460: 22 22 2c 0a 2f 2a 20 32 35 20 2a 2f 20 20 22 22  "",./* 25 */  ""
3470: 2c 0a 0a 2f 2a 20 32 36 20 2a 2f 20 22 44 45 4c  ,../* 26 */ "DEL
3480: 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  ETE FROM %Q.'%q_
3490: 73 65 67 64 69 72 27 20 57 48 45 52 45 20 6c 65  segdir' WHERE le
34a0: 76 65 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e  vel BETWEEN ? AN
34b0: 44 20 3f 22 2c 0a 2f 2a 20 32 37 20 2a 2f 20 22  D ?",./* 27 */ "
34c0: 53 45 4c 45 43 54 20 3f 20 55 4e 49 4f 4e 20 53  SELECT ? UNION S
34d0: 45 4c 45 43 54 20 6c 65 76 65 6c 20 2f 20 28 31  ELECT level / (1
34e0: 30 32 34 20 2a 20 3f 29 20 46 52 4f 4d 20 25 51  024 * ?) FROM %Q
34f0: 2e 27 25 71 5f 73 65 67 64 69 72 27 22 2c 0a 0a  .'%q_segdir'",..
3500: 2f 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  /* This statemen
3510: 74 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  t is used to det
3520: 65 72 6d 69 6e 65 20 77 68 69 63 68 20 6c 65 76  ermine which lev
3530: 65 6c 20 74 6f 20 72 65 61 64 20 74 68 65 20 69  el to read the i
3540: 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a 20 77 68 65  nput from.** whe
3550: 6e 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 6e 20  n performing an 
3560: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67  incremental merg
3570: 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68  e. It returns th
3580: 65 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c  e absolute level
3590: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 74 68   number.** of th
35a0: 65 20 6f 6c 64 65 73 74 20 6c 65 76 65 6c 20 69  e oldest level i
35b0: 6e 20 74 68 65 20 64 62 20 74 68 61 74 20 63 6f  n the db that co
35c0: 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20  ntains at least 
35d0: 3f 20 73 65 67 6d 65 6e 74 73 2e 20 4f 72 2c 0a  ? segments. Or,.
35e0: 2a 2a 20 69 66 20 6e 6f 20 6c 65 76 65 6c 20 69  ** if no level i
35f0: 6e 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20  n the FTS index 
3600: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
3610: 61 6e 20 3f 20 73 65 67 6d 65 6e 74 73 2c 20 74  an ? segments, t
3620: 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  he statement.** 
3630: 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 72 6f 77  returns zero row
3640: 73 2e 20 20 2a 2f 0a 2f 2a 20 32 38 20 2a 2f 20  s.  */./* 28 */ 
3650: 22 53 45 4c 45 43 54 20 6c 65 76 65 6c 2c 20 63  "SELECT level, c
3660: 6f 75 6e 74 28 2a 29 20 41 53 20 63 6e 74 20 46  ount(*) AS cnt F
3670: 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69  ROM %Q.'%q_segdi
3680: 72 27 20 22 0a 20 20 20 20 20 20 20 20 20 22 20  r' ".         " 
3690: 20 47 52 4f 55 50 20 42 59 20 6c 65 76 65 6c 20   GROUP BY level 
36a0: 48 41 56 49 4e 47 20 63 6e 74 3e 3d 3f 22 0a 20  HAVING cnt>=?". 
36b0: 20 20 20 20 20 20 20 20 22 20 20 4f 52 44 45 52          "  ORDER
36c0: 20 42 59 20 28 6c 65 76 65 6c 20 25 25 20 31 30   BY (level %% 10
36d0: 32 34 29 20 41 53 43 20 4c 49 4d 49 54 20 31 22  24) ASC LIMIT 1"
36e0: 2c 0a 0a 2f 2a 20 45 73 74 69 6d 61 74 65 20 74  ,../* Estimate t
36f0: 68 65 20 75 70 70 65 72 20 6c 69 6d 69 74 20 6f  he upper limit o
3700: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
3710: 6c 65 61 66 20 6e 6f 64 65 73 20 69 6e 20 61 20  leaf nodes in a 
3720: 6e 65 77 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 63  new segment.** c
3730: 72 65 61 74 65 64 20 62 79 20 6d 65 72 67 69 6e  reated by mergin
3740: 67 20 74 68 65 20 6f 6c 64 65 73 74 20 3a 32 20  g the oldest :2 
3750: 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 61 62  segments from ab
3760: 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 3a 31 2e  solute level :1.
3770: 20 53 65 65 20 0a 2a 2a 20 66 75 6e 63 74 69 6f   See .** functio
3780: 6e 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 63  n sqlite3Fts3Inc
3790: 72 6d 65 72 67 65 28 29 20 66 6f 72 20 64 65 74  rmerge() for det
37a0: 61 69 6c 73 2e 20 20 2a 2f 0a 2f 2a 20 32 39 20  ails.  */./* 29 
37b0: 2a 2f 20 22 53 45 4c 45 43 54 20 32 20 2a 20 74  */ "SELECT 2 * t
37c0: 6f 74 61 6c 28 31 20 2b 20 6c 65 61 76 65 73 5f  otal(1 + leaves_
37d0: 65 6e 64 5f 62 6c 6f 63 6b 20 2d 20 73 74 61 72  end_block - star
37e0: 74 5f 62 6c 6f 63 6b 29 20 22 0a 20 20 20 20 20  t_block) ".     
37f0: 20 20 20 20 22 20 20 46 52 4f 4d 20 25 51 2e 27      "  FROM %Q.'
3800: 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52 45  %q_segdir' WHERE
3810: 20 6c 65 76 65 6c 20 3d 20 3f 20 41 4e 44 20 69   level = ? AND i
3820: 64 78 20 3c 20 3f 22 2c 0a 0a 2f 2a 20 53 51 4c  dx < ?",../* SQL
3830: 5f 44 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 45  _DELETE_SEGDIR_E
3840: 4e 54 52 59 0a 2a 2a 20 20 20 44 65 6c 65 74 65  NTRY.**   Delete
3850: 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 65 6e   the %_segdir en
3860: 74 72 79 20 6f 6e 20 61 62 73 6f 6c 75 74 65 20  try on absolute 
3870: 6c 65 76 65 6c 20 3a 31 20 77 69 74 68 20 69 6e  level :1 with in
3880: 64 65 78 20 3a 32 2e 20 20 2a 2f 0a 2f 2a 20 33  dex :2.  */./* 3
3890: 30 20 2a 2f 20 22 44 45 4c 45 54 45 20 46 52 4f  0 */ "DELETE FRO
38a0: 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27  M %Q.'%q_segdir'
38b0: 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f   WHERE level = ?
38c0: 20 41 4e 44 20 69 64 78 20 3d 20 3f 22 2c 0a 0a   AND idx = ?",..
38d0: 2f 2a 20 53 51 4c 5f 53 48 49 46 54 5f 53 45 47  /* SQL_SHIFT_SEG
38e0: 44 49 52 5f 45 4e 54 52 59 0a 2a 2a 20 20 20 4d  DIR_ENTRY.**   M
38f0: 6f 64 69 66 79 20 74 68 65 20 69 64 78 20 76 61  odify the idx va
3900: 6c 75 65 20 66 6f 72 20 74 68 65 20 73 65 67 6d  lue for the segm
3910: 65 6e 74 20 77 69 74 68 20 69 64 78 3d 3a 33 20  ent with idx=:3 
3920: 6f 6e 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65  on absolute leve
3930: 6c 20 3a 32 0a 2a 2a 20 20 20 74 6f 20 3a 31 2e  l :2.**   to :1.
3940: 20 20 2a 2f 0a 2f 2a 20 33 31 20 2a 2f 20 22 55    */./* 31 */ "U
3950: 50 44 41 54 45 20 25 51 2e 27 25 71 5f 73 65 67  PDATE %Q.'%q_seg
3960: 64 69 72 27 20 53 45 54 20 69 64 78 20 3d 20 3f  dir' SET idx = ?
3970: 20 57 48 45 52 45 20 6c 65 76 65 6c 3d 3f 20 41   WHERE level=? A
3980: 4e 44 20 69 64 78 3d 3f 22 2c 0a 0a 2f 2a 20 53  ND idx=?",../* S
3990: 51 4c 5f 53 45 4c 45 43 54 5f 53 45 47 44 49 52  QL_SELECT_SEGDIR
39a0: 0a 2a 2a 20 20 20 52 65 61 64 20 61 20 73 69 6e  .**   Read a sin
39b0: 67 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 74  gle entry from t
39c0: 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c  he %_segdir tabl
39d0: 65 2e 20 54 68 65 20 65 6e 74 72 79 20 66 72 6f  e. The entry fro
39e0: 6d 20 61 62 73 6f 6c 75 74 65 20 0a 2a 2a 20 20  m absolute .**  
39f0: 20 6c 65 76 65 6c 20 3a 31 20 77 69 74 68 20 69   level :1 with i
3a00: 6e 64 65 78 20 76 61 6c 75 65 20 3a 32 2e 20 20  ndex value :2.  
3a10: 2a 2f 0a 2f 2a 20 33 32 20 2a 2f 20 20 22 53 45  */./* 32 */  "SE
3a20: 4c 45 43 54 20 69 64 78 2c 20 73 74 61 72 74 5f  LECT idx, start_
3a30: 62 6c 6f 63 6b 2c 20 6c 65 61 76 65 73 5f 65 6e  block, leaves_en
3a40: 64 5f 62 6c 6f 63 6b 2c 20 65 6e 64 5f 62 6c 6f  d_block, end_blo
3a50: 63 6b 2c 20 72 6f 6f 74 20 22 0a 20 20 20 20 20  ck, root ".     
3a60: 20 20 20 20 20 20 20 22 46 52 4f 4d 20 25 51 2e         "FROM %Q.
3a70: 27 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52  '%q_segdir' WHER
3a80: 45 20 6c 65 76 65 6c 20 3d 20 3f 20 41 4e 44 20  E level = ? AND 
3a90: 69 64 78 20 3d 20 3f 22 2c 0a 0a 2f 2a 20 53 51  idx = ?",../* SQ
3aa0: 4c 5f 43 48 4f 4d 50 5f 53 45 47 44 49 52 0a 2a  L_CHOMP_SEGDIR.*
3ab0: 2a 20 20 20 55 70 64 61 74 65 20 74 68 65 20 73  *   Update the s
3ac0: 74 61 72 74 5f 62 6c 6f 63 6b 20 28 3a 31 29 20  tart_block (:1) 
3ad0: 61 6e 64 20 72 6f 6f 74 20 28 3a 32 29 20 66 69  and root (:2) fi
3ae0: 65 6c 64 73 20 6f 66 20 74 68 65 20 25 5f 73 65  elds of the %_se
3af0: 67 64 69 72 0a 2a 2a 20 20 20 65 6e 74 72 79 20  gdir.**   entry 
3b00: 6c 6f 63 61 74 65 64 20 6f 6e 20 61 62 73 6f 6c  located on absol
3b10: 75 74 65 20 6c 65 76 65 6c 20 3a 33 20 77 69 74  ute level :3 wit
3b20: 68 20 69 6e 64 65 78 20 3a 34 2e 20 20 2a 2f 0a  h index :4.  */.
3b30: 2f 2a 20 33 33 20 2a 2f 20 20 22 55 50 44 41 54  /* 33 */  "UPDAT
3b40: 45 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27  E %Q.'%q_segdir'
3b50: 20 53 45 54 20 73 74 61 72 74 5f 62 6c 6f 63 6b   SET start_block
3b60: 20 3d 20 3f 2c 20 72 6f 6f 74 20 3d 20 3f 22 0a   = ?, root = ?".
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 22 57 48 45              "WHE
3b80: 52 45 20 6c 65 76 65 6c 20 3d 20 3f 20 41 4e 44  RE level = ? AND
3b90: 20 69 64 78 20 3d 20 3f 22 2c 0a 0a 2f 2a 20 53   idx = ?",../* S
3ba0: 51 4c 5f 53 45 47 4d 45 4e 54 5f 49 53 5f 41 50  QL_SEGMENT_IS_AP
3bb0: 50 45 4e 44 41 42 4c 45 0a 2a 2a 20 20 20 52 65  PENDABLE.**   Re
3bc0: 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f  turn a single ro
3bd0: 77 20 69 66 20 74 68 65 20 73 65 67 6d 65 6e 74  w if the segment
3be0: 20 77 69 74 68 20 65 6e 64 5f 62 6c 6f 63 6b 3d   with end_block=
3bf0: 3f 20 69 73 20 61 70 70 65 6e 64 61 62 6c 65 2e  ? is appendable.
3c00: 20 4f 72 0a 2a 2a 20 20 20 6e 6f 20 72 6f 77 73   Or.**   no rows
3c10: 20 6f 74 68 65 72 77 69 73 65 2e 20 20 2a 2f 0a   otherwise.  */.
3c20: 2f 2a 20 33 34 20 2a 2f 20 20 22 53 45 4c 45 43  /* 34 */  "SELEC
3c30: 54 20 31 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  T 1 FROM %Q.'%q_
3c40: 73 65 67 6d 65 6e 74 73 27 20 57 48 45 52 45 20  segments' WHERE 
3c50: 62 6c 6f 63 6b 69 64 3d 3f 20 41 4e 44 20 62 6c  blockid=? AND bl
3c60: 6f 63 6b 20 49 53 20 4e 55 4c 4c 22 2c 0a 0a 2f  ock IS NULL",../
3c70: 2a 20 53 51 4c 5f 53 45 4c 45 43 54 5f 49 4e 44  * SQL_SELECT_IND
3c80: 45 58 45 53 0a 2a 2a 20 20 20 52 65 74 75 72 6e  EXES.**   Return
3c90: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 76 61 6c   the list of val
3ca0: 69 64 20 73 65 67 6d 65 6e 74 20 69 6e 64 65 78  id segment index
3cb0: 65 73 20 66 6f 72 20 61 62 73 6f 6c 75 74 65 20  es for absolute 
3cc0: 6c 65 76 65 6c 20 3f 20 20 2a 2f 0a 2f 2a 20 33  level ?  */./* 3
3cd0: 35 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 69 64  5 */  "SELECT id
3ce0: 78 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65  x FROM %Q.'%q_se
3cf0: 67 64 69 72 27 20 57 48 45 52 45 20 6c 65 76 65  gdir' WHERE leve
3d00: 6c 3d 3f 20 4f 52 44 45 52 20 42 59 20 31 20 41  l=? ORDER BY 1 A
3d10: 53 43 22 2c 0a 0a 2f 2a 20 53 51 4c 5f 53 45 4c  SC",../* SQL_SEL
3d20: 45 43 54 5f 4d 58 4c 45 56 45 4c 0a 2a 2a 20 20  ECT_MXLEVEL.**  
3d30: 20 52 65 74 75 72 6e 20 74 68 65 20 6c 61 72 67   Return the larg
3d40: 65 73 74 20 72 65 6c 61 74 69 76 65 20 6c 65 76  est relative lev
3d50: 65 6c 20 69 6e 20 74 68 65 20 46 54 53 20 69 6e  el in the FTS in
3d60: 64 65 78 20 6f 72 20 69 6e 64 65 78 65 73 2e 20  dex or indexes. 
3d70: 20 2a 2f 0a 2f 2a 20 33 36 20 2a 2f 20 20 22 53   */./* 36 */  "S
3d80: 45 4c 45 43 54 20 6d 61 78 28 20 6c 65 76 65 6c  ELECT max( level
3d90: 20 25 25 20 31 30 32 34 20 29 20 46 52 4f 4d 20   %% 1024 ) FROM 
3da0: 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 22 2c  %Q.'%q_segdir'",
3db0: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ..          /* R
3dc0: 65 74 75 72 6e 20 73 65 67 6d 65 6e 74 73 20 69  eturn segments i
3dd0: 6e 20 6f 72 64 65 72 20 66 72 6f 6d 20 6f 6c 64  n order from old
3de0: 65 73 74 20 74 6f 20 6e 65 77 65 73 74 2e 2a 2f  est to newest.*/
3df0: 20 0a 2f 2a 20 33 37 20 2a 2f 20 20 22 53 45 4c   ./* 37 */  "SEL
3e00: 45 43 54 20 6c 65 76 65 6c 2c 20 69 64 78 2c 20  ECT level, idx, 
3e10: 65 6e 64 5f 62 6c 6f 63 6b 20 22 0a 20 20 20 20  end_block ".    
3e20: 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 25 51          "FROM %Q
3e30: 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57 48 45  .'%q_segdir' WHE
3e40: 52 45 20 6c 65 76 65 6c 20 42 45 54 57 45 45 4e  RE level BETWEEN
3e50: 20 3f 20 41 4e 44 20 3f 20 22 0a 20 20 20 20 20   ? AND ? ".     
3e60: 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59         "ORDER BY
3e70: 20 6c 65 76 65 6c 20 44 45 53 43 2c 20 69 64 78   level DESC, idx
3e80: 20 41 53 43 22 2c 0a 0a 20 20 20 20 20 20 20 20   ASC",..        
3e90: 20 20 2f 2a 20 55 70 64 61 74 65 20 73 74 61 74    /* Update stat
3ea0: 65 6d 65 6e 74 73 20 75 73 65 64 20 77 68 69 6c  ements used whil
3eb0: 65 20 70 72 6f 6d 6f 74 69 6e 67 20 73 65 67 6d  e promoting segm
3ec0: 65 6e 74 73 20 2a 2f 0a 2f 2a 20 33 38 20 2a 2f  ents */./* 38 */
3ed0: 20 20 22 55 50 44 41 54 45 20 4f 52 20 46 41 49    "UPDATE OR FAI
3ee0: 4c 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27  L %Q.'%q_segdir'
3ef0: 20 53 45 54 20 6c 65 76 65 6c 3d 2d 31 2c 69 64   SET level=-1,id
3f00: 78 3d 3f 20 22 0a 20 20 20 20 20 20 20 20 20 20  x=? ".          
3f10: 20 20 22 57 48 45 52 45 20 6c 65 76 65 6c 3d 3f    "WHERE level=?
3f20: 20 41 4e 44 20 69 64 78 3d 3f 22 2c 0a 2f 2a 20   AND idx=?",./* 
3f30: 33 39 20 2a 2f 20 20 22 55 50 44 41 54 45 20 4f  39 */  "UPDATE O
3f40: 52 20 46 41 49 4c 20 25 51 2e 27 25 71 5f 73 65  R FAIL %Q.'%q_se
3f50: 67 64 69 72 27 20 53 45 54 20 6c 65 76 65 6c 3d  gdir' SET level=
3f60: 3f 20 57 48 45 52 45 20 6c 65 76 65 6c 3d 2d 31  ? WHERE level=-1
3f70: 22 0a 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 72 63  "..  };.  int rc
3f80: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
3f90: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
3fa0: 74 6d 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  tmt;..  assert( 
3fb0: 53 69 7a 65 6f 66 41 72 72 61 79 28 61 7a 53 71  SizeofArray(azSq
3fc0: 6c 29 3d 3d 53 69 7a 65 6f 66 41 72 72 61 79 28  l)==SizeofArray(
3fd0: 70 2d 3e 61 53 74 6d 74 29 20 29 3b 0a 20 20 61  p->aStmt) );.  a
3fe0: 73 73 65 72 74 28 20 65 53 74 6d 74 3c 53 69 7a  ssert( eStmt<Siz
3ff0: 65 6f 66 41 72 72 61 79 28 61 7a 53 71 6c 29 20  eofArray(azSql) 
4000: 26 26 20 65 53 74 6d 74 3e 3d 30 20 29 3b 0a 20  && eStmt>=0 );. 
4010: 20 0a 20 20 70 53 74 6d 74 20 3d 20 70 2d 3e 61   .  pStmt = p->a
4020: 53 74 6d 74 5b 65 53 74 6d 74 5d 3b 0a 20 20 69  Stmt[eStmt];.  i
4030: 66 28 20 21 70 53 74 6d 74 20 29 7b 0a 20 20 20  f( !pStmt ){.   
4040: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20   char *zSql;.   
4050: 20 69 66 28 20 65 53 74 6d 74 3d 3d 53 51 4c 5f   if( eStmt==SQL_
4060: 43 4f 4e 54 45 4e 54 5f 49 4e 53 45 52 54 20 29  CONTENT_INSERT )
4070: 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73  {.      zSql = s
4080: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
4090: 7a 53 71 6c 5b 65 53 74 6d 74 5d 2c 20 70 2d 3e  zSql[eStmt], p->
40a0: 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70  zDb, p->zName, p
40b0: 2d 3e 7a 57 72 69 74 65 45 78 70 72 6c 69 73 74  ->zWriteExprlist
40c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
40d0: 20 65 53 74 6d 74 3d 3d 53 51 4c 5f 53 45 4c 45   eStmt==SQL_SELE
40e0: 43 54 5f 43 4f 4e 54 45 4e 54 5f 42 59 5f 52 4f  CT_CONTENT_BY_RO
40f0: 57 49 44 20 29 7b 0a 20 20 20 20 20 20 7a 53 71  WID ){.      zSq
4100: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
4110: 6e 74 66 28 61 7a 53 71 6c 5b 65 53 74 6d 74 5d  ntf(azSql[eStmt]
4120: 2c 20 70 2d 3e 7a 52 65 61 64 45 78 70 72 6c 69  , p->zReadExprli
4130: 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  st);.    }else{.
4140: 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
4150: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 7a 53  ite3_mprintf(azS
4160: 71 6c 5b 65 53 74 6d 74 5d 2c 20 70 2d 3e 7a 44  ql[eStmt], p->zD
4170: 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  b, p->zName);.  
4180: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a 53 71    }.    if( !zSq
4190: 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
41a0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
41b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
41c0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
41d0: 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
41e0: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
41f0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
4200: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
4210: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
4220: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
4230: 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
4240: 20 20 70 2d 3e 61 53 74 6d 74 5b 65 53 74 6d 74    p->aStmt[eStmt
4250: 5d 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 7d  ] = pStmt;.    }
4260: 0a 20 20 7d 0a 20 20 69 66 28 20 61 70 56 61 6c  .  }.  if( apVal
4270: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
4280: 20 20 20 69 6e 74 20 6e 50 61 72 61 6d 20 3d 20     int nParam = 
4290: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
42a0: 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74  ameter_count(pSt
42b0: 6d 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  mt);.    for(i=0
42c0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
42d0: 26 26 20 69 3c 6e 50 61 72 61 6d 3b 20 69 2b 2b  && i<nParam; i++
42e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
42f0: 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65  lite3_bind_value
4300: 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61 70 56  (pStmt, i+1, apV
4310: 61 6c 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  al[i]);.    }.  
4320: 7d 0a 20 20 2a 70 70 20 3d 20 70 53 74 6d 74 3b  }.  *pp = pStmt;
4330: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4340: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
4350: 33 53 65 6c 65 63 74 44 6f 63 73 69 7a 65 28 0a  3SelectDocsize(.
4360: 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 54 61    Fts3Table *pTa
4370: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
4380: 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20    /* FTS3 table 
4390: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69  handle */.  sqli
43a0: 74 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64  te3_int64 iDocid
43b0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ,           /* D
43c0: 6f 63 69 64 20 74 6f 20 62 69 6e 64 20 66 6f 72  ocid to bind for
43d0: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 44 4f 43 53   SQL_SELECT_DOCS
43e0: 49 5a 45 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  IZE */.  sqlite3
43f0: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 20 20  _stmt **ppStmt  
4400: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
4410: 20 53 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   Statement handl
4420: 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
4430: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
4440: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61  0;        /* Sta
4450: 74 65 6d 65 6e 74 20 72 65 71 75 65 73 74 65 64  tement requested
4460: 20 66 72 6f 6d 20 66 74 73 33 53 71 6c 53 74 6d   from fts3SqlStm
4470: 74 28 29 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  t() */.  int rc;
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4490: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
44a0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 72 63  rn code */..  rc
44b0: 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
44c0: 54 61 62 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f  Tab, SQL_SELECT_
44d0: 44 4f 43 53 49 5a 45 2c 20 26 70 53 74 6d 74 2c  DOCSIZE, &pStmt,
44e0: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
44f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4500: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
4510: 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 69 44 6f  64(pStmt, 1, iDo
4520: 63 69 64 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  cid);.    rc = s
4530: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
4540: 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
4550: 53 51 4c 49 54 45 5f 52 4f 57 20 7c 7c 20 73 71  SQLITE_ROW || sq
4560: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
4570: 65 28 70 53 74 6d 74 2c 20 30 29 21 3d 53 51 4c  e(pStmt, 0)!=SQL
4580: 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20  ITE_BLOB ){.    
4590: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
45a0: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  eset(pStmt);.   
45b0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
45c0: 45 5f 4f 4b 20 29 20 72 63 20 3d 20 46 54 53 5f  E_OK ) rc = FTS_
45d0: 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20  CORRUPT_VTAB;.  
45e0: 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20      pStmt = 0;. 
45f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4600: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
4610: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70      }.  }..  *pp
4620: 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20  Stmt = pStmt;.  
4630: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e  return rc;.}..in
4640: 74 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 6c  t sqlite3Fts3Sel
4650: 65 63 74 44 6f 63 74 6f 74 61 6c 28 0a 20 20 46  ectDoctotal(.  F
4660: 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  ts3Table *pTab, 
4670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4680: 2a 20 46 74 73 33 20 74 61 62 6c 65 20 68 61 6e  * Fts3 table han
4690: 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dle */.  sqlite3
46a0: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 20 20  _stmt **ppStmt  
46b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
46c0: 20 53 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   Statement handl
46d0: 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
46e0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
46f0: 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72  0;.  int rc;.  r
4700: 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
4710: 70 54 61 62 2c 20 53 51 4c 5f 53 45 4c 45 43 54  pTab, SQL_SELECT
4720: 5f 53 54 41 54 2c 20 26 70 53 74 6d 74 2c 20 30  _STAT, &pStmt, 0
4730: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
4740: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
4750: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
4760: 53 74 6d 74 2c 20 31 2c 20 46 54 53 5f 53 54 41  Stmt, 1, FTS_STA
4770: 54 5f 44 4f 43 54 4f 54 41 4c 29 3b 0a 20 20 20  T_DOCTOTAL);.   
4780: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65   if( sqlite3_ste
4790: 70 28 70 53 74 6d 74 29 21 3d 53 51 4c 49 54 45  p(pStmt)!=SQLITE
47a0: 5f 52 4f 57 0a 20 20 20 20 20 7c 7c 20 73 71 6c  _ROW.     || sql
47b0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
47c0: 28 70 53 74 6d 74 2c 20 30 29 21 3d 53 51 4c 49  (pStmt, 0)!=SQLI
47d0: 54 45 5f 42 4c 4f 42 0a 20 20 20 20 29 7b 0a 20  TE_BLOB.    ){. 
47e0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
47f0: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
4800: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
4810: 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 46  LITE_OK ) rc = F
4820: 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b  TS_CORRUPT_VTAB;
4830: 0a 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20 30  .      pStmt = 0
4840: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
4850: 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20  pStmt = pStmt;. 
4860: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69   return rc;.}..i
4870: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 53 65  nt sqlite3Fts3Se
4880: 6c 65 63 74 44 6f 63 73 69 7a 65 28 0a 20 20 46  lectDocsize(.  F
4890: 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  ts3Table *pTab, 
48a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
48b0: 2a 20 46 74 73 33 20 74 61 62 6c 65 20 68 61 6e  * Fts3 table han
48c0: 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dle */.  sqlite3
48d0: 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 2c 20 20  _int64 iDocid,  
48e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 69           /* Doci
48f0: 64 20 74 6f 20 72 65 61 64 20 73 69 7a 65 20 64  d to read size d
4900: 61 74 61 20 66 6f 72 20 2a 2f 0a 20 20 73 71 6c  ata for */.  sql
4910: 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
4920: 6d 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mt           /* 
4930: 4f 55 54 3a 20 53 74 61 74 65 6d 65 6e 74 20 68  OUT: Statement h
4940: 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a 20 20 72 65  andle */.){.  re
4950: 74 75 72 6e 20 66 74 73 33 53 65 6c 65 63 74 44  turn fts3SelectD
4960: 6f 63 73 69 7a 65 28 70 54 61 62 2c 20 69 44 6f  ocsize(pTab, iDo
4970: 63 69 64 2c 20 70 70 53 74 6d 74 29 3b 0a 7d 0a  cid, ppStmt);.}.
4980: 0a 2f 2a 0a 2a 2a 20 53 69 6d 69 6c 61 72 20 74  ./*.** Similar t
4990: 6f 20 66 74 73 33 53 71 6c 53 74 6d 74 28 29 2e  o fts3SqlStmt().
49a0: 20 45 78 63 65 70 74 2c 20 61 66 74 65 72 20 62   Except, after b
49b0: 69 6e 64 69 6e 67 20 74 68 65 20 70 61 72 61 6d  inding the param
49c0: 65 74 65 72 73 20 69 6e 0a 2a 2a 20 61 72 72 61  eters in.** arra
49d0: 79 20 61 70 56 61 6c 5b 5d 20 74 6f 20 74 68 65  y apVal[] to the
49e0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
49f0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 65 53 74  dentified by eSt
4a00: 6d 74 2c 20 74 68 65 20 73 74 61 74 65 6d 65 6e  mt, the statemen
4a10: 74 0a 2a 2a 20 69 73 20 65 78 65 63 75 74 65 64  t.** is executed
4a20: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  ..**.** Returns 
4a30: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
4a40: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 75   statement is su
4a50: 63 63 65 73 73 66 75 6c 6c 79 20 65 78 65 63 75  ccessfully execu
4a60: 74 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 53 51  ted, or an.** SQ
4a70: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
4a80: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
4a90: 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 53 71  atic void fts3Sq
4aa0: 6c 45 78 65 63 28 0a 20 20 69 6e 74 20 2a 70 52  lExec(.  int *pR
4ab0: 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C,              
4ac0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
4ad0: 20 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c 65 20   */.  Fts3Table 
4ae0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
4af0: 2a 20 54 68 65 20 46 54 53 33 20 74 61 62 6c 65  * The FTS3 table
4b00: 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74 6d 74 2c   */.  int eStmt,
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4b20: 2a 20 49 6e 64 65 78 20 6f 66 20 73 74 61 74 65  * Index of state
4b30: 6d 65 6e 74 20 74 6f 20 65 76 61 6c 75 61 74 65  ment to evaluate
4b40: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
4b50: 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 2f  lue **apVal    /
4b60: 2a 20 50 61 72 61 6d 65 74 65 72 73 20 74 6f 20  * Parameters to 
4b70: 62 69 6e 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  bind */.){.  sql
4b80: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
4b90: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
4ba0: 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
4bb0: 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
4bc0: 74 6d 74 28 70 2c 20 65 53 74 6d 74 2c 20 26 70  tmt(p, eStmt, &p
4bd0: 53 74 6d 74 2c 20 61 70 56 61 6c 29 3b 20 0a 20  Stmt, apVal); . 
4be0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4bf0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
4c00: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
4c10: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
4c20: 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
4c30: 7d 0a 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 7d  }.  *pRC = rc;.}
4c40: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
4c50: 6e 63 74 69 6f 6e 20 65 6e 73 75 72 65 73 20 74  nction ensures t
4c60: 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
4c70: 61 73 20 6f 62 74 61 69 6e 65 64 20 61 6e 20 65  as obtained an e
4c80: 78 63 6c 75 73 69 76 65 20 0a 2a 2a 20 73 68 61  xclusive .** sha
4c90: 72 65 64 2d 63 61 63 68 65 20 74 61 62 6c 65 2d  red-cache table-
4ca0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 25 5f 73 65  lock on the %_se
4cb0: 67 64 69 72 20 74 61 62 6c 65 2e 20 54 68 69 73  gdir table. This
4cc0: 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66   is required bef
4cd0: 6f 72 65 20 0a 2a 2a 20 77 72 69 74 69 6e 67 20  ore .** writing 
4ce0: 64 61 74 61 20 74 6f 20 74 68 65 20 66 74 73 33  data to the fts3
4cf0: 20 74 61 62 6c 65 2e 20 49 66 20 74 68 69 73 20   table. If this 
4d00: 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 61 63 71 75  lock is not acqu
4d10: 69 72 65 64 20 66 69 72 73 74 2c 20 74 68 65 6e  ired first, then
4d20: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 6d  .** the caller m
4d30: 61 79 20 65 6e 64 20 75 70 20 61 74 74 65 6d 70  ay end up attemp
4d40: 74 69 6e 67 20 74 6f 20 74 61 6b 65 20 74 68 69  ting to take thi
4d50: 73 20 6c 6f 63 6b 20 61 73 20 70 61 72 74 20 6f  s lock as part o
4d60: 66 20 63 6f 6d 6d 69 74 74 69 6e 67 0a 2a 2a 20  f committing.** 
4d70: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63  a transaction, c
4d80: 61 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f  ausing SQLite to
4d90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
4da0: 4f 43 4b 45 44 20 6f 72 20 0a 2a 2a 20 4c 4f 43  OCKED or .** LOC
4db0: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 74  KED_SHAREDCACHEt
4dc0: 6f 20 61 20 43 4f 4d 4d 49 54 20 63 6f 6d 6d 61  o a COMMIT comma
4dd0: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  nd..**.** It is 
4de0: 62 65 73 74 20 74 6f 20 61 76 6f 69 64 20 74 68  best to avoid th
4df0: 69 73 20 62 65 63 61 75 73 65 20 69 66 20 46 54  is because if FT
4e00: 53 33 20 72 65 74 75 72 6e 73 20 61 6e 79 20 65  S3 returns any e
4e10: 72 72 6f 72 20 77 68 65 6e 20 0a 2a 2a 20 63 6f  rror when .** co
4e20: 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
4e30: 61 63 74 69 6f 6e 2c 20 74 68 65 20 77 68 6f 6c  action, the whol
4e40: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  e transaction wi
4e50: 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ll be rolled bac
4e60: 6b 2e 20 0a 2a 2a 20 41 6e 64 20 74 68 69 73 20  k. .** And this 
4e70: 69 73 20 6e 6f 74 20 77 68 61 74 20 75 73 65 72  is not what user
4e80: 73 20 65 78 70 65 63 74 20 77 68 65 6e 20 74 68  s expect when th
4e90: 65 79 20 67 65 74 20 53 51 4c 49 54 45 5f 4c 4f  ey get SQLITE_LO
4ea0: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
4eb0: 2e 20 0a 2a 2a 20 49 74 20 63 61 6e 20 73 74 69  . .** It can sti
4ec0: 6c 6c 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ll happen if the
4ed0: 20 75 73 65 72 20 6c 6f 63 6b 73 20 74 68 65 20   user locks the 
4ee0: 75 6e 64 65 72 6c 79 69 6e 67 20 74 61 62 6c 65  underlying table
4ef0: 73 20 64 69 72 65 63 74 6c 79 20 0a 2a 2a 20 69  s directly .** i
4f00: 6e 73 74 65 61 64 20 6f 66 20 61 63 63 65 73 73  nstead of access
4f10: 69 6e 67 20 74 68 65 6d 20 76 69 61 20 46 54 53  ing them via FTS
4f20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4f30: 66 74 73 33 57 72 69 74 65 6c 6f 63 6b 28 46 74  fts3Writelock(Ft
4f40: 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69  s3Table *p){.  i
4f50: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
4f60: 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70 2d 3e 6e  K;.  .  if( p->n
4f70: 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29  PendingData==0 )
4f80: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
4f90: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 72  mt *pStmt;.    r
4fa0: 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
4fb0: 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45  p, SQL_DELETE_SE
4fc0: 47 44 49 52 5f 4c 45 56 45 4c 2c 20 26 70 53 74  GDIR_LEVEL, &pSt
4fd0: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mt, 0);.    if( 
4fe0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
4ff0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
5000: 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20  ind_null(pStmt, 
5010: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
5020: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
5030: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
5040: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
5050: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
5060: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5070: 20 46 54 53 20 6d 61 69 6e 74 61 69 6e 73 20 61   FTS maintains a
5080: 20 73 65 70 61 72 61 74 65 20 69 6e 64 65 78 65   separate indexe
5090: 73 20 66 6f 72 20 65 61 63 68 20 6c 61 6e 67 75  s for each langu
50a0: 61 67 65 2d 69 64 20 28 61 20 33 32 2d 62 69 74  age-id (a 32-bit
50b0: 20 69 6e 74 65 67 65 72 29 2e 0a 2a 2a 20 57 69   integer)..** Wi
50c0: 74 68 69 6e 20 65 61 63 68 20 6c 61 6e 67 75 61  thin each langua
50d0: 67 65 20 69 64 2c 20 61 20 73 65 70 61 72 61 74  ge id, a separat
50e0: 65 20 69 6e 64 65 78 20 69 73 20 6d 61 69 6e 74  e index is maint
50f0: 61 69 6e 65 64 20 74 6f 20 73 74 6f 72 65 20 74  ained to store t
5100: 68 65 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 20 74  he.** document t
5110: 65 72 6d 73 2c 20 61 6e 64 20 65 61 63 68 20 63  erms, and each c
5120: 6f 6e 66 69 67 75 72 65 64 20 70 72 65 66 69 78  onfigured prefix
5130: 20 73 69 7a 65 20 28 63 6f 6e 66 69 67 75 72 65   size (configure
5140: 64 20 74 68 65 20 46 54 53 20 0a 2a 2a 20 22 70  d the FTS .** "p
5150: 72 65 66 69 78 3d 22 20 6f 70 74 69 6f 6e 29 2e  refix=" option).
5160: 20 41 6e 64 20 65 61 63 68 20 69 6e 64 65 78 20   And each index 
5170: 63 6f 6e 73 69 73 74 73 20 6f 66 20 6d 75 6c 74  consists of mult
5180: 69 70 6c 65 20 6c 65 76 65 6c 73 20 28 22 72 65  iple levels ("re
5190: 6c 61 74 69 76 65 0a 2a 2a 20 6c 65 76 65 6c 73  lative.** levels
51a0: 22 29 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 68  ")..**.** All th
51b0: 72 65 65 20 6f 66 20 74 68 65 73 65 20 76 61 6c  ree of these val
51c0: 75 65 73 20 28 74 68 65 20 6c 61 6e 67 75 61 67  ues (the languag
51d0: 65 20 69 64 2c 20 74 68 65 20 73 70 65 63 69 66  e id, the specif
51e0: 69 63 20 69 6e 64 65 78 20 61 6e 64 20 74 68 65  ic index and the
51f0: 0a 2a 2a 20 6c 65 76 65 6c 20 77 69 74 68 69 6e  .** level within
5200: 20 74 68 65 20 69 6e 64 65 78 29 20 61 72 65 20   the index) are 
5210: 65 6e 63 6f 64 65 64 20 69 6e 20 36 34 2d 62 69  encoded in 64-bi
5220: 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73  t integer values
5230: 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68   stored.** in th
5240: 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65  e %_segdir table
5250: 20 6f 6e 20 64 69 73 6b 2e 20 54 68 69 73 20 66   on disk. This f
5260: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
5270: 74 6f 20 63 6f 6e 76 65 72 74 20 74 68 72 65 65  to convert three
5280: 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 63 6f 6d  .** separate com
5290: 70 6f 6e 65 6e 74 20 76 61 6c 75 65 73 20 69 6e  ponent values in
52a0: 74 6f 20 74 68 65 20 73 69 6e 67 6c 65 20 36 34  to the single 64
52b0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c  -bit integer val
52c0: 75 65 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62  ue that.** can b
52d0: 65 20 75 73 65 64 20 74 6f 20 71 75 65 72 79 20  e used to query 
52e0: 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62  the %_segdir tab
52f0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66  le..**.** Specif
5300: 69 63 61 6c 6c 79 2c 20 65 61 63 68 20 6c 61 6e  ically, each lan
5310: 67 75 61 67 65 2d 69 64 2f 69 6e 64 65 78 20 63  guage-id/index c
5320: 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73 20 61 6c  ombination is al
5330: 6c 6f 63 61 74 65 64 20 31 30 32 34 20 0a 2a 2a  located 1024 .**
5340: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
5350: 6c 65 76 65 6c 20 76 61 6c 75 65 73 20 28 22 61  level values ("a
5360: 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 73 22 29  bsolute levels")
5370: 2e 20 54 68 65 20 6d 61 69 6e 20 74 65 72 6d 73  . The main terms
5380: 20 69 6e 64 65 78 0a 2a 2a 20 66 6f 72 20 6c 61   index.** for la
5390: 6e 67 75 61 67 65 2d 69 64 20 30 20 69 73 20 61  nguage-id 0 is a
53a0: 6c 6c 6f 63 61 74 65 20 76 61 6c 75 65 73 20 30  llocate values 0
53b0: 2d 31 30 32 33 2e 20 54 68 65 20 66 69 72 73 74  -1023. The first
53c0: 20 70 72 65 66 69 78 20 69 6e 64 65 78 0a 2a 2a   prefix index.**
53d0: 20 28 69 66 20 61 6e 79 29 20 66 6f 72 20 6c 61   (if any) for la
53e0: 6e 67 75 61 67 65 2d 69 64 20 30 20 69 73 20 61  nguage-id 0 is a
53f0: 6c 6c 6f 63 61 74 65 64 20 76 61 6c 75 65 73 20  llocated values 
5400: 31 30 32 34 2d 32 30 34 37 2e 20 41 6e 64 20 73  1024-2047. And s
5410: 6f 20 6f 6e 2e 0a 2a 2a 20 4c 61 6e 67 75 61 67  o on..** Languag
5420: 65 20 31 20 69 6e 64 65 78 65 73 20 61 72 65 20  e 1 indexes are 
5430: 61 6c 6c 6f 63 61 74 65 64 20 69 6d 6d 65 64 69  allocated immedi
5440: 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
5450: 6c 61 6e 67 75 61 67 65 20 30 2e 0a 2a 2a 0a 2a  language 0..**.*
5460: 2a 20 53 6f 2c 20 66 6f 72 20 61 20 73 79 73 74  * So, for a syst
5470: 65 6d 20 77 69 74 68 20 6e 50 72 65 66 69 78 20  em with nPrefix 
5480: 70 72 65 66 69 78 20 69 6e 64 65 78 65 73 20 63  prefix indexes c
5490: 6f 6e 66 69 67 75 72 65 64 2c 20 74 68 65 20 62  onfigured, the b
54a0: 6c 6f 63 6b 20 6f 66 0a 2a 2a 20 61 62 73 6f 6c  lock of.** absol
54b0: 75 74 65 20 6c 65 76 65 6c 73 20 74 68 61 74 20  ute levels that 
54c0: 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 6c  corresponds to l
54d0: 61 6e 67 75 61 67 65 2d 69 64 20 69 4c 61 6e 67  anguage-id iLang
54e0: 69 64 20 61 6e 64 20 69 6e 64 65 78 20 0a 2a 2a  id and index .**
54f0: 20 69 49 6e 64 65 78 20 73 74 61 72 74 73 20 61   iIndex starts a
5500: 74 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c  t absolute level
5510: 20 28 28 69 4c 61 6e 67 69 64 20 2a 20 28 6e 50   ((iLangid * (nP
5520: 72 65 66 69 78 2b 31 29 20 2b 20 69 49 6e 64 65  refix+1) + iInde
5530: 78 29 20 2a 20 31 30 32 34 29 2e 0a 2a 2f 0a 73  x) * 1024)..*/.s
5540: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e  tatic sqlite3_in
5550: 74 36 34 20 67 65 74 41 62 73 6f 6c 75 74 65 4c  t64 getAbsoluteL
5560: 65 76 65 6c 28 0a 20 20 46 74 73 33 54 61 62 6c  evel(.  Fts3Tabl
5570: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
5580: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20          /* FTS3 
5590: 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
55a0: 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20    int iLangid,  
55b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55c0: 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64    /* Language id
55d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 78   */.  int iIndex
55e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
55f0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
5600: 6e 20 70 2d 3e 61 49 6e 64 65 78 5b 5d 20 2a 2f  n p->aIndex[] */
5610: 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 20 20 20  .  int iLevel   
5620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5630: 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 20 73     /* Level of s
5640: 65 67 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  egments */.){.  
5650: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 42  sqlite3_int64 iB
5660: 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
5670: 2f 2a 20 46 69 72 73 74 20 61 62 73 6f 6c 75 74  /* First absolut
5680: 65 20 6c 65 76 65 6c 20 66 6f 72 20 69 4c 61 6e  e level for iLan
5690: 67 69 64 2f 69 49 6e 64 65 78 20 2a 2f 0a 20 20  gid/iIndex */.  
56a0: 61 73 73 65 72 74 28 20 69 4c 61 6e 67 69 64 3e  assert( iLangid>
56b0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
56c0: 70 2d 3e 6e 49 6e 64 65 78 3e 30 20 29 3b 0a 20  p->nIndex>0 );. 
56d0: 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 3e   assert( iIndex>
56e0: 3d 30 20 26 26 20 69 49 6e 64 65 78 3c 70 2d 3e  =0 && iIndex<p->
56f0: 6e 49 6e 64 65 78 20 29 3b 0a 0a 20 20 69 42 61  nIndex );..  iBa
5700: 73 65 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69  se = ((sqlite3_i
5710: 6e 74 36 34 29 69 4c 61 6e 67 69 64 20 2a 20 70  nt64)iLangid * p
5720: 2d 3e 6e 49 6e 64 65 78 20 2b 20 69 49 6e 64 65  ->nIndex + iInde
5730: 78 29 20 2a 20 46 54 53 33 5f 53 45 47 44 49 52  x) * FTS3_SEGDIR
5740: 5f 4d 41 58 4c 45 56 45 4c 3b 0a 20 20 72 65 74  _MAXLEVEL;.  ret
5750: 75 72 6e 20 69 42 61 73 65 20 2b 20 69 4c 65 76  urn iBase + iLev
5760: 65 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  el;.}../*.** Set
5770: 20 2a 70 70 53 74 6d 74 20 74 6f 20 61 20 73 74   *ppStmt to a st
5780: 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 74  atement handle t
5790: 68 61 74 20 6d 61 79 20 62 65 20 75 73 65 64 20  hat may be used 
57a0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
57b0: 67 68 0a 2a 2a 20 61 6c 6c 20 72 6f 77 73 20 69  gh.** all rows i
57c0: 6e 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74  n the %_segdir t
57d0: 61 62 6c 65 2c 20 66 72 6f 6d 20 6f 6c 64 65 73  able, from oldes
57e0: 74 20 74 6f 20 6e 65 77 65 73 74 2e 20 49 66 20  t to newest. If 
57f0: 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72  successful,.** r
5800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
5810: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
5820: 75 72 73 20 77 68 69 6c 65 20 70 72 65 70 61 72  urs while prepar
5830: 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ing the statemen
5840: 74 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e  t, .** return an
5850: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
5860: 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  de..**.** There 
5870: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65  is only ever one
5880: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
5890: 73 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  s SQL statement 
58a0: 63 6f 6d 70 69 6c 65 64 20 66 6f 72 0a 2a 2a 20  compiled for.** 
58b0: 65 61 63 68 20 46 54 53 33 20 74 61 62 6c 65 2e  each FTS3 table.
58c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 61 74 65  .**.** The state
58d0: 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 74 68 65  ment returns the
58e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6c 75 6d   following colum
58f0: 6e 73 20 66 72 6f 6d 20 74 68 65 20 25 5f 73 65  ns from the %_se
5900: 67 64 69 72 20 74 61 62 6c 65 3a 0a 2a 2a 0a 2a  gdir table:.**.*
5910: 2a 20 20 20 30 3a 20 69 64 78 0a 2a 2a 20 20 20  *   0: idx.**   
5920: 31 3a 20 73 74 61 72 74 5f 62 6c 6f 63 6b 0a 2a  1: start_block.*
5930: 2a 20 20 20 32 3a 20 6c 65 61 76 65 73 5f 65 6e  *   2: leaves_en
5940: 64 5f 62 6c 6f 63 6b 0a 2a 2a 20 20 20 33 3a 20  d_block.**   3: 
5950: 65 6e 64 5f 62 6c 6f 63 6b 0a 2a 2a 20 20 20 34  end_block.**   4
5960: 3a 20 72 6f 6f 74 0a 2a 2f 0a 69 6e 74 20 73 71  : root.*/.int sq
5970: 6c 69 74 65 33 46 74 73 33 41 6c 6c 53 65 67 64  lite3Fts3AllSegd
5980: 69 72 73 28 0a 20 20 46 74 73 33 54 61 62 6c 65  irs(.  Fts3Table
5990: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
59a0: 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74         /* FTS3 t
59b0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  able */.  int iL
59c0: 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20 20  angid,          
59d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e            /* Lan
59e0: 67 75 61 67 65 20 62 65 69 6e 67 20 71 75 65 72  guage being quer
59f0: 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e  ied */.  int iIn
5a00: 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  dex,            
5a10: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
5a20: 78 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65 78 5b  x for p->aIndex[
5a30: 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  ] */.  int iLeve
5a40: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
5a50: 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20         /* Level 
5a60: 74 6f 20 73 65 6c 65 63 74 20 28 72 65 6c 61 74  to select (relat
5a70: 69 76 65 20 6c 65 76 65 6c 29 20 2a 2f 0a 20 20  ive level) */.  
5a80: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
5a90: 70 53 74 6d 74 20 20 20 20 20 20 20 20 20 20 20  pStmt           
5aa0: 2f 2a 20 4f 55 54 3a 20 43 6f 6d 70 69 6c 65 64  /* OUT: Compiled
5ab0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b   statement */.){
5ac0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
5ad0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
5ae0: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
5af0: 20 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45   iLevel==FTS3_SE
5b00: 47 43 55 52 53 4f 52 5f 41 4c 4c 20 7c 7c 20 69  GCURSOR_ALL || i
5b10: 4c 65 76 65 6c 3e 3d 30 20 29 3b 0a 20 20 61 73  Level>=0 );.  as
5b20: 73 65 72 74 28 20 69 4c 65 76 65 6c 3c 46 54 53  sert( iLevel<FTS
5b30: 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45  3_SEGDIR_MAXLEVE
5b40: 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  L );.  assert( i
5b50: 49 6e 64 65 78 3e 3d 30 20 26 26 20 69 49 6e 64  Index>=0 && iInd
5b60: 65 78 3c 70 2d 3e 6e 49 6e 64 65 78 20 29 3b 0a  ex<p->nIndex );.
5b70: 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20  .  if( iLevel<0 
5b80: 29 7b 0a 20 20 20 20 2f 2a 20 22 53 45 4c 45 43  ){.    /* "SELEC
5b90: 54 20 2a 20 46 52 4f 4d 20 25 5f 73 65 67 64 69  T * FROM %_segdi
5ba0: 72 20 57 48 45 52 45 20 6c 65 76 65 6c 20 42 45  r WHERE level BE
5bb0: 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 20 4f 52  TWEEN ? AND ? OR
5bc0: 44 45 52 20 42 59 20 2e 2e 2e 22 20 2a 2f 0a 20  DER BY ..." */. 
5bd0: 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53     rc = fts3SqlS
5be0: 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43  tmt(p, SQL_SELEC
5bf0: 54 5f 4c 45 56 45 4c 5f 52 41 4e 47 45 2c 20 26  T_LEVEL_RANGE, &
5c00: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
5c10: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5c20: 20 29 7b 20 0a 20 20 20 20 20 20 73 71 6c 69 74   ){ .      sqlit
5c30: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
5c40: 74 6d 74 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c  tmt, 1, getAbsol
5c50: 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e  uteLevel(p, iLan
5c60: 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 30 29 29  gid, iIndex, 0))
5c70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
5c80: 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
5c90: 2c 20 32 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 2, .          
5ca0: 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c  getAbsoluteLevel
5cb0: 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e  (p, iLangid, iIn
5cc0: 64 65 78 2c 20 46 54 53 33 5f 53 45 47 44 49 52  dex, FTS3_SEGDIR
5cd0: 5f 4d 41 58 4c 45 56 45 4c 2d 31 29 0a 20 20 20  _MAXLEVEL-1).   
5ce0: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65     );.    }.  }e
5cf0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 22 53 45 4c  lse{.    /* "SEL
5d00: 45 43 54 20 2a 20 46 52 4f 4d 20 25 5f 73 65 67  ECT * FROM %_seg
5d10: 64 69 72 20 57 48 45 52 45 20 6c 65 76 65 6c 20  dir WHERE level 
5d20: 3d 20 3f 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e  = ? ORDER BY ...
5d30: 22 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74  " */.    rc = ft
5d40: 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
5d50: 5f 53 45 4c 45 43 54 5f 4c 45 56 45 4c 2c 20 26  _SELECT_LEVEL, &
5d60: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
5d70: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5d80: 20 29 7b 20 0a 20 20 20 20 20 20 73 71 6c 69 74   ){ .      sqlit
5d90: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
5da0: 74 6d 74 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c  tmt, 1, getAbsol
5db0: 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e  uteLevel(p, iLan
5dc0: 67 69 64 2c 20 69 49 6e 64 65 78 2c 69 4c 65 76  gid, iIndex,iLev
5dd0: 65 6c 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  el));.    }.  }.
5de0: 20 20 2a 70 70 53 74 6d 74 20 3d 20 70 53 74 6d    *ppStmt = pStm
5df0: 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
5e00: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  }.../*.** Append
5e10: 20 61 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74   a single varint
5e20: 20 74 6f 20 61 20 50 65 6e 64 69 6e 67 4c 69 73   to a PendingLis
5e30: 74 20 62 75 66 66 65 72 2e 20 53 51 4c 49 54 45  t buffer. SQLITE
5e40: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
5e50: 2a 2a 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ** if successful
5e60: 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  , or an SQLite e
5e70: 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
5e80: 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ise..**.** This 
5e90: 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 73 65  function also se
5ea0: 72 76 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  rves to allocate
5eb0: 20 74 68 65 20 50 65 6e 64 69 6e 67 4c 69 73 74   the PendingList
5ec0: 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c   structure itsel
5ed0: 66 2e 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  f..** For exampl
5ee0: 65 2c 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  e, to create a n
5ef0: 65 77 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 73  ew PendingList s
5f00: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
5f10: 69 6e 67 20 74 77 6f 0a 2a 2a 20 76 61 72 69 6e  ing two.** varin
5f20: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 65 6e 64  ts:.**.**   Pend
5f30: 69 6e 67 4c 69 73 74 20 2a 70 20 3d 20 30 3b 0a  ingList *p = 0;.
5f40: 2a 2a 20 20 20 66 74 73 33 50 65 6e 64 69 6e 67  **   fts3Pending
5f50: 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e 74  ListAppendVarint
5f60: 28 26 70 2c 20 31 29 3b 0a 2a 2a 20 20 20 66 74  (&p, 1);.**   ft
5f70: 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70  s3PendingListApp
5f80: 65 6e 64 56 61 72 69 6e 74 28 26 70 2c 20 32 29  endVarint(&p, 2)
5f90: 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.*/.static int 
5fa0: 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41  fts3PendingListA
5fb0: 70 70 65 6e 64 56 61 72 69 6e 74 28 0a 20 20 50  ppendVarint(.  P
5fc0: 65 6e 64 69 6e 67 4c 69 73 74 20 2a 2a 70 70 2c  endingList **pp,
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5fe0: 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65  * IN/OUT: Pointe
5ff0: 72 20 74 6f 20 50 65 6e 64 69 6e 67 4c 69 73 74  r to PendingList
6000: 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 73 71 6c   struct */.  sql
6010: 69 74 65 33 5f 69 6e 74 36 34 20 69 20 20 20 20  ite3_int64 i    
6020: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6030: 56 61 6c 75 65 20 74 6f 20 61 70 70 65 6e 64 20  Value to append 
6040: 74 6f 20 64 61 74 61 20 2a 2f 0a 29 7b 0a 20 20  to data */.){.  
6050: 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70 20 3d  PendingList *p =
6060: 20 2a 70 70 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f   *pp;..  /* Allo
6070: 63 61 74 65 20 6f 72 20 67 72 6f 77 20 74 68 65  cate or grow the
6080: 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 61 73 20   PendingList as 
6090: 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69  required. */.  i
60a0: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 70 20 3d  f( !p ){.    p =
60b0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
60c0: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 31 30 30  sizeof(*p) + 100
60d0: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 20 29 7b  );.    if( !p ){
60e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
60f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
6100: 7d 0a 20 20 20 20 70 2d 3e 6e 53 70 61 63 65 20  }.    p->nSpace 
6110: 3d 20 31 30 30 3b 0a 20 20 20 20 70 2d 3e 61 44  = 100;.    p->aD
6120: 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29 26 70  ata = (char *)&p
6130: 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 6e 44 61 74  [1];.    p->nDat
6140: 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 65 6c 73  a = 0;.  }.  els
6150: 65 20 69 66 28 20 70 2d 3e 6e 44 61 74 61 2b 46  e if( p->nData+F
6160: 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 2b 31  TS3_VARINT_MAX+1
6170: 3e 70 2d 3e 6e 53 70 61 63 65 20 29 7b 0a 20 20  >p->nSpace ){.  
6180: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 2d 3e    int nNew = p->
6190: 6e 53 70 61 63 65 20 2a 20 32 3b 0a 20 20 20 20  nSpace * 2;.    
61a0: 70 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  p = sqlite3_real
61b0: 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 2a 70  loc(p, sizeof(*p
61c0: 29 20 2b 20 6e 4e 65 77 29 3b 0a 20 20 20 20 69  ) + nNew);.    i
61d0: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 20 20 73  f( !p ){.      s
61e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70 70 29  qlite3_free(*pp)
61f0: 3b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 30 3b  ;.      *pp = 0;
6200: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
6210: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
6220: 7d 0a 20 20 20 20 70 2d 3e 6e 53 70 61 63 65 20  }.    p->nSpace 
6230: 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 61  = nNew;.    p->a
6240: 44 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29 26  Data = (char *)&
6250: 70 5b 31 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  p[1];.  }..  /* 
6260: 41 70 70 65 6e 64 20 74 68 65 20 6e 65 77 20 73  Append the new s
6270: 65 72 69 61 6c 69 7a 65 64 20 76 61 72 69 6e 74  erialized varint
6280: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
6290: 68 65 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 70 2d  he list. */.  p-
62a0: 3e 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69 74 65  >nData += sqlite
62b0: 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26  3Fts3PutVarint(&
62c0: 70 2d 3e 61 44 61 74 61 5b 70 2d 3e 6e 44 61 74  p->aData[p->nDat
62d0: 61 5d 2c 20 69 29 3b 0a 20 20 70 2d 3e 61 44 61  a], i);.  p->aDa
62e0: 74 61 5b 70 2d 3e 6e 44 61 74 61 5d 20 3d 20 27  ta[p->nData] = '
62f0: 5c 30 27 3b 0a 20 20 2a 70 70 20 3d 20 70 3b 0a  \0';.  *pp = p;.
6300: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6310: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  OK;.}../*.** Add
6320: 20 61 20 64 6f 63 69 64 2f 63 6f 6c 75 6d 6e 2f   a docid/column/
6330: 70 6f 73 69 74 69 6f 6e 20 65 6e 74 72 79 20 74  position entry t
6340: 6f 20 61 20 50 65 6e 64 69 6e 67 4c 69 73 74 20  o a PendingList 
6350: 73 74 72 75 63 74 75 72 65 2e 20 4e 6f 6e 2d 7a  structure. Non-z
6360: 65 72 6f 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ero.** is return
6370: 65 64 20 69 66 20 74 68 65 20 73 74 72 75 63 74  ed if the struct
6380: 75 72 65 20 69 73 20 73 71 6c 69 74 65 33 5f 72  ure is sqlite3_r
6390: 65 61 6c 6c 6f 63 65 64 20 61 73 20 70 61 72 74  ealloced as part
63a0: 20 6f 66 20 61 64 64 69 6e 67 0a 2a 2a 20 74 68   of adding.** th
63b0: 65 20 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69  e entry. Otherwi
63c0: 73 65 2c 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  se, zero..**.** 
63d0: 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
63e0: 6f 63 63 75 72 73 2c 20 2a 70 52 63 20 69 73 20  occurs, *pRc is 
63f0: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f  set to SQLITE_NO
6400: 4d 45 4d 20 62 65 66 6f 72 65 20 72 65 74 75 72  MEM before retur
6410: 6e 69 6e 67 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73  ning..** Zero is
6420: 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 65 64   always returned
6430: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 4f   in this case. O
6440: 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20  therwise, if no 
6450: 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
6460: 2c 0a 2a 2a 20 69 74 20 69 73 20 73 65 74 20 74  ,.** it is set t
6470: 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  o SQLITE_OK..*/.
6480: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 50  static int fts3P
6490: 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64  endingListAppend
64a0: 28 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73 74 20  (.  PendingList 
64b0: 2a 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20  **pp,           
64c0: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50      /* IN/OUT: P
64d0: 65 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63  endingList struc
64e0: 74 75 72 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ture */.  sqlite
64f0: 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 2c 20  3_int64 iDocid, 
6500: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63            /* Doc
6510: 69 64 20 66 6f 72 20 65 6e 74 72 79 20 74 6f 20  id for entry to 
6520: 61 64 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  add */.  sqlite3
6530: 5f 69 6e 74 36 34 20 69 43 6f 6c 2c 20 20 20 20  _int64 iCol,    
6540: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
6550: 6d 6e 20 66 6f 72 20 65 6e 74 72 79 20 74 6f 20  mn for entry to 
6560: 61 64 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  add */.  sqlite3
6570: 5f 69 6e 74 36 34 20 69 50 6f 73 2c 20 20 20 20  _int64 iPos,    
6580: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69           /* Posi
6590: 74 69 6f 6e 20 6f 66 20 74 65 72 6d 20 66 6f 72  tion of term for
65a0: 20 65 6e 74 72 79 20 74 6f 20 61 64 64 20 2a 2f   entry to add */
65b0: 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20 20  .  int *pRc     
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65d0: 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72     /* OUT: Retur
65e0: 6e 20 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 50  n code */.){.  P
65f0: 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70 20 3d 20  endingList *p = 
6600: 2a 70 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *pp;.  int rc = 
6610: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
6620: 73 65 72 74 28 20 21 70 20 7c 7c 20 70 2d 3e 69  sert( !p || p->i
6630: 4c 61 73 74 44 6f 63 69 64 3c 3d 69 44 6f 63 69  LastDocid<=iDoci
6640: 64 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 20 7c  d );..  if( !p |
6650: 7c 20 70 2d 3e 69 4c 61 73 74 44 6f 63 69 64 21  | p->iLastDocid!
6660: 3d 69 44 6f 63 69 64 20 29 7b 0a 20 20 20 20 73  =iDocid ){.    s
6670: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 65  qlite3_int64 iDe
6680: 6c 74 61 20 3d 20 69 44 6f 63 69 64 20 2d 20 28  lta = iDocid - (
6690: 70 20 3f 20 70 2d 3e 69 4c 61 73 74 44 6f 63 69  p ? p->iLastDoci
66a0: 64 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20  d : 0);.    if( 
66b0: 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
66c0: 74 28 20 70 2d 3e 6e 44 61 74 61 3c 70 2d 3e 6e  t( p->nData<p->n
66d0: 53 70 61 63 65 20 29 3b 0a 20 20 20 20 20 20 61  Space );.      a
66e0: 73 73 65 72 74 28 20 70 2d 3e 61 44 61 74 61 5b  ssert( p->aData[
66f0: 70 2d 3e 6e 44 61 74 61 5d 3d 3d 30 20 29 3b 0a  p->nData]==0 );.
6700: 20 20 20 20 20 20 70 2d 3e 6e 44 61 74 61 2b 2b        p->nData++
6710: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6720: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
6730: 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74   fts3PendingList
6740: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2c  AppendVarint(&p,
6750: 20 69 44 65 6c 74 61 29 29 20 29 7b 0a 20 20 20   iDelta)) ){.   
6760: 20 20 20 67 6f 74 6f 20 70 65 6e 64 69 6e 67 6c     goto pendingl
6770: 69 73 74 61 70 70 65 6e 64 5f 6f 75 74 3b 0a 20  istappend_out;. 
6780: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 4c 61 73     }.    p->iLas
6790: 74 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 70  tCol = -1;.    p
67a0: 2d 3e 69 4c 61 73 74 50 6f 73 20 3d 20 30 3b 0a  ->iLastPos = 0;.
67b0: 20 20 20 20 70 2d 3e 69 4c 61 73 74 44 6f 63 69      p->iLastDoci
67c0: 64 20 3d 20 69 44 6f 63 69 64 3b 0a 20 20 7d 0a  d = iDocid;.  }.
67d0: 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 26 26 20    if( iCol>0 && 
67e0: 70 2d 3e 69 4c 61 73 74 43 6f 6c 21 3d 69 43 6f  p->iLastCol!=iCo
67f0: 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c  l ){.    if( SQL
6800: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 66 74  ITE_OK!=(rc = ft
6810: 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70  s3PendingListApp
6820: 65 6e 64 56 61 72 69 6e 74 28 26 70 2c 20 31 29  endVarint(&p, 1)
6830: 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45  ).     || SQLITE
6840: 5f 4f 4b 21 3d 28 72 63 20 3d 20 66 74 73 33 50  _OK!=(rc = fts3P
6850: 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64  endingListAppend
6860: 56 61 72 69 6e 74 28 26 70 2c 20 69 43 6f 6c 29  Varint(&p, iCol)
6870: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
6880: 6f 74 6f 20 70 65 6e 64 69 6e 67 6c 69 73 74 61  oto pendinglista
6890: 70 70 65 6e 64 5f 6f 75 74 3b 0a 20 20 20 20 7d  ppend_out;.    }
68a0: 0a 20 20 20 20 70 2d 3e 69 4c 61 73 74 43 6f 6c  .    p->iLastCol
68b0: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e   = iCol;.    p->
68c0: 69 4c 61 73 74 50 6f 73 20 3d 20 30 3b 0a 20 20  iLastPos = 0;.  
68d0: 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20  }.  if( iCol>=0 
68e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
68f0: 50 6f 73 3e 70 2d 3e 69 4c 61 73 74 50 6f 73 20  Pos>p->iLastPos 
6900: 7c 7c 20 28 69 50 6f 73 3d 3d 30 20 26 26 20 70  || (iPos==0 && p
6910: 2d 3e 69 4c 61 73 74 50 6f 73 3d 3d 30 29 20 29  ->iLastPos==0) )
6920: 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 50  ;.    rc = fts3P
6930: 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64  endingListAppend
6940: 56 61 72 69 6e 74 28 26 70 2c 20 32 2b 69 50 6f  Varint(&p, 2+iPo
6950: 73 2d 70 2d 3e 69 4c 61 73 74 50 6f 73 29 3b 0a  s-p->iLastPos);.
6960: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
6970: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
6980: 2d 3e 69 4c 61 73 74 50 6f 73 20 3d 20 69 50 6f  ->iLastPos = iPo
6990: 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 70  s;.    }.  }.. p
69a0: 65 6e 64 69 6e 67 6c 69 73 74 61 70 70 65 6e 64  endinglistappend
69b0: 5f 6f 75 74 3a 0a 20 20 2a 70 52 63 20 3d 20 72  _out:.  *pRc = r
69c0: 63 3b 0a 20 20 69 66 28 20 70 21 3d 2a 70 70 20  c;.  if( p!=*pp 
69d0: 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 3b 0a  ){.    *pp = p;.
69e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
69f0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
6a00: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 50 65  ./*.** Free a Pe
6a10: 6e 64 69 6e 67 4c 69 73 74 20 6f 62 6a 65 63 74  ndingList object
6a20: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 74   allocated by ft
6a30: 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70  s3PendingListApp
6a40: 65 6e 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  end()..*/.static
6a50: 20 76 6f 69 64 20 66 74 73 33 50 65 6e 64 69 6e   void fts3Pendin
6a60: 67 4c 69 73 74 44 65 6c 65 74 65 28 50 65 6e 64  gListDelete(Pend
6a70: 69 6e 67 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  ingList *pList){
6a80: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
6a90: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
6aa0: 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   Add an entry to
6ab0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 65 6e 64   one of the pend
6ac0: 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20 74  ing-terms hash t
6ad0: 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
6ae0: 20 69 6e 74 20 66 74 73 33 50 65 6e 64 69 6e 67   int fts3Pending
6af0: 54 65 72 6d 73 41 64 64 4f 6e 65 28 0a 20 20 46  TermsAddOne(.  F
6b00: 74 73 33 54 61 62 6c 65 20 2a 70 2c 0a 20 20 69  ts3Table *p,.  i
6b10: 6e 74 20 69 43 6f 6c 2c 0a 20 20 69 6e 74 20 69  nt iCol,.  int i
6b20: 50 6f 73 2c 0a 20 20 46 74 73 33 48 61 73 68 20  Pos,.  Fts3Hash 
6b30: 2a 70 48 61 73 68 2c 20 20 20 20 20 20 20 20 20  *pHash,         
6b40: 20 20 20 20 20 20 20 2f 2a 20 50 65 6e 64 69 6e         /* Pendin
6b50: 67 20 74 65 72 6d 73 20 68 61 73 68 20 74 61 62  g terms hash tab
6b60: 6c 65 20 74 6f 20 61 64 64 20 65 6e 74 72 79 20  le to add entry 
6b70: 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  to */.  const ch
6b80: 61 72 20 2a 7a 54 6f 6b 65 6e 2c 0a 20 20 69 6e  ar *zToken,.  in
6b90: 74 20 6e 54 6f 6b 65 6e 0a 29 7b 0a 20 20 50 65  t nToken.){.  Pe
6ba0: 6e 64 69 6e 67 4c 69 73 74 20 2a 70 4c 69 73 74  ndingList *pList
6bb0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
6bc0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 4c 69 73 74  ITE_OK;..  pList
6bd0: 20 3d 20 28 50 65 6e 64 69 6e 67 4c 69 73 74 20   = (PendingList 
6be0: 2a 29 66 74 73 33 48 61 73 68 46 69 6e 64 28 70  *)fts3HashFind(p
6bf0: 48 61 73 68 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54  Hash, zToken, nT
6c00: 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 70 4c 69  oken);.  if( pLi
6c10: 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 50 65  st ){.    p->nPe
6c20: 6e 64 69 6e 67 44 61 74 61 20 2d 3d 20 28 70 4c  ndingData -= (pL
6c30: 69 73 74 2d 3e 6e 44 61 74 61 20 2b 20 6e 54 6f  ist->nData + nTo
6c40: 6b 65 6e 20 2b 20 73 69 7a 65 6f 66 28 46 74 73  ken + sizeof(Fts
6c50: 33 48 61 73 68 45 6c 65 6d 29 29 3b 0a 20 20 7d  3HashElem));.  }
6c60: 0a 20 20 69 66 28 20 66 74 73 33 50 65 6e 64 69  .  if( fts3Pendi
6c70: 6e 67 4c 69 73 74 41 70 70 65 6e 64 28 26 70 4c  ngListAppend(&pL
6c80: 69 73 74 2c 20 70 2d 3e 69 50 72 65 76 44 6f 63  ist, p->iPrevDoc
6c90: 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20  id, iCol, iPos, 
6ca0: 26 72 63 29 20 29 7b 0a 20 20 20 20 69 66 28 20  &rc) ){.    if( 
6cb0: 70 4c 69 73 74 3d 3d 66 74 73 33 48 61 73 68 49  pList==fts3HashI
6cc0: 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 54 6f  nsert(pHash, zTo
6cd0: 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 70 4c 69  ken, nToken, pLi
6ce0: 73 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  st) ){.      /* 
6cf0: 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 77 68  Malloc failed wh
6d00: 69 6c 65 20 69 6e 73 65 72 74 69 6e 67 20 74 68  ile inserting th
6d10: 65 20 6e 65 77 20 65 6e 74 72 79 2e 20 54 68 69  e new entry. Thi
6d20: 73 20 63 61 6e 20 6f 6e 6c 79 20 0a 20 20 20 20  s can only .    
6d30: 20 20 2a 2a 20 68 61 70 70 65 6e 20 69 66 20 74    ** happen if t
6d40: 68 65 72 65 20 77 61 73 20 6e 6f 20 70 72 65 76  here was no prev
6d50: 69 6f 75 73 20 65 6e 74 72 79 20 66 6f 72 20 74  ious entry for t
6d60: 68 69 73 20 74 6f 6b 65 6e 2e 0a 20 20 20 20 20  his token..     
6d70: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
6d80: 28 20 30 3d 3d 66 74 73 33 48 61 73 68 46 69 6e  ( 0==fts3HashFin
6d90: 64 28 70 48 61 73 68 2c 20 7a 54 6f 6b 65 6e 2c  d(pHash, zToken,
6da0: 20 6e 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20   nToken) );.    
6db0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6dc0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 63 20  List);.      rc 
6dd0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
6de0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
6df0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6e00: 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67  .    p->nPending
6e10: 44 61 74 61 20 2b 3d 20 28 70 4c 69 73 74 2d 3e  Data += (pList->
6e20: 6e 44 61 74 61 20 2b 20 6e 54 6f 6b 65 6e 20 2b  nData + nToken +
6e30: 20 73 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68   sizeof(Fts3Hash
6e40: 45 6c 65 6d 29 29 3b 0a 20 20 7d 0a 20 20 72 65  Elem));.  }.  re
6e50: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
6e60: 2a 20 54 6f 6b 65 6e 69 7a 65 20 74 68 65 20 6e  * Tokenize the n
6e70: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
6e80: 72 69 6e 67 20 7a 54 65 78 74 20 61 6e 64 20 61  ring zText and a
6e90: 64 64 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 74 6f  dd all tokens to
6ea0: 20 74 68 65 0a 2a 2a 20 70 65 6e 64 69 6e 67 2d   the.** pending-
6eb0: 74 65 72 6d 73 20 68 61 73 68 2d 74 61 62 6c 65  terms hash-table
6ec0: 2e 20 54 68 65 20 64 6f 63 69 64 20 75 73 65 64  . The docid used
6ed0: 20 69 73 20 74 68 61 74 20 63 75 72 72 65 6e 74   is that current
6ee0: 6c 79 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ly stored in.** 
6ef0: 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 2c 20 61  p->iPrevDocid, a
6f00: 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  nd the column is
6f10: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 61 72   specified by ar
6f20: 67 75 6d 65 6e 74 20 69 43 6f 6c 2e 0a 2a 2a 0a  gument iCol..**.
6f30: 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
6f40: 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
6f50: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
6f60: 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  se, an SQLite er
6f70: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
6f80: 74 69 63 20 69 6e 74 20 66 74 73 33 50 65 6e 64  tic int fts3Pend
6f90: 69 6e 67 54 65 72 6d 73 41 64 64 28 0a 20 20 46  ingTermsAdd(.  F
6fa0: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
6fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6fc0: 2a 20 54 61 62 6c 65 20 69 6e 74 6f 20 77 68 69  * Table into whi
6fd0: 63 68 20 74 65 78 74 20 77 69 6c 6c 20 62 65 20  ch text will be 
6fe0: 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e  inserted */.  in
6ff0: 74 20 69 4c 61 6e 67 69 64 2c 20 20 20 20 20 20  t iLangid,      
7000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7010: 20 4c 61 6e 67 75 61 67 65 20 69 64 20 74 6f 20   Language id to 
7020: 75 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  use */.  const c
7030: 68 61 72 20 2a 7a 54 65 78 74 2c 20 20 20 20 20  har *zText,     
7040: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
7050: 20 6f 66 20 64 6f 63 75 6d 65 6e 74 20 74 6f 20   of document to 
7060: 62 65 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20  be inserted */. 
7070: 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20   int iCol,      
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 74 6f 20   /* Column into 
70a0: 77 68 69 63 68 20 74 65 78 74 20 69 73 20 62 65  which text is be
70b0: 69 6e 67 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a  ing inserted */.
70c0: 20 20 75 33 32 20 2a 70 6e 57 6f 72 64 20 20 20    u32 *pnWord   
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70e0: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 49 6e 63    /* IN/OUT: Inc
70f0: 72 2e 20 62 79 20 6e 75 6d 62 65 72 20 74 6f 6b  r. by number tok
7100: 65 6e 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a  ens inserted */.
7110: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
7120: 6e 74 20 69 53 74 61 72 74 20 3d 20 30 3b 0a 20  nt iStart = 0;. 
7130: 20 69 6e 74 20 69 45 6e 64 20 3d 20 30 3b 0a 20   int iEnd = 0;. 
7140: 20 69 6e 74 20 69 50 6f 73 20 3d 20 30 3b 0a 20   int iPos = 0;. 
7150: 20 69 6e 74 20 6e 57 6f 72 64 20 3d 20 30 3b 0a   int nWord = 0;.
7160: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
7170: 54 6f 6b 65 6e 3b 0a 20 20 69 6e 74 20 6e 54 6f  Token;.  int nTo
7180: 6b 65 6e 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69  ken = 0;..  sqli
7190: 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a 70  te3_tokenizer *p
71a0: 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 70 2d 3e 70  Tokenizer = p->p
71b0: 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 73 71 6c  Tokenizer;.  sql
71c0: 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d  ite3_tokenizer_m
71d0: 6f 64 75 6c 65 20 63 6f 6e 73 74 20 2a 70 4d 6f  odule const *pMo
71e0: 64 75 6c 65 20 3d 20 70 54 6f 6b 65 6e 69 7a 65  dule = pTokenize
71f0: 72 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 73 71  r->pModule;.  sq
7200: 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
7210: 63 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20  cursor *pCsr;.  
7220: 69 6e 74 20 28 2a 78 4e 65 78 74 29 28 73 71 6c  int (*xNext)(sql
7230: 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 63  ite3_tokenizer_c
7240: 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c 0a  ursor *pCursor,.
7250: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
7260: 2a 2a 2c 69 6e 74 2a 2c 69 6e 74 2a 2c 69 6e 74  **,int*,int*,int
7270: 2a 2c 69 6e 74 2a 29 3b 0a 0a 20 20 61 73 73 65  *,int*);..  asse
7280: 72 74 28 20 70 54 6f 6b 65 6e 69 7a 65 72 20 26  rt( pTokenizer &
7290: 26 20 70 4d 6f 64 75 6c 65 20 29 3b 0a 0a 20 20  & pModule );..  
72a0: 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68  /* If the user h
72b0: 61 73 20 69 6e 73 65 72 74 65 64 20 61 20 4e 55  as inserted a NU
72c0: 4c 4c 20 76 61 6c 75 65 2c 20 74 68 69 73 20 66  LL value, this f
72d0: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63  unction may be c
72e0: 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20  alled with.  ** 
72f0: 7a 54 65 78 74 3d 3d 30 2e 20 49 6e 20 74 68 69  zText==0. In thi
7300: 73 20 63 61 73 65 2c 20 61 64 64 20 7a 65 72 6f  s case, add zero
7310: 20 74 6f 6b 65 6e 20 65 6e 74 72 69 65 73 20 74   token entries t
7320: 6f 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  o the hash table
7330: 20 61 6e 64 20 0a 20 20 2a 2a 20 72 65 74 75 72   and .  ** retur
7340: 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 69 66  n early. */.  if
7350: 28 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20  ( zText==0 ){.  
7360: 20 20 2a 70 6e 57 6f 72 64 20 3d 20 30 3b 0a 20    *pnWord = 0;. 
7370: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7380: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  _OK;.  }..  rc =
7390: 20 73 71 6c 69 74 65 33 46 74 73 33 4f 70 65 6e   sqlite3Fts3Open
73a0: 54 6f 6b 65 6e 69 7a 65 72 28 70 54 6f 6b 65 6e  Tokenizer(pToken
73b0: 69 7a 65 72 2c 20 69 4c 61 6e 67 69 64 2c 20 7a  izer, iLangid, z
73c0: 54 65 78 74 2c 20 2d 31 2c 20 26 70 43 73 72 29  Text, -1, &pCsr)
73d0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
73e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
73f0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 78  urn rc;.  }..  x
7400: 4e 65 78 74 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e  Next = pModule->
7410: 78 4e 65 78 74 3b 0a 20 20 77 68 69 6c 65 28 20  xNext;.  while( 
7420: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 0a 20 20  SQLITE_OK==rc.  
7430: 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b      && SQLITE_OK
7440: 3d 3d 28 72 63 20 3d 20 78 4e 65 78 74 28 70 43  ==(rc = xNext(pC
7450: 73 72 2c 20 26 7a 54 6f 6b 65 6e 2c 20 26 6e 54  sr, &zToken, &nT
7460: 6f 6b 65 6e 2c 20 26 69 53 74 61 72 74 2c 20 26  oken, &iStart, &
7470: 69 45 6e 64 2c 20 26 69 50 6f 73 29 29 0a 20 20  iEnd, &iPos)).  
7480: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
7490: 20 20 69 66 28 20 69 50 6f 73 3e 3d 6e 57 6f 72    if( iPos>=nWor
74a0: 64 20 29 20 6e 57 6f 72 64 20 3d 20 69 50 6f 73  d ) nWord = iPos
74b0: 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 73 69  +1;..    /* Posi
74c0: 74 69 6f 6e 73 20 63 61 6e 6e 6f 74 20 62 65 20  tions cannot be 
74d0: 6e 65 67 61 74 69 76 65 3b 20 77 65 20 75 73 65  negative; we use
74e0: 20 2d 31 20 61 73 20 61 20 74 65 72 6d 69 6e 61   -1 as a termina
74f0: 74 6f 72 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  tor internally..
7500: 20 20 20 20 2a 2a 20 54 6f 6b 65 6e 73 20 6d 75      ** Tokens mu
7510: 73 74 20 68 61 76 65 20 61 20 6e 6f 6e 2d 7a 65  st have a non-ze
7520: 72 6f 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 2a  ro length..    *
7530: 2f 0a 20 20 20 20 69 66 28 20 69 50 6f 73 3c 30  /.    if( iPos<0
7540: 20 7c 7c 20 21 7a 54 6f 6b 65 6e 20 7c 7c 20 6e   || !zToken || n
7550: 54 6f 6b 65 6e 3c 3d 30 20 29 7b 0a 20 20 20 20  Token<=0 ){.    
7560: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
7570: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
7580: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
7590: 41 64 64 20 74 68 65 20 74 65 72 6d 20 74 6f 20  Add the term to 
75a0: 74 68 65 20 74 65 72 6d 73 20 69 6e 64 65 78 20  the terms index 
75b0: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  */.    rc = fts3
75c0: 50 65 6e 64 69 6e 67 54 65 72 6d 73 41 64 64 4f  PendingTermsAddO
75d0: 6e 65 28 0a 20 20 20 20 20 20 20 20 70 2c 20 69  ne(.        p, i
75e0: 43 6f 6c 2c 20 69 50 6f 73 2c 20 26 70 2d 3e 61  Col, iPos, &p->a
75f0: 49 6e 64 65 78 5b 30 5d 2e 68 50 65 6e 64 69 6e  Index[0].hPendin
7600: 67 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  g, zToken, nToke
7610: 6e 0a 20 20 20 20 29 3b 0a 20 20 20 20 0a 20 20  n.    );.    .  
7620: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 65 72    /* Add the ter
7630: 6d 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65  m to each of the
7640: 20 70 72 65 66 69 78 20 69 6e 64 65 78 65 73 20   prefix indexes 
7650: 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 74  that it is not t
7660: 6f 6f 20 0a 20 20 20 20 2a 2a 20 73 68 6f 72 74  oo .    ** short
7670: 20 66 6f 72 2e 20 2a 2f 0a 20 20 20 20 66 6f 72   for. */.    for
7680: 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=1; rc==SQLITE
7690: 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 49 6e 64  _OK && i<p->nInd
76a0: 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ex; i++){.      
76b0: 73 74 72 75 63 74 20 46 74 73 33 49 6e 64 65 78  struct Fts3Index
76c0: 20 2a 70 49 6e 64 65 78 20 3d 20 26 70 2d 3e 61   *pIndex = &p->a
76d0: 49 6e 64 65 78 5b 69 5d 3b 0a 20 20 20 20 20 20  Index[i];.      
76e0: 69 66 28 20 6e 54 6f 6b 65 6e 3c 70 49 6e 64 65  if( nToken<pInde
76f0: 78 2d 3e 6e 50 72 65 66 69 78 20 29 20 63 6f 6e  x->nPrefix ) con
7700: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 72 63 20  tinue;.      rc 
7710: 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72  = fts3PendingTer
7720: 6d 73 41 64 64 4f 6e 65 28 0a 20 20 20 20 20 20  msAddOne(.      
7730: 20 20 20 20 70 2c 20 69 43 6f 6c 2c 20 69 50 6f      p, iCol, iPo
7740: 73 2c 20 26 70 49 6e 64 65 78 2d 3e 68 50 65 6e  s, &pIndex->hPen
7750: 64 69 6e 67 2c 20 7a 54 6f 6b 65 6e 2c 20 70 49  ding, zToken, pI
7760: 6e 64 65 78 2d 3e 6e 50 72 65 66 69 78 0a 20 20  ndex->nPrefix.  
7770: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
7780: 0a 0a 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c  ..  pModule->xCl
7790: 6f 73 65 28 70 43 73 72 29 3b 0a 20 20 2a 70 6e  ose(pCsr);.  *pn
77a0: 57 6f 72 64 20 2b 3d 20 6e 57 6f 72 64 3b 0a 20  Word += nWord;. 
77b0: 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
77c0: 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54  ITE_DONE ? SQLIT
77d0: 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f  E_OK : rc);.}../
77e0: 2a 20 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68  * .** Calling th
77f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69  is function indi
7800: 63 61 74 65 73 20 74 68 61 74 20 73 75 62 73 65  cates that subse
7810: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 0a  quent calls to .
7820: 2a 2a 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65  ** fts3PendingTe
7830: 72 6d 73 41 64 64 28 29 20 61 72 65 20 74 6f 20  rmsAdd() are to 
7840: 61 64 64 20 74 65 72 6d 2f 70 6f 73 69 74 69 6f  add term/positio
7850: 6e 2d 6c 69 73 74 20 70 61 69 72 73 20 66 6f 72  n-list pairs for
7860: 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
7870: 20 6f 66 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   of the document
7880: 20 77 69 74 68 20 64 6f 63 69 64 20 69 44 6f 63   with docid iDoc
7890: 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  id..*/.static in
78a0: 74 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72  t fts3PendingTer
78b0: 6d 73 44 6f 63 69 64 28 0a 20 20 46 74 73 33 54  msDocid(.  Fts3T
78c0: 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
78d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
78e0: 6c 6c 2d 74 65 78 74 20 74 61 62 6c 65 20 68 61  ll-text table ha
78f0: 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 62 44  ndle */.  int bD
7900: 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20  elete,          
7910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7920: 65 20 69 66 20 74 68 69 73 20 6f 70 20 69 73 20  e if this op is 
7930: 61 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e  a delete */.  in
7940: 74 20 69 4c 61 6e 67 69 64 2c 20 20 20 20 20 20  t iLangid,      
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7960: 20 4c 61 6e 67 75 61 67 65 20 69 64 20 6f 66 20   Language id of 
7970: 72 6f 77 20 62 65 69 6e 67 20 77 72 69 74 74 65  row being writte
7980: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e  n */.  sqlite_in
7990: 74 36 34 20 69 44 6f 63 69 64 20 20 20 20 20 20  t64 iDocid      
79a0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 69 64 20         /* Docid 
79b0: 6f 66 20 72 6f 77 20 62 65 69 6e 67 20 77 72 69  of row being wri
79c0: 74 74 65 6e 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  tten */.){.  ass
79d0: 65 72 74 28 20 69 4c 61 6e 67 69 64 3e 3d 30 20  ert( iLangid>=0 
79e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 62 44 65  );.  assert( bDe
79f0: 6c 65 74 65 3d 3d 31 20 7c 7c 20 62 44 65 6c 65  lete==1 || bDele
7a00: 74 65 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 54  te==0 );..  /* T
7a10: 4f 44 4f 28 73 68 65 73 73 29 20 45 78 70 6c 6f  ODO(shess) Explo
7a20: 72 65 20 77 68 65 74 68 65 72 20 70 61 72 74 69  re whether parti
7a30: 61 6c 6c 79 20 66 6c 75 73 68 69 6e 67 20 74 68  ally flushing th
7a40: 65 20 62 75 66 66 65 72 20 6f 6e 0a 20 20 2a 2a  e buffer on.  **
7a50: 20 66 6f 72 63 65 64 2d 66 6c 75 73 68 20 77 6f   forced-flush wo
7a60: 75 6c 64 20 70 72 6f 76 69 64 65 20 62 65 74 74  uld provide bett
7a70: 65 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20  er performance. 
7a80: 20 49 20 73 75 73 70 65 63 74 20 74 68 61 74 20   I suspect that 
7a90: 69 66 0a 20 20 2a 2a 20 77 65 20 6f 72 64 65 72  if.  ** we order
7aa0: 65 64 20 74 68 65 20 64 6f 63 6c 69 73 74 73 20  ed the doclists 
7ab0: 62 79 20 73 69 7a 65 20 61 6e 64 20 66 6c 75 73  by size and flus
7ac0: 68 65 64 20 74 68 65 20 6c 61 72 67 65 73 74 20  hed the largest 
7ad0: 75 6e 74 69 6c 20 74 68 65 0a 20 20 2a 2a 20 62  until the.  ** b
7ae0: 75 66 66 65 72 20 77 61 73 20 68 61 6c 66 20 65  uffer was half e
7af0: 6d 70 74 79 2c 20 74 68 61 74 20 77 6f 75 6c 64  mpty, that would
7b00: 20 6c 65 74 20 74 68 65 20 6c 65 73 73 20 66 72   let the less fr
7b10: 65 71 75 65 6e 74 20 74 65 72 6d 73 0a 20 20 2a  equent terms.  *
7b20: 2a 20 67 65 6e 65 72 61 74 65 20 6c 6f 6e 67 65  * generate longe
7b30: 72 20 64 6f 63 6c 69 73 74 73 2e 0a 20 20 2a 2f  r doclists..  */
7b40: 0a 20 20 69 66 28 20 69 44 6f 63 69 64 3c 70 2d  .  if( iDocid<p-
7b50: 3e 69 50 72 65 76 44 6f 63 69 64 20 0a 20 20 20  >iPrevDocid .   
7b60: 7c 7c 20 28 69 44 6f 63 69 64 3d 3d 70 2d 3e 69  || (iDocid==p->i
7b70: 50 72 65 76 44 6f 63 69 64 20 26 26 20 70 2d 3e  PrevDocid && p->
7b80: 62 50 72 65 76 44 65 6c 65 74 65 3d 3d 30 29 0a  bPrevDelete==0).
7b90: 20 20 20 7c 7c 20 70 2d 3e 69 50 72 65 76 4c 61     || p->iPrevLa
7ba0: 6e 67 69 64 21 3d 69 4c 61 6e 67 69 64 0a 20 20  ngid!=iLangid.  
7bb0: 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44   || p->nPendingD
7bc0: 61 74 61 3e 70 2d 3e 6e 4d 61 78 50 65 6e 64 69  ata>p->nMaxPendi
7bd0: 6e 67 44 61 74 61 20 0a 20 20 29 7b 0a 20 20 20  ngData .  ){.   
7be0: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
7bf0: 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d  3Fts3PendingTerm
7c00: 73 46 6c 75 73 68 28 70 29 3b 0a 20 20 20 20 69  sFlush(p);.    i
7c10: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7c20: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
7c30: 7d 0a 20 20 70 2d 3e 69 50 72 65 76 44 6f 63 69  }.  p->iPrevDoci
7c40: 64 20 3d 20 69 44 6f 63 69 64 3b 0a 20 20 70 2d  d = iDocid;.  p-
7c50: 3e 69 50 72 65 76 4c 61 6e 67 69 64 20 3d 20 69  >iPrevLangid = i
7c60: 4c 61 6e 67 69 64 3b 0a 20 20 70 2d 3e 62 50 72  Langid;.  p->bPr
7c70: 65 76 44 65 6c 65 74 65 20 3d 20 62 44 65 6c 65  evDelete = bDele
7c80: 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  te;.  return SQL
7c90: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
7ca0: 20 44 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e   Discard the con
7cb0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 65 6e  tents of the pen
7cc0: 64 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20  ding-terms hash 
7cd0: 74 61 62 6c 65 73 2e 20 0a 2a 2f 0a 76 6f 69 64  tables. .*/.void
7ce0: 20 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64   sqlite3Fts3Pend
7cf0: 69 6e 67 54 65 72 6d 73 43 6c 65 61 72 28 46 74  ingTermsClear(Ft
7d00: 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69  s3Table *p){.  i
7d10: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
7d20: 20 69 3c 70 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b   i<p->nIndex; i+
7d30: 2b 29 7b 0a 20 20 20 20 46 74 73 33 48 61 73 68  +){.    Fts3Hash
7d40: 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 20  Elem *pElem;.   
7d50: 20 46 74 73 33 48 61 73 68 20 2a 70 48 61 73 68   Fts3Hash *pHash
7d60: 20 3d 20 26 70 2d 3e 61 49 6e 64 65 78 5b 69 5d   = &p->aIndex[i]
7d70: 2e 68 50 65 6e 64 69 6e 67 3b 0a 20 20 20 20 66  .hPending;.    f
7d80: 6f 72 28 70 45 6c 65 6d 3d 66 74 73 33 48 61 73  or(pElem=fts3Has
7d90: 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70  hFirst(pHash); p
7da0: 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 66 74 73 33  Elem; pElem=fts3
7db0: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
7dc0: 7b 0a 20 20 20 20 20 20 50 65 6e 64 69 6e 67 4c  {.      PendingL
7dd0: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 28 50 65  ist *pList = (Pe
7de0: 6e 64 69 6e 67 4c 69 73 74 20 2a 29 66 74 73 33  ndingList *)fts3
7df0: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
7e00: 0a 20 20 20 20 20 20 66 74 73 33 50 65 6e 64 69  .      fts3Pendi
7e10: 6e 67 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  ngListDelete(pLi
7e20: 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  st);.    }.    f
7e30: 74 73 33 48 61 73 68 43 6c 65 61 72 28 70 48 61  ts3HashClear(pHa
7e40: 73 68 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 50  sh);.  }.  p->nP
7e50: 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a  endingData = 0;.
7e60: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
7e70: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
7e80: 20 62 79 20 74 68 65 20 78 55 70 64 61 74 65 28   by the xUpdate(
7e90: 29 20 6d 65 74 68 6f 64 20 61 73 20 70 61 72 74  ) method as part
7ea0: 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 0a 2a 2a   of an INSERT.**
7eb0: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 74 20 61   operation. It a
7ec0: 64 64 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20  dds entries for 
7ed0: 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65  each term in the
7ee0: 20 6e 65 77 20 72 65 63 6f 72 64 20 74 6f 20 74   new record to t
7ef0: 68 65 0a 2a 2a 20 70 65 6e 64 69 6e 67 54 65 72  he.** pendingTer
7f00: 6d 73 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a  ms hash table..*
7f10: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 61 70  *.** Argument ap
7f20: 56 61 6c 20 69 73 20 74 68 65 20 73 61 6d 65 20  Val is the same 
7f30: 61 73 20 74 68 65 20 73 69 6d 69 6c 61 72 6c 79  as the similarly
7f40: 20 6e 61 6d 65 64 20 61 72 67 75 6d 65 6e 74 20   named argument 
7f50: 70 61 73 73 65 64 20 74 6f 0a 2a 2a 20 66 74 73  passed to.** fts
7f60: 33 49 6e 73 65 72 74 44 61 74 61 28 29 2e 20 50  3InsertData(). P
7f70: 61 72 61 6d 65 74 65 72 20 69 44 6f 63 69 64 20  arameter iDocid 
7f80: 69 73 20 74 68 65 20 64 6f 63 69 64 20 6f 66 20  is the docid of 
7f90: 74 68 65 20 6e 65 77 20 72 6f 77 2e 0a 2a 2f 0a  the new row..*/.
7fa0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49  static int fts3I
7fb0: 6e 73 65 72 74 54 65 72 6d 73 28 0a 20 20 46 74  nsertTerms(.  Ft
7fc0: 73 33 54 61 62 6c 65 20 2a 70 2c 20 0a 20 20 69  s3Table *p, .  i
7fd0: 6e 74 20 69 4c 61 6e 67 69 64 2c 20 0a 20 20 73  nt iLangid, .  s
7fe0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
7ff0: 70 56 61 6c 2c 20 0a 20 20 75 33 32 20 2a 61 53  pVal, .  u32 *aS
8000: 7a 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  z.){.  int i;   
8010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8020: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
8030: 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
8040: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 70 2d 3e 6e   for(i=2; i<p->n
8050: 43 6f 6c 75 6d 6e 2b 32 3b 20 69 2b 2b 29 7b 0a  Column+2; i++){.
8060: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 69      int iCol = i
8070: 2d 32 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61  -2;.    if( p->a
8080: 62 4e 6f 74 69 6e 64 65 78 65 64 5b 69 43 6f 6c  bNotindexed[iCol
8090: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  ]==0 ){.      co
80a0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 20  nst char *zText 
80b0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
80c0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
80d0: 78 74 28 61 70 56 61 6c 5b 69 5d 29 3b 0a 20 20  xt(apVal[i]);.  
80e0: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73      int rc = fts
80f0: 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 41 64 64  3PendingTermsAdd
8100: 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 7a 54 65  (p, iLangid, zTe
8110: 78 74 2c 20 69 43 6f 6c 2c 20 26 61 53 7a 5b 69  xt, iCol, &aSz[i
8120: 43 6f 6c 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  Col]);.      if(
8130: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8140: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
8150: 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
8160: 20 20 20 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75 6d     aSz[p->nColum
8170: 6e 5d 20 2b 3d 20 73 71 6c 69 74 65 33 5f 76 61  n] += sqlite3_va
8180: 6c 75 65 5f 62 79 74 65 73 28 61 70 56 61 6c 5b  lue_bytes(apVal[
8190: 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  i]);.    }.  }. 
81a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
81b0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
81c0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
81d0: 6c 65 64 20 62 79 20 74 68 65 20 78 55 70 64 61  led by the xUpda
81e0: 74 65 28 29 20 6d 65 74 68 6f 64 20 66 6f 72 20  te() method for 
81f0: 61 6e 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74  an INSERT operat
8200: 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 61 70 56 61  ion..** The apVa
8210: 6c 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70  l parameter is p
8220: 61 73 73 65 64 20 61 20 63 6f 70 79 20 6f 66 20  assed a copy of 
8230: 74 68 65 20 61 70 56 61 6c 20 61 72 67 75 6d 65  the apVal argume
8240: 6e 74 20 70 61 73 73 65 64 20 62 79 0a 2a 2a 20  nt passed by.** 
8250: 53 51 4c 69 74 65 20 74 6f 20 74 68 65 20 78 55  SQLite to the xU
8260: 70 64 61 74 65 28 29 20 6d 65 74 68 6f 64 2e 20  pdate() method. 
8270: 69 2e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 70 56  i.e:.**.**   apV
8280: 61 6c 5b 30 5d 20 20 20 20 20 20 20 20 20 20 20  al[0]           
8290: 20 20 20 20 20 4e 6f 74 20 75 73 65 64 20 66 6f       Not used fo
82a0: 72 20 49 4e 53 45 52 54 2e 0a 2a 2a 20 20 20 61  r INSERT..**   a
82b0: 70 56 61 6c 5b 31 5d 20 20 20 20 20 20 20 20 20  pVal[1]         
82c0: 20 20 20 20 20 20 20 72 6f 77 69 64 0a 2a 2a 20         rowid.** 
82d0: 20 20 61 70 56 61 6c 5b 32 5d 20 20 20 20 20 20    apVal[2]      
82e0: 20 20 20 20 20 20 20 20 20 20 4c 65 66 74 2d 6d            Left-m
82f0: 6f 73 74 20 75 73 65 72 2d 64 65 66 69 6e 65 64  ost user-defined
8300: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 2e 2e 2e   column.**   ...
8310: 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 70 2d 3e 6e  .**   apVal[p->n
8320: 43 6f 6c 75 6d 6e 2b 31 5d 20 20 20 20 20 52 69  Column+1]     Ri
8330: 67 68 74 2d 6d 6f 73 74 20 75 73 65 72 2d 64 65  ght-most user-de
8340: 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  fined column.** 
8350: 20 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75    apVal[p->nColu
8360: 6d 6e 2b 32 5d 20 20 20 20 20 48 69 64 64 65 6e  mn+2]     Hidden
8370: 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 73 61 6d   column with sam
8380: 65 20 6e 61 6d 65 20 61 73 20 74 61 62 6c 65 0a  e name as table.
8390: 2a 2a 20 20 20 61 70 56 61 6c 5b 70 2d 3e 6e 43  **   apVal[p->nC
83a0: 6f 6c 75 6d 6e 2b 33 5d 20 20 20 20 20 48 69 64  olumn+3]     Hid
83b0: 64 65 6e 20 22 64 6f 63 69 64 22 20 63 6f 6c 75  den "docid" colu
83c0: 6d 6e 20 28 61 6c 69 61 73 20 66 6f 72 20 72 6f  mn (alias for ro
83d0: 77 69 64 29 0a 2a 2a 20 20 20 61 70 56 61 6c 5b  wid).**   apVal[
83e0: 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 34 5d 20 20 20  p->nColumn+4]   
83f0: 20 20 48 69 64 64 65 6e 20 6c 61 6e 67 75 61 67    Hidden languag
8400: 65 69 64 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74  eid column.*/.st
8410: 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 73  atic int fts3Ins
8420: 65 72 74 44 61 74 61 28 0a 20 20 46 74 73 33 54  ertData(.  Fts3T
8430: 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
8440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
8450: 6c 6c 2d 74 65 78 74 20 74 61 62 6c 65 20 2a 2f  ll-text table */
8460: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
8470: 20 2a 2a 61 70 56 61 6c 2c 20 20 20 20 20 20 20   **apVal,       
8480: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 76     /* Array of v
8490: 61 6c 75 65 73 20 74 6f 20 69 6e 73 65 72 74 20  alues to insert 
84a0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
84b0: 36 34 20 2a 70 69 44 6f 63 69 64 20 20 20 20 20  64 *piDocid     
84c0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 6f 63       /* OUT: Doc
84d0: 69 64 20 66 6f 72 20 72 6f 77 20 6a 75 73 74 20  id for row just 
84e0: 69 6e 73 65 72 74 65 64 20 2a 2f 0a 29 7b 0a 20  inserted */.){. 
84f0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8510: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
8520: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
8530: 74 20 2a 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72  t *pContentInser
8540: 74 3b 20 20 20 2f 2a 20 49 4e 53 45 52 54 20 49  t;   /* INSERT I
8550: 4e 54 4f 20 25 5f 63 6f 6e 74 65 6e 74 20 56 41  NTO %_content VA
8560: 4c 55 45 53 28 2e 2e 2e 29 20 2a 2f 0a 0a 20 20  LUES(...) */..  
8570: 69 66 28 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54  if( p->zContentT
8580: 62 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  bl ){.    sqlite
8590: 33 5f 76 61 6c 75 65 20 2a 70 52 6f 77 69 64 20  3_value *pRowid 
85a0: 3d 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75  = apVal[p->nColu
85b0: 6d 6e 2b 33 5d 3b 0a 20 20 20 20 69 66 28 20 73  mn+3];.    if( s
85c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
85d0: 65 28 70 52 6f 77 69 64 29 3d 3d 53 51 4c 49 54  e(pRowid)==SQLIT
85e0: 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  E_NULL ){.      
85f0: 70 52 6f 77 69 64 20 3d 20 61 70 56 61 6c 5b 31  pRowid = apVal[1
8600: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  ];.    }.    if(
8610: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
8620: 79 70 65 28 70 52 6f 77 69 64 29 21 3d 53 51 4c  ype(pRowid)!=SQL
8630: 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  ITE_INTEGER ){. 
8640: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8650: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
8660: 20 20 20 7d 0a 20 20 20 20 2a 70 69 44 6f 63 69     }.    *piDoci
8670: 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  d = sqlite3_valu
8680: 65 5f 69 6e 74 36 34 28 70 52 6f 77 69 64 29 3b  e_int64(pRowid);
8690: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
86a0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
86b0: 20 4c 6f 63 61 74 65 20 74 68 65 20 73 74 61 74   Locate the stat
86c0: 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 75 73 65  ement handle use
86d0: 64 20 74 6f 20 69 6e 73 65 72 74 20 64 61 74 61  d to insert data
86e0: 20 69 6e 74 6f 20 74 68 65 20 25 5f 63 6f 6e 74   into the %_cont
86f0: 65 6e 74 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20  ent.  ** table. 
8700: 54 68 65 20 53 51 4c 20 66 6f 72 20 74 68 69 73  The SQL for this
8710: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 3a 0a 20   statement is:. 
8720: 20 2a 2a 0a 20 20 2a 2a 20 20 20 49 4e 53 45 52   **.  **   INSER
8730: 54 20 49 4e 54 4f 20 25 5f 63 6f 6e 74 65 6e 74  T INTO %_content
8740: 20 56 41 4c 55 45 53 28 3f 2c 20 3f 2c 20 3f 2c   VALUES(?, ?, ?,
8750: 20 2e 2e 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20   ...).  **.  ** 
8760: 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 66 65  The statement fe
8770: 61 74 75 72 65 73 20 4e 20 27 3f 27 20 76 61 72  atures N '?' var
8780: 69 61 62 6c 65 73 2c 20 77 68 65 72 65 20 4e 20  iables, where N 
8790: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
87a0: 20 75 73 65 72 0a 20 20 2a 2a 20 64 65 66 69 6e   user.  ** defin
87b0: 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ed columns in th
87c0: 65 20 46 54 53 33 20 74 61 62 6c 65 2c 20 70 6c  e FTS3 table, pl
87d0: 75 73 20 6f 6e 65 20 66 6f 72 20 74 68 65 20 64  us one for the d
87e0: 6f 63 69 64 20 66 69 65 6c 64 2e 0a 20 20 2a 2f  ocid field..  */
87f0: 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
8800: 74 6d 74 28 70 2c 20 53 51 4c 5f 43 4f 4e 54 45  tmt(p, SQL_CONTE
8810: 4e 54 5f 49 4e 53 45 52 54 2c 20 26 70 43 6f 6e  NT_INSERT, &pCon
8820: 74 65 6e 74 49 6e 73 65 72 74 2c 20 26 61 70 56  tentInsert, &apV
8830: 61 6c 5b 31 5d 29 3b 0a 20 20 69 66 28 20 72 63  al[1]);.  if( rc
8840: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
8850: 2d 3e 7a 4c 61 6e 67 75 61 67 65 69 64 20 29 7b  ->zLanguageid ){
8860: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
8870: 33 5f 62 69 6e 64 5f 69 6e 74 28 0a 20 20 20 20  3_bind_int(.    
8880: 20 20 20 20 70 43 6f 6e 74 65 6e 74 49 6e 73 65      pContentInse
8890: 72 74 2c 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32  rt, p->nColumn+2
88a0: 2c 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  , .        sqlit
88b0: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56  e3_value_int(apV
88c0: 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 34 5d  al[p->nColumn+4]
88d0: 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 69  ).    );.  }.  i
88e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
88f0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
8900: 20 2f 2a 20 54 68 65 72 65 20 69 73 20 61 20 71   /* There is a q
8910: 75 69 72 6b 20 68 65 72 65 2e 20 54 68 65 20 75  uirk here. The u
8920: 73 65 72 73 20 49 4e 53 45 52 54 20 73 74 61 74  sers INSERT stat
8930: 65 6d 65 6e 74 20 6d 61 79 20 68 61 76 65 20 73  ement may have s
8940: 70 65 63 69 66 69 65 64 0a 20 20 2a 2a 20 61 20  pecified.  ** a 
8950: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 22 72  value for the "r
8960: 6f 77 69 64 22 20 66 69 65 6c 64 2c 20 66 6f 72  owid" field, for
8970: 20 74 68 65 20 22 64 6f 63 69 64 22 20 66 69 65   the "docid" fie
8980: 6c 64 2c 20 6f 72 20 66 6f 72 20 62 6f 74 68 2e  ld, or for both.
8990: 0a 20 20 2a 2a 20 57 68 69 63 68 20 69 73 20 61  .  ** Which is a
89a0: 20 70 72 6f 62 6c 65 6d 2c 20 73 69 6e 63 65 20   problem, since 
89b0: 22 72 6f 77 69 64 22 20 61 6e 64 20 22 64 6f 63  "rowid" and "doc
89c0: 69 64 22 20 61 72 65 20 61 6c 69 61 73 65 73 20  id" are aliases 
89d0: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d  for the.  ** sam
89e0: 65 20 76 61 6c 75 65 2e 20 46 6f 72 20 65 78 61  e value. For exa
89f0: 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
8a00: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 74    INSERT INTO ft
8a10: 73 33 74 62 6c 28 72 6f 77 69 64 2c 20 64 6f 63  s3tbl(rowid, doc
8a20: 69 64 29 20 56 41 4c 55 45 53 28 31 2c 20 32 29  id) VALUES(1, 2)
8a30: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 46  ;.  **.  ** In F
8a40: 54 53 33 2c 20 74 68 69 73 20 69 73 20 61 6e 20  TS3, this is an 
8a50: 65 72 72 6f 72 2e 20 49 74 20 69 73 20 61 6e 20  error. It is an 
8a60: 65 72 72 6f 72 20 74 6f 20 73 70 65 63 69 66 79  error to specify
8a70: 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 73   non-NULL values
8a80: 0a 20 20 2a 2a 20 66 6f 72 20 62 6f 74 68 20 64  .  ** for both d
8a90: 6f 63 69 64 20 61 6e 64 20 73 6f 6d 65 20 6f 74  ocid and some ot
8aa0: 68 65 72 20 72 6f 77 69 64 20 61 6c 69 61 73 2e  her rowid alias.
8ab0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  .  */.  if( SQLI
8ac0: 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33  TE_NULL!=sqlite3
8ad0: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61  _value_type(apVa
8ae0: 6c 5b 33 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 29  l[3+p->nColumn])
8af0: 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49   ){.    if( SQLI
8b00: 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65 33  TE_NULL==sqlite3
8b10: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61  _value_type(apVa
8b20: 6c 5b 30 5d 29 0a 20 20 20 20 20 26 26 20 53 51  l[0]).     && SQ
8b30: 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74  LITE_NULL!=sqlit
8b40: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70  e3_value_type(ap
8b50: 56 61 6c 5b 31 5d 29 0a 20 20 20 20 29 7b 0a 20  Val[1]).    ){. 
8b60: 20 20 20 20 20 2f 2a 20 41 20 72 6f 77 69 64 2f       /* A rowid/
8b70: 64 6f 63 69 64 20 63 6f 6e 66 6c 69 63 74 2e 20  docid conflict. 
8b80: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
8b90: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
8ba0: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
8bb0: 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28  ite3_bind_value(
8bc0: 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 2c 20  pContentInsert, 
8bd0: 31 2c 20 61 70 56 61 6c 5b 33 2b 70 2d 3e 6e 43  1, apVal[3+p->nC
8be0: 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 20 20 69 66 28  olumn]);.    if(
8bf0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8c00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
8c10: 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68  .  /* Execute th
8c20: 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 69  e statement to i
8c30: 6e 73 65 72 74 20 74 68 65 20 72 65 63 6f 72 64  nsert the record
8c40: 2e 20 53 65 74 20 2a 70 69 44 6f 63 69 64 20 74  . Set *piDocid t
8c50: 6f 20 74 68 65 20 0a 20 20 2a 2a 20 6e 65 77 20  o the .  ** new 
8c60: 64 6f 63 69 64 20 76 61 6c 75 65 2e 20 0a 20 20  docid value. .  
8c70: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65  */.  sqlite3_ste
8c80: 70 28 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74  p(pContentInsert
8c90: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
8ca0: 33 5f 72 65 73 65 74 28 70 43 6f 6e 74 65 6e 74  3_reset(pContent
8cb0: 49 6e 73 65 72 74 29 3b 0a 0a 20 20 2a 70 69 44  Insert);..  *piD
8cc0: 6f 63 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c  ocid = sqlite3_l
8cd0: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
8ce0: 28 70 2d 3e 64 62 29 3b 0a 20 20 72 65 74 75 72  (p->db);.  retur
8cf0: 6e 20 72 63 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  n rc;.}..../*.**
8d00: 20 52 65 6d 6f 76 65 20 61 6c 6c 20 64 61 74 61   Remove all data
8d10: 20 66 72 6f 6d 20 74 68 65 20 46 54 53 33 20 74   from the FTS3 t
8d20: 61 62 6c 65 2e 20 43 6c 65 61 72 20 74 68 65 20  able. Clear the 
8d30: 68 61 73 68 20 74 61 62 6c 65 20 63 6f 6e 74 61  hash table conta
8d40: 69 6e 69 6e 67 0a 2a 2a 20 70 65 6e 64 69 6e 67  ining.** pending
8d50: 20 74 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69   terms..*/.stati
8d60: 63 20 69 6e 74 20 66 74 73 33 44 65 6c 65 74 65  c int fts3Delete
8d70: 41 6c 6c 28 46 74 73 33 54 61 62 6c 65 20 2a 70  All(Fts3Table *p
8d80: 2c 20 69 6e 74 20 62 43 6f 6e 74 65 6e 74 29 7b  , int bContent){
8d90: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
8da0: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
8db0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
8dc0: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 44 69 73 63 61  e */..  /* Disca
8dd0: 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  rd the contents 
8de0: 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74  of the pending-t
8df0: 65 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65 2e  erms hash table.
8e00: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46 74 73   */.  sqlite3Fts
8e10: 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 43 6c 65  3PendingTermsCle
8e20: 61 72 28 70 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c  ar(p);..  /* Del
8e30: 65 74 65 20 65 76 65 72 79 74 68 69 6e 67 20 66  ete everything f
8e40: 72 6f 6d 20 74 68 65 20 73 68 61 64 6f 77 20 74  rom the shadow t
8e50: 61 62 6c 65 73 2e 20 45 78 63 65 70 74 2c 20 6c  ables. Except, l
8e60: 65 61 76 65 20 25 5f 63 6f 6e 74 65 6e 74 20 61  eave %_content a
8e70: 73 0a 20 20 2a 2a 20 69 73 20 69 66 20 62 43 6f  s.  ** is if bCo
8e80: 6e 74 65 6e 74 20 69 73 20 66 61 6c 73 65 2e 20  ntent is false. 
8e90: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
8ea0: 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d 30 20  >zContentTbl==0 
8eb0: 7c 7c 20 62 43 6f 6e 74 65 6e 74 3d 3d 30 20 29  || bContent==0 )
8ec0: 3b 0a 20 20 69 66 28 20 62 43 6f 6e 74 65 6e 74  ;.  if( bContent
8ed0: 20 29 20 66 74 73 33 53 71 6c 45 78 65 63 28 26   ) fts3SqlExec(&
8ee0: 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54  rc, p, SQL_DELET
8ef0: 45 5f 41 4c 4c 5f 43 4f 4e 54 45 4e 54 2c 20 30  E_ALL_CONTENT, 0
8f00: 29 3b 0a 20 20 66 74 73 33 53 71 6c 45 78 65 63  );.  fts3SqlExec
8f10: 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c  (&rc, p, SQL_DEL
8f20: 45 54 45 5f 41 4c 4c 5f 53 45 47 4d 45 4e 54 53  ETE_ALL_SEGMENTS
8f30: 2c 20 30 29 3b 0a 20 20 66 74 73 33 53 71 6c 45  , 0);.  fts3SqlE
8f40: 78 65 63 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f  xec(&rc, p, SQL_
8f50: 44 45 4c 45 54 45 5f 41 4c 4c 5f 53 45 47 44 49  DELETE_ALL_SEGDI
8f60: 52 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e  R, 0);.  if( p->
8f70: 62 48 61 73 44 6f 63 73 69 7a 65 20 29 7b 0a 20  bHasDocsize ){. 
8f80: 20 20 20 66 74 73 33 53 71 6c 45 78 65 63 28 26     fts3SqlExec(&
8f90: 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54  rc, p, SQL_DELET
8fa0: 45 5f 41 4c 4c 5f 44 4f 43 53 49 5a 45 2c 20 30  E_ALL_DOCSIZE, 0
8fb0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
8fc0: 62 48 61 73 53 74 61 74 20 29 7b 0a 20 20 20 20  bHasStat ){.    
8fd0: 66 74 73 33 53 71 6c 45 78 65 63 28 26 72 63 2c  fts3SqlExec(&rc,
8fe0: 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41   p, SQL_DELETE_A
8ff0: 4c 4c 5f 53 54 41 54 2c 20 30 29 3b 0a 20 20 7d  LL_STAT, 0);.  }
9000: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9010: 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  ./*.**.*/.static
9020: 20 69 6e 74 20 6c 61 6e 67 69 64 46 72 6f 6d 53   int langidFromS
9030: 65 6c 65 63 74 28 46 74 73 33 54 61 62 6c 65 20  elect(Fts3Table 
9040: 2a 70 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  *p, sqlite3_stmt
9050: 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 69 6e   *pSelect){.  in
9060: 74 20 69 4c 61 6e 67 69 64 20 3d 20 30 3b 0a 20  t iLangid = 0;. 
9070: 20 69 66 28 20 70 2d 3e 7a 4c 61 6e 67 75 61 67   if( p->zLanguag
9080: 65 69 64 20 29 20 69 4c 61 6e 67 69 64 20 3d 20  eid ) iLangid = 
9090: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
90a0: 6e 74 28 70 53 65 6c 65 63 74 2c 20 70 2d 3e 6e  nt(pSelect, p->n
90b0: 43 6f 6c 75 6d 6e 2b 31 29 3b 0a 20 20 72 65 74  Column+1);.  ret
90c0: 75 72 6e 20 69 4c 61 6e 67 69 64 3b 0a 7d 0a 0a  urn iLangid;.}..
90d0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
90e0: 65 6c 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 61  element in the a
90f0: 70 56 61 6c 5b 5d 20 61 72 72 61 79 20 69 73 20  pVal[] array is 
9100: 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61  assumed to conta
9110: 69 6e 20 74 68 65 20 64 6f 63 69 64 0a 2a 2a 20  in the docid.** 
9120: 28 61 6e 20 69 6e 74 65 67 65 72 29 20 6f 66 20  (an integer) of 
9130: 61 20 72 6f 77 20 61 62 6f 75 74 20 74 6f 20 62  a row about to b
9140: 65 20 64 65 6c 65 74 65 64 2e 20 52 65 6d 6f 76  e deleted. Remov
9150: 65 20 61 6c 6c 20 74 65 72 6d 73 20 66 72 6f 6d  e all terms from
9160: 20 74 68 65 0a 2a 2a 20 66 75 6c 6c 2d 74 65 78   the.** full-tex
9170: 74 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  t index..*/.stat
9180: 69 63 20 76 6f 69 64 20 66 74 73 33 44 65 6c 65  ic void fts3Dele
9190: 74 65 54 65 72 6d 73 28 20 0a 20 20 69 6e 74 20  teTerms( .  int 
91a0: 2a 70 52 43 2c 20 20 20 20 20 20 20 20 20 20 20  *pRC,           
91b0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
91c0: 64 65 20 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c  de */.  Fts3Tabl
91d0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
91e0: 2f 2a 20 54 68 65 20 46 54 53 20 74 61 62 6c 65  /* The FTS table
91f0: 20 74 6f 20 64 65 6c 65 74 65 20 66 72 6f 6d 20   to delete from 
9200: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
9210: 75 65 20 2a 70 52 6f 77 69 64 2c 20 20 2f 2a 20  ue *pRowid,  /* 
9220: 54 68 65 20 64 6f 63 69 64 20 74 6f 20 62 65 20  The docid to be 
9230: 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 33 32  deleted */.  u32
9240: 20 2a 61 53 7a 2c 20 20 20 20 20 20 20 20 20 20   *aSz,          
9250: 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66       /* Sizes of
9260: 20 64 65 6c 65 74 65 64 20 64 6f 63 75 6d 65 6e   deleted documen
9270: 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
9280: 2f 0a 20 20 69 6e 74 20 2a 70 62 46 6f 75 6e 64  /.  int *pbFound
9290: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
92a0: 55 54 3a 20 53 65 74 20 74 6f 20 74 72 75 65 20  UT: Set to true 
92b0: 69 66 20 72 6f 77 20 72 65 61 6c 6c 79 20 64 6f  if row really do
92c0: 65 73 20 65 78 69 73 74 20 2a 2f 0a 29 7b 0a 20  es exist */.){. 
92d0: 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
92e0: 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74  e3_stmt *pSelect
92f0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 62  ;..  assert( *pb
9300: 46 6f 75 6e 64 3d 3d 30 20 29 3b 0a 20 20 69 66  Found==0 );.  if
9310: 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
9320: 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
9330: 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43  tmt(p, SQL_SELEC
9340: 54 5f 43 4f 4e 54 45 4e 54 5f 42 59 5f 52 4f 57  T_CONTENT_BY_ROW
9350: 49 44 2c 20 26 70 53 65 6c 65 63 74 2c 20 26 70  ID, &pSelect, &p
9360: 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 72 63  Rowid);.  if( rc
9370: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
9380: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
9390: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
93a0: 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  pSelect) ){.    
93b0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
93c0: 6e 74 20 69 4c 61 6e 67 69 64 20 3d 20 6c 61 6e  nt iLangid = lan
93d0: 67 69 64 46 72 6f 6d 53 65 6c 65 63 74 28 70 2c  gidFromSelect(p,
93e0: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20   pSelect);.     
93f0: 20 69 36 34 20 69 44 6f 63 69 64 20 3d 20 73 71   i64 iDocid = sq
9400: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
9410: 36 34 28 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  64(pSelect, 0);.
9420: 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 50        rc = fts3P
9430: 65 6e 64 69 6e 67 54 65 72 6d 73 44 6f 63 69 64  endingTermsDocid
9440: 28 70 2c 20 31 2c 20 69 4c 61 6e 67 69 64 2c 20  (p, 1, iLangid, 
9450: 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 20 20 66  iDocid);.      f
9460: 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49  or(i=1; rc==SQLI
9470: 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 70 2d 3e 6e  TE_OK && i<=p->n
9480: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
9490: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
94a0: 20 69 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66   i-1;.        if
94b0: 28 20 70 2d 3e 61 62 4e 6f 74 69 6e 64 65 78 65  ( p->abNotindexe
94c0: 64 5b 69 43 6f 6c 5d 3d 3d 30 20 29 7b 0a 20 20  d[iCol]==0 ){.  
94d0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
94e0: 61 72 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e  ar *zText = (con
94f0: 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  st char *)sqlite
9500: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
9510: 65 6c 65 63 74 2c 20 69 29 3b 0a 20 20 20 20 20  elect, i);.     
9520: 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 50 65       rc = fts3Pe
9530: 6e 64 69 6e 67 54 65 72 6d 73 41 64 64 28 70 2c  ndingTermsAdd(p,
9540: 20 69 4c 61 6e 67 69 64 2c 20 7a 54 65 78 74 2c   iLangid, zText,
9550: 20 2d 31 2c 20 26 61 53 7a 5b 69 43 6f 6c 5d 29   -1, &aSz[iCol])
9560: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 53 7a 5b  ;.          aSz[
9570: 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 2b 3d 20 73  p->nColumn] += s
9580: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
9590: 74 65 73 28 70 53 65 6c 65 63 74 2c 20 69 29 3b  tes(pSelect, i);
95a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
95b0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21   }.      if( rc!
95c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
95d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
95e0: 73 65 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  set(pSelect);.  
95f0: 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b        *pRC = rc;
9600: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
9610: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
9620: 70 62 46 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 20  pbFound = 1;.   
9630: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
9640: 74 65 33 5f 72 65 73 65 74 28 70 53 65 6c 65 63  te3_reset(pSelec
9650: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
9660: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
9670: 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 2a  Select);.  }.  *
9680: 70 52 43 20 3d 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  pRC = rc;.}../*.
9690: 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
96a0: 72 61 74 69 6f 6e 20 74 6f 20 61 63 63 6f 75 6e  ration to accoun
96b0: 74 20 66 6f 72 20 74 68 65 20 63 69 72 63 75 6c  t for the circul
96c0: 61 72 20 64 65 70 65 6e 64 65 6e 63 79 20 62 65  ar dependency be
96d0: 74 77 65 65 6e 0a 2a 2a 20 66 75 6e 63 74 69 6f  tween.** functio
96e0: 6e 73 20 66 74 73 33 53 65 67 6d 65 6e 74 4d 65  ns fts3SegmentMe
96f0: 72 67 65 28 29 20 61 6e 64 20 66 74 73 33 41 6c  rge() and fts3Al
9700: 6c 6f 63 61 74 65 53 65 67 64 69 72 49 64 78 28  locateSegdirIdx(
9710: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
9720: 20 66 74 73 33 53 65 67 6d 65 6e 74 4d 65 72 67   fts3SegmentMerg
9730: 65 28 46 74 73 33 54 61 62 6c 65 20 2a 2c 20 69  e(Fts3Table *, i
9740: 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 29 3b 0a 0a  nt, int, int);..
9750: 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  /* .** This func
9760: 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61  tion allocates a
9770: 20 6e 65 77 20 6c 65 76 65 6c 20 69 4c 65 76 65   new level iLeve
9780: 6c 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 73  l index in the s
9790: 65 67 64 69 72 20 74 61 62 6c 65 2e 0a 2a 2a 20  egdir table..** 
97a0: 55 73 75 61 6c 6c 79 2c 20 69 6e 64 65 78 65 73  Usually, indexes
97b0: 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 77   are allocated w
97c0: 69 74 68 69 6e 20 61 20 6c 65 76 65 6c 20 73 65  ithin a level se
97d0: 71 75 65 6e 74 69 61 6c 6c 79 20 73 74 61 72 74  quentially start
97e0: 69 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2c 20 73  ing.** with 0, s
97f0: 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  o the allocated 
9800: 69 6e 64 65 78 20 69 73 20 6f 6e 65 20 67 72 65  index is one gre
9810: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61  ater than the va
9820: 6c 75 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  lue returned.** 
9830: 62 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  by:.**.**   SELE
9840: 43 54 20 6d 61 78 28 69 64 78 29 20 46 52 4f 4d  CT max(idx) FROM
9850: 20 25 5f 73 65 67 64 69 72 20 57 48 45 52 45 20   %_segdir WHERE 
9860: 6c 65 76 65 6c 20 3d 20 3a 69 4c 65 76 65 6c 0a  level = :iLevel.
9870: 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69  **.** However, i
9880: 66 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65  f there are alre
9890: 61 64 79 20 46 54 53 33 5f 4d 45 52 47 45 5f 43  ady FTS3_MERGE_C
98a0: 4f 55 4e 54 20 69 6e 64 65 78 65 73 20 61 74 20  OUNT indexes at 
98b0: 74 68 65 20 72 65 71 75 65 73 74 65 64 0a 2a 2a  the requested.**
98c0: 20 6c 65 76 65 6c 2c 20 74 68 65 79 20 61 72 65   level, they are
98d0: 20 6d 65 72 67 65 64 20 69 6e 74 6f 20 61 20 73   merged into a s
98e0: 69 6e 67 6c 65 20 6c 65 76 65 6c 20 28 69 4c 65  ingle level (iLe
98f0: 76 65 6c 2b 31 29 20 73 65 67 6d 65 6e 74 20 61  vel+1) segment a
9900: 6e 64 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63  nd the .** alloc
9910: 61 74 65 64 20 69 6e 64 65 78 20 69 73 20 30 2e  ated index is 0.
9920: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
9930: 73 66 75 6c 2c 20 2a 70 69 49 64 78 20 69 73 20  sful, *piIdx is 
9940: 73 65 74 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63  set to the alloc
9950: 61 74 65 64 20 69 6e 64 65 78 20 73 6c 6f 74 20  ated index slot 
9960: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  and SQLITE_OK.**
9970: 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
9980: 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20  wise, an SQLite 
9990: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
99a0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
99b0: 63 20 69 6e 74 20 66 74 73 33 41 6c 6c 6f 63 61  c int fts3Alloca
99c0: 74 65 53 65 67 64 69 72 49 64 78 28 0a 20 20 46  teSegdirIdx(.  F
99d0: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 0a 20 20  ts3Table *p, .  
99e0: 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20 20 20  int iLangid,    
99f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a00: 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64 20 2a  /* Language id *
9a10: 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 2c 20  /.  int iIndex, 
9a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a30: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72      /* Index for
9a40: 20 70 2d 3e 61 49 6e 64 65 78 20 2a 2f 0a 20 20   p->aIndex */.  
9a50: 69 6e 74 20 69 4c 65 76 65 6c 2c 20 0a 20 20 69  int iLevel, .  i
9a60: 6e 74 20 2a 70 69 49 64 78 0a 29 7b 0a 20 20 69  nt *piIdx.){.  i
9a70: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9a90: 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
9aa0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
9ab0: 2a 70 4e 65 78 74 49 64 78 3b 20 20 20 20 20 20  *pNextIdx;      
9ac0: 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6f 72 20     /* Query for 
9ad0: 6e 65 78 74 20 69 64 78 20 61 74 20 6c 65 76 65  next idx at leve
9ae0: 6c 20 69 4c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e  l iLevel */.  in
9af0: 74 20 69 4e 65 78 74 20 3d 20 30 3b 20 20 20 20  t iNext = 0;    
9b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9b10: 20 52 65 73 75 6c 74 20 6f 66 20 71 75 65 72 79   Result of query
9b20: 20 70 4e 65 78 74 49 64 78 20 2a 2f 0a 0a 20 20   pNextIdx */..  
9b30: 61 73 73 65 72 74 28 20 69 4c 61 6e 67 69 64 3e  assert( iLangid>
9b40: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9b50: 70 2d 3e 6e 49 6e 64 65 78 3e 3d 31 20 29 3b 0a  p->nIndex>=1 );.
9b60: 0a 20 20 2f 2a 20 53 65 74 20 76 61 72 69 61 62  .  /* Set variab
9b70: 6c 65 20 69 4e 65 78 74 20 74 6f 20 74 68 65 20  le iNext to the 
9b80: 6e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 73  next available s
9b90: 65 67 64 69 72 20 69 6e 64 65 78 20 61 74 20 6c  egdir index at l
9ba0: 65 76 65 6c 20 69 4c 65 76 65 6c 2e 20 2a 2f 0a  evel iLevel. */.
9bb0: 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
9bc0: 6d 74 28 70 2c 20 53 51 4c 5f 4e 45 58 54 5f 53  mt(p, SQL_NEXT_S
9bd0: 45 47 4d 45 4e 54 5f 49 4e 44 45 58 2c 20 26 70  EGMENT_INDEX, &p
9be0: 4e 65 78 74 49 64 78 2c 20 30 29 3b 0a 20 20 69  NextIdx, 0);.  i
9bf0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
9c00: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
9c10: 62 69 6e 64 5f 69 6e 74 36 34 28 0a 20 20 20 20  bind_int64(.    
9c20: 20 20 20 20 70 4e 65 78 74 49 64 78 2c 20 31 2c      pNextIdx, 1,
9c30: 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65   getAbsoluteLeve
9c40: 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49  l(p, iLangid, iI
9c50: 6e 64 65 78 2c 20 69 4c 65 76 65 6c 29 0a 20 20  ndex, iLevel).  
9c60: 20 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c    );.    if( SQL
9c70: 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
9c80: 5f 73 74 65 70 28 70 4e 65 78 74 49 64 78 29 20  _step(pNextIdx) 
9c90: 29 7b 0a 20 20 20 20 20 20 69 4e 65 78 74 20 3d  ){.      iNext =
9ca0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
9cb0: 69 6e 74 28 70 4e 65 78 74 49 64 78 2c 20 30 29  int(pNextIdx, 0)
9cc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
9cd0: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
9ce0: 4e 65 78 74 49 64 78 29 3b 0a 20 20 7d 0a 0a 20  NextIdx);.  }.. 
9cf0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
9d00: 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  OK ){.    /* If 
9d10: 69 4e 65 78 74 20 69 73 20 46 54 53 33 5f 4d 45  iNext is FTS3_ME
9d20: 52 47 45 5f 43 4f 55 4e 54 2c 20 69 6e 64 69 63  RGE_COUNT, indic
9d30: 61 74 69 6e 67 20 74 68 61 74 20 6c 65 76 65 6c  ating that level
9d40: 20 69 4c 65 76 65 6c 20 69 73 20 61 6c 72 65 61   iLevel is alrea
9d50: 64 79 0a 20 20 20 20 2a 2a 20 66 75 6c 6c 2c 20  dy.    ** full, 
9d60: 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d 65 6e  merge all segmen
9d70: 74 73 20 69 6e 20 6c 65 76 65 6c 20 69 4c 65 76  ts in level iLev
9d80: 65 6c 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  el into a single
9d90: 20 69 4c 65 76 65 6c 2b 31 0a 20 20 20 20 2a 2a   iLevel+1.    **
9da0: 20 73 65 67 6d 65 6e 74 20 61 6e 64 20 61 6c 6c   segment and all
9db0: 6f 63 61 74 65 20 28 6e 65 77 6c 79 20 66 72 65  ocate (newly fre
9dc0: 65 64 29 20 69 6e 64 65 78 20 30 20 61 74 20 6c  ed) index 0 at l
9dd0: 65 76 65 6c 20 69 4c 65 76 65 6c 2e 20 4f 74 68  evel iLevel. Oth
9de0: 65 72 77 69 73 65 2c 0a 20 20 20 20 2a 2a 20 69  erwise,.    ** i
9df0: 66 20 69 4e 65 78 74 20 69 73 20 6c 65 73 73 20  f iNext is less 
9e00: 74 68 61 6e 20 46 54 53 33 5f 4d 45 52 47 45 5f  than FTS3_MERGE_
9e10: 43 4f 55 4e 54 2c 20 61 6c 6c 6f 63 61 74 65 20  COUNT, allocate 
9e20: 69 6e 64 65 78 20 69 4e 65 78 74 2e 0a 20 20 20  index iNext..   
9e30: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 4e 65 78   */.    if( iNex
9e40: 74 3e 3d 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f  t>=FTS3_MERGE_CO
9e50: 55 4e 54 20 29 7b 0a 20 20 20 20 20 20 66 74 73  UNT ){.      fts
9e60: 33 4c 6f 67 4d 65 72 67 65 28 31 36 2c 20 67 65  3LogMerge(16, ge
9e70: 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70  tAbsoluteLevel(p
9e80: 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
9e90: 78 2c 20 69 4c 65 76 65 6c 29 29 3b 0a 20 20 20  x, iLevel));.   
9ea0: 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 6d     rc = fts3Segm
9eb0: 65 6e 74 4d 65 72 67 65 28 70 2c 20 69 4c 61 6e  entMerge(p, iLan
9ec0: 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65  gid, iIndex, iLe
9ed0: 76 65 6c 29 3b 0a 20 20 20 20 20 20 2a 70 69 49  vel);.      *piI
9ee0: 64 78 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  dx = 0;.    }els
9ef0: 65 7b 0a 20 20 20 20 20 20 2a 70 69 49 64 78 20  e{.      *piIdx 
9f00: 3d 20 69 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  = iNext;.    }. 
9f10: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
9f20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 25 5f  .}../*.** The %_
9f30: 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20 69  segments table i
9f40: 73 20 64 65 63 6c 61 72 65 64 20 61 73 20 66 6f  s declared as fo
9f50: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  llows:.**.**   C
9f60: 52 45 41 54 45 20 54 41 42 4c 45 20 25 5f 73 65  REATE TABLE %_se
9f70: 67 6d 65 6e 74 73 28 62 6c 6f 63 6b 69 64 20 49  gments(blockid I
9f80: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
9f90: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 0a  EY, block BLOB).
9fa0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
9fb0: 69 6f 6e 20 72 65 61 64 73 20 64 61 74 61 20 66  ion reads data f
9fc0: 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  rom a single row
9fd0: 20 6f 66 20 74 68 65 20 25 5f 73 65 67 6d 65 6e   of the %_segmen
9fe0: 74 73 20 74 61 62 6c 65 2e 20 54 68 65 0a 2a 2a  ts table. The.**
9ff0: 20 73 70 65 63 69 66 69 63 20 72 6f 77 20 69 73   specific row is
a000: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
a010: 68 65 20 69 42 6c 6f 63 6b 69 64 20 70 61 72 61  he iBlockid para
a020: 6d 65 74 65 72 2e 20 49 66 20 70 61 42 6c 6f 62  meter. If paBlob
a030: 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c   is not.** NULL,
a040: 20 74 68 65 6e 20 61 20 62 75 66 66 65 72 20 69   then a buffer i
a050: 73 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  s allocated usin
a060: 67 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  g sqlite3_malloc
a070: 28 29 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64  () and populated
a080: 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 63 6f 6e  .** with the con
a090: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 6c 6f  tents of the blo
a0a0: 62 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  b stored in the 
a0b0: 22 62 6c 6f 63 6b 22 20 63 6f 6c 75 6d 6e 20 6f  "block" column o
a0c0: 66 20 74 68 65 20 0a 2a 2a 20 69 64 65 6e 74 69  f the .** identi
a0d0: 66 69 65 64 20 74 61 62 6c 65 20 72 6f 77 20 69  fied table row i
a0e0: 73 2e 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  s. Whether or no
a0f0: 74 20 70 61 42 6c 6f 62 20 69 73 20 4e 55 4c 4c  t paBlob is NULL
a100: 2c 20 2a 70 6e 42 6c 6f 62 20 69 73 20 73 65 74  , *pnBlob is set
a110: 0a 2a 2a 20 74 6f 20 74 68 65 20 73 69 7a 65 20  .** to the size 
a120: 6f 66 20 74 68 65 20 62 6c 6f 62 20 69 6e 20 62  of the blob in b
a130: 79 74 65 73 20 62 65 66 6f 72 65 20 72 65 74 75  ytes before retu
a140: 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
a150: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
a160: 20 6f 72 20 74 68 65 20 74 61 62 6c 65 20 64 6f   or the table do
a170: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 74  es not contain t
a180: 68 65 20 73 70 65 63 69 66 69 65 64 20 72 6f 77  he specified row
a190: 2c 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65  ,.** an SQLite e
a1a0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
a1b0: 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
a1c0: 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
a1d0: 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 70  eturned. If.** p
a1e0: 61 42 6c 6f 62 20 69 73 20 6e 6f 6e 2d 4e 55 4c  aBlob is non-NUL
a1f0: 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  L, then it is th
a200: 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
a210: 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
a220: 6f 0a 2a 2a 20 65 76 65 6e 74 75 61 6c 6c 79 20  o.** eventually 
a230: 66 72 65 65 20 74 68 65 20 72 65 74 75 72 6e 65  free the returne
a240: 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  d buffer..**.** 
a250: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
a260: 79 20 6c 65 61 76 65 20 61 6e 20 6f 70 65 6e 20  y leave an open 
a270: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 2a 20 68 61  sqlite3_blob* ha
a280: 6e 64 6c 65 20 69 6e 20 74 68 65 0a 2a 2a 20 46  ndle in the.** F
a290: 74 73 33 54 61 62 6c 65 2e 70 53 65 67 6d 65 6e  ts3Table.pSegmen
a2a0: 74 73 20 76 61 72 69 61 62 6c 65 2e 20 54 68 69  ts variable. Thi
a2b0: 73 20 68 61 6e 64 6c 65 20 69 73 20 72 65 75 73  s handle is reus
a2c0: 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ed by subsequent
a2d0: 20 63 61 6c 6c 73 0a 2a 2a 20 74 6f 20 74 68 69   calls.** to thi
a2e0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20  s function. The 
a2f0: 68 61 6e 64 6c 65 20 6d 61 79 20 62 65 20 63 6c  handle may be cl
a300: 6f 73 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20  osed by calling 
a310: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 74  the.** sqlite3Ft
a320: 73 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28  s3SegmentsClose(
a330: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 52 65 75 73  ) function. Reus
a340: 69 6e 67 20 61 20 62 6c 6f 62 20 68 61 6e 64 6c  ing a blob handl
a350: 65 20 69 73 20 61 20 68 61 6e 64 79 0a 2a 2a 20  e is a handy.** 
a360: 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72  performance impr
a370: 6f 76 65 6d 65 6e 74 2c 20 62 75 74 20 74 68 65  ovement, but the
a380: 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 73 68 6f   blob handle sho
a390: 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 63 6c  uld always be cl
a3a0: 6f 73 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 63  osed.** before c
a3b0: 6f 6e 74 72 6f 6c 20 69 73 20 72 65 74 75 72 6e  ontrol is return
a3c0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20 28  ed to the user (
a3d0: 74 6f 20 70 72 65 76 65 6e 74 20 61 20 6c 6f 63  to prevent a loc
a3e0: 6b 20 62 65 69 6e 67 20 68 65 6c 64 0a 2a 2a 20  k being held.** 
a3f0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
a400: 66 69 6c 65 20 66 6f 72 20 6c 6f 6e 67 65 72 20  file for longer 
a410: 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 29 2e  than necessary).
a420: 20 54 68 75 73 2c 20 61 6e 79 20 76 69 72 74 75   Thus, any virtu
a430: 61 6c 20 74 61 62 6c 65 0a 2a 2a 20 6d 65 74 68  al table.** meth
a440: 6f 64 20 28 78 46 69 6c 74 65 72 20 65 74 63 2e  od (xFilter etc.
a450: 29 20 74 68 61 74 20 6d 61 79 20 64 69 72 65 63  ) that may direc
a460: 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c  tly or indirectl
a470: 79 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  y call this func
a480: 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 61 6c  tion.** must cal
a490: 6c 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  l sqlite3Fts3Seg
a4a0: 6d 65 6e 74 73 43 6c 6f 73 65 28 29 20 62 65 66  mentsClose() bef
a4b0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
a4c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
a4d0: 33 52 65 61 64 42 6c 6f 63 6b 28 0a 20 20 46 74  3ReadBlock(.  Ft
a4e0: 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a500: 20 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64   FTS3 table hand
a510: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
a520: 69 6e 74 36 34 20 69 42 6c 6f 63 6b 69 64 2c 20  int64 iBlockid, 
a530: 20 20 20 20 20 20 20 20 2f 2a 20 41 63 63 65 73          /* Acces
a540: 73 20 74 68 65 20 72 6f 77 20 77 69 74 68 20 62  s the row with b
a550: 6c 6f 63 6b 69 64 3d 24 69 42 6c 6f 63 6b 69 64  lockid=$iBlockid
a560: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 61 42   */.  char **paB
a570: 6c 6f 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  lob,            
a580: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42 6c        /* OUT: Bl
a590: 6f 62 20 64 61 74 61 20 69 6e 20 6d 61 6c 6c 6f  ob data in mallo
a5a0: 63 27 64 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  c'd buffer */.  
a5b0: 69 6e 74 20 2a 70 6e 42 6c 6f 62 2c 20 20 20 20  int *pnBlob,    
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5d0: 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20  /* OUT: Size of 
a5e0: 62 6c 6f 62 20 64 61 74 61 20 2a 2f 0a 20 20 69  blob data */.  i
a5f0: 6e 74 20 2a 70 6e 4c 6f 61 64 20 20 20 20 20 20  nt *pnLoad      
a600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a610: 2a 20 4f 55 54 3a 20 42 79 74 65 73 20 61 63 74  * OUT: Bytes act
a620: 75 61 6c 6c 79 20 6c 6f 61 64 65 64 20 2a 2f 0a  ually loaded */.
a630: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
a640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a650: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
a660: 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 70 6e 42  ode */..  /* pnB
a670: 6c 6f 62 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d  lob must be non-
a680: 4e 55 4c 4c 2e 20 70 61 42 6c 6f 62 20 6d 61 79  NULL. paBlob may
a690: 20 62 65 20 4e 55 4c 4c 20 6f 72 20 6e 6f 6e 2d   be NULL or non-
a6a0: 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 61 73 73 65 72  NULL. */.  asser
a6b0: 74 28 20 70 6e 42 6c 6f 62 20 29 3b 0a 0a 20 20  t( pnBlob );..  
a6c0: 69 66 28 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73  if( p->pSegments
a6d0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
a6e0: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e  ite3_blob_reopen
a6f0: 28 70 2d 3e 70 53 65 67 6d 65 6e 74 73 2c 20 69  (p->pSegments, i
a700: 42 6c 6f 63 6b 69 64 29 3b 0a 20 20 7d 65 6c 73  Blockid);.  }els
a710: 65 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 2d  e{.    if( 0==p-
a720: 3e 7a 53 65 67 6d 65 6e 74 73 54 62 6c 20 29 7b  >zSegmentsTbl ){
a730: 0a 20 20 20 20 20 20 70 2d 3e 7a 53 65 67 6d 65  .      p->zSegme
a740: 6e 74 73 54 62 6c 20 3d 20 73 71 6c 69 74 65 33  ntsTbl = sqlite3
a750: 5f 6d 70 72 69 6e 74 66 28 22 25 73 5f 73 65 67  _mprintf("%s_seg
a760: 6d 65 6e 74 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65  ments", p->zName
a770: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  );.      if( 0==
a780: 70 2d 3e 7a 53 65 67 6d 65 6e 74 73 54 62 6c 20  p->zSegmentsTbl 
a790: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
a7a0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
a7b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
a7c0: 6f 62 5f 6f 70 65 6e 28 0a 20 20 20 20 20 20 20  ob_open(.       
a7d0: 70 2d 3e 64 62 2c 20 70 2d 3e 7a 44 62 2c 20 70  p->db, p->zDb, p
a7e0: 2d 3e 7a 53 65 67 6d 65 6e 74 73 54 62 6c 2c 20  ->zSegmentsTbl, 
a7f0: 22 62 6c 6f 63 6b 22 2c 20 69 42 6c 6f 63 6b 69  "block", iBlocki
a800: 64 2c 20 30 2c 20 26 70 2d 3e 70 53 65 67 6d 65  d, 0, &p->pSegme
a810: 6e 74 73 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  nts.    );.  }..
a820: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
a830: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  _OK ){.    int n
a840: 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 62  Byte = sqlite3_b
a850: 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 53 65  lob_bytes(p->pSe
a860: 67 6d 65 6e 74 73 29 3b 0a 20 20 20 20 2a 70 6e  gments);.    *pn
a870: 42 6c 6f 62 20 3d 20 6e 42 79 74 65 3b 0a 20 20  Blob = nByte;.  
a880: 20 20 69 66 28 20 70 61 42 6c 6f 62 20 29 7b 0a    if( paBlob ){.
a890: 20 20 20 20 20 20 63 68 61 72 20 2a 61 42 79 74        char *aByt
a8a0: 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
a8b0: 6f 63 28 6e 42 79 74 65 20 2b 20 46 54 53 33 5f  oc(nByte + FTS3_
a8c0: 4e 4f 44 45 5f 50 41 44 44 49 4e 47 29 3b 0a 20  NODE_PADDING);. 
a8d0: 20 20 20 20 20 69 66 28 20 21 61 42 79 74 65 20       if( !aByte 
a8e0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
a8f0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
a900: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a910: 20 20 20 69 66 28 20 70 6e 4c 6f 61 64 20 26 26     if( pnLoad &&
a920: 20 6e 42 79 74 65 3e 28 46 54 53 33 5f 4e 4f 44   nByte>(FTS3_NOD
a930: 45 5f 43 48 55 4e 4b 5f 54 48 52 45 53 48 4f 4c  E_CHUNK_THRESHOL
a940: 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  D) ){.          
a950: 6e 42 79 74 65 20 3d 20 46 54 53 33 5f 4e 4f 44  nByte = FTS3_NOD
a960: 45 5f 43 48 55 4e 4b 53 49 5a 45 3b 0a 20 20 20  E_CHUNKSIZE;.   
a970: 20 20 20 20 20 20 20 2a 70 6e 4c 6f 61 64 20 3d         *pnLoad =
a980: 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20   nByte;.        
a990: 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  }.        rc = s
a9a0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64  qlite3_blob_read
a9b0: 28 70 2d 3e 70 53 65 67 6d 65 6e 74 73 2c 20 61  (p->pSegments, a
a9c0: 42 79 74 65 2c 20 6e 42 79 74 65 2c 20 30 29 3b  Byte, nByte, 0);
a9d0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
a9e0: 26 61 42 79 74 65 5b 6e 42 79 74 65 5d 2c 20 30  &aByte[nByte], 0
a9f0: 2c 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44  , FTS3_NODE_PADD
aa00: 49 4e 47 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ING);.        if
aa10: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
aa20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
aa30: 69 74 65 33 5f 66 72 65 65 28 61 42 79 74 65 29  ite3_free(aByte)
aa40: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 42 79 74  ;.          aByt
aa50: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
aa60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
aa70: 70 61 42 6c 6f 62 20 3d 20 61 42 79 74 65 3b 0a  paBlob = aByte;.
aa80: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
aa90: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
aaa0: 20 43 6c 6f 73 65 20 74 68 65 20 62 6c 6f 62 20   Close the blob 
aab0: 68 61 6e 64 6c 65 20 61 74 20 70 2d 3e 70 53 65  handle at p->pSe
aac0: 67 6d 65 6e 74 73 2c 20 69 66 20 69 74 20 69 73  gments, if it is
aad0: 20 6f 70 65 6e 2e 20 53 65 65 20 63 6f 6d 6d 65   open. See comme
aae0: 6e 74 73 20 61 62 6f 76 65 0a 2a 2a 20 74 68 65  nts above.** the
aaf0: 20 73 71 6c 69 74 65 33 46 74 73 33 52 65 61 64   sqlite3Fts3Read
ab00: 42 6c 6f 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e  Block() function
ab10: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
ab20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
ab30: 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28 46  3SegmentsClose(F
ab40: 74 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  ts3Table *p){.  
ab50: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f  sqlite3_blob_clo
ab60: 73 65 28 70 2d 3e 70 53 65 67 6d 65 6e 74 73 29  se(p->pSegments)
ab70: 3b 0a 20 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73  ;.  p->pSegments
ab80: 20 3d 20 30 3b 0a 7d 0a 20 20 20 20 0a 73 74 61   = 0;.}.    .sta
ab90: 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 52  tic int fts3SegR
aba0: 65 61 64 65 72 49 6e 63 72 52 65 61 64 28 46 74  eaderIncrRead(Ft
abb0: 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 65  s3SegReader *pRe
abc0: 61 64 65 72 29 7b 0a 20 20 69 6e 74 20 6e 52 65  ader){.  int nRe
abd0: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ad;             
abe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
abf0: 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72  er of bytes to r
ac00: 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ead */.  int rc;
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac20: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
ac30: 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 52  rn code */..  nR
ac40: 65 61 64 20 3d 20 4d 49 4e 28 70 52 65 61 64 65  ead = MIN(pReade
ac50: 72 2d 3e 6e 4e 6f 64 65 20 2d 20 70 52 65 61 64  r->nNode - pRead
ac60: 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 2c 20 46  er->nPopulate, F
ac70: 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 53 49  TS3_NODE_CHUNKSI
ac80: 5a 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ZE);.  rc = sqli
ac90: 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 0a 20  te3_blob_read(. 
aca0: 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 42       pReader->pB
acb0: 6c 6f 62 2c 20 0a 20 20 20 20 20 20 26 70 52 65  lob, .      &pRe
acc0: 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61  ader->aNode[pRea
acd0: 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 5d 2c  der->nPopulate],
ace0: 0a 20 20 20 20 20 20 6e 52 65 61 64 2c 0a 20 20  .      nRead,.  
acf0: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f      pReader->nPo
ad00: 70 75 6c 61 74 65 0a 20 20 29 3b 0a 0a 20 20 69  pulate.  );..  i
ad10: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
ad20: 20 29 7b 0a 20 20 20 20 70 52 65 61 64 65 72 2d   ){.    pReader-
ad30: 3e 6e 50 6f 70 75 6c 61 74 65 20 2b 3d 20 6e 52  >nPopulate += nR
ad40: 65 61 64 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ead;.    memset(
ad50: 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b  &pReader->aNode[
ad60: 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61  pReader->nPopula
ad70: 74 65 5d 2c 20 30 2c 20 46 54 53 33 5f 4e 4f 44  te], 0, FTS3_NOD
ad80: 45 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 20 20  E_PADDING);.    
ad90: 69 66 28 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f  if( pReader->nPo
ada0: 70 75 6c 61 74 65 3d 3d 70 52 65 61 64 65 72 2d  pulate==pReader-
adb0: 3e 6e 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  >nNode ){.      
adc0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f  sqlite3_blob_clo
add0: 73 65 28 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f  se(pReader->pBlo
ade0: 62 29 3b 0a 20 20 20 20 20 20 70 52 65 61 64 65  b);.      pReade
adf0: 72 2d 3e 70 42 6c 6f 62 20 3d 20 30 3b 0a 20 20  r->pBlob = 0;.  
ae00: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f      pReader->nPo
ae10: 70 75 6c 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  pulate = 0;.    
ae20: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
ae30: 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
ae40: 20 66 74 73 33 53 65 67 52 65 61 64 65 72 52 65   fts3SegReaderRe
ae50: 71 75 69 72 65 28 46 74 73 33 53 65 67 52 65 61  quire(Fts3SegRea
ae60: 64 65 72 20 2a 70 52 65 61 64 65 72 2c 20 63 68  der *pReader, ch
ae70: 61 72 20 2a 70 46 72 6f 6d 2c 20 69 6e 74 20 6e  ar *pFrom, int n
ae80: 42 79 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Byte){.  int rc 
ae90: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
aea0: 73 73 65 72 74 28 20 21 70 52 65 61 64 65 72 2d  ssert( !pReader-
aeb0: 3e 70 42 6c 6f 62 20 0a 20 20 20 20 20 20 20 7c  >pBlob .       |
aec0: 7c 20 28 70 46 72 6f 6d 3e 3d 70 52 65 61 64 65  | (pFrom>=pReade
aed0: 72 2d 3e 61 4e 6f 64 65 20 26 26 20 70 46 72 6f  r->aNode && pFro
aee0: 6d 3c 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64  m<&pReader->aNod
aef0: 65 5b 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65  e[pReader->nNode
af00: 5d 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28  ]).  );.  while(
af10: 20 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 20   pReader->pBlob 
af20: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
af30: 20 0a 20 20 20 20 20 26 26 20 20 28 70 46 72 6f   .     &&  (pFro
af40: 6d 20 2d 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f  m - pReader->aNo
af50: 64 65 20 2b 20 6e 42 79 74 65 29 3e 70 52 65 61  de + nByte)>pRea
af60: 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 0a 20  der->nPopulate. 
af70: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
af80: 33 53 65 67 52 65 61 64 65 72 49 6e 63 72 52 65  3SegReaderIncrRe
af90: 61 64 28 70 52 65 61 64 65 72 29 3b 0a 20 20 7d  ad(pReader);.  }
afa0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
afb0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 6e 20 46 74  ./*.** Set an Ft
afc0: 73 33 53 65 67 52 65 61 64 65 72 20 63 75 72 73  s3SegReader curs
afd0: 6f 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 45  or to point at E
afe0: 4f 46 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  OF..*/.static vo
aff0: 69 64 20 66 74 73 33 53 65 67 52 65 61 64 65 72  id fts3SegReader
b000: 53 65 74 45 6f 66 28 46 74 73 33 53 65 67 52 65  SetEof(Fts3SegRe
b010: 61 64 65 72 20 2a 70 53 65 67 29 7b 0a 20 20 69  ader *pSeg){.  i
b020: 66 28 20 21 66 74 73 33 53 65 67 52 65 61 64 65  f( !fts3SegReade
b030: 72 49 73 52 6f 6f 74 4f 6e 6c 79 28 70 53 65 67  rIsRootOnly(pSeg
b040: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
b050: 5f 66 72 65 65 28 70 53 65 67 2d 3e 61 4e 6f 64  _free(pSeg->aNod
b060: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
b070: 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 53 65 67 2d  blob_close(pSeg-
b080: 3e 70 42 6c 6f 62 29 3b 0a 20 20 20 20 70 53 65  >pBlob);.    pSe
b090: 67 2d 3e 70 42 6c 6f 62 20 3d 20 30 3b 0a 20 20  g->pBlob = 0;.  
b0a0: 7d 0a 20 20 70 53 65 67 2d 3e 61 4e 6f 64 65 20  }.  pSeg->aNode 
b0b0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  = 0;.}../*.** Mo
b0c0: 76 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ve the iterator 
b0d0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
b0e0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
b0f0: 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20 69 6e  the next term in
b100: 20 74 68 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 2e   the.** segment.
b110: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
b120: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
b130: 75 72 6e 65 64 2e 20 49 66 20 74 68 65 72 65 20  urned. If there 
b140: 69 73 20 6e 6f 20 6e 65 78 74 20 74 65 72 6d 2c  is no next term,
b150: 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  .** SQLITE_DONE.
b160: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53   Otherwise, an S
b170: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
b180: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b190: 66 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 78  fts3SegReaderNex
b1a0: 74 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  t(.  Fts3Table *
b1b0: 70 2c 20 0a 20 20 46 74 73 33 53 65 67 52 65 61  p, .  Fts3SegRea
b1c0: 64 65 72 20 2a 70 52 65 61 64 65 72 2c 0a 20 20  der *pReader,.  
b1d0: 69 6e 74 20 62 49 6e 63 72 0a 29 7b 0a 20 20 69  int bIncr.){.  i
b1e0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
b1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b200: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 6f 66  * Return code of
b210: 20 76 61 72 69 6f 75 73 20 73 75 62 2d 72 6f 75   various sub-rou
b220: 74 69 6e 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  tines */.  char 
b230: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
b240: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
b250: 72 73 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  rsor variable */
b260: 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20  .  int nPrefix; 
b270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b280: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b290: 62 79 74 65 73 20 69 6e 20 74 65 72 6d 20 70 72  bytes in term pr
b2a0: 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  efix */.  int nS
b2b0: 75 66 66 69 78 3b 20 20 20 20 20 20 20 20 20 20  uffix;          
b2c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b2d0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
b2e0: 74 65 72 6d 20 73 75 66 66 69 78 20 2a 2f 0a 0a  term suffix */..
b2f0: 20 20 69 66 28 20 21 70 52 65 61 64 65 72 2d 3e    if( !pReader->
b300: 61 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20  aDoclist ){.    
b310: 70 4e 65 78 74 20 3d 20 70 52 65 61 64 65 72 2d  pNext = pReader-
b320: 3e 61 4e 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b  >aNode;.  }else{
b330: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 26 70 52  .    pNext = &pR
b340: 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b  eader->aDoclist[
b350: 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73  pReader->nDoclis
b360: 74 5d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  t];.  }..  if( !
b370: 70 4e 65 78 74 20 7c 7c 20 70 4e 65 78 74 3e 3d  pNext || pNext>=
b380: 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b  &pReader->aNode[
b390: 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 5d 20  pReader->nNode] 
b3a0: 29 7b 0a 0a 20 20 20 20 69 66 28 20 66 74 73 33  ){..    if( fts3
b3b0: 53 65 67 52 65 61 64 65 72 49 73 50 65 6e 64 69  SegReaderIsPendi
b3c0: 6e 67 28 70 52 65 61 64 65 72 29 20 29 7b 0a 20  ng(pReader) ){. 
b3d0: 20 20 20 20 20 46 74 73 33 48 61 73 68 45 6c 65       Fts3HashEle
b3e0: 6d 20 2a 70 45 6c 65 6d 20 3d 20 2a 28 70 52 65  m *pElem = *(pRe
b3f0: 61 64 65 72 2d 3e 70 70 4e 65 78 74 45 6c 65 6d  ader->ppNextElem
b400: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b410: 5f 66 72 65 65 28 70 52 65 61 64 65 72 2d 3e 61  _free(pReader->a
b420: 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20 70 52 65  Node);.      pRe
b430: 61 64 65 72 2d 3e 61 4e 6f 64 65 20 3d 20 30 3b  ader->aNode = 0;
b440: 0a 20 20 20 20 20 20 69 66 28 20 70 45 6c 65 6d  .      if( pElem
b450: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
b460: 20 2a 61 43 6f 70 79 3b 0a 20 20 20 20 20 20 20   *aCopy;.       
b470: 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70 4c   PendingList *pL
b480: 69 73 74 20 3d 20 28 50 65 6e 64 69 6e 67 4c 69  ist = (PendingLi
b490: 73 74 20 2a 29 66 74 73 33 48 61 73 68 44 61 74  st *)fts3HashDat
b4a0: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20  a(pElem);.      
b4b0: 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 4c    int nCopy = pL
b4c0: 69 73 74 2d 3e 6e 44 61 74 61 2b 31 3b 0a 20 20  ist->nData+1;.  
b4d0: 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 7a        pReader->z
b4e0: 54 65 72 6d 20 3d 20 28 63 68 61 72 20 2a 29 66  Term = (char *)f
b4f0: 74 73 33 48 61 73 68 4b 65 79 28 70 45 6c 65 6d  ts3HashKey(pElem
b500: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64  );.        pRead
b510: 65 72 2d 3e 6e 54 65 72 6d 20 3d 20 66 74 73 33  er->nTerm = fts3
b520: 48 61 73 68 4b 65 79 73 69 7a 65 28 70 45 6c 65  HashKeysize(pEle
b530: 6d 29 3b 0a 20 20 20 20 20 20 20 20 61 43 6f 70  m);.        aCop
b540: 79 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  y = (char*)sqlit
b550: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 43 6f 70 79 29  e3_malloc(nCopy)
b560: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61  ;.        if( !a
b570: 43 6f 70 79 20 29 20 72 65 74 75 72 6e 20 53 51  Copy ) return SQ
b580: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
b590: 20 20 20 20 6d 65 6d 63 70 79 28 61 43 6f 70 79      memcpy(aCopy
b5a0: 2c 20 70 4c 69 73 74 2d 3e 61 44 61 74 61 2c 20  , pList->aData, 
b5b0: 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20  nCopy);.        
b5c0: 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 20 3d  pReader->nNode =
b5d0: 20 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69   pReader->nDocli
b5e0: 73 74 20 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  st = nCopy;.    
b5f0: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f      pReader->aNo
b600: 64 65 20 3d 20 70 52 65 61 64 65 72 2d 3e 61 44  de = pReader->aD
b610: 6f 63 6c 69 73 74 20 3d 20 61 43 6f 70 79 3b 0a  oclist = aCopy;.
b620: 20 20 20 20 20 20 20 20 70 52 65 61 64 65 72 2d          pReader-
b630: 3e 70 70 4e 65 78 74 45 6c 65 6d 2b 2b 3b 0a 20  >ppNextElem++;. 
b640: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b650: 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20 29 3b  Reader->aNode );
b660: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
b670: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b680: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 33  .    }..    fts3
b690: 53 65 67 52 65 61 64 65 72 53 65 74 45 6f 66 28  SegReaderSetEof(
b6a0: 70 52 65 61 64 65 72 29 3b 0a 0a 20 20 20 20 2f  pReader);..    /
b6b0: 2a 20 49 66 20 69 43 75 72 72 65 6e 74 42 6c 6f  * If iCurrentBlo
b6c0: 63 6b 3e 3d 69 4c 65 61 66 45 6e 64 42 6c 6f 63  ck>=iLeafEndBloc
b6d0: 6b 2c 20 74 68 69 73 20 69 73 20 61 6e 20 45 4f  k, this is an EO
b6e0: 46 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 41 6c 6c  F condition. All
b6f0: 20 6c 65 61 66 20 0a 20 20 20 20 2a 2a 20 62 6c   leaf .    ** bl
b700: 6f 63 6b 73 20 68 61 76 65 20 61 6c 72 65 61 64  ocks have alread
b710: 79 20 62 65 65 6e 20 74 72 61 76 65 72 73 65 64  y been traversed
b720: 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
b730: 28 20 70 52 65 61 64 65 72 2d 3e 69 43 75 72 72  ( pReader->iCurr
b740: 65 6e 74 42 6c 6f 63 6b 3c 3d 70 52 65 61 64 65  entBlock<=pReade
b750: 72 2d 3e 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b  r->iLeafEndBlock
b760: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 61   );.    if( pRea
b770: 64 65 72 2d 3e 69 43 75 72 72 65 6e 74 42 6c 6f  der->iCurrentBlo
b780: 63 6b 3e 3d 70 52 65 61 64 65 72 2d 3e 69 4c 65  ck>=pReader->iLe
b790: 61 66 45 6e 64 42 6c 6f 63 6b 20 29 7b 0a 20 20  afEndBlock ){.  
b7a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b7b0: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
b7c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
b7d0: 33 52 65 61 64 42 6c 6f 63 6b 28 0a 20 20 20 20  3ReadBlock(.    
b7e0: 20 20 20 20 70 2c 20 2b 2b 70 52 65 61 64 65 72      p, ++pReader
b7f0: 2d 3e 69 43 75 72 72 65 6e 74 42 6c 6f 63 6b 2c  ->iCurrentBlock,
b800: 20 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65   &pReader->aNode
b810: 2c 20 26 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64  , &pReader->nNod
b820: 65 2c 20 0a 20 20 20 20 20 20 20 20 28 62 49 6e  e, .        (bIn
b830: 63 72 20 3f 20 26 70 52 65 61 64 65 72 2d 3e 6e  cr ? &pReader->n
b840: 50 6f 70 75 6c 61 74 65 20 3a 20 30 29 0a 20 20  Populate : 0).  
b850: 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21    );.    if( rc!
b860: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
b870: 75 72 6e 20 72 63 3b 0a 20 20 20 20 61 73 73 65  urn rc;.    asse
b880: 72 74 28 20 70 52 65 61 64 65 72 2d 3e 70 42 6c  rt( pReader->pBl
b890: 6f 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ob==0 );.    if(
b8a0: 20 62 49 6e 63 72 20 26 26 20 70 52 65 61 64 65   bIncr && pReade
b8b0: 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 3c 70 52 65  r->nPopulate<pRe
b8c0: 61 64 65 72 2d 3e 6e 4e 6f 64 65 20 29 7b 0a 20  ader->nNode ){. 
b8d0: 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 42       pReader->pB
b8e0: 6c 6f 62 20 3d 20 70 2d 3e 70 53 65 67 6d 65 6e  lob = p->pSegmen
b8f0: 74 73 3b 0a 20 20 20 20 20 20 70 2d 3e 70 53 65  ts;.      p->pSe
b900: 67 6d 65 6e 74 73 20 3d 20 30 3b 0a 20 20 20 20  gments = 0;.    
b910: 7d 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 52  }.    pNext = pR
b920: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 3b 0a 20 20  eader->aNode;.  
b930: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21 66 74  }..  assert( !ft
b940: 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65 6e  s3SegReaderIsPen
b950: 64 69 6e 67 28 70 52 65 61 64 65 72 29 20 29 3b  ding(pReader) );
b960: 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53 65 67  ..  rc = fts3Seg
b970: 52 65 61 64 65 72 52 65 71 75 69 72 65 28 70 52  ReaderRequire(pR
b980: 65 61 64 65 72 2c 20 70 4e 65 78 74 2c 20 46 54  eader, pNext, FT
b990: 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 2a 32 29  S3_VARINT_MAX*2)
b9a0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
b9b0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
b9c0: 63 3b 0a 20 20 0a 20 20 2f 2a 20 42 65 63 61 75  c;.  .  /* Becau
b9d0: 73 65 20 6f 66 20 74 68 65 20 46 54 53 33 5f 4e  se of the FTS3_N
b9e0: 4f 44 45 5f 50 41 44 44 49 4e 47 20 62 79 74 65  ODE_PADDING byte
b9f0: 73 20 6f 66 20 70 61 64 64 69 6e 67 2c 20 74 68  s of padding, th
ba00: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 0a  e following is .
ba10: 20 20 2a 2a 20 73 61 66 65 20 28 6e 6f 20 72 69    ** safe (no ri
ba20: 73 6b 20 6f 66 20 6f 76 65 72 72 65 61 64 29 20  sk of overread) 
ba30: 65 76 65 6e 20 69 66 20 74 68 65 20 6e 6f 64 65  even if the node
ba40: 20 64 61 74 61 20 69 73 20 63 6f 72 72 75 70 74   data is corrupt
ba50: 65 64 2e 20 2a 2f 0a 20 20 70 4e 65 78 74 20 2b  ed. */.  pNext +
ba60: 3d 20 66 74 73 33 47 65 74 56 61 72 69 6e 74 33  = fts3GetVarint3
ba70: 32 28 70 4e 65 78 74 2c 20 26 6e 50 72 65 66 69  2(pNext, &nPrefi
ba80: 78 29 3b 0a 20 20 70 4e 65 78 74 20 2b 3d 20 66  x);.  pNext += f
ba90: 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 70  ts3GetVarint32(p
baa0: 4e 65 78 74 2c 20 26 6e 53 75 66 66 69 78 29 3b  Next, &nSuffix);
bab0: 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78 3c 30  .  if( nPrefix<0
bac0: 20 7c 7c 20 6e 53 75 66 66 69 78 3c 3d 30 20 0a   || nSuffix<=0 .
bad0: 20 20 20 7c 7c 20 26 70 4e 65 78 74 5b 6e 53 75     || &pNext[nSu
bae0: 66 66 69 78 5d 3e 26 70 52 65 61 64 65 72 2d 3e  ffix]>&pReader->
baf0: 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e  aNode[pReader->n
bb00: 4e 6f 64 65 5d 20 0a 20 20 29 7b 0a 20 20 20 20  Node] .  ){.    
bb10: 72 65 74 75 72 6e 20 46 54 53 5f 43 4f 52 52 55  return FTS_CORRU
bb20: 50 54 5f 56 54 41 42 3b 0a 20 20 7d 0a 0a 20 20  PT_VTAB;.  }..  
bb30: 69 66 28 20 6e 50 72 65 66 69 78 2b 6e 53 75 66  if( nPrefix+nSuf
bb40: 66 69 78 3e 70 52 65 61 64 65 72 2d 3e 6e 54 65  fix>pReader->nTe
bb50: 72 6d 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69  rmAlloc ){.    i
bb60: 6e 74 20 6e 4e 65 77 20 3d 20 28 6e 50 72 65 66  nt nNew = (nPref
bb70: 69 78 2b 6e 53 75 66 66 69 78 29 2a 32 3b 0a 20  ix+nSuffix)*2;. 
bb80: 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20     char *zNew = 
bb90: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
bba0: 70 52 65 61 64 65 72 2d 3e 7a 54 65 72 6d 2c 20  pReader->zTerm, 
bbb0: 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 21  nNew);.    if( !
bbc0: 7a 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 65  zNew ){.      re
bbd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
bbe0: 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65  M;.    }.    pRe
bbf0: 61 64 65 72 2d 3e 7a 54 65 72 6d 20 3d 20 7a 4e  ader->zTerm = zN
bc00: 65 77 3b 0a 20 20 20 20 70 52 65 61 64 65 72 2d  ew;.    pReader-
bc10: 3e 6e 54 65 72 6d 41 6c 6c 6f 63 20 3d 20 6e 4e  >nTermAlloc = nN
bc20: 65 77 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  ew;.  }..  rc = 
bc30: 66 74 73 33 53 65 67 52 65 61 64 65 72 52 65 71  fts3SegReaderReq
bc40: 75 69 72 65 28 70 52 65 61 64 65 72 2c 20 70 4e  uire(pReader, pN
bc50: 65 78 74 2c 20 6e 53 75 66 66 69 78 2b 46 54 53  ext, nSuffix+FTS
bc60: 33 5f 56 41 52 49 4e 54 5f 4d 41 58 29 3b 0a 20  3_VARINT_MAX);. 
bc70: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
bc80: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
bc90: 0a 20 20 6d 65 6d 63 70 79 28 26 70 52 65 61 64  .  memcpy(&pRead
bca0: 65 72 2d 3e 7a 54 65 72 6d 5b 6e 50 72 65 66 69  er->zTerm[nPrefi
bcb0: 78 5d 2c 20 70 4e 65 78 74 2c 20 6e 53 75 66 66  x], pNext, nSuff
bcc0: 69 78 29 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e  ix);.  pReader->
bcd0: 6e 54 65 72 6d 20 3d 20 6e 50 72 65 66 69 78 2b  nTerm = nPrefix+
bce0: 6e 53 75 66 66 69 78 3b 0a 20 20 70 4e 65 78 74  nSuffix;.  pNext
bcf0: 20 2b 3d 20 6e 53 75 66 66 69 78 3b 0a 20 20 70   += nSuffix;.  p
bd00: 4e 65 78 74 20 2b 3d 20 66 74 73 33 47 65 74 56  Next += fts3GetV
bd10: 61 72 69 6e 74 33 32 28 70 4e 65 78 74 2c 20 26  arint32(pNext, &
bd20: 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73  pReader->nDoclis
bd30: 74 29 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 61  t);.  pReader->a
bd40: 44 6f 63 6c 69 73 74 20 3d 20 70 4e 65 78 74 3b  Doclist = pNext;
bd50: 0a 20 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66  .  pReader->pOff
bd60: 73 65 74 4c 69 73 74 20 3d 20 30 3b 0a 0a 20 20  setList = 0;..  
bd70: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
bd80: 65 20 64 6f 63 6c 69 73 74 20 64 6f 65 73 20 6e  e doclist does n
bd90: 6f 74 20 61 70 70 65 61 72 20 74 6f 20 65 78 74  ot appear to ext
bda0: 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64  end past the end
bdb0: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 62 2d 74   of the.  ** b-t
bdc0: 72 65 65 20 6e 6f 64 65 2e 20 41 6e 64 20 74 68  ree node. And th
bdd0: 61 74 20 74 68 65 20 66 69 6e 61 6c 20 62 79 74  at the final byt
bde0: 65 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74  e of the doclist
bdf0: 20 69 73 20 30 78 30 30 2e 20 49 66 20 65 69 74   is 0x00. If eit
be00: 68 65 72 20 0a 20 20 2a 2a 20 6f 66 20 74 68 65  her .  ** of the
be10: 73 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73  se statements is
be20: 20 75 6e 74 72 75 65 2c 20 74 68 65 6e 20 74 68   untrue, then th
be30: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
be40: 20 69 73 20 63 6f 72 72 75 70 74 2e 0a 20 20 2a   is corrupt..  *
be50: 2f 0a 20 20 69 66 28 20 26 70 52 65 61 64 65 72  /.  if( &pReader
be60: 2d 3e 61 44 6f 63 6c 69 73 74 5b 70 52 65 61 64  ->aDoclist[pRead
be70: 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 5d 3e 26 70  er->nDoclist]>&p
be80: 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52  Reader->aNode[pR
be90: 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 5d 20 0a 20  eader->nNode] . 
bea0: 20 20 7c 7c 20 28 70 52 65 61 64 65 72 2d 3e 6e    || (pReader->n
beb0: 50 6f 70 75 6c 61 74 65 3d 3d 30 20 26 26 20 70  Populate==0 && p
bec0: 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74  Reader->aDoclist
bed0: 5b 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69  [pReader->nDocli
bee0: 73 74 2d 31 5d 29 0a 20 20 29 7b 0a 20 20 20 20  st-1]).  ){.    
bef0: 72 65 74 75 72 6e 20 46 54 53 5f 43 4f 52 52 55  return FTS_CORRU
bf00: 50 54 5f 56 54 41 42 3b 0a 20 20 7d 0a 20 20 72  PT_VTAB;.  }.  r
bf10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
bf20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
bf30: 65 20 53 65 67 52 65 61 64 65 72 20 74 6f 20 70  e SegReader to p
bf40: 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73  oint to the firs
bf50: 74 20 64 6f 63 69 64 20 69 6e 20 74 68 65 20 64  t docid in the d
bf60: 6f 63 6c 69 73 74 20 61 73 73 6f 63 69 61 74 65  oclist associate
bf70: 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 63 75  d.** with the cu
bf80: 72 72 65 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a 73  rrent term..*/.s
bf90: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65  tatic int fts3Se
bfa0: 67 52 65 61 64 65 72 46 69 72 73 74 44 6f 63 69  gReaderFirstDoci
bfb0: 64 28 46 74 73 33 54 61 62 6c 65 20 2a 70 54 61  d(Fts3Table *pTa
bfc0: 62 2c 20 46 74 73 33 53 65 67 52 65 61 64 65 72  b, Fts3SegReader
bfd0: 20 2a 70 52 65 61 64 65 72 29 7b 0a 20 20 69 6e   *pReader){.  in
bfe0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
bff0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 61  ;.  assert( pRea
c000: 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20 29 3b  der->aDoclist );
c010: 0a 20 20 61 73 73 65 72 74 28 20 21 70 52 65 61  .  assert( !pRea
c020: 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74  der->pOffsetList
c030: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e   );.  if( pTab->
c040: 62 44 65 73 63 49 64 78 20 26 26 20 66 74 73 33  bDescIdx && fts3
c050: 53 65 67 52 65 61 64 65 72 49 73 50 65 6e 64 69  SegReaderIsPendi
c060: 6e 67 28 70 52 65 61 64 65 72 29 20 29 7b 0a 20  ng(pReader) ){. 
c070: 20 20 20 75 38 20 62 45 6f 66 20 3d 20 30 3b 0a     u8 bEof = 0;.
c080: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 69 44 6f      pReader->iDo
c090: 63 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 52 65  cid = 0;.    pRe
c0a0: 61 64 65 72 2d 3e 6e 4f 66 66 73 65 74 4c 69 73  ader->nOffsetLis
c0b0: 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  t = 0;.    sqlit
c0c0: 65 33 46 74 73 33 44 6f 63 6c 69 73 74 50 72 65  e3Fts3DoclistPre
c0d0: 76 28 30 2c 0a 20 20 20 20 20 20 20 20 70 52 65  v(0,.        pRe
c0e0: 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 2c 20  ader->aDoclist, 
c0f0: 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73  pReader->nDoclis
c100: 74 2c 20 26 70 52 65 61 64 65 72 2d 3e 70 4f 66  t, &pReader->pOf
c110: 66 73 65 74 4c 69 73 74 2c 20 0a 20 20 20 20 20  fsetList, .     
c120: 20 20 20 26 70 52 65 61 64 65 72 2d 3e 69 44 6f     &pReader->iDo
c130: 63 69 64 2c 20 26 70 52 65 61 64 65 72 2d 3e 6e  cid, &pReader->n
c140: 4f 66 66 73 65 74 4c 69 73 74 2c 20 26 62 45 6f  OffsetList, &bEo
c150: 66 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65  f.    );.  }else
c160: 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53  {.    rc = fts3S
c170: 65 67 52 65 61 64 65 72 52 65 71 75 69 72 65 28  egReaderRequire(
c180: 70 52 65 61 64 65 72 2c 20 70 52 65 61 64 65 72  pReader, pReader
c190: 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 46 54 53 33  ->aDoclist, FTS3
c1a0: 5f 56 41 52 49 4e 54 5f 4d 41 58 29 3b 0a 20 20  _VARINT_MAX);.  
c1b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c1c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
c1d0: 20 6e 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33   n = sqlite3Fts3
c1e0: 47 65 74 56 61 72 69 6e 74 28 70 52 65 61 64 65  GetVarint(pReade
c1f0: 72 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 26 70 52  r->aDoclist, &pR
c200: 65 61 64 65 72 2d 3e 69 44 6f 63 69 64 29 3b 0a  eader->iDocid);.
c210: 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70        pReader->p
c220: 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 26 70 52  OffsetList = &pR
c230: 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b  eader->aDoclist[
c240: 6e 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  n];.    }.  }.  
c250: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
c260: 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
c270: 53 65 67 52 65 61 64 65 72 20 74 6f 20 70 6f 69  SegReader to poi
c280: 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64  nt to the next d
c290: 6f 63 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c  ocid in the docl
c2a0: 69 73 74 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  ist.** associate
c2b0: 64 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65  d with the curre
c2c0: 6e 74 20 74 65 72 6d 2e 0a 2a 2a 20 0a 2a 2a 20  nt term..** .** 
c2d0: 49 66 20 61 72 67 75 6d 65 6e 74 73 20 70 70 4f  If arguments ppO
c2e0: 66 66 73 65 74 4c 69 73 74 20 61 6e 64 20 70 6e  ffsetList and pn
c2f0: 4f 66 66 73 65 74 4c 69 73 74 20 61 72 65 20 6e  OffsetList are n
c300: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 0a 2a  ot NULL, then .*
c310: 2a 20 2a 70 70 4f 66 66 73 65 74 4c 69 73 74 20  * *ppOffsetList 
c320: 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
c330: 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c  to the first col
c340: 75 6d 6e 2d 6f 66 66 73 65 74 20 6c 69 73 74 0a  umn-offset list.
c350: 2a 2a 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73  ** in the doclis
c360: 74 20 65 6e 74 72 79 20 28 69 2e 65 2e 20 69 6d  t entry (i.e. im
c370: 6d 65 64 69 61 74 65 6c 79 20 70 61 73 74 20 74  mediately past t
c380: 68 65 20 64 6f 63 69 64 20 76 61 72 69 6e 74 29  he docid varint)
c390: 2e 0a 2a 2a 20 2a 70 6e 4f 66 66 73 65 74 4c 69  ..** *pnOffsetLi
c3a0: 73 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  st is set to the
c3b0: 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73   length of the s
c3c0: 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 2d 6f 66 66  et of column-off
c3d0: 73 65 74 0a 2a 2a 20 6c 69 73 74 73 2c 20 6e 6f  set.** lists, no
c3e0: 74 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  t including the 
c3f0: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62  nul-terminator b
c400: 79 74 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  yte. For example
c410: 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  :.*/.static int 
c420: 66 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 78  fts3SegReaderNex
c430: 74 44 6f 63 69 64 28 0a 20 20 46 74 73 33 54 61  tDocid(.  Fts3Ta
c440: 62 6c 65 20 2a 70 54 61 62 2c 0a 20 20 46 74 73  ble *pTab,.  Fts
c450: 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 65 61  3SegReader *pRea
c460: 64 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  der,         /* 
c470: 52 65 61 64 65 72 20 74 6f 20 61 64 76 61 6e 63  Reader to advanc
c480: 65 20 74 6f 20 6e 65 78 74 20 64 6f 63 69 64 20  e to next docid 
c490: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 4f 66  */.  char **ppOf
c4a0: 66 73 65 74 4c 69 73 74 2c 20 20 20 20 20 20 20  fsetList,       
c4b0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69       /* OUT: Poi
c4c0: 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20  nter to current 
c4d0: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 2a 2f  position-list */
c4e0: 0a 20 20 69 6e 74 20 2a 70 6e 4f 66 66 73 65 74  .  int *pnOffset
c4f0: 4c 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20  List            
c500: 20 20 20 2f 2a 20 4f 55 54 3a 20 4c 65 6e 67 74     /* OUT: Lengt
c510: 68 20 6f 66 20 2a 70 70 4f 66 66 73 65 74 4c 69  h of *ppOffsetLi
c520: 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29  st in bytes */.)
c530: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
c540: 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a  ITE_OK;.  char *
c550: 70 20 3d 20 70 52 65 61 64 65 72 2d 3e 70 4f 66  p = pReader->pOf
c560: 66 73 65 74 4c 69 73 74 3b 0a 20 20 63 68 61 72  fsetList;.  char
c570: 20 63 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72   c = 0;..  asser
c580: 74 28 20 70 20 29 3b 0a 0a 20 20 69 66 28 20 70  t( p );..  if( p
c590: 54 61 62 2d 3e 62 44 65 73 63 49 64 78 20 26 26  Tab->bDescIdx &&
c5a0: 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49 73   fts3SegReaderIs
c5b0: 50 65 6e 64 69 6e 67 28 70 52 65 61 64 65 72 29  Pending(pReader)
c5c0: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 70 65 6e   ){.    /* A pen
c5d0: 64 69 6e 67 2d 74 65 72 6d 73 20 73 65 67 2d 72  ding-terms seg-r
c5e0: 65 61 64 65 72 20 66 6f 72 20 61 6e 20 46 54 53  eader for an FTS
c5f0: 34 20 74 61 62 6c 65 20 74 68 61 74 20 75 73 65  4 table that use
c600: 73 20 6f 72 64 65 72 3d 64 65 73 63 2e 0a 20 20  s order=desc..  
c610: 20 20 2a 2a 20 50 65 6e 64 69 6e 67 2d 74 65 72    ** Pending-ter
c620: 6d 73 20 64 6f 63 6c 69 73 74 73 20 61 72 65 20  ms doclists are 
c630: 61 6c 77 61 79 73 20 62 75 69 6c 74 20 75 70 20  always built up 
c640: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
c650: 65 72 2c 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65  er, so.    ** we
c660: 20 68 61 76 65 20 74 6f 20 69 74 65 72 61 74 65   have to iterate
c670: 20 74 68 72 6f 75 67 68 20 74 68 65 6d 20 62 61   through them ba
c680: 63 6b 77 61 72 64 73 20 68 65 72 65 2e 20 2a 2f  ckwards here. */
c690: 0a 20 20 20 20 75 38 20 62 45 6f 66 20 3d 20 30  .    u8 bEof = 0
c6a0: 3b 0a 20 20 20 20 69 66 28 20 70 70 4f 66 66 73  ;.    if( ppOffs
c6b0: 65 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  etList ){.      
c6c0: 2a 70 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20  *ppOffsetList = 
c6d0: 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74  pReader->pOffset
c6e0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 2a 70 6e 4f  List;.      *pnO
c6f0: 66 66 73 65 74 4c 69 73 74 20 3d 20 70 52 65 61  ffsetList = pRea
c700: 64 65 72 2d 3e 6e 4f 66 66 73 65 74 4c 69 73 74  der->nOffsetList
c710: 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 1;.    }.    
c720: 73 71 6c 69 74 65 33 46 74 73 33 44 6f 63 6c 69  sqlite3Fts3Docli
c730: 73 74 50 72 65 76 28 30 2c 0a 20 20 20 20 20 20  stPrev(0,.      
c740: 20 20 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c    pReader->aDocl
c750: 69 73 74 2c 20 70 52 65 61 64 65 72 2d 3e 6e 44  ist, pReader->nD
c760: 6f 63 6c 69 73 74 2c 20 26 70 2c 20 26 70 52 65  oclist, &p, &pRe
c770: 61 64 65 72 2d 3e 69 44 6f 63 69 64 2c 0a 20 20  ader->iDocid,.  
c780: 20 20 20 20 20 20 26 70 52 65 61 64 65 72 2d 3e        &pReader->
c790: 6e 4f 66 66 73 65 74 4c 69 73 74 2c 20 26 62 45  nOffsetList, &bE
c7a0: 6f 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  of.    );.    if
c7b0: 28 20 62 45 6f 66 20 29 7b 0a 20 20 20 20 20 20  ( bEof ){.      
c7c0: 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74  pReader->pOffset
c7d0: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  List = 0;.    }e
c7e0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 65 61 64  lse{.      pRead
c7f0: 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20  er->pOffsetList 
c800: 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = p;.    }.  }el
c810: 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 45  se{.    char *pE
c820: 6e 64 20 3d 20 26 70 52 65 61 64 65 72 2d 3e 61  nd = &pReader->a
c830: 44 6f 63 6c 69 73 74 5b 70 52 65 61 64 65 72 2d  Doclist[pReader-
c840: 3e 6e 44 6f 63 6c 69 73 74 5d 3b 0a 0a 20 20 20  >nDoclist];..   
c850: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 70 20 63 75   /* Pointer p cu
c860: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 61  rrently points a
c870: 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  t the first byte
c880: 20 6f 66 20 61 6e 20 6f 66 66 73 65 74 20 6c 69   of an offset li
c890: 73 74 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 66  st. The.    ** f
c8a0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 61  ollowing block a
c8b0: 64 76 61 6e 63 65 73 20 69 74 20 74 6f 20 70 6f  dvances it to po
c8c0: 69 6e 74 20 6f 6e 65 20 62 79 74 65 20 70 61 73  int one byte pas
c8d0: 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20  t the end of.   
c8e0: 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 6f 66 66   ** the same off
c8f0: 73 65 74 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20  set list. */.   
c900: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 0a   while( 1 ){.  .
c910: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c        /* The fol
c920: 6c 6f 77 69 6e 67 20 6c 69 6e 65 20 6f 66 20 63  lowing line of c
c930: 6f 64 65 20 28 61 6e 64 20 74 68 65 20 22 70 2b  ode (and the "p+
c940: 2b 22 20 62 65 6c 6f 77 20 74 68 65 20 77 68 69  +" below the whi
c950: 6c 65 28 29 20 6c 6f 6f 70 29 20 69 73 0a 20 20  le() loop) is.  
c960: 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20      ** normally 
c970: 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75  all that is requ
c980: 69 72 65 64 20 74 6f 20 6d 6f 76 65 20 70 6f 69  ired to move poi
c990: 6e 74 65 72 20 70 20 74 6f 20 74 68 65 20 64 65  nter p to the de
c9a0: 73 69 72 65 64 20 0a 20 20 20 20 20 20 2a 2a 20  sired .      ** 
c9b0: 70 6f 73 69 74 69 6f 6e 2e 20 54 68 65 20 65 78  position. The ex
c9c0: 63 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68  ception is if th
c9d0: 69 73 20 6e 6f 64 65 20 69 73 20 62 65 69 6e 67  is node is being
c9e0: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 64 69 73   loaded from dis
c9f0: 6b 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65  k.      ** incre
ca00: 6d 65 6e 74 61 6c 6c 79 20 61 6e 64 20 70 6f 69  mentally and poi
ca10: 6e 74 65 72 20 22 70 22 20 6e 6f 77 20 70 6f 69  nter "p" now poi
ca20: 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
ca30: 20 62 79 74 65 20 70 61 73 74 0a 20 20 20 20 20   byte past.     
ca40: 20 2a 2a 20 74 68 65 20 70 6f 70 75 6c 61 74 65   ** the populate
ca50: 64 20 70 61 72 74 20 6f 66 20 70 52 65 61 64 65  d part of pReade
ca60: 72 2d 3e 61 4e 6f 64 65 5b 5d 2e 0a 20 20 20 20  r->aNode[]..    
ca70: 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65    */.      while
ca80: 28 20 2a 70 20 7c 20 63 20 29 20 63 20 3d 20 2a  ( *p | c ) c = *
ca90: 70 2b 2b 20 26 20 30 78 38 30 3b 0a 20 20 20 20  p++ & 0x80;.    
caa0: 20 20 61 73 73 65 72 74 28 20 2a 70 3d 3d 30 20    assert( *p==0 
cab0: 29 3b 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20  );.  .      if( 
cac0: 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 3d 3d  pReader->pBlob==
cad0: 30 20 7c 7c 20 70 3c 26 70 52 65 61 64 65 72 2d  0 || p<&pReader-
cae0: 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e  >aNode[pReader->
caf0: 6e 50 6f 70 75 6c 61 74 65 5d 20 29 20 62 72 65  nPopulate] ) bre
cb00: 61 6b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  ak;.      rc = f
cb10: 74 73 33 53 65 67 52 65 61 64 65 72 49 6e 63 72  ts3SegReaderIncr
cb20: 52 65 61 64 28 70 52 65 61 64 65 72 29 3b 0a 20  Read(pReader);. 
cb30: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
cb40: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
cb50: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2b  rc;.    }.    p+
cb60: 2b 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  +;.  .    /* If 
cb70: 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61  required, popula
cb80: 74 65 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  te the output va
cb90: 72 69 61 62 6c 65 73 20 77 69 74 68 20 61 20 70  riables with a p
cba0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 64 20 74 68  ointer to and th
cbb0: 65 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66  e.    ** size of
cbc0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 66   the previous of
cbd0: 66 73 65 74 2d 6c 69 73 74 2e 0a 20 20 20 20 2a  fset-list..    *
cbe0: 2f 0a 20 20 20 20 69 66 28 20 70 70 4f 66 66 73  /.    if( ppOffs
cbf0: 65 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  etList ){.      
cc00: 2a 70 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20  *ppOffsetList = 
cc10: 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74  pReader->pOffset
cc20: 4c 69 73 74 3b 0a 20 20 20 20 20 20 2a 70 6e 4f  List;.      *pnO
cc30: 66 66 73 65 74 4c 69 73 74 20 3d 20 28 69 6e 74  ffsetList = (int
cc40: 29 28 70 20 2d 20 70 52 65 61 64 65 72 2d 3e 70  )(p - pReader->p
cc50: 4f 66 66 73 65 74 4c 69 73 74 20 2d 20 31 29 3b  OffsetList - 1);
cc60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c  .    }..    /* L
cc70: 69 73 74 20 6d 61 79 20 68 61 76 65 20 62 65 65  ist may have bee
cc80: 6e 20 65 64 69 74 65 64 20 69 6e 20 70 6c 61 63  n edited in plac
cc90: 65 20 62 79 20 66 74 73 33 45 76 61 6c 4e 65 61  e by fts3EvalNea
cca0: 72 54 72 69 6d 28 29 20 2a 2f 0a 20 20 20 20 77  rTrim() */.    w
ccb0: 68 69 6c 65 28 20 70 3c 70 45 6e 64 20 26 26 20  hile( p<pEnd && 
ccc0: 2a 70 3d 3d 30 20 29 20 70 2b 2b 3b 0a 20 20 0a  *p==0 ) p++;.  .
ccd0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
cce0: 61 72 65 20 6e 6f 20 6d 6f 72 65 20 65 6e 74 72  are no more entr
ccf0: 69 65 73 20 69 6e 20 74 68 65 20 64 6f 63 6c 69  ies in the docli
cd00: 73 74 2c 20 73 65 74 20 70 4f 66 66 73 65 74 4c  st, set pOffsetL
cd10: 69 73 74 20 74 6f 0a 20 20 20 20 2a 2a 20 4e 55  ist to.    ** NU
cd20: 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73  LL. Otherwise, s
cd30: 65 74 20 46 74 73 33 53 65 67 52 65 61 64 65 72  et Fts3SegReader
cd40: 2e 69 44 6f 63 69 64 20 74 6f 20 74 68 65 20 6e  .iDocid to the n
cd50: 65 78 74 20 64 6f 63 69 64 20 61 6e 64 0a 20 20  ext docid and.  
cd60: 20 20 2a 2a 20 46 74 73 33 53 65 67 52 65 61 64    ** Fts3SegRead
cd70: 65 72 2e 70 4f 66 66 73 65 74 4c 69 73 74 20 74  er.pOffsetList t
cd80: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
cd90: 65 78 74 20 6f 66 66 73 65 74 20 6c 69 73 74 20  ext offset list 
cda0: 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 72 65  before.    ** re
cdb0: 74 75 72 6e 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a  turning..    */.
cdc0: 20 20 20 20 69 66 28 20 70 3e 3d 70 45 6e 64 20      if( p>=pEnd 
cdd0: 29 7b 0a 20 20 20 20 20 20 70 52 65 61 64 65 72  ){.      pReader
cde0: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20  ->pOffsetList = 
cdf0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
ce00: 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67      rc = fts3Seg
ce10: 52 65 61 64 65 72 52 65 71 75 69 72 65 28 70 52  ReaderRequire(pR
ce20: 65 61 64 65 72 2c 20 70 2c 20 46 54 53 33 5f 56  eader, p, FTS3_V
ce30: 41 52 49 4e 54 5f 4d 41 58 29 3b 0a 20 20 20 20  ARINT_MAX);.    
ce40: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
ce50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
ce60: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 65  qlite3_int64 iDe
ce70: 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 70 52 65  lta;.        pRe
ce80: 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73  ader->pOffsetLis
ce90: 74 20 3d 20 70 20 2b 20 73 71 6c 69 74 65 33 46  t = p + sqlite3F
cea0: 74 73 33 47 65 74 56 61 72 69 6e 74 28 70 2c 20  ts3GetVarint(p, 
ceb0: 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20  &iDelta);.      
cec0: 20 20 69 66 28 20 70 54 61 62 2d 3e 62 44 65 73    if( pTab->bDes
ced0: 63 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20  cIdx ){.        
cee0: 20 20 70 52 65 61 64 65 72 2d 3e 69 44 6f 63 69    pReader->iDoci
cef0: 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20  d -= iDelta;.   
cf00: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
cf10: 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 69        pReader->i
cf20: 44 6f 63 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b  Docid += iDelta;
cf30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
cf40: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
cf50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
cf60: 3b 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65  ;.}...int sqlite
cf70: 33 46 74 73 33 4d 73 72 4f 76 66 6c 28 0a 20 20  3Fts3MsrOvfl(.  
cf80: 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72  Fts3Cursor *pCsr
cf90: 2c 20 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65  , .  Fts3MultiSe
cfa0: 67 52 65 61 64 65 72 20 2a 70 4d 73 72 2c 0a 20  gReader *pMsr,. 
cfb0: 20 69 6e 74 20 2a 70 6e 4f 76 66 6c 0a 29 7b 0a   int *pnOvfl.){.
cfc0: 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20 3d    Fts3Table *p =
cfd0: 20 28 46 74 73 33 54 61 62 6c 65 2a 29 70 43 73   (Fts3Table*)pCs
cfe0: 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a 20  r->base.pVtab;. 
cff0: 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 30 3b 0a   int nOvfl = 0;.
d000: 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20    int ii;.  int 
d010: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
d020: 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 2d 3e    int pgsz = p->
d030: 6e 50 67 73 7a 3b 0a 0a 20 20 61 73 73 65 72 74  nPgsz;..  assert
d040: 28 20 70 2d 3e 62 46 74 73 34 20 29 3b 0a 20 20  ( p->bFts4 );.  
d050: 61 73 73 65 72 74 28 20 70 67 73 7a 3e 30 20 29  assert( pgsz>0 )
d060: 3b 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 72  ;..  for(ii=0; r
d070: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
d080: 69 69 3c 70 4d 73 72 2d 3e 6e 53 65 67 6d 65 6e  ii<pMsr->nSegmen
d090: 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 46 74  t; ii++){.    Ft
d0a0: 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 65  s3SegReader *pRe
d0b0: 61 64 65 72 20 3d 20 70 4d 73 72 2d 3e 61 70 53  ader = pMsr->apS
d0c0: 65 67 6d 65 6e 74 5b 69 69 5d 3b 0a 20 20 20 20  egment[ii];.    
d0d0: 69 66 28 20 21 66 74 73 33 53 65 67 52 65 61 64  if( !fts3SegRead
d0e0: 65 72 49 73 50 65 6e 64 69 6e 67 28 70 52 65 61  erIsPending(pRea
d0f0: 64 65 72 29 20 0a 20 20 20 20 20 26 26 20 21 66  der) .     && !f
d100: 74 73 33 53 65 67 52 65 61 64 65 72 49 73 52 6f  ts3SegReaderIsRo
d110: 6f 74 4f 6e 6c 79 28 70 52 65 61 64 65 72 29 20  otOnly(pReader) 
d120: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
d130: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6a 6a 3b 0a  lite3_int64 jj;.
d140: 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 70 52 65        for(jj=pRe
d150: 61 64 65 72 2d 3e 69 53 74 61 72 74 42 6c 6f 63  ader->iStartBloc
d160: 6b 3b 20 6a 6a 3c 3d 70 52 65 61 64 65 72 2d 3e  k; jj<=pReader->
d170: 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 3b 20 6a  iLeafEndBlock; j
d180: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  j++){.        in
d190: 74 20 6e 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20  t nBlob;.       
d1a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
d1b0: 33 52 65 61 64 42 6c 6f 63 6b 28 70 2c 20 6a 6a  3ReadBlock(p, jj
d1c0: 2c 20 30 2c 20 26 6e 42 6c 6f 62 2c 20 30 29 3b  , 0, &nBlob, 0);
d1d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
d1e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65  =SQLITE_OK ) bre
d1f0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ak;.        if( 
d200: 28 6e 42 6c 6f 62 2b 33 35 29 3e 70 67 73 7a 20  (nBlob+35)>pgsz 
d210: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 76  ){.          nOv
d220: 66 6c 20 2b 3d 20 28 6e 42 6c 6f 62 20 2b 20 33  fl += (nBlob + 3
d230: 34 29 2f 70 67 73 7a 3b 0a 20 20 20 20 20 20 20  4)/pgsz;.       
d240: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
d250: 0a 20 20 7d 0a 20 20 2a 70 6e 4f 76 66 6c 20 3d  .  }.  *pnOvfl =
d260: 20 6e 4f 76 66 6c 3b 0a 20 20 72 65 74 75 72 6e   nOvfl;.  return
d270: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72   rc;.}../*.** Fr
d280: 65 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 69 6f  ee all allocatio
d290: 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ns associated wi
d2a0: 74 68 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  th the iterator 
d2b0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 0a 2a  passed as the .*
d2c0: 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  * second argumen
d2d0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
d2e0: 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 46  e3Fts3SegReaderF
d2f0: 72 65 65 28 46 74 73 33 53 65 67 52 65 61 64 65  ree(Fts3SegReade
d300: 72 20 2a 70 52 65 61 64 65 72 29 7b 0a 20 20 69  r *pReader){.  i
d310: 66 28 20 70 52 65 61 64 65 72 20 29 7b 0a 20 20  f( pReader ){.  
d320: 20 20 69 66 28 20 21 66 74 73 33 53 65 67 52 65    if( !fts3SegRe
d330: 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28 70 52  aderIsPending(pR
d340: 65 61 64 65 72 29 20 29 7b 0a 20 20 20 20 20 20  eader) ){.      
d350: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65  sqlite3_free(pRe
d360: 61 64 65 72 2d 3e 7a 54 65 72 6d 29 3b 0a 20 20  ader->zTerm);.  
d370: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 66 74 73    }.    if( !fts
d380: 33 53 65 67 52 65 61 64 65 72 49 73 52 6f 6f 74  3SegReaderIsRoot
d390: 4f 6e 6c 79 28 70 52 65 61 64 65 72 29 20 29 7b  Only(pReader) ){
d3a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
d3b0: 72 65 65 28 70 52 65 61 64 65 72 2d 3e 61 4e 6f  ree(pReader->aNo
d3c0: 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  de);.    }.    s
d3d0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73  qlite3_blob_clos
d3e0: 65 28 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62  e(pReader->pBlob
d3f0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
d400: 5f 66 72 65 65 28 70 52 65 61 64 65 72 29 3b 0a  _free(pReader);.
d410: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
d420: 65 20 61 20 6e 65 77 20 53 65 67 52 65 61 64 65  e a new SegReade
d430: 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74  r object..*/.int
d440: 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
d450: 65 61 64 65 72 4e 65 77 28 0a 20 20 69 6e 74 20  eaderNew(.  int 
d460: 69 41 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  iAge,           
d470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
d480: 65 67 6d 65 6e 74 20 22 61 67 65 22 2e 20 2a 2f  egment "age". */
d490: 0a 20 20 69 6e 74 20 62 4c 6f 6f 6b 75 70 2c 20  .  int bLookup, 
d4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4b0: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
d4c0: 20 6c 6f 6f 6b 75 70 20 6f 6e 6c 79 20 2a 2f 0a   lookup only */.
d4d0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
d4e0: 69 53 74 61 72 74 4c 65 61 66 2c 20 20 20 20 20  iStartLeaf,     
d4f0: 20 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20    /* First leaf 
d500: 74 6f 20 74 72 61 76 65 72 73 65 20 2a 2f 0a 20  to traverse */. 
d510: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
d520: 45 6e 64 4c 65 61 66 2c 20 20 20 20 20 20 20 20  EndLeaf,        
d530: 20 2f 2a 20 46 69 6e 61 6c 20 6c 65 61 66 20 74   /* Final leaf t
d540: 6f 20 74 72 61 76 65 72 73 65 20 2a 2f 0a 20 20  o traverse */.  
d550: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45  sqlite3_int64 iE
d560: 6e 64 42 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ndBlock,        
d570: 2f 2a 20 46 69 6e 61 6c 20 62 6c 6f 63 6b 20 6f  /* Final block o
d580: 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 63  f segment */.  c
d590: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 6f 6f 74  onst char *zRoot
d5a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
d5b0: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
d5c0: 69 6e 67 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f  ing root node */
d5d0: 0a 20 20 69 6e 74 20 6e 52 6f 6f 74 2c 20 20 20  .  int nRoot,   
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5f0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75     /* Size of bu
d600: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
d610: 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 46  root node */.  F
d620: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a 70  ts3SegReader **p
d630: 70 52 65 61 64 65 72 20 20 20 20 20 20 20 20 2f  pReader        /
d640: 2a 20 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 64  * OUT: Allocated
d650: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
d660: 2f 0a 29 7b 0a 20 20 46 74 73 33 53 65 67 52 65  /.){.  Fts3SegRe
d670: 61 64 65 72 20 2a 70 52 65 61 64 65 72 3b 20 20  ader *pReader;  
d680: 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20         /* Newly 
d690: 61 6c 6c 6f 63 61 74 65 64 20 53 65 67 52 65 61  allocated SegRea
d6a0: 64 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  der object */.  
d6b0: 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 20  int nExtra = 0; 
d6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6d0: 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f  /* Bytes to allo
d6e0: 63 61 74 65 20 73 65 67 6d 65 6e 74 20 72 6f 6f  cate segment roo
d6f0: 74 20 6e 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  t node */..  ass
d700: 65 72 74 28 20 69 53 74 61 72 74 4c 65 61 66 3c  ert( iStartLeaf<
d710: 3d 69 45 6e 64 4c 65 61 66 20 29 3b 0a 20 20 69  =iEndLeaf );.  i
d720: 66 28 20 69 53 74 61 72 74 4c 65 61 66 3d 3d 30  f( iStartLeaf==0
d730: 20 29 7b 0a 20 20 20 20 6e 45 78 74 72 61 20 3d   ){.    nExtra =
d740: 20 6e 52 6f 6f 74 20 2b 20 46 54 53 33 5f 4e 4f   nRoot + FTS3_NO
d750: 44 45 5f 50 41 44 44 49 4e 47 3b 0a 20 20 7d 0a  DE_PADDING;.  }.
d760: 0a 20 20 70 52 65 61 64 65 72 20 3d 20 28 46 74  .  pReader = (Ft
d770: 73 33 53 65 67 52 65 61 64 65 72 20 2a 29 73 71  s3SegReader *)sq
d780: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
d790: 65 6f 66 28 46 74 73 33 53 65 67 52 65 61 64 65  eof(Fts3SegReade
d7a0: 72 29 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20  r) + nExtra);.  
d7b0: 69 66 28 20 21 70 52 65 61 64 65 72 20 29 7b 0a  if( !pReader ){.
d7c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d7d0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d  E_NOMEM;.  }.  m
d7e0: 65 6d 73 65 74 28 70 52 65 61 64 65 72 2c 20 30  emset(pReader, 0
d7f0: 2c 20 73 69 7a 65 6f 66 28 46 74 73 33 53 65 67  , sizeof(Fts3Seg
d800: 52 65 61 64 65 72 29 29 3b 0a 20 20 70 52 65 61  Reader));.  pRea
d810: 64 65 72 2d 3e 69 49 64 78 20 3d 20 69 41 67 65  der->iIdx = iAge
d820: 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 62 4c 6f  ;.  pReader->bLo
d830: 6f 6b 75 70 20 3d 20 62 4c 6f 6f 6b 75 70 21 3d  okup = bLookup!=
d840: 30 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 69 53  0;.  pReader->iS
d850: 74 61 72 74 42 6c 6f 63 6b 20 3d 20 69 53 74 61  tartBlock = iSta
d860: 72 74 4c 65 61 66 3b 0a 20 20 70 52 65 61 64 65  rtLeaf;.  pReade
d870: 72 2d 3e 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b  r->iLeafEndBlock
d880: 20 3d 20 69 45 6e 64 4c 65 61 66 3b 0a 20 20 70   = iEndLeaf;.  p
d890: 52 65 61 64 65 72 2d 3e 69 45 6e 64 42 6c 6f 63  Reader->iEndBloc
d8a0: 6b 20 3d 20 69 45 6e 64 42 6c 6f 63 6b 3b 0a 0a  k = iEndBlock;..
d8b0: 20 20 69 66 28 20 6e 45 78 74 72 61 20 29 7b 0a    if( nExtra ){.
d8c0: 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72      /* The entir
d8d0: 65 20 73 65 67 6d 65 6e 74 20 69 73 20 73 74 6f  e segment is sto
d8e0: 72 65 64 20 69 6e 20 74 68 65 20 72 6f 6f 74 20  red in the root 
d8f0: 6e 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 70 52 65  node. */.    pRe
d900: 61 64 65 72 2d 3e 61 4e 6f 64 65 20 3d 20 28 63  ader->aNode = (c
d910: 68 61 72 20 2a 29 26 70 52 65 61 64 65 72 5b 31  har *)&pReader[1
d920: 5d 3b 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e  ];.    pReader->
d930: 72 6f 6f 74 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  rootOnly = 1;.  
d940: 20 20 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65    pReader->nNode
d950: 20 3d 20 6e 52 6f 6f 74 3b 0a 20 20 20 20 6d 65   = nRoot;.    me
d960: 6d 63 70 79 28 70 52 65 61 64 65 72 2d 3e 61 4e  mcpy(pReader->aN
d970: 6f 64 65 2c 20 7a 52 6f 6f 74 2c 20 6e 52 6f 6f  ode, zRoot, nRoo
d980: 74 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  t);.    memset(&
d990: 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 6e  pReader->aNode[n
d9a0: 52 6f 6f 74 5d 2c 20 30 2c 20 46 54 53 33 5f 4e  Root], 0, FTS3_N
d9b0: 4f 44 45 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20  ODE_PADDING);.  
d9c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 61 64  }else{.    pRead
d9d0: 65 72 2d 3e 69 43 75 72 72 65 6e 74 42 6c 6f 63  er->iCurrentBloc
d9e0: 6b 20 3d 20 69 53 74 61 72 74 4c 65 61 66 2d 31  k = iStartLeaf-1
d9f0: 3b 0a 20 20 7d 0a 20 20 2a 70 70 52 65 61 64 65  ;.  }.  *ppReade
da00: 72 20 3d 20 70 52 65 61 64 65 72 3b 0a 20 20 72  r = pReader;.  r
da10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
da20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
da30: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  s a comparison f
da40: 75 6e 63 74 69 6f 6e 20 75 73 65 64 20 61 73 20  unction used as 
da50: 61 20 71 73 6f 72 74 28 29 20 63 61 6c 6c 62 61  a qsort() callba
da60: 63 6b 20 77 68 65 6e 20 73 6f 72 74 69 6e 67 0a  ck when sorting.
da70: 2a 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70  ** an array of p
da80: 65 6e 64 69 6e 67 20 74 65 72 6d 73 20 62 79 20  ending terms by 
da90: 74 65 72 6d 2e 20 54 68 69 73 20 6f 63 63 75 72  term. This occur
daa0: 73 20 61 73 20 70 61 72 74 20 6f 66 20 66 6c 75  s as part of flu
dab0: 73 68 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e  shing.** the con
dac0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 65 6e  tents of the pen
dad0: 64 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20  ding-terms hash 
dae0: 74 61 62 6c 65 20 74 6f 20 74 68 65 20 64 61 74  table to the dat
daf0: 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
db00: 20 69 6e 74 20 53 51 4c 49 54 45 5f 43 44 45 43   int SQLITE_CDEC
db10: 4c 20 66 74 73 33 43 6f 6d 70 61 72 65 45 6c 65  L fts3CompareEle
db20: 6d 42 79 54 65 72 6d 28 0a 20 20 63 6f 6e 73 74  mByTerm(.  const
db30: 20 76 6f 69 64 20 2a 6c 68 73 2c 0a 20 20 63 6f   void *lhs,.  co
db40: 6e 73 74 20 76 6f 69 64 20 2a 72 68 73 0a 29 7b  nst void *rhs.){
db50: 0a 20 20 63 68 61 72 20 2a 7a 31 20 3d 20 66 74  .  char *z1 = ft
db60: 73 33 48 61 73 68 4b 65 79 28 2a 28 46 74 73 33  s3HashKey(*(Fts3
db70: 48 61 73 68 45 6c 65 6d 20 2a 2a 29 6c 68 73 29  HashElem **)lhs)
db80: 3b 0a 20 20 63 68 61 72 20 2a 7a 32 20 3d 20 66  ;.  char *z2 = f
db90: 74 73 33 48 61 73 68 4b 65 79 28 2a 28 46 74 73  ts3HashKey(*(Fts
dba0: 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29 72 68 73  3HashElem **)rhs
dbb0: 29 3b 0a 20 20 69 6e 74 20 6e 31 20 3d 20 66 74  );.  int n1 = ft
dbc0: 73 33 48 61 73 68 4b 65 79 73 69 7a 65 28 2a 28  s3HashKeysize(*(
dbd0: 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29  Fts3HashElem **)
dbe0: 6c 68 73 29 3b 0a 20 20 69 6e 74 20 6e 32 20 3d  lhs);.  int n2 =
dbf0: 20 66 74 73 33 48 61 73 68 4b 65 79 73 69 7a 65   fts3HashKeysize
dc00: 28 2a 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20  (*(Fts3HashElem 
dc10: 2a 2a 29 72 68 73 29 3b 0a 0a 20 20 69 6e 74 20  **)rhs);..  int 
dc20: 6e 20 3d 20 28 6e 31 3c 6e 32 20 3f 20 6e 31 20  n = (n1<n2 ? n1 
dc30: 3a 20 6e 32 29 3b 0a 20 20 69 6e 74 20 63 20 3d  : n2);.  int c =
dc40: 20 6d 65 6d 63 6d 70 28 7a 31 2c 20 7a 32 2c 20   memcmp(z1, z2, 
dc50: 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d 30 20 29  n);.  if( c==0 )
dc60: 7b 0a 20 20 20 20 63 20 3d 20 6e 31 20 2d 20 6e  {.    c = n1 - n
dc70: 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  2;.  }.  return 
dc80: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
dc90: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
dca0: 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e  d to allocate an
dcb0: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 74   Fts3SegReader t
dcc0: 68 61 74 20 69 74 65 72 61 74 65 73 20 74 68 72  hat iterates thr
dcd0: 6f 75 67 68 0a 2a 2a 20 61 20 73 75 62 73 65 74  ough.** a subset
dce0: 20 6f 66 20 74 68 65 20 74 65 72 6d 73 20 73 74   of the terms st
dcf0: 6f 72 65 64 20 69 6e 20 74 68 65 20 46 74 73 33  ored in the Fts3
dd00: 54 61 62 6c 65 2e 70 65 6e 64 69 6e 67 54 65 72  Table.pendingTer
dd10: 6d 73 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  ms array..**.** 
dd20: 49 66 20 74 68 65 20 69 73 50 72 65 66 69 78 49  If the isPrefixI
dd30: 74 65 72 20 70 61 72 61 6d 65 74 65 72 20 69 73  ter parameter is
dd40: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
dd50: 72 65 74 75 72 6e 65 64 20 53 65 67 52 65 61 64  returned SegRead
dd60: 65 72 20 69 74 65 72 61 74 65 73 0a 2a 2a 20 74  er iterates.** t
dd70: 68 72 6f 75 67 68 20 65 61 63 68 20 74 65 72 6d  hrough each term
dd80: 20 69 6e 20 74 68 65 20 70 65 6e 64 69 6e 67 2d   in the pending-
dd90: 74 65 72 6d 73 20 74 61 62 6c 65 2e 20 4f 72 2c  terms table. Or,
dda0: 20 69 66 20 69 73 50 72 65 66 69 78 49 74 65 72   if isPrefixIter
ddb0: 20 69 73 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c   is.** non-zero,
ddc0: 20 69 74 20 69 74 65 72 61 74 65 73 20 74 68 72   it iterates thr
ddd0: 6f 75 67 68 20 65 61 63 68 20 74 65 72 6d 20 61  ough each term a
dde0: 6e 64 20 69 74 73 20 70 72 65 66 69 78 65 73 2e  nd its prefixes.
ddf0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
de00: 0a 2a 2a 20 74 68 65 20 70 65 6e 64 69 6e 67 20  .** the pending 
de10: 74 65 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65  terms hash table
de20: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65   contains the te
de30: 72 6d 73 20 22 73 71 6c 69 74 65 22 2c 20 22 6d  rms "sqlite", "m
de40: 79 73 71 6c 22 20 61 6e 64 0a 2a 2a 20 22 66 69  ysql" and.** "fi
de50: 72 65 62 69 72 64 22 2c 20 74 68 65 6e 20 74 68  rebird", then th
de60: 65 20 69 74 65 72 61 74 6f 72 20 76 69 73 69 74  e iterator visit
de70: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
de80: 27 74 65 72 6d 73 27 20 28 69 6e 20 74 68 65 20  'terms' (in the 
de90: 6f 72 64 65 72 0a 2a 2a 20 73 68 6f 77 6e 29 3a  order.** shown):
dea0: 0a 2a 2a 0a 2a 2a 20 20 20 66 20 66 69 20 66 69  .**.**   f fi fi
deb0: 72 20 66 69 72 65 20 66 69 72 65 62 20 66 69 72  r fire fireb fir
dec0: 65 62 69 20 66 69 72 65 62 69 72 20 66 69 72 65  ebi firebir fire
ded0: 62 69 72 64 0a 2a 2a 20 20 20 6d 20 6d 79 20 6d  bird.**   m my m
dee0: 79 73 20 6d 79 73 71 20 6d 79 73 71 6c 0a 2a 2a  ys mysq mysql.**
def0: 20 20 20 73 20 73 71 20 73 71 6c 20 73 71 6c 69     s sq sql sqli
df00: 20 73 71 6c 69 74 20 73 71 6c 69 74 65 0a 2a 2a   sqlit sqlite.**
df10: 0a 2a 2a 20 57 68 65 72 65 61 73 20 69 66 20 69  .** Whereas if i
df20: 73 50 72 65 66 69 78 49 74 65 72 20 69 73 20 7a  sPrefixIter is z
df30: 65 72 6f 2c 20 74 68 65 20 74 65 72 6d 73 20 76  ero, the terms v
df40: 69 73 69 74 65 64 20 61 72 65 3a 0a 2a 2a 0a 2a  isited are:.**.*
df50: 2a 20 20 20 66 69 72 65 62 69 72 64 20 6d 79 73  *   firebird mys
df60: 71 6c 20 73 71 6c 69 74 65 0a 2a 2f 0a 69 6e 74  ql sqlite.*/.int
df70: 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
df80: 65 61 64 65 72 50 65 6e 64 69 6e 67 28 0a 20 20  eaderPending(.  
df90: 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfb0: 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  /* Virtual table
dfc0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
dfd0: 20 69 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20   iIndex,        
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dff0: 49 6e 64 65 78 20 66 6f 72 20 70 2d 3e 61 49 6e  Index for p->aIn
e000: 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dex */.  const c
e010: 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20  har *zTerm,     
e020: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d           /* Term
e030: 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 2a   to search for *
e040: 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20  /.  int nTerm,  
e050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e060: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
e070: 75 66 66 65 72 20 7a 54 65 72 6d 20 2a 2f 0a 20  uffer zTerm */. 
e080: 20 69 6e 74 20 62 50 72 65 66 69 78 2c 20 20 20   int bPrefix,   
e090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0a0: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 70   /* True for a p
e0b0: 72 65 66 69 78 20 69 74 65 72 61 74 6f 72 20 2a  refix iterator *
e0c0: 2f 0a 20 20 46 74 73 33 53 65 67 52 65 61 64 65  /.  Fts3SegReade
e0d0: 72 20 2a 2a 70 70 52 65 61 64 65 72 20 20 20 20  r **ppReader    
e0e0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 67 52      /* OUT: SegR
e0f0: 65 61 64 65 72 20 66 6f 72 20 70 65 6e 64 69 6e  eader for pendin
e100: 67 2d 74 65 72 6d 73 20 2a 2f 0a 29 7b 0a 20 20  g-terms */.){.  
e110: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
e120: 52 65 61 64 65 72 20 3d 20 30 3b 20 20 20 20 20  Reader = 0;     
e130: 2f 2a 20 46 74 73 33 53 65 67 52 65 61 64 65 72  /* Fts3SegReader
e140: 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72   object to retur
e150: 6e 20 2a 2f 0a 20 20 46 74 73 33 48 61 73 68 45  n */.  Fts3HashE
e160: 6c 65 6d 20 2a 70 45 3b 20 20 20 20 20 20 20 20  lem *pE;        
e170: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
e180: 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
e190: 20 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a   Fts3HashElem **
e1a0: 61 45 6c 65 6d 20 3d 20 30 3b 20 20 20 20 20 20  aElem = 0;      
e1b0: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 65 72   /* Array of ter
e1c0: 6d 20 68 61 73 68 20 65 6e 74 72 69 65 73 20 74  m hash entries t
e1d0: 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 69 6e 74 20  o scan */.  int 
e1e0: 6e 45 6c 65 6d 20 3d 20 30 3b 20 20 20 20 20 20  nElem = 0;      
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
e200: 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 74 20  ize of array at 
e210: 61 45 6c 65 6d 20 2a 2f 0a 20 20 69 6e 74 20 72  aElem */.  int r
e220: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
e230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
e240: 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 46  turn Code */.  F
e250: 74 73 33 48 61 73 68 20 2a 70 48 61 73 68 3b 0a  ts3Hash *pHash;.
e260: 0a 20 20 70 48 61 73 68 20 3d 20 26 70 2d 3e 61  .  pHash = &p->a
e270: 49 6e 64 65 78 5b 69 49 6e 64 65 78 5d 2e 68 50  Index[iIndex].hP
e280: 65 6e 64 69 6e 67 3b 0a 20 20 69 66 28 20 62 50  ending;.  if( bP
e290: 72 65 66 69 78 20 29 7b 0a 20 20 20 20 69 6e 74  refix ){.    int
e2a0: 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 20 20 20 20   nAlloc = 0;    
e2b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
e2c0: 7a 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20  ze of allocated 
e2d0: 61 72 72 61 79 20 61 74 20 61 45 6c 65 6d 20 2a  array at aElem *
e2e0: 2f 0a 0a 20 20 20 20 66 6f 72 28 70 45 3d 66 74  /..    for(pE=ft
e2f0: 73 33 48 61 73 68 46 69 72 73 74 28 70 48 61 73  s3HashFirst(pHas
e300: 68 29 3b 20 70 45 3b 20 70 45 3d 66 74 73 33 48  h); pE; pE=fts3H
e310: 61 73 68 4e 65 78 74 28 70 45 29 29 7b 0a 20 20  ashNext(pE)){.  
e320: 20 20 20 20 63 68 61 72 20 2a 7a 4b 65 79 20 3d      char *zKey =
e330: 20 28 63 68 61 72 20 2a 29 66 74 73 33 48 61 73   (char *)fts3Has
e340: 68 4b 65 79 28 70 45 29 3b 0a 20 20 20 20 20 20  hKey(pE);.      
e350: 69 6e 74 20 6e 4b 65 79 20 3d 20 66 74 73 33 48  int nKey = fts3H
e360: 61 73 68 4b 65 79 73 69 7a 65 28 70 45 29 3b 0a  ashKeysize(pE);.
e370: 20 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3d        if( nTerm=
e380: 3d 30 20 7c 7c 20 28 6e 4b 65 79 3e 3d 6e 54 65  =0 || (nKey>=nTe
e390: 72 6d 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  rm && 0==memcmp(
e3a0: 7a 4b 65 79 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  zKey, zTerm, nTe
e3b0: 72 6d 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rm)) ){.        
e3c0: 69 66 28 20 6e 45 6c 65 6d 3d 3d 6e 41 6c 6c 6f  if( nElem==nAllo
e3d0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 46  c ){.          F
e3e0: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 61 45  ts3HashElem **aE
e3f0: 6c 65 6d 32 3b 0a 20 20 20 20 20 20 20 20 20 20  lem2;.          
e400: 6e 41 6c 6c 6f 63 20 2b 3d 20 31 36 3b 0a 20 20  nAlloc += 16;.  
e410: 20 20 20 20 20 20 20 20 61 45 6c 65 6d 32 20 3d          aElem2 =
e420: 20 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a   (Fts3HashElem *
e430: 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
e440: 63 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  c(.             
e450: 20 61 45 6c 65 6d 2c 20 6e 41 6c 6c 6f 63 2a 73   aElem, nAlloc*s
e460: 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68 45 6c  izeof(Fts3HashEl
e470: 65 6d 20 2a 29 0a 20 20 20 20 20 20 20 20 20 20  em *).          
e480: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
e490: 20 21 61 45 6c 65 6d 32 20 29 7b 0a 20 20 20 20   !aElem2 ){.    
e4a0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
e4b0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
e4c0: 20 20 20 20 20 20 20 6e 45 6c 65 6d 20 3d 20 30         nElem = 0
e4d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
e4e0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
e4f0: 0a 20 20 20 20 20 20 20 20 20 20 61 45 6c 65 6d  .          aElem
e500: 20 3d 20 61 45 6c 65 6d 32 3b 0a 20 20 20 20 20   = aElem2;.     
e510: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 61 45     }..        aE
e520: 6c 65 6d 5b 6e 45 6c 65 6d 2b 2b 5d 20 3d 20 70  lem[nElem++] = p
e530: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
e540: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6d 6f 72 65  ..    /* If more
e550: 20 74 68 61 6e 20 6f 6e 65 20 74 65 72 6d 20 6d   than one term m
e560: 61 74 63 68 65 73 20 74 68 65 20 70 72 65 66 69  atches the prefi
e570: 78 2c 20 73 6f 72 74 20 74 68 65 20 46 74 73 33  x, sort the Fts3
e580: 48 61 73 68 45 6c 65 6d 0a 20 20 20 20 2a 2a 20  HashElem.    ** 
e590: 6f 62 6a 65 63 74 73 20 69 6e 20 74 65 72 6d 20  objects in term 
e5a0: 6f 72 64 65 72 20 75 73 69 6e 67 20 71 73 6f 72  order using qsor
e5b0: 74 28 29 2e 20 54 68 69 73 20 75 73 65 73 20 74  t(). This uses t
e5c0: 68 65 20 73 61 6d 65 20 63 6f 6d 70 61 72 69 73  he same comparis
e5d0: 6f 6e 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 62 61  on.    ** callba
e5e0: 63 6b 20 61 73 20 69 73 20 75 73 65 64 20 77 68  ck as is used wh
e5f0: 65 6e 20 66 6c 75 73 68 69 6e 67 20 74 65 72 6d  en flushing term
e600: 73 20 74 6f 20 64 69 73 6b 2e 0a 20 20 20 20 2a  s to disk..    *
e610: 2f 0a 20 20 20 20 69 66 28 20 6e 45 6c 65 6d 3e  /.    if( nElem>
e620: 31 20 29 7b 0a 20 20 20 20 20 20 71 73 6f 72 74  1 ){.      qsort
e630: 28 61 45 6c 65 6d 2c 20 6e 45 6c 65 6d 2c 20 73  (aElem, nElem, s
e640: 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68 45 6c  izeof(Fts3HashEl
e650: 65 6d 20 2a 29 2c 20 66 74 73 33 43 6f 6d 70 61  em *), fts3Compa
e660: 72 65 45 6c 65 6d 42 79 54 65 72 6d 29 3b 0a 20  reElemByTerm);. 
e670: 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20     }..  }else{. 
e680: 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20     /* The query 
e690: 69 73 20 61 20 73 69 6d 70 6c 65 20 74 65 72 6d  is a simple term
e6a0: 20 6c 6f 6f 6b 75 70 20 74 68 61 74 20 6d 61 74   lookup that mat
e6b0: 63 68 65 73 20 61 74 20 6d 6f 73 74 20 6f 6e 65  ches at most one
e6c0: 20 74 65 72 6d 20 69 6e 0a 20 20 20 20 2a 2a 20   term in.    ** 
e6d0: 74 68 65 20 69 6e 64 65 78 2e 20 41 6c 6c 20 74  the index. All t
e6e0: 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20  hat is required 
e6f0: 69 73 20 61 20 73 74 72 61 69 67 68 74 20 68 61  is a straight ha
e700: 73 68 2d 6c 6f 6f 6b 75 70 2e 20 0a 20 20 20 20  sh-lookup. .    
e710: 2a 2a 0a 20 20 20 20 2a 2a 20 42 65 63 61 75 73  **.    ** Becaus
e720: 65 20 74 68 65 20 73 74 61 63 6b 20 61 64 64 72  e the stack addr
e730: 65 73 73 20 6f 66 20 70 45 20 6d 61 79 20 62 65  ess of pE may be
e740: 20 61 63 63 65 73 73 65 64 20 76 69 61 20 74 68   accessed via th
e750: 65 20 61 45 6c 65 6d 20 70 6f 69 6e 74 65 72 0a  e aElem pointer.
e760: 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2c 20 74 68      ** below, th
e770: 65 20 22 46 74 73 33 48 61 73 68 45 6c 65 6d 20  e "Fts3HashElem 
e780: 2a 70 45 22 20 6d 75 73 74 20 62 65 20 64 65 63  *pE" must be dec
e790: 6c 61 72 65 64 20 73 6f 20 74 68 61 74 20 69 74  lared so that it
e7a0: 20 69 73 20 76 61 6c 69 64 0a 20 20 20 20 2a 2a   is valid.    **
e7b0: 20 77 69 74 68 69 6e 20 74 68 69 73 20 65 6e 74   within this ent
e7c0: 69 72 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6e 6f  ire function, no
e7d0: 74 20 6a 75 73 74 20 74 68 69 73 20 22 65 6c 73  t just this "els
e7e0: 65 7b 2e 2e 2e 7d 22 20 62 6c 6f 63 6b 2e 0a 20  e{...}" block.. 
e7f0: 20 20 20 2a 2f 0a 20 20 20 20 70 45 20 3d 20 66     */.    pE = f
e800: 74 73 33 48 61 73 68 46 69 6e 64 45 6c 65 6d 28  ts3HashFindElem(
e810: 70 48 61 73 68 2c 20 7a 54 65 72 6d 2c 20 6e 54  pHash, zTerm, nT
e820: 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 45  erm);.    if( pE
e830: 20 29 7b 0a 20 20 20 20 20 20 61 45 6c 65 6d 20   ){.      aElem 
e840: 3d 20 26 70 45 3b 0a 20 20 20 20 20 20 6e 45 6c  = &pE;.      nEl
e850: 65 6d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  em = 1;.    }.  
e860: 7d 0a 0a 20 20 69 66 28 20 6e 45 6c 65 6d 3e 30  }..  if( nElem>0
e870: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   ){.    int nByt
e880: 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 33 53  e = sizeof(Fts3S
e890: 65 67 52 65 61 64 65 72 29 20 2b 20 28 6e 45 6c  egReader) + (nEl
e8a0: 65 6d 2b 31 29 2a 73 69 7a 65 6f 66 28 46 74 73  em+1)*sizeof(Fts
e8b0: 33 48 61 73 68 45 6c 65 6d 20 2a 29 3b 0a 20 20  3HashElem *);.  
e8c0: 20 20 70 52 65 61 64 65 72 20 3d 20 28 46 74 73    pReader = (Fts
e8d0: 33 53 65 67 52 65 61 64 65 72 20 2a 29 73 71 6c  3SegReader *)sql
e8e0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74  ite3_malloc(nByt
e8f0: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 52 65  e);.    if( !pRe
e900: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63  ader ){.      rc
e910: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
e920: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e930: 20 20 6d 65 6d 73 65 74 28 70 52 65 61 64 65 72    memset(pReader
e940: 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  , 0, nByte);.   
e950: 20 20 20 70 52 65 61 64 65 72 2d 3e 69 49 64 78     pReader->iIdx
e960: 20 3d 20 30 78 37 46 46 46 46 46 46 46 3b 0a 20   = 0x7FFFFFFF;. 
e970: 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 70       pReader->pp
e980: 4e 65 78 74 45 6c 65 6d 20 3d 20 28 46 74 73 33  NextElem = (Fts3
e990: 48 61 73 68 45 6c 65 6d 20 2a 2a 29 26 70 52 65  HashElem **)&pRe
e9a0: 61 64 65 72 5b 31 5d 3b 0a 20 20 20 20 20 20 6d  ader[1];.      m
e9b0: 65 6d 63 70 79 28 70 52 65 61 64 65 72 2d 3e 70  emcpy(pReader->p
e9c0: 70 4e 65 78 74 45 6c 65 6d 2c 20 61 45 6c 65 6d  pNextElem, aElem
e9d0: 2c 20 6e 45 6c 65 6d 2a 73 69 7a 65 6f 66 28 46  , nElem*sizeof(F
e9e0: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 29 29 3b  ts3HashElem *));
e9f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
ea00: 28 20 62 50 72 65 66 69 78 20 29 7b 0a 20 20 20  ( bPrefix ){.   
ea10: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 45   sqlite3_free(aE
ea20: 6c 65 6d 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 52  lem);.  }.  *ppR
ea30: 65 61 64 65 72 20 3d 20 70 52 65 61 64 65 72 3b  eader = pReader;
ea40: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ea50: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
ea60: 68 65 20 65 6e 74 72 69 65 73 20 70 6f 69 6e 74  he entries point
ea70: 65 64 20 74 6f 20 62 79 20 74 77 6f 20 46 74 73  ed to by two Fts
ea80: 33 53 65 67 52 65 61 64 65 72 20 73 74 72 75 63  3SegReader struc
ea90: 74 75 72 65 73 2e 20 0a 2a 2a 20 43 6f 6d 70 61  tures. .** Compa
eaa0: 72 69 73 6f 6e 20 69 73 20 61 73 20 66 6f 6c 6c  rison is as foll
eab0: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ows:.**.**   1) 
eac0: 45 4f 46 20 69 73 20 67 72 65 61 74 65 72 20 74  EOF is greater t
ead0: 68 61 6e 20 6e 6f 74 20 45 4f 46 2e 0a 2a 2a 0a  han not EOF..**.
eae0: 2a 2a 20 20 20 32 29 20 54 68 65 20 63 75 72 72  **   2) The curr
eaf0: 65 6e 74 20 74 65 72 6d 73 20 28 69 66 20 61 6e  ent terms (if an
eb00: 79 29 20 61 72 65 20 63 6f 6d 70 61 72 65 64 20  y) are compared 
eb10: 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20  using memcmp(). 
eb20: 49 66 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 74  If one.**      t
eb30: 65 72 6d 20 69 73 20 61 20 70 72 65 66 69 78 20  erm is a prefix 
eb40: 6f 66 20 61 6e 6f 74 68 65 72 2c 20 74 68 65 20  of another, the 
eb50: 6c 6f 6e 67 65 72 20 74 65 72 6d 20 69 73 20 63  longer term is c
eb60: 6f 6e 73 69 64 65 72 65 64 20 74 68 65 0a 2a 2a  onsidered the.**
eb70: 20 20 20 20 20 20 6c 61 72 67 65 72 2e 0a 2a 2a        larger..**
eb80: 0a 2a 2a 20 20 20 33 29 20 42 79 20 73 65 67 6d  .**   3) By segm
eb90: 65 6e 74 20 61 67 65 2e 20 41 6e 20 6f 6c 64 65  ent age. An olde
eba0: 72 20 73 65 67 6d 65 6e 74 20 69 73 20 63 6f 6e  r segment is con
ebb0: 73 69 64 65 72 65 64 20 6c 61 72 67 65 72 2e 0a  sidered larger..
ebc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
ebd0: 73 33 53 65 67 52 65 61 64 65 72 43 6d 70 28 46  s3SegReaderCmp(F
ebe0: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 4c  ts3SegReader *pL
ebf0: 68 73 2c 20 46 74 73 33 53 65 67 52 65 61 64 65  hs, Fts3SegReade
ec00: 72 20 2a 70 52 68 73 29 7b 0a 20 20 69 6e 74 20  r *pRhs){.  int 
ec10: 72 63 3b 0a 20 20 69 66 28 20 70 4c 68 73 2d 3e  rc;.  if( pLhs->
ec20: 61 4e 6f 64 65 20 26 26 20 70 52 68 73 2d 3e 61  aNode && pRhs->a
ec30: 4e 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Node ){.    int 
ec40: 72 63 32 20 3d 20 70 4c 68 73 2d 3e 6e 54 65 72  rc2 = pLhs->nTer
ec50: 6d 20 2d 20 70 52 68 73 2d 3e 6e 54 65 72 6d 3b  m - pRhs->nTerm;
ec60: 0a 20 20 20 20 69 66 28 20 72 63 32 3c 30 20 29  .    if( rc2<0 )
ec70: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d  {.      rc = mem
ec80: 63 6d 70 28 70 4c 68 73 2d 3e 7a 54 65 72 6d 2c  cmp(pLhs->zTerm,
ec90: 20 70 52 68 73 2d 3e 7a 54 65 72 6d 2c 20 70 4c   pRhs->zTerm, pL
eca0: 68 73 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20  hs->nTerm);.    
ecb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
ecc0: 3d 20 6d 65 6d 63 6d 70 28 70 4c 68 73 2d 3e 7a  = memcmp(pLhs->z
ecd0: 54 65 72 6d 2c 20 70 52 68 73 2d 3e 7a 54 65 72  Term, pRhs->zTer
ece0: 6d 2c 20 70 52 68 73 2d 3e 6e 54 65 72 6d 29 3b  m, pRhs->nTerm);
ecf0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
ed00: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  c==0 ){.      rc
ed10: 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20   = rc2;.    }.  
ed20: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
ed30: 28 70 4c 68 73 2d 3e 61 4e 6f 64 65 3d 3d 30 29  (pLhs->aNode==0)
ed40: 20 2d 20 28 70 52 68 73 2d 3e 61 4e 6f 64 65 3d   - (pRhs->aNode=
ed50: 3d 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  =0);.  }.  if( r
ed60: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  c==0 ){.    rc =
ed70: 20 70 52 68 73 2d 3e 69 49 64 78 20 2d 20 70 4c   pRhs->iIdx - pL
ed80: 68 73 2d 3e 69 49 64 78 3b 0a 20 20 7d 0a 20 20  hs->iIdx;.  }.  
ed90: 61 73 73 65 72 74 28 20 72 63 21 3d 30 20 29 3b  assert( rc!=0 );
eda0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
edb0: 0a 2f 2a 0a 2a 2a 20 41 20 64 69 66 66 65 72 65  ./*.** A differe
edc0: 6e 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  nt comparison fu
edd0: 6e 63 74 69 6f 6e 20 66 6f 72 20 53 65 67 52 65  nction for SegRe
ede0: 61 64 65 72 20 73 74 72 75 63 74 75 72 65 73 2e  ader structures.
edf0: 20 49 6e 20 74 68 69 73 0a 2a 2a 20 76 65 72 73   In this.** vers
ee00: 69 6f 6e 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ion, it is assum
ee10: 65 64 20 74 68 61 74 20 65 61 63 68 20 53 65 67  ed that each Seg
ee20: 52 65 61 64 65 72 20 70 6f 69 6e 74 73 20 74 6f  Reader points to
ee30: 20 61 6e 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20   an entry in.** 
ee40: 61 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 69 64  a doclist for id
ee50: 65 6e 74 69 63 61 6c 20 74 65 72 6d 73 2e 20 43  entical terms. C
ee60: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64  omparison is mad
ee70: 65 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  e as follows:.**
ee80: 0a 2a 2a 20 20 20 31 29 20 45 4f 46 20 28 65 6e  .**   1) EOF (en
ee90: 64 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20  d of doclist in 
eea0: 74 68 69 73 20 63 61 73 65 29 20 69 73 20 67 72  this case) is gr
eeb0: 65 61 74 65 72 20 74 68 61 6e 20 6e 6f 74 20 45  eater than not E
eec0: 4f 46 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 42  OF..**.**   2) B
eed0: 79 20 63 75 72 72 65 6e 74 20 64 6f 63 69 64 2e  y current docid.
eee0: 0a 2a 2a 0a 2a 2a 20 20 20 33 29 20 42 79 20 73  .**.**   3) By s
eef0: 65 67 6d 65 6e 74 20 61 67 65 2e 20 41 6e 20 6f  egment age. An o
ef00: 6c 64 65 72 20 73 65 67 6d 65 6e 74 20 69 73 20  lder segment is 
ef10: 63 6f 6e 73 69 64 65 72 65 64 20 6c 61 72 67 65  considered large
ef20: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
ef30: 20 66 74 73 33 53 65 67 52 65 61 64 65 72 44 6f   fts3SegReaderDo
ef40: 63 6c 69 73 74 43 6d 70 28 46 74 73 33 53 65 67  clistCmp(Fts3Seg
ef50: 52 65 61 64 65 72 20 2a 70 4c 68 73 2c 20 46 74  Reader *pLhs, Ft
ef60: 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 68  s3SegReader *pRh
ef70: 73 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 28  s){.  int rc = (
ef80: 70 4c 68 73 2d 3e 70 4f 66 66 73 65 74 4c 69 73  pLhs->pOffsetLis
ef90: 74 3d 3d 30 29 2d 28 70 52 68 73 2d 3e 70 4f 66  t==0)-(pRhs->pOf
efa0: 66 73 65 74 4c 69 73 74 3d 3d 30 29 3b 0a 20 20  fsetList==0);.  
efb0: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
efc0: 20 69 66 28 20 70 4c 68 73 2d 3e 69 44 6f 63 69   if( pLhs->iDoci
efd0: 64 3d 3d 70 52 68 73 2d 3e 69 44 6f 63 69 64 20  d==pRhs->iDocid 
efe0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 52  ){.      rc = pR
eff0: 68 73 2d 3e 69 49 64 78 20 2d 20 70 4c 68 73 2d  hs->iIdx - pLhs-
f000: 3e 69 49 64 78 3b 0a 20 20 20 20 7d 65 6c 73 65  >iIdx;.    }else
f010: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 70 4c  {.      rc = (pL
f020: 68 73 2d 3e 69 44 6f 63 69 64 20 3e 20 70 52 68  hs->iDocid > pRh
f030: 73 2d 3e 69 44 6f 63 69 64 29 20 3f 20 31 20 3a  s->iDocid) ? 1 :
f040: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   -1;.    }.  }. 
f050: 20 61 73 73 65 72 74 28 20 70 4c 68 73 2d 3e 61   assert( pLhs->a
f060: 4e 6f 64 65 20 26 26 20 70 52 68 73 2d 3e 61 4e  Node && pRhs->aN
f070: 6f 64 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ode );.  return 
f080: 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  rc;.}.static int
f090: 20 66 74 73 33 53 65 67 52 65 61 64 65 72 44 6f   fts3SegReaderDo
f0a0: 63 6c 69 73 74 43 6d 70 52 65 76 28 46 74 73 33  clistCmpRev(Fts3
f0b0: 53 65 67 52 65 61 64 65 72 20 2a 70 4c 68 73 2c  SegReader *pLhs,
f0c0: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
f0d0: 70 52 68 73 29 7b 0a 20 20 69 6e 74 20 72 63 20  pRhs){.  int rc 
f0e0: 3d 20 28 70 4c 68 73 2d 3e 70 4f 66 66 73 65 74  = (pLhs->pOffset
f0f0: 4c 69 73 74 3d 3d 30 29 2d 28 70 52 68 73 2d 3e  List==0)-(pRhs->
f100: 70 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30 29 3b  pOffsetList==0);
f110: 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
f120: 20 20 20 20 69 66 28 20 70 4c 68 73 2d 3e 69 44      if( pLhs->iD
f130: 6f 63 69 64 3d 3d 70 52 68 73 2d 3e 69 44 6f 63  ocid==pRhs->iDoc
f140: 69 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  id ){.      rc =
f150: 20 70 52 68 73 2d 3e 69 49 64 78 20 2d 20 70 4c   pRhs->iIdx - pL
f160: 68 73 2d 3e 69 49 64 78 3b 0a 20 20 20 20 7d 65  hs->iIdx;.    }e
f170: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
f180: 28 70 4c 68 73 2d 3e 69 44 6f 63 69 64 20 3c 20  (pLhs->iDocid < 
f190: 70 52 68 73 2d 3e 69 44 6f 63 69 64 29 20 3f 20  pRhs->iDocid) ? 
f1a0: 31 20 3a 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  1 : -1;.    }.  
f1b0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 68 73  }.  assert( pLhs
f1c0: 2d 3e 61 4e 6f 64 65 20 26 26 20 70 52 68 73 2d  ->aNode && pRhs-
f1d0: 3e 61 4e 6f 64 65 20 29 3b 0a 20 20 72 65 74 75  >aNode );.  retu
f1e0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
f1f0: 43 6f 6d 70 61 72 65 20 74 68 65 20 74 65 72 6d  Compare the term
f200: 20 74 68 61 74 20 74 68 65 20 46 74 73 33 53 65   that the Fts3Se
f210: 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74 20 70  gReader object p
f220: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
f230: 73 74 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 70  st argument.** p
f240: 6f 69 6e 74 73 20 74 6f 20 77 69 74 68 20 74 68  oints to with th
f250: 65 20 74 65 72 6d 20 73 70 65 63 69 66 69 65 64  e term specified
f260: 20 62 79 20 61 72 67 75 6d 65 6e 74 73 20 7a 54   by arguments zT
f270: 65 72 6d 20 61 6e 64 20 6e 54 65 72 6d 2e 20 0a  erm and nTerm. .
f280: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65  **.** If the pSe
f290: 67 20 69 74 65 72 61 74 6f 72 20 69 73 20 61 6c  g iterator is al
f2a0: 72 65 61 64 79 20 61 74 20 45 4f 46 2c 20 72 65  ready at EOF, re
f2b0: 74 75 72 6e 20 30 2e 20 4f 74 68 65 72 77 69 73  turn 0. Otherwis
f2c0: 65 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 2d 76 65  e, return.** -ve
f2d0: 20 69 66 20 74 68 65 20 70 53 65 67 20 74 65 72   if the pSeg ter
f2e0: 6d 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  m is less than z
f2f0: 54 65 72 6d 2f 6e 54 65 72 6d 2c 20 30 20 69 66  Term/nTerm, 0 if
f300: 20 74 68 65 20 74 77 6f 20 74 65 72 6d 73 20 61   the two terms a
f310: 72 65 0a 2a 2a 20 65 71 75 61 6c 2c 20 6f 72 20  re.** equal, or 
f320: 2b 76 65 20 69 66 20 74 68 65 20 70 53 65 67 20  +ve if the pSeg 
f330: 74 65 72 6d 20 69 73 20 67 72 65 61 74 65 72 20  term is greater 
f340: 74 68 61 6e 20 7a 54 65 72 6d 2f 6e 54 65 72 6d  than zTerm/nTerm
f350: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f360: 66 74 73 33 53 65 67 52 65 61 64 65 72 54 65 72  fts3SegReaderTer
f370: 6d 43 6d 70 28 0a 20 20 46 74 73 33 53 65 67 52  mCmp(.  Fts3SegR
f380: 65 61 64 65 72 20 2a 70 53 65 67 2c 20 20 20 20  eader *pSeg,    
f390: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65          /* Segme
f3a0: 6e 74 20 72 65 61 64 65 72 20 6f 62 6a 65 63 74  nt reader object
f3b0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
f3c0: 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20   *zTerm,        
f3d0: 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f        /* Term to
f3e0: 20 63 6f 6d 70 61 72 65 20 74 6f 20 2a 2f 0a 20   compare to */. 
f3f0: 20 69 6e 74 20 6e 54 65 72 6d 20 20 20 20 20 20   int nTerm      
f400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f410: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d   /* Size of term
f420: 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20   zTerm in bytes 
f430: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 65 73 20  */.){.  int res 
f440: 3d 20 30 3b 0a 20 20 69 66 28 20 70 53 65 67 2d  = 0;.  if( pSeg-
f450: 3e 61 4e 6f 64 65 20 29 7b 0a 20 20 20 20 69 66  >aNode ){.    if
f460: 28 20 70 53 65 67 2d 3e 6e 54 65 72 6d 3e 6e 54  ( pSeg->nTerm>nT
f470: 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 73  erm ){.      res
f480: 20 3d 20 6d 65 6d 63 6d 70 28 70 53 65 67 2d 3e   = memcmp(pSeg->
f490: 7a 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54  zTerm, zTerm, nT
f4a0: 65 72 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  erm);.    }else{
f4b0: 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6d 65 6d  .      res = mem
f4c0: 63 6d 70 28 70 53 65 67 2d 3e 7a 54 65 72 6d 2c  cmp(pSeg->zTerm,
f4d0: 20 7a 54 65 72 6d 2c 20 70 53 65 67 2d 3e 6e 54   zTerm, pSeg->nT
f4e0: 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  erm);.    }.    
f4f0: 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
f500: 20 20 20 20 72 65 73 20 3d 20 70 53 65 67 2d 3e      res = pSeg->
f510: 6e 54 65 72 6d 2d 6e 54 65 72 6d 3b 0a 20 20 20  nTerm-nTerm;.   
f520: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
f530: 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72  res;.}../*.** Ar
f540: 67 75 6d 65 6e 74 20 61 70 53 65 67 6d 65 6e 74  gument apSegment
f550: 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20   is an array of 
f560: 6e 53 65 67 6d 65 6e 74 20 65 6c 65 6d 65 6e 74  nSegment element
f570: 73 2e 20 49 74 20 69 73 20 6b 6e 6f 77 6e 20 74  s. It is known t
f580: 68 61 74 0a 2a 2a 20 74 68 65 20 66 69 6e 61 6c  hat.** the final
f590: 20 28 6e 53 65 67 6d 65 6e 74 2d 6e 53 75 73 70   (nSegment-nSusp
f5a0: 65 63 74 29 20 6d 65 6d 62 65 72 73 20 61 72 65  ect) members are
f5b0: 20 61 6c 72 65 61 64 79 20 69 6e 20 73 6f 72 74   already in sort
f5c0: 65 64 20 6f 72 64 65 72 0a 2a 2a 20 28 61 63 63  ed order.** (acc
f5d0: 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f  ording to the co
f5e0: 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
f5f0: 6e 20 70 72 6f 76 69 64 65 64 29 2e 20 54 68 69  n provided). Thi
f600: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 75 66 66  s function shuff
f610: 6c 65 73 0a 2a 2a 20 74 68 65 20 61 72 72 61 79  les.** the array
f620: 20 61 72 6f 75 6e 64 20 75 6e 74 69 6c 20 61 6c   around until al
f630: 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20 69 6e  l entries are in
f640: 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a 2a   sorted order..*
f650: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
f660: 73 33 53 65 67 52 65 61 64 65 72 53 6f 72 74 28  s3SegReaderSort(
f670: 0a 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72  .  Fts3SegReader
f680: 20 2a 2a 61 70 53 65 67 6d 65 6e 74 2c 20 20 20   **apSegment,   
f690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6a0: 20 20 2f 2a 20 41 72 72 61 79 20 74 6f 20 73 6f    /* Array to so
f6b0: 72 74 20 65 6e 74 72 69 65 73 20 6f 66 20 2a 2f  rt entries of */
f6c0: 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 2c  .  int nSegment,
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6f0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 70 53    /* Size of apS
f700: 65 67 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a  egment array */.
f710: 20 20 69 6e 74 20 6e 53 75 73 70 65 63 74 2c 20    int nSuspect, 
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f740: 20 2f 2a 20 55 6e 73 6f 72 74 65 64 20 65 6e 74   /* Unsorted ent
f750: 72 79 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 69 6e  ry count */.  in
f760: 74 20 28 2a 78 43 6d 70 29 28 46 74 73 33 53 65  t (*xCmp)(Fts3Se
f770: 67 52 65 61 64 65 72 20 2a 2c 20 46 74 73 33 53  gReader *, Fts3S
f780: 65 67 52 65 61 64 65 72 20 2a 29 20 20 2f 2a 20  egReader *)  /* 
f790: 43 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  Comparison funct
f7a0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ion */.){.  int 
f7b0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
f7c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
f7d0: 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
f7e0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6e   */..  assert( n
f7f0: 53 75 73 70 65 63 74 3c 3d 6e 53 65 67 6d 65 6e  Suspect<=nSegmen
f800: 74 20 29 3b 0a 0a 20 20 69 66 28 20 6e 53 75 73  t );..  if( nSus
f810: 70 65 63 74 3d 3d 6e 53 65 67 6d 65 6e 74 20 29  pect==nSegment )
f820: 20 6e 53 75 73 70 65 63 74 2d 2d 3b 0a 20 20 66   nSuspect--;.  f
f830: 6f 72 28 69 3d 6e 53 75 73 70 65 63 74 2d 31 3b  or(i=nSuspect-1;
f840: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
f850: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 66 6f 72 28   int j;.    for(
f860: 6a 3d 69 3b 20 6a 3c 28 6e 53 65 67 6d 65 6e 74  j=i; j<(nSegment
f870: 2d 31 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  -1); j++){.     
f880: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
f890: 70 54 6d 70 3b 0a 20 20 20 20 20 20 69 66 28 20  pTmp;.      if( 
f8a0: 78 43 6d 70 28 61 70 53 65 67 6d 65 6e 74 5b 6a  xCmp(apSegment[j
f8b0: 5d 2c 20 61 70 53 65 67 6d 65 6e 74 5b 6a 2b 31  ], apSegment[j+1
f8c0: 5d 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  ])<0 ) break;.  
f8d0: 20 20 20 20 70 54 6d 70 20 3d 20 61 70 53 65 67      pTmp = apSeg
f8e0: 6d 65 6e 74 5b 6a 2b 31 5d 3b 0a 20 20 20 20 20  ment[j+1];.     
f8f0: 20 61 70 53 65 67 6d 65 6e 74 5b 6a 2b 31 5d 20   apSegment[j+1] 
f900: 3d 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 3b 0a  = apSegment[j];.
f910: 20 20 20 20 20 20 61 70 53 65 67 6d 65 6e 74 5b        apSegment[
f920: 6a 5d 20 3d 20 70 54 6d 70 3b 0a 20 20 20 20 7d  j] = pTmp;.    }
f930: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  .  }..#ifndef ND
f940: 45 42 55 47 0a 20 20 2f 2a 20 43 68 65 63 6b 20  EBUG.  /* Check 
f950: 74 68 61 74 20 74 68 65 20 6c 69 73 74 20 72 65  that the list re
f960: 61 6c 6c 79 20 69 73 20 73 6f 72 74 65 64 20 6e  ally is sorted n
f970: 6f 77 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ow. */.  for(i=0
f980: 3b 20 69 3c 28 6e 53 75 73 70 65 63 74 2d 31 29  ; i<(nSuspect-1)
f990: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
f9a0: 72 74 28 20 78 43 6d 70 28 61 70 53 65 67 6d 65  rt( xCmp(apSegme
f9b0: 6e 74 5b 69 5d 2c 20 61 70 53 65 67 6d 65 6e 74  nt[i], apSegment
f9c0: 5b 69 2b 31 5d 29 3c 30 20 29 3b 0a 20 20 7d 0a  [i+1])<0 );.  }.
f9d0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  #endif.}../* .**
f9e0: 20 49 6e 73 65 72 74 20 61 20 72 65 63 6f 72 64   Insert a record
f9f0: 20 69 6e 74 6f 20 74 68 65 20 25 5f 73 65 67 6d   into the %_segm
fa00: 65 6e 74 73 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  ents table..*/.s
fa10: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 57 72  tatic int fts3Wr
fa20: 69 74 65 53 65 67 6d 65 6e 74 28 0a 20 20 46 74  iteSegment(.  Ft
fa30: 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
fa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fa50: 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68   Virtual table h
fa60: 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  andle */.  sqlit
fa70: 65 33 5f 69 6e 74 36 34 20 69 42 6c 6f 63 6b 2c  e3_int64 iBlock,
fa80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c             /* Bl
fa90: 6f 63 6b 20 69 64 20 66 6f 72 20 6e 65 77 20 62  ock id for new b
faa0: 6c 6f 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lock */.  char *
fab0: 7a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z,              
fac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
fad0: 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
fae0: 6f 6e 74 61 69 6e 69 6e 67 20 62 6c 6f 63 6b 20  ontaining block 
faf0: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 20  data */.  int n 
fb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
fb20: 65 20 6f 66 20 62 75 66 66 65 72 20 7a 20 69 6e  e of buffer z in
fb30: 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 73   bytes */.){.  s
fb40: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
fb50: 6d 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 66  mt;.  int rc = f
fb60: 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51  ts3SqlStmt(p, SQ
fb70: 4c 5f 49 4e 53 45 52 54 5f 53 45 47 4d 45 4e 54  L_INSERT_SEGMENT
fb80: 53 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  S, &pStmt, 0);. 
fb90: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
fba0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
fbb0: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74  3_bind_int64(pSt
fbc0: 6d 74 2c 20 31 2c 20 69 42 6c 6f 63 6b 29 3b 0a  mt, 1, iBlock);.
fbd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
fbe0: 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 32 2c 20  _blob(pStmt, 2, 
fbf0: 7a 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41  z, n, SQLITE_STA
fc00: 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
fc10: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
fc20: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
fc30: 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
fc40: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
fc50: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
fc60: 20 6c 61 72 67 65 73 74 20 72 65 6c 61 74 69 76   largest relativ
fc70: 65 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20 69  e level number i
fc80: 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 49 66 20  n the table. If 
fc90: 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 0a  successful, set.
fca0: 2a 2a 20 2a 70 6e 4d 61 78 20 74 6f 20 74 68 69  ** *pnMax to thi
fcb0: 73 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75  s value and retu
fcc0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74  rn SQLITE_OK. Ot
fcd0: 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65  herwise, if an e
fce0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
fcf0: 73 65 74 20 2a 70 6e 4d 61 78 20 74 6f 20 7a 65  set *pnMax to ze
fd00: 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  ro and return an
fd10: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
fd20: 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
fd30: 65 33 46 74 73 33 4d 61 78 4c 65 76 65 6c 28 46  e3Fts3MaxLevel(F
fd40: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74  ts3Table *p, int
fd50: 20 2a 70 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20   *pnMax){.  int 
fd60: 72 63 3b 0a 20 20 69 6e 74 20 6d 78 4c 65 76 65  rc;.  int mxLeve
fd70: 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  l = 0;.  sqlite3
fd80: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
fd90: 3b 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71  ;..  rc = fts3Sq
fda0: 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c  lStmt(p, SQL_SEL
fdb0: 45 43 54 5f 4d 58 4c 45 56 45 4c 2c 20 26 70 53  ECT_MXLEVEL, &pS
fdc0: 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tmt, 0);.  if( r
fdd0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
fde0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
fdf0: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
fe00: 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
fe10: 20 6d 78 4c 65 76 65 6c 20 3d 20 73 71 6c 69 74   mxLevel = sqlit
fe20: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
fe30: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  tmt, 0);.    }. 
fe40: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
fe50: 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
fe60: 7d 0a 20 20 2a 70 6e 4d 61 78 20 3d 20 6d 78 4c  }.  *pnMax = mxL
fe70: 65 76 65 6c 3b 0a 20 20 72 65 74 75 72 6e 20 72  evel;.  return r
fe80: 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 49 6e 73  c;.}../* .** Ins
fe90: 65 72 74 20 61 20 72 65 63 6f 72 64 20 69 6e 74  ert a record int
fea0: 6f 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74  o the %_segdir t
feb0: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
fec0: 69 6e 74 20 66 74 73 33 57 72 69 74 65 53 65 67  int fts3WriteSeg
fed0: 64 69 72 28 0a 20 20 46 74 73 33 54 61 62 6c 65  dir(.  Fts3Table
fee0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
fef0: 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61         /* Virtua
ff00: 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  l table handle *
ff10: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
ff20: 34 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  4 iLevel,       
ff30: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72      /* Value for
ff40: 20 22 6c 65 76 65 6c 22 20 66 69 65 6c 64 20 28   "level" field (
ff50: 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 29 20  absolute level) 
ff60: 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20  */.  int iIdx,  
ff70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff80: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
ff90: 72 20 22 69 64 78 22 20 66 69 65 6c 64 20 2a 2f  r "idx" field */
ffa0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
ffb0: 20 69 53 74 61 72 74 42 6c 6f 63 6b 2c 20 20 20   iStartBlock,   
ffc0: 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20     /* Value for 
ffd0: 22 73 74 61 72 74 5f 62 6c 6f 63 6b 22 20 66 69  "start_block" fi
ffe0: 65 6c 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  eld */.  sqlite3
fff0: 5f 69 6e 74 36 34 20 69 4c 65 61 66 45 6e 64 42  _int64 iLeafEndB
10000 6c 6f 63 6b 2c 20 20 20 20 2f 2a 20 56 61 6c 75  lock,    /* Valu
10010 65 20 66 6f 72 20 22 6c 65 61 76 65 73 5f 65 6e  e for "leaves_en
10020 64 5f 62 6c 6f 63 6b 22 20 66 69 65 6c 64 20 2a  d_block" field *
10030 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
10040 34 20 69 45 6e 64 42 6c 6f 63 6b 2c 20 20 20 20  4 iEndBlock,    
10050 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72      /* Value for
10060 20 22 65 6e 64 5f 62 6c 6f 63 6b 22 20 66 69 65   "end_block" fie
10070 6c 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ld */.  sqlite3_
10080 69 6e 74 36 34 20 6e 4c 65 61 66 44 61 74 61 2c  int64 nLeafData,
10090 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
100a0 20 6f 66 20 6c 65 61 66 20 64 61 74 61 20 69 6e   of leaf data in
100b0 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 63 68   segment */.  ch
100c0 61 72 20 2a 7a 52 6f 6f 74 2c 20 20 20 20 20 20  ar *zRoot,      
100d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
100e0 20 42 6c 6f 62 20 76 61 6c 75 65 20 66 6f 72 20   Blob value for 
100f0 22 72 6f 6f 74 22 20 66 69 65 6c 64 20 2a 2f 0a  "root" field */.
10100 20 20 69 6e 74 20 6e 52 6f 6f 74 20 20 20 20 20    int nRoot     
10110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10120 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
10130 79 74 65 73 20 69 6e 20 62 75 66 66 65 72 20 7a  ytes in buffer z
10140 52 6f 6f 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  Root */.){.  sql
10150 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
10160 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73  ;.  int rc = fts
10170 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
10180 49 4e 53 45 52 54 5f 53 45 47 44 49 52 2c 20 26  INSERT_SEGDIR, &
10190 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
101a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
101b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  {.    sqlite3_bi
101c0 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  nd_int64(pStmt, 
101d0 31 2c 20 69 4c 65 76 65 6c 29 3b 0a 20 20 20 20  1, iLevel);.    
101e0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
101f0 28 70 53 74 6d 74 2c 20 32 2c 20 69 49 64 78 29  (pStmt, 2, iIdx)
10200 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
10210 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  nd_int64(pStmt, 
10220 33 2c 20 69 53 74 61 72 74 42 6c 6f 63 6b 29 3b  3, iStartBlock);
10230 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
10240 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 34  d_int64(pStmt, 4
10250 2c 20 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 29  , iLeafEndBlock)
10260 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 44  ;.    if( nLeafD
10270 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ata==0 ){.      
10280 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
10290 36 34 28 70 53 74 6d 74 2c 20 35 2c 20 69 45 6e  64(pStmt, 5, iEn
102a0 64 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 7d 65 6c  dBlock);.    }el
102b0 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
102c0 7a 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zEnd = sqlite3_m
102d0 70 72 69 6e 74 66 28 22 25 6c 6c 64 20 25 6c 6c  printf("%lld %ll
102e0 64 22 2c 20 69 45 6e 64 42 6c 6f 63 6b 2c 20 6e  d", iEndBlock, n
102f0 4c 65 61 66 44 61 74 61 29 3b 0a 20 20 20 20 20  LeafData);.     
10300 20 69 66 28 20 21 7a 45 6e 64 20 29 20 72 65 74   if( !zEnd ) ret
10310 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
10320 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
10330 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
10340 20 35 2c 20 7a 45 6e 64 2c 20 2d 31 2c 20 73 71   5, zEnd, -1, sq
10350 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20  lite3_free);.   
10360 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62   }.    sqlite3_b
10370 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  ind_blob(pStmt, 
10380 36 2c 20 7a 52 6f 6f 74 2c 20 6e 52 6f 6f 74 2c  6, zRoot, nRoot,
10390 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
103a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65  .    sqlite3_ste
103b0 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 72 63  p(pStmt);.    rc
103c0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
103d0 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 72  (pStmt);.  }.  r
103e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
103f0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
10400 7a 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e  ze of the common
10410 20 70 72 65 66 69 78 20 28 69 66 20 61 6e 79 29   prefix (if any)
10420 20 73 68 61 72 65 64 20 62 79 20 7a 50 72 65 76   shared by zPrev
10430 20 61 6e 64 0a 2a 2a 20 7a 4e 65 78 74 2c 20 69   and.** zNext, i
10440 6e 20 62 79 74 65 73 2e 20 46 6f 72 20 65 78 61  n bytes. For exa
10450 6d 70 6c 65 2c 20 0a 2a 2a 0a 2a 2a 20 20 20 66  mple, .**.**   f
10460 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73  ts3PrefixCompres
10470 73 28 22 61 62 63 22 2c 20 33 2c 20 22 61 62 63  s("abc", 3, "abc
10480 64 65 66 22 2c 20 36 29 20 20 20 2f 2f 20 72 65  def", 6)   // re
10490 74 75 72 6e 73 20 33 0a 2a 2a 20 20 20 66 74 73  turns 3.**   fts
104a0 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28  3PrefixCompress(
104b0 22 61 62 58 22 2c 20 33 2c 20 22 61 62 63 64 65  "abX", 3, "abcde
104c0 66 22 2c 20 36 29 20 20 20 2f 2f 20 72 65 74 75  f", 6)   // retu
104d0 72 6e 73 20 32 0a 2a 2a 20 20 20 66 74 73 33 50  rns 2.**   fts3P
104e0 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 22 61  refixCompress("a
104f0 62 58 22 2c 20 33 2c 20 22 58 62 63 64 65 66 22  bX", 3, "Xbcdef"
10500 2c 20 36 29 20 20 20 2f 2f 20 72 65 74 75 72 6e  , 6)   // return
10510 73 20 30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  s 0.*/.static in
10520 74 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70  t fts3PrefixComp
10530 72 65 73 73 28 0a 20 20 63 6f 6e 73 74 20 63 68  ress(.  const ch
10540 61 72 20 2a 7a 50 72 65 76 2c 20 20 20 20 20 20  ar *zPrev,      
10550 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
10560 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65  r containing pre
10570 76 69 6f 75 73 20 74 65 72 6d 20 2a 2f 0a 20 20  vious term */.  
10580 69 6e 74 20 6e 50 72 65 76 2c 20 20 20 20 20 20  int nPrev,      
10590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105a0 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
105b0 72 20 7a 50 72 65 76 20 69 6e 20 62 79 74 65 73  r zPrev in bytes
105c0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
105d0 20 2a 7a 4e 65 78 74 2c 20 20 20 20 20 20 20 20   *zNext,        
105e0 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
105f0 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 65 78 74 20  containing next 
10600 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  term */.  int nN
10610 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
10620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
10630 65 20 6f 66 20 62 75 66 66 65 72 20 7a 4e 65 78  e of buffer zNex
10640 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b  t in bytes */.){
10650 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 55 4e 55 53  .  int n;.  UNUS
10660 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 65  ED_PARAMETER(nNe
10670 78 74 29 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20  xt);.  for(n=0; 
10680 6e 3c 6e 50 72 65 76 20 26 26 20 7a 50 72 65 76  n<nPrev && zPrev
10690 5b 6e 5d 3d 3d 7a 4e 65 78 74 5b 6e 5d 3b 20 6e  [n]==zNext[n]; n
106a0 2b 2b 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  ++);.  return n;
106b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 65  .}../*.** Add te
106c0 72 6d 20 7a 54 65 72 6d 20 74 6f 20 74 68 65 20  rm zTerm to the 
106d0 53 65 67 6d 65 6e 74 4e 6f 64 65 2e 20 49 74 20  SegmentNode. It 
106e0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
106f0 61 74 20 7a 54 65 72 6d 20 69 73 20 6c 61 72 67  at zTerm is larg
10700 65 72 0a 2a 2a 20 28 61 63 63 6f 72 64 69 6e 67  er.** (according
10710 20 74 6f 20 6d 65 6d 63 6d 70 29 20 74 68 61 6e   to memcmp) than
10720 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65   the previous te
10730 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rm..*/.static in
10740 74 20 66 74 73 33 4e 6f 64 65 41 64 64 54 65 72  t fts3NodeAddTer
10750 6d 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  m(.  Fts3Table *
10760 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
10770 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
10780 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
10790 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 2a    SegmentNode **
107a0 70 70 54 72 65 65 2c 20 20 20 20 20 20 20 20 20  ppTree,         
107b0 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 65 67    /* IN/OUT: Seg
107c0 6d 65 6e 74 4e 6f 64 65 20 68 61 6e 64 6c 65 20  mentNode handle 
107d0 2a 2f 20 0a 20 20 69 6e 74 20 69 73 43 6f 70 79  */ .  int isCopy
107e0 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
107f0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
10800 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 20 69 73 20   zTerm/nTerm is 
10810 74 72 61 6e 73 69 65 6e 74 20 2a 2f 0a 20 20 63  transient */.  c
10820 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
10830 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
10840 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
10850 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
10860 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  erm */.  int nTe
10870 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rm              
10880 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
10890 20 6f 66 20 74 65 72 6d 20 69 6e 20 62 79 74 65   of term in byte
108a0 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 67 6d 65 6e  s */.){.  Segmen
108b0 74 4e 6f 64 65 20 2a 70 54 72 65 65 20 3d 20 2a  tNode *pTree = *
108c0 70 70 54 72 65 65 3b 0a 20 20 69 6e 74 20 72 63  ppTree;.  int rc
108d0 3b 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20  ;.  SegmentNode 
108e0 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a 20 46 69 72  *pNew;..  /* Fir
108f0 73 74 20 74 72 79 20 74 6f 20 61 70 70 65 6e 64  st try to append
10900 20 74 68 65 20 74 65 72 6d 20 74 6f 20 74 68 65   the term to the
10910 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 2e 20 52   current node. R
10920 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 0a  eturn early if .
10930 20 20 2a 2a 20 74 68 69 73 20 69 73 20 70 6f 73    ** this is pos
10940 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  sible..  */.  if
10950 28 20 70 54 72 65 65 20 29 7b 0a 20 20 20 20 69  ( pTree ){.    i
10960 6e 74 20 6e 44 61 74 61 20 3d 20 70 54 72 65 65  nt nData = pTree
10970 2d 3e 6e 44 61 74 61 3b 20 20 20 20 20 2f 2a 20  ->nData;     /* 
10980 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  Current size of 
10990 6e 6f 64 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  node in bytes */
109a0 0a 20 20 20 20 69 6e 74 20 6e 52 65 71 20 3d 20  .    int nReq = 
109b0 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  nData;          
109c0 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 73     /* Required s
109d0 70 61 63 65 20 61 66 74 65 72 20 61 64 64 69 6e  pace after addin
109e0 67 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 20 20 69  g zTerm */.    i
109f0 6e 74 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20  nt nPrefix;     
10a00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10a10 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
10a20 6f 66 20 70 72 65 66 69 78 20 63 6f 6d 70 72 65  of prefix compre
10a30 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  ssion */.    int
10a40 20 6e 53 75 66 66 69 78 3b 20 20 20 20 20 20 20   nSuffix;       
10a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
10a60 66 66 69 78 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a  ffix length */..
10a70 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20 66 74      nPrefix = ft
10a80 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73  s3PrefixCompress
10a90 28 70 54 72 65 65 2d 3e 7a 54 65 72 6d 2c 20 70  (pTree->zTerm, p
10aa0 54 72 65 65 2d 3e 6e 54 65 72 6d 2c 20 7a 54 65  Tree->nTerm, zTe
10ab0 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20  rm, nTerm);.    
10ac0 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d 2d  nSuffix = nTerm-
10ad0 6e 50 72 65 66 69 78 3b 0a 0a 20 20 20 20 6e 52  nPrefix;..    nR
10ae0 65 71 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  eq += sqlite3Fts
10af0 33 56 61 72 69 6e 74 4c 65 6e 28 6e 50 72 65 66  3VarintLen(nPref
10b00 69 78 29 2b 73 71 6c 69 74 65 33 46 74 73 33 56  ix)+sqlite3Fts3V
10b10 61 72 69 6e 74 4c 65 6e 28 6e 53 75 66 66 69 78  arintLen(nSuffix
10b20 29 2b 6e 53 75 66 66 69 78 3b 0a 20 20 20 20 69  )+nSuffix;.    i
10b30 66 28 20 6e 52 65 71 3c 3d 70 2d 3e 6e 4e 6f 64  f( nReq<=p->nNod
10b40 65 53 69 7a 65 20 7c 7c 20 21 70 54 72 65 65 2d  eSize || !pTree-
10b50 3e 7a 54 65 72 6d 20 29 7b 0a 0a 20 20 20 20 20  >zTerm ){..     
10b60 20 69 66 28 20 6e 52 65 71 3e 70 2d 3e 6e 4e 6f   if( nReq>p->nNo
10b70 64 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  deSize ){.      
10b80 20 20 2f 2a 20 41 6e 20 75 6e 75 73 75 61 6c 20    /* An unusual 
10b90 63 61 73 65 3a 20 74 68 69 73 20 69 73 20 74 68  case: this is th
10ba0 65 20 66 69 72 73 74 20 74 65 72 6d 20 74 6f 20  e first term to 
10bb0 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
10bc0 6e 6f 64 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  node.        ** 
10bd0 61 6e 64 20 74 68 65 20 73 74 61 74 69 63 20 6e  and the static n
10be0 6f 64 65 20 62 75 66 66 65 72 20 28 70 2d 3e 6e  ode buffer (p->n
10bf0 4e 6f 64 65 53 69 7a 65 20 62 79 74 65 73 29 20  NodeSize bytes) 
10c00 69 73 20 6e 6f 74 20 6c 61 72 67 65 0a 20 20 20  is not large.   
10c10 20 20 20 20 20 2a 2a 20 65 6e 6f 75 67 68 2e 20       ** enough. 
10c20 55 73 65 20 61 20 73 65 70 61 72 61 74 65 6c 79  Use a separately
10c30 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66 66 65 72   malloced buffer
10c40 20 69 6e 73 74 65 61 64 20 54 68 69 73 20 77 61   instead This wa
10c50 73 74 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  stes.        ** 
10c60 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 62 79 74  p->nNodeSize byt
10c70 65 73 2c 20 62 75 74 20 73 69 6e 63 65 20 74 68  es, but since th
10c80 69 73 20 73 63 65 6e 61 72 69 6f 20 6f 6e 6c 79  is scenario only
10c90 20 63 6f 6d 65 73 20 61 62 6f 75 74 20 77 68 65   comes about whe
10ca0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  n.        ** the
10cb0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
10cc0 6e 20 74 77 6f 20 74 65 72 6d 73 20 74 68 61 74  n two terms that
10cd0 20 73 68 61 72 65 20 61 20 70 72 65 66 69 78 20   share a prefix 
10ce0 6f 66 20 61 6c 6d 6f 73 74 20 32 4b 42 2c 20 0a  of almost 2KB, .
10cf0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
10d00 69 73 20 6e 6f 74 20 65 78 70 65 63 74 65 64 20  is not expected 
10d10 74 6f 20 62 65 20 61 20 73 65 72 69 6f 75 73 20  to be a serious 
10d20 70 72 6f 62 6c 65 6d 2e 20 0a 20 20 20 20 20 20  problem. .      
10d30 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
10d40 65 72 74 28 20 70 54 72 65 65 2d 3e 61 44 61 74  ert( pTree->aDat
10d50 61 3d 3d 28 63 68 61 72 20 2a 29 26 70 54 72 65  a==(char *)&pTre
10d60 65 5b 31 5d 20 29 3b 0a 20 20 20 20 20 20 20 20  e[1] );.        
10d70 70 54 72 65 65 2d 3e 61 44 61 74 61 20 3d 20 28  pTree->aData = (
10d80 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  char *)sqlite3_m
10d90 61 6c 6c 6f 63 28 6e 52 65 71 29 3b 0a 20 20 20  alloc(nReq);.   
10da0 20 20 20 20 20 69 66 28 20 21 70 54 72 65 65 2d       if( !pTree-
10db0 3e 61 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  >aData ){.      
10dc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10dd0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
10de0 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
10df0 20 20 69 66 28 20 70 54 72 65 65 2d 3e 7a 54 65    if( pTree->zTe
10e00 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  rm ){.        /*
10e10 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70 72 65   There is no pre
10e20 66 69 78 2d 6c 65 6e 67 74 68 20 66 69 65 6c 64  fix-length field
10e30 20 66 6f 72 20 66 69 72 73 74 20 74 65 72 6d 20   for first term 
10e40 69 6e 20 61 20 6e 6f 64 65 20 2a 2f 0a 20 20 20  in a node */.   
10e50 20 20 20 20 20 6e 44 61 74 61 20 2b 3d 20 73 71       nData += sq
10e60 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69  lite3Fts3PutVari
10e70 6e 74 28 26 70 54 72 65 65 2d 3e 61 44 61 74 61  nt(&pTree->aData
10e80 5b 6e 44 61 74 61 5d 2c 20 6e 50 72 65 66 69 78  [nData], nPrefix
10e90 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
10ea0 20 20 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69 74    nData += sqlit
10eb0 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28  e3Fts3PutVarint(
10ec0 26 70 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e 44  &pTree->aData[nD
10ed0 61 74 61 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a  ata], nSuffix);.
10ee0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 54        memcpy(&pT
10ef0 72 65 65 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61  ree->aData[nData
10f00 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50 72 65 66 69  ], &zTerm[nPrefi
10f10 78 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20  x], nSuffix);.  
10f20 20 20 20 20 70 54 72 65 65 2d 3e 6e 44 61 74 61      pTree->nData
10f30 20 3d 20 6e 44 61 74 61 20 2b 20 6e 53 75 66 66   = nData + nSuff
10f40 69 78 3b 0a 20 20 20 20 20 20 70 54 72 65 65 2d  ix;.      pTree-
10f50 3e 6e 45 6e 74 72 79 2b 2b 3b 0a 0a 20 20 20 20  >nEntry++;..    
10f60 20 20 69 66 28 20 69 73 43 6f 70 79 54 65 72 6d    if( isCopyTerm
10f70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
10f80 70 54 72 65 65 2d 3e 6e 4d 61 6c 6c 6f 63 3c 6e  pTree->nMalloc<n
10f90 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Term ){.        
10fa0 20 20 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20 73    char *zNew = s
10fb0 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
10fc0 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 2c 20 6e  Tree->zMalloc, n
10fd0 54 65 72 6d 2a 32 29 3b 0a 20 20 20 20 20 20 20  Term*2);.       
10fe0 20 20 20 69 66 28 20 21 7a 4e 65 77 20 29 7b 0a     if( !zNew ){.
10ff0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
11000 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
11010 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
11020 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e 6e 4d         pTree->nM
11030 61 6c 6c 6f 63 20 3d 20 6e 54 65 72 6d 2a 32 3b  alloc = nTerm*2;
11040 0a 20 20 20 20 20 20 20 20 20 20 70 54 72 65 65  .          pTree
11050 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 7a 4e 65 77  ->zMalloc = zNew
11060 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11070 20 20 20 20 70 54 72 65 65 2d 3e 7a 54 65 72 6d      pTree->zTerm
11080 20 3d 20 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f   = pTree->zMallo
11090 63 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  c;.        memcp
110a0 79 28 70 54 72 65 65 2d 3e 7a 54 65 72 6d 2c 20  y(pTree->zTerm, 
110b0 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  zTerm, nTerm);. 
110c0 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e 6e 54         pTree->nT
110d0 65 72 6d 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20  erm = nTerm;.   
110e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
110f0 20 20 70 54 72 65 65 2d 3e 7a 54 65 72 6d 20 3d    pTree->zTerm =
11100 20 28 63 68 61 72 20 2a 29 7a 54 65 72 6d 3b 0a   (char *)zTerm;.
11110 20 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e 6e          pTree->n
11120 54 65 72 6d 20 3d 20 6e 54 65 72 6d 3b 0a 20 20  Term = nTerm;.  
11130 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
11140 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
11150 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
11160 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74   control flows t
11170 6f 20 68 65 72 65 2c 20 69 74 20 77 61 73 20 6e  o here, it was n
11180 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  ot possible to a
11190 70 70 65 6e 64 20 7a 54 65 72 6d 20 74 6f 20 74  ppend zTerm to t
111a0 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
111b0 6e 6f 64 65 2e 20 43 72 65 61 74 65 20 61 20 6e  node. Create a n
111c0 65 77 20 6e 6f 64 65 20 28 61 20 72 69 67 68 74  ew node (a right
111d0 2d 73 69 62 6c 69 6e 67 20 6f 66 20 74 68 65 20  -sibling of the 
111e0 63 75 72 72 65 6e 74 20 6e 6f 64 65 29 2e 0a 20  current node).. 
111f0 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   ** If this is t
11200 68 65 20 66 69 72 73 74 20 6e 6f 64 65 20 69 6e  he first node in
11210 20 74 68 65 20 74 72 65 65 2c 20 74 68 65 20 74   the tree, the t
11220 65 72 6d 20 69 73 20 61 64 64 65 64 20 74 6f 20  erm is added to 
11230 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 74  it..  **.  ** Ot
11240 68 65 72 77 69 73 65 2c 20 74 68 65 20 74 65 72  herwise, the ter
11250 6d 20 69 73 20 6e 6f 74 20 61 64 64 65 64 20 74  m is not added t
11260 6f 20 74 68 65 20 6e 65 77 20 6e 6f 64 65 2c 20  o the new node, 
11270 69 74 20 69 73 20 6c 65 66 74 20 65 6d 70 74 79  it is left empty
11280 20 66 6f 72 0a 20 20 2a 2a 20 6e 6f 77 2e 20 49   for.  ** now. I
11290 6e 73 74 65 61 64 2c 20 74 68 65 20 74 65 72 6d  nstead, the term
112a0 20 69 73 20 69 6e 73 65 72 74 65 64 20 69 6e 74   is inserted int
112b0 6f 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  o the parent of 
112c0 70 54 72 65 65 2e 20 49 66 20 70 54 72 65 65 20  pTree. If pTree 
112d0 0a 20 20 2a 2a 20 68 61 73 20 6e 6f 20 70 61 72  .  ** has no par
112e0 65 6e 74 2c 20 6f 6e 65 20 69 73 20 63 72 65 61  ent, one is crea
112f0 74 65 64 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  ted here..  */. 
11300 20 70 4e 65 77 20 3d 20 28 53 65 67 6d 65 6e 74   pNew = (Segment
11310 4e 6f 64 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d  Node *)sqlite3_m
11320 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 53 65 67  alloc(sizeof(Seg
11330 6d 65 6e 74 4e 6f 64 65 29 20 2b 20 70 2d 3e 6e  mentNode) + p->n
11340 4e 6f 64 65 53 69 7a 65 29 3b 0a 20 20 69 66 28  NodeSize);.  if(
11350 20 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 72 65   !pNew ){.    re
11360 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
11370 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  M;.  }.  memset(
11380 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pNew, 0, sizeof(
11390 53 65 67 6d 65 6e 74 4e 6f 64 65 29 29 3b 0a 20  SegmentNode));. 
113a0 20 70 4e 65 77 2d 3e 6e 44 61 74 61 20 3d 20 31   pNew->nData = 1
113b0 20 2b 20 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d   + FTS3_VARINT_M
113c0 41 58 3b 0a 20 20 70 4e 65 77 2d 3e 61 44 61 74  AX;.  pNew->aDat
113d0 61 20 3d 20 28 63 68 61 72 20 2a 29 26 70 4e 65  a = (char *)&pNe
113e0 77 5b 31 5d 3b 0a 0a 20 20 69 66 28 20 70 54 72  w[1];..  if( pTr
113f0 65 65 20 29 7b 0a 20 20 20 20 53 65 67 6d 65 6e  ee ){.    Segmen
11400 74 4e 6f 64 65 20 2a 70 50 61 72 65 6e 74 20 3d  tNode *pParent =
11410 20 70 54 72 65 65 2d 3e 70 50 61 72 65 6e 74 3b   pTree->pParent;
11420 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 4e 6f  .    rc = fts3No
11430 64 65 41 64 64 54 65 72 6d 28 70 2c 20 26 70 50  deAddTerm(p, &pP
11440 61 72 65 6e 74 2c 20 69 73 43 6f 70 79 54 65 72  arent, isCopyTer
11450 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29  m, zTerm, nTerm)
11460 3b 0a 20 20 20 20 69 66 28 20 70 54 72 65 65 2d  ;.    if( pTree-
11470 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20  >pParent==0 ){. 
11480 20 20 20 20 20 70 54 72 65 65 2d 3e 70 50 61 72       pTree->pPar
11490 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20  ent = pParent;. 
114a0 20 20 20 7d 0a 20 20 20 20 70 54 72 65 65 2d 3e     }.    pTree->
114b0 70 52 69 67 68 74 20 3d 20 70 4e 65 77 3b 0a 20  pRight = pNew;. 
114c0 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 6d 6f     pNew->pLeftmo
114d0 73 74 20 3d 20 70 54 72 65 65 2d 3e 70 4c 65 66  st = pTree->pLef
114e0 74 6d 6f 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d  tmost;.    pNew-
114f0 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65  >pParent = pPare
11500 6e 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4d  nt;.    pNew->zM
11510 61 6c 6c 6f 63 20 3d 20 70 54 72 65 65 2d 3e 7a  alloc = pTree->z
11520 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20 70 4e 65 77  Malloc;.    pNew
11530 2d 3e 6e 4d 61 6c 6c 6f 63 20 3d 20 70 54 72 65  ->nMalloc = pTre
11540 65 2d 3e 6e 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20  e->nMalloc;.    
11550 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d  pTree->zMalloc =
11560 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
11570 20 70 4e 65 77 2d 3e 70 4c 65 66 74 6d 6f 73 74   pNew->pLeftmost
11580 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72 63 20   = pNew;.    rc 
11590 3d 20 66 74 73 33 4e 6f 64 65 41 64 64 54 65 72  = fts3NodeAddTer
115a0 6d 28 70 2c 20 26 70 4e 65 77 2c 20 69 73 43 6f  m(p, &pNew, isCo
115b0 70 79 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e  pyTerm, zTerm, n
115c0 54 65 72 6d 29 3b 20 0a 20 20 7d 0a 0a 20 20 2a  Term); .  }..  *
115d0 70 70 54 72 65 65 20 3d 20 70 4e 65 77 3b 0a 20  ppTree = pNew;. 
115e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
115f0 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
11600 74 69 6f 6e 20 66 6f 72 20 66 74 73 33 4e 6f 64  tion for fts3Nod
11610 65 57 72 69 74 65 28 29 2e 0a 2a 2f 0a 73 74 61  eWrite()..*/.sta
11620 74 69 63 20 69 6e 74 20 66 74 73 33 54 72 65 65  tic int fts3Tree
11630 46 69 6e 69 73 68 4e 6f 64 65 28 0a 20 20 53 65  FinishNode(.  Se
11640 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65  gmentNode *pTree
11650 2c 20 0a 20 20 69 6e 74 20 69 48 65 69 67 68 74  , .  int iHeight
11660 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  , .  sqlite3_int
11670 36 34 20 69 4c 65 66 74 43 68 69 6c 64 0a 29 7b  64 iLeftChild.){
11680 0a 20 20 69 6e 74 20 6e 53 74 61 72 74 3b 0a 20  .  int nStart;. 
11690 20 61 73 73 65 72 74 28 20 69 48 65 69 67 68 74   assert( iHeight
116a0 3e 3d 31 20 26 26 20 69 48 65 69 67 68 74 3c 31  >=1 && iHeight<1
116b0 32 38 20 29 3b 0a 20 20 6e 53 74 61 72 74 20 3d  28 );.  nStart =
116c0 20 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58   FTS3_VARINT_MAX
116d0 20 2d 20 73 71 6c 69 74 65 33 46 74 73 33 56 61   - sqlite3Fts3Va
116e0 72 69 6e 74 4c 65 6e 28 69 4c 65 66 74 43 68 69  rintLen(iLeftChi
116f0 6c 64 29 3b 0a 20 20 70 54 72 65 65 2d 3e 61 44  ld);.  pTree->aD
11700 61 74 61 5b 6e 53 74 61 72 74 5d 20 3d 20 28 63  ata[nStart] = (c
11710 68 61 72 29 69 48 65 69 67 68 74 3b 0a 20 20 73  har)iHeight;.  s
11720 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72  qlite3Fts3PutVar
11730 69 6e 74 28 26 70 54 72 65 65 2d 3e 61 44 61 74  int(&pTree->aDat
11740 61 5b 6e 53 74 61 72 74 2b 31 5d 2c 20 69 4c 65  a[nStart+1], iLe
11750 66 74 43 68 69 6c 64 29 3b 0a 20 20 72 65 74 75  ftChild);.  retu
11760 72 6e 20 6e 53 74 61 72 74 3b 0a 7d 0a 0a 2f 2a  rn nStart;.}../*
11770 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 62 75  .** Write the bu
11780 66 66 65 72 20 66 6f 72 20 74 68 65 20 73 65 67  ffer for the seg
11790 6d 65 6e 74 20 6e 6f 64 65 20 70 54 72 65 65 20  ment node pTree 
117a0 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 70  and all of its p
117b0 65 65 72 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64  eers to the.** d
117c0 61 74 61 62 61 73 65 2e 20 54 68 65 6e 20 63 61  atabase. Then ca
117d0 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
117e0 20 72 65 63 75 72 73 69 76 65 6c 79 20 74 6f 20   recursively to 
117f0 77 72 69 74 65 20 74 68 65 20 70 61 72 65 6e 74  write the parent
11800 20 6f 66 20 0a 2a 2a 20 70 54 72 65 65 20 61 6e   of .** pTree an
11810 64 20 69 74 73 20 70 65 65 72 73 20 74 6f 20 74  d its peers to t
11820 68 65 20 64 61 74 61 62 61 73 65 2e 20 0a 2a 2a  he database. .**
11830 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 70  .** Except, if p
11840 54 72 65 65 20 69 73 20 61 20 72 6f 6f 74 20 6e  Tree is a root n
11850 6f 64 65 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74  ode, do not writ
11860 65 20 69 74 20 74 6f 20 74 68 65 20 64 61 74 61  e it to the data
11870 62 61 73 65 2e 20 49 6e 73 74 65 61 64 2c 0a 2a  base. Instead,.*
11880 2a 20 73 65 74 20 6f 75 74 70 75 74 20 76 61 72  * set output var
11890 69 61 62 6c 65 73 20 2a 70 61 52 6f 6f 74 20 61  iables *paRoot a
118a0 6e 64 20 2a 70 6e 52 6f 6f 74 20 74 6f 20 63 6f  nd *pnRoot to co
118b0 6e 74 61 69 6e 20 74 68 65 20 72 6f 6f 74 20 6e  ntain the root n
118c0 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ode..**.** If su
118d0 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
118e0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
118f0 61 6e 64 20 6f 75 74 70 75 74 20 76 61 72 69 61  and output varia
11900 62 6c 65 20 2a 70 69 4c 61 73 74 20 69 73 0a 2a  ble *piLast is.*
11910 2a 20 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72  * set to the lar
11920 67 65 73 74 20 62 6c 6f 63 6b 69 64 20 77 72 69  gest blockid wri
11930 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
11940 62 61 73 65 20 28 6f 72 20 7a 65 72 6f 20 69 66  base (or zero if
11950 20 6e 6f 0a 2a 2a 20 62 6c 6f 63 6b 73 20 77 65   no.** blocks we
11960 72 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  re written to th
11970 65 20 64 62 29 2e 20 4f 74 68 65 72 77 69 73 65  e db). Otherwise
11980 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
11990 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65  r code is .** re
119a0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
119b0 63 20 69 6e 74 20 66 74 73 33 4e 6f 64 65 57 72  c int fts3NodeWr
119c0 69 74 65 28 0a 20 20 46 74 73 33 54 61 62 6c 65  ite(.  Fts3Table
119d0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
119e0 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61         /* Virtua
119f0 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  l table handle *
11a00 2f 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20  /.  SegmentNode 
11a10 2a 70 54 72 65 65 2c 20 20 20 20 20 20 20 20 20  *pTree,         
11a20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 4e 6f      /* SegmentNo
11a30 64 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  de handle */.  i
11a40 6e 74 20 69 48 65 69 67 68 74 2c 20 20 20 20 20  nt iHeight,     
11a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11a60 2a 20 48 65 69 67 68 74 20 6f 66 20 74 68 69 73  * Height of this
11a70 20 6e 6f 64 65 20 69 6e 20 74 72 65 65 20 2a 2f   node in tree */
11a80 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
11a90 20 69 4c 65 61 66 2c 20 20 20 20 20 20 20 20 20   iLeaf,         
11aa0 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 69 64 20 6f     /* Block id o
11ab0 66 20 66 69 72 73 74 20 6c 65 61 66 20 6e 6f 64  f first leaf nod
11ac0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
11ad0 6e 74 36 34 20 69 46 72 65 65 2c 20 20 20 20 20  nt64 iFree,     
11ae0 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20         /* Block 
11af0 69 64 20 6f 66 20 6e 65 78 74 20 66 72 65 65 20  id of next free 
11b00 73 6c 6f 74 20 69 6e 20 25 5f 73 65 67 6d 65 6e  slot in %_segmen
11b10 74 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ts */.  sqlite3_
11b20 69 6e 74 36 34 20 2a 70 69 4c 61 73 74 2c 20 20  int64 *piLast,  
11b30 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
11b40 42 6c 6f 63 6b 20 69 64 20 6f 66 20 6c 61 73 74  Block id of last
11b50 20 65 6e 74 72 79 20 77 72 69 74 74 65 6e 20 2a   entry written *
11b60 2f 0a 20 20 63 68 61 72 20 2a 2a 70 61 52 6f 6f  /.  char **paRoo
11b70 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
11b80 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 61 74 61      /* OUT: Data
11b90 20 66 6f 72 20 72 6f 6f 74 20 6e 6f 64 65 20 2a   for root node *
11ba0 2f 0a 20 20 69 6e 74 20 2a 70 6e 52 6f 6f 74 20  /.  int *pnRoot 
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bc0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65      /* OUT: Size
11bd0 20 6f 66 20 72 6f 6f 74 20 6e 6f 64 65 20 69 6e   of root node in
11be0 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69   bytes */.){.  i
11bf0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
11c00 4b 3b 0a 0a 20 20 69 66 28 20 21 70 54 72 65 65  K;..  if( !pTree
11c10 2d 3e 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  ->pParent ){.   
11c20 20 2f 2a 20 52 6f 6f 74 20 6e 6f 64 65 20 6f 66   /* Root node of
11c30 20 74 68 65 20 74 72 65 65 2e 20 2a 2f 0a 20 20   the tree. */.  
11c40 20 20 69 6e 74 20 6e 53 74 61 72 74 20 3d 20 66    int nStart = f
11c50 74 73 33 54 72 65 65 46 69 6e 69 73 68 4e 6f 64  ts3TreeFinishNod
11c60 65 28 70 54 72 65 65 2c 20 69 48 65 69 67 68 74  e(pTree, iHeight
11c70 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20 20 2a 70  , iLeaf);.    *p
11c80 69 4c 61 73 74 20 3d 20 69 46 72 65 65 2d 31 3b  iLast = iFree-1;
11c90 0a 20 20 20 20 2a 70 6e 52 6f 6f 74 20 3d 20 70  .    *pnRoot = p
11ca0 54 72 65 65 2d 3e 6e 44 61 74 61 20 2d 20 6e 53  Tree->nData - nS
11cb0 74 61 72 74 3b 0a 20 20 20 20 2a 70 61 52 6f 6f  tart;.    *paRoo
11cc0 74 20 3d 20 26 70 54 72 65 65 2d 3e 61 44 61 74  t = &pTree->aDat
11cd0 61 5b 6e 53 74 61 72 74 5d 3b 0a 20 20 7d 65 6c  a[nStart];.  }el
11ce0 73 65 7b 0a 20 20 20 20 53 65 67 6d 65 6e 74 4e  se{.    SegmentN
11cf0 6f 64 65 20 2a 70 49 74 65 72 3b 0a 20 20 20 20  ode *pIter;.    
11d00 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4e  sqlite3_int64 iN
11d10 65 78 74 46 72 65 65 20 3d 20 69 46 72 65 65 3b  extFree = iFree;
11d20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
11d30 36 34 20 69 4e 65 78 74 4c 65 61 66 20 3d 20 69  64 iNextLeaf = i
11d40 4c 65 61 66 3b 0a 20 20 20 20 66 6f 72 28 70 49  Leaf;.    for(pI
11d50 74 65 72 3d 70 54 72 65 65 2d 3e 70 4c 65 66 74  ter=pTree->pLeft
11d60 6d 6f 73 74 3b 20 70 49 74 65 72 20 26 26 20 72  most; pIter && r
11d70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 49  c==SQLITE_OK; pI
11d80 74 65 72 3d 70 49 74 65 72 2d 3e 70 52 69 67 68  ter=pIter->pRigh
11d90 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 53  t){.      int nS
11da0 74 61 72 74 20 3d 20 66 74 73 33 54 72 65 65 46  tart = fts3TreeF
11db0 69 6e 69 73 68 4e 6f 64 65 28 70 49 74 65 72 2c  inishNode(pIter,
11dc0 20 69 48 65 69 67 68 74 2c 20 69 4e 65 78 74 4c   iHeight, iNextL
11dd0 65 61 66 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  eaf);.      int 
11de0 6e 57 72 69 74 65 20 3d 20 70 49 74 65 72 2d 3e  nWrite = pIter->
11df0 6e 44 61 74 61 20 2d 20 6e 53 74 61 72 74 3b 0a  nData - nStart;.
11e00 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74    .      rc = ft
11e10 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28 70  s3WriteSegment(p
11e20 2c 20 69 4e 65 78 74 46 72 65 65 2c 20 26 70 49  , iNextFree, &pI
11e30 74 65 72 2d 3e 61 44 61 74 61 5b 6e 53 74 61 72  ter->aData[nStar
11e40 74 5d 2c 20 6e 57 72 69 74 65 29 3b 0a 20 20 20  t], nWrite);.   
11e50 20 20 20 69 4e 65 78 74 46 72 65 65 2b 2b 3b 0a     iNextFree++;.
11e60 20 20 20 20 20 20 69 4e 65 78 74 4c 65 61 66 20        iNextLeaf 
11e70 2b 3d 20 28 70 49 74 65 72 2d 3e 6e 45 6e 74 72  += (pIter->nEntr
11e80 79 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  y+1);.    }.    
11e90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11ea0 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
11eb0 74 28 20 69 4e 65 78 74 4c 65 61 66 3d 3d 69 46  t( iNextLeaf==iF
11ec0 72 65 65 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ree );.      rc 
11ed0 3d 20 66 74 73 33 4e 6f 64 65 57 72 69 74 65 28  = fts3NodeWrite(
11ee0 0a 20 20 20 20 20 20 20 20 20 20 70 2c 20 70 54  .          p, pT
11ef0 72 65 65 2d 3e 70 50 61 72 65 6e 74 2c 20 69 48  ree->pParent, iH
11f00 65 69 67 68 74 2b 31 2c 20 69 46 72 65 65 2c 20  eight+1, iFree, 
11f10 69 4e 65 78 74 46 72 65 65 2c 20 70 69 4c 61 73  iNextFree, piLas
11f20 74 2c 20 70 61 52 6f 6f 74 2c 20 70 6e 52 6f 6f  t, paRoot, pnRoo
11f30 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  t.      );.    }
11f40 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
11f50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  c;.}../*.** Free
11f60 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   all memory allo
11f70 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74  cations associat
11f80 65 64 20 77 69 74 68 20 74 68 65 20 74 72 65 65  ed with the tree
11f90 20 70 54 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69   pTree..*/.stati
11fa0 63 20 76 6f 69 64 20 66 74 73 33 4e 6f 64 65 46  c void fts3NodeF
11fb0 72 65 65 28 53 65 67 6d 65 6e 74 4e 6f 64 65 20  ree(SegmentNode 
11fc0 2a 70 54 72 65 65 29 7b 0a 20 20 69 66 28 20 70  *pTree){.  if( p
11fd0 54 72 65 65 20 29 7b 0a 20 20 20 20 53 65 67 6d  Tree ){.    Segm
11fe0 65 6e 74 4e 6f 64 65 20 2a 70 20 3d 20 70 54 72  entNode *p = pTr
11ff0 65 65 2d 3e 70 4c 65 66 74 6d 6f 73 74 3b 0a 20  ee->pLeftmost;. 
12000 20 20 20 66 74 73 33 4e 6f 64 65 46 72 65 65 28     fts3NodeFree(
12010 70 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20  p->pParent);.   
12020 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
12030 20 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a     SegmentNode *
12040 70 52 69 67 68 74 20 3d 20 70 2d 3e 70 52 69 67  pRight = p->pRig
12050 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ht;.      if( p-
12060 3e 61 44 61 74 61 21 3d 28 63 68 61 72 20 2a 29  >aData!=(char *)
12070 26 70 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20  &p[1] ){.       
12080 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
12090 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d  >aData);.      }
120a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
120b0 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e 7a  Right==0 || p->z
120c0 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 20  Malloc==0 );.   
120d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
120e0 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  p->zMalloc);.   
120f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12100 70 29 3b 0a 20 20 20 20 20 20 70 20 3d 20 70 52  p);.      p = pR
12110 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ight;.    }.  }.
12120 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 74  }../*.** Add a t
12130 65 72 6d 20 74 6f 20 74 68 65 20 73 65 67 6d 65  erm to the segme
12140 6e 74 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  nt being constru
12150 63 74 65 64 20 62 79 20 74 68 65 20 53 65 67 6d  cted by the Segm
12160 65 6e 74 57 72 69 74 65 72 20 6f 62 6a 65 63 74  entWriter object
12170 0a 2a 2a 20 2a 70 70 57 72 69 74 65 72 2e 20 57  .** *ppWriter. W
12180 68 65 6e 20 61 64 64 69 6e 67 20 74 68 65 20 66  hen adding the f
12190 69 72 73 74 20 74 65 72 6d 20 74 6f 20 61 20 73  irst term to a s
121a0 65 67 6d 65 6e 74 2c 20 2a 70 70 57 72 69 74 65  egment, *ppWrite
121b0 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 70  r should.** be p
121c0 61 73 73 65 64 20 4e 55 4c 4c 2e 20 54 68 69 73  assed NULL. This
121d0 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61   function will a
121e0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 53 65  llocate a new Se
121f0 67 6d 65 6e 74 57 72 69 74 65 72 20 6f 62 6a 65  gmentWriter obje
12200 63 74 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e  ct.** and return
12210 20 69 74 20 76 69 61 20 74 68 65 20 69 6e 70 75   it via the inpu
12220 74 2f 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  t/output variabl
12230 65 20 2a 70 70 57 72 69 74 65 72 20 69 6e 20 74  e *ppWriter in t
12240 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
12250 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
12260 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
12270 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
12280 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
12290 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
122a0 20 69 6e 74 20 66 74 73 33 53 65 67 57 72 69 74   int fts3SegWrit
122b0 65 72 41 64 64 28 0a 20 20 46 74 73 33 54 61 62  erAdd(.  Fts3Tab
122c0 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
122d0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74           /* Virt
122e0 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  ual table handle
122f0 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 57 72 69   */.  SegmentWri
12300 74 65 72 20 2a 2a 70 70 57 72 69 74 65 72 2c 20  ter **ppWriter, 
12310 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
12320 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 68   SegmentWriter h
12330 61 6e 64 6c 65 20 2a 2f 20 0a 20 20 69 6e 74 20  andle */ .  int 
12340 69 73 43 6f 70 79 54 65 72 6d 2c 20 20 20 20 20  isCopyTerm,     
12350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12360 72 75 65 20 69 66 20 62 75 66 66 65 72 20 7a 54  rue if buffer zT
12370 65 72 6d 20 6d 75 73 74 20 62 65 20 63 6f 70 69  erm must be copi
12380 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
12390 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20  ar *zTerm,      
123a0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
123b0 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e  er to buffer con
123c0 74 61 69 6e 69 6e 67 20 74 65 72 6d 20 2a 2f 0a  taining term */.
123d0 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20    int nTerm,    
123e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123f0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72    /* Size of ter
12400 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  m in bytes */.  
12410 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44 6f 63  const char *aDoc
12420 6c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  list,           
12430 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
12440 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
12450 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  doclist */.  int
12460 20 6e 44 6f 63 6c 69 73 74 20 20 20 20 20 20 20   nDoclist       
12470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12480 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20  Size of doclist 
12490 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20  in bytes */.){. 
124a0 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20 20 20   int nPrefix;   
124b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124c0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d   /* Size of term
124d0 20 70 72 65 66 69 78 20 69 6e 20 62 79 74 65 73   prefix in bytes
124e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 66 66 69   */.  int nSuffi
124f0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
12500 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
12510 20 74 65 72 6d 20 73 75 66 66 69 78 20 69 6e 20   term suffix in 
12520 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  bytes */.  int n
12530 52 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  Req;            
12540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
12550 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
12560 71 75 69 72 65 64 20 6f 6e 20 6c 65 61 66 20 70  quired on leaf p
12570 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61  age */.  int nDa
12580 74 61 3b 0a 20 20 53 65 67 6d 65 6e 74 57 72 69  ta;.  SegmentWri
12590 74 65 72 20 2a 70 57 72 69 74 65 72 20 3d 20 2a  ter *pWriter = *
125a0 70 70 57 72 69 74 65 72 3b 0a 0a 20 20 69 66 28  ppWriter;..  if(
125b0 20 21 70 57 72 69 74 65 72 20 29 7b 0a 20 20 20   !pWriter ){.   
125c0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 73 71 6c   int rc;.    sql
125d0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
125e0 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  ;..    /* Alloca
125f0 74 65 20 74 68 65 20 53 65 67 6d 65 6e 74 57 72  te the SegmentWr
12600 69 74 65 72 20 73 74 72 75 63 74 75 72 65 20 2a  iter structure *
12610 2f 0a 20 20 20 20 70 57 72 69 74 65 72 20 3d 20  /.    pWriter = 
12620 28 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 2a  (SegmentWriter *
12630 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
12640 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e 74 57 72  sizeof(SegmentWr
12650 69 74 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20  iter));.    if( 
12660 21 70 57 72 69 74 65 72 20 29 20 72 65 74 75 72  !pWriter ) retur
12670 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
12680 20 20 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74      memset(pWrit
12690 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 65  er, 0, sizeof(Se
126a0 67 6d 65 6e 74 57 72 69 74 65 72 29 29 3b 0a 20  gmentWriter));. 
126b0 20 20 20 2a 70 70 57 72 69 74 65 72 20 3d 20 70     *ppWriter = p
126c0 57 72 69 74 65 72 3b 0a 0a 20 20 20 20 2f 2a 20  Writer;..    /* 
126d0 41 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65  Allocate a buffe
126e0 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20 61 63  r in which to ac
126f0 63 75 6d 75 6c 61 74 65 20 64 61 74 61 20 2a 2f  cumulate data */
12700 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61 44  .    pWriter->aD
12710 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ata = (char *)sq
12720 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 2d 3e  lite3_malloc(p->
12730 6e 4e 6f 64 65 53 69 7a 65 29 3b 0a 20 20 20 20  nNodeSize);.    
12740 69 66 28 20 21 70 57 72 69 74 65 72 2d 3e 61 44  if( !pWriter->aD
12750 61 74 61 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ata ) return SQL
12760 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70  ITE_NOMEM;.    p
12770 57 72 69 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20  Writer->nSize = 
12780 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 3b 0a 0a 20  p->nNodeSize;.. 
12790 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e     /* Find the n
127a0 65 78 74 20 66 72 65 65 20 62 6c 6f 63 6b 69 64  ext free blockid
127b0 20 69 6e 20 74 68 65 20 25 5f 73 65 67 6d 65 6e   in the %_segmen
127c0 74 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ts table */.    
127d0 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
127e0 28 70 2c 20 53 51 4c 5f 4e 45 58 54 5f 53 45 47  (p, SQL_NEXT_SEG
127f0 4d 45 4e 54 53 5f 49 44 2c 20 26 70 53 74 6d 74  MENTS_ID, &pStmt
12800 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
12810 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
12820 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
12830 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
12840 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
12850 20 29 7b 0a 20 20 20 20 20 20 70 57 72 69 74 65   ){.      pWrite
12860 72 2d 3e 69 46 72 65 65 20 3d 20 73 71 6c 69 74  r->iFree = sqlit
12870 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
12880 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
12890 20 70 57 72 69 74 65 72 2d 3e 69 46 69 72 73 74   pWriter->iFirst
128a0 20 3d 20 70 57 72 69 74 65 72 2d 3e 69 46 72 65   = pWriter->iFre
128b0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  e;.    }.    rc 
128c0 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
128d0 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20  pStmt);.    if( 
128e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
128f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
12900 20 6e 44 61 74 61 20 3d 20 70 57 72 69 74 65 72   nData = pWriter
12910 2d 3e 6e 44 61 74 61 3b 0a 0a 20 20 6e 50 72 65  ->nData;..  nPre
12920 66 69 78 20 3d 20 66 74 73 33 50 72 65 66 69 78  fix = fts3Prefix
12930 43 6f 6d 70 72 65 73 73 28 70 57 72 69 74 65 72  Compress(pWriter
12940 2d 3e 7a 54 65 72 6d 2c 20 70 57 72 69 74 65 72  ->zTerm, pWriter
12950 2d 3e 6e 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20  ->nTerm, zTerm, 
12960 6e 54 65 72 6d 29 3b 0a 20 20 6e 53 75 66 66 69  nTerm);.  nSuffi
12970 78 20 3d 20 6e 54 65 72 6d 2d 6e 50 72 65 66 69  x = nTerm-nPrefi
12980 78 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  x;..  /* Figure 
12990 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74  out how many byt
129a0 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  es are required 
129b0 62 79 20 74 68 69 73 20 6e 65 77 20 65 6e 74 72  by this new entr
129c0 79 20 2a 2f 0a 20 20 6e 52 65 71 20 3d 20 73 71  y */.  nReq = sq
129d0 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c  lite3Fts3VarintL
129e0 65 6e 28 6e 50 72 65 66 69 78 29 20 2b 20 20 20  en(nPrefix) +   
129f0 20 2f 2a 20 76 61 72 69 6e 74 20 63 6f 6e 74 61   /* varint conta
12a00 69 6e 69 6e 67 20 70 72 65 66 69 78 20 73 69 7a  ining prefix siz
12a10 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
12a20 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 53  Fts3VarintLen(nS
12a30 75 66 66 69 78 29 20 2b 20 20 20 20 20 20 20 20  uffix) +        
12a40 20 2f 2a 20 76 61 72 69 6e 74 20 63 6f 6e 74 61   /* varint conta
12a50 69 6e 69 6e 67 20 73 75 66 66 69 78 20 73 69 7a  ining suffix siz
12a60 65 20 2a 2f 0a 20 20 20 20 6e 53 75 66 66 69 78  e */.    nSuffix
12a70 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
12a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a90 20 2f 2a 20 54 65 72 6d 20 73 75 66 66 69 78 20   /* Term suffix 
12aa0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  */.    sqlite3Ft
12ab0 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 44 6f 63  s3VarintLen(nDoc
12ac0 6c 69 73 74 29 20 2b 20 20 20 20 20 20 20 20 2f  list) +        /
12ad0 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73  * Size of doclis
12ae0 74 20 2a 2f 0a 20 20 20 20 6e 44 6f 63 6c 69 73  t */.    nDoclis
12af0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
12b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b10 20 2f 2a 20 44 6f 63 6c 69 73 74 20 64 61 74 61   /* Doclist data
12b20 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 44 61 74 61   */..  if( nData
12b30 3e 30 20 26 26 20 6e 44 61 74 61 2b 6e 52 65 71  >0 && nData+nReq
12b40 3e 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 29 7b  >p->nNodeSize ){
12b50 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  .    int rc;..  
12b60 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74    /* The current
12b70 20 6c 65 61 66 20 6e 6f 64 65 20 69 73 20 66 75   leaf node is fu
12b80 6c 6c 2e 20 57 72 69 74 65 20 69 74 20 6f 75 74  ll. Write it out
12b90 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
12ba0 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74  . */.    rc = ft
12bb0 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28 70  s3WriteSegment(p
12bc0 2c 20 70 57 72 69 74 65 72 2d 3e 69 46 72 65 65  , pWriter->iFree
12bd0 2b 2b 2c 20 70 57 72 69 74 65 72 2d 3e 61 44 61  ++, pWriter->aDa
12be0 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 20 20  ta, nData);.    
12bf0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12c00 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
12c10 20 20 20 70 2d 3e 6e 4c 65 61 66 41 64 64 2b 2b     p->nLeafAdd++
12c20 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  ;..    /* Add th
12c30 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 74  e current term t
12c40 6f 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e  o the interior n
12c50 6f 64 65 20 74 72 65 65 2e 20 54 68 65 20 74 65  ode tree. The te
12c60 72 6d 20 61 64 64 65 64 20 74 6f 0a 20 20 20 20  rm added to.    
12c70 2a 2a 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20  ** the interior 
12c80 74 72 65 65 20 6d 75 73 74 3a 0a 20 20 20 20 2a  tree must:.    *
12c90 2a 0a 20 20 20 20 2a 2a 20 20 20 61 29 20 62 65  *.    **   a) be
12ca0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
12cb0 65 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20 6f  e largest term o
12cc0 6e 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20  n the leaf node 
12cd0 6a 75 73 74 20 77 72 69 74 74 65 6e 0a 20 20 20  just written.   
12ce0 20 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20   **      to the 
12cf0 64 61 74 61 62 61 73 65 20 28 73 74 69 6c 6c 20  database (still 
12d00 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 57 72  available in pWr
12d10 69 74 65 72 2d 3e 7a 54 65 72 6d 29 2c 20 61 6e  iter->zTerm), an
12d20 64 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  d.    **.    ** 
12d30 20 20 62 29 20 62 65 20 6c 65 73 73 20 74 68 61    b) be less tha
12d40 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
12d50 65 20 74 65 72 6d 20 61 62 6f 75 74 20 74 6f 20  e term about to 
12d60 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
12d70 6e 65 77 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  new.    **      
12d80 6c 65 61 66 20 6e 6f 64 65 20 28 7a 54 65 72 6d  leaf node (zTerm
12d90 2f 6e 54 65 72 6d 29 2e 0a 20 20 20 20 2a 2a 0a  /nTerm)..    **.
12da0 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65 72 20      ** In other 
12db0 77 6f 72 64 73 2c 20 69 74 20 6d 75 73 74 20 62  words, it must b
12dc0 65 20 74 68 65 20 70 72 65 66 69 78 20 6f 66 20  e the prefix of 
12dd0 7a 54 65 72 6d 20 31 20 62 79 74 65 20 6c 6f 6e  zTerm 1 byte lon
12de0 67 65 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ger than.    ** 
12df0 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69  the common prefi
12e00 78 20 28 69 66 20 61 6e 79 29 20 6f 66 20 7a 54  x (if any) of zT
12e10 65 72 6d 20 61 6e 64 20 70 57 72 69 74 65 72 2d  erm and pWriter-
12e20 3e 7a 54 65 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20  >zTerm..    */. 
12e30 20 20 20 61 73 73 65 72 74 28 20 6e 50 72 65 66     assert( nPref
12e40 69 78 3c 6e 54 65 72 6d 20 29 3b 0a 20 20 20 20  ix<nTerm );.    
12e50 72 63 20 3d 20 66 74 73 33 4e 6f 64 65 41 64 64  rc = fts3NodeAdd
12e60 54 65 72 6d 28 70 2c 20 26 70 57 72 69 74 65 72  Term(p, &pWriter
12e70 2d 3e 70 54 72 65 65 2c 20 69 73 43 6f 70 79 54  ->pTree, isCopyT
12e80 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 50 72 65  erm, zTerm, nPre
12e90 66 69 78 2b 31 29 3b 0a 20 20 20 20 69 66 28 20  fix+1);.    if( 
12ea0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
12eb0 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
12ec0 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70  nData = 0;.    p
12ed0 57 72 69 74 65 72 2d 3e 6e 54 65 72 6d 20 3d 20  Writer->nTerm = 
12ee0 30 3b 0a 0a 20 20 20 20 6e 50 72 65 66 69 78 20  0;..    nPrefix 
12ef0 3d 20 30 3b 0a 20 20 20 20 6e 53 75 66 66 69 78  = 0;.    nSuffix
12f00 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 6e 52   = nTerm;.    nR
12f10 65 71 20 3d 20 31 20 2b 20 20 20 20 20 20 20 20  eq = 1 +        
12f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f30 20 20 20 20 20 20 2f 2a 20 76 61 72 69 6e 74 20        /* varint 
12f40 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69  containing prefi
12f50 78 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  x size */.      
12f60 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e  sqlite3Fts3Varin
12f70 74 4c 65 6e 28 6e 54 65 72 6d 29 20 2b 20 20 20  tLen(nTerm) +   
12f80 20 20 20 20 20 20 2f 2a 20 76 61 72 69 6e 74 20        /* varint 
12f90 63 6f 6e 74 61 69 6e 69 6e 67 20 73 75 66 66 69  containing suffi
12fa0 78 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  x size */.      
12fb0 6e 54 65 72 6d 20 2b 20 20 20 20 20 20 20 20 20  nTerm +         
12fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fd0 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 73 75        /* Term su
12fe0 66 66 69 78 20 2a 2f 0a 20 20 20 20 20 20 73 71  ffix */.      sq
12ff0 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c  lite3Fts3VarintL
13000 65 6e 28 6e 44 6f 63 6c 69 73 74 29 20 2b 20 20  en(nDoclist) +  
13010 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
13020 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20  oclist */.      
13030 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20  nDoclist;       
13040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13050 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74        /* Doclist
13060 20 64 61 74 61 20 2a 2f 0a 20 20 7d 0a 0a 20 20   data */.  }..  
13070 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20  /* Increase the 
13080 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
13090 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 74 6f  bytes written to
130a0 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65   account for the
130b0 20 6e 65 77 20 65 6e 74 72 79 2e 20 2a 2f 0a 20   new entry. */. 
130c0 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44   pWriter->nLeafD
130d0 61 74 61 20 2b 3d 20 6e 52 65 71 3b 0a 0a 20 20  ata += nReq;..  
130e0 2f 2a 20 49 66 20 74 68 65 20 62 75 66 66 65 72  /* If the buffer
130f0 20 63 75 72 72 65 6e 74 6c 79 20 61 6c 6c 6f 63   currently alloc
13100 61 74 65 64 20 69 73 20 74 6f 6f 20 73 6d 61 6c  ated is too smal
13110 6c 20 66 6f 72 20 74 68 69 73 20 65 6e 74 72 79  l for this entry
13120 2c 20 72 65 61 6c 6c 6f 63 0a 20 20 2a 2a 20 74  , realloc.  ** t
13130 68 65 20 62 75 66 66 65 72 20 74 6f 20 6d 61 6b  he buffer to mak
13140 65 20 69 74 20 6c 61 72 67 65 20 65 6e 6f 75 67  e it large enoug
13150 68 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 52  h..  */.  if( nR
13160 65 71 3e 70 57 72 69 74 65 72 2d 3e 6e 53 69 7a  eq>pWriter->nSiz
13170 65 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 61  e ){.    char *a
13180 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  New = sqlite3_re
13190 61 6c 6c 6f 63 28 70 57 72 69 74 65 72 2d 3e 61  alloc(pWriter->a
131a0 44 61 74 61 2c 20 6e 52 65 71 29 3b 0a 20 20 20  Data, nReq);.   
131b0 20 69 66 28 20 21 61 4e 65 77 20 29 20 72 65 74   if( !aNew ) ret
131c0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
131d0 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61  ;.    pWriter->a
131e0 44 61 74 61 20 3d 20 61 4e 65 77 3b 0a 20 20 20  Data = aNew;.   
131f0 20 70 57 72 69 74 65 72 2d 3e 6e 53 69 7a 65 20   pWriter->nSize 
13200 3d 20 6e 52 65 71 3b 0a 20 20 7d 0a 20 20 61 73  = nReq;.  }.  as
13210 73 65 72 74 28 20 6e 44 61 74 61 2b 6e 52 65 71  sert( nData+nReq
13220 3c 3d 70 57 72 69 74 65 72 2d 3e 6e 53 69 7a 65  <=pWriter->nSize
13230 20 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64   );..  /* Append
13240 20 74 68 65 20 70 72 65 66 69 78 2d 63 6f 6d 70   the prefix-comp
13250 72 65 73 73 65 64 20 74 65 72 6d 20 61 6e 64 20  ressed term and 
13260 64 6f 63 6c 69 73 74 20 74 6f 20 74 68 65 20 62  doclist to the b
13270 75 66 66 65 72 2e 20 2a 2f 0a 20 20 6e 44 61 74  uffer. */.  nDat
13280 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  a += sqlite3Fts3
13290 50 75 74 56 61 72 69 6e 74 28 26 70 57 72 69 74  PutVarint(&pWrit
132a0 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d  er->aData[nData]
132b0 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 6e 44  , nPrefix);.  nD
132c0 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ata += sqlite3Ft
132d0 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 57 72  s3PutVarint(&pWr
132e0 69 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74  iter->aData[nDat
132f0 61 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20  a], nSuffix);.  
13300 6d 65 6d 63 70 79 28 26 70 57 72 69 74 65 72 2d  memcpy(&pWriter-
13310 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 26  >aData[nData], &
13320 7a 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 2c 20  zTerm[nPrefix], 
13330 6e 53 75 66 66 69 78 29 3b 0a 20 20 6e 44 61 74  nSuffix);.  nDat
13340 61 20 2b 3d 20 6e 53 75 66 66 69 78 3b 0a 20 20  a += nSuffix;.  
13350 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 33  nData += sqlite3
13360 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70  Fts3PutVarint(&p
13370 57 72 69 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44  Writer->aData[nD
13380 61 74 61 5d 2c 20 6e 44 6f 63 6c 69 73 74 29 3b  ata], nDoclist);
13390 0a 20 20 6d 65 6d 63 70 79 28 26 70 57 72 69 74  .  memcpy(&pWrit
133a0 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d  er->aData[nData]
133b0 2c 20 61 44 6f 63 6c 69 73 74 2c 20 6e 44 6f 63  , aDoclist, nDoc
133c0 6c 69 73 74 29 3b 0a 20 20 70 57 72 69 74 65 72  list);.  pWriter
133d0 2d 3e 6e 44 61 74 61 20 3d 20 6e 44 61 74 61 20  ->nData = nData 
133e0 2b 20 6e 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 2f  + nDoclist;..  /
133f0 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65  * Save the curre
13400 6e 74 20 74 65 72 6d 20 73 6f 20 74 68 61 74 20  nt term so that 
13410 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  it can be used t
13420 6f 20 70 72 65 66 69 78 2d 63 6f 6d 70 72 65 73  o prefix-compres
13430 73 20 74 68 65 20 6e 65 78 74 2e 0a 20 20 2a 2a  s the next..  **
13440 20 49 66 20 74 68 65 20 69 73 43 6f 70 79 54 65   If the isCopyTe
13450 72 6d 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  rm parameter is 
13460 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 62  true, then the b
13470 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
13480 20 62 79 0a 20 20 2a 2a 20 7a 54 65 72 6d 20 69   by.  ** zTerm i
13490 73 20 74 72 61 6e 73 69 65 6e 74 2c 20 73 6f 20  s transient, so 
134a0 74 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  take a copy of t
134b0 68 65 20 74 65 72 6d 20 64 61 74 61 2e 20 4f 74  he term data. Ot
134c0 68 65 72 77 69 73 65 2c 20 6a 75 73 74 0a 20 20  herwise, just.  
134d0 2a 2a 20 73 74 6f 72 65 20 61 20 63 6f 70 79 20  ** store a copy 
134e0 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a  of the pointer..
134f0 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 43 6f 70    */.  if( isCop
13500 79 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28  yTerm ){.    if(
13510 20 6e 54 65 72 6d 3e 70 57 72 69 74 65 72 2d 3e   nTerm>pWriter->
13520 6e 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  nMalloc ){.     
13530 20 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20 73 71   char *zNew = sq
13540 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 57  lite3_realloc(pW
13550 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c 6f 63 2c 20  riter->zMalloc, 
13560 6e 54 65 72 6d 2a 32 29 3b 0a 20 20 20 20 20 20  nTerm*2);.      
13570 69 66 28 20 21 7a 4e 65 77 20 29 7b 0a 20 20 20  if( !zNew ){.   
13580 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
13590 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
135a0 7d 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d  }.      pWriter-
135b0 3e 6e 4d 61 6c 6c 6f 63 20 3d 20 6e 54 65 72 6d  >nMalloc = nTerm
135c0 2a 32 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65  *2;.      pWrite
135d0 72 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 7a 4e 65  r->zMalloc = zNe
135e0 77 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72  w;.      pWriter
135f0 2d 3e 7a 54 65 72 6d 20 3d 20 7a 4e 65 77 3b 0a  ->zTerm = zNew;.
13600 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
13610 28 20 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d  ( pWriter->zTerm
13620 3d 3d 70 57 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c  ==pWriter->zMall
13630 6f 63 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  oc );.    memcpy
13640 28 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d 2c  (pWriter->zTerm,
13650 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   zTerm, nTerm);.
13660 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 72    }else{.    pWr
13670 69 74 65 72 2d 3e 7a 54 65 72 6d 20 3d 20 28 63  iter->zTerm = (c
13680 68 61 72 20 2a 29 7a 54 65 72 6d 3b 0a 20 20 7d  har *)zTerm;.  }
13690 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 54 65 72  .  pWriter->nTer
136a0 6d 20 3d 20 6e 54 65 72 6d 3b 0a 0a 20 20 72 65  m = nTerm;..  re
136b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
136c0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61  }../*.** Flush a
136d0 6c 6c 20 64 61 74 61 20 61 73 73 6f 63 69 61 74  ll data associat
136e0 65 64 20 77 69 74 68 20 74 68 65 20 53 65 67 6d  ed with the Segm
136f0 65 6e 74 57 72 69 74 65 72 20 6f 62 6a 65 63 74  entWriter object
13700 20 70 57 72 69 74 65 72 20 74 6f 20 74 68 65 0a   pWriter to the.
13710 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ** database. Thi
13720 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  s function must 
13730 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
13740 61 6c 6c 20 74 65 72 6d 73 20 68 61 76 65 20 62  all terms have b
13750 65 65 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20  een added.** to 
13760 74 68 65 20 73 65 67 6d 65 6e 74 20 75 73 69 6e  the segment usin
13770 67 20 66 74 73 33 53 65 67 57 72 69 74 65 72 41  g fts3SegWriterA
13780 64 64 28 29 2e 20 49 66 20 73 75 63 63 65 73 73  dd(). If success
13790 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
137a0 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f  s.** returned. O
137b0 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c  therwise, an SQL
137c0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
137d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
137e0 73 33 53 65 67 57 72 69 74 65 72 46 6c 75 73 68  s3SegWriterFlush
137f0 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
13800 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13810 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74      /* Virtual t
13820 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
13830 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 2a   SegmentWriter *
13840 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20  pWriter,        
13850 20 2f 2a 20 53 65 67 6d 65 6e 74 57 72 69 74 65   /* SegmentWrite
13860 72 20 74 6f 20 66 6c 75 73 68 20 74 6f 20 74 68  r to flush to th
13870 65 20 64 62 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e db */.  sqlite
13880 33 5f 69 6e 74 36 34 20 69 4c 65 76 65 6c 2c 20  3_int64 iLevel, 
13890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
138a0 75 65 20 66 6f 72 20 27 6c 65 76 65 6c 27 20 63  ue for 'level' c
138b0 6f 6c 75 6d 6e 20 6f 66 20 25 5f 73 65 67 64 69  olumn of %_segdi
138c0 72 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20  r */.  int iIdx 
138d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138e0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
138f0 66 6f 72 20 27 69 64 78 27 20 63 6f 6c 75 6d 6e  for 'idx' column
13900 20 6f 66 20 25 5f 73 65 67 64 69 72 20 2a 2f 0a   of %_segdir */.
13910 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
13920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13930 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
13940 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20 70 57 72  ode */.  if( pWr
13950 69 74 65 72 2d 3e 70 54 72 65 65 20 29 7b 0a 20  iter->pTree ){. 
13960 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
13970 20 69 4c 61 73 74 20 3d 20 30 3b 20 20 20 20 20   iLast = 0;     
13980 20 2f 2a 20 4c 61 72 67 65 73 74 20 62 6c 6f 63   /* Largest bloc
13990 6b 20 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20  k id written to 
139a0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
139b0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c  sqlite3_int64 iL
139c0 61 73 74 4c 65 61 66 3b 20 20 20 20 20 20 2f 2a  astLeaf;      /*
139d0 20 4c 61 72 67 65 73 74 20 6c 65 61 66 20 62 6c   Largest leaf bl
139e0 6f 63 6b 20 69 64 20 77 72 69 74 74 65 6e 20 74  ock id written t
139f0 6f 20 64 62 20 2a 2f 0a 20 20 20 20 63 68 61 72  o db */.    char
13a00 20 2a 7a 52 6f 6f 74 20 3d 20 4e 55 4c 4c 3b 20   *zRoot = NULL; 
13a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
13a20 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
13a30 6f 6e 74 61 69 6e 69 6e 67 20 72 6f 6f 74 20 6e  ontaining root n
13a40 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ode */.    int n
13a50 52 6f 6f 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Root = 0;       
13a60 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
13a70 20 6f 66 20 62 75 66 66 65 72 20 7a 52 6f 6f 74   of buffer zRoot
13a80 20 2a 2f 0a 0a 20 20 20 20 69 4c 61 73 74 4c 65   */..    iLastLe
13a90 61 66 20 3d 20 70 57 72 69 74 65 72 2d 3e 69 46  af = pWriter->iF
13aa0 72 65 65 3b 0a 20 20 20 20 72 63 20 3d 20 66 74  ree;.    rc = ft
13ab0 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28 70  s3WriteSegment(p
13ac0 2c 20 70 57 72 69 74 65 72 2d 3e 69 46 72 65 65  , pWriter->iFree
13ad0 2b 2b 2c 20 70 57 72 69 74 65 72 2d 3e 61 44 61  ++, pWriter->aDa
13ae0 74 61 2c 20 70 57 72 69 74 65 72 2d 3e 6e 44 61  ta, pWriter->nDa
13af0 74 61 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ta);.    if( rc=
13b00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13b10 20 20 20 20 72 63 20 3d 20 66 74 73 33 4e 6f 64      rc = fts3Nod
13b20 65 57 72 69 74 65 28 70 2c 20 70 57 72 69 74 65  eWrite(p, pWrite
13b30 72 2d 3e 70 54 72 65 65 2c 20 31 2c 0a 20 20 20  r->pTree, 1,.   
13b40 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e         pWriter->
13b50 69 46 69 72 73 74 2c 20 70 57 72 69 74 65 72 2d  iFirst, pWriter-
13b60 3e 69 46 72 65 65 2c 20 26 69 4c 61 73 74 2c 20  >iFree, &iLast, 
13b70 26 7a 52 6f 6f 74 2c 20 26 6e 52 6f 6f 74 29 3b  &zRoot, &nRoot);
13b80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
13b90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13ba0 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 57        rc = fts3W
13bb0 72 69 74 65 53 65 67 64 69 72 28 70 2c 20 69 4c  riteSegdir(p, iL
13bc0 65 76 65 6c 2c 20 69 49 64 78 2c 20 0a 20 20 20  evel, iIdx, .   
13bd0 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e         pWriter->
13be0 69 46 69 72 73 74 2c 20 69 4c 61 73 74 4c 65 61  iFirst, iLastLea
13bf0 66 2c 20 69 4c 61 73 74 2c 20 70 57 72 69 74 65  f, iLast, pWrite
13c00 72 2d 3e 6e 4c 65 61 66 44 61 74 61 2c 20 7a 52  r->nLeafData, zR
13c10 6f 6f 74 2c 20 6e 52 6f 6f 74 29 3b 0a 20 20 20  oot, nRoot);.   
13c20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
13c30 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 74 72  /* The entire tr
13c40 65 65 20 66 69 74 73 20 6f 6e 20 74 68 65 20 72  ee fits on the r
13c50 6f 6f 74 20 6e 6f 64 65 2e 20 57 72 69 74 65 20  oot node. Write 
13c60 69 74 20 74 6f 20 74 68 65 20 73 65 67 64 69 72  it to the segdir
13c70 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 72   table. */.    r
13c80 63 20 3d 20 66 74 73 33 57 72 69 74 65 53 65 67  c = fts3WriteSeg
13c90 64 69 72 28 70 2c 20 69 4c 65 76 65 6c 2c 20 69  dir(p, iLevel, i
13ca0 49 64 78 2c 20 0a 20 20 20 20 20 20 20 20 30 2c  Idx, .        0,
13cb0 20 30 2c 20 30 2c 20 70 57 72 69 74 65 72 2d 3e   0, 0, pWriter->
13cc0 6e 4c 65 61 66 44 61 74 61 2c 20 70 57 72 69 74  nLeafData, pWrit
13cd0 65 72 2d 3e 61 44 61 74 61 2c 20 70 57 72 69 74  er->aData, pWrit
13ce0 65 72 2d 3e 6e 44 61 74 61 29 3b 0a 20 20 7d 0a  er->nData);.  }.
13cf0 20 20 70 2d 3e 6e 4c 65 61 66 41 64 64 2b 2b 3b    p->nLeafAdd++;
13d00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13d10 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
13d20 6c 6c 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62  ll memory held b
13d30 79 20 74 68 65 20 53 65 67 6d 65 6e 74 57 72 69  y the SegmentWri
13d40 74 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ter object passe
13d50 64 20 61 73 20 74 68 65 20 0a 2a 2a 20 66 69 72  d as the .** fir
13d60 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  st argument..*/.
13d70 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
13d80 53 65 67 57 72 69 74 65 72 46 72 65 65 28 53 65  SegWriterFree(Se
13d90 67 6d 65 6e 74 57 72 69 74 65 72 20 2a 70 57 72  gmentWriter *pWr
13da0 69 74 65 72 29 7b 0a 20 20 69 66 28 20 70 57 72  iter){.  if( pWr
13db0 69 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  iter ){.    sqli
13dc0 74 65 33 5f 66 72 65 65 28 70 57 72 69 74 65 72  te3_free(pWriter
13dd0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 73 71  ->aData);.    sq
13de0 6c 69 74 65 33 5f 66 72 65 65 28 70 57 72 69 74  lite3_free(pWrit
13df0 65 72 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20  er->zMalloc);.  
13e00 20 20 66 74 73 33 4e 6f 64 65 46 72 65 65 28 70    fts3NodeFree(p
13e10 57 72 69 74 65 72 2d 3e 70 54 72 65 65 29 3b 0a  Writer->pTree);.
13e20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13e30 28 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 7d  (pWriter);.  }.}
13e40 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
13e50 74 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61  t value in the a
13e60 70 56 61 6c 5b 5d 20 61 72 72 61 79 20 69 73 20  pVal[] array is 
13e70 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61  assumed to conta
13e80 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a  in an integer..*
13e90 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
13ea0 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20 65  tests if there e
13eb0 78 69 73 74 20 61 6e 79 20 64 6f 63 75 6d 65 6e  xist any documen
13ec0 74 73 20 77 69 74 68 20 64 6f 63 69 64 20 76 61  ts with docid va
13ed0 6c 75 65 73 20 74 68 61 74 0a 2a 2a 20 61 72 65  lues that.** are
13ee0 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
13ef0 74 68 61 74 20 69 6e 74 65 67 65 72 2e 20 69 2e  that integer. i.
13f00 65 2e 20 69 66 20 64 65 6c 65 74 69 6e 67 20 74  e. if deleting t
13f10 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68  he document with
13f20 20 64 6f 63 69 64 0a 2a 2a 20 70 52 6f 77 69 64   docid.** pRowid
13f30 20 77 6f 75 6c 64 20 6d 65 61 6e 20 74 68 65 20   would mean the 
13f40 46 54 53 33 20 74 61 62 6c 65 20 77 65 72 65 20  FTS3 table were 
13f50 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  empty..**.** If 
13f60 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 69 73  successful, *pis
13f70 45 6d 70 74 79 20 69 73 20 73 65 74 20 74 6f 20  Empty is set to 
13f80 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62 6c  true if the tabl
13f90 65 20 69 73 20 65 6d 70 74 79 20 65 78 63 65 70  e is empty excep
13fa0 74 20 66 6f 72 0a 2a 2a 20 64 6f 63 75 6d 65 6e  t for.** documen
13fb0 74 20 70 52 6f 77 69 64 2c 20 6f 72 20 66 61 6c  t pRowid, or fal
13fc0 73 65 20 6f 74 68 65 72 77 69 73 65 2c 20 61 6e  se otherwise, an
13fd0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  d SQLITE_OK is r
13fe0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 0a 2a  eturned. If an.*
13ff0 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  * error occurs, 
14000 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
14010 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
14020 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14030 66 74 73 33 49 73 45 6d 70 74 79 28 46 74 73 33  fts3IsEmpty(Fts3
14040 54 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74 65  Table *p, sqlite
14050 33 5f 76 61 6c 75 65 20 2a 70 52 6f 77 69 64 2c  3_value *pRowid,
14060 20 69 6e 74 20 2a 70 69 73 45 6d 70 74 79 29 7b   int *pisEmpty){
14070 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
14080 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63  *pStmt;.  int rc
14090 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 43 6f 6e 74  ;.  if( p->zCont
140a0 65 6e 74 54 62 6c 20 29 7b 0a 20 20 20 20 2f 2a  entTbl ){.    /*
140b0 20 49 66 20 75 73 69 6e 67 20 74 68 65 20 63 6f   If using the co
140c0 6e 74 65 6e 74 3d 78 78 78 20 6f 70 74 69 6f 6e  ntent=xxx option
140d0 2c 20 61 73 73 75 6d 65 20 74 68 65 20 74 61 62  , assume the tab
140e0 6c 65 20 69 73 20 6e 65 76 65 72 20 65 6d 70 74  le is never empt
140f0 79 20 2a 2f 0a 20 20 20 20 2a 70 69 73 45 6d 70  y */.    *pisEmp
14100 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  ty = 0;.    rc =
14110 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
14120 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  lse{.    rc = ft
14130 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
14140 5f 49 53 5f 45 4d 50 54 59 2c 20 26 70 53 74 6d  _IS_EMPTY, &pStm
14150 74 2c 20 26 70 52 6f 77 69 64 29 3b 0a 20 20 20  t, &pRowid);.   
14160 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14170 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
14180 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
14190 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
141a0 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 69 73 45  ){.        *pisE
141b0 6d 70 74 79 20 3d 20 73 71 6c 69 74 65 33 5f 63  mpty = sqlite3_c
141c0 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
141d0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
141e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
141f0 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
14200 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
14210 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
14220 74 20 2a 70 6e 4d 61 78 20 74 6f 20 74 68 65 20  t *pnMax to the 
14230 6c 61 72 67 65 73 74 20 73 65 67 6d 65 6e 74 20  largest segment 
14240 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 64 61 74  level in the dat
14250 61 62 61 73 65 20 66 6f 72 20 74 68 65 20 69 6e  abase for the in
14260 64 65 78 0a 2a 2a 20 69 49 6e 64 65 78 2e 0a 2a  dex.** iIndex..*
14270 2a 0a 2a 2a 20 53 65 67 6d 65 6e 74 20 6c 65 76  *.** Segment lev
14280 65 6c 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  els are stored i
14290 6e 20 74 68 65 20 27 6c 65 76 65 6c 27 20 63 6f  n the 'level' co
142a0 6c 75 6d 6e 20 6f 66 20 74 68 65 20 25 5f 73 65  lumn of the %_se
142b0 67 64 69 72 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  gdir table..**.*
142c0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
142d0 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
142e0 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  , or an SQLite e
142f0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6e 6f 74  rror code if not
14300 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14310 66 74 73 33 53 65 67 6d 65 6e 74 4d 61 78 4c 65  fts3SegmentMaxLe
14320 76 65 6c 28 0a 20 20 46 74 73 33 54 61 62 6c 65  vel(.  Fts3Table
14330 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 4c 61 6e   *p, .  int iLan
14340 67 69 64 2c 0a 20 20 69 6e 74 20 69 49 6e 64 65  gid,.  int iInde
14350 78 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  x, .  sqlite3_in
14360 74 36 34 20 2a 70 6e 4d 61 78 0a 29 7b 0a 20 20  t64 *pnMax.){.  
14370 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
14380 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  tmt;.  int rc;. 
14390 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 3e   assert( iIndex>
143a0 3d 30 20 26 26 20 69 49 6e 64 65 78 3c 70 2d 3e  =0 && iIndex<p->
143b0 6e 49 6e 64 65 78 20 29 3b 0a 0a 20 20 2f 2a 20  nIndex );..  /* 
143c0 53 65 74 20 70 53 74 6d 74 20 74 6f 20 74 68 65  Set pStmt to the
143d0 20 63 6f 6d 70 69 6c 65 64 20 76 65 72 73 69 6f   compiled versio
143e0 6e 20 6f 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  n of:.  **.  ** 
143f0 20 20 53 45 4c 45 43 54 20 6d 61 78 28 6c 65 76    SELECT max(lev
14400 65 6c 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  el) FROM %Q.'%q_
14410 73 65 67 64 69 72 27 20 57 48 45 52 45 20 6c 65  segdir' WHERE le
14420 76 65 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e  vel BETWEEN ? AN
14430 44 20 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 31  D ?.  **.  ** (1
14440 30 32 34 20 69 73 20 61 63 74 75 61 6c 6c 79 20  024 is actually 
14450 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 61 63  the value of mac
14460 72 6f 20 46 54 53 33 5f 53 45 47 44 49 52 5f 50  ro FTS3_SEGDIR_P
14470 52 45 46 49 58 4c 45 56 45 4c 5f 53 54 52 29 2e  REFIXLEVEL_STR).
14480 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73  .  */.  rc = fts
14490 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
144a0 53 45 4c 45 43 54 5f 53 45 47 44 49 52 5f 4d 41  SELECT_SEGDIR_MA
144b0 58 5f 4c 45 56 45 4c 2c 20 26 70 53 74 6d 74 2c  X_LEVEL, &pStmt,
144c0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
144d0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
144e0 6e 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  n rc;.  sqlite3_
144f0 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
14500 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c 75 74 65  , 1, getAbsolute
14510 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64  Level(p, iLangid
14520 2c 20 69 49 6e 64 65 78 2c 20 30 29 29 3b 0a 20  , iIndex, 0));. 
14530 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
14540 74 36 34 28 70 53 74 6d 74 2c 20 32 2c 20 0a 20  t64(pStmt, 2, . 
14550 20 20 20 20 20 67 65 74 41 62 73 6f 6c 75 74 65       getAbsolute
14560 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64  Level(p, iLangid
14570 2c 20 69 49 6e 64 65 78 2c 20 46 54 53 33 5f 53  , iIndex, FTS3_S
14580 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 2d 31  EGDIR_MAXLEVEL-1
14590 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  ).  );.  if( SQL
145a0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
145b0 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
145c0 20 20 20 20 2a 70 6e 4d 61 78 20 3d 20 73 71 6c      *pnMax = sql
145d0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
145e0 34 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d  4(pStmt, 0);.  }
145f0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
14600 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
14610 7d 0a 0a 2f 2a 0a 2a 2a 20 69 41 62 73 4c 65 76  }../*.** iAbsLev
14620 65 6c 20 69 73 20 61 6e 20 61 62 73 6f 6c 75 74  el is an absolut
14630 65 20 6c 65 76 65 6c 20 74 68 61 74 20 6d 61 79  e level that may
14640 20 62 65 20 61 73 73 75 6d 65 64 20 74 6f 20 65   be assumed to e
14650 78 69 73 74 20 77 69 74 68 69 6e 0a 2a 2a 20 74  xist within.** t
14660 68 65 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  he database. Thi
14670 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b  s function check
14680 73 20 69 66 20 69 74 20 69 73 20 74 68 65 20 6c  s if it is the l
14690 61 72 67 65 73 74 20 6c 65 76 65 6c 20 6e 75 6d  argest level num
146a0 62 65 72 0a 2a 2a 20 77 69 74 68 69 6e 20 69 74  ber.** within it
146b0 73 20 69 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e  s index. Assumin
146c0 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  g no error occur
146d0 73 2c 20 2a 70 62 4d 61 78 20 69 73 20 73 65 74  s, *pbMax is set
146e0 20 74 6f 20 31 20 69 66 0a 2a 2a 20 69 41 62 73   to 1 if.** iAbs
146f0 4c 65 76 65 6c 20 69 73 20 69 6e 64 65 65 64 20  Level is indeed 
14700 74 68 65 20 6c 61 72 67 65 73 74 20 6c 65 76 65  the largest leve
14710 6c 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69 73  l, or 0 otherwis
14720 65 2c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  e, and SQLITE_OK
14730 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
14740 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
14750 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
14760 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
14770 6e 64 20 74 68 65 0a 2a 2a 20 66 69 6e 61 6c 20  nd the.** final 
14780 76 61 6c 75 65 20 6f 66 20 2a 70 62 4d 61 78 20  value of *pbMax 
14790 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  is undefined..*/
147a0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
147b0 53 65 67 6d 65 6e 74 49 73 4d 61 78 4c 65 76 65  SegmentIsMaxLeve
147c0 6c 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20  l(Fts3Table *p, 
147d0 69 36 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 69  i64 iAbsLevel, i
147e0 6e 74 20 2a 70 62 4d 61 78 29 7b 0a 0a 20 20 2f  nt *pbMax){..  /
147f0 2a 20 53 65 74 20 70 53 74 6d 74 20 74 6f 20 74  * Set pStmt to t
14800 68 65 20 63 6f 6d 70 69 6c 65 64 20 76 65 72 73  he compiled vers
14810 69 6f 6e 20 6f 66 3a 0a 20 20 2a 2a 0a 20 20 2a  ion of:.  **.  *
14820 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 6c  *   SELECT max(l
14830 65 76 65 6c 29 20 46 52 4f 4d 20 25 51 2e 27 25  evel) FROM %Q.'%
14840 71 5f 73 65 67 64 69 72 27 20 57 48 45 52 45 20  q_segdir' WHERE 
14850 6c 65 76 65 6c 20 42 45 54 57 45 45 4e 20 3f 20  level BETWEEN ? 
14860 41 4e 44 20 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  AND ?.  **.  ** 
14870 28 31 30 32 34 20 69 73 20 61 63 74 75 61 6c 6c  (1024 is actuall
14880 79 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  y the value of m
14890 61 63 72 6f 20 46 54 53 33 5f 53 45 47 44 49 52  acro FTS3_SEGDIR
148a0 5f 50 52 45 46 49 58 4c 45 56 45 4c 5f 53 54 52  _PREFIXLEVEL_STR
148b0 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  )..  */.  sqlite
148c0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
148d0 20 69 6e 74 20 72 63 20 3d 20 66 74 73 33 53 71   int rc = fts3Sq
148e0 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c  lStmt(p, SQL_SEL
148f0 45 43 54 5f 53 45 47 44 49 52 5f 4d 41 58 5f 4c  ECT_SEGDIR_MAX_L
14900 45 56 45 4c 2c 20 26 70 53 74 6d 74 2c 20 30 29  EVEL, &pStmt, 0)
14910 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
14920 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
14930 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  c;.  sqlite3_bin
14940 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31  d_int64(pStmt, 1
14950 2c 20 69 41 62 73 4c 65 76 65 6c 2b 31 29 3b 0a  , iAbsLevel+1);.
14960 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
14970 6e 74 36 34 28 70 53 74 6d 74 2c 20 32 2c 20 0a  nt64(pStmt, 2, .
14980 20 20 20 20 20 20 28 28 69 41 62 73 4c 65 76 65        ((iAbsLeve
14990 6c 2f 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41  l/FTS3_SEGDIR_MA
149a0 58 4c 45 56 45 4c 29 2b 31 29 20 2a 20 46 54 53  XLEVEL)+1) * FTS
149b0 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45  3_SEGDIR_MAXLEVE
149c0 4c 0a 20 20 29 3b 0a 0a 20 20 2a 70 62 4d 61 78  L.  );..  *pbMax
149d0 20 3d 20 30 3b 0a 20 20 69 66 28 20 53 51 4c 49   = 0;.  if( SQLI
149e0 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
149f0 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
14a00 20 20 20 2a 70 62 4d 61 78 20 3d 20 73 71 6c 69     *pbMax = sqli
14a10 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  te3_column_type(
14a20 70 53 74 6d 74 2c 20 30 29 3d 3d 53 51 4c 49 54  pStmt, 0)==SQLIT
14a30 45 5f 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65  E_NULL;.  }.  re
14a40 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 72 65 73  turn sqlite3_res
14a50 65 74 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a  et(pStmt);.}../*
14a60 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 65  .** Delete all e
14a70 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 25 5f  ntries in the %_
14a80 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20 61  segments table a
14a90 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
14aa0 68 65 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 6f 70  he segment.** op
14ab0 65 6e 65 64 20 77 69 74 68 20 73 65 67 2d 72 65  ened with seg-re
14ac0 61 64 65 72 20 70 53 65 67 2e 20 54 68 69 73 20  ader pSeg. This 
14ad0 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
14ae0 74 20 61 66 66 65 63 74 20 74 68 65 20 63 6f 6e  t affect the con
14af0 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20  tents.** of the 
14b00 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 2e 0a  %_segdir table..
14b10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
14b20 73 33 44 65 6c 65 74 65 53 65 67 6d 65 6e 74 28  s3DeleteSegment(
14b30 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
14b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b50 20 20 20 2f 2a 20 46 54 53 20 74 61 62 6c 65 20     /* FTS table 
14b60 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33  handle */.  Fts3
14b70 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67 20  SegReader *pSeg 
14b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
14b90 65 67 6d 65 6e 74 20 74 6f 20 64 65 6c 65 74 65  egment to delete
14ba0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
14bb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
14bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
14bd0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 66 28  rn code */.  if(
14be0 20 70 53 65 67 2d 3e 69 53 74 61 72 74 42 6c 6f   pSeg->iStartBlo
14bf0 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ck ){.    sqlite
14c00 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74 65 3b  3_stmt *pDelete;
14c10 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73          /* SQL s
14c20 74 61 74 65 6d 65 6e 74 20 74 6f 20 64 65 6c 65  tatement to dele
14c30 74 65 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 72  te rows */.    r
14c40 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
14c50 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45  p, SQL_DELETE_SE
14c60 47 4d 45 4e 54 53 5f 52 41 4e 47 45 2c 20 26 70  GMENTS_RANGE, &p
14c70 44 65 6c 65 74 65 2c 20 30 29 3b 0a 20 20 20 20  Delete, 0);.    
14c80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14c90 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
14ca0 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 44  e3_bind_int64(pD
14cb0 65 6c 65 74 65 2c 20 31 2c 20 70 53 65 67 2d 3e  elete, 1, pSeg->
14cc0 69 53 74 61 72 74 42 6c 6f 63 6b 29 3b 0a 20 20  iStartBlock);.  
14cd0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
14ce0 5f 69 6e 74 36 34 28 70 44 65 6c 65 74 65 2c 20  _int64(pDelete, 
14cf0 32 2c 20 70 53 65 67 2d 3e 69 45 6e 64 42 6c 6f  2, pSeg->iEndBlo
14d00 63 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ck);.      sqlit
14d10 65 33 5f 73 74 65 70 28 70 44 65 6c 65 74 65 29  e3_step(pDelete)
14d20 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
14d30 69 74 65 33 5f 72 65 73 65 74 28 70 44 65 6c 65  ite3_reset(pDele
14d40 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  te);.    }.  }. 
14d50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
14d60 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
14d70 6f 6e 20 69 73 20 75 73 65 64 20 61 66 74 65 72  on is used after
14d80 20 6d 65 72 67 69 6e 67 20 6d 75 6c 74 69 70 6c   merging multipl
14d90 65 20 73 65 67 6d 65 6e 74 73 20 69 6e 74 6f 20  e segments into 
14da0 61 20 73 69 6e 67 6c 65 20 6c 61 72 67 65 0a 2a  a single large.*
14db0 2a 20 73 65 67 6d 65 6e 74 20 74 6f 20 64 65 6c  * segment to del
14dc0 65 74 65 20 74 68 65 20 6f 6c 64 2c 20 6e 6f 77  ete the old, now
14dd0 20 72 65 64 75 6e 64 61 6e 74 2c 20 73 65 67 6d   redundant, segm
14de0 65 6e 74 20 62 2d 74 72 65 65 73 2e 20 53 70 65  ent b-trees. Spe
14df0 63 69 66 69 63 61 6c 6c 79 2c 0a 2a 2a 20 69 74  cifically,.** it
14e00 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 31 29 20 44 65  :.** .**   1) De
14e10 6c 65 74 65 73 20 61 6c 6c 20 25 5f 73 65 67 6d  letes all %_segm
14e20 65 6e 74 73 20 65 6e 74 72 69 65 73 20 66 6f 72  ents entries for
14e30 20 74 68 65 20 73 65 67 6d 65 6e 74 73 20 61 73   the segments as
14e40 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a  sociated with .*
14e50 2a 20 20 20 20 20 20 65 61 63 68 20 6f 66 20 74  *      each of t
14e60 68 65 20 53 65 67 52 65 61 64 65 72 20 6f 62 6a  he SegReader obj
14e70 65 63 74 73 20 69 6e 20 74 68 65 20 61 72 72 61  ects in the arra
14e80 79 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  y passed as the 
14e90 74 68 69 72 64 20 0a 2a 2a 20 20 20 20 20 20 61  third .**      a
14ea0 72 67 75 6d 65 6e 74 2c 20 61 6e 64 0a 2a 2a 0a  rgument, and.**.
14eb0 2a 2a 20 20 20 32 29 20 64 65 6c 65 74 65 73 20  **   2) deletes 
14ec0 61 6c 6c 20 25 5f 73 65 67 64 69 72 20 65 6e 74  all %_segdir ent
14ed0 72 69 65 73 20 77 69 74 68 20 6c 65 76 65 6c 20  ries with level 
14ee0 69 4c 65 76 65 6c 2c 20 6f 72 20 61 6c 6c 20 25  iLevel, or all %
14ef0 5f 73 65 67 64 69 72 0a 2a 2a 20 20 20 20 20 20  _segdir.**      
14f00 65 6e 74 72 69 65 73 20 72 65 67 61 72 64 6c 65  entries regardle
14f10 73 73 20 6f 66 20 6c 65 76 65 6c 20 69 66 20 28  ss of level if (
14f20 69 4c 65 76 65 6c 3c 30 29 2e 0a 2a 2a 0a 2a 2a  iLevel<0)..**.**
14f30 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
14f40 74 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73  turned if succes
14f50 73 66 75 6c 2c 20 6f 74 68 65 72 77 69 73 65 20  sful, otherwise 
14f60 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
14f70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
14f80 69 6e 74 20 66 74 73 33 44 65 6c 65 74 65 53 65  int fts3DeleteSe
14f90 67 64 69 72 28 0a 20 20 46 74 73 33 54 61 62 6c  gdir(.  Fts3Tabl
14fa0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
14fb0 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75          /* Virtu
14fc0 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  al table handle 
14fd0 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64  */.  int iLangid
14fe0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14ff0 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65       /* Language
15000 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e   id */.  int iIn
15010 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  dex,            
15020 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
15030 78 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65 78 20  x for p->aIndex 
15040 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c  */.  int iLevel,
15050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15060 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66       /* Level of
15070 20 25 5f 73 65 67 64 69 72 20 65 6e 74 72 69 65   %_segdir entrie
15080 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  s to delete */. 
15090 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
150a0 2a 61 70 53 65 67 6d 65 6e 74 2c 20 20 20 20 20  *apSegment,     
150b0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 53 65 67   /* Array of Seg
150c0 52 65 61 64 65 72 20 6f 62 6a 65 63 74 73 20 2a  Reader objects *
150d0 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 65 72 20  /.  int nReader 
150e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150f0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
15100 72 72 61 79 20 61 70 53 65 67 6d 65 6e 74 20 2a  rray apSegment *
15110 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
15120 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
15130 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
15140 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   Code */.  int i
15150 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
15170 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
15180 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
15190 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20  t *pDelete = 0; 
151a0 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74       /* SQL stat
151b0 65 6d 65 6e 74 20 74 6f 20 64 65 6c 65 74 65 20  ement to delete 
151c0 72 6f 77 73 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  rows */..  for(i
151d0 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
151e0 4b 20 26 26 20 69 3c 6e 52 65 61 64 65 72 3b 20  K && i<nReader; 
151f0 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  i++){.    rc = f
15200 74 73 33 44 65 6c 65 74 65 53 65 67 6d 65 6e 74  ts3DeleteSegment
15210 28 70 2c 20 61 70 53 65 67 6d 65 6e 74 5b 69 5d  (p, apSegment[i]
15220 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
15230 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15240 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
15250 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 76  ..  assert( iLev
15260 65 6c 3e 3d 30 20 7c 7c 20 69 4c 65 76 65 6c 3d  el>=0 || iLevel=
15270 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f  =FTS3_SEGCURSOR_
15280 41 4c 4c 20 29 3b 0a 20 20 69 66 28 20 69 4c 65  ALL );.  if( iLe
15290 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55 52  vel==FTS3_SEGCUR
152a0 53 4f 52 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  SOR_ALL ){.    r
152b0 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
152c0 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45  p, SQL_DELETE_SE
152d0 47 44 49 52 5f 52 41 4e 47 45 2c 20 26 70 44 65  GDIR_RANGE, &pDe
152e0 6c 65 74 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  lete, 0);.    if
152f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15300 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15310 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c  _bind_int64(pDel
15320 65 74 65 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c  ete, 1, getAbsol
15330 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e  uteLevel(p, iLan
15340 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 30 29 29  gid, iIndex, 0))
15350 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
15360 62 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c 65  bind_int64(pDele
15370 74 65 2c 20 32 2c 20 0a 20 20 20 20 20 20 20 20  te, 2, .        
15380 20 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76    getAbsoluteLev
15390 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69  el(p, iLangid, i
153a0 49 6e 64 65 78 2c 20 46 54 53 33 5f 53 45 47 44  Index, FTS3_SEGD
153b0 49 52 5f 4d 41 58 4c 45 56 45 4c 2d 31 29 0a 20  IR_MAXLEVEL-1). 
153c0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
153d0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
153e0 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
153f0 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 44 49 52  QL_DELETE_SEGDIR
15400 5f 4c 45 56 45 4c 2c 20 26 70 44 65 6c 65 74 65  _LEVEL, &pDelete
15410 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
15420 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15430 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
15440 64 5f 69 6e 74 36 34 28 0a 20 20 20 20 20 20 20  d_int64(.       
15450 20 20 20 70 44 65 6c 65 74 65 2c 20 31 2c 20 67     pDelete, 1, g
15460 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28  etAbsoluteLevel(
15470 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64  p, iLangid, iInd
15480 65 78 2c 20 69 4c 65 76 65 6c 29 0a 20 20 20 20  ex, iLevel).    
15490 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a    );.    }.  }..
154a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
154b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
154c0 65 33 5f 73 74 65 70 28 70 44 65 6c 65 74 65 29  e3_step(pDelete)
154d0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
154e0 65 33 5f 72 65 73 65 74 28 70 44 65 6c 65 74 65  e3_reset(pDelete
154f0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
15500 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68   rc;.}../*.** Wh
15510 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
15520 20 69 73 20 63 61 6c 6c 65 64 2c 20 62 75 66 66   is called, buff
15530 65 72 20 2a 70 70 4c 69 73 74 20 28 73 69 7a 65  er *ppList (size
15540 20 2a 70 6e 4c 69 73 74 20 62 79 74 65 73 29 20   *pnList bytes) 
15550 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20 61 20 70  contains .** a p
15560 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 74 68 61  osition list tha
15570 74 20 6d 61 79 20 28 6f 72 20 6d 61 79 20 6e 6f  t may (or may no
15580 74 29 20 66 65 61 74 75 72 65 20 6d 75 6c 74 69  t) feature multi
15590 70 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69  ple columns. Thi
155a0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 64  s.** function ad
155b0 6a 75 73 74 73 20 74 68 65 20 70 6f 69 6e 74 65  justs the pointe
155c0 72 20 2a 70 70 4c 69 73 74 20 61 6e 64 20 74 68  r *ppList and th
155d0 65 20 6c 65 6e 67 74 68 20 2a 70 6e 4c 69 73 74  e length *pnList
155e0 20 73 6f 20 74 68 61 74 20 74 68 65 79 0a 2a 2a   so that they.**
155f0 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 73 75   identify the su
15600 62 73 65 74 20 6f 66 20 74 68 65 20 70 6f 73 69  bset of the posi
15610 74 69 6f 6e 20 6c 69 73 74 20 74 68 61 74 20 63  tion list that c
15620 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 63 6f  orresponds to co
15630 6c 75 6d 6e 20 69 43 6f 6c 2e 0a 2a 2a 0a 2a 2a  lumn iCol..**.**
15640 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
15650 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
15660 69 6e 70 75 74 20 70 6f 73 69 74 69 6f 6e 20 6c  input position l
15670 69 73 74 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69  ist for column i
15680 43 6f 6c 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 6e  Col, then.** *pn
15690 4c 69 73 74 20 69 73 20 73 65 74 20 74 6f 20 7a  List is set to z
156a0 65 72 6f 20 62 65 66 6f 72 65 20 72 65 74 75 72  ero before retur
156b0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ning..**.** If p
156c0 61 72 61 6d 65 74 65 72 20 62 5a 65 72 6f 20 69  arameter bZero i
156d0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
156e0 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
156f0 20 69 6e 70 75 74 20 6c 69 73 74 20 66 6f 6c 6c   input list foll
15700 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 65 6e 64  owing.** the end
15710 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20 6c   of the output l
15720 69 73 74 20 69 73 20 7a 65 72 6f 65 64 20 62 65  ist is zeroed be
15730 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
15740 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
15750 74 73 33 43 6f 6c 75 6d 6e 46 69 6c 74 65 72 28  ts3ColumnFilter(
15760 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20  .  int iCol,    
15770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15780 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20     /* Column to 
15790 66 69 6c 74 65 72 20 6f 6e 20 2a 2f 0a 20 20 69  filter on */.  i
157a0 6e 74 20 62 5a 65 72 6f 2c 20 20 20 20 20 20 20  nt bZero,       
157b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
157c0 2a 20 5a 65 72 6f 20 6f 75 74 20 61 6e 79 74 68  * Zero out anyth
157d0 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 70  ing following *p
157e0 70 4c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20  pList */.  char 
157f0 2a 2a 70 70 4c 69 73 74 2c 20 20 20 20 20 20 20  **ppList,       
15800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
15810 2f 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f  /OUT: Pointer to
15820 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a   position list *
15830 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 69 73 74 20  /.  int *pnList 
15840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15850 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53      /* IN/OUT: S
15860 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 2a 70  ize of buffer *p
15870 70 4c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a  pList in bytes *
15880 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 4c 69  /.){.  char *pLi
15890 73 74 20 3d 20 2a 70 70 4c 69 73 74 3b 0a 20 20  st = *ppList;.  
158a0 69 6e 74 20 6e 4c 69 73 74 20 3d 20 2a 70 6e 4c  int nList = *pnL
158b0 69 73 74 3b 0a 20 20 63 68 61 72 20 2a 70 45 6e  ist;.  char *pEn
158c0 64 20 3d 20 26 70 4c 69 73 74 5b 6e 4c 69 73 74  d = &pList[nList
158d0 5d 3b 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e  ];.  int iCurren
158e0 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 70  t = 0;.  char *p
158f0 20 3d 20 70 4c 69 73 74 3b 0a 0a 20 20 61 73 73   = pList;..  ass
15900 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a  ert( iCol>=0 );.
15910 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
15920 20 20 63 68 61 72 20 63 20 3d 20 30 3b 0a 20 20    char c = 0;.  
15930 20 20 77 68 69 6c 65 28 20 70 3c 70 45 6e 64 20    while( p<pEnd 
15940 26 26 20 28 63 20 7c 20 2a 70 29 26 30 78 46 45  && (c | *p)&0xFE
15950 20 29 20 63 20 3d 20 2a 70 2b 2b 20 26 20 30 78   ) c = *p++ & 0x
15960 38 30 3b 0a 20 20 0a 20 20 20 20 69 66 28 20 69  80;.  .    if( i
15970 43 6f 6c 3d 3d 69 43 75 72 72 65 6e 74 20 29 7b  Col==iCurrent ){
15980 0a 20 20 20 20 20 20 6e 4c 69 73 74 20 3d 20 28  .      nList = (
15990 69 6e 74 29 28 70 20 2d 20 70 4c 69 73 74 29 3b  int)(p - pList);
159a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
159b0 20 20 7d 0a 0a 20 20 20 20 6e 4c 69 73 74 20 2d    }..    nList -
159c0 3d 20 28 69 6e 74 29 28 70 20 2d 20 70 4c 69 73  = (int)(p - pLis
159d0 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  t);.    pList = 
159e0 70 3b 0a 20 20 20 20 69 66 28 20 6e 4c 69 73 74  p;.    if( nList
159f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65  ==0 ){.      bre
15a00 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20  ak;.    }.    p 
15a10 3d 20 26 70 4c 69 73 74 5b 31 5d 3b 0a 20 20 20  = &pList[1];.   
15a20 20 70 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72   p += fts3GetVar
15a30 69 6e 74 33 32 28 70 2c 20 26 69 43 75 72 72 65  int32(p, &iCurre
15a40 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  nt);.  }..  if( 
15a50 62 5a 65 72 6f 20 26 26 20 26 70 4c 69 73 74 5b  bZero && &pList[
15a60 6e 4c 69 73 74 5d 21 3d 70 45 6e 64 20 29 7b 0a  nList]!=pEnd ){.
15a70 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73      memset(&pLis
15a80 74 5b 6e 4c 69 73 74 5d 2c 20 30 2c 20 70 45 6e  t[nList], 0, pEn
15a90 64 20 2d 20 26 70 4c 69 73 74 5b 6e 4c 69 73 74  d - &pList[nList
15aa0 5d 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 4c 69 73  ]);.  }.  *ppLis
15ab0 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 2a 70 6e  t = pList;.  *pn
15ac0 4c 69 73 74 20 3d 20 6e 4c 69 73 74 3b 0a 7d 0a  List = nList;.}.
15ad0 0a 2f 2a 0a 2a 2a 20 43 61 63 68 65 20 64 61 74  ./*.** Cache dat
15ae0 61 20 69 6e 20 74 68 65 20 46 74 73 33 4d 75 6c  a in the Fts3Mul
15af0 74 69 53 65 67 52 65 61 64 65 72 2e 61 42 75 66  tiSegReader.aBuf
15b00 66 65 72 5b 5d 20 62 75 66 66 65 72 20 28 6f 76  fer[] buffer (ov
15b10 65 72 77 72 69 74 69 6e 67 20 61 6e 79 0a 2a 2a  erwriting any.**
15b20 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 29 2e   existing data).
15b30 20 47 72 6f 77 20 74 68 65 20 62 75 66 66 65 72   Grow the buffer
15b40 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
15b50 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
15b60 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  l, return SQLITE
15b70 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  _OK. Otherwise, 
15b80 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  if an OOM error 
15b90 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a  is encountered.*
15ba0 2a 20 74 72 79 69 6e 67 20 74 6f 20 72 65 73 69  * trying to resi
15bb0 7a 65 20 74 68 65 20 62 75 66 66 65 72 2c 20 72  ze the buffer, r
15bc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
15bd0 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EM..*/.static in
15be0 74 20 66 74 73 33 4d 73 72 42 75 66 66 65 72 44  t fts3MsrBufferD
15bf0 61 74 61 28 0a 20 20 46 74 73 33 4d 75 6c 74 69  ata(.  Fts3Multi
15c00 53 65 67 52 65 61 64 65 72 20 2a 70 4d 73 72 2c  SegReader *pMsr,
15c10 20 20 20 20 20 20 20 2f 2a 20 4d 75 6c 74 69 2d         /* Multi-
15c20 73 65 67 6d 65 6e 74 2d 72 65 61 64 65 72 20 68  segment-reader h
15c30 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20  andle */.  char 
15c40 2a 70 4c 69 73 74 2c 0a 20 20 69 6e 74 20 6e 4c  *pList,.  int nL
15c50 69 73 74 0a 29 7b 0a 20 20 69 66 28 20 6e 4c 69  ist.){.  if( nLi
15c60 73 74 3e 70 4d 73 72 2d 3e 6e 42 75 66 66 65 72  st>pMsr->nBuffer
15c70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e   ){.    char *pN
15c80 65 77 3b 0a 20 20 20 20 70 4d 73 72 2d 3e 6e 42  ew;.    pMsr->nB
15c90 75 66 66 65 72 20 3d 20 6e 4c 69 73 74 2a 32 3b  uffer = nList*2;
15ca0 0a 20 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61  .    pNew = (cha
15cb0 72 20 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  r *)sqlite3_real
15cc0 6c 6f 63 28 70 4d 73 72 2d 3e 61 42 75 66 66 65  loc(pMsr->aBuffe
15cd0 72 2c 20 70 4d 73 72 2d 3e 6e 42 75 66 66 65 72  r, pMsr->nBuffer
15ce0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4e 65 77  );.    if( !pNew
15cf0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
15d00 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 4d 73 72  _NOMEM;.    pMsr
15d10 2d 3e 61 42 75 66 66 65 72 20 3d 20 70 4e 65 77  ->aBuffer = pNew
15d20 3b 0a 20 20 7d 0a 0a 20 20 6d 65 6d 63 70 79 28  ;.  }..  memcpy(
15d30 70 4d 73 72 2d 3e 61 42 75 66 66 65 72 2c 20 70  pMsr->aBuffer, p
15d40 4c 69 73 74 2c 20 6e 4c 69 73 74 29 3b 0a 20 20  List, nList);.  
15d50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15d60 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.}..int sqlite3
15d70 46 74 73 33 4d 73 72 49 6e 63 72 4e 65 78 74 28  Fts3MsrIncrNext(
15d80 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
15d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15da0 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
15db0 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
15dc0 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
15dd0 65 72 20 2a 70 4d 73 72 2c 20 20 20 20 20 20 20  er *pMsr,       
15de0 2f 2a 20 4d 75 6c 74 69 2d 73 65 67 6d 65 6e 74  /* Multi-segment
15df0 2d 72 65 61 64 65 72 20 68 61 6e 64 6c 65 20 2a  -reader handle *
15e00 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
15e10 34 20 2a 70 69 44 6f 63 69 64 2c 20 20 20 20 20  4 *piDocid,     
15e20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 6f 63 69      /* OUT: Doci
15e30 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 63 68 61  d value */.  cha
15e40 72 20 2a 2a 70 61 50 6f 73 6c 69 73 74 2c 20 20  r **paPoslist,  
15e50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15e60 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20  OUT: Pointer to 
15e70 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  position list */
15e80 0a 20 20 69 6e 74 20 2a 70 6e 50 6f 73 6c 69 73  .  int *pnPoslis
15e90 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
15ea0 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20     /* OUT: Size 
15eb0 6f 66 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  of position list
15ec0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a   in bytes */.){.
15ed0 20 20 69 6e 74 20 6e 4d 65 72 67 65 20 3d 20 70    int nMerge = p
15ee0 4d 73 72 2d 3e 6e 41 64 76 61 6e 63 65 3b 0a 20  Msr->nAdvance;. 
15ef0 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
15f00 2a 61 70 53 65 67 6d 65 6e 74 20 3d 20 70 4d 73  *apSegment = pMs
15f10 72 2d 3e 61 70 53 65 67 6d 65 6e 74 3b 0a 20 20  r->apSegment;.  
15f20 69 6e 74 20 28 2a 78 43 6d 70 29 28 46 74 73 33  int (*xCmp)(Fts3
15f30 53 65 67 52 65 61 64 65 72 20 2a 2c 20 46 74 73  SegReader *, Fts
15f40 33 53 65 67 52 65 61 64 65 72 20 2a 29 20 3d 20  3SegReader *) = 
15f50 28 0a 20 20 20 20 70 2d 3e 62 44 65 73 63 49 64  (.    p->bDescId
15f60 78 20 3f 20 66 74 73 33 53 65 67 52 65 61 64 65  x ? fts3SegReade
15f70 72 44 6f 63 6c 69 73 74 43 6d 70 52 65 76 20 3a  rDoclistCmpRev :
15f80 20 66 74 73 33 53 65 67 52 65 61 64 65 72 44 6f   fts3SegReaderDo
15f90 63 6c 69 73 74 43 6d 70 0a 20 20 29 3b 0a 0a 20  clistCmp.  );.. 
15fa0 20 69 66 28 20 6e 4d 65 72 67 65 3d 3d 30 20 29   if( nMerge==0 )
15fb0 7b 0a 20 20 20 20 2a 70 61 50 6f 73 6c 69 73 74  {.    *paPoslist
15fc0 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
15fd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
15fe0 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
15ff0 20 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72     Fts3SegReader
16000 20 2a 70 53 65 67 3b 0a 20 20 20 20 70 53 65 67   *pSeg;.    pSeg
16010 20 3d 20 70 4d 73 72 2d 3e 61 70 53 65 67 6d 65   = pMsr->apSegme
16020 6e 74 5b 30 5d 3b 0a 0a 20 20 20 20 69 66 28 20  nt[0];..    if( 
16030 70 53 65 67 2d 3e 70 4f 66 66 73 65 74 4c 69 73  pSeg->pOffsetLis
16040 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  t==0 ){.      *p
16050 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b 0a 20 20  aPoslist = 0;.  
16060 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16070 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
16080 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  rc;.      char *
16090 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  pList;.      int
160a0 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e   nList;.      in
160b0 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t j;.      sqlit
160c0 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 20  e3_int64 iDocid 
160d0 3d 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e  = apSegment[0]->
160e0 69 44 6f 63 69 64 3b 0a 0a 20 20 20 20 20 20 72  iDocid;..      r
160f0 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65  c = fts3SegReade
16100 72 4e 65 78 74 44 6f 63 69 64 28 70 2c 20 61 70  rNextDocid(p, ap
16110 53 65 67 6d 65 6e 74 5b 30 5d 2c 20 26 70 4c 69  Segment[0], &pLi
16120 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20  st, &nList);.   
16130 20 20 20 6a 20 3d 20 31 3b 0a 20 20 20 20 20 20     j = 1;.      
16140 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
16150 45 5f 4f 4b 20 0a 20 20 20 20 20 20 20 20 26 26  E_OK .        &&
16160 20 6a 3c 6e 4d 65 72 67 65 0a 20 20 20 20 20 20   j<nMerge.      
16170 20 20 26 26 20 61 70 53 65 67 6d 65 6e 74 5b 6a    && apSegment[j
16180 5d 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 0a 20  ]->pOffsetList. 
16190 20 20 20 20 20 20 20 26 26 20 61 70 53 65 67 6d         && apSegm
161a0 65 6e 74 5b 6a 5d 2d 3e 69 44 6f 63 69 64 3d 3d  ent[j]->iDocid==
161b0 69 44 6f 63 69 64 0a 20 20 20 20 20 20 29 7b 0a  iDocid.      ){.
161c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
161d0 33 53 65 67 52 65 61 64 65 72 4e 65 78 74 44 6f  3SegReaderNextDo
161e0 63 69 64 28 70 2c 20 61 70 53 65 67 6d 65 6e 74  cid(p, apSegment
161f0 5b 6a 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  [j], 0, 0);.    
16200 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d      j++;.      }
16210 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
16220 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
16230 6e 20 72 63 3b 0a 20 20 20 20 20 20 66 74 73 33  n rc;.      fts3
16240 53 65 67 52 65 61 64 65 72 53 6f 72 74 28 70 4d  SegReaderSort(pM
16250 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 2c 20 6e  sr->apSegment, n
16260 4d 65 72 67 65 2c 20 6a 2c 20 78 43 6d 70 29 3b  Merge, j, xCmp);
16270 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 4c 69 73  ..      if( nLis
16280 74 3e 30 20 26 26 20 66 74 73 33 53 65 67 52 65  t>0 && fts3SegRe
16290 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28 61 70  aderIsPending(ap
162a0 53 65 67 6d 65 6e 74 5b 30 5d 29 20 29 7b 0a 20  Segment[0]) ){. 
162b0 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33         rc = fts3
162c0 4d 73 72 42 75 66 66 65 72 44 61 74 61 28 70 4d  MsrBufferData(pM
162d0 73 72 2c 20 70 4c 69 73 74 2c 20 6e 4c 69 73 74  sr, pList, nList
162e0 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  +1);.        if(
162f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16300 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16310 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4d 73      assert( (pMs
16320 72 2d 3e 61 42 75 66 66 65 72 5b 6e 4c 69 73 74  r->aBuffer[nList
16330 5d 20 26 20 30 78 46 45 29 3d 3d 30 78 30 30 20  ] & 0xFE)==0x00 
16340 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  );.        pList
16350 20 3d 20 70 4d 73 72 2d 3e 61 42 75 66 66 65 72   = pMsr->aBuffer
16360 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
16370 20 69 66 28 20 70 4d 73 72 2d 3e 69 43 6f 6c 46   if( pMsr->iColF
16380 69 6c 74 65 72 3e 3d 30 20 29 7b 0a 20 20 20 20  ilter>=0 ){.    
16390 20 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e 46 69      fts3ColumnFi
163a0 6c 74 65 72 28 70 4d 73 72 2d 3e 69 43 6f 6c 46  lter(pMsr->iColF
163b0 69 6c 74 65 72 2c 20 31 2c 20 26 70 4c 69 73 74  ilter, 1, &pList
163c0 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20  , &nList);.     
163d0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 4c   }..      if( nL
163e0 69 73 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ist>0 ){.       
163f0 20 2a 70 61 50 6f 73 6c 69 73 74 20 3d 20 70 4c   *paPoslist = pL
16400 69 73 74 3b 0a 20 20 20 20 20 20 20 20 2a 70 69  ist;.        *pi
16410 44 6f 63 69 64 20 3d 20 69 44 6f 63 69 64 3b 0a  Docid = iDocid;.
16420 20 20 20 20 20 20 20 20 2a 70 6e 50 6f 73 6c 69          *pnPosli
16430 73 74 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20  st = nList;.    
16440 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
16450 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
16460 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16470 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
16480 66 74 73 33 53 65 67 52 65 61 64 65 72 53 74 61  fts3SegReaderSta
16490 72 74 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  rt(.  Fts3Table 
164a0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
164b0 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c        /* Virtual
164c0 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   table handle */
164d0 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52  .  Fts3MultiSegR
164e0 65 61 64 65 72 20 2a 70 43 73 72 2c 20 20 20 20  eader *pCsr,    
164f0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a     /* Cursor obj
16500 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ect */.  const c
16510 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20  har *zTerm,     
16520 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d           /* Term
16530 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 28 6f   searched for (o
16540 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74  r NULL) */.  int
16550 20 6e 54 65 72 6d 20 20 20 20 20 20 20 20 20 20   nTerm          
16560 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16570 4c 65 6e 67 74 68 20 6f 66 20 7a 54 65 72 6d 20  Length of zTerm 
16580 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20  in bytes */.){. 
16590 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 53   int i;.  int nS
165a0 65 67 20 3d 20 70 43 73 72 2d 3e 6e 53 65 67 6d  eg = pCsr->nSegm
165b0 65 6e 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ent;..  /* If th
165c0 65 20 46 74 73 33 53 65 67 46 69 6c 74 65 72 20  e Fts3SegFilter 
165d0 64 65 66 69 6e 65 73 20 61 20 73 70 65 63 69 66  defines a specif
165e0 69 63 20 74 65 72 6d 20 28 6f 72 20 74 65 72 6d  ic term (or term
165f0 20 70 72 65 66 69 78 29 20 74 6f 20 73 65 61 72   prefix) to sear
16600 63 68 20 0a 20 20 2a 2a 20 66 6f 72 2c 20 74 68  ch .  ** for, th
16610 65 6e 20 61 64 76 61 6e 63 65 20 65 61 63 68 20  en advance each 
16620 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72  segment iterator
16630 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73   until it points
16640 20 74 6f 20 61 20 74 65 72 6d 20 6f 66 0a 20 20   to a term of.  
16650 2a 2a 20 65 71 75 61 6c 20 6f 72 20 67 72 65 61  ** equal or grea
16660 74 65 72 20 76 61 6c 75 65 20 74 68 61 6e 20 74  ter value than t
16670 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65 72  he specified ter
16680 6d 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74 73  m. This prevents
16690 20 6d 61 6e 79 0a 20 20 2a 2a 20 75 6e 6e 65 63   many.  ** unnec
166a0 65 73 73 61 72 79 20 6d 65 72 67 65 2f 73 6f 72  essary merge/sor
166b0 74 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 6f 72  t operations for
166c0 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20   the case where 
166d0 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 0a 20  single segment. 
166e0 20 2a 2a 20 62 2d 74 72 65 65 20 6c 65 61 66 20   ** b-tree leaf 
166f0 6e 6f 64 65 73 20 63 6f 6e 74 61 69 6e 20 6d 6f  nodes contain mo
16700 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 65 72 6d  re than one term
16710 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
16720 3b 20 70 43 73 72 2d 3e 62 52 65 73 74 61 72 74  ; pCsr->bRestart
16730 3d 3d 30 20 26 26 20 69 3c 70 43 73 72 2d 3e 6e  ==0 && i<pCsr->n
16740 53 65 67 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20  Segment; i++){. 
16750 20 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a     int res = 0;.
16760 20 20 20 20 46 74 73 33 53 65 67 52 65 61 64 65      Fts3SegReade
16770 72 20 2a 70 53 65 67 20 3d 20 70 43 73 72 2d 3e  r *pSeg = pCsr->
16780 61 70 53 65 67 6d 65 6e 74 5b 69 5d 3b 0a 20 20  apSegment[i];.  
16790 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 6e 74    do {.      int
167a0 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61   rc = fts3SegRea
167b0 64 65 72 4e 65 78 74 28 70 2c 20 70 53 65 67 2c  derNext(p, pSeg,
167c0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
167d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
167e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 77  eturn rc;.    }w
167f0 68 69 6c 65 28 20 7a 54 65 72 6d 20 26 26 20 28  hile( zTerm && (
16800 72 65 73 20 3d 20 66 74 73 33 53 65 67 52 65 61  res = fts3SegRea
16810 64 65 72 54 65 72 6d 43 6d 70 28 70 53 65 67 2c  derTermCmp(pSeg,
16820 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 29 3c   zTerm, nTerm))<
16830 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 53  0 );..    if( pS
16840 65 67 2d 3e 62 4c 6f 6f 6b 75 70 20 26 26 20 72  eg->bLookup && r
16850 65 73 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  es!=0 ){.      f
16860 74 73 33 53 65 67 52 65 61 64 65 72 53 65 74 45  ts3SegReaderSetE
16870 6f 66 28 70 53 65 67 29 3b 0a 20 20 20 20 7d 0a  of(pSeg);.    }.
16880 20 20 7d 0a 20 20 66 74 73 33 53 65 67 52 65 61    }.  fts3SegRea
16890 64 65 72 53 6f 72 74 28 70 43 73 72 2d 3e 61 70  derSort(pCsr->ap
168a0 53 65 67 6d 65 6e 74 2c 20 6e 53 65 67 2c 20 6e  Segment, nSeg, n
168b0 53 65 67 2c 20 66 74 73 33 53 65 67 52 65 61 64  Seg, fts3SegRead
168c0 65 72 43 6d 70 29 3b 0a 0a 20 20 72 65 74 75 72  erCmp);..  retur
168d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
168e0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 53  int sqlite3Fts3S
168f0 65 67 52 65 61 64 65 72 53 74 61 72 74 28 0a 20  egReaderStart(. 
16900 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
16910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16920 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
16930 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74  e handle */.  Ft
16940 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
16950 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 2f 2a   *pCsr,       /*
16960 20 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a   Cursor object *
16970 2f 0a 20 20 46 74 73 33 53 65 67 46 69 6c 74 65  /.  Fts3SegFilte
16980 72 20 2a 70 46 69 6c 74 65 72 20 20 20 20 20 20  r *pFilter      
16990 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
169a0 6f 6e 73 20 6f 6e 20 72 61 6e 67 65 20 6f 66 20  ons on range of 
169b0 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 29 7b 0a  iteration */.){.
169c0 20 20 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 20    pCsr->pFilter 
169d0 3d 20 70 46 69 6c 74 65 72 3b 0a 20 20 72 65 74  = pFilter;.  ret
169e0 75 72 6e 20 66 74 73 33 53 65 67 52 65 61 64 65  urn fts3SegReade
169f0 72 53 74 61 72 74 28 70 2c 20 70 43 73 72 2c 20  rStart(p, pCsr, 
16a00 70 46 69 6c 74 65 72 2d 3e 7a 54 65 72 6d 2c 20  pFilter->zTerm, 
16a10 70 46 69 6c 74 65 72 2d 3e 6e 54 65 72 6d 29 3b  pFilter->nTerm);
16a20 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .}..int sqlite3F
16a30 74 73 33 4d 73 72 49 6e 63 72 53 74 61 72 74 28  ts3MsrIncrStart(
16a40 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
16a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a60 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
16a70 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
16a80 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
16a90 65 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20  er *pCsr,       
16aa0 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65 63 74  /* Cursor object
16ab0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20   */.  int iCol, 
16ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ad0 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
16ae0 74 6f 20 6d 61 74 63 68 20 6f 6e 2e 20 2a 2f 0a  to match on. */.
16af0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
16b00 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
16b10 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 69 74 65    /* Term to ite
16b20 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 20 64  rate through a d
16b30 6f 63 6c 69 73 74 20 66 6f 72 20 2a 2f 0a 20 20  oclist for */.  
16b40 69 6e 74 20 6e 54 65 72 6d 20 20 20 20 20 20 20  int nTerm       
16b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b60 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
16b70 65 73 20 69 6e 20 7a 54 65 72 6d 20 2a 2f 0a 29  es in zTerm */.)
16b80 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
16b90 20 72 63 3b 0a 20 20 69 6e 74 20 6e 53 65 67 6d   rc;.  int nSegm
16ba0 65 6e 74 20 3d 20 70 43 73 72 2d 3e 6e 53 65 67  ent = pCsr->nSeg
16bb0 6d 65 6e 74 3b 0a 20 20 69 6e 74 20 28 2a 78 43  ment;.  int (*xC
16bc0 6d 70 29 28 46 74 73 33 53 65 67 52 65 61 64 65  mp)(Fts3SegReade
16bd0 72 20 2a 2c 20 46 74 73 33 53 65 67 52 65 61 64  r *, Fts3SegRead
16be0 65 72 20 2a 29 20 3d 20 28 0a 20 20 20 20 70 2d  er *) = (.    p-
16bf0 3e 62 44 65 73 63 49 64 78 20 3f 20 66 74 73 33  >bDescIdx ? fts3
16c00 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74  SegReaderDoclist
16c10 43 6d 70 52 65 76 20 3a 20 66 74 73 33 53 65 67  CmpRev : fts3Seg
16c20 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70  ReaderDoclistCmp
16c30 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  .  );..  assert(
16c40 20 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 3d 3d   pCsr->pFilter==
16c50 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  0 );.  assert( z
16c60 54 65 72 6d 20 26 26 20 6e 54 65 72 6d 3e 30 20  Term && nTerm>0 
16c70 29 3b 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  );..  /* Advance
16c80 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 69 74   each segment it
16c90 65 72 61 74 6f 72 20 75 6e 74 69 6c 20 69 74 20  erator until it 
16ca0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 65  points to the te
16cb0 72 6d 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 20  rm zTerm/nTerm. 
16cc0 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73 33 53 65  */.  rc = fts3Se
16cd0 67 52 65 61 64 65 72 53 74 61 72 74 28 70 2c 20  gReaderStart(p, 
16ce0 70 43 73 72 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  pCsr, zTerm, nTe
16cf0 72 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  rm);.  if( rc!=S
16d00 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
16d10 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 65 74 65  n rc;..  /* Dete
16d20 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 6f  rmine how many o
16d30 66 20 74 68 65 20 73 65 67 6d 65 6e 74 73 20 61  f the segments a
16d40 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 20 74 6f  ctually point to
16d50 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 2a 2f   zTerm/nTerm. */
16d60 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53  .  for(i=0; i<nS
16d70 65 67 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  egment; i++){.  
16d80 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
16d90 2a 70 53 65 67 20 3d 20 70 43 73 72 2d 3e 61 70  *pSeg = pCsr->ap
16da0 53 65 67 6d 65 6e 74 5b 69 5d 3b 0a 20 20 20 20  Segment[i];.    
16db0 69 66 28 20 21 70 53 65 67 2d 3e 61 4e 6f 64 65  if( !pSeg->aNode
16dc0 20 7c 7c 20 66 74 73 33 53 65 67 52 65 61 64 65   || fts3SegReade
16dd0 72 54 65 72 6d 43 6d 70 28 70 53 65 67 2c 20 7a  rTermCmp(pSeg, z
16de0 54 65 72 6d 2c 20 6e 54 65 72 6d 29 20 29 7b 0a  Term, nTerm) ){.
16df0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16e00 20 7d 0a 20 20 7d 0a 20 20 70 43 73 72 2d 3e 6e   }.  }.  pCsr->n
16e10 41 64 76 61 6e 63 65 20 3d 20 69 3b 0a 0a 20 20  Advance = i;..  
16e20 2f 2a 20 41 64 76 61 6e 63 65 20 65 61 63 68 20  /* Advance each 
16e30 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 73 20  of the segments 
16e40 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
16e50 66 69 72 73 74 20 64 6f 63 69 64 2e 20 2a 2f 0a  first docid. */.
16e60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73    for(i=0; i<pCs
16e70 72 2d 3e 6e 41 64 76 61 6e 63 65 3b 20 69 2b 2b  r->nAdvance; i++
16e80 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  ){.    rc = fts3
16e90 53 65 67 52 65 61 64 65 72 46 69 72 73 74 44 6f  SegReaderFirstDo
16ea0 63 69 64 28 70 2c 20 70 43 73 72 2d 3e 61 70 53  cid(p, pCsr->apS
16eb0 65 67 6d 65 6e 74 5b 69 5d 29 3b 0a 20 20 20 20  egment[i]);.    
16ec0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16ed0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
16ee0 20 7d 0a 20 20 66 74 73 33 53 65 67 52 65 61 64   }.  fts3SegRead
16ef0 65 72 53 6f 72 74 28 70 43 73 72 2d 3e 61 70 53  erSort(pCsr->apS
16f00 65 67 6d 65 6e 74 2c 20 69 2c 20 69 2c 20 78 43  egment, i, i, xC
16f10 6d 70 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  mp);..  assert( 
16f20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3c 70  iCol<0 || iCol<p
16f30 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 70  ->nColumn );.  p
16f40 43 73 72 2d 3e 69 43 6f 6c 46 69 6c 74 65 72 20  Csr->iColFilter 
16f50 3d 20 69 43 6f 6c 3b 0a 0a 20 20 72 65 74 75 72  = iCol;..  retur
16f60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
16f70 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
16f80 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  ion is called on
16f90 20 61 20 4d 75 6c 74 69 53 65 67 52 65 61 64 65   a MultiSegReade
16fa0 72 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  r that has been 
16fb0 73 74 61 72 74 65 64 20 75 73 69 6e 67 0a 2a 2a  started using.**
16fc0 20 73 71 6c 69 74 65 33 46 74 73 33 4d 73 72 49   sqlite3Fts3MsrI
16fd0 6e 63 72 53 74 61 72 74 28 29 2e 20 4f 6e 65 20  ncrStart(). One 
16fe0 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f  or more calls to
16ff0 20 4d 73 72 49 6e 63 72 4e 65 78 74 28 29 20 6d   MsrIncrNext() m
17000 61 79 20 61 6c 73 6f 0a 2a 2a 20 68 61 76 65 20  ay also.** have 
17010 62 65 65 6e 20 6d 61 64 65 2e 20 43 61 6c 6c 69  been made. Calli
17020 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
17030 20 70 75 74 73 20 74 68 65 20 4d 75 6c 74 69 53   puts the MultiS
17040 65 67 52 65 61 64 65 72 20 69 6e 20 73 75 63 68  egReader in such
17050 0a 2a 2a 20 61 20 73 74 61 74 65 20 74 68 61 74  .** a state that
17060 20 69 66 20 74 68 65 20 6e 65 78 74 20 74 77 6f   if the next two
17070 20 63 61 6c 6c 73 20 61 72 65 3a 0a 2a 2a 0a 2a   calls are:.**.*
17080 2a 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 53  *   sqlite3Fts3S
17090 65 67 52 65 61 64 65 72 53 74 61 72 74 28 29 0a  egReaderStart().
170a0 2a 2a 20 20 20 73 71 6c 69 74 65 33 46 74 73 33  **   sqlite3Fts3
170b0 53 65 67 52 65 61 64 65 72 53 74 65 70 28 29 0a  SegReaderStep().
170c0 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 65  **.** then the e
170d0 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20 66 6f  ntire doclist fo
170e0 72 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 76  r the term is av
170f0 61 69 6c 61 62 6c 65 20 69 6e 20 0a 2a 2a 20 4d  ailable in .** M
17100 75 6c 74 69 53 65 67 52 65 61 64 65 72 2e 61 44  ultiSegReader.aD
17110 6f 63 6c 69 73 74 2f 6e 44 6f 63 6c 69 73 74 2e  oclist/nDoclist.
17120 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
17130 74 73 33 4d 73 72 49 6e 63 72 52 65 73 74 61 72  ts3MsrIncrRestar
17140 74 28 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65  t(Fts3MultiSegRe
17150 61 64 65 72 20 2a 70 43 73 72 29 7b 0a 20 20 69  ader *pCsr){.  i
17160 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
17170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17180 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
17190 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e  e through segmen
171a0 74 2d 72 65 61 64 65 72 73 20 2a 2f 0a 0a 20 20  t-readers */..  
171b0 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 7a 54  assert( pCsr->zT
171c0 65 72 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  erm==0 );.  asse
171d0 72 74 28 20 70 43 73 72 2d 3e 6e 54 65 72 6d 3d  rt( pCsr->nTerm=
171e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
171f0 70 43 73 72 2d 3e 61 44 6f 63 6c 69 73 74 3d 3d  pCsr->aDoclist==
17200 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
17210 43 73 72 2d 3e 6e 44 6f 63 6c 69 73 74 3d 3d 30  Csr->nDoclist==0
17220 20 29 3b 0a 0a 20 20 70 43 73 72 2d 3e 6e 41 64   );..  pCsr->nAd
17230 76 61 6e 63 65 20 3d 20 30 3b 0a 20 20 70 43 73  vance = 0;.  pCs
17240 72 2d 3e 62 52 65 73 74 61 72 74 20 3d 20 31 3b  r->bRestart = 1;
17250 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43  .  for(i=0; i<pC
17260 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 20 69 2b  sr->nSegment; i+
17270 2b 29 7b 0a 20 20 20 20 70 43 73 72 2d 3e 61 70  +){.    pCsr->ap
17280 53 65 67 6d 65 6e 74 5b 69 5d 2d 3e 70 4f 66 66  Segment[i]->pOff
17290 73 65 74 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  setList = 0;.   
172a0 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74   pCsr->apSegment
172b0 5b 69 5d 2d 3e 6e 4f 66 66 73 65 74 4c 69 73 74  [i]->nOffsetList
172c0 20 3d 20 30 3b 0a 20 20 20 20 70 43 73 72 2d 3e   = 0;.    pCsr->
172d0 61 70 53 65 67 6d 65 6e 74 5b 69 5d 2d 3e 69 44  apSegment[i]->iD
172e0 6f 63 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  ocid = 0;.  }.. 
172f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17300 4b 3b 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69 74  K;.}...int sqlit
17310 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 53  e3Fts3SegReaderS
17320 74 65 70 28 0a 20 20 46 74 73 33 54 61 62 6c 65  tep(.  Fts3Table
17330 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
17340 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61         /* Virtua
17350 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  l table handle *
17360 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67  /.  Fts3MultiSeg
17370 52 65 61 64 65 72 20 2a 70 43 73 72 20 20 20 20  Reader *pCsr    
17380 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62      /* Cursor ob
17390 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ject */.){.  int
173a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
173b0 0a 0a 20 20 69 6e 74 20 69 73 49 67 6e 6f 72 65  ..  int isIgnore
173c0 45 6d 70 74 79 20 3d 20 20 28 70 43 73 72 2d 3e  Empty =  (pCsr->
173d0 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26  pFilter->flags &
173e0 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 49 47   FTS3_SEGMENT_IG
173f0 4e 4f 52 45 5f 45 4d 50 54 59 29 3b 0a 20 20 69  NORE_EMPTY);.  i
17400 6e 74 20 69 73 52 65 71 75 69 72 65 50 6f 73 20  nt isRequirePos 
17410 3d 20 20 20 28 70 43 73 72 2d 3e 70 46 69 6c 74  =   (pCsr->pFilt
17420 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 33  er->flags & FTS3
17430 5f 53 45 47 4d 45 4e 54 5f 52 45 51 55 49 52 45  _SEGMENT_REQUIRE
17440 5f 50 4f 53 29 3b 0a 20 20 69 6e 74 20 69 73 43  _POS);.  int isC
17450 6f 6c 46 69 6c 74 65 72 20 3d 20 20 20 20 28 70  olFilter =    (p
17460 43 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e 66 6c  Csr->pFilter->fl
17470 61 67 73 20 26 20 46 54 53 33 5f 53 45 47 4d 45  ags & FTS3_SEGME
17480 4e 54 5f 43 4f 4c 55 4d 4e 5f 46 49 4c 54 45 52  NT_COLUMN_FILTER
17490 29 3b 0a 20 20 69 6e 74 20 69 73 50 72 65 66 69  );.  int isPrefi
174a0 78 20 3d 20 20 20 20 20 20 20 28 70 43 73 72 2d  x =       (pCsr-
174b0 3e 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20  >pFilter->flags 
174c0 26 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 50  & FTS3_SEGMENT_P
174d0 52 45 46 49 58 29 3b 0a 20 20 69 6e 74 20 69 73  REFIX);.  int is
174e0 53 63 61 6e 20 3d 20 20 20 20 20 20 20 20 20 28  Scan =         (
174f0 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e 66  pCsr->pFilter->f
17500 6c 61 67 73 20 26 20 46 54 53 33 5f 53 45 47 4d  lags & FTS3_SEGM
17510 45 4e 54 5f 53 43 41 4e 29 3b 0a 20 20 69 6e 74  ENT_SCAN);.  int
17520 20 69 73 46 69 72 73 74 20 3d 20 20 20 20 20 20   isFirst =      
17530 20 20 28 70 43 73 72 2d 3e 70 46 69 6c 74 65 72    (pCsr->pFilter
17540 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 33 5f 53  ->flags & FTS3_S
17550 45 47 4d 45 4e 54 5f 46 49 52 53 54 29 3b 0a 0a  EGMENT_FIRST);..
17560 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
17570 2a 2a 61 70 53 65 67 6d 65 6e 74 20 3d 20 70 43  **apSegment = pC
17580 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 3b 0a 20  sr->apSegment;. 
17590 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20   int nSegment = 
175a0 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a  pCsr->nSegment;.
175b0 20 20 46 74 73 33 53 65 67 46 69 6c 74 65 72 20    Fts3SegFilter 
175c0 2a 70 46 69 6c 74 65 72 20 3d 20 70 43 73 72 2d  *pFilter = pCsr-
175d0 3e 70 46 69 6c 74 65 72 3b 0a 20 20 69 6e 74 20  >pFilter;.  int 
175e0 28 2a 78 43 6d 70 29 28 46 74 73 33 53 65 67 52  (*xCmp)(Fts3SegR
175f0 65 61 64 65 72 20 2a 2c 20 46 74 73 33 53 65 67  eader *, Fts3Seg
17600 52 65 61 64 65 72 20 2a 29 20 3d 20 28 0a 20 20  Reader *) = (.  
17610 20 20 70 2d 3e 62 44 65 73 63 49 64 78 20 3f 20    p->bDescIdx ? 
17620 66 74 73 33 53 65 67 52 65 61 64 65 72 44 6f 63  fts3SegReaderDoc
17630 6c 69 73 74 43 6d 70 52 65 76 20 3a 20 66 74 73  listCmpRev : fts
17640 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73  3SegReaderDoclis
17650 74 43 6d 70 0a 20 20 29 3b 0a 0a 20 20 69 66 28  tCmp.  );..  if(
17660 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3d   pCsr->nSegment=
17670 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
17680 54 45 5f 4f 4b 3b 0a 0a 20 20 64 6f 20 7b 0a 20  TE_OK;..  do {. 
17690 20 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b 0a 20     int nMerge;. 
176a0 20 20 20 69 6e 74 20 69 3b 0a 20 20 0a 20 20 20     int i;.  .   
176b0 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20   /* Advance the 
176c0 66 69 72 73 74 20 70 43 73 72 2d 3e 6e 41 64 76  first pCsr->nAdv
176d0 61 6e 63 65 20 65 6e 74 72 69 65 73 20 69 6e 20  ance entries in 
176e0 74 68 65 20 61 70 53 65 67 6d 65 6e 74 5b 5d 20  the apSegment[] 
176f0 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 66 6f 72  array.    ** for
17700 77 61 72 64 2e 20 54 68 65 6e 20 73 6f 72 74 20  ward. Then sort 
17710 74 68 65 20 6c 69 73 74 20 69 6e 20 6f 72 64 65  the list in orde
17720 72 20 6f 66 20 63 75 72 72 65 6e 74 20 74 65 72  r of current ter
17730 6d 20 61 67 61 69 6e 2e 20 20 0a 20 20 20 20 2a  m again.  .    *
17740 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
17750 3c 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65 3b  <pCsr->nAdvance;
17760 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73   i++){.      Fts
17770 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67  3SegReader *pSeg
17780 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 69 5d 3b   = apSegment[i];
17790 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d  .      if( pSeg-
177a0 3e 62 4c 6f 6f 6b 75 70 20 29 7b 0a 20 20 20 20  >bLookup ){.    
177b0 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65      fts3SegReade
177c0 72 53 65 74 45 6f 66 28 70 53 65 67 29 3b 0a 20  rSetEof(pSeg);. 
177d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
177e0 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67      rc = fts3Seg
177f0 52 65 61 64 65 72 4e 65 78 74 28 70 2c 20 70 53  ReaderNext(p, pS
17800 65 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  eg, 0);.      }.
17810 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17820 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
17830 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66   rc;.    }.    f
17840 74 73 33 53 65 67 52 65 61 64 65 72 53 6f 72 74  ts3SegReaderSort
17850 28 61 70 53 65 67 6d 65 6e 74 2c 20 6e 53 65 67  (apSegment, nSeg
17860 6d 65 6e 74 2c 20 70 43 73 72 2d 3e 6e 41 64 76  ment, pCsr->nAdv
17870 61 6e 63 65 2c 20 66 74 73 33 53 65 67 52 65 61  ance, fts3SegRea
17880 64 65 72 43 6d 70 29 3b 0a 20 20 20 20 70 43 73  derCmp);.    pCs
17890 72 2d 3e 6e 41 64 76 61 6e 63 65 20 3d 20 30 3b  r->nAdvance = 0;
178a0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20  ..    /* If all 
178b0 74 68 65 20 73 65 67 2d 72 65 61 64 65 72 73 20  the seg-readers 
178c0 61 72 65 20 61 74 20 45 4f 46 2c 20 77 65 27 72  are at EOF, we'r
178d0 65 20 66 69 6e 69 73 68 65 64 2e 20 72 65 74 75  e finished. retu
178e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 2a 2f  rn SQLITE_OK. */
178f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
17900 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
17910 20 20 69 66 28 20 61 70 53 65 67 6d 65 6e 74 5b    if( apSegment[
17920 30 5d 2d 3e 61 4e 6f 64 65 3d 3d 30 20 29 20 62  0]->aNode==0 ) b
17930 72 65 61 6b 3b 0a 0a 20 20 20 20 70 43 73 72 2d  reak;..    pCsr-
17940 3e 6e 54 65 72 6d 20 3d 20 61 70 53 65 67 6d 65  >nTerm = apSegme
17950 6e 74 5b 30 5d 2d 3e 6e 54 65 72 6d 3b 0a 20 20  nt[0]->nTerm;.  
17960 20 20 70 43 73 72 2d 3e 7a 54 65 72 6d 20 3d 20    pCsr->zTerm = 
17970 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 7a 54  apSegment[0]->zT
17980 65 72 6d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  erm;..    /* If 
17990 74 68 69 73 20 69 73 20 61 20 70 72 65 66 69 78  this is a prefix
179a0 2d 73 65 61 72 63 68 2c 20 61 6e 64 20 69 66 20  -search, and if 
179b0 74 68 65 20 74 65 72 6d 20 74 68 61 74 20 61 70  the term that ap
179c0 53 65 67 6d 65 6e 74 5b 30 5d 20 70 6f 69 6e 74  Segment[0] point
179d0 73 0a 20 20 20 20 2a 2a 20 74 6f 20 64 6f 65 73  s.    ** to does
179e0 20 6e 6f 74 20 73 68 61 72 65 20 61 20 73 75 66   not share a suf
179f0 66 69 78 20 77 69 74 68 20 70 46 69 6c 74 65 72  fix with pFilter
17a00 2d 3e 7a 54 65 72 6d 2f 6e 54 65 72 6d 2c 20 74  ->zTerm/nTerm, t
17a10 68 65 6e 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20  hen all .    ** 
17a20 72 65 71 75 69 72 65 64 20 63 61 6c 6c 62 61 63  required callbac
17a30 6b 73 20 68 61 76 65 20 62 65 65 6e 20 6d 61 64  ks have been mad
17a40 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
17a50 65 78 69 74 20 65 61 72 6c 79 2e 0a 20 20 20 20  exit early..    
17a60 2a 2a 0a 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61  **.    ** Simila
17a70 72 6c 79 2c 20 69 66 20 74 68 69 73 20 69 73 20  rly, if this is 
17a80 61 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20  a search for an 
17a90 65 78 61 63 74 20 6d 61 74 63 68 2c 20 61 6e 64  exact match, and
17aa0 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 0a   the first term.
17ab0 20 20 20 20 2a 2a 20 6f 66 20 73 65 67 6d 65 6e      ** of segmen
17ac0 74 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 20 69  t apSegment[0] i
17ad0 73 20 6e 6f 74 20 61 20 6d 61 74 63 68 2c 20 65  s not a match, e
17ae0 78 69 74 20 65 61 72 6c 79 2e 0a 20 20 20 20 2a  xit early..    *
17af0 2f 0a 20 20 20 20 69 66 28 20 70 46 69 6c 74 65  /.    if( pFilte
17b00 72 2d 3e 7a 54 65 72 6d 20 26 26 20 21 69 73 53  r->zTerm && !isS
17b10 63 61 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  can ){.      if(
17b20 20 70 43 73 72 2d 3e 6e 54 65 72 6d 3c 70 46 69   pCsr->nTerm<pFi
17b30 6c 74 65 72 2d 3e 6e 54 65 72 6d 20 0a 20 20 20  lter->nTerm .   
17b40 20 20 20 20 7c 7c 20 28 21 69 73 50 72 65 66 69      || (!isPrefi
17b50 78 20 26 26 20 70 43 73 72 2d 3e 6e 54 65 72 6d  x && pCsr->nTerm
17b60 3e 70 46 69 6c 74 65 72 2d 3e 6e 54 65 72 6d 29  >pFilter->nTerm)
17b70 0a 20 20 20 20 20 20 20 7c 7c 20 6d 65 6d 63 6d  .       || memcm
17b80 70 28 70 43 73 72 2d 3e 7a 54 65 72 6d 2c 20 70  p(pCsr->zTerm, p
17b90 46 69 6c 74 65 72 2d 3e 7a 54 65 72 6d 2c 20 70  Filter->zTerm, p
17ba0 46 69 6c 74 65 72 2d 3e 6e 54 65 72 6d 29 20 0a  Filter->nTerm) .
17bb0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
17bc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
17bd0 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4d 65 72 67      }..    nMerg
17be0 65 20 3d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65  e = 1;.    while
17bf0 28 20 6e 4d 65 72 67 65 3c 6e 53 65 67 6d 65 6e  ( nMerge<nSegmen
17c00 74 20 0a 20 20 20 20 20 20 20 20 26 26 20 61 70  t .        && ap
17c10 53 65 67 6d 65 6e 74 5b 6e 4d 65 72 67 65 5d 2d  Segment[nMerge]-
17c20 3e 61 4e 6f 64 65 0a 20 20 20 20 20 20 20 20 26  >aNode.        &
17c30 26 20 61 70 53 65 67 6d 65 6e 74 5b 6e 4d 65 72  & apSegment[nMer
17c40 67 65 5d 2d 3e 6e 54 65 72 6d 3d 3d 70 43 73 72  ge]->nTerm==pCsr
17c50 2d 3e 6e 54 65 72 6d 20 0a 20 20 20 20 20 20 20  ->nTerm .       
17c60 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 43   && 0==memcmp(pC
17c70 73 72 2d 3e 7a 54 65 72 6d 2c 20 61 70 53 65 67  sr->zTerm, apSeg
17c80 6d 65 6e 74 5b 6e 4d 65 72 67 65 5d 2d 3e 7a 54  ment[nMerge]->zT
17c90 65 72 6d 2c 20 70 43 73 72 2d 3e 6e 54 65 72 6d  erm, pCsr->nTerm
17ca0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e  ).    ){.      n
17cb0 4d 65 72 67 65 2b 2b 3b 0a 20 20 20 20 7d 0a 0a  Merge++;.    }..
17cc0 20 20 20 20 61 73 73 65 72 74 28 20 69 73 49 67      assert( isIg
17cd0 6e 6f 72 65 45 6d 70 74 79 20 7c 7c 20 28 69 73  noreEmpty || (is
17ce0 52 65 71 75 69 72 65 50 6f 73 20 26 26 20 21 69  RequirePos && !i
17cf0 73 43 6f 6c 46 69 6c 74 65 72 29 20 29 3b 0a 20  sColFilter) );. 
17d00 20 20 20 69 66 28 20 6e 4d 65 72 67 65 3d 3d 31     if( nMerge==1
17d10 20 0a 20 20 20 20 20 26 26 20 21 69 73 49 67 6e   .     && !isIgn
17d20 6f 72 65 45 6d 70 74 79 20 0a 20 20 20 20 20 26  oreEmpty .     &
17d30 26 20 21 69 73 46 69 72 73 74 20 0a 20 20 20 20  & !isFirst .    
17d40 20 26 26 20 28 70 2d 3e 62 44 65 73 63 49 64 78   && (p->bDescIdx
17d50 3d 3d 30 20 7c 7c 20 66 74 73 33 53 65 67 52 65  ==0 || fts3SegRe
17d60 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28 61 70  aderIsPending(ap
17d70 53 65 67 6d 65 6e 74 5b 30 5d 29 3d 3d 30 29 0a  Segment[0])==0).
17d80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 43 73      ){.      pCs
17d90 72 2d 3e 6e 44 6f 63 6c 69 73 74 20 3d 20 61 70  r->nDoclist = ap
17da0 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 6e 44 6f 63  Segment[0]->nDoc
17db0 6c 69 73 74 3b 0a 20 20 20 20 20 20 69 66 28 20  list;.      if( 
17dc0 66 74 73 33 53 65 67 52 65 61 64 65 72 49 73 50  fts3SegReaderIsP
17dd0 65 6e 64 69 6e 67 28 61 70 53 65 67 6d 65 6e 74  ending(apSegment
17de0 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
17df0 72 63 20 3d 20 66 74 73 33 4d 73 72 42 75 66 66  rc = fts3MsrBuff
17e00 65 72 44 61 74 61 28 70 43 73 72 2c 20 61 70 53  erData(pCsr, apS
17e10 65 67 6d 65 6e 74 5b 30 5d 2d 3e 61 44 6f 63 6c  egment[0]->aDocl
17e20 69 73 74 2c 20 70 43 73 72 2d 3e 6e 44 6f 63 6c  ist, pCsr->nDocl
17e30 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 43  ist);.        pC
17e40 73 72 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20 70  sr->aDoclist = p
17e50 43 73 72 2d 3e 61 42 75 66 66 65 72 3b 0a 20 20  Csr->aBuffer;.  
17e60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17e70 20 20 20 70 43 73 72 2d 3e 61 44 6f 63 6c 69 73     pCsr->aDoclis
17e80 74 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d  t = apSegment[0]
17e90 2d 3e 61 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20  ->aDoclist;.    
17ea0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
17eb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
17ec0 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20   = SQLITE_ROW;. 
17ed0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17ee0 69 6e 74 20 6e 44 6f 63 6c 69 73 74 20 3d 20 30  int nDoclist = 0
17ef0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
17f00 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 2a  ize of doclist *
17f10 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
17f20 69 6e 74 36 34 20 69 50 72 65 76 20 3d 20 30 3b  int64 iPrev = 0;
17f30 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
17f40 64 6f 63 69 64 20 73 74 6f 72 65 64 20 69 6e 20  docid stored in 
17f50 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20  doclist */..    
17f60 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74    /* The current
17f70 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 69 72   term of the fir
17f80 73 74 20 6e 4d 65 72 67 65 20 65 6e 74 72 69 65  st nMerge entrie
17f90 73 20 69 6e 20 74 68 65 20 61 72 72 61 79 0a 20  s in the array. 
17fa0 20 20 20 20 20 2a 2a 20 6f 66 20 46 74 73 33 53       ** of Fts3S
17fb0 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74 73  egReader objects
17fc0 20 69 73 20 74 68 65 20 73 61 6d 65 2e 20 54 68   is the same. Th
17fd0 65 20 64 6f 63 6c 69 73 74 73 20 6d 75 73 74 20  e doclists must 
17fe0 62 65 20 6d 65 72 67 65 64 0a 20 20 20 20 20 20  be merged.      
17ff0 2a 2a 20 61 6e 64 20 61 20 73 69 6e 67 6c 65 20  ** and a single 
18000 74 65 72 6d 20 72 65 74 75 72 6e 65 64 20 77 69  term returned wi
18010 74 68 20 74 68 65 20 6d 65 72 67 65 64 20 64 6f  th the merged do
18020 63 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  clist..      */.
18030 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
18040 3c 6e 4d 65 72 67 65 3b 20 69 2b 2b 29 7b 0a 20  <nMerge; i++){. 
18050 20 20 20 20 20 20 20 66 74 73 33 53 65 67 52 65         fts3SegRe
18060 61 64 65 72 46 69 72 73 74 44 6f 63 69 64 28 70  aderFirstDocid(p
18070 2c 20 61 70 53 65 67 6d 65 6e 74 5b 69 5d 29 3b  , apSegment[i]);
18080 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
18090 74 73 33 53 65 67 52 65 61 64 65 72 53 6f 72 74  ts3SegReaderSort
180a0 28 61 70 53 65 67 6d 65 6e 74 2c 20 6e 4d 65 72  (apSegment, nMer
180b0 67 65 2c 20 6e 4d 65 72 67 65 2c 20 78 43 6d 70  ge, nMerge, xCmp
180c0 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
180d0 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 70 4f  apSegment[0]->pO
180e0 66 66 73 65 74 4c 69 73 74 20 29 7b 0a 20 20 20  ffsetList ){.   
180f0 20 20 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20       int j;     
18100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18110 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  * Number of segm
18120 65 6e 74 73 20 74 68 61 74 20 73 68 61 72 65 20  ents that share 
18130 61 20 64 6f 63 69 64 20 2a 2f 0a 20 20 20 20 20  a docid */.     
18140 20 20 20 63 68 61 72 20 2a 70 4c 69 73 74 20 3d     char *pList =
18150 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
18160 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  nList = 0;.     
18170 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20     int nByte;.  
18180 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
18190 74 36 34 20 69 44 6f 63 69 64 20 3d 20 61 70 53  t64 iDocid = apS
181a0 65 67 6d 65 6e 74 5b 30 5d 2d 3e 69 44 6f 63 69  egment[0]->iDoci
181b0 64 3b 0a 20 20 20 20 20 20 20 20 66 74 73 33 53  d;.        fts3S
181c0 65 67 52 65 61 64 65 72 4e 65 78 74 44 6f 63 69  egReaderNextDoci
181d0 64 28 70 2c 20 61 70 53 65 67 6d 65 6e 74 5b 30  d(p, apSegment[0
181e0 5d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73  ], &pList, &nLis
181f0 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  t);.        j = 
18200 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  1;.        while
18210 28 20 6a 3c 6e 4d 65 72 67 65 0a 20 20 20 20 20  ( j<nMerge.     
18220 20 20 20 20 20 20 20 26 26 20 61 70 53 65 67 6d         && apSegm
18230 65 6e 74 5b 6a 5d 2d 3e 70 4f 66 66 73 65 74 4c  ent[j]->pOffsetL
18240 69 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ist.            
18250 26 26 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2d  && apSegment[j]-
18260 3e 69 44 6f 63 69 64 3d 3d 69 44 6f 63 69 64 0a  >iDocid==iDocid.
18270 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
18280 20 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64       fts3SegRead
18290 65 72 4e 65 78 74 44 6f 63 69 64 28 70 2c 20 61  erNextDocid(p, a
182a0 70 53 65 67 6d 65 6e 74 5b 6a 5d 2c 20 30 2c 20  pSegment[j], 0, 
182b0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 2b  0);.          j+
182c0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  +;.        }..  
182d0 20 20 20 20 20 20 69 66 28 20 69 73 43 6f 6c 46        if( isColF
182e0 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  ilter ){.       
182f0 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e 46 69 6c     fts3ColumnFil
18300 74 65 72 28 70 46 69 6c 74 65 72 2d 3e 69 43 6f  ter(pFilter->iCo
18310 6c 2c 20 30 2c 20 26 70 4c 69 73 74 2c 20 26 6e  l, 0, &pList, &n
18320 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  List);.        }
18330 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69  ..        if( !i
18340 73 49 67 6e 6f 72 65 45 6d 70 74 79 20 7c 7c 20  sIgnoreEmpty || 
18350 6e 4c 69 73 74 3e 30 20 29 7b 0a 0a 20 20 20 20  nList>0 ){..    
18360 20 20 20 20 20 20 2f 2a 20 43 61 6c 63 75 6c 61        /* Calcula
18370 74 65 20 74 68 65 20 27 64 6f 63 69 64 27 20 64  te the 'docid' d
18380 65 6c 74 61 20 76 61 6c 75 65 20 74 6f 20 77 72  elta value to wr
18390 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6d 65 72  ite into the mer
183a0 67 65 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ged .          *
183b0 2a 20 64 6f 63 6c 69 73 74 2e 20 2a 2f 0a 20 20  * doclist. */.  
183c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
183d0 69 6e 74 36 34 20 69 44 65 6c 74 61 3b 0a 20 20  int64 iDelta;.  
183e0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62          if( p->b
183f0 44 65 73 63 49 64 78 20 26 26 20 6e 44 6f 63 6c  DescIdx && nDocl
18400 69 73 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ist>0 ){.       
18410 20 20 20 20 20 69 44 65 6c 74 61 20 3d 20 69 50       iDelta = iP
18420 72 65 76 20 2d 20 69 44 6f 63 69 64 3b 0a 20 20  rev - iDocid;.  
18430 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
18440 20 20 20 20 20 20 20 20 20 20 20 69 44 65 6c 74             iDelt
18450 61 20 3d 20 69 44 6f 63 69 64 20 2d 20 69 50 72  a = iDocid - iPr
18460 65 76 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ev;.          }.
18470 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
18480 28 20 69 44 65 6c 74 61 3e 30 20 7c 7c 20 28 6e  ( iDelta>0 || (n
18490 44 6f 63 6c 69 73 74 3d 3d 30 20 26 26 20 69 44  Doclist==0 && iD
184a0 65 6c 74 61 3d 3d 69 44 6f 63 69 64 29 20 29 3b  elta==iDocid) );
184b0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
184c0 74 28 20 6e 44 6f 63 6c 69 73 74 3e 30 20 7c 7c  t( nDoclist>0 ||
184d0 20 69 44 65 6c 74 61 3d 3d 69 44 6f 63 69 64 20   iDelta==iDocid 
184e0 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6e 42  );..          nB
184f0 79 74 65 20 3d 20 73 71 6c 69 74 65 33 46 74 73  yte = sqlite3Fts
18500 33 56 61 72 69 6e 74 4c 65 6e 28 69 44 65 6c 74  3VarintLen(iDelt
18510 61 29 20 2b 20 28 69 73 52 65 71 75 69 72 65 50  a) + (isRequireP
18520 6f 73 3f 6e 4c 69 73 74 2b 31 3a 30 29 3b 0a 20  os?nList+1:0);. 
18530 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 44 6f           if( nDo
18540 63 6c 69 73 74 2b 6e 42 79 74 65 3e 70 43 73 72  clist+nByte>pCsr
18550 2d 3e 6e 42 75 66 66 65 72 20 29 7b 0a 20 20 20  ->nBuffer ){.   
18560 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 61           char *a
18570 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20  New;.           
18580 20 70 43 73 72 2d 3e 6e 42 75 66 66 65 72 20 3d   pCsr->nBuffer =
18590 20 28 6e 44 6f 63 6c 69 73 74 2b 6e 42 79 74 65   (nDoclist+nByte
185a0 29 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  )*2;.           
185b0 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   aNew = sqlite3_
185c0 72 65 61 6c 6c 6f 63 28 70 43 73 72 2d 3e 61 42  realloc(pCsr->aB
185d0 75 66 66 65 72 2c 20 70 43 73 72 2d 3e 6e 42 75  uffer, pCsr->nBu
185e0 66 66 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ffer);.         
185f0 20 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a     if( !aNew ){.
18600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
18610 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
18620 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  M;.            }
18630 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 73  .            pCs
18640 72 2d 3e 61 42 75 66 66 65 72 20 3d 20 61 4e 65  r->aBuffer = aNe
18650 77 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  w;.          }..
18660 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73            if( is
18670 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20 20  First ){.       
18680 20 20 20 20 20 63 68 61 72 20 2a 61 20 3d 20 26       char *a = &
18690 70 43 73 72 2d 3e 61 42 75 66 66 65 72 5b 6e 44  pCsr->aBuffer[nD
186a0 6f 63 6c 69 73 74 5d 3b 0a 20 20 20 20 20 20 20  oclist];.       
186b0 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65 3b       int nWrite;
186c0 0a 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20  .           .   
186d0 20 20 20 20 20 20 20 20 20 6e 57 72 69 74 65 20           nWrite 
186e0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 46 69 72  = sqlite3Fts3Fir
186f0 73 74 46 69 6c 74 65 72 28 69 44 65 6c 74 61 2c  stFilter(iDelta,
18700 20 70 4c 69 73 74 2c 20 6e 4c 69 73 74 2c 20 61   pList, nList, a
18710 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
18720 66 28 20 6e 57 72 69 74 65 20 29 7b 0a 20 20 20  f( nWrite ){.   
18730 20 20 20 20 20 20 20 20 20 20 20 69 50 72 65 76             iPrev
18740 20 3d 20 69 44 6f 63 69 64 3b 0a 20 20 20 20 20   = iDocid;.     
18750 20 20 20 20 20 20 20 20 20 6e 44 6f 63 6c 69 73           nDoclis
18760 74 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20  t += nWrite;.   
18770 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
18780 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18790 20 20 20 20 20 20 20 20 6e 44 6f 63 6c 69 73 74          nDoclist
187a0 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50   += sqlite3Fts3P
187b0 75 74 56 61 72 69 6e 74 28 26 70 43 73 72 2d 3e  utVarint(&pCsr->
187c0 61 42 75 66 66 65 72 5b 6e 44 6f 63 6c 69 73 74  aBuffer[nDoclist
187d0 5d 2c 20 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  ], iDelta);.    
187e0 20 20 20 20 20 20 20 20 69 50 72 65 76 20 3d 20          iPrev = 
187f0 69 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20  iDocid;.        
18800 20 20 20 20 69 66 28 20 69 73 52 65 71 75 69 72      if( isRequir
18810 65 50 6f 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ePos ){.        
18820 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 43        memcpy(&pC
18830 73 72 2d 3e 61 42 75 66 66 65 72 5b 6e 44 6f 63  sr->aBuffer[nDoc
18840 6c 69 73 74 5d 2c 20 70 4c 69 73 74 2c 20 6e 4c  list], pList, nL
18850 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ist);.          
18860 20 20 20 20 6e 44 6f 63 6c 69 73 74 20 2b 3d 20      nDoclist += 
18870 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20  nList;.         
18880 20 20 20 20 20 70 43 73 72 2d 3e 61 42 75 66 66       pCsr->aBuff
18890 65 72 5b 6e 44 6f 63 6c 69 73 74 2b 2b 5d 20 3d  er[nDoclist++] =
188a0 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 20   '\0';.         
188b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
188c0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
188d0 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65      fts3SegReade
188e0 72 53 6f 72 74 28 61 70 53 65 67 6d 65 6e 74 2c  rSort(apSegment,
188f0 20 6e 4d 65 72 67 65 2c 20 6a 2c 20 78 43 6d 70   nMerge, j, xCmp
18900 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18910 20 69 66 28 20 6e 44 6f 63 6c 69 73 74 3e 30 20   if( nDoclist>0 
18920 29 7b 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d  ){.        pCsr-
18930 3e 61 44 6f 63 6c 69 73 74 20 3d 20 70 43 73 72  >aDoclist = pCsr
18940 2d 3e 61 42 75 66 66 65 72 3b 0a 20 20 20 20 20  ->aBuffer;.     
18950 20 20 20 70 43 73 72 2d 3e 6e 44 6f 63 6c 69 73     pCsr->nDoclis
18960 74 20 3d 20 6e 44 6f 63 6c 69 73 74 3b 0a 20 20  t = nDoclist;.  
18970 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18980 45 5f 52 4f 57 3b 0a 20 20 20 20 20 20 7d 0a 20  E_ROW;.      }. 
18990 20 20 20 7d 0a 20 20 20 20 70 43 73 72 2d 3e 6e     }.    pCsr->n
189a0 41 64 76 61 6e 63 65 20 3d 20 6e 4d 65 72 67 65  Advance = nMerge
189b0 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  ;.  }while( rc==
189c0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
189d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 76  return rc;.}...v
189e0 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 33 53  oid sqlite3Fts3S
189f0 65 67 52 65 61 64 65 72 46 69 6e 69 73 68 28 0a  egReaderFinish(.
18a00 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65    Fts3MultiSegRe
18a10 61 64 65 72 20 2a 70 43 73 72 20 20 20 20 20 20  ader *pCsr      
18a20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65 63   /* Cursor objec
18a30 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 43  t */.){.  if( pC
18a40 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  sr ){.    int i;
18a50 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
18a60 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 20  pCsr->nSegment; 
18a70 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
18a80 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72  te3Fts3SegReader
18a90 46 72 65 65 28 70 43 73 72 2d 3e 61 70 53 65 67  Free(pCsr->apSeg
18aa0 6d 65 6e 74 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  ment[i]);.    }.
18ab0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
18ac0 28 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74  (pCsr->apSegment
18ad0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
18ae0 72 65 65 28 70 43 73 72 2d 3e 61 42 75 66 66 65  ree(pCsr->aBuffe
18af0 72 29 3b 0a 0a 20 20 20 20 70 43 73 72 2d 3e 6e  r);..    pCsr->n
18b00 53 65 67 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20  Segment = 0;.   
18b10 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74   pCsr->apSegment
18b20 20 3d 20 30 3b 0a 20 20 20 20 70 43 73 72 2d 3e   = 0;.    pCsr->
18b30 61 42 75 66 66 65 72 20 3d 20 30 3b 0a 20 20 7d  aBuffer = 0;.  }
18b40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  .}../*.** Decode
18b50 20 74 68 65 20 22 65 6e 64 5f 62 6c 6f 63 6b 22   the "end_block"
18b60 20 66 69 65 6c 64 2c 20 73 65 6c 65 63 74 65 64   field, selected
18b70 20 62 79 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20   by column iCol 
18b80 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 0a 2a  of the SELECT .*
18b90 2a 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  * statement pass
18ba0 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
18bb0 61 72 67 75 6d 65 6e 74 2e 20 0a 2a 2a 0a 2a 2a  argument. .**.**
18bc0 20 54 68 65 20 22 65 6e 64 5f 62 6c 6f 63 6b 22   The "end_block"
18bd0 20 66 69 65 6c 64 20 6d 61 79 20 63 6f 6e 74 61   field may conta
18be0 69 6e 20 65 69 74 68 65 72 20 61 6e 20 69 6e 74  in either an int
18bf0 65 67 65 72 2c 20 6f 72 20 61 20 74 65 78 74 20  eger, or a text 
18c00 66 69 65 6c 64 0a 2a 2a 20 63 6f 6e 74 61 69 6e  field.** contain
18c10 69 6e 67 20 74 68 65 20 74 65 78 74 20 72 65 70  ing the text rep
18c20 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
18c30 77 6f 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20  wo non-negative 
18c40 69 6e 74 65 67 65 72 73 20 73 65 70 61 72 61 74  integers separat
18c50 65 64 20 0a 2a 2a 20 62 79 20 6f 6e 65 20 6f 72  ed .** by one or
18c60 20 6d 6f 72 65 20 73 70 61 63 65 20 28 30 78 32   more space (0x2
18c70 30 29 20 63 68 61 72 61 63 74 65 72 73 2e 20 49  0) characters. I
18c80 6e 20 74 68 65 20 66 69 72 73 74 20 63 61 73 65  n the first case
18c90 2c 20 73 65 74 20 2a 70 69 45 6e 64 42 6c 6f 63  , set *piEndBloc
18ca0 6b 20 0a 2a 2a 20 74 6f 20 74 68 65 20 69 6e 74  k .** to the int
18cb0 65 67 65 72 20 76 61 6c 75 65 20 61 6e 64 20 2a  eger value and *
18cc0 70 6e 42 79 74 65 20 74 6f 20 7a 65 72 6f 20 62  pnByte to zero b
18cd0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
18ce0 20 49 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20   In the second, 
18cf0 0a 2a 2a 20 73 65 74 20 2a 70 69 45 6e 64 42 6c  .** set *piEndBl
18d00 6f 63 6b 20 74 6f 20 74 68 65 20 66 69 72 73 74  ock to the first
18d10 20 76 61 6c 75 65 20 61 6e 64 20 2a 70 6e 42 79   value and *pnBy
18d20 74 65 20 74 6f 20 74 68 65 20 73 65 63 6f 6e 64  te to the second
18d30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
18d40 20 66 74 73 33 52 65 61 64 45 6e 64 42 6c 6f 63   fts3ReadEndBloc
18d50 6b 46 69 65 6c 64 28 0a 20 20 73 71 6c 69 74 65  kField(.  sqlite
18d60 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 2c 20 0a  3_stmt *pStmt, .
18d70 20 20 69 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69    int iCol, .  i
18d80 36 34 20 2a 70 69 45 6e 64 42 6c 6f 63 6b 2c 0a  64 *piEndBlock,.
18d90 20 20 69 36 34 20 2a 70 6e 42 79 74 65 0a 29 7b    i64 *pnByte.){
18da0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
18db0 64 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d 20  d char *zText = 
18dc0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
18dd0 65 78 74 28 70 53 74 6d 74 2c 20 69 43 6f 6c 29  ext(pStmt, iCol)
18de0 3b 0a 20 20 69 66 28 20 7a 54 65 78 74 20 29 7b  ;.  if( zText ){
18df0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
18e00 69 6e 74 20 69 4d 75 6c 20 3d 20 31 3b 0a 20 20  int iMul = 1;.  
18e10 20 20 69 36 34 20 69 56 61 6c 20 3d 20 30 3b 0a    i64 iVal = 0;.
18e20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 54 65      for(i=0; zTe
18e30 78 74 5b 69 5d 3e 3d 27 30 27 20 26 26 20 7a 54  xt[i]>='0' && zT
18e40 65 78 74 5b 69 5d 3c 3d 27 39 27 3b 20 69 2b 2b  ext[i]<='9'; i++
18e50 29 7b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20  ){.      iVal = 
18e60 69 56 61 6c 2a 31 30 20 2b 20 28 7a 54 65 78 74  iVal*10 + (zText
18e70 5b 69 5d 20 2d 20 27 30 27 29 3b 0a 20 20 20 20  [i] - '0');.    
18e80 7d 0a 20 20 20 20 2a 70 69 45 6e 64 42 6c 6f 63  }.    *piEndBloc
18e90 6b 20 3d 20 69 56 61 6c 3b 0a 20 20 20 20 77 68  k = iVal;.    wh
18ea0 69 6c 65 28 20 7a 54 65 78 74 5b 69 5d 3d 3d 27  ile( zText[i]=='
18eb0 20 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 69 56   ' ) i++;.    iV
18ec0 61 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  al = 0;.    if( 
18ed0 7a 54 65 78 74 5b 69 5d 3d 3d 27 2d 27 20 29 7b  zText[i]=='-' ){
18ee0 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  .      i++;.    
18ef0 20 20 69 4d 75 6c 20 3d 20 2d 31 3b 0a 20 20 20    iMul = -1;.   
18f00 20 7d 0a 20 20 20 20 66 6f 72 28 2f 2a 20 6e 6f   }.    for(/* no
18f10 2d 6f 70 20 2a 2f 3b 20 7a 54 65 78 74 5b 69 5d  -op */; zText[i]
18f20 3e 3d 27 30 27 20 26 26 20 7a 54 65 78 74 5b 69  >='0' && zText[i
18f30 5d 3c 3d 27 39 27 3b 20 69 2b 2b 29 7b 0a 20 20  ]<='9'; i++){.  
18f40 20 20 20 20 69 56 61 6c 20 3d 20 69 56 61 6c 2a      iVal = iVal*
18f50 31 30 20 2b 20 28 7a 54 65 78 74 5b 69 5d 20 2d  10 + (zText[i] -
18f60 20 27 30 27 29 3b 0a 20 20 20 20 7d 0a 20 20 20   '0');.    }.   
18f70 20 2a 70 6e 42 79 74 65 20 3d 20 28 69 56 61 6c   *pnByte = (iVal
18f80 20 2a 20 28 69 36 34 29 69 4d 75 6c 29 3b 0a 20   * (i64)iMul);. 
18f90 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 20 73   }.}.../*.** A s
18fa0 65 67 6d 65 6e 74 20 6f 66 20 73 69 7a 65 20 6e  egment of size n
18fb0 42 79 74 65 20 62 79 74 65 73 20 68 61 73 20 6a  Byte bytes has j
18fc0 75 73 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ust been written
18fd0 20 74 6f 20 61 62 73 6f 6c 75 74 65 20 6c 65 76   to absolute lev
18fe0 65 6c 0a 2a 2a 20 69 41 62 73 4c 65 76 65 6c 2e  el.** iAbsLevel.
18ff0 20 50 72 6f 6d 6f 74 65 20 61 6e 79 20 73 65 67   Promote any seg
19000 6d 65 6e 74 73 20 74 68 61 74 20 73 68 6f 75 6c  ments that shoul
19010 64 20 62 65 20 70 72 6f 6d 6f 74 65 64 20 61 73  d be promoted as
19020 20 61 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74   a result..*/.st
19030 61 74 69 63 20 69 6e 74 20 66 74 73 33 50 72 6f  atic int fts3Pro
19040 6d 6f 74 65 53 65 67 6d 65 6e 74 73 28 0a 20 20  moteSegments(.  
19050 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
19060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19070 2f 2a 20 46 54 53 20 74 61 62 6c 65 20 68 61 6e  /* FTS table han
19080 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dle */.  sqlite3
19090 5f 69 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c  _int64 iAbsLevel
190a0 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f  ,        /* Abso
190b0 6c 75 74 65 20 6c 65 76 65 6c 20 6a 75 73 74 20  lute level just 
190c0 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 73 71 6c  updated */.  sql
190d0 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65  ite3_int64 nByte
190e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
190f0 53 69 7a 65 20 6f 66 20 6e 65 77 20 73 65 67 6d  Size of new segm
19100 65 6e 74 20 61 74 20 69 41 62 73 4c 65 76 65 6c  ent at iAbsLevel
19110 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
19120 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  = SQLITE_OK;.  s
19130 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 52 61  qlite3_stmt *pRa
19140 6e 67 65 3b 0a 0a 20 20 72 63 20 3d 20 66 74 73  nge;..  rc = fts
19150 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
19160 53 45 4c 45 43 54 5f 4c 45 56 45 4c 5f 52 41 4e  SELECT_LEVEL_RAN
19170 47 45 32 2c 20 26 70 52 61 6e 67 65 2c 20 30 29  GE2, &pRange, 0)
19180 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
19190 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
191a0 74 20 62 4f 6b 20 3d 20 30 3b 0a 20 20 20 20 69  t bOk = 0;.    i
191b0 36 34 20 69 4c 61 73 74 20 3d 20 28 69 41 62 73  64 iLast = (iAbs
191c0 4c 65 76 65 6c 2f 46 54 53 33 5f 53 45 47 44 49  Level/FTS3_SEGDI
191d0 52 5f 4d 41 58 4c 45 56 45 4c 20 2b 20 31 29 20  R_MAXLEVEL + 1) 
191e0 2a 20 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41  * FTS3_SEGDIR_MA
191f0 58 4c 45 56 45 4c 20 2d 20 31 3b 0a 20 20 20 20  XLEVEL - 1;.    
19200 69 36 34 20 6e 4c 69 6d 69 74 20 3d 20 28 6e 42  i64 nLimit = (nB
19210 79 74 65 2a 33 29 2f 32 3b 0a 0a 20 20 20 20 2f  yte*3)/2;..    /
19220 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
19230 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ll entries in th
19240 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65  e %_segdir table
19250 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
19260 6f 20 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e  o .    ** segmen
19270 74 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65 78  ts in this index
19280 20 6f 6e 20 6c 65 76 65 6c 73 20 67 72 65 61 74   on levels great
19290 65 72 20 74 68 61 6e 20 69 41 62 73 4c 65 76 65  er than iAbsLeve
192a0 6c 2e 20 49 66 20 74 68 65 72 65 20 69 73 0a 20  l. If there is. 
192b0 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f     ** at least o
192c0 6e 65 20 73 75 63 68 20 73 65 67 6d 65 6e 74 2c  ne such segment,
192d0 20 61 6e 64 20 69 74 20 69 73 20 70 6f 73 73 69   and it is possi
192e0 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ble to determine
192f0 20 74 68 61 74 20 61 6c 6c 20 0a 20 20 20 20 2a   that all .    *
19300 2a 20 73 75 63 68 20 73 65 67 6d 65 6e 74 73 20  * such segments 
19310 61 72 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  are smaller than
19320 20 6e 4c 69 6d 69 74 20 62 79 74 65 73 20 69 6e   nLimit bytes in
19330 20 73 69 7a 65 2c 20 74 68 65 79 20 77 69 6c 6c   size, they will
19340 20 62 65 20 0a 20 20 20 20 2a 2a 20 70 72 6f 6d   be .    ** prom
19350 6f 74 65 64 20 74 6f 20 6c 65 76 65 6c 20 69 41  oted to level iA
19360 62 73 4c 65 76 65 6c 2e 20 20 2a 2f 0a 20 20 20  bsLevel.  */.   
19370 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
19380 74 36 34 28 70 52 61 6e 67 65 2c 20 31 2c 20 69  t64(pRange, 1, i
19390 41 62 73 4c 65 76 65 6c 2b 31 29 3b 0a 20 20 20  AbsLevel+1);.   
193a0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
193b0 74 36 34 28 70 52 61 6e 67 65 2c 20 32 2c 20 69  t64(pRange, 2, i
193c0 4c 61 73 74 29 3b 0a 20 20 20 20 77 68 69 6c 65  Last);.    while
193d0 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
193e0 6c 69 74 65 33 5f 73 74 65 70 28 70 52 61 6e 67  lite3_step(pRang
193f0 65 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  e) ){.      i64 
19400 6e 53 69 7a 65 20 3d 20 30 2c 20 64 75 6d 6d 79  nSize = 0, dummy
19410 3b 0a 20 20 20 20 20 20 66 74 73 33 52 65 61 64  ;.      fts3Read
19420 45 6e 64 42 6c 6f 63 6b 46 69 65 6c 64 28 70 52  EndBlockField(pR
19430 61 6e 67 65 2c 20 32 2c 20 26 64 75 6d 6d 79 2c  ange, 2, &dummy,
19440 20 26 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20   &nSize);.      
19450 69 66 28 20 6e 53 69 7a 65 3c 3d 30 20 7c 7c 20  if( nSize<=0 || 
19460 6e 53 69 7a 65 3e 6e 4c 69 6d 69 74 20 29 7b 0a  nSize>nLimit ){.
19470 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 53          /* If nS
19480 69 7a 65 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  ize==0, then the
19490 20 25 5f 73 65 67 64 69 72 2e 65 6e 64 5f 62 6c   %_segdir.end_bl
194a0 6f 63 6b 20 66 69 65 6c 64 20 64 6f 65 73 20 6e  ock field does n
194b0 6f 74 20 6e 6f 74 20 0a 20 20 20 20 20 20 20 20  ot not .        
194c0 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 73 69 7a  ** contain a siz
194d0 65 20 76 61 6c 75 65 2e 20 54 68 69 73 20 68 61  e value. This ha
194e0 70 70 65 6e 73 20 69 66 20 69 74 20 77 61 73 20  ppens if it was 
194f0 77 72 69 74 74 65 6e 20 62 79 20 61 6e 0a 20 20  written by an.  
19500 20 20 20 20 20 20 2a 2a 20 6f 6c 64 20 76 65 72        ** old ver
19510 73 69 6f 6e 20 6f 66 20 46 54 53 2e 20 49 6e 20  sion of FTS. In 
19520 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
19530 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
19540 64 65 74 65 72 6d 69 6e 65 0a 20 20 20 20 20 20  determine.      
19550 20 20 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66    ** the size of
19560 20 74 68 65 20 73 65 67 6d 65 6e 74 2c 20 61 6e   the segment, an
19570 64 20 73 6f 20 73 65 67 6d 65 6e 74 20 70 72 6f  d so segment pro
19580 6d 6f 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0a  motion does not.
19590 20 20 20 20 20 20 20 20 2a 2a 20 74 61 6b 65 20          ** take 
195a0 70 6c 61 63 65 2e 20 20 2a 2f 0a 20 20 20 20 20  place.  */.     
195b0 20 20 20 62 4f 6b 20 3d 20 30 3b 0a 20 20 20 20     bOk = 0;.    
195c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
195d0 20 7d 0a 20 20 20 20 20 20 62 4f 6b 20 3d 20 31   }.      bOk = 1
195e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
195f0 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
19600 52 61 6e 67 65 29 3b 0a 0a 20 20 20 20 69 66 28  Range);..    if(
19610 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20 69 6e   bOk ){.      in
19620 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  t iIdx = 0;.    
19630 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
19640 70 55 70 64 61 74 65 31 20 3d 20 30 3b 0a 20 20  pUpdate1 = 0;.  
19650 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
19660 20 2a 70 55 70 64 61 74 65 32 20 3d 20 30 3b 0a   *pUpdate2 = 0;.
19670 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
19680 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19690 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c      rc = fts3Sql
196a0 53 74 6d 74 28 70 2c 20 53 51 4c 5f 55 50 44 41  Stmt(p, SQL_UPDA
196b0 54 45 5f 4c 45 56 45 4c 5f 49 44 58 2c 20 26 70  TE_LEVEL_IDX, &p
196c0 55 70 64 61 74 65 31 2c 20 30 29 3b 0a 20 20 20  Update1, 0);.   
196d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
196e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
196f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
19700 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
19710 55 50 44 41 54 45 5f 4c 45 56 45 4c 2c 20 26 70  UPDATE_LEVEL, &p
19720 55 70 64 61 74 65 32 2c 20 30 29 3b 0a 20 20 20  Update2, 0);.   
19730 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
19740 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19750 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  ..        /* Loo
19760 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 25 5f  p through all %_
19770 73 65 67 64 69 72 20 65 6e 74 72 69 65 73 20 66  segdir entries f
19780 6f 72 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74  or segments in t
19790 68 69 73 20 69 6e 64 65 78 20 77 69 74 68 0a 20  his index with. 
197a0 20 20 20 20 20 20 20 2a 2a 20 6c 65 76 65 6c 73         ** levels
197b0 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 67 72 65   equal to or gre
197c0 61 74 65 72 20 74 68 61 6e 20 69 41 62 73 4c 65  ater than iAbsLe
197d0 76 65 6c 2e 20 41 73 20 65 61 63 68 20 65 6e 74  vel. As each ent
197e0 72 79 20 69 73 20 76 69 73 69 74 65 64 2c 0a 20  ry is visited,. 
197f0 20 20 20 20 20 20 20 2a 2a 20 75 70 64 61 74 65         ** update
19800 64 20 69 74 20 74 6f 20 73 65 74 20 28 6c 65 76  d it to set (lev
19810 65 6c 20 3d 20 2d 31 29 20 61 6e 64 20 28 69 64  el = -1) and (id
19820 78 20 3d 20 4e 29 2c 20 77 68 65 72 65 20 4e 20  x = N), where N 
19830 69 73 20 30 20 66 6f 72 20 74 68 65 0a 20 20 20  is 0 for the.   
19840 20 20 20 20 20 2a 2a 20 6f 6c 64 65 73 74 20 73       ** oldest s
19850 65 67 6d 65 6e 74 20 69 6e 20 74 68 65 20 72 61  egment in the ra
19860 6e 67 65 2c 20 31 20 66 6f 72 20 74 68 65 20 6e  nge, 1 for the n
19870 65 78 74 20 6f 6c 64 65 73 74 2c 20 61 6e 64 20  ext oldest, and 
19880 73 6f 20 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  so on..        *
19890 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  *.        ** In 
198a0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f 76  other words, mov
198b0 65 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 62  e all segments b
198c0 65 69 6e 67 20 70 72 6f 6d 6f 74 65 64 20 74 6f  eing promoted to
198d0 20 6c 65 76 65 6c 20 2d 31 2c 0a 20 20 20 20 20   level -1,.     
198e0 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 20 74 68     ** setting th
198f0 65 20 22 69 64 78 22 20 66 69 65 6c 64 73 20 61  e "idx" fields a
19900 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 6f  s appropriate to
19910 20 6b 65 65 70 20 74 68 65 6d 20 69 6e 20 74 68   keep them in th
19920 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20 2a  e same.        *
19930 2a 20 6f 72 64 65 72 2e 20 54 68 65 20 63 6f 6e  * order. The con
19940 74 65 6e 74 73 20 6f 66 20 6c 65 76 65 6c 20 2d  tents of level -
19950 31 20 28 77 68 69 63 68 20 69 73 20 6e 65 76 65  1 (which is neve
19960 72 20 75 73 65 64 2c 20 65 78 63 65 70 74 0a 20  r used, except. 
19970 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 69         ** transi
19980 65 6e 74 6c 79 20 68 65 72 65 29 2c 20 77 69 6c  ently here), wil
19990 6c 20 62 65 20 6d 6f 76 65 64 20 62 61 63 6b 20  l be moved back 
199a0 74 6f 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76  to level iAbsLev
199b0 65 6c 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20  el below.  */.  
199c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
199d0 6e 64 5f 69 6e 74 36 34 28 70 52 61 6e 67 65 2c  nd_int64(pRange,
199e0 20 31 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a   1, iAbsLevel);.
199f0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 53          while( S
19a00 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
19a10 65 33 5f 73 74 65 70 28 70 52 61 6e 67 65 29 20  e3_step(pRange) 
19a20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
19a30 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 55  ite3_bind_int(pU
19a40 70 64 61 74 65 31 2c 20 31 2c 20 69 49 64 78 2b  pdate1, 1, iIdx+
19a50 2b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +);.          sq
19a60 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
19a70 55 70 64 61 74 65 31 2c 20 32 2c 20 73 71 6c 69  Update1, 2, sqli
19a80 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
19a90 52 61 6e 67 65 2c 20 30 29 29 3b 0a 20 20 20 20  Range, 0));.    
19aa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
19ab0 6e 64 5f 69 6e 74 28 70 55 70 64 61 74 65 31 2c  nd_int(pUpdate1,
19ac0 20 33 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   3, sqlite3_colu
19ad0 6d 6e 5f 69 6e 74 28 70 52 61 6e 67 65 2c 20 31  mn_int(pRange, 1
19ae0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ));.          sq
19af0 6c 69 74 65 33 5f 73 74 65 70 28 70 55 70 64 61  lite3_step(pUpda
19b00 74 65 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  te1);.          
19b10 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
19b20 65 74 28 70 55 70 64 61 74 65 31 29 3b 0a 20 20  et(pUpdate1);.  
19b30 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
19b40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19b50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
19b60 5f 72 65 73 65 74 28 70 52 61 6e 67 65 29 3b 0a  _reset(pRange);.
19b70 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
19b80 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
19b90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
19ba0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
19bb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19bc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19bd0 5f 72 65 73 65 74 28 70 52 61 6e 67 65 29 3b 0a  _reset(pRange);.
19be0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
19bf0 2a 20 4d 6f 76 65 20 6c 65 76 65 6c 20 2d 31 20  * Move level -1 
19c00 74 6f 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76  to level iAbsLev
19c10 65 6c 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  el */.      if( 
19c20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19c30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19c40 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 55 70 64  _bind_int64(pUpd
19c50 61 74 65 32 2c 20 31 2c 20 69 41 62 73 4c 65 76  ate2, 1, iAbsLev
19c60 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  el);.        sql
19c70 69 74 65 33 5f 73 74 65 70 28 70 55 70 64 61 74  ite3_step(pUpdat
19c80 65 32 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  e2);.        rc 
19c90 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
19ca0 70 55 70 64 61 74 65 32 29 3b 0a 20 20 20 20 20  pUpdate2);.     
19cb0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20   }.    }.  }... 
19cc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19cd0 2a 0a 2a 2a 20 4d 65 72 67 65 20 61 6c 6c 20 6c  *.** Merge all l
19ce0 65 76 65 6c 20 69 4c 65 76 65 6c 20 73 65 67 6d  evel iLevel segm
19cf0 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61  ents in the data
19d00 62 61 73 65 20 69 6e 74 6f 20 61 20 73 69 6e 67  base into a sing
19d10 6c 65 20 0a 2a 2a 20 69 4c 65 76 65 6c 2b 31 20  le .** iLevel+1 
19d20 73 65 67 6d 65 6e 74 2e 20 4f 72 2c 20 69 66 20  segment. Or, if 
19d30 69 4c 65 76 65 6c 3c 30 2c 20 6d 65 72 67 65 20  iLevel<0, merge 
19d40 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 74  all segments int
19d50 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 73 65  o a.** single se
19d60 67 6d 65 6e 74 20 77 69 74 68 20 61 20 6c 65 76  gment with a lev
19d70 65 6c 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  el equal to the 
19d80 6e 75 6d 65 72 69 63 61 6c 6c 79 20 6c 61 72 67  numerically larg
19d90 65 73 74 20 6c 65 76 65 6c 20 0a 2a 2a 20 63 75  est level .** cu
19da0 72 72 65 6e 74 6c 79 20 70 72 65 73 65 6e 74 20  rrently present 
19db0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
19dc0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  .**.** If this f
19dd0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
19de0 64 20 77 69 74 68 20 69 4c 65 76 65 6c 3c 30 2c  d with iLevel<0,
19df0 20 62 75 74 20 74 68 65 72 65 20 69 73 20 6f 6e   but there is on
19e00 6c 79 20 6f 6e 65 0a 2a 2a 20 73 65 67 6d 65 6e  ly one.** segmen
19e10 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
19e20 65 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  e, SQLITE_DONE i
19e30 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64  s returned immed
19e40 69 61 74 65 6c 79 2e 20 0a 2a 2a 20 4f 74 68 65  iately. .** Othe
19e50 72 77 69 73 65 2c 20 69 66 20 73 75 63 63 65 73  rwise, if succes
19e60 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
19e70 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
19e80 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
19e90 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65   .** an SQLite e
19ea0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
19eb0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
19ec0 20 69 6e 74 20 66 74 73 33 53 65 67 6d 65 6e 74   int fts3Segment
19ed0 4d 65 72 67 65 28 0a 20 20 46 74 73 33 54 61 62  Merge(.  Fts3Tab
19ee0 6c 65 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 4c  le *p, .  int iL
19ef0 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20 20  angid,          
19f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e            /* Lan
19f10 67 75 61 67 65 20 69 64 20 74 6f 20 6d 65 72 67  guage id to merg
19f20 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65  e */.  int iInde
19f30 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
19f40 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
19f50 69 6e 20 70 2d 3e 61 49 6e 64 65 78 5b 5d 20 74  in p->aIndex[] t
19f60 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74  o merge */.  int
19f70 20 69 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20   iLevel         
19f80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19f90 4c 65 76 65 6c 20 74 6f 20 6d 65 72 67 65 20 2a  Level to merge *
19fa0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
19fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fc0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
19fd0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
19fe0 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Idx = 0;        
19ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1a000 64 65 78 20 6f 66 20 6e 65 77 20 73 65 67 6d 65  dex of new segme
1a010 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  nt */.  sqlite3_
1a020 69 6e 74 36 34 20 69 4e 65 77 4c 65 76 65 6c 20  int64 iNewLevel 
1a030 3d 20 30 3b 20 20 20 20 2f 2a 20 4c 65 76 65 6c  = 0;    /* Level
1a040 2f 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65  /index to create
1a050 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 61 74 20   new segment at 
1a060 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 57 72 69 74  */.  SegmentWrit
1a070 65 72 20 2a 70 57 72 69 74 65 72 20 3d 20 30 3b  er *pWriter = 0;
1a080 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
1a090 77 72 69 74 65 20 74 68 65 20 6e 65 77 2c 20 6d  write the new, m
1a0a0 65 72 67 65 64 2c 20 73 65 67 6d 65 6e 74 20 2a  erged, segment *
1a0b0 2f 0a 20 20 46 74 73 33 53 65 67 46 69 6c 74 65  /.  Fts3SegFilte
1a0c0 72 20 66 69 6c 74 65 72 3b 20 20 20 20 20 20 20  r filter;       
1a0d0 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74      /* Segment t
1a0e0 65 72 6d 20 66 69 6c 74 65 72 20 63 6f 6e 64 69  erm filter condi
1a0f0 74 69 6f 6e 20 2a 2f 0a 20 20 46 74 73 33 4d 75  tion */.  Fts3Mu
1a100 6c 74 69 53 65 67 52 65 61 64 65 72 20 63 73 72  ltiSegReader csr
1a110 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72  ;         /* Cur
1a120 73 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74  sor to iterate t
1a130 68 72 6f 75 67 68 20 6c 65 76 65 6c 28 73 29 20  hrough level(s) 
1a140 2a 2f 0a 20 20 69 6e 74 20 62 49 67 6e 6f 72 65  */.  int bIgnore
1a150 45 6d 70 74 79 20 3d 20 30 3b 20 20 20 20 20 20  Empty = 0;      
1a160 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
1a170 69 67 6e 6f 72 65 20 65 6d 70 74 79 20 73 65 67  ignore empty seg
1a180 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 36 34 20 69  ments */.  i64 i
1a190 4d 61 78 4c 65 76 65 6c 20 3d 20 30 3b 20 20 20  MaxLevel = 0;   
1a1a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1a1b0 78 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20 66  x level number f
1a1c0 6f 72 20 74 68 69 73 20 69 6e 64 65 78 2f 6c 61  or this index/la
1a1d0 6e 67 69 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ngid */..  asser
1a1e0 74 28 20 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f  t( iLevel==FTS3_
1a1f0 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c 0a 20 20  SEGCURSOR_ALL.  
1a200 20 20 20 20 20 7c 7c 20 69 4c 65 76 65 6c 3d 3d       || iLevel==
1a210 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 50  FTS3_SEGCURSOR_P
1a220 45 4e 44 49 4e 47 0a 20 20 20 20 20 20 20 7c 7c  ENDING.       ||
1a230 20 69 4c 65 76 65 6c 3e 3d 30 0a 20 20 29 3b 0a   iLevel>=0.  );.
1a240 20 20 61 73 73 65 72 74 28 20 69 4c 65 76 65 6c    assert( iLevel
1a250 3c 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58  <FTS3_SEGDIR_MAX
1a260 4c 45 56 45 4c 20 29 3b 0a 20 20 61 73 73 65 72  LEVEL );.  asser
1a270 74 28 20 69 49 6e 64 65 78 3e 3d 30 20 26 26 20  t( iIndex>=0 && 
1a280 69 49 6e 64 65 78 3c 70 2d 3e 6e 49 6e 64 65 78  iIndex<p->nIndex
1a290 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   );..  rc = sqli
1a2a0 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72  te3Fts3SegReader
1a2b0 43 75 72 73 6f 72 28 70 2c 20 69 4c 61 6e 67 69  Cursor(p, iLangi
1a2c0 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65 76 65  d, iIndex, iLeve
1a2d0 6c 2c 20 30 2c 20 30 2c 20 31 2c 20 30 2c 20 26  l, 0, 0, 1, 0, &
1a2e0 63 73 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  csr);.  if( rc!=
1a2f0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 73 72  SQLITE_OK || csr
1a300 2e 6e 53 65 67 6d 65 6e 74 3d 3d 30 20 29 20 67  .nSegment==0 ) g
1a310 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 0a 20  oto finished;.. 
1a320 20 69 66 28 20 69 4c 65 76 65 6c 21 3d 46 54 53   if( iLevel!=FTS
1a330 33 5f 53 45 47 43 55 52 53 4f 52 5f 50 45 4e 44  3_SEGCURSOR_PEND
1a340 49 4e 47 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ING ){.    rc = 
1a350 66 74 73 33 53 65 67 6d 65 6e 74 4d 61 78 4c 65  fts3SegmentMaxLe
1a360 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20  vel(p, iLangid, 
1a370 69 49 6e 64 65 78 2c 20 26 69 4d 61 78 4c 65 76  iIndex, &iMaxLev
1a380 65 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  el);.    if( rc!
1a390 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1a3a0 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 7d 0a  o finished;.  }.
1a3b0 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3d 3d 46  .  if( iLevel==F
1a3c0 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c  TS3_SEGCURSOR_AL
1a3d0 4c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  L ){.    /* This
1a3e0 20 63 61 6c 6c 20 69 73 20 74 6f 20 6d 65 72 67   call is to merg
1a3f0 65 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69  e all segments i
1a400 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  n the database t
1a410 6f 20 61 20 73 69 6e 67 6c 65 0a 20 20 20 20 2a  o a single.    *
1a420 2a 20 73 65 67 6d 65 6e 74 2e 20 54 68 65 20 6c  * segment. The l
1a430 65 76 65 6c 20 6f 66 20 74 68 65 20 6e 65 77 20  evel of the new 
1a440 73 65 67 6d 65 6e 74 20 69 73 20 65 71 75 61 6c  segment is equal
1a450 20 74 6f 20 74 68 65 20 6e 75 6d 65 72 69 63 61   to the numerica
1a460 6c 6c 79 0a 20 20 20 20 2a 2a 20 67 72 65 61 74  lly.    ** great
1a470 65 73 74 20 73 65 67 6d 65 6e 74 20 6c 65 76 65  est segment leve
1a480 6c 20 63 75 72 72 65 6e 74 6c 79 20 70 72 65 73  l currently pres
1a490 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
1a4a0 61 73 65 20 66 6f 72 20 74 68 69 73 0a 20 20 20  ase for this.   
1a4b0 20 2a 2a 20 69 6e 64 65 78 2e 20 54 68 65 20 69   ** index. The i
1a4c0 64 78 20 6f 66 20 74 68 65 20 6e 65 77 20 73 65  dx of the new se
1a4d0 67 6d 65 6e 74 20 69 73 20 61 6c 77 61 79 73 20  gment is always 
1a4e0 30 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63  0.  */.    if( c
1a4f0 73 72 2e 6e 53 65 67 6d 65 6e 74 3d 3d 31 20 26  sr.nSegment==1 &
1a500 26 20 30 3d 3d 66 74 73 33 53 65 67 52 65 61 64  & 0==fts3SegRead
1a510 65 72 49 73 50 65 6e 64 69 6e 67 28 63 73 72 2e  erIsPending(csr.
1a520 61 70 53 65 67 6d 65 6e 74 5b 30 5d 29 20 29 7b  apSegment[0]) ){
1a530 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1a540 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 67  TE_DONE;.      g
1a550 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20 20  oto finished;.  
1a560 20 20 7d 0a 20 20 20 20 69 4e 65 77 4c 65 76 65    }.    iNewLeve
1a570 6c 20 3d 20 69 4d 61 78 4c 65 76 65 6c 3b 0a 20  l = iMaxLevel;. 
1a580 20 20 20 62 49 67 6e 6f 72 65 45 6d 70 74 79 20     bIgnoreEmpty 
1a590 3d 20 31 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20  = 1;..  }else{. 
1a5a0 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
1a5b0 69 73 20 74 6f 20 6d 65 72 67 65 20 61 6c 6c 20  is to merge all 
1a5c0 73 65 67 6d 65 6e 74 73 20 61 74 20 6c 65 76 65  segments at leve
1a5d0 6c 20 69 4c 65 76 65 6c 2e 20 66 69 6e 64 20 74  l iLevel. find t
1a5e0 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 61  he next.    ** a
1a5f0 76 61 69 6c 61 62 6c 65 20 73 65 67 6d 65 6e 74  vailable segment
1a600 20 69 6e 64 65 78 20 61 74 20 6c 65 76 65 6c 20   index at level 
1a610 69 4c 65 76 65 6c 2b 31 2e 20 54 68 65 20 63 61  iLevel+1. The ca
1a620 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 66 74 73  ll to.    ** fts
1a630 33 41 6c 6c 6f 63 61 74 65 53 65 67 64 69 72 49  3AllocateSegdirI
1a640 64 78 28 29 20 77 69 6c 6c 20 6d 65 72 67 65 20  dx() will merge 
1a650 74 68 65 20 73 65 67 6d 65 6e 74 73 20 61 74 20  the segments at 
1a660 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2b 31 20 74  level iLevel+1 t
1a670 6f 20 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e 67  o .    ** a sing
1a680 6c 65 20 69 4c 65 76 65 6c 2b 32 20 73 65 67 6d  le iLevel+2 segm
1a690 65 6e 74 20 69 66 20 6e 65 63 65 73 73 61 72 79  ent if necessary
1a6a0 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
1a6b0 28 20 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52  ( FTS3_SEGCURSOR
1a6c0 5f 50 45 4e 44 49 4e 47 3d 3d 2d 31 20 29 3b 0a  _PENDING==-1 );.
1a6d0 20 20 20 20 69 4e 65 77 4c 65 76 65 6c 20 3d 20      iNewLevel = 
1a6e0 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c  getAbsoluteLevel
1a6f0 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e  (p, iLangid, iIn
1a700 64 65 78 2c 20 69 4c 65 76 65 6c 2b 31 29 3b 0a  dex, iLevel+1);.
1a710 20 20 20 20 72 63 20 3d 20 66 74 73 33 41 6c 6c      rc = fts3All
1a720 6f 63 61 74 65 53 65 67 64 69 72 49 64 78 28 70  ocateSegdirIdx(p
1a730 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
1a740 78 2c 20 69 4c 65 76 65 6c 2b 31 2c 20 26 69 49  x, iLevel+1, &iI
1a750 64 78 29 3b 0a 20 20 20 20 62 49 67 6e 6f 72 65  dx);.    bIgnore
1a760 45 6d 70 74 79 20 3d 20 28 69 4c 65 76 65 6c 21  Empty = (iLevel!
1a770 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f  =FTS3_SEGCURSOR_
1a780 50 45 4e 44 49 4e 47 29 20 26 26 20 28 69 4e 65  PENDING) && (iNe
1a790 77 4c 65 76 65 6c 3e 69 4d 61 78 4c 65 76 65 6c  wLevel>iMaxLevel
1a7a0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
1a7b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1a7c0 6f 20 66 69 6e 69 73 68 65 64 3b 0a 0a 20 20 61  o finished;..  a
1a7d0 73 73 65 72 74 28 20 63 73 72 2e 6e 53 65 67 6d  ssert( csr.nSegm
1a7e0 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ent>0 );.  asser
1a7f0 74 28 20 69 4e 65 77 4c 65 76 65 6c 3e 3d 67 65  t( iNewLevel>=ge
1a800 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70  tAbsoluteLevel(p
1a810 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
1a820 78 2c 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72  x, 0) );.  asser
1a830 74 28 20 69 4e 65 77 4c 65 76 65 6c 3c 67 65 74  t( iNewLevel<get
1a840 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c  AbsoluteLevel(p,
1a850 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78   iLangid, iIndex
1a860 2c 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58  ,FTS3_SEGDIR_MAX
1a870 4c 45 56 45 4c 29 20 29 3b 0a 0a 20 20 6d 65 6d  LEVEL) );..  mem
1a880 73 65 74 28 26 66 69 6c 74 65 72 2c 20 30 2c 20  set(&filter, 0, 
1a890 73 69 7a 65 6f 66 28 46 74 73 33 53 65 67 46 69  sizeof(Fts3SegFi
1a8a0 6c 74 65 72 29 29 3b 0a 20 20 66 69 6c 74 65 72  lter));.  filter
1a8b0 2e 66 6c 61 67 73 20 3d 20 46 54 53 33 5f 53 45  .flags = FTS3_SE
1a8c0 47 4d 45 4e 54 5f 52 45 51 55 49 52 45 5f 50 4f  GMENT_REQUIRE_PO
1a8d0 53 3b 0a 20 20 66 69 6c 74 65 72 2e 66 6c 61 67  S;.  filter.flag
1a8e0 73 20 7c 3d 20 28 62 49 67 6e 6f 72 65 45 6d 70  s |= (bIgnoreEmp
1a8f0 74 79 20 3f 20 46 54 53 33 5f 53 45 47 4d 45 4e  ty ? FTS3_SEGMEN
1a900 54 5f 49 47 4e 4f 52 45 5f 45 4d 50 54 59 20 3a  T_IGNORE_EMPTY :
1a910 20 30 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   0);..  rc = sql
1a920 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
1a930 72 53 74 61 72 74 28 70 2c 20 26 63 73 72 2c 20  rStart(p, &csr, 
1a940 26 66 69 6c 74 65 72 29 3b 0a 20 20 77 68 69 6c  &filter);.  whil
1a950 65 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63  e( SQLITE_OK==rc
1a960 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1a970 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
1a980 72 53 74 65 70 28 70 2c 20 26 63 73 72 29 3b 0a  rStep(p, &csr);.
1a990 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1a9a0 54 45 5f 52 4f 57 20 29 20 62 72 65 61 6b 3b 0a  TE_ROW ) break;.
1a9b0 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67      rc = fts3Seg
1a9c0 57 72 69 74 65 72 41 64 64 28 70 2c 20 26 70 57  WriterAdd(p, &pW
1a9d0 72 69 74 65 72 2c 20 31 2c 20 0a 20 20 20 20 20  riter, 1, .     
1a9e0 20 20 20 63 73 72 2e 7a 54 65 72 6d 2c 20 63 73     csr.zTerm, cs
1a9f0 72 2e 6e 54 65 72 6d 2c 20 63 73 72 2e 61 44 6f  r.nTerm, csr.aDo
1aa00 63 6c 69 73 74 2c 20 63 73 72 2e 6e 44 6f 63 6c  clist, csr.nDocl
1aa10 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ist);.  }.  if( 
1aa20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1aa30 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20  goto finished;. 
1aa40 20 61 73 73 65 72 74 28 20 70 57 72 69 74 65 72   assert( pWriter
1aa50 20 7c 7c 20 62 49 67 6e 6f 72 65 45 6d 70 74 79   || bIgnoreEmpty
1aa60 20 29 3b 0a 0a 20 20 69 66 28 20 69 4c 65 76 65   );..  if( iLeve
1aa70 6c 21 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f  l!=FTS3_SEGCURSO
1aa80 52 5f 50 45 4e 44 49 4e 47 20 29 7b 0a 20 20 20  R_PENDING ){.   
1aa90 20 72 63 20 3d 20 66 74 73 33 44 65 6c 65 74 65   rc = fts3Delete
1aaa0 53 65 67 64 69 72 28 0a 20 20 20 20 20 20 20 20  Segdir(.        
1aab0 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64  p, iLangid, iInd
1aac0 65 78 2c 20 69 4c 65 76 65 6c 2c 20 63 73 72 2e  ex, iLevel, csr.
1aad0 61 70 53 65 67 6d 65 6e 74 2c 20 63 73 72 2e 6e  apSegment, csr.n
1aae0 53 65 67 6d 65 6e 74 0a 20 20 20 20 29 3b 0a 20  Segment.    );. 
1aaf0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ab00 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69  E_OK ) goto fini
1ab10 73 68 65 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  shed;.  }.  if( 
1ab20 70 57 72 69 74 65 72 20 29 7b 0a 20 20 20 20 72  pWriter ){.    r
1ab30 63 20 3d 20 66 74 73 33 53 65 67 57 72 69 74 65  c = fts3SegWrite
1ab40 72 46 6c 75 73 68 28 70 2c 20 70 57 72 69 74 65  rFlush(p, pWrite
1ab50 72 2c 20 69 4e 65 77 4c 65 76 65 6c 2c 20 69 49  r, iNewLevel, iI
1ab60 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  dx);.    if( rc=
1ab70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ab80 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c 3d 3d      if( iLevel==
1ab90 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 50  FTS3_SEGCURSOR_P
1aba0 45 4e 44 49 4e 47 20 7c 7c 20 69 4e 65 77 4c 65  ENDING || iNewLe
1abb0 76 65 6c 3c 69 4d 61 78 4c 65 76 65 6c 20 29 7b  vel<iMaxLevel ){
1abc0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74  .        rc = ft
1abd0 73 33 50 72 6f 6d 6f 74 65 53 65 67 6d 65 6e 74  s3PromoteSegment
1abe0 73 28 70 2c 20 69 4e 65 77 4c 65 76 65 6c 2c 20  s(p, iNewLevel, 
1abf0 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61  pWriter->nLeafDa
1ac00 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ta);.      }.   
1ac10 20 7d 0a 20 20 7d 0a 0a 20 66 69 6e 69 73 68 65   }.  }.. finishe
1ac20 64 3a 0a 20 20 66 74 73 33 53 65 67 57 72 69 74  d:.  fts3SegWrit
1ac30 65 72 46 72 65 65 28 70 57 72 69 74 65 72 29 3b  erFree(pWriter);
1ac40 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65  .  sqlite3Fts3Se
1ac50 67 52 65 61 64 65 72 46 69 6e 69 73 68 28 26 63  gReaderFinish(&c
1ac60 73 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  sr);.  return rc
1ac70 3b 0a 7d 0a 0a 0a 2f 2a 20 0a 2a 2a 20 46 6c 75  ;.}.../* .** Flu
1ac80 73 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  sh the contents 
1ac90 6f 66 20 70 65 6e 64 69 6e 67 54 65 72 6d 73 20  of pendingTerms 
1aca0 74 6f 20 6c 65 76 65 6c 20 30 20 73 65 67 6d 65  to level 0 segme
1acb0 6e 74 73 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nts. .*/.int sql
1acc0 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67 54  ite3Fts3PendingT
1acd0 65 72 6d 73 46 6c 75 73 68 28 46 74 73 33 54 61  ermsFlush(Fts3Ta
1ace0 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ble *p){.  int r
1acf0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1ad00 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
1ad10 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
1ad20 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70  SQLITE_OK && i<p
1ad30 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a  ->nIndex; i++){.
1ad40 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67      rc = fts3Seg
1ad50 6d 65 6e 74 4d 65 72 67 65 28 70 2c 20 70 2d 3e  mentMerge(p, p->
1ad60 69 50 72 65 76 4c 61 6e 67 69 64 2c 20 69 2c 20  iPrevLangid, i, 
1ad70 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 50  FTS3_SEGCURSOR_P
1ad80 45 4e 44 49 4e 47 29 3b 0a 20 20 20 20 69 66 28  ENDING);.    if(
1ad90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1ada0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f   ) rc = SQLITE_O
1adb0 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  K;.  }.  sqlite3
1adc0 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73  Fts3PendingTerms
1add0 43 6c 65 61 72 28 70 29 3b 0a 0a 20 20 2f 2a 20  Clear(p);..  /* 
1ade0 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 61 75  Determine the au
1adf0 74 6f 2d 69 6e 63 72 2d 6d 65 72 67 65 20 73 65  to-incr-merge se
1ae00 74 74 69 6e 67 20 69 66 20 75 6e 6b 6e 6f 77 6e  tting if unknown
1ae10 2e 20 20 49 66 20 65 6e 61 62 6c 65 64 2c 0a 20  .  If enabled,. 
1ae20 20 2a 2a 20 65 73 74 69 6d 61 74 65 20 74 68 65   ** estimate the
1ae30 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   number of leaf 
1ae40 62 6c 6f 63 6b 73 20 6f 66 20 63 6f 6e 74 65 6e  blocks of conten
1ae50 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 0a  t to be written.
1ae60 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
1ae70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 62  QLITE_OK && p->b
1ae80 48 61 73 53 74 61 74 0a 20 20 20 26 26 20 70 2d  HasStat.   && p-
1ae90 3e 6e 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 3d  >nAutoincrmerge=
1aea0 3d 30 78 66 66 20 26 26 20 70 2d 3e 6e 4c 65 61  =0xff && p->nLea
1aeb0 66 41 64 64 3e 30 0a 20 20 29 7b 0a 20 20 20 20  fAdd>0.  ){.    
1aec0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1aed0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  tmt = 0;.    rc 
1aee0 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
1aef0 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 54 41 54   SQL_SELECT_STAT
1af00 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
1af10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1af20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
1af30 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53  ite3_bind_int(pS
1af40 74 6d 74 2c 20 31 2c 20 46 54 53 5f 53 54 41 54  tmt, 1, FTS_STAT
1af50 5f 41 55 54 4f 49 4e 43 52 4d 45 52 47 45 29 3b  _AUTOINCRMERGE);
1af60 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1af70 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
1af80 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1af90 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
1afa0 20 20 20 20 20 70 2d 3e 6e 41 75 74 6f 69 6e 63       p->nAutoinc
1afb0 72 6d 65 72 67 65 20 3d 20 73 71 6c 69 74 65 33  rmerge = sqlite3
1afc0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
1afd0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  t, 0);.        i
1afe0 66 28 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d  f( p->nAutoincrm
1aff0 65 72 67 65 3d 3d 31 20 29 20 70 2d 3e 6e 41 75  erge==1 ) p->nAu
1b000 74 6f 69 6e 63 72 6d 65 72 67 65 20 3d 20 38 3b  toincrmerge = 8;
1b010 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1b020 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1b030 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
1b040 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 20 3d 20  Autoincrmerge = 
1b050 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1b060 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
1b070 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  set(pStmt);.    
1b080 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1b090 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 63 6f  c;.}../*.** Enco
1b0a0 64 65 20 4e 20 69 6e 74 65 67 65 72 73 20 61 73  de N integers as
1b0b0 20 76 61 72 69 6e 74 73 20 69 6e 74 6f 20 61 20   varints into a 
1b0c0 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  blob..*/.static 
1b0d0 76 6f 69 64 20 66 74 73 33 45 6e 63 6f 64 65 49  void fts3EncodeI
1b0e0 6e 74 41 72 72 61 79 28 0a 20 20 69 6e 74 20 4e  ntArray(.  int N
1b0f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1b100 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   The number of i
1b110 6e 74 65 67 65 72 73 20 74 6f 20 65 6e 63 6f 64  ntegers to encod
1b120 65 20 2a 2f 0a 20 20 75 33 32 20 2a 61 2c 20 20  e */.  u32 *a,  
1b130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b140 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20   integer values 
1b150 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 2c  */.  char *zBuf,
1b160 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1b170 20 74 68 65 20 42 4c 4f 42 20 68 65 72 65 20 2a   the BLOB here *
1b180 2f 0a 20 20 69 6e 74 20 2a 70 4e 42 75 66 20 20  /.  int *pNBuf  
1b190 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1b1a0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1b1b0 69 66 20 7a 42 75 66 5b 5d 20 75 73 65 64 20 68  if zBuf[] used h
1b1c0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
1b1d0 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  i, j;.  for(i=j=
1b1e0 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<N; i++){.  
1b1f0 20 20 6a 20 2b 3d 20 73 71 6c 69 74 65 33 46 74    j += sqlite3Ft
1b200 73 33 50 75 74 56 61 72 69 6e 74 28 26 7a 42 75  s3PutVarint(&zBu
1b210 66 5b 6a 5d 2c 20 28 73 71 6c 69 74 65 33 5f 69  f[j], (sqlite3_i
1b220 6e 74 36 34 29 61 5b 69 5d 29 3b 0a 20 20 7d 0a  nt64)a[i]);.  }.
1b230 20 20 2a 70 4e 42 75 66 20 3d 20 6a 3b 0a 7d 0a    *pNBuf = j;.}.
1b240 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20  ./*.** Decode a 
1b250 62 6c 6f 62 20 6f 66 20 76 61 72 69 6e 74 73 20  blob of varints 
1b260 69 6e 74 6f 20 4e 20 69 6e 74 65 67 65 72 73 0a  into N integers.
1b270 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1b280 74 73 33 44 65 63 6f 64 65 49 6e 74 41 72 72 61  ts3DecodeIntArra
1b290 79 28 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  y(.  int N,     
1b2a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1b2b0 75 6d 62 65 72 20 6f 66 20 69 6e 74 65 67 65 72  umber of integer
1b2c0 73 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a 20  s to decode */. 
1b2d0 20 75 33 32 20 2a 61 2c 20 20 20 20 20 20 20 20   u32 *a,        
1b2e0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
1b2f0 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20   integer values 
1b300 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1b310 2a 7a 42 75 66 2c 20 20 2f 2a 20 54 68 65 20 42  *zBuf,  /* The B
1b320 4c 4f 42 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  LOB containing t
1b330 68 65 20 76 61 72 69 6e 74 73 20 2a 2f 0a 20 20  he varints */.  
1b340 69 6e 74 20 6e 42 75 66 20 20 20 20 20 20 20 20  int nBuf        
1b350 20 20 20 2f 2a 20 73 69 7a 65 20 6f 66 20 74 68     /* size of th
1b360 65 20 42 4c 4f 42 20 2a 2f 0a 29 7b 0a 20 20 69  e BLOB */.){.  i
1b370 6e 74 20 69 2c 20 6a 3b 0a 20 20 55 4e 55 53 45  nt i, j;.  UNUSE
1b380 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 42 75 66  D_PARAMETER(nBuf
1b390 29 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  );.  for(i=j=0; 
1b3a0 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  i<N; i++){.    s
1b3b0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 78 3b 0a  qlite3_int64 x;.
1b3c0 20 20 20 20 6a 20 2b 3d 20 73 71 6c 69 74 65 33      j += sqlite3
1b3d0 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 26 7a  Fts3GetVarint(&z
1b3e0 42 75 66 5b 6a 5d 2c 20 26 78 29 3b 0a 20 20 20  Buf[j], &x);.   
1b3f0 20 61 73 73 65 72 74 28 6a 3c 3d 6e 42 75 66 29   assert(j<=nBuf)
1b400 3b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 28 75 33  ;.    a[i] = (u3
1b410 32 29 28 78 20 26 20 30 78 66 66 66 66 66 66 66  2)(x & 0xfffffff
1b420 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  f);.  }.}../*.**
1b430 20 49 6e 73 65 72 74 20 74 68 65 20 73 69 7a 65   Insert the size
1b440 73 20 28 69 6e 20 74 6f 6b 65 6e 73 29 20 66 6f  s (in tokens) fo
1b450 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66  r each column of
1b460 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 0a 2a 2a   the document.**
1b470 20 77 69 74 68 20 64 6f 63 69 64 20 65 71 75 61   with docid equa
1b480 6c 20 74 6f 20 70 2d 3e 69 50 72 65 76 44 6f 63  l to p->iPrevDoc
1b490 69 64 2e 20 20 54 68 65 20 73 69 7a 65 73 20 61  id.  The sizes a
1b4a0 72 65 20 65 6e 63 6f 64 65 64 20 61 73 0a 2a 2a  re encoded as.**
1b4b0 20 61 20 62 6c 6f 62 20 6f 66 20 76 61 72 69 6e   a blob of varin
1b4c0 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
1b4d0 69 64 20 66 74 73 33 49 6e 73 65 72 74 44 6f 63  id fts3InsertDoc
1b4e0 73 69 7a 65 28 0a 20 20 69 6e 74 20 2a 70 52 43  size(.  int *pRC
1b4f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b500 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1b510 74 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33  t code */.  Fts3
1b520 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
1b530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b540 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20  able into which 
1b550 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 75  to insert */.  u
1b560 33 32 20 2a 61 53 7a 20 20 20 20 20 20 20 20 20  32 *aSz         
1b570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b580 2a 20 53 69 7a 65 73 20 6f 66 20 65 61 63 68 20  * Sizes of each 
1b590 63 6f 6c 75 6d 6e 2c 20 69 6e 20 74 6f 6b 65 6e  column, in token
1b5a0 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  s */.){.  char *
1b5b0 70 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20  pBlob;          
1b5c0 20 20 20 2f 2a 20 54 68 65 20 42 4c 4f 42 20 65     /* The BLOB e
1b5d0 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 64  ncoding of the d
1b5e0 6f 63 75 6d 65 6e 74 20 73 69 7a 65 20 2a 2f 0a  ocument size */.
1b5f0 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20    int nBlob;    
1b600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1b610 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
1b620 20 74 68 65 20 42 4c 4f 42 20 2a 2f 0a 20 20 73   the BLOB */.  s
1b630 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1b640 6d 74 3b 20 20 20 20 20 2f 2a 20 53 74 61 74 65  mt;     /* State
1b650 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 69 6e 73  ment used to ins
1b660 65 72 74 20 74 68 65 20 65 6e 63 6f 64 69 6e 67  ert the encoding
1b670 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
1b680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b690 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72  * Result code fr
1b6a0 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20  om subfunctions 
1b6b0 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  */..  if( *pRC )
1b6c0 20 72 65 74 75 72 6e 3b 0a 20 20 70 42 6c 6f 62   return;.  pBlob
1b6d0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1b6e0 63 28 20 31 30 2a 70 2d 3e 6e 43 6f 6c 75 6d 6e  c( 10*p->nColumn
1b6f0 20 29 3b 0a 20 20 69 66 28 20 70 42 6c 6f 62 3d   );.  if( pBlob=
1b700 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  =0 ){.    *pRC =
1b710 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1b720 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1b730 20 66 74 73 33 45 6e 63 6f 64 65 49 6e 74 41 72   fts3EncodeIntAr
1b740 72 61 79 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20  ray(p->nColumn, 
1b750 61 53 7a 2c 20 70 42 6c 6f 62 2c 20 26 6e 42 6c  aSz, pBlob, &nBl
1b760 6f 62 29 3b 0a 20 20 72 63 20 3d 20 66 74 73 33  ob);.  rc = fts3
1b770 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 52  SqlStmt(p, SQL_R
1b780 45 50 4c 41 43 45 5f 44 4f 43 53 49 5a 45 2c 20  EPLACE_DOCSIZE, 
1b790 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66  &pStmt, 0);.  if
1b7a0 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( rc ){.    sqli
1b7b0 74 65 33 5f 66 72 65 65 28 70 42 6c 6f 62 29 3b  te3_free(pBlob);
1b7c0 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
1b7d0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1b7e0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
1b7f0 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 70  nt64(pStmt, 1, p
1b800 2d 3e 69 50 72 65 76 44 6f 63 69 64 29 3b 0a 20  ->iPrevDocid);. 
1b810 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
1b820 6f 62 28 70 53 74 6d 74 2c 20 32 2c 20 70 42 6c  ob(pStmt, 2, pBl
1b830 6f 62 2c 20 6e 42 6c 6f 62 2c 20 73 71 6c 69 74  ob, nBlob, sqlit
1b840 65 33 5f 66 72 65 65 29 3b 0a 20 20 73 71 6c 69  e3_free);.  sqli
1b850 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
1b860 0a 20 20 2a 70 52 43 20 3d 20 73 71 6c 69 74 65  .  *pRC = sqlite
1b870 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
1b880 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20  }../*.** Record 
1b890 30 20 6f 66 20 74 68 65 20 25 5f 73 74 61 74 20  0 of the %_stat 
1b8a0 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61  table contains a
1b8b0 20 62 6c 6f 62 20 63 6f 6e 73 69 73 74 69 6e 67   blob consisting
1b8c0 20 6f 66 20 4e 20 76 61 72 69 6e 74 73 2c 0a 2a   of N varints,.*
1b8d0 2a 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65  * where N is the
1b8e0 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 20   number of user 
1b8f0 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 20  defined columns 
1b900 69 6e 20 74 68 65 20 66 74 73 33 20 74 61 62 6c  in the fts3 tabl
1b910 65 20 70 6c 75 73 0a 2a 2a 20 74 77 6f 2e 20 49  e plus.** two. I
1b920 66 20 6e 43 6f 6c 20 69 73 20 74 68 65 20 6e 75  f nCol is the nu
1b930 6d 62 65 72 20 6f 66 20 75 73 65 72 20 64 65 66  mber of user def
1b940 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  ined columns, th
1b950 65 6e 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65  en values of the
1b960 20 0a 2a 2a 20 76 61 72 69 6e 74 73 20 61 72 65   .** varints are
1b970 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a   set as follows:
1b980 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 6e 74 20  .**.**   Varint 
1b990 30 3a 20 20 20 20 20 20 20 54 6f 74 61 6c 20 6e  0:       Total n
1b9a0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
1b9b0 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
1b9c0 2a 20 20 20 56 61 72 69 6e 74 20 31 2e 2e 6e 43  *   Varint 1..nC
1b9d0 6f 6c 3a 20 46 6f 72 20 65 61 63 68 20 63 6f 6c  ol: For each col
1b9e0 75 6d 6e 2c 20 74 68 65 20 74 6f 74 61 6c 20 6e  umn, the total n
1b9f0 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20  umber of tokens 
1ba00 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 20  stored in.**    
1ba10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1ba20 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 61 6c  he column for al
1ba30 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61  l rows of the ta
1ba40 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72  ble..**.**   Var
1ba50 69 6e 74 20 31 2b 6e 43 6f 6c 3a 20 20 54 68 65  int 1+nCol:  The
1ba60 20 74 6f 74 61 6c 20 73 69 7a 65 2c 20 69 6e 20   total size, in 
1ba70 62 79 74 65 73 2c 20 6f 66 20 61 6c 6c 20 74 65  bytes, of all te
1ba80 78 74 20 76 61 6c 75 65 73 20 69 6e 20 61 6c 6c  xt values in all
1ba90 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1baa0 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66        columns of
1bab0 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65   all rows of the
1bac0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74   table..**.*/.st
1bad0 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 55 70  atic void fts3Up
1bae0 64 61 74 65 44 6f 63 54 6f 74 61 6c 73 28 0a 20  dateDocTotals(. 
1baf0 20 69 6e 74 20 2a 70 52 43 2c 20 20 20 20 20 20   int *pRC,      
1bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb10 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 63   /* The result c
1bb20 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 54 61 62  ode */.  Fts3Tab
1bb30 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
1bb40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1bb50 65 20 62 65 69 6e 67 20 75 70 64 61 74 65 64 20  e being updated 
1bb60 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a 49 6e 73  */.  u32 *aSzIns
1bb70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1bb80 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 69 6e 63       /* Size inc
1bb90 72 65 61 73 65 73 20 2a 2f 0a 20 20 75 33 32 20  reases */.  u32 
1bba0 2a 61 53 7a 44 65 6c 2c 20 20 20 20 20 20 20 20  *aSzDel,        
1bbb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1bbc0 69 7a 65 20 64 65 63 72 65 61 73 65 73 20 2a 2f  ize decreases */
1bbd0 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20 20 20 20  .  int nChng    
1bbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbf0 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 69 6e 20     /* Change in 
1bc00 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 64 6f  the number of do
1bc10 63 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  cuments */.){.  
1bc20 63 68 61 72 20 2a 70 42 6c 6f 62 3b 20 20 20 20  char *pBlob;    
1bc30 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
1bc40 61 67 65 20 66 6f 72 20 42 4c 4f 42 20 77 72 69  age for BLOB wri
1bc50 74 74 65 6e 20 69 6e 74 6f 20 25 5f 73 74 61 74  tten into %_stat
1bc60 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b   */.  int nBlob;
1bc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bc80 2a 20 53 69 7a 65 20 6f 66 20 42 4c 4f 42 20 77  * Size of BLOB w
1bc90 72 69 74 74 65 6e 20 69 6e 74 6f 20 25 5f 73 74  ritten into %_st
1bca0 61 74 20 2a 2f 0a 20 20 75 33 32 20 2a 61 3b 20  at */.  u32 *a; 
1bcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcc0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 69 6e 74   /* Array of int
1bcd0 65 67 65 72 73 20 74 68 61 74 20 62 65 63 6f 6d  egers that becom
1bce0 65 73 20 74 68 65 20 42 4c 4f 42 20 2a 2f 0a 20  es the BLOB */. 
1bcf0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1bd00 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 53 74 61  Stmt;     /* Sta
1bd10 74 65 6d 65 6e 74 20 66 6f 72 20 72 65 61 64 69  tement for readi
1bd20 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 20 2a  ng and writing *
1bd30 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
1bd40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bd50 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
1bd60 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1bd70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1bd80 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73  sult code from s
1bd90 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a  ubfunctions */..
1bda0 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 53 74 61    const int nSta
1bdb0 74 20 3d 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32  t = p->nColumn+2
1bdc0 3b 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  ;..  if( *pRC ) 
1bdd0 72 65 74 75 72 6e 3b 0a 20 20 61 20 3d 20 73 71  return;.  a = sq
1bde0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 28 73  lite3_malloc( (s
1bdf0 69 7a 65 6f 66 28 75 33 32 29 2b 31 30 29 2a 6e  izeof(u32)+10)*n
1be00 53 74 61 74 20 29 3b 0a 20 20 69 66 28 20 61 3d  Stat );.  if( a=
1be10 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  =0 ){.    *pRC =
1be20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1be30 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1be40 20 70 42 6c 6f 62 20 3d 20 28 63 68 61 72 2a 29   pBlob = (char*)
1be50 26 61 5b 6e 53 74 61 74 5d 3b 0a 20 20 72 63 20  &a[nStat];.  rc 
1be60 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
1be70 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 54 41 54   SQL_SELECT_STAT
1be80 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
1be90 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71  if( rc ){.    sq
1bea0 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20  lite3_free(a);. 
1beb0 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
1bec0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1bed0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
1bee0 28 70 53 74 6d 74 2c 20 31 2c 20 46 54 53 5f 53  (pStmt, 1, FTS_S
1bef0 54 41 54 5f 44 4f 43 54 4f 54 41 4c 29 3b 0a 20  TAT_DOCTOTAL);. 
1bf00 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65   if( sqlite3_ste
1bf10 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
1bf20 5f 52 4f 57 20 29 7b 0a 20 20 20 20 66 74 73 33  _ROW ){.    fts3
1bf30 44 65 63 6f 64 65 49 6e 74 41 72 72 61 79 28 6e  DecodeIntArray(n
1bf40 53 74 61 74 2c 20 61 2c 0a 20 20 20 20 20 20 20  Stat, a,.       
1bf50 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
1bf60 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 30 29 2c  _blob(pStmt, 0),
1bf70 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
1bf80 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
1bf90 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 7d 65 6c  Stmt, 0));.  }el
1bfa0 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 61  se{.    memset(a
1bfb0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 33 32 29  , 0, sizeof(u32)
1bfc0 2a 28 6e 53 74 61 74 29 20 29 3b 0a 20 20 7d 0a  *(nStat) );.  }.
1bfd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
1bfe0 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69  eset(pStmt);.  i
1bff0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1c000 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1c010 66 72 65 65 28 61 29 3b 0a 20 20 20 20 2a 70 52  free(a);.    *pR
1c020 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  C = rc;.    retu
1c030 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 43  rn;.  }.  if( nC
1c040 68 6e 67 3c 30 20 26 26 20 61 5b 30 5d 3c 28 75  hng<0 && a[0]<(u
1c050 33 32 29 28 2d 6e 43 68 6e 67 29 20 29 7b 0a 20  32)(-nChng) ){. 
1c060 20 20 20 61 5b 30 5d 20 3d 20 30 3b 0a 20 20 7d     a[0] = 0;.  }
1c070 65 6c 73 65 7b 0a 20 20 20 20 61 5b 30 5d 20 2b  else{.    a[0] +
1c080 3d 20 6e 43 68 6e 67 3b 0a 20 20 7d 0a 20 20 66  = nChng;.  }.  f
1c090 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
1c0a0 6c 75 6d 6e 2b 31 3b 20 69 2b 2b 29 7b 0a 20 20  lumn+1; i++){.  
1c0b0 20 20 75 33 32 20 78 20 3d 20 61 5b 69 2b 31 5d    u32 x = a[i+1]
1c0c0 3b 0a 20 20 20 20 69 66 28 20 78 2b 61 53 7a 49  ;.    if( x+aSzI
1c0d0 6e 73 5b 69 5d 20 3c 20 61 53 7a 44 65 6c 5b 69  ns[i] < aSzDel[i
1c0e0 5d 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20 30  ] ){.      x = 0
1c0f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1c100 20 20 20 78 20 3d 20 78 20 2b 20 61 53 7a 49 6e     x = x + aSzIn
1c110 73 5b 69 5d 20 2d 20 61 53 7a 44 65 6c 5b 69 5d  s[i] - aSzDel[i]
1c120 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 5b 69 2b  ;.    }.    a[i+
1c130 31 5d 20 3d 20 78 3b 0a 20 20 7d 0a 20 20 66 74  1] = x;.  }.  ft
1c140 73 33 45 6e 63 6f 64 65 49 6e 74 41 72 72 61 79  s3EncodeIntArray
1c150 28 6e 53 74 61 74 2c 20 61 2c 20 70 42 6c 6f 62  (nStat, a, pBlob
1c160 2c 20 26 6e 42 6c 6f 62 29 3b 0a 20 20 72 63 20  , &nBlob);.  rc 
1c170 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
1c180 20 53 51 4c 5f 52 45 50 4c 41 43 45 5f 53 54 41   SQL_REPLACE_STA
1c190 54 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  T, &pStmt, 0);. 
1c1a0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
1c1b0 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a  qlite3_free(a);.
1c1c0 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
1c1d0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1c1e0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
1c1f0 74 28 70 53 74 6d 74 2c 20 31 2c 20 46 54 53 5f  t(pStmt, 1, FTS_
1c200 53 54 41 54 5f 44 4f 43 54 4f 54 41 4c 29 3b 0a  STAT_DOCTOTAL);.
1c210 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62    sqlite3_bind_b
1c220 6c 6f 62 28 70 53 74 6d 74 2c 20 32 2c 20 70 42  lob(pStmt, 2, pB
1c230 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 53 51 4c 49  lob, nBlob, SQLI
1c240 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71  TE_STATIC);.  sq
1c250 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
1c260 29 3b 0a 20 20 2a 70 52 43 20 3d 20 73 71 6c 69  );.  *pRC = sqli
1c270 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
1c280 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1c290 28 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65  (a);.}../*.** Me
1c2a0 72 67 65 20 74 68 65 20 65 6e 74 69 72 65 20 64  rge the entire d
1c2b0 61 74 61 62 61 73 65 20 73 6f 20 74 68 61 74 20  atabase so that 
1c2c0 74 68 65 72 65 20 69 73 20 6f 6e 65 20 73 65 67  there is one seg
1c2d0 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20 0a 2a  ment for each .*
1c2e0 2a 20 69 49 6e 64 65 78 2f 69 4c 61 6e 67 69 64  * iIndex/iLangid
1c2f0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 0a 2a 2f   combination..*/
1c300 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
1c310 44 6f 4f 70 74 69 6d 69 7a 65 28 46 74 73 33 54  DoOptimize(Fts3T
1c320 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 62 52 65  able *p, int bRe
1c330 74 75 72 6e 44 6f 6e 65 29 7b 0a 20 20 69 6e 74  turnDone){.  int
1c340 20 62 53 65 65 6e 44 6f 6e 65 20 3d 20 30 3b 0a   bSeenDone = 0;.
1c350 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
1c360 74 65 33 5f 73 74 6d 74 20 2a 70 41 6c 6c 4c 61  te3_stmt *pAllLa
1c370 6e 67 69 64 20 3d 20 30 3b 0a 0a 20 20 72 63 20  ngid = 0;..  rc 
1c380 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
1c390 20 53 51 4c 5f 53 45 4c 45 43 54 5f 41 4c 4c 5f   SQL_SELECT_ALL_
1c3a0 4c 41 4e 47 49 44 2c 20 26 70 41 6c 6c 4c 61 6e  LANGID, &pAllLan
1c3b0 67 69 64 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  gid, 0);.  if( r
1c3c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c3d0 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
1c3e0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
1c3f0 74 28 70 41 6c 6c 4c 61 6e 67 69 64 2c 20 31 2c  t(pAllLangid, 1,
1c400 20 70 2d 3e 69 50 72 65 76 4c 61 6e 67 69 64 29   p->iPrevLangid)
1c410 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
1c420 6e 64 5f 69 6e 74 28 70 41 6c 6c 4c 61 6e 67 69  nd_int(pAllLangi
1c430 64 2c 20 32 2c 20 70 2d 3e 6e 49 6e 64 65 78 29  d, 2, p->nIndex)
1c440 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c  ;.    while( sql
1c450 69 74 65 33 5f 73 74 65 70 28 70 41 6c 6c 4c 61  ite3_step(pAllLa
1c460 6e 67 69 64 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  ngid)==SQLITE_RO
1c470 57 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  W ){.      int i
1c480 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 61 6e  ;.      int iLan
1c490 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  gid = sqlite3_co
1c4a0 6c 75 6d 6e 5f 69 6e 74 28 70 41 6c 6c 4c 61 6e  lumn_int(pAllLan
1c4b0 67 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 66  gid, 0);.      f
1c4c0 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
1c4d0 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 49  TE_OK && i<p->nI
1c4e0 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ndex; i++){.    
1c4f0 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67      rc = fts3Seg
1c500 6d 65 6e 74 4d 65 72 67 65 28 70 2c 20 69 4c 61  mentMerge(p, iLa
1c510 6e 67 69 64 2c 20 69 2c 20 46 54 53 33 5f 53 45  ngid, i, FTS3_SE
1c520 47 43 55 52 53 4f 52 5f 41 4c 4c 29 3b 0a 20 20  GCURSOR_ALL);.  
1c530 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1c540 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
1c550 20 20 20 20 20 20 20 62 53 65 65 6e 44 6f 6e 65         bSeenDone
1c560 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
1c570 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c580 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c590 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 32 20  }.    }.    rc2 
1c5a0 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
1c5b0 70 41 6c 6c 4c 61 6e 67 69 64 29 3b 0a 20 20 20  pAllLangid);.   
1c5c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c5d0 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
1c5e0 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 46 74 73   }..  sqlite3Fts
1c5f0 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28 70  3SegmentsClose(p
1c600 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33  );.  sqlite3Fts3
1c610 50 65 6e 64 69 6e 67 54 65 72 6d 73 43 6c 65 61  PendingTermsClea
1c620 72 28 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  r(p);..  return 
1c630 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  (rc==SQLITE_OK &
1c640 26 20 62 52 65 74 75 72 6e 44 6f 6e 65 20 26 26  & bReturnDone &&
1c650 20 62 53 65 65 6e 44 6f 6e 65 29 20 3f 20 53 51   bSeenDone) ? SQ
1c660 4c 49 54 45 5f 44 4f 4e 45 20 3a 20 72 63 3b 0a  LITE_DONE : rc;.
1c670 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1c680 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1c690 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 65   when the user e
1c6a0 78 65 63 75 74 65 73 20 74 68 65 20 66 6f 6c 6c  xecutes the foll
1c6b0 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 3a  owing statement:
1c6c0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 4e 53 45 52  .**.**     INSER
1c6d0 54 20 49 4e 54 4f 20 3c 74 62 6c 3e 28 3c 74 62  T INTO <tbl>(<tb
1c6e0 6c 3e 29 20 56 41 4c 55 45 53 28 27 72 65 62 75  l>) VALUES('rebu
1c6f0 69 6c 64 27 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ild');.**.** The
1c700 20 65 6e 74 69 72 65 20 46 54 53 20 69 6e 64 65   entire FTS inde
1c710 78 20 69 73 20 64 69 73 63 61 72 64 65 64 20 61  x is discarded a
1c720 6e 64 20 72 65 62 75 69 6c 74 2e 20 49 66 20 74  nd rebuilt. If t
1c730 68 65 20 74 61 62 6c 65 20 69 73 20 6f 6e 65 20  he table is one 
1c740 0a 2a 2a 20 63 72 65 61 74 65 64 20 75 73 69 6e  .** created usin
1c750 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 3d 78 78  g the content=xx
1c760 78 20 6f 70 74 69 6f 6e 2c 20 74 68 65 6e 20 74  x option, then t
1c770 68 65 20 6e 65 77 20 69 6e 64 65 78 20 69 73 20  he new index is 
1c780 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20  based on.** the 
1c790 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73  current contents
1c7a0 20 6f 66 20 74 68 65 20 78 78 78 20 74 61 62 6c   of the xxx tabl
1c7b0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
1c7c0 20 69 73 20 72 65 62 75 69 6c 74 20 62 61 73 65   is rebuilt base
1c7d0 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f 6e 74  d.** on the cont
1c7e0 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 63 6f  ents of the %_co
1c7f0 6e 74 65 6e 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a  ntent table..*/.
1c800 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 44  static int fts3D
1c810 6f 52 65 62 75 69 6c 64 28 46 74 73 33 54 61 62  oRebuild(Fts3Tab
1c820 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  le *p){.  int rc
1c830 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1c850 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20 20 72  urn Code */..  r
1c860 63 20 3d 20 66 74 73 33 44 65 6c 65 74 65 41 6c  c = fts3DeleteAl
1c870 6c 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  l(p, 0);.  if( r
1c880 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c890 20 20 20 20 75 33 32 20 2a 61 53 7a 20 3d 20 30      u32 *aSz = 0
1c8a0 3b 0a 20 20 20 20 75 33 32 20 2a 61 53 7a 49 6e  ;.    u32 *aSzIn
1c8b0 73 20 3d 20 30 3b 0a 20 20 20 20 75 33 32 20 2a  s = 0;.    u32 *
1c8c0 61 53 7a 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20  aSzDel = 0;.    
1c8d0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1c8e0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  tmt = 0;.    int
1c8f0 20 6e 45 6e 74 72 79 20 3d 20 30 3b 0a 0a 20 20   nEntry = 0;..  
1c900 20 20 2f 2a 20 43 6f 6d 70 6f 73 65 20 61 6e 64    /* Compose and
1c910 20 70 72 65 70 61 72 65 20 61 6e 20 53 51 4c 20   prepare an SQL 
1c920 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 6c 6f 6f  statement to loo
1c930 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f  p through the co
1c940 6e 74 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20  ntent table */. 
1c950 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20     char *zSql = 
1c960 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1c970 22 53 45 4c 45 43 54 20 25 73 22 20 2c 20 70 2d  "SELECT %s" , p-
1c980 3e 7a 52 65 61 64 45 78 70 72 6c 69 73 74 29 3b  >zReadExprlist);
1c990 0a 20 20 20 20 69 66 28 20 21 7a 53 71 6c 20 29  .    if( !zSql )
1c9a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1c9b0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
1c9c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1c9d0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1c9e0 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
1c9f0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
1ca00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1ca10 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  ree(zSql);.    }
1ca20 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
1ca30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ca40 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a   int nByte = siz
1ca50 65 6f 66 28 75 33 32 29 20 2a 20 28 70 2d 3e 6e  eof(u32) * (p->n
1ca60 43 6f 6c 75 6d 6e 2b 31 29 2a 33 3b 0a 20 20 20  Column+1)*3;.   
1ca70 20 20 20 61 53 7a 20 3d 20 28 75 33 32 20 2a 29     aSz = (u32 *)
1ca80 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
1ca90 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
1caa0 20 61 53 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20   aSz==0 ){.     
1cab0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1cac0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  OMEM;.      }els
1cad0 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
1cae0 74 28 61 53 7a 2c 20 30 2c 20 6e 42 79 74 65 29  t(aSz, 0, nByte)
1caf0 3b 0a 20 20 20 20 20 20 20 20 61 53 7a 49 6e 73  ;.        aSzIns
1cb00 20 3d 20 26 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75   = &aSz[p->nColu
1cb10 6d 6e 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61  mn+1];.        a
1cb20 53 7a 44 65 6c 20 3d 20 26 61 53 7a 49 6e 73 5b  SzDel = &aSzIns[
1cb30 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 5d 3b 0a 20  p->nColumn+1];. 
1cb40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1cb50 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
1cb60 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
1cb70 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
1cb80 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
1cb90 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20     int iCol;.   
1cba0 20 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 20 3d     int iLangid =
1cbb0 20 6c 61 6e 67 69 64 46 72 6f 6d 53 65 6c 65 63   langidFromSelec
1cbc0 74 28 70 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20  t(p, pStmt);.   
1cbd0 20 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64     rc = fts3Pend
1cbe0 69 6e 67 54 65 72 6d 73 44 6f 63 69 64 28 70 2c  ingTermsDocid(p,
1cbf0 20 30 2c 20 69 4c 61 6e 67 69 64 2c 20 73 71 6c   0, iLangid, sql
1cc00 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
1cc10 34 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20  4(pStmt, 0));.  
1cc20 20 20 20 20 6d 65 6d 73 65 74 28 61 53 7a 2c 20      memset(aSz, 
1cc30 30 2c 20 73 69 7a 65 6f 66 28 61 53 7a 5b 30 5d  0, sizeof(aSz[0]
1cc40 29 20 2a 20 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  ) * (p->nColumn+
1cc50 31 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  1));.      for(i
1cc60 43 6f 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  Col=0; rc==SQLIT
1cc70 45 5f 4f 4b 20 26 26 20 69 43 6f 6c 3c 70 2d 3e  E_OK && iCol<p->
1cc80 6e 43 6f 6c 75 6d 6e 3b 20 69 43 6f 6c 2b 2b 29  nColumn; iCol++)
1cc90 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
1cca0 3e 61 62 4e 6f 74 69 6e 64 65 78 65 64 5b 69 43  >abNotindexed[iC
1ccb0 6f 6c 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ol]==0 ){.      
1ccc0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1ccd0 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  z = (const char 
1cce0 2a 29 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  *) sqlite3_colum
1ccf0 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 43  n_text(pStmt, iC
1cd00 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20  ol+1);.         
1cd10 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e   rc = fts3Pendin
1cd20 67 54 65 72 6d 73 41 64 64 28 70 2c 20 69 4c 61  gTermsAdd(p, iLa
1cd30 6e 67 69 64 2c 20 7a 2c 20 69 43 6f 6c 2c 20 26  ngid, z, iCol, &
1cd40 61 53 7a 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20 20  aSz[iCol]);.    
1cd50 20 20 20 20 20 20 61 53 7a 5b 70 2d 3e 6e 43 6f        aSz[p->nCo
1cd60 6c 75 6d 6e 5d 20 2b 3d 20 73 71 6c 69 74 65 33  lumn] += sqlite3
1cd70 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
1cd80 74 6d 74 2c 20 69 43 6f 6c 2b 31 29 3b 0a 20 20  tmt, iCol+1);.  
1cd90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1cda0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 48 61        if( p->bHa
1cdb0 73 44 6f 63 73 69 7a 65 20 29 7b 0a 20 20 20 20  sDocsize ){.    
1cdc0 20 20 20 20 66 74 73 33 49 6e 73 65 72 74 44 6f      fts3InsertDo
1cdd0 63 73 69 7a 65 28 26 72 63 2c 20 70 2c 20 61 53  csize(&rc, p, aS
1cde0 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  z);.      }.    
1cdf0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ce00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
1ce10 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
1ce20 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
1ce30 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  pStmt = 0;.     
1ce40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ce50 6e 45 6e 74 72 79 2b 2b 3b 0a 20 20 20 20 20 20  nEntry++;.      
1ce60 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
1ce70 6f 6c 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  ol<=p->nColumn; 
1ce80 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iCol++){.       
1ce90 20 20 20 61 53 7a 49 6e 73 5b 69 43 6f 6c 5d 20     aSzIns[iCol] 
1cea0 2b 3d 20 61 53 7a 5b 69 43 6f 6c 5d 3b 0a 20 20  += aSz[iCol];.  
1ceb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1cec0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
1ced0 3e 62 46 74 73 34 20 29 7b 0a 20 20 20 20 20 20  >bFts4 ){.      
1cee0 66 74 73 33 55 70 64 61 74 65 44 6f 63 54 6f 74  fts3UpdateDocTot
1cef0 61 6c 73 28 26 72 63 2c 20 70 2c 20 61 53 7a 49  als(&rc, p, aSzI
1cf00 6e 73 2c 20 61 53 7a 44 65 6c 2c 20 6e 45 6e 74  ns, aSzDel, nEnt
1cf10 72 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ry);.    }.    s
1cf20 71 6c 69 74 65 33 5f 66 72 65 65 28 61 53 7a 29  qlite3_free(aSz)
1cf30 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 74 6d 74  ;..    if( pStmt
1cf40 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
1cf50 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  2 = sqlite3_fina
1cf60 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
1cf70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1cf80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1cf90 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20  rc = rc2;.      
1cfa0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
1cfb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1cfc0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1cfd0 6e 20 6f 70 65 6e 73 20 61 20 63 75 72 73 6f 72  n opens a cursor
1cfe0 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 74 68   used to read th
1cff0 65 20 69 6e 70 75 74 20 64 61 74 61 20 66 6f 72  e input data for
1d000 20 61 6e 20 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e   an .** incremen
1d010 74 61 6c 20 6d 65 72 67 65 20 6f 70 65 72 61 74  tal merge operat
1d020 69 6f 6e 2e 20 53 70 65 63 69 66 69 63 61 6c 6c  ion. Specificall
1d030 79 2c 20 69 74 20 6f 70 65 6e 73 20 61 20 63 75  y, it opens a cu
1d040 72 73 6f 72 20 74 6f 20 73 63 61 6e 0a 2a 2a 20  rsor to scan.** 
1d050 74 68 65 20 6f 6c 64 65 73 74 20 6e 53 65 67 20  the oldest nSeg 
1d060 73 65 67 6d 65 6e 74 73 20 28 69 64 78 3d 30 20  segments (idx=0 
1d070 74 68 72 6f 75 67 68 20 69 64 78 3d 28 6e 53 65  through idx=(nSe
1d080 67 2d 31 29 29 20 69 6e 20 61 62 73 6f 6c 75 74  g-1)) in absolut
1d090 65 20 0a 2a 2a 20 6c 65 76 65 6c 20 69 41 62 73  e .** level iAbs
1d0a0 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  Level..*/.static
1d0b0 20 69 6e 74 20 66 74 73 33 49 6e 63 72 6d 65 72   int fts3Incrmer
1d0c0 67 65 43 73 72 28 0a 20 20 46 74 73 33 54 61 62  geCsr(.  Fts3Tab
1d0d0 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
1d0e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33           /* FTS3
1d0f0 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   table handle */
1d100 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1d110 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 20   iAbsLevel,     
1d120 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c     /* Absolute l
1d130 65 76 65 6c 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  evel to open */.
1d140 20 20 69 6e 74 20 6e 53 65 67 2c 20 20 20 20 20    int nSeg,     
1d150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d160 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
1d170 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72 67 65  egments to merge
1d180 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53   */.  Fts3MultiS
1d190 65 67 52 65 61 64 65 72 20 2a 70 43 73 72 20 20  egReader *pCsr  
1d1a0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
1d1b0 6f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61  object to popula
1d1c0 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  te */.){.  int r
1d1d0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1d1e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1d1f0 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 73  turn Code */.  s
1d200 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1d210 6d 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  mt = 0;        /
1d220 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 73 65 64  * Statement used
1d230 20 74 6f 20 72 65 61 64 20 25 5f 73 65 67 64 69   to read %_segdi
1d240 72 20 65 6e 74 72 79 20 2a 2f 20 20 0a 20 20 69  r entry */  .  i
1d250 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
1d260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d270 2a 20 42 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  * Bytes allocate
1d280 64 20 61 74 20 70 43 73 72 2d 3e 61 70 53 65 67  d at pCsr->apSeg
1d290 6d 65 6e 74 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20  ment[] */..  /* 
1d2a0 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
1d2b0 6f 72 20 74 68 65 20 46 74 73 33 4d 75 6c 74 69  or the Fts3Multi
1d2c0 53 65 67 52 65 61 64 65 72 2e 61 43 73 72 5b 5d  SegReader.aCsr[]
1d2d0 20 61 72 72 61 79 20 2a 2f 0a 20 20 6d 65 6d 73   array */.  mems
1d2e0 65 74 28 70 43 73 72 2c 20 30 2c 20 73 69 7a 65  et(pCsr, 0, size
1d2f0 6f 66 28 2a 70 43 73 72 29 29 3b 0a 20 20 6e 42  of(*pCsr));.  nB
1d300 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73  yte = sizeof(Fts
1d310 33 53 65 67 52 65 61 64 65 72 20 2a 29 20 2a 20  3SegReader *) * 
1d320 6e 53 65 67 3b 0a 20 20 70 43 73 72 2d 3e 61 70  nSeg;.  pCsr->ap
1d330 53 65 67 6d 65 6e 74 20 3d 20 28 46 74 73 33 53  Segment = (Fts3S
1d340 65 67 52 65 61 64 65 72 20 2a 2a 29 73 71 6c 69  egReader **)sqli
1d350 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65  te3_malloc(nByte
1d360 29 3b 0a 0a 20 20 69 66 28 20 70 43 73 72 2d 3e  );..  if( pCsr->
1d370 61 70 53 65 67 6d 65 6e 74 3d 3d 30 20 29 7b 0a  apSegment==0 ){.
1d380 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d390 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
1d3a0 20 20 20 20 6d 65 6d 73 65 74 28 70 43 73 72 2d      memset(pCsr-
1d3b0 3e 61 70 53 65 67 6d 65 6e 74 2c 20 30 2c 20 6e  >apSegment, 0, n
1d3c0 42 79 74 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  Byte);.    rc = 
1d3d0 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
1d3e0 51 4c 5f 53 45 4c 45 43 54 5f 4c 45 56 45 4c 2c  QL_SELECT_LEVEL,
1d3f0 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d   &pStmt, 0);.  }
1d400 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1d410 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
1d420 69 3b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  i;.    int rc2;.
1d430 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1d440 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 2c  _int64(pStmt, 1,
1d450 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20   iAbsLevel);.   
1d460 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 6e   assert( pCsr->n
1d470 53 65 67 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20  Segment==0 );.  
1d480 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
1d490 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69  QLITE_OK && sqli
1d4a0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
1d4b0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 26 26 20 69  =SQLITE_ROW && i
1d4c0 3c 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nSeg; i++){.   
1d4d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
1d4e0 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 77 28  ts3SegReaderNew(
1d4f0 69 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  i, 0,.          
1d500 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
1d510 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 29 2c 20  nt64(pStmt, 1), 
1d520 20 20 20 20 20 20 20 2f 2a 20 73 65 67 64 69 72         /* segdir
1d530 2e 73 74 61 72 74 5f 62 6c 6f 63 6b 20 2a 2f 0a  .start_block */.
1d540 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1d550 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
1d560 53 74 6d 74 2c 20 32 29 2c 20 20 20 20 20 20 20  Stmt, 2),       
1d570 20 2f 2a 20 73 65 67 64 69 72 2e 6c 65 61 76 65   /* segdir.leave
1d580 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20  s_end_block */. 
1d590 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1d5a0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
1d5b0 74 6d 74 2c 20 33 29 2c 20 20 20 20 20 20 20 20  tmt, 3),        
1d5c0 2f 2a 20 73 65 67 64 69 72 2e 65 6e 64 5f 62 6c  /* segdir.end_bl
1d5d0 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ock */.         
1d5e0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1d5f0 62 6c 6f 62 28 70 53 74 6d 74 2c 20 34 29 2c 20  blob(pStmt, 4), 
1d600 20 20 20 20 20 20 20 20 2f 2a 20 73 65 67 64 69          /* segdi
1d610 72 2e 72 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20  r.root */.      
1d620 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75      sqlite3_colu
1d630 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
1d640 34 29 2c 20 20 20 20 20 20 20 20 2f 2a 20 73 65  4),        /* se
1d650 67 64 69 72 2e 72 6f 6f 74 20 2a 2f 0a 20 20 20  gdir.root */.   
1d660 20 20 20 20 20 20 20 26 70 43 73 72 2d 3e 61 70         &pCsr->ap
1d670 53 65 67 6d 65 6e 74 5b 69 5d 0a 20 20 20 20 20  Segment[i].     
1d680 20 29 3b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e   );.      pCsr->
1d690 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 20 20 20 20  nSegment++;.    
1d6a0 7d 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  }.    rc2 = sqli
1d6b0 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
1d6c0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1d6d0 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
1d6e0 63 32 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  c2;.  }..  retur
1d6f0 6e 20 72 63 3b 0a 7d 0a 0a 74 79 70 65 64 65 66  n rc;.}..typedef
1d700 20 73 74 72 75 63 74 20 49 6e 63 72 6d 65 72 67   struct Incrmerg
1d710 65 57 72 69 74 65 72 20 49 6e 63 72 6d 65 72 67  eWriter Incrmerg
1d720 65 57 72 69 74 65 72 3b 0a 74 79 70 65 64 65 66  eWriter;.typedef
1d730 20 73 74 72 75 63 74 20 4e 6f 64 65 57 72 69 74   struct NodeWrit
1d740 65 72 20 4e 6f 64 65 57 72 69 74 65 72 3b 0a 74  er NodeWriter;.t
1d750 79 70 65 64 65 66 20 73 74 72 75 63 74 20 42 6c  ypedef struct Bl
1d760 6f 62 20 42 6c 6f 62 3b 0a 74 79 70 65 64 65 66  ob Blob;.typedef
1d770 20 73 74 72 75 63 74 20 4e 6f 64 65 52 65 61 64   struct NodeRead
1d780 65 72 20 4e 6f 64 65 52 65 61 64 65 72 3b 0a 0a  er NodeReader;..
1d790 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
1d7a0 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
1d7b0 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
1d7c0 75 73 65 64 20 61 73 20 61 20 64 79 6e 61 6d 69  used as a dynami
1d7d0 63 20 62 75 66 66 65 72 0a 2a 2a 20 74 6f 20 62  c buffer.** to b
1d7e0 75 69 6c 64 20 75 70 20 6e 6f 64 65 73 20 6f 72  uild up nodes or
1d7f0 20 6f 74 68 65 72 20 62 6c 6f 62 73 20 6f 66 20   other blobs of 
1d800 64 61 74 61 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54  data in..**.** T
1d810 68 65 20 66 75 6e 63 74 69 6f 6e 20 62 6c 6f 62  he function blob
1d820 47 72 6f 77 42 75 66 66 65 72 28 29 20 69 73 20  GrowBuffer() is 
1d830 75 73 65 64 20 74 6f 20 65 78 74 65 6e 64 20 74  used to extend t
1d840 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  he allocation..*
1d850 2f 0a 73 74 72 75 63 74 20 42 6c 6f 62 20 7b 0a  /.struct Blob {.
1d860 20 20 63 68 61 72 20 2a 61 3b 20 20 20 20 20 20    char *a;      
1d870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d880 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1d890 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  allocation */.  
1d8a0 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
1d8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c  /* Number of val
1d8d0 69 64 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  id bytes of data
1d8e0 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   in a[] */.  int
1d8f0 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20   nAlloc;        
1d900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d910 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f  Allocated size o
1d920 66 20 61 5b 5d 20 28 6e 41 6c 6c 6f 63 3e 3d 6e  f a[] (nAlloc>=n
1d930 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  ) */.};../*.** T
1d940 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
1d950 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 75   used to build u
1d960 70 20 62 75 66 66 65 72 73 20 63 6f 6e 74 61 69  p buffers contai
1d970 6e 69 6e 67 20 73 65 67 6d 65 6e 74 20 62 2d 74  ning segment b-t
1d980 72 65 65 20 0a 2a 2a 20 6e 6f 64 65 73 20 28 62  ree .** nodes (b
1d990 6c 6f 63 6b 73 29 2e 0a 2a 2f 0a 73 74 72 75 63  locks)..*/.struc
1d9a0 74 20 4e 6f 64 65 57 72 69 74 65 72 20 7b 0a 20  t NodeWriter {. 
1d9b0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1d9c0 42 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  Block;          
1d9d0 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 6c 6f 63   /* Current bloc
1d9e0 6b 20 69 64 20 2a 2f 0a 20 20 42 6c 6f 62 20 6b  k id */.  Blob k
1d9f0 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ey;             
1da00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73            /* Las
1da10 74 20 6b 65 79 20 77 72 69 74 74 65 6e 20 74 6f  t key written to
1da20 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 6c 6f   the current blo
1da30 63 6b 20 2a 2f 0a 20 20 42 6c 6f 62 20 62 6c 6f  ck */.  Blob blo
1da40 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
1da50 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
1da60 6e 74 20 62 6c 6f 63 6b 20 69 6d 61 67 65 20 2a  nt block image *
1da70 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f  /.};../*.** An o
1da80 62 6a 65 63 74 20 6f 66 20 74 68 69 73 20 74 79  bject of this ty
1da90 70 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  pe contains the 
1daa0 73 74 61 74 65 20 72 65 71 75 69 72 65 64 20 74  state required t
1dab0 6f 20 63 72 65 61 74 65 20 6f 72 20 61 70 70 65  o create or appe
1dac0 6e 64 0a 2a 2a 20 74 6f 20 61 6e 20 61 70 70 65  nd.** to an appe
1dad0 6e 64 61 62 6c 65 20 62 2d 74 72 65 65 20 73 65  ndable b-tree se
1dae0 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 72 75 63 74  gment..*/.struct
1daf0 20 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72   IncrmergeWriter
1db00 20 7b 0a 20 20 69 6e 74 20 6e 4c 65 61 66 45 73   {.  int nLeafEs
1db10 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1db20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c       /* Space al
1db30 6c 6f 63 61 74 65 64 20 66 6f 72 20 6c 65 61 66  located for leaf
1db40 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 69 6e 74   blocks */.  int
1db50 20 6e 57 6f 72 6b 3b 20 20 20 20 20 20 20 20 20   nWork;         
1db60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1db70 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70  Number of leaf p
1db80 61 67 65 73 20 66 6c 75 73 68 65 64 20 2a 2f 0a  ages flushed */.
1db90 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1dba0 69 41 62 73 4c 65 76 65 6c 3b 20 20 20 20 20 20  iAbsLevel;      
1dbb0 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65    /* Absolute le
1dbc0 76 65 6c 20 6f 66 20 69 6e 70 75 74 20 73 65 67  vel of input seg
1dbd0 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ments */.  int i
1dbe0 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
1dbf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1dc00 64 65 78 20 6f 66 20 2a 6f 75 74 70 75 74 2a 20  dex of *output* 
1dc10 73 65 67 6d 65 6e 74 20 69 6e 20 69 41 62 73 4c  segment in iAbsL
1dc20 65 76 65 6c 2b 31 20 2a 2f 0a 20 20 73 71 6c 69  evel+1 */.  sqli
1dc30 74 65 33 5f 69 6e 74 36 34 20 69 53 74 61 72 74  te3_int64 iStart
1dc40 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ;           /* B
1dc50 6c 6f 63 6b 20 6e 75 6d 62 65 72 20 6f 66 20 66  lock number of f
1dc60 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 62  irst allocated b
1dc70 6c 6f 63 6b 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lock */.  sqlite
1dc80 33 5f 69 6e 74 36 34 20 69 45 6e 64 3b 20 20 20  3_int64 iEnd;   
1dc90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f            /* Blo
1dca0 63 6b 20 6e 75 6d 62 65 72 20 6f 66 20 6c 61 73  ck number of las
1dcb0 74 20 61 6c 6c 6f 63 61 74 65 64 20 62 6c 6f 63  t allocated bloc
1dcc0 6b 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  k */.  sqlite3_i
1dcd0 6e 74 36 34 20 6e 4c 65 61 66 44 61 74 61 3b 20  nt64 nLeafData; 
1dce0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
1dcf0 6f 66 20 6c 65 61 66 20 70 61 67 65 20 64 61 74  of leaf page dat
1dd00 61 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 75 38  a so far */.  u8
1dd10 20 62 4e 6f 4c 65 61 66 44 61 74 61 3b 20 20 20   bNoLeafData;   
1dd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dd30 20 49 66 20 74 72 75 65 2c 20 73 74 6f 72 65 20   If true, store 
1dd40 30 20 66 6f 72 20 73 65 67 6d 65 6e 74 20 73 69  0 for segment si
1dd50 7a 65 20 2a 2f 0a 20 20 4e 6f 64 65 57 72 69 74  ze */.  NodeWrit
1dd60 65 72 20 61 4e 6f 64 65 57 72 69 74 65 72 5b 46  er aNodeWriter[F
1dd70 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c  TS_MAX_APPENDABL
1dd80 45 5f 48 45 49 47 48 54 5d 3b 0a 7d 3b 0a 0a 2f  E_HEIGHT];.};../
1dd90 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f  *.** An object o
1dda0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1ddb0 74 79 70 65 20 69 73 20 75 73 65 64 20 74 6f 20  type is used to 
1ddc0 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61  read data from a
1ddd0 20 73 69 6e 67 6c 65 0a 2a 2a 20 46 54 53 20 73   single.** FTS s
1dde0 65 67 6d 65 6e 74 20 6e 6f 64 65 2e 20 53 65 65  egment node. See
1ddf0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
1de00 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
1de10 20 20 20 20 6e 6f 64 65 52 65 61 64 65 72 49 6e      nodeReaderIn
1de20 69 74 28 29 0a 2a 2a 20 20 20 20 20 6e 6f 64 65  it().**     node
1de30 52 65 61 64 65 72 4e 65 78 74 28 29 0a 2a 2a 20  ReaderNext().** 
1de40 20 20 20 20 6e 6f 64 65 52 65 61 64 65 72 52 65      nodeReaderRe
1de50 6c 65 61 73 65 28 29 0a 2a 2f 0a 73 74 72 75 63  lease().*/.struc
1de60 74 20 4e 6f 64 65 52 65 61 64 65 72 20 7b 0a 20  t NodeReader {. 
1de70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 4e 6f   const char *aNo
1de80 64 65 3b 0a 20 20 69 6e 74 20 6e 4e 6f 64 65 3b  de;.  int nNode;
1de90 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20  .  int iOff;    
1dea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1deb0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66     /* Current of
1dec0 66 73 65 74 20 77 69 74 68 69 6e 20 61 4e 6f 64  fset within aNod
1ded0 65 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74  e[] */..  /* Out
1dee0 70 75 74 20 76 61 72 69 61 62 6c 65 73 2e 20 43  put variables. C
1def0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75  ontaining the cu
1df00 72 72 65 6e 74 20 6e 6f 64 65 20 65 6e 74 72 79  rrent node entry
1df10 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  . */.  sqlite3_i
1df20 6e 74 36 34 20 69 43 68 69 6c 64 3b 20 20 20 20  nt64 iChild;    
1df30 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1df40 72 20 74 6f 20 63 68 69 6c 64 20 6e 6f 64 65 20  r to child node 
1df50 2a 2f 0a 20 20 42 6c 6f 62 20 74 65 72 6d 3b 20  */.  Blob term; 
1df60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df70 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
1df80 74 65 72 6d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  term */.  const 
1df90 63 68 61 72 20 2a 61 44 6f 63 6c 69 73 74 3b 20  char *aDoclist; 
1dfa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
1dfb0 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 20  nter to doclist 
1dfc0 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73  */.  int nDoclis
1dfd0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1dfe0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1dff0 64 6f 63 6c 69 73 74 20 69 6e 20 62 79 74 65 73  doclist in bytes
1e000 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66   */.};../*.** If
1e010 20 2a 70 52 63 20 69 73 20 6e 6f 74 20 53 51 4c   *pRc is not SQL
1e020 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73  ITE_OK when this
1e030 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1e040 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
1e050 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  op..** Otherwise
1e060 2c 20 69 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  , if the allocat
1e070 69 6f 6e 20 61 74 20 70 42 6c 6f 62 2d 3e 61 20  ion at pBlob->a 
1e080 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
1e090 74 20 6c 65 61 73 74 20 6e 4d 69 6e 0a 2a 2a 20  t least nMin.** 
1e0a0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 65  bytes in size, e
1e0b0 78 74 65 6e 64 20 28 72 65 61 6c 6c 6f 63 29 20  xtend (realloc) 
1e0c0 69 74 20 74 6f 20 62 65 20 73 6f 2e 0a 2a 2a 0a  it to be so..**.
1e0d0 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  ** If an OOM err
1e0e0 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a  or occurs, set *
1e0f0 70 52 63 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f  pRc to SQLITE_NO
1e100 4d 45 4d 20 61 6e 64 20 6c 65 61 76 65 20 70 42  MEM and leave pB
1e110 6c 6f 62 2d 3e 61 0a 2a 2a 20 75 6e 6d 6f 64 69  lob->a.** unmodi
1e120 66 69 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  fied. Otherwise,
1e130 20 69 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69   if the allocati
1e140 6f 6e 20 73 75 63 63 65 65 64 73 2c 20 75 70 64  on succeeds, upd
1e150 61 74 65 20 70 42 6c 6f 62 2d 3e 6e 41 6c 6c 6f  ate pBlob->nAllo
1e160 63 0a 2a 2a 20 74 6f 20 72 65 66 6c 65 63 74 20  c.** to reflect 
1e170 74 68 65 20 6e 65 77 20 73 69 7a 65 20 6f 66 20  the new size of 
1e180 74 68 65 20 70 42 6c 6f 62 2d 3e 61 5b 5d 20 62  the pBlob->a[] b
1e190 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  uffer..*/.static
1e1a0 20 76 6f 69 64 20 62 6c 6f 62 47 72 6f 77 42 75   void blobGrowBu
1e1b0 66 66 65 72 28 42 6c 6f 62 20 2a 70 42 6c 6f 62  ffer(Blob *pBlob
1e1c0 2c 20 69 6e 74 20 6e 4d 69 6e 2c 20 69 6e 74 20  , int nMin, int 
1e1d0 2a 70 52 63 29 7b 0a 20 20 69 66 28 20 2a 70 52  *pRc){.  if( *pR
1e1e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1e1f0 6e 4d 69 6e 3e 70 42 6c 6f 62 2d 3e 6e 41 6c 6c  nMin>pBlob->nAll
1e200 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41  oc ){.    int nA
1e210 6c 6c 6f 63 20 3d 20 6e 4d 69 6e 3b 0a 20 20 20  lloc = nMin;.   
1e220 20 63 68 61 72 20 2a 61 20 3d 20 28 63 68 61 72   char *a = (char
1e230 20 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   *)sqlite3_reall
1e240 6f 63 28 70 42 6c 6f 62 2d 3e 61 2c 20 6e 41 6c  oc(pBlob->a, nAl
1e250 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 61 20  loc);.    if( a 
1e260 29 7b 0a 20 20 20 20 20 20 70 42 6c 6f 62 2d 3e  ){.      pBlob->
1e270 6e 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 3b  nAlloc = nAlloc;
1e280 0a 20 20 20 20 20 20 70 42 6c 6f 62 2d 3e 61 20  .      pBlob->a 
1e290 3d 20 61 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = a;.    }else{.
1e2a0 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c        *pRc = SQL
1e2b0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
1e2c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  .  }.}../*.** At
1e2d0 74 65 6d 70 74 20 74 6f 20 61 64 76 61 6e 63 65  tempt to advance
1e2e0 20 74 68 65 20 6e 6f 64 65 2d 72 65 61 64 65 72   the node-reader
1e2f0 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
1e300 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
1e310 6d 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  ment to.** the n
1e320 65 78 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65  ext entry on the
1e330 20 6e 6f 64 65 2e 20 0a 2a 2a 0a 2a 2a 20 52 65   node. .**.** Re
1e340 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
1e350 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  de if an error o
1e360 63 63 75 72 73 20 28 53 51 4c 49 54 45 5f 4e 4f  ccurs (SQLITE_NO
1e370 4d 45 4d 20 69 73 20 70 6f 73 73 69 62 6c 65 29  MEM is possible)
1e380 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  . .** Otherwise 
1e390 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e3a0 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
1e3b0 20 6e 65 78 74 20 65 6e 74 72 79 20 6f 6e 20 74   next entry on t
1e3c0 68 65 20 6e 6f 64 65 0a 2a 2a 20 28 65 2e 67 2e  he node.** (e.g.
1e3d0 20 62 65 63 61 75 73 65 20 74 68 65 20 63 75 72   because the cur
1e3e0 72 65 6e 74 20 65 6e 74 72 79 20 69 73 20 74 68  rent entry is th
1e3f0 65 20 6c 61 73 74 29 20 73 65 74 20 4e 6f 64 65  e last) set Node
1e400 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20 74 6f  Reader->aNode to
1e410 0a 2a 2a 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69  .** NULL to indi
1e420 63 61 74 65 20 45 4f 46 2e 20 4f 74 68 65 72 77  cate EOF. Otherw
1e430 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  ise, populate th
1e440 65 20 4e 6f 64 65 52 65 61 64 65 72 20 73 74 72  e NodeReader str
1e450 75 63 74 75 72 65 20 6f 75 74 70 75 74 20 0a 2a  ucture output .*
1e460 2a 20 76 61 72 69 61 62 6c 65 73 20 66 6f 72 20  * variables for 
1e470 74 68 65 20 6e 65 77 20 65 6e 74 72 79 2e 0a 2a  the new entry..*
1e480 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 64  /.static int nod
1e490 65 52 65 61 64 65 72 4e 65 78 74 28 4e 6f 64 65  eReaderNext(Node
1e4a0 52 65 61 64 65 72 20 2a 70 29 7b 0a 20 20 69 6e  Reader *p){.  in
1e4b0 74 20 62 46 69 72 73 74 20 3d 20 28 70 2d 3e 74  t bFirst = (p->t
1e4c0 65 72 6d 2e 6e 3d 3d 30 29 3b 20 20 20 20 2f 2a  erm.n==0);    /*
1e4d0 20 54 72 75 65 20 66 6f 72 20 66 69 72 73 74 20   True for first 
1e4e0 74 65 72 6d 20 6f 6e 20 74 68 65 20 6e 6f 64 65  term on the node
1e4f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69   */.  int nPrefi
1e500 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  x = 0;          
1e510 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74        /* Bytes t
1e520 6f 20 63 6f 70 79 20 66 72 6f 6d 20 70 72 65 76  o copy from prev
1e530 69 6f 75 73 20 74 65 72 6d 20 2a 2f 0a 20 20 69  ious term */.  i
1e540 6e 74 20 6e 53 75 66 66 69 78 20 3d 20 30 3b 20  nt nSuffix = 0; 
1e550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e560 2a 20 42 79 74 65 73 20 74 6f 20 61 70 70 65 6e  * Bytes to appen
1e570 64 20 74 6f 20 74 68 65 20 70 72 65 66 69 78 20  d to the prefix 
1e580 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1e590 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
1e5a0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1e5b0 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ode */..  assert
1e5c0 28 20 70 2d 3e 61 4e 6f 64 65 20 29 3b 0a 20 20  ( p->aNode );.  
1e5d0 69 66 28 20 70 2d 3e 69 43 68 69 6c 64 20 26 26  if( p->iChild &&
1e5e0 20 62 46 69 72 73 74 3d 3d 30 20 29 20 70 2d 3e   bFirst==0 ) p->
1e5f0 69 43 68 69 6c 64 2b 2b 3b 0a 20 20 69 66 28 20  iChild++;.  if( 
1e600 70 2d 3e 69 4f 66 66 3e 3d 70 2d 3e 6e 4e 6f 64  p->iOff>=p->nNod
1e610 65 20 29 7b 0a 20 20 20 20 2f 2a 20 45 4f 46 20  e ){.    /* EOF 
1e620 2a 2f 0a 20 20 20 20 70 2d 3e 61 4e 6f 64 65 20  */.    p->aNode 
1e630 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1e640 20 20 69 66 28 20 62 46 69 72 73 74 3d 3d 30 20    if( bFirst==0 
1e650 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  ){.      p->iOff
1e660 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72 69 6e   += fts3GetVarin
1e670 74 33 32 28 26 70 2d 3e 61 4e 6f 64 65 5b 70 2d  t32(&p->aNode[p-
1e680 3e 69 4f 66 66 5d 2c 20 26 6e 50 72 65 66 69 78  >iOff], &nPrefix
1e690 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  );.    }.    p->
1e6a0 69 4f 66 66 20 2b 3d 20 66 74 73 33 47 65 74 56  iOff += fts3GetV
1e6b0 61 72 69 6e 74 33 32 28 26 70 2d 3e 61 4e 6f 64  arint32(&p->aNod
1e6c0 65 5b 70 2d 3e 69 4f 66 66 5d 2c 20 26 6e 53 75  e[p->iOff], &nSu
1e6d0 66 66 69 78 29 3b 0a 0a 20 20 20 20 62 6c 6f 62  ffix);..    blob
1e6e0 47 72 6f 77 42 75 66 66 65 72 28 26 70 2d 3e 74  GrowBuffer(&p->t
1e6f0 65 72 6d 2c 20 6e 50 72 65 66 69 78 2b 6e 53 75  erm, nPrefix+nSu
1e700 66 66 69 78 2c 20 26 72 63 29 3b 0a 20 20 20 20  ffix, &rc);.    
1e710 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e720 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  K ){.      memcp
1e730 79 28 26 70 2d 3e 74 65 72 6d 2e 61 5b 6e 50 72  y(&p->term.a[nPr
1e740 65 66 69 78 5d 2c 20 26 70 2d 3e 61 4e 6f 64 65  efix], &p->aNode
1e750 5b 70 2d 3e 69 4f 66 66 5d 2c 20 6e 53 75 66 66  [p->iOff], nSuff
1e760 69 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 74 65  ix);.      p->te
1e770 72 6d 2e 6e 20 3d 20 6e 50 72 65 66 69 78 2b 6e  rm.n = nPrefix+n
1e780 53 75 66 66 69 78 3b 0a 20 20 20 20 20 20 70 2d  Suffix;.      p-
1e790 3e 69 4f 66 66 20 2b 3d 20 6e 53 75 66 66 69 78  >iOff += nSuffix
1e7a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69  ;.      if( p->i
1e7b0 43 68 69 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Child==0 ){.    
1e7c0 20 20 20 20 70 2d 3e 69 4f 66 66 20 2b 3d 20 66      p->iOff += f
1e7d0 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts3GetVarint32(&
1e7e0 70 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f 66 66  p->aNode[p->iOff
1e7f0 5d 2c 20 26 70 2d 3e 6e 44 6f 63 6c 69 73 74 29  ], &p->nDoclist)
1e800 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 44 6f  ;.        p->aDo
1e810 63 6c 69 73 74 20 3d 20 26 70 2d 3e 61 4e 6f 64  clist = &p->aNod
1e820 65 5b 70 2d 3e 69 4f 66 66 5d 3b 0a 20 20 20 20  e[p->iOff];.    
1e830 20 20 20 20 70 2d 3e 69 4f 66 66 20 2b 3d 20 70      p->iOff += p
1e840 2d 3e 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20  ->nDoclist;.    
1e850 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1e860 20 61 73 73 65 72 74 28 20 70 2d 3e 69 4f 66 66   assert( p->iOff
1e870 3c 3d 70 2d 3e 6e 4e 6f 64 65 20 29 3b 0a 0a 20  <=p->nNode );.. 
1e880 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e890 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c  *.** Release all
1e8a0 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63   dynamic resourc
1e8b0 65 73 20 68 65 6c 64 20 62 79 20 6e 6f 64 65 2d  es held by node-
1e8c0 72 65 61 64 65 72 20 6f 62 6a 65 63 74 20 2a 70  reader object *p
1e8d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1e8e0 20 6e 6f 64 65 52 65 61 64 65 72 52 65 6c 65 61   nodeReaderRelea
1e8f0 73 65 28 4e 6f 64 65 52 65 61 64 65 72 20 2a 70  se(NodeReader *p
1e900 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ){.  sqlite3_fre
1e910 65 28 70 2d 3e 74 65 72 6d 2e 61 29 3b 0a 7d 0a  e(p->term.a);.}.
1e920 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
1e930 65 20 61 20 6e 6f 64 65 2d 72 65 61 64 65 72 20  e a node-reader 
1e940 6f 62 6a 65 63 74 20 74 6f 20 72 65 61 64 20 74  object to read t
1e950 68 65 20 6e 6f 64 65 20 69 6e 20 62 75 66 66 65  he node in buffe
1e960 72 20 61 4e 6f 64 65 2f 6e 4e 6f 64 65 2e 0a 2a  r aNode/nNode..*
1e970 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
1e980 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
1e990 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
1e9a0 65 20 4e 6f 64 65 52 65 61 64 65 72 20 6f 62 6a  e NodeReader obj
1e9b0 65 63 74 20 73 65 74 20 74 6f 20 0a 2a 2a 20 70  ect set to .** p
1e9c0 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73  oint to the firs
1e9d0 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 6e  t entry on the n
1e9e0 6f 64 65 20 28 69 66 20 61 6e 79 29 2e 20 4f 74  ode (if any). Ot
1e9f0 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69  herwise, an SQLi
1ea00 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  te.** error code
1ea10 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1ea20 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 64 65  .static int node
1ea30 52 65 61 64 65 72 49 6e 69 74 28 4e 6f 64 65 52  ReaderInit(NodeR
1ea40 65 61 64 65 72 20 2a 70 2c 20 63 6f 6e 73 74 20  eader *p, const 
1ea50 63 68 61 72 20 2a 61 4e 6f 64 65 2c 20 69 6e 74  char *aNode, int
1ea60 20 6e 4e 6f 64 65 29 7b 0a 20 20 6d 65 6d 73 65   nNode){.  memse
1ea70 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4e  t(p, 0, sizeof(N
1ea80 6f 64 65 52 65 61 64 65 72 29 29 3b 0a 20 20 70  odeReader));.  p
1ea90 2d 3e 61 4e 6f 64 65 20 3d 20 61 4e 6f 64 65 3b  ->aNode = aNode;
1eaa0 0a 20 20 70 2d 3e 6e 4e 6f 64 65 20 3d 20 6e 4e  .  p->nNode = nN
1eab0 6f 64 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  ode;..  /* Figur
1eac0 65 20 6f 75 74 20 69 66 20 74 68 69 73 20 69 73  e out if this is
1ead0 20 61 20 6c 65 61 66 20 6f 72 20 61 6e 20 69 6e   a leaf or an in
1eae0 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 20 2a 2f 0a  ternal node. */.
1eaf0 20 20 69 66 28 20 70 2d 3e 61 4e 6f 64 65 5b 30    if( p->aNode[0
1eb00 5d 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 69  ] ){.    /* An i
1eb10 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 20 2a 2f  nternal node. */
1eb20 0a 20 20 20 20 70 2d 3e 69 4f 66 66 20 3d 20 31  .    p->iOff = 1
1eb30 20 2b 20 73 71 6c 69 74 65 33 46 74 73 33 47 65   + sqlite3Fts3Ge
1eb40 74 56 61 72 69 6e 74 28 26 70 2d 3e 61 4e 6f 64  tVarint(&p->aNod
1eb50 65 5b 31 5d 2c 20 26 70 2d 3e 69 43 68 69 6c 64  e[1], &p->iChild
1eb60 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1eb70 70 2d 3e 69 4f 66 66 20 3d 20 31 3b 0a 20 20 7d  p->iOff = 1;.  }
1eb80 0a 0a 20 20 72 65 74 75 72 6e 20 6e 6f 64 65 52  ..  return nodeR
1eb90 65 61 64 65 72 4e 65 78 74 28 70 29 3b 0a 7d 0a  eaderNext(p);.}.
1eba0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1ebb0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
1ebc0 68 69 6c 65 20 77 72 69 74 69 6e 67 20 61 6e 20  hile writing an 
1ebd0 46 54 53 20 73 65 67 6d 65 6e 74 20 65 61 63 68  FTS segment each
1ebe0 20 74 69 6d 65 20 61 20 6c 65 61 66 20 6f 0a 2a   time a leaf o.*
1ebf0 2a 20 6e 6f 64 65 20 69 73 20 66 69 6e 69 73 68  * node is finish
1ec00 65 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20 74  ed and written t
1ec10 6f 20 64 69 73 6b 2e 20 54 68 65 20 6b 65 79 20  o disk. The key 
1ec20 28 7a 54 65 72 6d 2f 6e 54 65 72 6d 29 20 69 73  (zTerm/nTerm) is
1ec30 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
1ec40 6f 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  o be greater tha
1ec50 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  n the largest ke
1ec60 79 20 6f 6e 20 74 68 65 20 6e 6f 64 65 20 6a 75  y on the node ju
1ec70 73 74 20 77 72 69 74 74 65 6e 2c 20 62 75 74 20  st written, but 
1ec80 73 6d 61 6c 6c 65 72 0a 2a 2a 20 74 68 61 6e 20  smaller.** than 
1ec90 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
1eca0 66 69 72 73 74 20 6b 65 79 20 74 68 61 74 20 77  first key that w
1ecb0 69 6c 6c 20 62 65 20 77 72 69 74 74 65 6e 20 74  ill be written t
1ecc0 6f 20 74 68 65 20 6e 65 78 74 20 6c 65 61 66 0a  o the next leaf.
1ecd0 2a 2a 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  ** node..**.** T
1ece0 68 65 20 62 6c 6f 63 6b 20 69 64 20 6f 66 20 74  he block id of t
1ecf0 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 6a 75 73  he leaf node jus
1ed00 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  t written to dis
1ed10 6b 20 6d 61 79 20 62 65 20 66 6f 75 6e 64 20 69  k may be found i
1ed20 6e 0a 2a 2a 20 28 70 57 72 69 74 65 72 2d 3e 61  n.** (pWriter->a
1ed30 4e 6f 64 65 57 72 69 74 65 72 5b 30 5d 2e 69 42  NodeWriter[0].iB
1ed40 6c 6f 63 6b 29 20 77 68 65 6e 20 74 68 69 73 20  lock) when this 
1ed50 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1ed60 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1ed70 74 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 50  t fts3IncrmergeP
1ed80 75 73 68 28 0a 20 20 46 74 73 33 54 61 62 6c 65  ush(.  Fts3Table
1ed90 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1eda0 20 20 20 20 20 20 20 2f 2a 20 46 74 73 33 20 74         /* Fts3 t
1edb0 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
1edc0 20 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72   IncrmergeWriter
1edd0 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20 20   *pWriter,      
1ede0 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63   /* Writer objec
1edf0 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
1ee00 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20  r *zTerm,       
1ee10 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74         /* Term t
1ee20 6f 20 77 72 69 74 65 20 74 6f 20 69 6e 74 65 72  o write to inter
1ee30 6e 61 6c 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e  nal node */.  in
1ee40 74 20 6e 54 65 72 6d 20 20 20 20 20 20 20 20 20  t nTerm         
1ee50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ee60 20 42 79 74 65 73 20 61 74 20 7a 54 65 72 6d 20   Bytes at zTerm 
1ee70 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
1ee80 69 6e 74 36 34 20 69 50 74 72 20 3d 20 70 57 72  int64 iPtr = pWr
1ee90 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65  iter->aNodeWrite
1eea0 72 5b 30 5d 2e 69 42 6c 6f 63 6b 3b 0a 20 20 69  r[0].iBlock;.  i
1eeb0 6e 74 20 69 4c 61 79 65 72 3b 0a 0a 20 20 61 73  nt iLayer;..  as
1eec0 73 65 72 74 28 20 6e 54 65 72 6d 3e 30 20 29 3b  sert( nTerm>0 );
1eed0 0a 20 20 66 6f 72 28 69 4c 61 79 65 72 3d 31 3b  .  for(iLayer=1;
1eee0 20 41 4c 57 41 59 53 28 69 4c 61 79 65 72 3c 46   ALWAYS(iLayer<F
1eef0 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c  TS_MAX_APPENDABL
1ef00 45 5f 48 45 49 47 48 54 29 3b 20 69 4c 61 79 65  E_HEIGHT); iLaye
1ef10 72 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r++){.    sqlite
1ef20 33 5f 69 6e 74 36 34 20 69 4e 65 78 74 50 74 72  3_int64 iNextPtr
1ef30 20 3d 20 30 3b 0a 20 20 20 20 4e 6f 64 65 57 72   = 0;.    NodeWr
1ef40 69 74 65 72 20 2a 70 4e 6f 64 65 20 3d 20 26 70  iter *pNode = &p
1ef50 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69  Writer->aNodeWri
1ef60 74 65 72 5b 69 4c 61 79 65 72 5d 3b 0a 20 20 20  ter[iLayer];.   
1ef70 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1ef80 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 6e 50 72  _OK;.    int nPr
1ef90 65 66 69 78 3b 0a 20 20 20 20 69 6e 74 20 6e 53  efix;.    int nS
1efa0 75 66 66 69 78 3b 0a 20 20 20 20 69 6e 74 20 6e  uffix;.    int n
1efb0 53 70 61 63 65 3b 0a 0a 20 20 20 20 2f 2a 20 46  Space;..    /* F
1efc0 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75  igure out how mu
1efd0 63 68 20 73 70 61 63 65 20 74 68 65 20 6b 65 79  ch space the key
1efe0 20 77 69 6c 6c 20 63 6f 6e 73 75 6d 65 20 69 66   will consume if
1eff0 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 20 74   it is written t
1f000 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  o.    ** the cur
1f010 72 65 6e 74 20 6e 6f 64 65 20 6f 66 20 6c 61 79  rent node of lay
1f020 65 72 20 69 4c 61 79 65 72 2e 20 44 75 65 20 74  er iLayer. Due t
1f030 6f 20 74 68 65 20 70 72 65 66 69 78 20 63 6f 6d  o the prefix com
1f040 70 72 65 73 73 69 6f 6e 2c 20 0a 20 20 20 20 2a  pression, .    *
1f050 2a 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75  * the space requ
1f060 69 72 65 64 20 63 68 61 6e 67 65 73 20 64 65 70  ired changes dep
1f070 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 20  ending on which 
1f080 6e 6f 64 65 20 74 68 65 20 6b 65 79 20 69 73 20  node the key is 
1f090 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 61 64 64  to.    ** be add
1f0a0 65 64 20 74 6f 2e 20 20 2a 2f 0a 20 20 20 20 6e  ed to.  */.    n
1f0b0 50 72 65 66 69 78 20 3d 20 66 74 73 33 50 72 65  Prefix = fts3Pre
1f0c0 66 69 78 43 6f 6d 70 72 65 73 73 28 70 4e 6f 64  fixCompress(pNod
1f0d0 65 2d 3e 6b 65 79 2e 61 2c 20 70 4e 6f 64 65 2d  e->key.a, pNode-
1f0e0 3e 6b 65 79 2e 6e 2c 20 7a 54 65 72 6d 2c 20 6e  >key.n, zTerm, n
1f0f0 54 65 72 6d 29 3b 0a 20 20 20 20 6e 53 75 66 66  Term);.    nSuff
1f100 69 78 20 3d 20 6e 54 65 72 6d 20 2d 20 6e 50 72  ix = nTerm - nPr
1f110 65 66 69 78 3b 0a 20 20 20 20 6e 53 70 61 63 65  efix;.    nSpace
1f120 20 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56    = sqlite3Fts3V
1f130 61 72 69 6e 74 4c 65 6e 28 6e 50 72 65 66 69 78  arintLen(nPrefix
1f140 29 3b 0a 20 20 20 20 6e 53 70 61 63 65 20 2b 3d  );.    nSpace +=
1f150 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69   sqlite3Fts3Vari
1f160 6e 74 4c 65 6e 28 6e 53 75 66 66 69 78 29 20 2b  ntLen(nSuffix) +
1f170 20 6e 53 75 66 66 69 78 3b 0a 0a 20 20 20 20 69   nSuffix;..    i
1f180 66 28 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 3d  f( pNode->key.n=
1f190 3d 30 20 7c 7c 20 28 70 4e 6f 64 65 2d 3e 62 6c  =0 || (pNode->bl
1f1a0 6f 63 6b 2e 6e 20 2b 20 6e 53 70 61 63 65 29 3c  ock.n + nSpace)<
1f1b0 3d 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 29 7b  =p->nNodeSize ){
1f1c0 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68   .      /* If th
1f1d0 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 20 6f  e current node o
1f1e0 66 20 6c 61 79 65 72 20 69 4c 61 79 65 72 20 63  f layer iLayer c
1f1f0 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 6b 65 79  ontains zero key
1f200 73 2c 20 6f 72 20 69 66 20 61 64 64 69 6e 67 0a  s, or if adding.
1f210 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6b 65 79        ** the key
1f220 20 74 6f 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20   to it will not 
1f230 63 61 75 73 65 20 69 74 20 74 6f 20 67 72 6f 77  cause it to grow
1f240 20 74 6f 20 6c 61 72 67 65 72 20 74 68 61 6e 20   to larger than 
1f250 6e 4e 6f 64 65 53 69 7a 65 20 0a 20 20 20 20 20  nNodeSize .     
1f260 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a   ** bytes in siz
1f270 65 2c 20 77 72 69 74 65 20 74 68 65 20 6b 65 79  e, write the key
1f280 20 68 65 72 65 2e 20 20 2a 2f 0a 0a 20 20 20 20   here.  */..    
1f290 20 20 42 6c 6f 62 20 2a 70 42 6c 6b 20 3d 20 26    Blob *pBlk = &
1f2a0 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 3b 0a 20 20  pNode->block;.  
1f2b0 20 20 20 20 69 66 28 20 70 42 6c 6b 2d 3e 6e 3d      if( pBlk->n=
1f2c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 6c  =0 ){.        bl
1f2d0 6f 62 47 72 6f 77 42 75 66 66 65 72 28 70 42 6c  obGrowBuffer(pBl
1f2e0 6b 2c 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 2c  k, p->nNodeSize,
1f2f0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69   &rc);.        i
1f300 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f310 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 42   ){.          pB
1f320 6c 6b 2d 3e 61 5b 30 5d 20 3d 20 28 63 68 61 72  lk->a[0] = (char
1f330 29 69 4c 61 79 65 72 3b 0a 20 20 20 20 20 20 20  )iLayer;.       
1f340 20 20 20 70 42 6c 6b 2d 3e 6e 20 3d 20 31 20 2b     pBlk->n = 1 +
1f350 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56   sqlite3Fts3PutV
1f360 61 72 69 6e 74 28 26 70 42 6c 6b 2d 3e 61 5b 31  arint(&pBlk->a[1
1f370 5d 2c 20 69 50 74 72 29 3b 0a 20 20 20 20 20 20  ], iPtr);.      
1f380 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1f390 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 72    blobGrowBuffer
1f3a0 28 70 42 6c 6b 2c 20 70 42 6c 6b 2d 3e 6e 20 2b  (pBlk, pBlk->n +
1f3b0 20 6e 53 70 61 63 65 2c 20 26 72 63 29 3b 0a 20   nSpace, &rc);. 
1f3c0 20 20 20 20 20 62 6c 6f 62 47 72 6f 77 42 75 66       blobGrowBuf
1f3d0 66 65 72 28 26 70 4e 6f 64 65 2d 3e 6b 65 79 2c  fer(&pNode->key,
1f3e0 20 6e 54 65 72 6d 2c 20 26 72 63 29 3b 0a 0a 20   nTerm, &rc);.. 
1f3f0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1f400 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f410 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 6b 65 79    if( pNode->key
1f420 2e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  .n ){.          
1f430 70 42 6c 6b 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  pBlk->n += sqlit
1f440 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28  e3Fts3PutVarint(
1f450 26 70 42 6c 6b 2d 3e 61 5b 70 42 6c 6b 2d 3e 6e  &pBlk->a[pBlk->n
1f460 5d 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 20  ], nPrefix);.   
1f470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1f480 42 6c 6b 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65  Blk->n += sqlite
1f490 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26  3Fts3PutVarint(&
1f4a0 70 42 6c 6b 2d 3e 61 5b 70 42 6c 6b 2d 3e 6e 5d  pBlk->a[pBlk->n]
1f4b0 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 20 20  , nSuffix);.    
1f4c0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 42 6c 6b      memcpy(&pBlk
1f4d0 2d 3e 61 5b 70 42 6c 6b 2d 3e 6e 5d 2c 20 26 7a  ->a[pBlk->n], &z
1f4e0 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 2c 20 6e  Term[nPrefix], n
1f4f0 53 75 66 66 69 78 29 3b 0a 20 20 20 20 20 20 20  Suffix);.       
1f500 20 70 42 6c 6b 2d 3e 6e 20 2b 3d 20 6e 53 75 66   pBlk->n += nSuf
1f510 66 69 78 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65  fix;..        me
1f520 6d 63 70 79 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e  mcpy(pNode->key.
1f530 61 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29  a, zTerm, nTerm)
1f540 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d  ;.        pNode-
1f550 3e 6b 65 79 2e 6e 20 3d 20 6e 54 65 72 6d 3b 0a  >key.n = nTerm;.
1f560 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1f570 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65  e{.      /* Othe
1f580 72 77 69 73 65 2c 20 66 6c 75 73 68 20 74 68 65  rwise, flush the
1f590 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 20 6f 66   current node of
1f5a0 20 6c 61 79 65 72 20 69 4c 61 79 65 72 20 74 6f   layer iLayer to
1f5b0 20 64 69 73 6b 2e 0a 20 20 20 20 20 20 2a 2a 20   disk..      ** 
1f5c0 54 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20  Then allocate a 
1f5d0 6e 65 77 2c 20 65 6d 70 74 79 20 73 69 62 6c 69  new, empty sibli
1f5e0 6e 67 20 6e 6f 64 65 2e 20 54 68 65 20 6b 65 79  ng node. The key
1f5f0 20 77 69 6c 6c 20 62 65 20 77 72 69 74 74 65 6e   will be written
1f600 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  .      ** into t
1f610 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68 69  he parent of thi
1f620 73 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20  s node. */.     
1f630 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65 53   rc = fts3WriteS
1f640 65 67 6d 65 6e 74 28 70 2c 20 70 4e 6f 64 65 2d  egment(p, pNode-
1f650 3e 69 42 6c 6f 63 6b 2c 20 70 4e 6f 64 65 2d 3e  >iBlock, pNode->
1f660 62 6c 6f 63 6b 2e 61 2c 20 70 4e 6f 64 65 2d 3e  block.a, pNode->
1f670 62 6c 6f 63 6b 2e 6e 29 3b 0a 0a 20 20 20 20 20  block.n);..     
1f680 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e   assert( pNode->
1f690 62 6c 6f 63 6b 2e 6e 41 6c 6c 6f 63 3e 3d 70 2d  block.nAlloc>=p-
1f6a0 3e 6e 4e 6f 64 65 53 69 7a 65 20 29 3b 0a 20 20  >nNodeSize );.  
1f6b0 20 20 20 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b      pNode->block
1f6c0 2e 61 5b 30 5d 20 3d 20 28 63 68 61 72 29 69 4c  .a[0] = (char)iL
1f6d0 61 79 65 72 3b 0a 20 20 20 20 20 20 70 4e 6f 64  ayer;.      pNod
1f6e0 65 2d 3e 62 6c 6f 63 6b 2e 6e 20 3d 20 31 20 2b  e->block.n = 1 +
1f6f0 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56   sqlite3Fts3PutV
1f700 61 72 69 6e 74 28 26 70 4e 6f 64 65 2d 3e 62 6c  arint(&pNode->bl
1f710 6f 63 6b 2e 61 5b 31 5d 2c 20 69 50 74 72 2b 31  ock.a[1], iPtr+1
1f720 29 3b 0a 0a 20 20 20 20 20 20 69 4e 65 78 74 50  );..      iNextP
1f730 74 72 20 3d 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f  tr = pNode->iBlo
1f740 63 6b 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d  ck;.      pNode-
1f750 3e 69 42 6c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20  >iBlock++;.     
1f760 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 20 3d 20   pNode->key.n = 
1f770 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  0;.    }..    if
1f780 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f790 7c 7c 20 69 4e 65 78 74 50 74 72 3d 3d 30 20 29  || iNextPtr==0 )
1f7a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f7b0 69 50 74 72 20 3d 20 69 4e 65 78 74 50 74 72 3b  iPtr = iNextPtr;
1f7c0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1f7d0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  0 );.  return 0;
1f7e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
1f7f0 20 61 20 74 65 72 6d 20 61 6e 64 20 28 6f 70 74   a term and (opt
1f800 69 6f 6e 61 6c 6c 79 29 20 64 6f 63 6c 69 73 74  ionally) doclist
1f810 20 74 6f 20 74 68 65 20 46 54 53 20 73 65 67 6d   to the FTS segm
1f820 65 6e 74 20 6e 6f 64 65 20 63 75 72 72 65 6e 74  ent node current
1f830 6c 79 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  ly.** stored in 
1f840 62 6c 6f 62 20 2a 70 4e 6f 64 65 2e 20 54 68 65  blob *pNode. The
1f850 20 6e 6f 64 65 20 6e 65 65 64 20 6e 6f 74 20 63   node need not c
1f860 6f 6e 74 61 69 6e 20 61 6e 79 20 74 65 72 6d 73  ontain any terms
1f870 2c 20 62 75 74 20 74 68 65 0a 2a 2a 20 68 65 61  , but the.** hea
1f880 64 65 72 20 6d 75 73 74 20 62 65 20 77 72 69 74  der must be writ
1f890 74 65 6e 20 62 65 66 6f 72 65 20 74 68 69 73 20  ten before this 
1f8a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1f8b0 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 6f 64 65  ed..**.** A node
1f8c0 20 68 65 61 64 65 72 20 69 73 20 61 20 73 69 6e   header is a sin
1f8d0 67 6c 65 20 30 78 30 30 20 62 79 74 65 20 66 6f  gle 0x00 byte fo
1f8e0 72 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 6f  r a leaf node, o
1f8f0 72 20 61 20 68 65 69 67 68 74 20 76 61 72 69 6e  r a height varin
1f900 74 0a 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79  t.** followed by
1f910 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 63   the left-hand-c
1f920 68 69 6c 64 20 76 61 72 69 6e 74 20 66 6f 72 20  hild varint for 
1f930 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  an internal node
1f940 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  ..**.** The term
1f950 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20   to be appended 
1f960 69 73 20 70 61 73 73 65 64 20 76 69 61 20 61 72  is passed via ar
1f970 67 75 6d 65 6e 74 73 20 7a 54 65 72 6d 2f 6e 54  guments zTerm/nT
1f980 65 72 6d 2e 20 46 6f 72 20 61 20 0a 2a 2a 20 6c  erm. For a .** l
1f990 65 61 66 20 6e 6f 64 65 2c 20 74 68 65 20 64 6f  eaf node, the do
1f9a0 63 6c 69 73 74 20 69 73 20 70 61 73 73 65 64 20  clist is passed 
1f9b0 61 73 20 61 44 6f 63 6c 69 73 74 2f 6e 44 6f 63  as aDoclist/nDoc
1f9c0 6c 69 73 74 2e 20 46 6f 72 20 61 6e 20 69 6e 74  list. For an int
1f9d0 65 72 6e 61 6c 0a 2a 2a 20 6e 6f 64 65 2c 20 62  ernal.** node, b
1f9e0 6f 74 68 20 61 44 6f 63 6c 69 73 74 20 61 6e 64  oth aDoclist and
1f9f0 20 6e 44 6f 63 6c 69 73 74 20 6d 75 73 74 20 62   nDoclist must b
1fa00 65 20 70 61 73 73 65 64 20 30 2e 0a 2a 2a 0a 2a  e passed 0..**.*
1fa10 2a 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66  * If the size of
1fa20 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 62 6c   the value in bl
1fa30 6f 62 20 70 50 72 65 76 20 69 73 20 7a 65 72 6f  ob pPrev is zero
1fa40 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 74  , then this is t
1fa50 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 65 72 6d  he first.** term
1fa60 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1fa70 6e 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  node. Otherwise,
1fa80 20 70 50 72 65 76 20 63 6f 6e 74 61 69 6e 73 20   pPrev contains 
1fa90 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 0a 2a  a copy of the .*
1faa0 2a 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 2e  * previous term.
1fab0 20 42 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e   Before this fun
1fac0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 69  ction returns, i
1fad0 74 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  t is updated to 
1fae0 63 6f 6e 74 61 69 6e 20 61 0a 2a 2a 20 63 6f 70  contain a.** cop
1faf0 79 20 6f 66 20 7a 54 65 72 6d 2f 6e 54 65 72 6d  y of zTerm/nTerm
1fb00 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73  ..**.** It is as
1fb10 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 62  sumed that the b
1fb20 75 66 66 65 72 20 61 73 73 6f 63 69 61 74 65 64  uffer associated
1fb30 20 77 69 74 68 20 70 4e 6f 64 65 20 69 73 20 61   with pNode is a
1fb40 6c 72 65 61 64 79 20 6c 61 72 67 65 0a 2a 2a 20  lready large.** 
1fb50 65 6e 6f 75 67 68 20 74 6f 20 61 63 63 6f 6d 6d  enough to accomm
1fb60 6f 64 61 74 65 20 74 68 65 20 6e 65 77 20 65 6e  odate the new en
1fb70 74 72 79 2e 20 54 68 65 20 62 75 66 66 65 72 20  try. The buffer 
1fb80 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1fb90 70 50 72 65 76 0a 2a 2a 20 69 73 20 65 78 74 65  pPrev.** is exte
1fba0 6e 64 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  nded by this fun
1fbb0 63 74 69 6f 6e 20 69 66 20 72 65 71 75 72 69 72  ction if requrir
1fbc0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
1fbd0 65 72 72 6f 72 20 28 69 2e 65 2e 20 4f 4f 4d 20  error (i.e. OOM 
1fbe0 63 6f 6e 64 69 74 69 6f 6e 29 20 6f 63 63 75 72  condition) occur
1fbf0 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  s, an SQLite err
1fc00 6f 72 20 63 6f 64 65 20 69 73 0a 2a 2a 20 72 65  or code is.** re
1fc10 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
1fc20 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  e, SQLITE_OK..*/
1fc30 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
1fc40 41 70 70 65 6e 64 54 6f 4e 6f 64 65 28 0a 20 20  AppendToNode(.  
1fc50 42 6c 6f 62 20 2a 70 4e 6f 64 65 2c 20 20 20 20  Blob *pNode,    
1fc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc70 2f 2a 20 43 75 72 72 65 6e 74 20 6e 6f 64 65 20  /* Current node 
1fc80 69 6d 61 67 65 20 74 6f 20 61 70 70 65 6e 64 20  image to append 
1fc90 74 6f 20 2a 2f 0a 20 20 42 6c 6f 62 20 2a 70 50  to */.  Blob *pP
1fca0 72 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20  rev,            
1fcb0 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
1fcc0 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65  r containing pre
1fcd0 76 69 6f 75 73 20 74 65 72 6d 20 77 72 69 74 74  vious term writt
1fce0 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  en */.  const ch
1fcf0 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20  ar *zTerm,      
1fd00 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74          /* New t
1fd10 65 72 6d 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  erm to write */.
1fd20 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20    int nTerm,    
1fd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd40 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65    /* Size of zTe
1fd50 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  rm in bytes */. 
1fd60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44 6f   const char *aDo
1fd70 63 6c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  clist,          
1fd80 20 2f 2a 20 44 6f 63 6c 69 73 74 20 28 6f 72 20   /* Doclist (or 
1fd90 4e 55 4c 4c 29 20 74 6f 20 77 72 69 74 65 20 2a  NULL) to write *
1fda0 2f 0a 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74  /.  int nDoclist
1fdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdc0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
1fdd0 44 6f 63 6c 69 73 74 20 69 6e 20 62 79 74 65 73  Doclist in bytes
1fde0 20 2a 2f 20 0a 29 7b 0a 20 20 69 6e 74 20 72 63   */ .){.  int rc
1fdf0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
1fe00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1fe10 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1fe20 74 20 62 46 69 72 73 74 20 3d 20 28 70 50 72 65  t bFirst = (pPre
1fe30 76 2d 3e 6e 3d 3d 30 29 3b 20 20 20 20 20 2f 2a  v->n==0);     /*
1fe40 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
1fe50 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
1fe60 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74  written */.  int
1fe70 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20 20   nPrefix;       
1fe80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fe90 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 70 72 65  Size of term pre
1fea0 66 69 78 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  fix in bytes */.
1feb0 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 20 20    int nSuffix;  
1fec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fed0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72    /* Size of ter
1fee0 6d 20 73 75 66 66 69 78 20 69 6e 20 62 79 74 65  m suffix in byte
1fef0 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4e 6f 64 65 20  s */..  /* Node 
1ff00 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64  must have alread
1ff10 79 20 62 65 65 6e 20 73 74 61 72 74 65 64 2e 20  y been started. 
1ff20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20  There must be a 
1ff30 64 6f 63 6c 69 73 74 20 66 6f 72 20 61 0a 20 20  doclist for a.  
1ff40 2a 2a 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e  ** leaf node, an
1ff50 64 20 74 68 65 72 65 20 6d 75 73 74 20 6e 6f 74  d there must not
1ff60 20 62 65 20 61 20 64 6f 63 6c 69 73 74 20 66 6f   be a doclist fo
1ff70 72 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  r an internal no
1ff80 64 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  de.  */.  assert
1ff90 28 20 70 4e 6f 64 65 2d 3e 6e 3e 30 20 29 3b 0a  ( pNode->n>0 );.
1ffa0 20 20 61 73 73 65 72 74 28 20 28 70 4e 6f 64 65    assert( (pNode
1ffb0 2d 3e 61 5b 30 5d 3d 3d 27 5c 30 27 29 3d 3d 28  ->a[0]=='\0')==(
1ffc0 61 44 6f 63 6c 69 73 74 21 3d 30 29 20 29 3b 0a  aDoclist!=0) );.
1ffd0 0a 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65  .  blobGrowBuffe
1ffe0 72 28 70 50 72 65 76 2c 20 6e 54 65 72 6d 2c 20  r(pPrev, nTerm, 
1fff0 26 72 63 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  &rc);.  if( rc!=
20000 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
20010 72 6e 20 72 63 3b 0a 0a 20 20 6e 50 72 65 66 69  rn rc;..  nPrefi
20020 78 20 3d 20 66 74 73 33 50 72 65 66 69 78 43 6f  x = fts3PrefixCo
20030 6d 70 72 65 73 73 28 70 50 72 65 76 2d 3e 61 2c  mpress(pPrev->a,
20040 20 70 50 72 65 76 2d 3e 6e 2c 20 7a 54 65 72 6d   pPrev->n, zTerm
20050 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 6e 53 75 66  , nTerm);.  nSuf
20060 66 69 78 20 3d 20 6e 54 65 72 6d 20 2d 20 6e 50  fix = nTerm - nP
20070 72 65 66 69 78 3b 0a 20 20 6d 65 6d 63 70 79 28  refix;.  memcpy(
20080 70 50 72 65 76 2d 3e 61 2c 20 7a 54 65 72 6d 2c  pPrev->a, zTerm,
20090 20 6e 54 65 72 6d 29 3b 0a 20 20 70 50 72 65 76   nTerm);.  pPrev
200a0 2d 3e 6e 20 3d 20 6e 54 65 72 6d 3b 0a 0a 20 20  ->n = nTerm;..  
200b0 69 66 28 20 62 46 69 72 73 74 3d 3d 30 20 29 7b  if( bFirst==0 ){
200c0 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 6e 20 2b 3d  .    pNode->n +=
200d0 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56   sqlite3Fts3PutV
200e0 61 72 69 6e 74 28 26 70 4e 6f 64 65 2d 3e 61 5b  arint(&pNode->a[
200f0 70 4e 6f 64 65 2d 3e 6e 5d 2c 20 6e 50 72 65 66  pNode->n], nPref
20100 69 78 29 3b 0a 20 20 7d 0a 20 20 70 4e 6f 64 65  ix);.  }.  pNode
20110 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ->n += sqlite3Ft
20120 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 4e 6f  s3PutVarint(&pNo
20130 64 65 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d 2c  de->a[pNode->n],
20140 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 6d 65 6d   nSuffix);.  mem
20150 63 70 79 28 26 70 4e 6f 64 65 2d 3e 61 5b 70 4e  cpy(&pNode->a[pN
20160 6f 64 65 2d 3e 6e 5d 2c 20 26 7a 54 65 72 6d 5b  ode->n], &zTerm[
20170 6e 50 72 65 66 69 78 5d 2c 20 6e 53 75 66 66 69  nPrefix], nSuffi
20180 78 29 3b 0a 20 20 70 4e 6f 64 65 2d 3e 6e 20 2b  x);.  pNode->n +
20190 3d 20 6e 53 75 66 66 69 78 3b 0a 0a 20 20 69 66  = nSuffix;..  if
201a0 28 20 61 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20  ( aDoclist ){.  
201b0 20 20 70 4e 6f 64 65 2d 3e 6e 20 2b 3d 20 73 71    pNode->n += sq
201c0 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69  lite3Fts3PutVari
201d0 6e 74 28 26 70 4e 6f 64 65 2d 3e 61 5b 70 4e 6f  nt(&pNode->a[pNo
201e0 64 65 2d 3e 6e 5d 2c 20 6e 44 6f 63 6c 69 73 74  de->n], nDoclist
201f0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
20200 4e 6f 64 65 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e  Node->a[pNode->n
20210 5d 2c 20 61 44 6f 63 6c 69 73 74 2c 20 6e 44 6f  ], aDoclist, nDo
20220 63 6c 69 73 74 29 3b 0a 20 20 20 20 70 4e 6f 64  clist);.    pNod
20230 65 2d 3e 6e 20 2b 3d 20 6e 44 6f 63 6c 69 73 74  e->n += nDoclist
20240 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
20250 20 70 4e 6f 64 65 2d 3e 6e 3c 3d 70 4e 6f 64 65   pNode->n<=pNode
20260 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 0a 20 20 72  ->nAlloc );..  r
20270 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20280 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
20290 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   the current ter
202a0 6d 20 61 6e 64 20 64 6f 63 6c 69 73 74 20 70 6f  m and doclist po
202b0 69 6e 74 65 64 20 74 6f 20 62 79 20 63 75 72 73  inted to by curs
202c0 6f 72 20 70 43 73 72 20 74 6f 20 74 68 65 0a 2a  or pCsr to the.*
202d0 2a 20 61 70 70 65 6e 64 61 62 6c 65 20 62 2d 74  * appendable b-t
202e0 72 65 65 20 73 65 67 6d 65 6e 74 20 6f 70 65 6e  ree segment open
202f0 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20 62  ed for writing b
20300 79 20 70 57 72 69 74 65 72 2e 0a 2a 2a 0a 2a 2a  y pWriter..**.**
20310 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
20320 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  K if successful,
20330 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
20340 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
20350 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
20360 74 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 41  t fts3IncrmergeA
20370 70 70 65 6e 64 28 0a 20 20 46 74 73 33 54 61 62  ppend(.  Fts3Tab
20380 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
20390 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73 33           /* Fts3
203a0 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   table handle */
203b0 0a 20 20 49 6e 63 72 6d 65 72 67 65 57 72 69 74  .  IncrmergeWrit
203c0 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20  er *pWriter,    
203d0 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a     /* Writer obj
203e0 65 63 74 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c  ect */.  Fts3Mul
203f0 74 69 53 65 67 52 65 61 64 65 72 20 2a 70 43 73  tiSegReader *pCs
20400 72 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73  r        /* Curs
20410 6f 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65  or containing te
20420 72 6d 20 61 6e 64 20 64 6f 63 6c 69 73 74 20 2a  rm and doclist *
20430 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
20440 72 20 2a 7a 54 65 72 6d 20 3d 20 70 43 73 72 2d  r *zTerm = pCsr-
20450 3e 7a 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 54  >zTerm;.  int nT
20460 65 72 6d 20 3d 20 70 43 73 72 2d 3e 6e 54 65 72  erm = pCsr->nTer
20470 6d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  m;.  const char 
20480 2a 61 44 6f 63 6c 69 73 74 20 3d 20 70 43 73 72  *aDoclist = pCsr
20490 2d 3e 61 44 6f 63 6c 69 73 74 3b 0a 20 20 69 6e  ->aDoclist;.  in
204a0 74 20 6e 44 6f 63 6c 69 73 74 20 3d 20 70 43 73  t nDoclist = pCs
204b0 72 2d 3e 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 69  r->nDoclist;.  i
204c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
204d0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  K;           /* 
204e0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
204f0 20 69 6e 74 20 6e 53 70 61 63 65 3b 20 20 20 20   int nSpace;    
20500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20510 2a 20 54 6f 74 61 6c 20 73 70 61 63 65 20 69 6e  * Total space in
20520 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
20530 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 69 6e 74  on leaf */.  int
20540 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20 20   nPrefix;       
20550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
20560 7a 65 20 6f 66 20 70 72 65 66 69 78 20 73 68 61  ze of prefix sha
20570 72 65 64 20 77 69 74 68 20 70 72 65 76 69 6f 75  red with previou
20580 73 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  s term */.  int 
20590 6e 53 75 66 66 69 78 3b 20 20 20 20 20 20 20 20  nSuffix;        
205a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
205b0 65 20 6f 66 20 73 75 66 66 69 78 20 28 6e 54 65  e of suffix (nTe
205c0 72 6d 20 2d 20 6e 50 72 65 66 69 78 29 20 2a 2f  rm - nPrefix) */
205d0 0a 20 20 4e 6f 64 65 57 72 69 74 65 72 20 2a 70  .  NodeWriter *p
205e0 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20  Leaf;           
205f0 20 2f 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20   /* Object used 
20600 74 6f 20 77 72 69 74 65 20 6c 65 61 66 20 6e 6f  to write leaf no
20610 64 65 73 20 2a 2f 0a 0a 20 20 70 4c 65 61 66 20  des */..  pLeaf 
20620 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64  = &pWriter->aNod
20630 65 57 72 69 74 65 72 5b 30 5d 3b 0a 20 20 6e 50  eWriter[0];.  nP
20640 72 65 66 69 78 20 3d 20 66 74 73 33 50 72 65 66  refix = fts3Pref
20650 69 78 43 6f 6d 70 72 65 73 73 28 70 4c 65 61 66  ixCompress(pLeaf
20660 2d 3e 6b 65 79 2e 61 2c 20 70 4c 65 61 66 2d 3e  ->key.a, pLeaf->
20670 6b 65 79 2e 6e 2c 20 7a 54 65 72 6d 2c 20 6e 54  key.n, zTerm, nT
20680 65 72 6d 29 3b 0a 20 20 6e 53 75 66 66 69 78 20  erm);.  nSuffix 
20690 3d 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66 69  = nTerm - nPrefi
206a0 78 3b 0a 0a 20 20 6e 53 70 61 63 65 20 20 3d 20  x;..  nSpace  = 
206b0 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e  sqlite3Fts3Varin
206c0 74 4c 65 6e 28 6e 50 72 65 66 69 78 29 3b 0a 20  tLen(nPrefix);. 
206d0 20 6e 53 70 61 63 65 20 2b 3d 20 73 71 6c 69 74   nSpace += sqlit
206e0 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28  e3Fts3VarintLen(
206f0 6e 53 75 66 66 69 78 29 20 2b 20 6e 53 75 66 66  nSuffix) + nSuff
20700 69 78 3b 0a 20 20 6e 53 70 61 63 65 20 2b 3d 20  ix;.  nSpace += 
20710 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e  sqlite3Fts3Varin
20720 74 4c 65 6e 28 6e 44 6f 63 6c 69 73 74 29 20 2b  tLen(nDoclist) +
20730 20 6e 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 2f 2a   nDoclist;..  /*
20740 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
20750 62 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 65 6d 70  block is not emp
20760 74 79 2c 20 61 6e 64 20 69 66 20 61 64 64 69 6e  ty, and if addin
20770 67 20 74 68 69 73 20 74 65 72 6d 2f 64 6f 63 6c  g this term/docl
20780 69 73 74 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ist.  ** to the 
20790 63 75 72 72 65 6e 74 20 62 6c 6f 63 6b 20 77 6f  current block wo
207a0 75 6c 64 20 6d 61 6b 65 20 69 74 20 6c 61 72 67  uld make it larg
207b0 65 72 20 74 68 61 6e 20 46 74 73 33 54 61 62 6c  er than Fts3Tabl
207c0 65 2e 6e 4e 6f 64 65 53 69 7a 65 0a 20 20 2a 2a  e.nNodeSize.  **
207d0 20 62 79 74 65 73 2c 20 77 72 69 74 65 20 74 68   bytes, write th
207e0 69 73 20 62 6c 6f 63 6b 20 6f 75 74 20 74 6f 20  is block out to 
207f0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 2a 2f  the database. */
20800 0a 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 62 6c  .  if( pLeaf->bl
20810 6f 63 6b 2e 6e 3e 30 20 26 26 20 28 70 4c 65 61  ock.n>0 && (pLea
20820 66 2d 3e 62 6c 6f 63 6b 2e 6e 20 2b 20 6e 53 70  f->block.n + nSp
20830 61 63 65 29 3e 70 2d 3e 6e 4e 6f 64 65 53 69 7a  ace)>p->nNodeSiz
20840 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  e ){.    rc = ft
20850 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28 70  s3WriteSegment(p
20860 2c 20 70 4c 65 61 66 2d 3e 69 42 6c 6f 63 6b 2c  , pLeaf->iBlock,
20870 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 61 2c   pLeaf->block.a,
20880 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 29   pLeaf->block.n)
20890 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e  ;.    pWriter->n
208a0 57 6f 72 6b 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20  Work++;..    /* 
208b0 41 64 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  Add the current 
208c0 74 65 72 6d 20 74 6f 20 74 68 65 20 70 61 72 65  term to the pare
208d0 6e 74 20 6e 6f 64 65 2e 20 54 68 65 20 74 65 72  nt node. The ter
208e0 6d 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 0a  m added to the .
208f0 20 20 20 20 2a 2a 20 70 61 72 65 6e 74 20 6d 75      ** parent mu
20900 73 74 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  st:.    **.    *
20910 2a 20 20 20 61 29 20 62 65 20 67 72 65 61 74 65  *   a) be greate
20920 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65  r than the large
20930 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 6c  st term on the l
20940 65 61 66 20 6e 6f 64 65 20 6a 75 73 74 20 77 72  eaf node just wr
20950 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 20 20 20  itten.    **    
20960 20 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73    to the databas
20970 65 20 28 73 74 69 6c 6c 20 61 76 61 69 6c 61 62  e (still availab
20980 6c 65 20 69 6e 20 70 4c 65 61 66 2d 3e 6b 65 79  le in pLeaf->key
20990 29 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 0a 20 20  ), and.    **.  
209a0 20 20 2a 2a 20 20 20 62 29 20 62 65 20 6c 65 73    **   b) be les
209b0 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
209c0 74 6f 20 74 68 65 20 74 65 72 6d 20 61 62 6f 75  to the term abou
209d0 74 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  t to be added to
209e0 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20   the new.    ** 
209f0 20 20 20 20 20 6c 65 61 66 20 6e 6f 64 65 20 28       leaf node (
20a00 7a 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 20 20  zTerm/nTerm)..  
20a10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 6f    **.    ** In o
20a20 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20 6d  ther words, it m
20a30 75 73 74 20 62 65 20 74 68 65 20 70 72 65 66 69  ust be the prefi
20a40 78 20 6f 66 20 7a 54 65 72 6d 20 31 20 62 79 74  x of zTerm 1 byt
20a50 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 20 20  e longer than.  
20a60 20 20 2a 2a 20 74 68 65 20 63 6f 6d 6d 6f 6e 20    ** the common 
20a70 70 72 65 66 69 78 20 28 69 66 20 61 6e 79 29 20  prefix (if any) 
20a80 6f 66 20 7a 54 65 72 6d 20 61 6e 64 20 70 57 72  of zTerm and pWr
20a90 69 74 65 72 2d 3e 7a 54 65 72 6d 2e 0a 20 20 20  iter->zTerm..   
20aa0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
20ab0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20ac0 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72     rc = fts3Incr
20ad0 6d 65 72 67 65 50 75 73 68 28 70 2c 20 70 57 72  mergePush(p, pWr
20ae0 69 74 65 72 2c 20 7a 54 65 72 6d 2c 20 6e 50 72  iter, zTerm, nPr
20af0 65 66 69 78 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a  efix+1);.    }..
20b00 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74      /* Advance t
20b10 6f 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75  o the next outpu
20b20 74 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 70  t block */.    p
20b30 4c 65 61 66 2d 3e 69 42 6c 6f 63 6b 2b 2b 3b 0a  Leaf->iBlock++;.
20b40 20 20 20 20 70 4c 65 61 66 2d 3e 6b 65 79 2e 6e      pLeaf->key.n
20b50 20 3d 20 30 3b 0a 20 20 20 20 70 4c 65 61 66 2d   = 0;.    pLeaf-
20b60 3e 62 6c 6f 63 6b 2e 6e 20 3d 20 30 3b 0a 0a 20  >block.n = 0;.. 
20b70 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65     nSuffix = nTe
20b80 72 6d 3b 0a 20 20 20 20 6e 53 70 61 63 65 20 20  rm;.    nSpace  
20b90 3d 20 31 3b 0a 20 20 20 20 6e 53 70 61 63 65 20  = 1;.    nSpace 
20ba0 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56 61  += sqlite3Fts3Va
20bb0 72 69 6e 74 4c 65 6e 28 6e 53 75 66 66 69 78 29  rintLen(nSuffix)
20bc0 20 2b 20 6e 53 75 66 66 69 78 3b 0a 20 20 20 20   + nSuffix;.    
20bd0 6e 53 70 61 63 65 20 2b 3d 20 73 71 6c 69 74 65  nSpace += sqlite
20be0 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e  3Fts3VarintLen(n
20bf0 44 6f 63 6c 69 73 74 29 20 2b 20 6e 44 6f 63 6c  Doclist) + nDocl
20c00 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 70 57 72 69  ist;.  }..  pWri
20c10 74 65 72 2d 3e 6e 4c 65 61 66 44 61 74 61 20 2b  ter->nLeafData +
20c20 3d 20 6e 53 70 61 63 65 3b 0a 20 20 62 6c 6f 62  = nSpace;.  blob
20c30 47 72 6f 77 42 75 66 66 65 72 28 26 70 4c 65 61  GrowBuffer(&pLea
20c40 66 2d 3e 62 6c 6f 63 6b 2c 20 70 4c 65 61 66 2d  f->block, pLeaf-
20c50 3e 62 6c 6f 63 6b 2e 6e 20 2b 20 6e 53 70 61 63  >block.n + nSpac
20c60 65 2c 20 26 72 63 29 3b 0a 20 20 69 66 28 20 72  e, &rc);.  if( r
20c70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20c80 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 62      if( pLeaf->b
20c90 6c 6f 63 6b 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20  lock.n==0 ){.   
20ca0 20 20 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e     pLeaf->block.
20cb0 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4c 65  n = 1;.      pLe
20cc0 61 66 2d 3e 62 6c 6f 63 6b 2e 61 5b 30 5d 20 3d  af->block.a[0] =
20cd0 20 27 5c 30 27 3b 0a 20 20 20 20 7d 0a 20 20 20   '\0';.    }.   
20ce0 20 72 63 20 3d 20 66 74 73 33 41 70 70 65 6e 64   rc = fts3Append
20cf0 54 6f 4e 6f 64 65 28 0a 20 20 20 20 20 20 20 20  ToNode(.        
20d00 26 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2c 20 26  &pLeaf->block, &
20d10 70 4c 65 61 66 2d 3e 6b 65 79 2c 20 7a 54 65 72  pLeaf->key, zTer
20d20 6d 2c 20 6e 54 65 72 6d 2c 20 61 44 6f 63 6c 69  m, nTerm, aDocli
20d30 73 74 2c 20 6e 44 6f 63 6c 69 73 74 0a 20 20 20  st, nDoclist.   
20d40 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   );.  }..  retur
20d50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
20d60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
20d70 63 61 6c 6c 65 64 20 74 6f 20 72 65 6c 65 61 73  called to releas
20d80 65 20 61 6c 6c 20 64 79 6e 61 6d 69 63 20 72 65  e all dynamic re
20d90 73 6f 75 72 63 65 73 20 68 65 6c 64 20 62 79 20  sources held by 
20da0 74 68 65 0a 2a 2a 20 6d 65 72 67 65 2d 77 72 69  the.** merge-wri
20db0 74 65 72 20 6f 62 6a 65 63 74 20 70 57 72 69 74  ter object pWrit
20dc0 65 72 2c 20 61 6e 64 20 69 66 20 6e 6f 20 65 72  er, and if no er
20dd0 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
20de0 2c 20 74 6f 20 66 6c 75 73 68 0a 2a 2a 20 61 6c  , to flush.** al
20df0 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6e 6f  l outstanding no
20e00 64 65 20 62 75 66 66 65 72 73 20 68 65 6c 64 20  de buffers held 
20e10 62 79 20 70 57 72 69 74 65 72 20 74 6f 20 64 69  by pWriter to di
20e20 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52  sk..**.** If *pR
20e30 63 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  c is not SQLITE_
20e40 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  OK when this fun
20e50 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
20e60 20 74 68 65 6e 20 6e 6f 20 61 74 74 65 6d 70 74   then no attempt
20e70 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 77  .** is made to w
20e80 72 69 74 65 20 61 6e 79 20 64 61 74 61 20 74 6f  rite any data to
20e90 20 64 69 73 6b 2e 20 49 6e 73 74 65 61 64 2c 20   disk. Instead, 
20ea0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  this function se
20eb0 72 76 65 73 20 6f 6e 6c 79 0a 2a 2a 20 74 6f 20  rves only.** to 
20ec0 72 65 6c 65 61 73 65 20 6f 75 74 73 74 61 6e 64  release outstand
20ed0 69 6e 67 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a  ing resources..*
20ee0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
20ef0 69 66 20 2a 70 52 63 20 69 73 20 69 6e 69 74 69  if *pRc is initi
20f00 61 6c 6c 79 20 53 51 4c 49 54 45 5f 4f 4b 20 61  ally SQLITE_OK a
20f10 6e 64 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  nd an error occu
20f20 72 73 20 77 68 69 6c 65 0a 2a 2a 20 66 6c 75 73  rs while.** flus
20f30 68 69 6e 67 20 62 75 66 66 65 72 73 20 74 6f 20  hing buffers to 
20f40 64 69 73 6b 2c 20 2a 70 52 63 20 69 73 20 73 65  disk, *pRc is se
20f50 74 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 65  t to an SQLite e
20f60 72 72 6f 72 20 63 6f 64 65 20 62 65 66 6f 72 65  rror code before
20f70 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  .** returning..*
20f80 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
20f90 73 33 49 6e 63 72 6d 65 72 67 65 52 65 6c 65 61  s3IncrmergeRelea
20fa0 73 65 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  se(.  Fts3Table 
20fb0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
20fc0 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61        /* FTS3 ta
20fd0 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
20fe0 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72 20  IncrmergeWriter 
20ff0 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20  *pWriter,       
21000 2f 2a 20 4d 65 72 67 65 2d 77 72 69 74 65 72 20  /* Merge-writer 
21010 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
21020 2a 70 52 63 20 20 20 20 20 20 20 20 20 20 20 20  *pRc            
21030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
21040 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64  N/OUT: Error cod
21050 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
21060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
21080 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
21090 6f 75 67 68 20 6e 6f 6e 2d 72 6f 6f 74 20 6c 61  ough non-root la
210a0 79 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 52  yers */.  int iR
210b0 6f 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  oot;            
210c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
210d0 65 78 20 6f 66 20 72 6f 6f 74 20 69 6e 20 70 57  ex of root in pW
210e0 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74  riter->aNodeWrit
210f0 65 72 20 2a 2f 0a 20 20 4e 6f 64 65 57 72 69 74  er */.  NodeWrit
21100 65 72 20 2a 70 52 6f 6f 74 3b 20 20 20 20 20 20  er *pRoot;      
21110 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65 57          /* NodeW
21120 72 69 74 65 72 20 66 6f 72 20 72 6f 6f 74 20 6e  riter for root n
21130 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ode */.  int rc 
21140 3d 20 2a 70 52 63 3b 20 20 20 20 20 20 20 20 20  = *pRc;         
21150 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
21160 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  r code */..  /* 
21170 53 65 74 20 69 52 6f 6f 74 20 74 6f 20 74 68 65  Set iRoot to the
21180 20 69 6e 64 65 78 20 69 6e 20 70 57 72 69 74 65   index in pWrite
21190 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 5d  r->aNodeWriter[]
211a0 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20 73   of the output s
211b0 65 67 6d 65 6e 74 20 0a 20 20 2a 2a 20 72 6f 6f  egment .  ** roo
211c0 74 20 6e 6f 64 65 2e 20 49 66 20 74 68 65 20 73  t node. If the s
211d0 65 67 6d 65 6e 74 20 66 69 74 73 20 65 6e 74 69  egment fits enti
211e0 72 65 6c 79 20 6f 6e 20 61 20 73 69 6e 67 6c 65  rely on a single
211f0 20 6c 65 61 66 20 6e 6f 64 65 2c 20 69 52 6f 6f   leaf node, iRoo
21200 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73  t.  ** will be s
21210 65 74 20 74 6f 20 30 2e 20 49 66 20 74 68 65 20  et to 0. If the 
21220 72 6f 6f 74 20 6e 6f 64 65 20 69 73 20 74 68 65  root node is the
21230 20 70 61 72 65 6e 74 20 6f 66 20 74 68 65 20 6c   parent of the l
21240 65 61 76 65 73 2c 20 69 52 6f 6f 74 0a 20 20 2a  eaves, iRoot.  *
21250 2a 20 77 69 6c 6c 20 62 65 20 31 2e 20 41 6e 64  * will be 1. And
21260 20 73 6f 20 6f 6e 2e 20 20 2a 2f 0a 20 20 66 6f   so on.  */.  fo
21270 72 28 69 52 6f 6f 74 3d 46 54 53 5f 4d 41 58 5f  r(iRoot=FTS_MAX_
21280 41 50 50 45 4e 44 41 42 4c 45 5f 48 45 49 47 48  APPENDABLE_HEIGH
21290 54 2d 31 3b 20 69 52 6f 6f 74 3e 3d 30 3b 20 69  T-1; iRoot>=0; i
212a0 52 6f 6f 74 2d 2d 29 7b 0a 20 20 20 20 4e 6f 64  Root--){.    Nod
212b0 65 57 72 69 74 65 72 20 2a 70 4e 6f 64 65 20 3d  eWriter *pNode =
212c0 20 26 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65   &pWriter->aNode
212d0 57 72 69 74 65 72 5b 69 52 6f 6f 74 5d 3b 0a 20  Writer[iRoot];. 
212e0 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 62 6c     if( pNode->bl
212f0 6f 63 6b 2e 6e 3e 30 20 29 20 62 72 65 61 6b 3b  ock.n>0 ) break;
21300 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 52  .    assert( *pR
21310 63 20 7c 7c 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63  c || pNode->bloc
21320 6b 2e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20  k.nAlloc==0 );. 
21330 20 20 20 61 73 73 65 72 74 28 20 2a 70 52 63 20     assert( *pRc 
21340 7c 7c 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 41  || pNode->key.nA
21350 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 20 20 73  lloc==0 );.    s
21360 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 6f 64  qlite3_free(pNod
21370 65 2d 3e 62 6c 6f 63 6b 2e 61 29 3b 0a 20 20 20  e->block.a);.   
21380 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
21390 6f 64 65 2d 3e 6b 65 79 2e 61 29 3b 0a 20 20 7d  ode->key.a);.  }
213a0 0a 0a 20 20 2f 2a 20 45 6d 70 74 79 20 6f 75 74  ..  /* Empty out
213b0 70 75 74 20 73 65 67 6d 65 6e 74 2e 20 54 68 69  put segment. Thi
213c0 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f  s is a no-op. */
213d0 0a 20 20 69 66 28 20 69 52 6f 6f 74 3c 30 20 29  .  if( iRoot<0 )
213e0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54   return;..  /* T
213f0 68 65 20 65 6e 74 69 72 65 20 6f 75 74 70 75 74  he entire output
21400 20 73 65 67 6d 65 6e 74 20 66 69 74 73 20 6f 6e   segment fits on
21410 20 61 20 73 69 6e 67 6c 65 20 6e 6f 64 65 2e 20   a single node. 
21420 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 6d  Normally, this m
21430 65 61 6e 73 0a 20 20 2a 2a 20 74 68 65 20 6e 6f  eans.  ** the no
21440 64 65 20 77 6f 75 6c 64 20 62 65 20 73 74 6f 72  de would be stor
21450 65 64 20 61 73 20 61 20 62 6c 6f 62 20 69 6e 20  ed as a blob in 
21460 74 68 65 20 22 72 6f 6f 74 22 20 63 6f 6c 75 6d  the "root" colum
21470 6e 20 6f 66 20 74 68 65 20 25 5f 73 65 67 64 69  n of the %_segdi
21480 72 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 48 6f  r.  ** table. Ho
21490 77 65 76 65 72 2c 20 74 68 69 73 20 69 73 20 6e  wever, this is n
214a0 6f 74 20 70 65 72 6d 69 74 74 65 64 20 69 6e 20  ot permitted in 
214b0 74 68 69 73 20 63 61 73 65 2e 20 54 68 65 20 70  this case. The p
214c0 72 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 20 0a  roblem is that .
214d0 20 20 2a 2a 20 73 70 61 63 65 20 68 61 73 20 61    ** space has a
214e0 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 73 65  lready been rese
214f0 72 76 65 64 20 69 6e 20 74 68 65 20 25 5f 73 65  rved in the %_se
21500 67 6d 65 6e 74 73 20 74 61 62 6c 65 2c 20 61 6e  gments table, an
21510 64 20 73 6f 20 74 68 65 20 0a 20 20 2a 2a 20 73  d so the .  ** s
21520 74 61 72 74 5f 62 6c 6f 63 6b 20 61 6e 64 20 65  tart_block and e
21530 6e 64 5f 62 6c 6f 63 6b 20 66 69 65 6c 64 73 20  nd_block fields 
21540 6f 66 20 74 68 65 20 25 5f 73 65 67 64 69 72 20  of the %_segdir 
21550 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 70 6f  table must be po
21560 70 75 6c 61 74 65 64 2e 20 0a 20 20 2a 2a 20 41  pulated. .  ** A
21570 6e 64 2c 20 62 79 20 64 65 73 69 67 6e 20 6f 72  nd, by design or
21580 20 62 79 20 61 63 63 69 64 65 6e 74 2c 20 72 65   by accident, re
21590 6c 65 61 73 65 64 20 76 65 72 73 69 6f 6e 73 20  leased versions 
215a0 6f 66 20 46 54 53 20 63 61 6e 6e 6f 74 20 68 61  of FTS cannot ha
215b0 6e 64 6c 65 20 0a 20 20 2a 2a 20 73 65 67 6d 65  ndle .  ** segme
215c0 6e 74 73 20 74 68 61 74 20 66 69 74 20 65 6e 74  nts that fit ent
215d0 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 72 6f 6f  irely on the roo
215e0 74 20 6e 6f 64 65 20 77 69 74 68 20 73 74 61 72  t node with star
215f0 74 5f 62 6c 6f 63 6b 21 3d 30 2e 0a 20 20 2a 2a  t_block!=0..  **
21600 0a 20 20 2a 2a 20 49 6e 73 74 65 61 64 2c 20 63  .  ** Instead, c
21610 72 65 61 74 65 20 61 20 73 79 6e 74 68 65 74 69  reate a syntheti
21620 63 20 72 6f 6f 74 20 6e 6f 64 65 20 74 68 61 74  c root node that
21630 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 74 68 69 6e   contains nothin
21640 67 20 62 75 74 20 61 20 0a 20 20 2a 2a 20 70 6f  g but a .  ** po
21650 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 69 6e  inter to the sin
21660 67 6c 65 20 63 6f 6e 74 65 6e 74 20 6e 6f 64 65  gle content node
21670 2e 20 53 6f 20 74 68 61 74 20 74 68 65 20 73 65  . So that the se
21680 67 6d 65 6e 74 20 63 6f 6e 73 69 73 74 73 20 6f  gment consists o
21690 66 20 61 0a 20 20 2a 2a 20 73 69 6e 67 6c 65 20  f a.  ** single 
216a0 6c 65 61 66 20 61 6e 64 20 61 20 73 69 6e 67 6c  leaf and a singl
216b0 65 20 69 6e 74 65 72 69 6f 72 20 28 72 6f 6f 74  e interior (root
216c0 29 20 6e 6f 64 65 2e 0a 20 20 2a 2a 0a 20 20 2a  ) node..  **.  *
216d0 2a 20 54 6f 64 6f 3a 20 42 65 74 74 65 72 20 6d  * Todo: Better m
216e0 69 67 68 74 20 62 65 20 74 6f 20 64 65 66 65 72  ight be to defer
216f0 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 70 61 63   allocating spac
21700 65 20 69 6e 20 74 68 65 20 25 5f 73 65 67 6d 65  e in the %_segme
21710 6e 74 73 20 0a 20 20 2a 2a 20 74 61 62 6c 65 20  nts .  ** table 
21720 75 6e 74 69 6c 20 77 65 20 61 72 65 20 73 75 72  until we are sur
21730 65 20 69 74 20 69 73 20 6e 65 65 64 65 64 2e 0a  e it is needed..
21740 20 20 2a 2f 0a 20 20 69 66 28 20 69 52 6f 6f 74    */.  if( iRoot
21750 3d 3d 30 20 29 7b 0a 20 20 20 20 42 6c 6f 62 20  ==0 ){.    Blob 
21760 2a 70 42 6c 6f 63 6b 20 3d 20 26 70 57 72 69 74  *pBlock = &pWrit
21770 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b  er->aNodeWriter[
21780 31 5d 2e 62 6c 6f 63 6b 3b 0a 20 20 20 20 62 6c  1].block;.    bl
21790 6f 62 47 72 6f 77 42 75 66 66 65 72 28 70 42 6c  obGrowBuffer(pBl
217a0 6f 63 6b 2c 20 31 20 2b 20 46 54 53 33 5f 56 41  ock, 1 + FTS3_VA
217b0 52 49 4e 54 5f 4d 41 58 2c 20 26 72 63 29 3b 0a  RINT_MAX, &rc);.
217c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
217d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
217e0 42 6c 6f 63 6b 2d 3e 61 5b 30 5d 20 3d 20 30 78  Block->a[0] = 0x
217f0 30 31 3b 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b  01;.      pBlock
21800 2d 3e 6e 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ->n = 1 + sqlite
21810 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 0a  3Fts3PutVarint(.
21820 20 20 20 20 20 20 20 20 20 20 26 70 42 6c 6f 63            &pBloc
21830 6b 2d 3e 61 5b 31 5d 2c 20 70 57 72 69 74 65 72  k->a[1], pWriter
21840 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 30 5d  ->aNodeWriter[0]
21850 2e 69 42 6c 6f 63 6b 0a 20 20 20 20 20 20 29 3b  .iBlock.      );
21860 0a 20 20 20 20 7d 0a 20 20 20 20 69 52 6f 6f 74  .    }.    iRoot
21870 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f   = 1;.  }.  pRoo
21880 74 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 4e  t = &pWriter->aN
21890 6f 64 65 57 72 69 74 65 72 5b 69 52 6f 6f 74 5d  odeWriter[iRoot]
218a0 3b 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20 61 6c  ;..  /* Flush al
218b0 6c 20 63 75 72 72 65 6e 74 6c 79 20 6f 75 74 73  l currently outs
218c0 74 61 6e 64 69 6e 67 20 6e 6f 64 65 73 20 74 6f  tanding nodes to
218d0 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 66 6f 72 28   disk. */.  for(
218e0 69 3d 30 3b 20 69 3c 69 52 6f 6f 74 3b 20 69 2b  i=0; i<iRoot; i+
218f0 2b 29 7b 0a 20 20 20 20 4e 6f 64 65 57 72 69 74  +){.    NodeWrit
21900 65 72 20 2a 70 4e 6f 64 65 20 3d 20 26 70 57 72  er *pNode = &pWr
21910 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65  iter->aNodeWrite
21920 72 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 4e  r[i];.    if( pN
21930 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 3e 30 20 26  ode->block.n>0 &
21940 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
21950 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  ){.      rc = ft
21960 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28 70  s3WriteSegment(p
21970 2c 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b 2c  , pNode->iBlock,
21980 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 2c   pNode->block.a,
21990 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 29   pNode->block.n)
219a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
219b0 74 65 33 5f 66 72 65 65 28 70 4e 6f 64 65 2d 3e  te3_free(pNode->
219c0 62 6c 6f 63 6b 2e 61 29 3b 0a 20 20 20 20 73 71  block.a);.    sq
219d0 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 6f 64 65  lite3_free(pNode
219e0 2d 3e 6b 65 79 2e 61 29 3b 0a 20 20 7d 0a 0a 20  ->key.a);.  }.. 
219f0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 25 5f   /* Write the %_
21a00 73 65 67 64 69 72 20 72 65 63 6f 72 64 2e 20 2a  segdir record. *
21a10 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
21a20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
21a30 3d 20 66 74 73 33 57 72 69 74 65 53 65 67 64 69  = fts3WriteSegdi
21a40 72 28 70 2c 20 0a 20 20 20 20 20 20 20 20 70 57  r(p, .        pW
21a50 72 69 74 65 72 2d 3e 69 41 62 73 4c 65 76 65 6c  riter->iAbsLevel
21a60 2b 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  +1,             
21a70 20 20 2f 2a 20 6c 65 76 65 6c 20 2a 2f 0a 20 20    /* level */.  
21a80 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69        pWriter->i
21a90 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
21aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 64 78            /* idx
21ab0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57 72 69   */.        pWri
21ac0 74 65 72 2d 3e 69 53 74 61 72 74 2c 20 20 20 20  ter->iStart,    
21ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ae0 2f 2a 20 73 74 61 72 74 5f 62 6c 6f 63 6b 20 2a  /* start_block *
21af0 2f 0a 20 20 20 20 20 20 20 20 70 57 72 69 74 65  /.        pWrite
21b00 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 30  r->aNodeWriter[0
21b10 5d 2e 69 42 6c 6f 63 6b 2c 20 20 20 20 20 2f 2a  ].iBlock,     /*
21b20 20 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63   leaves_end_bloc
21b30 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57 72  k */.        pWr
21b40 69 74 65 72 2d 3e 69 45 6e 64 2c 20 20 20 20 20  iter->iEnd,     
21b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b60 20 2f 2a 20 65 6e 64 5f 62 6c 6f 63 6b 20 2a 2f   /* end_block */
21b70 0a 20 20 20 20 20 20 20 20 28 70 57 72 69 74 65  .        (pWrite
21b80 72 2d 3e 62 4e 6f 4c 65 61 66 44 61 74 61 3d 3d  r->bNoLeafData==
21b90 30 20 3f 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65  0 ? pWriter->nLe
21ba0 61 66 44 61 74 61 20 3a 20 30 29 2c 20 20 20 2f  afData : 0),   /
21bb0 2a 20 65 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20  * end_block */. 
21bc0 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 62 6c         pRoot->bl
21bd0 6f 63 6b 2e 61 2c 20 70 52 6f 6f 74 2d 3e 62 6c  ock.a, pRoot->bl
21be0 6f 63 6b 2e 6e 20 20 20 20 20 20 2f 2a 20 72 6f  ock.n      /* ro
21bf0 6f 74 20 2a 2f 0a 20 20 20 20 29 3b 0a 20 20 7d  ot */.    );.  }
21c00 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
21c10 70 52 6f 6f 74 2d 3e 62 6c 6f 63 6b 2e 61 29 3b  pRoot->block.a);
21c20 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
21c30 70 52 6f 6f 74 2d 3e 6b 65 79 2e 61 29 3b 0a 0a  pRoot->key.a);..
21c40 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 7d 0a 0a    *pRc = rc;.}..
21c50 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
21c60 65 20 74 65 72 6d 20 69 6e 20 62 75 66 66 65 72  e term in buffer
21c70 20 7a 4c 68 73 20 28 73 69 7a 65 20 69 6e 20 62   zLhs (size in b
21c80 79 74 65 73 20 6e 4c 68 73 29 20 77 69 74 68 20  ytes nLhs) with 
21c90 74 68 61 74 20 69 6e 0a 2a 2a 20 7a 52 68 73 20  that in.** zRhs 
21ca0 28 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6e  (size in bytes n
21cb0 52 68 73 29 20 75 73 69 6e 67 20 6d 65 6d 63 6d  Rhs) using memcm
21cc0 70 2e 20 49 66 20 6f 6e 65 20 74 65 72 6d 20 69  p. If one term i
21cd0 73 20 61 20 70 72 65 66 69 78 20 6f 66 0a 2a 2a  s a prefix of.**
21ce0 20 74 68 65 20 6f 74 68 65 72 2c 20 69 74 20 69   the other, it i
21cf0 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  s considered to 
21d00 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  be smaller than 
21d10 74 68 65 20 6f 74 68 65 72 2e 0a 2a 2a 0a 2a 2a  the other..**.**
21d20 20 52 65 74 75 72 6e 20 2d 76 65 20 69 66 20 7a   Return -ve if z
21d30 4c 68 73 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  Lhs is smaller t
21d40 68 61 6e 20 7a 52 68 73 2c 20 30 20 69 66 20 69  han zRhs, 0 if i
21d50 74 20 69 73 20 65 71 75 61 6c 2c 20 6f 72 20 2b  t is equal, or +
21d60 76 65 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 67  ve.** if it is g
21d70 72 65 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  reater..*/.stati
21d80 63 20 69 6e 74 20 66 74 73 33 54 65 72 6d 43 6d  c int fts3TermCm
21d90 70 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  p(.  const char 
21da0 2a 7a 4c 68 73 2c 20 69 6e 74 20 6e 4c 68 73 2c  *zLhs, int nLhs,
21db0 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20 63       /* LHS of c
21dc0 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 63  omparison */.  c
21dd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 68 73 2c  onst char *zRhs,
21de0 20 69 6e 74 20 6e 52 68 73 20 20 20 20 20 20 2f   int nRhs      /
21df0 2a 20 52 48 53 20 6f 66 20 63 6f 6d 70 61 72 69  * RHS of compari
21e00 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  son */.){.  int 
21e10 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 4c 68 73 2c  nCmp = MIN(nLhs,
21e20 20 6e 52 68 73 29 3b 0a 20 20 69 6e 74 20 72 65   nRhs);.  int re
21e30 73 3b 0a 0a 20 20 72 65 73 20 3d 20 6d 65 6d 63  s;..  res = memc
21e40 6d 70 28 7a 4c 68 73 2c 20 7a 52 68 73 2c 20 6e  mp(zLhs, zRhs, n
21e50 43 6d 70 29 3b 0a 20 20 69 66 28 20 72 65 73 3d  Cmp);.  if( res=
21e60 3d 30 20 29 20 72 65 73 20 3d 20 6e 4c 68 73 20  =0 ) res = nLhs 
21e70 2d 20 6e 52 68 73 3b 0a 0a 20 20 72 65 74 75 72  - nRhs;..  retur
21e80 6e 20 72 65 73 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  n res;.}.../*.**
21e90 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66   Query to see if
21ea0 20 74 68 65 20 65 6e 74 72 79 20 69 6e 20 74 68   the entry in th
21eb0 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62  e %_segments tab
21ec0 6c 65 20 77 69 74 68 20 62 6c 6f 63 6b 69 64 20  le with blockid 
21ed0 69 45 6e 64 20 69 73 20 0a 2a 2a 20 4e 55 4c 4c  iEnd is .** NULL
21ee0 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  . If no error oc
21ef0 63 75 72 73 20 61 6e 64 20 74 68 65 20 65 6e 74  curs and the ent
21f00 72 79 20 69 73 20 4e 55 4c 4c 2c 20 73 65 74 20  ry is NULL, set 
21f10 2a 70 62 52 65 73 20 31 20 62 65 66 6f 72 65 0a  *pbRes 1 before.
21f20 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 20 4f 74  ** returning. Ot
21f30 68 65 72 77 69 73 65 2c 20 73 65 74 20 2a 70 62  herwise, set *pb
21f40 52 65 73 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a  Res to 0. .**.**
21f50 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72   Or, if an error
21f60 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 71 75   occurs while qu
21f70 65 72 79 69 6e 67 20 74 68 65 20 64 61 74 61 62  erying the datab
21f80 61 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 53  ase, return an S
21f90 51 4c 69 74 65 20 0a 2a 2a 20 65 72 72 6f 72 20  QLite .** error 
21fa0 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 20  code. The final 
21fb0 76 61 6c 75 65 20 6f 66 20 2a 70 62 52 65 73 20  value of *pbRes 
21fc0 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  is undefined in 
21fd0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
21fe0 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
21ff0 20 74 65 73 74 20 69 66 20 61 20 73 65 67 6d 65   test if a segme
22000 6e 74 20 69 73 20 61 6e 20 22 61 70 70 65 6e 64  nt is an "append
22010 61 62 6c 65 22 20 73 65 67 6d 65 6e 74 2e 20 49  able" segment. I
22020 66 20 69 74 0a 2a 2a 20 69 73 2c 20 74 68 65 6e  f it.** is, then
22030 20 61 20 4e 55 4c 4c 20 65 6e 74 72 79 20 68 61   a NULL entry ha
22040 73 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20  s been inserted 
22050 69 6e 74 6f 20 74 68 65 20 25 5f 73 65 67 6d 65  into the %_segme
22060 6e 74 73 20 74 61 62 6c 65 0a 2a 2a 20 77 69 74  nts table.** wit
22070 68 20 62 6c 6f 63 6b 69 64 20 25 5f 73 65 67 64  h blockid %_segd
22080 69 72 2e 65 6e 64 5f 62 6c 6f 63 6b 2e 0a 2a 2f  ir.end_block..*/
22090 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
220a0 49 73 41 70 70 65 6e 64 61 62 6c 65 28 46 74 73  IsAppendable(Fts
220b0 33 54 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74  3Table *p, sqlit
220c0 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 2c 20 69  e3_int64 iEnd, i
220d0 6e 74 20 2a 70 62 52 65 73 29 7b 0a 20 20 69 6e  nt *pbRes){.  in
220e0 74 20 62 52 65 73 20 3d 20 30 3b 20 20 20 20 20  t bRes = 0;     
220f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22100 20 52 65 73 75 6c 74 20 74 6f 20 73 65 74 20 2a   Result to set *
22110 70 62 52 65 73 20 74 6f 20 2a 2f 0a 20 20 73 71  pbRes to */.  sq
22120 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 43 68 65  lite3_stmt *pChe
22130 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ck = 0;       /*
22140 20 53 74 61 74 65 6d 65 6e 74 20 74 6f 20 71 75   Statement to qu
22150 65 72 79 20 64 61 74 61 62 61 73 65 20 77 69 74  ery database wit
22160 68 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  h */.  int rc;  
22170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22180 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
22190 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 72 63 20 3d   code */..  rc =
221a0 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
221b0 53 51 4c 5f 53 45 47 4d 45 4e 54 5f 49 53 5f 41  SQL_SEGMENT_IS_A
221c0 50 50 45 4e 44 41 42 4c 45 2c 20 26 70 43 68 65  PPENDABLE, &pChe
221d0 63 6b 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ck, 0);.  if( rc
221e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
221f0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
22200 69 6e 74 36 34 28 70 43 68 65 63 6b 2c 20 31 2c  int64(pCheck, 1,
22210 20 69 45 6e 64 29 3b 0a 20 20 20 20 69 66 28 20   iEnd);.    if( 
22220 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
22230 74 65 33 5f 73 74 65 70 28 70 43 68 65 63 6b 29  te3_step(pCheck)
22240 20 29 20 62 52 65 73 20 3d 20 31 3b 0a 20 20 20   ) bRes = 1;.   
22250 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
22260 73 65 74 28 70 43 68 65 63 6b 29 3b 0a 20 20 7d  set(pCheck);.  }
22270 0a 20 20 0a 20 20 2a 70 62 52 65 73 20 3d 20 62  .  .  *pbRes = b
22280 52 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  Res;.  return rc
22290 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
222a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
222b0 65 64 20 77 68 65 6e 20 69 6e 69 74 69 61 6c 69  ed when initiali
222c0 7a 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e  zing an incremen
222d0 74 61 6c 2d 6d 65 72 67 65 20 6f 70 65 72 61 74  tal-merge operat
222e0 69 6f 6e 2e 0a 2a 2a 20 49 74 20 63 68 65 63 6b  ion..** It check
222f0 73 20 69 66 20 74 68 65 20 65 78 69 73 74 69 6e  s if the existin
22300 67 20 73 65 67 6d 65 6e 74 20 77 69 74 68 20 69  g segment with i
22310 6e 64 65 78 20 76 61 6c 75 65 20 69 49 64 78 20  ndex value iIdx 
22320 61 74 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65  at absolute leve
22330 6c 20 0a 2a 2a 20 28 69 41 62 73 4c 65 76 65 6c  l .** (iAbsLevel
22340 2b 31 29 20 63 61 6e 20 62 65 20 61 70 70 65 6e  +1) can be appen
22350 64 65 64 20 74 6f 20 62 79 20 74 68 65 20 69 6e  ded to by the in
22360 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 2e  cremental merge.
22370 20 49 66 20 69 74 20 63 61 6e 2c 20 74 68 65 0a   If it can, the.
22380 2a 2a 20 6d 65 72 67 65 2d 77 72 69 74 65 72 20  ** merge-writer 
22390 6f 62 6a 65 63 74 20 2a 70 57 72 69 74 65 72 20  object *pWriter 
223a0 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
223b0 6f 20 77 72 69 74 65 20 74 6f 20 69 74 2e 0a 2a  o write to it..*
223c0 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67  *.** An existing
223d0 20 73 65 67 6d 65 6e 74 20 63 61 6e 20 62 65 20   segment can be 
223e0 61 70 70 65 6e 64 65 64 20 74 6f 20 62 79 20 61  appended to by a
223f0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  n incremental me
22400 72 67 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  rge if:.**.**   
22410 2a 20 49 74 20 77 61 73 20 69 6e 69 74 69 61 6c  * It was initial
22420 6c 79 20 63 72 65 61 74 65 64 20 61 73 20 61 6e  ly created as an
22430 20 61 70 70 65 6e 64 61 62 6c 65 20 73 65 67 6d   appendable segm
22440 65 6e 74 20 28 77 69 74 68 20 61 6c 6c 20 72 65  ent (with all re
22450 71 75 69 72 65 64 0a 2a 2a 20 20 20 20 20 73 70  quired.**     sp
22460 61 63 65 20 70 72 65 2d 61 6c 6c 6f 63 61 74 65  ace pre-allocate
22470 64 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  d), and.**.**   
22480 2a 20 54 68 65 20 66 69 72 73 74 20 6b 65 79 20  * The first key 
22490 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e  read from the in
224a0 70 75 74 20 28 61 72 67 75 6d 65 6e 74 73 20 7a  put (arguments z
224b0 4b 65 79 20 61 6e 64 20 6e 4b 65 79 29 20 69 73  Key and nKey) is
224c0 20 0a 2a 2a 20 20 20 20 20 67 72 65 61 74 65 72   .**     greater
224d0 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73   than the larges
224e0 74 20 6b 65 79 20 63 75 72 72 65 6e 74 6c 79 20  t key currently 
224f0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 6f  stored in the po
22500 74 65 6e 74 69 61 6c 0a 2a 2a 20 20 20 20 20 6f  tential.**     o
22510 75 74 70 75 74 20 73 65 67 6d 65 6e 74 2e 0a 2a  utput segment..*
22520 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
22530 33 49 6e 63 72 6d 65 72 67 65 4c 6f 61 64 28 0a  3IncrmergeLoad(.
22540 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
22550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22560 20 20 2f 2a 20 46 74 73 33 20 74 61 62 6c 65 20    /* Fts3 table 
22570 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69  handle */.  sqli
22580 74 65 33 5f 69 6e 74 36 34 20 69 41 62 73 4c 65  te3_int64 iAbsLe
22590 76 65 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 41  vel,        /* A
225a0 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 6f 66  bsolute level of
225b0 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
225c0 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20  */.  int iIdx,  
225d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225e0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
225f0 20 63 61 6e 64 69 64 61 74 65 20 6f 75 74 70 75   candidate outpu
22600 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 63  t segment */.  c
22610 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 2c  onst char *zKey,
22620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22630 2a 20 46 69 72 73 74 20 6b 65 79 20 74 6f 20 77  * First key to w
22640 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b  rite */.  int nK
22650 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
22660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
22670 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
22680 6e 4b 65 79 20 2a 2f 0a 20 20 49 6e 63 72 6d 65  nKey */.  Incrme
22690 72 67 65 57 72 69 74 65 72 20 2a 70 57 72 69 74  rgeWriter *pWrit
226a0 65 72 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 70  er        /* Pop
226b0 75 6c 61 74 65 20 74 68 69 73 20 6f 62 6a 65 63  ulate this objec
226c0 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
226d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
226e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
226f0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  urn code */.  sq
22700 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c  lite3_stmt *pSel
22710 65 63 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  ect = 0;      /*
22720 20 53 45 4c 45 43 54 20 74 6f 20 72 65 61 64 20   SELECT to read 
22730 25 5f 73 65 67 64 69 72 20 65 6e 74 72 79 20 2a  %_segdir entry *
22740 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71  /..  rc = fts3Sq
22750 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c  lStmt(p, SQL_SEL
22760 45 43 54 5f 53 45 47 44 49 52 2c 20 26 70 53 65  ECT_SEGDIR, &pSe
22770 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  lect, 0);.  if( 
22780 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22790 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
227a0 36 34 20 69 53 74 61 72 74 20 3d 20 30 3b 20 20  64 iStart = 0;  
227b0 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 25     /* Value of %
227c0 5f 73 65 67 64 69 72 2e 73 74 61 72 74 5f 62 6c  _segdir.start_bl
227d0 6f 63 6b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ock */.    sqlit
227e0 65 33 5f 69 6e 74 36 34 20 69 4c 65 61 66 45 6e  e3_int64 iLeafEn
227f0 64 20 3d 20 30 3b 20 20 20 2f 2a 20 56 61 6c 75  d = 0;   /* Valu
22800 65 20 6f 66 20 25 5f 73 65 67 64 69 72 2e 6c 65  e of %_segdir.le
22810 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 2a  aves_end_block *
22820 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  /.    sqlite3_in
22830 74 36 34 20 69 45 6e 64 20 3d 20 30 3b 20 20 20  t64 iEnd = 0;   
22840 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
22850 25 5f 73 65 67 64 69 72 2e 65 6e 64 5f 62 6c 6f  %_segdir.end_blo
22860 63 6b 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  ck */.    const 
22870 63 68 61 72 20 2a 61 52 6f 6f 74 20 3d 20 30 3b  char *aRoot = 0;
22880 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
22890 65 72 20 74 6f 20 25 5f 73 65 67 64 69 72 2e 72  er to %_segdir.r
228a0 6f 6f 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  oot buffer */.  
228b0 20 20 69 6e 74 20 6e 52 6f 6f 74 20 3d 20 30 3b    int nRoot = 0;
228c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228d0 2f 2a 20 53 69 7a 65 20 6f 66 20 61 52 6f 6f 74  /* Size of aRoot
228e0 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  [] in bytes */. 
228f0 20 20 20 69 6e 74 20 72 63 32 3b 20 20 20 20 20     int rc2;     
22900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22910 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
22920 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 72 65 73  from sqlite3_res
22930 65 74 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  et() */.    int 
22940 62 41 70 70 65 6e 64 61 62 6c 65 20 3d 20 30 3b  bAppendable = 0;
22950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
22960 20 74 6f 20 74 72 75 65 20 69 66 20 73 65 67 6d   to true if segm
22970 65 6e 74 20 69 73 20 61 70 70 65 6e 64 61 62 6c  ent is appendabl
22980 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61  e */..    /* Rea
22990 64 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 65  d the %_segdir e
229a0 6e 74 72 79 20 66 6f 72 20 69 6e 64 65 78 20 69  ntry for index i
229b0 49 64 78 20 61 62 73 6f 6c 75 74 65 20 6c 65 76  Idx absolute lev
229c0 65 6c 20 28 69 41 62 73 4c 65 76 65 6c 2b 31 29  el (iAbsLevel+1)
229d0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
229e0 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 65 6c 65  bind_int64(pSele
229f0 63 74 2c 20 31 2c 20 69 41 62 73 4c 65 76 65 6c  ct, 1, iAbsLevel
22a00 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +1);.    sqlite3
22a10 5f 62 69 6e 64 5f 69 6e 74 28 70 53 65 6c 65 63  _bind_int(pSelec
22a20 74 2c 20 32 2c 20 69 49 64 78 29 3b 0a 20 20 20  t, 2, iIdx);.   
22a30 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65   if( sqlite3_ste
22a40 70 28 70 53 65 6c 65 63 74 29 3d 3d 53 51 4c 49  p(pSelect)==SQLI
22a50 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
22a60 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
22a70 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
22a80 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20 20 20 20  elect, 1);.     
22a90 20 69 4c 65 61 66 45 6e 64 20 3d 20 73 71 6c 69   iLeafEnd = sqli
22aa0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
22ab0 28 70 53 65 6c 65 63 74 2c 20 32 29 3b 0a 20 20  (pSelect, 2);.  
22ac0 20 20 20 20 66 74 73 33 52 65 61 64 45 6e 64 42      fts3ReadEndB
22ad0 6c 6f 63 6b 46 69 65 6c 64 28 70 53 65 6c 65 63  lockField(pSelec
22ae0 74 2c 20 33 2c 20 26 69 45 6e 64 2c 20 26 70 57  t, 3, &iEnd, &pW
22af0 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61 74 61  riter->nLeafData
22b00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 72  );.      if( pWr
22b10 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61 74 61 3c  iter->nLeafData<
22b20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 72  0 ){.        pWr
22b30 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61 74 61 20  iter->nLeafData 
22b40 3d 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66  = pWriter->nLeaf
22b50 44 61 74 61 20 2a 20 2d 31 3b 0a 20 20 20 20 20  Data * -1;.     
22b60 20 7d 0a 20 20 20 20 20 20 70 57 72 69 74 65 72   }.      pWriter
22b70 2d 3e 62 4e 6f 4c 65 61 66 44 61 74 61 20 3d 20  ->bNoLeafData = 
22b80 28 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44  (pWriter->nLeafD
22b90 61 74 61 3d 3d 30 29 3b 0a 20 20 20 20 20 20 6e  ata==0);.      n
22ba0 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f 63  Root = sqlite3_c
22bb0 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 65 6c  olumn_bytes(pSel
22bc0 65 63 74 2c 20 34 29 3b 0a 20 20 20 20 20 20 61  ect, 4);.      a
22bd0 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f 63  Root = sqlite3_c
22be0 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 65 6c 65  olumn_blob(pSele
22bf0 63 74 2c 20 34 29 3b 0a 20 20 20 20 7d 65 6c 73  ct, 4);.    }els
22c00 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
22c10 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
22c20 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  elect);.    }.. 
22c30 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
22c40 74 68 65 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20  the zero-length 
22c50 6d 61 72 6b 65 72 20 69 6e 20 74 68 65 20 25 5f  marker in the %_
22c60 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20 2a  segments table *
22c70 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 49  /.    rc = fts3I
22c80 73 41 70 70 65 6e 64 61 62 6c 65 28 70 2c 20 69  sAppendable(p, i
22c90 45 6e 64 2c 20 26 62 41 70 70 65 6e 64 61 62 6c  End, &bAppendabl
22ca0 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  e);..    /* Chec
22cb0 6b 20 74 68 61 74 20 7a 4b 65 79 2f 6e 4b 65 79  k that zKey/nKey
22cc0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
22cd0 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20  the largest key 
22ce0 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 2a 2f  the candidate */
22cf0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
22d00 49 54 45 5f 4f 4b 20 26 26 20 62 41 70 70 65 6e  ITE_OK && bAppen
22d10 64 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 63  dable ){.      c
22d20 68 61 72 20 2a 61 4c 65 61 66 20 3d 20 30 3b 0a  har *aLeaf = 0;.
22d30 20 20 20 20 20 20 69 6e 74 20 6e 4c 65 61 66 20        int nLeaf 
22d40 3d 20 30 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  = 0;..      rc =
22d50 20 73 71 6c 69 74 65 33 46 74 73 33 52 65 61 64   sqlite3Fts3Read
22d60 42 6c 6f 63 6b 28 70 2c 20 69 4c 65 61 66 45 6e  Block(p, iLeafEn
22d70 64 2c 20 26 61 4c 65 61 66 2c 20 26 6e 4c 65 61  d, &aLeaf, &nLea
22d80 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  f, 0);.      if(
22d90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22da0 7b 0a 20 20 20 20 20 20 20 20 4e 6f 64 65 52 65  {.        NodeRe
22db0 61 64 65 72 20 72 65 61 64 65 72 3b 0a 20 20 20  ader reader;.   
22dc0 20 20 20 20 20 66 6f 72 28 72 63 20 3d 20 6e 6f       for(rc = no
22dd0 64 65 52 65 61 64 65 72 49 6e 69 74 28 26 72 65  deReaderInit(&re
22de0 61 64 65 72 2c 20 61 4c 65 61 66 2c 20 6e 4c 65  ader, aLeaf, nLe
22df0 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  af);.           
22e00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
22e10 26 20 72 65 61 64 65 72 2e 61 4e 6f 64 65 3b 0a  & reader.aNode;.
22e20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
22e30 20 6e 6f 64 65 52 65 61 64 65 72 4e 65 78 74 28   nodeReaderNext(
22e40 26 72 65 61 64 65 72 29 0a 20 20 20 20 20 20 20  &reader).       
22e50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
22e60 73 65 72 74 28 20 72 65 61 64 65 72 2e 61 4e 6f  sert( reader.aNo
22e70 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  de );.        }.
22e80 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73 33          if( fts3
22e90 54 65 72 6d 43 6d 70 28 7a 4b 65 79 2c 20 6e 4b  TermCmp(zKey, nK
22ea0 65 79 2c 20 72 65 61 64 65 72 2e 74 65 72 6d 2e  ey, reader.term.
22eb0 61 2c 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 6e  a, reader.term.n
22ec0 29 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )<=0 ){.        
22ed0 20 20 62 41 70 70 65 6e 64 61 62 6c 65 20 3d 20    bAppendable = 
22ee0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
22ef0 20 20 20 20 20 6e 6f 64 65 52 65 61 64 65 72 52       nodeReaderR
22f00 65 6c 65 61 73 65 28 26 72 65 61 64 65 72 29 3b  elease(&reader);
22f10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
22f20 71 6c 69 74 65 33 5f 66 72 65 65 28 61 4c 65 61  qlite3_free(aLea
22f30 66 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  f);.    }..    i
22f40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22f50 20 26 26 20 62 41 70 70 65 6e 64 61 62 6c 65 20   && bAppendable 
22f60 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69  ){.      /* It i
22f70 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 70  s possible to ap
22f80 70 65 6e 64 20 74 6f 20 74 68 69 73 20 73 65 67  pend to this seg
22f90 6d 65 6e 74 2e 20 53 65 74 20 75 70 20 74 68 65  ment. Set up the
22fa0 20 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72   IncrmergeWriter
22fb0 0a 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74  .      ** object
22fc0 20 74 6f 20 64 6f 20 73 6f 2e 20 20 2a 2f 0a 20   to do so.  */. 
22fd0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
22fe0 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
22ff0 28 69 6e 74 29 61 52 6f 6f 74 5b 30 5d 3b 0a 20  (int)aRoot[0];. 
23000 20 20 20 20 20 4e 6f 64 65 57 72 69 74 65 72 20       NodeWriter 
23010 2a 70 4e 6f 64 65 3b 0a 0a 20 20 20 20 20 20 70  *pNode;..      p
23020 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74  Writer->nLeafEst
23030 20 3d 20 28 69 6e 74 29 28 28 69 45 6e 64 20 2d   = (int)((iEnd -
23040 20 69 53 74 61 72 74 29 20 2b 20 31 29 2f 46 54   iStart) + 1)/FT
23050 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c 45  S_MAX_APPENDABLE
23060 5f 48 45 49 47 48 54 3b 0a 20 20 20 20 20 20 70  _HEIGHT;.      p
23070 57 72 69 74 65 72 2d 3e 69 53 74 61 72 74 20 3d  Writer->iStart =
23080 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70   iStart;.      p
23090 57 72 69 74 65 72 2d 3e 69 45 6e 64 20 3d 20 69  Writer->iEnd = i
230a0 45 6e 64 3b 0a 20 20 20 20 20 20 70 57 72 69 74  End;.      pWrit
230b0 65 72 2d 3e 69 41 62 73 4c 65 76 65 6c 20 3d 20  er->iAbsLevel = 
230c0 69 41 62 73 4c 65 76 65 6c 3b 0a 20 20 20 20 20  iAbsLevel;.     
230d0 20 70 57 72 69 74 65 72 2d 3e 69 49 64 78 20 3d   pWriter->iIdx =
230e0 20 69 49 64 78 3b 0a 0a 20 20 20 20 20 20 66 6f   iIdx;..      fo
230f0 72 28 69 3d 6e 48 65 69 67 68 74 2b 31 3b 20 69  r(i=nHeight+1; i
23100 3c 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41  <FTS_MAX_APPENDA
23110 42 4c 45 5f 48 45 49 47 48 54 3b 20 69 2b 2b 29  BLE_HEIGHT; i++)
23120 7b 0a 20 20 20 20 20 20 20 20 70 57 72 69 74 65  {.        pWrite
23130 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 69  r->aNodeWriter[i
23140 5d 2e 69 42 6c 6f 63 6b 20 3d 20 70 57 72 69 74  ].iBlock = pWrit
23150 65 72 2d 3e 69 53 74 61 72 74 20 2b 20 69 2a 70  er->iStart + i*p
23160 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74  Writer->nLeafEst
23170 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
23180 20 70 4e 6f 64 65 20 3d 20 26 70 57 72 69 74 65   pNode = &pWrite
23190 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 6e  r->aNodeWriter[n
231a0 48 65 69 67 68 74 5d 3b 0a 20 20 20 20 20 20 70  Height];.      p
231b0 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b 20 3d 20 70  Node->iBlock = p
231c0 57 72 69 74 65 72 2d 3e 69 53 74 61 72 74 20 2b  Writer->iStart +
231d0 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 45   pWriter->nLeafE
231e0 73 74 2a 6e 48 65 69 67 68 74 3b 0a 20 20 20 20  st*nHeight;.    
231f0 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 72    blobGrowBuffer
23200 28 26 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2c 20  (&pNode->block, 
23210 4d 41 58 28 6e 52 6f 6f 74 2c 20 70 2d 3e 6e 4e  MAX(nRoot, p->nN
23220 6f 64 65 53 69 7a 65 29 2c 20 26 72 63 29 3b 0a  odeSize), &rc);.
23230 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
23240 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23250 20 20 20 6d 65 6d 63 70 79 28 70 4e 6f 64 65 2d     memcpy(pNode-
23260 3e 62 6c 6f 63 6b 2e 61 2c 20 61 52 6f 6f 74 2c  >block.a, aRoot,
23270 20 6e 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20   nRoot);.       
23280 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 20   pNode->block.n 
23290 3d 20 6e 52 6f 6f 74 3b 0a 20 20 20 20 20 20 7d  = nRoot;.      }
232a0 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 6e 48  ..      for(i=nH
232b0 65 69 67 68 74 3b 20 69 3e 3d 30 20 26 26 20 72  eight; i>=0 && r
232c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2d  c==SQLITE_OK; i-
232d0 2d 29 7b 0a 20 20 20 20 20 20 20 20 4e 6f 64 65  -){.        Node
232e0 52 65 61 64 65 72 20 72 65 61 64 65 72 3b 0a 20  Reader reader;. 
232f0 20 20 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 26         pNode = &
23300 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72  pWriter->aNodeWr
23310 69 74 65 72 5b 69 5d 3b 0a 0a 20 20 20 20 20 20  iter[i];..      
23320 20 20 72 63 20 3d 20 6e 6f 64 65 52 65 61 64 65    rc = nodeReade
23330 72 49 6e 69 74 28 26 72 65 61 64 65 72 2c 20 70  rInit(&reader, p
23340 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 2c 20 70  Node->block.a, p
23350 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 29 3b 0a  Node->block.n);.
23360 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 72          while( r
23370 65 61 64 65 72 2e 61 4e 6f 64 65 20 26 26 20 72  eader.aNode && r
23380 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
23390 63 20 3d 20 6e 6f 64 65 52 65 61 64 65 72 4e 65  c = nodeReaderNe
233a0 78 74 28 26 72 65 61 64 65 72 29 3b 0a 20 20 20  xt(&reader);.   
233b0 20 20 20 20 20 62 6c 6f 62 47 72 6f 77 42 75 66       blobGrowBuf
233c0 66 65 72 28 26 70 4e 6f 64 65 2d 3e 6b 65 79 2c  fer(&pNode->key,
233d0 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 6e 2c 20   reader.term.n, 
233e0 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  &rc);.        if
233f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23400 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
23410 63 70 79 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e 61  cpy(pNode->key.a
23420 2c 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 61 2c  , reader.term.a,
23430 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 6e 29 3b   reader.term.n);
23440 0a 20 20 20 20 20 20 20 20 20 20 70 4e 6f 64 65  .          pNode
23450 2d 3e 6b 65 79 2e 6e 20 3d 20 72 65 61 64 65 72  ->key.n = reader
23460 2e 74 65 72 6d 2e 6e 3b 0a 20 20 20 20 20 20 20  .term.n;.       
23470 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20     if( i>0 ){.  
23480 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
23490 61 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20  aBlock = 0;.    
234a0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f          int nBlo
234b0 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ck = 0;.        
234c0 20 20 20 20 70 4e 6f 64 65 20 3d 20 26 70 57 72      pNode = &pWr
234d0 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65  iter->aNodeWrite
234e0 72 5b 69 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20  r[i-1];.        
234f0 20 20 20 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63      pNode->iBloc
23500 6b 20 3d 20 72 65 61 64 65 72 2e 69 43 68 69 6c  k = reader.iChil
23510 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  d;.            r
23520 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 52  c = sqlite3Fts3R
23530 65 61 64 42 6c 6f 63 6b 28 70 2c 20 72 65 61 64  eadBlock(p, read
23540 65 72 2e 69 43 68 69 6c 64 2c 20 26 61 42 6c 6f  er.iChild, &aBlo
23550 63 6b 2c 20 26 6e 42 6c 6f 63 6b 2c 20 30 29 3b  ck, &nBlock, 0);
23560 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f  .            blo
23570 62 47 72 6f 77 42 75 66 66 65 72 28 26 70 4e 6f  bGrowBuffer(&pNo
23580 64 65 2d 3e 62 6c 6f 63 6b 2c 20 4d 41 58 28 6e  de->block, MAX(n
23590 42 6c 6f 63 6b 2c 20 70 2d 3e 6e 4e 6f 64 65 53  Block, p->nNodeS
235a0 69 7a 65 29 2c 20 26 72 63 29 3b 0a 20 20 20 20  ize), &rc);.    
235b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
235c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
235d0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
235e0 79 28 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61  y(pNode->block.a
235f0 2c 20 61 42 6c 6f 63 6b 2c 20 6e 42 6c 6f 63 6b  , aBlock, nBlock
23600 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
23610 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 20   pNode->block.n 
23620 3d 20 6e 42 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  = nBlock;.      
23630 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23640 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
23650 28 61 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  (aBlock);.      
23660 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
23670 20 20 20 20 20 20 20 20 6e 6f 64 65 52 65 61 64          nodeRead
23680 65 72 52 65 6c 65 61 73 65 28 26 72 65 61 64 65  erRelease(&reade
23690 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
236a0 7d 0a 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  }..    rc2 = sql
236b0 69 74 65 33 5f 72 65 73 65 74 28 70 53 65 6c 65  ite3_reset(pSele
236c0 63 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ct);.    if( rc=
236d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
236e0 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 72 65  = rc2;.  }..  re
236f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23700 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
23710 6c 61 72 67 65 73 74 20 73 65 67 6d 65 6e 74 20  largest segment 
23720 69 6e 64 65 78 20 76 61 6c 75 65 20 74 68 61 74  index value that
23730 20 65 78 69 73 74 73 20 77 69 74 68 69 6e 20 61   exists within a
23740 62 73 6f 6c 75 74 65 0a 2a 2a 20 6c 65 76 65 6c  bsolute.** level
23750 20 69 41 62 73 4c 65 76 65 6c 2b 31 2e 20 49 66   iAbsLevel+1. If
23760 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
23770 2c 20 73 65 74 20 2a 70 69 49 64 78 20 74 6f 20  , set *piIdx to 
23780 74 68 69 73 20 76 61 6c 75 65 20 70 6c 75 73 0a  this value plus.
23790 2a 2a 20 6f 6e 65 20 62 65 66 6f 72 65 20 72 65  ** one before re
237a0 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f  turning SQLITE_O
237b0 4b 2e 20 4f 72 2c 20 69 66 20 74 68 65 72 65 20  K. Or, if there 
237c0 61 72 65 20 6e 6f 20 73 65 67 6d 65 6e 74 73 20  are no segments 
237d0 61 74 20 61 6c 6c 20 0a 2a 2a 20 77 69 74 68 69  at all .** withi
237e0 6e 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65  n level iAbsLeve
237f0 6c 2c 20 73 65 74 20 2a 70 69 49 64 78 20 74 6f  l, set *piIdx to
23800 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   zero..**.** If 
23810 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
23820 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
23830 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68  e error code. Th
23840 65 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  e final value of
23850 0a 2a 2a 20 2a 70 69 49 64 78 20 69 73 20 75 6e  .** *piIdx is un
23860 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
23870 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  case..*/.static 
23880 69 6e 74 20 66 74 73 33 49 6e 63 72 6d 65 72 67  int fts3Incrmerg
23890 65 4f 75 74 70 75 74 49 64 78 28 20 0a 20 20 46  eOutputIdx( .  F
238a0 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
238b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
238c0 2a 20 46 54 53 20 54 61 62 6c 65 20 68 61 6e 64  * FTS Table hand
238d0 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
238e0 69 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c 2c  int64 iAbsLevel,
238f0 20 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c          /* Absol
23900 75 74 65 20 69 6e 64 65 78 20 6f 66 20 69 6e 70  ute index of inp
23910 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  ut segments */. 
23920 20 69 6e 74 20 2a 70 69 49 64 78 20 20 20 20 20   int *piIdx     
23930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23940 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 66 72   /* OUT: Next fr
23950 65 65 20 69 6e 64 65 78 20 61 74 20 69 41 62 73  ee index at iAbs
23960 4c 65 76 65 6c 2b 31 20 2a 2f 0a 29 7b 0a 20 20  Level+1 */.){.  
23970 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
23980 33 5f 73 74 6d 74 20 2a 70 4f 75 74 70 75 74 49  3_stmt *pOutputI
23990 64 78 20 3d 20 30 3b 20 20 20 2f 2a 20 53 51 4c  dx = 0;   /* SQL
239a0 20 75 73 65 64 20 74 6f 20 66 69 6e 64 20 6f 75   used to find ou
239b0 74 70 75 74 20 69 6e 64 65 78 20 2a 2f 0a 0a 20  tput index */.. 
239c0 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
239d0 74 28 70 2c 20 53 51 4c 5f 4e 45 58 54 5f 53 45  t(p, SQL_NEXT_SE
239e0 47 4d 45 4e 54 5f 49 4e 44 45 58 2c 20 26 70 4f  GMENT_INDEX, &pO
239f0 75 74 70 75 74 49 64 78 2c 20 30 29 3b 0a 20 20  utputIdx, 0);.  
23a00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23a10 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
23a20 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 4f 75 74  _bind_int64(pOut
23a30 70 75 74 49 64 78 2c 20 31 2c 20 69 41 62 73 4c  putIdx, 1, iAbsL
23a40 65 76 65 6c 2b 31 29 3b 0a 20 20 20 20 73 71 6c  evel+1);.    sql
23a50 69 74 65 33 5f 73 74 65 70 28 70 4f 75 74 70 75  ite3_step(pOutpu
23a60 74 49 64 78 29 3b 0a 20 20 20 20 2a 70 69 49 64  tIdx);.    *piId
23a70 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  x = sqlite3_colu
23a80 6d 6e 5f 69 6e 74 28 70 4f 75 74 70 75 74 49 64  mn_int(pOutputId
23a90 78 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20  x, 0);.    rc = 
23aa0 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 4f  sqlite3_reset(pO
23ab0 75 74 70 75 74 49 64 78 29 3b 0a 20 20 7d 0a 0a  utputIdx);.  }..
23ac0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23ad0 2f 2a 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  /* .** Allocate 
23ae0 61 6e 20 61 70 70 65 6e 64 61 62 6c 65 20 6f 75  an appendable ou
23af0 74 70 75 74 20 73 65 67 6d 65 6e 74 20 6f 6e 20  tput segment on 
23b00 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 69  absolute level i
23b10 41 62 73 4c 65 76 65 6c 2b 31 0a 2a 2a 20 77 69  AbsLevel+1.** wi
23b20 74 68 20 69 64 78 20 76 61 6c 75 65 20 69 49 64  th idx value iId
23b30 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  x..**.** In the 
23b40 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 2c 20  %_segdir table, 
23b50 61 20 73 65 67 6d 65 6e 74 20 69 73 20 64 65 66  a segment is def
23b60 69 6e 65 64 20 62 79 20 74 68 65 20 76 61 6c 75  ined by the valu
23b70 65 73 20 69 6e 20 74 68 72 65 65 0a 2a 2a 20 63  es in three.** c
23b80 6f 6c 75 6d 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  olumns:.**.**   
23b90 20 20 73 74 61 72 74 5f 62 6c 6f 63 6b 0a 2a 2a    start_block.**
23ba0 20 20 20 20 20 6c 65 61 76 65 73 5f 65 6e 64 5f       leaves_end_
23bb0 62 6c 6f 63 6b 0a 2a 2a 20 20 20 20 20 65 6e 64  block.**     end
23bc0 5f 62 6c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 57 68 65  _block.**.** Whe
23bd0 6e 20 61 6e 20 61 70 70 65 6e 64 61 62 6c 65 20  n an appendable 
23be0 73 65 67 6d 65 6e 74 20 69 73 20 61 6c 6c 6f 63  segment is alloc
23bf0 61 74 65 64 2c 20 69 74 20 69 73 20 65 73 74 69  ated, it is esti
23c00 6d 61 74 65 64 20 74 68 61 74 20 74 68 65 0a 2a  mated that the.*
23c10 2a 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * maximum number
23c20 20 6f 66 20 6c 65 61 66 20 62 6c 6f 63 6b 73 20   of leaf blocks 
23c30 74 68 61 74 20 6d 61 79 20 62 65 20 72 65 71 75  that may be requ
23c40 69 72 65 64 20 69 73 20 74 68 65 20 73 75 6d 20  ired is the sum 
23c50 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  of the.** number
23c60 20 6f 66 20 6c 65 61 66 20 62 6c 6f 63 6b 73 20   of leaf blocks 
23c70 63 6f 6e 73 75 6d 65 64 20 62 79 20 74 68 65 20  consumed by the 
23c80 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 2c 20  input segments, 
23c90 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72 0a  plus the number.
23ca0 2a 2a 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d  ** of input segm
23cb0 65 6e 74 73 2c 20 6d 75 6c 74 69 70 6c 69 65 64  ents, multiplied
23cc0 20 62 79 20 74 77 6f 2e 20 54 68 69 73 20 76 61   by two. This va
23cd0 6c 75 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  lue is stored in
23ce0 20 73 74 61 63 6b 20 0a 2a 2a 20 76 61 72 69 61   stack .** varia
23cf0 62 6c 65 20 6e 4c 65 61 66 45 73 74 2e 0a 2a 2a  ble nLeafEst..**
23d00 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 31  .** A total of 1
23d10 36 2a 6e 4c 65 61 66 45 73 74 20 62 6c 6f 63 6b  6*nLeafEst block
23d20 73 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 20  s are allocated 
23d30 77 68 65 6e 20 61 6e 20 61 70 70 65 6e 64 61 62  when an appendab
23d40 6c 65 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 69 73  le segment.** is
23d50 20 63 72 65 61 74 65 64 20 28 28 31 20 2b 20 65   created ((1 + e
23d60 6e 64 5f 62 6c 6f 63 6b 20 2d 20 73 74 61 72 74  nd_block - start
23d70 5f 62 6c 6f 63 6b 29 3d 3d 31 36 2a 6e 4c 65 61  _block)==16*nLea
23d80 66 45 73 74 29 2e 20 54 68 65 20 63 6f 6e 74 69  fEst). The conti
23d90 67 75 6f 75 73 0a 2a 2a 20 61 72 72 61 79 20 6f  guous.** array o
23da0 66 20 6c 65 61 66 20 6e 6f 64 65 73 20 73 74 61  f leaf nodes sta
23db0 72 74 73 20 61 74 20 74 68 65 20 66 69 72 73 74  rts at the first
23dc0 20 62 6c 6f 63 6b 20 61 6c 6c 6f 63 61 74 65 64   block allocated
23dd0 2e 20 54 68 65 20 61 72 72 61 79 0a 2a 2a 20 6f  . The array.** o
23de0 66 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 73  f interior nodes
23df0 20 74 68 61 74 20 61 72 65 20 70 61 72 65 6e 74   that are parent
23e00 73 20 6f 66 20 74 68 65 20 6c 65 61 66 20 6e 6f  s of the leaf no
23e10 64 65 73 20 73 74 61 72 74 20 61 74 20 62 6c 6f  des start at blo
23e20 63 6b 0a 2a 2a 20 28 73 74 61 72 74 5f 62 6c 6f  ck.** (start_blo
23e30 63 6b 20 2b 20 28 31 20 2b 20 65 6e 64 5f 62 6c  ck + (1 + end_bl
23e40 6f 63 6b 20 2d 20 73 74 61 72 74 5f 62 6c 6f 63  ock - start_bloc
23e50 6b 29 20 2f 20 31 36 29 2e 20 41 6e 64 20 73 6f  k) / 16). And so
23e60 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68   on..**.** In th
23e70 65 20 61 63 74 75 61 6c 20 63 6f 64 65 20 62 65  e actual code be
23e80 6c 6f 77 2c 20 74 68 65 20 76 61 6c 75 65 20 22  low, the value "
23e90 31 36 22 20 69 73 20 72 65 70 6c 61 63 65 64 20  16" is replaced 
23ea0 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 70 72 65  with the .** pre
23eb0 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63 72 6f  -processor macro
23ec0 20 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41   FTS_MAX_APPENDA
23ed0 42 4c 45 5f 48 45 49 47 48 54 2e 0a 2a 2f 0a 73  BLE_HEIGHT..*/.s
23ee0 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e  tatic int fts3In
23ef0 63 72 6d 65 72 67 65 57 72 69 74 65 72 28 20 0a  crmergeWriter( .
23f00 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
23f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f20 20 20 2f 2a 20 46 74 73 33 20 74 61 62 6c 65 20    /* Fts3 table 
23f30 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69  handle */.  sqli
23f40 74 65 33 5f 69 6e 74 36 34 20 69 41 62 73 4c 65  te3_int64 iAbsLe
23f50 76 65 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 41  vel,        /* A
23f60 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 6f 66  bsolute level of
23f70 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
23f80 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20  */.  int iIdx,  
23f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fa0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
23fb0 20 6e 65 77 20 6f 75 74 70 75 74 20 73 65 67 6d   new output segm
23fc0 65 6e 74 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c  ent */.  Fts3Mul
23fd0 74 69 53 65 67 52 65 61 64 65 72 20 2a 70 43 73  tiSegReader *pCs
23fe0 72 2c 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73  r,       /* Curs
23ff0 6f 72 20 74 68 61 74 20 64 61 74 61 20 77 69 6c  or that data wil
24000 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 2a  l be read from *
24010 2f 0a 20 20 49 6e 63 72 6d 65 72 67 65 57 72 69  /.  IncrmergeWri
24020 74 65 72 20 2a 70 57 72 69 74 65 72 20 20 20 20  ter *pWriter    
24030 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
24040 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  this object */.)
24050 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
24060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24070 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
24080 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  de */.  int i;  
24090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240a0 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
240b0 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
240c0 20 20 69 6e 74 20 6e 4c 65 61 66 45 73 74 20 3d    int nLeafEst =
240d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
240e0 20 20 2f 2a 20 42 6c 6f 63 6b 73 20 61 6c 6c 6f    /* Blocks allo
240f0 63 61 74 65 64 20 66 6f 72 20 6c 65 61 66 20 6e  cated for leaf n
24100 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  odes */.  sqlite
24110 33 5f 73 74 6d 74 20 2a 70 4c 65 61 66 45 73 74  3_stmt *pLeafEst
24120 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 53 51 4c   = 0;     /* SQL
24130 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
24140 6e 65 20 6e 4c 65 61 66 45 73 74 20 2a 2f 0a 20  ne nLeafEst */. 
24150 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
24160 46 69 72 73 74 42 6c 6f 63 6b 20 3d 20 30 3b 20  FirstBlock = 0; 
24170 20 2f 2a 20 53 51 4c 20 75 73 65 64 20 74 6f 20   /* SQL used to 
24180 64 65 74 65 72 6d 69 6e 65 20 66 69 72 73 74 20  determine first 
24190 62 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 43  block */..  /* C
241a0 61 6c 63 75 6c 61 74 65 20 6e 4c 65 61 66 45 73  alculate nLeafEs
241b0 74 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73  t. */.  rc = fts
241c0 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
241d0 4d 41 58 5f 4c 45 41 46 5f 4e 4f 44 45 5f 45 53  MAX_LEAF_NODE_ES
241e0 54 49 4d 41 54 45 2c 20 26 70 4c 65 61 66 45 73  TIMATE, &pLeafEs
241f0 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  t, 0);.  if( rc=
24200 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24210 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
24220 6e 74 36 34 28 70 4c 65 61 66 45 73 74 2c 20 31  nt64(pLeafEst, 1
24230 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20  , iAbsLevel);.  
24240 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
24250 6e 74 36 34 28 70 4c 65 61 66 45 73 74 2c 20 32  nt64(pLeafEst, 2
24260 2c 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74  , pCsr->nSegment
24270 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
24280 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
24290 74 65 70 28 70 4c 65 61 66 45 73 74 29 20 29 7b  tep(pLeafEst) ){
242a0 0a 20 20 20 20 20 20 6e 4c 65 61 66 45 73 74 20  .      nLeafEst 
242b0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
242c0 5f 69 6e 74 28 70 4c 65 61 66 45 73 74 2c 20 30  _int(pLeafEst, 0
242d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
242e0 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
242f0 70 4c 65 61 66 45 73 74 29 3b 0a 20 20 7d 0a 20  pLeafEst);.  }. 
24300 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
24310 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
24320 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20  .  /* Calculate 
24330 74 68 65 20 66 69 72 73 74 20 62 6c 6f 63 6b 20  the first block 
24340 74 6f 20 75 73 65 20 69 6e 20 74 68 65 20 6f 75  to use in the ou
24350 74 70 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  tput segment */.
24360 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
24370 6d 74 28 70 2c 20 53 51 4c 5f 4e 45 58 54 5f 53  mt(p, SQL_NEXT_S
24380 45 47 4d 45 4e 54 53 5f 49 44 2c 20 26 70 46 69  EGMENTS_ID, &pFi
24390 72 73 74 42 6c 6f 63 6b 2c 20 30 29 3b 0a 20 20  rstBlock, 0);.  
243a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
243b0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c  K ){.    if( SQL
243c0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
243d0 5f 73 74 65 70 28 70 46 69 72 73 74 42 6c 6f 63  _step(pFirstBloc
243e0 6b 29 20 29 7b 0a 20 20 20 20 20 20 70 57 72 69  k) ){.      pWri
243f0 74 65 72 2d 3e 69 53 74 61 72 74 20 3d 20 73 71  ter->iStart = sq
24400 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
24410 36 34 28 70 46 69 72 73 74 42 6c 6f 63 6b 2c 20  64(pFirstBlock, 
24420 30 29 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65  0);.      pWrite
24430 72 2d 3e 69 45 6e 64 20 3d 20 70 57 72 69 74 65  r->iEnd = pWrite
24440 72 2d 3e 69 53 74 61 72 74 20 2d 20 31 3b 0a 20  r->iStart - 1;. 
24450 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 45       pWriter->iE
24460 6e 64 20 2b 3d 20 6e 4c 65 61 66 45 73 74 20 2a  nd += nLeafEst *
24470 20 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41   FTS_MAX_APPENDA
24480 42 4c 45 5f 48 45 49 47 48 54 3b 0a 20 20 20 20  BLE_HEIGHT;.    
24490 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
244a0 65 33 5f 72 65 73 65 74 28 70 46 69 72 73 74 42  e3_reset(pFirstB
244b0 6c 6f 63 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28  lock);.  }.  if(
244c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
244d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
244e0 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6d 61 72  * Insert the mar
244f0 6b 65 72 20 69 6e 20 74 68 65 20 25 5f 73 65 67  ker in the %_seg
24500 6d 65 6e 74 73 20 74 61 62 6c 65 20 74 6f 20 6d  ments table to m
24510 61 6b 65 20 73 75 72 65 20 6e 6f 62 6f 64 79 20  ake sure nobody 
24520 74 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 73 74  tries.  ** to st
24530 65 61 6c 20 74 68 65 20 73 70 61 63 65 20 6a 75  eal the space ju
24540 73 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20 54 68  st allocated. Th
24550 69 73 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20  is is also used 
24560 74 6f 20 69 64 65 6e 74 69 66 79 20 0a 20 20 2a  to identify .  *
24570 2a 20 61 70 70 65 6e 64 61 62 6c 65 20 73 65 67  * appendable seg
24580 6d 65 6e 74 73 2e 20 20 2a 2f 0a 20 20 72 63 20  ments.  */.  rc 
24590 3d 20 66 74 73 33 57 72 69 74 65 53 65 67 6d 65  = fts3WriteSegme
245a0 6e 74 28 70 2c 20 70 57 72 69 74 65 72 2d 3e 69  nt(p, pWriter->i
245b0 45 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  End, 0, 0);.  if
245c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
245d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
245e0 70 57 72 69 74 65 72 2d 3e 69 41 62 73 4c 65 76  pWriter->iAbsLev
245f0 65 6c 20 3d 20 69 41 62 73 4c 65 76 65 6c 3b 0a  el = iAbsLevel;.
24600 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66    pWriter->nLeaf
24610 45 73 74 20 3d 20 6e 4c 65 61 66 45 73 74 3b 0a  Est = nLeafEst;.
24620 20 20 70 57 72 69 74 65 72 2d 3e 69 49 64 78 20    pWriter->iIdx 
24630 3d 20 69 49 64 78 3b 0a 0a 20 20 2f 2a 20 53 65  = iIdx;..  /* Se
24640 74 20 75 70 20 74 68 65 20 61 72 72 61 79 20 6f  t up the array o
24650 66 20 4e 6f 64 65 57 72 69 74 65 72 20 6f 62 6a  f NodeWriter obj
24660 65 63 74 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ects */.  for(i=
24670 30 3b 20 69 3c 46 54 53 5f 4d 41 58 5f 41 50 50  0; i<FTS_MAX_APP
24680 45 4e 44 41 42 4c 45 5f 48 45 49 47 48 54 3b 20  ENDABLE_HEIGHT; 
24690 69 2b 2b 29 7b 0a 20 20 20 20 70 57 72 69 74 65  i++){.    pWrite
246a0 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 69  r->aNodeWriter[i
246b0 5d 2e 69 42 6c 6f 63 6b 20 3d 20 70 57 72 69 74  ].iBlock = pWrit
246c0 65 72 2d 3e 69 53 74 61 72 74 20 2b 20 69 2a 70  er->iStart + i*p
246d0 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74  Writer->nLeafEst
246e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
246f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
24700 2a 2a 20 52 65 6d 6f 76 65 20 61 6e 20 65 6e 74  ** Remove an ent
24710 72 79 20 66 72 6f 6d 20 74 68 65 20 25 5f 73 65  ry from the %_se
24720 67 64 69 72 20 74 61 62 6c 65 2e 20 54 68 69 73  gdir table. This
24730 20 69 6e 76 6f 6c 76 65 73 20 72 75 6e 6e 69 6e   involves runnin
24740 67 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  g the .** follow
24750 69 6e 67 20 74 77 6f 20 73 74 61 74 65 6d 65 6e  ing two statemen
24760 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 44 45 4c 45  ts:.**.**   DELE
24770 54 45 20 46 52 4f 4d 20 25 5f 73 65 67 64 69 72  TE FROM %_segdir
24780 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3a   WHERE level = :
24790 69 41 62 73 4c 65 76 65 6c 20 41 4e 44 20 69 64  iAbsLevel AND id
247a0 78 20 3d 20 3a 69 49 64 78 0a 2a 2a 20 20 20 55  x = :iIdx.**   U
247b0 50 44 41 54 45 20 25 5f 73 65 67 64 69 72 20 53  PDATE %_segdir S
247c0 45 54 20 69 64 78 20 3d 20 69 64 78 20 2d 20 31  ET idx = idx - 1
247d0 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3a   WHERE level = :
247e0 69 41 62 73 4c 65 76 65 6c 20 41 4e 44 20 69 64  iAbsLevel AND id
247f0 78 20 3e 20 3a 69 49 64 78 0a 2a 2a 0a 2a 2a 20  x > :iIdx.**.** 
24800 54 68 65 20 44 45 4c 45 54 45 20 73 74 61 74 65  The DELETE state
24810 6d 65 6e 74 20 72 65 6d 6f 76 65 73 20 74 68 65  ment removes the
24820 20 73 70 65 63 69 66 69 63 20 25 5f 73 65 67 64   specific %_segd
24830 69 72 20 6c 65 76 65 6c 2e 20 54 68 65 20 55 50  ir level. The UP
24840 44 41 54 45 20 0a 2a 2a 20 73 74 61 74 65 6d 65  DATE .** stateme
24850 6e 74 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  nt ensures that 
24860 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 73 65  the remaining se
24870 67 6d 65 6e 74 73 20 68 61 76 65 20 63 6f 6e 74  gments have cont
24880 69 67 75 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  iguously allocat
24890 65 64 0a 2a 2a 20 69 64 78 20 76 61 6c 75 65 73  ed.** idx values
248a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
248b0 66 74 73 33 52 65 6d 6f 76 65 53 65 67 64 69 72  fts3RemoveSegdir
248c0 45 6e 74 72 79 28 0a 20 20 46 74 73 33 54 61 62  Entry(.  Fts3Tab
248d0 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
248e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33           /* FTS3
248f0 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   table handle */
24900 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
24910 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 20   iAbsLevel,     
24920 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c     /* Absolute l
24930 65 76 65 6c 20 74 6f 20 64 65 6c 65 74 65 20 66  evel to delete f
24940 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  rom */.  int iId
24950 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x               
24960 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
24970 78 20 6f 66 20 25 5f 73 65 67 64 69 72 20 65 6e  x of %_segdir en
24980 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f  try to delete */
24990 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
249a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249b0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
249c0 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  code */.  sqlite
249d0 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74 65 20  3_stmt *pDelete 
249e0 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 44 45 4c  = 0;      /* DEL
249f0 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ETE statement */
24a00 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  ..  rc = fts3Sql
24a10 53 74 6d 74 28 70 2c 20 53 51 4c 5f 44 45 4c 45  Stmt(p, SQL_DELE
24a20 54 45 5f 53 45 47 44 49 52 5f 45 4e 54 52 59 2c  TE_SEGDIR_ENTRY,
24a30 20 26 70 44 65 6c 65 74 65 2c 20 30 29 3b 0a 20   &pDelete, 0);. 
24a40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24a50 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
24a60 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 44 65  3_bind_int64(pDe
24a70 6c 65 74 65 2c 20 31 2c 20 69 41 62 73 4c 65 76  lete, 1, iAbsLev
24a80 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  el);.    sqlite3
24a90 5f 62 69 6e 64 5f 69 6e 74 28 70 44 65 6c 65 74  _bind_int(pDelet
24aa0 65 2c 20 32 2c 20 69 49 64 78 29 3b 0a 20 20 20  e, 2, iIdx);.   
24ab0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 44   sqlite3_step(pD
24ac0 65 6c 65 74 65 29 3b 0a 20 20 20 20 72 63 20 3d  elete);.    rc =
24ad0 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
24ae0 44 65 6c 65 74 65 29 3b 0a 20 20 7d 0a 0a 20 20  Delete);.  }..  
24af0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24b00 0a 2a 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20  .** One or more 
24b10 73 65 67 6d 65 6e 74 73 20 68 61 76 65 20 6a 75  segments have ju
24b20 73 74 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20  st been removed 
24b30 66 72 6f 6d 20 61 62 73 6f 6c 75 74 65 20 6c 65  from absolute le
24b40 76 65 6c 20 69 41 62 73 4c 65 76 65 6c 2e 0a 2a  vel iAbsLevel..*
24b50 2a 20 55 70 64 61 74 65 20 74 68 65 20 27 69 64  * Update the 'id
24b60 78 27 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65  x' values of the
24b70 20 72 65 6d 61 69 6e 69 6e 67 20 73 65 67 6d 65   remaining segme
24b80 6e 74 73 20 69 6e 20 74 68 65 20 6c 65 76 65 6c  nts in the level
24b90 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 20   so that.** the 
24ba0 69 64 78 20 76 61 6c 75 65 73 20 61 72 65 20 61  idx values are a
24bb0 20 63 6f 6e 74 69 67 75 6f 75 73 20 73 65 71 75   contiguous sequ
24bc0 65 6e 63 65 20 73 74 61 72 74 69 6e 67 20 66 72  ence starting fr
24bd0 6f 6d 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  om 0..*/.static 
24be0 69 6e 74 20 66 74 73 33 52 65 70 61 63 6b 53 65  int fts3RepackSe
24bf0 67 64 69 72 4c 65 76 65 6c 28 0a 20 20 46 74 73  gdirLevel(.  Fts
24c00 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
24c10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24c20 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c  FTS3 table handl
24c30 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
24c40 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c 20 20  nt64 iAbsLevel  
24c50 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75         /* Absolu
24c60 74 65 20 6c 65 76 65 6c 20 74 6f 20 72 65 70 61  te level to repa
24c70 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ck */.){.  int r
24c80 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
24c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
24ca0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
24cb0 6e 74 20 2a 61 49 64 78 20 3d 20 30 3b 20 20 20  nt *aIdx = 0;   
24cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24cd0 2a 20 41 72 72 61 79 20 6f 66 20 72 65 6d 61 69  * Array of remai
24ce0 6e 69 6e 67 20 69 64 78 20 76 61 6c 75 65 73 20  ning idx values 
24cf0 2a 2f 0a 20 20 69 6e 74 20 6e 49 64 78 20 3d 20  */.  int nIdx = 
24d00 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
24d10 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 65 6e       /* Valid en
24d20 74 72 69 65 73 20 69 6e 20 61 49 64 78 5b 5d 20  tries in aIdx[] 
24d30 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20  */.  int nAlloc 
24d40 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
24d50 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
24d60 64 20 73 69 7a 65 20 6f 66 20 61 49 64 78 5b 5d  d size of aIdx[]
24d70 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
24d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d90 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
24da0 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
24db0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
24dc0 65 6c 65 63 74 20 3d 20 30 3b 20 20 20 20 20 20  elect = 0;      
24dd0 2f 2a 20 53 65 6c 65 63 74 20 73 74 61 74 65 6d  /* Select statem
24de0 65 6e 74 20 74 6f 20 72 65 61 64 20 69 64 78 20  ent to read idx 
24df0 76 61 6c 75 65 73 20 2a 2f 0a 20 20 73 71 6c 69  values */.  sqli
24e00 74 65 33 5f 73 74 6d 74 20 2a 70 55 70 64 61 74  te3_stmt *pUpdat
24e10 65 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 55  e = 0;      /* U
24e20 70 64 61 74 65 20 73 74 61 74 65 6d 65 6e 74 20  pdate statement 
24e30 74 6f 20 6d 6f 64 69 66 79 20 69 64 78 20 76 61  to modify idx va
24e40 6c 75 65 73 20 2a 2f 0a 0a 20 20 72 63 20 3d 20  lues */..  rc = 
24e50 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
24e60 51 4c 5f 53 45 4c 45 43 54 5f 49 4e 44 45 58 45  QL_SELECT_INDEXE
24e70 53 2c 20 26 70 53 65 6c 65 63 74 2c 20 30 29 3b  S, &pSelect, 0);
24e80 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
24e90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
24ea0 72 63 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rc2;.    sqlite3
24eb0 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 65 6c  _bind_int64(pSel
24ec0 65 63 74 2c 20 31 2c 20 69 41 62 73 4c 65 76 65  ect, 1, iAbsLeve
24ed0 6c 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 53  l);.    while( S
24ee0 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
24ef0 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29  e3_step(pSelect)
24f00 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 49   ){.      if( nI
24f10 64 78 3e 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  dx>=nAlloc ){.  
24f20 20 20 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 3b        int *aNew;
24f30 0a 20 20 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20  .        nAlloc 
24f40 2b 3d 20 31 36 3b 0a 20 20 20 20 20 20 20 20 61  += 16;.        a
24f50 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  New = sqlite3_re
24f60 61 6c 6c 6f 63 28 61 49 64 78 2c 20 6e 41 6c 6c  alloc(aIdx, nAll
24f70 6f 63 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b  oc*sizeof(int));
24f80 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61 4e  .        if( !aN
24f90 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ew ){.          
24fa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
24fb0 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  M;.          bre
24fc0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
24fd0 20 20 20 20 20 20 61 49 64 78 20 3d 20 61 4e 65        aIdx = aNe
24fe0 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  w;.      }.     
24ff0 20 61 49 64 78 5b 6e 49 64 78 2b 2b 5d 20 3d 20   aIdx[nIdx++] = 
25000 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
25010 6e 74 28 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  nt(pSelect, 0);.
25020 20 20 20 20 7d 0a 20 20 20 20 72 63 32 20 3d 20      }.    rc2 = 
25030 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
25040 65 6c 65 63 74 29 3b 0a 20 20 20 20 69 66 28 20  elect);.    if( 
25050 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
25060 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20  rc = rc2;.  }.. 
25070 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25080 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  OK ){.    rc = f
25090 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51  ts3SqlStmt(p, SQ
250a0 4c 5f 53 48 49 46 54 5f 53 45 47 44 49 52 5f 45  L_SHIFT_SEGDIR_E
250b0 4e 54 52 59 2c 20 26 70 55 70 64 61 74 65 2c 20  NTRY, &pUpdate, 
250c0 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
250d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
250e0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
250f0 69 6e 74 36 34 28 70 55 70 64 61 74 65 2c 20 32  int64(pUpdate, 2
25100 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20  , iAbsLevel);.  
25110 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  }..  assert( p->
25120 62 49 67 6e 6f 72 65 53 61 76 65 70 6f 69 6e 74  bIgnoreSavepoint
25130 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 62 49 67 6e  ==0 );.  p->bIgn
25140 6f 72 65 53 61 76 65 70 6f 69 6e 74 20 3d 20 31  oreSavepoint = 1
25150 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d  ;.  for(i=0; rc=
25160 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
25170 6e 49 64 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nIdx; i++){.    
25180 69 66 28 20 61 49 64 78 5b 69 5d 21 3d 69 20 29  if( aIdx[i]!=i )
25190 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
251a0 62 69 6e 64 5f 69 6e 74 28 70 55 70 64 61 74 65  bind_int(pUpdate
251b0 2c 20 33 2c 20 61 49 64 78 5b 69 5d 29 3b 0a 20  , 3, aIdx[i]);. 
251c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
251d0 64 5f 69 6e 74 28 70 55 70 64 61 74 65 2c 20 31  d_int(pUpdate, 1
251e0 2c 20 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , i);.      sqli
251f0 74 65 33 5f 73 74 65 70 28 70 55 70 64 61 74 65  te3_step(pUpdate
25200 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
25210 6c 69 74 65 33 5f 72 65 73 65 74 28 70 55 70 64  lite3_reset(pUpd
25220 61 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ate);.    }.  }.
25230 20 20 70 2d 3e 62 49 67 6e 6f 72 65 53 61 76 65    p->bIgnoreSave
25240 70 6f 69 6e 74 20 3d 20 30 3b 0a 0a 20 20 73 71  point = 0;..  sq
25250 6c 69 74 65 33 5f 66 72 65 65 28 61 49 64 78 29  lite3_free(aIdx)
25260 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
25270 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
25280 73 33 53 74 61 72 74 4e 6f 64 65 28 42 6c 6f 62  s3StartNode(Blob
25290 20 2a 70 4e 6f 64 65 2c 20 69 6e 74 20 69 48 65   *pNode, int iHe
252a0 69 67 68 74 2c 20 73 71 6c 69 74 65 33 5f 69 6e  ight, sqlite3_in
252b0 74 36 34 20 69 43 68 69 6c 64 29 7b 0a 20 20 70  t64 iChild){.  p
252c0 4e 6f 64 65 2d 3e 61 5b 30 5d 20 3d 20 28 63 68  Node->a[0] = (ch
252d0 61 72 29 69 48 65 69 67 68 74 3b 0a 20 20 69 66  ar)iHeight;.  if
252e0 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20  ( iChild ){.    
252f0 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 6e  assert( pNode->n
25300 41 6c 6c 6f 63 3e 3d 31 2b 73 71 6c 69 74 65 33  Alloc>=1+sqlite3
25310 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 69 43  Fts3VarintLen(iC
25320 68 69 6c 64 29 20 29 3b 0a 20 20 20 20 70 4e 6f  hild) );.    pNo
25330 64 65 2d 3e 6e 20 3d 20 31 20 2b 20 73 71 6c 69  de->n = 1 + sqli
25340 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74  te3Fts3PutVarint
25350 28 26 70 4e 6f 64 65 2d 3e 61 5b 31 5d 2c 20 69  (&pNode->a[1], i
25360 43 68 69 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  Child);.  }else{
25370 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 6f  .    assert( pNo
25380 64 65 2d 3e 6e 41 6c 6c 6f 63 3e 3d 31 20 29 3b  de->nAlloc>=1 );
25390 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 6e 20 3d 20  .    pNode->n = 
253a0 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
253b0 54 68 65 20 66 69 72 73 74 20 74 77 6f 20 61 72  The first two ar
253c0 67 75 6d 65 6e 74 73 20 61 72 65 20 61 20 70 6f  guments are a po
253d0 69 6e 74 65 72 20 74 6f 20 61 6e 64 20 74 68 65  inter to and the
253e0 20 73 69 7a 65 20 6f 66 20 61 20 73 65 67 6d 65   size of a segme
253f0 6e 74 20 62 2d 74 72 65 65 0a 2a 2a 20 6e 6f 64  nt b-tree.** nod
25400 65 2e 20 54 68 65 20 6e 6f 64 65 20 6d 61 79 20  e. The node may 
25410 62 65 20 61 20 6c 65 61 66 20 6f 72 20 61 6e 20  be a leaf or an 
25420 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 0a 2a  internal node..*
25430 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
25440 6f 6e 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  on creates a new
25450 20 6e 6f 64 65 20 69 6d 61 67 65 20 69 6e 20 62   node image in b
25460 6c 6f 62 20 6f 62 6a 65 63 74 20 2a 70 4e 65 77  lob object *pNew
25470 20 62 79 20 63 6f 70 79 69 6e 67 0a 2a 2a 20 61   by copying.** a
25480 6c 6c 20 74 65 72 6d 73 20 74 68 61 74 20 61 72  ll terms that ar
25490 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
254a0 72 20 65 71 75 61 6c 20 74 6f 20 7a 54 65 72 6d  r equal to zTerm
254b0 2f 6e 54 65 72 6d 20 28 66 6f 72 20 6c 65 61 66  /nTerm (for leaf
254c0 20 6e 6f 64 65 73 29 0a 2a 2a 20 6f 72 20 67 72   nodes).** or gr
254d0 65 61 74 65 72 20 74 68 61 6e 20 7a 54 65 72 6d  eater than zTerm
254e0 2f 6e 54 65 72 6d 20 28 66 6f 72 20 69 6e 74 65  /nTerm (for inte
254f0 72 6e 61 6c 20 6e 6f 64 65 73 29 20 66 72 6f 6d  rnal nodes) from
25500 20 61 4e 6f 64 65 2f 6e 4e 6f 64 65 2e 0a 2a 2f   aNode/nNode..*/
25510 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
25520 54 72 75 6e 63 61 74 65 4e 6f 64 65 28 0a 20 20  TruncateNode(.  
25530 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 4e 6f 64  const char *aNod
25540 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
25550 2f 2a 20 43 75 72 72 65 6e 74 20 6e 6f 64 65 20  /* Current node 
25560 69 6d 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  image */.  int n
25570 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  Node,           
25580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
25590 7a 65 20 6f 66 20 61 4e 6f 64 65 20 69 6e 20 62  ze of aNode in b
255a0 79 74 65 73 20 2a 2f 0a 20 20 42 6c 6f 62 20 2a  ytes */.  Blob *
255b0 70 4e 65 77 2c 20 20 20 20 20 20 20 20 20 20 20  pNew,           
255c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
255d0 3a 20 57 72 69 74 65 20 6e 65 77 20 6e 6f 64 65  : Write new node
255e0 20 69 6d 61 67 65 20 68 65 72 65 20 2a 2f 0a 20   image here */. 
255f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
25600 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
25610 20 2f 2a 20 4f 6d 69 74 20 61 6c 6c 20 74 65 72   /* Omit all ter
25620 6d 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ms smaller than 
25630 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  this */.  int nT
25640 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
25650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
25660 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62 79  e of zTerm in by
25670 74 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  tes */.  sqlite3
25680 5f 69 6e 74 36 34 20 2a 70 69 42 6c 6f 63 6b 20  _int64 *piBlock 
25690 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
256a0 20 42 6c 6f 63 6b 20 6e 75 6d 62 65 72 20 69 6e   Block number in
256b0 20 6e 65 78 74 20 6c 61 79 65 72 20 64 6f 77 6e   next layer down
256c0 20 2a 2f 0a 29 7b 0a 20 20 4e 6f 64 65 52 65 61   */.){.  NodeRea
256d0 64 65 72 20 72 65 61 64 65 72 3b 20 20 20 20 20  der reader;     
256e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
256f0 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 42  er object */.  B
25700 6c 6f 62 20 70 72 65 76 20 3d 20 7b 30 2c 20 30  lob prev = {0, 0
25710 2c 20 30 7d 3b 20 20 20 20 20 20 20 20 20 20 2f  , 0};          /
25720 2a 20 50 72 65 76 69 6f 75 73 20 74 65 72 6d 20  * Previous term 
25730 77 72 69 74 74 65 6e 20 74 6f 20 6e 65 77 20 6e  written to new n
25740 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ode */.  int rc 
25750 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
25760 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
25770 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
25780 20 62 4c 65 61 66 20 3d 20 61 4e 6f 64 65 5b 30   bLeaf = aNode[0
25790 5d 3d 3d 27 5c 30 27 3b 20 20 20 20 20 2f 2a 20  ]=='\0';     /* 
257a0 54 72 75 65 20 66 6f 72 20 61 20 6c 65 61 66 20  True for a leaf 
257b0 6e 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  node */..  /* Al
257c0 6c 6f 63 61 74 65 20 72 65 71 75 69 72 65 64 20  locate required 
257d0 6f 75 74 70 75 74 20 73 70 61 63 65 20 2a 2f 0a  output space */.
257e0 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 72    blobGrowBuffer
257f0 28 70 4e 65 77 2c 20 6e 4e 6f 64 65 2c 20 26 72  (pNew, nNode, &r
25800 63 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  c);.  if( rc!=SQ
25810 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
25820 20 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 6e 20 3d   rc;.  pNew->n =
25830 20 30 3b 0a 0a 20 20 2f 2a 20 50 6f 70 75 6c 61   0;..  /* Popula
25840 74 65 20 6e 65 77 20 6e 6f 64 65 20 62 75 66 66  te new node buff
25850 65 72 20 2a 2f 0a 20 20 66 6f 72 28 72 63 20 3d  er */.  for(rc =
25860 20 6e 6f 64 65 52 65 61 64 65 72 49 6e 69 74 28   nodeReaderInit(
25870 26 72 65 61 64 65 72 2c 20 61 4e 6f 64 65 2c 20  &reader, aNode, 
25880 6e 4e 6f 64 65 29 3b 20 0a 20 20 20 20 20 20 72  nNode); .      r
25890 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
258a0 72 65 61 64 65 72 2e 61 4e 6f 64 65 3b 20 0a 20  reader.aNode; . 
258b0 20 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 52 65       rc = nodeRe
258c0 61 64 65 72 4e 65 78 74 28 26 72 65 61 64 65 72  aderNext(&reader
258d0 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ).  ){.    if( p
258e0 4e 65 77 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20  New->n==0 ){.   
258f0 20 20 20 69 6e 74 20 72 65 73 20 3d 20 66 74 73     int res = fts
25900 33 54 65 72 6d 43 6d 70 28 72 65 61 64 65 72 2e  3TermCmp(reader.
25910 74 65 72 6d 2e 61 2c 20 72 65 61 64 65 72 2e 74  term.a, reader.t
25920 65 72 6d 2e 6e 2c 20 7a 54 65 72 6d 2c 20 6e 54  erm.n, zTerm, nT
25930 65 72 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  erm);.      if( 
25940 72 65 73 3c 30 20 7c 7c 20 28 62 4c 65 61 66 3d  res<0 || (bLeaf=
25950 3d 30 20 26 26 20 72 65 73 3d 3d 30 29 20 29 20  =0 && res==0) ) 
25960 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
25970 66 74 73 33 53 74 61 72 74 4e 6f 64 65 28 70 4e  fts3StartNode(pN
25980 65 77 2c 20 28 69 6e 74 29 61 4e 6f 64 65 5b 30  ew, (int)aNode[0
25990 5d 2c 20 72 65 61 64 65 72 2e 69 43 68 69 6c 64  ], reader.iChild
259a0 29 3b 0a 20 20 20 20 20 20 2a 70 69 42 6c 6f 63  );.      *piBloc
259b0 6b 20 3d 20 72 65 61 64 65 72 2e 69 43 68 69 6c  k = reader.iChil
259c0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  d;.    }.    rc 
259d0 3d 20 66 74 73 33 41 70 70 65 6e 64 54 6f 4e 6f  = fts3AppendToNo
259e0 64 65 28 0a 20 20 20 20 20 20 20 20 70 4e 65 77  de(.        pNew
259f0 2c 20 26 70 72 65 76 2c 20 72 65 61 64 65 72 2e  , &prev, reader.
25a00 74 65 72 6d 2e 61 2c 20 72 65 61 64 65 72 2e 74  term.a, reader.t
25a10 65 72 6d 2e 6e 2c 0a 20 20 20 20 20 20 20 20 72  erm.n,.        r
25a20 65 61 64 65 72 2e 61 44 6f 63 6c 69 73 74 2c 20  eader.aDoclist, 
25a30 72 65 61 64 65 72 2e 6e 44 6f 63 6c 69 73 74 0a  reader.nDoclist.
25a40 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72      );.    if( r
25a50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c!=SQLITE_OK ) b
25a60 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
25a70 70 4e 65 77 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20  pNew->n==0 ){.  
25a80 20 20 66 74 73 33 53 74 61 72 74 4e 6f 64 65 28    fts3StartNode(
25a90 70 4e 65 77 2c 20 28 69 6e 74 29 61 4e 6f 64 65  pNew, (int)aNode
25aa0 5b 30 5d 2c 20 72 65 61 64 65 72 2e 69 43 68 69  [0], reader.iChi
25ab0 6c 64 29 3b 0a 20 20 20 20 2a 70 69 42 6c 6f 63  ld);.    *piBloc
25ac0 6b 20 3d 20 72 65 61 64 65 72 2e 69 43 68 69 6c  k = reader.iChil
25ad0 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  d;.  }.  assert(
25ae0 20 70 4e 65 77 2d 3e 6e 3c 3d 70 4e 65 77 2d 3e   pNew->n<=pNew->
25af0 6e 41 6c 6c 6f 63 20 29 3b 0a 0a 20 20 6e 6f 64  nAlloc );..  nod
25b00 65 52 65 61 64 65 72 52 65 6c 65 61 73 65 28 26  eReaderRelease(&
25b10 72 65 61 64 65 72 29 3b 0a 20 20 73 71 6c 69 74  reader);.  sqlit
25b20 65 33 5f 66 72 65 65 28 70 72 65 76 2e 61 29 3b  e3_free(prev.a);
25b30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25b40 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c  ./*.** Remove al
25b50 6c 20 74 65 72 6d 73 20 73 6d 61 6c 6c 65 72 20  l terms smaller 
25b60 74 68 61 6e 20 7a 54 65 72 6d 2f 6e 54 65 72 6d  than zTerm/nTerm
25b70 20 66 72 6f 6d 20 73 65 67 6d 65 6e 74 20 69 49   from segment iI
25b80 64 78 20 69 6e 20 61 62 73 6f 6c 75 74 65 20 0a  dx in absolute .
25b90 2a 2a 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76  ** level iAbsLev
25ba0 65 6c 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76  el. This may inv
25bb0 6f 6c 76 65 20 64 65 6c 65 74 69 6e 67 20 65 6e  olve deleting en
25bc0 74 72 69 65 73 20 66 72 6f 6d 20 74 68 65 20 25  tries from the %
25bd0 5f 73 65 67 6d 65 6e 74 73 0a 2a 2a 20 74 61 62  _segments.** tab
25be0 6c 65 2c 20 61 6e 64 20 6d 6f 64 69 66 79 69 6e  le, and modifyin
25bf0 67 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 69  g existing entri
25c00 65 73 20 69 6e 20 62 6f 74 68 20 74 68 65 20 25  es in both the %
25c10 5f 73 65 67 6d 65 6e 74 73 20 61 6e 64 20 25 5f  _segments and %_
25c20 73 65 67 64 69 72 0a 2a 2a 20 74 61 62 6c 65 73  segdir.** tables
25c30 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
25c40 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
25c50 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69 73 20   the segment is 
25c60 75 70 64 61 74 65 64 20 73 75 63 63 65 73 73 66  updated successf
25c70 75 6c 6c 79 2e 20 4f 72 20 61 6e 0a 2a 2a 20 53  ully. Or an.** S
25c80 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
25c90 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
25ca0 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 54 72  tatic int fts3Tr
25cb0 75 6e 63 61 74 65 53 65 67 6d 65 6e 74 28 0a 20  uncateSegment(. 
25cc0 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
25cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ce0 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20 68   /* FTS3 table h
25cf0 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  andle */.  sqlit
25d00 65 33 5f 69 6e 74 36 34 20 69 41 62 73 4c 65 76  e3_int64 iAbsLev
25d10 65 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 62  el,        /* Ab
25d20 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 6f 66 20  solute level of 
25d30 73 65 67 6d 65 6e 74 20 74 6f 20 6d 6f 64 69 66  segment to modif
25d40 79 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c  y */.  int iIdx,
25d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d60 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
25d70 77 69 74 68 69 6e 20 6c 65 76 65 6c 20 6f 66 20  within level of 
25d80 73 65 67 6d 65 6e 74 20 74 6f 20 6d 6f 64 69 66  segment to modif
25d90 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  y */.  const cha
25da0 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20  r *zTerm,       
25db0 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
25dc0 20 74 65 72 6d 73 20 73 6d 61 6c 6c 65 72 20 74   terms smaller t
25dd0 68 61 6e 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e  han this */.  in
25de0 74 20 6e 54 65 72 6d 20 20 20 20 20 20 20 20 20  t nTerm         
25df0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25e00 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
25e10 69 6e 20 62 75 66 66 65 72 20 7a 54 65 72 6d 20  in buffer zTerm 
25e20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
25e30 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
25e40 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
25e50 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 6c 6f 62  n code */.  Blob
25e60 20 72 6f 6f 74 20 3d 20 7b 30 2c 30 2c 30 7d 3b   root = {0,0,0};
25e70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25e80 65 77 20 72 6f 6f 74 20 70 61 67 65 20 69 6d 61  ew root page ima
25e90 67 65 20 2a 2f 0a 20 20 42 6c 6f 62 20 62 6c 6f  ge */.  Blob blo
25ea0 63 6b 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20  ck = {0,0,0};   
25eb0 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
25ec0 72 20 75 73 65 64 20 66 6f 72 20 61 6e 79 20 6f  r used for any o
25ed0 74 68 65 72 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20  ther block */.  
25ee0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 42  sqlite3_int64 iB
25ef0 6c 6f 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  lock = 0;       
25f00 2f 2a 20 42 6c 6f 63 6b 20 69 64 20 2a 2f 0a 20  /* Block id */. 
25f10 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
25f20 4e 65 77 53 74 61 72 74 20 3d 20 30 3b 20 20 20  NewStart = 0;   
25f30 20 2f 2a 20 4e 65 77 20 76 61 6c 75 65 20 66 6f   /* New value fo
25f40 72 20 69 53 74 61 72 74 42 6c 6f 63 6b 20 2a 2f  r iStartBlock */
25f50 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
25f60 20 69 4f 6c 64 53 74 61 72 74 20 3d 20 30 3b 20   iOldStart = 0; 
25f70 20 20 20 2f 2a 20 4f 6c 64 20 76 61 6c 75 65 20     /* Old value 
25f80 66 6f 72 20 69 53 74 61 72 74 42 6c 6f 63 6b 20  for iStartBlock 
25f90 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
25fa0 74 20 2a 70 46 65 74 63 68 20 3d 20 30 3b 20 20  t *pFetch = 0;  
25fb0 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e       /* Statemen
25fc0 74 20 75 73 65 64 20 74 6f 20 66 65 74 63 68 20  t used to fetch 
25fd0 73 65 67 64 69 72 20 2a 2f 0a 0a 20 20 72 63 20  segdir */..  rc 
25fe0 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
25ff0 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 45 47 44   SQL_SELECT_SEGD
26000 49 52 2c 20 26 70 46 65 74 63 68 2c 20 30 29 3b  IR, &pFetch, 0);
26010 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
26020 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
26030 72 63 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  rc2;            
26040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
26050 69 74 65 33 5f 72 65 73 65 74 28 29 20 72 65 74  ite3_reset() ret
26060 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20  urn code */.    
26070 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
26080 36 34 28 70 46 65 74 63 68 2c 20 31 2c 20 69 41  64(pFetch, 1, iA
26090 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20 73 71  bsLevel);.    sq
260a0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
260b0 46 65 74 63 68 2c 20 32 2c 20 69 49 64 78 29 3b  Fetch, 2, iIdx);
260c0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
260d0 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
260e0 70 28 70 46 65 74 63 68 29 20 29 7b 0a 20 20 20  p(pFetch) ){.   
260f0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61     const char *a
26100 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f 63  Root = sqlite3_c
26110 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 46 65 74 63  olumn_blob(pFetc
26120 68 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 6e 74  h, 4);.      int
26130 20 6e 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33   nRoot = sqlite3
26140 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 46  _column_bytes(pF
26150 65 74 63 68 2c 20 34 29 3b 0a 20 20 20 20 20 20  etch, 4);.      
26160 69 4f 6c 64 53 74 61 72 74 20 3d 20 73 71 6c 69  iOldStart = sqli
26170 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
26180 28 70 46 65 74 63 68 2c 20 31 29 3b 0a 20 20 20  (pFetch, 1);.   
26190 20 20 20 72 63 20 3d 20 66 74 73 33 54 72 75 6e     rc = fts3Trun
261a0 63 61 74 65 4e 6f 64 65 28 61 52 6f 6f 74 2c 20  cateNode(aRoot, 
261b0 6e 52 6f 6f 74 2c 20 26 72 6f 6f 74 2c 20 7a 54  nRoot, &root, zT
261c0 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 26 69 42 6c  erm, nTerm, &iBl
261d0 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ock);.    }.    
261e0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  rc2 = sqlite3_re
261f0 73 65 74 28 70 46 65 74 63 68 29 3b 0a 20 20 20  set(pFetch);.   
26200 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26210 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
26220 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   }..  while( rc=
26230 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 42  =SQLITE_OK && iB
26240 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 68 61 72  lock ){.    char
26250 20 2a 61 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20   *aBlock = 0;.  
26260 20 20 69 6e 74 20 6e 42 6c 6f 63 6b 20 3d 20 30    int nBlock = 0
26270 3b 0a 20 20 20 20 69 4e 65 77 53 74 61 72 74 20  ;.    iNewStart 
26280 3d 20 69 42 6c 6f 63 6b 3b 0a 0a 20 20 20 20 72  = iBlock;..    r
26290 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 52  c = sqlite3Fts3R
262a0 65 61 64 42 6c 6f 63 6b 28 70 2c 20 69 42 6c 6f  eadBlock(p, iBlo
262b0 63 6b 2c 20 26 61 42 6c 6f 63 6b 2c 20 26 6e 42  ck, &aBlock, &nB
262c0 6c 6f 63 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66  lock, 0);.    if
262d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
262e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  ){.      rc = ft
262f0 73 33 54 72 75 6e 63 61 74 65 4e 6f 64 65 28 61  s3TruncateNode(a
26300 42 6c 6f 63 6b 2c 20 6e 42 6c 6f 63 6b 2c 20 26  Block, nBlock, &
26310 62 6c 6f 63 6b 2c 20 7a 54 65 72 6d 2c 20 6e 54  block, zTerm, nT
26320 65 72 6d 2c 20 26 69 42 6c 6f 63 6b 29 3b 0a 20  erm, &iBlock);. 
26330 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
26340 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26350 20 20 20 20 72 63 20 3d 20 66 74 73 33 57 72 69      rc = fts3Wri
26360 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 69 4e 65  teSegment(p, iNe
26370 77 53 74 61 72 74 2c 20 62 6c 6f 63 6b 2e 61 2c  wStart, block.a,
26380 20 62 6c 6f 63 6b 2e 6e 29 3b 0a 20 20 20 20 7d   block.n);.    }
26390 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
263a0 65 28 61 42 6c 6f 63 6b 29 3b 0a 20 20 7d 0a 0a  e(aBlock);.  }..
263b0 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4e    /* Variable iN
263c0 65 77 53 74 61 72 74 20 6e 6f 77 20 63 6f 6e 74  ewStart now cont
263d0 61 69 6e 73 20 74 68 65 20 66 69 72 73 74 20 76  ains the first v
263e0 61 6c 69 64 20 6c 65 61 66 20 6e 6f 64 65 2e 20  alid leaf node. 
263f0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
26400 49 54 45 5f 4f 4b 20 26 26 20 69 4e 65 77 53 74  ITE_OK && iNewSt
26410 61 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  art ){.    sqlit
26420 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c 20 3d 20  e3_stmt *pDel = 
26430 30 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  0;.    rc = fts3
26440 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 44  SqlStmt(p, SQL_D
26450 45 4c 45 54 45 5f 53 45 47 4d 45 4e 54 53 5f 52  ELETE_SEGMENTS_R
26460 41 4e 47 45 2c 20 26 70 44 65 6c 2c 20 30 29 3b  ANGE, &pDel, 0);
26470 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
26480 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26490 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
264a0 36 34 28 70 44 65 6c 2c 20 31 2c 20 69 4f 6c 64  64(pDel, 1, iOld
264b0 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71  Start);.      sq
264c0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
264d0 28 70 44 65 6c 2c 20 32 2c 20 69 4e 65 77 53 74  (pDel, 2, iNewSt
264e0 61 72 74 2d 31 29 3b 0a 20 20 20 20 20 20 73 71  art-1);.      sq
264f0 6c 69 74 65 33 5f 73 74 65 70 28 70 44 65 6c 29  lite3_step(pDel)
26500 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
26510 69 74 65 33 5f 72 65 73 65 74 28 70 44 65 6c 29  ite3_reset(pDel)
26520 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
26530 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26540 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
26550 73 74 6d 74 20 2a 70 43 68 6f 6d 70 20 3d 20 30  stmt *pChomp = 0
26560 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53  ;.    rc = fts3S
26570 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 43 48  qlStmt(p, SQL_CH
26580 4f 4d 50 5f 53 45 47 44 49 52 2c 20 26 70 43 68  OMP_SEGDIR, &pCh
26590 6f 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  omp, 0);.    if(
265a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
265b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
265c0 62 69 6e 64 5f 69 6e 74 36 34 28 70 43 68 6f 6d  bind_int64(pChom
265d0 70 2c 20 31 2c 20 69 4e 65 77 53 74 61 72 74 29  p, 1, iNewStart)
265e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
265f0 62 69 6e 64 5f 62 6c 6f 62 28 70 43 68 6f 6d 70  bind_blob(pChomp
26600 2c 20 32 2c 20 72 6f 6f 74 2e 61 2c 20 72 6f 6f  , 2, root.a, roo
26610 74 2e 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  t.n, SQLITE_STAT
26620 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
26630 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 43  e3_bind_int64(pC
26640 68 6f 6d 70 2c 20 33 2c 20 69 41 62 73 4c 65 76  homp, 3, iAbsLev
26650 65 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  el);.      sqlit
26660 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 43 68 6f  e3_bind_int(pCho
26670 6d 70 2c 20 34 2c 20 69 49 64 78 29 3b 0a 20 20  mp, 4, iIdx);.  
26680 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
26690 28 70 43 68 6f 6d 70 29 3b 0a 20 20 20 20 20 20  (pChomp);.      
266a0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
266b0 65 74 28 70 43 68 6f 6d 70 29 3b 0a 20 20 20 20  et(pChomp);.    
266c0 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
266d0 5f 66 72 65 65 28 72 6f 6f 74 2e 61 29 3b 0a 20  _free(root.a);. 
266e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 62 6c   sqlite3_free(bl
266f0 6f 63 6b 2e 61 29 3b 0a 20 20 72 65 74 75 72 6e  ock.a);.  return
26700 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
26710 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
26720 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6e 20 69  alled after an i
26730 6e 63 72 6d 65 6e 74 61 6c 2d 6d 65 72 67 65 20  ncrmental-merge 
26740 6f 70 65 72 61 74 69 6f 6e 20 68 61 73 20 72 75  operation has ru
26750 6e 20 74 6f 0a 2a 2a 20 6d 65 72 67 65 20 28 6f  n to.** merge (o
26760 72 20 70 61 72 74 69 61 6c 6c 79 20 6d 65 72 67  r partially merg
26770 65 29 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  e) two or more s
26780 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 61 62 73  egments from abs
26790 6f 6c 75 74 65 20 6c 65 76 65 6c 0a 2a 2a 20 69  olute level.** i
267a0 41 62 73 4c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20  AbsLevel..**.** 
267b0 45 61 63 68 20 69 6e 70 75 74 20 73 65 67 6d 65  Each input segme
267c0 6e 74 20 69 73 20 65 69 74 68 65 72 20 72 65 6d  nt is either rem
267d0 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64 62  oved from the db
267e0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 28 69 66 20   completely (if 
267f0 61 6c 6c 20 6f 66 0a 2a 2a 20 69 74 73 20 64 61  all of.** its da
26800 74 61 20 77 61 73 20 63 6f 70 69 65 64 20 74 6f  ta was copied to
26810 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d   the output segm
26820 65 6e 74 20 62 79 20 74 68 65 20 69 6e 63 72 6d  ent by the incrm
26830 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 29 0a  erge operation).
26840 2a 2a 20 6f 72 20 6d 6f 64 69 66 69 65 64 20 69  ** or modified i
26850 6e 20 70 6c 61 63 65 20 73 6f 20 74 68 61 74 20  n place so that 
26860 69 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f 6e  it no longer con
26870 74 61 69 6e 73 20 74 68 6f 73 65 20 65 6e 74 72  tains those entr
26880 69 65 73 20 74 68 61 74 0a 2a 2a 20 68 61 76 65  ies that.** have
26890 20 62 65 65 6e 20 64 75 70 6c 69 63 61 74 65 64   been duplicated
268a0 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73   in the output s
268b0 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  egment..*/.stati
268c0 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72 6d 65  c int fts3Incrme
268d0 72 67 65 43 68 6f 6d 70 28 0a 20 20 46 74 73 33  rgeChomp(.  Fts3
268e0 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
268f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
26900 54 53 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  TS table handle 
26910 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
26920 36 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20  64 iAbsLevel,   
26930 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65       /* Absolute
26940 20 6c 65 76 65 6c 20 63 6f 6e 74 61 69 6e 69 6e   level containin
26950 67 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  g segments */.  
26960 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
26970 65 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20  er *pCsr,       
26980 2f 2a 20 43 68 6f 6d 70 20 61 6c 6c 20 73 65 67  /* Chomp all seg
26990 6d 65 6e 74 73 20 6f 70 65 6e 65 64 20 62 79 20  ments opened by 
269a0 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20  this cursor */. 
269b0 20 69 6e 74 20 2a 70 6e 52 65 6d 20 20 20 20 20   int *pnRem     
269c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65   /* Number of se
269e0 67 6d 65 6e 74 73 20 6e 6f 74 20 64 65 6c 65 74  gments not delet
269f0 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ed */.){.  int i
26a00 3b 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 30  ;.  int nRem = 0
26a10 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
26a20 49 54 45 5f 4f 4b 3b 0a 0a 20 20 66 6f 72 28 69  ITE_OK;..  for(i
26a30 3d 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 2d  =pCsr->nSegment-
26a40 31 3b 20 69 3e 3d 30 20 26 26 20 72 63 3d 3d 53  1; i>=0 && rc==S
26a50 51 4c 49 54 45 5f 4f 4b 3b 20 69 2d 2d 29 7b 0a  QLITE_OK; i--){.
26a60 20 20 20 20 46 74 73 33 53 65 67 52 65 61 64 65      Fts3SegReade
26a70 72 20 2a 70 53 65 67 20 3d 20 30 3b 0a 20 20 20  r *pSeg = 0;.   
26a80 20 69 6e 74 20 6a 3b 0a 0a 20 20 20 20 2f 2a 20   int j;..    /* 
26a90 46 69 6e 64 20 74 68 65 20 46 74 73 33 53 65 67  Find the Fts3Seg
26aa0 52 65 61 64 65 72 20 6f 62 6a 65 63 74 20 77 69  Reader object wi
26ab0 74 68 20 46 74 73 33 53 65 67 52 65 61 64 65 72  th Fts3SegReader
26ac0 2e 69 49 64 78 3d 3d 69 2e 20 49 74 20 69 73 20  .iIdx==i. It is 
26ad0 68 69 64 69 6e 67 0a 20 20 20 20 2a 2a 20 73 6f  hiding.    ** so
26ae0 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 70  mewhere in the p
26af0 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 5d  Csr->apSegment[]
26b00 20 61 72 72 61 79 2e 20 20 2a 2f 0a 20 20 20 20   array.  */.    
26b10 66 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28  for(j=0; ALWAYS(
26b20 6a 3c 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74  j<pCsr->nSegment
26b30 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70  ); j++){.      p
26b40 53 65 67 20 3d 20 70 43 73 72 2d 3e 61 70 53 65  Seg = pCsr->apSe
26b50 67 6d 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 20 20  gment[j];.      
26b60 69 66 28 20 70 53 65 67 2d 3e 69 49 64 78 3d 3d  if( pSeg->iIdx==
26b70 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  i ) break;.    }
26b80 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70  .    assert( j<p
26b90 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 20 26 26  Csr->nSegment &&
26ba0 20 70 53 65 67 2d 3e 69 49 64 78 3d 3d 69 20 29   pSeg->iIdx==i )
26bb0 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d  ;..    if( pSeg-
26bc0 3e 61 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  >aNode==0 ){.   
26bd0 20 20 20 2f 2a 20 53 65 67 2d 72 65 61 64 65 72     /* Seg-reader
26be0 20 69 73 20 61 74 20 45 4f 46 2e 20 52 65 6d 6f   is at EOF. Remo
26bf0 76 65 20 74 68 65 20 65 6e 74 69 72 65 20 69 6e  ve the entire in
26c00 70 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a  put segment. */.
26c10 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 44        rc = fts3D
26c20 65 6c 65 74 65 53 65 67 6d 65 6e 74 28 70 2c 20  eleteSegment(p, 
26c30 70 53 65 67 29 3b 0a 20 20 20 20 20 20 69 66 28  pSeg);.      if(
26c40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
26c50 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
26c60 74 73 33 52 65 6d 6f 76 65 53 65 67 64 69 72 45  ts3RemoveSegdirE
26c70 6e 74 72 79 28 70 2c 20 69 41 62 73 4c 65 76 65  ntry(p, iAbsLeve
26c80 6c 2c 20 70 53 65 67 2d 3e 69 49 64 78 29 3b 0a  l, pSeg->iIdx);.
26c90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
26ca0 6e 52 65 6d 20 3d 20 30 3b 0a 20 20 20 20 7d 65  nRem = 0;.    }e
26cb0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  lse{.      /* Th
26cc0 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  e incremental me
26cd0 72 67 65 20 64 69 64 20 6e 6f 74 20 63 6f 70 79  rge did not copy
26ce0 20 61 6c 6c 20 74 68 65 20 64 61 74 61 20 66 72   all the data fr
26cf0 6f 6d 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a  om this .      *
26d00 2a 20 73 65 67 6d 65 6e 74 20 74 6f 20 74 68 65  * segment to the
26d10 20 75 70 70 65 72 20 6c 65 76 65 6c 2e 20 54 68   upper level. Th
26d20 65 20 73 65 67 6d 65 6e 74 20 69 73 20 6d 6f 64  e segment is mod
26d30 69 66 69 65 64 20 69 6e 20 70 6c 61 63 65 0a 20  ified in place. 
26d40 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20       ** so that 
26d50 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 6b  it contains no k
26d60 65 79 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  eys smaller than
26d70 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 2a 2f   zTerm/nTerm. */
26d80 20 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68   .      const ch
26d90 61 72 20 2a 7a 54 65 72 6d 20 3d 20 70 53 65 67  ar *zTerm = pSeg
26da0 2d 3e 7a 54 65 72 6d 3b 0a 20 20 20 20 20 20 69  ->zTerm;.      i
26db0 6e 74 20 6e 54 65 72 6d 20 3d 20 70 53 65 67 2d  nt nTerm = pSeg-
26dc0 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 72 63  >nTerm;.      rc
26dd0 20 3d 20 66 74 73 33 54 72 75 6e 63 61 74 65 53   = fts3TruncateS
26de0 65 67 6d 65 6e 74 28 70 2c 20 69 41 62 73 4c 65  egment(p, iAbsLe
26df0 76 65 6c 2c 20 70 53 65 67 2d 3e 69 49 64 78 2c  vel, pSeg->iIdx,
26e00 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   zTerm, nTerm);.
26e10 20 20 20 20 20 20 6e 52 65 6d 2b 2b 3b 0a 20 20        nRem++;.  
26e20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
26e30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
26e40 6e 52 65 6d 21 3d 70 43 73 72 2d 3e 6e 53 65 67  nRem!=pCsr->nSeg
26e50 6d 65 6e 74 20 29 7b 0a 20 20 20 20 72 63 20 3d  ment ){.    rc =
26e60 20 66 74 73 33 52 65 70 61 63 6b 53 65 67 64 69   fts3RepackSegdi
26e70 72 4c 65 76 65 6c 28 70 2c 20 69 41 62 73 4c 65  rLevel(p, iAbsLe
26e80 76 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e  vel);.  }..  *pn
26e90 52 65 6d 20 3d 20 6e 52 65 6d 3b 0a 20 20 72 65  Rem = nRem;.  re
26ea0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
26eb0 2a 20 53 74 6f 72 65 20 61 6e 20 69 6e 63 72 2d  * Store an incr-
26ec0 6d 65 72 67 65 20 68 69 6e 74 20 69 6e 20 74 68  merge hint in th
26ed0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  e database..*/.s
26ee0 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e  tatic int fts3In
26ef0 63 72 6d 65 72 67 65 48 69 6e 74 53 74 6f 72 65  crmergeHintStore
26f00 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 42  (Fts3Table *p, B
26f10 6c 6f 62 20 2a 70 48 69 6e 74 29 7b 0a 20 20 73  lob *pHint){.  s
26f20 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 52 65  qlite3_stmt *pRe
26f30 70 6c 61 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74  place = 0;.  int
26f40 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
26f50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26f60 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
26f70 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
26f80 6d 74 28 70 2c 20 53 51 4c 5f 52 45 50 4c 41 43  mt(p, SQL_REPLAC
26f90 45 5f 53 54 41 54 2c 20 26 70 52 65 70 6c 61 63  E_STAT, &pReplac
26fa0 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  e, 0);.  if( rc=
26fb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26fc0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
26fd0 6e 74 28 70 52 65 70 6c 61 63 65 2c 20 31 2c 20  nt(pReplace, 1, 
26fe0 46 54 53 5f 53 54 41 54 5f 49 4e 43 52 4d 45 52  FTS_STAT_INCRMER
26ff0 47 45 48 49 4e 54 29 3b 0a 20 20 20 20 73 71 6c  GEHINT);.    sql
27000 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
27010 52 65 70 6c 61 63 65 2c 20 32 2c 20 70 48 69 6e  Replace, 2, pHin
27020 74 2d 3e 61 2c 20 70 48 69 6e 74 2d 3e 6e 2c 20  t->a, pHint->n, 
27030 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
27040 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
27050 28 70 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20  (pReplace);.    
27060 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
27070 65 74 28 70 52 65 70 6c 61 63 65 29 3b 0a 20 20  et(pReplace);.  
27080 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
27090 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 61 6e  }../*.** Load an
270a0 20 69 6e 63 72 2d 6d 65 72 67 65 20 68 69 6e 74   incr-merge hint
270b0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
270c0 73 65 2e 20 54 68 65 20 69 6e 63 72 2d 6d 65 72  se. The incr-mer
270d0 67 65 20 68 69 6e 74 2c 20 69 66 20 6f 6e 65 20  ge hint, if one 
270e0 0a 2a 2a 20 65 78 69 73 74 73 2c 20 69 73 20 73  .** exists, is s
270f0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 72 6f 77  tored in the row
27100 69 64 3d 3d 31 20 72 6f 77 20 6f 66 20 74 68 65  id==1 row of the
27110 20 25 5f 73 74 61 74 20 74 61 62 6c 65 2e 0a 2a   %_stat table..*
27120 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
27130 75 6c 2c 20 70 6f 70 75 6c 61 74 65 20 62 6c 6f  ul, populate blo
27140 62 20 2a 70 48 69 6e 74 20 77 69 74 68 20 74 68  b *pHint with th
27150 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
27160 6d 20 74 68 65 20 25 5f 73 74 61 74 0a 2a 2a 20  m the %_stat.** 
27170 74 61 62 6c 65 20 61 6e 64 20 72 65 74 75 72 6e  table and return
27180 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65   SQLITE_OK. Othe
27190 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72  rwise, if an err
271a0 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
271b0 6e 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 65  n an.** SQLite e
271c0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
271d0 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63  atic int fts3Inc
271e0 72 6d 65 72 67 65 48 69 6e 74 4c 6f 61 64 28 46  rmergeHintLoad(F
271f0 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 42 6c 6f  ts3Table *p, Blo
27200 62 20 2a 70 48 69 6e 74 29 7b 0a 20 20 73 71 6c  b *pHint){.  sql
27210 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65  ite3_stmt *pSele
27220 63 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ct = 0;.  int rc
27230 3b 0a 0a 20 20 70 48 69 6e 74 2d 3e 6e 20 3d 20  ;..  pHint->n = 
27240 30 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71  0;.  rc = fts3Sq
27250 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c  lStmt(p, SQL_SEL
27260 45 43 54 5f 53 54 41 54 2c 20 26 70 53 65 6c 65  ECT_STAT, &pSele
27270 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ct, 0);.  if( rc
27280 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
27290 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20     int rc2;.    
272a0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
272b0 28 70 53 65 6c 65 63 74 2c 20 31 2c 20 46 54 53  (pSelect, 1, FTS
272c0 5f 53 54 41 54 5f 49 4e 43 52 4d 45 52 47 45 48  _STAT_INCRMERGEH
272d0 49 4e 54 29 3b 0a 20 20 20 20 69 66 28 20 53 51  INT);.    if( SQ
272e0 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
272f0 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29 20  3_step(pSelect) 
27300 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
27310 68 61 72 20 2a 61 48 69 6e 74 20 3d 20 73 71 6c  har *aHint = sql
27320 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
27330 28 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  (pSelect, 0);.  
27340 20 20 20 20 69 6e 74 20 6e 48 69 6e 74 20 3d 20      int nHint = 
27350 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
27360 79 74 65 73 28 70 53 65 6c 65 63 74 2c 20 30 29  ytes(pSelect, 0)
27370 3b 0a 20 20 20 20 20 20 69 66 28 20 61 48 69 6e  ;.      if( aHin
27380 74 20 29 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f  t ){.        blo
27390 62 47 72 6f 77 42 75 66 66 65 72 28 70 48 69 6e  bGrowBuffer(pHin
273a0 74 2c 20 6e 48 69 6e 74 2c 20 26 72 63 29 3b 0a  t, nHint, &rc);.
273b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
273c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
273d0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48         memcpy(pH
273e0 69 6e 74 2d 3e 61 2c 20 61 48 69 6e 74 2c 20 6e  int->a, aHint, n
273f0 48 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Hint);.         
27400 20 70 48 69 6e 74 2d 3e 6e 20 3d 20 6e 48 69 6e   pHint->n = nHin
27410 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
27420 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
27430 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  c2 = sqlite3_res
27440 65 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  et(pSelect);.   
27450 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27460 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
27470 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
27480 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 52  .}../*.** If *pR
27490 63 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  c is not SQLITE_
274a0 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  OK when this fun
274b0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
274c0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
274d0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 70  ** Otherwise, ap
274e0 70 65 6e 64 20 61 6e 20 65 6e 74 72 79 20 74 6f  pend an entry to
274f0 20 74 68 65 20 68 69 6e 74 20 73 74 6f 72 65 64   the hint stored
27500 20 69 6e 20 62 6c 6f 62 20 2a 70 48 69 6e 74 2e   in blob *pHint.
27510 20 45 61 63 68 20 65 6e 74 72 79 0a 2a 2a 20 63   Each entry.** c
27520 6f 6e 73 69 73 74 73 20 6f 66 20 74 77 6f 20 76  onsists of two v
27530 61 72 69 6e 74 73 2c 20 74 68 65 20 61 62 73 6f  arints, the abso
27540 6c 75 74 65 20 6c 65 76 65 6c 20 6e 75 6d 62 65  lute level numbe
27550 72 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 73  r of the input s
27560 65 67 6d 65 6e 74 73 20 0a 2a 2a 20 61 6e 64 20  egments .** and 
27570 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  the number of in
27580 70 75 74 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2a  put segments..**
27590 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
275a0 6c 2c 20 6c 65 61 76 65 20 2a 70 52 63 20 73 65  l, leave *pRc se
275b0 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 61  t to SQLITE_OK a
275c0 6e 64 20 72 65 74 75 72 6e 2e 20 49 66 20 61 6e  nd return. If an
275d0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a   error occurs,.*
275e0 2a 20 73 65 74 20 2a 70 52 63 20 74 6f 20 61 6e  * set *pRc to an
275f0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
27600 64 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  de before return
27610 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
27620 6f 69 64 20 66 74 73 33 49 6e 63 72 6d 65 72 67  oid fts3Incrmerg
27630 65 48 69 6e 74 50 75 73 68 28 0a 20 20 42 6c 6f  eHintPush(.  Blo
27640 62 20 2a 70 48 69 6e 74 2c 20 20 20 20 20 20 20  b *pHint,       
27650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27660 48 69 6e 74 20 62 6c 6f 62 20 74 6f 20 61 70 70  Hint blob to app
27670 65 6e 64 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20  end to */.  i64 
27680 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 20 20  iAbsLevel,      
27690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
276a0 69 72 73 74 20 76 61 72 69 6e 74 20 74 6f 20 73  irst varint to s
276b0 74 6f 72 65 20 69 6e 20 68 69 6e 74 20 2a 2f 0a  tore in hint */.
276c0 20 20 69 6e 74 20 6e 49 6e 70 75 74 2c 20 20 20    int nInput,   
276d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276e0 20 20 2f 2a 20 53 65 63 6f 6e 64 20 76 61 72 69    /* Second vari
276f0 6e 74 20 74 6f 20 73 74 6f 72 65 20 69 6e 20 68  nt to store in h
27700 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  int */.  int *pR
27710 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
27720 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
27730 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a  UT: Error code *
27740 2f 0a 29 7b 0a 20 20 62 6c 6f 62 47 72 6f 77 42  /.){.  blobGrowB
27750 75 66 66 65 72 28 70 48 69 6e 74 2c 20 70 48 69  uffer(pHint, pHi
27760 6e 74 2d 3e 6e 20 2b 20 32 2a 46 54 53 33 5f 56  nt->n + 2*FTS3_V
27770 41 52 49 4e 54 5f 4d 41 58 2c 20 70 52 63 29 3b  ARINT_MAX, pRc);
27780 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
27790 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 48  ITE_OK ){.    pH
277a0 69 6e 74 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65  int->n += sqlite
277b0 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26  3Fts3PutVarint(&
277c0 70 48 69 6e 74 2d 3e 61 5b 70 48 69 6e 74 2d 3e  pHint->a[pHint->
277d0 6e 5d 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a  n], iAbsLevel);.
277e0 20 20 20 20 70 48 69 6e 74 2d 3e 6e 20 2b 3d 20      pHint->n += 
277f0 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
27800 72 69 6e 74 28 26 70 48 69 6e 74 2d 3e 61 5b 70  rint(&pHint->a[p
27810 48 69 6e 74 2d 3e 6e 5d 2c 20 28 69 36 34 29 6e  Hint->n], (i64)n
27820 49 6e 70 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Input);.  }.}../
27830 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 6c 61  *.** Read the la
27840 73 74 20 65 6e 74 72 79 20 28 6d 6f 73 74 20 72  st entry (most r
27850 65 63 65 6e 74 6c 79 20 70 75 73 68 65 64 29 20  ecently pushed) 
27860 66 72 6f 6d 20 74 68 65 20 68 69 6e 74 20 62 6c  from the hint bl
27870 6f 62 20 2a 70 48 69 6e 74 0a 2a 2a 20 61 6e 64  ob *pHint.** and
27880 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65   then remove the
27890 20 65 6e 74 72 79 2e 20 57 72 69 74 65 20 74 68   entry. Write th
278a0 65 20 74 77 6f 20 76 61 6c 75 65 73 20 72 65 61  e two values rea
278b0 64 20 74 6f 20 2a 70 69 41 62 73 4c 65 76 65 6c  d to *piAbsLevel
278c0 20 61 6e 64 20 0a 2a 2a 20 2a 70 6e 49 6e 70 75   and .** *pnInpu
278d0 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  t before returni
278e0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  ng..**.** If no 
278f0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
27900 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
27910 49 66 20 74 68 65 20 68 69 6e 74 20 62 6c 6f 62  If the hint blob
27920 20 69 6e 20 2a 70 48 69 6e 74 20 64 6f 65 73 0a   in *pHint does.
27930 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  ** not contain a
27940 74 20 6c 65 61 73 74 20 74 77 6f 20 76 61 6c 69  t least two vali
27950 64 20 76 61 72 69 6e 74 73 2c 20 72 65 74 75 72  d varints, retur
27960 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
27970 5f 56 54 41 42 2e 0a 2a 2f 0a 73 74 61 74 69 63  _VTAB..*/.static
27980 20 69 6e 74 20 66 74 73 33 49 6e 63 72 6d 65 72   int fts3Incrmer
27990 67 65 48 69 6e 74 50 6f 70 28 42 6c 6f 62 20 2a  geHintPop(Blob *
279a0 70 48 69 6e 74 2c 20 69 36 34 20 2a 70 69 41 62  pHint, i64 *piAb
279b0 73 4c 65 76 65 6c 2c 20 69 6e 74 20 2a 70 6e 49  sLevel, int *pnI
279c0 6e 70 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20 69  nput){.  const i
279d0 6e 74 20 6e 48 69 6e 74 20 3d 20 70 48 69 6e 74  nt nHint = pHint
279e0 2d 3e 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  ->n;.  int i;.. 
279f0 20 69 20 3d 20 70 48 69 6e 74 2d 3e 6e 2d 32 3b   i = pHint->n-2;
27a00 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 26 26  .  while( i>0 &&
27a10 20 28 70 48 69 6e 74 2d 3e 61 5b 69 2d 31 5d 20   (pHint->a[i-1] 
27a20 26 20 30 78 38 30 29 20 29 20 69 2d 2d 3b 0a 20  & 0x80) ) i--;. 
27a30 20 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20 28   while( i>0 && (
27a40 70 48 69 6e 74 2d 3e 61 5b 69 2d 31 5d 20 26 20  pHint->a[i-1] & 
27a50 30 78 38 30 29 20 29 20 69 2d 2d 3b 0a 0a 20 20  0x80) ) i--;..  
27a60 70 48 69 6e 74 2d 3e 6e 20 3d 20 69 3b 0a 20 20  pHint->n = i;.  
27a70 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  i += sqlite3Fts3
27a80 47 65 74 56 61 72 69 6e 74 28 26 70 48 69 6e 74  GetVarint(&pHint
27a90 2d 3e 61 5b 69 5d 2c 20 70 69 41 62 73 4c 65 76  ->a[i], piAbsLev
27aa0 65 6c 29 3b 0a 20 20 69 20 2b 3d 20 66 74 73 33  el);.  i += fts3
27ab0 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 48 69  GetVarint32(&pHi
27ac0 6e 74 2d 3e 61 5b 69 5d 2c 20 70 6e 49 6e 70 75  nt->a[i], pnInpu
27ad0 74 29 3b 0a 20 20 69 66 28 20 69 21 3d 6e 48 69  t);.  if( i!=nHi
27ae0 6e 74 20 29 20 72 65 74 75 72 6e 20 46 54 53 5f  nt ) return FTS_
27af0 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 0a 20  CORRUPT_VTAB;.. 
27b00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27b10 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  K;.}.../*.** Att
27b20 65 6d 70 74 20 61 6e 20 69 6e 63 72 65 6d 65 6e  empt an incremen
27b30 74 61 6c 20 6d 65 72 67 65 20 74 68 61 74 20 77  tal merge that w
27b40 72 69 74 65 73 20 6e 4d 65 72 67 65 20 6c 65 61  rites nMerge lea
27b50 66 20 62 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  f blocks..**.** 
27b60 49 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67  Incremental merg
27b70 65 73 20 68 61 70 70 65 6e 20 6e 4d 69 6e 20 73  es happen nMin s
27b80 65 67 6d 65 6e 74 73 20 61 74 20 61 20 74 69 6d  egments at a tim
27b90 65 2e 20 54 68 65 20 73 65 67 6d 65 6e 74 73 20  e. The segments 
27ba0 0a 2a 2a 20 74 6f 20 62 65 20 6d 65 72 67 65 64  .** to be merged
27bb0 20 61 72 65 20 74 68 65 20 6e 4d 69 6e 20 6f 6c   are the nMin ol
27bc0 64 65 73 74 20 73 65 67 6d 65 6e 74 73 20 28 74  dest segments (t
27bd0 68 65 20 6f 6e 65 73 20 77 69 74 68 20 74 68 65  he ones with the
27be0 20 73 6d 61 6c 6c 65 73 74 20 0a 2a 2a 20 76 61   smallest .** va
27bf0 6c 75 65 73 20 66 6f 72 20 74 68 65 20 5f 73 65  lues for the _se
27c00 67 64 69 72 2e 69 64 78 20 66 69 65 6c 64 29 20  gdir.idx field) 
27c10 69 6e 20 74 68 65 20 68 69 67 68 65 73 74 20 6c  in the highest l
27c20 65 76 65 6c 20 74 68 61 74 20 63 6f 6e 74 61 69  evel that contai
27c30 6e 73 20 0a 2a 2a 20 61 74 20 6c 65 61 73 74 20  ns .** at least 
27c40 6e 4d 69 6e 20 73 65 67 6d 65 6e 74 73 2e 20 4d  nMin segments. M
27c50 75 6c 74 69 70 6c 65 20 6d 65 72 67 65 73 20 6d  ultiple merges m
27c60 69 67 68 74 20 6f 63 63 75 72 20 69 6e 20 61 6e  ight occur in an
27c70 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20   attempt to .** 
27c80 77 72 69 74 65 20 74 68 65 20 71 75 6f 74 61 20  write the quota 
27c90 6f 66 20 6e 4d 65 72 67 65 20 6c 65 61 66 20 62  of nMerge leaf b
27ca0 6c 6f 63 6b 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  locks..*/.int sq
27cb0 6c 69 74 65 33 46 74 73 33 49 6e 63 72 6d 65 72  lite3Fts3Incrmer
27cc0 67 65 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  ge(Fts3Table *p,
27cd0 20 69 6e 74 20 6e 4d 65 72 67 65 2c 20 69 6e 74   int nMerge, int
27ce0 20 6e 4d 69 6e 29 7b 0a 20 20 69 6e 74 20 72 63   nMin){.  int rc
27cf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27d00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
27d10 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
27d20 74 20 6e 52 65 6d 20 3d 20 6e 4d 65 72 67 65 3b  t nRem = nMerge;
27d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27d40 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   Number of leaf 
27d50 70 61 67 65 73 20 79 65 74 20 74 6f 20 20 62 65  pages yet to  be
27d60 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 46 74   written */.  Ft
27d70 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
27d80 20 2a 70 43 73 72 3b 20 20 20 20 20 20 20 2f 2a   *pCsr;       /*
27d90 20 43 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20   Cursor used to 
27da0 72 65 61 64 20 69 6e 70 75 74 20 64 61 74 61 20  read input data 
27db0 2a 2f 0a 20 20 46 74 73 33 53 65 67 46 69 6c 74  */.  Fts3SegFilt
27dc0 65 72 20 2a 70 46 69 6c 74 65 72 3b 20 20 20 20  er *pFilter;    
27dd0 20 20 20 20 20 2f 2a 20 46 69 6c 74 65 72 20 75       /* Filter u
27de0 73 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  sed with cursor 
27df0 70 43 73 72 20 2a 2f 0a 20 20 49 6e 63 72 6d 65  pCsr */.  Incrme
27e00 72 67 65 57 72 69 74 65 72 20 2a 70 57 72 69 74  rgeWriter *pWrit
27e10 65 72 3b 20 20 20 20 20 20 20 2f 2a 20 57 72 69  er;       /* Wri
27e20 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
27e30 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b 20 20 20  int nSeg = 0;   
27e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e50 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70  /* Number of inp
27e60 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  ut segments */. 
27e70 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
27e80 41 62 73 4c 65 76 65 6c 20 3d 20 30 3b 20 20 20  AbsLevel = 0;   
27e90 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65 76   /* Absolute lev
27ea0 65 6c 20 6e 75 6d 62 65 72 20 74 6f 20 77 6f 72  el number to wor
27eb0 6b 20 6f 6e 20 2a 2f 0a 20 20 42 6c 6f 62 20 68  k on */.  Blob h
27ec0 69 6e 74 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b  int = {0, 0, 0};
27ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 69 6e            /* Hin
27ee0 74 20 72 65 61 64 20 66 72 6f 6d 20 25 5f 73 74  t read from %_st
27ef0 61 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  at table */.  in
27f00 74 20 62 44 69 72 74 79 48 69 6e 74 20 3d 20 30  t bDirtyHint = 0
27f10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
27f20 20 54 72 75 65 20 69 66 20 62 6c 6f 62 20 27 68   True if blob 'h
27f30 69 6e 74 27 20 68 61 73 20 62 65 65 6e 20 6d 6f  int' has been mo
27f40 64 69 66 69 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  dified */..  /* 
27f50 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
27f60 6f 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20 66  or the cursor, f
27f70 69 6c 74 65 72 20 61 6e 64 20 77 72 69 74 65 72  ilter and writer
27f80 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 63 6f   objects */.  co
27f90 6e 73 74 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d  nst int nAlloc =
27fa0 20 73 69 7a 65 6f 66 28 2a 70 43 73 72 29 20 2b   sizeof(*pCsr) +
27fb0 20 73 69 7a 65 6f 66 28 2a 70 46 69 6c 74 65 72   sizeof(*pFilter
27fc0 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 57 72 69  ) + sizeof(*pWri
27fd0 74 65 72 29 3b 0a 20 20 70 57 72 69 74 65 72 20  ter);.  pWriter 
27fe0 3d 20 28 49 6e 63 72 6d 65 72 67 65 57 72 69 74  = (IncrmergeWrit
27ff0 65 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  er *)sqlite3_mal
28000 6c 6f 63 28 6e 41 6c 6c 6f 63 29 3b 0a 20 20 69  loc(nAlloc);.  i
28010 66 28 20 21 70 57 72 69 74 65 72 20 29 20 72 65  f( !pWriter ) re
28020 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
28030 4d 3b 0a 20 20 70 46 69 6c 74 65 72 20 3d 20 28  M;.  pFilter = (
28040 46 74 73 33 53 65 67 46 69 6c 74 65 72 20 2a 29  Fts3SegFilter *)
28050 26 70 57 72 69 74 65 72 5b 31 5d 3b 0a 20 20 70  &pWriter[1];.  p
28060 43 73 72 20 3d 20 28 46 74 73 33 4d 75 6c 74 69  Csr = (Fts3Multi
28070 53 65 67 52 65 61 64 65 72 20 2a 29 26 70 46 69  SegReader *)&pFi
28080 6c 74 65 72 5b 31 5d 3b 0a 0a 20 20 72 63 20 3d  lter[1];..  rc =
28090 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 48 69   fts3IncrmergeHi
280a0 6e 74 4c 6f 61 64 28 70 2c 20 26 68 69 6e 74 29  ntLoad(p, &hint)
280b0 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
280c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 52 65 6d  QLITE_OK && nRem
280d0 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  >0 ){.    const 
280e0 69 36 34 20 6e 4d 6f 64 20 3d 20 46 54 53 33 5f  i64 nMod = FTS3_
280f0 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 20  SEGDIR_MAXLEVEL 
28100 2a 20 70 2d 3e 6e 49 6e 64 65 78 3b 0a 20 20 20  * p->nIndex;.   
28110 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
28120 46 69 6e 64 4c 65 76 65 6c 20 3d 20 30 3b 20 2f  FindLevel = 0; /
28130 2a 20 53 51 4c 20 75 73 65 64 20 74 6f 20 64 65  * SQL used to de
28140 74 65 72 6d 69 6e 65 20 69 41 62 73 4c 65 76 65  termine iAbsLeve
28150 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 55 73  l */.    int bUs
28160 65 48 69 6e 74 20 3d 20 30 3b 20 20 20 20 20 20  eHint = 0;      
28170 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
28180 66 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  f attempting to 
28190 61 70 70 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e  append */.    in
281a0 74 20 69 49 64 78 20 3d 20 30 3b 20 20 20 20 20  t iIdx = 0;     
281b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
281c0 61 72 67 65 73 74 20 69 64 78 20 69 6e 20 6c 65  argest idx in le
281d0 76 65 6c 20 28 69 41 62 73 4c 65 76 65 6c 2b 31  vel (iAbsLevel+1
281e0 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61  ) */..    /* Sea
281f0 72 63 68 20 74 68 65 20 25 5f 73 65 67 64 69 72  rch the %_segdir
28200 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 61   table for the a
28210 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 77 69  bsolute level wi
28220 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 0a  th the smallest.
28230 20 20 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20      ** relative 
28240 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20 74 68 61  level number tha
28250 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65  t contains at le
28260 61 73 74 20 6e 4d 69 6e 20 73 65 67 6d 65 6e 74  ast nMin segment
28270 73 2c 20 69 66 20 61 6e 79 2e 0a 20 20 20 20 2a  s, if any..    *
28280 2a 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e  * If one is foun
28290 64 2c 20 73 65 74 20 69 41 62 73 4c 65 76 65 6c  d, set iAbsLevel
282a0 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65   to the absolute
282b0 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20 61 6e   level number an
282c0 64 0a 20 20 20 20 2a 2a 20 6e 53 65 67 20 74 6f  d.    ** nSeg to
282d0 20 6e 4d 69 6e 2e 20 49 66 20 6e 6f 20 6c 65 76   nMin. If no lev
282e0 65 6c 20 77 69 74 68 20 61 74 20 6c 65 61 73 74  el with at least
282f0 20 6e 4d 69 6e 20 73 65 67 6d 65 6e 74 73 20 63   nMin segments c
28300 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 0a 20 20  an be found, .  
28310 20 20 2a 2a 20 73 65 74 20 6e 53 65 67 20 74 6f    ** set nSeg to
28320 20 2d 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   -1..    */.    
28330 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
28340 28 70 2c 20 53 51 4c 5f 46 49 4e 44 5f 4d 45 52  (p, SQL_FIND_MER
28350 47 45 5f 4c 45 56 45 4c 2c 20 26 70 46 69 6e 64  GE_LEVEL, &pFind
28360 4c 65 76 65 6c 2c 20 30 29 3b 0a 20 20 20 20 73  Level, 0);.    s
28370 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
28380 70 46 69 6e 64 4c 65 76 65 6c 2c 20 31 2c 20 4d  pFindLevel, 1, M
28390 41 58 28 32 2c 20 6e 4d 69 6e 29 29 3b 0a 20 20  AX(2, nMin));.  
283a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
283b0 65 70 28 70 46 69 6e 64 4c 65 76 65 6c 29 3d 3d  ep(pFindLevel)==
283c0 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
283d0 20 20 20 20 69 41 62 73 4c 65 76 65 6c 20 3d 20      iAbsLevel = 
283e0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
283f0 6e 74 36 34 28 70 46 69 6e 64 4c 65 76 65 6c 2c  nt64(pFindLevel,
28400 20 30 29 3b 0a 20 20 20 20 20 20 6e 53 65 67 20   0);.      nSeg 
28410 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
28420 5f 69 6e 74 28 70 46 69 6e 64 4c 65 76 65 6c 2c  _int(pFindLevel,
28430 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   1);.      asser
28440 74 28 20 6e 53 65 67 3e 3d 32 20 29 3b 0a 20 20  t( nSeg>=2 );.  
28450 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
28460 53 65 67 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  Seg = -1;.    }.
28470 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28480 5f 72 65 73 65 74 28 70 46 69 6e 64 4c 65 76 65  _reset(pFindLeve
28490 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  l);..    /* If t
284a0 68 65 20 68 69 6e 74 20 72 65 61 64 20 66 72 6f  he hint read fro
284b0 6d 20 74 68 65 20 25 5f 73 74 61 74 20 74 61 62  m the %_stat tab
284c0 6c 65 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c  le is not empty,
284d0 20 63 68 65 63 6b 20 69 66 20 74 68 65 0a 20 20   check if the.  
284e0 20 20 2a 2a 20 6c 61 73 74 20 65 6e 74 72 79 20    ** last entry 
284f0 69 6e 20 69 74 20 73 70 65 63 69 66 69 65 73 20  in it specifies 
28500 61 20 72 65 6c 61 74 69 76 65 20 6c 65 76 65 6c  a relative level
28510 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 72   smaller than or
28520 20 65 71 75 61 6c 0a 20 20 20 20 2a 2a 20 74 6f   equal.    ** to
28530 20 74 68 65 20 6c 65 76 65 6c 20 69 64 65 6e 74   the level ident
28540 69 66 69 65 64 20 62 79 20 74 68 65 20 62 6c 6f  ified by the blo
28550 63 6b 20 61 62 6f 76 65 20 28 69 66 20 61 6e 79  ck above (if any
28560 29 2e 20 49 66 20 73 6f 2c 20 74 68 69 73 20 0a  ). If so, this .
28570 20 20 20 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e      ** iteration
28580 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 69 6c   of the loop wil
28590 6c 20 77 6f 72 6b 20 6f 6e 20 6d 65 72 67 69 6e  l work on mergin
285a0 67 20 61 74 20 74 68 65 20 68 69 6e 74 65 64 20  g at the hinted 
285b0 6c 65 76 65 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  level..    */.  
285c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
285d0 5f 4f 4b 20 26 26 20 68 69 6e 74 2e 6e 20 29 7b  _OK && hint.n ){
285e0 0a 20 20 20 20 20 20 69 6e 74 20 6e 48 69 6e 74  .      int nHint
285f0 20 3d 20 68 69 6e 74 2e 6e 3b 0a 20 20 20 20 20   = hint.n;.     
28600 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
28610 48 69 6e 74 41 62 73 4c 65 76 65 6c 20 3d 20 30  HintAbsLevel = 0
28620 3b 20 20 20 20 20 20 2f 2a 20 48 69 6e 74 20 6c  ;      /* Hint l
28630 65 76 65 6c 20 2a 2f 0a 20 20 20 20 20 20 69 6e  evel */.      in
28640 74 20 6e 48 69 6e 74 53 65 67 20 3d 20 30 3b 20  t nHintSeg = 0; 
28650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28660 20 20 20 20 2f 2a 20 48 69 6e 74 20 6e 75 6d 62      /* Hint numb
28670 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a  er of segments *
28680 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  /..      rc = ft
28690 73 33 49 6e 63 72 6d 65 72 67 65 48 69 6e 74 50  s3IncrmergeHintP
286a0 6f 70 28 26 68 69 6e 74 2c 20 26 69 48 69 6e 74  op(&hint, &iHint
286b0 41 62 73 4c 65 76 65 6c 2c 20 26 6e 48 69 6e 74  AbsLevel, &nHint
286c0 53 65 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Seg);.      if( 
286d0 6e 53 65 67 3c 30 20 7c 7c 20 28 69 41 62 73 4c  nSeg<0 || (iAbsL
286e0 65 76 65 6c 20 25 20 6e 4d 6f 64 29 20 3e 3d 20  evel % nMod) >= 
286f0 28 69 48 69 6e 74 41 62 73 4c 65 76 65 6c 20 25  (iHintAbsLevel %
28700 20 6e 4d 6f 64 29 20 29 7b 0a 20 20 20 20 20 20   nMod) ){.      
28710 20 20 69 41 62 73 4c 65 76 65 6c 20 3d 20 69 48    iAbsLevel = iH
28720 69 6e 74 41 62 73 4c 65 76 65 6c 3b 0a 20 20 20  intAbsLevel;.   
28730 20 20 20 20 20 6e 53 65 67 20 3d 20 6e 48 69 6e       nSeg = nHin
28740 74 53 65 67 3b 0a 20 20 20 20 20 20 20 20 62 55  tSeg;.        bU
28750 73 65 48 69 6e 74 20 3d 20 31 3b 0a 20 20 20 20  seHint = 1;.    
28760 20 20 20 20 62 44 69 72 74 79 48 69 6e 74 20 3d      bDirtyHint =
28770 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
28780 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
28790 20 75 6e 64 6f 65 73 20 74 68 65 20 65 66 66 65   undoes the effe
287a0 63 74 20 6f 66 20 74 68 65 20 48 69 6e 74 50 6f  ct of the HintPo
287b0 70 28 29 20 61 62 6f 76 65 20 2d 20 73 6f 20 74  p() above - so t
287c0 68 61 74 20 6e 6f 20 65 6e 74 72 79 0a 20 20 20  hat no entry.   
287d0 20 20 20 20 20 2a 2a 20 69 73 20 72 65 6d 6f 76       ** is remov
287e0 65 64 20 66 72 6f 6d 20 74 68 65 20 68 69 6e 74  ed from the hint
287f0 20 62 6c 6f 62 2e 20 20 2a 2f 0a 20 20 20 20 20   blob.  */.     
28800 20 20 20 68 69 6e 74 2e 6e 20 3d 20 6e 48 69 6e     hint.n = nHin
28810 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
28820 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 53 65 67  ..    /* If nSeg
28830 20 69 73 20 6c 65 73 73 20 74 68 61 74 20 7a 65   is less that ze
28840 72 6f 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69  ro, then there i
28850 73 20 6e 6f 20 6c 65 76 65 6c 20 77 69 74 68 20  s no level with 
28860 61 74 20 6c 65 61 73 74 0a 20 20 20 20 2a 2a 20  at least.    ** 
28870 6e 4d 69 6e 20 73 65 67 6d 65 6e 74 73 20 61 6e  nMin segments an
28880 64 20 6e 6f 20 68 69 6e 74 20 69 6e 20 74 68 65  d no hint in the
28890 20 25 5f 73 74 61 74 20 74 61 62 6c 65 2e 20 4e   %_stat table. N
288a0 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 2e 0a 20 20  o work to do..  
288b0 20 20 2a 2a 20 45 78 69 74 20 65 61 72 6c 79 20    ** Exit early 
288c0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a  in this case.  *
288d0 2f 0a 20 20 20 20 69 66 28 20 6e 53 65 67 3c 30  /.    if( nSeg<0
288e0 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f   ) break;..    /
288f0 2a 20 4f 70 65 6e 20 61 20 63 75 72 73 6f 72 20  * Open a cursor 
28900 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
28910 67 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  gh the contents 
28920 6f 66 20 74 68 65 20 6f 6c 64 65 73 74 20 6e 53  of the oldest nS
28930 65 67 20 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78  eg .    ** index
28940 65 73 20 6f 66 20 61 62 73 6f 6c 75 74 65 20 6c  es of absolute l
28950 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c 2e 20  evel iAbsLevel. 
28960 49 66 20 74 68 69 73 20 63 75 72 73 6f 72 20 69  If this cursor i
28970 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 0a  s opened using .
28980 20 20 20 20 2a 2a 20 74 68 65 20 27 68 69 6e 74      ** the 'hint
28990 27 20 70 61 72 61 6d 65 74 65 72 73 2c 20 69 74  ' parameters, it
289a0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61   is possible tha
289b0 74 20 74 68 65 72 65 20 61 72 65 20 6c 65 73 73  t there are less
289c0 20 74 68 61 6e 20 6e 53 65 67 0a 20 20 20 20 2a   than nSeg.    *
289d0 2a 20 73 65 67 6d 65 6e 74 73 20 61 76 61 69 6c  * segments avail
289e0 61 62 6c 65 20 69 6e 20 6c 65 76 65 6c 20 69 41  able in level iA
289f0 62 73 4c 65 76 65 6c 2e 20 49 6e 20 74 68 69 73  bsLevel. In this
28a00 20 63 61 73 65 2c 20 6e 6f 20 77 6f 72 6b 20 69   case, no work i
28a10 73 0a 20 20 20 20 2a 2a 20 64 6f 6e 65 20 6f 6e  s.    ** done on
28a20 20 69 41 62 73 4c 65 76 65 6c 20 2d 20 66 61 6c   iAbsLevel - fal
28a30 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
28a40 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
28a50 6f 66 20 74 68 65 20 6c 6f 6f 70 20 0a 20 20 20  of the loop .   
28a60 20 2a 2a 20 74 6f 20 73 74 61 72 74 20 77 6f 72   ** to start wor
28a70 6b 20 6f 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  k on some other 
28a80 6c 65 76 65 6c 2e 20 20 2a 2f 0a 20 20 20 20 6d  level.  */.    m
28a90 65 6d 73 65 74 28 70 57 72 69 74 65 72 2c 20 30  emset(pWriter, 0
28aa0 2c 20 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 70  , nAlloc);.    p
28ab0 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 3d 20  Filter->flags = 
28ac0 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 52 45 51  FTS3_SEGMENT_REQ
28ad0 55 49 52 45 5f 50 4f 53 3b 0a 0a 20 20 20 20 69  UIRE_POS;..    i
28ae0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28af0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
28b00 74 73 33 49 6e 63 72 6d 65 72 67 65 4f 75 74 70  ts3IncrmergeOutp
28b10 75 74 49 64 78 28 70 2c 20 69 41 62 73 4c 65 76  utIdx(p, iAbsLev
28b20 65 6c 2c 20 26 69 49 64 78 29 3b 0a 20 20 20 20  el, &iIdx);.    
28b30 20 20 61 73 73 65 72 74 28 20 62 55 73 65 48 69    assert( bUseHi
28b40 6e 74 3d 3d 31 20 7c 7c 20 62 55 73 65 48 69 6e  nt==1 || bUseHin
28b50 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  t==0 );.      if
28b60 28 20 69 49 64 78 3d 3d 30 20 7c 7c 20 28 62 55  ( iIdx==0 || (bU
28b70 73 65 48 69 6e 74 20 26 26 20 69 49 64 78 3d 3d  seHint && iIdx==
28b80 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  1) ){.        in
28b90 74 20 62 49 67 6e 6f 72 65 20 3d 20 30 3b 0a 20  t bIgnore = 0;. 
28ba0 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33         rc = fts3
28bb0 53 65 67 6d 65 6e 74 49 73 4d 61 78 4c 65 76 65  SegmentIsMaxLeve
28bc0 6c 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 2b 31  l(p, iAbsLevel+1
28bd0 2c 20 26 62 49 67 6e 6f 72 65 29 3b 0a 20 20 20  , &bIgnore);.   
28be0 20 20 20 20 20 69 66 28 20 62 49 67 6e 6f 72 65       if( bIgnore
28bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
28c00 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  ilter->flags |= 
28c10 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 49 47 4e  FTS3_SEGMENT_IGN
28c20 4f 52 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20 20  ORE_EMPTY;.     
28c30 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
28c40 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
28c50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28c60 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72     rc = fts3Incr
28c70 6d 65 72 67 65 43 73 72 28 70 2c 20 69 41 62 73  mergeCsr(p, iAbs
28c80 4c 65 76 65 6c 2c 20 6e 53 65 67 2c 20 70 43 73  Level, nSeg, pCs
28c90 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
28ca0 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20  ( SQLITE_OK==rc 
28cb0 26 26 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e  && pCsr->nSegmen
28cc0 74 3d 3d 6e 53 65 67 0a 20 20 20 20 20 26 26 20  t==nSeg.     && 
28cd0 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
28ce0 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
28cf0 65 61 64 65 72 53 74 61 72 74 28 70 2c 20 70 43  eaderStart(p, pC
28d00 73 72 2c 20 70 46 69 6c 74 65 72 29 29 0a 20 20  sr, pFilter)).  
28d10 20 20 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57     && SQLITE_ROW
28d20 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 46  ==(rc = sqlite3F
28d30 74 73 33 53 65 67 52 65 61 64 65 72 53 74 65 70  ts3SegReaderStep
28d40 28 70 2c 20 70 43 73 72 29 29 0a 20 20 20 20 29  (p, pCsr)).    )
28d50 7b 0a 20 20 20 20 20 20 69 66 28 20 62 55 73 65  {.      if( bUse
28d60 48 69 6e 74 20 26 26 20 69 49 64 78 3e 30 20 29  Hint && iIdx>0 )
28d70 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
28d80 63 68 61 72 20 2a 7a 4b 65 79 20 3d 20 70 43 73  char *zKey = pCs
28d90 72 2d 3e 7a 54 65 72 6d 3b 0a 20 20 20 20 20 20  r->zTerm;.      
28da0 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 43 73    int nKey = pCs
28db0 72 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20  r->nTerm;.      
28dc0 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72 6d    rc = fts3Incrm
28dd0 65 72 67 65 4c 6f 61 64 28 70 2c 20 69 41 62 73  ergeLoad(p, iAbs
28de0 4c 65 76 65 6c 2c 20 69 49 64 78 2d 31 2c 20 7a  Level, iIdx-1, z
28df0 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 57 72 69 74  Key, nKey, pWrit
28e00 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  er);.      }else
28e10 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
28e20 74 73 33 49 6e 63 72 6d 65 72 67 65 57 72 69 74  ts3IncrmergeWrit
28e30 65 72 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 2c  er(p, iAbsLevel,
28e40 20 69 49 64 78 2c 20 70 43 73 72 2c 20 70 57 72   iIdx, pCsr, pWr
28e50 69 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  iter);.      }..
28e60 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
28e70 4c 49 54 45 5f 4f 4b 20 26 26 20 70 57 72 69 74  LITE_OK && pWrit
28e80 65 72 2d 3e 6e 4c 65 61 66 45 73 74 20 29 7b 0a  er->nLeafEst ){.
28e90 20 20 20 20 20 20 20 20 66 74 73 33 4c 6f 67 4d          fts3LogM
28ea0 65 72 67 65 28 6e 53 65 67 2c 20 69 41 62 73 4c  erge(nSeg, iAbsL
28eb0 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 64  evel);.        d
28ec0 6f 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  o {.          rc
28ed0 20 3d 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65   = fts3Incrmerge
28ee0 41 70 70 65 6e 64 28 70 2c 20 70 57 72 69 74 65  Append(p, pWrite
28ef0 72 2c 20 70 43 73 72 29 3b 0a 20 20 20 20 20 20  r, pCsr);.      
28f00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28f10 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71 6c  TE_OK ) rc = sql
28f20 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
28f30 72 53 74 65 70 28 70 2c 20 70 43 73 72 29 3b 0a  rStep(p, pCsr);.
28f40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 57            if( pW
28f50 72 69 74 65 72 2d 3e 6e 57 6f 72 6b 3e 3d 6e 52  riter->nWork>=nR
28f60 65 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  em && rc==SQLITE
28f70 5f 52 4f 57 20 29 20 72 63 20 3d 20 53 51 4c 49  _ROW ) rc = SQLI
28f80 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  TE_OK;.        }
28f90 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
28fa0 45 5f 52 4f 57 20 29 3b 0a 0a 20 20 20 20 20 20  E_ROW );..      
28fb0 20 20 2f 2a 20 55 70 64 61 74 65 20 6f 72 20 64    /* Update or d
28fc0 65 6c 65 74 65 20 74 68 65 20 69 6e 70 75 74 20  elete the input 
28fd0 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  segments */.    
28fe0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28ff0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
29000 20 20 20 6e 52 65 6d 20 2d 3d 20 28 31 20 2b 20     nRem -= (1 + 
29010 70 57 72 69 74 65 72 2d 3e 6e 57 6f 72 6b 29 3b  pWriter->nWork);
29020 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
29030 66 74 73 33 49 6e 63 72 6d 65 72 67 65 43 68 6f  fts3IncrmergeCho
29040 6d 70 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 2c  mp(p, iAbsLevel,
29050 20 70 43 73 72 2c 20 26 6e 53 65 67 29 3b 0a 20   pCsr, &nSeg);. 
29060 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 53 65           if( nSe
29070 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g!=0 ){.        
29080 20 20 20 20 62 44 69 72 74 79 48 69 6e 74 20 3d      bDirtyHint =
29090 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
290a0 66 74 73 33 49 6e 63 72 6d 65 72 67 65 48 69 6e  fts3IncrmergeHin
290b0 74 50 75 73 68 28 26 68 69 6e 74 2c 20 69 41 62  tPush(&hint, iAb
290c0 73 4c 65 76 65 6c 2c 20 6e 53 65 67 2c 20 26 72  sLevel, nSeg, &r
290d0 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  c);.          }.
290e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
290f0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 53 65  }..      if( nSe
29100 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g!=0 ){.        
29110 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61  pWriter->nLeafDa
29120 74 61 20 3d 20 70 57 72 69 74 65 72 2d 3e 6e 4c  ta = pWriter->nL
29130 65 61 66 44 61 74 61 20 2a 20 2d 31 3b 0a 20 20  eafData * -1;.  
29140 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 33      }.      fts3
29150 49 6e 63 72 6d 65 72 67 65 52 65 6c 65 61 73 65  IncrmergeRelease
29160 28 70 2c 20 70 57 72 69 74 65 72 2c 20 26 72 63  (p, pWriter, &rc
29170 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 53 65  );.      if( nSe
29180 67 3d 3d 30 20 26 26 20 70 57 72 69 74 65 72 2d  g==0 && pWriter-
29190 3e 62 4e 6f 4c 65 61 66 44 61 74 61 3d 3d 30 20  >bNoLeafData==0 
291a0 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 33 50  ){.        fts3P
291b0 72 6f 6d 6f 74 65 53 65 67 6d 65 6e 74 73 28 70  romoteSegments(p
291c0 2c 20 69 41 62 73 4c 65 76 65 6c 2b 31 2c 20 70  , iAbsLevel+1, p
291d0 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61 74  Writer->nLeafDat
291e0 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  a);.      }.    
291f0 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  }..    sqlite3Ft
29200 73 33 53 65 67 52 65 61 64 65 72 46 69 6e 69 73  s3SegReaderFinis
29210 68 28 70 43 73 72 29 3b 0a 20 20 7d 0a 0a 20 20  h(pCsr);.  }..  
29220 2f 2a 20 57 72 69 74 65 20 74 68 65 20 68 69 6e  /* Write the hin
29230 74 20 76 61 6c 75 65 73 20 69 6e 74 6f 20 74 68  t values into th
29240 65 20 25 5f 73 74 61 74 20 74 61 62 6c 65 20 66  e %_stat table f
29250 6f 72 20 74 68 65 20 6e 65 78 74 20 69 6e 63 72  or the next incr
29260 2d 6d 65 72 67 65 72 20 2a 2f 0a 20 20 69 66 28  -merger */.  if(
29270 20 62 44 69 72 74 79 48 69 6e 74 20 26 26 20 72   bDirtyHint && r
29280 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29290 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63      rc = fts3Inc
292a0 72 6d 65 72 67 65 48 69 6e 74 53 74 6f 72 65 28  rmergeHintStore(
292b0 70 2c 20 26 68 69 6e 74 29 3b 0a 20 20 7d 0a 0a  p, &hint);.  }..
292c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
292d0 57 72 69 74 65 72 29 3b 0a 20 20 73 71 6c 69 74  Writer);.  sqlit
292e0 65 33 5f 66 72 65 65 28 68 69 6e 74 2e 61 29 3b  e3_free(hint.a);
292f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
29300 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74  ./*.** Convert t
29310 68 65 20 74 65 78 74 20 62 65 67 69 6e 6e 69 6e  he text beginnin
29320 67 20 61 74 20 2a 70 7a 20 69 6e 74 6f 20 61 6e  g at *pz into an
29330 20 69 6e 74 65 67 65 72 20 61 6e 64 20 72 65 74   integer and ret
29340 75 72 6e 0a 2a 2a 20 69 74 73 20 76 61 6c 75 65  urn.** its value
29350 2e 20 20 41 64 76 61 6e 63 65 20 2a 70 7a 20 74  .  Advance *pz t
29360 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  o point to the f
29370 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20 70  irst character p
29380 61 73 74 0a 2a 2a 20 74 68 65 20 69 6e 74 65 67  ast.** the integ
29390 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
293a0 74 20 66 74 73 33 47 65 74 69 6e 74 28 63 6f 6e  t fts3Getint(con
293b0 73 74 20 63 68 61 72 20 2a 2a 70 7a 29 7b 0a 20  st char **pz){. 
293c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
293d0 20 2a 70 7a 3b 0a 20 20 69 6e 74 20 69 20 3d 20   *pz;.  int i = 
293e0 30 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a 7a 29  0;.  while( (*z)
293f0 3e 3d 27 30 27 20 26 26 20 28 2a 7a 29 3c 3d 27  >='0' && (*z)<='
29400 39 27 20 29 20 69 20 3d 20 31 30 2a 69 20 2b 20  9' ) i = 10*i + 
29410 2a 28 7a 2b 2b 29 20 2d 20 27 30 27 3b 0a 20 20  *(z++) - '0';.  
29420 2a 70 7a 20 3d 20 7a 3b 0a 20 20 72 65 74 75 72  *pz = z;.  retur
29430 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  n i;.}../*.** Pr
29440 6f 63 65 73 73 20 73 74 61 74 65 6d 65 6e 74 73  ocess statements
29450 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
29460 0a 2a 2a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .**    INSERT IN
29470 54 4f 20 74 61 62 6c 65 28 74 61 62 6c 65 29 20  TO table(table) 
29480 56 41 4c 55 45 53 28 27 6d 65 72 67 65 3d 41 2c  VALUES('merge=A,
29490 42 27 29 3b 0a 2a 2a 0a 2a 2a 20 41 20 61 6e 64  B');.**.** A and
294a0 20 42 20 61 72 65 20 69 6e 74 65 67 65 72 73 20   B are integers 
294b0 74 68 61 74 20 64 65 63 6f 64 65 20 74 6f 20 62  that decode to b
294c0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
294d0 6c 65 61 66 20 70 61 67 65 73 0a 2a 2a 20 77 72  leaf pages.** wr
294e0 69 74 74 65 6e 20 66 6f 72 20 74 68 65 20 6d 65  itten for the me
294f0 72 67 65 2c 20 61 6e 64 20 74 68 65 20 6d 69 6e  rge, and the min
29500 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73  imum number of s
29510 65 67 6d 65 6e 74 73 20 6f 6e 20 61 20 6c 65 76  egments on a lev
29520 65 6c 0a 2a 2a 20 62 65 66 6f 72 65 20 69 74 20  el.** before it 
29530 77 69 6c 6c 20 62 65 20 73 65 6c 65 63 74 65 64  will be selected
29540 20 66 6f 72 20 61 20 6d 65 72 67 65 2c 20 72 65   for a merge, re
29550 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 73  spectively..*/.s
29560 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 44 6f  tatic int fts3Do
29570 49 6e 63 72 6d 65 72 67 65 28 0a 20 20 46 74 73  Incrmerge(.  Fts
29580 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
29590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
295a0 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c  FTS3 table handl
295b0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
295c0 72 20 2a 7a 50 61 72 61 6d 20 20 20 20 20 20 20  r *zParam       
295d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65         /* Nul-te
295e0 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
295f0 63 6f 6e 74 61 69 6e 69 6e 67 20 22 41 2c 42 22  containing "A,B"
29600 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
29610 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 28 46  .  int nMin = (F
29620 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 20  TS3_MERGE_COUNT 
29630 2f 20 32 29 3b 0a 20 20 69 6e 74 20 6e 4d 65 72  / 2);.  int nMer
29640 67 65 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  ge = 0;.  const 
29650 63 68 61 72 20 2a 7a 20 3d 20 7a 50 61 72 61 6d  char *z = zParam
29660 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
29670 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 76   first integer v
29680 61 6c 75 65 20 2a 2f 0a 20 20 6e 4d 65 72 67 65  alue */.  nMerge
29690 20 3d 20 66 74 73 33 47 65 74 69 6e 74 28 26 7a   = fts3Getint(&z
296a0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
296b0 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 76 61  first integer va
296c0 6c 75 65 20 69 73 20 66 6f 6c 6c 6f 77 65 64 20  lue is followed 
296d0 62 79 20 61 20 27 2c 27 2c 20 20 72 65 61 64 20  by a ',',  read 
296e0 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20  the second.  ** 
296f0 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 20 2a  integer value. *
29700 2f 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2c  /.  if( z[0]==',
29710 27 20 26 26 20 7a 5b 31 5d 21 3d 27 5c 30 27 20  ' && z[1]!='\0' 
29720 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20  ){.    z++;.    
29730 6e 4d 69 6e 20 3d 20 66 74 73 33 47 65 74 69 6e  nMin = fts3Getin
29740 74 28 26 7a 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  t(&z);.  }..  if
29750 28 20 7a 5b 30 5d 21 3d 27 5c 30 27 20 7c 7c 20  ( z[0]!='\0' || 
29760 6e 4d 69 6e 3c 32 20 29 7b 0a 20 20 20 20 72 63  nMin<2 ){.    rc
29770 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
29780 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
29790 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
297a0 20 20 69 66 28 20 21 70 2d 3e 62 48 61 73 53 74    if( !p->bHasSt
297b0 61 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  at ){.      asse
297c0 72 74 28 20 70 2d 3e 62 46 74 73 34 3d 3d 30 20  rt( p->bFts4==0 
297d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
297e0 46 74 73 33 43 72 65 61 74 65 53 74 61 74 54 61  Fts3CreateStatTa
297f0 62 6c 65 28 26 72 63 2c 20 70 29 3b 0a 20 20 20  ble(&rc, p);.   
29800 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
29810 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29820 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
29830 73 33 49 6e 63 72 6d 65 72 67 65 28 70 2c 20 6e  s3Incrmerge(p, n
29840 4d 65 72 67 65 2c 20 6e 4d 69 6e 29 3b 0a 20 20  Merge, nMin);.  
29850 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46    }.    sqlite3F
29860 74 73 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65  ts3SegmentsClose
29870 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
29880 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
29890 72 6f 63 65 73 73 20 73 74 61 74 65 6d 65 6e 74  rocess statement
298a0 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  s of the form:.*
298b0 2a 0a 2a 2a 20 20 20 20 49 4e 53 45 52 54 20 49  *.**    INSERT I
298c0 4e 54 4f 20 74 61 62 6c 65 28 74 61 62 6c 65 29  NTO table(table)
298d0 20 56 41 4c 55 45 53 28 27 61 75 74 6f 6d 65 72   VALUES('automer
298e0 67 65 3d 58 27 29 3b 0a 2a 2a 0a 2a 2a 20 77 68  ge=X');.**.** wh
298f0 65 72 65 20 58 20 69 73 20 61 6e 20 69 6e 74 65  ere X is an inte
29900 67 65 72 2e 20 20 58 3d 3d 30 20 6d 65 61 6e 73  ger.  X==0 means
29910 20 74 6f 20 74 75 72 6e 20 61 75 74 6f 6d 65 72   to turn automer
29920 67 65 20 6f 66 66 2e 20 20 58 21 3d 30 20 6d 65  ge off.  X!=0 me
29930 61 6e 73 0a 2a 2a 20 74 75 72 6e 20 69 74 20 6f  ans.** turn it o
29940 6e 2e 20 20 54 68 65 20 73 65 74 74 69 6e 67 20  n.  The setting 
29950 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a  is persistent..*
29960 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
29970 33 44 6f 41 75 74 6f 69 6e 63 72 6d 65 72 67 65  3DoAutoincrmerge
29980 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
29990 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
299a0 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c      /* FTS3 tabl
299b0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f  e handle */.  co
299c0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
299d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
299e0 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   Nul-terminated 
299f0 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
29a00 67 20 62 6f 6f 6c 65 61 6e 20 2a 2f 0a 29 7b 0a  g boolean */.){.
29a10 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
29a20 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 5f  E_OK;.  sqlite3_
29a30 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
29a40 0a 20 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d  .  p->nAutoincrm
29a50 65 72 67 65 20 3d 20 66 74 73 33 47 65 74 69 6e  erge = fts3Getin
29a60 74 28 26 7a 50 61 72 61 6d 29 3b 0a 20 20 69 66  t(&zParam);.  if
29a70 28 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d 65  ( p->nAutoincrme
29a80 72 67 65 3d 3d 31 20 7c 7c 20 70 2d 3e 6e 41 75  rge==1 || p->nAu
29a90 74 6f 69 6e 63 72 6d 65 72 67 65 3e 46 54 53 33  toincrmerge>FTS3
29aa0 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 20 29 7b 0a  _MERGE_COUNT ){.
29ab0 20 20 20 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72      p->nAutoincr
29ac0 6d 65 72 67 65 20 3d 20 38 3b 0a 20 20 7d 0a 20  merge = 8;.  }. 
29ad0 20 69 66 28 20 21 70 2d 3e 62 48 61 73 53 74 61   if( !p->bHasSta
29ae0 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
29af0 20 70 2d 3e 62 46 74 73 34 3d 3d 30 20 29 3b 0a   p->bFts4==0 );.
29b00 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 43      sqlite3Fts3C
29b10 72 65 61 74 65 53 74 61 74 54 61 62 6c 65 28 26  reateStatTable(&
29b20 72 63 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  rc, p);.    if( 
29b30 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
29b40 20 20 7d 0a 20 20 72 63 20 3d 20 66 74 73 33 53    }.  rc = fts3S
29b50 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 52 45  qlStmt(p, SQL_RE
29b60 50 4c 41 43 45 5f 53 54 41 54 2c 20 26 70 53 74  PLACE_STAT, &pSt
29b70 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  mt, 0);.  if( rc
29b80 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
29b90 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
29ba0 28 70 53 74 6d 74 2c 20 31 2c 20 46 54 53 5f 53  (pStmt, 1, FTS_S
29bb0 54 41 54 5f 41 55 54 4f 49 4e 43 52 4d 45 52 47  TAT_AUTOINCRMERG
29bc0 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69  E);.  sqlite3_bi
29bd0 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32 2c  nd_int(pStmt, 2,
29be0 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d 65 72   p->nAutoincrmer
29bf0 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ge);.  sqlite3_s
29c00 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 72 63  tep(pStmt);.  rc
29c10 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
29c20 28 70 53 74 6d 74 29 3b 0a 20 20 72 65 74 75 72  (pStmt);.  retur
29c30 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
29c40 65 74 75 72 6e 20 61 20 36 34 2d 62 69 74 20 63  eturn a 64-bit c
29c50 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20  hecksum for the 
29c60 46 54 53 20 69 6e 64 65 78 20 65 6e 74 72 79 20  FTS index entry 
29c70 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
29c80 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  .** arguments to
29c90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
29ca0 2a 2f 0a 73 74 61 74 69 63 20 75 36 34 20 66 74  */.static u64 ft
29cb0 73 33 43 68 65 63 6b 73 75 6d 45 6e 74 72 79 28  s3ChecksumEntry(
29cc0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
29cd0 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
29ce0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
29cf0 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
29d00 6e 67 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  ng term */.  int
29d10 20 6e 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20   nTerm,         
29d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29d30 53 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e  Size of zTerm in
29d40 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
29d50 69 4c 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20  iLangid,        
29d60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
29d70 61 6e 67 75 61 67 65 20 69 64 20 66 6f 72 20 63  anguage id for c
29d80 75 72 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20  urrent row */.  
29d90 69 6e 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20  int iIndex,     
29da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29db0 2f 2a 20 49 6e 64 65 78 20 28 30 2e 2e 46 74 73  /* Index (0..Fts
29dc0 33 54 61 62 6c 65 2e 6e 49 6e 64 65 78 2d 31 29  3Table.nIndex-1)
29dd0 20 2a 2f 0a 20 20 69 36 34 20 69 44 6f 63 69 64   */.  i64 iDocid
29de0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29df0 20 20 20 20 20 20 2f 2a 20 44 6f 63 69 64 20 66        /* Docid f
29e00 6f 72 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20  or current row. 
29e10 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
29e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e30 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
29e40 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  umber */.  int i
29e50 50 6f 73 20 20 20 20 20 20 20 20 20 20 20 20 20  Pos             
29e60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
29e70 73 69 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69  sition */.){.  i
29e80 6e 74 20 69 3b 0a 20 20 75 36 34 20 72 65 74 20  nt i;.  u64 ret 
29e90 3d 20 28 75 36 34 29 69 44 6f 63 69 64 3b 0a 0a  = (u64)iDocid;..
29ea0 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33    ret += (ret<<3
29eb0 29 20 2b 20 69 4c 61 6e 67 69 64 3b 0a 20 20 72  ) + iLangid;.  r
29ec0 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b  et += (ret<<3) +
29ed0 20 69 49 6e 64 65 78 3b 0a 20 20 72 65 74 20 2b   iIndex;.  ret +
29ee0 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 43 6f  = (ret<<3) + iCo
29ef0 6c 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74  l;.  ret += (ret
29f00 3c 3c 33 29 20 2b 20 69 50 6f 73 3b 0a 20 20 66  <<3) + iPos;.  f
29f10 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b  or(i=0; i<nTerm;
29f20 20 69 2b 2b 29 20 72 65 74 20 2b 3d 20 28 72 65   i++) ret += (re
29f30 74 3c 3c 33 29 20 2b 20 7a 54 65 72 6d 5b 69 5d  t<<3) + zTerm[i]
29f40 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b  ;..  return ret;
29f50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
29f60 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 61   a checksum of a
29f70 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ll entries in th
29f80 65 20 46 54 53 20 69 6e 64 65 78 20 74 68 61 74  e FTS index that
29f90 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 0a 2a   correspond to.*
29fa0 2a 20 6c 61 6e 67 75 61 67 65 20 69 64 20 69 4c  * language id iL
29fb0 61 6e 67 69 64 2e 20 54 68 65 20 63 68 65 63 6b  angid. The check
29fc0 73 75 6d 20 69 73 20 63 61 6c 63 75 6c 61 74 65  sum is calculate
29fd0 64 20 62 79 20 58 4f 52 69 6e 67 20 74 68 65 20  d by XORing the 
29fe0 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 6f 66 20  checksums.** of 
29ff0 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20  each individual 
2a000 65 6e 74 72 79 20 28 73 65 65 20 66 74 73 33 43  entry (see fts3C
2a010 68 65 63 6b 73 75 6d 45 6e 74 72 79 28 29 29 20  hecksumEntry()) 
2a020 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 0a 2a 2a 20  together..**.** 
2a030 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
2a040 68 65 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75  he checksum valu
2a050 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
2a060 64 20 2a 70 52 63 20 73 65 74 20 74 6f 20 53 51  d *pRc set to SQ
2a070 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65  LITE_OK..** Othe
2a080 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72  rwise, if an err
2a090 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 52 63 20  or occurs, *pRc 
2a0a0 69 73 20 73 65 74 20 74 6f 20 61 6e 20 53 51 4c  is set to an SQL
2a0b0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ite error code. 
2a0c0 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  The.** return va
2a0d0 6c 75 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64  lue is undefined
2a0e0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
2a0f0 2f 0a 73 74 61 74 69 63 20 75 36 34 20 66 74 73  /.static u64 fts
2a100 33 43 68 65 63 6b 73 75 6d 49 6e 64 65 78 28 0a  3ChecksumIndex(.
2a110 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
2a120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a130 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20    /* FTS3 table 
2a140 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
2a150 69 4c 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20  iLangid,        
2a160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2a170 61 6e 67 75 61 67 65 20 69 64 20 74 6f 20 72 65  anguage id to re
2a180 74 75 72 6e 20 63 6b 73 75 6d 20 66 6f 72 20 2a  turn cksum for *
2a190 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 2c 20  /.  int iIndex, 
2a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1b0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
2a1c0 63 6b 73 75 6d 20 28 30 2e 2e 70 2d 3e 6e 49 6e  cksum (0..p->nIn
2a1d0 64 65 78 2d 31 29 20 2a 2f 0a 20 20 69 6e 74 20  dex-1) */.  int 
2a1e0 2a 70 52 63 20 20 20 20 20 20 20 20 20 20 20 20  *pRc            
2a1f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2a200 55 54 3a 20 52 65 74 75 72 6e 20 63 6f 64 65 20  UT: Return code 
2a210 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 53 65 67 46  */.){.  Fts3SegF
2a220 69 6c 74 65 72 20 66 69 6c 74 65 72 3b 0a 20 20  ilter filter;.  
2a230 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
2a240 65 72 20 63 73 72 3b 0a 20 20 69 6e 74 20 72 63  er csr;.  int rc
2a250 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 20 3d 20  ;.  u64 cksum = 
2a260 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70  0;..  assert( *p
2a270 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  Rc==SQLITE_OK );
2a280 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69 6c 74  ..  memset(&filt
2a290 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 69  er, 0, sizeof(fi
2a2a0 6c 74 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74  lter));.  memset
2a2b0 28 26 63 73 72 2c 20 30 2c 20 73 69 7a 65 6f 66  (&csr, 0, sizeof
2a2c0 28 63 73 72 29 29 3b 0a 20 20 66 69 6c 74 65 72  (csr));.  filter
2a2d0 2e 66 6c 61 67 73 20 3d 20 20 46 54 53 33 5f 53  .flags =  FTS3_S
2a2e0 45 47 4d 45 4e 54 5f 52 45 51 55 49 52 45 5f 50  EGMENT_REQUIRE_P
2a2f0 4f 53 7c 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f  OS|FTS3_SEGMENT_
2a300 49 47 4e 4f 52 45 5f 45 4d 50 54 59 3b 0a 20 20  IGNORE_EMPTY;.  
2a310 66 69 6c 74 65 72 2e 66 6c 61 67 73 20 7c 3d 20  filter.flags |= 
2a320 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 53 43 41  FTS3_SEGMENT_SCA
2a330 4e 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  N;..  rc = sqlit
2a340 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 43  e3Fts3SegReaderC
2a350 75 72 73 6f 72 28 0a 20 20 20 20 20 20 70 2c 20  ursor(.      p, 
2a360 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c  iLangid, iIndex,
2a370 20 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f   FTS3_SEGCURSOR_
2a380 41 4c 4c 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c  ALL, 0, 0, 0, 1,
2a390 26 63 73 72 0a 20 20 29 3b 0a 20 20 69 66 28 20  &csr.  );.  if( 
2a3a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2a3b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2a3c0 33 46 74 73 33 53 65 67 52 65 61 64 65 72 53 74  3Fts3SegReaderSt
2a3d0 61 72 74 28 70 2c 20 26 63 73 72 2c 20 26 66 69  art(p, &csr, &fi
2a3e0 6c 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  lter);.  }..  if
2a3f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a400 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51  ){.    while( SQ
2a410 4c 49 54 45 5f 52 4f 57 3d 3d 28 72 63 20 3d 20  LITE_ROW==(rc = 
2a420 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
2a430 61 64 65 72 53 74 65 70 28 70 2c 20 26 63 73 72  aderStep(p, &csr
2a440 29 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  )) ){.      char
2a450 20 2a 70 43 73 72 20 3d 20 63 73 72 2e 61 44 6f   *pCsr = csr.aDo
2a460 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 63 68 61  clist;.      cha
2a470 72 20 2a 70 45 6e 64 20 3d 20 26 70 43 73 72 5b  r *pEnd = &pCsr[
2a480 63 73 72 2e 6e 44 6f 63 6c 69 73 74 5d 3b 0a 0a  csr.nDoclist];..
2a490 20 20 20 20 20 20 69 36 34 20 69 44 6f 63 69 64        i64 iDocid
2a4a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 36 34 20   = 0;.      i64 
2a4b0 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  iCol = 0;.      
2a4c0 69 36 34 20 69 50 6f 73 20 3d 20 30 3b 0a 0a 20  i64 iPos = 0;.. 
2a4d0 20 20 20 20 20 70 43 73 72 20 2b 3d 20 73 71 6c       pCsr += sql
2a4e0 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e  ite3Fts3GetVarin
2a4f0 74 28 70 43 73 72 2c 20 26 69 44 6f 63 69 64 29  t(pCsr, &iDocid)
2a500 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
2a510 43 73 72 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20  Csr<pEnd ){.    
2a520 20 20 20 20 69 36 34 20 69 56 61 6c 20 3d 20 30      i64 iVal = 0
2a530 3b 0a 20 20 20 20 20 20 20 20 70 43 73 72 20 2b  ;.        pCsr +
2a540 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74  = sqlite3Fts3Get
2a550 56 61 72 69 6e 74 28 70 43 73 72 2c 20 26 69 56  Varint(pCsr, &iV
2a560 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  al);.        if(
2a570 20 70 43 73 72 3c 70 45 6e 64 20 29 7b 0a 20 20   pCsr<pEnd ){.  
2a580 20 20 20 20 20 20 20 20 69 66 28 20 69 56 61 6c          if( iVal
2a590 3d 3d 30 20 7c 7c 20 69 56 61 6c 3d 3d 31 20 29  ==0 || iVal==1 )
2a5a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 43  {.            iC
2a5b0 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ol = 0;.        
2a5c0 20 20 20 20 69 50 6f 73 20 3d 20 30 3b 0a 20 20      iPos = 0;.  
2a5d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 56            if( iV
2a5e0 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
2a5f0 20 20 20 20 70 43 73 72 20 2b 3d 20 73 71 6c 69      pCsr += sqli
2a600 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74  te3Fts3GetVarint
2a610 28 70 43 73 72 2c 20 26 69 43 6f 6c 29 3b 0a 20  (pCsr, &iCol);. 
2a620 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
2a630 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2a640 70 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 46  pCsr += sqlite3F
2a650 74 73 33 47 65 74 56 61 72 69 6e 74 28 70 43 73  ts3GetVarint(pCs
2a660 72 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 20  r, &iVal);.     
2a670 20 20 20 20 20 20 20 20 20 69 44 6f 63 69 64 20           iDocid 
2a680 2b 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 20  += iVal;.       
2a690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2a6a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2a6b0 20 20 20 20 69 50 6f 73 20 2b 3d 20 28 69 56 61      iPos += (iVa
2a6c0 6c 20 2d 20 32 29 3b 0a 20 20 20 20 20 20 20 20  l - 2);.        
2a6d0 20 20 20 20 63 6b 73 75 6d 20 3d 20 63 6b 73 75      cksum = cksu
2a6e0 6d 20 5e 20 66 74 73 33 43 68 65 63 6b 73 75 6d  m ^ fts3Checksum
2a6f0 45 6e 74 72 79 28 0a 20 20 20 20 20 20 20 20 20  Entry(.         
2a700 20 20 20 20 20 20 20 63 73 72 2e 7a 54 65 72 6d         csr.zTerm
2a710 2c 20 63 73 72 2e 6e 54 65 72 6d 2c 20 69 4c 61  , csr.nTerm, iLa
2a720 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 44  ngid, iIndex, iD
2a730 6f 63 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20  ocid,.          
2a740 20 20 20 20 20 20 28 69 6e 74 29 69 43 6f 6c 2c        (int)iCol,
2a750 20 28 69 6e 74 29 69 50 6f 73 0a 20 20 20 20 20   (int)iPos.     
2a760 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
2a770 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2a780 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2a790 7d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 53  }.  sqlite3Fts3S
2a7a0 65 67 52 65 61 64 65 72 46 69 6e 69 73 68 28 26  egReaderFinish(&
2a7b0 63 73 72 29 3b 0a 0a 20 20 2a 70 52 63 20 3d 20  csr);..  *pRc = 
2a7c0 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 63 6b 73  rc;.  return cks
2a7d0 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  um;.}../*.** Che
2a7e0 63 6b 20 69 66 20 74 68 65 20 63 6f 6e 74 65 6e  ck if the conten
2a7f0 74 73 20 6f 66 20 74 68 65 20 46 54 53 20 69 6e  ts of the FTS in
2a800 64 65 78 20 6d 61 74 63 68 20 74 68 65 20 63 75  dex match the cu
2a810 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f  rrent contents o
2a820 66 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  f the.** content
2a830 20 74 61 62 6c 65 2e 20 49 66 20 6e 6f 20 65 72   table. If no er
2a840 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ror occurs and t
2a850 68 65 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6d  he contents do m
2a860 61 74 63 68 2c 20 73 65 74 20 2a 70 62 4f 6b 0a  atch, set *pbOk.
2a870 2a 2a 20 74 6f 20 74 72 75 65 20 61 6e 64 20 72  ** to true and r
2a880 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
2a890 20 4f 72 20 69 66 20 74 68 65 20 63 6f 6e 74 65   Or if the conte
2a8a0 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  nts do not match
2a8b0 2c 20 73 65 74 20 2a 70 62 4f 6b 0a 2a 2a 20 74  , set *pbOk.** t
2a8c0 6f 20 66 61 6c 73 65 20 62 65 66 6f 72 65 20 72  o false before r
2a8d0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
2a8e0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2a8f0 72 73 20 28 65 2e 67 2e 20 61 6e 20 4f 4f 4d 20  rs (e.g. an OOM 
2a900 6f 72 20 49 4f 20 65 72 72 6f 72 29 2c 20 72 65  or IO error), re
2a910 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
2a920 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 2e 20 54  rror .** code. T
2a930 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f  he final value o
2a940 66 20 2a 70 62 4f 6b 20 69 73 20 75 6e 64 65 66  f *pbOk is undef
2a950 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73  ined in this cas
2a960 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2a970 20 66 74 73 33 49 6e 74 65 67 72 69 74 79 43 68   fts3IntegrityCh
2a980 65 63 6b 28 46 74 73 33 54 61 62 6c 65 20 2a 70  eck(Fts3Table *p
2a990 2c 20 69 6e 74 20 2a 70 62 4f 6b 29 7b 0a 20 20  , int *pbOk){.  
2a9a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2a9b0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
2a9c0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2a9d0 2f 0a 20 20 75 36 34 20 63 6b 73 75 6d 31 20 3d  /.  u64 cksum1 =
2a9e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2a9f0 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
2aa00 62 61 73 65 64 20 6f 6e 20 46 54 53 20 69 6e 64  based on FTS ind
2aa10 65 78 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20  ex contents */. 
2aa20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d 20 30 3b   u64 cksum2 = 0;
2aa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa40 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61 73   /* Checksum bas
2aa50 65 64 20 6f 6e 20 25 5f 63 6f 6e 74 65 6e 74 20  ed on %_content 
2aa60 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 73 71  contents */.  sq
2aa70 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 41 6c 6c  lite3_stmt *pAll
2aa80 4c 61 6e 67 69 64 20 3d 20 30 3b 20 20 20 2f 2a  Langid = 0;   /*
2aa90 20 53 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 65   Statement to re
2aaa0 74 75 72 6e 20 61 6c 6c 20 6c 61 6e 67 75 61 67  turn all languag
2aab0 65 2d 69 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54  e-ids */..  /* T
2aac0 68 69 73 20 62 6c 6f 63 6b 20 63 61 6c 63 75 6c  his block calcul
2aad0 61 74 65 73 20 74 68 65 20 63 68 65 63 6b 73 75  ates the checksu
2aae0 6d 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  m according to t
2aaf0 68 65 20 46 54 53 20 69 6e 64 65 78 2e 20 2a 2f  he FTS index. */
2ab00 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
2ab10 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43  tmt(p, SQL_SELEC
2ab20 54 5f 41 4c 4c 5f 4c 41 4e 47 49 44 2c 20 26 70  T_ALL_LANGID, &p
2ab30 41 6c 6c 4c 61 6e 67 69 64 2c 20 30 29 3b 0a 20  AllLangid, 0);. 
2ab40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ab50 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  OK ){.    int rc
2ab60 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  2;.    sqlite3_b
2ab70 69 6e 64 5f 69 6e 74 28 70 41 6c 6c 4c 61 6e 67  ind_int(pAllLang
2ab80 69 64 2c 20 31 2c 20 70 2d 3e 69 50 72 65 76 4c  id, 1, p->iPrevL
2ab90 61 6e 67 69 64 29 3b 0a 20 20 20 20 73 71 6c 69  angid);.    sqli
2aba0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 41 6c  te3_bind_int(pAl
2abb0 6c 4c 61 6e 67 69 64 2c 20 32 2c 20 70 2d 3e 6e  lLangid, 2, p->n
2abc0 49 6e 64 65 78 29 3b 0a 20 20 20 20 77 68 69 6c  Index);.    whil
2abd0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
2abe0 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 65 70   && sqlite3_step
2abf0 28 70 41 6c 6c 4c 61 6e 67 69 64 29 3d 3d 53 51  (pAllLangid)==SQ
2ac00 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
2ac10 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 20 3d 20    int iLangid = 
2ac20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
2ac30 6e 74 28 70 41 6c 6c 4c 61 6e 67 69 64 2c 20 30  nt(pAllLangid, 0
2ac40 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  );.      int i;.
2ac50 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2ac60 3c 70 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b 29  <p->nIndex; i++)
2ac70 7b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 31  {.        cksum1
2ac80 20 3d 20 63 6b 73 75 6d 31 20 5e 20 66 74 73 33   = cksum1 ^ fts3
2ac90 43 68 65 63 6b 73 75 6d 49 6e 64 65 78 28 70 2c  ChecksumIndex(p,
2aca0 20 69 4c 61 6e 67 69 64 2c 20 69 2c 20 26 72 63   iLangid, i, &rc
2acb0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2acc0 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
2acd0 65 33 5f 72 65 73 65 74 28 70 41 6c 6c 4c 61 6e  e3_reset(pAllLan
2ace0 67 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gid);.    if( rc
2acf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
2ad00 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 2f   = rc2;.  }..  /
2ad10 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 63 61 6c  * This block cal
2ad20 63 75 6c 61 74 65 73 20 74 68 65 20 63 68 65 63  culates the chec
2ad30 6b 73 75 6d 20 61 63 63 6f 72 64 69 6e 67 20 74  ksum according t
2ad40 6f 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20  o the %_content 
2ad50 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 72  table */.  if( r
2ad60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2ad70 20 20 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65      sqlite3_toke
2ad80 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 63 6f 6e  nizer_module con
2ad90 73 74 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 2d  st *pModule = p-
2ada0 3e 70 54 6f 6b 65 6e 69 7a 65 72 2d 3e 70 4d 6f  >pTokenizer->pMo
2adb0 64 75 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  dule;.    sqlite
2adc0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
2add0 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  0;.    char *zSq
2ade0 6c 3b 0a 20 20 20 0a 20 20 20 20 7a 53 71 6c 20  l;.   .    zSql 
2adf0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2ae00 66 28 22 53 45 4c 45 43 54 20 25 73 22 20 2c 20  f("SELECT %s" , 
2ae10 70 2d 3e 7a 52 65 61 64 45 78 70 72 6c 69 73 74  p->zReadExprlist
2ae20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 53 71 6c  );.    if( !zSql
2ae30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
2ae40 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2ae50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2ae60 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
2ae70 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71  re_v2(p->db, zSq
2ae80 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
2ae90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2aea0 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
2aeb0 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72   }..    while( r
2aec0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2aed0 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
2aee0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
2aef0 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 44 6f  ){.      i64 iDo
2af00 63 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  cid = sqlite3_co
2af10 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
2af20 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  , 0);.      int 
2af30 69 4c 61 6e 67 20 3d 20 6c 61 6e 67 69 64 46 72  iLang = langidFr
2af40 6f 6d 53 65 6c 65 63 74 28 70 2c 20 70 53 74 6d  omSelect(p, pStm
2af50 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  t);.      int iC
2af60 6f 6c 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69  ol;..      for(i
2af70 43 6f 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  Col=0; rc==SQLIT
2af80 45 5f 4f 4b 20 26 26 20 69 43 6f 6c 3c 70 2d 3e  E_OK && iCol<p->
2af90 6e 43 6f 6c 75 6d 6e 3b 20 69 43 6f 6c 2b 2b 29  nColumn; iCol++)
2afa0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
2afb0 3e 61 62 4e 6f 74 69 6e 64 65 78 65 64 5b 69 43  >abNotindexed[iC
2afc0 6f 6c 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ol]==0 ){.      
2afd0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2afe0 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63  zText = (const c
2aff0 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f  har *)sqlite3_co
2b000 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
2b010 20 69 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20   iCol+1);.      
2b020 20 20 20 20 69 6e 74 20 6e 54 65 78 74 20 3d 20      int nText = 
2b030 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
2b040 79 74 65 73 28 70 53 74 6d 74 2c 20 69 43 6f 6c  ytes(pStmt, iCol
2b050 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  +1);.          s
2b060 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
2b070 5f 63 75 72 73 6f 72 20 2a 70 54 20 3d 20 30 3b  _cursor *pT = 0;
2b080 0a 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ..          rc =
2b090 20 73 71 6c 69 74 65 33 46 74 73 33 4f 70 65 6e   sqlite3Fts3Open
2b0a0 54 6f 6b 65 6e 69 7a 65 72 28 70 2d 3e 70 54 6f  Tokenizer(p->pTo
2b0b0 6b 65 6e 69 7a 65 72 2c 20 69 4c 61 6e 67 2c 20  kenizer, iLang, 
2b0c0 7a 54 65 78 74 2c 20 6e 54 65 78 74 2c 26 70 54  zText, nText,&pT
2b0d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  );.          whi
2b0e0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
2b0f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2b100 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 6f   char const *zTo
2b110 6b 65 6e 3b 20 20 20 20 20 20 20 2f 2a 20 42 75  ken;       /* Bu
2b120 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
2b130 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20  token */.       
2b140 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 20       int nToken 
2b150 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
2b160 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
2b170 73 20 69 6e 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  s in token */.  
2b180 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
2b190 75 6d 31 20 3d 20 30 2c 20 69 44 75 6d 32 20 3d  um1 = 0, iDum2 =
2b1a0 20 30 3b 20 2f 2a 20 44 75 6d 6d 79 20 76 61 72   0; /* Dummy var
2b1b0 69 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20  iables */.      
2b1c0 20 20 20 20 20 20 69 6e 74 20 69 50 6f 73 20 3d        int iPos =
2b1d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2b1e0 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74  /* Position of t
2b1f0 6f 6b 65 6e 20 69 6e 20 7a 54 65 78 74 20 2a 2f  oken in zText */
2b200 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ..            rc
2b210 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78   = pModule->xNex
2b220 74 28 70 54 2c 20 26 7a 54 6f 6b 65 6e 2c 20 26  t(pT, &zToken, &
2b230 6e 54 6f 6b 65 6e 2c 20 26 69 44 75 6d 31 2c 20  nToken, &iDum1, 
2b240 26 69 44 75 6d 32 2c 20 26 69 50 6f 73 29 3b 0a  &iDum2, &iPos);.
2b250 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2b260 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2b270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2b280 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  nt i;.          
2b290 20 20 20 20 63 6b 73 75 6d 32 20 3d 20 63 6b 73      cksum2 = cks
2b2a0 75 6d 32 20 5e 20 66 74 73 33 43 68 65 63 6b 73  um2 ^ fts3Checks
2b2b0 75 6d 45 6e 74 72 79 28 0a 20 20 20 20 20 20 20  umEntry(.       
2b2c0 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 6b 65             zToke
2b2d0 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 69 4c 61 6e 67  n, nToken, iLang
2b2e0 2c 20 30 2c 20 69 44 6f 63 69 64 2c 20 69 43 6f  , 0, iDocid, iCo
2b2f0 6c 2c 20 69 50 6f 73 0a 20 20 20 20 20 20 20 20  l, iPos.        
2b300 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
2b310 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
2b320 69 3c 70 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b  i<p->nIndex; i++
2b330 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2b340 20 20 20 69 66 28 20 70 2d 3e 61 49 6e 64 65 78     if( p->aIndex
2b350 5b 69 5d 2e 6e 50 72 65 66 69 78 3c 3d 6e 54 6f  [i].nPrefix<=nTo
2b360 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ken ){.         
2b370 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d 32 20           cksum2 
2b380 3d 20 63 6b 73 75 6d 32 20 5e 20 66 74 73 33 43  = cksum2 ^ fts3C
2b390 68 65 63 6b 73 75 6d 45 6e 74 72 79 28 0a 20 20  hecksumEntry(.  
2b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3b0 20 20 20 20 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 61      zToken, p->a
2b3c0 49 6e 64 65 78 5b 69 5d 2e 6e 50 72 65 66 69 78  Index[i].nPrefix
2b3d0 2c 20 69 4c 61 6e 67 2c 20 69 2c 20 69 44 6f 63  , iLang, i, iDoc
2b3e0 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 0a 20  id, iCol, iPos. 
2b3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b400 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2b410 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2b420 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2b430 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
2b440 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
2b450 20 29 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f   ) pModule->xClo
2b460 73 65 28 70 54 29 3b 0a 20 20 20 20 20 20 20 20  se(pT);.        
2b470 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2b480 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c  _DONE ) rc = SQL
2b490 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
2b4a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2b4b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
2b4c0 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
2b4d0 7d 0a 0a 20 20 2a 70 62 4f 6b 20 3d 20 28 63 6b  }..  *pbOk = (ck
2b4e0 73 75 6d 31 3d 3d 63 6b 73 75 6d 32 29 3b 0a 20  sum1==cksum2);. 
2b4f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2b500 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 69 6e 74  *.** Run the int
2b510 65 67 72 69 74 79 2d 63 68 65 63 6b 2e 20 49 66  egrity-check. If
2b520 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
2b530 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
2b540 20 63 6f 6e 74 65 6e 74 73 20 6f 66 0a 2a 2a 20   contents of.** 
2b550 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 61 72  the FTS index ar
2b560 65 20 63 6f 72 72 65 63 74 2c 20 72 65 74 75 72  e correct, retur
2b570 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 72 2c  n SQLITE_OK. Or,
2b580 20 69 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   if the contents
2b590 20 6f 66 20 74 68 65 0a 2a 2a 20 46 54 53 20 69   of the.** FTS i
2b5a0 6e 64 65 78 20 61 72 65 20 69 6e 63 6f 72 72 65  ndex are incorre
2b5b0 63 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ct, return SQLIT
2b5c0 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 2e 0a  E_CORRUPT_VTAB..
2b5d0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 61 6e 20  **.** Or, if an 
2b5e0 65 72 72 6f 72 20 28 65 2e 67 2e 20 61 6e 20 4f  error (e.g. an O
2b5f0 4f 4d 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20  OM or IO error) 
2b600 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61  occurs, return a
2b610 6e 20 53 51 4c 69 74 65 20 0a 2a 2a 20 65 72 72  n SQLite .** err
2b620 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  or code..**.** T
2b630 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65  he integrity-che
2b640 63 6b 20 77 6f 72 6b 73 20 61 73 20 66 6f 6c 6c  ck works as foll
2b650 6f 77 73 2e 20 46 6f 72 20 65 61 63 68 20 74 6f  ows. For each to
2b660 6b 65 6e 20 61 6e 64 20 69 6e 64 65 78 65 64 20  ken and indexed 
2b670 74 6f 6b 65 6e 0a 2a 2a 20 70 72 65 66 69 78 20  token.** prefix 
2b680 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20  in the document 
2b690 73 65 74 2c 20 61 20 36 34 2d 62 69 74 20 63 68  set, a 64-bit ch
2b6a0 65 63 6b 73 75 6d 20 69 73 20 63 61 6c 63 75 6c  ecksum is calcul
2b6b0 61 74 65 64 20 28 62 79 20 63 6f 64 65 0a 2a 2a  ated (by code.**
2b6c0 20 69 6e 20 66 74 73 33 43 68 65 63 6b 73 75 6d   in fts3Checksum
2b6d0 45 6e 74 72 79 28 29 29 20 62 61 73 65 64 20 6f  Entry()) based o
2b6e0 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  n the following:
2b6f0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20 54 68 65  .**.**     + The
2b700 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 28 30   index number (0
2b710 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 69 6e   for the main in
2b720 64 65 78 2c 20 31 20 66 6f 72 20 74 68 65 20 66  dex, 1 for the f
2b730 69 72 73 74 20 70 72 65 66 69 78 0a 2a 2a 20 20  irst prefix.**  
2b740 20 20 20 20 20 69 6e 64 65 78 20 65 74 63 2e 29       index etc.)
2b750 2c 0a 2a 2a 20 20 20 20 20 2b 20 54 68 65 20 74  ,.**     + The t
2b760 6f 6b 65 6e 20 28 6f 72 20 74 6f 6b 65 6e 20 70  oken (or token p
2b770 72 65 66 69 78 29 20 74 65 78 74 20 69 74 73 65  refix) text itse
2b780 6c 66 2c 20 0a 2a 2a 20 20 20 20 20 2b 20 54 68  lf, .**     + Th
2b790 65 20 6c 61 6e 67 75 61 67 65 2d 69 64 20 6f 66  e language-id of
2b7a0 20 74 68 65 20 72 6f 77 20 69 74 20 61 70 70 65   the row it appe
2b7b0 61 72 73 20 69 6e 2c 0a 2a 2a 20 20 20 20 20 2b  ars in,.**     +
2b7c0 20 54 68 65 20 64 6f 63 69 64 20 6f 66 20 74 68   The docid of th
2b7d0 65 20 72 6f 77 20 69 74 20 61 70 70 65 61 72 73  e row it appears
2b7e0 20 69 6e 2c 0a 2a 2a 20 20 20 20 20 2b 20 54 68   in,.**     + Th
2b7f0 65 20 63 6f 6c 75 6d 6e 20 69 74 20 61 70 70 65  e column it appe
2b800 61 72 73 20 69 6e 2c 20 61 6e 64 0a 2a 2a 20 20  ars in, and.**  
2b810 20 20 20 2b 20 54 68 65 20 74 6f 6b 65 6e 73 20     + The tokens 
2b820 70 6f 73 69 74 69 6f 6e 20 77 69 74 68 69 6e 20  position within 
2b830 74 68 61 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a  that column..**.
2b840 2a 2a 20 54 68 65 20 63 68 65 63 6b 73 75 6d 73  ** The checksums
2b850 20 66 6f 72 20 61 6c 6c 20 65 6e 74 72 69 65 73   for all entries
2b860 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72   in the index ar
2b870 65 20 58 4f 52 65 64 20 74 6f 67 65 74 68 65 72  e XORed together
2b880 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20 61 20   to create.** a 
2b890 73 69 6e 67 6c 65 20 63 68 65 63 6b 73 75 6d 20  single checksum 
2b8a0 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 69  for the entire i
2b8b0 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ndex..**.** The 
2b8c0 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20  integrity-check 
2b8d0 63 6f 64 65 20 63 61 6c 63 75 6c 61 74 65 73 20  code calculates 
2b8e0 74 68 65 20 73 61 6d 65 20 63 68 65 63 6b 73 75  the same checksu
2b8f0 6d 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a  m in two ways:.*
2b900 2a 0a 2a 2a 20 20 20 20 20 31 2e 20 42 79 20 73  *.**     1. By s
2b910 63 61 6e 6e 69 6e 67 20 74 68 65 20 63 6f 6e 74  canning the cont
2b920 65 6e 74 73 20 6f 66 20 74 68 65 20 46 54 53 20  ents of the FTS 
2b930 69 6e 64 65 78 2c 20 61 6e 64 20 0a 2a 2a 20 20  index, and .**  
2b940 20 20 20 32 2e 20 42 79 20 73 63 61 6e 6e 69 6e     2. By scannin
2b950 67 20 61 6e 64 20 74 6f 6b 65 6e 69 7a 69 6e 67  g and tokenizing
2b960 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 74 61 62   the content tab
2b970 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
2b980 20 74 77 6f 20 63 68 65 63 6b 73 75 6d 73 20 61   two checksums a
2b990 72 65 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68  re identical, th
2b9a0 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63  e integrity-chec
2b9b0 6b 20 69 73 20 64 65 65 6d 65 64 20 74 6f 20 68  k is deemed to h
2b9c0 61 76 65 0a 2a 2a 20 70 61 73 73 65 64 2e 0a 2a  ave.** passed..*
2b9d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
2b9e0 33 44 6f 49 6e 74 65 67 72 69 74 79 43 68 65 63  3DoIntegrityChec
2b9f0 6b 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  k(.  Fts3Table *
2ba00 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
2ba10 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62       /* FTS3 tab
2ba20 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a  le handle */.){.
2ba30 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
2ba40 62 4f 6b 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  bOk = 0;.  rc = 
2ba50 66 74 73 33 49 6e 74 65 67 72 69 74 79 43 68 65  fts3IntegrityChe
2ba60 63 6b 28 70 2c 20 26 62 4f 6b 29 3b 0a 20 20 69  ck(p, &bOk);.  i
2ba70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ba80 20 26 26 20 62 4f 6b 3d 3d 30 20 29 20 72 63 20   && bOk==0 ) rc 
2ba90 3d 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 54  = FTS_CORRUPT_VT
2baa0 41 42 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  AB;.  return rc;
2bab0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65  .}../*.** Handle
2bac0 20 61 20 27 73 70 65 63 69 61 6c 27 20 49 4e 53   a 'special' INS
2bad0 45 52 54 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  ERT of the form:
2bae0 0a 2a 2a 0a 2a 2a 20 20 20 22 49 4e 53 45 52 54  .**.**   "INSERT
2baf0 20 49 4e 54 4f 20 74 62 6c 28 74 62 6c 29 20 56   INTO tbl(tbl) V
2bb00 41 4c 55 45 53 28 3c 65 78 70 72 3e 29 22 0a 2a  ALUES(<expr>)".*
2bb10 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 56  *.** Argument pV
2bb20 61 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  al contains the 
2bb30 72 65 73 75 6c 74 20 6f 66 20 3c 65 78 70 72 3e  result of <expr>
2bb40 2e 20 43 75 72 72 65 6e 74 6c 79 20 74 68 65 20  . Currently the 
2bb50 6f 6e 6c 79 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67  only .** meaning
2bb60 66 75 6c 20 76 61 6c 75 65 20 74 6f 20 69 6e 73  ful value to ins
2bb70 65 72 74 20 69 73 20 74 68 65 20 74 65 78 74 20  ert is the text 
2bb80 27 6f 70 74 69 6d 69 7a 65 27 2e 0a 2a 2f 0a 73  'optimize'..*/.s
2bb90 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 70  tatic int fts3Sp
2bba0 65 63 69 61 6c 49 6e 73 65 72 74 28 46 74 73 33  ecialInsert(Fts3
2bbb0 54 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74 65  Table *p, sqlite
2bbc0 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 29 7b 0a  3_value *pVal){.
2bbd0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2bbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bbf0 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
2bc00 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2bc10 20 2a 7a 56 61 6c 20 3d 20 28 63 6f 6e 73 74 20   *zVal = (const 
2bc20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76  char *)sqlite3_v
2bc30 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 3b  alue_text(pVal);
2bc40 0a 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71  .  int nVal = sq
2bc50 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
2bc60 73 28 70 56 61 6c 29 3b 0a 0a 20 20 69 66 28 20  s(pVal);..  if( 
2bc70 21 7a 56 61 6c 20 29 7b 0a 20 20 20 20 72 65 74  !zVal ){.    ret
2bc80 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2bc90 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56  ;.  }else if( nV
2bca0 61 6c 3d 3d 38 20 26 26 20 30 3d 3d 73 71 6c 69  al==8 && 0==sqli
2bcb0 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61  te3_strnicmp(zVa
2bcc0 6c 2c 20 22 6f 70 74 69 6d 69 7a 65 22 2c 20 38  l, "optimize", 8
2bcd0 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  ) ){.    rc = ft
2bce0 73 33 44 6f 4f 70 74 69 6d 69 7a 65 28 70 2c 20  s3DoOptimize(p, 
2bcf0 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  0);.  }else if( 
2bd00 6e 56 61 6c 3d 3d 37 20 26 26 20 30 3d 3d 73 71  nVal==7 && 0==sq
2bd10 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a  lite3_strnicmp(z
2bd20 56 61 6c 2c 20 22 72 65 62 75 69 6c 64 22 2c 20  Val, "rebuild", 
2bd30 37 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  7) ){.    rc = f
2bd40 74 73 33 44 6f 52 65 62 75 69 6c 64 28 70 29 3b  ts3DoRebuild(p);
2bd50 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 61  .  }else if( nVa
2bd60 6c 3d 3d 31 35 20 26 26 20 30 3d 3d 73 71 6c 69  l==15 && 0==sqli
2bd70 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61  te3_strnicmp(zVa
2bd80 6c 2c 20 22 69 6e 74 65 67 72 69 74 79 2d 63 68  l, "integrity-ch
2bd90 65 63 6b 22 2c 20 31 35 29 20 29 7b 0a 20 20 20  eck", 15) ){.   
2bda0 20 72 63 20 3d 20 66 74 73 33 44 6f 49 6e 74 65   rc = fts3DoInte
2bdb0 67 72 69 74 79 43 68 65 63 6b 28 70 29 3b 0a 20  grityCheck(p);. 
2bdc0 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 61 6c 3e   }else if( nVal>
2bdd0 36 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f  6 && 0==sqlite3_
2bde0 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22  strnicmp(zVal, "
2bdf0 6d 65 72 67 65 3d 22 2c 20 36 29 20 29 7b 0a 20  merge=", 6) ){. 
2be00 20 20 20 72 63 20 3d 20 66 74 73 33 44 6f 49 6e     rc = fts3DoIn
2be10 63 72 6d 65 72 67 65 28 70 2c 20 26 7a 56 61 6c  crmerge(p, &zVal
2be20 5b 36 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  [6]);.  }else if
2be30 28 20 6e 56 61 6c 3e 31 30 20 26 26 20 30 3d 3d  ( nVal>10 && 0==
2be40 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
2be50 28 7a 56 61 6c 2c 20 22 61 75 74 6f 6d 65 72 67  (zVal, "automerg
2be60 65 3d 22 2c 20 31 30 29 20 29 7b 0a 20 20 20 20  e=", 10) ){.    
2be70 72 63 20 3d 20 66 74 73 33 44 6f 41 75 74 6f 69  rc = fts3DoAutoi
2be80 6e 63 72 6d 65 72 67 65 28 70 2c 20 26 7a 56 61  ncrmerge(p, &zVa
2be90 6c 5b 31 30 5d 29 3b 0a 23 69 66 64 65 66 20 53  l[10]);.#ifdef S
2bea0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7d 65 6c  QLITE_TEST.  }el
2beb0 73 65 20 69 66 28 20 6e 56 61 6c 3e 39 20 26 26  se if( nVal>9 &&
2bec0 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e   0==sqlite3_strn
2bed0 69 63 6d 70 28 7a 56 61 6c 2c 20 22 6e 6f 64 65  icmp(zVal, "node
2bee0 73 69 7a 65 3d 22 2c 20 39 29 20 29 7b 0a 20 20  size=", 9) ){.  
2bef0 20 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 3d    p->nNodeSize =
2bf00 20 61 74 6f 69 28 26 7a 56 61 6c 5b 39 5d 29 3b   atoi(&zVal[9]);
2bf10 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2bf20 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _OK;.  }else if(
2bf30 20 6e 56 61 6c 3e 31 31 20 26 26 20 30 3d 3d 73   nVal>11 && 0==s
2bf40 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
2bf50 7a 56 61 6c 2c 20 22 6d 61 78 70 65 6e 64 69 6e  zVal, "maxpendin
2bf60 67 3d 22 2c 20 39 29 20 29 7b 0a 20 20 20 20 70  g=", 9) ){.    p
2bf70 2d 3e 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61 74  ->nMaxPendingDat
2bf80 61 20 3d 20 61 74 6f 69 28 26 7a 56 61 6c 5b 31  a = atoi(&zVal[1
2bf90 31 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  1]);.    rc = SQ
2bfa0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2bfb0 20 69 66 28 20 6e 56 61 6c 3e 32 31 20 26 26 20   if( nVal>21 && 
2bfc0 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  0==sqlite3_strni
2bfd0 63 6d 70 28 7a 56 61 6c 2c 20 22 74 65 73 74 2d  cmp(zVal, "test-
2bfe0 6e 6f 2d 69 6e 63 72 2d 64 6f 63 6c 69 73 74 3d  no-incr-doclist=
2bff0 22 2c 20 32 31 29 20 29 7b 0a 20 20 20 20 70 2d  ", 21) ){.    p-
2c000 3e 62 4e 6f 49 6e 63 72 44 6f 63 6c 69 73 74 20  >bNoIncrDoclist 
2c010 3d 20 61 74 6f 69 28 26 7a 56 61 6c 5b 32 31 5d  = atoi(&zVal[21]
2c020 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
2c030 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 20 20  TE_OK;.#endif.  
2c040 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
2c050 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2c060 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2c070 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
2c080 45 5f 44 49 53 41 42 4c 45 5f 46 54 53 34 5f 44  E_DISABLE_FTS4_D
2c090 45 46 45 52 52 45 44 0a 2f 2a 0a 2a 2a 20 44 65  EFERRED./*.** De
2c0a0 6c 65 74 65 20 61 6c 6c 20 63 61 63 68 65 64 20  lete all cached 
2c0b0 64 65 66 65 72 72 65 64 20 64 6f 63 6c 69 73 74  deferred doclist
2c0c0 73 2e 20 44 65 66 65 72 72 65 64 20 64 6f 63 6c  s. Deferred docl
2c0d0 69 73 74 73 20 61 72 65 20 63 61 63 68 65 64 0a  ists are cached.
2c0e0 2a 2a 20 28 61 6c 6c 6f 63 61 74 65 64 29 20 62  ** (allocated) b
2c0f0 79 20 74 68 65 20 73 71 6c 69 74 65 33 46 74 73  y the sqlite3Fts
2c100 33 43 61 63 68 65 44 65 66 65 72 72 65 64 44 6f  3CacheDeferredDo
2c110 63 6c 69 73 74 73 28 29 20 66 75 6e 63 74 69 6f  clists() functio
2c120 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
2c130 65 33 46 74 73 33 46 72 65 65 44 65 66 65 72 72  e3Fts3FreeDeferr
2c140 65 64 44 6f 63 6c 69 73 74 73 28 46 74 73 33 43  edDoclists(Fts3C
2c150 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20  ursor *pCsr){.  
2c160 46 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65  Fts3DeferredToke
2c170 6e 20 2a 70 44 65 66 3b 0a 20 20 66 6f 72 28 70  n *pDef;.  for(p
2c180 44 65 66 3d 70 43 73 72 2d 3e 70 44 65 66 65 72  Def=pCsr->pDefer
2c190 72 65 64 3b 20 70 44 65 66 3b 20 70 44 65 66 3d  red; pDef; pDef=
2c1a0 70 44 65 66 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pDef->pNext){.  
2c1b0 20 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73    fts3PendingLis
2c1c0 74 44 65 6c 65 74 65 28 70 44 65 66 2d 3e 70 4c  tDelete(pDef->pL
2c1d0 69 73 74 29 3b 0a 20 20 20 20 70 44 65 66 2d 3e  ist);.    pDef->
2c1e0 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d  pList = 0;.  }.}
2c1f0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
2c200 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
2c210 70 43 73 72 2d 3e 70 44 65 66 66 65 72 65 64 20  pCsr->pDeffered 
2c220 6c 69 73 74 2e 20 45 6e 74 72 69 65 73 20 61 72  list. Entries ar
2c230 65 20 61 64 64 65 64 20 74 6f 20 0a 2a 2a 20 74  e added to .** t
2c240 68 69 73 20 6c 69 73 74 20 75 73 69 6e 67 20 73  his list using s
2c250 71 6c 69 74 65 33 46 74 73 33 44 65 66 65 72 54  qlite3Fts3DeferT
2c260 6f 6b 65 6e 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  oken()..*/.void 
2c270 73 71 6c 69 74 65 33 46 74 73 33 46 72 65 65 44  sqlite3Fts3FreeD
2c280 65 66 65 72 72 65 64 54 6f 6b 65 6e 73 28 46 74  eferredTokens(Ft
2c290 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b  s3Cursor *pCsr){
2c2a0 0a 20 20 46 74 73 33 44 65 66 65 72 72 65 64 54  .  Fts3DeferredT
2c2b0 6f 6b 65 6e 20 2a 70 44 65 66 3b 0a 20 20 46 74  oken *pDef;.  Ft
2c2c0 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20  s3DeferredToken 
2c2d0 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 44  *pNext;.  for(pD
2c2e0 65 66 3d 70 43 73 72 2d 3e 70 44 65 66 65 72 72  ef=pCsr->pDeferr
2c2f0 65 64 3b 20 70 44 65 66 3b 20 70 44 65 66 3d 70  ed; pDef; pDef=p
2c300 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
2c310 20 3d 20 70 44 65 66 2d 3e 70 4e 65 78 74 3b 0a   = pDef->pNext;.
2c320 20 20 20 20 66 74 73 33 50 65 6e 64 69 6e 67 4c      fts3PendingL
2c330 69 73 74 44 65 6c 65 74 65 28 70 44 65 66 2d 3e  istDelete(pDef->
2c340 70 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  pList);.    sqli
2c350 74 65 33 5f 66 72 65 65 28 70 44 65 66 29 3b 0a  te3_free(pDef);.
2c360 20 20 7d 0a 20 20 70 43 73 72 2d 3e 70 44 65 66    }.  pCsr->pDef
2c370 65 72 72 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  erred = 0;.}../*
2c380 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 64 65 66  .** Generate def
2c390 65 72 72 65 64 2d 64 6f 63 6c 69 73 74 73 20 66  erred-doclists f
2c3a0 6f 72 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 69 6e  or all tokens in
2c3b0 20 74 68 65 20 70 43 73 72 2d 3e 70 44 65 66 65   the pCsr->pDefe
2c3c0 72 72 65 64 20 6c 69 73 74 0a 2a 2a 20 62 61 73  rred list.** bas
2c3d0 65 64 20 6f 6e 20 74 68 65 20 72 6f 77 20 74 68  ed on the row th
2c3e0 61 74 20 70 43 73 72 20 63 75 72 72 65 6e 74 6c  at pCsr currentl
2c3f0 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a  y points to..**.
2c400 2a 2a 20 41 20 64 65 66 65 72 72 65 64 2d 64 6f  ** A deferred-do
2c410 63 6c 69 73 74 20 69 73 20 6c 69 6b 65 20 61 6e  clist is like an
2c420 79 20 6f 74 68 65 72 20 64 6f 63 6c 69 73 74 20  y other doclist 
2c430 77 69 74 68 20 70 6f 73 69 74 69 6f 6e 20 69 6e  with position in
2c440 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 63  formation.** inc
2c450 6c 75 64 65 64 2c 20 65 78 63 65 70 74 20 74 68  luded, except th
2c460 61 74 20 69 74 20 6f 6e 6c 79 20 63 6f 6e 74 61  at it only conta
2c470 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ins entries for 
2c480 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
2c490 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 6e 6f  the.** table, no
2c4a0 74 20 66 6f 72 20 61 6c 6c 20 72 6f 77 73 2e 0a  t for all rows..
2c4b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
2c4c0 73 33 43 61 63 68 65 44 65 66 65 72 72 65 64 44  s3CacheDeferredD
2c4d0 6f 63 6c 69 73 74 73 28 46 74 73 33 43 75 72 73  oclists(Fts3Curs
2c4e0 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74  or *pCsr){.  int
2c4f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2c500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c510 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2c520 20 69 66 28 20 70 43 73 72 2d 3e 70 44 65 66 65   if( pCsr->pDefe
2c530 72 72 65 64 20 29 7b 0a 20 20 20 20 69 6e 74 20  rred ){.    int 
2c540 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
2c550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2c560 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
2c570 6f 75 67 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d  ough table colum
2c580 6e 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ns */.    sqlite
2c590 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 3b 20  3_int64 iDocid; 
2c5a0 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 69 64          /* Docid
2c5b0 20 6f 66 20 74 68 65 20 72 6f 77 20 70 43 73 72   of the row pCsr
2c5c0 20 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 20 20   points to */.  
2c5d0 20 20 46 74 73 33 44 65 66 65 72 72 65 64 54 6f    Fts3DeferredTo
2c5e0 6b 65 6e 20 2a 70 44 65 66 3b 20 20 20 20 20 20  ken *pDef;      
2c5f0 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
2c600 74 65 20 74 68 72 6f 75 67 68 20 64 65 66 65 72  te through defer
2c610 72 65 64 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20  red tokens */.  
2c620 0a 20 20 20 20 46 74 73 33 54 61 62 6c 65 20 2a  .    Fts3Table *
2c630 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65 20 2a  p = (Fts3Table *
2c640 29 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61  )pCsr->base.pVta
2c650 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74  b;.    sqlite3_t
2c660 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 20 3d 20 70  okenizer *pT = p
2c670 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20  ->pTokenizer;.  
2c680 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69    sqlite3_tokeni
2c690 7a 65 72 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73 74  zer_module const
2c6a0 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 54 2d 3e   *pModule = pT->
2c6b0 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 0a 20 20 20  pModule;.   .   
2c6c0 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 69   assert( pCsr->i
2c6d0 73 52 65 71 75 69 72 65 53 65 65 6b 3d 3d 30 20  sRequireSeek==0 
2c6e0 29 3b 0a 20 20 20 20 69 44 6f 63 69 64 20 3d 20  );.    iDocid = 
2c6f0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
2c700 6e 74 36 34 28 70 43 73 72 2d 3e 70 53 74 6d 74  nt64(pCsr->pStmt
2c710 2c 20 30 29 3b 0a 20 20 0a 20 20 20 20 66 6f 72  , 0);.  .    for
2c720 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 75  (i=0; i<p->nColu
2c730 6d 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  mn && rc==SQLITE
2c740 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  _OK; i++){.     
2c750 20 69 66 28 20 70 2d 3e 61 62 4e 6f 74 69 6e 64   if( p->abNotind
2c760 65 78 65 64 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  exed[i]==0 ){.  
2c770 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2c780 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74   *zText = (const
2c790 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f   char *)sqlite3_
2c7a0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 43 73 72  column_text(pCsr
2c7b0 2d 3e 70 53 74 6d 74 2c 20 69 2b 31 29 3b 0a 20  ->pStmt, i+1);. 
2c7c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74         sqlite3_t
2c7d0 6f 6b 65 6e 69 7a 65 72 5f 63 75 72 73 6f 72 20  okenizer_cursor 
2c7e0 2a 70 54 43 20 3d 20 30 3b 0a 0a 20 20 20 20 20  *pTC = 0;..     
2c7f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
2c800 74 73 33 4f 70 65 6e 54 6f 6b 65 6e 69 7a 65 72  ts3OpenTokenizer
2c810 28 70 54 2c 20 70 43 73 72 2d 3e 69 4c 61 6e 67  (pT, pCsr->iLang
2c820 69 64 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26  id, zText, -1, &
2c830 70 54 43 29 3b 0a 20 20 20 20 20 20 20 20 77 68  pTC);.        wh
2c840 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
2c850 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2c860 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 6f 6b  char const *zTok
2c870 65 6e 3b 20 20 20 20 20 20 20 2f 2a 20 42 75 66  en;       /* Buf
2c880 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
2c890 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  oken */.        
2c8a0 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 3d 20 30    int nToken = 0
2c8b0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
2c8c0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
2c8d0 6e 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 20  n token */.     
2c8e0 20 20 20 20 20 69 6e 74 20 69 44 75 6d 31 20 3d       int iDum1 =
2c8f0 20 30 2c 20 69 44 75 6d 32 20 3d 20 30 3b 20 2f   0, iDum2 = 0; /
2c900 2a 20 44 75 6d 6d 79 20 76 61 72 69 61 62 6c 65  * Dummy variable
2c910 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  s */.          i
2c920 6e 74 20 69 50 6f 73 20 3d 20 30 3b 20 20 20 20  nt iPos = 0;    
2c930 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69           /* Posi
2c940 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 69 6e  tion of token in
2c950 20 7a 54 65 78 74 20 2a 2f 0a 0a 20 20 20 20 20   zText */..     
2c960 20 20 20 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c       rc = pModul
2c970 65 2d 3e 78 4e 65 78 74 28 70 54 43 2c 20 26 7a  e->xNext(pTC, &z
2c980 54 6f 6b 65 6e 2c 20 26 6e 54 6f 6b 65 6e 2c 20  Token, &nToken, 
2c990 26 69 44 75 6d 31 2c 20 26 69 44 75 6d 32 2c 20  &iDum1, &iDum2, 
2c9a0 26 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20  &iPos);.        
2c9b0 20 20 66 6f 72 28 70 44 65 66 3d 70 43 73 72 2d    for(pDef=pCsr-
2c9c0 3e 70 44 65 66 65 72 72 65 64 3b 20 70 44 65 66  >pDeferred; pDef
2c9d0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2c9e0 4b 3b 20 70 44 65 66 3d 70 44 65 66 2d 3e 70 4e  K; pDef=pDef->pN
2c9f0 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ext){.          
2ca00 20 20 46 74 73 33 50 68 72 61 73 65 54 6f 6b 65    Fts3PhraseToke
2ca10 6e 20 2a 70 50 54 20 3d 20 70 44 65 66 2d 3e 70  n *pPT = pDef->p
2ca20 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20  Token;.         
2ca30 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 69 43     if( (pDef->iC
2ca40 6f 6c 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 7c  ol>=p->nColumn |
2ca50 7c 20 70 44 65 66 2d 3e 69 43 6f 6c 3d 3d 69 29  | pDef->iCol==i)
2ca60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ca70 20 26 26 20 28 70 50 54 2d 3e 62 46 69 72 73 74   && (pPT->bFirst
2ca80 3d 3d 30 20 7c 7c 20 69 50 6f 73 3d 3d 30 29 0a  ==0 || iPos==0).
2ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2caa0 26 26 20 28 70 50 54 2d 3e 6e 3d 3d 6e 54 6f 6b  && (pPT->n==nTok
2cab0 65 6e 20 7c 7c 20 28 70 50 54 2d 3e 69 73 50 72  en || (pPT->isPr
2cac0 65 66 69 78 20 26 26 20 70 50 54 2d 3e 6e 3c 6e  efix && pPT->n<n
2cad0 54 6f 6b 65 6e 29 29 0a 20 20 20 20 20 20 20 20  Token)).        
2cae0 20 20 20 20 20 20 20 20 26 26 20 28 30 3d 3d 6d          && (0==m
2caf0 65 6d 63 6d 70 28 7a 54 6f 6b 65 6e 2c 20 70 50  emcmp(zToken, pP
2cb00 54 2d 3e 7a 2c 20 70 50 54 2d 3e 6e 29 29 0a 20  T->z, pPT->n)). 
2cb10 20 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a               ){.
2cb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74                ft
2cb30 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70  s3PendingListApp
2cb40 65 6e 64 28 26 70 44 65 66 2d 3e 70 4c 69 73 74  end(&pDef->pList
2cb50 2c 20 69 44 6f 63 69 64 2c 20 69 2c 20 69 50 6f  , iDocid, i, iPo
2cb60 73 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  s, &rc);.       
2cb70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2cb80 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2cb90 20 20 20 20 20 69 66 28 20 70 54 43 20 29 20 70       if( pTC ) p
2cba0 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70  Module->xClose(p
2cbb0 54 43 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  TC);.        if(
2cbc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
2cbd0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f   ) rc = SQLITE_O
2cbe0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
2cbf0 0a 0a 20 20 20 20 66 6f 72 28 70 44 65 66 3d 70  ..    for(pDef=p
2cc00 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64 3b 20  Csr->pDeferred; 
2cc10 70 44 65 66 20 26 26 20 72 63 3d 3d 53 51 4c 49  pDef && rc==SQLI
2cc20 54 45 5f 4f 4b 3b 20 70 44 65 66 3d 70 44 65 66  TE_OK; pDef=pDef
2cc30 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
2cc40 69 66 28 20 70 44 65 66 2d 3e 70 4c 69 73 74 20  if( pDef->pList 
2cc50 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2cc60 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41  fts3PendingListA
2cc70 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 44 65  ppendVarint(&pDe
2cc80 66 2d 3e 70 4c 69 73 74 2c 20 30 29 3b 0a 20 20  f->pList, 0);.  
2cc90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2cca0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ccb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
2ccc0 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 4c 69 73  DeferredTokenLis
2ccd0 74 28 0a 20 20 46 74 73 33 44 65 66 65 72 72 65  t(.  Fts3Deferre
2cce0 64 54 6f 6b 65 6e 20 2a 70 2c 20 0a 20 20 63 68  dToken *p, .  ch
2ccf0 61 72 20 2a 2a 70 70 44 61 74 61 2c 20 0a 20 20  ar **ppData, .  
2cd00 69 6e 74 20 2a 70 6e 44 61 74 61 0a 29 7b 0a 20  int *pnData.){. 
2cd10 20 63 68 61 72 20 2a 70 52 65 74 3b 0a 20 20 69   char *pRet;.  i
2cd20 6e 74 20 6e 53 6b 69 70 3b 0a 20 20 73 71 6c 69  nt nSkip;.  sqli
2cd30 74 65 33 5f 69 6e 74 36 34 20 64 75 6d 6d 79 3b  te3_int64 dummy;
2cd40 0a 0a 20 20 2a 70 70 44 61 74 61 20 3d 20 30 3b  ..  *ppData = 0;
2cd50 0a 20 20 2a 70 6e 44 61 74 61 20 3d 20 30 3b 0a  .  *pnData = 0;.
2cd60 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 73 74 3d  .  if( p->pList=
2cd70 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2cd80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2cd90 0a 20 20 70 52 65 74 20 3d 20 28 63 68 61 72 20  .  pRet = (char 
2cda0 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
2cdb0 28 70 2d 3e 70 4c 69 73 74 2d 3e 6e 44 61 74 61  (p->pList->nData
2cdc0 29 3b 0a 20 20 69 66 28 20 21 70 52 65 74 20 29  );.  if( !pRet )
2cdd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2cde0 4f 4d 45 4d 3b 0a 0a 20 20 6e 53 6b 69 70 20 3d  OMEM;..  nSkip =
2cdf0 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56   sqlite3Fts3GetV
2ce00 61 72 69 6e 74 28 70 2d 3e 70 4c 69 73 74 2d 3e  arint(p->pList->
2ce10 61 44 61 74 61 2c 20 26 64 75 6d 6d 79 29 3b 0a  aData, &dummy);.
2ce20 20 20 2a 70 6e 44 61 74 61 20 3d 20 70 2d 3e 70    *pnData = p->p
2ce30 4c 69 73 74 2d 3e 6e 44 61 74 61 20 2d 20 6e 53  List->nData - nS
2ce40 6b 69 70 3b 0a 20 20 2a 70 70 44 61 74 61 20 3d  kip;.  *ppData =
2ce50 20 70 52 65 74 3b 0a 20 20 0a 20 20 6d 65 6d 63   pRet;.  .  memc
2ce60 70 79 28 70 52 65 74 2c 20 26 70 2d 3e 70 4c 69  py(pRet, &p->pLi
2ce70 73 74 2d 3e 61 44 61 74 61 5b 6e 53 6b 69 70 5d  st->aData[nSkip]
2ce80 2c 20 2a 70 6e 44 61 74 61 29 3b 0a 20 20 72 65  , *pnData);.  re
2ce90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2cea0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
2ceb0 65 6e 74 72 79 20 66 6f 72 20 74 6f 6b 65 6e 20  entry for token 
2cec0 70 54 6f 6b 65 6e 20 74 6f 20 74 68 65 20 70 43  pToken to the pC
2ced0 73 72 2d 3e 70 44 65 66 65 72 72 65 64 20 6c 69  sr->pDeferred li
2cee0 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  st..*/.int sqlit
2cef0 65 33 46 74 73 33 44 65 66 65 72 54 6f 6b 65 6e  e3Fts3DeferToken
2cf00 28 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a  (.  Fts3Cursor *
2cf10 70 43 73 72 2c 20 20 20 20 20 20 20 20 20 20 20  pCsr,           
2cf20 20 20 20 20 2f 2a 20 46 74 73 33 20 74 61 62 6c      /* Fts3 tabl
2cf30 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 46 74  e cursor */.  Ft
2cf40 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70  s3PhraseToken *p
2cf50 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 2f 2a  Token,        /*
2cf60 20 54 6f 6b 65 6e 20 74 6f 20 64 65 66 65 72 20   Token to defer 
2cf70 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20  */.  int iCol   
2cf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf90 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
2cfa0 68 61 74 20 74 6f 6b 65 6e 20 6d 75 73 74 20 61  hat token must a
2cfb0 70 70 65 61 72 20 69 6e 20 28 6f 72 20 2d 31 29  ppear in (or -1)
2cfc0 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 44 65 66   */.){.  Fts3Def
2cfd0 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70 44 65 66  erredToken *pDef
2cfe0 65 72 72 65 64 3b 0a 20 20 70 44 65 66 65 72 72  erred;.  pDeferr
2cff0 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ed = sqlite3_mal
2d000 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 44 65 66  loc(sizeof(*pDef
2d010 65 72 72 65 64 29 29 3b 0a 20 20 69 66 28 20 21  erred));.  if( !
2d020 70 44 65 66 65 72 72 65 64 20 29 7b 0a 20 20 20  pDeferred ){.   
2d030 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2d040 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  OMEM;.  }.  mems
2d050 65 74 28 70 44 65 66 65 72 72 65 64 2c 20 30 2c  et(pDeferred, 0,
2d060 20 73 69 7a 65 6f 66 28 2a 70 44 65 66 65 72 72   sizeof(*pDeferr
2d070 65 64 29 29 3b 0a 20 20 70 44 65 66 65 72 72 65  ed));.  pDeferre
2d080 64 2d 3e 70 54 6f 6b 65 6e 20 3d 20 70 54 6f 6b  d->pToken = pTok
2d090 65 6e 3b 0a 20 20 70 44 65 66 65 72 72 65 64 2d  en;.  pDeferred-
2d0a0 3e 70 4e 65 78 74 20 3d 20 70 43 73 72 2d 3e 70  >pNext = pCsr->p
2d0b0 44 65 66 65 72 72 65 64 3b 20 0a 20 20 70 44 65  Deferred; .  pDe
2d0c0 66 65 72 72 65 64 2d 3e 69 43 6f 6c 20 3d 20 69  ferred->iCol = i
2d0d0 43 6f 6c 3b 0a 20 20 70 43 73 72 2d 3e 70 44 65  Col;.  pCsr->pDe
2d0e0 66 65 72 72 65 64 20 3d 20 70 44 65 66 65 72 72  ferred = pDeferr
2d0f0 65 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ed;..  assert( p
2d100 54 6f 6b 65 6e 2d 3e 70 44 65 66 65 72 72 65 64  Token->pDeferred
2d110 3d 3d 30 20 29 3b 0a 20 20 70 54 6f 6b 65 6e 2d  ==0 );.  pToken-
2d120 3e 70 44 65 66 65 72 72 65 64 20 3d 20 70 44 65  >pDeferred = pDe
2d130 66 65 72 72 65 64 3b 0a 0a 20 20 72 65 74 75 72  ferred;..  retur
2d140 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
2d150 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c  endif../*.** SQL
2d160 69 74 65 20 76 61 6c 75 65 20 70 52 6f 77 69 64  ite value pRowid
2d170 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72 6f   contains the ro
2d180 77 69 64 20 6f 66 20 61 20 72 6f 77 20 74 68 61  wid of a row tha
2d190 74 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  t may or may not
2d1a0 20 62 65 0a 2a 2a 20 70 72 65 73 65 6e 74 20 69   be.** present i
2d1b0 6e 20 74 68 65 20 46 54 53 33 20 74 61 62 6c 65  n the FTS3 table
2d1c0 2e 20 49 66 20 69 74 20 69 73 2c 20 64 65 6c 65  . If it is, dele
2d1d0 74 65 20 69 74 20 61 6e 64 20 61 64 6a 75 73 74  te it and adjust
2d1e0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   the contents.**
2d1f0 20 6f 66 20 73 75 62 73 69 64 75 61 72 79 20 64   of subsiduary d
2d200 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61  ata structures a
2d210 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73  ccordingly..*/.s
2d220 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 44 65  tatic int fts3De
2d230 6c 65 74 65 42 79 52 6f 77 69 64 28 0a 20 20 46  leteByRowid(.  F
2d240 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 0a 20 20  ts3Table *p, .  
2d250 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
2d260 52 6f 77 69 64 2c 20 0a 20 20 69 6e 74 20 2a 70  Rowid, .  int *p
2d270 6e 43 68 6e 67 2c 20 20 20 20 20 20 20 20 20 20  nChng,          
2d280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
2d290 4f 55 54 3a 20 44 65 63 72 65 6d 65 6e 74 20 69  OUT: Decrement i
2d2a0 66 20 72 6f 77 20 69 73 20 64 65 6c 65 74 65 64  f row is deleted
2d2b0 20 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a 44 65   */.  u32 *aSzDe
2d2c0 6c 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  l.){.  int rc = 
2d2d0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2d2e0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2d2f0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 62   code */.  int b
2d300 46 6f 75 6e 64 20 3d 20 30 3b 20 20 20 20 20 20  Found = 0;      
2d310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2d320 75 65 20 69 66 20 2a 70 52 6f 77 69 64 20 72 65  ue if *pRowid re
2d330 61 6c 6c 79 20 69 73 20 69 6e 20 74 68 65 20 74  ally is in the t
2d340 61 62 6c 65 20 2a 2f 0a 0a 20 20 66 74 73 33 44  able */..  fts3D
2d350 65 6c 65 74 65 54 65 72 6d 73 28 26 72 63 2c 20  eleteTerms(&rc, 
2d360 70 2c 20 70 52 6f 77 69 64 2c 20 61 53 7a 44 65  p, pRowid, aSzDe
2d370 6c 2c 20 26 62 46 6f 75 6e 64 29 3b 0a 20 20 69  l, &bFound);.  i
2d380 66 28 20 62 46 6f 75 6e 64 20 26 26 20 72 63 3d  f( bFound && rc=
2d390 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d3a0 20 20 69 6e 74 20 69 73 45 6d 70 74 79 20 3d 20    int isEmpty = 
2d3b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2d3c0 2f 2a 20 44 65 6c 65 74 69 6e 67 20 2a 70 52 6f  /* Deleting *pRo
2d3d0 77 69 64 20 6c 65 61 76 65 73 20 74 68 65 20 74  wid leaves the t
2d3e0 61 62 6c 65 20 65 6d 70 74 79 20 2a 2f 0a 20 20  able empty */.  
2d3f0 20 20 72 63 20 3d 20 66 74 73 33 49 73 45 6d 70    rc = fts3IsEmp
2d400 74 79 28 70 2c 20 70 52 6f 77 69 64 2c 20 26 69  ty(p, pRowid, &i
2d410 73 45 6d 70 74 79 29 3b 0a 20 20 20 20 69 66 28  sEmpty);.    if(
2d420 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2d430 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 45 6d  {.      if( isEm
2d440 70 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  pty ){.        /
2d450 2a 20 44 65 6c 65 74 69 6e 67 20 74 68 69 73 20  * Deleting this 
2d460 72 6f 77 20 6d 65 61 6e 73 20 74 68 65 20 77 68  row means the wh
2d470 6f 6c 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  ole table is emp
2d480 74 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ty. In this case
2d490 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 65 6c 65  .        ** dele
2d4a0 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
2d4b0 6f 66 20 61 6c 6c 20 74 68 72 65 65 20 74 61 62  of all three tab
2d4c0 6c 65 73 20 61 6e 64 20 74 68 72 6f 77 20 61 77  les and throw aw
2d4d0 61 79 20 61 6e 79 0a 20 20 20 20 20 20 20 20 2a  ay any.        *
2d4e0 2a 20 64 61 74 61 20 69 6e 20 74 68 65 20 70 65  * data in the pe
2d4f0 6e 64 69 6e 67 54 65 72 6d 73 20 68 61 73 68 20  ndingTerms hash 
2d500 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20  table.  */.     
2d510 20 20 20 72 63 20 3d 20 66 74 73 33 44 65 6c 65     rc = fts3Dele
2d520 74 65 41 6c 6c 28 70 2c 20 31 29 3b 0a 20 20 20  teAll(p, 1);.   
2d530 20 20 20 20 20 2a 70 6e 43 68 6e 67 20 3d 20 30       *pnChng = 0
2d540 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
2d550 28 61 53 7a 44 65 6c 2c 20 30 2c 20 73 69 7a 65  (aSzDel, 0, size
2d560 6f 66 28 75 33 32 29 20 2a 20 28 70 2d 3e 6e 43  of(u32) * (p->nC
2d570 6f 6c 75 6d 6e 2b 31 29 20 2a 20 32 29 3b 0a 20  olumn+1) * 2);. 
2d580 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2d590 20 20 20 20 2a 70 6e 43 68 6e 67 20 3d 20 2a 70      *pnChng = *p
2d5a0 6e 43 68 6e 67 20 2d 20 31 3b 0a 20 20 20 20 20  nChng - 1;.     
2d5b0 20 20 20 69 66 28 20 70 2d 3e 7a 43 6f 6e 74 65     if( p->zConte
2d5c0 6e 74 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  ntTbl==0 ){.    
2d5d0 20 20 20 20 20 20 66 74 73 33 53 71 6c 45 78 65        fts3SqlExe
2d5e0 63 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45  c(&rc, p, SQL_DE
2d5f0 4c 45 54 45 5f 43 4f 4e 54 45 4e 54 2c 20 26 70  LETE_CONTENT, &p
2d600 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
2d610 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  }.        if( p-
2d620 3e 62 48 61 73 44 6f 63 73 69 7a 65 20 29 7b 0a  >bHasDocsize ){.
2d630 20 20 20 20 20 20 20 20 20 20 66 74 73 33 53 71            fts3Sq
2d640 6c 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53 51  lExec(&rc, p, SQ
2d650 4c 5f 44 45 4c 45 54 45 5f 44 4f 43 53 49 5a 45  L_DELETE_DOCSIZE
2d660 2c 20 26 70 52 6f 77 69 64 29 3b 0a 20 20 20 20  , &pRowid);.    
2d670 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2d680 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
2d690 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
2d6a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
2d6b0 73 20 74 68 65 20 77 6f 72 6b 20 66 6f 72 20 74  s the work for t
2d6c0 68 65 20 78 55 70 64 61 74 65 20 6d 65 74 68 6f  he xUpdate metho
2d6d0 64 20 6f 66 20 46 54 53 33 20 76 69 72 74 75 61  d of FTS3 virtua
2d6e0 6c 0a 2a 2a 20 74 61 62 6c 65 73 2e 20 54 68 65  l.** tables. The
2d6f0 20 73 63 68 65 6d 61 20 6f 66 20 74 68 65 20 76   schema of the v
2d700 69 72 74 75 61 6c 20 74 61 62 6c 65 20 62 65 69  irtual table bei
2d710 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52  ng:.**.**     CR
2d720 45 41 54 45 20 54 41 42 4c 45 20 3c 74 61 62 6c  EATE TABLE <tabl
2d730 65 20 6e 61 6d 65 3e 28 20 0a 2a 2a 20 20 20 20  e name>( .**    
2d740 20 20 20 3c 75 73 65 72 20 63 6f 6c 75 6d 6e 73     <user columns
2d750 3e 2c 0a 2a 2a 20 20 20 20 20 20 20 3c 74 61 62  >,.**       <tab
2d760 6c 65 20 6e 61 6d 65 3e 20 48 49 44 44 45 4e 2c  le name> HIDDEN,
2d770 20 0a 2a 2a 20 20 20 20 20 20 20 64 6f 63 69 64   .**       docid
2d780 20 48 49 44 44 45 4e 2c 20 0a 2a 2a 20 20 20 20   HIDDEN, .**    
2d790 20 20 20 3c 6c 61 6e 67 69 64 3e 20 48 49 44 44     <langid> HIDD
2d7a0 45 4e 0a 2a 2a 20 20 20 20 20 29 3b 0a 2a 2a 0a  EN.**     );.**.
2d7b0 2a 2a 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ** .*/.int sqlit
2d7c0 65 33 46 74 73 33 55 70 64 61 74 65 4d 65 74 68  e3Fts3UpdateMeth
2d7d0 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  od(.  sqlite3_vt
2d7e0 61 62 20 2a 70 56 74 61 62 2c 20 20 20 20 20 20  ab *pVtab,      
2d7f0 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 76 74        /* FTS3 vt
2d800 61 62 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  ab object */.  i
2d810 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
2d820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d830 2a 20 53 69 7a 65 20 6f 66 20 61 72 67 75 6d 65  * Size of argume
2d840 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 73 71  nt array */.  sq
2d850 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
2d860 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Val,          /*
2d870 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65   Array of argume
2d880 6e 74 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f  nts */.  sqlite_
2d890 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 20 20 20  int64 *pRowid   
2d8a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2d8b0 20 54 68 65 20 61 66 66 65 63 74 65 64 20 28 6f   The affected (o
2d8c0 72 20 65 66 66 65 63 74 65 64 29 20 72 6f 77 69  r effected) rowi
2d8d0 64 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 54 61  d */.){.  Fts3Ta
2d8e0 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61  ble *p = (Fts3Ta
2d8f0 62 6c 65 20 2a 29 70 56 74 61 62 3b 0a 20 20 69  ble *)pVtab;.  i
2d900 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2d910 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
2d920 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
2d930 0a 20 20 69 6e 74 20 69 73 52 65 6d 6f 76 65 20  .  int isRemove 
2d940 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2d950 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
2d960 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
2d970 54 45 20 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a  TE */.  u32 *aSz
2d980 49 6e 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Ins = 0;        
2d990 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73          /* Sizes
2d9a0 20 6f 66 20 69 6e 73 65 72 74 65 64 20 64 6f 63   of inserted doc
2d9b0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 75 33 32 20  uments */.  u32 
2d9c0 2a 61 53 7a 44 65 6c 20 3d 20 30 3b 20 20 20 20  *aSzDel = 0;    
2d9d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2d9e0 69 7a 65 73 20 6f 66 20 64 65 6c 65 74 65 64 20  izes of deleted 
2d9f0 64 6f 63 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 69  documents */.  i
2da00 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b 20 20 20  nt nChng = 0;   
2da10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2da20 2a 20 4e 65 74 20 63 68 61 6e 67 65 20 69 6e 20  * Net change in 
2da30 6e 75 6d 62 65 72 20 6f 66 20 64 6f 63 75 6d 65  number of docume
2da40 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e  nts */.  int bIn
2da50 73 65 72 74 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20  sertDone = 0;.. 
2da60 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
2da70 74 20 69 74 20 6d 75 73 74 20 62 65 20 6b 6e 6f  t it must be kno
2da80 77 6e 20 69 66 20 74 68 65 20 25 5f 73 74 61 74  wn if the %_stat
2da90 20 74 61 62 6c 65 20 65 78 69 73 74 73 20 6f 72   table exists or
2daa0 20 6e 6f 74 2e 0a 20 20 2a 2a 20 53 6f 20 62 48   not..  ** So bH
2dab0 61 73 53 74 61 74 20 6d 61 79 20 6e 6f 74 20 62  asStat may not b
2dac0 65 20 32 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  e 2.  */.  asser
2dad0 74 28 20 70 2d 3e 62 48 61 73 53 74 61 74 3d 3d  t( p->bHasStat==
2dae0 30 20 7c 7c 20 70 2d 3e 62 48 61 73 53 74 61 74  0 || p->bHasStat
2daf0 3d 3d 31 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ==1 );..  assert
2db00 28 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73 3d 3d  ( p->pSegments==
2db10 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 0a  0 );.  assert( .
2db20 20 20 20 20 20 20 6e 41 72 67 3d 3d 31 20 20 20        nArg==1   
2db30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db40 20 20 2f 2a 20 44 45 4c 45 54 45 20 6f 70 65 72    /* DELETE oper
2db50 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 7c 7c 20  ations */.   || 
2db60 6e 41 72 67 3d 3d 28 32 20 2b 20 70 2d 3e 6e 43  nArg==(2 + p->nC
2db70 6f 6c 75 6d 6e 20 2b 20 33 29 20 20 2f 2a 20 49  olumn + 3)  /* I
2db80 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54 45 20  NSERT or UPDATE 
2db90 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20  operations */.  
2dba0 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  );..  /* Check f
2dbb0 6f 72 20 61 20 22 73 70 65 63 69 61 6c 22 20 49  or a "special" I
2dbc0 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 2e  NSERT operation.
2dbd0 20 4f 6e 65 20 6f 66 20 74 68 65 20 66 6f 72 6d   One of the form
2dbe0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 49 4e  :.  **.  **   IN
2dbf0 53 45 52 54 20 49 4e 54 4f 20 78 79 7a 28 78 79  SERT INTO xyz(xy
2dc00 7a 29 20 56 41 4c 55 45 53 28 27 63 6f 6d 6d 61  z) VALUES('comma
2dc10 6e 64 27 29 3b 0a 20 20 2a 2f 0a 20 20 69 66 28  nd');.  */.  if(
2dc20 20 6e 41 72 67 3e 31 20 0a 20 20 20 26 26 20 73   nArg>1 .   && s
2dc30 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
2dc40 65 28 61 70 56 61 6c 5b 30 5d 29 3d 3d 53 51 4c  e(apVal[0])==SQL
2dc50 49 54 45 5f 4e 55 4c 4c 20 0a 20 20 20 26 26 20  ITE_NULL .   && 
2dc60 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
2dc70 70 65 28 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c  pe(apVal[p->nCol
2dc80 75 6d 6e 2b 32 5d 29 21 3d 53 51 4c 49 54 45 5f  umn+2])!=SQLITE_
2dc90 4e 55 4c 4c 20 0a 20 20 29 7b 0a 20 20 20 20 72  NULL .  ){.    r
2dca0 63 20 3d 20 66 74 73 33 53 70 65 63 69 61 6c 49  c = fts3SpecialI
2dcb0 6e 73 65 72 74 28 70 2c 20 61 70 56 61 6c 5b 70  nsert(p, apVal[p
2dcc0 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 5d 29 3b 0a 20  ->nColumn+2]);. 
2dcd0 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 6f     goto update_o
2dce0 75 74 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e  ut;.  }..  if( n
2dcf0 41 72 67 3e 31 20 26 26 20 73 71 6c 69 74 65 33  Arg>1 && sqlite3
2dd00 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c  _value_int(apVal
2dd10 5b 32 20 2b 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20  [2 + p->nColumn 
2dd20 2b 20 32 5d 29 3c 30 20 29 7b 0a 20 20 20 20 72  + 2])<0 ){.    r
2dd30 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
2dd40 52 41 49 4e 54 3b 0a 20 20 20 20 67 6f 74 6f 20  RAINT;.    goto 
2dd50 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20 20 7d 0a  update_out;.  }.
2dd60 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
2dd70 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
2dd80 20 63 68 61 6e 67 65 20 69 6e 20 64 6f 63 75 6d   change in docum
2dd90 65 6e 74 20 73 69 7a 65 73 20 2a 2f 0a 20 20 61  ent sizes */.  a
2dda0 53 7a 44 65 6c 20 3d 20 73 71 6c 69 74 65 33 5f  SzDel = sqlite3_
2ddb0 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61  malloc( sizeof(a
2ddc0 53 7a 44 65 6c 5b 30 5d 29 2a 28 70 2d 3e 6e 43  SzDel[0])*(p->nC
2ddd0 6f 6c 75 6d 6e 2b 31 29 2a 32 20 29 3b 0a 20 20  olumn+1)*2 );.  
2dde0 69 66 28 20 61 53 7a 44 65 6c 3d 3d 30 20 29 7b  if( aSzDel==0 ){
2ddf0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2de00 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
2de10 20 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20 20 7d   update_out;.  }
2de20 0a 20 20 61 53 7a 49 6e 73 20 3d 20 26 61 53 7a  .  aSzIns = &aSz
2de30 44 65 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31  Del[p->nColumn+1
2de40 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 53 7a 44  ];.  memset(aSzD
2de50 65 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 53  el, 0, sizeof(aS
2de60 7a 44 65 6c 5b 30 5d 29 2a 28 70 2d 3e 6e 43 6f  zDel[0])*(p->nCo
2de70 6c 75 6d 6e 2b 31 29 2a 32 29 3b 0a 0a 20 20 72  lumn+1)*2);..  r
2de80 63 20 3d 20 66 74 73 33 57 72 69 74 65 6c 6f 63  c = fts3Writeloc
2de90 6b 28 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  k(p);.  if( rc!=
2dea0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2deb0 20 75 70 64 61 74 65 5f 6f 75 74 3b 0a 0a 20 20   update_out;..  
2dec0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
2ded0 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f   INSERT operatio
2dee0 6e 2c 20 6f 72 20 61 6e 20 55 50 44 41 54 45 20  n, or an UPDATE 
2def0 74 68 61 74 20 6d 6f 64 69 66 69 65 73 20 74 68  that modifies th
2df00 65 20 72 6f 77 69 64 0a 20 20 2a 2a 20 76 61 6c  e rowid.  ** val
2df10 75 65 2c 20 74 68 65 6e 20 74 68 69 73 20 6f 70  ue, then this op
2df20 65 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 73  eration requires
2df30 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 6e 64   constraint hand
2df40 6c 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ling..  **.  ** 
2df50 49 66 20 74 68 65 20 6f 6e 2d 63 6f 6e 66 6c 69  If the on-confli
2df60 63 74 20 6d 6f 64 65 20 69 73 20 52 45 50 4c 41  ct mode is REPLA
2df70 43 45 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 74  CE, this means t
2df80 68 61 74 20 74 68 65 20 65 78 69 73 74 69 6e 67  hat the existing
2df90 20 72 6f 77 0a 20 20 2a 2a 20 73 68 6f 75 6c 64   row.  ** should
2dfa0 20 62 65 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   be deleted from
2dfb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
2dfc0 66 6f 72 65 20 69 6e 73 65 72 74 69 6e 67 20 74  fore inserting t
2dfd0 68 65 20 6e 65 77 20 72 6f 77 2e 20 4f 72 2c 0a  he new row. Or,.
2dfe0 20 20 2a 2a 20 69 66 20 74 68 65 20 6f 6e 2d 63    ** if the on-c
2dff0 6f 6e 66 6c 69 63 74 20 6d 6f 64 65 20 69 73 20  onflict mode is 
2e000 6f 74 68 65 72 20 74 68 61 6e 20 52 45 50 4c 41  other than REPLA
2e010 43 45 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 65  CE, then this me
2e020 74 68 6f 64 20 6d 75 73 74 0a 20 20 2a 2a 20 64  thod must.  ** d
2e030 65 74 65 63 74 20 74 68 65 20 63 6f 6e 66 6c 69  etect the confli
2e040 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ct and return SQ
2e050 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
2e060 62 65 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67  before beginning
2e070 20 74 6f 0a 20 20 2a 2a 20 6d 6f 64 69 66 79 20   to.  ** modify 
2e080 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e090 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 41  e..  */.  if( nA
2e0a0 72 67 3e 31 20 26 26 20 70 2d 3e 7a 43 6f 6e 74  rg>1 && p->zCont
2e0b0 65 6e 74 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  entTbl==0 ){.   
2e0c0 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 76 61 6c   /* Find the val
2e0d0 75 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68  ue object that h
2e0e0 6f 6c 64 73 20 74 68 65 20 6e 65 77 20 72 6f 77  olds the new row
2e0f0 69 64 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20  id value. */.   
2e100 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2e110 70 4e 65 77 52 6f 77 69 64 20 3d 20 61 70 56 61  pNewRowid = apVa
2e120 6c 5b 33 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 3b  l[3+p->nColumn];
2e130 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2e140 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 4e 65 77  _value_type(pNew
2e150 52 6f 77 69 64 29 3d 3d 53 51 4c 49 54 45 5f 4e  Rowid)==SQLITE_N
2e160 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  ULL ){.      pNe
2e170 77 52 6f 77 69 64 20 3d 20 61 70 56 61 6c 5b 31  wRowid = apVal[1
2e180 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  ];.    }..    if
2e190 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
2e1a0 74 79 70 65 28 70 4e 65 77 52 6f 77 69 64 29 21  type(pNewRowid)!
2e1b0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 26 26 20  =SQLITE_NULL && 
2e1c0 28 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ( .        sqlit
2e1d0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70  e3_value_type(ap
2e1e0 56 61 6c 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f  Val[0])==SQLITE_
2e1f0 4e 55 4c 4c 0a 20 20 20 20 20 7c 7c 20 73 71 6c  NULL.     || sql
2e200 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
2e210 28 61 70 56 61 6c 5b 30 5d 29 21 3d 73 71 6c 69  (apVal[0])!=sqli
2e220 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
2e230 70 4e 65 77 52 6f 77 69 64 29 0a 20 20 20 20 29  pNewRowid).    )
2e240 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
2e250 6e 65 77 20 72 6f 77 69 64 20 69 73 20 6e 6f 74  new rowid is not
2e260 20 4e 55 4c 4c 20 28 69 6e 20 74 68 69 73 20 63   NULL (in this c
2e270 61 73 65 20 74 68 65 20 72 6f 77 69 64 20 77 69  ase the rowid wi
2e280 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 61  ll be.      ** a
2e290 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 73  utomatically ass
2e2a0 69 67 6e 65 64 20 61 6e 64 20 74 68 65 72 65 20  igned and there 
2e2b0 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 6f 66 20  is no chance of 
2e2c0 61 20 63 6f 6e 66 6c 69 63 74 29 2c 20 61 6e 64  a conflict), and
2e2d0 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73   .      ** the s
2e2e0 74 61 74 65 6d 65 6e 74 20 69 73 20 65 69 74 68  tatement is eith
2e2f0 65 72 20 61 6e 20 49 4e 53 45 52 54 20 6f 72 20  er an INSERT or 
2e300 61 6e 20 55 50 44 41 54 45 20 74 68 61 74 20 6d  an UPDATE that m
2e310 6f 64 69 66 69 65 73 20 74 68 65 0a 20 20 20 20  odifies the.    
2e320 20 20 2a 2a 20 72 6f 77 69 64 20 63 6f 6c 75 6d    ** rowid colum
2e330 6e 2e 20 53 6f 20 69 66 20 74 68 65 20 63 6f 6e  n. So if the con
2e340 66 6c 69 63 74 20 6d 6f 64 65 20 69 73 20 52 45  flict mode is RE
2e350 50 4c 41 43 45 2c 20 74 68 65 6e 20 64 65 6c 65  PLACE, then dele
2e360 74 65 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20  te any.      ** 
2e370 65 78 69 73 74 69 6e 67 20 72 6f 77 20 77 69 74  existing row wit
2e380 68 20 72 6f 77 69 64 3d 70 4e 65 77 52 6f 77 69  h rowid=pNewRowi
2e390 64 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  d. .      **.   
2e3a0 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65     ** Or, if the
2e3b0 20 63 6f 6e 66 6c 69 63 74 20 6d 6f 64 65 20 69   conflict mode i
2e3c0 73 20 6e 6f 74 20 52 45 50 4c 41 43 45 2c 20 69  s not REPLACE, i
2e3d0 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 72 65  nsert the new re
2e3e0 63 6f 72 64 20 69 6e 74 6f 20 0a 20 20 20 20 20  cord into .     
2e3f0 20 2a 2a 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e   ** the %_conten
2e400 74 20 74 61 62 6c 65 2e 20 49 66 20 77 65 20 68  t table. If we h
2e410 69 74 20 74 68 65 20 64 75 70 6c 69 63 61 74 65  it the duplicate
2e420 20 72 6f 77 69 64 20 63 6f 6e 73 74 72 61 69 6e   rowid constrain
2e430 74 20 28 6f 72 20 61 6e 79 0a 20 20 20 20 20 20  t (or any.      
2e440 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 29 20  ** other error) 
2e450 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 20  while doing so, 
2e460 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65  return immediate
2e470 6c 79 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ly..      **.   
2e480 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63     ** This branc
2e490 68 20 6d 61 79 20 61 6c 73 6f 20 72 75 6e 20 69  h may also run i
2e4a0 66 20 70 4e 65 77 52 6f 77 69 64 20 63 6f 6e 74  f pNewRowid cont
2e4b0 61 69 6e 73 20 61 20 76 61 6c 75 65 20 74 68 61  ains a value tha
2e4c0 74 20 63 61 6e 6e 6f 74 0a 20 20 20 20 20 20 2a  t cannot.      *
2e4d0 2a 20 62 65 20 6c 6f 73 73 6c 65 73 73 6c 79 20  * be losslessly 
2e4e0 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61 6e 20  converted to an 
2e4f0 69 6e 74 65 67 65 72 2e 20 49 6e 20 74 68 69 73  integer. In this
2e500 20 63 61 73 65 2c 20 74 68 65 20 65 76 65 6e 74   case, the event
2e510 75 61 6c 20 0a 20 20 20 20 20 20 2a 2a 20 63 61  ual .      ** ca
2e520 6c 6c 20 74 6f 20 66 74 73 33 49 6e 73 65 72 74  ll to fts3Insert
2e530 44 61 74 61 28 29 20 28 65 69 74 68 65 72 20 6a  Data() (either j
2e540 75 73 74 20 62 65 6c 6f 77 20 6f 72 20 66 75 72  ust below or fur
2e550 74 68 65 72 20 6f 6e 20 69 6e 20 74 68 69 73 0a  ther on in this.
2e560 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
2e570 6e 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 53  n) will return S
2e580 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 2e 20  QLITE_MISMATCH. 
2e590 49 66 20 66 74 73 33 44 65 6c 65 74 65 42 79 52  If fts3DeleteByR
2e5a0 6f 77 69 64 20 69 73 20 0a 20 20 20 20 20 20 2a  owid is .      *
2e5b0 2a 20 69 6e 76 6f 6b 65 64 2c 20 69 74 20 77 69  * invoked, it wi
2e5c0 6c 6c 20 64 65 6c 65 74 65 20 7a 65 72 6f 20 72  ll delete zero r
2e5d0 6f 77 73 20 28 73 69 6e 63 65 20 6e 6f 20 72 6f  ows (since no ro
2e5e0 77 20 77 69 6c 6c 20 68 61 76 65 0a 20 20 20 20  w will have.    
2e5f0 20 20 2a 2a 20 64 6f 63 69 64 3d 24 70 4e 65 77    ** docid=$pNew
2e600 52 6f 77 69 64 20 69 66 20 24 70 4e 65 77 52 6f  Rowid if $pNewRo
2e610 77 69 64 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e  wid is not an in
2e620 74 65 67 65 72 20 76 61 6c 75 65 29 2e 0a 20 20  teger value)..  
2e630 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
2e640 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 6f 6e   sqlite3_vtab_on
2e650 5f 63 6f 6e 66 6c 69 63 74 28 70 2d 3e 64 62 29  _conflict(p->db)
2e660 3d 3d 53 51 4c 49 54 45 5f 52 45 50 4c 41 43 45  ==SQLITE_REPLACE
2e670 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2e680 20 66 74 73 33 44 65 6c 65 74 65 42 79 52 6f 77   fts3DeleteByRow
2e690 69 64 28 70 2c 20 70 4e 65 77 52 6f 77 69 64 2c  id(p, pNewRowid,
2e6a0 20 26 6e 43 68 6e 67 2c 20 61 53 7a 44 65 6c 29   &nChng, aSzDel)
2e6b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2e6c0 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33         rc = fts3
2e6d0 49 6e 73 65 72 74 44 61 74 61 28 70 2c 20 61 70  InsertData(p, ap
2e6e0 56 61 6c 2c 20 70 52 6f 77 69 64 29 3b 0a 20 20  Val, pRowid);.  
2e6f0 20 20 20 20 20 20 62 49 6e 73 65 72 74 44 6f 6e        bInsertDon
2e700 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 1;.      }. 
2e710 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
2e720 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2e730 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f      goto update_
2e740 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  out;.  }..  /* I
2e750 66 20 74 68 69 73 20 69 73 20 61 20 44 45 4c 45  f this is a DELE
2e760 54 45 20 6f 72 20 55 50 44 41 54 45 20 6f 70 65  TE or UPDATE ope
2e770 72 61 74 69 6f 6e 2c 20 72 65 6d 6f 76 65 20 74  ration, remove t
2e780 68 65 20 6f 6c 64 20 72 65 63 6f 72 64 2e 20 2a  he old record. *
2e790 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  /.  if( sqlite3_
2e7a0 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c  value_type(apVal
2e7b0 5b 30 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  [0])!=SQLITE_NUL
2e7c0 4c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  L ){.    assert(
2e7d0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
2e7e0 79 70 65 28 61 70 56 61 6c 5b 30 5d 29 3d 3d 53  ype(apVal[0])==S
2e7f0 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29 3b  QLITE_INTEGER );
2e800 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 65  .    rc = fts3De
2e810 6c 65 74 65 42 79 52 6f 77 69 64 28 70 2c 20 61  leteByRowid(p, a
2e820 70 56 61 6c 5b 30 5d 2c 20 26 6e 43 68 6e 67 2c  pVal[0], &nChng,
2e830 20 61 53 7a 44 65 6c 29 3b 0a 20 20 20 20 69 73   aSzDel);.    is
2e840 52 65 6d 6f 76 65 20 3d 20 31 3b 0a 20 20 7d 0a  Remove = 1;.  }.
2e850 20 20 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20    .  /* If this 
2e860 69 73 20 61 6e 20 49 4e 53 45 52 54 20 6f 72 20  is an INSERT or 
2e870 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e  UPDATE operation
2e880 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 65 77  , insert the new
2e890 20 72 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 69 66   record. */.  if
2e8a0 28 20 6e 41 72 67 3e 31 20 26 26 20 72 63 3d 3d  ( nArg>1 && rc==
2e8b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e8c0 20 69 6e 74 20 69 4c 61 6e 67 69 64 20 3d 20 73   int iLangid = s
2e8d0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
2e8e0 28 61 70 56 61 6c 5b 32 20 2b 20 70 2d 3e 6e 43  (apVal[2 + p->nC
2e8f0 6f 6c 75 6d 6e 20 2b 20 32 5d 29 3b 0a 20 20 20  olumn + 2]);.   
2e900 20 69 66 28 20 62 49 6e 73 65 72 74 44 6f 6e 65   if( bInsertDone
2e910 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
2e920 3d 20 66 74 73 33 49 6e 73 65 72 74 44 61 74 61  = fts3InsertData
2e930 28 70 2c 20 61 70 56 61 6c 2c 20 70 52 6f 77 69  (p, apVal, pRowi
2e940 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  d);.      if( rc
2e950 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
2e960 49 4e 54 20 26 26 20 70 2d 3e 7a 43 6f 6e 74 65  INT && p->zConte
2e970 6e 74 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  ntTbl==0 ){.    
2e980 20 20 20 20 72 63 20 3d 20 46 54 53 5f 43 4f 52      rc = FTS_COR
2e990 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 20 20 20  RUPT_VTAB;.     
2e9a0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
2e9b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2e9c0 26 20 28 21 69 73 52 65 6d 6f 76 65 20 7c 7c 20  & (!isRemove || 
2e9d0 2a 70 52 6f 77 69 64 21 3d 70 2d 3e 69 50 72 65  *pRowid!=p->iPre
2e9e0 76 44 6f 63 69 64 20 29 20 29 7b 0a 20 20 20 20  vDocid ) ){.    
2e9f0 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69    rc = fts3Pendi
2ea00 6e 67 54 65 72 6d 73 44 6f 63 69 64 28 70 2c 20  ngTermsDocid(p, 
2ea10 30 2c 20 69 4c 61 6e 67 69 64 2c 20 2a 70 52 6f  0, iLangid, *pRo
2ea20 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wid);.    }.    
2ea30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2ea40 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
2ea50 74 28 20 70 2d 3e 69 50 72 65 76 44 6f 63 69 64  t( p->iPrevDocid
2ea60 3d 3d 2a 70 52 6f 77 69 64 20 29 3b 0a 20 20 20  ==*pRowid );.   
2ea70 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 73 65     rc = fts3Inse
2ea80 72 74 54 65 72 6d 73 28 70 2c 20 69 4c 61 6e 67  rtTerms(p, iLang
2ea90 69 64 2c 20 61 70 56 61 6c 2c 20 61 53 7a 49 6e  id, apVal, aSzIn
2eaa0 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  s);.    }.    if
2eab0 28 20 70 2d 3e 62 48 61 73 44 6f 63 73 69 7a 65  ( p->bHasDocsize
2eac0 20 29 7b 0a 20 20 20 20 20 20 66 74 73 33 49 6e   ){.      fts3In
2ead0 73 65 72 74 44 6f 63 73 69 7a 65 28 26 72 63 2c  sertDocsize(&rc,
2eae0 20 70 2c 20 61 53 7a 49 6e 73 29 3b 0a 20 20 20   p, aSzIns);.   
2eaf0 20 7d 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a   }.    nChng++;.
2eb00 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 62 46    }..  if( p->bF
2eb10 74 73 34 20 29 7b 0a 20 20 20 20 66 74 73 33 55  ts4 ){.    fts3U
2eb20 70 64 61 74 65 44 6f 63 54 6f 74 61 6c 73 28 26  pdateDocTotals(&
2eb30 72 63 2c 20 70 2c 20 61 53 7a 49 6e 73 2c 20 61  rc, p, aSzIns, a
2eb40 53 7a 44 65 6c 2c 20 6e 43 68 6e 67 29 3b 0a 20  SzDel, nChng);. 
2eb50 20 7d 0a 0a 20 75 70 64 61 74 65 5f 6f 75 74 3a   }.. update_out:
2eb60 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2eb70 61 53 7a 44 65 6c 29 3b 0a 20 20 73 71 6c 69 74  aSzDel);.  sqlit
2eb80 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73 43 6c  e3Fts3SegmentsCl
2eb90 6f 73 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ose(p);.  return
2eba0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 46   rc;.}../* .** F
2ebb0 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 69 6e  lush any data in
2ebc0 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72   the pending-ter
2ebd0 6d 73 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f  ms hash table to
2ebe0 20 64 69 73 6b 2e 20 49 66 20 73 75 63 63 65 73   disk. If succes
2ebf0 73 66 75 6c 2c 0a 2a 2a 20 6d 65 72 67 65 20 61  sful,.** merge a
2ec00 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74  ll segments in t
2ec10 68 65 20 64 61 74 61 62 61 73 65 20 28 69 6e 63  he database (inc
2ec20 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 73  luding the new s
2ec30 65 67 6d 65 6e 74 2c 20 69 66 20 0a 2a 2a 20 74  egment, if .** t
2ec40 68 65 72 65 20 77 61 73 20 61 6e 79 20 64 61 74  here was any dat
2ec50 61 20 74 6f 20 66 6c 75 73 68 29 20 69 6e 74 6f  a to flush) into
2ec60 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e   a single segmen
2ec70 74 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  t. .*/.int sqlit
2ec80 65 33 46 74 73 33 4f 70 74 69 6d 69 7a 65 28 46  e3Fts3Optimize(F
2ec90 74 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  ts3Table *p){.  
2eca0 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  int rc;.  rc = s
2ecb0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
2ecc0 62 2c 20 22 53 41 56 45 50 4f 49 4e 54 20 66 74  b, "SAVEPOINT ft
2ecd0 73 33 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  s3", 0, 0, 0);. 
2ece0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ecf0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  OK ){.    rc = f
2ed00 74 73 33 44 6f 4f 70 74 69 6d 69 7a 65 28 70 2c  ts3DoOptimize(p,
2ed10 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   1);.    if( rc=
2ed20 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
2ed30 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
2ed40 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d  .      int rc2 =
2ed50 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
2ed60 3e 64 62 2c 20 22 52 45 4c 45 41 53 45 20 66 74  >db, "RELEASE ft
2ed70 73 33 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  s3", 0, 0, 0);. 
2ed80 20 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51       if( rc2!=SQ
2ed90 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
2eda0 63 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  c2;.    }else{. 
2edb0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65       sqlite3_exe
2edc0 63 28 70 2d 3e 64 62 2c 20 22 52 4f 4c 4c 42 41  c(p->db, "ROLLBA
2edd0 43 4b 20 54 4f 20 66 74 73 33 22 2c 20 30 2c 20  CK TO fts3", 0, 
2ede0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
2edf0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
2ee00 20 22 52 45 4c 45 41 53 45 20 66 74 73 33 22 2c   "RELEASE fts3",
2ee10 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 0, 0);.    }
2ee20 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 46 74  .  }.  sqlite3Ft
2ee30 73 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28  s3SegmentsClose(
2ee40 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
2ee50 0a 7d 0a 0a 23 65 6e 64 69 66 0a                 .}..#endif.