/ Hex Artifact Content
Login

Artifact 8260388626516a7005d06a9dce94f9e55c6c2a41:


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 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
34d0: 6c 65 76 65 6c 20 2f 20 28 31 30 32 34 20 2a 20  level / (1024 * 
34e0: 3f 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73  ?) FROM %Q.'%q_s
34f0: 65 67 64 69 72 27 22 2c 0a 0a 2f 2a 20 54 68 69  egdir'",../* Thi
3500: 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75  s statement is u
3510: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
3520: 20 77 68 69 63 68 20 6c 65 76 65 6c 20 74 6f 20   which level to 
3530: 72 65 61 64 20 74 68 65 20 69 6e 70 75 74 20 66  read the input f
3540: 72 6f 6d 0a 2a 2a 20 77 68 65 6e 20 70 65 72 66  rom.** when perf
3550: 6f 72 6d 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d  orming an increm
3560: 65 6e 74 61 6c 20 6d 65 72 67 65 2e 20 49 74 20  ental merge. It 
3570: 72 65 74 75 72 6e 73 20 74 68 65 20 61 62 73 6f  returns the abso
3580: 6c 75 74 65 20 6c 65 76 65 6c 20 6e 75 6d 62 65  lute level numbe
3590: 72 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 6c 64 65  r.** of the olde
35a0: 73 74 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20  st level in the 
35b0: 64 62 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  db that contains
35c0: 20 61 74 20 6c 65 61 73 74 20 3f 20 73 65 67 6d   at least ? segm
35d0: 65 6e 74 73 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20  ents. Or,.** if 
35e0: 6e 6f 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20  no level in the 
35f0: 46 54 53 20 69 6e 64 65 78 20 63 6f 6e 74 61 69  FTS index contai
3600: 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 3f 20 73  ns more than ? s
3610: 65 67 6d 65 6e 74 73 2c 20 74 68 65 20 73 74 61  egments, the sta
3620: 74 65 6d 65 6e 74 0a 2a 2a 20 72 65 74 75 72 6e  tement.** return
3630: 73 20 7a 65 72 6f 20 72 6f 77 73 2e 20 20 2a 2f  s zero rows.  */
3640: 0a 2f 2a 20 32 38 20 2a 2f 20 22 53 45 4c 45 43  ./* 28 */ "SELEC
3650: 54 20 6c 65 76 65 6c 20 46 52 4f 4d 20 25 51 2e  T level FROM %Q.
3660: 27 25 71 5f 73 65 67 64 69 72 27 20 47 52 4f 55  '%q_segdir' GROU
3670: 50 20 42 59 20 6c 65 76 65 6c 20 48 41 56 49 4e  P BY level HAVIN
3680: 47 20 63 6f 75 6e 74 28 2a 29 3e 3d 3f 22 0a 20  G count(*)>=?". 
3690: 20 20 20 20 20 20 20 20 22 20 20 4f 52 44 45 52          "  ORDER
36a0: 20 42 59 20 28 6c 65 76 65 6c 20 25 25 20 31 30   BY (level %% 10
36b0: 32 34 29 20 41 53 43 20 4c 49 4d 49 54 20 31 22  24) ASC LIMIT 1"
36c0: 2c 0a 0a 2f 2a 20 45 73 74 69 6d 61 74 65 20 74  ,../* Estimate t
36d0: 68 65 20 75 70 70 65 72 20 6c 69 6d 69 74 20 6f  he upper limit o
36e0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
36f0: 6c 65 61 66 20 6e 6f 64 65 73 20 69 6e 20 61 20  leaf nodes in a 
3700: 6e 65 77 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 63  new segment.** c
3710: 72 65 61 74 65 64 20 62 79 20 6d 65 72 67 69 6e  reated by mergin
3720: 67 20 74 68 65 20 6f 6c 64 65 73 74 20 3a 32 20  g the oldest :2 
3730: 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 61 62  segments from ab
3740: 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 3a 31 2e  solute level :1.
3750: 20 53 65 65 20 0a 2a 2a 20 66 75 6e 63 74 69 6f   See .** functio
3760: 6e 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 63  n sqlite3Fts3Inc
3770: 72 6d 65 72 67 65 28 29 20 66 6f 72 20 64 65 74  rmerge() for det
3780: 61 69 6c 73 2e 20 20 2a 2f 0a 2f 2a 20 32 39 20  ails.  */./* 29 
3790: 2a 2f 20 22 53 45 4c 45 43 54 20 32 20 2a 20 74  */ "SELECT 2 * t
37a0: 6f 74 61 6c 28 31 20 2b 20 6c 65 61 76 65 73 5f  otal(1 + leaves_
37b0: 65 6e 64 5f 62 6c 6f 63 6b 20 2d 20 73 74 61 72  end_block - star
37c0: 74 5f 62 6c 6f 63 6b 29 20 22 0a 20 20 20 20 20  t_block) ".     
37d0: 20 20 20 20 22 20 20 46 52 4f 4d 20 25 51 2e 27      "  FROM %Q.'
37e0: 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52 45  %q_segdir' WHERE
37f0: 20 6c 65 76 65 6c 20 3d 20 3f 20 41 4e 44 20 69   level = ? AND i
3800: 64 78 20 3c 20 3f 22 2c 0a 0a 2f 2a 20 53 51 4c  dx < ?",../* SQL
3810: 5f 44 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 45  _DELETE_SEGDIR_E
3820: 4e 54 52 59 0a 2a 2a 20 20 20 44 65 6c 65 74 65  NTRY.**   Delete
3830: 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 65 6e   the %_segdir en
3840: 74 72 79 20 6f 6e 20 61 62 73 6f 6c 75 74 65 20  try on absolute 
3850: 6c 65 76 65 6c 20 3a 31 20 77 69 74 68 20 69 6e  level :1 with in
3860: 64 65 78 20 3a 32 2e 20 20 2a 2f 0a 2f 2a 20 33  dex :2.  */./* 3
3870: 30 20 2a 2f 20 22 44 45 4c 45 54 45 20 46 52 4f  0 */ "DELETE FRO
3880: 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27  M %Q.'%q_segdir'
3890: 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f   WHERE level = ?
38a0: 20 41 4e 44 20 69 64 78 20 3d 20 3f 22 2c 0a 0a   AND idx = ?",..
38b0: 2f 2a 20 53 51 4c 5f 53 48 49 46 54 5f 53 45 47  /* SQL_SHIFT_SEG
38c0: 44 49 52 5f 45 4e 54 52 59 0a 2a 2a 20 20 20 4d  DIR_ENTRY.**   M
38d0: 6f 64 69 66 79 20 74 68 65 20 69 64 78 20 76 61  odify the idx va
38e0: 6c 75 65 20 66 6f 72 20 74 68 65 20 73 65 67 6d  lue for the segm
38f0: 65 6e 74 20 77 69 74 68 20 69 64 78 3d 3a 33 20  ent with idx=:3 
3900: 6f 6e 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65  on absolute leve
3910: 6c 20 3a 32 0a 2a 2a 20 20 20 74 6f 20 3a 31 2e  l :2.**   to :1.
3920: 20 20 2a 2f 0a 2f 2a 20 33 31 20 2a 2f 20 22 55    */./* 31 */ "U
3930: 50 44 41 54 45 20 25 51 2e 27 25 71 5f 73 65 67  PDATE %Q.'%q_seg
3940: 64 69 72 27 20 53 45 54 20 69 64 78 20 3d 20 3f  dir' SET idx = ?
3950: 20 57 48 45 52 45 20 6c 65 76 65 6c 3d 3f 20 41   WHERE level=? A
3960: 4e 44 20 69 64 78 3d 3f 22 2c 0a 0a 2f 2a 20 53  ND idx=?",../* S
3970: 51 4c 5f 53 45 4c 45 43 54 5f 53 45 47 44 49 52  QL_SELECT_SEGDIR
3980: 0a 2a 2a 20 20 20 52 65 61 64 20 61 20 73 69 6e  .**   Read a sin
3990: 67 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 74  gle entry from t
39a0: 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c  he %_segdir tabl
39b0: 65 2e 20 54 68 65 20 65 6e 74 72 79 20 66 72 6f  e. The entry fro
39c0: 6d 20 61 62 73 6f 6c 75 74 65 20 0a 2a 2a 20 20  m absolute .**  
39d0: 20 6c 65 76 65 6c 20 3a 31 20 77 69 74 68 20 69   level :1 with i
39e0: 6e 64 65 78 20 76 61 6c 75 65 20 3a 32 2e 20 20  ndex value :2.  
39f0: 2a 2f 0a 2f 2a 20 33 32 20 2a 2f 20 20 22 53 45  */./* 32 */  "SE
3a00: 4c 45 43 54 20 69 64 78 2c 20 73 74 61 72 74 5f  LECT idx, start_
3a10: 62 6c 6f 63 6b 2c 20 6c 65 61 76 65 73 5f 65 6e  block, leaves_en
3a20: 64 5f 62 6c 6f 63 6b 2c 20 65 6e 64 5f 62 6c 6f  d_block, end_blo
3a30: 63 6b 2c 20 72 6f 6f 74 20 22 0a 20 20 20 20 20  ck, root ".     
3a40: 20 20 20 20 20 20 20 22 46 52 4f 4d 20 25 51 2e         "FROM %Q.
3a50: 27 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52  '%q_segdir' WHER
3a60: 45 20 6c 65 76 65 6c 20 3d 20 3f 20 41 4e 44 20  E level = ? AND 
3a70: 69 64 78 20 3d 20 3f 22 2c 0a 0a 2f 2a 20 53 51  idx = ?",../* SQ
3a80: 4c 5f 43 48 4f 4d 50 5f 53 45 47 44 49 52 0a 2a  L_CHOMP_SEGDIR.*
3a90: 2a 20 20 20 55 70 64 61 74 65 20 74 68 65 20 73  *   Update the s
3aa0: 74 61 72 74 5f 62 6c 6f 63 6b 20 28 3a 31 29 20  tart_block (:1) 
3ab0: 61 6e 64 20 72 6f 6f 74 20 28 3a 32 29 20 66 69  and root (:2) fi
3ac0: 65 6c 64 73 20 6f 66 20 74 68 65 20 25 5f 73 65  elds of the %_se
3ad0: 67 64 69 72 0a 2a 2a 20 20 20 65 6e 74 72 79 20  gdir.**   entry 
3ae0: 6c 6f 63 61 74 65 64 20 6f 6e 20 61 62 73 6f 6c  located on absol
3af0: 75 74 65 20 6c 65 76 65 6c 20 3a 33 20 77 69 74  ute level :3 wit
3b00: 68 20 69 6e 64 65 78 20 3a 34 2e 20 20 2a 2f 0a  h index :4.  */.
3b10: 2f 2a 20 33 33 20 2a 2f 20 20 22 55 50 44 41 54  /* 33 */  "UPDAT
3b20: 45 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27  E %Q.'%q_segdir'
3b30: 20 53 45 54 20 73 74 61 72 74 5f 62 6c 6f 63 6b   SET start_block
3b40: 20 3d 20 3f 2c 20 72 6f 6f 74 20 3d 20 3f 22 0a   = ?, root = ?".
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 22 57 48 45              "WHE
3b60: 52 45 20 6c 65 76 65 6c 20 3d 20 3f 20 41 4e 44  RE level = ? AND
3b70: 20 69 64 78 20 3d 20 3f 22 2c 0a 0a 2f 2a 20 53   idx = ?",../* S
3b80: 51 4c 5f 53 45 47 4d 45 4e 54 5f 49 53 5f 41 50  QL_SEGMENT_IS_AP
3b90: 50 45 4e 44 41 42 4c 45 0a 2a 2a 20 20 20 52 65  PENDABLE.**   Re
3ba0: 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f  turn a single ro
3bb0: 77 20 69 66 20 74 68 65 20 73 65 67 6d 65 6e 74  w if the segment
3bc0: 20 77 69 74 68 20 65 6e 64 5f 62 6c 6f 63 6b 3d   with end_block=
3bd0: 3f 20 69 73 20 61 70 70 65 6e 64 61 62 6c 65 2e  ? is appendable.
3be0: 20 4f 72 0a 2a 2a 20 20 20 6e 6f 20 72 6f 77 73   Or.**   no rows
3bf0: 20 6f 74 68 65 72 77 69 73 65 2e 20 20 2a 2f 0a   otherwise.  */.
3c00: 2f 2a 20 33 34 20 2a 2f 20 20 22 53 45 4c 45 43  /* 34 */  "SELEC
3c10: 54 20 31 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  T 1 FROM %Q.'%q_
3c20: 73 65 67 6d 65 6e 74 73 27 20 57 48 45 52 45 20  segments' WHERE 
3c30: 62 6c 6f 63 6b 69 64 3d 3f 20 41 4e 44 20 62 6c  blockid=? AND bl
3c40: 6f 63 6b 20 49 53 20 4e 55 4c 4c 22 2c 0a 0a 2f  ock IS NULL",../
3c50: 2a 20 53 51 4c 5f 53 45 4c 45 43 54 5f 49 4e 44  * SQL_SELECT_IND
3c60: 45 58 45 53 0a 2a 2a 20 20 20 52 65 74 75 72 6e  EXES.**   Return
3c70: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 76 61 6c   the list of val
3c80: 69 64 20 73 65 67 6d 65 6e 74 20 69 6e 64 65 78  id segment index
3c90: 65 73 20 66 6f 72 20 61 62 73 6f 6c 75 74 65 20  es for absolute 
3ca0: 6c 65 76 65 6c 20 3f 20 20 2a 2f 0a 2f 2a 20 33  level ?  */./* 3
3cb0: 35 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 69 64  5 */  "SELECT id
3cc0: 78 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65  x FROM %Q.'%q_se
3cd0: 67 64 69 72 27 20 57 48 45 52 45 20 6c 65 76 65  gdir' WHERE leve
3ce0: 6c 3d 3f 20 4f 52 44 45 52 20 42 59 20 31 20 41  l=? ORDER BY 1 A
3cf0: 53 43 22 2c 0a 0a 2f 2a 20 53 51 4c 5f 53 45 4c  SC",../* SQL_SEL
3d00: 45 43 54 5f 4d 58 4c 45 56 45 4c 0a 2a 2a 20 20  ECT_MXLEVEL.**  
3d10: 20 52 65 74 75 72 6e 20 74 68 65 20 6c 61 72 67   Return the larg
3d20: 65 73 74 20 72 65 6c 61 74 69 76 65 20 6c 65 76  est relative lev
3d30: 65 6c 20 69 6e 20 74 68 65 20 46 54 53 20 69 6e  el in the FTS in
3d40: 64 65 78 20 6f 72 20 69 6e 64 65 78 65 73 2e 20  dex or indexes. 
3d50: 20 2a 2f 0a 2f 2a 20 33 36 20 2a 2f 20 20 22 53   */./* 36 */  "S
3d60: 45 4c 45 43 54 20 6d 61 78 28 20 6c 65 76 65 6c  ELECT max( level
3d70: 20 25 25 20 31 30 32 34 20 29 20 46 52 4f 4d 20   %% 1024 ) FROM 
3d80: 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 22 2c  %Q.'%q_segdir'",
3d90: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ..          /* R
3da0: 65 74 75 72 6e 20 73 65 67 6d 65 6e 74 73 20 69  eturn segments i
3db0: 6e 20 6f 72 64 65 72 20 66 72 6f 6d 20 6f 6c 64  n order from old
3dc0: 65 73 74 20 74 6f 20 6e 65 77 65 73 74 2e 2a 2f  est to newest.*/
3dd0: 20 0a 2f 2a 20 33 37 20 2a 2f 20 20 22 53 45 4c   ./* 37 */  "SEL
3de0: 45 43 54 20 6c 65 76 65 6c 2c 20 69 64 78 2c 20  ECT level, idx, 
3df0: 65 6e 64 5f 62 6c 6f 63 6b 20 22 0a 20 20 20 20  end_block ".    
3e00: 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 25 51          "FROM %Q
3e10: 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57 48 45  .'%q_segdir' WHE
3e20: 52 45 20 6c 65 76 65 6c 20 42 45 54 57 45 45 4e  RE level BETWEEN
3e30: 20 3f 20 41 4e 44 20 3f 20 22 0a 20 20 20 20 20   ? AND ? ".     
3e40: 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59         "ORDER BY
3e50: 20 6c 65 76 65 6c 20 44 45 53 43 2c 20 69 64 78   level DESC, idx
3e60: 20 41 53 43 22 2c 0a 0a 20 20 20 20 20 20 20 20   ASC",..        
3e70: 20 20 2f 2a 20 55 70 64 61 74 65 20 73 74 61 74    /* Update stat
3e80: 65 6d 65 6e 74 73 20 75 73 65 64 20 77 68 69 6c  ements used whil
3e90: 65 20 70 72 6f 6d 6f 74 69 6e 67 20 73 65 67 6d  e promoting segm
3ea0: 65 6e 74 73 20 2a 2f 0a 2f 2a 20 33 38 20 2a 2f  ents */./* 38 */
3eb0: 20 20 22 55 50 44 41 54 45 20 4f 52 20 46 41 49    "UPDATE OR FAI
3ec0: 4c 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27  L %Q.'%q_segdir'
3ed0: 20 53 45 54 20 6c 65 76 65 6c 3d 2d 31 2c 69 64   SET level=-1,id
3ee0: 78 3d 3f 20 22 0a 20 20 20 20 20 20 20 20 20 20  x=? ".          
3ef0: 20 20 22 57 48 45 52 45 20 6c 65 76 65 6c 3d 3f    "WHERE level=?
3f00: 20 41 4e 44 20 69 64 78 3d 3f 22 2c 0a 2f 2a 20   AND idx=?",./* 
3f10: 33 39 20 2a 2f 20 20 22 55 50 44 41 54 45 20 4f  39 */  "UPDATE O
3f20: 52 20 46 41 49 4c 20 25 51 2e 27 25 71 5f 73 65  R FAIL %Q.'%q_se
3f30: 67 64 69 72 27 20 53 45 54 20 6c 65 76 65 6c 3d  gdir' SET level=
3f40: 3f 20 57 48 45 52 45 20 6c 65 76 65 6c 3d 2d 31  ? WHERE level=-1
3f50: 22 0a 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 72 63  "..  };.  int rc
3f60: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
3f70: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
3f80: 74 6d 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  tmt;..  assert( 
3f90: 53 69 7a 65 6f 66 41 72 72 61 79 28 61 7a 53 71  SizeofArray(azSq
3fa0: 6c 29 3d 3d 53 69 7a 65 6f 66 41 72 72 61 79 28  l)==SizeofArray(
3fb0: 70 2d 3e 61 53 74 6d 74 29 20 29 3b 0a 20 20 61  p->aStmt) );.  a
3fc0: 73 73 65 72 74 28 20 65 53 74 6d 74 3c 53 69 7a  ssert( eStmt<Siz
3fd0: 65 6f 66 41 72 72 61 79 28 61 7a 53 71 6c 29 20  eofArray(azSql) 
3fe0: 26 26 20 65 53 74 6d 74 3e 3d 30 20 29 3b 0a 20  && eStmt>=0 );. 
3ff0: 20 0a 20 20 70 53 74 6d 74 20 3d 20 70 2d 3e 61   .  pStmt = p->a
4000: 53 74 6d 74 5b 65 53 74 6d 74 5d 3b 0a 20 20 69  Stmt[eStmt];.  i
4010: 66 28 20 21 70 53 74 6d 74 20 29 7b 0a 20 20 20  f( !pStmt ){.   
4020: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20   char *zSql;.   
4030: 20 69 66 28 20 65 53 74 6d 74 3d 3d 53 51 4c 5f   if( eStmt==SQL_
4040: 43 4f 4e 54 45 4e 54 5f 49 4e 53 45 52 54 20 29  CONTENT_INSERT )
4050: 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73  {.      zSql = s
4060: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
4070: 7a 53 71 6c 5b 65 53 74 6d 74 5d 2c 20 70 2d 3e  zSql[eStmt], p->
4080: 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70  zDb, p->zName, p
4090: 2d 3e 7a 57 72 69 74 65 45 78 70 72 6c 69 73 74  ->zWriteExprlist
40a0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
40b0: 20 65 53 74 6d 74 3d 3d 53 51 4c 5f 53 45 4c 45   eStmt==SQL_SELE
40c0: 43 54 5f 43 4f 4e 54 45 4e 54 5f 42 59 5f 52 4f  CT_CONTENT_BY_RO
40d0: 57 49 44 20 29 7b 0a 20 20 20 20 20 20 7a 53 71  WID ){.      zSq
40e0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
40f0: 6e 74 66 28 61 7a 53 71 6c 5b 65 53 74 6d 74 5d  ntf(azSql[eStmt]
4100: 2c 20 70 2d 3e 7a 52 65 61 64 45 78 70 72 6c 69  , p->zReadExprli
4110: 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  st);.    }else{.
4120: 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
4130: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 7a 53  ite3_mprintf(azS
4140: 71 6c 5b 65 53 74 6d 74 5d 2c 20 70 2d 3e 7a 44  ql[eStmt], p->zD
4150: 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  b, p->zName);.  
4160: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a 53 71    }.    if( !zSq
4170: 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
4180: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
4190: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
41a0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
41b0: 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
41c0: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
41d0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
41e0: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
41f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
4200: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
4210: 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
4220: 20 20 70 2d 3e 61 53 74 6d 74 5b 65 53 74 6d 74    p->aStmt[eStmt
4230: 5d 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 7d  ] = pStmt;.    }
4240: 0a 20 20 7d 0a 20 20 69 66 28 20 61 70 56 61 6c  .  }.  if( apVal
4250: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
4260: 20 20 20 69 6e 74 20 6e 50 61 72 61 6d 20 3d 20     int nParam = 
4270: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
4280: 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74  ameter_count(pSt
4290: 6d 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  mt);.    for(i=0
42a0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
42b0: 26 26 20 69 3c 6e 50 61 72 61 6d 3b 20 69 2b 2b  && i<nParam; i++
42c0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
42d0: 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65  lite3_bind_value
42e0: 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61 70 56  (pStmt, i+1, apV
42f0: 61 6c 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  al[i]);.    }.  
4300: 7d 0a 20 20 2a 70 70 20 3d 20 70 53 74 6d 74 3b  }.  *pp = pStmt;
4310: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4320: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
4330: 33 53 65 6c 65 63 74 44 6f 63 73 69 7a 65 28 0a  3SelectDocsize(.
4340: 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 54 61    Fts3Table *pTa
4350: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
4360: 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20    /* FTS3 table 
4370: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69  handle */.  sqli
4380: 74 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64  te3_int64 iDocid
4390: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ,           /* D
43a0: 6f 63 69 64 20 74 6f 20 62 69 6e 64 20 66 6f 72  ocid to bind for
43b0: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 44 4f 43 53   SQL_SELECT_DOCS
43c0: 49 5a 45 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  IZE */.  sqlite3
43d0: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 20 20  _stmt **ppStmt  
43e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
43f0: 20 53 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   Statement handl
4400: 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
4410: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
4420: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61  0;        /* Sta
4430: 74 65 6d 65 6e 74 20 72 65 71 75 65 73 74 65 64  tement requested
4440: 20 66 72 6f 6d 20 66 74 73 33 53 71 6c 53 74 6d   from fts3SqlStm
4450: 74 28 29 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  t() */.  int rc;
4460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4470: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
4480: 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 72 63  rn code */..  rc
4490: 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
44a0: 54 61 62 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f  Tab, SQL_SELECT_
44b0: 44 4f 43 53 49 5a 45 2c 20 26 70 53 74 6d 74 2c  DOCSIZE, &pStmt,
44c0: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
44d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
44e0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
44f0: 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 69 44 6f  64(pStmt, 1, iDo
4500: 63 69 64 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  cid);.    rc = s
4510: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
4520: 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
4530: 53 51 4c 49 54 45 5f 52 4f 57 20 7c 7c 20 73 71  SQLITE_ROW || sq
4540: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
4550: 65 28 70 53 74 6d 74 2c 20 30 29 21 3d 53 51 4c  e(pStmt, 0)!=SQL
4560: 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20  ITE_BLOB ){.    
4570: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
4580: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  eset(pStmt);.   
4590: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
45a0: 45 5f 4f 4b 20 29 20 72 63 20 3d 20 46 54 53 5f  E_OK ) rc = FTS_
45b0: 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20  CORRUPT_VTAB;.  
45c0: 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20      pStmt = 0;. 
45d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
45e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
45f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70      }.  }..  *pp
4600: 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20  Stmt = pStmt;.  
4610: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e  return rc;.}..in
4620: 74 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 6c  t sqlite3Fts3Sel
4630: 65 63 74 44 6f 63 74 6f 74 61 6c 28 0a 20 20 46  ectDoctotal(.  F
4640: 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  ts3Table *pTab, 
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4660: 2a 20 46 74 73 33 20 74 61 62 6c 65 20 68 61 6e  * Fts3 table han
4670: 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dle */.  sqlite3
4680: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 20 20  _stmt **ppStmt  
4690: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
46a0: 20 53 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   Statement handl
46b0: 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
46c0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
46d0: 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72  0;.  int rc;.  r
46e0: 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
46f0: 70 54 61 62 2c 20 53 51 4c 5f 53 45 4c 45 43 54  pTab, SQL_SELECT
4700: 5f 53 54 41 54 2c 20 26 70 53 74 6d 74 2c 20 30  _STAT, &pStmt, 0
4710: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
4720: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
4730: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
4740: 53 74 6d 74 2c 20 31 2c 20 46 54 53 5f 53 54 41  Stmt, 1, FTS_STA
4750: 54 5f 44 4f 43 54 4f 54 41 4c 29 3b 0a 20 20 20  T_DOCTOTAL);.   
4760: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65   if( sqlite3_ste
4770: 70 28 70 53 74 6d 74 29 21 3d 53 51 4c 49 54 45  p(pStmt)!=SQLITE
4780: 5f 52 4f 57 0a 20 20 20 20 20 7c 7c 20 73 71 6c  _ROW.     || sql
4790: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
47a0: 28 70 53 74 6d 74 2c 20 30 29 21 3d 53 51 4c 49  (pStmt, 0)!=SQLI
47b0: 54 45 5f 42 4c 4f 42 0a 20 20 20 20 29 7b 0a 20  TE_BLOB.    ){. 
47c0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
47d0: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
47e0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
47f0: 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 46  LITE_OK ) rc = F
4800: 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b  TS_CORRUPT_VTAB;
4810: 0a 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20 30  .      pStmt = 0
4820: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
4830: 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20  pStmt = pStmt;. 
4840: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69   return rc;.}..i
4850: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 53 65  nt sqlite3Fts3Se
4860: 6c 65 63 74 44 6f 63 73 69 7a 65 28 0a 20 20 46  lectDocsize(.  F
4870: 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  ts3Table *pTab, 
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4890: 2a 20 46 74 73 33 20 74 61 62 6c 65 20 68 61 6e  * Fts3 table han
48a0: 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dle */.  sqlite3
48b0: 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 2c 20 20  _int64 iDocid,  
48c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 69           /* Doci
48d0: 64 20 74 6f 20 72 65 61 64 20 73 69 7a 65 20 64  d to read size d
48e0: 61 74 61 20 66 6f 72 20 2a 2f 0a 20 20 73 71 6c  ata for */.  sql
48f0: 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
4900: 6d 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mt           /* 
4910: 4f 55 54 3a 20 53 74 61 74 65 6d 65 6e 74 20 68  OUT: Statement h
4920: 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a 20 20 72 65  andle */.){.  re
4930: 74 75 72 6e 20 66 74 73 33 53 65 6c 65 63 74 44  turn fts3SelectD
4940: 6f 63 73 69 7a 65 28 70 54 61 62 2c 20 69 44 6f  ocsize(pTab, iDo
4950: 63 69 64 2c 20 70 70 53 74 6d 74 29 3b 0a 7d 0a  cid, ppStmt);.}.
4960: 0a 2f 2a 0a 2a 2a 20 53 69 6d 69 6c 61 72 20 74  ./*.** Similar t
4970: 6f 20 66 74 73 33 53 71 6c 53 74 6d 74 28 29 2e  o fts3SqlStmt().
4980: 20 45 78 63 65 70 74 2c 20 61 66 74 65 72 20 62   Except, after b
4990: 69 6e 64 69 6e 67 20 74 68 65 20 70 61 72 61 6d  inding the param
49a0: 65 74 65 72 73 20 69 6e 0a 2a 2a 20 61 72 72 61  eters in.** arra
49b0: 79 20 61 70 56 61 6c 5b 5d 20 74 6f 20 74 68 65  y apVal[] to the
49c0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
49d0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 65 53 74  dentified by eSt
49e0: 6d 74 2c 20 74 68 65 20 73 74 61 74 65 6d 65 6e  mt, the statemen
49f0: 74 0a 2a 2a 20 69 73 20 65 78 65 63 75 74 65 64  t.** is executed
4a00: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  ..**.** Returns 
4a10: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
4a20: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 75   statement is su
4a30: 63 63 65 73 73 66 75 6c 6c 79 20 65 78 65 63 75  ccessfully execu
4a40: 74 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 53 51  ted, or an.** SQ
4a50: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
4a60: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
4a70: 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 53 71  atic void fts3Sq
4a80: 6c 45 78 65 63 28 0a 20 20 69 6e 74 20 2a 70 52  lExec(.  int *pR
4a90: 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C,              
4aa0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
4ab0: 20 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c 65 20   */.  Fts3Table 
4ac0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
4ad0: 2a 20 54 68 65 20 46 54 53 33 20 74 61 62 6c 65  * The FTS3 table
4ae0: 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74 6d 74 2c   */.  int eStmt,
4af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4b00: 2a 20 49 6e 64 65 78 20 6f 66 20 73 74 61 74 65  * Index of state
4b10: 6d 65 6e 74 20 74 6f 20 65 76 61 6c 75 61 74 65  ment to evaluate
4b20: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
4b30: 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 2f  lue **apVal    /
4b40: 2a 20 50 61 72 61 6d 65 74 65 72 73 20 74 6f 20  * Parameters to 
4b50: 62 69 6e 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  bind */.){.  sql
4b60: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
4b70: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
4b80: 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
4b90: 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
4ba0: 74 6d 74 28 70 2c 20 65 53 74 6d 74 2c 20 26 70  tmt(p, eStmt, &p
4bb0: 53 74 6d 74 2c 20 61 70 56 61 6c 29 3b 20 0a 20  Stmt, apVal); . 
4bc0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4bd0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
4be0: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
4bf0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
4c00: 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
4c10: 7d 0a 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 7d  }.  *pRC = rc;.}
4c20: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
4c30: 6e 63 74 69 6f 6e 20 65 6e 73 75 72 65 73 20 74  nction ensures t
4c40: 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
4c50: 61 73 20 6f 62 74 61 69 6e 65 64 20 61 6e 20 65  as obtained an e
4c60: 78 63 6c 75 73 69 76 65 20 0a 2a 2a 20 73 68 61  xclusive .** sha
4c70: 72 65 64 2d 63 61 63 68 65 20 74 61 62 6c 65 2d  red-cache table-
4c80: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 25 5f 73 65  lock on the %_se
4c90: 67 64 69 72 20 74 61 62 6c 65 2e 20 54 68 69 73  gdir table. This
4ca0: 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66   is required bef
4cb0: 6f 72 65 20 0a 2a 2a 20 77 72 69 74 69 6e 67 20  ore .** writing 
4cc0: 64 61 74 61 20 74 6f 20 74 68 65 20 66 74 73 33  data to the fts3
4cd0: 20 74 61 62 6c 65 2e 20 49 66 20 74 68 69 73 20   table. If this 
4ce0: 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 61 63 71 75  lock is not acqu
4cf0: 69 72 65 64 20 66 69 72 73 74 2c 20 74 68 65 6e  ired first, then
4d00: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 6d  .** the caller m
4d10: 61 79 20 65 6e 64 20 75 70 20 61 74 74 65 6d 70  ay end up attemp
4d20: 74 69 6e 67 20 74 6f 20 74 61 6b 65 20 74 68 69  ting to take thi
4d30: 73 20 6c 6f 63 6b 20 61 73 20 70 61 72 74 20 6f  s lock as part o
4d40: 66 20 63 6f 6d 6d 69 74 74 69 6e 67 0a 2a 2a 20  f committing.** 
4d50: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63  a transaction, c
4d60: 61 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f  ausing SQLite to
4d70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
4d80: 4f 43 4b 45 44 20 6f 72 20 0a 2a 2a 20 4c 4f 43  OCKED or .** LOC
4d90: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 74  KED_SHAREDCACHEt
4da0: 6f 20 61 20 43 4f 4d 4d 49 54 20 63 6f 6d 6d 61  o a COMMIT comma
4db0: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  nd..**.** It is 
4dc0: 62 65 73 74 20 74 6f 20 61 76 6f 69 64 20 74 68  best to avoid th
4dd0: 69 73 20 62 65 63 61 75 73 65 20 69 66 20 46 54  is because if FT
4de0: 53 33 20 72 65 74 75 72 6e 73 20 61 6e 79 20 65  S3 returns any e
4df0: 72 72 6f 72 20 77 68 65 6e 20 0a 2a 2a 20 63 6f  rror when .** co
4e00: 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
4e10: 61 63 74 69 6f 6e 2c 20 74 68 65 20 77 68 6f 6c  action, the whol
4e20: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  e transaction wi
4e30: 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ll be rolled bac
4e40: 6b 2e 20 0a 2a 2a 20 41 6e 64 20 74 68 69 73 20  k. .** And this 
4e50: 69 73 20 6e 6f 74 20 77 68 61 74 20 75 73 65 72  is not what user
4e60: 73 20 65 78 70 65 63 74 20 77 68 65 6e 20 74 68  s expect when th
4e70: 65 79 20 67 65 74 20 53 51 4c 49 54 45 5f 4c 4f  ey get SQLITE_LO
4e80: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
4e90: 2e 20 0a 2a 2a 20 49 74 20 63 61 6e 20 73 74 69  . .** It can sti
4ea0: 6c 6c 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ll happen if the
4eb0: 20 75 73 65 72 20 6c 6f 63 6b 73 20 74 68 65 20   user locks the 
4ec0: 75 6e 64 65 72 6c 79 69 6e 67 20 74 61 62 6c 65  underlying table
4ed0: 73 20 64 69 72 65 63 74 6c 79 20 0a 2a 2a 20 69  s directly .** i
4ee0: 6e 73 74 65 61 64 20 6f 66 20 61 63 63 65 73 73  nstead of access
4ef0: 69 6e 67 20 74 68 65 6d 20 76 69 61 20 46 54 53  ing them via FTS
4f00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4f10: 66 74 73 33 57 72 69 74 65 6c 6f 63 6b 28 46 74  fts3Writelock(Ft
4f20: 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69  s3Table *p){.  i
4f30: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
4f40: 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70 2d 3e 6e  K;.  .  if( p->n
4f50: 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29  PendingData==0 )
4f60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
4f70: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 72  mt *pStmt;.    r
4f80: 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
4f90: 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45  p, SQL_DELETE_SE
4fa0: 47 44 49 52 5f 4c 45 56 45 4c 2c 20 26 70 53 74  GDIR_LEVEL, &pSt
4fb0: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mt, 0);.    if( 
4fc0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
4fd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
4fe0: 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20  ind_null(pStmt, 
4ff0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
5000: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
5010: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
5020: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
5030: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
5040: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5050: 20 46 54 53 20 6d 61 69 6e 74 61 69 6e 73 20 61   FTS maintains a
5060: 20 73 65 70 61 72 61 74 65 20 69 6e 64 65 78 65   separate indexe
5070: 73 20 66 6f 72 20 65 61 63 68 20 6c 61 6e 67 75  s for each langu
5080: 61 67 65 2d 69 64 20 28 61 20 33 32 2d 62 69 74  age-id (a 32-bit
5090: 20 69 6e 74 65 67 65 72 29 2e 0a 2a 2a 20 57 69   integer)..** Wi
50a0: 74 68 69 6e 20 65 61 63 68 20 6c 61 6e 67 75 61  thin each langua
50b0: 67 65 20 69 64 2c 20 61 20 73 65 70 61 72 61 74  ge id, a separat
50c0: 65 20 69 6e 64 65 78 20 69 73 20 6d 61 69 6e 74  e index is maint
50d0: 61 69 6e 65 64 20 74 6f 20 73 74 6f 72 65 20 74  ained to store t
50e0: 68 65 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 20 74  he.** document t
50f0: 65 72 6d 73 2c 20 61 6e 64 20 65 61 63 68 20 63  erms, and each c
5100: 6f 6e 66 69 67 75 72 65 64 20 70 72 65 66 69 78  onfigured prefix
5110: 20 73 69 7a 65 20 28 63 6f 6e 66 69 67 75 72 65   size (configure
5120: 64 20 74 68 65 20 46 54 53 20 0a 2a 2a 20 22 70  d the FTS .** "p
5130: 72 65 66 69 78 3d 22 20 6f 70 74 69 6f 6e 29 2e  refix=" option).
5140: 20 41 6e 64 20 65 61 63 68 20 69 6e 64 65 78 20   And each index 
5150: 63 6f 6e 73 69 73 74 73 20 6f 66 20 6d 75 6c 74  consists of mult
5160: 69 70 6c 65 20 6c 65 76 65 6c 73 20 28 22 72 65  iple levels ("re
5170: 6c 61 74 69 76 65 0a 2a 2a 20 6c 65 76 65 6c 73  lative.** levels
5180: 22 29 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 68  ")..**.** All th
5190: 72 65 65 20 6f 66 20 74 68 65 73 65 20 76 61 6c  ree of these val
51a0: 75 65 73 20 28 74 68 65 20 6c 61 6e 67 75 61 67  ues (the languag
51b0: 65 20 69 64 2c 20 74 68 65 20 73 70 65 63 69 66  e id, the specif
51c0: 69 63 20 69 6e 64 65 78 20 61 6e 64 20 74 68 65  ic index and the
51d0: 0a 2a 2a 20 6c 65 76 65 6c 20 77 69 74 68 69 6e  .** level within
51e0: 20 74 68 65 20 69 6e 64 65 78 29 20 61 72 65 20   the index) are 
51f0: 65 6e 63 6f 64 65 64 20 69 6e 20 36 34 2d 62 69  encoded in 64-bi
5200: 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73  t integer values
5210: 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68   stored.** in th
5220: 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65  e %_segdir table
5230: 20 6f 6e 20 64 69 73 6b 2e 20 54 68 69 73 20 66   on disk. This f
5240: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
5250: 74 6f 20 63 6f 6e 76 65 72 74 20 74 68 72 65 65  to convert three
5260: 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 63 6f 6d  .** separate com
5270: 70 6f 6e 65 6e 74 20 76 61 6c 75 65 73 20 69 6e  ponent values in
5280: 74 6f 20 74 68 65 20 73 69 6e 67 6c 65 20 36 34  to the single 64
5290: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c  -bit integer val
52a0: 75 65 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62  ue that.** can b
52b0: 65 20 75 73 65 64 20 74 6f 20 71 75 65 72 79 20  e used to query 
52c0: 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62  the %_segdir tab
52d0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66  le..**.** Specif
52e0: 69 63 61 6c 6c 79 2c 20 65 61 63 68 20 6c 61 6e  ically, each lan
52f0: 67 75 61 67 65 2d 69 64 2f 69 6e 64 65 78 20 63  guage-id/index c
5300: 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73 20 61 6c  ombination is al
5310: 6c 6f 63 61 74 65 64 20 31 30 32 34 20 0a 2a 2a  located 1024 .**
5320: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
5330: 6c 65 76 65 6c 20 76 61 6c 75 65 73 20 28 22 61  level values ("a
5340: 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 73 22 29  bsolute levels")
5350: 2e 20 54 68 65 20 6d 61 69 6e 20 74 65 72 6d 73  . The main terms
5360: 20 69 6e 64 65 78 0a 2a 2a 20 66 6f 72 20 6c 61   index.** for la
5370: 6e 67 75 61 67 65 2d 69 64 20 30 20 69 73 20 61  nguage-id 0 is a
5380: 6c 6c 6f 63 61 74 65 20 76 61 6c 75 65 73 20 30  llocate values 0
5390: 2d 31 30 32 33 2e 20 54 68 65 20 66 69 72 73 74  -1023. The first
53a0: 20 70 72 65 66 69 78 20 69 6e 64 65 78 0a 2a 2a   prefix index.**
53b0: 20 28 69 66 20 61 6e 79 29 20 66 6f 72 20 6c 61   (if any) for la
53c0: 6e 67 75 61 67 65 2d 69 64 20 30 20 69 73 20 61  nguage-id 0 is a
53d0: 6c 6c 6f 63 61 74 65 64 20 76 61 6c 75 65 73 20  llocated values 
53e0: 31 30 32 34 2d 32 30 34 37 2e 20 41 6e 64 20 73  1024-2047. And s
53f0: 6f 20 6f 6e 2e 0a 2a 2a 20 4c 61 6e 67 75 61 67  o on..** Languag
5400: 65 20 31 20 69 6e 64 65 78 65 73 20 61 72 65 20  e 1 indexes are 
5410: 61 6c 6c 6f 63 61 74 65 64 20 69 6d 6d 65 64 69  allocated immedi
5420: 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
5430: 6c 61 6e 67 75 61 67 65 20 30 2e 0a 2a 2a 0a 2a  language 0..**.*
5440: 2a 20 53 6f 2c 20 66 6f 72 20 61 20 73 79 73 74  * So, for a syst
5450: 65 6d 20 77 69 74 68 20 6e 50 72 65 66 69 78 20  em with nPrefix 
5460: 70 72 65 66 69 78 20 69 6e 64 65 78 65 73 20 63  prefix indexes c
5470: 6f 6e 66 69 67 75 72 65 64 2c 20 74 68 65 20 62  onfigured, the b
5480: 6c 6f 63 6b 20 6f 66 0a 2a 2a 20 61 62 73 6f 6c  lock of.** absol
5490: 75 74 65 20 6c 65 76 65 6c 73 20 74 68 61 74 20  ute levels that 
54a0: 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 6c  corresponds to l
54b0: 61 6e 67 75 61 67 65 2d 69 64 20 69 4c 61 6e 67  anguage-id iLang
54c0: 69 64 20 61 6e 64 20 69 6e 64 65 78 20 0a 2a 2a  id and index .**
54d0: 20 69 49 6e 64 65 78 20 73 74 61 72 74 73 20 61   iIndex starts a
54e0: 74 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c  t absolute level
54f0: 20 28 28 69 4c 61 6e 67 69 64 20 2a 20 28 6e 50   ((iLangid * (nP
5500: 72 65 66 69 78 2b 31 29 20 2b 20 69 49 6e 64 65  refix+1) + iInde
5510: 78 29 20 2a 20 31 30 32 34 29 2e 0a 2a 2f 0a 73  x) * 1024)..*/.s
5520: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e  tatic sqlite3_in
5530: 74 36 34 20 67 65 74 41 62 73 6f 6c 75 74 65 4c  t64 getAbsoluteL
5540: 65 76 65 6c 28 0a 20 20 46 74 73 33 54 61 62 6c  evel(.  Fts3Tabl
5550: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
5560: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20          /* FTS3 
5570: 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
5580: 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20    int iLangid,  
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55a0: 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64    /* Language id
55b0: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 78   */.  int iIndex
55c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
55d0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
55e0: 6e 20 70 2d 3e 61 49 6e 64 65 78 5b 5d 20 2a 2f  n p->aIndex[] */
55f0: 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 20 20 20  .  int iLevel   
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5610: 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 20 73     /* Level of s
5620: 65 67 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  egments */.){.  
5630: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 42  sqlite3_int64 iB
5640: 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
5650: 2f 2a 20 46 69 72 73 74 20 61 62 73 6f 6c 75 74  /* First absolut
5660: 65 20 6c 65 76 65 6c 20 66 6f 72 20 69 4c 61 6e  e level for iLan
5670: 67 69 64 2f 69 49 6e 64 65 78 20 2a 2f 0a 20 20  gid/iIndex */.  
5680: 61 73 73 65 72 74 28 20 69 4c 61 6e 67 69 64 3e  assert( iLangid>
5690: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
56a0: 70 2d 3e 6e 49 6e 64 65 78 3e 30 20 29 3b 0a 20  p->nIndex>0 );. 
56b0: 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 3e   assert( iIndex>
56c0: 3d 30 20 26 26 20 69 49 6e 64 65 78 3c 70 2d 3e  =0 && iIndex<p->
56d0: 6e 49 6e 64 65 78 20 29 3b 0a 0a 20 20 69 42 61  nIndex );..  iBa
56e0: 73 65 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69  se = ((sqlite3_i
56f0: 6e 74 36 34 29 69 4c 61 6e 67 69 64 20 2a 20 70  nt64)iLangid * p
5700: 2d 3e 6e 49 6e 64 65 78 20 2b 20 69 49 6e 64 65  ->nIndex + iInde
5710: 78 29 20 2a 20 46 54 53 33 5f 53 45 47 44 49 52  x) * FTS3_SEGDIR
5720: 5f 4d 41 58 4c 45 56 45 4c 3b 0a 20 20 72 65 74  _MAXLEVEL;.  ret
5730: 75 72 6e 20 69 42 61 73 65 20 2b 20 69 4c 65 76  urn iBase + iLev
5740: 65 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  el;.}../*.** Set
5750: 20 2a 70 70 53 74 6d 74 20 74 6f 20 61 20 73 74   *ppStmt to a st
5760: 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 74  atement handle t
5770: 68 61 74 20 6d 61 79 20 62 65 20 75 73 65 64 20  hat may be used 
5780: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
5790: 67 68 0a 2a 2a 20 61 6c 6c 20 72 6f 77 73 20 69  gh.** all rows i
57a0: 6e 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74  n the %_segdir t
57b0: 61 62 6c 65 2c 20 66 72 6f 6d 20 6f 6c 64 65 73  able, from oldes
57c0: 74 20 74 6f 20 6e 65 77 65 73 74 2e 20 49 66 20  t to newest. If 
57d0: 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72  successful,.** r
57e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
57f0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
5800: 75 72 73 20 77 68 69 6c 65 20 70 72 65 70 61 72  urs while prepar
5810: 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ing the statemen
5820: 74 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e  t, .** return an
5830: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
5840: 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  de..**.** There 
5850: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65  is only ever one
5860: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
5870: 73 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  s SQL statement 
5880: 63 6f 6d 70 69 6c 65 64 20 66 6f 72 0a 2a 2a 20  compiled for.** 
5890: 65 61 63 68 20 46 54 53 33 20 74 61 62 6c 65 2e  each FTS3 table.
58a0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 61 74 65  .**.** The state
58b0: 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 74 68 65  ment returns the
58c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6c 75 6d   following colum
58d0: 6e 73 20 66 72 6f 6d 20 74 68 65 20 25 5f 73 65  ns from the %_se
58e0: 67 64 69 72 20 74 61 62 6c 65 3a 0a 2a 2a 0a 2a  gdir table:.**.*
58f0: 2a 20 20 20 30 3a 20 69 64 78 0a 2a 2a 20 20 20  *   0: idx.**   
5900: 31 3a 20 73 74 61 72 74 5f 62 6c 6f 63 6b 0a 2a  1: start_block.*
5910: 2a 20 20 20 32 3a 20 6c 65 61 76 65 73 5f 65 6e  *   2: leaves_en
5920: 64 5f 62 6c 6f 63 6b 0a 2a 2a 20 20 20 33 3a 20  d_block.**   3: 
5930: 65 6e 64 5f 62 6c 6f 63 6b 0a 2a 2a 20 20 20 34  end_block.**   4
5940: 3a 20 72 6f 6f 74 0a 2a 2f 0a 69 6e 74 20 73 71  : root.*/.int sq
5950: 6c 69 74 65 33 46 74 73 33 41 6c 6c 53 65 67 64  lite3Fts3AllSegd
5960: 69 72 73 28 0a 20 20 46 74 73 33 54 61 62 6c 65  irs(.  Fts3Table
5970: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
5980: 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74         /* FTS3 t
5990: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  able */.  int iL
59a0: 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20 20  angid,          
59b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e            /* Lan
59c0: 67 75 61 67 65 20 62 65 69 6e 67 20 71 75 65 72  guage being quer
59d0: 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e  ied */.  int iIn
59e0: 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  dex,            
59f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
5a00: 78 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65 78 5b  x for p->aIndex[
5a10: 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  ] */.  int iLeve
5a20: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
5a30: 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20         /* Level 
5a40: 74 6f 20 73 65 6c 65 63 74 20 28 72 65 6c 61 74  to select (relat
5a50: 69 76 65 20 6c 65 76 65 6c 29 20 2a 2f 0a 20 20  ive level) */.  
5a60: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
5a70: 70 53 74 6d 74 20 20 20 20 20 20 20 20 20 20 20  pStmt           
5a80: 2f 2a 20 4f 55 54 3a 20 43 6f 6d 70 69 6c 65 64  /* OUT: Compiled
5a90: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b   statement */.){
5aa0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
5ab0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
5ac0: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
5ad0: 20 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45   iLevel==FTS3_SE
5ae0: 47 43 55 52 53 4f 52 5f 41 4c 4c 20 7c 7c 20 69  GCURSOR_ALL || i
5af0: 4c 65 76 65 6c 3e 3d 30 20 29 3b 0a 20 20 61 73  Level>=0 );.  as
5b00: 73 65 72 74 28 20 69 4c 65 76 65 6c 3c 46 54 53  sert( iLevel<FTS
5b10: 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45  3_SEGDIR_MAXLEVE
5b20: 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  L );.  assert( i
5b30: 49 6e 64 65 78 3e 3d 30 20 26 26 20 69 49 6e 64  Index>=0 && iInd
5b40: 65 78 3c 70 2d 3e 6e 49 6e 64 65 78 20 29 3b 0a  ex<p->nIndex );.
5b50: 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20  .  if( iLevel<0 
5b60: 29 7b 0a 20 20 20 20 2f 2a 20 22 53 45 4c 45 43  ){.    /* "SELEC
5b70: 54 20 2a 20 46 52 4f 4d 20 25 5f 73 65 67 64 69  T * FROM %_segdi
5b80: 72 20 57 48 45 52 45 20 6c 65 76 65 6c 20 42 45  r WHERE level BE
5b90: 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 20 4f 52  TWEEN ? AND ? OR
5ba0: 44 45 52 20 42 59 20 2e 2e 2e 22 20 2a 2f 0a 20  DER BY ..." */. 
5bb0: 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53     rc = fts3SqlS
5bc0: 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43  tmt(p, SQL_SELEC
5bd0: 54 5f 4c 45 56 45 4c 5f 52 41 4e 47 45 2c 20 26  T_LEVEL_RANGE, &
5be0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
5bf0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5c00: 20 29 7b 20 0a 20 20 20 20 20 20 73 71 6c 69 74   ){ .      sqlit
5c10: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
5c20: 74 6d 74 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c  tmt, 1, getAbsol
5c30: 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e  uteLevel(p, iLan
5c40: 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 30 29 29  gid, iIndex, 0))
5c50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
5c60: 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
5c70: 2c 20 32 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 2, .          
5c80: 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c  getAbsoluteLevel
5c90: 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e  (p, iLangid, iIn
5ca0: 64 65 78 2c 20 46 54 53 33 5f 53 45 47 44 49 52  dex, FTS3_SEGDIR
5cb0: 5f 4d 41 58 4c 45 56 45 4c 2d 31 29 0a 20 20 20  _MAXLEVEL-1).   
5cc0: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65     );.    }.  }e
5cd0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 22 53 45 4c  lse{.    /* "SEL
5ce0: 45 43 54 20 2a 20 46 52 4f 4d 20 25 5f 73 65 67  ECT * FROM %_seg
5cf0: 64 69 72 20 57 48 45 52 45 20 6c 65 76 65 6c 20  dir WHERE level 
5d00: 3d 20 3f 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e  = ? ORDER BY ...
5d10: 22 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74  " */.    rc = ft
5d20: 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
5d30: 5f 53 45 4c 45 43 54 5f 4c 45 56 45 4c 2c 20 26  _SELECT_LEVEL, &
5d40: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
5d50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5d60: 20 29 7b 20 0a 20 20 20 20 20 20 73 71 6c 69 74   ){ .      sqlit
5d70: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
5d80: 74 6d 74 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c  tmt, 1, getAbsol
5d90: 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e  uteLevel(p, iLan
5da0: 67 69 64 2c 20 69 49 6e 64 65 78 2c 69 4c 65 76  gid, iIndex,iLev
5db0: 65 6c 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  el));.    }.  }.
5dc0: 20 20 2a 70 70 53 74 6d 74 20 3d 20 70 53 74 6d    *ppStmt = pStm
5dd0: 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
5de0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  }.../*.** Append
5df0: 20 61 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74   a single varint
5e00: 20 74 6f 20 61 20 50 65 6e 64 69 6e 67 4c 69 73   to a PendingLis
5e10: 74 20 62 75 66 66 65 72 2e 20 53 51 4c 49 54 45  t buffer. SQLITE
5e20: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
5e30: 2a 2a 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ** if successful
5e40: 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  , or an SQLite e
5e50: 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
5e60: 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ise..**.** This 
5e70: 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 73 65  function also se
5e80: 72 76 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  rves to allocate
5e90: 20 74 68 65 20 50 65 6e 64 69 6e 67 4c 69 73 74   the PendingList
5ea0: 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c   structure itsel
5eb0: 66 2e 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  f..** For exampl
5ec0: 65 2c 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  e, to create a n
5ed0: 65 77 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 73  ew PendingList s
5ee0: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
5ef0: 69 6e 67 20 74 77 6f 0a 2a 2a 20 76 61 72 69 6e  ing two.** varin
5f00: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 65 6e 64  ts:.**.**   Pend
5f10: 69 6e 67 4c 69 73 74 20 2a 70 20 3d 20 30 3b 0a  ingList *p = 0;.
5f20: 2a 2a 20 20 20 66 74 73 33 50 65 6e 64 69 6e 67  **   fts3Pending
5f30: 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e 74  ListAppendVarint
5f40: 28 26 70 2c 20 31 29 3b 0a 2a 2a 20 20 20 66 74  (&p, 1);.**   ft
5f50: 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70  s3PendingListApp
5f60: 65 6e 64 56 61 72 69 6e 74 28 26 70 2c 20 32 29  endVarint(&p, 2)
5f70: 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.*/.static int 
5f80: 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41  fts3PendingListA
5f90: 70 70 65 6e 64 56 61 72 69 6e 74 28 0a 20 20 50  ppendVarint(.  P
5fa0: 65 6e 64 69 6e 67 4c 69 73 74 20 2a 2a 70 70 2c  endingList **pp,
5fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5fc0: 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65  * IN/OUT: Pointe
5fd0: 72 20 74 6f 20 50 65 6e 64 69 6e 67 4c 69 73 74  r to PendingList
5fe0: 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 73 71 6c   struct */.  sql
5ff0: 69 74 65 33 5f 69 6e 74 36 34 20 69 20 20 20 20  ite3_int64 i    
6000: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6010: 56 61 6c 75 65 20 74 6f 20 61 70 70 65 6e 64 20  Value to append 
6020: 74 6f 20 64 61 74 61 20 2a 2f 0a 29 7b 0a 20 20  to data */.){.  
6030: 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70 20 3d  PendingList *p =
6040: 20 2a 70 70 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f   *pp;..  /* Allo
6050: 63 61 74 65 20 6f 72 20 67 72 6f 77 20 74 68 65  cate or grow the
6060: 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 61 73 20   PendingList as 
6070: 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69  required. */.  i
6080: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 70 20 3d  f( !p ){.    p =
6090: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
60a0: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 31 30 30  sizeof(*p) + 100
60b0: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 20 29 7b  );.    if( !p ){
60c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
60d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
60e0: 7d 0a 20 20 20 20 70 2d 3e 6e 53 70 61 63 65 20  }.    p->nSpace 
60f0: 3d 20 31 30 30 3b 0a 20 20 20 20 70 2d 3e 61 44  = 100;.    p->aD
6100: 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29 26 70  ata = (char *)&p
6110: 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 6e 44 61 74  [1];.    p->nDat
6120: 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 65 6c 73  a = 0;.  }.  els
6130: 65 20 69 66 28 20 70 2d 3e 6e 44 61 74 61 2b 46  e if( p->nData+F
6140: 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 2b 31  TS3_VARINT_MAX+1
6150: 3e 70 2d 3e 6e 53 70 61 63 65 20 29 7b 0a 20 20  >p->nSpace ){.  
6160: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 2d 3e    int nNew = p->
6170: 6e 53 70 61 63 65 20 2a 20 32 3b 0a 20 20 20 20  nSpace * 2;.    
6180: 70 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  p = sqlite3_real
6190: 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 2a 70  loc(p, sizeof(*p
61a0: 29 20 2b 20 6e 4e 65 77 29 3b 0a 20 20 20 20 69  ) + nNew);.    i
61b0: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 20 20 73  f( !p ){.      s
61c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70 70 29  qlite3_free(*pp)
61d0: 3b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 30 3b  ;.      *pp = 0;
61e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
61f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
6200: 7d 0a 20 20 20 20 70 2d 3e 6e 53 70 61 63 65 20  }.    p->nSpace 
6210: 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 61  = nNew;.    p->a
6220: 44 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29 26  Data = (char *)&
6230: 70 5b 31 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  p[1];.  }..  /* 
6240: 41 70 70 65 6e 64 20 74 68 65 20 6e 65 77 20 73  Append the new s
6250: 65 72 69 61 6c 69 7a 65 64 20 76 61 72 69 6e 74  erialized varint
6260: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
6270: 68 65 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 70 2d  he list. */.  p-
6280: 3e 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69 74 65  >nData += sqlite
6290: 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26  3Fts3PutVarint(&
62a0: 70 2d 3e 61 44 61 74 61 5b 70 2d 3e 6e 44 61 74  p->aData[p->nDat
62b0: 61 5d 2c 20 69 29 3b 0a 20 20 70 2d 3e 61 44 61  a], i);.  p->aDa
62c0: 74 61 5b 70 2d 3e 6e 44 61 74 61 5d 20 3d 20 27  ta[p->nData] = '
62d0: 5c 30 27 3b 0a 20 20 2a 70 70 20 3d 20 70 3b 0a  \0';.  *pp = p;.
62e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
62f0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  OK;.}../*.** Add
6300: 20 61 20 64 6f 63 69 64 2f 63 6f 6c 75 6d 6e 2f   a docid/column/
6310: 70 6f 73 69 74 69 6f 6e 20 65 6e 74 72 79 20 74  position entry t
6320: 6f 20 61 20 50 65 6e 64 69 6e 67 4c 69 73 74 20  o a PendingList 
6330: 73 74 72 75 63 74 75 72 65 2e 20 4e 6f 6e 2d 7a  structure. Non-z
6340: 65 72 6f 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ero.** is return
6350: 65 64 20 69 66 20 74 68 65 20 73 74 72 75 63 74  ed if the struct
6360: 75 72 65 20 69 73 20 73 71 6c 69 74 65 33 5f 72  ure is sqlite3_r
6370: 65 61 6c 6c 6f 63 65 64 20 61 73 20 70 61 72 74  ealloced as part
6380: 20 6f 66 20 61 64 64 69 6e 67 0a 2a 2a 20 74 68   of adding.** th
6390: 65 20 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69  e entry. Otherwi
63a0: 73 65 2c 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  se, zero..**.** 
63b0: 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
63c0: 6f 63 63 75 72 73 2c 20 2a 70 52 63 20 69 73 20  occurs, *pRc is 
63d0: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f  set to SQLITE_NO
63e0: 4d 45 4d 20 62 65 66 6f 72 65 20 72 65 74 75 72  MEM before retur
63f0: 6e 69 6e 67 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73  ning..** Zero is
6400: 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 65 64   always returned
6410: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 4f   in this case. O
6420: 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20  therwise, if no 
6430: 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
6440: 2c 0a 2a 2a 20 69 74 20 69 73 20 73 65 74 20 74  ,.** it is set t
6450: 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  o SQLITE_OK..*/.
6460: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 50  static int fts3P
6470: 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64  endingListAppend
6480: 28 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73 74 20  (.  PendingList 
6490: 2a 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20  **pp,           
64a0: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50      /* IN/OUT: P
64b0: 65 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63  endingList struc
64c0: 74 75 72 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ture */.  sqlite
64d0: 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 2c 20  3_int64 iDocid, 
64e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63            /* Doc
64f0: 69 64 20 66 6f 72 20 65 6e 74 72 79 20 74 6f 20  id for entry to 
6500: 61 64 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  add */.  sqlite3
6510: 5f 69 6e 74 36 34 20 69 43 6f 6c 2c 20 20 20 20  _int64 iCol,    
6520: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
6530: 6d 6e 20 66 6f 72 20 65 6e 74 72 79 20 74 6f 20  mn for entry to 
6540: 61 64 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  add */.  sqlite3
6550: 5f 69 6e 74 36 34 20 69 50 6f 73 2c 20 20 20 20  _int64 iPos,    
6560: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69           /* Posi
6570: 74 69 6f 6e 20 6f 66 20 74 65 72 6d 20 66 6f 72  tion of term for
6580: 20 65 6e 74 72 79 20 74 6f 20 61 64 64 20 2a 2f   entry to add */
6590: 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20 20  .  int *pRc     
65a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65b0: 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72     /* OUT: Retur
65c0: 6e 20 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 50  n code */.){.  P
65d0: 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70 20 3d 20  endingList *p = 
65e0: 2a 70 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *pp;.  int rc = 
65f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
6600: 73 65 72 74 28 20 21 70 20 7c 7c 20 70 2d 3e 69  sert( !p || p->i
6610: 4c 61 73 74 44 6f 63 69 64 3c 3d 69 44 6f 63 69  LastDocid<=iDoci
6620: 64 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 20 7c  d );..  if( !p |
6630: 7c 20 70 2d 3e 69 4c 61 73 74 44 6f 63 69 64 21  | p->iLastDocid!
6640: 3d 69 44 6f 63 69 64 20 29 7b 0a 20 20 20 20 73  =iDocid ){.    s
6650: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 65  qlite3_int64 iDe
6660: 6c 74 61 20 3d 20 69 44 6f 63 69 64 20 2d 20 28  lta = iDocid - (
6670: 70 20 3f 20 70 2d 3e 69 4c 61 73 74 44 6f 63 69  p ? p->iLastDoci
6680: 64 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20  d : 0);.    if( 
6690: 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
66a0: 74 28 20 70 2d 3e 6e 44 61 74 61 3c 70 2d 3e 6e  t( p->nData<p->n
66b0: 53 70 61 63 65 20 29 3b 0a 20 20 20 20 20 20 61  Space );.      a
66c0: 73 73 65 72 74 28 20 70 2d 3e 61 44 61 74 61 5b  ssert( p->aData[
66d0: 70 2d 3e 6e 44 61 74 61 5d 3d 3d 30 20 29 3b 0a  p->nData]==0 );.
66e0: 20 20 20 20 20 20 70 2d 3e 6e 44 61 74 61 2b 2b        p->nData++
66f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6700: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
6710: 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74   fts3PendingList
6720: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2c  AppendVarint(&p,
6730: 20 69 44 65 6c 74 61 29 29 20 29 7b 0a 20 20 20   iDelta)) ){.   
6740: 20 20 20 67 6f 74 6f 20 70 65 6e 64 69 6e 67 6c     goto pendingl
6750: 69 73 74 61 70 70 65 6e 64 5f 6f 75 74 3b 0a 20  istappend_out;. 
6760: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 4c 61 73     }.    p->iLas
6770: 74 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 70  tCol = -1;.    p
6780: 2d 3e 69 4c 61 73 74 50 6f 73 20 3d 20 30 3b 0a  ->iLastPos = 0;.
6790: 20 20 20 20 70 2d 3e 69 4c 61 73 74 44 6f 63 69      p->iLastDoci
67a0: 64 20 3d 20 69 44 6f 63 69 64 3b 0a 20 20 7d 0a  d = iDocid;.  }.
67b0: 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 26 26 20    if( iCol>0 && 
67c0: 70 2d 3e 69 4c 61 73 74 43 6f 6c 21 3d 69 43 6f  p->iLastCol!=iCo
67d0: 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c  l ){.    if( SQL
67e0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 66 74  ITE_OK!=(rc = ft
67f0: 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70  s3PendingListApp
6800: 65 6e 64 56 61 72 69 6e 74 28 26 70 2c 20 31 29  endVarint(&p, 1)
6810: 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45  ).     || SQLITE
6820: 5f 4f 4b 21 3d 28 72 63 20 3d 20 66 74 73 33 50  _OK!=(rc = fts3P
6830: 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64  endingListAppend
6840: 56 61 72 69 6e 74 28 26 70 2c 20 69 43 6f 6c 29  Varint(&p, iCol)
6850: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
6860: 6f 74 6f 20 70 65 6e 64 69 6e 67 6c 69 73 74 61  oto pendinglista
6870: 70 70 65 6e 64 5f 6f 75 74 3b 0a 20 20 20 20 7d  ppend_out;.    }
6880: 0a 20 20 20 20 70 2d 3e 69 4c 61 73 74 43 6f 6c  .    p->iLastCol
6890: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e   = iCol;.    p->
68a0: 69 4c 61 73 74 50 6f 73 20 3d 20 30 3b 0a 20 20  iLastPos = 0;.  
68b0: 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20  }.  if( iCol>=0 
68c0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
68d0: 50 6f 73 3e 70 2d 3e 69 4c 61 73 74 50 6f 73 20  Pos>p->iLastPos 
68e0: 7c 7c 20 28 69 50 6f 73 3d 3d 30 20 26 26 20 70  || (iPos==0 && p
68f0: 2d 3e 69 4c 61 73 74 50 6f 73 3d 3d 30 29 20 29  ->iLastPos==0) )
6900: 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 50  ;.    rc = fts3P
6910: 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64  endingListAppend
6920: 56 61 72 69 6e 74 28 26 70 2c 20 32 2b 69 50 6f  Varint(&p, 2+iPo
6930: 73 2d 70 2d 3e 69 4c 61 73 74 50 6f 73 29 3b 0a  s-p->iLastPos);.
6940: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
6950: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
6960: 2d 3e 69 4c 61 73 74 50 6f 73 20 3d 20 69 50 6f  ->iLastPos = iPo
6970: 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 70  s;.    }.  }.. p
6980: 65 6e 64 69 6e 67 6c 69 73 74 61 70 70 65 6e 64  endinglistappend
6990: 5f 6f 75 74 3a 0a 20 20 2a 70 52 63 20 3d 20 72  _out:.  *pRc = r
69a0: 63 3b 0a 20 20 69 66 28 20 70 21 3d 2a 70 70 20  c;.  if( p!=*pp 
69b0: 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 3b 0a  ){.    *pp = p;.
69c0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
69d0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
69e0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 50 65  ./*.** Free a Pe
69f0: 6e 64 69 6e 67 4c 69 73 74 20 6f 62 6a 65 63 74  ndingList object
6a00: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 74   allocated by ft
6a10: 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70  s3PendingListApp
6a20: 65 6e 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  end()..*/.static
6a30: 20 76 6f 69 64 20 66 74 73 33 50 65 6e 64 69 6e   void fts3Pendin
6a40: 67 4c 69 73 74 44 65 6c 65 74 65 28 50 65 6e 64  gListDelete(Pend
6a50: 69 6e 67 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  ingList *pList){
6a60: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
6a70: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
6a80: 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   Add an entry to
6a90: 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 65 6e 64   one of the pend
6aa0: 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20 74  ing-terms hash t
6ab0: 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
6ac0: 20 69 6e 74 20 66 74 73 33 50 65 6e 64 69 6e 67   int fts3Pending
6ad0: 54 65 72 6d 73 41 64 64 4f 6e 65 28 0a 20 20 46  TermsAddOne(.  F
6ae0: 74 73 33 54 61 62 6c 65 20 2a 70 2c 0a 20 20 69  ts3Table *p,.  i
6af0: 6e 74 20 69 43 6f 6c 2c 0a 20 20 69 6e 74 20 69  nt iCol,.  int i
6b00: 50 6f 73 2c 0a 20 20 46 74 73 33 48 61 73 68 20  Pos,.  Fts3Hash 
6b10: 2a 70 48 61 73 68 2c 20 20 20 20 20 20 20 20 20  *pHash,         
6b20: 20 20 20 20 20 20 20 2f 2a 20 50 65 6e 64 69 6e         /* Pendin
6b30: 67 20 74 65 72 6d 73 20 68 61 73 68 20 74 61 62  g terms hash tab
6b40: 6c 65 20 74 6f 20 61 64 64 20 65 6e 74 72 79 20  le to add entry 
6b50: 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  to */.  const ch
6b60: 61 72 20 2a 7a 54 6f 6b 65 6e 2c 0a 20 20 69 6e  ar *zToken,.  in
6b70: 74 20 6e 54 6f 6b 65 6e 0a 29 7b 0a 20 20 50 65  t nToken.){.  Pe
6b80: 6e 64 69 6e 67 4c 69 73 74 20 2a 70 4c 69 73 74  ndingList *pList
6b90: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
6ba0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 4c 69 73 74  ITE_OK;..  pList
6bb0: 20 3d 20 28 50 65 6e 64 69 6e 67 4c 69 73 74 20   = (PendingList 
6bc0: 2a 29 66 74 73 33 48 61 73 68 46 69 6e 64 28 70  *)fts3HashFind(p
6bd0: 48 61 73 68 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54  Hash, zToken, nT
6be0: 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 70 4c 69  oken);.  if( pLi
6bf0: 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 50 65  st ){.    p->nPe
6c00: 6e 64 69 6e 67 44 61 74 61 20 2d 3d 20 28 70 4c  ndingData -= (pL
6c10: 69 73 74 2d 3e 6e 44 61 74 61 20 2b 20 6e 54 6f  ist->nData + nTo
6c20: 6b 65 6e 20 2b 20 73 69 7a 65 6f 66 28 46 74 73  ken + sizeof(Fts
6c30: 33 48 61 73 68 45 6c 65 6d 29 29 3b 0a 20 20 7d  3HashElem));.  }
6c40: 0a 20 20 69 66 28 20 66 74 73 33 50 65 6e 64 69  .  if( fts3Pendi
6c50: 6e 67 4c 69 73 74 41 70 70 65 6e 64 28 26 70 4c  ngListAppend(&pL
6c60: 69 73 74 2c 20 70 2d 3e 69 50 72 65 76 44 6f 63  ist, p->iPrevDoc
6c70: 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20  id, iCol, iPos, 
6c80: 26 72 63 29 20 29 7b 0a 20 20 20 20 69 66 28 20  &rc) ){.    if( 
6c90: 70 4c 69 73 74 3d 3d 66 74 73 33 48 61 73 68 49  pList==fts3HashI
6ca0: 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 54 6f  nsert(pHash, zTo
6cb0: 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 70 4c 69  ken, nToken, pLi
6cc0: 73 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  st) ){.      /* 
6cd0: 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 77 68  Malloc failed wh
6ce0: 69 6c 65 20 69 6e 73 65 72 74 69 6e 67 20 74 68  ile inserting th
6cf0: 65 20 6e 65 77 20 65 6e 74 72 79 2e 20 54 68 69  e new entry. Thi
6d00: 73 20 63 61 6e 20 6f 6e 6c 79 20 0a 20 20 20 20  s can only .    
6d10: 20 20 2a 2a 20 68 61 70 70 65 6e 20 69 66 20 74    ** happen if t
6d20: 68 65 72 65 20 77 61 73 20 6e 6f 20 70 72 65 76  here was no prev
6d30: 69 6f 75 73 20 65 6e 74 72 79 20 66 6f 72 20 74  ious entry for t
6d40: 68 69 73 20 74 6f 6b 65 6e 2e 0a 20 20 20 20 20  his token..     
6d50: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
6d60: 28 20 30 3d 3d 66 74 73 33 48 61 73 68 46 69 6e  ( 0==fts3HashFin
6d70: 64 28 70 48 61 73 68 2c 20 7a 54 6f 6b 65 6e 2c  d(pHash, zToken,
6d80: 20 6e 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20   nToken) );.    
6d90: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6da0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 63 20  List);.      rc 
6db0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
6dc0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
6dd0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6de0: 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67  .    p->nPending
6df0: 44 61 74 61 20 2b 3d 20 28 70 4c 69 73 74 2d 3e  Data += (pList->
6e00: 6e 44 61 74 61 20 2b 20 6e 54 6f 6b 65 6e 20 2b  nData + nToken +
6e10: 20 73 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68   sizeof(Fts3Hash
6e20: 45 6c 65 6d 29 29 3b 0a 20 20 7d 0a 20 20 72 65  Elem));.  }.  re
6e30: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
6e40: 2a 20 54 6f 6b 65 6e 69 7a 65 20 74 68 65 20 6e  * Tokenize the n
6e50: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
6e60: 72 69 6e 67 20 7a 54 65 78 74 20 61 6e 64 20 61  ring zText and a
6e70: 64 64 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 74 6f  dd all tokens to
6e80: 20 74 68 65 0a 2a 2a 20 70 65 6e 64 69 6e 67 2d   the.** pending-
6e90: 74 65 72 6d 73 20 68 61 73 68 2d 74 61 62 6c 65  terms hash-table
6ea0: 2e 20 54 68 65 20 64 6f 63 69 64 20 75 73 65 64  . The docid used
6eb0: 20 69 73 20 74 68 61 74 20 63 75 72 72 65 6e 74   is that current
6ec0: 6c 79 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ly stored in.** 
6ed0: 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 2c 20 61  p->iPrevDocid, a
6ee0: 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  nd the column is
6ef0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 61 72   specified by ar
6f00: 67 75 6d 65 6e 74 20 69 43 6f 6c 2e 0a 2a 2a 0a  gument iCol..**.
6f10: 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
6f20: 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
6f30: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
6f40: 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  se, an SQLite er
6f50: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
6f60: 74 69 63 20 69 6e 74 20 66 74 73 33 50 65 6e 64  tic int fts3Pend
6f70: 69 6e 67 54 65 72 6d 73 41 64 64 28 0a 20 20 46  ingTermsAdd(.  F
6f80: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
6f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6fa0: 2a 20 54 61 62 6c 65 20 69 6e 74 6f 20 77 68 69  * Table into whi
6fb0: 63 68 20 74 65 78 74 20 77 69 6c 6c 20 62 65 20  ch text will be 
6fc0: 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e  inserted */.  in
6fd0: 74 20 69 4c 61 6e 67 69 64 2c 20 20 20 20 20 20  t iLangid,      
6fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6ff0: 20 4c 61 6e 67 75 61 67 65 20 69 64 20 74 6f 20   Language id to 
7000: 75 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  use */.  const c
7010: 68 61 72 20 2a 7a 54 65 78 74 2c 20 20 20 20 20  har *zText,     
7020: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
7030: 20 6f 66 20 64 6f 63 75 6d 65 6e 74 20 74 6f 20   of document to 
7040: 62 65 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20  be inserted */. 
7050: 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20   int iCol,      
7060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7070: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 74 6f 20   /* Column into 
7080: 77 68 69 63 68 20 74 65 78 74 20 69 73 20 62 65  which text is be
7090: 69 6e 67 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a  ing inserted */.
70a0: 20 20 75 33 32 20 2a 70 6e 57 6f 72 64 20 20 20    u32 *pnWord   
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70c0: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 49 6e 63    /* IN/OUT: Inc
70d0: 72 2e 20 62 79 20 6e 75 6d 62 65 72 20 74 6f 6b  r. by number tok
70e0: 65 6e 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a  ens inserted */.
70f0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
7100: 6e 74 20 69 53 74 61 72 74 20 3d 20 30 3b 0a 20  nt iStart = 0;. 
7110: 20 69 6e 74 20 69 45 6e 64 20 3d 20 30 3b 0a 20   int iEnd = 0;. 
7120: 20 69 6e 74 20 69 50 6f 73 20 3d 20 30 3b 0a 20   int iPos = 0;. 
7130: 20 69 6e 74 20 6e 57 6f 72 64 20 3d 20 30 3b 0a   int nWord = 0;.
7140: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
7150: 54 6f 6b 65 6e 3b 0a 20 20 69 6e 74 20 6e 54 6f  Token;.  int nTo
7160: 6b 65 6e 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69  ken = 0;..  sqli
7170: 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a 70  te3_tokenizer *p
7180: 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 70 2d 3e 70  Tokenizer = p->p
7190: 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 73 71 6c  Tokenizer;.  sql
71a0: 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d  ite3_tokenizer_m
71b0: 6f 64 75 6c 65 20 63 6f 6e 73 74 20 2a 70 4d 6f  odule const *pMo
71c0: 64 75 6c 65 20 3d 20 70 54 6f 6b 65 6e 69 7a 65  dule = pTokenize
71d0: 72 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 73 71  r->pModule;.  sq
71e0: 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
71f0: 63 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20  cursor *pCsr;.  
7200: 69 6e 74 20 28 2a 78 4e 65 78 74 29 28 73 71 6c  int (*xNext)(sql
7210: 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 63  ite3_tokenizer_c
7220: 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c 0a  ursor *pCursor,.
7230: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
7240: 2a 2a 2c 69 6e 74 2a 2c 69 6e 74 2a 2c 69 6e 74  **,int*,int*,int
7250: 2a 2c 69 6e 74 2a 29 3b 0a 0a 20 20 61 73 73 65  *,int*);..  asse
7260: 72 74 28 20 70 54 6f 6b 65 6e 69 7a 65 72 20 26  rt( pTokenizer &
7270: 26 20 70 4d 6f 64 75 6c 65 20 29 3b 0a 0a 20 20  & pModule );..  
7280: 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68  /* If the user h
7290: 61 73 20 69 6e 73 65 72 74 65 64 20 61 20 4e 55  as inserted a NU
72a0: 4c 4c 20 76 61 6c 75 65 2c 20 74 68 69 73 20 66  LL value, this f
72b0: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63  unction may be c
72c0: 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20  alled with.  ** 
72d0: 7a 54 65 78 74 3d 3d 30 2e 20 49 6e 20 74 68 69  zText==0. In thi
72e0: 73 20 63 61 73 65 2c 20 61 64 64 20 7a 65 72 6f  s case, add zero
72f0: 20 74 6f 6b 65 6e 20 65 6e 74 72 69 65 73 20 74   token entries t
7300: 6f 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  o the hash table
7310: 20 61 6e 64 20 0a 20 20 2a 2a 20 72 65 74 75 72   and .  ** retur
7320: 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 69 66  n early. */.  if
7330: 28 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20  ( zText==0 ){.  
7340: 20 20 2a 70 6e 57 6f 72 64 20 3d 20 30 3b 0a 20    *pnWord = 0;. 
7350: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7360: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  _OK;.  }..  rc =
7370: 20 73 71 6c 69 74 65 33 46 74 73 33 4f 70 65 6e   sqlite3Fts3Open
7380: 54 6f 6b 65 6e 69 7a 65 72 28 70 54 6f 6b 65 6e  Tokenizer(pToken
7390: 69 7a 65 72 2c 20 69 4c 61 6e 67 69 64 2c 20 7a  izer, iLangid, z
73a0: 54 65 78 74 2c 20 2d 31 2c 20 26 70 43 73 72 29  Text, -1, &pCsr)
73b0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
73c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
73d0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 78  urn rc;.  }..  x
73e0: 4e 65 78 74 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e  Next = pModule->
73f0: 78 4e 65 78 74 3b 0a 20 20 77 68 69 6c 65 28 20  xNext;.  while( 
7400: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 0a 20 20  SQLITE_OK==rc.  
7410: 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b      && SQLITE_OK
7420: 3d 3d 28 72 63 20 3d 20 78 4e 65 78 74 28 70 43  ==(rc = xNext(pC
7430: 73 72 2c 20 26 7a 54 6f 6b 65 6e 2c 20 26 6e 54  sr, &zToken, &nT
7440: 6f 6b 65 6e 2c 20 26 69 53 74 61 72 74 2c 20 26  oken, &iStart, &
7450: 69 45 6e 64 2c 20 26 69 50 6f 73 29 29 0a 20 20  iEnd, &iPos)).  
7460: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
7470: 20 20 69 66 28 20 69 50 6f 73 3e 3d 6e 57 6f 72    if( iPos>=nWor
7480: 64 20 29 20 6e 57 6f 72 64 20 3d 20 69 50 6f 73  d ) nWord = iPos
7490: 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 73 69  +1;..    /* Posi
74a0: 74 69 6f 6e 73 20 63 61 6e 6e 6f 74 20 62 65 20  tions cannot be 
74b0: 6e 65 67 61 74 69 76 65 3b 20 77 65 20 75 73 65  negative; we use
74c0: 20 2d 31 20 61 73 20 61 20 74 65 72 6d 69 6e 61   -1 as a termina
74d0: 74 6f 72 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  tor internally..
74e0: 20 20 20 20 2a 2a 20 54 6f 6b 65 6e 73 20 6d 75      ** Tokens mu
74f0: 73 74 20 68 61 76 65 20 61 20 6e 6f 6e 2d 7a 65  st have a non-ze
7500: 72 6f 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 2a  ro length..    *
7510: 2f 0a 20 20 20 20 69 66 28 20 69 50 6f 73 3c 30  /.    if( iPos<0
7520: 20 7c 7c 20 21 7a 54 6f 6b 65 6e 20 7c 7c 20 6e   || !zToken || n
7530: 54 6f 6b 65 6e 3c 3d 30 20 29 7b 0a 20 20 20 20  Token<=0 ){.    
7540: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
7550: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
7560: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
7570: 41 64 64 20 74 68 65 20 74 65 72 6d 20 74 6f 20  Add the term to 
7580: 74 68 65 20 74 65 72 6d 73 20 69 6e 64 65 78 20  the terms index 
7590: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  */.    rc = fts3
75a0: 50 65 6e 64 69 6e 67 54 65 72 6d 73 41 64 64 4f  PendingTermsAddO
75b0: 6e 65 28 0a 20 20 20 20 20 20 20 20 70 2c 20 69  ne(.        p, i
75c0: 43 6f 6c 2c 20 69 50 6f 73 2c 20 26 70 2d 3e 61  Col, iPos, &p->a
75d0: 49 6e 64 65 78 5b 30 5d 2e 68 50 65 6e 64 69 6e  Index[0].hPendin
75e0: 67 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  g, zToken, nToke
75f0: 6e 0a 20 20 20 20 29 3b 0a 20 20 20 20 0a 20 20  n.    );.    .  
7600: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 65 72    /* Add the ter
7610: 6d 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65  m to each of the
7620: 20 70 72 65 66 69 78 20 69 6e 64 65 78 65 73 20   prefix indexes 
7630: 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 74  that it is not t
7640: 6f 6f 20 0a 20 20 20 20 2a 2a 20 73 68 6f 72 74  oo .    ** short
7650: 20 66 6f 72 2e 20 2a 2f 0a 20 20 20 20 66 6f 72   for. */.    for
7660: 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=1; rc==SQLITE
7670: 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 49 6e 64  _OK && i<p->nInd
7680: 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ex; i++){.      
7690: 73 74 72 75 63 74 20 46 74 73 33 49 6e 64 65 78  struct Fts3Index
76a0: 20 2a 70 49 6e 64 65 78 20 3d 20 26 70 2d 3e 61   *pIndex = &p->a
76b0: 49 6e 64 65 78 5b 69 5d 3b 0a 20 20 20 20 20 20  Index[i];.      
76c0: 69 66 28 20 6e 54 6f 6b 65 6e 3c 70 49 6e 64 65  if( nToken<pInde
76d0: 78 2d 3e 6e 50 72 65 66 69 78 20 29 20 63 6f 6e  x->nPrefix ) con
76e0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 72 63 20  tinue;.      rc 
76f0: 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72  = fts3PendingTer
7700: 6d 73 41 64 64 4f 6e 65 28 0a 20 20 20 20 20 20  msAddOne(.      
7710: 20 20 20 20 70 2c 20 69 43 6f 6c 2c 20 69 50 6f      p, iCol, iPo
7720: 73 2c 20 26 70 49 6e 64 65 78 2d 3e 68 50 65 6e  s, &pIndex->hPen
7730: 64 69 6e 67 2c 20 7a 54 6f 6b 65 6e 2c 20 70 49  ding, zToken, pI
7740: 6e 64 65 78 2d 3e 6e 50 72 65 66 69 78 0a 20 20  ndex->nPrefix.  
7750: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
7760: 0a 0a 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c  ..  pModule->xCl
7770: 6f 73 65 28 70 43 73 72 29 3b 0a 20 20 2a 70 6e  ose(pCsr);.  *pn
7780: 57 6f 72 64 20 2b 3d 20 6e 57 6f 72 64 3b 0a 20  Word += nWord;. 
7790: 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
77a0: 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54  ITE_DONE ? SQLIT
77b0: 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f  E_OK : rc);.}../
77c0: 2a 20 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68  * .** Calling th
77d0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69  is function indi
77e0: 63 61 74 65 73 20 74 68 61 74 20 73 75 62 73 65  cates that subse
77f0: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 0a  quent calls to .
7800: 2a 2a 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65  ** fts3PendingTe
7810: 72 6d 73 41 64 64 28 29 20 61 72 65 20 74 6f 20  rmsAdd() are to 
7820: 61 64 64 20 74 65 72 6d 2f 70 6f 73 69 74 69 6f  add term/positio
7830: 6e 2d 6c 69 73 74 20 70 61 69 72 73 20 66 6f 72  n-list pairs for
7840: 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
7850: 20 6f 66 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   of the document
7860: 20 77 69 74 68 20 64 6f 63 69 64 20 69 44 6f 63   with docid iDoc
7870: 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  id..*/.static in
7880: 74 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72  t fts3PendingTer
7890: 6d 73 44 6f 63 69 64 28 0a 20 20 46 74 73 33 54  msDocid(.  Fts3T
78a0: 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
78b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
78c0: 6c 6c 2d 74 65 78 74 20 74 61 62 6c 65 20 68 61  ll-text table ha
78d0: 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ndle */.  int iL
78e0: 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20 20  angid,          
78f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e            /* Lan
7900: 67 75 61 67 65 20 69 64 20 6f 66 20 72 6f 77 20  guage id of row 
7910: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f  being written */
7920: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
7930: 69 44 6f 63 69 64 20 20 20 20 20 20 20 20 20 20  iDocid          
7940: 20 20 20 2f 2a 20 44 6f 63 69 64 20 6f 66 20 72     /* Docid of r
7950: 6f 77 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ow being written
7960: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
7970: 20 69 4c 61 6e 67 69 64 3e 3d 30 20 29 3b 0a 0a   iLangid>=0 );..
7980: 20 20 2f 2a 20 54 4f 44 4f 28 73 68 65 73 73 29    /* TODO(shess)
7990: 20 45 78 70 6c 6f 72 65 20 77 68 65 74 68 65 72   Explore whether
79a0: 20 70 61 72 74 69 61 6c 6c 79 20 66 6c 75 73 68   partially flush
79b0: 69 6e 67 20 74 68 65 20 62 75 66 66 65 72 20 6f  ing the buffer o
79c0: 6e 0a 20 20 2a 2a 20 66 6f 72 63 65 64 2d 66 6c  n.  ** forced-fl
79d0: 75 73 68 20 77 6f 75 6c 64 20 70 72 6f 76 69 64  ush would provid
79e0: 65 20 62 65 74 74 65 72 20 70 65 72 66 6f 72 6d  e better perform
79f0: 61 6e 63 65 2e 20 20 49 20 73 75 73 70 65 63 74  ance.  I suspect
7a00: 20 74 68 61 74 20 69 66 0a 20 20 2a 2a 20 77 65   that if.  ** we
7a10: 20 6f 72 64 65 72 65 64 20 74 68 65 20 64 6f 63   ordered the doc
7a20: 6c 69 73 74 73 20 62 79 20 73 69 7a 65 20 61 6e  lists by size an
7a30: 64 20 66 6c 75 73 68 65 64 20 74 68 65 20 6c 61  d flushed the la
7a40: 72 67 65 73 74 20 75 6e 74 69 6c 20 74 68 65 0a  rgest until the.
7a50: 20 20 2a 2a 20 62 75 66 66 65 72 20 77 61 73 20    ** buffer was 
7a60: 68 61 6c 66 20 65 6d 70 74 79 2c 20 74 68 61 74  half empty, that
7a70: 20 77 6f 75 6c 64 20 6c 65 74 20 74 68 65 20 6c   would let the l
7a80: 65 73 73 20 66 72 65 71 75 65 6e 74 20 74 65 72  ess frequent ter
7a90: 6d 73 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 65  ms.  ** generate
7aa0: 20 6c 6f 6e 67 65 72 20 64 6f 63 6c 69 73 74 73   longer doclists
7ab0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44 6f  ..  */.  if( iDo
7ac0: 63 69 64 3c 3d 70 2d 3e 69 50 72 65 76 44 6f 63  cid<=p->iPrevDoc
7ad0: 69 64 20 0a 20 20 20 7c 7c 20 70 2d 3e 69 50 72  id .   || p->iPr
7ae0: 65 76 4c 61 6e 67 69 64 21 3d 69 4c 61 6e 67 69  evLangid!=iLangi
7af0: 64 0a 20 20 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64  d.   || p->nPend
7b00: 69 6e 67 44 61 74 61 3e 70 2d 3e 6e 4d 61 78 50  ingData>p->nMaxP
7b10: 65 6e 64 69 6e 67 44 61 74 61 20 0a 20 20 29 7b  endingData .  ){
7b20: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
7b30: 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67  lite3Fts3Pending
7b40: 54 65 72 6d 73 46 6c 75 73 68 28 70 29 3b 0a 20  TermsFlush(p);. 
7b50: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
7b60: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
7b70: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 50 72 65 76  ;.  }.  p->iPrev
7b80: 44 6f 63 69 64 20 3d 20 69 44 6f 63 69 64 3b 0a  Docid = iDocid;.
7b90: 20 20 70 2d 3e 69 50 72 65 76 4c 61 6e 67 69 64    p->iPrevLangid
7ba0: 20 3d 20 69 4c 61 6e 67 69 64 3b 0a 20 20 72 65   = iLangid;.  re
7bb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64  }../*.** Discard
7bd0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
7be0: 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72   the pending-ter
7bf0: 6d 73 20 68 61 73 68 20 74 61 62 6c 65 73 2e 20  ms hash tables. 
7c00: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7c10: 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73  Fts3PendingTerms
7c20: 43 6c 65 61 72 28 46 74 73 33 54 61 62 6c 65 20  Clear(Fts3Table 
7c30: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
7c40: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49  for(i=0; i<p->nI
7c50: 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ndex; i++){.    
7c60: 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 70 45  Fts3HashElem *pE
7c70: 6c 65 6d 3b 0a 20 20 20 20 46 74 73 33 48 61 73  lem;.    Fts3Has
7c80: 68 20 2a 70 48 61 73 68 20 3d 20 26 70 2d 3e 61  h *pHash = &p->a
7c90: 49 6e 64 65 78 5b 69 5d 2e 68 50 65 6e 64 69 6e  Index[i].hPendin
7ca0: 67 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d  g;.    for(pElem
7cb0: 3d 66 74 73 33 48 61 73 68 46 69 72 73 74 28 70  =fts3HashFirst(p
7cc0: 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
7cd0: 6c 65 6d 3d 66 74 73 33 48 61 73 68 4e 65 78 74  lem=fts3HashNext
7ce0: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20  (pElem)){.      
7cf0: 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70 4c 69  PendingList *pLi
7d00: 73 74 20 3d 20 28 50 65 6e 64 69 6e 67 4c 69 73  st = (PendingLis
7d10: 74 20 2a 29 66 74 73 33 48 61 73 68 44 61 74 61  t *)fts3HashData
7d20: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 66  (pElem);.      f
7d30: 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 44 65  ts3PendingListDe
7d40: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
7d50: 20 7d 0a 20 20 20 20 66 74 73 33 48 61 73 68 43   }.    fts3HashC
7d60: 6c 65 61 72 28 70 48 61 73 68 29 3b 0a 20 20 7d  lear(pHash);.  }
7d70: 0a 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61  .  p->nPendingDa
7d80: 74 61 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ta = 0;.}../*.**
7d90: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
7da0: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
7db0: 78 55 70 64 61 74 65 28 29 20 6d 65 74 68 6f 64  xUpdate() method
7dc0: 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 49   as part of an I
7dd0: 4e 53 45 52 54 0a 2a 2a 20 6f 70 65 72 61 74 69  NSERT.** operati
7de0: 6f 6e 2e 20 49 74 20 61 64 64 73 20 65 6e 74 72  on. It adds entr
7df0: 69 65 73 20 66 6f 72 20 65 61 63 68 20 74 65 72  ies for each ter
7e00: 6d 20 69 6e 20 74 68 65 20 6e 65 77 20 72 65 63  m in the new rec
7e10: 6f 72 64 20 74 6f 20 74 68 65 0a 2a 2a 20 70 65  ord to the.** pe
7e20: 6e 64 69 6e 67 54 65 72 6d 73 20 68 61 73 68 20  ndingTerms hash 
7e30: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  table..**.** Arg
7e40: 75 6d 65 6e 74 20 61 70 56 61 6c 20 69 73 20 74  ument apVal is t
7e50: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 73  he same as the s
7e60: 69 6d 69 6c 61 72 6c 79 20 6e 61 6d 65 64 20 61  imilarly named a
7e70: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
7e80: 6f 0a 2a 2a 20 66 74 73 33 49 6e 73 65 72 74 44  o.** fts3InsertD
7e90: 61 74 61 28 29 2e 20 50 61 72 61 6d 65 74 65 72  ata(). Parameter
7ea0: 20 69 44 6f 63 69 64 20 69 73 20 74 68 65 20 64   iDocid is the d
7eb0: 6f 63 69 64 20 6f 66 20 74 68 65 20 6e 65 77 20  ocid of the new 
7ec0: 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  row..*/.static i
7ed0: 6e 74 20 66 74 73 33 49 6e 73 65 72 74 54 65 72  nt fts3InsertTer
7ee0: 6d 73 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  ms(.  Fts3Table 
7ef0: 2a 70 2c 20 0a 20 20 69 6e 74 20 69 4c 61 6e 67  *p, .  int iLang
7f00: 69 64 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76  id, .  sqlite3_v
7f10: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20 0a 20  alue **apVal, . 
7f20: 20 75 33 32 20 2a 61 53 7a 0a 29 7b 0a 20 20 69   u32 *aSz.){.  i
7f30: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7f50: 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
7f60: 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 32  ble */.  for(i=2
7f70: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32  ; i<p->nColumn+2
7f80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
7f90: 69 43 6f 6c 20 3d 20 69 2d 32 3b 0a 20 20 20 20  iCol = i-2;.    
7fa0: 69 66 28 20 70 2d 3e 61 62 4e 6f 74 69 6e 64 65  if( p->abNotinde
7fb0: 78 65 64 5b 69 43 6f 6c 5d 3d 3d 30 20 29 7b 0a  xed[iCol]==0 ){.
7fc0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
7fd0: 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74   *zText = (const
7fe0: 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f   char *)sqlite3_
7ff0: 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
8000: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  [i]);.      int 
8010: 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67  rc = fts3Pending
8020: 54 65 72 6d 73 41 64 64 28 70 2c 20 69 4c 61 6e  TermsAdd(p, iLan
8030: 67 69 64 2c 20 7a 54 65 78 74 2c 20 69 43 6f 6c  gid, zText, iCol
8040: 2c 20 26 61 53 7a 5b 69 43 6f 6c 5d 29 3b 0a 20  , &aSz[iCol]);. 
8050: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
8060: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
8070: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
8080: 20 20 20 7d 0a 20 20 20 20 20 20 61 53 7a 5b 70     }.      aSz[p
8090: 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 2b 3d 20 73 71  ->nColumn] += sq
80a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
80b0: 73 28 61 70 56 61 6c 5b 69 5d 29 3b 0a 20 20 20  s(apVal[i]);.   
80c0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
80d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
80e0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
80f0: 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  n is called by t
8100: 68 65 20 78 55 70 64 61 74 65 28 29 20 6d 65 74  he xUpdate() met
8110: 68 6f 64 20 66 6f 72 20 61 6e 20 49 4e 53 45 52  hod for an INSER
8120: 54 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20  T operation..** 
8130: 54 68 65 20 61 70 56 61 6c 20 70 61 72 61 6d 65  The apVal parame
8140: 74 65 72 20 69 73 20 70 61 73 73 65 64 20 61 20  ter is passed a 
8150: 63 6f 70 79 20 6f 66 20 74 68 65 20 61 70 56 61  copy of the apVa
8160: 6c 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  l argument passe
8170: 64 20 62 79 0a 2a 2a 20 53 51 4c 69 74 65 20 74  d by.** SQLite t
8180: 6f 20 74 68 65 20 78 55 70 64 61 74 65 28 29 20  o the xUpdate() 
8190: 6d 65 74 68 6f 64 2e 20 69 2e 65 3a 0a 2a 2a 0a  method. i.e:.**.
81a0: 2a 2a 20 20 20 61 70 56 61 6c 5b 30 5d 20 20 20  **   apVal[0]   
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 6f 74               Not
81c0: 20 75 73 65 64 20 66 6f 72 20 49 4e 53 45 52 54   used for INSERT
81d0: 2e 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 31 5d 20  ..**   apVal[1] 
81e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
81f0: 6f 77 69 64 0a 2a 2a 20 20 20 61 70 56 61 6c 5b  owid.**   apVal[
8200: 32 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2]              
8210: 20 20 4c 65 66 74 2d 6d 6f 73 74 20 75 73 65 72    Left-most user
8220: 2d 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 0a  -defined column.
8230: 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 61 70  **   ....**   ap
8240: 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31  Val[p->nColumn+1
8250: 5d 20 20 20 20 20 52 69 67 68 74 2d 6d 6f 73 74  ]     Right-most
8260: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 63 6f   user-defined co
8270: 6c 75 6d 6e 0a 2a 2a 20 20 20 61 70 56 61 6c 5b  lumn.**   apVal[
8280: 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 5d 20 20 20  p->nColumn+2]   
8290: 20 20 48 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 20    Hidden column 
82a0: 77 69 74 68 20 73 61 6d 65 20 6e 61 6d 65 20 61  with same name a
82b0: 73 20 74 61 62 6c 65 0a 2a 2a 20 20 20 61 70 56  s table.**   apV
82c0: 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 33 5d  al[p->nColumn+3]
82d0: 20 20 20 20 20 48 69 64 64 65 6e 20 22 64 6f 63       Hidden "doc
82e0: 69 64 22 20 63 6f 6c 75 6d 6e 20 28 61 6c 69 61  id" column (alia
82f0: 73 20 66 6f 72 20 72 6f 77 69 64 29 0a 2a 2a 20  s for rowid).** 
8300: 20 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75    apVal[p->nColu
8310: 6d 6e 2b 34 5d 20 20 20 20 20 48 69 64 64 65 6e  mn+4]     Hidden
8320: 20 6c 61 6e 67 75 61 67 65 69 64 20 63 6f 6c 75   languageid colu
8330: 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  mn.*/.static int
8340: 20 66 74 73 33 49 6e 73 65 72 74 44 61 74 61 28   fts3InsertData(
8350: 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8370: 20 20 20 2f 2a 20 46 75 6c 6c 2d 74 65 78 74 20     /* Full-text 
8380: 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  table */.  sqlit
8390: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
83a0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72  ,          /* Ar
83b0: 72 61 79 20 6f 66 20 76 61 6c 75 65 73 20 74 6f  ray of values to
83c0: 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 73 71 6c   insert */.  sql
83d0: 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 44 6f  ite3_int64 *piDo
83e0: 63 69 64 20 20 20 20 20 20 20 20 20 20 2f 2a 20  cid          /* 
83f0: 4f 55 54 3a 20 44 6f 63 69 64 20 66 6f 72 20 72  OUT: Docid for r
8400: 6f 77 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64  ow just inserted
8410: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
8420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8430: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
8440: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn code */.  sql
8450: 69 74 65 33 5f 73 74 6d 74 20 2a 70 43 6f 6e 74  ite3_stmt *pCont
8460: 65 6e 74 49 6e 73 65 72 74 3b 20 20 20 2f 2a 20  entInsert;   /* 
8470: 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 5f 63 6f  INSERT INTO %_co
8480: 6e 74 65 6e 74 20 56 41 4c 55 45 53 28 2e 2e 2e  ntent VALUES(...
8490: 29 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 7a  ) */..  if( p->z
84a0: 43 6f 6e 74 65 6e 74 54 62 6c 20 29 7b 0a 20 20  ContentTbl ){.  
84b0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
84c0: 2a 70 52 6f 77 69 64 20 3d 20 61 70 56 61 6c 5b  *pRowid = apVal[
84d0: 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 33 5d 3b 0a 20  p->nColumn+3];. 
84e0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76     if( sqlite3_v
84f0: 61 6c 75 65 5f 74 79 70 65 28 70 52 6f 77 69 64  alue_type(pRowid
8500: 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  )==SQLITE_NULL )
8510: 7b 0a 20 20 20 20 20 20 70 52 6f 77 69 64 20 3d  {.      pRowid =
8520: 20 61 70 56 61 6c 5b 31 5d 3b 0a 20 20 20 20 7d   apVal[1];.    }
8530: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
8540: 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 52 6f 77  _value_type(pRow
8550: 69 64 29 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45  id)!=SQLITE_INTE
8560: 47 45 52 20 29 7b 0a 20 20 20 20 20 20 72 65 74  GER ){.      ret
8570: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  urn SQLITE_CONST
8580: 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 20  RAINT;.    }.   
8590: 20 2a 70 69 44 6f 63 69 64 20 3d 20 73 71 6c 69   *piDocid = sqli
85a0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
85b0: 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 72 65 74  pRowid);.    ret
85c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
85d0: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
85e0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61  the statement ha
85f0: 6e 64 6c 65 20 75 73 65 64 20 74 6f 20 69 6e 73  ndle used to ins
8600: 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68  ert data into th
8610: 65 20 25 5f 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a  e %_content.  **
8620: 20 74 61 62 6c 65 2e 20 54 68 65 20 53 51 4c 20   table. The SQL 
8630: 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 6d 65  for this stateme
8640: 6e 74 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nt is:.  **.  **
8650: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 25     INSERT INTO %
8660: 5f 63 6f 6e 74 65 6e 74 20 56 41 4c 55 45 53 28  _content VALUES(
8670: 3f 2c 20 3f 2c 20 3f 2c 20 2e 2e 2e 29 0a 20 20  ?, ?, ?, ...).  
8680: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 74 61 74  **.  ** The stat
8690: 65 6d 65 6e 74 20 66 65 61 74 75 72 65 73 20 4e  ement features N
86a0: 20 27 3f 27 20 76 61 72 69 61 62 6c 65 73 2c 20   '?' variables, 
86b0: 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e  where N is the n
86c0: 75 6d 62 65 72 20 6f 66 20 75 73 65 72 0a 20 20  umber of user.  
86d0: 2a 2a 20 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d  ** defined colum
86e0: 6e 73 20 69 6e 20 74 68 65 20 46 54 53 33 20 74  ns in the FTS3 t
86f0: 61 62 6c 65 2c 20 70 6c 75 73 20 6f 6e 65 20 66  able, plus one f
8700: 6f 72 20 74 68 65 20 64 6f 63 69 64 20 66 69 65  or the docid fie
8710: 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ld..  */.  rc = 
8720: 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
8730: 51 4c 5f 43 4f 4e 54 45 4e 54 5f 49 4e 53 45 52  QL_CONTENT_INSER
8740: 54 2c 20 26 70 43 6f 6e 74 65 6e 74 49 6e 73 65  T, &pContentInse
8750: 72 74 2c 20 26 61 70 56 61 6c 5b 31 5d 29 3b 0a  rt, &apVal[1]);.
8760: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
8770: 5f 4f 4b 20 26 26 20 70 2d 3e 7a 4c 61 6e 67 75  _OK && p->zLangu
8780: 61 67 65 69 64 20 29 7b 0a 20 20 20 20 72 63 20  ageid ){.    rc 
8790: 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69  = sqlite3_bind_i
87a0: 6e 74 28 0a 20 20 20 20 20 20 20 20 70 43 6f 6e  nt(.        pCon
87b0: 74 65 6e 74 49 6e 73 65 72 74 2c 20 70 2d 3e 6e  tentInsert, p->n
87c0: 43 6f 6c 75 6d 6e 2b 32 2c 20 0a 20 20 20 20 20  Column+2, .     
87d0: 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
87e0: 5f 69 6e 74 28 61 70 56 61 6c 5b 70 2d 3e 6e 43  _int(apVal[p->nC
87f0: 6f 6c 75 6d 6e 2b 34 5d 29 0a 20 20 20 20 29 3b  olumn+4]).    );
8800: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
8810: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
8820: 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 72  n rc;..  /* Ther
8830: 65 20 69 73 20 61 20 71 75 69 72 6b 20 68 65 72  e is a quirk her
8840: 65 2e 20 54 68 65 20 75 73 65 72 73 20 49 4e 53  e. The users INS
8850: 45 52 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 61  ERT statement ma
8860: 79 20 68 61 76 65 20 73 70 65 63 69 66 69 65 64  y have specified
8870: 0a 20 20 2a 2a 20 61 20 76 61 6c 75 65 20 66 6f  .  ** a value fo
8880: 72 20 74 68 65 20 22 72 6f 77 69 64 22 20 66 69  r the "rowid" fi
8890: 65 6c 64 2c 20 66 6f 72 20 74 68 65 20 22 64 6f  eld, for the "do
88a0: 63 69 64 22 20 66 69 65 6c 64 2c 20 6f 72 20 66  cid" field, or f
88b0: 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 20 57 68  or both..  ** Wh
88c0: 69 63 68 20 69 73 20 61 20 70 72 6f 62 6c 65 6d  ich is a problem
88d0: 2c 20 73 69 6e 63 65 20 22 72 6f 77 69 64 22 20  , since "rowid" 
88e0: 61 6e 64 20 22 64 6f 63 69 64 22 20 61 72 65 20  and "docid" are 
88f0: 61 6c 69 61 73 65 73 20 66 6f 72 20 74 68 65 0a  aliases for the.
8900: 20 20 2a 2a 20 73 61 6d 65 20 76 61 6c 75 65 2e    ** same value.
8910: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20   For example:.  
8920: 2a 2a 0a 20 20 2a 2a 20 20 20 49 4e 53 45 52 54  **.  **   INSERT
8930: 20 49 4e 54 4f 20 66 74 73 33 74 62 6c 28 72 6f   INTO fts3tbl(ro
8940: 77 69 64 2c 20 64 6f 63 69 64 29 20 56 41 4c 55  wid, docid) VALU
8950: 45 53 28 31 2c 20 32 29 3b 0a 20 20 2a 2a 0a 20  ES(1, 2);.  **. 
8960: 20 2a 2a 20 49 6e 20 46 54 53 33 2c 20 74 68 69   ** In FTS3, thi
8970: 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 49  s is an error. I
8980: 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f  t is an error to
8990: 20 73 70 65 63 69 66 79 20 6e 6f 6e 2d 4e 55 4c   specify non-NUL
89a0: 4c 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 66 6f  L values.  ** fo
89b0: 72 20 62 6f 74 68 20 64 6f 63 69 64 20 61 6e 64  r both docid and
89c0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 6f 77 69   some other rowi
89d0: 64 20 61 6c 69 61 73 2e 0a 20 20 2a 2f 0a 20 20  d alias..  */.  
89e0: 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21  if( SQLITE_NULL!
89f0: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  =sqlite3_value_t
8a00: 79 70 65 28 61 70 56 61 6c 5b 33 2b 70 2d 3e 6e  ype(apVal[3+p->n
8a10: 43 6f 6c 75 6d 6e 5d 29 20 29 7b 0a 20 20 20 20  Column]) ){.    
8a20: 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d  if( SQLITE_NULL=
8a30: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  =sqlite3_value_t
8a40: 79 70 65 28 61 70 56 61 6c 5b 30 5d 29 0a 20 20  ype(apVal[0]).  
8a50: 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4e 55 4c     && SQLITE_NUL
8a60: 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  L!=sqlite3_value
8a70: 5f 74 79 70 65 28 61 70 56 61 6c 5b 31 5d 29 0a  _type(apVal[1]).
8a80: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
8a90: 41 20 72 6f 77 69 64 2f 64 6f 63 69 64 20 63 6f  A rowid/docid co
8aa0: 6e 66 6c 69 63 74 2e 20 2a 2f 0a 20 20 20 20 20  nflict. */.     
8ab0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
8ac0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
8ad0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
8ae0: 64 5f 76 61 6c 75 65 28 70 43 6f 6e 74 65 6e 74  d_value(pContent
8af0: 49 6e 73 65 72 74 2c 20 31 2c 20 61 70 56 61 6c  Insert, 1, apVal
8b00: 5b 33 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 29 3b  [3+p->nColumn]);
8b10: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
8b20: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
8b30: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78  rc;.  }..  /* Ex
8b40: 65 63 75 74 65 20 74 68 65 20 73 74 61 74 65 6d  ecute the statem
8b50: 65 6e 74 20 74 6f 20 69 6e 73 65 72 74 20 74 68  ent to insert th
8b60: 65 20 72 65 63 6f 72 64 2e 20 53 65 74 20 2a 70  e record. Set *p
8b70: 69 44 6f 63 69 64 20 74 6f 20 74 68 65 20 0a 20  iDocid to the . 
8b80: 20 2a 2a 20 6e 65 77 20 64 6f 63 69 64 20 76 61   ** new docid va
8b90: 6c 75 65 2e 20 0a 20 20 2a 2f 0a 20 20 73 71 6c  lue. .  */.  sql
8ba0: 69 74 65 33 5f 73 74 65 70 28 70 43 6f 6e 74 65  ite3_step(pConte
8bb0: 6e 74 49 6e 73 65 72 74 29 3b 0a 20 20 72 63 20  ntInsert);.  rc 
8bc0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
8bd0: 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 29 3b  pContentInsert);
8be0: 0a 0a 20 20 2a 70 69 44 6f 63 69 64 20 3d 20 73  ..  *piDocid = s
8bf0: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
8c00: 72 74 5f 72 6f 77 69 64 28 70 2d 3e 64 62 29 3b  rt_rowid(p->db);
8c10: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
8c20: 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  .../*.** Remove 
8c30: 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  all data from th
8c40: 65 20 46 54 53 33 20 74 61 62 6c 65 2e 20 43 6c  e FTS3 table. Cl
8c50: 65 61 72 20 74 68 65 20 68 61 73 68 20 74 61 62  ear the hash tab
8c60: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a  le containing.**
8c70: 20 70 65 6e 64 69 6e 67 20 74 65 72 6d 73 2e 0a   pending terms..
8c80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
8c90: 73 33 44 65 6c 65 74 65 41 6c 6c 28 46 74 73 33  s3DeleteAll(Fts3
8ca0: 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 62 43  Table *p, int bC
8cb0: 6f 6e 74 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72  ontent){.  int r
8cc0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
8cd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
8ce0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
8cf0: 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 63  /* Discard the c
8d00: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
8d10: 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68 61 73  ending-terms has
8d20: 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71  h table. */.  sq
8d30: 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67  lite3Fts3Pending
8d40: 54 65 72 6d 73 43 6c 65 61 72 28 70 29 3b 0a 0a  TermsClear(p);..
8d50: 20 20 2f 2a 20 44 65 6c 65 74 65 20 65 76 65 72    /* Delete ever
8d60: 79 74 68 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  ything from the 
8d70: 73 68 61 64 6f 77 20 74 61 62 6c 65 73 2e 20 45  shadow tables. E
8d80: 78 63 65 70 74 2c 20 6c 65 61 76 65 20 25 5f 63  xcept, leave %_c
8d90: 6f 6e 74 65 6e 74 20 61 73 0a 20 20 2a 2a 20 69  ontent as.  ** i
8da0: 73 20 69 66 20 62 43 6f 6e 74 65 6e 74 20 69 73  s if bContent is
8db0: 20 66 61 6c 73 65 2e 20 20 2a 2f 0a 20 20 61 73   false.  */.  as
8dc0: 73 65 72 74 28 20 70 2d 3e 7a 43 6f 6e 74 65 6e  sert( p->zConten
8dd0: 74 54 62 6c 3d 3d 30 20 7c 7c 20 62 43 6f 6e 74  tTbl==0 || bCont
8de0: 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ent==0 );.  if( 
8df0: 62 43 6f 6e 74 65 6e 74 20 29 20 66 74 73 33 53  bContent ) fts3S
8e00: 71 6c 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53  qlExec(&rc, p, S
8e10: 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 43 4f  QL_DELETE_ALL_CO
8e20: 4e 54 45 4e 54 2c 20 30 29 3b 0a 20 20 66 74 73  NTENT, 0);.  fts
8e30: 33 53 71 6c 45 78 65 63 28 26 72 63 2c 20 70 2c  3SqlExec(&rc, p,
8e40: 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f   SQL_DELETE_ALL_
8e50: 53 45 47 4d 45 4e 54 53 2c 20 30 29 3b 0a 20 20  SEGMENTS, 0);.  
8e60: 66 74 73 33 53 71 6c 45 78 65 63 28 26 72 63 2c  fts3SqlExec(&rc,
8e70: 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41   p, SQL_DELETE_A
8e80: 4c 4c 5f 53 45 47 44 49 52 2c 20 30 29 3b 0a 20  LL_SEGDIR, 0);. 
8e90: 20 69 66 28 20 70 2d 3e 62 48 61 73 44 6f 63 73   if( p->bHasDocs
8ea0: 69 7a 65 20 29 7b 0a 20 20 20 20 66 74 73 33 53  ize ){.    fts3S
8eb0: 71 6c 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53  qlExec(&rc, p, S
8ec0: 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 44 4f  QL_DELETE_ALL_DO
8ed0: 43 53 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 20  CSIZE, 0);.  }. 
8ee0: 20 69 66 28 20 70 2d 3e 62 48 61 73 53 74 61 74   if( p->bHasStat
8ef0: 20 29 7b 0a 20 20 20 20 66 74 73 33 53 71 6c 45   ){.    fts3SqlE
8f00: 78 65 63 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f  xec(&rc, p, SQL_
8f10: 44 45 4c 45 54 45 5f 41 4c 4c 5f 53 54 41 54 2c  DELETE_ALL_STAT,
8f20: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
8f30: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  n rc;.}../*.**.*
8f40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 61 6e  /.static int lan
8f50: 67 69 64 46 72 6f 6d 53 65 6c 65 63 74 28 46 74  gidFromSelect(Ft
8f60: 73 33 54 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69  s3Table *p, sqli
8f70: 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63  te3_stmt *pSelec
8f80: 74 29 7b 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69  t){.  int iLangi
8f90: 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  d = 0;.  if( p->
8fa0: 7a 4c 61 6e 67 75 61 67 65 69 64 20 29 20 69 4c  zLanguageid ) iL
8fb0: 61 6e 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  angid = sqlite3_
8fc0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 65 6c 65  column_int(pSele
8fd0: 63 74 2c 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31  ct, p->nColumn+1
8fe0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 4c 61 6e  );.  return iLan
8ff0: 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  gid;.}../*.** Th
9000: 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20  e first element 
9010: 69 6e 20 74 68 65 20 61 70 56 61 6c 5b 5d 20 61  in the apVal[] a
9020: 72 72 61 79 20 69 73 20 61 73 73 75 6d 65 64 20  rray is assumed 
9030: 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 64  to contain the d
9040: 6f 63 69 64 0a 2a 2a 20 28 61 6e 20 69 6e 74 65  ocid.** (an inte
9050: 67 65 72 29 20 6f 66 20 61 20 72 6f 77 20 61 62  ger) of a row ab
9060: 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65  out to be delete
9070: 64 2e 20 52 65 6d 6f 76 65 20 61 6c 6c 20 74 65  d. Remove all te
9080: 72 6d 73 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  rms from the.** 
9090: 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e  full-text index.
90a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
90b0: 66 74 73 33 44 65 6c 65 74 65 54 65 72 6d 73 28  fts3DeleteTerms(
90c0: 20 0a 20 20 69 6e 74 20 2a 70 52 43 2c 20 20 20   .  int *pRC,   
90d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
90e0: 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
90f0: 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
9100: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46          /* The F
9110: 54 53 20 74 61 62 6c 65 20 74 6f 20 64 65 6c 65  TS table to dele
9120: 74 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 73 71 6c  te from */.  sql
9130: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 6f 77  ite3_value *pRow
9140: 69 64 2c 20 20 2f 2a 20 54 68 65 20 64 6f 63 69  id,  /* The doci
9150: 64 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  d to be deleted 
9160: 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a 2c 20 20  */.  u32 *aSz,  
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9180: 53 69 7a 65 73 20 6f 66 20 64 65 6c 65 74 65 64  Sizes of deleted
9190: 20 64 6f 63 75 6d 65 6e 74 20 77 72 69 74 74 65   document writte
91a0: 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  n here */.  int 
91b0: 2a 70 62 46 6f 75 6e 64 20 20 20 20 20 20 20 20  *pbFound        
91c0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20      /* OUT: Set 
91d0: 74 6f 20 74 72 75 65 20 69 66 20 72 6f 77 20 72  to true if row r
91e0: 65 61 6c 6c 79 20 64 6f 65 73 20 65 78 69 73 74  eally does exist
91f0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
9200: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
9210: 2a 70 53 65 6c 65 63 74 3b 0a 0a 20 20 61 73 73  *pSelect;..  ass
9220: 65 72 74 28 20 2a 70 62 46 6f 75 6e 64 3d 3d 30  ert( *pbFound==0
9230: 20 29 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29   );.  if( *pRC )
9240: 20 72 65 74 75 72 6e 3b 0a 20 20 72 63 20 3d 20   return;.  rc = 
9250: 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
9260: 51 4c 5f 53 45 4c 45 43 54 5f 43 4f 4e 54 45 4e  QL_SELECT_CONTEN
9270: 54 5f 42 59 5f 52 4f 57 49 44 2c 20 26 70 53 65  T_BY_ROWID, &pSe
9280: 6c 65 63 74 2c 20 26 70 52 6f 77 69 64 29 3b 0a  lect, &pRowid);.
9290: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
92a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 53  _OK ){.    if( S
92b0: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
92c0: 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29  e3_step(pSelect)
92d0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
92e0: 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 61 6e 67  .      int iLang
92f0: 69 64 20 3d 20 6c 61 6e 67 69 64 46 72 6f 6d 53  id = langidFromS
9300: 65 6c 65 63 74 28 70 2c 20 70 53 65 6c 65 63 74  elect(p, pSelect
9310: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  );.      rc = ft
9320: 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 44 6f  s3PendingTermsDo
9330: 63 69 64 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20  cid(p, iLangid, 
9340: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
9350: 6e 74 36 34 28 70 53 65 6c 65 63 74 2c 20 30 29  nt64(pSelect, 0)
9360: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  );.      for(i=1
9370: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
9380: 26 26 20 69 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e  && i<=p->nColumn
9390: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
93a0: 69 6e 74 20 69 43 6f 6c 20 3d 20 69 2d 31 3b 0a  int iCol = i-1;.
93b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
93c0: 62 4e 6f 74 69 6e 64 65 78 65 64 5b 69 43 6f 6c  bNotindexed[iCol
93d0: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
93e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
93f0: 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ext = (const cha
9400: 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r *)sqlite3_colu
9410: 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65 63 74 2c  mn_text(pSelect,
9420: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72   i);.          r
9430: 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54  c = fts3PendingT
9440: 65 72 6d 73 41 64 64 28 70 2c 20 69 4c 61 6e 67  ermsAdd(p, iLang
9450: 69 64 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26  id, zText, -1, &
9460: 61 53 7a 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20 20  aSz[iCol]);.    
9470: 20 20 20 20 20 20 61 53 7a 5b 70 2d 3e 6e 43 6f        aSz[p->nCo
9480: 6c 75 6d 6e 5d 20 2b 3d 20 73 71 6c 69 74 65 33  lumn] += sqlite3
9490: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
94a0: 65 6c 65 63 74 2c 20 69 29 3b 0a 20 20 20 20 20  elect, i);.     
94b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
94c0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
94d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
94e0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
94f0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
9500: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20  *pRC = rc;.     
9510: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
9520: 20 7d 0a 20 20 20 20 20 20 2a 70 62 46 6f 75 6e   }.      *pbFoun
9530: 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 1;.    }.   
9540: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
9550: 73 65 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  set(pSelect);.  
9560: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
9570: 65 33 5f 72 65 73 65 74 28 70 53 65 6c 65 63 74  e3_reset(pSelect
9580: 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 43 20 3d 20  );.  }.  *pRC = 
9590: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  rc;.}../*.** For
95a0: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
95b0: 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   to account for 
95c0: 74 68 65 20 63 69 72 63 75 6c 61 72 20 64 65 70  the circular dep
95d0: 65 6e 64 65 6e 63 79 20 62 65 74 77 65 65 6e 0a  endency between.
95e0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 66 74 73  ** functions fts
95f0: 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 29 20  3SegmentMerge() 
9600: 61 6e 64 20 66 74 73 33 41 6c 6c 6f 63 61 74 65  and fts3Allocate
9610: 53 65 67 64 69 72 49 64 78 28 29 2e 0a 2a 2f 0a  SegdirIdx()..*/.
9620: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53  static int fts3S
9630: 65 67 6d 65 6e 74 4d 65 72 67 65 28 46 74 73 33  egmentMerge(Fts3
9640: 54 61 62 6c 65 20 2a 2c 20 69 6e 74 2c 20 69 6e  Table *, int, in
9650: 74 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 20 0a 2a 2a  t, int);../* .**
9660: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
9670: 6c 6c 6f 63 61 74 65 73 20 61 20 6e 65 77 20 6c  llocates a new l
9680: 65 76 65 6c 20 69 4c 65 76 65 6c 20 69 6e 64 65  evel iLevel inde
9690: 78 20 69 6e 20 74 68 65 20 73 65 67 64 69 72 20  x in the segdir 
96a0: 74 61 62 6c 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c  table..** Usuall
96b0: 79 2c 20 69 6e 64 65 78 65 73 20 61 72 65 20 61  y, indexes are a
96c0: 6c 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20  llocated within 
96d0: 61 20 6c 65 76 65 6c 20 73 65 71 75 65 6e 74 69  a level sequenti
96e0: 61 6c 6c 79 20 73 74 61 72 74 69 6e 67 0a 2a 2a  ally starting.**
96f0: 20 77 69 74 68 20 30 2c 20 73 6f 20 74 68 65 20   with 0, so the 
9700: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78 20  allocated index 
9710: 69 73 20 6f 6e 65 20 67 72 65 61 74 65 72 20 74  is one greater t
9720: 68 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  han the value re
9730: 74 75 72 6e 65 64 0a 2a 2a 20 62 79 3a 0a 2a 2a  turned.** by:.**
9740: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78  .**   SELECT max
9750: 28 69 64 78 29 20 46 52 4f 4d 20 25 5f 73 65 67  (idx) FROM %_seg
9760: 64 69 72 20 57 48 45 52 45 20 6c 65 76 65 6c 20  dir WHERE level 
9770: 3d 20 3a 69 4c 65 76 65 6c 0a 2a 2a 0a 2a 2a 20  = :iLevel.**.** 
9780: 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 72  However, if ther
9790: 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 46 54  e are already FT
97a0: 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 20 69  S3_MERGE_COUNT i
97b0: 6e 64 65 78 65 73 20 61 74 20 74 68 65 20 72 65  ndexes at the re
97c0: 71 75 65 73 74 65 64 0a 2a 2a 20 6c 65 76 65 6c  quested.** level
97d0: 2c 20 74 68 65 79 20 61 72 65 20 6d 65 72 67 65  , they are merge
97e0: 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  d into a single 
97f0: 6c 65 76 65 6c 20 28 69 4c 65 76 65 6c 2b 31 29  level (iLevel+1)
9800: 20 73 65 67 6d 65 6e 74 20 61 6e 64 20 74 68 65   segment and the
9810: 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 69   .** allocated i
9820: 6e 64 65 78 20 69 73 20 30 2e 0a 2a 2a 0a 2a 2a  ndex is 0..**.**
9830: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
9840: 2a 70 69 49 64 78 20 69 73 20 73 65 74 20 74 6f  *piIdx is set to
9850: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 69   the allocated i
9860: 6e 64 65 78 20 73 6c 6f 74 20 61 6e 64 20 53 51  ndex slot and SQ
9870: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 72 65 74 75 72  LITE_OK.** retur
9880: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
9890: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
98a0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
98b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
98c0: 66 74 73 33 41 6c 6c 6f 63 61 74 65 53 65 67 64  fts3AllocateSegd
98d0: 69 72 49 64 78 28 0a 20 20 46 74 73 33 54 61 62  irIdx(.  Fts3Tab
98e0: 6c 65 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 4c  le *p, .  int iL
98f0: 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20 20  angid,          
9900: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e            /* Lan
9910: 67 75 61 67 65 20 69 64 20 2a 2f 0a 20 20 69 6e  guage id */.  in
9920: 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20 20 20  t iIndex,       
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9940: 20 49 6e 64 65 78 20 66 6f 72 20 70 2d 3e 61 49   Index for p->aI
9950: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ndex */.  int iL
9960: 65 76 65 6c 2c 20 0a 20 20 69 6e 74 20 2a 70 69  evel, .  int *pi
9970: 49 64 78 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Idx.){.  int rc;
9980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9990: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
99a0: 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn Code */.  sql
99b0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 4e 65 78 74  ite3_stmt *pNext
99c0: 49 64 78 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Idx;         /* 
99d0: 51 75 65 72 79 20 66 6f 72 20 6e 65 78 74 20 69  Query for next i
99e0: 64 78 20 61 74 20 6c 65 76 65 6c 20 69 4c 65 76  dx at level iLev
99f0: 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 78  el */.  int iNex
9a00: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
9a10: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
9a20: 74 20 6f 66 20 71 75 65 72 79 20 70 4e 65 78 74  t of query pNext
9a30: 49 64 78 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  Idx */..  assert
9a40: 28 20 69 4c 61 6e 67 69 64 3e 3d 30 20 29 3b 0a  ( iLangid>=0 );.
9a50: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 49 6e    assert( p->nIn
9a60: 64 65 78 3e 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20  dex>=1 );..  /* 
9a70: 53 65 74 20 76 61 72 69 61 62 6c 65 20 69 4e 65  Set variable iNe
9a80: 78 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 61  xt to the next a
9a90: 76 61 69 6c 61 62 6c 65 20 73 65 67 64 69 72 20  vailable segdir 
9aa0: 69 6e 64 65 78 20 61 74 20 6c 65 76 65 6c 20 69  index at level i
9ab0: 4c 65 76 65 6c 2e 20 2a 2f 0a 20 20 72 63 20 3d  Level. */.  rc =
9ac0: 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
9ad0: 53 51 4c 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54  SQL_NEXT_SEGMENT
9ae0: 5f 49 4e 44 45 58 2c 20 26 70 4e 65 78 74 49 64  _INDEX, &pNextId
9af0: 78 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  x, 0);.  if( rc=
9b00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9b10: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
9b20: 6e 74 36 34 28 0a 20 20 20 20 20 20 20 20 70 4e  nt64(.        pN
9b30: 65 78 74 49 64 78 2c 20 31 2c 20 67 65 74 41 62  extIdx, 1, getAb
9b40: 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69  soluteLevel(p, i
9b50: 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20  Langid, iIndex, 
9b60: 69 4c 65 76 65 6c 29 0a 20 20 20 20 29 3b 0a 20  iLevel).    );. 
9b70: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
9b80: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
9b90: 70 4e 65 78 74 49 64 78 29 20 29 7b 0a 20 20 20  pNextIdx) ){.   
9ba0: 20 20 20 69 4e 65 78 74 20 3d 20 73 71 6c 69 74     iNext = sqlit
9bb0: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 4e  e3_column_int(pN
9bc0: 65 78 74 49 64 78 2c 20 30 29 3b 0a 20 20 20 20  extIdx, 0);.    
9bd0: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
9be0: 65 33 5f 72 65 73 65 74 28 70 4e 65 78 74 49 64  e3_reset(pNextId
9bf0: 78 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  x);.  }..  if( r
9c00: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
9c10: 20 20 20 20 2f 2a 20 49 66 20 69 4e 65 78 74 20      /* If iNext 
9c20: 69 73 20 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f  is FTS3_MERGE_CO
9c30: 55 4e 54 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  UNT, indicating 
9c40: 74 68 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65  that level iLeve
9c50: 6c 20 69 73 20 61 6c 72 65 61 64 79 0a 20 20 20  l is already.   
9c60: 20 2a 2a 20 66 75 6c 6c 2c 20 6d 65 72 67 65 20   ** full, merge 
9c70: 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20  all segments in 
9c80: 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 69 6e 74  level iLevel int
9c90: 6f 20 61 20 73 69 6e 67 6c 65 20 69 4c 65 76 65  o a single iLeve
9ca0: 6c 2b 31 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65  l+1.    ** segme
9cb0: 6e 74 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20  nt and allocate 
9cc0: 28 6e 65 77 6c 79 20 66 72 65 65 64 29 20 69 6e  (newly freed) in
9cd0: 64 65 78 20 30 20 61 74 20 6c 65 76 65 6c 20 69  dex 0 at level i
9ce0: 4c 65 76 65 6c 2e 20 4f 74 68 65 72 77 69 73 65  Level. Otherwise
9cf0: 2c 0a 20 20 20 20 2a 2a 20 69 66 20 69 4e 65 78  ,.    ** if iNex
9d00: 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 46  t is less than F
9d10: 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 2c  TS3_MERGE_COUNT,
9d20: 20 61 6c 6c 6f 63 61 74 65 20 69 6e 64 65 78 20   allocate index 
9d30: 69 4e 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  iNext..    */.  
9d40: 20 20 69 66 28 20 69 4e 65 78 74 3e 3d 46 54 53    if( iNext>=FTS
9d50: 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 20 29 7b  3_MERGE_COUNT ){
9d60: 0a 20 20 20 20 20 20 66 74 73 33 4c 6f 67 4d 65  .      fts3LogMe
9d70: 72 67 65 28 31 36 2c 20 67 65 74 41 62 73 6f 6c  rge(16, getAbsol
9d80: 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e  uteLevel(p, iLan
9d90: 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65  gid, iIndex, iLe
9da0: 76 65 6c 29 29 3b 0a 20 20 20 20 20 20 72 63 20  vel));.      rc 
9db0: 3d 20 66 74 73 33 53 65 67 6d 65 6e 74 4d 65 72  = fts3SegmentMer
9dc0: 67 65 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69  ge(p, iLangid, i
9dd0: 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 29 3b 0a  Index, iLevel);.
9de0: 20 20 20 20 20 20 2a 70 69 49 64 78 20 3d 20 30        *piIdx = 0
9df0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9e00: 20 20 20 2a 70 69 49 64 78 20 3d 20 69 4e 65 78     *piIdx = iNex
9e10: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
9e20: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
9e30: 0a 2a 2a 20 54 68 65 20 25 5f 73 65 67 6d 65 6e  .** The %_segmen
9e40: 74 73 20 74 61 62 6c 65 20 69 73 20 64 65 63 6c  ts table is decl
9e50: 61 72 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ared as follows:
9e60: 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  .**.**   CREATE 
9e70: 54 41 42 4c 45 20 25 5f 73 65 67 6d 65 6e 74 73  TABLE %_segments
9e80: 28 62 6c 6f 63 6b 69 64 20 49 4e 54 45 47 45 52  (blockid INTEGER
9e90: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 6c   PRIMARY KEY, bl
9ea0: 6f 63 6b 20 42 4c 4f 42 29 0a 2a 2a 0a 2a 2a 20  ock BLOB).**.** 
9eb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
9ec0: 61 64 73 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ads data from a 
9ed0: 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
9ee0: 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62  e %_segments tab
9ef0: 6c 65 2e 20 54 68 65 0a 2a 2a 20 73 70 65 63 69  le. The.** speci
9f00: 66 69 63 20 72 6f 77 20 69 73 20 69 64 65 6e 74  fic row is ident
9f10: 69 66 69 65 64 20 62 79 20 74 68 65 20 69 42 6c  ified by the iBl
9f20: 6f 63 6b 69 64 20 70 61 72 61 6d 65 74 65 72 2e  ockid parameter.
9f30: 20 49 66 20 70 61 42 6c 6f 62 20 69 73 20 6e 6f   If paBlob is no
9f40: 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t.** NULL, then 
9f50: 61 20 62 75 66 66 65 72 20 69 73 20 61 6c 6c 6f  a buffer is allo
9f60: 63 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69  cated using sqli
9f70: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  te3_malloc() and
9f80: 20 70 6f 70 75 6c 61 74 65 64 0a 2a 2a 20 77 69   populated.** wi
9f90: 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  th the contents 
9fa0: 6f 66 20 74 68 65 20 62 6c 6f 62 20 73 74 6f 72  of the blob stor
9fb0: 65 64 20 69 6e 20 74 68 65 20 22 62 6c 6f 63 6b  ed in the "block
9fc0: 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  " column of the 
9fd0: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20 74  .** identified t
9fe0: 61 62 6c 65 20 72 6f 77 20 69 73 2e 20 57 68 65  able row is. Whe
9ff0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 42 6c  ther or not paBl
a000: 6f 62 20 69 73 20 4e 55 4c 4c 2c 20 2a 70 6e 42  ob is NULL, *pnB
a010: 6c 6f 62 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f  lob is set.** to
a020: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
a030: 20 62 6c 6f 62 20 69 6e 20 62 79 74 65 73 20 62   blob in bytes b
a040: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
a050: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
a060: 6f 72 20 6f 63 63 75 72 73 2c 20 6f 72 20 74 68  or occurs, or th
a070: 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74  e table does not
a080: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 70 65   contain the spe
a090: 63 69 66 69 65 64 20 72 6f 77 2c 0a 2a 2a 20 61  cified row,.** a
a0a0: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
a0b0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
a0c0: 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
a0d0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
a0e0: 64 2e 20 49 66 0a 2a 2a 20 70 61 42 6c 6f 62 20  d. If.** paBlob 
a0f0: 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
a100: 6e 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70  n it is the resp
a110: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
a120: 65 20 63 61 6c 6c 65 72 20 74 6f 0a 2a 2a 20 65  e caller to.** e
a130: 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74  ventually free t
a140: 68 65 20 72 65 74 75 72 6e 65 64 20 62 75 66 66  he returned buff
a150: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  er..**.** This f
a160: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6c 65 61 76  unction may leav
a170: 65 20 61 6e 20 6f 70 65 6e 20 73 71 6c 69 74 65  e an open sqlite
a180: 33 5f 62 6c 6f 62 2a 20 68 61 6e 64 6c 65 20 69  3_blob* handle i
a190: 6e 20 74 68 65 0a 2a 2a 20 46 74 73 33 54 61 62  n the.** Fts3Tab
a1a0: 6c 65 2e 70 53 65 67 6d 65 6e 74 73 20 76 61 72  le.pSegments var
a1b0: 69 61 62 6c 65 2e 20 54 68 69 73 20 68 61 6e 64  iable. This hand
a1c0: 6c 65 20 69 73 20 72 65 75 73 65 64 20 62 79 20  le is reused by 
a1d0: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
a1e0: 0a 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63  .** to this func
a1f0: 74 69 6f 6e 2e 20 54 68 65 20 68 61 6e 64 6c 65  tion. The handle
a200: 20 6d 61 79 20 62 65 20 63 6c 6f 73 65 64 20 62   may be closed b
a210: 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 0a 2a 2a  y calling the.**
a220: 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 6d   sqlite3Fts3Segm
a230: 65 6e 74 73 43 6c 6f 73 65 28 29 20 66 75 6e 63  entsClose() func
a240: 74 69 6f 6e 2e 20 52 65 75 73 69 6e 67 20 61 20  tion. Reusing a 
a250: 62 6c 6f 62 20 68 61 6e 64 6c 65 20 69 73 20 61  blob handle is a
a260: 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72   handy.** perfor
a270: 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e  mance improvemen
a280: 74 2c 20 62 75 74 20 74 68 65 20 62 6c 6f 62 20  t, but the blob 
a290: 68 61 6e 64 6c 65 20 73 68 6f 75 6c 64 20 61 6c  handle should al
a2a0: 77 61 79 73 20 62 65 20 63 6c 6f 73 65 64 0a 2a  ways be closed.*
a2b0: 2a 20 62 65 66 6f 72 65 20 63 6f 6e 74 72 6f 6c  * before control
a2c0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
a2d0: 74 68 65 20 75 73 65 72 20 28 74 6f 20 70 72 65  the user (to pre
a2e0: 76 65 6e 74 20 61 20 6c 6f 63 6b 20 62 65 69 6e  vent a lock bein
a2f0: 67 20 68 65 6c 64 0a 2a 2a 20 6f 6e 20 74 68 65  g held.** on the
a300: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
a310: 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e  or longer than n
a320: 65 63 65 73 73 61 72 79 29 2e 20 54 68 75 73 2c  ecessary). Thus,
a330: 20 61 6e 79 20 76 69 72 74 75 61 6c 20 74 61 62   any virtual tab
a340: 6c 65 0a 2a 2a 20 6d 65 74 68 6f 64 20 28 78 46  le.** method (xF
a350: 69 6c 74 65 72 20 65 74 63 2e 29 20 74 68 61 74  ilter etc.) that
a360: 20 6d 61 79 20 64 69 72 65 63 74 6c 79 20 6f 72   may directly or
a370: 20 69 6e 64 69 72 65 63 74 6c 79 20 63 61 6c 6c   indirectly call
a380: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
a390: 2a 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c 69  * must call sqli
a3a0: 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73 43  te3Fts3SegmentsC
a3b0: 6c 6f 73 65 28 29 20 62 65 66 6f 72 65 20 72 65  lose() before re
a3c0: 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
a3d0: 73 71 6c 69 74 65 33 46 74 73 33 52 65 61 64 42  sqlite3Fts3ReadB
a3e0: 6c 6f 63 6b 28 0a 20 20 46 74 73 33 54 61 62 6c  lock(.  Fts3Tabl
a3f0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
a400: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20          /* FTS3 
a410: 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
a420: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
a430: 69 42 6c 6f 63 6b 69 64 2c 20 20 20 20 20 20 20  iBlockid,       
a440: 20 20 2f 2a 20 41 63 63 65 73 73 20 74 68 65 20    /* Access the 
a450: 72 6f 77 20 77 69 74 68 20 62 6c 6f 63 6b 69 64  row with blockid
a460: 3d 24 69 42 6c 6f 63 6b 69 64 20 2a 2f 0a 20 20  =$iBlockid */.  
a470: 63 68 61 72 20 2a 2a 70 61 42 6c 6f 62 2c 20 20  char **paBlob,  
a480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a490: 2f 2a 20 4f 55 54 3a 20 42 6c 6f 62 20 64 61 74  /* OUT: Blob dat
a4a0: 61 20 69 6e 20 6d 61 6c 6c 6f 63 27 64 20 62 75  a in malloc'd bu
a4b0: 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ffer */.  int *p
a4c0: 6e 42 6c 6f 62 2c 20 20 20 20 20 20 20 20 20 20  nBlob,          
a4d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
a4e0: 3a 20 53 69 7a 65 20 6f 66 20 62 6c 6f 62 20 64  : Size of blob d
a4f0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ata */.  int *pn
a500: 4c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 20  Load            
a510: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
a520: 20 42 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   Bytes actually 
a530: 6c 6f 61 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 69  loaded */.){.  i
a540: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
a550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a560: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
a570: 0a 0a 20 20 2f 2a 20 70 6e 42 6c 6f 62 20 6d 75  ..  /* pnBlob mu
a580: 73 74 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20  st be non-NULL. 
a590: 70 61 42 6c 6f 62 20 6d 61 79 20 62 65 20 4e 55  paBlob may be NU
a5a0: 4c 4c 20 6f 72 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20  LL or non-NULL. 
a5b0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 6e 42  */.  assert( pnB
a5c0: 6c 6f 62 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d  lob );..  if( p-
a5d0: 3e 70 53 65 67 6d 65 6e 74 73 20 29 7b 0a 20 20  >pSegments ){.  
a5e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
a5f0: 6c 6f 62 5f 72 65 6f 70 65 6e 28 70 2d 3e 70 53  lob_reopen(p->pS
a600: 65 67 6d 65 6e 74 73 2c 20 69 42 6c 6f 63 6b 69  egments, iBlocki
a610: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
a620: 20 69 66 28 20 30 3d 3d 70 2d 3e 7a 53 65 67 6d   if( 0==p->zSegm
a630: 65 6e 74 73 54 62 6c 20 29 7b 0a 20 20 20 20 20  entsTbl ){.     
a640: 20 70 2d 3e 7a 53 65 67 6d 65 6e 74 73 54 62 6c   p->zSegmentsTbl
a650: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
a660: 74 66 28 22 25 73 5f 73 65 67 6d 65 6e 74 73 22  tf("%s_segments"
a670: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  , p->zName);.   
a680: 20 20 20 69 66 28 20 30 3d 3d 70 2d 3e 7a 53 65     if( 0==p->zSe
a690: 67 6d 65 6e 74 73 54 62 6c 20 29 20 72 65 74 75  gmentsTbl ) retu
a6a0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
a6b0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
a6c0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65  sqlite3_blob_ope
a6d0: 6e 28 0a 20 20 20 20 20 20 20 70 2d 3e 64 62 2c  n(.       p->db,
a6e0: 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 53 65 67   p->zDb, p->zSeg
a6f0: 6d 65 6e 74 73 54 62 6c 2c 20 22 62 6c 6f 63 6b  mentsTbl, "block
a700: 22 2c 20 69 42 6c 6f 63 6b 69 64 2c 20 30 2c 20  ", iBlockid, 0, 
a710: 26 70 2d 3e 70 53 65 67 6d 65 6e 74 73 0a 20 20  &p->pSegments.  
a720: 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20    );.  }..  if( 
a730: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
a740: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
a750: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79   sqlite3_blob_by
a760: 74 65 73 28 70 2d 3e 70 53 65 67 6d 65 6e 74 73  tes(p->pSegments
a770: 29 3b 0a 20 20 20 20 2a 70 6e 42 6c 6f 62 20 3d  );.    *pnBlob =
a780: 20 6e 42 79 74 65 3b 0a 20 20 20 20 69 66 28 20   nByte;.    if( 
a790: 70 61 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20  paBlob ){.      
a7a0: 63 68 61 72 20 2a 61 42 79 74 65 20 3d 20 73 71  char *aByte = sq
a7b0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79  lite3_malloc(nBy
a7c0: 74 65 20 2b 20 46 54 53 33 5f 4e 4f 44 45 5f 50  te + FTS3_NODE_P
a7d0: 41 44 44 49 4e 47 29 3b 0a 20 20 20 20 20 20 69  ADDING);.      i
a7e0: 66 28 20 21 61 42 79 74 65 20 29 7b 0a 20 20 20  f( !aByte ){.   
a7f0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
a800: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65  _NOMEM;.      }e
a810: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
a820: 20 70 6e 4c 6f 61 64 20 26 26 20 6e 42 79 74 65   pnLoad && nByte
a830: 3e 28 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e  >(FTS3_NODE_CHUN
a840: 4b 5f 54 48 52 45 53 48 4f 4c 44 29 20 29 7b 0a  K_THRESHOLD) ){.
a850: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 20            nByte 
a860: 3d 20 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e  = FTS3_NODE_CHUN
a870: 4b 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 20  KSIZE;.         
a880: 20 2a 70 6e 4c 6f 61 64 20 3d 20 6e 42 79 74 65   *pnLoad = nByte
a890: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a8a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a8b0: 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70 53  _blob_read(p->pS
a8c0: 65 67 6d 65 6e 74 73 2c 20 61 42 79 74 65 2c 20  egments, aByte, 
a8d0: 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 20 20 20  nByte, 0);.     
a8e0: 20 20 20 6d 65 6d 73 65 74 28 26 61 42 79 74 65     memset(&aByte
a8f0: 5b 6e 42 79 74 65 5d 2c 20 30 2c 20 46 54 53 33  [nByte], 0, FTS3
a900: 5f 4e 4f 44 45 5f 50 41 44 44 49 4e 47 29 3b 0a  _NODE_PADDING);.
a910: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
a920: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a930: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
a940: 72 65 65 28 61 42 79 74 65 29 3b 0a 20 20 20 20  ree(aByte);.    
a950: 20 20 20 20 20 20 61 42 79 74 65 20 3d 20 30 3b        aByte = 0;
a960: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a970: 20 7d 0a 20 20 20 20 20 20 2a 70 61 42 6c 6f 62   }.      *paBlob
a980: 20 3d 20 61 42 79 74 65 3b 0a 20 20 20 20 7d 0a   = aByte;.    }.
a990: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
a9a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
a9b0: 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65   the blob handle
a9c0: 20 61 74 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73   at p->pSegments
a9d0: 2c 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 2e  , if it is open.
a9e0: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62   See comments ab
a9f0: 6f 76 65 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74  ove.** the sqlit
aa00: 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28  e3Fts3ReadBlock(
aa10: 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64  ) function for d
aa20: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20  etails..*/.void 
aa30: 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 6d 65  sqlite3Fts3Segme
aa40: 6e 74 73 43 6c 6f 73 65 28 46 74 73 33 54 61 62  ntsClose(Fts3Tab
aa50: 6c 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  le *p){.  sqlite
aa60: 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d 3e  3_blob_close(p->
aa70: 70 53 65 67 6d 65 6e 74 73 29 3b 0a 20 20 70 2d  pSegments);.  p-
aa80: 3e 70 53 65 67 6d 65 6e 74 73 20 3d 20 30 3b 0a  >pSegments = 0;.
aa90: 7d 0a 20 20 20 20 0a 73 74 61 74 69 63 20 69 6e  }.    .static in
aaa0: 74 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49  t fts3SegReaderI
aab0: 6e 63 72 52 65 61 64 28 46 74 73 33 53 65 67 52  ncrRead(Fts3SegR
aac0: 65 61 64 65 72 20 2a 70 52 65 61 64 65 72 29 7b  eader *pReader){
aad0: 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20  .  int nRead;   
aae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aaf0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ab00: 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f  bytes to read */
ab10: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab30: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
ab40: 65 20 2a 2f 0a 0a 20 20 6e 52 65 61 64 20 3d 20  e */..  nRead = 
ab50: 4d 49 4e 28 70 52 65 61 64 65 72 2d 3e 6e 4e 6f  MIN(pReader->nNo
ab60: 64 65 20 2d 20 70 52 65 61 64 65 72 2d 3e 6e 50  de - pReader->nP
ab70: 6f 70 75 6c 61 74 65 2c 20 46 54 53 33 5f 4e 4f  opulate, FTS3_NO
ab80: 44 45 5f 43 48 55 4e 4b 53 49 5a 45 29 3b 0a 20  DE_CHUNKSIZE);. 
ab90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
aba0: 6f 62 5f 72 65 61 64 28 0a 20 20 20 20 20 20 70  ob_read(.      p
abb0: 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 2c 20 0a  Reader->pBlob, .
abc0: 20 20 20 20 20 20 26 70 52 65 61 64 65 72 2d 3e        &pReader->
abd0: 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e  aNode[pReader->n
abe0: 50 6f 70 75 6c 61 74 65 5d 2c 0a 20 20 20 20 20  Populate],.     
abf0: 20 6e 52 65 61 64 2c 0a 20 20 20 20 20 20 70 52   nRead,.      pR
ac00: 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65  eader->nPopulate
ac10: 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  .  );..  if( rc=
ac20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ac30: 20 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75    pReader->nPopu
ac40: 6c 61 74 65 20 2b 3d 20 6e 52 65 61 64 3b 0a 20  late += nRead;. 
ac50: 20 20 20 6d 65 6d 73 65 74 28 26 70 52 65 61 64     memset(&pRead
ac60: 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65  er->aNode[pReade
ac70: 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 5d 2c 20 30  r->nPopulate], 0
ac80: 2c 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44  , FTS3_NODE_PADD
ac90: 49 4e 47 29 3b 0a 20 20 20 20 69 66 28 20 70 52  ING);.    if( pR
aca0: 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65  eader->nPopulate
acb0: 3d 3d 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65  ==pReader->nNode
acc0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
acd0: 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 52 65  3_blob_close(pRe
ace0: 61 64 65 72 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20  ader->pBlob);.  
acf0: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 42 6c      pReader->pBl
ad00: 6f 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 52  ob = 0;.      pR
ad10: 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65  eader->nPopulate
ad20: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
ad30: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ad40: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53  static int fts3S
ad50: 65 67 52 65 61 64 65 72 52 65 71 75 69 72 65 28  egReaderRequire(
ad60: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
ad70: 52 65 61 64 65 72 2c 20 63 68 61 72 20 2a 70 46  Reader, char *pF
ad80: 72 6f 6d 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b  rom, int nByte){
ad90: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
ada0: 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
adb0: 20 21 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62   !pReader->pBlob
adc0: 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 46 72   .       || (pFr
add0: 6f 6d 3e 3d 70 52 65 61 64 65 72 2d 3e 61 4e 6f  om>=pReader->aNo
ade0: 64 65 20 26 26 20 70 46 72 6f 6d 3c 26 70 52 65  de && pFrom<&pRe
adf0: 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61  ader->aNode[pRea
ae00: 64 65 72 2d 3e 6e 4e 6f 64 65 5d 29 0a 20 20 29  der->nNode]).  )
ae10: 3b 0a 20 20 77 68 69 6c 65 28 20 70 52 65 61 64  ;.  while( pRead
ae20: 65 72 2d 3e 70 42 6c 6f 62 20 26 26 20 72 63 3d  er->pBlob && rc=
ae30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20  =SQLITE_OK .    
ae40: 20 26 26 20 20 28 70 46 72 6f 6d 20 2d 20 70 52   &&  (pFrom - pR
ae50: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20 2b 20 6e  eader->aNode + n
ae60: 42 79 74 65 29 3e 70 52 65 61 64 65 72 2d 3e 6e  Byte)>pReader->n
ae70: 50 6f 70 75 6c 61 74 65 0a 20 20 29 7b 0a 20 20  Populate.  ){.  
ae80: 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65    rc = fts3SegRe
ae90: 61 64 65 72 49 6e 63 72 52 65 61 64 28 70 52 65  aderIncrRead(pRe
aea0: 61 64 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ader);.  }.  ret
aeb0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
aec0: 20 53 65 74 20 61 6e 20 46 74 73 33 53 65 67 52   Set an Fts3SegR
aed0: 65 61 64 65 72 20 63 75 72 73 6f 72 20 74 6f 20  eader cursor to 
aee0: 70 6f 69 6e 74 20 61 74 20 45 4f 46 2e 0a 2a 2f  point at EOF..*/
aef0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
af00: 33 53 65 67 52 65 61 64 65 72 53 65 74 45 6f 66  3SegReaderSetEof
af10: 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a  (Fts3SegReader *
af20: 70 53 65 67 29 7b 0a 20 20 69 66 28 20 21 66 74  pSeg){.  if( !ft
af30: 73 33 53 65 67 52 65 61 64 65 72 49 73 52 6f 6f  s3SegReaderIsRoo
af40: 74 4f 6e 6c 79 28 70 53 65 67 29 20 29 7b 0a 20  tOnly(pSeg) ){. 
af50: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
af60: 70 53 65 67 2d 3e 61 4e 6f 64 65 29 3b 0a 20 20  pSeg->aNode);.  
af70: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63    sqlite3_blob_c
af80: 6c 6f 73 65 28 70 53 65 67 2d 3e 70 42 6c 6f 62  lose(pSeg->pBlob
af90: 29 3b 0a 20 20 20 20 70 53 65 67 2d 3e 70 42 6c  );.    pSeg->pBl
afa0: 6f 62 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 53  ob = 0;.  }.  pS
afb0: 65 67 2d 3e 61 4e 6f 64 65 20 3d 20 30 3b 0a 7d  eg->aNode = 0;.}
afc0: 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
afd0: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
afe0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
aff0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e 65  gument to the ne
b000: 78 74 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a  xt term in the.*
b010: 2a 20 73 65 67 6d 65 6e 74 2e 20 49 66 20 73 75  * segment. If su
b020: 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
b030: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
b040: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
b050: 6e 65 78 74 20 74 65 72 6d 2c 0a 2a 2a 20 53 51  next term,.** SQ
b060: 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 74 68 65 72  LITE_DONE. Other
b070: 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20  wise, an SQLite 
b080: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
b090: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65  tatic int fts3Se
b0a0: 67 52 65 61 64 65 72 4e 65 78 74 28 0a 20 20 46  gReaderNext(.  F
b0b0: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 0a 20 20  ts3Table *p, .  
b0c0: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
b0d0: 52 65 61 64 65 72 2c 0a 20 20 69 6e 74 20 62 49  Reader,.  int bI
b0e0: 6e 63 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ncr.){.  int rc;
b0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b100: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
b110: 72 6e 20 63 6f 64 65 20 6f 66 20 76 61 72 69 6f  rn code of vario
b120: 75 73 20 73 75 62 2d 72 6f 75 74 69 6e 65 73 20  us sub-routines 
b130: 2a 2f 0a 20 20 63 68 61 72 20 2a 70 4e 65 78 74  */.  char *pNext
b140: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b150: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 76       /* Cursor v
b160: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
b170: 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20 20   nPrefix;       
b180: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b190: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
b1a0: 69 6e 20 74 65 72 6d 20 70 72 65 66 69 78 20 2a  in term prefix *
b1b0: 2f 0a 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b  /.  int nSuffix;
b1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
b1e0: 20 62 79 74 65 73 20 69 6e 20 74 65 72 6d 20 73   bytes in term s
b1f0: 75 66 66 69 78 20 2a 2f 0a 0a 20 20 69 66 28 20  uffix */..  if( 
b200: 21 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69  !pReader->aDocli
b210: 73 74 20 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  st ){.    pNext 
b220: 3d 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65  = pReader->aNode
b230: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
b240: 4e 65 78 74 20 3d 20 26 70 52 65 61 64 65 72 2d  Next = &pReader-
b250: 3e 61 44 6f 63 6c 69 73 74 5b 70 52 65 61 64 65  >aDoclist[pReade
b260: 72 2d 3e 6e 44 6f 63 6c 69 73 74 5d 3b 0a 20 20  r->nDoclist];.  
b270: 7d 0a 0a 20 20 69 66 28 20 21 70 4e 65 78 74 20  }..  if( !pNext 
b280: 7c 7c 20 70 4e 65 78 74 3e 3d 26 70 52 65 61 64  || pNext>=&pRead
b290: 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65  er->aNode[pReade
b2a0: 72 2d 3e 6e 4e 6f 64 65 5d 20 29 7b 0a 0a 20 20  r->nNode] ){..  
b2b0: 20 20 69 66 28 20 66 74 73 33 53 65 67 52 65 61    if( fts3SegRea
b2c0: 64 65 72 49 73 50 65 6e 64 69 6e 67 28 70 52 65  derIsPending(pRe
b2d0: 61 64 65 72 29 20 29 7b 0a 20 20 20 20 20 20 46  ader) ){.      F
b2e0: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c  ts3HashElem *pEl
b2f0: 65 6d 20 3d 20 2a 28 70 52 65 61 64 65 72 2d 3e  em = *(pReader->
b300: 70 70 4e 65 78 74 45 6c 65 6d 29 3b 0a 20 20 20  ppNextElem);.   
b310: 20 20 20 69 66 28 20 70 45 6c 65 6d 3d 3d 30 20     if( pElem==0 
b320: 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64  ){.        pRead
b330: 65 72 2d 3e 61 4e 6f 64 65 20 3d 20 30 3b 0a 20  er->aNode = 0;. 
b340: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b350: 20 20 20 20 50 65 6e 64 69 6e 67 4c 69 73 74 20      PendingList 
b360: 2a 70 4c 69 73 74 20 3d 20 28 50 65 6e 64 69 6e  *pList = (Pendin
b370: 67 4c 69 73 74 20 2a 29 66 74 73 33 48 61 73 68  gList *)fts3Hash
b380: 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
b390: 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 7a 54       pReader->zT
b3a0: 65 72 6d 20 3d 20 28 63 68 61 72 20 2a 29 66 74  erm = (char *)ft
b3b0: 73 33 48 61 73 68 4b 65 79 28 70 45 6c 65 6d 29  s3HashKey(pElem)
b3c0: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64 65  ;.        pReade
b3d0: 72 2d 3e 6e 54 65 72 6d 20 3d 20 66 74 73 33 48  r->nTerm = fts3H
b3e0: 61 73 68 4b 65 79 73 69 7a 65 28 70 45 6c 65 6d  ashKeysize(pElem
b3f0: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64  );.        pRead
b400: 65 72 2d 3e 6e 4e 6f 64 65 20 3d 20 70 52 65 61  er->nNode = pRea
b410: 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 20 3d 20  der->nDoclist = 
b420: 70 4c 69 73 74 2d 3e 6e 44 61 74 61 20 2b 20 31  pList->nData + 1
b430: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64 65  ;.        pReade
b440: 72 2d 3e 61 4e 6f 64 65 20 3d 20 70 52 65 61 64  r->aNode = pRead
b450: 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20 70  er->aDoclist = p
b460: 4c 69 73 74 2d 3e 61 44 61 74 61 3b 0a 20 20 20  List->aData;.   
b470: 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 70       pReader->pp
b480: 4e 65 78 74 45 6c 65 6d 2b 2b 3b 0a 20 20 20 20  NextElem++;.    
b490: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 61      assert( pRea
b4a0: 64 65 72 2d 3e 61 4e 6f 64 65 20 29 3b 0a 20 20  der->aNode );.  
b4b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
b4c0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
b4d0: 20 20 7d 0a 0a 20 20 20 20 66 74 73 33 53 65 67    }..    fts3Seg
b4e0: 52 65 61 64 65 72 53 65 74 45 6f 66 28 70 52 65  ReaderSetEof(pRe
b4f0: 61 64 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ader);..    /* I
b500: 66 20 69 43 75 72 72 65 6e 74 42 6c 6f 63 6b 3e  f iCurrentBlock>
b510: 3d 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 2c 20  =iLeafEndBlock, 
b520: 74 68 69 73 20 69 73 20 61 6e 20 45 4f 46 20 63  this is an EOF c
b530: 6f 6e 64 69 74 69 6f 6e 2e 20 41 6c 6c 20 6c 65  ondition. All le
b540: 61 66 20 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  af .    ** block
b550: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
b560: 65 65 6e 20 74 72 61 76 65 72 73 65 64 2e 20 20  een traversed.  
b570: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
b580: 52 65 61 64 65 72 2d 3e 69 43 75 72 72 65 6e 74  Reader->iCurrent
b590: 42 6c 6f 63 6b 3c 3d 70 52 65 61 64 65 72 2d 3e  Block<=pReader->
b5a0: 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 20 29 3b  iLeafEndBlock );
b5b0: 0a 20 20 20 20 69 66 28 20 70 52 65 61 64 65 72  .    if( pReader
b5c0: 2d 3e 69 43 75 72 72 65 6e 74 42 6c 6f 63 6b 3e  ->iCurrentBlock>
b5d0: 3d 70 52 65 61 64 65 72 2d 3e 69 4c 65 61 66 45  =pReader->iLeafE
b5e0: 6e 64 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  ndBlock ){.     
b5f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b600: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  K;.    }..    rc
b610: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 52 65   = sqlite3Fts3Re
b620: 61 64 42 6c 6f 63 6b 28 0a 20 20 20 20 20 20 20  adBlock(.       
b630: 20 70 2c 20 2b 2b 70 52 65 61 64 65 72 2d 3e 69   p, ++pReader->i
b640: 43 75 72 72 65 6e 74 42 6c 6f 63 6b 2c 20 26 70  CurrentBlock, &p
b650: 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 2c 20 26  Reader->aNode, &
b660: 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 2c 20  pReader->nNode, 
b670: 0a 20 20 20 20 20 20 20 20 28 62 49 6e 63 72 20  .        (bIncr 
b680: 3f 20 26 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70  ? &pReader->nPop
b690: 75 6c 61 74 65 20 3a 20 30 29 0a 20 20 20 20 29  ulate : 0).    )
b6a0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
b6b0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
b6c0: 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28   rc;.    assert(
b6d0: 20 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 3d   pReader->pBlob=
b6e0: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 62 49  =0 );.    if( bI
b6f0: 6e 63 72 20 26 26 20 70 52 65 61 64 65 72 2d 3e  ncr && pReader->
b700: 6e 50 6f 70 75 6c 61 74 65 3c 70 52 65 61 64 65  nPopulate<pReade
b710: 72 2d 3e 6e 4e 6f 64 65 20 29 7b 0a 20 20 20 20  r->nNode ){.    
b720: 20 20 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62    pReader->pBlob
b730: 20 3d 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73 3b   = p->pSegments;
b740: 0a 20 20 20 20 20 20 70 2d 3e 70 53 65 67 6d 65  .      p->pSegme
b750: 6e 74 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  nts = 0;.    }. 
b760: 20 20 20 70 4e 65 78 74 20 3d 20 70 52 65 61 64     pNext = pRead
b770: 65 72 2d 3e 61 4e 6f 64 65 3b 0a 20 20 7d 0a 0a  er->aNode;.  }..
b780: 20 20 61 73 73 65 72 74 28 20 21 66 74 73 33 53    assert( !fts3S
b790: 65 67 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e  egReaderIsPendin
b7a0: 67 28 70 52 65 61 64 65 72 29 20 29 3b 0a 0a 20  g(pReader) );.. 
b7b0: 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61   rc = fts3SegRea
b7c0: 64 65 72 52 65 71 75 69 72 65 28 70 52 65 61 64  derRequire(pRead
b7d0: 65 72 2c 20 70 4e 65 78 74 2c 20 46 54 53 33 5f  er, pNext, FTS3_
b7e0: 56 41 52 49 4e 54 5f 4d 41 58 2a 32 29 3b 0a 20  VARINT_MAX*2);. 
b7f0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b800: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
b810: 20 20 0a 20 20 2f 2a 20 42 65 63 61 75 73 65 20    .  /* Because 
b820: 6f 66 20 74 68 65 20 46 54 53 33 5f 4e 4f 44 45  of the FTS3_NODE
b830: 5f 50 41 44 44 49 4e 47 20 62 79 74 65 73 20 6f  _PADDING bytes o
b840: 66 20 70 61 64 64 69 6e 67 2c 20 74 68 65 20 66  f padding, the f
b850: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 0a 20 20 2a  ollowing is .  *
b860: 2a 20 73 61 66 65 20 28 6e 6f 20 72 69 73 6b 20  * safe (no risk 
b870: 6f 66 20 6f 76 65 72 72 65 61 64 29 20 65 76 65  of overread) eve
b880: 6e 20 69 66 20 74 68 65 20 6e 6f 64 65 20 64 61  n if the node da
b890: 74 61 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e  ta is corrupted.
b8a0: 20 2a 2f 0a 20 20 70 4e 65 78 74 20 2b 3d 20 66   */.  pNext += f
b8b0: 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 70  ts3GetVarint32(p
b8c0: 4e 65 78 74 2c 20 26 6e 50 72 65 66 69 78 29 3b  Next, &nPrefix);
b8d0: 0a 20 20 70 4e 65 78 74 20 2b 3d 20 66 74 73 33  .  pNext += fts3
b8e0: 47 65 74 56 61 72 69 6e 74 33 32 28 70 4e 65 78  GetVarint32(pNex
b8f0: 74 2c 20 26 6e 53 75 66 66 69 78 29 3b 0a 20 20  t, &nSuffix);.  
b900: 69 66 28 20 6e 50 72 65 66 69 78 3c 30 20 7c 7c  if( nPrefix<0 ||
b910: 20 6e 53 75 66 66 69 78 3c 3d 30 20 0a 20 20 20   nSuffix<=0 .   
b920: 7c 7c 20 26 70 4e 65 78 74 5b 6e 53 75 66 66 69  || &pNext[nSuffi
b930: 78 5d 3e 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f  x]>&pReader->aNo
b940: 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64  de[pReader->nNod
b950: 65 5d 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  e] .  ){.    ret
b960: 75 72 6e 20 46 54 53 5f 43 4f 52 52 55 50 54 5f  urn FTS_CORRUPT_
b970: 56 54 41 42 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  VTAB;.  }..  if(
b980: 20 6e 50 72 65 66 69 78 2b 6e 53 75 66 66 69 78   nPrefix+nSuffix
b990: 3e 70 52 65 61 64 65 72 2d 3e 6e 54 65 72 6d 41  >pReader->nTermA
b9a0: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74 20  lloc ){.    int 
b9b0: 6e 4e 65 77 20 3d 20 28 6e 50 72 65 66 69 78 2b  nNew = (nPrefix+
b9c0: 6e 53 75 66 66 69 78 29 2a 32 3b 0a 20 20 20 20  nSuffix)*2;.    
b9d0: 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20 73 71 6c  char *zNew = sql
b9e0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 52 65  ite3_realloc(pRe
b9f0: 61 64 65 72 2d 3e 7a 54 65 72 6d 2c 20 6e 4e 65  ader->zTerm, nNe
ba00: 77 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4e 65  w);.    if( !zNe
ba10: 77 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  w ){.      retur
ba20: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
ba30: 20 20 20 20 7d 0a 20 20 20 20 70 52 65 61 64 65      }.    pReade
ba40: 72 2d 3e 7a 54 65 72 6d 20 3d 20 7a 4e 65 77 3b  r->zTerm = zNew;
ba50: 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 54  .    pReader->nT
ba60: 65 72 6d 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b  ermAlloc = nNew;
ba70: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 66 74 73  .  }..  rc = fts
ba80: 33 53 65 67 52 65 61 64 65 72 52 65 71 75 69 72  3SegReaderRequir
ba90: 65 28 70 52 65 61 64 65 72 2c 20 70 4e 65 78 74  e(pReader, pNext
baa0: 2c 20 6e 53 75 66 66 69 78 2b 46 54 53 33 5f 56  , nSuffix+FTS3_V
bab0: 41 52 49 4e 54 5f 4d 41 58 29 3b 0a 20 20 69 66  ARINT_MAX);.  if
bac0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
bad0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
bae0: 6d 65 6d 63 70 79 28 26 70 52 65 61 64 65 72 2d  memcpy(&pReader-
baf0: 3e 7a 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 2c  >zTerm[nPrefix],
bb00: 20 70 4e 65 78 74 2c 20 6e 53 75 66 66 69 78 29   pNext, nSuffix)
bb10: 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 6e 54 65  ;.  pReader->nTe
bb20: 72 6d 20 3d 20 6e 50 72 65 66 69 78 2b 6e 53 75  rm = nPrefix+nSu
bb30: 66 66 69 78 3b 0a 20 20 70 4e 65 78 74 20 2b 3d  ffix;.  pNext +=
bb40: 20 6e 53 75 66 66 69 78 3b 0a 20 20 70 4e 65 78   nSuffix;.  pNex
bb50: 74 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72 69  t += fts3GetVari
bb60: 6e 74 33 32 28 70 4e 65 78 74 2c 20 26 70 52 65  nt32(pNext, &pRe
bb70: 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 29 3b  ader->nDoclist);
bb80: 0a 20 20 70 52 65 61 64 65 72 2d 3e 61 44 6f 63  .  pReader->aDoc
bb90: 6c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20  list = pNext;.  
bba0: 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74  pReader->pOffset
bbb0: 4c 69 73 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  List = 0;..  /* 
bbc0: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 64  Check that the d
bbd0: 6f 63 6c 69 73 74 20 64 6f 65 73 20 6e 6f 74 20  oclist does not 
bbe0: 61 70 70 65 61 72 20 74 6f 20 65 78 74 65 6e 64  appear to extend
bbf0: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
bc00: 20 74 68 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65   the.  ** b-tree
bc10: 20 6e 6f 64 65 2e 20 41 6e 64 20 74 68 61 74 20   node. And that 
bc20: 74 68 65 20 66 69 6e 61 6c 20 62 79 74 65 20 6f  the final byte o
bc30: 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20 69 73  f the doclist is
bc40: 20 30 78 30 30 2e 20 49 66 20 65 69 74 68 65 72   0x00. If either
bc50: 20 0a 20 20 2a 2a 20 6f 66 20 74 68 65 73 65 20   .  ** of these 
bc60: 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 75 6e  statements is un
bc70: 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
bc80: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69 73  ata structure is
bc90: 20 63 6f 72 72 75 70 74 2e 0a 20 20 2a 2f 0a 20   corrupt..  */. 
bca0: 20 69 66 28 20 26 70 52 65 61 64 65 72 2d 3e 61   if( &pReader->a
bcb0: 44 6f 63 6c 69 73 74 5b 70 52 65 61 64 65 72 2d  Doclist[pReader-
bcc0: 3e 6e 44 6f 63 6c 69 73 74 5d 3e 26 70 52 65 61  >nDoclist]>&pRea
bcd0: 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64  der->aNode[pRead
bce0: 65 72 2d 3e 6e 4e 6f 64 65 5d 20 0a 20 20 20 7c  er->nNode] .   |
bcf0: 7c 20 28 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70  | (pReader->nPop
bd00: 75 6c 61 74 65 3d 3d 30 20 26 26 20 70 52 65 61  ulate==0 && pRea
bd10: 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b 70 52  der->aDoclist[pR
bd20: 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 2d  eader->nDoclist-
bd30: 31 5d 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  1]).  ){.    ret
bd40: 75 72 6e 20 46 54 53 5f 43 4f 52 52 55 50 54 5f  urn FTS_CORRUPT_
bd50: 56 54 41 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75  VTAB;.  }.  retu
bd60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
bd70: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 53  ./*.** Set the S
bd80: 65 67 52 65 61 64 65 72 20 74 6f 20 70 6f 69 6e  egReader to poin
bd90: 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 64  t to the first d
bda0: 6f 63 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c  ocid in the docl
bdb0: 69 73 74 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  ist associated.*
bdc0: 2a 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65  * with the curre
bdd0: 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74  nt term..*/.stat
bde0: 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65  ic int fts3SegRe
bdf0: 61 64 65 72 46 69 72 73 74 44 6f 63 69 64 28 46  aderFirstDocid(F
be00: 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  ts3Table *pTab, 
be10: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
be20: 52 65 61 64 65 72 29 7b 0a 20 20 69 6e 74 20 72  Reader){.  int r
be30: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
be40: 20 61 73 73 65 72 74 28 20 70 52 65 61 64 65 72   assert( pReader
be50: 2d 3e 61 44 6f 63 6c 69 73 74 20 29 3b 0a 20 20  ->aDoclist );.  
be60: 61 73 73 65 72 74 28 20 21 70 52 65 61 64 65 72  assert( !pReader
be70: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 29 3b  ->pOffsetList );
be80: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 62 44 65  .  if( pTab->bDe
be90: 73 63 49 64 78 20 26 26 20 66 74 73 33 53 65 67  scIdx && fts3Seg
bea0: 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28  ReaderIsPending(
beb0: 70 52 65 61 64 65 72 29 20 29 7b 0a 20 20 20 20  pReader) ){.    
bec0: 75 38 20 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20  u8 bEof = 0;.   
bed0: 20 70 52 65 61 64 65 72 2d 3e 69 44 6f 63 69 64   pReader->iDocid
bee0: 20 3d 20 30 3b 0a 20 20 20 20 70 52 65 61 64 65   = 0;.    pReade
bef0: 72 2d 3e 6e 4f 66 66 73 65 74 4c 69 73 74 20 3d  r->nOffsetList =
bf00: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46   0;.    sqlite3F
bf10: 74 73 33 44 6f 63 6c 69 73 74 50 72 65 76 28 30  ts3DoclistPrev(0
bf20: 2c 0a 20 20 20 20 20 20 20 20 70 52 65 61 64 65  ,.        pReade
bf30: 72 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 70 52 65  r->aDoclist, pRe
bf40: 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 2c 20  ader->nDoclist, 
bf50: 26 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65  &pReader->pOffse
bf60: 74 4c 69 73 74 2c 20 0a 20 20 20 20 20 20 20 20  tList, .        
bf70: 26 70 52 65 61 64 65 72 2d 3e 69 44 6f 63 69 64  &pReader->iDocid
bf80: 2c 20 26 70 52 65 61 64 65 72 2d 3e 6e 4f 66 66  , &pReader->nOff
bf90: 73 65 74 4c 69 73 74 2c 20 26 62 45 6f 66 0a 20  setList, &bEof. 
bfa0: 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20     );.  }else{. 
bfb0: 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52     rc = fts3SegR
bfc0: 65 61 64 65 72 52 65 71 75 69 72 65 28 70 52 65  eaderRequire(pRe
bfd0: 61 64 65 72 2c 20 70 52 65 61 64 65 72 2d 3e 61  ader, pReader->a
bfe0: 44 6f 63 6c 69 73 74 2c 20 46 54 53 33 5f 56 41  Doclist, FTS3_VA
bff0: 52 49 4e 54 5f 4d 41 58 29 3b 0a 20 20 20 20 69  RINT_MAX);.    i
c000: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c010: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20   ){.      int n 
c020: 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74  = sqlite3Fts3Get
c030: 56 61 72 69 6e 74 28 70 52 65 61 64 65 72 2d 3e  Varint(pReader->
c040: 61 44 6f 63 6c 69 73 74 2c 20 26 70 52 65 61 64  aDoclist, &pRead
c050: 65 72 2d 3e 69 44 6f 63 69 64 29 3b 0a 20 20 20  er->iDocid);.   
c060: 20 20 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66     pReader->pOff
c070: 73 65 74 4c 69 73 74 20 3d 20 26 70 52 65 61 64  setList = &pRead
c080: 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b 6e 5d 3b  er->aDoclist[n];
c090: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
c0a0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
c0b0: 20 41 64 76 61 6e 63 65 20 74 68 65 20 53 65 67   Advance the Seg
c0c0: 52 65 61 64 65 72 20 74 6f 20 70 6f 69 6e 74 20  Reader to point 
c0d0: 74 6f 20 74 68 65 20 6e 65 78 74 20 64 6f 63 69  to the next doci
c0e0: 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74  d in the doclist
c0f0: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77  .** associated w
c100: 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ith the current 
c110: 74 65 72 6d 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  term..** .** If 
c120: 61 72 67 75 6d 65 6e 74 73 20 70 70 4f 66 66 73  arguments ppOffs
c130: 65 74 4c 69 73 74 20 61 6e 64 20 70 6e 4f 66 66  etList and pnOff
c140: 73 65 74 4c 69 73 74 20 61 72 65 20 6e 6f 74 20  setList are not 
c150: 4e 55 4c 4c 2c 20 74 68 65 6e 20 0a 2a 2a 20 2a  NULL, then .** *
c160: 70 70 4f 66 66 73 65 74 4c 69 73 74 20 69 73 20  ppOffsetList is 
c170: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
c180: 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  the first column
c190: 2d 6f 66 66 73 65 74 20 6c 69 73 74 0a 2a 2a 20  -offset list.** 
c1a0: 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20 65  in the doclist e
c1b0: 6e 74 72 79 20 28 69 2e 65 2e 20 69 6d 6d 65 64  ntry (i.e. immed
c1c0: 69 61 74 65 6c 79 20 70 61 73 74 20 74 68 65 20  iately past the 
c1d0: 64 6f 63 69 64 20 76 61 72 69 6e 74 29 2e 0a 2a  docid varint)..*
c1e0: 2a 20 2a 70 6e 4f 66 66 73 65 74 4c 69 73 74 20  * *pnOffsetList 
c1f0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c 65  is set to the le
c200: 6e 67 74 68 20 6f 66 20 74 68 65 20 73 65 74 20  ngth of the set 
c210: 6f 66 20 63 6f 6c 75 6d 6e 2d 6f 66 66 73 65 74  of column-offset
c220: 0a 2a 2a 20 6c 69 73 74 73 2c 20 6e 6f 74 20 69  .** lists, not i
c230: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 75 6c  ncluding the nul
c240: 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
c250: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a  . For example:.*
c260: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
c270: 33 53 65 67 52 65 61 64 65 72 4e 65 78 74 44 6f  3SegReaderNextDo
c280: 63 69 64 28 0a 20 20 46 74 73 33 54 61 62 6c 65  cid(.  Fts3Table
c290: 20 2a 70 54 61 62 2c 0a 20 20 46 74 73 33 53 65   *pTab,.  Fts3Se
c2a0: 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 65 72  gReader *pReader
c2b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61  ,         /* Rea
c2c0: 64 65 72 20 74 6f 20 61 64 76 61 6e 63 65 20 74  der to advance t
c2d0: 6f 20 6e 65 78 74 20 64 6f 63 69 64 20 2a 2f 0a  o next docid */.
c2e0: 20 20 63 68 61 72 20 2a 2a 70 70 4f 66 66 73 65    char **ppOffse
c2f0: 74 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  tList,          
c300: 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65    /* OUT: Pointe
c310: 72 20 74 6f 20 63 75 72 72 65 6e 74 20 70 6f 73  r to current pos
c320: 69 74 69 6f 6e 2d 6c 69 73 74 20 2a 2f 0a 20 20  ition-list */.  
c330: 69 6e 74 20 2a 70 6e 4f 66 66 73 65 74 4c 69 73  int *pnOffsetLis
c340: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
c350: 2f 2a 20 4f 55 54 3a 20 4c 65 6e 67 74 68 20 6f  /* OUT: Length o
c360: 66 20 2a 70 70 4f 66 66 73 65 74 4c 69 73 74 20  f *ppOffsetList 
c370: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20  in bytes */.){. 
c380: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c390: 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 70 20 3d  _OK;.  char *p =
c3a0: 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65   pReader->pOffse
c3b0: 74 4c 69 73 74 3b 0a 20 20 63 68 61 72 20 63 20  tList;.  char c 
c3c0: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
c3d0: 70 20 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  p );..  if( pTab
c3e0: 2d 3e 62 44 65 73 63 49 64 78 20 26 26 20 66 74  ->bDescIdx && ft
c3f0: 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65 6e  s3SegReaderIsPen
c400: 64 69 6e 67 28 70 52 65 61 64 65 72 29 20 29 7b  ding(pReader) ){
c410: 0a 20 20 20 20 2f 2a 20 41 20 70 65 6e 64 69 6e  .    /* A pendin
c420: 67 2d 74 65 72 6d 73 20 73 65 67 2d 72 65 61 64  g-terms seg-read
c430: 65 72 20 66 6f 72 20 61 6e 20 46 54 53 34 20 74  er for an FTS4 t
c440: 61 62 6c 65 20 74 68 61 74 20 75 73 65 73 20 6f  able that uses o
c450: 72 64 65 72 3d 64 65 73 63 2e 0a 20 20 20 20 2a  rder=desc..    *
c460: 2a 20 50 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20  * Pending-terms 
c470: 64 6f 63 6c 69 73 74 73 20 61 72 65 20 61 6c 77  doclists are alw
c480: 61 79 73 20 62 75 69 6c 74 20 75 70 20 69 6e 20  ays built up in 
c490: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2c  ascending order,
c4a0: 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20 68 61   so.    ** we ha
c4b0: 76 65 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ve to iterate th
c4c0: 72 6f 75 67 68 20 74 68 65 6d 20 62 61 63 6b 77  rough them backw
c4d0: 61 72 64 73 20 68 65 72 65 2e 20 2a 2f 0a 20 20  ards here. */.  
c4e0: 20 20 75 38 20 62 45 6f 66 20 3d 20 30 3b 0a 20    u8 bEof = 0;. 
c4f0: 20 20 20 69 66 28 20 70 70 4f 66 66 73 65 74 4c     if( ppOffsetL
c500: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  ist ){.      *pp
c510: 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 70 52 65  OffsetList = pRe
c520: 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73  ader->pOffsetLis
c530: 74 3b 0a 20 20 20 20 20 20 2a 70 6e 4f 66 66 73  t;.      *pnOffs
c540: 65 74 4c 69 73 74 20 3d 20 70 52 65 61 64 65 72  etList = pReader
c550: 2d 3e 6e 4f 66 66 73 65 74 4c 69 73 74 20 2d 20  ->nOffsetList - 
c560: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  1;.    }.    sql
c570: 69 74 65 33 46 74 73 33 44 6f 63 6c 69 73 74 50  ite3Fts3DoclistP
c580: 72 65 76 28 30 2c 0a 20 20 20 20 20 20 20 20 70  rev(0,.        p
c590: 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74  Reader->aDoclist
c5a0: 2c 20 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c  , pReader->nDocl
c5b0: 69 73 74 2c 20 26 70 2c 20 26 70 52 65 61 64 65  ist, &p, &pReade
c5c0: 72 2d 3e 69 44 6f 63 69 64 2c 0a 20 20 20 20 20  r->iDocid,.     
c5d0: 20 20 20 26 70 52 65 61 64 65 72 2d 3e 6e 4f 66     &pReader->nOf
c5e0: 66 73 65 74 4c 69 73 74 2c 20 26 62 45 6f 66 0a  fsetList, &bEof.
c5f0: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 62      );.    if( b
c600: 45 6f 66 20 29 7b 0a 20 20 20 20 20 20 70 52 65  Eof ){.      pRe
c610: 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73  ader->pOffsetLis
c620: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
c630: 7b 0a 20 20 20 20 20 20 70 52 65 61 64 65 72 2d  {.      pReader-
c640: 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 70  >pOffsetList = p
c650: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
c660: 0a 20 20 20 20 63 68 61 72 20 2a 70 45 6e 64 20  .    char *pEnd 
c670: 3d 20 26 70 52 65 61 64 65 72 2d 3e 61 44 6f 63  = &pReader->aDoc
c680: 6c 69 73 74 5b 70 52 65 61 64 65 72 2d 3e 6e 44  list[pReader->nD
c690: 6f 63 6c 69 73 74 5d 3b 0a 0a 20 20 20 20 2f 2a  oclist];..    /*
c6a0: 20 50 6f 69 6e 74 65 72 20 70 20 63 75 72 72 65   Pointer p curre
c6b0: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 61 74 20 74  ntly points at t
c6c0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
c6d0: 20 61 6e 20 6f 66 66 73 65 74 20 6c 69 73 74 2e   an offset list.
c6e0: 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c   The.    ** foll
c6f0: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 61 64 76 61  owing block adva
c700: 6e 63 65 73 20 69 74 20 74 6f 20 70 6f 69 6e 74  nces it to point
c710: 20 6f 6e 65 20 62 79 74 65 20 70 61 73 74 20 74   one byte past t
c720: 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a 2a  he end of.    **
c730: 20 74 68 65 20 73 61 6d 65 20 6f 66 66 73 65 74   the same offset
c740: 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 77 68   list. */.    wh
c750: 69 6c 65 28 20 31 20 29 7b 0a 20 20 0a 20 20 20  ile( 1 ){.  .   
c760: 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
c770: 69 6e 67 20 6c 69 6e 65 20 6f 66 20 63 6f 64 65  ing line of code
c780: 20 28 61 6e 64 20 74 68 65 20 22 70 2b 2b 22 20   (and the "p++" 
c790: 62 65 6c 6f 77 20 74 68 65 20 77 68 69 6c 65 28  below the while(
c7a0: 29 20 6c 6f 6f 70 29 20 69 73 0a 20 20 20 20 20  ) loop) is.     
c7b0: 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 6c 6c   ** normally all
c7c0: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
c7d0: 64 20 74 6f 20 6d 6f 76 65 20 70 6f 69 6e 74 65  d to move pointe
c7e0: 72 20 70 20 74 6f 20 74 68 65 20 64 65 73 69 72  r p to the desir
c7f0: 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 70 6f 73  ed .      ** pos
c800: 69 74 69 6f 6e 2e 20 54 68 65 20 65 78 63 65 70  ition. The excep
c810: 74 69 6f 6e 20 69 73 20 69 66 20 74 68 69 73 20  tion is if this 
c820: 6e 6f 64 65 20 69 73 20 62 65 69 6e 67 20 6c 6f  node is being lo
c830: 61 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 0a 20  aded from disk. 
c840: 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e       ** incremen
c850: 74 61 6c 6c 79 20 61 6e 64 20 70 6f 69 6e 74 65  tally and pointe
c860: 72 20 22 70 22 20 6e 6f 77 20 70 6f 69 6e 74 73  r "p" now points
c870: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
c880: 74 65 20 70 61 73 74 0a 20 20 20 20 20 20 2a 2a  te past.      **
c890: 20 74 68 65 20 70 6f 70 75 6c 61 74 65 64 20 70   the populated p
c8a0: 61 72 74 20 6f 66 20 70 52 65 61 64 65 72 2d 3e  art of pReader->
c8b0: 61 4e 6f 64 65 5b 5d 2e 0a 20 20 20 20 20 20 2a  aNode[]..      *
c8c0: 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a  /.      while( *
c8d0: 70 20 7c 20 63 20 29 20 63 20 3d 20 2a 70 2b 2b  p | c ) c = *p++
c8e0: 20 26 20 30 78 38 30 3b 0a 20 20 20 20 20 20 61   & 0x80;.      a
c8f0: 73 73 65 72 74 28 20 2a 70 3d 3d 30 20 29 3b 0a  ssert( *p==0 );.
c900: 20 20 0a 20 20 20 20 20 20 69 66 28 20 70 52 65    .      if( pRe
c910: 61 64 65 72 2d 3e 70 42 6c 6f 62 3d 3d 30 20 7c  ader->pBlob==0 |
c920: 7c 20 70 3c 26 70 52 65 61 64 65 72 2d 3e 61 4e  | p<&pReader->aN
c930: 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e 50 6f  ode[pReader->nPo
c940: 70 75 6c 61 74 65 5d 20 29 20 62 72 65 61 6b 3b  pulate] ) break;
c950: 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33  .      rc = fts3
c960: 53 65 67 52 65 61 64 65 72 49 6e 63 72 52 65 61  SegReaderIncrRea
c970: 64 28 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20  d(pReader);.    
c980: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c990: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
c9a0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2b 2b 3b 0a  .    }.    p++;.
c9b0: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 72 65 71    .    /* If req
c9c0: 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20  uired, populate 
c9d0: 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
c9e0: 62 6c 65 73 20 77 69 74 68 20 61 20 70 6f 69 6e  bles with a poin
c9f0: 74 65 72 20 74 6f 20 61 6e 64 20 74 68 65 0a 20  ter to and the. 
ca00: 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68     ** size of th
ca10: 65 20 70 72 65 76 69 6f 75 73 20 6f 66 66 73 65  e previous offse
ca20: 74 2d 6c 69 73 74 2e 0a 20 20 20 20 2a 2f 0a 20  t-list..    */. 
ca30: 20 20 20 69 66 28 20 70 70 4f 66 66 73 65 74 4c     if( ppOffsetL
ca40: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  ist ){.      *pp
ca50: 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 70 52 65  OffsetList = pRe
ca60: 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73  ader->pOffsetLis
ca70: 74 3b 0a 20 20 20 20 20 20 2a 70 6e 4f 66 66 73  t;.      *pnOffs
ca80: 65 74 4c 69 73 74 20 3d 20 28 69 6e 74 29 28 70  etList = (int)(p
ca90: 20 2d 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66   - pReader->pOff
caa0: 73 65 74 4c 69 73 74 20 2d 20 31 29 3b 0a 20 20  setList - 1);.  
cab0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 73 74    }..    /* List
cac0: 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 65   may have been e
cad0: 64 69 74 65 64 20 69 6e 20 70 6c 61 63 65 20 62  dited in place b
cae0: 79 20 66 74 73 33 45 76 61 6c 4e 65 61 72 54 72  y fts3EvalNearTr
caf0: 69 6d 28 29 20 2a 2f 0a 20 20 20 20 77 68 69 6c  im() */.    whil
cb00: 65 28 20 70 3c 70 45 6e 64 20 26 26 20 2a 70 3d  e( p<pEnd && *p=
cb10: 3d 30 20 29 20 70 2b 2b 3b 0a 20 20 0a 20 20 20  =0 ) p++;.  .   
cb20: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
cb30: 20 6e 6f 20 6d 6f 72 65 20 65 6e 74 72 69 65 73   no more entries
cb40: 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 2c   in the doclist,
cb50: 20 73 65 74 20 70 4f 66 66 73 65 74 4c 69 73 74   set pOffsetList
cb60: 20 74 6f 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2e   to.    ** NULL.
cb70: 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20   Otherwise, set 
cb80: 46 74 73 33 53 65 67 52 65 61 64 65 72 2e 69 44  Fts3SegReader.iD
cb90: 6f 63 69 64 20 74 6f 20 74 68 65 20 6e 65 78 74  ocid to the next
cba0: 20 64 6f 63 69 64 20 61 6e 64 0a 20 20 20 20 2a   docid and.    *
cbb0: 2a 20 46 74 73 33 53 65 67 52 65 61 64 65 72 2e  * Fts3SegReader.
cbc0: 70 4f 66 66 73 65 74 4c 69 73 74 20 74 6f 20 70  pOffsetList to p
cbd0: 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74  oint to the next
cbe0: 20 6f 66 66 73 65 74 20 6c 69 73 74 20 62 65 66   offset list bef
cbf0: 6f 72 65 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  ore.    ** retur
cc00: 6e 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ning..    */.   
cc10: 20 69 66 28 20 70 3e 3d 70 45 6e 64 20 29 7b 0a   if( p>=pEnd ){.
cc20: 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70        pReader->p
cc30: 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 30 3b 0a  OffsetList = 0;.
cc40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cc50: 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61   rc = fts3SegRea
cc60: 64 65 72 52 65 71 75 69 72 65 28 70 52 65 61 64  derRequire(pRead
cc70: 65 72 2c 20 70 2c 20 46 54 53 33 5f 56 41 52 49  er, p, FTS3_VARI
cc80: 4e 54 5f 4d 41 58 29 3b 0a 20 20 20 20 20 20 69  NT_MAX);.      i
cc90: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
cca0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
ccb0: 74 65 33 5f 69 6e 74 36 34 20 69 44 65 6c 74 61  te3_int64 iDelta
ccc0: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64 65  ;.        pReade
ccd0: 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d  r->pOffsetList =
cce0: 20 70 20 2b 20 73 71 6c 69 74 65 33 46 74 73 33   p + sqlite3Fts3
ccf0: 47 65 74 56 61 72 69 6e 74 28 70 2c 20 26 69 44  GetVarint(p, &iD
cd00: 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69  elta);.        i
cd10: 66 28 20 70 54 61 62 2d 3e 62 44 65 73 63 49 64  f( pTab->bDescId
cd20: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  x ){.          p
cd30: 52 65 61 64 65 72 2d 3e 69 44 6f 63 69 64 20 2d  Reader->iDocid -
cd40: 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  = iDelta;.      
cd50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
cd60: 20 20 20 70 52 65 61 64 65 72 2d 3e 69 44 6f 63     pReader->iDoc
cd70: 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20  id += iDelta;.  
cd80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
cd90: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
cda0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
cdb0: 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ...int sqlite3Ft
cdc0: 73 33 4d 73 72 4f 76 66 6c 28 0a 20 20 46 74 73  s3MsrOvfl(.  Fts
cdd0: 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 0a  3Cursor *pCsr, .
cde0: 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65    Fts3MultiSegRe
cdf0: 61 64 65 72 20 2a 70 4d 73 72 2c 0a 20 20 69 6e  ader *pMsr,.  in
ce00: 74 20 2a 70 6e 4f 76 66 6c 0a 29 7b 0a 20 20 46  t *pnOvfl.){.  F
ce10: 74 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 28 46  ts3Table *p = (F
ce20: 74 73 33 54 61 62 6c 65 2a 29 70 43 73 72 2d 3e  ts3Table*)pCsr->
ce30: 62 61 73 65 2e 70 56 74 61 62 3b 0a 20 20 69 6e  base.pVtab;.  in
ce40: 74 20 6e 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69  t nOvfl = 0;.  i
ce50: 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 72 63 20  nt ii;.  int rc 
ce60: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
ce70: 6e 74 20 70 67 73 7a 20 3d 20 70 2d 3e 6e 50 67  nt pgsz = p->nPg
ce80: 73 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  sz;..  assert( p
ce90: 2d 3e 62 46 74 73 34 20 29 3b 0a 20 20 61 73 73  ->bFts4 );.  ass
cea0: 65 72 74 28 20 70 67 73 7a 3e 30 20 29 3b 0a 0a  ert( pgsz>0 );..
ceb0: 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d    for(ii=0; rc==
cec0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c  SQLITE_OK && ii<
ced0: 70 4d 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 20  pMsr->nSegment; 
cee0: 69 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 33 53  ii++){.    Fts3S
cef0: 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 65  egReader *pReade
cf00: 72 20 3d 20 70 4d 73 72 2d 3e 61 70 53 65 67 6d  r = pMsr->apSegm
cf10: 65 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28  ent[ii];.    if(
cf20: 20 21 66 74 73 33 53 65 67 52 65 61 64 65 72 49   !fts3SegReaderI
cf30: 73 50 65 6e 64 69 6e 67 28 70 52 65 61 64 65 72  sPending(pReader
cf40: 29 20 0a 20 20 20 20 20 26 26 20 21 66 74 73 33  ) .     && !fts3
cf50: 53 65 67 52 65 61 64 65 72 49 73 52 6f 6f 74 4f  SegReaderIsRootO
cf60: 6e 6c 79 28 70 52 65 61 64 65 72 29 20 0a 20 20  nly(pReader) .  
cf70: 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
cf80: 65 33 5f 69 6e 74 36 34 20 6a 6a 3b 0a 20 20 20  e3_int64 jj;.   
cf90: 20 20 20 66 6f 72 28 6a 6a 3d 70 52 65 61 64 65     for(jj=pReade
cfa0: 72 2d 3e 69 53 74 61 72 74 42 6c 6f 63 6b 3b 20  r->iStartBlock; 
cfb0: 6a 6a 3c 3d 70 52 65 61 64 65 72 2d 3e 69 4c 65  jj<=pReader->iLe
cfc0: 61 66 45 6e 64 42 6c 6f 63 6b 3b 20 6a 6a 2b 2b  afEndBlock; jj++
cfd0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
cfe0: 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 72 63  Blob;.        rc
cff0: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 52 65   = sqlite3Fts3Re
d000: 61 64 42 6c 6f 63 6b 28 70 2c 20 6a 6a 2c 20 30  adBlock(p, jj, 0
d010: 2c 20 26 6e 42 6c 6f 62 2c 20 30 29 3b 0a 20 20  , &nBlob, 0);.  
d020: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
d030: 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b  LITE_OK ) break;
d040: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6e 42  .        if( (nB
d050: 6c 6f 62 2b 33 35 29 3e 70 67 73 7a 20 29 7b 0a  lob+35)>pgsz ){.
d060: 20 20 20 20 20 20 20 20 20 20 6e 4f 76 66 6c 20            nOvfl 
d070: 2b 3d 20 28 6e 42 6c 6f 62 20 2b 20 33 34 29 2f  += (nBlob + 34)/
d080: 70 67 73 7a 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pgsz;.        }.
d090: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d0a0: 7d 0a 20 20 2a 70 6e 4f 76 66 6c 20 3d 20 6e 4f  }.  *pnOvfl = nO
d0b0: 76 66 6c 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  vfl;.  return rc
d0c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
d0d0: 61 6c 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  all allocations 
d0e0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
d0f0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  the iterator pas
d100: 73 65 64 20 61 73 20 74 68 65 20 0a 2a 2a 20 73  sed as the .** s
d110: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
d120: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
d130: 74 73 33 53 65 67 52 65 61 64 65 72 46 72 65 65  ts3SegReaderFree
d140: 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a  (Fts3SegReader *
d150: 70 52 65 61 64 65 72 29 7b 0a 20 20 69 66 28 20  pReader){.  if( 
d160: 70 52 65 61 64 65 72 20 26 26 20 21 66 74 73 33  pReader && !fts3
d170: 53 65 67 52 65 61 64 65 72 49 73 50 65 6e 64 69  SegReaderIsPendi
d180: 6e 67 28 70 52 65 61 64 65 72 29 20 29 7b 0a 20  ng(pReader) ){. 
d190: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
d1a0: 70 52 65 61 64 65 72 2d 3e 7a 54 65 72 6d 29 3b  pReader->zTerm);
d1b0: 0a 20 20 20 20 69 66 28 20 21 66 74 73 33 53 65  .    if( !fts3Se
d1c0: 67 52 65 61 64 65 72 49 73 52 6f 6f 74 4f 6e 6c  gReaderIsRootOnl
d1d0: 79 28 70 52 65 61 64 65 72 29 20 29 7b 0a 20 20  y(pReader) ){.  
d1e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
d1f0: 28 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 29  (pReader->aNode)
d200: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
d210: 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61 64  blob_close(pRead
d220: 65 72 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 20 20  er->pBlob);.    
d230: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
d240: 66 72 65 65 28 70 52 65 61 64 65 72 29 3b 0a 7d  free(pReader);.}
d250: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
d260: 20 61 20 6e 65 77 20 53 65 67 52 65 61 64 65 72   a new SegReader
d270: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74 20   object..*/.int 
d280: 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
d290: 61 64 65 72 4e 65 77 28 0a 20 20 69 6e 74 20 69  aderNew(.  int i
d2a0: 41 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  Age,            
d2b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
d2c0: 67 6d 65 6e 74 20 22 61 67 65 22 2e 20 2a 2f 0a  gment "age". */.
d2d0: 20 20 69 6e 74 20 62 4c 6f 6f 6b 75 70 2c 20 20    int bLookup,  
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2f0: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
d300: 6c 6f 6f 6b 75 70 20 6f 6e 6c 79 20 2a 2f 0a 20  lookup only */. 
d310: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
d320: 53 74 61 72 74 4c 65 61 66 2c 20 20 20 20 20 20  StartLeaf,      
d330: 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20 74   /* First leaf t
d340: 6f 20 74 72 61 76 65 72 73 65 20 2a 2f 0a 20 20  o traverse */.  
d350: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45  sqlite3_int64 iE
d360: 6e 64 4c 65 61 66 2c 20 20 20 20 20 20 20 20 20  ndLeaf,         
d370: 2f 2a 20 46 69 6e 61 6c 20 6c 65 61 66 20 74 6f  /* Final leaf to
d380: 20 74 72 61 76 65 72 73 65 20 2a 2f 0a 20 20 73   traverse */.  s
d390: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e  qlite3_int64 iEn
d3a0: 64 42 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 2f  dBlock,        /
d3b0: 2a 20 46 69 6e 61 6c 20 62 6c 6f 63 6b 20 6f 66  * Final block of
d3c0: 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f   segment */.  co
d3d0: 6e 73 74 20 63 68 61 72 20 2a 7a 52 6f 6f 74 2c  nst char *zRoot,
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d3f0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
d400: 6e 67 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a  ng root node */.
d410: 20 20 69 6e 74 20 6e 52 6f 6f 74 2c 20 20 20 20    int nRoot,    
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d430: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
d440: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 72  fer containing r
d450: 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 46 74  oot node */.  Ft
d460: 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a 70 70  s3SegReader **pp
d470: 52 65 61 64 65 72 20 20 20 20 20 20 20 20 2f 2a  Reader        /*
d480: 20 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 64 20   OUT: Allocated 
d490: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2f  Fts3SegReader */
d4a0: 0a 29 7b 0a 20 20 46 74 73 33 53 65 67 52 65 61  .){.  Fts3SegRea
d4b0: 64 65 72 20 2a 70 52 65 61 64 65 72 3b 20 20 20  der *pReader;   
d4c0: 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61        /* Newly a
d4d0: 6c 6c 6f 63 61 74 65 64 20 53 65 67 52 65 61 64  llocated SegRead
d4e0: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
d4f0: 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 20 20  nt nExtra = 0;  
d500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d510: 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
d520: 61 74 65 20 73 65 67 6d 65 6e 74 20 72 6f 6f 74  ate segment root
d530: 20 6e 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65   node */..  asse
d540: 72 74 28 20 69 53 74 61 72 74 4c 65 61 66 3c 3d  rt( iStartLeaf<=
d550: 69 45 6e 64 4c 65 61 66 20 29 3b 0a 20 20 69 66  iEndLeaf );.  if
d560: 28 20 69 53 74 61 72 74 4c 65 61 66 3d 3d 30 20  ( iStartLeaf==0 
d570: 29 7b 0a 20 20 20 20 6e 45 78 74 72 61 20 3d 20  ){.    nExtra = 
d580: 6e 52 6f 6f 74 20 2b 20 46 54 53 33 5f 4e 4f 44  nRoot + FTS3_NOD
d590: 45 5f 50 41 44 44 49 4e 47 3b 0a 20 20 7d 0a 0a  E_PADDING;.  }..
d5a0: 20 20 70 52 65 61 64 65 72 20 3d 20 28 46 74 73    pReader = (Fts
d5b0: 33 53 65 67 52 65 61 64 65 72 20 2a 29 73 71 6c  3SegReader *)sql
d5c0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
d5d0: 6f 66 28 46 74 73 33 53 65 67 52 65 61 64 65 72  of(Fts3SegReader
d5e0: 29 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69  ) + nExtra);.  i
d5f0: 66 28 20 21 70 52 65 61 64 65 72 20 29 7b 0a 20  f( !pReader ){. 
d600: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d610: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65  _NOMEM;.  }.  me
d620: 6d 73 65 74 28 70 52 65 61 64 65 72 2c 20 30 2c  mset(pReader, 0,
d630: 20 73 69 7a 65 6f 66 28 46 74 73 33 53 65 67 52   sizeof(Fts3SegR
d640: 65 61 64 65 72 29 29 3b 0a 20 20 70 52 65 61 64  eader));.  pRead
d650: 65 72 2d 3e 69 49 64 78 20 3d 20 69 41 67 65 3b  er->iIdx = iAge;
d660: 0a 20 20 70 52 65 61 64 65 72 2d 3e 62 4c 6f 6f  .  pReader->bLoo
d670: 6b 75 70 20 3d 20 62 4c 6f 6f 6b 75 70 21 3d 30  kup = bLookup!=0
d680: 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 69 53 74  ;.  pReader->iSt
d690: 61 72 74 42 6c 6f 63 6b 20 3d 20 69 53 74 61 72  artBlock = iStar
d6a0: 74 4c 65 61 66 3b 0a 20 20 70 52 65 61 64 65 72  tLeaf;.  pReader
d6b0: 2d 3e 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 20  ->iLeafEndBlock 
d6c0: 3d 20 69 45 6e 64 4c 65 61 66 3b 0a 20 20 70 52  = iEndLeaf;.  pR
d6d0: 65 61 64 65 72 2d 3e 69 45 6e 64 42 6c 6f 63 6b  eader->iEndBlock
d6e0: 20 3d 20 69 45 6e 64 42 6c 6f 63 6b 3b 0a 0a 20   = iEndBlock;.. 
d6f0: 20 69 66 28 20 6e 45 78 74 72 61 20 29 7b 0a 20   if( nExtra ){. 
d700: 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65     /* The entire
d710: 20 73 65 67 6d 65 6e 74 20 69 73 20 73 74 6f 72   segment is stor
d720: 65 64 20 69 6e 20 74 68 65 20 72 6f 6f 74 20 6e  ed in the root n
d730: 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 70 52 65 61  ode. */.    pRea
d740: 64 65 72 2d 3e 61 4e 6f 64 65 20 3d 20 28 63 68  der->aNode = (ch
d750: 61 72 20 2a 29 26 70 52 65 61 64 65 72 5b 31 5d  ar *)&pReader[1]
d760: 3b 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e 72  ;.    pReader->r
d770: 6f 6f 74 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20  ootOnly = 1;.   
d780: 20 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 20   pReader->nNode 
d790: 3d 20 6e 52 6f 6f 74 3b 0a 20 20 20 20 6d 65 6d  = nRoot;.    mem
d7a0: 63 70 79 28 70 52 65 61 64 65 72 2d 3e 61 4e 6f  cpy(pReader->aNo
d7b0: 64 65 2c 20 7a 52 6f 6f 74 2c 20 6e 52 6f 6f 74  de, zRoot, nRoot
d7c0: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70  );.    memset(&p
d7d0: 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 6e 52  Reader->aNode[nR
d7e0: 6f 6f 74 5d 2c 20 30 2c 20 46 54 53 33 5f 4e 4f  oot], 0, FTS3_NO
d7f0: 44 45 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 7d  DE_PADDING);.  }
d800: 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 61 64 65  else{.    pReade
d810: 72 2d 3e 69 43 75 72 72 65 6e 74 42 6c 6f 63 6b  r->iCurrentBlock
d820: 20 3d 20 69 53 74 61 72 74 4c 65 61 66 2d 31 3b   = iStartLeaf-1;
d830: 0a 20 20 7d 0a 20 20 2a 70 70 52 65 61 64 65 72  .  }.  *ppReader
d840: 20 3d 20 70 52 65 61 64 65 72 3b 0a 20 20 72 65   = pReader;.  re
d850: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d860: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
d870: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75   a comparison fu
d880: 6e 63 74 69 6f 6e 20 75 73 65 64 20 61 73 20 61  nction used as a
d890: 20 71 73 6f 72 74 28 29 20 63 61 6c 6c 62 61 63   qsort() callbac
d8a0: 6b 20 77 68 65 6e 20 73 6f 72 74 69 6e 67 0a 2a  k when sorting.*
d8b0: 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 65  * an array of pe
d8c0: 6e 64 69 6e 67 20 74 65 72 6d 73 20 62 79 20 74  nding terms by t
d8d0: 65 72 6d 2e 20 54 68 69 73 20 6f 63 63 75 72 73  erm. This occurs
d8e0: 20 61 73 20 70 61 72 74 20 6f 66 20 66 6c 75 73   as part of flus
d8f0: 68 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  hing.** the cont
d900: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 65 6e 64  ents of the pend
d910: 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20 74  ing-terms hash t
d920: 61 62 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61  able to the data
d930: 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
d940: 69 6e 74 20 66 74 73 33 43 6f 6d 70 61 72 65 45  int fts3CompareE
d950: 6c 65 6d 42 79 54 65 72 6d 28 63 6f 6e 73 74 20  lemByTerm(const 
d960: 76 6f 69 64 20 2a 6c 68 73 2c 20 63 6f 6e 73 74  void *lhs, const
d970: 20 76 6f 69 64 20 2a 72 68 73 29 7b 0a 20 20 63   void *rhs){.  c
d980: 68 61 72 20 2a 7a 31 20 3d 20 66 74 73 33 48 61  har *z1 = fts3Ha
d990: 73 68 4b 65 79 28 2a 28 46 74 73 33 48 61 73 68  shKey(*(Fts3Hash
d9a0: 45 6c 65 6d 20 2a 2a 29 6c 68 73 29 3b 0a 20 20  Elem **)lhs);.  
d9b0: 63 68 61 72 20 2a 7a 32 20 3d 20 66 74 73 33 48  char *z2 = fts3H
d9c0: 61 73 68 4b 65 79 28 2a 28 46 74 73 33 48 61 73  ashKey(*(Fts3Has
d9d0: 68 45 6c 65 6d 20 2a 2a 29 72 68 73 29 3b 0a 20  hElem **)rhs);. 
d9e0: 20 69 6e 74 20 6e 31 20 3d 20 66 74 73 33 48 61   int n1 = fts3Ha
d9f0: 73 68 4b 65 79 73 69 7a 65 28 2a 28 46 74 73 33  shKeysize(*(Fts3
da00: 48 61 73 68 45 6c 65 6d 20 2a 2a 29 6c 68 73 29  HashElem **)lhs)
da10: 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20 66 74 73  ;.  int n2 = fts
da20: 33 48 61 73 68 4b 65 79 73 69 7a 65 28 2a 28 46  3HashKeysize(*(F
da30: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29 72  ts3HashElem **)r
da40: 68 73 29 3b 0a 0a 20 20 69 6e 74 20 6e 20 3d 20  hs);..  int n = 
da50: 28 6e 31 3c 6e 32 20 3f 20 6e 31 20 3a 20 6e 32  (n1<n2 ? n1 : n2
da60: 29 3b 0a 20 20 69 6e 74 20 63 20 3d 20 6d 65 6d  );.  int c = mem
da70: 63 6d 70 28 7a 31 2c 20 7a 32 2c 20 6e 29 3b 0a  cmp(z1, z2, n);.
da80: 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
da90: 20 20 63 20 3d 20 6e 31 20 2d 20 6e 32 3b 0a 20    c = n1 - n2;. 
daa0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d   }.  return c;.}
dab0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
dac0: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
dad0: 20 61 6c 6c 6f 63 61 74 65 20 61 6e 20 46 74 73   allocate an Fts
dae0: 33 53 65 67 52 65 61 64 65 72 20 74 68 61 74 20  3SegReader that 
daf0: 69 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68  iterates through
db00: 0a 2a 2a 20 61 20 73 75 62 73 65 74 20 6f 66 20  .** a subset of 
db10: 74 68 65 20 74 65 72 6d 73 20 73 74 6f 72 65 64  the terms stored
db20: 20 69 6e 20 74 68 65 20 46 74 73 33 54 61 62 6c   in the Fts3Tabl
db30: 65 2e 70 65 6e 64 69 6e 67 54 65 72 6d 73 20 61  e.pendingTerms a
db40: 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rray..**.** If t
db50: 68 65 20 69 73 50 72 65 66 69 78 49 74 65 72 20  he isPrefixIter 
db60: 70 61 72 61 6d 65 74 65 72 20 69 73 20 7a 65 72  parameter is zer
db70: 6f 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  o, then the retu
db80: 72 6e 65 64 20 53 65 67 52 65 61 64 65 72 20 69  rned SegReader i
db90: 74 65 72 61 74 65 73 0a 2a 2a 20 74 68 72 6f 75  terates.** throu
dba0: 67 68 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20  gh each term in 
dbb0: 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d  the pending-term
dbc0: 73 20 74 61 62 6c 65 2e 20 4f 72 2c 20 69 66 20  s table. Or, if 
dbd0: 69 73 50 72 65 66 69 78 49 74 65 72 20 69 73 0a  isPrefixIter is.
dbe0: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20  ** non-zero, it 
dbf0: 69 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68  iterates through
dc00: 20 65 61 63 68 20 74 65 72 6d 20 61 6e 64 20 69   each term and i
dc10: 74 73 20 70 72 65 66 69 78 65 73 2e 20 46 6f 72  ts prefixes. For
dc20: 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20   example, if.** 
dc30: 74 68 65 20 70 65 6e 64 69 6e 67 20 74 65 72 6d  the pending term
dc40: 73 20 68 61 73 68 20 74 61 62 6c 65 20 63 6f 6e  s hash table con
dc50: 74 61 69 6e 73 20 74 68 65 20 74 65 72 6d 73 20  tains the terms 
dc60: 22 73 71 6c 69 74 65 22 2c 20 22 6d 79 73 71 6c  "sqlite", "mysql
dc70: 22 20 61 6e 64 0a 2a 2a 20 22 66 69 72 65 62 69  " and.** "firebi
dc80: 72 64 22 2c 20 74 68 65 6e 20 74 68 65 20 69 74  rd", then the it
dc90: 65 72 61 74 6f 72 20 76 69 73 69 74 73 20 74 68  erator visits th
dca0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 27 74 65 72  e following 'ter
dcb0: 6d 73 27 20 28 69 6e 20 74 68 65 20 6f 72 64 65  ms' (in the orde
dcc0: 72 0a 2a 2a 20 73 68 6f 77 6e 29 3a 0a 2a 2a 0a  r.** shown):.**.
dcd0: 2a 2a 20 20 20 66 20 66 69 20 66 69 72 20 66 69  **   f fi fir fi
dce0: 72 65 20 66 69 72 65 62 20 66 69 72 65 62 69 20  re fireb firebi 
dcf0: 66 69 72 65 62 69 72 20 66 69 72 65 62 69 72 64  firebir firebird
dd00: 0a 2a 2a 20 20 20 6d 20 6d 79 20 6d 79 73 20 6d  .**   m my mys m
dd10: 79 73 71 20 6d 79 73 71 6c 0a 2a 2a 20 20 20 73  ysq mysql.**   s
dd20: 20 73 71 20 73 71 6c 20 73 71 6c 69 20 73 71 6c   sq sql sqli sql
dd30: 69 74 20 73 71 6c 69 74 65 0a 2a 2a 0a 2a 2a 20  it sqlite.**.** 
dd40: 57 68 65 72 65 61 73 20 69 66 20 69 73 50 72 65  Whereas if isPre
dd50: 66 69 78 49 74 65 72 20 69 73 20 7a 65 72 6f 2c  fixIter is zero,
dd60: 20 74 68 65 20 74 65 72 6d 73 20 76 69 73 69 74   the terms visit
dd70: 65 64 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  ed are:.**.**   
dd80: 66 69 72 65 62 69 72 64 20 6d 79 73 71 6c 20 73  firebird mysql s
dd90: 71 6c 69 74 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c  qlite.*/.int sql
dda0: 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
ddb0: 72 50 65 6e 64 69 6e 67 28 0a 20 20 46 74 73 33  rPending(.  Fts3
ddc0: 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
dde0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
ddf0: 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e  dle */.  int iIn
de00: 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  dex,            
de10: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
de20: 78 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65 78 20  x for p->aIndex 
de30: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
de40: 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  *zTerm,         
de50: 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20       /* Term to 
de60: 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a 20 20  search for */.  
de70: 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 20  int nTerm,      
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de90: 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
dea0: 72 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  r zTerm */.  int
deb0: 20 62 50 72 65 66 69 78 2c 20 20 20 20 20 20 20   bPrefix,       
dec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ded0: 54 72 75 65 20 66 6f 72 20 61 20 70 72 65 66 69  True for a prefi
dee0: 78 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20  x iterator */.  
def0: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a  Fts3SegReader **
df00: 70 70 52 65 61 64 65 72 20 20 20 20 20 20 20 20  ppReader        
df10: 2f 2a 20 4f 55 54 3a 20 53 65 67 52 65 61 64 65  /* OUT: SegReade
df20: 72 20 66 6f 72 20 70 65 6e 64 69 6e 67 2d 74 65  r for pending-te
df30: 72 6d 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33  rms */.){.  Fts3
df40: 53 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64  SegReader *pRead
df50: 65 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46  er = 0;     /* F
df60: 74 73 33 53 65 67 52 65 61 64 65 72 20 6f 62 6a  ts3SegReader obj
df70: 65 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ect to return */
df80: 0a 20 20 46 74 73 33 48 61 73 68 45 6c 65 6d 20  .  Fts3HashElem 
df90: 2a 70 45 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pE;            
dfa0: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
dfb0: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 46 74 73  ariable */.  Fts
dfc0: 33 48 61 73 68 45 6c 65 6d 20 2a 2a 61 45 6c 65  3HashElem **aEle
dfd0: 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  m = 0;       /* 
dfe0: 41 72 72 61 79 20 6f 66 20 74 65 72 6d 20 68 61  Array of term ha
dff0: 73 68 20 65 6e 74 72 69 65 73 20 74 6f 20 73 63  sh entries to sc
e000: 61 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6c 65  an */.  int nEle
e010: 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  m = 0;          
e020: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
e030: 6f 66 20 61 72 72 61 79 20 61 74 20 61 45 6c 65  of array at aEle
e040: 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  m */.  int rc = 
e050: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
e060: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
e070: 20 43 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 48   Code */.  Fts3H
e080: 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 70  ash *pHash;..  p
e090: 48 61 73 68 20 3d 20 26 70 2d 3e 61 49 6e 64 65  Hash = &p->aInde
e0a0: 78 5b 69 49 6e 64 65 78 5d 2e 68 50 65 6e 64 69  x[iIndex].hPendi
e0b0: 6e 67 3b 0a 20 20 69 66 28 20 62 50 72 65 66 69  ng;.  if( bPrefi
e0c0: 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 6c  x ){.    int nAl
e0d0: 6c 6f 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20  loc = 0;        
e0e0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
e0f0: 66 20 61 6c 6c 6f 63 61 74 65 64 20 61 72 72 61  f allocated arra
e100: 79 20 61 74 20 61 45 6c 65 6d 20 2a 2f 0a 0a 20  y at aElem */.. 
e110: 20 20 20 66 6f 72 28 70 45 3d 66 74 73 33 48 61     for(pE=fts3Ha
e120: 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20  shFirst(pHash); 
e130: 70 45 3b 20 70 45 3d 66 74 73 33 48 61 73 68 4e  pE; pE=fts3HashN
e140: 65 78 74 28 70 45 29 29 7b 0a 20 20 20 20 20 20  ext(pE)){.      
e150: 63 68 61 72 20 2a 7a 4b 65 79 20 3d 20 28 63 68  char *zKey = (ch
e160: 61 72 20 2a 29 66 74 73 33 48 61 73 68 4b 65 79  ar *)fts3HashKey
e170: 28 70 45 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  (pE);.      int 
e180: 6e 4b 65 79 20 3d 20 66 74 73 33 48 61 73 68 4b  nKey = fts3HashK
e190: 65 79 73 69 7a 65 28 70 45 29 3b 0a 20 20 20 20  eysize(pE);.    
e1a0: 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d 30 20 7c    if( nTerm==0 |
e1b0: 7c 20 28 6e 4b 65 79 3e 3d 6e 54 65 72 6d 20 26  | (nKey>=nTerm &
e1c0: 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 4b 65 79  & 0==memcmp(zKey
e1d0: 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 29  , zTerm, nTerm))
e1e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
e1f0: 6e 45 6c 65 6d 3d 3d 6e 41 6c 6c 6f 63 20 29 7b  nElem==nAlloc ){
e200: 0a 20 20 20 20 20 20 20 20 20 20 46 74 73 33 48  .          Fts3H
e210: 61 73 68 45 6c 65 6d 20 2a 2a 61 45 6c 65 6d 32  ashElem **aElem2
e220: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 41 6c 6c  ;.          nAll
e230: 6f 63 20 2b 3d 20 31 36 3b 0a 20 20 20 20 20 20  oc += 16;.      
e240: 20 20 20 20 61 45 6c 65 6d 32 20 3d 20 28 46 74      aElem2 = (Ft
e250: 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29 73 71  s3HashElem **)sq
e260: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20  lite3_realloc(. 
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 45 6c               aEl
e280: 65 6d 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f  em, nAlloc*sizeo
e290: 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a  f(Fts3HashElem *
e2a0: 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ).          );. 
e2b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 61 45           if( !aE
e2c0: 6c 65 6d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  lem2 ){.        
e2d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e2e0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
e2f0: 20 20 20 6e 45 6c 65 6d 20 3d 20 30 3b 0a 20 20     nElem = 0;.  
e300: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
e310: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
e320: 20 20 20 20 20 20 20 61 45 6c 65 6d 20 3d 20 61         aElem = a
e330: 45 6c 65 6d 32 3b 0a 20 20 20 20 20 20 20 20 7d  Elem2;.        }
e340: 0a 0a 20 20 20 20 20 20 20 20 61 45 6c 65 6d 5b  ..        aElem[
e350: 6e 45 6c 65 6d 2b 2b 5d 20 3d 20 70 45 3b 0a 20  nElem++] = pE;. 
e360: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
e370: 20 20 2f 2a 20 49 66 20 6d 6f 72 65 20 74 68 61    /* If more tha
e380: 6e 20 6f 6e 65 20 74 65 72 6d 20 6d 61 74 63 68  n one term match
e390: 65 73 20 74 68 65 20 70 72 65 66 69 78 2c 20 73  es the prefix, s
e3a0: 6f 72 74 20 74 68 65 20 46 74 73 33 48 61 73 68  ort the Fts3Hash
e3b0: 45 6c 65 6d 0a 20 20 20 20 2a 2a 20 6f 62 6a 65  Elem.    ** obje
e3c0: 63 74 73 20 69 6e 20 74 65 72 6d 20 6f 72 64 65  cts in term orde
e3d0: 72 20 75 73 69 6e 67 20 71 73 6f 72 74 28 29 2e  r using qsort().
e3e0: 20 54 68 69 73 20 75 73 65 73 20 74 68 65 20 73   This uses the s
e3f0: 61 6d 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20  ame comparison. 
e400: 20 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 61     ** callback a
e410: 73 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 66  s is used when f
e420: 6c 75 73 68 69 6e 67 20 74 65 72 6d 73 20 74 6f  lushing terms to
e430: 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   disk..    */.  
e440: 20 20 69 66 28 20 6e 45 6c 65 6d 3e 31 20 29 7b    if( nElem>1 ){
e450: 0a 20 20 20 20 20 20 71 73 6f 72 74 28 61 45 6c  .      qsort(aEl
e460: 65 6d 2c 20 6e 45 6c 65 6d 2c 20 73 69 7a 65 6f  em, nElem, sizeo
e470: 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a  f(Fts3HashElem *
e480: 29 2c 20 66 74 73 33 43 6f 6d 70 61 72 65 45 6c  ), fts3CompareEl
e490: 65 6d 42 79 54 65 72 6d 29 3b 0a 20 20 20 20 7d  emByTerm);.    }
e4a0: 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ..  }else{.    /
e4b0: 2a 20 54 68 65 20 71 75 65 72 79 20 69 73 20 61  * The query is a
e4c0: 20 73 69 6d 70 6c 65 20 74 65 72 6d 20 6c 6f 6f   simple term loo
e4d0: 6b 75 70 20 74 68 61 74 20 6d 61 74 63 68 65 73  kup that matches
e4e0: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 74 65 72   at most one ter
e4f0: 6d 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  m in.    ** the 
e500: 69 6e 64 65 78 2e 20 41 6c 6c 20 74 68 61 74 20  index. All that 
e510: 69 73 20 72 65 71 75 69 72 65 64 20 69 73 20 61  is required is a
e520: 20 73 74 72 61 69 67 68 74 20 68 61 73 68 2d 6c   straight hash-l
e530: 6f 6f 6b 75 70 2e 20 0a 20 20 20 20 2a 2a 0a 20  ookup. .    **. 
e540: 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68     ** Because th
e550: 65 20 73 74 61 63 6b 20 61 64 64 72 65 73 73 20  e stack address 
e560: 6f 66 20 70 45 20 6d 61 79 20 62 65 20 61 63 63  of pE may be acc
e570: 65 73 73 65 64 20 76 69 61 20 74 68 65 20 61 45  essed via the aE
e580: 6c 65 6d 20 70 6f 69 6e 74 65 72 0a 20 20 20 20  lem pointer.    
e590: 2a 2a 20 62 65 6c 6f 77 2c 20 74 68 65 20 22 46  ** below, the "F
e5a0: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 70 45 22  ts3HashElem *pE"
e5b0: 20 6d 75 73 74 20 62 65 20 64 65 63 6c 61 72 65   must be declare
e5c0: 64 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20  d so that it is 
e5d0: 76 61 6c 69 64 0a 20 20 20 20 2a 2a 20 77 69 74  valid.    ** wit
e5e0: 68 69 6e 20 74 68 69 73 20 65 6e 74 69 72 65 20  hin this entire 
e5f0: 66 75 6e 63 74 69 6f 6e 2c 20 6e 6f 74 20 6a 75  function, not ju
e600: 73 74 20 74 68 69 73 20 22 65 6c 73 65 7b 2e 2e  st this "else{..
e610: 2e 7d 22 20 62 6c 6f 63 6b 2e 0a 20 20 20 20 2a  .}" block..    *
e620: 2f 0a 20 20 20 20 70 45 20 3d 20 66 74 73 33 48  /.    pE = fts3H
e630: 61 73 68 46 69 6e 64 45 6c 65 6d 28 70 48 61 73  ashFindElem(pHas
e640: 68 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29  h, zTerm, nTerm)
e650: 3b 0a 20 20 20 20 69 66 28 20 70 45 20 29 7b 0a  ;.    if( pE ){.
e660: 20 20 20 20 20 20 61 45 6c 65 6d 20 3d 20 26 70        aElem = &p
e670: 45 3b 0a 20 20 20 20 20 20 6e 45 6c 65 6d 20 3d  E;.      nElem =
e680: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
e690: 20 69 66 28 20 6e 45 6c 65 6d 3e 30 20 29 7b 0a   if( nElem>0 ){.
e6a0: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
e6b0: 73 69 7a 65 6f 66 28 46 74 73 33 53 65 67 52 65  sizeof(Fts3SegRe
e6c0: 61 64 65 72 29 20 2b 20 28 6e 45 6c 65 6d 2b 31  ader) + (nElem+1
e6d0: 29 2a 73 69 7a 65 6f 66 28 46 74 73 33 48 61 73  )*sizeof(Fts3Has
e6e0: 68 45 6c 65 6d 20 2a 29 3b 0a 20 20 20 20 70 52  hElem *);.    pR
e6f0: 65 61 64 65 72 20 3d 20 28 46 74 73 33 53 65 67  eader = (Fts3Seg
e700: 52 65 61 64 65 72 20 2a 29 73 71 6c 69 74 65 33  Reader *)sqlite3
e710: 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a  _malloc(nByte);.
e720: 20 20 20 20 69 66 28 20 21 70 52 65 61 64 65 72      if( !pReader
e730: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
e740: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
e750: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
e760: 6d 73 65 74 28 70 52 65 61 64 65 72 2c 20 30 2c  mset(pReader, 0,
e770: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70   nByte);.      p
e780: 52 65 61 64 65 72 2d 3e 69 49 64 78 20 3d 20 30  Reader->iIdx = 0
e790: 78 37 46 46 46 46 46 46 46 3b 0a 20 20 20 20 20  x7FFFFFFF;.     
e7a0: 20 70 52 65 61 64 65 72 2d 3e 70 70 4e 65 78 74   pReader->ppNext
e7b0: 45 6c 65 6d 20 3d 20 28 46 74 73 33 48 61 73 68  Elem = (Fts3Hash
e7c0: 45 6c 65 6d 20 2a 2a 29 26 70 52 65 61 64 65 72  Elem **)&pReader
e7d0: 5b 31 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  [1];.      memcp
e7e0: 79 28 70 52 65 61 64 65 72 2d 3e 70 70 4e 65 78  y(pReader->ppNex
e7f0: 74 45 6c 65 6d 2c 20 61 45 6c 65 6d 2c 20 6e 45  tElem, aElem, nE
e800: 6c 65 6d 2a 73 69 7a 65 6f 66 28 46 74 73 33 48  lem*sizeof(Fts3H
e810: 61 73 68 45 6c 65 6d 20 2a 29 29 3b 0a 20 20 20  ashElem *));.   
e820: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 50   }.  }..  if( bP
e830: 72 65 66 69 78 20 29 7b 0a 20 20 20 20 73 71 6c  refix ){.    sql
e840: 69 74 65 33 5f 66 72 65 65 28 61 45 6c 65 6d 29  ite3_free(aElem)
e850: 3b 0a 20 20 7d 0a 20 20 2a 70 70 52 65 61 64 65  ;.  }.  *ppReade
e860: 72 20 3d 20 70 52 65 61 64 65 72 3b 0a 20 20 72  r = pReader;.  r
e870: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
e880: 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 65  ** Compare the e
e890: 6e 74 72 69 65 73 20 70 6f 69 6e 74 65 64 20 74  ntries pointed t
e8a0: 6f 20 62 79 20 74 77 6f 20 46 74 73 33 53 65 67  o by two Fts3Seg
e8b0: 52 65 61 64 65 72 20 73 74 72 75 63 74 75 72 65  Reader structure
e8c0: 73 2e 20 0a 2a 2a 20 43 6f 6d 70 61 72 69 73 6f  s. .** Compariso
e8d0: 6e 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  n is as follows:
e8e0: 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 45 4f 46 20  .**.**   1) EOF 
e8f0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
e900: 6e 6f 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 20  not EOF..**.**  
e910: 20 32 29 20 54 68 65 20 63 75 72 72 65 6e 74 20   2) The current 
e920: 74 65 72 6d 73 20 28 69 66 20 61 6e 79 29 20 61  terms (if any) a
e930: 72 65 20 63 6f 6d 70 61 72 65 64 20 75 73 69 6e  re compared usin
e940: 67 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66 20 6f  g memcmp(). If o
e950: 6e 65 0a 2a 2a 20 20 20 20 20 20 74 65 72 6d 20  ne.**      term 
e960: 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 61  is a prefix of a
e970: 6e 6f 74 68 65 72 2c 20 74 68 65 20 6c 6f 6e 67  nother, the long
e980: 65 72 20 74 65 72 6d 20 69 73 20 63 6f 6e 73 69  er term is consi
e990: 64 65 72 65 64 20 74 68 65 0a 2a 2a 20 20 20 20  dered the.**    
e9a0: 20 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20    larger..**.** 
e9b0: 20 20 33 29 20 42 79 20 73 65 67 6d 65 6e 74 20    3) By segment 
e9c0: 61 67 65 2e 20 41 6e 20 6f 6c 64 65 72 20 73 65  age. An older se
e9d0: 67 6d 65 6e 74 20 69 73 20 63 6f 6e 73 69 64 65  gment is conside
e9e0: 72 65 64 20 6c 61 72 67 65 72 2e 0a 2a 2f 0a 73  red larger..*/.s
e9f0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65  tatic int fts3Se
ea00: 67 52 65 61 64 65 72 43 6d 70 28 46 74 73 33 53  gReaderCmp(Fts3S
ea10: 65 67 52 65 61 64 65 72 20 2a 70 4c 68 73 2c 20  egReader *pLhs, 
ea20: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
ea30: 52 68 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Rhs){.  int rc;.
ea40: 20 20 69 66 28 20 70 4c 68 73 2d 3e 61 4e 6f 64    if( pLhs->aNod
ea50: 65 20 26 26 20 70 52 68 73 2d 3e 61 4e 6f 64 65  e && pRhs->aNode
ea60: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20   ){.    int rc2 
ea70: 3d 20 70 4c 68 73 2d 3e 6e 54 65 72 6d 20 2d 20  = pLhs->nTerm - 
ea80: 70 52 68 73 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20  pRhs->nTerm;.   
ea90: 20 69 66 28 20 72 63 32 3c 30 20 29 7b 0a 20 20   if( rc2<0 ){.  
eaa0: 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28      rc = memcmp(
eab0: 70 4c 68 73 2d 3e 7a 54 65 72 6d 2c 20 70 52 68  pLhs->zTerm, pRh
eac0: 73 2d 3e 7a 54 65 72 6d 2c 20 70 4c 68 73 2d 3e  s->zTerm, pLhs->
ead0: 6e 54 65 72 6d 29 3b 0a 20 20 20 20 7d 65 6c 73  nTerm);.    }els
eae0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 65  e{.      rc = me
eaf0: 6d 63 6d 70 28 70 4c 68 73 2d 3e 7a 54 65 72 6d  mcmp(pLhs->zTerm
eb00: 2c 20 70 52 68 73 2d 3e 7a 54 65 72 6d 2c 20 70  , pRhs->zTerm, p
eb10: 52 68 73 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20  Rhs->nTerm);.   
eb20: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 30   }.    if( rc==0
eb30: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
eb40: 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  c2;.    }.  }els
eb50: 65 7b 0a 20 20 20 20 72 63 20 3d 20 28 70 4c 68  e{.    rc = (pLh
eb60: 73 2d 3e 61 4e 6f 64 65 3d 3d 30 29 20 2d 20 28  s->aNode==0) - (
eb70: 70 52 68 73 2d 3e 61 4e 6f 64 65 3d 3d 30 29 3b  pRhs->aNode==0);
eb80: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30  .  }.  if( rc==0
eb90: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 52 68   ){.    rc = pRh
eba0: 73 2d 3e 69 49 64 78 20 2d 20 70 4c 68 73 2d 3e  s->iIdx - pLhs->
ebb0: 69 49 64 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65  iIdx;.  }.  asse
ebc0: 72 74 28 20 72 63 21 3d 30 20 29 3b 0a 20 20 72  rt( rc!=0 );.  r
ebd0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
ebe0: 2a 2a 20 41 20 64 69 66 66 65 72 65 6e 74 20 63  ** A different c
ebf0: 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
ec00: 6f 6e 20 66 6f 72 20 53 65 67 52 65 61 64 65 72  on for SegReader
ec10: 20 73 74 72 75 63 74 75 72 65 73 2e 20 49 6e 20   structures. In 
ec20: 74 68 69 73 0a 2a 2a 20 76 65 72 73 69 6f 6e 2c  this.** version,
ec30: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
ec40: 68 61 74 20 65 61 63 68 20 53 65 67 52 65 61 64  hat each SegRead
ec50: 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  er points to an 
ec60: 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 61 20 64 6f  entry in.** a do
ec70: 63 6c 69 73 74 20 66 6f 72 20 69 64 65 6e 74 69  clist for identi
ec80: 63 61 6c 20 74 65 72 6d 73 2e 20 43 6f 6d 70 61  cal terms. Compa
ec90: 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 73  rison is made as
eca0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
ecb0: 20 20 31 29 20 45 4f 46 20 28 65 6e 64 20 6f 66    1) EOF (end of
ecc0: 20 64 6f 63 6c 69 73 74 20 69 6e 20 74 68 69 73   doclist in this
ecd0: 20 63 61 73 65 29 20 69 73 20 67 72 65 61 74 65   case) is greate
ece0: 72 20 74 68 61 6e 20 6e 6f 74 20 45 4f 46 2e 0a  r than not EOF..
ecf0: 2a 2a 0a 2a 2a 20 20 20 32 29 20 42 79 20 63 75  **.**   2) By cu
ed00: 72 72 65 6e 74 20 64 6f 63 69 64 2e 0a 2a 2a 0a  rrent docid..**.
ed10: 2a 2a 20 20 20 33 29 20 42 79 20 73 65 67 6d 65  **   3) By segme
ed20: 6e 74 20 61 67 65 2e 20 41 6e 20 6f 6c 64 65 72  nt age. An older
ed30: 20 73 65 67 6d 65 6e 74 20 69 73 20 63 6f 6e 73   segment is cons
ed40: 69 64 65 72 65 64 20 6c 61 72 67 65 72 2e 0a 2a  idered larger..*
ed50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
ed60: 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73  3SegReaderDoclis
ed70: 74 43 6d 70 28 46 74 73 33 53 65 67 52 65 61 64  tCmp(Fts3SegRead
ed80: 65 72 20 2a 70 4c 68 73 2c 20 46 74 73 33 53 65  er *pLhs, Fts3Se
ed90: 67 52 65 61 64 65 72 20 2a 70 52 68 73 29 7b 0a  gReader *pRhs){.
eda0: 20 20 69 6e 74 20 72 63 20 3d 20 28 70 4c 68 73    int rc = (pLhs
edb0: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30  ->pOffsetList==0
edc0: 29 2d 28 70 52 68 73 2d 3e 70 4f 66 66 73 65 74  )-(pRhs->pOffset
edd0: 4c 69 73 74 3d 3d 30 29 3b 0a 20 20 69 66 28 20  List==0);.  if( 
ede0: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  rc==0 ){.    if(
edf0: 20 70 4c 68 73 2d 3e 69 44 6f 63 69 64 3d 3d 70   pLhs->iDocid==p
ee00: 52 68 73 2d 3e 69 44 6f 63 69 64 20 29 7b 0a 20  Rhs->iDocid ){. 
ee10: 20 20 20 20 20 72 63 20 3d 20 70 52 68 73 2d 3e       rc = pRhs->
ee20: 69 49 64 78 20 2d 20 70 4c 68 73 2d 3e 69 49 64  iIdx - pLhs->iId
ee30: 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  x;.    }else{.  
ee40: 20 20 20 20 72 63 20 3d 20 28 70 4c 68 73 2d 3e      rc = (pLhs->
ee50: 69 44 6f 63 69 64 20 3e 20 70 52 68 73 2d 3e 69  iDocid > pRhs->i
ee60: 44 6f 63 69 64 29 20 3f 20 31 20 3a 20 2d 31 3b  Docid) ? 1 : -1;
ee70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
ee80: 65 72 74 28 20 70 4c 68 73 2d 3e 61 4e 6f 64 65  ert( pLhs->aNode
ee90: 20 26 26 20 70 52 68 73 2d 3e 61 4e 6f 64 65 20   && pRhs->aNode 
eea0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
eeb0: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  }.static int fts
eec0: 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73  3SegReaderDoclis
eed0: 74 43 6d 70 52 65 76 28 46 74 73 33 53 65 67 52  tCmpRev(Fts3SegR
eee0: 65 61 64 65 72 20 2a 70 4c 68 73 2c 20 46 74 73  eader *pLhs, Fts
eef0: 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 68 73  3SegReader *pRhs
ef00: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 28 70  ){.  int rc = (p
ef10: 4c 68 73 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74  Lhs->pOffsetList
ef20: 3d 3d 30 29 2d 28 70 52 68 73 2d 3e 70 4f 66 66  ==0)-(pRhs->pOff
ef30: 73 65 74 4c 69 73 74 3d 3d 30 29 3b 0a 20 20 69  setList==0);.  i
ef40: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
ef50: 69 66 28 20 70 4c 68 73 2d 3e 69 44 6f 63 69 64  if( pLhs->iDocid
ef60: 3d 3d 70 52 68 73 2d 3e 69 44 6f 63 69 64 20 29  ==pRhs->iDocid )
ef70: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 52 68  {.      rc = pRh
ef80: 73 2d 3e 69 49 64 78 20 2d 20 70 4c 68 73 2d 3e  s->iIdx - pLhs->
ef90: 69 49 64 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  iIdx;.    }else{
efa0: 0a 20 20 20 20 20 20 72 63 20 3d 20 28 70 4c 68  .      rc = (pLh
efb0: 73 2d 3e 69 44 6f 63 69 64 20 3c 20 70 52 68 73  s->iDocid < pRhs
efc0: 2d 3e 69 44 6f 63 69 64 29 20 3f 20 31 20 3a 20  ->iDocid) ? 1 : 
efd0: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  -1;.    }.  }.  
efe0: 61 73 73 65 72 74 28 20 70 4c 68 73 2d 3e 61 4e  assert( pLhs->aN
eff0: 6f 64 65 20 26 26 20 70 52 68 73 2d 3e 61 4e 6f  ode && pRhs->aNo
f000: 64 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  de );.  return r
f010: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  c;.}../*.** Comp
f020: 61 72 65 20 74 68 65 20 74 65 72 6d 20 74 68 61  are the term tha
f030: 74 20 74 68 65 20 46 74 73 33 53 65 67 52 65 61  t the Fts3SegRea
f040: 64 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  der object passe
f050: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
f060: 72 67 75 6d 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74  rgument.** point
f070: 73 20 74 6f 20 77 69 74 68 20 74 68 65 20 74 65  s to with the te
f080: 72 6d 20 73 70 65 63 69 66 69 65 64 20 62 79 20  rm specified by 
f090: 61 72 67 75 6d 65 6e 74 73 20 7a 54 65 72 6d 20  arguments zTerm 
f0a0: 61 6e 64 20 6e 54 65 72 6d 2e 20 0a 2a 2a 0a 2a  and nTerm. .**.*
f0b0: 2a 20 49 66 20 74 68 65 20 70 53 65 67 20 69 74  * If the pSeg it
f0c0: 65 72 61 74 6f 72 20 69 73 20 61 6c 72 65 61 64  erator is alread
f0d0: 79 20 61 74 20 45 4f 46 2c 20 72 65 74 75 72 6e  y at EOF, return
f0e0: 20 30 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72   0. Otherwise, r
f0f0: 65 74 75 72 6e 0a 2a 2a 20 2d 76 65 20 69 66 20  eturn.** -ve if 
f100: 74 68 65 20 70 53 65 67 20 74 65 72 6d 20 69 73  the pSeg term is
f110: 20 6c 65 73 73 20 74 68 61 6e 20 7a 54 65 72 6d   less than zTerm
f120: 2f 6e 54 65 72 6d 2c 20 30 20 69 66 20 74 68 65  /nTerm, 0 if the
f130: 20 74 77 6f 20 74 65 72 6d 73 20 61 72 65 0a 2a   two terms are.*
f140: 2a 20 65 71 75 61 6c 2c 20 6f 72 20 2b 76 65 20  * equal, or +ve 
f150: 69 66 20 74 68 65 20 70 53 65 67 20 74 65 72 6d  if the pSeg term
f160: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
f170: 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 0a 2a 2f   zTerm/nTerm..*/
f180: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
f190: 53 65 67 52 65 61 64 65 72 54 65 72 6d 43 6d 70  SegReaderTermCmp
f1a0: 28 0a 20 20 46 74 73 33 53 65 67 52 65 61 64 65  (.  Fts3SegReade
f1b0: 72 20 2a 70 53 65 67 2c 20 20 20 20 20 20 20 20  r *pSeg,        
f1c0: 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 72      /* Segment r
f1d0: 65 61 64 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  eader object */.
f1e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
f1f0: 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
f200: 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 63 6f 6d    /* Term to com
f210: 70 61 72 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  pare to */.  int
f220: 20 6e 54 65 72 6d 20 20 20 20 20 20 20 20 20 20   nTerm          
f230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f240: 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 7a 54 65  Size of term zTe
f250: 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29  rm in bytes */.)
f260: 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b  {.  int res = 0;
f270: 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 61 4e 6f  .  if( pSeg->aNo
f280: 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  de ){.    if( pS
f290: 65 67 2d 3e 6e 54 65 72 6d 3e 6e 54 65 72 6d 20  eg->nTerm>nTerm 
f2a0: 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6d  ){.      res = m
f2b0: 65 6d 63 6d 70 28 70 53 65 67 2d 3e 7a 54 65 72  emcmp(pSeg->zTer
f2c0: 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29  m, zTerm, nTerm)
f2d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f2e0: 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28     res = memcmp(
f2f0: 70 53 65 67 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65  pSeg->zTerm, zTe
f300: 72 6d 2c 20 70 53 65 67 2d 3e 6e 54 65 72 6d 29  rm, pSeg->nTerm)
f310: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f320: 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
f330: 72 65 73 20 3d 20 70 53 65 67 2d 3e 6e 54 65 72  res = pSeg->nTer
f340: 6d 2d 6e 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20  m-nTerm;.    }. 
f350: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b   }.  return res;
f360: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
f370: 6e 74 20 61 70 53 65 67 6d 65 6e 74 20 69 73 20  nt apSegment is 
f380: 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 53 65 67  an array of nSeg
f390: 6d 65 6e 74 20 65 6c 65 6d 65 6e 74 73 2e 20 49  ment elements. I
f3a0: 74 20 69 73 20 6b 6e 6f 77 6e 20 74 68 61 74 0a  t is known that.
f3b0: 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 28 6e 53  ** the final (nS
f3c0: 65 67 6d 65 6e 74 2d 6e 53 75 73 70 65 63 74 29  egment-nSuspect)
f3d0: 20 6d 65 6d 62 65 72 73 20 61 72 65 20 61 6c 72   members are alr
f3e0: 65 61 64 79 20 69 6e 20 73 6f 72 74 65 64 20 6f  eady in sorted o
f3f0: 72 64 65 72 0a 2a 2a 20 28 61 63 63 6f 72 64 69  rder.** (accordi
f400: 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 70 61 72  ng to the compar
f410: 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 72  ison function pr
f420: 6f 76 69 64 65 64 29 2e 20 54 68 69 73 20 66 75  ovided). This fu
f430: 6e 63 74 69 6f 6e 20 73 68 75 66 66 6c 65 73 0a  nction shuffles.
f440: 2a 2a 20 74 68 65 20 61 72 72 61 79 20 61 72 6f  ** the array aro
f450: 75 6e 64 20 75 6e 74 69 6c 20 61 6c 6c 20 65 6e  und until all en
f460: 74 72 69 65 73 20 61 72 65 20 69 6e 20 73 6f 72  tries are in sor
f470: 74 65 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ted order..*/.st
f480: 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 53 65  atic void fts3Se
f490: 67 52 65 61 64 65 72 53 6f 72 74 28 0a 20 20 46  gReaderSort(.  F
f4a0: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a 61  ts3SegReader **a
f4b0: 70 53 65 67 6d 65 6e 74 2c 20 20 20 20 20 20 20  pSegment,       
f4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f4d0: 20 41 72 72 61 79 20 74 6f 20 73 6f 72 74 20 65   Array to sort e
f4e0: 6e 74 72 69 65 73 20 6f 66 20 2a 2f 0a 20 20 69  ntries of */.  i
f4f0: 6e 74 20 6e 53 65 67 6d 65 6e 74 2c 20 20 20 20  nt nSegment,    
f500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f520: 20 53 69 7a 65 20 6f 66 20 61 70 53 65 67 6d 65   Size of apSegme
f530: 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  nt array */.  in
f540: 74 20 6e 53 75 73 70 65 63 74 2c 20 20 20 20 20  t nSuspect,     
f550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f570: 55 6e 73 6f 72 74 65 64 20 65 6e 74 72 79 20 63  Unsorted entry c
f580: 6f 75 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  ount */.  int (*
f590: 78 43 6d 70 29 28 46 74 73 33 53 65 67 52 65 61  xCmp)(Fts3SegRea
f5a0: 64 65 72 20 2a 2c 20 46 74 73 33 53 65 67 52 65  der *, Fts3SegRe
f5b0: 61 64 65 72 20 2a 29 20 20 2f 2a 20 43 6f 6d 70  ader *)  /* Comp
f5c0: 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
f5d0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
f600: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
f610: 0a 20 20 61 73 73 65 72 74 28 20 6e 53 75 73 70  .  assert( nSusp
f620: 65 63 74 3c 3d 6e 53 65 67 6d 65 6e 74 20 29 3b  ect<=nSegment );
f630: 0a 0a 20 20 69 66 28 20 6e 53 75 73 70 65 63 74  ..  if( nSuspect
f640: 3d 3d 6e 53 65 67 6d 65 6e 74 20 29 20 6e 53 75  ==nSegment ) nSu
f650: 73 70 65 63 74 2d 2d 3b 0a 20 20 66 6f 72 28 69  spect--;.  for(i
f660: 3d 6e 53 75 73 70 65 63 74 2d 31 3b 20 69 3e 3d  =nSuspect-1; i>=
f670: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
f680: 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b   j;.    for(j=i;
f690: 20 6a 3c 28 6e 53 65 67 6d 65 6e 74 2d 31 29 3b   j<(nSegment-1);
f6a0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73   j++){.      Fts
f6b0: 33 53 65 67 52 65 61 64 65 72 20 2a 70 54 6d 70  3SegReader *pTmp
f6c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 78 43 6d 70  ;.      if( xCmp
f6d0: 28 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2c 20 61  (apSegment[j], a
f6e0: 70 53 65 67 6d 65 6e 74 5b 6a 2b 31 5d 29 3c 30  pSegment[j+1])<0
f6f0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
f700: 70 54 6d 70 20 3d 20 61 70 53 65 67 6d 65 6e 74  pTmp = apSegment
f710: 5b 6a 2b 31 5d 3b 0a 20 20 20 20 20 20 61 70 53  [j+1];.      apS
f720: 65 67 6d 65 6e 74 5b 6a 2b 31 5d 20 3d 20 61 70  egment[j+1] = ap
f730: 53 65 67 6d 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20  Segment[j];.    
f740: 20 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 20 3d    apSegment[j] =
f750: 20 70 54 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 7d   pTmp;.    }.  }
f760: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
f770: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
f780: 20 74 68 65 20 6c 69 73 74 20 72 65 61 6c 6c 79   the list really
f790: 20 69 73 20 73 6f 72 74 65 64 20 6e 6f 77 2e 20   is sorted now. 
f7a0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
f7b0: 28 6e 53 75 73 70 65 63 74 2d 31 29 3b 20 69 2b  (nSuspect-1); i+
f7c0: 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
f7d0: 78 43 6d 70 28 61 70 53 65 67 6d 65 6e 74 5b 69  xCmp(apSegment[i
f7e0: 5d 2c 20 61 70 53 65 67 6d 65 6e 74 5b 69 2b 31  ], apSegment[i+1
f7f0: 5d 29 3c 30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ])<0 );.  }.#end
f800: 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 49 6e 73  if.}../* .** Ins
f810: 65 72 74 20 61 20 72 65 63 6f 72 64 20 69 6e 74  ert a record int
f820: 6f 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73  o the %_segments
f830: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
f840: 63 20 69 6e 74 20 66 74 73 33 57 72 69 74 65 53  c int fts3WriteS
f850: 65 67 6d 65 6e 74 28 0a 20 20 46 74 73 33 54 61  egment(.  Fts3Ta
f860: 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
f870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
f880: 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
f890: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
f8a0: 6e 74 36 34 20 69 42 6c 6f 63 6b 2c 20 20 20 20  nt64 iBlock,    
f8b0: 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20         /* Block 
f8c0: 69 64 20 66 6f 72 20 6e 65 77 20 62 6c 6f 63 6b  id for new block
f8d0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 2c 20 20   */.  char *z,  
f8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8f0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
f900: 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
f910: 69 6e 69 6e 67 20 62 6c 6f 63 6b 20 64 61 74 61  ining block data
f920: 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20 20 20   */.  int n     
f930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f940: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
f950: 20 62 75 66 66 65 72 20 7a 20 69 6e 20 62 79 74   buffer z in byt
f960: 65 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  es */.){.  sqlit
f970: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
f980: 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73 33 53    int rc = fts3S
f990: 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 49 4e  qlStmt(p, SQL_IN
f9a0: 53 45 52 54 5f 53 45 47 4d 45 4e 54 53 2c 20 26  SERT_SEGMENTS, &
f9b0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
f9c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f9d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  {.    sqlite3_bi
f9e0: 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  nd_int64(pStmt, 
f9f0: 31 2c 20 69 42 6c 6f 63 6b 29 3b 0a 20 20 20 20  1, iBlock);.    
fa00: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
fa10: 62 28 70 53 74 6d 74 2c 20 32 2c 20 7a 2c 20 6e  b(pStmt, 2, z, n
fa20: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
fa30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
fa40: 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 72  ep(pStmt);.    r
fa50: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
fa60: 74 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20  t(pStmt);.  }.  
fa70: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
fa80: 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 6c 61 72  .** Find the lar
fa90: 67 65 73 74 20 72 65 6c 61 74 69 76 65 20 6c 65  gest relative le
faa0: 76 65 6c 20 6e 75 6d 62 65 72 20 69 6e 20 74 68  vel number in th
fab0: 65 20 74 61 62 6c 65 2e 20 49 66 20 73 75 63 63  e table. If succ
fac0: 65 73 73 66 75 6c 2c 20 73 65 74 0a 2a 2a 20 2a  essful, set.** *
fad0: 70 6e 4d 61 78 20 74 6f 20 74 68 69 73 20 76 61  pnMax to this va
fae0: 6c 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53  lue and return S
faf0: 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77  QLITE_OK. Otherw
fb00: 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  ise, if an error
fb10: 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 65 74 20   occurs,.** set 
fb20: 2a 70 6e 4d 61 78 20 74 6f 20 7a 65 72 6f 20 61  *pnMax to zero a
fb30: 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  nd return an SQL
fb40: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
fb50: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
fb60: 73 33 4d 61 78 4c 65 76 65 6c 28 46 74 73 33 54  s3MaxLevel(Fts3T
fb70: 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  able *p, int *pn
fb80: 4d 61 78 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Max){.  int rc;.
fb90: 20 20 69 6e 74 20 6d 78 4c 65 76 65 6c 20 3d 20    int mxLevel = 
fba0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
fbb0: 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 0a 20  t *pStmt = 0;.. 
fbc0: 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
fbd0: 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f  t(p, SQL_SELECT_
fbe0: 4d 58 4c 45 56 45 4c 2c 20 26 70 53 74 6d 74 2c  MXLEVEL, &pStmt,
fbf0: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
fc00: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fc10: 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
fc20: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
fc30: 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 6d 78 4c  mt) ){.      mxL
fc40: 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  evel = sqlite3_c
fc50: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
fc60: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   0);.    }.    r
fc70: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
fc80: 74 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20  t(pStmt);.  }.  
fc90: 2a 70 6e 4d 61 78 20 3d 20 6d 78 4c 65 76 65 6c  *pnMax = mxLevel
fca0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
fcb0: 0a 0a 2f 2a 20 0a 2a 2a 20 49 6e 73 65 72 74 20  ../* .** Insert 
fcc0: 61 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  a record into th
fcd0: 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65  e %_segdir table
fce0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
fcf0: 66 74 73 33 57 72 69 74 65 53 65 67 64 69 72 28  fts3WriteSegdir(
fd00: 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
fd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd20: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
fd30: 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
fd40: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c  sqlite3_int64 iL
fd50: 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  evel,           
fd60: 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 6c 65  /* Value for "le
fd70: 76 65 6c 22 20 66 69 65 6c 64 20 28 61 62 73 6f  vel" field (abso
fd80: 6c 75 74 65 20 6c 65 76 65 6c 29 20 2a 2f 0a 20  lute level) */. 
fd90: 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20   int iIdx,      
fda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdb0: 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 69   /* Value for "i
fdc0: 64 78 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 73  dx" field */.  s
fdd0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 53 74  qlite3_int64 iSt
fde0: 61 72 74 42 6c 6f 63 6b 2c 20 20 20 20 20 20 2f  artBlock,      /
fdf0: 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 73 74 61  * Value for "sta
fe00: 72 74 5f 62 6c 6f 63 6b 22 20 66 69 65 6c 64 20  rt_block" field 
fe10: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
fe20: 36 34 20 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b  64 iLeafEndBlock
fe30: 2c 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f  ,    /* Value fo
fe40: 72 20 22 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c  r "leaves_end_bl
fe50: 6f 63 6b 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20  ock" field */.  
fe60: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45  sqlite3_int64 iE
fe70: 6e 64 42 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ndBlock,        
fe80: 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 65 6e  /* Value for "en
fe90: 64 5f 62 6c 6f 63 6b 22 20 66 69 65 6c 64 20 2a  d_block" field *
fea0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
feb0: 34 20 6e 4c 65 61 66 44 61 74 61 2c 20 20 20 20  4 nLeafData,    
fec0: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
fed0: 6c 65 61 66 20 64 61 74 61 20 69 6e 20 73 65 67  leaf data in seg
fee0: 6d 65 6e 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ment */.  char *
fef0: 7a 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20  zRoot,          
ff00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f            /* Blo
ff10: 62 20 76 61 6c 75 65 20 66 6f 72 20 22 72 6f 6f  b value for "roo
ff20: 74 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e  t" field */.  in
ff30: 74 20 6e 52 6f 6f 74 20 20 20 20 20 20 20 20 20  t nRoot         
ff40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ff50: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
ff60: 20 69 6e 20 62 75 66 66 65 72 20 7a 52 6f 6f 74   in buffer zRoot
ff70: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
ff80: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
ff90: 69 6e 74 20 72 63 20 3d 20 66 74 73 33 53 71 6c  int rc = fts3Sql
ffa0: 53 74 6d 74 28 70 2c 20 53 51 4c 5f 49 4e 53 45  Stmt(p, SQL_INSE
ffb0: 52 54 5f 53 45 47 44 49 52 2c 20 26 70 53 74 6d  RT_SEGDIR, &pStm
ffc0: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  t, 0);.  if( rc=
ffd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ffe0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
fff0: 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 69  nt64(pStmt, 1, i
10000 4c 65 76 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69  Level);.    sqli
10010 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74  te3_bind_int(pSt
10020 6d 74 2c 20 32 2c 20 69 49 64 78 29 3b 0a 20 20  mt, 2, iIdx);.  
10030 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
10040 6e 74 36 34 28 70 53 74 6d 74 2c 20 33 2c 20 69  nt64(pStmt, 3, i
10050 53 74 61 72 74 42 6c 6f 63 6b 29 3b 0a 20 20 20  StartBlock);.   
10060 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
10070 74 36 34 28 70 53 74 6d 74 2c 20 34 2c 20 69 4c  t64(pStmt, 4, iL
10080 65 61 66 45 6e 64 42 6c 6f 63 6b 29 3b 0a 20 20  eafEndBlock);.  
10090 20 20 69 66 28 20 6e 4c 65 61 66 44 61 74 61 3d    if( nLeafData=
100a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
100b0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
100c0 53 74 6d 74 2c 20 35 2c 20 69 45 6e 64 42 6c 6f  Stmt, 5, iEndBlo
100d0 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ck);.    }else{.
100e0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 6e 64        char *zEnd
100f0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
10100 74 66 28 22 25 6c 6c 64 20 25 6c 6c 64 22 2c 20  tf("%lld %lld", 
10110 69 45 6e 64 42 6c 6f 63 6b 2c 20 6e 4c 65 61 66  iEndBlock, nLeaf
10120 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28  Data);.      if(
10130 20 21 7a 45 6e 64 20 29 20 72 65 74 75 72 6e 20   !zEnd ) return 
10140 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
10150 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
10160 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 35 2c 20  _text(pStmt, 5, 
10170 7a 45 6e 64 2c 20 2d 31 2c 20 73 71 6c 69 74 65  zEnd, -1, sqlite
10180 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20  3_free);.    }. 
10190 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
101a0 62 6c 6f 62 28 70 53 74 6d 74 2c 20 36 2c 20 7a  blob(pStmt, 6, z
101b0 52 6f 6f 74 2c 20 6e 52 6f 6f 74 2c 20 53 51 4c  Root, nRoot, SQL
101c0 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
101d0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
101e0 74 6d 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  tmt);.    rc = s
101f0 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
10200 6d 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  mt);.  }.  retur
10210 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
10220 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
10230 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65  f the common pre
10240 66 69 78 20 28 69 66 20 61 6e 79 29 20 73 68 61  fix (if any) sha
10250 72 65 64 20 62 79 20 7a 50 72 65 76 20 61 6e 64  red by zPrev and
10260 0a 2a 2a 20 7a 4e 65 78 74 2c 20 69 6e 20 62 79  .** zNext, in by
10270 74 65 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  tes. For example
10280 2c 20 0a 2a 2a 0a 2a 2a 20 20 20 66 74 73 33 50  , .**.**   fts3P
10290 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 22 61  refixCompress("a
102a0 62 63 22 2c 20 33 2c 20 22 61 62 63 64 65 66 22  bc", 3, "abcdef"
102b0 2c 20 36 29 20 20 20 2f 2f 20 72 65 74 75 72 6e  , 6)   // return
102c0 73 20 33 0a 2a 2a 20 20 20 66 74 73 33 50 72 65  s 3.**   fts3Pre
102d0 66 69 78 43 6f 6d 70 72 65 73 73 28 22 61 62 58  fixCompress("abX
102e0 22 2c 20 33 2c 20 22 61 62 63 64 65 66 22 2c 20  ", 3, "abcdef", 
102f0 36 29 20 20 20 2f 2f 20 72 65 74 75 72 6e 73 20  6)   // returns 
10300 32 0a 2a 2a 20 20 20 66 74 73 33 50 72 65 66 69  2.**   fts3Prefi
10310 78 43 6f 6d 70 72 65 73 73 28 22 61 62 58 22 2c  xCompress("abX",
10320 20 33 2c 20 22 58 62 63 64 65 66 22 2c 20 36 29   3, "Xbcdef", 6)
10330 20 20 20 2f 2f 20 72 65 74 75 72 6e 73 20 30 0a     // returns 0.
10340 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
10350 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73  s3PrefixCompress
10360 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
10370 7a 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20  zPrev,          
10380 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
10390 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f 75  ntaining previou
103a0 73 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  s term */.  int 
103b0 6e 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20  nPrev,          
103c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
103d0 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 7a 50  ize of buffer zP
103e0 72 65 76 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  rev in bytes */.
103f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
10400 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ext,            
10410 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
10420 61 69 6e 69 6e 67 20 6e 65 78 74 20 74 65 72 6d  aining next term
10430 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 78 74 20   */.  int nNext 
10440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10450 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
10460 20 62 75 66 66 65 72 20 7a 4e 65 78 74 20 69 6e   buffer zNext in
10470 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69   bytes */.){.  i
10480 6e 74 20 6e 3b 0a 20 20 55 4e 55 53 45 44 5f 50  nt n;.  UNUSED_P
10490 41 52 41 4d 45 54 45 52 28 6e 4e 65 78 74 29 3b  ARAMETER(nNext);
104a0 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 50  .  for(n=0; n<nP
104b0 72 65 76 20 26 26 20 7a 50 72 65 76 5b 6e 5d 3d  rev && zPrev[n]=
104c0 3d 7a 4e 65 78 74 5b 6e 5d 3b 20 6e 2b 2b 29 3b  =zNext[n]; n++);
104d0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
104e0 2f 2a 0a 2a 2a 20 41 64 64 20 74 65 72 6d 20 7a  /*.** Add term z
104f0 54 65 72 6d 20 74 6f 20 74 68 65 20 53 65 67 6d  Term to the Segm
10500 65 6e 74 4e 6f 64 65 2e 20 49 74 20 69 73 20 67  entNode. It is g
10510 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 7a  uaranteed that z
10520 54 65 72 6d 20 69 73 20 6c 61 72 67 65 72 0a 2a  Term is larger.*
10530 2a 20 28 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  * (according to 
10540 6d 65 6d 63 6d 70 29 20 74 68 61 6e 20 74 68 65  memcmp) than the
10550 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 2e 0a   previous term..
10560 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
10570 73 33 4e 6f 64 65 41 64 64 54 65 72 6d 28 0a 20  s3NodeAddTerm(. 
10580 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
10590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105a0 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
105b0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 65  e handle */.  Se
105c0 67 6d 65 6e 74 4e 6f 64 65 20 2a 2a 70 70 54 72  gmentNode **ppTr
105d0 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ee,           /*
105e0 20 49 4e 2f 4f 55 54 3a 20 53 65 67 6d 65 6e 74   IN/OUT: Segment
105f0 4e 6f 64 65 20 68 61 6e 64 6c 65 20 2a 2f 20 0a  Node handle */ .
10600 20 20 69 6e 74 20 69 73 43 6f 70 79 54 65 72 6d    int isCopyTerm
10610 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10620 20 20 2f 2a 20 54 72 75 65 20 69 66 20 7a 54 65    /* True if zTe
10630 72 6d 2f 6e 54 65 72 6d 20 69 73 20 74 72 61 6e  rm/nTerm is tran
10640 73 69 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  sient */.  const
10650 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20   char *zTerm,   
10660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
10670 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
10680 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d 20  containing term 
10690 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 20 20  */.  int nTerm  
106a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106b0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
106c0 74 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f  term in bytes */
106d0 0a 29 7b 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64  .){.  SegmentNod
106e0 65 20 2a 70 54 72 65 65 20 3d 20 2a 70 70 54 72  e *pTree = *ppTr
106f0 65 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ee;.  int rc;.  
10700 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 4e 65  SegmentNode *pNe
10710 77 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 74  w;..  /* First t
10720 72 79 20 74 6f 20 61 70 70 65 6e 64 20 74 68 65  ry to append the
10730 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63 75 72   term to the cur
10740 72 65 6e 74 20 6e 6f 64 65 2e 20 52 65 74 75 72  rent node. Retur
10750 6e 20 65 61 72 6c 79 20 69 66 20 0a 20 20 2a 2a  n early if .  **
10760 20 74 68 69 73 20 69 73 20 70 6f 73 73 69 62 6c   this is possibl
10770 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  e..  */.  if( pT
10780 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ree ){.    int n
10790 44 61 74 61 20 3d 20 70 54 72 65 65 2d 3e 6e 44  Data = pTree->nD
107a0 61 74 61 3b 20 20 20 20 20 2f 2a 20 43 75 72 72  ata;     /* Curr
107b0 65 6e 74 20 73 69 7a 65 20 6f 66 20 6e 6f 64 65  ent size of node
107c0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
107d0 20 69 6e 74 20 6e 52 65 71 20 3d 20 6e 44 61 74   int nReq = nDat
107e0 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a;             /
107f0 2a 20 52 65 71 75 69 72 65 64 20 73 70 61 63 65  * Required space
10800 20 61 66 74 65 72 20 61 64 64 69 6e 67 20 7a 54   after adding zT
10810 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  erm */.    int n
10820 50 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20  Prefix;         
10830 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10840 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70  er of bytes of p
10850 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f  refix compressio
10860 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 75  n */.    int nSu
10870 66 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20  ffix;           
10880 20 20 20 20 20 20 20 2f 2a 20 53 75 66 66 69 78         /* Suffix
10890 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a 20 20 20 20   length */..    
108a0 6e 50 72 65 66 69 78 20 3d 20 66 74 73 33 50 72  nPrefix = fts3Pr
108b0 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70 54 72  efixCompress(pTr
108c0 65 65 2d 3e 7a 54 65 72 6d 2c 20 70 54 72 65 65  ee->zTerm, pTree
108d0 2d 3e 6e 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20  ->nTerm, zTerm, 
108e0 6e 54 65 72 6d 29 3b 0a 20 20 20 20 6e 53 75 66  nTerm);.    nSuf
108f0 66 69 78 20 3d 20 6e 54 65 72 6d 2d 6e 50 72 65  fix = nTerm-nPre
10900 66 69 78 3b 0a 0a 20 20 20 20 6e 52 65 71 20 2b  fix;..    nReq +
10910 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72  = sqlite3Fts3Var
10920 69 6e 74 4c 65 6e 28 6e 50 72 65 66 69 78 29 2b  intLen(nPrefix)+
10930 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e  sqlite3Fts3Varin
10940 74 4c 65 6e 28 6e 53 75 66 66 69 78 29 2b 6e 53  tLen(nSuffix)+nS
10950 75 66 66 69 78 3b 0a 20 20 20 20 69 66 28 20 6e  uffix;.    if( n
10960 52 65 71 3c 3d 70 2d 3e 6e 4e 6f 64 65 53 69 7a  Req<=p->nNodeSiz
10970 65 20 7c 7c 20 21 70 54 72 65 65 2d 3e 7a 54 65  e || !pTree->zTe
10980 72 6d 20 29 7b 0a 0a 20 20 20 20 20 20 69 66 28  rm ){..      if(
10990 20 6e 52 65 71 3e 70 2d 3e 6e 4e 6f 64 65 53 69   nReq>p->nNodeSi
109a0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ze ){.        /*
109b0 20 41 6e 20 75 6e 75 73 75 61 6c 20 63 61 73 65   An unusual case
109c0 3a 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  : this is the fi
109d0 72 73 74 20 74 65 72 6d 20 74 6f 20 62 65 20 61  rst term to be a
109e0 64 64 65 64 20 74 6f 20 74 68 65 20 6e 6f 64 65  dded to the node
109f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  .        ** and 
10a00 74 68 65 20 73 74 61 74 69 63 20 6e 6f 64 65 20  the static node 
10a10 62 75 66 66 65 72 20 28 70 2d 3e 6e 4e 6f 64 65  buffer (p->nNode
10a20 53 69 7a 65 20 62 79 74 65 73 29 20 69 73 20 6e  Size bytes) is n
10a30 6f 74 20 6c 61 72 67 65 0a 20 20 20 20 20 20 20  ot large.       
10a40 20 2a 2a 20 65 6e 6f 75 67 68 2e 20 55 73 65 20   ** enough. Use 
10a50 61 20 73 65 70 61 72 61 74 65 6c 79 20 6d 61 6c  a separately mal
10a60 6c 6f 63 65 64 20 62 75 66 66 65 72 20 69 6e 73  loced buffer ins
10a70 74 65 61 64 20 54 68 69 73 20 77 61 73 74 65 73  tead This wastes
10a80 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 2d 3e 6e  .        ** p->n
10a90 4e 6f 64 65 53 69 7a 65 20 62 79 74 65 73 2c 20  NodeSize bytes, 
10aa0 62 75 74 20 73 69 6e 63 65 20 74 68 69 73 20 73  but since this s
10ab0 63 65 6e 61 72 69 6f 20 6f 6e 6c 79 20 63 6f 6d  cenario only com
10ac0 65 73 20 61 62 6f 75 74 20 77 68 65 6e 0a 20 20  es about when.  
10ad0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
10ae0 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 20 74 77  abase contain tw
10af0 6f 20 74 65 72 6d 73 20 74 68 61 74 20 73 68 61  o terms that sha
10b00 72 65 20 61 20 70 72 65 66 69 78 20 6f 66 20 61  re a prefix of a
10b10 6c 6d 6f 73 74 20 32 4b 42 2c 20 0a 20 20 20 20  lmost 2KB, .    
10b20 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 6e      ** this is n
10b30 6f 74 20 65 78 70 65 63 74 65 64 20 74 6f 20 62  ot expected to b
10b40 65 20 61 20 73 65 72 69 6f 75 73 20 70 72 6f 62  e a serious prob
10b50 6c 65 6d 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f  lem. .        */
10b60 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
10b70 20 70 54 72 65 65 2d 3e 61 44 61 74 61 3d 3d 28   pTree->aData==(
10b80 63 68 61 72 20 2a 29 26 70 54 72 65 65 5b 31 5d  char *)&pTree[1]
10b90 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 72 65   );.        pTre
10ba0 65 2d 3e 61 44 61 74 61 20 3d 20 28 63 68 61 72  e->aData = (char
10bb0 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
10bc0 63 28 6e 52 65 71 29 3b 0a 20 20 20 20 20 20 20  c(nReq);.       
10bd0 20 69 66 28 20 21 70 54 72 65 65 2d 3e 61 44 61   if( !pTree->aDa
10be0 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ta ){.          
10bf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
10c00 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  MEM;.        }. 
10c10 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
10c20 28 20 70 54 72 65 65 2d 3e 7a 54 65 72 6d 20 29  ( pTree->zTerm )
10c30 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
10c40 72 65 20 69 73 20 6e 6f 20 70 72 65 66 69 78 2d  re is no prefix-
10c50 6c 65 6e 67 74 68 20 66 69 65 6c 64 20 66 6f 72  length field for
10c60 20 66 69 72 73 74 20 74 65 72 6d 20 69 6e 20 61   first term in a
10c70 20 6e 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20   node */.       
10c80 20 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69 74 65   nData += sqlite
10c90 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26  3Fts3PutVarint(&
10ca0 70 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e 44 61  pTree->aData[nDa
10cb0 74 61 5d 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20  ta], nPrefix);. 
10cc0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6e 44       }..      nD
10cd0 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ata += sqlite3Ft
10ce0 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 54 72  s3PutVarint(&pTr
10cf0 65 65 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d  ee->aData[nData]
10d00 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 20 20  , nSuffix);.    
10d10 20 20 6d 65 6d 63 70 79 28 26 70 54 72 65 65 2d    memcpy(&pTree-
10d20 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 26  >aData[nData], &
10d30 7a 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 2c 20  zTerm[nPrefix], 
10d40 6e 53 75 66 66 69 78 29 3b 0a 20 20 20 20 20 20  nSuffix);.      
10d50 70 54 72 65 65 2d 3e 6e 44 61 74 61 20 3d 20 6e  pTree->nData = n
10d60 44 61 74 61 20 2b 20 6e 53 75 66 66 69 78 3b 0a  Data + nSuffix;.
10d70 20 20 20 20 20 20 70 54 72 65 65 2d 3e 6e 45 6e        pTree->nEn
10d80 74 72 79 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66  try++;..      if
10d90 28 20 69 73 43 6f 70 79 54 65 72 6d 20 29 7b 0a  ( isCopyTerm ){.
10da0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 72 65          if( pTre
10db0 65 2d 3e 6e 4d 61 6c 6c 6f 63 3c 6e 54 65 72 6d  e->nMalloc<nTerm
10dc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68   ){.          ch
10dd0 61 72 20 2a 7a 4e 65 77 20 3d 20 73 71 6c 69 74  ar *zNew = sqlit
10de0 65 33 5f 72 65 61 6c 6c 6f 63 28 70 54 72 65 65  e3_realloc(pTree
10df0 2d 3e 7a 4d 61 6c 6c 6f 63 2c 20 6e 54 65 72 6d  ->zMalloc, nTerm
10e00 2a 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  *2);.          i
10e10 66 28 20 21 7a 4e 65 77 20 29 7b 0a 20 20 20 20  f( !zNew ){.    
10e20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
10e30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
10e40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10e50 20 20 20 70 54 72 65 65 2d 3e 6e 4d 61 6c 6c 6f     pTree->nMallo
10e60 63 20 3d 20 6e 54 65 72 6d 2a 32 3b 0a 20 20 20  c = nTerm*2;.   
10e70 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e 7a 4d         pTree->zM
10e80 61 6c 6c 6f 63 20 3d 20 7a 4e 65 77 3b 0a 20 20  alloc = zNew;.  
10e90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10ea0 70 54 72 65 65 2d 3e 7a 54 65 72 6d 20 3d 20 70  pTree->zTerm = p
10eb0 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20  Tree->zMalloc;. 
10ec0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54         memcpy(pT
10ed0 72 65 65 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65 72  ree->zTerm, zTer
10ee0 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20  m, nTerm);.     
10ef0 20 20 20 70 54 72 65 65 2d 3e 6e 54 65 72 6d 20     pTree->nTerm 
10f00 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = nTerm;.      }
10f10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54  else{.        pT
10f20 72 65 65 2d 3e 7a 54 65 72 6d 20 3d 20 28 63 68  ree->zTerm = (ch
10f30 61 72 20 2a 29 7a 54 65 72 6d 3b 0a 20 20 20 20  ar *)zTerm;.    
10f40 20 20 20 20 70 54 72 65 65 2d 3e 6e 54 65 72 6d      pTree->nTerm
10f50 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20   = nTerm;.      
10f60 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
10f70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
10f80 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e    }..  /* If con
10f90 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 68 65  trol flows to he
10fa0 72 65 2c 20 69 74 20 77 61 73 20 6e 6f 74 20 70  re, it was not p
10fb0 6f 73 73 69 62 6c 65 20 74 6f 20 61 70 70 65 6e  ossible to appen
10fc0 64 20 7a 54 65 72 6d 20 74 6f 20 74 68 65 0a 20  d zTerm to the. 
10fd0 20 2a 2a 20 63 75 72 72 65 6e 74 20 6e 6f 64 65   ** current node
10fe0 2e 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6e  . Create a new n
10ff0 6f 64 65 20 28 61 20 72 69 67 68 74 2d 73 69 62  ode (a right-sib
11000 6c 69 6e 67 20 6f 66 20 74 68 65 20 63 75 72 72  ling of the curr
11010 65 6e 74 20 6e 6f 64 65 29 2e 0a 20 20 2a 2a 20  ent node)..  ** 
11020 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
11030 69 72 73 74 20 6e 6f 64 65 20 69 6e 20 74 68 65  irst node in the
11040 20 74 72 65 65 2c 20 74 68 65 20 74 65 72 6d 20   tree, the term 
11050 69 73 20 61 64 64 65 64 20 74 6f 20 69 74 2e 0a  is added to it..
11060 20 20 2a 2a 0a 20 20 2a 2a 20 4f 74 68 65 72 77    **.  ** Otherw
11070 69 73 65 2c 20 74 68 65 20 74 65 72 6d 20 69 73  ise, the term is
11080 20 6e 6f 74 20 61 64 64 65 64 20 74 6f 20 74 68   not added to th
11090 65 20 6e 65 77 20 6e 6f 64 65 2c 20 69 74 20 69  e new node, it i
110a0 73 20 6c 65 66 74 20 65 6d 70 74 79 20 66 6f 72  s left empty for
110b0 0a 20 20 2a 2a 20 6e 6f 77 2e 20 49 6e 73 74 65  .  ** now. Inste
110c0 61 64 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20  ad, the term is 
110d0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
110e0 65 20 70 61 72 65 6e 74 20 6f 66 20 70 54 72 65  e parent of pTre
110f0 65 2e 20 49 66 20 70 54 72 65 65 20 0a 20 20 2a  e. If pTree .  *
11100 2a 20 68 61 73 20 6e 6f 20 70 61 72 65 6e 74 2c  * has no parent,
11110 20 6f 6e 65 20 69 73 20 63 72 65 61 74 65 64 20   one is created 
11120 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 4e 65  here..  */.  pNe
11130 77 20 3d 20 28 53 65 67 6d 65 6e 74 4e 6f 64 65  w = (SegmentNode
11140 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
11150 63 28 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e 74  c(sizeof(Segment
11160 4e 6f 64 65 29 20 2b 20 70 2d 3e 6e 4e 6f 64 65  Node) + p->nNode
11170 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 21 70 4e  Size);.  if( !pN
11180 65 77 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ew ){.    return
11190 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
111a0 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77   }.  memset(pNew
111b0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 65 67 6d  , 0, sizeof(Segm
111c0 65 6e 74 4e 6f 64 65 29 29 3b 0a 20 20 70 4e 65  entNode));.  pNe
111d0 77 2d 3e 6e 44 61 74 61 20 3d 20 31 20 2b 20 46  w->nData = 1 + F
111e0 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 3b 0a  TS3_VARINT_MAX;.
111f0 20 20 70 4e 65 77 2d 3e 61 44 61 74 61 20 3d 20    pNew->aData = 
11200 28 63 68 61 72 20 2a 29 26 70 4e 65 77 5b 31 5d  (char *)&pNew[1]
11210 3b 0a 0a 20 20 69 66 28 20 70 54 72 65 65 20 29  ;..  if( pTree )
11220 7b 0a 20 20 20 20 53 65 67 6d 65 6e 74 4e 6f 64  {.    SegmentNod
11230 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 54 72  e *pParent = pTr
11240 65 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20  ee->pParent;.   
11250 20 72 63 20 3d 20 66 74 73 33 4e 6f 64 65 41 64   rc = fts3NodeAd
11260 64 54 65 72 6d 28 70 2c 20 26 70 50 61 72 65 6e  dTerm(p, &pParen
11270 74 2c 20 69 73 43 6f 70 79 54 65 72 6d 2c 20 7a  t, isCopyTerm, z
11280 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20  Term, nTerm);.  
11290 20 20 69 66 28 20 70 54 72 65 65 2d 3e 70 50 61    if( pTree->pPa
112a0 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rent==0 ){.     
112b0 20 70 54 72 65 65 2d 3e 70 50 61 72 65 6e 74 20   pTree->pParent 
112c0 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 7d  = pParent;.    }
112d0 0a 20 20 20 20 70 54 72 65 65 2d 3e 70 52 69 67  .    pTree->pRig
112e0 68 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70  ht = pNew;.    p
112f0 4e 65 77 2d 3e 70 4c 65 66 74 6d 6f 73 74 20 3d  New->pLeftmost =
11300 20 70 54 72 65 65 2d 3e 70 4c 65 66 74 6d 6f 73   pTree->pLeftmos
11310 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 50 61  t;.    pNew->pPa
11320 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a  rent = pParent;.
11330 20 20 20 20 70 4e 65 77 2d 3e 7a 4d 61 6c 6c 6f      pNew->zMallo
11340 63 20 3d 20 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c  c = pTree->zMall
11350 6f 63 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4d  oc;.    pNew->nM
11360 61 6c 6c 6f 63 20 3d 20 70 54 72 65 65 2d 3e 6e  alloc = pTree->n
11370 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20 70 54 72 65  Malloc;.    pTre
11380 65 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  e->zMalloc = 0;.
11390 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
113a0 77 2d 3e 70 4c 65 66 74 6d 6f 73 74 20 3d 20 70  w->pLeftmost = p
113b0 4e 65 77 3b 0a 20 20 20 20 72 63 20 3d 20 66 74  New;.    rc = ft
113c0 73 33 4e 6f 64 65 41 64 64 54 65 72 6d 28 70 2c  s3NodeAddTerm(p,
113d0 20 26 70 4e 65 77 2c 20 69 73 43 6f 70 79 54 65   &pNew, isCopyTe
113e0 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  rm, zTerm, nTerm
113f0 29 3b 20 0a 20 20 7d 0a 0a 20 20 2a 70 70 54 72  ); .  }..  *ppTr
11400 65 65 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74  ee = pNew;.  ret
11410 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11420 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
11430 20 66 6f 72 20 66 74 73 33 4e 6f 64 65 57 72 69   for fts3NodeWri
11440 74 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  te()..*/.static 
11450 69 6e 74 20 66 74 73 33 54 72 65 65 46 69 6e 69  int fts3TreeFini
11460 73 68 4e 6f 64 65 28 0a 20 20 53 65 67 6d 65 6e  shNode(.  Segmen
11470 74 4e 6f 64 65 20 2a 70 54 72 65 65 2c 20 0a 20  tNode *pTree, . 
11480 20 69 6e 74 20 69 48 65 69 67 68 74 2c 20 0a 20   int iHeight, . 
11490 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
114a0 4c 65 66 74 43 68 69 6c 64 0a 29 7b 0a 20 20 69  LeftChild.){.  i
114b0 6e 74 20 6e 53 74 61 72 74 3b 0a 20 20 61 73 73  nt nStart;.  ass
114c0 65 72 74 28 20 69 48 65 69 67 68 74 3e 3d 31 20  ert( iHeight>=1 
114d0 26 26 20 69 48 65 69 67 68 74 3c 31 32 38 20 29  && iHeight<128 )
114e0 3b 0a 20 20 6e 53 74 61 72 74 20 3d 20 46 54 53  ;.  nStart = FTS
114f0 33 5f 56 41 52 49 4e 54 5f 4d 41 58 20 2d 20 73  3_VARINT_MAX - s
11500 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e 74  qlite3Fts3Varint
11510 4c 65 6e 28 69 4c 65 66 74 43 68 69 6c 64 29 3b  Len(iLeftChild);
11520 0a 20 20 70 54 72 65 65 2d 3e 61 44 61 74 61 5b  .  pTree->aData[
11530 6e 53 74 61 72 74 5d 20 3d 20 28 63 68 61 72 29  nStart] = (char)
11540 69 48 65 69 67 68 74 3b 0a 20 20 73 71 6c 69 74  iHeight;.  sqlit
11550 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28  e3Fts3PutVarint(
11560 26 70 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e 53  &pTree->aData[nS
11570 74 61 72 74 2b 31 5d 2c 20 69 4c 65 66 74 43 68  tart+1], iLeftCh
11580 69 6c 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  ild);.  return n
11590 53 74 61 72 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Start;.}../*.** 
115a0 57 72 69 74 65 20 74 68 65 20 62 75 66 66 65 72  Write the buffer
115b0 20 66 6f 72 20 74 68 65 20 73 65 67 6d 65 6e 74   for the segment
115c0 20 6e 6f 64 65 20 70 54 72 65 65 20 61 6e 64 20   node pTree and 
115d0 61 6c 6c 20 6f 66 20 69 74 73 20 70 65 65 72 73  all of its peers
115e0 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
115f0 61 73 65 2e 20 54 68 65 6e 20 63 61 6c 6c 20 74  ase. Then call t
11600 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 63  his function rec
11610 75 72 73 69 76 65 6c 79 20 74 6f 20 77 72 69 74  ursively to writ
11620 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  e the parent of 
11630 0a 2a 2a 20 70 54 72 65 65 20 61 6e 64 20 69 74  .** pTree and it
11640 73 20 70 65 65 72 73 20 74 6f 20 74 68 65 20 64  s peers to the d
11650 61 74 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20  atabase. .**.** 
11660 45 78 63 65 70 74 2c 20 69 66 20 70 54 72 65 65  Except, if pTree
11670 20 69 73 20 61 20 72 6f 6f 74 20 6e 6f 64 65 2c   is a root node,
11680 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74   do not write it
11690 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
116a0 2e 20 49 6e 73 74 65 61 64 2c 0a 2a 2a 20 73 65  . Instead,.** se
116b0 74 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  t output variabl
116c0 65 73 20 2a 70 61 52 6f 6f 74 20 61 6e 64 20 2a  es *paRoot and *
116d0 70 6e 52 6f 6f 74 20 74 6f 20 63 6f 6e 74 61 69  pnRoot to contai
116e0 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e  n the root node.
116f0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
11700 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
11710 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
11720 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20  output variable 
11730 2a 70 69 4c 61 73 74 20 69 73 0a 2a 2a 20 73 65  *piLast is.** se
11740 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73 74  t to the largest
11750 20 62 6c 6f 63 6b 69 64 20 77 72 69 74 74 65 6e   blockid written
11760 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
11770 20 28 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 0a   (or zero if no.
11780 2a 2a 20 62 6c 6f 63 6b 73 20 77 65 72 65 20 77  ** blocks were w
11790 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 62  ritten to the db
117a0 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  ). Otherwise, an
117b0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
117c0 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  de is .** return
117d0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
117e0 74 20 66 74 73 33 4e 6f 64 65 57 72 69 74 65 28  t fts3NodeWrite(
117f0 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
11800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11810 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
11820 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
11830 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72  SegmentNode *pTr
11840 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ee,             
11850 2f 2a 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 68  /* SegmentNode h
11860 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  andle */.  int i
11870 48 65 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  Height,         
11880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 65             /* He
11890 69 67 68 74 20 6f 66 20 74 68 69 73 20 6e 6f 64  ight of this nod
118a0 65 20 69 6e 20 74 72 65 65 20 2a 2f 0a 20 20 73  e in tree */.  s
118b0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 65  qlite3_int64 iLe
118c0 61 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  af,            /
118d0 2a 20 42 6c 6f 63 6b 20 69 64 20 6f 66 20 66 69  * Block id of fi
118e0 72 73 74 20 6c 65 61 66 20 6e 6f 64 65 20 2a 2f  rst leaf node */
118f0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
11900 20 69 46 72 65 65 2c 20 20 20 20 20 20 20 20 20   iFree,         
11910 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 69 64 20 6f     /* Block id o
11920 66 20 6e 65 78 74 20 66 72 65 65 20 73 6c 6f 74  f next free slot
11930 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73 20 2a   in %_segments *
11940 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
11950 34 20 2a 70 69 4c 61 73 74 2c 20 20 20 20 20 20  4 *piLast,      
11960 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42 6c 6f 63      /* OUT: Bloc
11970 6b 20 69 64 20 6f 66 20 6c 61 73 74 20 65 6e 74  k id of last ent
11980 72 79 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  ry written */.  
11990 63 68 61 72 20 2a 2a 70 61 52 6f 6f 74 2c 20 20  char **paRoot,  
119a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119b0 2f 2a 20 4f 55 54 3a 20 44 61 74 61 20 66 6f 72  /* OUT: Data for
119c0 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20   root node */.  
119d0 69 6e 74 20 2a 70 6e 52 6f 6f 74 20 20 20 20 20  int *pnRoot     
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119f0 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20  /* OUT: Size of 
11a00 72 6f 6f 74 20 6e 6f 64 65 20 69 6e 20 62 79 74  root node in byt
11a10 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  es */.){.  int r
11a20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
11a30 20 20 69 66 28 20 21 70 54 72 65 65 2d 3e 70 50    if( !pTree->pP
11a40 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  arent ){.    /* 
11a50 52 6f 6f 74 20 6e 6f 64 65 20 6f 66 20 74 68 65  Root node of the
11a60 20 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e   tree. */.    in
11a70 74 20 6e 53 74 61 72 74 20 3d 20 66 74 73 33 54  t nStart = fts3T
11a80 72 65 65 46 69 6e 69 73 68 4e 6f 64 65 28 70 54  reeFinishNode(pT
11a90 72 65 65 2c 20 69 48 65 69 67 68 74 2c 20 69 4c  ree, iHeight, iL
11aa0 65 61 66 29 3b 0a 20 20 20 20 2a 70 69 4c 61 73  eaf);.    *piLas
11ab0 74 20 3d 20 69 46 72 65 65 2d 31 3b 0a 20 20 20  t = iFree-1;.   
11ac0 20 2a 70 6e 52 6f 6f 74 20 3d 20 70 54 72 65 65   *pnRoot = pTree
11ad0 2d 3e 6e 44 61 74 61 20 2d 20 6e 53 74 61 72 74  ->nData - nStart
11ae0 3b 0a 20 20 20 20 2a 70 61 52 6f 6f 74 20 3d 20  ;.    *paRoot = 
11af0 26 70 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e 53  &pTree->aData[nS
11b00 74 61 72 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tart];.  }else{.
11b10 20 20 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20      SegmentNode 
11b20 2a 70 49 74 65 72 3b 0a 20 20 20 20 73 71 6c 69  *pIter;.    sqli
11b30 74 65 33 5f 69 6e 74 36 34 20 69 4e 65 78 74 46  te3_int64 iNextF
11b40 72 65 65 20 3d 20 69 46 72 65 65 3b 0a 20 20 20  ree = iFree;.   
11b50 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
11b60 4e 65 78 74 4c 65 61 66 20 3d 20 69 4c 65 61 66  NextLeaf = iLeaf
11b70 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d  ;.    for(pIter=
11b80 70 54 72 65 65 2d 3e 70 4c 65 66 74 6d 6f 73 74  pTree->pLeftmost
11b90 3b 20 70 49 74 65 72 20 26 26 20 72 63 3d 3d 53  ; pIter && rc==S
11ba0 51 4c 49 54 45 5f 4f 4b 3b 20 70 49 74 65 72 3d  QLITE_OK; pIter=
11bb0 70 49 74 65 72 2d 3e 70 52 69 67 68 74 29 7b 0a  pIter->pRight){.
11bc0 20 20 20 20 20 20 69 6e 74 20 6e 53 74 61 72 74        int nStart
11bd0 20 3d 20 66 74 73 33 54 72 65 65 46 69 6e 69 73   = fts3TreeFinis
11be0 68 4e 6f 64 65 28 70 49 74 65 72 2c 20 69 48 65  hNode(pIter, iHe
11bf0 69 67 68 74 2c 20 69 4e 65 78 74 4c 65 61 66 29  ight, iNextLeaf)
11c00 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69  ;.      int nWri
11c10 74 65 20 3d 20 70 49 74 65 72 2d 3e 6e 44 61 74  te = pIter->nDat
11c20 61 20 2d 20 6e 53 74 61 72 74 3b 0a 20 20 0a 20  a - nStart;.  . 
11c30 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 57 72       rc = fts3Wr
11c40 69 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 69 4e  iteSegment(p, iN
11c50 65 78 74 46 72 65 65 2c 20 26 70 49 74 65 72 2d  extFree, &pIter-
11c60 3e 61 44 61 74 61 5b 6e 53 74 61 72 74 5d 2c 20  >aData[nStart], 
11c70 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 69  nWrite);.      i
11c80 4e 65 78 74 46 72 65 65 2b 2b 3b 0a 20 20 20 20  NextFree++;.    
11c90 20 20 69 4e 65 78 74 4c 65 61 66 20 2b 3d 20 28    iNextLeaf += (
11ca0 70 49 74 65 72 2d 3e 6e 45 6e 74 72 79 2b 31 29  pIter->nEntry+1)
11cb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11cc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11cd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
11ce0 4e 65 78 74 4c 65 61 66 3d 3d 69 46 72 65 65 20  NextLeaf==iFree 
11cf0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  );.      rc = ft
11d00 73 33 4e 6f 64 65 57 72 69 74 65 28 0a 20 20 20  s3NodeWrite(.   
11d10 20 20 20 20 20 20 20 70 2c 20 70 54 72 65 65 2d         p, pTree-
11d20 3e 70 50 61 72 65 6e 74 2c 20 69 48 65 69 67 68  >pParent, iHeigh
11d30 74 2b 31 2c 20 69 46 72 65 65 2c 20 69 4e 65 78  t+1, iFree, iNex
11d40 74 46 72 65 65 2c 20 70 69 4c 61 73 74 2c 20 70  tFree, piLast, p
11d50 61 52 6f 6f 74 2c 20 70 6e 52 6f 6f 74 0a 20 20  aRoot, pnRoot.  
11d60 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
11d70 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
11d80 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
11d90 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
11da0 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ons associated w
11db0 69 74 68 20 74 68 65 20 74 72 65 65 20 70 54 72  ith the tree pTr
11dc0 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ee..*/.static vo
11dd0 69 64 20 66 74 73 33 4e 6f 64 65 46 72 65 65 28  id fts3NodeFree(
11de0 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72  SegmentNode *pTr
11df0 65 65 29 7b 0a 20 20 69 66 28 20 70 54 72 65 65  ee){.  if( pTree
11e00 20 29 7b 0a 20 20 20 20 53 65 67 6d 65 6e 74 4e   ){.    SegmentN
11e10 6f 64 65 20 2a 70 20 3d 20 70 54 72 65 65 2d 3e  ode *p = pTree->
11e20 70 4c 65 66 74 6d 6f 73 74 3b 0a 20 20 20 20 66  pLeftmost;.    f
11e30 74 73 33 4e 6f 64 65 46 72 65 65 28 70 2d 3e 70  ts3NodeFree(p->p
11e40 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 77 68 69  Parent);.    whi
11e50 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 20 20 53  le( p ){.      S
11e60 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 52 69 67  egmentNode *pRig
11e70 68 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a  ht = p->pRight;.
11e80 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 44 61        if( p->aDa
11e90 74 61 21 3d 28 63 68 61 72 20 2a 29 26 70 5b 31  ta!=(char *)&p[1
11ea0 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ] ){.        sql
11eb0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 44 61  ite3_free(p->aDa
11ec0 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ta);.      }.   
11ed0 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68     assert( pRigh
11ee0 74 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 4d 61 6c 6c  t==0 || p->zMall
11ef0 6f 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  oc==0 );.      s
11f00 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
11f10 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 73  Malloc);.      s
11f20 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
11f30 20 20 20 20 20 20 70 20 3d 20 70 52 69 67 68 74        p = pRight
11f40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
11f50 2a 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d 20  *.** Add a term 
11f60 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62  to the segment b
11f70 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
11f80 20 62 79 20 74 68 65 20 53 65 67 6d 65 6e 74 57   by the SegmentW
11f90 72 69 74 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20  riter object.** 
11fa0 2a 70 70 57 72 69 74 65 72 2e 20 57 68 65 6e 20  *ppWriter. When 
11fb0 61 64 64 69 6e 67 20 74 68 65 20 66 69 72 73 74  adding the first
11fc0 20 74 65 72 6d 20 74 6f 20 61 20 73 65 67 6d 65   term to a segme
11fd0 6e 74 2c 20 2a 70 70 57 72 69 74 65 72 20 73 68  nt, *ppWriter sh
11fe0 6f 75 6c 64 0a 2a 2a 20 62 65 20 70 61 73 73 65  ould.** be passe
11ff0 64 20 4e 55 4c 4c 2e 20 54 68 69 73 20 66 75 6e  d NULL. This fun
12000 63 74 69 6f 6e 20 77 69 6c 6c 20 61 6c 6c 6f 63  ction will alloc
12010 61 74 65 20 61 20 6e 65 77 20 53 65 67 6d 65 6e  ate a new Segmen
12020 74 57 72 69 74 65 72 20 6f 62 6a 65 63 74 0a 2a  tWriter object.*
12030 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74 20  * and return it 
12040 76 69 61 20 74 68 65 20 69 6e 70 75 74 2f 6f 75  via the input/ou
12050 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70  tput variable *p
12060 70 57 72 69 74 65 72 20 69 6e 20 74 68 69 73 20  pWriter in this 
12070 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  case..**.** If s
12080 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
12090 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
120a0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
120b0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
120c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
120d0 20 66 74 73 33 53 65 67 57 72 69 74 65 72 41 64   fts3SegWriterAd
120e0 64 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  d(.  Fts3Table *
120f0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
12100 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
12110 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
12120 20 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20    SegmentWriter 
12130 2a 2a 70 70 57 72 69 74 65 72 2c 20 20 20 20 20  **ppWriter,     
12140 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 65 67    /* IN/OUT: Seg
12150 6d 65 6e 74 57 72 69 74 65 72 20 68 61 6e 64 6c  mentWriter handl
12160 65 20 2a 2f 20 0a 20 20 69 6e 74 20 69 73 43 6f  e */ .  int isCo
12170 70 79 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  pyTerm,         
12180 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
12190 69 66 20 62 75 66 66 65 72 20 7a 54 65 72 6d 20  if buffer zTerm 
121a0 6d 75 73 74 20 62 65 20 63 6f 70 69 65 64 20 2a  must be copied *
121b0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
121c0 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  zTerm,          
121d0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
121e0 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
121f0 69 6e 67 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  ing term */.  in
12200 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 20 20 20  t nTerm,        
12210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12220 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e   Size of term in
12230 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 6f 6e 73   bytes */.  cons
12240 74 20 63 68 61 72 20 2a 61 44 6f 63 6c 69 73 74  t char *aDoclist
12250 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
12260 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
12270 20 63 6f 6e 74 61 69 6e 69 6e 67 20 64 6f 63 6c   containing docl
12280 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f  ist */.  int nDo
12290 63 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20  clist           
122a0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
122b0 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 62   of doclist in b
122c0 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ytes */.){.  int
122d0 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20 20   nPrefix;       
122e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
122f0 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 70 72 65  Size of term pre
12300 66 69 78 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  fix in bytes */.
12310 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 20 20    int nSuffix;  
12320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12330 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72    /* Size of ter
12340 6d 20 73 75 66 66 69 78 20 69 6e 20 62 79 74 65  m suffix in byte
12350 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 71 3b  s */.  int nReq;
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12370 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
12380 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
12390 65 64 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 20  ed on leaf page 
123a0 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a  */.  int nData;.
123b0 20 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20    SegmentWriter 
123c0 2a 70 57 72 69 74 65 72 20 3d 20 2a 70 70 57 72  *pWriter = *ppWr
123d0 69 74 65 72 3b 0a 0a 20 20 69 66 28 20 21 70 57  iter;..  if( !pW
123e0 72 69 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  riter ){.    int
123f0 20 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   rc;.    sqlite3
12400 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
12410 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74     /* Allocate t
12420 68 65 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72  he SegmentWriter
12430 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
12440 20 20 70 57 72 69 74 65 72 20 3d 20 28 53 65 67    pWriter = (Seg
12450 6d 65 6e 74 57 72 69 74 65 72 20 2a 29 73 71 6c  mentWriter *)sql
12460 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
12470 6f 66 28 53 65 67 6d 65 6e 74 57 72 69 74 65 72  of(SegmentWriter
12480 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 57 72  ));.    if( !pWr
12490 69 74 65 72 20 29 20 72 65 74 75 72 6e 20 53 51  iter ) return SQ
124a0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
124b0 6d 65 6d 73 65 74 28 70 57 72 69 74 65 72 2c 20  memset(pWriter, 
124c0 30 2c 20 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e  0, sizeof(Segmen
124d0 74 57 72 69 74 65 72 29 29 3b 0a 20 20 20 20 2a  tWriter));.    *
124e0 70 70 57 72 69 74 65 72 20 3d 20 70 57 72 69 74  ppWriter = pWrit
124f0 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f  er;..    /* Allo
12500 63 61 74 65 20 61 20 62 75 66 66 65 72 20 69 6e  cate a buffer in
12510 20 77 68 69 63 68 20 74 6f 20 61 63 63 75 6d 75   which to accumu
12520 6c 61 74 65 20 64 61 74 61 20 2a 2f 0a 20 20 20  late data */.   
12530 20 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 20   pWriter->aData 
12540 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
12550 33 5f 6d 61 6c 6c 6f 63 28 70 2d 3e 6e 4e 6f 64  3_malloc(p->nNod
12560 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  eSize);.    if( 
12570 21 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 20  !pWriter->aData 
12580 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
12590 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 57 72 69 74  NOMEM;.    pWrit
125a0 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 70 2d 3e 6e  er->nSize = p->n
125b0 4e 6f 64 65 53 69 7a 65 3b 0a 0a 20 20 20 20 2f  NodeSize;..    /
125c0 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20  * Find the next 
125d0 66 72 65 65 20 62 6c 6f 63 6b 69 64 20 69 6e 20  free blockid in 
125e0 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74  the %_segments t
125f0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d  able */.    rc =
12600 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
12610 53 51 4c 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54  SQL_NEXT_SEGMENT
12620 53 5f 49 44 2c 20 26 70 53 74 6d 74 2c 20 30 29  S_ID, &pStmt, 0)
12630 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12640 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
12650 20 72 63 3b 0a 20 20 20 20 69 66 28 20 53 51 4c   rc;.    if( SQL
12660 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
12670 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
12680 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69        pWriter->i
12690 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  Free = sqlite3_c
126a0 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d  olumn_int64(pStm
126b0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 57 72  t, 0);.      pWr
126c0 69 74 65 72 2d 3e 69 46 69 72 73 74 20 3d 20 70  iter->iFirst = p
126d0 57 72 69 74 65 72 2d 3e 69 46 72 65 65 3b 0a 20  Writer->iFree;. 
126e0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
126f0 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
12700 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
12710 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
12720 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6e 44 61  rn rc;.  }.  nDa
12730 74 61 20 3d 20 70 57 72 69 74 65 72 2d 3e 6e 44  ta = pWriter->nD
12740 61 74 61 3b 0a 0a 20 20 6e 50 72 65 66 69 78 20  ata;..  nPrefix 
12750 3d 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70  = fts3PrefixComp
12760 72 65 73 73 28 70 57 72 69 74 65 72 2d 3e 7a 54  ress(pWriter->zT
12770 65 72 6d 2c 20 70 57 72 69 74 65 72 2d 3e 6e 54  erm, pWriter->nT
12780 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  erm, zTerm, nTer
12790 6d 29 3b 0a 20 20 6e 53 75 66 66 69 78 20 3d 20  m);.  nSuffix = 
127a0 6e 54 65 72 6d 2d 6e 50 72 65 66 69 78 3b 0a 0a  nTerm-nPrefix;..
127b0 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
127c0 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 61  how many bytes a
127d0 72 65 20 72 65 71 75 69 72 65 64 20 62 79 20 74  re required by t
127e0 68 69 73 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  his new entry */
127f0 0a 20 20 6e 52 65 71 20 3d 20 73 71 6c 69 74 65  .  nReq = sqlite
12800 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e  3Fts3VarintLen(n
12810 50 72 65 66 69 78 29 20 2b 20 20 20 20 2f 2a 20  Prefix) +    /* 
12820 76 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e  varint containin
12830 67 20 70 72 65 66 69 78 20 73 69 7a 65 20 2a 2f  g prefix size */
12840 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33  .    sqlite3Fts3
12850 56 61 72 69 6e 74 4c 65 6e 28 6e 53 75 66 66 69  VarintLen(nSuffi
12860 78 29 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20  x) +         /* 
12870 76 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e  varint containin
12880 67 20 73 75 66 66 69 78 20 73 69 7a 65 20 2a 2f  g suffix size */
12890 0a 20 20 20 20 6e 53 75 66 66 69 78 20 2b 20 20  .    nSuffix +  
128a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
128c0 54 65 72 6d 20 73 75 66 66 69 78 20 2a 2f 0a 20  Term suffix */. 
128d0 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 56 61     sqlite3Fts3Va
128e0 72 69 6e 74 4c 65 6e 28 6e 44 6f 63 6c 69 73 74  rintLen(nDoclist
128f0 29 20 2b 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ) +        /* Si
12900 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 2a 2f  ze of doclist */
12910 0a 20 20 20 20 6e 44 6f 63 6c 69 73 74 3b 20 20  .    nDoclist;  
12920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12940 44 6f 63 6c 69 73 74 20 64 61 74 61 20 2a 2f 0a  Doclist data */.
12950 0a 20 20 69 66 28 20 6e 44 61 74 61 3e 30 20 26  .  if( nData>0 &
12960 26 20 6e 44 61 74 61 2b 6e 52 65 71 3e 70 2d 3e  & nData+nReq>p->
12970 6e 4e 6f 64 65 53 69 7a 65 20 29 7b 0a 20 20 20  nNodeSize ){.   
12980 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 2f 2a   int rc;..    /*
12990 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   The current lea
129a0 66 20 6e 6f 64 65 20 69 73 20 66 75 6c 6c 2e 20  f node is full. 
129b0 57 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20  Write it out to 
129c0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 2a 2f  the database. */
129d0 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 57 72  .    rc = fts3Wr
129e0 69 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 57  iteSegment(p, pW
129f0 72 69 74 65 72 2d 3e 69 46 72 65 65 2b 2b 2c 20  riter->iFree++, 
12a00 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 2c 20  pWriter->aData, 
12a10 6e 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  nData);.    if( 
12a20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
12a30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
12a40 2d 3e 6e 4c 65 61 66 41 64 64 2b 2b 3b 0a 0a 20  ->nLeafAdd++;.. 
12a50 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 63 75     /* Add the cu
12a60 72 72 65 6e 74 20 74 65 72 6d 20 74 6f 20 74 68  rrent term to th
12a70 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20  e interior node 
12a80 74 72 65 65 2e 20 54 68 65 20 74 65 72 6d 20 61  tree. The term a
12a90 64 64 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 74  dded to.    ** t
12aa0 68 65 20 69 6e 74 65 72 69 6f 72 20 74 72 65 65  he interior tree
12ab0 20 6d 75 73 74 3a 0a 20 20 20 20 2a 2a 0a 20 20   must:.    **.  
12ac0 20 20 2a 2a 20 20 20 61 29 20 62 65 20 67 72 65    **   a) be gre
12ad0 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61  ater than the la
12ae0 72 67 65 73 74 20 74 65 72 6d 20 6f 6e 20 74 68  rgest term on th
12af0 65 20 6c 65 61 66 20 6e 6f 64 65 20 6a 75 73 74  e leaf node just
12b00 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20   written.    ** 
12b10 20 20 20 20 20 74 6f 20 74 68 65 20 64 61 74 61       to the data
12b20 62 61 73 65 20 28 73 74 69 6c 6c 20 61 76 61 69  base (still avai
12b30 6c 61 62 6c 65 20 69 6e 20 70 57 72 69 74 65 72  lable in pWriter
12b40 2d 3e 7a 54 65 72 6d 29 2c 20 61 6e 64 0a 20 20  ->zTerm), and.  
12b50 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 62 29    **.    **   b)
12b60 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   be less than or
12b70 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 65   equal to the te
12b80 72 6d 20 61 62 6f 75 74 20 74 6f 20 62 65 20 61  rm about to be a
12b90 64 64 65 64 20 74 6f 20 74 68 65 20 6e 65 77 0a  dded to the new.
12ba0 20 20 20 20 2a 2a 20 20 20 20 20 20 6c 65 61 66      **      leaf
12bb0 20 6e 6f 64 65 20 28 7a 54 65 72 6d 2f 6e 54 65   node (zTerm/nTe
12bc0 72 6d 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  rm)..    **.    
12bd0 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
12be0 73 2c 20 69 74 20 6d 75 73 74 20 62 65 20 74 68  s, it must be th
12bf0 65 20 70 72 65 66 69 78 20 6f 66 20 7a 54 65 72  e prefix of zTer
12c00 6d 20 31 20 62 79 74 65 20 6c 6f 6e 67 65 72 20  m 1 byte longer 
12c10 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  than.    ** the 
12c20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 28 69  common prefix (i
12c30 66 20 61 6e 79 29 20 6f 66 20 7a 54 65 72 6d 20  f any) of zTerm 
12c40 61 6e 64 20 70 57 72 69 74 65 72 2d 3e 7a 54 65  and pWriter->zTe
12c50 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  rm..    */.    a
12c60 73 73 65 72 74 28 20 6e 50 72 65 66 69 78 3c 6e  ssert( nPrefix<n
12c70 54 65 72 6d 20 29 3b 0a 20 20 20 20 72 63 20 3d  Term );.    rc =
12c80 20 66 74 73 33 4e 6f 64 65 41 64 64 54 65 72 6d   fts3NodeAddTerm
12c90 28 70 2c 20 26 70 57 72 69 74 65 72 2d 3e 70 54  (p, &pWriter->pT
12ca0 72 65 65 2c 20 69 73 43 6f 70 79 54 65 72 6d 2c  ree, isCopyTerm,
12cb0 20 7a 54 65 72 6d 2c 20 6e 50 72 65 66 69 78 2b   zTerm, nPrefix+
12cc0 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  1);.    if( rc!=
12cd0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
12ce0 72 6e 20 72 63 3b 0a 0a 20 20 20 20 6e 44 61 74  rn rc;..    nDat
12cf0 61 20 3d 20 30 3b 0a 20 20 20 20 70 57 72 69 74  a = 0;.    pWrit
12d00 65 72 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 0a  er->nTerm = 0;..
12d10 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20 30 3b      nPrefix = 0;
12d20 0a 20 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e  .    nSuffix = n
12d30 54 65 72 6d 3b 0a 20 20 20 20 6e 52 65 71 20 3d  Term;.    nReq =
12d40 20 31 20 2b 20 20 20 20 20 20 20 20 20 20 20 20   1 +            
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d60 20 20 2f 2a 20 76 61 72 69 6e 74 20 63 6f 6e 74    /* varint cont
12d70 61 69 6e 69 6e 67 20 70 72 65 66 69 78 20 73 69  aining prefix si
12d80 7a 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ze */.      sqli
12d90 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e  te3Fts3VarintLen
12da0 28 6e 54 65 72 6d 29 20 2b 20 20 20 20 20 20 20  (nTerm) +       
12db0 20 20 2f 2a 20 76 61 72 69 6e 74 20 63 6f 6e 74    /* varint cont
12dc0 61 69 6e 69 6e 67 20 73 75 66 66 69 78 20 73 69  aining suffix si
12dd0 7a 65 20 2a 2f 0a 20 20 20 20 20 20 6e 54 65 72  ze */.      nTer
12de0 6d 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  m +             
12df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e00 20 20 2f 2a 20 54 65 72 6d 20 73 75 66 66 69 78    /* Term suffix
12e10 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
12e20 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e  3Fts3VarintLen(n
12e30 44 6f 63 6c 69 73 74 29 20 2b 20 20 20 20 20 20  Doclist) +      
12e40 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69  /* Size of docli
12e50 73 74 20 2a 2f 0a 20 20 20 20 20 20 6e 44 6f 63  st */.      nDoc
12e60 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  list;           
12e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e80 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 64 61 74    /* Doclist dat
12e90 61 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  a */.  }..  /* I
12ea0 6e 63 72 65 61 73 65 20 74 68 65 20 74 6f 74 61  ncrease the tota
12eb0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
12ec0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 61 63 63  s written to acc
12ed0 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 6e 65 77  ount for the new
12ee0 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 70 57 72   entry. */.  pWr
12ef0 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61 74 61 20  iter->nLeafData 
12f00 2b 3d 20 6e 52 65 71 3b 0a 0a 20 20 2f 2a 20 49  += nReq;..  /* I
12f10 66 20 74 68 65 20 62 75 66 66 65 72 20 63 75 72  f the buffer cur
12f20 72 65 6e 74 6c 79 20 61 6c 6c 6f 63 61 74 65 64  rently allocated
12f30 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f   is too small fo
12f40 72 20 74 68 69 73 20 65 6e 74 72 79 2c 20 72 65  r this entry, re
12f50 61 6c 6c 6f 63 0a 20 20 2a 2a 20 74 68 65 20 62  alloc.  ** the b
12f60 75 66 66 65 72 20 74 6f 20 6d 61 6b 65 20 69 74  uffer to make it
12f70 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2e 0a 20   large enough.. 
12f80 20 2a 2f 0a 20 20 69 66 28 20 6e 52 65 71 3e 70   */.  if( nReq>p
12f90 57 72 69 74 65 72 2d 3e 6e 53 69 7a 65 20 29 7b  Writer->nSize ){
12fa0 0a 20 20 20 20 63 68 61 72 20 2a 61 4e 65 77 20  .    char *aNew 
12fb0 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
12fc0 63 28 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61  c(pWriter->aData
12fd0 2c 20 6e 52 65 71 29 3b 0a 20 20 20 20 69 66 28  , nReq);.    if(
12fe0 20 21 61 4e 65 77 20 29 20 72 65 74 75 72 6e 20   !aNew ) return 
12ff0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
13000 20 20 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61    pWriter->aData
13010 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 70 57 72   = aNew;.    pWr
13020 69 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 6e 52  iter->nSize = nR
13030 65 71 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  eq;.  }.  assert
13040 28 20 6e 44 61 74 61 2b 6e 52 65 71 3c 3d 70 57  ( nData+nReq<=pW
13050 72 69 74 65 72 2d 3e 6e 53 69 7a 65 20 29 3b 0a  riter->nSize );.
13060 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65  .  /* Append the
13070 20 70 72 65 66 69 78 2d 63 6f 6d 70 72 65 73 73   prefix-compress
13080 65 64 20 74 65 72 6d 20 61 6e 64 20 64 6f 63 6c  ed term and docl
13090 69 73 74 20 74 6f 20 74 68 65 20 62 75 66 66 65  ist to the buffe
130a0 72 2e 20 2a 2f 0a 20 20 6e 44 61 74 61 20 2b 3d  r. */.  nData +=
130b0 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56   sqlite3Fts3PutV
130c0 61 72 69 6e 74 28 26 70 57 72 69 74 65 72 2d 3e  arint(&pWriter->
130d0 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 6e 50  aData[nData], nP
130e0 72 65 66 69 78 29 3b 0a 20 20 6e 44 61 74 61 20  refix);.  nData 
130f0 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75  += sqlite3Fts3Pu
13100 74 56 61 72 69 6e 74 28 26 70 57 72 69 74 65 72  tVarint(&pWriter
13110 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20  ->aData[nData], 
13120 6e 53 75 66 66 69 78 29 3b 0a 20 20 6d 65 6d 63  nSuffix);.  memc
13130 70 79 28 26 70 57 72 69 74 65 72 2d 3e 61 44 61  py(&pWriter->aDa
13140 74 61 5b 6e 44 61 74 61 5d 2c 20 26 7a 54 65 72  ta[nData], &zTer
13150 6d 5b 6e 50 72 65 66 69 78 5d 2c 20 6e 53 75 66  m[nPrefix], nSuf
13160 66 69 78 29 3b 0a 20 20 6e 44 61 74 61 20 2b 3d  fix);.  nData +=
13170 20 6e 53 75 66 66 69 78 3b 0a 20 20 6e 44 61 74   nSuffix;.  nDat
13180 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  a += sqlite3Fts3
13190 50 75 74 56 61 72 69 6e 74 28 26 70 57 72 69 74  PutVarint(&pWrit
131a0 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d  er->aData[nData]
131b0 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 6d  , nDoclist);.  m
131c0 65 6d 63 70 79 28 26 70 57 72 69 74 65 72 2d 3e  emcpy(&pWriter->
131d0 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 61 44  aData[nData], aD
131e0 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74  oclist, nDoclist
131f0 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 44  );.  pWriter->nD
13200 61 74 61 20 3d 20 6e 44 61 74 61 20 2b 20 6e 44  ata = nData + nD
13210 6f 63 6c 69 73 74 3b 0a 0a 20 20 2f 2a 20 53 61  oclist;..  /* Sa
13220 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ve the current t
13230 65 72 6d 20 73 6f 20 74 68 61 74 20 69 74 20 63  erm so that it c
13240 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70 72  an be used to pr
13250 65 66 69 78 2d 63 6f 6d 70 72 65 73 73 20 74 68  efix-compress th
13260 65 20 6e 65 78 74 2e 0a 20 20 2a 2a 20 49 66 20  e next..  ** If 
13270 74 68 65 20 69 73 43 6f 70 79 54 65 72 6d 20 70  the isCopyTerm p
13280 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65  arameter is true
13290 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66 66 65  , then the buffe
132a0 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a  r pointed to by.
132b0 20 20 2a 2a 20 7a 54 65 72 6d 20 69 73 20 74 72    ** zTerm is tr
132c0 61 6e 73 69 65 6e 74 2c 20 73 6f 20 74 61 6b 65  ansient, so take
132d0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 74   a copy of the t
132e0 65 72 6d 20 64 61 74 61 2e 20 4f 74 68 65 72 77  erm data. Otherw
132f0 69 73 65 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 73  ise, just.  ** s
13300 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20 74  tore a copy of t
13310 68 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f  he pointer..  */
13320 0a 20 20 69 66 28 20 69 73 43 6f 70 79 54 65 72  .  if( isCopyTer
13330 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 54 65  m ){.    if( nTe
13340 72 6d 3e 70 57 72 69 74 65 72 2d 3e 6e 4d 61 6c  rm>pWriter->nMal
13350 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 63 68 61  loc ){.      cha
13360 72 20 2a 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *zNew = sqlite
13370 33 5f 72 65 61 6c 6c 6f 63 28 70 57 72 69 74 65  3_realloc(pWrite
13380 72 2d 3e 7a 4d 61 6c 6c 6f 63 2c 20 6e 54 65 72  r->zMalloc, nTer
13390 6d 2a 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  m*2);.      if( 
133a0 21 7a 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20  !zNew ){.       
133b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
133c0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
133d0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 4d 61      pWriter->nMa
133e0 6c 6c 6f 63 20 3d 20 6e 54 65 72 6d 2a 32 3b 0a  lloc = nTerm*2;.
133f0 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 7a        pWriter->z
13400 4d 61 6c 6c 6f 63 20 3d 20 7a 4e 65 77 3b 0a 20  Malloc = zNew;. 
13410 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 7a 54       pWriter->zT
13420 65 72 6d 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20  erm = zNew;.    
13430 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  }.    assert( pW
13440 72 69 74 65 72 2d 3e 7a 54 65 72 6d 3d 3d 70 57  riter->zTerm==pW
13450 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c 6f 63 20 29  riter->zMalloc )
13460 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 57 72  ;.    memcpy(pWr
13470 69 74 65 72 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65  iter->zTerm, zTe
13480 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 7d 65  rm, nTerm);.  }e
13490 6c 73 65 7b 0a 20 20 20 20 70 57 72 69 74 65 72  lse{.    pWriter
134a0 2d 3e 7a 54 65 72 6d 20 3d 20 28 63 68 61 72 20  ->zTerm = (char 
134b0 2a 29 7a 54 65 72 6d 3b 0a 20 20 7d 0a 20 20 70  *)zTerm;.  }.  p
134c0 57 72 69 74 65 72 2d 3e 6e 54 65 72 6d 20 3d 20  Writer->nTerm = 
134d0 6e 54 65 72 6d 3b 0a 0a 20 20 72 65 74 75 72 6e  nTerm;..  return
134e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
134f0 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6c 6c 20 64  *.** Flush all d
13500 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
13510 69 74 68 20 74 68 65 20 53 65 67 6d 65 6e 74 57  ith the SegmentW
13520 72 69 74 65 72 20 6f 62 6a 65 63 74 20 70 57 72  riter object pWr
13530 69 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 64  iter to the.** d
13540 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 66 75  atabase. This fu
13550 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 63  nction must be c
13560 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6c 6c 20  alled after all 
13570 74 65 72 6d 73 20 68 61 76 65 20 62 65 65 6e 20  terms have been 
13580 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  added.** to the 
13590 73 65 67 6d 65 6e 74 20 75 73 69 6e 67 20 66 74  segment using ft
135a0 73 33 53 65 67 57 72 69 74 65 72 41 64 64 28 29  s3SegWriterAdd()
135b0 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
135c0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a   SQLITE_OK is.**
135d0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
135e0 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20  wise, an SQLite 
135f0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
13600 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65  tatic int fts3Se
13610 67 57 72 69 74 65 72 46 6c 75 73 68 28 0a 20 20  gWriterFlush(.  
13620 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
13630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13640 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  /* Virtual table
13650 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 65 67   handle */.  Seg
13660 6d 65 6e 74 57 72 69 74 65 72 20 2a 70 57 72 69  mentWriter *pWri
13670 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ter,         /* 
13680 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 74 6f  SegmentWriter to
13690 20 66 6c 75 73 68 20 74 6f 20 74 68 65 20 64 62   flush to the db
136a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
136b0 74 36 34 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  t64 iLevel,     
136c0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66        /* Value f
136d0 6f 72 20 27 6c 65 76 65 6c 27 20 63 6f 6c 75 6d  or 'level' colum
136e0 6e 20 6f 66 20 25 5f 73 65 67 64 69 72 20 2a 2f  n of %_segdir */
136f0 0a 20 20 69 6e 74 20 69 49 64 78 20 20 20 20 20  .  int iIdx     
13700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13710 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20     /* Value for 
13720 27 69 64 78 27 20 63 6f 6c 75 6d 6e 20 6f 66 20  'idx' column of 
13730 25 5f 73 65 67 64 69 72 20 2a 2f 0a 29 7b 0a 20  %_segdir */.){. 
13740 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
13750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13760 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
13770 2a 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  */.  if( pWriter
13780 2d 3e 70 54 72 65 65 20 29 7b 0a 20 20 20 20 73  ->pTree ){.    s
13790 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 61  qlite3_int64 iLa
137a0 73 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  st = 0;      /* 
137b0 4c 61 72 67 65 73 74 20 62 6c 6f 63 6b 20 69 64  Largest block id
137c0 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61   written to data
137d0 62 61 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  base */.    sqli
137e0 74 65 33 5f 69 6e 74 36 34 20 69 4c 61 73 74 4c  te3_int64 iLastL
137f0 65 61 66 3b 20 20 20 20 20 20 2f 2a 20 4c 61 72  eaf;      /* Lar
13800 67 65 73 74 20 6c 65 61 66 20 62 6c 6f 63 6b 20  gest leaf block 
13810 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20 64 62  id written to db
13820 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 52   */.    char *zR
13830 6f 6f 74 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20  oot = NULL;     
13840 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
13850 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
13860 69 6e 69 6e 67 20 72 6f 6f 74 20 6e 6f 64 65 20  ining root node 
13870 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 6f 6f 74  */.    int nRoot
13880 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
13890 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
138a0 62 75 66 66 65 72 20 7a 52 6f 6f 74 20 2a 2f 0a  buffer zRoot */.
138b0 0a 20 20 20 20 69 4c 61 73 74 4c 65 61 66 20 3d  .    iLastLeaf =
138c0 20 70 57 72 69 74 65 72 2d 3e 69 46 72 65 65 3b   pWriter->iFree;
138d0 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 57 72  .    rc = fts3Wr
138e0 69 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 57  iteSegment(p, pW
138f0 72 69 74 65 72 2d 3e 69 46 72 65 65 2b 2b 2c 20  riter->iFree++, 
13900 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 2c 20  pWriter->aData, 
13910 70 57 72 69 74 65 72 2d 3e 6e 44 61 74 61 29 3b  pWriter->nData);
13920 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
13930 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13940 72 63 20 3d 20 66 74 73 33 4e 6f 64 65 57 72 69  rc = fts3NodeWri
13950 74 65 28 70 2c 20 70 57 72 69 74 65 72 2d 3e 70  te(p, pWriter->p
13960 54 72 65 65 2c 20 31 2c 0a 20 20 20 20 20 20 20  Tree, 1,.       
13970 20 20 20 70 57 72 69 74 65 72 2d 3e 69 46 69 72     pWriter->iFir
13980 73 74 2c 20 70 57 72 69 74 65 72 2d 3e 69 46 72  st, pWriter->iFr
13990 65 65 2c 20 26 69 4c 61 73 74 2c 20 26 7a 52 6f  ee, &iLast, &zRo
139a0 6f 74 2c 20 26 6e 52 6f 6f 74 29 3b 0a 20 20 20  ot, &nRoot);.   
139b0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
139c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
139d0 20 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65    rc = fts3Write
139e0 53 65 67 64 69 72 28 70 2c 20 69 4c 65 76 65 6c  Segdir(p, iLevel
139f0 2c 20 69 49 64 78 2c 20 0a 20 20 20 20 20 20 20  , iIdx, .       
13a00 20 20 20 70 57 72 69 74 65 72 2d 3e 69 46 69 72     pWriter->iFir
13a10 73 74 2c 20 69 4c 61 73 74 4c 65 61 66 2c 20 69  st, iLastLeaf, i
13a20 4c 61 73 74 2c 20 70 57 72 69 74 65 72 2d 3e 6e  Last, pWriter->n
13a30 4c 65 61 66 44 61 74 61 2c 20 7a 52 6f 6f 74 2c  LeafData, zRoot,
13a40 20 6e 52 6f 6f 74 29 3b 0a 20 20 20 20 7d 0a 20   nRoot);.    }. 
13a50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
13a60 68 65 20 65 6e 74 69 72 65 20 74 72 65 65 20 66  he entire tree f
13a70 69 74 73 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20  its on the root 
13a80 6e 6f 64 65 2e 20 57 72 69 74 65 20 69 74 20 74  node. Write it t
13a90 6f 20 74 68 65 20 73 65 67 64 69 72 20 74 61 62  o the segdir tab
13aa0 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  le. */.    rc = 
13ab0 66 74 73 33 57 72 69 74 65 53 65 67 64 69 72 28  fts3WriteSegdir(
13ac0 70 2c 20 69 4c 65 76 65 6c 2c 20 69 49 64 78 2c  p, iLevel, iIdx,
13ad0 20 0a 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20   .        0, 0, 
13ae0 30 2c 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61  0, pWriter->nLea
13af0 66 44 61 74 61 2c 20 70 57 72 69 74 65 72 2d 3e  fData, pWriter->
13b00 61 44 61 74 61 2c 20 70 57 72 69 74 65 72 2d 3e  aData, pWriter->
13b10 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 70 2d  nData);.  }.  p-
13b20 3e 6e 4c 65 61 66 41 64 64 2b 2b 3b 0a 20 20 72  >nLeafAdd++;.  r
13b30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13b40 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6d  ** Release all m
13b50 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68  emory held by th
13b60 65 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20  e SegmentWriter 
13b70 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
13b80 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 61   the .** first a
13b90 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
13ba0 69 63 20 76 6f 69 64 20 66 74 73 33 53 65 67 57  ic void fts3SegW
13bb0 72 69 74 65 72 46 72 65 65 28 53 65 67 6d 65 6e  riterFree(Segmen
13bc0 74 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  tWriter *pWriter
13bd0 29 7b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  ){.  if( pWriter
13be0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
13bf0 66 72 65 65 28 70 57 72 69 74 65 72 2d 3e 61 44  free(pWriter->aD
13c00 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ata);.    sqlite
13c10 33 5f 66 72 65 65 28 70 57 72 69 74 65 72 2d 3e  3_free(pWriter->
13c20 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 66 74  zMalloc);.    ft
13c30 73 33 4e 6f 64 65 46 72 65 65 28 70 57 72 69 74  s3NodeFree(pWrit
13c40 65 72 2d 3e 70 54 72 65 65 29 3b 0a 20 20 20 20  er->pTree);.    
13c50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57 72  sqlite3_free(pWr
13c60 69 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  iter);.  }.}../*
13c70 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 76 61  .** The first va
13c80 6c 75 65 20 69 6e 20 74 68 65 20 61 70 56 61 6c  lue in the apVal
13c90 5b 5d 20 61 72 72 61 79 20 69 73 20 61 73 73 75  [] array is assu
13ca0 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61  med to contain a
13cb0 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 20 54 68  n integer..** Th
13cc0 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74  is function test
13cd0 73 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  s if there exist
13ce0 20 61 6e 79 20 64 6f 63 75 6d 65 6e 74 73 20 77   any documents w
13cf0 69 74 68 20 64 6f 63 69 64 20 76 61 6c 75 65 73  ith docid values
13d00 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 64 69 66   that.** are dif
13d10 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 61 74  ferent from that
13d20 20 69 6e 74 65 67 65 72 2e 20 69 2e 65 2e 20 69   integer. i.e. i
13d30 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 64  f deleting the d
13d40 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 64 6f 63  ocument with doc
13d50 69 64 0a 2a 2a 20 70 52 6f 77 69 64 20 77 6f 75  id.** pRowid wou
13d60 6c 64 20 6d 65 61 6e 20 74 68 65 20 46 54 53 33  ld mean the FTS3
13d70 20 74 61 62 6c 65 20 77 65 72 65 20 65 6d 70 74   table were empt
13d80 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  y..**.** If succ
13d90 65 73 73 66 75 6c 2c 20 2a 70 69 73 45 6d 70 74  essful, *pisEmpt
13da0 79 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  y is set to true
13db0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
13dc0 20 65 6d 70 74 79 20 65 78 63 65 70 74 20 66 6f   empty except fo
13dd0 72 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 20 70 52  r.** document pR
13de0 6f 77 69 64 2c 20 6f 72 20 66 61 6c 73 65 20 6f  owid, or false o
13df0 74 68 65 72 77 69 73 65 2c 20 61 6e 64 20 53 51  therwise, and SQ
13e00 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
13e10 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72  ned. If an.** er
13e20 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
13e30 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
13e40 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
13e50 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
13e60 49 73 45 6d 70 74 79 28 46 74 73 33 54 61 62 6c  IsEmpty(Fts3Tabl
13e70 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 61  e *p, sqlite3_va
13e80 6c 75 65 20 2a 70 52 6f 77 69 64 2c 20 69 6e 74  lue *pRowid, int
13e90 20 2a 70 69 73 45 6d 70 74 79 29 7b 0a 20 20 73   *pisEmpty){.  s
13ea0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
13eb0 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  mt;.  int rc;.  
13ec0 69 66 28 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54  if( p->zContentT
13ed0 62 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  bl ){.    /* If 
13ee0 75 73 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  using the conten
13ef0 74 3d 78 78 78 20 6f 70 74 69 6f 6e 2c 20 61 73  t=xxx option, as
13f00 73 75 6d 65 20 74 68 65 20 74 61 62 6c 65 20 69  sume the table i
13f10 73 20 6e 65 76 65 72 20 65 6d 70 74 79 20 2a 2f  s never empty */
13f20 0a 20 20 20 20 2a 70 69 73 45 6d 70 74 79 20 3d  .    *pisEmpty =
13f30 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   0;.    rc = SQL
13f40 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
13f50 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71  .    rc = fts3Sq
13f60 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 49 53 5f  lStmt(p, SQL_IS_
13f70 45 4d 50 54 59 2c 20 26 70 53 74 6d 74 2c 20 26  EMPTY, &pStmt, &
13f80 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28  pRowid);.    if(
13f90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
13fa0 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  {.      if( SQLI
13fb0 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
13fc0 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
13fd0 20 20 20 20 20 20 20 2a 70 69 73 45 6d 70 74 79         *pisEmpty
13fe0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
13ff0 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b  n_int(pStmt, 0);
14000 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
14010 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
14020 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a  t(pStmt);.    }.
14030 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
14040 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  .}../*.** Set *p
14050 6e 4d 61 78 20 74 6f 20 74 68 65 20 6c 61 72 67  nMax to the larg
14060 65 73 74 20 73 65 67 6d 65 6e 74 20 6c 65 76 65  est segment leve
14070 6c 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  l in the databas
14080 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a  e for the index.
14090 2a 2a 20 69 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  ** iIndex..**.**
140a0 20 53 65 67 6d 65 6e 74 20 6c 65 76 65 6c 73 20   Segment levels 
140b0 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
140c0 65 20 27 6c 65 76 65 6c 27 20 63 6f 6c 75 6d 6e  e 'level' column
140d0 20 6f 66 20 74 68 65 20 25 5f 73 65 67 64 69 72   of the %_segdir
140e0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   table..**.** Re
140f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
14100 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
14110 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
14120 20 63 6f 64 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f   code if not..*/
14130 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
14140 53 65 67 6d 65 6e 74 4d 61 78 4c 65 76 65 6c 28  SegmentMaxLevel(
14150 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
14160 20 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c   .  int iLangid,
14170 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 2c 20 0a  .  int iIndex, .
14180 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
14190 2a 70 6e 4d 61 78 0a 29 7b 0a 20 20 73 71 6c 69  *pnMax.){.  sqli
141a0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
141b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
141c0 65 72 74 28 20 69 49 6e 64 65 78 3e 3d 30 20 26  ert( iIndex>=0 &
141d0 26 20 69 49 6e 64 65 78 3c 70 2d 3e 6e 49 6e 64  & iIndex<p->nInd
141e0 65 78 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  ex );..  /* Set 
141f0 70 53 74 6d 74 20 74 6f 20 74 68 65 20 63 6f 6d  pStmt to the com
14200 70 69 6c 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  piled version of
14210 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45  :.  **.  **   SE
14220 4c 45 43 54 20 6d 61 78 28 6c 65 76 65 6c 29 20  LECT max(level) 
14230 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64  FROM %Q.'%q_segd
14240 69 72 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20  ir' WHERE level 
14250 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 0a  BETWEEN ? AND ?.
14260 20 20 2a 2a 0a 20 20 2a 2a 20 28 31 30 32 34 20    **.  ** (1024 
14270 69 73 20 61 63 74 75 61 6c 6c 79 20 74 68 65 20  is actually the 
14280 76 61 6c 75 65 20 6f 66 20 6d 61 63 72 6f 20 46  value of macro F
14290 54 53 33 5f 53 45 47 44 49 52 5f 50 52 45 46 49  TS3_SEGDIR_PREFI
142a0 58 4c 45 56 45 4c 5f 53 54 52 29 2e 0a 20 20 2a  XLEVEL_STR)..  *
142b0 2f 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  /.  rc = fts3Sql
142c0 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45  Stmt(p, SQL_SELE
142d0 43 54 5f 53 45 47 44 49 52 5f 4d 41 58 5f 4c 45  CT_SEGDIR_MAX_LE
142e0 56 45 4c 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  VEL, &pStmt, 0);
142f0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
14300 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
14310 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ;.  sqlite3_bind
14320 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 2c  _int64(pStmt, 1,
14330 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65   getAbsoluteLeve
14340 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49  l(p, iLangid, iI
14350 6e 64 65 78 2c 20 30 29 29 3b 0a 20 20 73 71 6c  ndex, 0));.  sql
14360 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
14370 70 53 74 6d 74 2c 20 32 2c 20 0a 20 20 20 20 20  pStmt, 2, .     
14380 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65   getAbsoluteLeve
14390 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49  l(p, iLangid, iI
143a0 6e 64 65 78 2c 20 46 54 53 33 5f 53 45 47 44 49  ndex, FTS3_SEGDI
143b0 52 5f 4d 41 58 4c 45 56 45 4c 2d 31 29 0a 20 20  R_MAXLEVEL-1).  
143c0 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
143d0 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
143e0 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
143f0 2a 70 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33  *pnMax = sqlite3
14400 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
14410 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  tmt, 0);.  }.  r
14420 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 72 65  eturn sqlite3_re
14430 73 65 74 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f  set(pStmt);.}../
14440 2a 0a 2a 2a 20 69 41 62 73 4c 65 76 65 6c 20 69  *.** iAbsLevel i
14450 73 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 6c 65  s an absolute le
14460 76 65 6c 20 74 68 61 74 20 6d 61 79 20 62 65 20  vel that may be 
14470 61 73 73 75 6d 65 64 20 74 6f 20 65 78 69 73 74  assumed to exist
14480 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 64   within.** the d
14490 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 66 75  atabase. This fu
144a0 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66  nction checks if
144b0 20 69 74 20 69 73 20 74 68 65 20 6c 61 72 67 65   it is the large
144c0 73 74 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 0a  st level number.
144d0 2a 2a 20 77 69 74 68 69 6e 20 69 74 73 20 69 6e  ** within its in
144e0 64 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f  dex. Assuming no
144f0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
14500 70 62 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20  pbMax is set to 
14510 31 20 69 66 0a 2a 2a 20 69 41 62 73 4c 65 76 65  1 if.** iAbsLeve
14520 6c 20 69 73 20 69 6e 64 65 65 64 20 74 68 65 20  l is indeed the 
14530 6c 61 72 67 65 73 74 20 6c 65 76 65 6c 2c 20 6f  largest level, o
14540 72 20 30 20 6f 74 68 65 72 77 69 73 65 2c 20 61  r 0 otherwise, a
14550 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  nd SQLITE_OK.** 
14560 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
14570 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
14580 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
14590 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
145a0 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 76 61 6c 75  he.** final valu
145b0 65 20 6f 66 20 2a 70 62 4d 61 78 20 69 73 20 75  e of *pbMax is u
145c0 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
145d0 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 6d  tic int fts3Segm
145e0 65 6e 74 49 73 4d 61 78 4c 65 76 65 6c 28 46 74  entIsMaxLevel(Ft
145f0 73 33 54 61 62 6c 65 20 2a 70 2c 20 69 36 34 20  s3Table *p, i64 
14600 69 41 62 73 4c 65 76 65 6c 2c 20 69 6e 74 20 2a  iAbsLevel, int *
14610 70 62 4d 61 78 29 7b 0a 0a 20 20 2f 2a 20 53 65  pbMax){..  /* Se
14620 74 20 70 53 74 6d 74 20 74 6f 20 74 68 65 20 63  t pStmt to the c
14630 6f 6d 70 69 6c 65 64 20 76 65 72 73 69 6f 6e 20  ompiled version 
14640 6f 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  of:.  **.  **   
14650 53 45 4c 45 43 54 20 6d 61 78 28 6c 65 76 65 6c  SELECT max(level
14660 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65  ) FROM %Q.'%q_se
14670 67 64 69 72 27 20 57 48 45 52 45 20 6c 65 76 65  gdir' WHERE leve
14680 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20  l BETWEEN ? AND 
14690 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 31 30 32  ?.  **.  ** (102
146a0 34 20 69 73 20 61 63 74 75 61 6c 6c 79 20 74 68  4 is actually th
146b0 65 20 76 61 6c 75 65 20 6f 66 20 6d 61 63 72 6f  e value of macro
146c0 20 46 54 53 33 5f 53 45 47 44 49 52 5f 50 52 45   FTS3_SEGDIR_PRE
146d0 46 49 58 4c 45 56 45 4c 5f 53 54 52 29 2e 0a 20  FIXLEVEL_STR).. 
146e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
146f0 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
14700 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
14710 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f  t(p, SQL_SELECT_
14720 53 45 47 44 49 52 5f 4d 41 58 5f 4c 45 56 45 4c  SEGDIR_MAX_LEVEL
14730 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
14740 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14750 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
14760 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
14770 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 69 41  t64(pStmt, 1, iA
14780 62 73 4c 65 76 65 6c 2b 31 29 3b 0a 20 20 73 71  bsLevel+1);.  sq
14790 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
147a0 28 70 53 74 6d 74 2c 20 32 2c 20 0a 20 20 20 20  (pStmt, 2, .    
147b0 20 20 28 28 69 41 62 73 4c 65 76 65 6c 2f 46 54    ((iAbsLevel/FT
147c0 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56  S3_SEGDIR_MAXLEV
147d0 45 4c 29 2b 31 29 20 2a 20 46 54 53 33 5f 53 45  EL)+1) * FTS3_SE
147e0 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 0a 20 20  GDIR_MAXLEVEL.  
147f0 29 3b 0a 0a 20 20 2a 70 62 4d 61 78 20 3d 20 30  );..  *pbMax = 0
14800 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52  ;.  if( SQLITE_R
14810 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
14820 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 2a  (pStmt) ){.    *
14830 70 62 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 5f  pbMax = sqlite3_
14840 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d  column_type(pStm
14850 74 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4e 55  t, 0)==SQLITE_NU
14860 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  LL;.  }.  return
14870 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
14880 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Stmt);.}../*.** 
14890 44 65 6c 65 74 65 20 61 6c 6c 20 65 6e 74 72 69  Delete all entri
148a0 65 73 20 69 6e 20 74 68 65 20 25 5f 73 65 67 6d  es in the %_segm
148b0 65 6e 74 73 20 74 61 62 6c 65 20 61 73 73 6f 63  ents table assoc
148c0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 73  iated with the s
148d0 65 67 6d 65 6e 74 0a 2a 2a 20 6f 70 65 6e 65 64  egment.** opened
148e0 20 77 69 74 68 20 73 65 67 2d 72 65 61 64 65 72   with seg-reader
148f0 20 70 53 65 67 2e 20 54 68 69 73 20 66 75 6e 63   pSeg. This func
14900 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 66  tion does not af
14910 66 65 63 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  fect the content
14920 73 0a 2a 2a 20 6f 66 20 74 68 65 20 25 5f 73 65  s.** of the %_se
14930 67 64 69 72 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  gdir table..*/.s
14940 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 44 65  tatic int fts3De
14950 6c 65 74 65 53 65 67 6d 65 6e 74 28 0a 20 20 46  leteSegment(.  F
14960 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
14970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14980 2a 20 46 54 53 20 74 61 62 6c 65 20 68 61 6e 64  * FTS table hand
14990 6c 65 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 52  le */.  Fts3SegR
149a0 65 61 64 65 72 20 2a 70 53 65 67 20 20 20 20 20  eader *pSeg     
149b0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65          /* Segme
149c0 6e 74 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  nt to delete */.
149d0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
149e0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
149f0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
14a00 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 65  ode */.  if( pSe
14a10 67 2d 3e 69 53 74 61 72 74 42 6c 6f 63 6b 20 29  g->iStartBlock )
14a20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
14a30 6d 74 20 2a 70 44 65 6c 65 74 65 3b 20 20 20 20  mt *pDelete;    
14a40 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65      /* SQL state
14a50 6d 65 6e 74 20 74 6f 20 64 65 6c 65 74 65 20 72  ment to delete r
14a60 6f 77 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ows */.    rc = 
14a70 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
14a80 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 4d 45 4e  QL_DELETE_SEGMEN
14a90 54 53 5f 52 41 4e 47 45 2c 20 26 70 44 65 6c 65  TS_RANGE, &pDele
14aa0 74 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  te, 0);.    if( 
14ab0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14ac0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
14ad0 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c 65 74  ind_int64(pDelet
14ae0 65 2c 20 31 2c 20 70 53 65 67 2d 3e 69 53 74 61  e, 1, pSeg->iSta
14af0 72 74 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  rtBlock);.      
14b00 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
14b10 36 34 28 70 44 65 6c 65 74 65 2c 20 32 2c 20 70  64(pDelete, 2, p
14b20 53 65 67 2d 3e 69 45 6e 64 42 6c 6f 63 6b 29 3b  Seg->iEndBlock);
14b30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
14b40 74 65 70 28 70 44 65 6c 65 74 65 29 3b 0a 20 20  tep(pDelete);.  
14b50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14b60 5f 72 65 73 65 74 28 70 44 65 6c 65 74 65 29 3b  _reset(pDelete);
14b70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
14b80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
14b90 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
14ba0 73 20 75 73 65 64 20 61 66 74 65 72 20 6d 65 72  s used after mer
14bb0 67 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 73 65  ging multiple se
14bc0 67 6d 65 6e 74 73 20 69 6e 74 6f 20 61 20 73 69  gments into a si
14bd0 6e 67 6c 65 20 6c 61 72 67 65 0a 2a 2a 20 73 65  ngle large.** se
14be0 67 6d 65 6e 74 20 74 6f 20 64 65 6c 65 74 65 20  gment to delete 
14bf0 74 68 65 20 6f 6c 64 2c 20 6e 6f 77 20 72 65 64  the old, now red
14c00 75 6e 64 61 6e 74 2c 20 73 65 67 6d 65 6e 74 20  undant, segment 
14c10 62 2d 74 72 65 65 73 2e 20 53 70 65 63 69 66 69  b-trees. Specifi
14c20 63 61 6c 6c 79 2c 0a 2a 2a 20 69 74 3a 0a 2a 2a  cally,.** it:.**
14c30 20 0a 2a 2a 20 20 20 31 29 20 44 65 6c 65 74 65   .**   1) Delete
14c40 73 20 61 6c 6c 20 25 5f 73 65 67 6d 65 6e 74 73  s all %_segments
14c50 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
14c60 20 73 65 67 6d 65 6e 74 73 20 61 73 73 6f 63 69   segments associ
14c70 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 20 20  ated with .**   
14c80 20 20 20 65 61 63 68 20 6f 66 20 74 68 65 20 53     each of the S
14c90 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74 73  egReader objects
14ca0 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 70 61   in the array pa
14cb0 73 73 65 64 20 61 73 20 74 68 65 20 74 68 69 72  ssed as the thir
14cc0 64 20 0a 2a 2a 20 20 20 20 20 20 61 72 67 75 6d  d .**      argum
14cd0 65 6e 74 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ent, and.**.**  
14ce0 20 32 29 20 64 65 6c 65 74 65 73 20 61 6c 6c 20   2) deletes all 
14cf0 25 5f 73 65 67 64 69 72 20 65 6e 74 72 69 65 73  %_segdir entries
14d00 20 77 69 74 68 20 6c 65 76 65 6c 20 69 4c 65 76   with level iLev
14d10 65 6c 2c 20 6f 72 20 61 6c 6c 20 25 5f 73 65 67  el, or all %_seg
14d20 64 69 72 0a 2a 2a 20 20 20 20 20 20 65 6e 74 72  dir.**      entr
14d30 69 65 73 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ies regardless o
14d40 66 20 6c 65 76 65 6c 20 69 66 20 28 69 4c 65 76  f level if (iLev
14d50 65 6c 3c 30 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  el<0)..**.** SQL
14d60 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
14d70 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ed if successful
14d80 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 53  , otherwise an S
14d90 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
14da0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14db0 66 74 73 33 44 65 6c 65 74 65 53 65 67 64 69 72  fts3DeleteSegdir
14dc0 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
14dd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14de0 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74      /* Virtual t
14df0 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
14e00 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20 20   int iLangid,   
14e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64 20   /* Language id 
14e30 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 2c  */.  int iIndex,
14e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e50 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f       /* Index fo
14e60 72 20 70 2d 3e 61 49 6e 64 65 78 20 2a 2f 0a 20  r p->aIndex */. 
14e70 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20   int iLevel,    
14e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e90 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 20 25 5f 73   /* Level of %_s
14ea0 65 67 64 69 72 20 65 6e 74 72 69 65 73 20 74 6f  egdir entries to
14eb0 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 46 74 73   delete */.  Fts
14ec0 33 53 65 67 52 65 61 64 65 72 20 2a 2a 61 70 53  3SegReader **apS
14ed0 65 67 6d 65 6e 74 2c 20 20 20 20 20 20 2f 2a 20  egment,      /* 
14ee0 41 72 72 61 79 20 6f 66 20 53 65 67 52 65 61 64  Array of SegRead
14ef0 65 72 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  er objects */.  
14f00 69 6e 74 20 6e 52 65 61 64 65 72 20 20 20 20 20  int nReader     
14f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79  /* Size of array
14f30 20 61 70 53 65 67 6d 65 6e 74 20 2a 2f 0a 29 7b   apSegment */.){
14f40 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14f50 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
14f60 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
14f70 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
14f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f90 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
14fa0 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
14fb0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
14fc0 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20  Delete = 0;     
14fd0 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   /* SQL statemen
14fe0 74 20 74 6f 20 64 65 6c 65 74 65 20 72 6f 77 73  t to delete rows
14ff0 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   */..  for(i=0; 
15000 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
15010 20 69 3c 6e 52 65 61 64 65 72 3b 20 69 2b 2b 29   i<nReader; i++)
15020 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 44  {.    rc = fts3D
15030 65 6c 65 74 65 53 65 67 6d 65 6e 74 28 70 2c 20  eleteSegment(p, 
15040 61 70 53 65 67 6d 65 6e 74 5b 69 5d 29 3b 0a 20  apSegment[i]);. 
15050 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
15060 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
15070 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
15080 61 73 73 65 72 74 28 20 69 4c 65 76 65 6c 3e 3d  assert( iLevel>=
15090 30 20 7c 7c 20 69 4c 65 76 65 6c 3d 3d 46 54 53  0 || iLevel==FTS
150a0 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c 20  3_SEGCURSOR_ALL 
150b0 29 3b 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3d  );.  if( iLevel=
150c0 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f  =FTS3_SEGCURSOR_
150d0 41 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ALL ){.    rc = 
150e0 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
150f0 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 44 49 52  QL_DELETE_SEGDIR
15100 5f 52 41 4e 47 45 2c 20 26 70 44 65 6c 65 74 65  _RANGE, &pDelete
15110 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
15120 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15130 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
15140 64 5f 69 6e 74 36 34 28 70 44 65 6c 65 74 65 2c  d_int64(pDelete,
15150 20 31 2c 20 67 65 74 41 62 73 6f 6c 75 74 65 4c   1, getAbsoluteL
15160 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c  evel(p, iLangid,
15170 20 69 49 6e 64 65 78 2c 20 30 29 29 3b 0a 20 20   iIndex, 0));.  
15180 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
15190 5f 69 6e 74 36 34 28 70 44 65 6c 65 74 65 2c 20  _int64(pDelete, 
151a0 32 2c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  2, .          ge
151b0 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70  tAbsoluteLevel(p
151c0 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
151d0 78 2c 20 46 54 53 33 5f 53 45 47 44 49 52 5f 4d  x, FTS3_SEGDIR_M
151e0 41 58 4c 45 56 45 4c 2d 31 29 0a 20 20 20 20 20  AXLEVEL-1).     
151f0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   );.    }.  }els
15200 65 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  e{.    rc = fts3
15210 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 44  SqlStmt(p, SQL_D
15220 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 4c 45 56  ELETE_SEGDIR_LEV
15230 45 4c 2c 20 26 70 44 65 6c 65 74 65 2c 20 30 29  EL, &pDelete, 0)
15240 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
15250 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15260 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
15270 74 36 34 28 0a 20 20 20 20 20 20 20 20 20 20 70  t64(.          p
15280 44 65 6c 65 74 65 2c 20 31 2c 20 67 65 74 41 62  Delete, 1, getAb
15290 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69  soluteLevel(p, i
152a0 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20  Langid, iIndex, 
152b0 69 4c 65 76 65 6c 29 0a 20 20 20 20 20 20 29 3b  iLevel).      );
152c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
152d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
152e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
152f0 74 65 70 28 70 44 65 6c 65 74 65 29 3b 0a 20 20  tep(pDelete);.  
15300 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
15310 65 73 65 74 28 70 44 65 6c 65 74 65 29 3b 0a 20  eset(pDelete);. 
15320 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
15330 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  .}../*.** When t
15340 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
15350 63 61 6c 6c 65 64 2c 20 62 75 66 66 65 72 20 2a  called, buffer *
15360 70 70 4c 69 73 74 20 28 73 69 7a 65 20 2a 70 6e  ppList (size *pn
15370 4c 69 73 74 20 62 79 74 65 73 29 20 63 6f 6e 74  List bytes) cont
15380 61 69 6e 73 20 0a 2a 2a 20 61 20 70 6f 73 69 74  ains .** a posit
15390 69 6f 6e 20 6c 69 73 74 20 74 68 61 74 20 6d 61  ion list that ma
153a0 79 20 28 6f 72 20 6d 61 79 20 6e 6f 74 29 20 66  y (or may not) f
153b0 65 61 74 75 72 65 20 6d 75 6c 74 69 70 6c 65 20  eature multiple 
153c0 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 0a 2a 2a  columns. This.**
153d0 20 66 75 6e 63 74 69 6f 6e 20 61 64 6a 75 73 74   function adjust
153e0 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 2a 70  s the pointer *p
153f0 70 4c 69 73 74 20 61 6e 64 20 74 68 65 20 6c 65  pList and the le
15400 6e 67 74 68 20 2a 70 6e 4c 69 73 74 20 73 6f 20  ngth *pnList so 
15410 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 69 64 65  that they.** ide
15420 6e 74 69 66 79 20 74 68 65 20 73 75 62 73 65 74  ntify the subset
15430 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   of the position
15440 20 6c 69 73 74 20 74 68 61 74 20 63 6f 72 72 65   list that corre
15450 73 70 6f 6e 64 73 20 74 6f 20 63 6f 6c 75 6d 6e  sponds to column
15460 20 69 43 6f 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   iCol..**.** If 
15470 74 68 65 72 65 20 61 72 65 20 6e 6f 20 65 6e 74  there are no ent
15480 72 69 65 73 20 69 6e 20 74 68 65 20 69 6e 70 75  ries in the inpu
15490 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  t position list 
154a0 66 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c  for column iCol,
154b0 20 74 68 65 6e 0a 2a 2a 20 2a 70 6e 4c 69 73 74   then.** *pnList
154c0 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20   is set to zero 
154d0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
154e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
154f0 65 74 65 72 20 62 5a 65 72 6f 20 69 73 20 6e 6f  eter bZero is no
15500 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  n-zero, then any
15510 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 70   part of the inp
15520 75 74 20 6c 69 73 74 20 66 6f 6c 6c 6f 77 69 6e  ut list followin
15530 67 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20  g.** the end of 
15540 74 68 65 20 6f 75 74 70 75 74 20 6c 69 73 74 20  the output list 
15550 69 73 20 7a 65 72 6f 65 64 20 62 65 66 6f 72 65  is zeroed before
15560 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
15570 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 43  tatic void fts3C
15580 6f 6c 75 6d 6e 46 69 6c 74 65 72 28 0a 20 20 69  olumnFilter(.  i
15590 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
155a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
155b0 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 66 69 6c 74  * Column to filt
155c0 65 72 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62  er on */.  int b
155d0 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Zero,           
155e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65             /* Ze
155f0 72 6f 20 6f 75 74 20 61 6e 79 74 68 69 6e 67 20  ro out anything 
15600 66 6f 6c 6c 6f 77 69 6e 67 20 2a 70 70 4c 69 73  following *ppLis
15610 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70  t */.  char **pp
15620 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
15630 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
15640 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73  : Pointer to pos
15650 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20  ition list */.  
15660 69 6e 74 20 2a 70 6e 4c 69 73 74 20 20 20 20 20  int *pnList     
15670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15680 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 69 7a 65 20  /* IN/OUT: Size 
15690 6f 66 20 62 75 66 66 65 72 20 2a 70 70 4c 69 73  of buffer *ppLis
156a0 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b  t in bytes */.){
156b0 0a 20 20 63 68 61 72 20 2a 70 4c 69 73 74 20 3d  .  char *pList =
156c0 20 2a 70 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20   *ppList;.  int 
156d0 6e 4c 69 73 74 20 3d 20 2a 70 6e 4c 69 73 74 3b  nList = *pnList;
156e0 0a 20 20 63 68 61 72 20 2a 70 45 6e 64 20 3d 20  .  char *pEnd = 
156f0 26 70 4c 69 73 74 5b 6e 4c 69 73 74 5d 3b 0a 20  &pList[nList];. 
15700 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20   int iCurrent = 
15710 30 3b 0a 20 20 63 68 61 72 20 2a 70 20 3d 20 70  0;.  char *p = p
15720 4c 69 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  List;..  assert(
15730 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 77 68   iCol>=0 );.  wh
15740 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 63 68  ile( 1 ){.    ch
15750 61 72 20 63 20 3d 20 30 3b 0a 20 20 20 20 77 68  ar c = 0;.    wh
15760 69 6c 65 28 20 70 3c 70 45 6e 64 20 26 26 20 28  ile( p<pEnd && (
15770 63 20 7c 20 2a 70 29 26 30 78 46 45 20 29 20 63  c | *p)&0xFE ) c
15780 20 3d 20 2a 70 2b 2b 20 26 20 30 78 38 30 3b 0a   = *p++ & 0x80;.
15790 20 20 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d    .    if( iCol=
157a0 3d 69 43 75 72 72 65 6e 74 20 29 7b 0a 20 20 20  =iCurrent ){.   
157b0 20 20 20 6e 4c 69 73 74 20 3d 20 28 69 6e 74 29     nList = (int)
157c0 28 70 20 2d 20 70 4c 69 73 74 29 3b 0a 20 20 20  (p - pList);.   
157d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
157e0 0a 20 20 20 20 6e 4c 69 73 74 20 2d 3d 20 28 69  .    nList -= (i
157f0 6e 74 29 28 70 20 2d 20 70 4c 69 73 74 29 3b 0a  nt)(p - pList);.
15800 20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20      pList = p;. 
15810 20 20 20 69 66 28 20 6e 4c 69 73 74 3d 3d 30 20     if( nList==0 
15820 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
15830 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 26 70      }.    p = &p
15840 4c 69 73 74 5b 31 5d 3b 0a 20 20 20 20 70 20 2b  List[1];.    p +
15850 3d 20 66 74 73 33 47 65 74 56 61 72 69 6e 74 33  = fts3GetVarint3
15860 32 28 70 2c 20 26 69 43 75 72 72 65 6e 74 29 3b  2(p, &iCurrent);
15870 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 5a 65 72  .  }..  if( bZer
15880 6f 20 26 26 20 26 70 4c 69 73 74 5b 6e 4c 69 73  o && &pList[nLis
15890 74 5d 21 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20  t]!=pEnd ){.    
158a0 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 5b 6e 4c  memset(&pList[nL
158b0 69 73 74 5d 2c 20 30 2c 20 70 45 6e 64 20 2d 20  ist], 0, pEnd - 
158c0 26 70 4c 69 73 74 5b 6e 4c 69 73 74 5d 29 3b 0a  &pList[nList]);.
158d0 20 20 7d 0a 20 20 2a 70 70 4c 69 73 74 20 3d 20    }.  *ppList = 
158e0 70 4c 69 73 74 3b 0a 20 20 2a 70 6e 4c 69 73 74  pList;.  *pnList
158f0 20 3d 20 6e 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a   = nList;.}../*.
15900 2a 2a 20 43 61 63 68 65 20 64 61 74 61 20 69 6e  ** Cache data in
15910 20 74 68 65 20 46 74 73 33 4d 75 6c 74 69 53 65   the Fts3MultiSe
15920 67 52 65 61 64 65 72 2e 61 42 75 66 66 65 72 5b  gReader.aBuffer[
15930 5d 20 62 75 66 66 65 72 20 28 6f 76 65 72 77 72  ] buffer (overwr
15940 69 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 65 78 69  iting any.** exi
15950 73 74 69 6e 67 20 64 61 74 61 29 2e 20 47 72 6f  sting data). Gro
15960 77 20 74 68 65 20 62 75 66 66 65 72 20 69 66 20  w the buffer if 
15970 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  required..**.** 
15980 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  If successful, r
15990 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
159a0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
159b0 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65  n OOM error is e
159c0 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2a 20 74 72  ncountered.** tr
159d0 79 69 6e 67 20 74 6f 20 72 65 73 69 7a 65 20 74  ying to resize t
159e0 68 65 20 62 75 66 66 65 72 2c 20 72 65 74 75 72  he buffer, retur
159f0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a  n SQLITE_NOMEM..
15a00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
15a10 73 33 4d 73 72 42 75 66 66 65 72 44 61 74 61 28  s3MsrBufferData(
15a20 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52  .  Fts3MultiSegR
15a30 65 61 64 65 72 20 2a 70 4d 73 72 2c 20 20 20 20  eader *pMsr,    
15a40 20 20 20 2f 2a 20 4d 75 6c 74 69 2d 73 65 67 6d     /* Multi-segm
15a50 65 6e 74 2d 72 65 61 64 65 72 20 68 61 6e 64 6c  ent-reader handl
15a60 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 4c 69  e */.  char *pLi
15a70 73 74 2c 0a 20 20 69 6e 74 20 6e 4c 69 73 74 0a  st,.  int nList.
15a80 29 7b 0a 20 20 69 66 28 20 6e 4c 69 73 74 3e 70  ){.  if( nList>p
15a90 4d 73 72 2d 3e 6e 42 75 66 66 65 72 20 29 7b 0a  Msr->nBuffer ){.
15aa0 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 3b 0a      char *pNew;.
15ab0 20 20 20 20 70 4d 73 72 2d 3e 6e 42 75 66 66 65      pMsr->nBuffe
15ac0 72 20 3d 20 6e 4c 69 73 74 2a 32 3b 0a 20 20 20  r = nList*2;.   
15ad0 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29   pNew = (char *)
15ae0 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
15af0 70 4d 73 72 2d 3e 61 42 75 66 66 65 72 2c 20 70  pMsr->aBuffer, p
15b00 4d 73 72 2d 3e 6e 42 75 66 66 65 72 29 3b 0a 20  Msr->nBuffer);. 
15b10 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 20 72     if( !pNew ) r
15b20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
15b30 45 4d 3b 0a 20 20 20 20 70 4d 73 72 2d 3e 61 42  EM;.    pMsr->aB
15b40 75 66 66 65 72 20 3d 20 70 4e 65 77 3b 0a 20 20  uffer = pNew;.  
15b50 7d 0a 0a 20 20 6d 65 6d 63 70 79 28 70 4d 73 72  }..  memcpy(pMsr
15b60 2d 3e 61 42 75 66 66 65 72 2c 20 70 4c 69 73 74  ->aBuffer, pList
15b70 2c 20 6e 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  , nList);.  retu
15b80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
15b90 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
15ba0 4d 73 72 49 6e 63 72 4e 65 78 74 28 0a 20 20 46  MsrIncrNext(.  F
15bb0 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
15bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15bd0 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * Virtual table 
15be0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33  handle */.  Fts3
15bf0 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a  MultiSegReader *
15c00 70 4d 73 72 2c 20 20 20 20 20 20 20 2f 2a 20 4d  pMsr,       /* M
15c10 75 6c 74 69 2d 73 65 67 6d 65 6e 74 2d 72 65 61  ulti-segment-rea
15c20 64 65 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  der handle */.  
15c30 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
15c40 69 44 6f 63 69 64 2c 20 20 20 20 20 20 20 20 20  iDocid,         
15c50 2f 2a 20 4f 55 54 3a 20 44 6f 63 69 64 20 76 61  /* OUT: Docid va
15c60 6c 75 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  lue */.  char **
15c70 70 61 50 6f 73 6c 69 73 74 2c 20 20 20 20 20 20  paPoslist,      
15c80 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
15c90 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73 69   Pointer to posi
15ca0 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 69  tion list */.  i
15cb0 6e 74 20 2a 70 6e 50 6f 73 6c 69 73 74 20 20 20  nt *pnPoslist   
15cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15cd0 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 70  * OUT: Size of p
15ce0 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 69 6e 20  osition list in 
15cf0 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  bytes */.){.  in
15d00 74 20 6e 4d 65 72 67 65 20 3d 20 70 4d 73 72 2d  t nMerge = pMsr-
15d10 3e 6e 41 64 76 61 6e 63 65 3b 0a 20 20 46 74 73  >nAdvance;.  Fts
15d20 33 53 65 67 52 65 61 64 65 72 20 2a 2a 61 70 53  3SegReader **apS
15d30 65 67 6d 65 6e 74 20 3d 20 70 4d 73 72 2d 3e 61  egment = pMsr->a
15d40 70 53 65 67 6d 65 6e 74 3b 0a 20 20 69 6e 74 20  pSegment;.  int 
15d50 28 2a 78 43 6d 70 29 28 46 74 73 33 53 65 67 52  (*xCmp)(Fts3SegR
15d60 65 61 64 65 72 20 2a 2c 20 46 74 73 33 53 65 67  eader *, Fts3Seg
15d70 52 65 61 64 65 72 20 2a 29 20 3d 20 28 0a 20 20  Reader *) = (.  
15d80 20 20 70 2d 3e 62 44 65 73 63 49 64 78 20 3f 20    p->bDescIdx ? 
15d90 66 74 73 33 53 65 67 52 65 61 64 65 72 44 6f 63  fts3SegReaderDoc
15da0 6c 69 73 74 43 6d 70 52 65 76 20 3a 20 66 74 73  listCmpRev : fts
15db0 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73  3SegReaderDoclis
15dc0 74 43 6d 70 0a 20 20 29 3b 0a 0a 20 20 69 66 28  tCmp.  );..  if(
15dd0 20 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20   nMerge==0 ){.  
15de0 20 20 2a 70 61 50 6f 73 6c 69 73 74 20 3d 20 30    *paPoslist = 0
15df0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
15e00 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 77  ITE_OK;.  }..  w
15e10 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 46  hile( 1 ){.    F
15e20 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 53  ts3SegReader *pS
15e30 65 67 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 70  eg;.    pSeg = p
15e40 4d 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 30  Msr->apSegment[0
15e50 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 65 67  ];..    if( pSeg
15e60 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30  ->pOffsetList==0
15e70 20 29 7b 0a 20 20 20 20 20 20 2a 70 61 50 6f 73   ){.      *paPos
15e80 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  list = 0;.      
15e90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  break;.    }else
15ea0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  {.      int rc;.
15eb0 20 20 20 20 20 20 63 68 61 72 20 2a 70 4c 69 73        char *pLis
15ec0 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69  t;.      int nLi
15ed0 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  st;.      int j;
15ee0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
15ef0 6e 74 36 34 20 69 44 6f 63 69 64 20 3d 20 61 70  nt64 iDocid = ap
15f00 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 69 44 6f 63  Segment[0]->iDoc
15f10 69 64 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20  id;..      rc = 
15f20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 78  fts3SegReaderNex
15f30 74 44 6f 63 69 64 28 70 2c 20 61 70 53 65 67 6d  tDocid(p, apSegm
15f40 65 6e 74 5b 30 5d 2c 20 26 70 4c 69 73 74 2c 20  ent[0], &pList, 
15f50 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 6a  &nList);.      j
15f60 20 3d 20 31 3b 0a 20 20 20 20 20 20 77 68 69 6c   = 1;.      whil
15f70 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
15f80 20 0a 20 20 20 20 20 20 20 20 26 26 20 6a 3c 6e   .        && j<n
15f90 4d 65 72 67 65 0a 20 20 20 20 20 20 20 20 26 26  Merge.        &&
15fa0 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2d 3e 70   apSegment[j]->p
15fb0 4f 66 66 73 65 74 4c 69 73 74 0a 20 20 20 20 20  OffsetList.     
15fc0 20 20 20 26 26 20 61 70 53 65 67 6d 65 6e 74 5b     && apSegment[
15fd0 6a 5d 2d 3e 69 44 6f 63 69 64 3d 3d 69 44 6f 63  j]->iDocid==iDoc
15fe0 69 64 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  id.      ){.    
15ff0 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67      rc = fts3Seg
16000 52 65 61 64 65 72 4e 65 78 74 44 6f 63 69 64 28  ReaderNextDocid(
16010 70 2c 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2c  p, apSegment[j],
16020 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
16030 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  j++;.      }.   
16040 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16050 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
16060 3b 0a 20 20 20 20 20 20 66 74 73 33 53 65 67 52  ;.      fts3SegR
16070 65 61 64 65 72 53 6f 72 74 28 70 4d 73 72 2d 3e  eaderSort(pMsr->
16080 61 70 53 65 67 6d 65 6e 74 2c 20 6e 4d 65 72 67  apSegment, nMerg
16090 65 2c 20 6a 2c 20 78 43 6d 70 29 3b 0a 0a 20 20  e, j, xCmp);..  
160a0 20 20 20 20 69 66 28 20 6e 4c 69 73 74 3e 30 20      if( nList>0 
160b0 26 26 20 66 74 73 33 53 65 67 52 65 61 64 65 72  && fts3SegReader
160c0 49 73 50 65 6e 64 69 6e 67 28 61 70 53 65 67 6d  IsPending(apSegm
160d0 65 6e 74 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  ent[0]) ){.     
160e0 20 20 20 72 63 20 3d 20 66 74 73 33 4d 73 72 42     rc = fts3MsrB
160f0 75 66 66 65 72 44 61 74 61 28 70 4d 73 72 2c 20  ufferData(pMsr, 
16100 70 4c 69 73 74 2c 20 6e 4c 69 73 74 2b 31 29 3b  pList, nList+1);
16110 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
16120 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
16130 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
16140 61 73 73 65 72 74 28 20 28 70 4d 73 72 2d 3e 61  assert( (pMsr->a
16150 42 75 66 66 65 72 5b 6e 4c 69 73 74 5d 20 26 20  Buffer[nList] & 
16160 30 78 46 45 29 3d 3d 30 78 30 30 20 29 3b 0a 20  0xFE)==0x00 );. 
16170 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70         pList = p
16180 4d 73 72 2d 3e 61 42 75 66 66 65 72 3b 0a 20 20  Msr->aBuffer;.  
16190 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
161a0 20 70 4d 73 72 2d 3e 69 43 6f 6c 46 69 6c 74 65   pMsr->iColFilte
161b0 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r>=0 ){.        
161c0 66 74 73 33 43 6f 6c 75 6d 6e 46 69 6c 74 65 72  fts3ColumnFilter
161d0 28 70 4d 73 72 2d 3e 69 43 6f 6c 46 69 6c 74 65  (pMsr->iColFilte
161e0 72 2c 20 31 2c 20 26 70 4c 69 73 74 2c 20 26 6e  r, 1, &pList, &n
161f0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  List);.      }..
16200 20 20 20 20 20 20 69 66 28 20 6e 4c 69 73 74 3e        if( nList>
16210 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 61  0 ){.        *pa
16220 50 6f 73 6c 69 73 74 20 3d 20 70 4c 69 73 74 3b  Poslist = pList;
16230 0a 20 20 20 20 20 20 20 20 2a 70 69 44 6f 63 69  .        *piDoci
16240 64 20 3d 20 69 44 6f 63 69 64 3b 0a 20 20 20 20  d = iDocid;.    
16250 20 20 20 20 2a 70 6e 50 6f 73 6c 69 73 74 20 3d      *pnPoslist =
16260 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20   nList;.        
16270 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
16280 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
16290 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
162a0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
162b0 53 65 67 52 65 61 64 65 72 53 74 61 72 74 28 0a  SegReaderStart(.
162c0 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
162d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162e0 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
162f0 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46  le handle */.  F
16300 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
16310 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 2f  r *pCsr,       /
16320 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  * Cursor object 
16330 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
16340 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  *zTerm,         
16350 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 73 65 61       /* Term sea
16360 72 63 68 65 64 20 66 6f 72 20 28 6f 72 20 4e 55  rched for (or NU
16370 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  LL) */.  int nTe
16380 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rm              
16390 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
163a0 74 68 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62  th of zTerm in b
163b0 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ytes */.){.  int
163c0 20 69 3b 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d   i;.  int nSeg =
163d0 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b   pCsr->nSegment;
163e0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46 74  ..  /* If the Ft
163f0 73 33 53 65 67 46 69 6c 74 65 72 20 64 65 66 69  s3SegFilter defi
16400 6e 65 73 20 61 20 73 70 65 63 69 66 69 63 20 74  nes a specific t
16410 65 72 6d 20 28 6f 72 20 74 65 72 6d 20 70 72 65  erm (or term pre
16420 66 69 78 29 20 74 6f 20 73 65 61 72 63 68 20 0a  fix) to search .
16430 20 20 2a 2a 20 66 6f 72 2c 20 74 68 65 6e 20 61    ** for, then a
16440 64 76 61 6e 63 65 20 65 61 63 68 20 73 65 67 6d  dvance each segm
16450 65 6e 74 20 69 74 65 72 61 74 6f 72 20 75 6e 74  ent iterator unt
16460 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  il it points to 
16470 61 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 65  a term of.  ** e
16480 71 75 61 6c 20 6f 72 20 67 72 65 61 74 65 72 20  qual or greater 
16490 76 61 6c 75 65 20 74 68 61 6e 20 74 68 65 20 73  value than the s
164a0 70 65 63 69 66 69 65 64 20 74 65 72 6d 2e 20 54  pecified term. T
164b0 68 69 73 20 70 72 65 76 65 6e 74 73 20 6d 61 6e  his prevents man
164c0 79 0a 20 20 2a 2a 20 75 6e 6e 65 63 65 73 73 61  y.  ** unnecessa
164d0 72 79 20 6d 65 72 67 65 2f 73 6f 72 74 20 6f 70  ry merge/sort op
164e0 65 72 61 74 69 6f 6e 73 20 66 6f 72 20 74 68 65  erations for the
164f0 20 63 61 73 65 20 77 68 65 72 65 20 73 69 6e 67   case where sing
16500 6c 65 20 73 65 67 6d 65 6e 74 0a 20 20 2a 2a 20  le segment.  ** 
16510 62 2d 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65  b-tree leaf node
16520 73 20 63 6f 6e 74 61 69 6e 20 6d 6f 72 65 20 74  s contain more t
16530 68 61 6e 20 6f 6e 65 20 74 65 72 6d 2e 0a 20 20  han one term..  
16540 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 43  */.  for(i=0; pC
16550 73 72 2d 3e 62 52 65 73 74 61 72 74 3d 3d 30 20  sr->bRestart==0 
16560 26 26 20 69 3c 70 43 73 72 2d 3e 6e 53 65 67 6d  && i<pCsr->nSegm
16570 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ent; i++){.    i
16580 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20  nt res = 0;.    
16590 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
165a0 53 65 67 20 3d 20 70 43 73 72 2d 3e 61 70 53 65  Seg = pCsr->apSe
165b0 67 6d 65 6e 74 5b 69 5d 3b 0a 20 20 20 20 64 6f  gment[i];.    do
165c0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20   {.      int rc 
165d0 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e  = fts3SegReaderN
165e0 65 78 74 28 70 2c 20 70 53 65 67 2c 20 30 29 3b  ext(p, pSeg, 0);
165f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
16600 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
16610 6e 20 72 63 3b 0a 20 20 20 20 7d 77 68 69 6c 65  n rc;.    }while
16620 28 20 7a 54 65 72 6d 20 26 26 20 28 72 65 73 20  ( zTerm && (res 
16630 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72 54  = fts3SegReaderT
16640 65 72 6d 43 6d 70 28 70 53 65 67 2c 20 7a 54 65  ermCmp(pSeg, zTe
16650 72 6d 2c 20 6e 54 65 72 6d 29 29 3c 30 20 29 3b  rm, nTerm))<0 );
16660 0a 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e  ..    if( pSeg->
16670 62 4c 6f 6f 6b 75 70 20 26 26 20 72 65 73 21 3d  bLookup && res!=
16680 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 33 53  0 ){.      fts3S
16690 65 67 52 65 61 64 65 72 53 65 74 45 6f 66 28 70  egReaderSetEof(p
166a0 53 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Seg);.    }.  }.
166b0 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72 53    fts3SegReaderS
166c0 6f 72 74 28 70 43 73 72 2d 3e 61 70 53 65 67 6d  ort(pCsr->apSegm
166d0 65 6e 74 2c 20 6e 53 65 67 2c 20 6e 53 65 67 2c  ent, nSeg, nSeg,
166e0 20 66 74 73 33 53 65 67 52 65 61 64 65 72 43 6d   fts3SegReaderCm
166f0 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  p);..  return SQ
16700 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20  LITE_OK;.}..int 
16710 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
16720 61 64 65 72 53 74 61 72 74 28 0a 20 20 46 74 73  aderStart(.  Fts
16730 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16750 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  Virtual table ha
16760 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 4d 75  ndle */.  Fts3Mu
16770 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70 43  ltiSegReader *pC
16780 73 72 2c 20 20 20 20 20 20 20 2f 2a 20 43 75 72  sr,       /* Cur
16790 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  sor object */.  
167a0 46 74 73 33 53 65 67 46 69 6c 74 65 72 20 2a 70  Fts3SegFilter *p
167b0 46 69 6c 74 65 72 20 20 20 20 20 20 20 20 20 20  Filter          
167c0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20  /* Restrictions 
167d0 6f 6e 20 72 61 6e 67 65 20 6f 66 20 69 74 65 72  on range of iter
167e0 61 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 70 43  ation */.){.  pC
167f0 73 72 2d 3e 70 46 69 6c 74 65 72 20 3d 20 70 46  sr->pFilter = pF
16800 69 6c 74 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  ilter;.  return 
16810 66 74 73 33 53 65 67 52 65 61 64 65 72 53 74 61  fts3SegReaderSta
16820 72 74 28 70 2c 20 70 43 73 72 2c 20 70 46 69 6c  rt(p, pCsr, pFil
16830 74 65 72 2d 3e 7a 54 65 72 6d 2c 20 70 46 69 6c  ter->zTerm, pFil
16840 74 65 72 2d 3e 6e 54 65 72 6d 29 3b 0a 7d 0a 0a  ter->nTerm);.}..
16850 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 4d  int sqlite3Fts3M
16860 73 72 49 6e 63 72 53 74 61 72 74 28 0a 20 20 46  srIncrStart(.  F
16870 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
16880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16890 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * Virtual table 
168a0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33  handle */.  Fts3
168b0 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a  MultiSegReader *
168c0 70 43 73 72 2c 20 20 20 20 20 20 20 2f 2a 20 43  pCsr,       /* C
168d0 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  ursor object */.
168e0 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20    int iCol,     
168f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16900 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 6d    /* Column to m
16910 61 74 63 68 20 6f 6e 2e 20 2a 2f 0a 20 20 63 6f  atch on. */.  co
16920 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c  nst char *zTerm,
16930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16940 20 54 65 72 6d 20 74 6f 20 69 74 65 72 61 74 65   Term to iterate
16950 20 74 68 72 6f 75 67 68 20 61 20 64 6f 63 6c 69   through a docli
16960 73 74 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  st for */.  int 
16970 6e 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20  nTerm           
16980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
16990 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
169a0 6e 20 7a 54 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20  n zTerm */.){.  
169b0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b  int i;.  int rc;
169c0 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20  .  int nSegment 
169d0 3d 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74  = pCsr->nSegment
169e0 3b 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70 29 28  ;.  int (*xCmp)(
169f0 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2c  Fts3SegReader *,
16a00 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
16a10 29 20 3d 20 28 0a 20 20 20 20 70 2d 3e 62 44 65  ) = (.    p->bDe
16a20 73 63 49 64 78 20 3f 20 66 74 73 33 53 65 67 52  scIdx ? fts3SegR
16a30 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 52  eaderDoclistCmpR
16a40 65 76 20 3a 20 66 74 73 33 53 65 67 52 65 61 64  ev : fts3SegRead
16a50 65 72 44 6f 63 6c 69 73 74 43 6d 70 0a 20 20 29  erDoclistCmp.  )
16a60 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 73  ;..  assert( pCs
16a70 72 2d 3e 70 46 69 6c 74 65 72 3d 3d 30 20 29 3b  r->pFilter==0 );
16a80 0a 20 20 61 73 73 65 72 74 28 20 7a 54 65 72 6d  .  assert( zTerm
16a90 20 26 26 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a   && nTerm>0 );..
16aa0 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 65 61 63    /* Advance eac
16ab0 68 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74  h segment iterat
16ac0 6f 72 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e  or until it poin
16ad0 74 73 20 74 6f 20 74 68 65 20 74 65 72 6d 20 7a  ts to the term z
16ae0 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 2a 2f 0a 20  Term/nTerm. */. 
16af0 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61   rc = fts3SegRea
16b00 64 65 72 53 74 61 72 74 28 70 2c 20 70 43 73 72  derStart(p, pCsr
16b10 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b  , zTerm, nTerm);
16b20 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
16b30 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
16b40 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e  ;..  /* Determin
16b50 65 20 68 6f 77 20 6d 61 6e 79 20 6f 66 20 74 68  e how many of th
16b60 65 20 73 65 67 6d 65 6e 74 73 20 61 63 74 75 61  e segments actua
16b70 6c 6c 79 20 70 6f 69 6e 74 20 74 6f 20 7a 54 65  lly point to zTe
16b80 72 6d 2f 6e 54 65 72 6d 2e 20 2a 2f 0a 20 20 66  rm/nTerm. */.  f
16b90 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 65 67 6d 65  or(i=0; i<nSegme
16ba0 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74  nt; i++){.    Ft
16bb0 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65  s3SegReader *pSe
16bc0 67 20 3d 20 70 43 73 72 2d 3e 61 70 53 65 67 6d  g = pCsr->apSegm
16bd0 65 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  ent[i];.    if( 
16be0 21 70 53 65 67 2d 3e 61 4e 6f 64 65 20 7c 7c 20  !pSeg->aNode || 
16bf0 66 74 73 33 53 65 67 52 65 61 64 65 72 54 65 72  fts3SegReaderTer
16c00 6d 43 6d 70 28 70 53 65 67 2c 20 7a 54 65 72 6d  mCmp(pSeg, zTerm
16c10 2c 20 6e 54 65 72 6d 29 20 29 7b 0a 20 20 20 20  , nTerm) ){.    
16c20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
16c30 20 7d 0a 20 20 70 43 73 72 2d 3e 6e 41 64 76 61   }.  pCsr->nAdva
16c40 6e 63 65 20 3d 20 69 3b 0a 0a 20 20 2f 2a 20 41  nce = i;..  /* A
16c50 64 76 61 6e 63 65 20 65 61 63 68 20 6f 66 20 74  dvance each of t
16c60 68 65 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 70  he segments to p
16c70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73  oint to the firs
16c80 74 20 64 6f 63 69 64 2e 20 2a 2f 0a 20 20 66 6f  t docid. */.  fo
16c90 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e  r(i=0; i<pCsr->n
16ca0 41 64 76 61 6e 63 65 3b 20 69 2b 2b 29 7b 0a 20  Advance; i++){. 
16cb0 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52     rc = fts3SegR
16cc0 65 61 64 65 72 46 69 72 73 74 44 6f 63 69 64 28  eaderFirstDocid(
16cd0 70 2c 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65  p, pCsr->apSegme
16ce0 6e 74 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  nt[i]);.    if( 
16cf0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
16d00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
16d10 20 66 74 73 33 53 65 67 52 65 61 64 65 72 53 6f   fts3SegReaderSo
16d20 72 74 28 70 43 73 72 2d 3e 61 70 53 65 67 6d 65  rt(pCsr->apSegme
16d30 6e 74 2c 20 69 2c 20 69 2c 20 78 43 6d 70 29 3b  nt, i, i, xCmp);
16d40 0a 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c  ..  assert( iCol
16d50 3c 30 20 7c 7c 20 69 43 6f 6c 3c 70 2d 3e 6e 43  <0 || iCol<p->nC
16d60 6f 6c 75 6d 6e 20 29 3b 0a 20 20 70 43 73 72 2d  olumn );.  pCsr-
16d70 3e 69 43 6f 6c 46 69 6c 74 65 72 20 3d 20 69 43  >iColFilter = iC
16d80 6f 6c 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  ol;..  return SQ
16d90 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
16da0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
16db0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 4d  is called on a M
16dc0 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 74 68  ultiSegReader th
16dd0 61 74 20 68 61 73 20 62 65 65 6e 20 73 74 61 72  at has been star
16de0 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c  ted using.** sql
16df0 69 74 65 33 46 74 73 33 4d 73 72 49 6e 63 72 53  ite3Fts3MsrIncrS
16e00 74 61 72 74 28 29 2e 20 4f 6e 65 20 6f 72 20 6d  tart(). One or m
16e10 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20 4d 73 72  ore calls to Msr
16e20 49 6e 63 72 4e 65 78 74 28 29 20 6d 61 79 20 61  IncrNext() may a
16e30 6c 73 6f 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e  lso.** have been
16e40 20 6d 61 64 65 2e 20 43 61 6c 6c 69 6e 67 20 74   made. Calling t
16e50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 75 74  his function put
16e60 73 20 74 68 65 20 4d 75 6c 74 69 53 65 67 52 65  s the MultiSegRe
16e70 61 64 65 72 20 69 6e 20 73 75 63 68 0a 2a 2a 20  ader in such.** 
16e80 61 20 73 74 61 74 65 20 74 68 61 74 20 69 66 20  a state that if 
16e90 74 68 65 20 6e 65 78 74 20 74 77 6f 20 63 61 6c  the next two cal
16ea0 6c 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  ls are:.**.**   
16eb0 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
16ec0 61 64 65 72 53 74 61 72 74 28 29 0a 2a 2a 20 20  aderStart().**  
16ed0 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
16ee0 65 61 64 65 72 53 74 65 70 28 29 0a 2a 2a 0a 2a  eaderStep().**.*
16ef0 2a 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72  * then the entir
16f00 65 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68  e doclist for th
16f10 65 20 74 65 72 6d 20 69 73 20 61 76 61 69 6c 61  e term is availa
16f20 62 6c 65 20 69 6e 20 0a 2a 2a 20 4d 75 6c 74 69  ble in .** Multi
16f30 53 65 67 52 65 61 64 65 72 2e 61 44 6f 63 6c 69  SegReader.aDocli
16f40 73 74 2f 6e 44 6f 63 6c 69 73 74 2e 0a 2a 2f 0a  st/nDoclist..*/.
16f50 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 4d  int sqlite3Fts3M
16f60 73 72 49 6e 63 72 52 65 73 74 61 72 74 28 46 74  srIncrRestart(Ft
16f70 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
16f80 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74 20 69   *pCsr){.  int i
16f90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16fa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
16fb0 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
16fc0 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 2d 72 65  rough segment-re
16fd0 61 64 65 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65  aders */..  asse
16fe0 72 74 28 20 70 43 73 72 2d 3e 7a 54 65 72 6d 3d  rt( pCsr->zTerm=
16ff0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
17000 70 43 73 72 2d 3e 6e 54 65 72 6d 3d 3d 30 20 29  pCsr->nTerm==0 )
17010 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72  ;.  assert( pCsr
17020 2d 3e 61 44 6f 63 6c 69 73 74 3d 3d 30 20 29 3b  ->aDoclist==0 );
17030 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d  .  assert( pCsr-
17040 3e 6e 44 6f 63 6c 69 73 74 3d 3d 30 20 29 3b 0a  >nDoclist==0 );.
17050 0a 20 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63  .  pCsr->nAdvanc
17060 65 20 3d 20 30 3b 0a 20 20 70 43 73 72 2d 3e 62  e = 0;.  pCsr->b
17070 52 65 73 74 61 72 74 20 3d 20 31 3b 0a 20 20 66  Restart = 1;.  f
17080 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e  or(i=0; i<pCsr->
17090 6e 53 65 67 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a  nSegment; i++){.
170a0 20 20 20 20 70 43 73 72 2d 3e 61 70 53 65 67 6d      pCsr->apSegm
170b0 65 6e 74 5b 69 5d 2d 3e 70 4f 66 66 73 65 74 4c  ent[i]->pOffsetL
170c0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 70 43 73  ist = 0;.    pCs
170d0 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69 5d 2d  r->apSegment[i]-
170e0 3e 6e 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 30  >nOffsetList = 0
170f0 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 70 53 65  ;.    pCsr->apSe
17100 67 6d 65 6e 74 5b 69 5d 2d 3e 69 44 6f 63 69 64  gment[i]->iDocid
17110 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   = 0;.  }..  ret
17120 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17130 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ...int sqlite3Ft
17140 73 33 53 65 67 52 65 61 64 65 72 53 74 65 70 28  s3SegReaderStep(
17150 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
17160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17170 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
17180 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
17190 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
171a0 65 72 20 2a 70 43 73 72 20 20 20 20 20 20 20 20  er *pCsr        
171b0 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65 63 74  /* Cursor object
171c0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
171d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
171e0 69 6e 74 20 69 73 49 67 6e 6f 72 65 45 6d 70 74  int isIgnoreEmpt
171f0 79 20 3d 20 20 28 70 43 73 72 2d 3e 70 46 69 6c  y =  (pCsr->pFil
17200 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
17210 33 5f 53 45 47 4d 45 4e 54 5f 49 47 4e 4f 52 45  3_SEGMENT_IGNORE
17220 5f 45 4d 50 54 59 29 3b 0a 20 20 69 6e 74 20 69  _EMPTY);.  int i
17230 73 52 65 71 75 69 72 65 50 6f 73 20 3d 20 20 20  sRequirePos =   
17240 28 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e  (pCsr->pFilter->
17250 66 6c 61 67 73 20 26 20 46 54 53 33 5f 53 45 47  flags & FTS3_SEG
17260 4d 45 4e 54 5f 52 45 51 55 49 52 45 5f 50 4f 53  MENT_REQUIRE_POS
17270 29 3b 0a 20 20 69 6e 74 20 69 73 43 6f 6c 46 69  );.  int isColFi
17280 6c 74 65 72 20 3d 20 20 20 20 28 70 43 73 72 2d  lter =    (pCsr-
17290 3e 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20  >pFilter->flags 
172a0 26 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 43  & FTS3_SEGMENT_C
172b0 4f 4c 55 4d 4e 5f 46 49 4c 54 45 52 29 3b 0a 20  OLUMN_FILTER);. 
172c0 20 69 6e 74 20 69 73 50 72 65 66 69 78 20 3d 20   int isPrefix = 
172d0 20 20 20 20 20 20 28 70 43 73 72 2d 3e 70 46 69        (pCsr->pFi
172e0 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  lter->flags & FT
172f0 53 33 5f 53 45 47 4d 45 4e 54 5f 50 52 45 46 49  S3_SEGMENT_PREFI
17300 58 29 3b 0a 20 20 69 6e 74 20 69 73 53 63 61 6e  X);.  int isScan
17310 20 3d 20 20 20 20 20 20 20 20 20 28 70 43 73 72   =         (pCsr
17320 2d 3e 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73  ->pFilter->flags
17330 20 26 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f   & FTS3_SEGMENT_
17340 53 43 41 4e 29 3b 0a 20 20 69 6e 74 20 69 73 46  SCAN);.  int isF
17350 69 72 73 74 20 3d 20 20 20 20 20 20 20 20 28 70  irst =        (p
17360 43 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e 66 6c  Csr->pFilter->fl
17370 61 67 73 20 26 20 46 54 53 33 5f 53 45 47 4d 45  ags & FTS3_SEGME
17380 4e 54 5f 46 49 52 53 54 29 3b 0a 0a 20 20 46 74  NT_FIRST);..  Ft
17390 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a 61 70  s3SegReader **ap
173a0 53 65 67 6d 65 6e 74 20 3d 20 70 43 73 72 2d 3e  Segment = pCsr->
173b0 61 70 53 65 67 6d 65 6e 74 3b 0a 20 20 69 6e 74  apSegment;.  int
173c0 20 6e 53 65 67 6d 65 6e 74 20 3d 20 70 43 73 72   nSegment = pCsr
173d0 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 46 74  ->nSegment;.  Ft
173e0 73 33 53 65 67 46 69 6c 74 65 72 20 2a 70 46 69  s3SegFilter *pFi
173f0 6c 74 65 72 20 3d 20 70 43 73 72 2d 3e 70 46 69  lter = pCsr->pFi
17400 6c 74 65 72 3b 0a 20 20 69 6e 74 20 28 2a 78 43  lter;.  int (*xC
17410 6d 70 29 28 46 74 73 33 53 65 67 52 65 61 64 65  mp)(Fts3SegReade
17420 72 20 2a 2c 20 46 74 73 33 53 65 67 52 65 61 64  r *, Fts3SegRead
17430 65 72 20 2a 29 20 3d 20 28 0a 20 20 20 20 70 2d  er *) = (.    p-
17440 3e 62 44 65 73 63 49 64 78 20 3f 20 66 74 73 33  >bDescIdx ? fts3
17450 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74  SegReaderDoclist
17460 43 6d 70 52 65 76 20 3a 20 66 74 73 33 53 65 67  CmpRev : fts3Seg
17470 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70  ReaderDoclistCmp
17480 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 73  .  );..  if( pCs
17490 72 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 30 20 29  r->nSegment==0 )
174a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
174b0 4b 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69  K;..  do {.    i
174c0 6e 74 20 6e 4d 65 72 67 65 3b 0a 20 20 20 20 69  nt nMerge;.    i
174d0 6e 74 20 69 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  nt i;.  .    /* 
174e0 41 64 76 61 6e 63 65 20 74 68 65 20 66 69 72 73  Advance the firs
174f0 74 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65  t pCsr->nAdvance
17500 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
17510 61 70 53 65 67 6d 65 6e 74 5b 5d 20 61 72 72 61  apSegment[] arra
17520 79 0a 20 20 20 20 2a 2a 20 66 6f 72 77 61 72 64  y.    ** forward
17530 2e 20 54 68 65 6e 20 73 6f 72 74 20 74 68 65 20  . Then sort the 
17540 6c 69 73 74 20 69 6e 20 6f 72 64 65 72 20 6f 66  list in order of
17550 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 61 67   current term ag
17560 61 69 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20  ain.  .    */.  
17570 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73    for(i=0; i<pCs
17580 72 2d 3e 6e 41 64 76 61 6e 63 65 3b 20 69 2b 2b  r->nAdvance; i++
17590 29 7b 0a 20 20 20 20 20 20 46 74 73 33 53 65 67  ){.      Fts3Seg
175a0 52 65 61 64 65 72 20 2a 70 53 65 67 20 3d 20 61  Reader *pSeg = a
175b0 70 53 65 67 6d 65 6e 74 5b 69 5d 3b 0a 20 20 20  pSegment[i];.   
175c0 20 20 20 69 66 28 20 70 53 65 67 2d 3e 62 4c 6f     if( pSeg->bLo
175d0 6f 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 20 20  okup ){.        
175e0 66 74 73 33 53 65 67 52 65 61 64 65 72 53 65 74  fts3SegReaderSet
175f0 45 6f 66 28 70 53 65 67 29 3b 0a 20 20 20 20 20  Eof(pSeg);.     
17600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17610 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64  rc = fts3SegRead
17620 65 72 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20  erNext(p, pSeg, 
17630 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
17640 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17650 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
17660 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 33 53  .    }.    fts3S
17670 65 67 52 65 61 64 65 72 53 6f 72 74 28 61 70 53  egReaderSort(apS
17680 65 67 6d 65 6e 74 2c 20 6e 53 65 67 6d 65 6e 74  egment, nSegment
17690 2c 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65  , pCsr->nAdvance
176a0 2c 20 66 74 73 33 53 65 67 52 65 61 64 65 72 43  , fts3SegReaderC
176b0 6d 70 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 6e  mp);.    pCsr->n
176c0 41 64 76 61 6e 63 65 20 3d 20 30 3b 0a 0a 20 20  Advance = 0;..  
176d0 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20    /* If all the 
176e0 73 65 67 2d 72 65 61 64 65 72 73 20 61 72 65 20  seg-readers are 
176f0 61 74 20 45 4f 46 2c 20 77 65 27 72 65 20 66 69  at EOF, we're fi
17700 6e 69 73 68 65 64 2e 20 72 65 74 75 72 6e 20 53  nished. return S
17710 51 4c 49 54 45 5f 4f 4b 2e 20 2a 2f 0a 20 20 20  QLITE_OK. */.   
17720 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
17730 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 69 66  ITE_OK );.    if
17740 28 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e  ( apSegment[0]->
17750 61 4e 6f 64 65 3d 3d 30 20 29 20 62 72 65 61 6b  aNode==0 ) break
17760 3b 0a 0a 20 20 20 20 70 43 73 72 2d 3e 6e 54 65  ;..    pCsr->nTe
17770 72 6d 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 30  rm = apSegment[0
17780 5d 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 70 43  ]->nTerm;.    pC
17790 73 72 2d 3e 7a 54 65 72 6d 20 3d 20 61 70 53 65  sr->zTerm = apSe
177a0 67 6d 65 6e 74 5b 30 5d 2d 3e 7a 54 65 72 6d 3b  gment[0]->zTerm;
177b0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
177c0 20 69 73 20 61 20 70 72 65 66 69 78 2d 73 65 61   is a prefix-sea
177d0 72 63 68 2c 20 61 6e 64 20 69 66 20 74 68 65 20  rch, and if the 
177e0 74 65 72 6d 20 74 68 61 74 20 61 70 53 65 67 6d  term that apSegm
177f0 65 6e 74 5b 30 5d 20 70 6f 69 6e 74 73 0a 20 20  ent[0] points.  
17800 20 20 2a 2a 20 74 6f 20 64 6f 65 73 20 6e 6f 74    ** to does not
17810 20 73 68 61 72 65 20 61 20 73 75 66 66 69 78 20   share a suffix 
17820 77 69 74 68 20 70 46 69 6c 74 65 72 2d 3e 7a 54  with pFilter->zT
17830 65 72 6d 2f 6e 54 65 72 6d 2c 20 74 68 65 6e 20  erm/nTerm, then 
17840 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 72 65 71 75  all .    ** requ
17850 69 72 65 64 20 63 61 6c 6c 62 61 63 6b 73 20 68  ired callbacks h
17860 61 76 65 20 62 65 65 6e 20 6d 61 64 65 2e 20 49  ave been made. I
17870 6e 20 74 68 69 73 20 63 61 73 65 20 65 78 69 74  n this case exit
17880 20 65 61 72 6c 79 2e 0a 20 20 20 20 2a 2a 0a 20   early..    **. 
17890 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c     ** Similarly,
178a0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73 65   if this is a se
178b0 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 61 63  arch for an exac
178c0 74 20 6d 61 74 63 68 2c 20 61 6e 64 20 74 68 65  t match, and the
178d0 20 66 69 72 73 74 20 74 65 72 6d 0a 20 20 20 20   first term.    
178e0 2a 2a 20 6f 66 20 73 65 67 6d 65 6e 74 20 61 70  ** of segment ap
178f0 53 65 67 6d 65 6e 74 5b 30 5d 20 69 73 20 6e 6f  Segment[0] is no
17900 74 20 61 20 6d 61 74 63 68 2c 20 65 78 69 74 20  t a match, exit 
17910 65 61 72 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  early..    */.  
17920 20 20 69 66 28 20 70 46 69 6c 74 65 72 2d 3e 7a    if( pFilter->z
17930 54 65 72 6d 20 26 26 20 21 69 73 53 63 61 6e 20  Term && !isScan 
17940 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 73  ){.      if( pCs
17950 72 2d 3e 6e 54 65 72 6d 3c 70 46 69 6c 74 65 72  r->nTerm<pFilter
17960 2d 3e 6e 54 65 72 6d 20 0a 20 20 20 20 20 20 20  ->nTerm .       
17970 7c 7c 20 28 21 69 73 50 72 65 66 69 78 20 26 26  || (!isPrefix &&
17980 20 70 43 73 72 2d 3e 6e 54 65 72 6d 3e 70 46 69   pCsr->nTerm>pFi
17990 6c 74 65 72 2d 3e 6e 54 65 72 6d 29 0a 20 20 20  lter->nTerm).   
179a0 20 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 43      || memcmp(pC
179b0 73 72 2d 3e 7a 54 65 72 6d 2c 20 70 46 69 6c 74  sr->zTerm, pFilt
179c0 65 72 2d 3e 7a 54 65 72 6d 2c 20 70 46 69 6c 74  er->zTerm, pFilt
179d0 65 72 2d 3e 6e 54 65 72 6d 29 20 0a 20 20 20 20  er->nTerm) .    
179e0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65    ){.        bre
179f0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
17a00 7d 0a 0a 20 20 20 20 6e 4d 65 72 67 65 20 3d 20  }..    nMerge = 
17a10 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 4d  1;.    while( nM
17a20 65 72 67 65 3c 6e 53 65 67 6d 65 6e 74 20 0a 20  erge<nSegment . 
17a30 20 20 20 20 20 20 20 26 26 20 61 70 53 65 67 6d         && apSegm
17a40 65 6e 74 5b 6e 4d 65 72 67 65 5d 2d 3e 61 4e 6f  ent[nMerge]->aNo
17a50 64 65 0a 20 20 20 20 20 20 20 20 26 26 20 61 70  de.        && ap
17a60 53 65 67 6d 65 6e 74 5b 6e 4d 65 72 67 65 5d 2d  Segment[nMerge]-
17a70 3e 6e 54 65 72 6d 3d 3d 70 43 73 72 2d 3e 6e 54  >nTerm==pCsr->nT
17a80 65 72 6d 20 0a 20 20 20 20 20 20 20 20 26 26 20  erm .        && 
17a90 30 3d 3d 6d 65 6d 63 6d 70 28 70 43 73 72 2d 3e  0==memcmp(pCsr->
17aa0 7a 54 65 72 6d 2c 20 61 70 53 65 67 6d 65 6e 74  zTerm, apSegment
17ab0 5b 6e 4d 65 72 67 65 5d 2d 3e 7a 54 65 72 6d 2c  [nMerge]->zTerm,
17ac0 20 70 43 73 72 2d 3e 6e 54 65 72 6d 29 0a 20 20   pCsr->nTerm).  
17ad0 20 20 29 7b 0a 20 20 20 20 20 20 6e 4d 65 72 67    ){.      nMerg
17ae0 65 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  e++;.    }..    
17af0 61 73 73 65 72 74 28 20 69 73 49 67 6e 6f 72 65  assert( isIgnore
17b00 45 6d 70 74 79 20 7c 7c 20 28 69 73 52 65 71 75  Empty || (isRequ
17b10 69 72 65 50 6f 73 20 26 26 20 21 69 73 43 6f 6c  irePos && !isCol
17b20 46 69 6c 74 65 72 29 20 29 3b 0a 20 20 20 20 69  Filter) );.    i
17b30 66 28 20 6e 4d 65 72 67 65 3d 3d 31 20 0a 20 20  f( nMerge==1 .  
17b40 20 20 20 26 26 20 21 69 73 49 67 6e 6f 72 65 45     && !isIgnoreE
17b50 6d 70 74 79 20 0a 20 20 20 20 20 26 26 20 21 69  mpty .     && !i
17b60 73 46 69 72 73 74 20 0a 20 20 20 20 20 26 26 20  sFirst .     && 
17b70 28 70 2d 3e 62 44 65 73 63 49 64 78 3d 3d 30 20  (p->bDescIdx==0 
17b80 7c 7c 20 66 74 73 33 53 65 67 52 65 61 64 65 72  || fts3SegReader
17b90 49 73 50 65 6e 64 69 6e 67 28 61 70 53 65 67 6d  IsPending(apSegm
17ba0 65 6e 74 5b 30 5d 29 3d 3d 30 29 0a 20 20 20 20  ent[0])==0).    
17bb0 29 7b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 6e  ){.      pCsr->n
17bc0 44 6f 63 6c 69 73 74 20 3d 20 61 70 53 65 67 6d  Doclist = apSegm
17bd0 65 6e 74 5b 30 5d 2d 3e 6e 44 6f 63 6c 69 73 74  ent[0]->nDoclist
17be0 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 33  ;.      if( fts3
17bf0 53 65 67 52 65 61 64 65 72 49 73 50 65 6e 64 69  SegReaderIsPendi
17c00 6e 67 28 61 70 53 65 67 6d 65 6e 74 5b 30 5d 29  ng(apSegment[0])
17c10 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
17c20 20 66 74 73 33 4d 73 72 42 75 66 66 65 72 44 61   fts3MsrBufferDa
17c30 74 61 28 70 43 73 72 2c 20 61 70 53 65 67 6d 65  ta(pCsr, apSegme
17c40 6e 74 5b 30 5d 2d 3e 61 44 6f 63 6c 69 73 74 2c  nt[0]->aDoclist,
17c50 20 70 43 73 72 2d 3e 6e 44 6f 63 6c 69 73 74 29   pCsr->nDoclist)
17c60 3b 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e  ;.        pCsr->
17c70 61 44 6f 63 6c 69 73 74 20 3d 20 70 43 73 72 2d  aDoclist = pCsr-
17c80 3e 61 42 75 66 66 65 72 3b 0a 20 20 20 20 20 20  >aBuffer;.      
17c90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
17ca0 43 73 72 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20  Csr->aDoclist = 
17cb0 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 61 44  apSegment[0]->aD
17cc0 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a  oclist;.      }.
17cd0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
17ce0 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53  LITE_OK ) rc = S
17cf0 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 20 20 7d  QLITE_ROW;.    }
17d00 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
17d10 6e 44 6f 63 6c 69 73 74 20 3d 20 30 3b 20 20 20  nDoclist = 0;   
17d20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
17d30 6f 66 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20  of doclist */.  
17d40 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
17d50 34 20 69 50 72 65 76 20 3d 20 30 3b 20 20 20 20  4 iPrev = 0;    
17d60 2f 2a 20 50 72 65 76 69 6f 75 73 20 64 6f 63 69  /* Previous doci
17d70 64 20 73 74 6f 72 65 64 20 69 6e 20 64 6f 63 6c  d stored in docl
17d80 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ist */..      /*
17d90 20 54 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   The current ter
17da0 6d 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6e  m of the first n
17db0 4d 65 72 67 65 20 65 6e 74 72 69 65 73 20 69 6e  Merge entries in
17dc0 20 74 68 65 20 61 72 72 61 79 0a 20 20 20 20 20   the array.     
17dd0 20 2a 2a 20 6f 66 20 46 74 73 33 53 65 67 52 65   ** of Fts3SegRe
17de0 61 64 65 72 20 6f 62 6a 65 63 74 73 20 69 73 20  ader objects is 
17df0 74 68 65 20 73 61 6d 65 2e 20 54 68 65 20 64 6f  the same. The do
17e00 63 6c 69 73 74 73 20 6d 75 73 74 20 62 65 20 6d  clists must be m
17e10 65 72 67 65 64 0a 20 20 20 20 20 20 2a 2a 20 61  erged.      ** a
17e20 6e 64 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d  nd a single term
17e30 20 72 65 74 75 72 6e 65 64 20 77 69 74 68 20 74   returned with t
17e40 68 65 20 6d 65 72 67 65 64 20 64 6f 63 6c 69 73  he merged doclis
17e50 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
17e60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4d 65    for(i=0; i<nMe
17e70 72 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rge; i++){.     
17e80 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72     fts3SegReader
17e90 46 69 72 73 74 44 6f 63 69 64 28 70 2c 20 61 70  FirstDocid(p, ap
17ea0 53 65 67 6d 65 6e 74 5b 69 5d 29 3b 0a 20 20 20  Segment[i]);.   
17eb0 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 33 53     }.      fts3S
17ec0 65 67 52 65 61 64 65 72 53 6f 72 74 28 61 70 53  egReaderSort(apS
17ed0 65 67 6d 65 6e 74 2c 20 6e 4d 65 72 67 65 2c 20  egment, nMerge, 
17ee0 6e 4d 65 72 67 65 2c 20 78 43 6d 70 29 3b 0a 20  nMerge, xCmp);. 
17ef0 20 20 20 20 20 77 68 69 6c 65 28 20 61 70 53 65       while( apSe
17f00 67 6d 65 6e 74 5b 30 5d 2d 3e 70 4f 66 66 73 65  gment[0]->pOffse
17f10 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  tList ){.       
17f20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
17f30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
17f40 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73  mber of segments
17f50 20 74 68 61 74 20 73 68 61 72 65 20 61 20 64 6f   that share a do
17f60 63 69 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  cid */.        c
17f70 68 61 72 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a  har *pList = 0;.
17f80 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 73          int nLis
17f90 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  t = 0;.        i
17fa0 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20  nt nByte;.      
17fb0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
17fc0 69 44 6f 63 69 64 20 3d 20 61 70 53 65 67 6d 65  iDocid = apSegme
17fd0 6e 74 5b 30 5d 2d 3e 69 44 6f 63 69 64 3b 0a 20  nt[0]->iDocid;. 
17fe0 20 20 20 20 20 20 20 66 74 73 33 53 65 67 52 65         fts3SegRe
17ff0 61 64 65 72 4e 65 78 74 44 6f 63 69 64 28 70 2c  aderNextDocid(p,
18000 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2c 20 26   apSegment[0], &
18010 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a  pList, &nList);.
18020 20 20 20 20 20 20 20 20 6a 20 3d 20 31 3b 0a 20          j = 1;. 
18030 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3c         while( j<
18040 6e 4d 65 72 67 65 0a 20 20 20 20 20 20 20 20 20  nMerge.         
18050 20 20 20 26 26 20 61 70 53 65 67 6d 65 6e 74 5b     && apSegment[
18060 6a 5d 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 0a  j]->pOffsetList.
18070 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 61              && a
18080 70 53 65 67 6d 65 6e 74 5b 6a 5d 2d 3e 69 44 6f  pSegment[j]->iDo
18090 63 69 64 3d 3d 69 44 6f 63 69 64 0a 20 20 20 20  cid==iDocid.    
180a0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
180b0 20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e 65   fts3SegReaderNe
180c0 78 74 44 6f 63 69 64 28 70 2c 20 61 70 53 65 67  xtDocid(p, apSeg
180d0 6d 65 6e 74 5b 6a 5d 2c 20 30 2c 20 30 29 3b 0a  ment[j], 0, 0);.
180e0 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
180f0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
18100 20 20 69 66 28 20 69 73 43 6f 6c 46 69 6c 74 65    if( isColFilte
18110 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  r ){.          f
18120 74 73 33 43 6f 6c 75 6d 6e 46 69 6c 74 65 72 28  ts3ColumnFilter(
18130 70 46 69 6c 74 65 72 2d 3e 69 43 6f 6c 2c 20 30  pFilter->iCol, 0
18140 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74  , &pList, &nList
18150 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
18160 20 20 20 20 20 20 69 66 28 20 21 69 73 49 67 6e        if( !isIgn
18170 6f 72 65 45 6d 70 74 79 20 7c 7c 20 6e 4c 69 73  oreEmpty || nLis
18180 74 3e 30 20 29 7b 0a 0a 20 20 20 20 20 20 20 20  t>0 ){..        
18190 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74    /* Calculate t
181a0 68 65 20 27 64 6f 63 69 64 27 20 64 65 6c 74 61  he 'docid' delta
181b0 20 76 61 6c 75 65 20 74 6f 20 77 72 69 74 65 20   value to write 
181c0 69 6e 74 6f 20 74 68 65 20 6d 65 72 67 65 64 20  into the merged 
181d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 6f  .          ** do
181e0 63 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20  clist. */.      
181f0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
18200 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  4 iDelta;.      
18210 20 20 20 20 69 66 28 20 70 2d 3e 62 44 65 73 63      if( p->bDesc
18220 49 64 78 20 26 26 20 6e 44 6f 63 6c 69 73 74 3e  Idx && nDoclist>
18230 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
18240 20 69 44 65 6c 74 61 20 3d 20 69 50 72 65 76 20   iDelta = iPrev 
18250 2d 20 69 44 6f 63 69 64 3b 0a 20 20 20 20 20 20  - iDocid;.      
18260 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18270 20 20 20 20 20 20 20 69 44 65 6c 74 61 20 3d 20         iDelta = 
18280 69 44 6f 63 69 64 20 2d 20 69 50 72 65 76 3b 0a  iDocid - iPrev;.
18290 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
182a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 44        assert( iD
182b0 65 6c 74 61 3e 30 20 7c 7c 20 28 6e 44 6f 63 6c  elta>0 || (nDocl
182c0 69 73 74 3d 3d 30 20 26 26 20 69 44 65 6c 74 61  ist==0 && iDelta
182d0 3d 3d 69 44 6f 63 69 64 29 20 29 3b 0a 20 20 20  ==iDocid) );.   
182e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
182f0 44 6f 63 6c 69 73 74 3e 30 20 7c 7c 20 69 44 65  Doclist>0 || iDe
18300 6c 74 61 3d 3d 69 44 6f 63 69 64 20 29 3b 0a 0a  lta==iDocid );..
18310 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 20            nByte 
18320 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72  = sqlite3Fts3Var
18330 69 6e 74 4c 65 6e 28 69 44 65 6c 74 61 29 20 2b  intLen(iDelta) +
18340 20 28 69 73 52 65 71 75 69 72 65 50 6f 73 3f 6e   (isRequirePos?n
18350 4c 69 73 74 2b 31 3a 30 29 3b 0a 20 20 20 20 20  List+1:0);.     
18360 20 20 20 20 20 69 66 28 20 6e 44 6f 63 6c 69 73       if( nDoclis
18370 74 2b 6e 42 79 74 65 3e 70 43 73 72 2d 3e 6e 42  t+nByte>pCsr->nB
18380 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20  uffer ){.       
18390 20 20 20 20 20 63 68 61 72 20 2a 61 4e 65 77 3b       char *aNew;
183a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 73  .            pCs
183b0 72 2d 3e 6e 42 75 66 66 65 72 20 3d 20 28 6e 44  r->nBuffer = (nD
183c0 6f 63 6c 69 73 74 2b 6e 42 79 74 65 29 2a 32 3b  oclist+nByte)*2;
183d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 4e 65  .            aNe
183e0 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
183f0 6c 6f 63 28 70 43 73 72 2d 3e 61 42 75 66 66 65  loc(pCsr->aBuffe
18400 72 2c 20 70 43 73 72 2d 3e 6e 42 75 66 66 65 72  r, pCsr->nBuffer
18410 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
18420 66 28 20 21 61 4e 65 77 20 29 7b 0a 20 20 20 20  f( !aNew ){.    
18430 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
18440 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
18450 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
18460 20 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 61           pCsr->a
18470 42 75 66 66 65 72 20 3d 20 61 4e 65 77 3b 0a 20  Buffer = aNew;. 
18480 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
18490 20 20 20 20 20 20 69 66 28 20 69 73 46 69 72 73        if( isFirs
184a0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
184b0 20 63 68 61 72 20 2a 61 20 3d 20 26 70 43 73 72   char *a = &pCsr
184c0 2d 3e 61 42 75 66 66 65 72 5b 6e 44 6f 63 6c 69  ->aBuffer[nDocli
184d0 73 74 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  st];.           
184e0 20 69 6e 74 20 6e 57 72 69 74 65 3b 0a 20 20 20   int nWrite;.   
184f0 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
18500 20 20 20 20 20 6e 57 72 69 74 65 20 3d 20 73 71       nWrite = sq
18510 6c 69 74 65 33 46 74 73 33 46 69 72 73 74 46 69  lite3Fts3FirstFi
18520 6c 74 65 72 28 69 44 65 6c 74 61 2c 20 70 4c 69  lter(iDelta, pLi
18530 73 74 2c 20 6e 4c 69 73 74 2c 20 61 29 3b 0a 20  st, nList, a);. 
18540 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e             if( n
18550 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 20  Write ){.       
18560 20 20 20 20 20 20 20 69 50 72 65 76 20 3d 20 69         iPrev = i
18570 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20 20  Docid;.         
18580 20 20 20 20 20 6e 44 6f 63 6c 69 73 74 20 2b 3d       nDoclist +=
18590 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20   nWrite;.       
185a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
185b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
185c0 20 20 20 20 6e 44 6f 63 6c 69 73 74 20 2b 3d 20      nDoclist += 
185d0 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
185e0 72 69 6e 74 28 26 70 43 73 72 2d 3e 61 42 75 66  rint(&pCsr->aBuf
185f0 66 65 72 5b 6e 44 6f 63 6c 69 73 74 5d 2c 20 69  fer[nDoclist], i
18600 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20  Delta);.        
18610 20 20 20 20 69 50 72 65 76 20 3d 20 69 44 6f 63      iPrev = iDoc
18620 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  id;.            
18630 69 66 28 20 69 73 52 65 71 75 69 72 65 50 6f 73  if( isRequirePos
18640 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
18650 20 20 6d 65 6d 63 70 79 28 26 70 43 73 72 2d 3e    memcpy(&pCsr->
18660 61 42 75 66 66 65 72 5b 6e 44 6f 63 6c 69 73 74  aBuffer[nDoclist
18670 5d 2c 20 70 4c 69 73 74 2c 20 6e 4c 69 73 74 29  ], pList, nList)
18680 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
18690 6e 44 6f 63 6c 69 73 74 20 2b 3d 20 6e 4c 69 73  nDoclist += nLis
186a0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
186b0 20 70 43 73 72 2d 3e 61 42 75 66 66 65 72 5b 6e   pCsr->aBuffer[n
186c0 44 6f 63 6c 69 73 74 2b 2b 5d 20 3d 20 27 5c 30  Doclist++] = '\0
186d0 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ';.            }
186e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
186f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
18700 66 74 73 33 53 65 67 52 65 61 64 65 72 53 6f 72  fts3SegReaderSor
18710 74 28 61 70 53 65 67 6d 65 6e 74 2c 20 6e 4d 65  t(apSegment, nMe
18720 72 67 65 2c 20 6a 2c 20 78 43 6d 70 29 3b 0a 20  rge, j, xCmp);. 
18730 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18740 20 6e 44 6f 63 6c 69 73 74 3e 30 20 29 7b 0a 20   nDoclist>0 ){. 
18750 20 20 20 20 20 20 20 70 43 73 72 2d 3e 61 44 6f         pCsr->aDo
18760 63 6c 69 73 74 20 3d 20 70 43 73 72 2d 3e 61 42  clist = pCsr->aB
18770 75 66 66 65 72 3b 0a 20 20 20 20 20 20 20 20 70  uffer;.        p
18780 43 73 72 2d 3e 6e 44 6f 63 6c 69 73 74 20 3d 20  Csr->nDoclist = 
18790 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20  nDoclist;.      
187a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f    rc = SQLITE_RO
187b0 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  W;.      }.    }
187c0 0a 20 20 20 20 70 43 73 72 2d 3e 6e 41 64 76 61  .    pCsr->nAdva
187d0 6e 63 65 20 3d 20 6e 4d 65 72 67 65 3b 0a 20 20  nce = nMerge;.  
187e0 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
187f0 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 72 65 74 75  TE_OK );..  retu
18800 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 76 6f 69 64 20  rn rc;.}...void 
18810 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
18820 61 64 65 72 46 69 6e 69 73 68 28 0a 20 20 46 74  aderFinish(.  Ft
18830 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
18840 20 2a 70 43 73 72 20 20 20 20 20 20 20 2f 2a 20   *pCsr       /* 
18850 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  Cursor object */
18860 0a 29 7b 0a 20 20 69 66 28 20 70 43 73 72 20 29  .){.  if( pCsr )
18870 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
18880 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72   for(i=0; i<pCsr
18890 2d 3e 6e 53 65 67 6d 65 6e 74 3b 20 69 2b 2b 29  ->nSegment; i++)
188a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  {.      sqlite3F
188b0 74 73 33 53 65 67 52 65 61 64 65 72 46 72 65 65  ts3SegReaderFree
188c0 28 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74  (pCsr->apSegment
188d0 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
188e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73  sqlite3_free(pCs
188f0 72 2d 3e 61 70 53 65 67 6d 65 6e 74 29 3b 0a 20  r->apSegment);. 
18900 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
18910 70 43 73 72 2d 3e 61 42 75 66 66 65 72 29 3b 0a  pCsr->aBuffer);.
18920 0a 20 20 20 20 70 43 73 72 2d 3e 6e 53 65 67 6d  .    pCsr->nSegm
18930 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 43 73  ent = 0;.    pCs
18940 72 2d 3e 61 70 53 65 67 6d 65 6e 74 20 3d 20 30  r->apSegment = 0
18950 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 42 75 66  ;.    pCsr->aBuf
18960 66 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  fer = 0;.  }.}..
18970 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65  /*.** Decode the
18980 20 22 65 6e 64 5f 62 6c 6f 63 6b 22 20 66 69 65   "end_block" fie
18990 6c 64 2c 20 73 65 6c 65 63 74 65 64 20 62 79 20  ld, selected by 
189a0 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20 6f 66 20 74  column iCol of t
189b0 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74  he SELECT .** st
189c0 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
189d0 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
189e0 6d 65 6e 74 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ment. .**.** The
189f0 20 22 65 6e 64 5f 62 6c 6f 63 6b 22 20 66 69 65   "end_block" fie
18a00 6c 64 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65  ld may contain e
18a10 69 74 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72  ither an integer
18a20 2c 20 6f 72 20 61 20 74 65 78 74 20 66 69 65 6c  , or a text fiel
18a30 64 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20  d.** containing 
18a40 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65  the text represe
18a50 6e 74 61 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6e  ntation of two n
18a60 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65  on-negative inte
18a70 67 65 72 73 20 73 65 70 61 72 61 74 65 64 20 0a  gers separated .
18a80 2a 2a 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72  ** by one or mor
18a90 65 20 73 70 61 63 65 20 28 30 78 32 30 29 20 63  e space (0x20) c
18aa0 68 61 72 61 63 74 65 72 73 2e 20 49 6e 20 74 68  haracters. In th
18ab0 65 20 66 69 72 73 74 20 63 61 73 65 2c 20 73 65  e first case, se
18ac0 74 20 2a 70 69 45 6e 64 42 6c 6f 63 6b 20 0a 2a  t *piEndBlock .*
18ad0 2a 20 74 6f 20 74 68 65 20 69 6e 74 65 67 65 72  * to the integer
18ae0 20 76 61 6c 75 65 20 61 6e 64 20 2a 70 6e 42 79   value and *pnBy
18af0 74 65 20 74 6f 20 7a 65 72 6f 20 62 65 66 6f 72  te to zero befor
18b00 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 49 6e 20  e returning. In 
18b10 74 68 65 20 73 65 63 6f 6e 64 2c 20 0a 2a 2a 20  the second, .** 
18b20 73 65 74 20 2a 70 69 45 6e 64 42 6c 6f 63 6b 20  set *piEndBlock 
18b30 74 6f 20 74 68 65 20 66 69 72 73 74 20 76 61 6c  to the first val
18b40 75 65 20 61 6e 64 20 2a 70 6e 42 79 74 65 20 74  ue and *pnByte t
18b50 6f 20 74 68 65 20 73 65 63 6f 6e 64 2e 0a 2a 2f  o the second..*/
18b60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
18b70 33 52 65 61 64 45 6e 64 42 6c 6f 63 6b 46 69 65  3ReadEndBlockFie
18b80 6c 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  ld(.  sqlite3_st
18b90 6d 74 20 2a 70 53 74 6d 74 2c 20 0a 20 20 69 6e  mt *pStmt, .  in
18ba0 74 20 69 43 6f 6c 2c 20 0a 20 20 69 36 34 20 2a  t iCol, .  i64 *
18bb0 70 69 45 6e 64 42 6c 6f 63 6b 2c 0a 20 20 69 36  piEndBlock,.  i6
18bc0 34 20 2a 70 6e 42 79 74 65 0a 29 7b 0a 20 20 63  4 *pnByte.){.  c
18bd0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
18be0 61 72 20 2a 7a 54 65 78 74 20 3d 20 73 71 6c 69  ar *zText = sqli
18bf0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
18c00 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20  pStmt, iCol);.  
18c10 69 66 28 20 7a 54 65 78 74 20 29 7b 0a 20 20 20  if( zText ){.   
18c20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
18c30 69 4d 75 6c 20 3d 20 31 3b 0a 20 20 20 20 69 36  iMul = 1;.    i6
18c40 34 20 69 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20  4 iVal = 0;.    
18c50 66 6f 72 28 69 3d 30 3b 20 7a 54 65 78 74 5b 69  for(i=0; zText[i
18c60 5d 3e 3d 27 30 27 20 26 26 20 7a 54 65 78 74 5b  ]>='0' && zText[
18c70 69 5d 3c 3d 27 39 27 3b 20 69 2b 2b 29 7b 0a 20  i]<='9'; i++){. 
18c80 20 20 20 20 20 69 56 61 6c 20 3d 20 69 56 61 6c       iVal = iVal
18c90 2a 31 30 20 2b 20 28 7a 54 65 78 74 5b 69 5d 20  *10 + (zText[i] 
18ca0 2d 20 27 30 27 29 3b 0a 20 20 20 20 7d 0a 20 20  - '0');.    }.  
18cb0 20 20 2a 70 69 45 6e 64 42 6c 6f 63 6b 20 3d 20    *piEndBlock = 
18cc0 69 56 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28  iVal;.    while(
18cd0 20 7a 54 65 78 74 5b 69 5d 3d 3d 27 20 27 20 29   zText[i]==' ' )
18ce0 20 69 2b 2b 3b 0a 20 20 20 20 69 56 61 6c 20 3d   i++;.    iVal =
18cf0 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 78   0;.    if( zTex
18d00 74 5b 69 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  t[i]=='-' ){.   
18d10 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 4d     i++;.      iM
18d20 75 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  ul = -1;.    }. 
18d30 20 20 20 66 6f 72 28 2f 2a 20 6e 6f 2d 6f 70 20     for(/* no-op 
18d40 2a 2f 3b 20 7a 54 65 78 74 5b 69 5d 3e 3d 27 30  */; zText[i]>='0
18d50 27 20 26 26 20 7a 54 65 78 74 5b 69 5d 3c 3d 27  ' && zText[i]<='
18d60 39 27 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  9'; i++){.      
18d70 69 56 61 6c 20 3d 20 69 56 61 6c 2a 31 30 20 2b  iVal = iVal*10 +
18d80 20 28 7a 54 65 78 74 5b 69 5d 20 2d 20 27 30 27   (zText[i] - '0'
18d90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e  );.    }.    *pn
18da0 42 79 74 65 20 3d 20 28 69 56 61 6c 20 2a 20 28  Byte = (iVal * (
18db0 69 36 34 29 69 4d 75 6c 29 3b 0a 20 20 7d 0a 7d  i64)iMul);.  }.}
18dc0 0a 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 65 67 6d 65  .../*.** A segme
18dd0 6e 74 20 6f 66 20 73 69 7a 65 20 6e 42 79 74 65  nt of size nByte
18de0 20 62 79 74 65 73 20 68 61 73 20 6a 75 73 74 20   bytes has just 
18df0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
18e00 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 0a 2a  absolute level.*
18e10 2a 20 69 41 62 73 4c 65 76 65 6c 2e 20 50 72 6f  * iAbsLevel. Pro
18e20 6d 6f 74 65 20 61 6e 79 20 73 65 67 6d 65 6e 74  mote any segment
18e30 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  s that should be
18e40 20 70 72 6f 6d 6f 74 65 64 20 61 73 20 61 20 72   promoted as a r
18e50 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  esult..*/.static
18e60 20 69 6e 74 20 66 74 73 33 50 72 6f 6d 6f 74 65   int fts3Promote
18e70 53 65 67 6d 65 6e 74 73 28 0a 20 20 46 74 73 33  Segments(.  Fts3
18e80 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
18e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
18ea0 54 53 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  TS table handle 
18eb0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
18ec0 36 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20  64 iAbsLevel,   
18ed0 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65       /* Absolute
18ee0 20 6c 65 76 65 6c 20 6a 75 73 74 20 75 70 64 61   level just upda
18ef0 74 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ted */.  sqlite3
18f00 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 20 20 20  _int64 nByte    
18f10 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
18f20 20 6f 66 20 6e 65 77 20 73 65 67 6d 65 6e 74 20   of new segment 
18f30 61 74 20 69 41 62 73 4c 65 76 65 6c 20 2a 2f 0a  at iAbsLevel */.
18f40 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
18f50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74  LITE_OK;.  sqlit
18f60 65 33 5f 73 74 6d 74 20 2a 70 52 61 6e 67 65 3b  e3_stmt *pRange;
18f70 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  ..  rc = fts3Sql
18f80 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45  Stmt(p, SQL_SELE
18f90 43 54 5f 4c 45 56 45 4c 5f 52 41 4e 47 45 32 2c  CT_LEVEL_RANGE2,
18fa0 20 26 70 52 61 6e 67 65 2c 20 30 29 3b 0a 0a 20   &pRange, 0);.. 
18fb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18fc0 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 4f  OK ){.    int bO
18fd0 6b 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 69  k = 0;.    i64 i
18fe0 4c 61 73 74 20 3d 20 28 69 41 62 73 4c 65 76 65  Last = (iAbsLeve
18ff0 6c 2f 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41  l/FTS3_SEGDIR_MA
19000 58 4c 45 56 45 4c 20 2b 20 31 29 20 2a 20 46 54  XLEVEL + 1) * FT
19010 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56  S3_SEGDIR_MAXLEV
19020 45 4c 20 2d 20 31 3b 0a 20 20 20 20 69 36 34 20  EL - 1;.    i64 
19030 6e 4c 69 6d 69 74 20 3d 20 28 6e 42 79 74 65 2a  nLimit = (nByte*
19040 33 29 2f 32 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f  3)/2;..    /* Lo
19050 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 65  op through all e
19060 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 25 5f  ntries in the %_
19070 73 65 67 64 69 72 20 74 61 62 6c 65 20 63 6f 72  segdir table cor
19080 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 0a 20  responding to . 
19090 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 73 20 69     ** segments i
190a0 6e 20 74 68 69 73 20 69 6e 64 65 78 20 6f 6e 20  n this index on 
190b0 6c 65 76 65 6c 73 20 67 72 65 61 74 65 72 20 74  levels greater t
190c0 68 61 6e 20 69 41 62 73 4c 65 76 65 6c 2e 20 49  han iAbsLevel. I
190d0 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a  f there is.    *
190e0 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 73  * at least one s
190f0 75 63 68 20 73 65 67 6d 65 6e 74 2c 20 61 6e 64  uch segment, and
19100 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
19110 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 61  to determine tha
19120 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 73 75  t all .    ** su
19130 63 68 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20  ch segments are 
19140 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6e 4c 69  smaller than nLi
19150 6d 69 74 20 62 79 74 65 73 20 69 6e 20 73 69 7a  mit bytes in siz
19160 65 2c 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20  e, they will be 
19170 0a 20 20 20 20 2a 2a 20 70 72 6f 6d 6f 74 65 64  .    ** promoted
19180 20 74 6f 20 6c 65 76 65 6c 20 69 41 62 73 4c 65   to level iAbsLe
19190 76 65 6c 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c  vel.  */.    sql
191a0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
191b0 70 52 61 6e 67 65 2c 20 31 2c 20 69 41 62 73 4c  pRange, 1, iAbsL
191c0 65 76 65 6c 2b 31 29 3b 0a 20 20 20 20 73 71 6c  evel+1);.    sql
191d0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
191e0 70 52 61 6e 67 65 2c 20 32 2c 20 69 4c 61 73 74  pRange, 2, iLast
191f0 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51  );.    while( SQ
19200 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
19210 33 5f 73 74 65 70 28 70 52 61 6e 67 65 29 20 29  3_step(pRange) )
19220 7b 0a 20 20 20 20 20 20 69 36 34 20 6e 53 69 7a  {.      i64 nSiz
19230 65 20 3d 20 30 2c 20 64 75 6d 6d 79 3b 0a 20 20  e = 0, dummy;.  
19240 20 20 20 20 66 74 73 33 52 65 61 64 45 6e 64 42      fts3ReadEndB
19250 6c 6f 63 6b 46 69 65 6c 64 28 70 52 61 6e 67 65  lockField(pRange
19260 2c 20 32 2c 20 26 64 75 6d 6d 79 2c 20 26 6e 53  , 2, &dummy, &nS
19270 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
19280 6e 53 69 7a 65 3c 3d 30 20 7c 7c 20 6e 53 69 7a  nSize<=0 || nSiz
19290 65 3e 6e 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  e>nLimit ){.    
192a0 20 20 20 20 2f 2a 20 49 66 20 6e 53 69 7a 65 3d      /* If nSize=
192b0 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 25 5f 73  =0, then the %_s
192c0 65 67 64 69 72 2e 65 6e 64 5f 62 6c 6f 63 6b 20  egdir.end_block 
192d0 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6e  field does not n
192e0 6f 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  ot .        ** c
192f0 6f 6e 74 61 69 6e 20 61 20 73 69 7a 65 20 76 61  ontain a size va
19300 6c 75 65 2e 20 54 68 69 73 20 68 61 70 70 65 6e  lue. This happen
19310 73 20 69 66 20 69 74 20 77 61 73 20 77 72 69 74  s if it was writ
19320 74 65 6e 20 62 79 20 61 6e 0a 20 20 20 20 20 20  ten by an.      
19330 20 20 2a 2a 20 6f 6c 64 20 76 65 72 73 69 6f 6e    ** old version
19340 20 6f 66 20 46 54 53 2e 20 49 6e 20 74 68 69 73   of FTS. In this
19350 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
19360 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 74 65  possible to dete
19370 72 6d 69 6e 65 0a 20 20 20 20 20 20 20 20 2a 2a  rmine.        **
19380 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
19390 20 73 65 67 6d 65 6e 74 2c 20 61 6e 64 20 73 6f   segment, and so
193a0 20 73 65 67 6d 65 6e 74 20 70 72 6f 6d 6f 74 69   segment promoti
193b0 6f 6e 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20  on does not.    
193c0 20 20 20 20 2a 2a 20 74 61 6b 65 20 70 6c 61 63      ** take plac
193d0 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  e.  */.        b
193e0 4f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  Ok = 0;.        
193f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
19400 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20 20       bOk = 1;.  
19410 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
19420 69 74 65 33 5f 72 65 73 65 74 28 70 52 61 6e 67  ite3_reset(pRang
19430 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 62 4f 6b  e);..    if( bOk
19440 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49   ){.      int iI
19450 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  dx = 0;.      sq
19460 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 55 70 64  lite3_stmt *pUpd
19470 61 74 65 31 3b 0a 20 20 20 20 20 20 73 71 6c 69  ate1;.      sqli
19480 74 65 33 5f 73 74 6d 74 20 2a 70 55 70 64 61 74  te3_stmt *pUpdat
19490 65 32 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72  e2;..      if( r
194a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
194b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
194c0 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
194d0 55 50 44 41 54 45 5f 4c 45 56 45 4c 5f 49 44 58  UPDATE_LEVEL_IDX
194e0 2c 20 26 70 55 70 64 61 74 65 31 2c 20 30 29 3b  , &pUpdate1, 0);
194f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
19500 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19510 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
19520 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
19530 53 51 4c 5f 55 50 44 41 54 45 5f 4c 45 56 45 4c  SQL_UPDATE_LEVEL
19540 2c 20 26 70 55 70 64 61 74 65 32 2c 20 30 29 3b  , &pUpdate2, 0);
19550 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
19560 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19570 4b 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  K ){..        /*
19580 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
19590 6c 20 25 5f 73 65 67 64 69 72 20 65 6e 74 72 69  l %_segdir entri
195a0 65 73 20 66 6f 72 20 73 65 67 6d 65 6e 74 73 20  es for segments 
195b0 69 6e 20 74 68 69 73 20 69 6e 64 65 78 20 77 69  in this index wi
195c0 74 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 65  th.        ** le
195d0 76 65 6c 73 20 65 71 75 61 6c 20 74 6f 20 6f 72  vels equal to or
195e0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 69 41   greater than iA
195f0 62 73 4c 65 76 65 6c 2e 20 41 73 20 65 61 63 68  bsLevel. As each
19600 20 65 6e 74 72 79 20 69 73 20 76 69 73 69 74 65   entry is visite
19610 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70  d,.        ** up
19620 64 61 74 65 64 20 69 74 20 74 6f 20 73 65 74 20  dated it to set 
19630 28 6c 65 76 65 6c 20 3d 20 2d 31 29 20 61 6e 64  (level = -1) and
19640 20 28 69 64 78 20 3d 20 4e 29 2c 20 77 68 65 72   (idx = N), wher
19650 65 20 4e 20 69 73 20 30 20 66 6f 72 20 74 68 65  e N is 0 for the
19660 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6c 64 65  .        ** olde
19670 73 74 20 73 65 67 6d 65 6e 74 20 69 6e 20 74 68  st segment in th
19680 65 20 72 61 6e 67 65 2c 20 31 20 66 6f 72 20 74  e range, 1 for t
19690 68 65 20 6e 65 78 74 20 6f 6c 64 65 73 74 2c 20  he next oldest, 
196a0 61 6e 64 20 73 6f 20 6f 6e 2e 0a 20 20 20 20 20  and so on..     
196b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
196c0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
196d0 20 6d 6f 76 65 20 61 6c 6c 20 73 65 67 6d 65 6e   move all segmen
196e0 74 73 20 62 65 69 6e 67 20 70 72 6f 6d 6f 74 65  ts being promote
196f0 64 20 74 6f 20 6c 65 76 65 6c 20 2d 31 2c 0a 20  d to level -1,. 
19700 20 20 20 20 20 20 20 2a 2a 20 73 65 74 74 69 6e         ** settin
19710 67 20 74 68 65 20 22 69 64 78 22 20 66 69 65 6c  g the "idx" fiel
19720 64 73 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ds as appropriat
19730 65 20 74 6f 20 6b 65 65 70 20 74 68 65 6d 20 69  e to keep them i
19740 6e 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20  n the same.     
19750 20 20 20 2a 2a 20 6f 72 64 65 72 2e 20 54 68 65     ** order. The
19760 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6c 65 76   contents of lev
19770 65 6c 20 2d 31 20 28 77 68 69 63 68 20 69 73 20  el -1 (which is 
19780 6e 65 76 65 72 20 75 73 65 64 2c 20 65 78 63 65  never used, exce
19790 70 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  pt.        ** tr
197a0 61 6e 73 69 65 6e 74 6c 79 20 68 65 72 65 29 2c  ansiently here),
197b0 20 77 69 6c 6c 20 62 65 20 6d 6f 76 65 64 20 62   will be moved b
197c0 61 63 6b 20 74 6f 20 6c 65 76 65 6c 20 69 41 62  ack to level iAb
197d0 73 4c 65 76 65 6c 20 62 65 6c 6f 77 2e 20 20 2a  sLevel below.  *
197e0 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
197f0 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 52 61  3_bind_int64(pRa
19800 6e 67 65 2c 20 31 2c 20 69 41 62 73 4c 65 76 65  nge, 1, iAbsLeve
19810 6c 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  l);.        whil
19820 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  e( SQLITE_ROW==s
19830 71 6c 69 74 65 33 5f 73 74 65 70 28 70 52 61 6e  qlite3_step(pRan
19840 67 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ge) ){.         
19850 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
19860 74 28 70 55 70 64 61 74 65 31 2c 20 31 2c 20 69  t(pUpdate1, 1, i
19870 49 64 78 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20  Idx++);.        
19880 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
19890 6e 74 28 70 55 70 64 61 74 65 31 2c 20 32 2c 20  nt(pUpdate1, 2, 
198a0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
198b0 6e 74 28 70 52 61 6e 67 65 2c 20 30 29 29 3b 0a  nt(pRange, 0));.
198c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
198d0 33 5f 62 69 6e 64 5f 69 6e 74 28 70 55 70 64 61  3_bind_int(pUpda
198e0 74 65 31 2c 20 33 2c 20 73 71 6c 69 74 65 33 5f  te1, 3, sqlite3_
198f0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 52 61 6e 67  column_int(pRang
19900 65 2c 20 31 29 29 3b 0a 20 20 20 20 20 20 20 20  e, 1));.        
19910 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
19920 55 70 64 61 74 65 31 29 3b 0a 20 20 20 20 20 20  Update1);.      
19930 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19940 5f 72 65 73 65 74 28 70 55 70 64 61 74 65 31 29  _reset(pUpdate1)
19950 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
19960 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19970 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
19980 69 74 65 33 5f 72 65 73 65 74 28 70 52 61 6e 67  ite3_reset(pRang
19990 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
199a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
199b0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
199c0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
199d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
199e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
199f0 69 74 65 33 5f 72 65 73 65 74 28 70 52 61 6e 67  ite3_reset(pRang
19a00 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  e);.      }..   
19a10 20 20 20 2f 2a 20 4d 6f 76 65 20 6c 65 76 65 6c     /* Move level
19a20 20 2d 31 20 74 6f 20 6c 65 76 65 6c 20 69 41 62   -1 to level iAb
19a30 73 4c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 20 20  sLevel */.      
19a40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19a50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
19a60 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
19a70 70 55 70 64 61 74 65 32 2c 20 31 2c 20 69 41 62  pUpdate2, 1, iAb
19a80 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 20  sLevel);.       
19a90 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 55   sqlite3_step(pU
19aa0 70 64 61 74 65 32 29 3b 0a 20 20 20 20 20 20 20  pdate2);.       
19ab0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
19ac0 73 65 74 28 70 55 70 64 61 74 65 32 29 3b 0a 20  set(pUpdate2);. 
19ad0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
19ae0 0a 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ...  return rc;.
19af0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 61  }../*.** Merge a
19b00 6c 6c 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20  ll level iLevel 
19b10 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  segments in the 
19b20 64 61 74 61 62 61 73 65 20 69 6e 74 6f 20 61 20  database into a 
19b30 73 69 6e 67 6c 65 20 0a 2a 2a 20 69 4c 65 76 65  single .** iLeve
19b40 6c 2b 31 20 73 65 67 6d 65 6e 74 2e 20 4f 72 2c  l+1 segment. Or,
19b50 20 69 66 20 69 4c 65 76 65 6c 3c 30 2c 20 6d 65   if iLevel<0, me
19b60 72 67 65 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73  rge all segments
19b70 20 69 6e 74 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c   into a.** singl
19b80 65 20 73 65 67 6d 65 6e 74 20 77 69 74 68 20 61  e segment with a
19b90 20 6c 65 76 65 6c 20 65 71 75 61 6c 20 74 6f 20   level equal to 
19ba0 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20  the numerically 
19bb0 6c 61 72 67 65 73 74 20 6c 65 76 65 6c 20 0a 2a  largest level .*
19bc0 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 72 65 73  * currently pres
19bd0 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
19be0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
19bf0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
19c00 61 6c 6c 65 64 20 77 69 74 68 20 69 4c 65 76 65  alled with iLeve
19c10 6c 3c 30 2c 20 62 75 74 20 74 68 65 72 65 20 69  l<0, but there i
19c20 73 20 6f 6e 6c 79 20 6f 6e 65 0a 2a 2a 20 73 65  s only one.** se
19c30 67 6d 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  gment in the dat
19c40 61 62 61 73 65 2c 20 53 51 4c 49 54 45 5f 44 4f  abase, SQLITE_DO
19c50 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  NE is returned i
19c60 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 2a 2a 20  mmediately. .** 
19c70 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 73 75  Otherwise, if su
19c80 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
19c90 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
19ca0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
19cb0 75 72 73 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69  urs, .** an SQLi
19cc0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
19cd0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
19ce0 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67  atic int fts3Seg
19cf0 6d 65 6e 74 4d 65 72 67 65 28 0a 20 20 46 74 73  mentMerge(.  Fts
19d00 33 54 61 62 6c 65 20 2a 70 2c 20 0a 20 20 69 6e  3Table *p, .  in
19d10 74 20 69 4c 61 6e 67 69 64 2c 20 20 20 20 20 20  t iLangid,      
19d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19d30 20 4c 61 6e 67 75 61 67 65 20 69 64 20 74 6f 20   Language id to 
19d40 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69  merge */.  int i
19d50 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20  Index,          
19d60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
19d70 64 65 78 20 69 6e 20 70 2d 3e 61 49 6e 64 65 78  dex in p->aIndex
19d80 5b 5d 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20  [] to merge */. 
19d90 20 69 6e 74 20 69 4c 65 76 65 6c 20 20 20 20 20   int iLevel     
19da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19db0 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 6d 65 72   /* Level to mer
19dc0 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ge */.){.  int r
19dd0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
19de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
19df0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
19e00 6e 74 20 69 49 64 78 20 3d 20 30 3b 20 20 20 20  nt iIdx = 0;    
19e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19e20 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 77 20 73  * Index of new s
19e30 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69  egment */.  sqli
19e40 74 65 33 5f 69 6e 74 36 34 20 69 4e 65 77 4c 65  te3_int64 iNewLe
19e50 76 65 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4c  vel = 0;    /* L
19e60 65 76 65 6c 2f 69 6e 64 65 78 20 74 6f 20 63 72  evel/index to cr
19e70 65 61 74 65 20 6e 65 77 20 73 65 67 6d 65 6e 74  eate new segment
19e80 20 61 74 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74   at */.  Segment
19e90 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20  Writer *pWriter 
19ea0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 55 73 65 64  = 0;     /* Used
19eb0 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e 65   to write the ne
19ec0 77 2c 20 6d 65 72 67 65 64 2c 20 73 65 67 6d 65  w, merged, segme
19ed0 6e 74 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 46  nt */.  Fts3SegF
19ee0 69 6c 74 65 72 20 66 69 6c 74 65 72 3b 20 20 20  ilter filter;   
19ef0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65          /* Segme
19f00 6e 74 20 74 65 72 6d 20 66 69 6c 74 65 72 20 63  nt term filter c
19f10 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20 20 46 74  ondition */.  Ft
19f20 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
19f30 20 63 73 72 3b 20 20 20 20 20 20 20 20 20 2f 2a   csr;         /*
19f40 20 43 75 72 73 6f 72 20 74 6f 20 69 74 65 72 61   Cursor to itera
19f50 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c  te through level
19f60 28 73 29 20 2a 2f 0a 20 20 69 6e 74 20 62 49 67  (s) */.  int bIg
19f70 6e 6f 72 65 45 6d 70 74 79 20 3d 20 30 3b 20 20  noreEmpty = 0;  
19f80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
19f90 20 74 6f 20 69 67 6e 6f 72 65 20 65 6d 70 74 79   to ignore empty
19fa0 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69   segments */.  i
19fb0 36 34 20 69 4d 61 78 4c 65 76 65 6c 20 3d 20 30  64 iMaxLevel = 0
19fc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
19fd0 2a 20 4d 61 78 20 6c 65 76 65 6c 20 6e 75 6d 62  * Max level numb
19fe0 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65  er for this inde
19ff0 78 2f 6c 61 6e 67 69 64 20 2a 2f 0a 0a 20 20 61  x/langid */..  a
1a000 73 73 65 72 74 28 20 69 4c 65 76 65 6c 3d 3d 46  ssert( iLevel==F
1a010 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c  TS3_SEGCURSOR_AL
1a020 4c 0a 20 20 20 20 20 20 20 7c 7c 20 69 4c 65 76  L.       || iLev
1a030 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53  el==FTS3_SEGCURS
1a040 4f 52 5f 50 45 4e 44 49 4e 47 0a 20 20 20 20 20  OR_PENDING.     
1a050 20 20 7c 7c 20 69 4c 65 76 65 6c 3e 3d 30 0a 20    || iLevel>=0. 
1a060 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c   );.  assert( iL
1a070 65 76 65 6c 3c 46 54 53 33 5f 53 45 47 44 49 52  evel<FTS3_SEGDIR
1a080 5f 4d 41 58 4c 45 56 45 4c 20 29 3b 0a 20 20 61  _MAXLEVEL );.  a
1a090 73 73 65 72 74 28 20 69 49 6e 64 65 78 3e 3d 30  ssert( iIndex>=0
1a0a0 20 26 26 20 69 49 6e 64 65 78 3c 70 2d 3e 6e 49   && iIndex<p->nI
1a0b0 6e 64 65 78 20 29 3b 0a 0a 20 20 72 63 20 3d 20  ndex );..  rc = 
1a0c0 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
1a0d0 61 64 65 72 43 75 72 73 6f 72 28 70 2c 20 69 4c  aderCursor(p, iL
1a0e0 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69  angid, iIndex, i
1a0f0 4c 65 76 65 6c 2c 20 30 2c 20 30 2c 20 31 2c 20  Level, 0, 0, 1, 
1a100 30 2c 20 26 63 73 72 29 3b 0a 20 20 69 66 28 20  0, &csr);.  if( 
1a110 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1a120 20 63 73 72 2e 6e 53 65 67 6d 65 6e 74 3d 3d 30   csr.nSegment==0
1a130 20 29 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64   ) goto finished
1a140 3b 0a 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 21  ;..  if( iLevel!
1a150 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f  =FTS3_SEGCURSOR_
1a160 50 45 4e 44 49 4e 47 20 29 7b 0a 20 20 20 20 72  PENDING ){.    r
1a170 63 20 3d 20 66 74 73 33 53 65 67 6d 65 6e 74 4d  c = fts3SegmentM
1a180 61 78 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67  axLevel(p, iLang
1a190 69 64 2c 20 69 49 6e 64 65 78 2c 20 26 69 4d 61  id, iIndex, &iMa
1a1a0 78 4c 65 76 65 6c 29 3b 0a 20 20 20 20 69 66 28  xLevel);.    if(
1a1b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a1c0 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a   goto finished;.
1a1d0 20 20 7d 0a 0a 20 20 69 66 28 20 69 4c 65 76 65    }..  if( iLeve
1a1e0 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f  l==FTS3_SEGCURSO
1a1f0 52 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 2f 2a 20  R_ALL ){.    /* 
1a200 54 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20  This call is to 
1a210 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d 65 6e  merge all segmen
1a220 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ts in the databa
1a230 73 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 0a 20  se to a single. 
1a240 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 2e 20 54     ** segment. T
1a250 68 65 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  he level of the 
1a260 6e 65 77 20 73 65 67 6d 65 6e 74 20 69 73 20 65  new segment is e
1a270 71 75 61 6c 20 74 6f 20 74 68 65 20 6e 75 6d 65  qual to the nume
1a280 72 69 63 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 67  rically.    ** g
1a290 72 65 61 74 65 73 74 20 73 65 67 6d 65 6e 74 20  reatest segment 
1a2a0 6c 65 76 65 6c 20 63 75 72 72 65 6e 74 6c 79 20  level currently 
1a2b0 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64  present in the d
1a2c0 61 74 61 62 61 73 65 20 66 6f 72 20 74 68 69 73  atabase for this
1a2d0 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e 20 54  .    ** index. T
1a2e0 68 65 20 69 64 78 20 6f 66 20 74 68 65 20 6e 65  he idx of the ne
1a2f0 77 20 73 65 67 6d 65 6e 74 20 69 73 20 61 6c 77  w segment is alw
1a300 61 79 73 20 30 2e 20 20 2a 2f 0a 20 20 20 20 69  ays 0.  */.    i
1a310 66 28 20 63 73 72 2e 6e 53 65 67 6d 65 6e 74 3d  f( csr.nSegment=
1a320 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =1 ){.      rc =
1a330 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1a340 20 20 20 20 67 6f 74 6f 20 66 69 6e 69 73 68 65      goto finishe
1a350 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4e 65  d;.    }.    iNe
1a360 77 4c 65 76 65 6c 20 3d 20 69 4d 61 78 4c 65 76  wLevel = iMaxLev
1a370 65 6c 3b 0a 20 20 20 20 62 49 67 6e 6f 72 65 45  el;.    bIgnoreE
1a380 6d 70 74 79 20 3d 20 31 3b 0a 0a 20 20 7d 65 6c  mpty = 1;..  }el
1a390 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  se{.    /* This 
1a3a0 63 61 6c 6c 20 69 73 20 74 6f 20 6d 65 72 67 65  call is to merge
1a3b0 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 61 74   all segments at
1a3c0 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2e 20 66   level iLevel. f
1a3d0 69 6e 64 20 74 68 65 20 6e 65 78 74 0a 20 20 20  ind the next.   
1a3e0 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 73 65   ** available se
1a3f0 67 6d 65 6e 74 20 69 6e 64 65 78 20 61 74 20 6c  gment index at l
1a400 65 76 65 6c 20 69 4c 65 76 65 6c 2b 31 2e 20 54  evel iLevel+1. T
1a410 68 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  he call to.    *
1a420 2a 20 66 74 73 33 41 6c 6c 6f 63 61 74 65 53 65  * fts3AllocateSe
1a430 67 64 69 72 49 64 78 28 29 20 77 69 6c 6c 20 6d  gdirIdx() will m
1a440 65 72 67 65 20 74 68 65 20 73 65 67 6d 65 6e 74  erge the segment
1a450 73 20 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65  s at level iLeve
1a460 6c 2b 31 20 74 6f 20 0a 20 20 20 20 2a 2a 20 61  l+1 to .    ** a
1a470 20 73 69 6e 67 6c 65 20 69 4c 65 76 65 6c 2b 32   single iLevel+2
1a480 20 73 65 67 6d 65 6e 74 20 69 66 20 6e 65 63 65   segment if nece
1a490 73 73 61 72 79 2e 20 20 2a 2f 0a 20 20 20 20 61  ssary.  */.    a
1a4a0 73 73 65 72 74 28 20 46 54 53 33 5f 53 45 47 43  ssert( FTS3_SEGC
1a4b0 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 3d 3d 2d  URSOR_PENDING==-
1a4c0 31 20 29 3b 0a 20 20 20 20 69 4e 65 77 4c 65 76  1 );.    iNewLev
1a4d0 65 6c 20 3d 20 67 65 74 41 62 73 6f 6c 75 74 65  el = getAbsolute
1a4e0 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64  Level(p, iLangid
1a4f0 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c  , iIndex, iLevel
1a500 2b 31 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 74  +1);.    rc = ft
1a510 73 33 41 6c 6c 6f 63 61 74 65 53 65 67 64 69 72  s3AllocateSegdir
1a520 49 64 78 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20  Idx(p, iLangid, 
1a530 69 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 2b 31  iIndex, iLevel+1
1a540 2c 20 26 69 49 64 78 29 3b 0a 20 20 20 20 62 49  , &iIdx);.    bI
1a550 67 6e 6f 72 65 45 6d 70 74 79 20 3d 20 28 69 4c  gnoreEmpty = (iL
1a560 65 76 65 6c 21 3d 46 54 53 33 5f 53 45 47 43 55  evel!=FTS3_SEGCU
1a570 52 53 4f 52 5f 50 45 4e 44 49 4e 47 29 20 26 26  RSOR_PENDING) &&
1a580 20 28 69 4e 65 77 4c 65 76 65 6c 3e 69 4d 61 78   (iNewLevel>iMax
1a590 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 20 20 69 66  Level);.  }.  if
1a5a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a5b0 29 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b  ) goto finished;
1a5c0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 73 72 2e  ..  assert( csr.
1a5d0 6e 53 65 67 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  nSegment>0 );.  
1a5e0 61 73 73 65 72 74 28 20 69 4e 65 77 4c 65 76 65  assert( iNewLeve
1a5f0 6c 3e 3d 67 65 74 41 62 73 6f 6c 75 74 65 4c 65  l>=getAbsoluteLe
1a600 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20  vel(p, iLangid, 
1a610 69 49 6e 64 65 78 2c 20 30 29 20 29 3b 0a 20 20  iIndex, 0) );.  
1a620 61 73 73 65 72 74 28 20 69 4e 65 77 4c 65 76 65  assert( iNewLeve
1a630 6c 3c 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76  l<getAbsoluteLev
1a640 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69  el(p, iLangid, i
1a650 49 6e 64 65 78 2c 46 54 53 33 5f 53 45 47 44 49  Index,FTS3_SEGDI
1a660 52 5f 4d 41 58 4c 45 56 45 4c 29 20 29 3b 0a 0a  R_MAXLEVEL) );..
1a670 20 20 6d 65 6d 73 65 74 28 26 66 69 6c 74 65 72    memset(&filter
1a680 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 33  , 0, sizeof(Fts3
1a690 53 65 67 46 69 6c 74 65 72 29 29 3b 0a 20 20 66  SegFilter));.  f
1a6a0 69 6c 74 65 72 2e 66 6c 61 67 73 20 3d 20 46 54  ilter.flags = FT
1a6b0 53 33 5f 53 45 47 4d 45 4e 54 5f 52 45 51 55 49  S3_SEGMENT_REQUI
1a6c0 52 45 5f 50 4f 53 3b 0a 20 20 66 69 6c 74 65 72  RE_POS;.  filter
1a6d0 2e 66 6c 61 67 73 20 7c 3d 20 28 62 49 67 6e 6f  .flags |= (bIgno
1a6e0 72 65 45 6d 70 74 79 20 3f 20 46 54 53 33 5f 53  reEmpty ? FTS3_S
1a6f0 45 47 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d  EGMENT_IGNORE_EM
1a700 50 54 59 20 3a 20 30 29 3b 0a 0a 20 20 72 63 20  PTY : 0);..  rc 
1a710 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  = sqlite3Fts3Seg
1a720 52 65 61 64 65 72 53 74 61 72 74 28 70 2c 20 26  ReaderStart(p, &
1a730 63 73 72 2c 20 26 66 69 6c 74 65 72 29 3b 0a 20  csr, &filter);. 
1a740 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 4f   while( SQLITE_O
1a750 4b 3d 3d 72 63 20 29 7b 0a 20 20 20 20 72 63 20  K==rc ){.    rc 
1a760 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  = sqlite3Fts3Seg
1a770 52 65 61 64 65 72 53 74 65 70 28 70 2c 20 26 63  ReaderStep(p, &c
1a780 73 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  sr);.    if( rc!
1a790 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 20 62 72  =SQLITE_ROW ) br
1a7a0 65 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20 66 74  eak;.    rc = ft
1a7b0 73 33 53 65 67 57 72 69 74 65 72 41 64 64 28 70  s3SegWriterAdd(p
1a7c0 2c 20 26 70 57 72 69 74 65 72 2c 20 31 2c 20 0a  , &pWriter, 1, .
1a7d0 20 20 20 20 20 20 20 20 63 73 72 2e 7a 54 65 72          csr.zTer
1a7e0 6d 2c 20 63 73 72 2e 6e 54 65 72 6d 2c 20 63 73  m, csr.nTerm, cs
1a7f0 72 2e 61 44 6f 63 6c 69 73 74 2c 20 63 73 72 2e  r.aDoclist, csr.
1a800 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 7d 0a 20  nDoclist);.  }. 
1a810 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a820 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69 73 68  OK ) goto finish
1a830 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57  ed;.  assert( pW
1a840 72 69 74 65 72 20 7c 7c 20 62 49 67 6e 6f 72 65  riter || bIgnore
1a850 45 6d 70 74 79 20 29 3b 0a 0a 20 20 69 66 28 20  Empty );..  if( 
1a860 69 4c 65 76 65 6c 21 3d 46 54 53 33 5f 53 45 47  iLevel!=FTS3_SEG
1a870 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 20 29  CURSOR_PENDING )
1a880 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 44  {.    rc = fts3D
1a890 65 6c 65 74 65 53 65 67 64 69 72 28 0a 20 20 20  eleteSegdir(.   
1a8a0 20 20 20 20 20 70 2c 20 69 4c 61 6e 67 69 64 2c       p, iLangid,
1a8b0 20 69 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 2c   iIndex, iLevel,
1a8c0 20 63 73 72 2e 61 70 53 65 67 6d 65 6e 74 2c 20   csr.apSegment, 
1a8d0 63 73 72 2e 6e 53 65 67 6d 65 6e 74 0a 20 20 20  csr.nSegment.   
1a8e0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
1a8f0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1a900 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 7d 0a 20   finished;.  }. 
1a910 20 69 66 28 20 70 57 72 69 74 65 72 20 29 7b 0a   if( pWriter ){.
1a920 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67      rc = fts3Seg
1a930 57 72 69 74 65 72 46 6c 75 73 68 28 70 2c 20 70  WriterFlush(p, p
1a940 57 72 69 74 65 72 2c 20 69 4e 65 77 4c 65 76 65  Writer, iNewLeve
1a950 6c 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 69 66  l, iIdx);.    if
1a960 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a970 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 4c 65  ){.      if( iLe
1a980 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55 52  vel==FTS3_SEGCUR
1a990 53 4f 52 5f 50 45 4e 44 49 4e 47 20 7c 7c 20 69  SOR_PENDING || i
1a9a0 4e 65 77 4c 65 76 65 6c 3c 69 4d 61 78 4c 65 76  NewLevel<iMaxLev
1a9b0 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  el ){.        rc
1a9c0 20 3d 20 66 74 73 33 50 72 6f 6d 6f 74 65 53 65   = fts3PromoteSe
1a9d0 67 6d 65 6e 74 73 28 70 2c 20 69 4e 65 77 4c 65  gments(p, iNewLe
1a9e0 76 65 6c 2c 20 70 57 72 69 74 65 72 2d 3e 6e 4c  vel, pWriter->nL
1a9f0 65 61 66 44 61 74 61 29 3b 0a 20 20 20 20 20 20  eafData);.      
1aa00 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 66 69  }.    }.  }.. fi
1aa10 6e 69 73 68 65 64 3a 0a 20 20 66 74 73 33 53 65  nished:.  fts3Se
1aa20 67 57 72 69 74 65 72 46 72 65 65 28 70 57 72 69  gWriterFree(pWri
1aa30 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  ter);.  sqlite3F
1aa40 74 73 33 53 65 67 52 65 61 64 65 72 46 69 6e 69  ts3SegReaderFini
1aa50 73 68 28 26 63 73 72 29 3b 0a 20 20 72 65 74 75  sh(&csr);.  retu
1aa60 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 20 0a 2a  rn rc;.}.../* .*
1aa70 2a 20 46 6c 75 73 68 20 74 68 65 20 63 6f 6e 74  * Flush the cont
1aa80 65 6e 74 73 20 6f 66 20 70 65 6e 64 69 6e 67 54  ents of pendingT
1aa90 65 72 6d 73 20 74 6f 20 6c 65 76 65 6c 20 30 20  erms to level 0 
1aaa0 73 65 67 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 69 6e  segments. .*/.in
1aab0 74 20 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e  t sqlite3Fts3Pen
1aac0 64 69 6e 67 54 65 72 6d 73 46 6c 75 73 68 28 46  dingTermsFlush(F
1aad0 74 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  ts3Table *p){.  
1aae0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1aaf0 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 20  OK;.  int i;.   
1ab00 20 20 20 20 20 0a 20 20 66 6f 72 28 69 3d 30 3b       .  for(i=0;
1ab10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1ab20 26 20 69 3c 70 2d 3e 6e 49 6e 64 65 78 3b 20 69  & i<p->nIndex; i
1ab30 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  ++){.    rc = ft
1ab40 73 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 70  s3SegmentMerge(p
1ab50 2c 20 70 2d 3e 69 50 72 65 76 4c 61 6e 67 69 64  , p->iPrevLangid
1ab60 2c 20 69 2c 20 46 54 53 33 5f 53 45 47 43 55 52  , i, FTS3_SEGCUR
1ab70 53 4f 52 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20  SOR_PENDING);.  
1ab80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ab90 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c  _DONE ) rc = SQL
1aba0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71  ITE_OK;.  }.  sq
1abb0 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67  lite3Fts3Pending
1abc0 54 65 72 6d 73 43 6c 65 61 72 28 70 29 3b 0a 0a  TermsClear(p);..
1abd0 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74    /* Determine t
1abe0 68 65 20 61 75 74 6f 2d 69 6e 63 72 2d 6d 65 72  he auto-incr-mer
1abf0 67 65 20 73 65 74 74 69 6e 67 20 69 66 20 75 6e  ge setting if un
1ac00 6b 6e 6f 77 6e 2e 20 20 49 66 20 65 6e 61 62 6c  known.  If enabl
1ac10 65 64 2c 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74  ed,.  ** estimat
1ac20 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
1ac30 6c 65 61 66 20 62 6c 6f 63 6b 73 20 6f 66 20 63  leaf blocks of c
1ac40 6f 6e 74 65 6e 74 20 74 6f 20 62 65 20 77 72 69  ontent to be wri
1ac50 74 74 65 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  tten.  */.  if( 
1ac60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1ac70 20 70 2d 3e 62 48 61 73 53 74 61 74 0a 20 20 20   p->bHasStat.   
1ac80 26 26 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d  && p->nAutoincrm
1ac90 65 72 67 65 3d 3d 30 78 66 66 20 26 26 20 70 2d  erge==0xff && p-
1aca0 3e 6e 4c 65 61 66 41 64 64 3e 30 0a 20 20 29 7b  >nLeafAdd>0.  ){
1acb0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
1acc0 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
1acd0 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
1ace0 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54  mt(p, SQL_SELECT
1acf0 5f 53 54 41 54 2c 20 26 70 53 74 6d 74 2c 20 30  _STAT, &pStmt, 0
1ad00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1ad10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ad20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
1ad30 6e 74 28 70 53 74 6d 74 2c 20 31 2c 20 46 54 53  nt(pStmt, 1, FTS
1ad40 5f 53 54 41 54 5f 41 55 54 4f 49 4e 43 52 4d 45  _STAT_AUTOINCRME
1ad50 52 47 45 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  RGE);.      rc =
1ad60 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
1ad70 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tmt);.      if( 
1ad80 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  rc==SQLITE_ROW )
1ad90 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 41 75  {.        p->nAu
1ada0 74 6f 69 6e 63 72 6d 65 72 67 65 20 3d 20 73 71  toincrmerge = sq
1adb0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
1adc0 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
1add0 20 20 20 20 69 66 28 20 70 2d 3e 6e 41 75 74 6f      if( p->nAuto
1ade0 69 6e 63 72 6d 65 72 67 65 3d 3d 31 20 29 20 70  incrmerge==1 ) p
1adf0 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d 65 72 67 65  ->nAutoincrmerge
1ae00 20 3d 20 38 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 8;.      }els
1ae10 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
1ae20 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
1ae30 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d 65 72   p->nAutoincrmer
1ae40 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
1ae50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1ae60 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
1ae70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1ae80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ae90 20 45 6e 63 6f 64 65 20 4e 20 69 6e 74 65 67 65   Encode N intege
1aea0 72 73 20 61 73 20 76 61 72 69 6e 74 73 20 69 6e  rs as varints in
1aeb0 74 6f 20 61 20 62 6c 6f 62 2e 0a 2a 2f 0a 73 74  to a blob..*/.st
1aec0 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 45 6e  atic void fts3En
1aed0 63 6f 64 65 49 6e 74 41 72 72 61 79 28 0a 20 20  codeIntArray(.  
1aee0 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20  int N,          
1aef0 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
1af00 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74 6f 20   of integers to 
1af10 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20  encode */.  u32 
1af20 2a 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *a,            /
1af30 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 76 61  * The integer va
1af40 6c 75 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lues */.  char *
1af50 7a 42 75 66 2c 20 20 20 20 20 20 20 20 2f 2a 20  zBuf,        /* 
1af60 57 72 69 74 65 20 74 68 65 20 42 4c 4f 42 20 68  Write the BLOB h
1af70 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e  ere */.  int *pN
1af80 42 75 66 20 20 20 20 20 20 20 20 20 2f 2a 20 57  Buf         /* W
1af90 72 69 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 62  rite number of b
1afa0 79 74 65 73 20 69 66 20 7a 42 75 66 5b 5d 20 75  ytes if zBuf[] u
1afb0 73 65 64 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  sed here */.){. 
1afc0 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72   int i, j;.  for
1afd0 28 69 3d 6a 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b  (i=j=0; i<N; i++
1afe0 29 7b 0a 20 20 20 20 6a 20 2b 3d 20 73 71 6c 69  ){.    j += sqli
1aff0 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74  te3Fts3PutVarint
1b000 28 26 7a 42 75 66 5b 6a 5d 2c 20 28 73 71 6c 69  (&zBuf[j], (sqli
1b010 74 65 33 5f 69 6e 74 36 34 29 61 5b 69 5d 29 3b  te3_int64)a[i]);
1b020 0a 20 20 7d 0a 20 20 2a 70 4e 42 75 66 20 3d 20  .  }.  *pNBuf = 
1b030 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  j;.}../*.** Deco
1b040 64 65 20 61 20 62 6c 6f 62 20 6f 66 20 76 61 72  de a blob of var
1b050 69 6e 74 73 20 69 6e 74 6f 20 4e 20 69 6e 74 65  ints into N inte
1b060 67 65 72 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  gers.*/.static v
1b070 6f 69 64 20 66 74 73 33 44 65 63 6f 64 65 49 6e  oid fts3DecodeIn
1b080 74 41 72 72 61 79 28 0a 20 20 69 6e 74 20 4e 2c  tArray(.  int N,
1b090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b0a0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  The number of in
1b0b0 74 65 67 65 72 73 20 74 6f 20 64 65 63 6f 64 65  tegers to decode
1b0c0 20 2a 2f 0a 20 20 75 33 32 20 2a 61 2c 20 20 20   */.  u32 *a,   
1b0d0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1b0e0 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  e the integer va
1b0f0 6c 75 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lues */.  const 
1b100 63 68 61 72 20 2a 7a 42 75 66 2c 20 20 2f 2a 20  char *zBuf,  /* 
1b110 54 68 65 20 42 4c 4f 42 20 63 6f 6e 74 61 69 6e  The BLOB contain
1b120 69 6e 67 20 74 68 65 20 76 61 72 69 6e 74 73 20  ing the varints 
1b130 2a 2f 0a 20 20 69 6e 74 20 6e 42 75 66 20 20 20  */.  int nBuf   
1b140 20 20 20 20 20 20 20 20 2f 2a 20 73 69 7a 65 20          /* size 
1b150 6f 66 20 74 68 65 20 42 4c 4f 42 20 2a 2f 0a 29  of the BLOB */.)
1b160 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
1b170 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1b180 28 6e 42 75 66 29 3b 0a 20 20 66 6f 72 28 69 3d  (nBuf);.  for(i=
1b190 6a 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a  j=0; i<N; i++){.
1b1a0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
1b1b0 34 20 78 3b 0a 20 20 20 20 6a 20 2b 3d 20 73 71  4 x;.    j += sq
1b1c0 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
1b1d0 6e 74 28 26 7a 42 75 66 5b 6a 5d 2c 20 26 78 29  nt(&zBuf[j], &x)
1b1e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 6a 3c 3d  ;.    assert(j<=
1b1f0 6e 42 75 66 29 3b 0a 20 20 20 20 61 5b 69 5d 20  nBuf);.    a[i] 
1b200 3d 20 28 75 33 32 29 28 78 20 26 20 30 78 66 66  = (u32)(x & 0xff
1b210 66 66 66 66 66 66 29 3b 0a 20 20 7d 0a 7d 0a 0a  ffffff);.  }.}..
1b220 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 74 68 65  /*.** Insert the
1b230 20 73 69 7a 65 73 20 28 69 6e 20 74 6f 6b 65 6e   sizes (in token
1b240 73 29 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  s) for each colu
1b250 6d 6e 20 6f 66 20 74 68 65 20 64 6f 63 75 6d 65  mn of the docume
1b260 6e 74 0a 2a 2a 20 77 69 74 68 20 64 6f 63 69 64  nt.** with docid
1b270 20 65 71 75 61 6c 20 74 6f 20 70 2d 3e 69 50 72   equal to p->iPr
1b280 65 76 44 6f 63 69 64 2e 20 20 54 68 65 20 73 69  evDocid.  The si
1b290 7a 65 73 20 61 72 65 20 65 6e 63 6f 64 65 64 20  zes are encoded 
1b2a0 61 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 6f 66 20  as.** a blob of 
1b2b0 76 61 72 69 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  varints..*/.stat
1b2c0 69 63 20 76 6f 69 64 20 66 74 73 33 49 6e 73 65  ic void fts3Inse
1b2d0 72 74 44 6f 63 73 69 7a 65 28 0a 20 20 69 6e 74  rtDocsize(.  int
1b2e0 20 2a 70 52 43 2c 20 20 20 20 20 20 20 20 20 20   *pRC,          
1b2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b300 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
1b310 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
1b320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b330 20 2f 2a 20 54 61 62 6c 65 20 69 6e 74 6f 20 77   /* Table into w
1b340 68 69 63 68 20 74 6f 20 69 6e 73 65 72 74 20 2a  hich to insert *
1b350 2f 0a 20 20 75 33 32 20 2a 61 53 7a 20 20 20 20  /.  u32 *aSz    
1b360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b370 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20      /* Sizes of 
1b380 65 61 63 68 20 63 6f 6c 75 6d 6e 2c 20 69 6e 20  each column, in 
1b390 74 6f 6b 65 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63  tokens */.){.  c
1b3a0 68 61 72 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20  har *pBlob;     
1b3b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42          /* The B
1b3c0 4c 4f 42 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  LOB encoding of 
1b3d0 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 73 69 7a  the document siz
1b3e0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62  e */.  int nBlob
1b3f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b400 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1b410 65 73 20 69 6e 20 74 68 65 20 42 4c 4f 42 20 2a  es in the BLOB *
1b420 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
1b430 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20   *pStmt;     /* 
1b440 53 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74  Statement used t
1b450 6f 20 69 6e 73 65 72 74 20 74 68 65 20 65 6e 63  o insert the enc
1b460 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72  oding */.  int r
1b470 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1b480 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
1b490 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74  de from subfunct
1b4a0 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a  ions */..  if( *
1b4b0 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pRC ) return;.  
1b4c0 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  pBlob = sqlite3_
1b4d0 6d 61 6c 6c 6f 63 28 20 31 30 2a 70 2d 3e 6e 43  malloc( 10*p->nC
1b4e0 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28 20 70  olumn );.  if( p
1b4f0 42 6c 6f 62 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  Blob==0 ){.    *
1b500 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  pRC = SQLITE_NOM
1b510 45 4d 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  EM;.    return;.
1b520 20 20 7d 0a 20 20 66 74 73 33 45 6e 63 6f 64 65    }.  fts3Encode
1b530 49 6e 74 41 72 72 61 79 28 70 2d 3e 6e 43 6f 6c  IntArray(p->nCol
1b540 75 6d 6e 2c 20 61 53 7a 2c 20 70 42 6c 6f 62 2c  umn, aSz, pBlob,
1b550 20 26 6e 42 6c 6f 62 29 3b 0a 20 20 72 63 20 3d   &nBlob);.  rc =
1b560 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
1b570 53 51 4c 5f 52 45 50 4c 41 43 45 5f 44 4f 43 53  SQL_REPLACE_DOCS
1b580 49 5a 45 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  IZE, &pStmt, 0);
1b590 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1b5a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
1b5b0 6c 6f 62 29 3b 0a 20 20 20 20 2a 70 52 43 20 3d  lob);.    *pRC =
1b5c0 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
1b5d0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62  .  }.  sqlite3_b
1b5e0 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  ind_int64(pStmt,
1b5f0 20 31 2c 20 70 2d 3e 69 50 72 65 76 44 6f 63 69   1, p->iPrevDoci
1b600 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69  d);.  sqlite3_bi
1b610 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 32  nd_blob(pStmt, 2
1b620 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20  , pBlob, nBlob, 
1b630 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20  sqlite3_free);. 
1b640 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
1b650 74 6d 74 29 3b 0a 20 20 2a 70 52 43 20 3d 20 73  tmt);.  *pRC = s
1b660 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
1b670 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  mt);.}../*.** Re
1b680 63 6f 72 64 20 30 20 6f 66 20 74 68 65 20 25 5f  cord 0 of the %_
1b690 73 74 61 74 20 74 61 62 6c 65 20 63 6f 6e 74 61  stat table conta
1b6a0 69 6e 73 20 61 20 62 6c 6f 62 20 63 6f 6e 73 69  ins a blob consi
1b6b0 73 74 69 6e 67 20 6f 66 20 4e 20 76 61 72 69 6e  sting of N varin
1b6c0 74 73 2c 0a 2a 2a 20 77 68 65 72 65 20 4e 20 69  ts,.** where N i
1b6d0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1b6e0 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 6f 6c  user defined col
1b6f0 75 6d 6e 73 20 69 6e 20 74 68 65 20 66 74 73 33  umns in the fts3
1b700 20 74 61 62 6c 65 20 70 6c 75 73 0a 2a 2a 20 74   table plus.** t
1b710 77 6f 2e 20 49 66 20 6e 43 6f 6c 20 69 73 20 74  wo. If nCol is t
1b720 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 65  he number of use
1b730 72 20 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e  r defined column
1b740 73 2c 20 74 68 65 6e 20 76 61 6c 75 65 73 20 6f  s, then values o
1b750 66 20 74 68 65 20 0a 2a 2a 20 76 61 72 69 6e 74  f the .** varint
1b760 73 20 61 72 65 20 73 65 74 20 61 73 20 66 6f 6c  s are set as fol
1b770 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 56 61  lows:.**.**   Va
1b780 72 69 6e 74 20 30 3a 20 20 20 20 20 20 20 54 6f  rint 0:       To
1b790 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  tal number of ro
1b7a0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ws in the table.
1b7b0 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 6e 74 20  .**.**   Varint 
1b7c0 31 2e 2e 6e 43 6f 6c 3a 20 46 6f 72 20 65 61 63  1..nCol: For eac
1b7d0 68 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 74 6f  h column, the to
1b7e0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f  tal number of to
1b7f0 6b 65 6e 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a  kens stored in.*
1b800 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1b810 20 20 20 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66      the column f
1b820 6f 72 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74  or all rows of t
1b830 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
1b840 20 20 56 61 72 69 6e 74 20 31 2b 6e 43 6f 6c 3a    Varint 1+nCol:
1b850 20 20 54 68 65 20 74 6f 74 61 6c 20 73 69 7a 65    The total size
1b860 2c 20 69 6e 20 62 79 74 65 73 2c 20 6f 66 20 61  , in bytes, of a
1b870 6c 6c 20 74 65 78 74 20 76 61 6c 75 65 73 20 69  ll text values i
1b880 6e 20 61 6c 6c 0a 2a 2a 20 20 20 20 20 20 20 20  n all.**        
1b890 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d             colum
1b8a0 6e 73 20 6f 66 20 61 6c 6c 20 72 6f 77 73 20 6f  ns of all rows o
1b8b0 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  f the table..**.
1b8c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1b8d0 74 73 33 55 70 64 61 74 65 44 6f 63 54 6f 74 61  ts3UpdateDocTota
1b8e0 6c 73 28 0a 20 20 69 6e 74 20 2a 70 52 43 2c 20  ls(.  int *pRC, 
1b8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b900 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73        /* The res
1b910 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  ult code */.  Ft
1b920 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
1b930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b940 20 54 61 62 6c 65 20 62 65 69 6e 67 20 75 70 64   Table being upd
1b950 61 74 65 64 20 2a 2f 0a 20 20 75 33 32 20 2a 61  ated */.  u32 *a
1b960 53 7a 49 6e 73 2c 20 20 20 20 20 20 20 20 20 20  SzIns,          
1b970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1b980 65 20 69 6e 63 72 65 61 73 65 73 20 2a 2f 0a 20  e increases */. 
1b990 20 75 33 32 20 2a 61 53 7a 44 65 6c 2c 20 20 20   u32 *aSzDel,   
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9b0 20 2f 2a 20 53 69 7a 65 20 64 65 63 72 65 61 73   /* Size decreas
1b9c0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 6e  es */.  int nChn
1b9d0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
1b9e0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67          /* Chang
1b9f0 65 20 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  e in the number 
1ba00 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 2a 2f 0a  of documents */.
1ba10 29 7b 0a 20 20 63 68 61 72 20 2a 70 42 6c 6f 62  ){.  char *pBlob
1ba20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1ba30 20 53 74 6f 72 61 67 65 20 66 6f 72 20 42 4c 4f   Storage for BLO
1ba40 42 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 25  B written into %
1ba50 5f 73 74 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  _stat */.  int n
1ba60 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20  Blob;           
1ba70 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 42      /* Size of B
1ba80 4c 4f 42 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  LOB written into
1ba90 20 25 5f 73 74 61 74 20 2a 2f 0a 20 20 75 33 32   %_stat */.  u32
1baa0 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20 20   *a;            
1bab0 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
1bac0 66 20 69 6e 74 65 67 65 72 73 20 74 68 61 74 20  f integers that 
1bad0 62 65 63 6f 6d 65 73 20 74 68 65 20 42 4c 4f 42  becomes the BLOB
1bae0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
1baf0 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f  mt *pStmt;     /
1bb00 2a 20 53 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  * Statement for 
1bb10 72 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74  reading and writ
1bb20 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ing */.  int i; 
1bb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb40 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1bb50 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  r */.  int rc;  
1bb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb70 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
1bb80 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
1bb90 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20 69 6e 74   */..  const int
1bba0 20 6e 53 74 61 74 20 3d 20 70 2d 3e 6e 43 6f 6c   nStat = p->nCol
1bbb0 75 6d 6e 2b 32 3b 0a 0a 20 20 69 66 28 20 2a 70  umn+2;..  if( *p
1bbc0 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  RC ) return;.  a
1bbd0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1bbe0 63 28 20 28 73 69 7a 65 6f 66 28 75 33 32 29 2b  c( (sizeof(u32)+
1bbf0 31 30 29 2a 6e 53 74 61 74 20 29 3b 0a 20 20 69  10)*nStat );.  i
1bc00 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  f( a==0 ){.    *
1bc10 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  pRC = SQLITE_NOM
1bc20 45 4d 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  EM;.    return;.
1bc30 20 20 7d 0a 20 20 70 42 6c 6f 62 20 3d 20 28 63    }.  pBlob = (c
1bc40 68 61 72 2a 29 26 61 5b 6e 53 74 61 74 5d 3b 0a  har*)&a[nStat];.
1bc50 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
1bc60 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54  mt(p, SQL_SELECT
1bc70 5f 53 54 41 54 2c 20 26 70 53 74 6d 74 2c 20 30  _STAT, &pStmt, 0
1bc80 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1bc90 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1bca0 61 29 3b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72  a);.    *pRC = r
1bcb0 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
1bcc0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e   }.  sqlite3_bin
1bcd0 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 2c 20  d_int(pStmt, 1, 
1bce0 46 54 53 5f 53 54 41 54 5f 44 4f 43 54 4f 54 41  FTS_STAT_DOCTOTA
1bcf0 4c 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  L);.  if( sqlite
1bd00 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
1bd10 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
1bd20 20 66 74 73 33 44 65 63 6f 64 65 49 6e 74 41 72   fts3DecodeIntAr
1bd30 72 61 79 28 6e 53 74 61 74 2c 20 61 2c 0a 20 20  ray(nStat, a,.  
1bd40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
1bd50 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74  olumn_blob(pStmt
1bd60 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 73  , 0),.         s
1bd70 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
1bd80 74 65 73 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a  tes(pStmt, 0));.
1bd90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
1bda0 73 65 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66  set(a, 0, sizeof
1bdb0 28 75 33 32 29 2a 28 6e 53 74 61 74 29 20 29 3b  (u32)*(nStat) );
1bdc0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
1bdd0 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
1bde0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1bdf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
1be00 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20  ite3_free(a);.  
1be10 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
1be20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
1be30 66 28 20 6e 43 68 6e 67 3c 30 20 26 26 20 61 5b  f( nChng<0 && a[
1be40 30 5d 3c 28 75 33 32 29 28 2d 6e 43 68 6e 67 29  0]<(u32)(-nChng)
1be50 20 29 7b 0a 20 20 20 20 61 5b 30 5d 20 3d 20 30   ){.    a[0] = 0
1be60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
1be70 5b 30 5d 20 2b 3d 20 6e 43 68 6e 67 3b 0a 20 20  [0] += nChng;.  
1be80 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
1be90 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 3b 20 69 2b 2b  ->nColumn+1; i++
1bea0 29 7b 0a 20 20 20 20 75 33 32 20 78 20 3d 20 61  ){.    u32 x = a
1beb0 5b 69 2b 31 5d 3b 0a 20 20 20 20 69 66 28 20 78  [i+1];.    if( x
1bec0 2b 61 53 7a 49 6e 73 5b 69 5d 20 3c 20 61 53 7a  +aSzIns[i] < aSz
1bed0 44 65 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  Del[i] ){.      
1bee0 78 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  x = 0;.    }else
1bef0 7b 0a 20 20 20 20 20 20 78 20 3d 20 78 20 2b 20  {.      x = x + 
1bf00 61 53 7a 49 6e 73 5b 69 5d 20 2d 20 61 53 7a 44  aSzIns[i] - aSzD
1bf10 65 6c 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  el[i];.    }.   
1bf20 20 61 5b 69 2b 31 5d 20 3d 20 78 3b 0a 20 20 7d   a[i+1] = x;.  }
1bf30 0a 20 20 66 74 73 33 45 6e 63 6f 64 65 49 6e 74  .  fts3EncodeInt
1bf40 41 72 72 61 79 28 6e 53 74 61 74 2c 20 61 2c 20  Array(nStat, a, 
1bf50 70 42 6c 6f 62 2c 20 26 6e 42 6c 6f 62 29 3b 0a  pBlob, &nBlob);.
1bf60 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
1bf70 6d 74 28 70 2c 20 53 51 4c 5f 52 45 50 4c 41 43  mt(p, SQL_REPLAC
1bf80 45 5f 53 54 41 54 2c 20 26 70 53 74 6d 74 2c 20  E_STAT, &pStmt, 
1bf90 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  0);.  if( rc ){.
1bfa0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1bfb0 28 61 29 3b 0a 20 20 20 20 2a 70 52 43 20 3d 20  (a);.    *pRC = 
1bfc0 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
1bfd0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62 69    }.  sqlite3_bi
1bfe0 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 2c  nd_int(pStmt, 1,
1bff0 20 46 54 53 5f 53 54 41 54 5f 44 4f 43 54 4f 54   FTS_STAT_DOCTOT
1c000 41 4c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  AL);.  sqlite3_b
1c010 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  ind_blob(pStmt, 
1c020 32 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c  2, pBlob, nBlob,
1c030 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
1c040 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  .  sqlite3_step(
1c050 70 53 74 6d 74 29 3b 0a 20 20 2a 70 52 43 20 3d  pStmt);.  *pRC =
1c060 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
1c070 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  Stmt);.  sqlite3
1c080 5f 66 72 65 65 28 61 29 3b 0a 7d 0a 0a 2f 2a 0a  _free(a);.}../*.
1c090 2a 2a 20 4d 65 72 67 65 20 74 68 65 20 65 6e 74  ** Merge the ent
1c0a0 69 72 65 20 64 61 74 61 62 61 73 65 20 73 6f 20  ire database so 
1c0b0 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6f 6e  that there is on
1c0c0 65 20 73 65 67 6d 65 6e 74 20 66 6f 72 20 65 61  e segment for ea
1c0d0 63 68 20 0a 2a 2a 20 69 49 6e 64 65 78 2f 69 4c  ch .** iIndex/iL
1c0e0 61 6e 67 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f  angid combinatio
1c0f0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1c100 20 66 74 73 33 44 6f 4f 70 74 69 6d 69 7a 65 28   fts3DoOptimize(
1c110 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 69 6e  Fts3Table *p, in
1c120 74 20 62 52 65 74 75 72 6e 44 6f 6e 65 29 7b 0a  t bReturnDone){.
1c130 20 20 69 6e 74 20 62 53 65 65 6e 44 6f 6e 65 20    int bSeenDone 
1c140 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
1c150 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1c160 41 6c 6c 4c 61 6e 67 69 64 20 3d 20 30 3b 0a 0a  AllLangid = 0;..
1c170 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
1c180 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54  mt(p, SQL_SELECT
1c190 5f 41 4c 4c 5f 4c 41 4e 47 49 44 2c 20 26 70 41  _ALL_LANGID, &pA
1c1a0 6c 6c 4c 61 6e 67 69 64 2c 20 30 29 3b 0a 20 20  llLangid, 0);.  
1c1b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c1c0 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  K ){.    int rc2
1c1d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
1c1e0 6e 64 5f 69 6e 74 28 70 41 6c 6c 4c 61 6e 67 69  nd_int(pAllLangi
1c1f0 64 2c 20 31 2c 20 70 2d 3e 6e 49 6e 64 65 78 29  d, 1, p->nIndex)
1c200 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c  ;.    while( sql
1c210 69 74 65 33 5f 73 74 65 70 28 70 41 6c 6c 4c 61  ite3_step(pAllLa
1c220 6e 67 69 64 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  ngid)==SQLITE_RO
1c230 57 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  W ){.      int i
1c240 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 61 6e  ;.      int iLan
1c250 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  gid = sqlite3_co
1c260 6c 75 6d 6e 5f 69 6e 74 28 70 41 6c 6c 4c 61 6e  lumn_int(pAllLan
1c270 67 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 66  gid, 0);.      f
1c280 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
1c290 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 49  TE_OK && i<p->nI
1c2a0 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ndex; i++){.    
1c2b0 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67      rc = fts3Seg
1c2c0 6d 65 6e 74 4d 65 72 67 65 28 70 2c 20 69 4c 61  mentMerge(p, iLa
1c2d0 6e 67 69 64 2c 20 69 2c 20 46 54 53 33 5f 53 45  ngid, i, FTS3_SE
1c2e0 47 43 55 52 53 4f 52 5f 41 4c 4c 29 3b 0a 20 20  GCURSOR_ALL);.  
1c2f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1c300 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
1c310 20 20 20 20 20 20 20 62 53 65 65 6e 44 6f 6e 65         bSeenDone
1c320 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
1c330 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c340 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c350 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 32 20  }.    }.    rc2 
1c360 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
1c370 70 41 6c 6c 4c 61 6e 67 69 64 29 3b 0a 20 20 20  pAllLangid);.   
1c380 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c390 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
1c3a0 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 46 74 73   }..  sqlite3Fts
1c3b0 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28 70  3SegmentsClose(p
1c3c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33  );.  sqlite3Fts3
1c3d0 50 65 6e 64 69 6e 67 54 65 72 6d 73 43 6c 65 61  PendingTermsClea
1c3e0 72 28 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  r(p);..  return 
1c3f0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  (rc==SQLITE_OK &
1c400 26 20 62 52 65 74 75 72 6e 44 6f 6e 65 20 26 26  & bReturnDone &&
1c410 20 62 53 65 65 6e 44 6f 6e 65 29 20 3f 20 53 51   bSeenDone) ? SQ
1c420 4c 49 54 45 5f 44 4f 4e 45 20 3a 20 72 63 3b 0a  LITE_DONE : rc;.
1c430 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1c440 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1c450 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 65   when the user e
1c460 78 65 63 75 74 65 73 20 74 68 65 20 66 6f 6c 6c  xecutes the foll
1c470 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 3a  owing statement:
1c480 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 4e 53 45 52  .**.**     INSER
1c490 54 20 49 4e 54 4f 20 3c 74 62 6c 3e 28 3c 74 62  T INTO <tbl>(<tb
1c4a0 6c 3e 29 20 56 41 4c 55 45 53 28 27 72 65 62 75  l>) VALUES('rebu
1c4b0 69 6c 64 27 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ild');.**.** The
1c4c0 20 65 6e 74 69 72 65 20 46 54 53 20 69 6e 64 65   entire FTS inde
1c4d0 78 20 69 73 20 64 69 73 63 61 72 64 65 64 20 61  x is discarded a
1c4e0 6e 64 20 72 65 62 75 69 6c 74 2e 20 49 66 20 74  nd rebuilt. If t
1c4f0 68 65 20 74 61 62 6c 65 20 69 73 20 6f 6e 65 20  he table is one 
1c500 0a 2a 2a 20 63 72 65 61 74 65 64 20 75 73 69 6e  .** created usin
1c510 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 3d 78 78  g the content=xx
1c520 78 20 6f 70 74 69 6f 6e 2c 20 74 68 65 6e 20 74  x option, then t
1c530 68 65 20 6e 65 77 20 69 6e 64 65 78 20 69 73 20  he new index is 
1c540 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20  based on.** the 
1c550 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73  current contents
1c560 20 6f 66 20 74 68 65 20 78 78 78 20 74 61 62 6c   of the xxx tabl
1c570 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
1c580 20 69 73 20 72 65 62 75 69 6c 74 20 62 61 73 65   is rebuilt base
1c590 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f 6e 74  d.** on the cont
1c5a0 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 63 6f  ents of the %_co
1c5b0 6e 74 65 6e 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a  ntent table..*/.
1c5c0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 44  static int fts3D
1c5d0 6f 52 65 62 75 69 6c 64 28 46 74 73 33 54 61 62  oRebuild(Fts3Tab
1c5e0 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  le *p){.  int rc
1c5f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1c610 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20 20 72  urn Code */..  r
1c620 63 20 3d 20 66 74 73 33 44 65 6c 65 74 65 41 6c  c = fts3DeleteAl
1c630 6c 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  l(p, 0);.  if( r
1c640 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c650 20 20 20 20 75 33 32 20 2a 61 53 7a 20 3d 20 30      u32 *aSz = 0
1c660 3b 0a 20 20 20 20 75 33 32 20 2a 61 53 7a 49 6e  ;.    u32 *aSzIn
1c670 73 20 3d 20 30 3b 0a 20 20 20 20 75 33 32 20 2a  s = 0;.    u32 *
1c680 61 53 7a 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20  aSzDel = 0;.    
1c690 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1c6a0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  tmt = 0;.    int
1c6b0 20 6e 45 6e 74 72 79 20 3d 20 30 3b 0a 0a 20 20   nEntry = 0;..  
1c6c0 20 20 2f 2a 20 43 6f 6d 70 6f 73 65 20 61 6e 64    /* Compose and
1c6d0 20 70 72 65 70 61 72 65 20 61 6e 20 53 51 4c 20   prepare an SQL 
1c6e0 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 6c 6f 6f  statement to loo
1c6f0 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f  p through the co
1c700 6e 74 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20  ntent table */. 
1c710 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20     char *zSql = 
1c720 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1c730 22 53 45 4c 45 43 54 20 25 73 22 20 2c 20 70 2d  "SELECT %s" , p-
1c740 3e 7a 52 65 61 64 45 78 70 72 6c 69 73 74 29 3b  >zReadExprlist);
1c750 0a 20 20 20 20 69 66 28 20 21 7a 53 71 6c 20 29  .    if( !zSql )
1c760 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1c770 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
1c780 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1c790 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1c7a0 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
1c7b0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
1c7c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1c7d0 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  ree(zSql);.    }
1c7e0 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
1c7f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c800 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a   int nByte = siz
1c810 65 6f 66 28 75 33 32 29 20 2a 20 28 70 2d 3e 6e  eof(u32) * (p->n
1c820 43 6f 6c 75 6d 6e 2b 31 29 2a 33 3b 0a 20 20 20  Column+1)*3;.   
1c830 20 20 20 61 53 7a 20 3d 20 28 75 33 32 20 2a 29     aSz = (u32 *)
1c840 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
1c850 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
1c860 20 61 53 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20   aSz==0 ){.     
1c870 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1c880 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  OMEM;.      }els
1c890 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
1c8a0 74 28 61 53 7a 2c 20 30 2c 20 6e 42 79 74 65 29  t(aSz, 0, nByte)
1c8b0 3b 0a 20 20 20 20 20 20 20 20 61 53 7a 49 6e 73  ;.        aSzIns
1c8c0 20 3d 20 26 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75   = &aSz[p->nColu
1c8d0 6d 6e 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61  mn+1];.        a
1c8e0 53 7a 44 65 6c 20 3d 20 26 61 53 7a 49 6e 73 5b  SzDel = &aSzIns[
1c8f0 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 5d 3b 0a 20  p->nColumn+1];. 
1c900 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1c910 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
1c920 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
1c930 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
1c940 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
1c950 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20     int iCol;.   
1c960 20 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 20 3d     int iLangid =
1c970 20 6c 61 6e 67 69 64 46 72 6f 6d 53 65 6c 65 63   langidFromSelec
1c980 74 28 70 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20  t(p, pStmt);.   
1c990 20 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64     rc = fts3Pend
1c9a0 69 6e 67 54 65 72 6d 73 44 6f 63 69 64 28 70 2c  ingTermsDocid(p,
1c9b0 20 69 4c 61 6e 67 69 64 2c 20 73 71 6c 69 74 65   iLangid, sqlite
1c9c0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
1c9d0 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 20 20 20  Stmt, 0));.     
1c9e0 20 6d 65 6d 73 65 74 28 61 53 7a 2c 20 30 2c 20   memset(aSz, 0, 
1c9f0 73 69 7a 65 6f 66 28 61 53 7a 5b 30 5d 29 20 2a  sizeof(aSz[0]) *
1ca00 20 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 29   (p->nColumn+1))
1ca10 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c  ;.      for(iCol
1ca20 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
1ca30 4b 20 26 26 20 69 43 6f 6c 3c 70 2d 3e 6e 43 6f  K && iCol<p->nCo
1ca40 6c 75 6d 6e 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  lumn; iCol++){. 
1ca50 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 62         if( p->ab
1ca60 4e 6f 74 69 6e 64 65 78 65 64 5b 69 43 6f 6c 5d  Notindexed[iCol]
1ca70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1ca80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
1ca90 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20   (const char *) 
1caa0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
1cab0 65 78 74 28 70 53 74 6d 74 2c 20 69 43 6f 6c 2b  ext(pStmt, iCol+
1cac0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  1);.          rc
1cad0 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65   = fts3PendingTe
1cae0 72 6d 73 41 64 64 28 70 2c 20 69 4c 61 6e 67 69  rmsAdd(p, iLangi
1caf0 64 2c 20 7a 2c 20 69 43 6f 6c 2c 20 26 61 53 7a  d, z, iCol, &aSz
1cb00 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20 20 20 20 20  [iCol]);.       
1cb10 20 20 20 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75 6d     aSz[p->nColum
1cb20 6e 5d 20 2b 3d 20 73 71 6c 69 74 65 33 5f 63 6f  n] += sqlite3_co
1cb30 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
1cb40 2c 20 69 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20  , iCol+1);.     
1cb50 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1cb60 20 20 20 69 66 28 20 70 2d 3e 62 48 61 73 44 6f     if( p->bHasDo
1cb70 63 73 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  csize ){.       
1cb80 20 66 74 73 33 49 6e 73 65 72 74 44 6f 63 73 69   fts3InsertDocsi
1cb90 7a 65 28 26 72 63 2c 20 70 2c 20 61 53 7a 29 3b  ze(&rc, p, aSz);
1cba0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1cbb0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1cbc0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1cbd0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
1cbe0 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70 53 74  mt);.        pSt
1cbf0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  mt = 0;.      }e
1cc00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 45 6e  lse{.        nEn
1cc10 74 72 79 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66  try++;.        f
1cc20 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
1cc30 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 43 6f  =p->nColumn; iCo
1cc40 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l++){.          
1cc50 61 53 7a 49 6e 73 5b 69 43 6f 6c 5d 20 2b 3d 20  aSzIns[iCol] += 
1cc60 61 53 7a 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20  aSz[iCol];.     
1cc70 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1cc80 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 46   }.    if( p->bF
1cc90 74 73 34 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ts4 ){.      fts
1cca0 33 55 70 64 61 74 65 44 6f 63 54 6f 74 61 6c 73  3UpdateDocTotals
1ccb0 28 26 72 63 2c 20 70 2c 20 61 53 7a 49 6e 73 2c  (&rc, p, aSzIns,
1ccc0 20 61 53 7a 44 65 6c 2c 20 6e 45 6e 74 72 79 29   aSzDel, nEntry)
1ccd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1cce0 74 65 33 5f 66 72 65 65 28 61 53 7a 29 3b 0a 0a  te3_free(aSz);..
1ccf0 20 20 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b      if( pStmt ){
1cd00 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d  .      int rc2 =
1cd10 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
1cd20 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
1cd30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cd40 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
1cd50 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20  = rc2;.      }. 
1cd60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
1cd70 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1cd80 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f   This function o
1cd90 70 65 6e 73 20 61 20 63 75 72 73 6f 72 20 75 73  pens a cursor us
1cda0 65 64 20 74 6f 20 72 65 61 64 20 74 68 65 20 69  ed to read the i
1cdb0 6e 70 75 74 20 64 61 74 61 20 66 6f 72 20 61 6e  nput data for an
1cdc0 20 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c   .** incremental
1cdd0 20 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e   merge operation
1cde0 2e 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20  . Specifically, 
1cdf0 69 74 20 6f 70 65 6e 73 20 61 20 63 75 72 73 6f  it opens a curso
1ce00 72 20 74 6f 20 73 63 61 6e 0a 2a 2a 20 74 68 65  r to scan.** the
1ce10 20 6f 6c 64 65 73 74 20 6e 53 65 67 20 73 65 67   oldest nSeg seg
1ce20 6d 65 6e 74 73 20 28 69 64 78 3d 30 20 74 68 72  ments (idx=0 thr
1ce30 6f 75 67 68 20 69 64 78 3d 28 6e 53 65 67 2d 31  ough idx=(nSeg-1
1ce40 29 29 20 69 6e 20 61 62 73 6f 6c 75 74 65 20 0a  )) in absolute .
1ce50 2a 2a 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76  ** level iAbsLev
1ce60 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
1ce70 74 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 43  t fts3IncrmergeC
1ce80 73 72 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  sr(.  Fts3Table 
1ce90 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1cea0 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61        /* FTS3 ta
1ceb0 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
1cec0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 41  sqlite3_int64 iA
1ced0 62 73 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20  bsLevel,        
1cee0 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65 76 65  /* Absolute leve
1cef0 6c 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  l to open */.  i
1cf00 6e 74 20 6e 53 65 67 2c 20 20 20 20 20 20 20 20  nt nSeg,        
1cf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cf20 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  * Number of segm
1cf30 65 6e 74 73 20 74 6f 20 6d 65 72 67 65 20 2a 2f  ents to merge */
1cf40 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52  .  Fts3MultiSegR
1cf50 65 61 64 65 72 20 2a 70 43 73 72 20 20 20 20 20  eader *pCsr     
1cf60 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a     /* Cursor obj
1cf70 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  ect to populate 
1cf80 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
1cf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfa0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1cfb0 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n Code */.  sqli
1cfc0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
1cfd0 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  = 0;        /* S
1cfe0 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f  tatement used to
1cff0 20 72 65 61 64 20 25 5f 73 65 67 64 69 72 20 65   read %_segdir e
1d000 6e 74 72 79 20 2a 2f 20 20 0a 20 20 69 6e 74 20  ntry */  .  int 
1d010 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
1d020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1d030 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  ytes allocated a
1d040 74 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e  t pCsr->apSegmen
1d050 74 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  t[] */..  /* All
1d060 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
1d070 74 68 65 20 46 74 73 33 4d 75 6c 74 69 53 65 67  the Fts3MultiSeg
1d080 52 65 61 64 65 72 2e 61 43 73 72 5b 5d 20 61 72  Reader.aCsr[] ar
1d090 72 61 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ray */.  memset(
1d0a0 70 43 73 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCsr, 0, sizeof(
1d0b0 2a 70 43 73 72 29 29 3b 0a 20 20 6e 42 79 74 65  *pCsr));.  nByte
1d0c0 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 33 53 65   = sizeof(Fts3Se
1d0d0 67 52 65 61 64 65 72 20 2a 29 20 2a 20 6e 53 65  gReader *) * nSe
1d0e0 67 3b 0a 20 20 70 43 73 72 2d 3e 61 70 53 65 67  g;.  pCsr->apSeg
1d0f0 6d 65 6e 74 20 3d 20 28 46 74 73 33 53 65 67 52  ment = (Fts3SegR
1d100 65 61 64 65 72 20 2a 2a 29 73 71 6c 69 74 65 33  eader **)sqlite3
1d110 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a  _malloc(nByte);.
1d120 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 61 70 53  .  if( pCsr->apS
1d130 65 67 6d 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  egment==0 ){.   
1d140 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1d150 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EM;.  }else{.   
1d160 20 6d 65 6d 73 65 74 28 70 43 73 72 2d 3e 61 70   memset(pCsr->ap
1d170 53 65 67 6d 65 6e 74 2c 20 30 2c 20 6e 42 79 74  Segment, 0, nByt
1d180 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73  e);.    rc = fts
1d190 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
1d1a0 53 45 4c 45 43 54 5f 4c 45 56 45 4c 2c 20 26 70  SELECT_LEVEL, &p
1d1b0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Stmt, 0);.  }.  
1d1c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d1d0 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  K ){.    int i;.
1d1e0 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
1d1f0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
1d200 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 69 41  t64(pStmt, 1, iA
1d210 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20 61 73  bsLevel);.    as
1d220 73 65 72 74 28 20 70 43 73 72 2d 3e 6e 53 65 67  sert( pCsr->nSeg
1d230 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 66  ment==0 );.    f
1d240 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
1d250 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33  TE_OK && sqlite3
1d260 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
1d270 4c 49 54 45 5f 52 4f 57 20 26 26 20 69 3c 6e 53  LITE_ROW && i<nS
1d280 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  eg; i++){.      
1d290 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
1d2a0 53 65 67 52 65 61 64 65 72 4e 65 77 28 69 2c 20  SegReaderNew(i, 
1d2b0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  0,.          sql
1d2c0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
1d2d0 34 28 70 53 74 6d 74 2c 20 31 29 2c 20 20 20 20  4(pStmt, 1),    
1d2e0 20 20 20 20 2f 2a 20 73 65 67 64 69 72 2e 73 74      /* segdir.st
1d2f0 61 72 74 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20  art_block */.   
1d300 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
1d310 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d  olumn_int64(pStm
1d320 74 2c 20 32 29 2c 20 20 20 20 20 20 20 20 2f 2a  t, 2),        /*
1d330 20 73 65 67 64 69 72 2e 6c 65 61 76 65 73 5f 65   segdir.leaves_e
1d340 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  nd_block */.    
1d350 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
1d360 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
1d370 2c 20 33 29 2c 20 20 20 20 20 20 20 20 2f 2a 20  , 3),        /* 
1d380 73 65 67 64 69 72 2e 65 6e 64 5f 62 6c 6f 63 6b  segdir.end_block
1d390 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
1d3a0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
1d3b0 62 28 70 53 74 6d 74 2c 20 34 29 2c 20 20 20 20  b(pStmt, 4),    
1d3c0 20 20 20 20 20 2f 2a 20 73 65 67 64 69 72 2e 72       /* segdir.r
1d3d0 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  oot */.         
1d3e0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1d3f0 62 79 74 65 73 28 70 53 74 6d 74 2c 20 34 29 2c  bytes(pStmt, 4),
1d400 20 20 20 20 20 20 20 20 2f 2a 20 73 65 67 64 69          /* segdi
1d410 72 2e 72 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20  r.root */.      
1d420 20 20 20 20 26 70 43 73 72 2d 3e 61 70 53 65 67      &pCsr->apSeg
1d430 6d 65 6e 74 5b 69 5d 0a 20 20 20 20 20 20 29 3b  ment[i].      );
1d440 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 6e 53 65  .      pCsr->nSe
1d450 67 6d 65 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20  gment++;.    }. 
1d460 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
1d470 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
1d480 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d490 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b  E_OK ) rc = rc2;
1d4a0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1d4b0 63 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74  c;.}..typedef st
1d4c0 72 75 63 74 20 49 6e 63 72 6d 65 72 67 65 57 72  ruct IncrmergeWr
1d4d0 69 74 65 72 20 49 6e 63 72 6d 65 72 67 65 57 72  iter IncrmergeWr
1d4e0 69 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74  iter;.typedef st
1d4f0 72 75 63 74 20 4e 6f 64 65 57 72 69 74 65 72 20  ruct NodeWriter 
1d500 4e 6f 64 65 57 72 69 74 65 72 3b 0a 74 79 70 65  NodeWriter;.type
1d510 64 65 66 20 73 74 72 75 63 74 20 42 6c 6f 62 20  def struct Blob 
1d520 42 6c 6f 62 3b 0a 74 79 70 65 64 65 66 20 73 74  Blob;.typedef st
1d530 72 75 63 74 20 4e 6f 64 65 52 65 61 64 65 72 20  ruct NodeReader 
1d540 4e 6f 64 65 52 65 61 64 65 72 3b 0a 0a 2f 2a 0a  NodeReader;../*.
1d550 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
1d560 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1d570 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65  structure is use
1d580 64 20 61 73 20 61 20 64 79 6e 61 6d 69 63 20 62  d as a dynamic b
1d590 75 66 66 65 72 0a 2a 2a 20 74 6f 20 62 75 69 6c  uffer.** to buil
1d5a0 64 20 75 70 20 6e 6f 64 65 73 20 6f 72 20 6f 74  d up nodes or ot
1d5b0 68 65 72 20 62 6c 6f 62 73 20 6f 66 20 64 61 74  her blobs of dat
1d5c0 61 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  a in..**.** The 
1d5d0 66 75 6e 63 74 69 6f 6e 20 62 6c 6f 62 47 72 6f  function blobGro
1d5e0 77 42 75 66 66 65 72 28 29 20 69 73 20 75 73 65  wBuffer() is use
1d5f0 64 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20  d to extend the 
1d600 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  allocation..*/.s
1d610 74 72 75 63 74 20 42 6c 6f 62 20 7b 0a 20 20 63  truct Blob {.  c
1d620 68 61 72 20 2a 61 3b 20 20 20 20 20 20 20 20 20  har *a;         
1d630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d640 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 6c 6c  * Pointer to all
1d650 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ocation */.  int
1d660 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
1d670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d680 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  Number of valid 
1d690 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e  bytes of data in
1d6a0 20 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 41   a[] */.  int nA
1d6b0 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20  lloc;           
1d6c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
1d6d0 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61  ocated size of a
1d6e0 5b 5d 20 28 6e 41 6c 6c 6f 63 3e 3d 6e 29 20 2a  [] (nAlloc>=n) *
1d6f0 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  /.};../*.** This
1d700 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73   structure is us
1d710 65 64 20 74 6f 20 62 75 69 6c 64 20 75 70 20 62  ed to build up b
1d720 75 66 66 65 72 73 20 63 6f 6e 74 61 69 6e 69 6e  uffers containin
1d730 67 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  g segment b-tree
1d740 20 0a 2a 2a 20 6e 6f 64 65 73 20 28 62 6c 6f 63   .** nodes (bloc
1d750 6b 73 29 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4e  ks)..*/.struct N
1d760 6f 64 65 57 72 69 74 65 72 20 7b 0a 20 20 73 71  odeWriter {.  sq
1d770 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 42 6c 6f  lite3_int64 iBlo
1d780 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ck;           /*
1d790 20 43 75 72 72 65 6e 74 20 62 6c 6f 63 6b 20 69   Current block i
1d7a0 64 20 2a 2f 0a 20 20 42 6c 6f 62 20 6b 65 79 3b  d */.  Blob key;
1d7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7c0 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 6b         /* Last k
1d7d0 65 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ey written to th
1d7e0 65 20 63 75 72 72 65 6e 74 20 62 6c 6f 63 6b 20  e current block 
1d7f0 2a 2f 0a 20 20 42 6c 6f 62 20 62 6c 6f 63 6b 3b  */.  Blob block;
1d800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d810 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
1d820 62 6c 6f 63 6b 20 69 6d 61 67 65 20 2a 2f 0a 7d  block image */.}
1d830 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65  ;../*.** An obje
1d840 63 74 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ct of this type 
1d850 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 74 61  contains the sta
1d860 74 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  te required to c
1d870 72 65 61 74 65 20 6f 72 20 61 70 70 65 6e 64 0a  reate or append.
1d880 2a 2a 20 74 6f 20 61 6e 20 61 70 70 65 6e 64 61  ** to an appenda
1d890 62 6c 65 20 62 2d 74 72 65 65 20 73 65 67 6d 65  ble b-tree segme
1d8a0 6e 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 49 6e  nt..*/.struct In
1d8b0 63 72 6d 65 72 67 65 57 72 69 74 65 72 20 7b 0a  crmergeWriter {.
1d8c0 20 20 69 6e 74 20 6e 4c 65 61 66 45 73 74 3b 20    int nLeafEst; 
1d8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8e0 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63    /* Space alloc
1d8f0 61 74 65 64 20 66 6f 72 20 6c 65 61 66 20 62 6c  ated for leaf bl
1d900 6f 63 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 57  ocks */.  int nW
1d910 6f 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ork;            
1d920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1d930 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65  ber of leaf page
1d940 73 20 66 6c 75 73 68 65 64 20 2a 2f 0a 20 20 73  s flushed */.  s
1d950 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 41 62  qlite3_int64 iAb
1d960 73 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 2f  sLevel;        /
1d970 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c  * Absolute level
1d980 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e   of input segmen
1d990 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ts */.  int iIdx
1d9a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d9b0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1d9c0 20 6f 66 20 2a 6f 75 74 70 75 74 2a 20 73 65 67   of *output* seg
1d9d0 6d 65 6e 74 20 69 6e 20 69 41 62 73 4c 65 76 65  ment in iAbsLeve
1d9e0 6c 2b 31 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  l+1 */.  sqlite3
1d9f0 5f 69 6e 74 36 34 20 69 53 74 61 72 74 3b 20 20  _int64 iStart;  
1da00 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63           /* Bloc
1da10 6b 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 72 73  k number of firs
1da20 74 20 61 6c 6c 6f 63 61 74 65 64 20 62 6c 6f 63  t allocated bloc
1da30 6b 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  k */.  sqlite3_i
1da40 6e 74 36 34 20 69 45 6e 64 3b 20 20 20 20 20 20  nt64 iEnd;      
1da50 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20         /* Block 
1da60 6e 75 6d 62 65 72 20 6f 66 20 6c 61 73 74 20 61  number of last a
1da70 6c 6c 6f 63 61 74 65 64 20 62 6c 6f 63 6b 20 2a  llocated block *
1da80 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
1da90 34 20 6e 4c 65 61 66 44 61 74 61 3b 20 20 20 20  4 nLeafData;    
1daa0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
1dab0 6c 65 61 66 20 70 61 67 65 20 64 61 74 61 20 73  leaf page data s
1dac0 6f 20 66 61 72 20 2a 2f 0a 20 20 75 38 20 62 4e  o far */.  u8 bN
1dad0 6f 4c 65 61 66 44 61 74 61 3b 20 20 20 20 20 20  oLeafData;      
1dae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
1daf0 20 74 72 75 65 2c 20 73 74 6f 72 65 20 30 20 66   true, store 0 f
1db00 6f 72 20 73 65 67 6d 65 6e 74 20 73 69 7a 65 20  or segment size 
1db10 2a 2f 0a 20 20 4e 6f 64 65 57 72 69 74 65 72 20  */.  NodeWriter 
1db20 61 4e 6f 64 65 57 72 69 74 65 72 5b 46 54 53 5f  aNodeWriter[FTS_
1db30 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c 45 5f 48  MAX_APPENDABLE_H
1db40 45 49 47 48 54 5d 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a  EIGHT];.};../*.*
1db50 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66 20 74  * An object of t
1db60 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70  he following typ
1db70 65 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  e is used to rea
1db80 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 73 69  d data from a si
1db90 6e 67 6c 65 0a 2a 2a 20 46 54 53 20 73 65 67 6d  ngle.** FTS segm
1dba0 65 6e 74 20 6e 6f 64 65 2e 20 53 65 65 20 74 68  ent node. See th
1dbb0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
1dbc0 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tions:.**.**    
1dbd0 20 6e 6f 64 65 52 65 61 64 65 72 49 6e 69 74 28   nodeReaderInit(
1dbe0 29 0a 2a 2a 20 20 20 20 20 6e 6f 64 65 52 65 61  ).**     nodeRea
1dbf0 64 65 72 4e 65 78 74 28 29 0a 2a 2a 20 20 20 20  derNext().**    
1dc00 20 6e 6f 64 65 52 65 61 64 65 72 52 65 6c 65 61   nodeReaderRelea
1dc10 73 65 28 29 0a 2a 2f 0a 73 74 72 75 63 74 20 4e  se().*/.struct N
1dc20 6f 64 65 52 65 61 64 65 72 20 7b 0a 20 20 63 6f  odeReader {.  co
1dc30 6e 73 74 20 63 68 61 72 20 2a 61 4e 6f 64 65 3b  nst char *aNode;
1dc40 0a 20 20 69 6e 74 20 6e 4e 6f 64 65 3b 0a 20 20  .  int nNode;.  
1dc50 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20 20  int iOff;       
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc70 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65  /* Current offse
1dc80 74 20 77 69 74 68 69 6e 20 61 4e 6f 64 65 5b 5d  t within aNode[]
1dc90 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74   */..  /* Output
1dca0 20 76 61 72 69 61 62 6c 65 73 2e 20 43 6f 6e 74   variables. Cont
1dcb0 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65  aining the curre
1dcc0 6e 74 20 6e 6f 64 65 20 65 6e 74 72 79 2e 20 2a  nt node entry. *
1dcd0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
1dce0 34 20 69 43 68 69 6c 64 3b 20 20 20 20 20 20 20  4 iChild;       
1dcf0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1dd00 6f 20 63 68 69 6c 64 20 6e 6f 64 65 20 2a 2f 0a  o child node */.
1dd10 20 20 42 6c 6f 62 20 74 65 72 6d 3b 20 20 20 20    Blob term;    
1dd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd30 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74 65 72    /* Current ter
1dd40 6d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  m */.  const cha
1dd50 72 20 2a 61 44 6f 63 6c 69 73 74 3b 20 20 20 20  r *aDoclist;    
1dd60 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1dd70 72 20 74 6f 20 64 6f 63 6c 69 73 74 20 2a 2f 0a  r to doclist */.
1dd80 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 20    int nDoclist; 
1dd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dda0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63    /* Size of doc
1ddb0 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  list in bytes */
1ddc0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70  .};../*.** If *p
1ddd0 52 63 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45  Rc is not SQLITE
1dde0 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  _OK when this fu
1ddf0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1de00 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
1de10 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
1de20 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  f the allocation
1de30 20 61 74 20 70 42 6c 6f 62 2d 3e 61 20 69 73 20   at pBlob->a is 
1de40 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 74 20 6c  not already at l
1de50 65 61 73 74 20 6e 4d 69 6e 0a 2a 2a 20 62 79 74  east nMin.** byt
1de60 65 73 20 69 6e 20 73 69 7a 65 2c 20 65 78 74 65  es in size, exte
1de70 6e 64 20 28 72 65 61 6c 6c 6f 63 29 20 69 74 20  nd (realloc) it 
1de80 74 6f 20 62 65 20 73 6f 2e 0a 2a 2a 0a 2a 2a 20  to be so..**.** 
1de90 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
1dea0 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 52 63  occurs, set *pRc
1deb0 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   to SQLITE_NOMEM
1dec0 20 61 6e 64 20 6c 65 61 76 65 20 70 42 6c 6f 62   and leave pBlob
1ded0 2d 3e 61 0a 2a 2a 20 75 6e 6d 6f 64 69 66 69 65  ->a.** unmodifie
1dee0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
1def0 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
1df00 73 75 63 63 65 65 64 73 2c 20 75 70 64 61 74 65  succeeds, update
1df10 20 70 42 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63 0a 2a   pBlob->nAlloc.*
1df20 2a 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65  * to reflect the
1df30 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 74 68 65   new size of the
1df40 20 70 42 6c 6f 62 2d 3e 61 5b 5d 20 62 75 66 66   pBlob->a[] buff
1df50 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
1df60 69 64 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65  id blobGrowBuffe
1df70 72 28 42 6c 6f 62 20 2a 70 42 6c 6f 62 2c 20 69  r(Blob *pBlob, i
1df80 6e 74 20 6e 4d 69 6e 2c 20 69 6e 74 20 2a 70 52  nt nMin, int *pR
1df90 63 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d  c){.  if( *pRc==
1dfa0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 4d 69  SQLITE_OK && nMi
1dfb0 6e 3e 70 42 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63 20  n>pBlob->nAlloc 
1dfc0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f  ){.    int nAllo
1dfd0 63 20 3d 20 6e 4d 69 6e 3b 0a 20 20 20 20 63 68  c = nMin;.    ch
1dfe0 61 72 20 2a 61 20 3d 20 28 63 68 61 72 20 2a 29  ar *a = (char *)
1dff0 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
1e000 70 42 6c 6f 62 2d 3e 61 2c 20 6e 41 6c 6c 6f 63  pBlob->a, nAlloc
1e010 29 3b 0a 20 20 20 20 69 66 28 20 61 20 29 7b 0a  );.    if( a ){.
1e020 20 20 20 20 20 20 70 42 6c 6f 62 2d 3e 6e 41 6c        pBlob->nAl
1e030 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 3b 0a 20 20  loc = nAlloc;.  
1e040 20 20 20 20 70 42 6c 6f 62 2d 3e 61 20 3d 20 61      pBlob->a = a
1e050 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e060 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
1e070 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
1e080 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  }.}../*.** Attem
1e090 70 74 20 74 6f 20 61 64 76 61 6e 63 65 20 74 68  pt to advance th
1e0a0 65 20 6e 6f 64 65 2d 72 65 61 64 65 72 20 6f 62  e node-reader ob
1e0b0 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
1e0c0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
1e0d0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 78 74  t to.** the next
1e0e0 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 6e 6f   entry on the no
1e0f0 64 65 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  de. .**.** Retur
1e100 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
1e110 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
1e120 72 73 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rs (SQLITE_NOMEM
1e130 20 69 73 20 70 6f 73 73 69 62 6c 65 29 2e 20 0a   is possible). .
1e140 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65 74  ** Otherwise ret
1e150 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  urn SQLITE_OK. I
1e160 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  f there is no ne
1e170 78 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20  xt entry on the 
1e180 6e 6f 64 65 0a 2a 2a 20 28 65 2e 67 2e 20 62 65  node.** (e.g. be
1e190 63 61 75 73 65 20 74 68 65 20 63 75 72 72 65 6e  cause the curren
1e1a0 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6c  t entry is the l
1e1b0 61 73 74 29 20 73 65 74 20 4e 6f 64 65 52 65 61  ast) set NodeRea
1e1c0 64 65 72 2d 3e 61 4e 6f 64 65 20 74 6f 0a 2a 2a  der->aNode to.**
1e1d0 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74   NULL to indicat
1e1e0 65 20 45 4f 46 2e 20 4f 74 68 65 72 77 69 73 65  e EOF. Otherwise
1e1f0 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 4e  , populate the N
1e200 6f 64 65 52 65 61 64 65 72 20 73 74 72 75 63 74  odeReader struct
1e210 75 72 65 20 6f 75 74 70 75 74 20 0a 2a 2a 20 76  ure output .** v
1e220 61 72 69 61 62 6c 65 73 20 66 6f 72 20 74 68 65  ariables for the
1e230 20 6e 65 77 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73   new entry..*/.s
1e240 74 61 74 69 63 20 69 6e 74 20 6e 6f 64 65 52 65  tatic int nodeRe
1e250 61 64 65 72 4e 65 78 74 28 4e 6f 64 65 52 65 61  aderNext(NodeRea
1e260 64 65 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 62  der *p){.  int b
1e270 46 69 72 73 74 20 3d 20 28 70 2d 3e 74 65 72 6d  First = (p->term
1e280 2e 6e 3d 3d 30 29 3b 20 20 20 20 2f 2a 20 54 72  .n==0);    /* Tr
1e290 75 65 20 66 6f 72 20 66 69 72 73 74 20 74 65 72  ue for first ter
1e2a0 6d 20 6f 6e 20 74 68 65 20 6e 6f 64 65 20 2a 2f  m on the node */
1e2b0 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 20 3d  .  int nPrefix =
1e2c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1e2d0 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 63     /* Bytes to c
1e2e0 6f 70 79 20 66 72 6f 6d 20 70 72 65 76 69 6f 75  opy from previou
1e2f0 73 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  s term */.  int 
1e300 6e 53 75 66 66 69 78 20 3d 20 30 3b 20 20 20 20  nSuffix = 0;    
1e310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1e320 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74  ytes to append t
1e330 6f 20 74 68 65 20 70 72 65 66 69 78 20 2a 2f 0a  o the prefix */.
1e340 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1e350 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
1e360 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1e370 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1e380 2d 3e 61 4e 6f 64 65 20 29 3b 0a 20 20 69 66 28  ->aNode );.  if(
1e390 20 70 2d 3e 69 43 68 69 6c 64 20 26 26 20 62 46   p->iChild && bF
1e3a0 69 72 73 74 3d 3d 30 20 29 20 70 2d 3e 69 43 68  irst==0 ) p->iCh
1e3b0 69 6c 64 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e  ild++;.  if( p->
1e3c0 69 4f 66 66 3e 3d 70 2d 3e 6e 4e 6f 64 65 20 29  iOff>=p->nNode )
1e3d0 7b 0a 20 20 20 20 2f 2a 20 45 4f 46 20 2a 2f 0a  {.    /* EOF */.
1e3e0 20 20 20 20 70 2d 3e 61 4e 6f 64 65 20 3d 20 30      p->aNode = 0
1e3f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1e400 66 28 20 62 46 69 72 73 74 3d 3d 30 20 29 7b 0a  f( bFirst==0 ){.
1e410 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 20 2b 3d        p->iOff +=
1e420 20 66 74 73 33 47 65 74 56 61 72 69 6e 74 33 32   fts3GetVarint32
1e430 28 26 70 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f  (&p->aNode[p->iO
1e440 66 66 5d 2c 20 26 6e 50 72 65 66 69 78 29 3b 0a  ff], &nPrefix);.
1e450 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 4f 66      }.    p->iOf
1e460 66 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72 69  f += fts3GetVari
1e470 6e 74 33 32 28 26 70 2d 3e 61 4e 6f 64 65 5b 70  nt32(&p->aNode[p
1e480 2d 3e 69 4f 66 66 5d 2c 20 26 6e 53 75 66 66 69  ->iOff], &nSuffi
1e490 78 29 3b 0a 0a 20 20 20 20 62 6c 6f 62 47 72 6f  x);..    blobGro
1e4a0 77 42 75 66 66 65 72 28 26 70 2d 3e 74 65 72 6d  wBuffer(&p->term
1e4b0 2c 20 6e 50 72 65 66 69 78 2b 6e 53 75 66 66 69  , nPrefix+nSuffi
1e4c0 78 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  x, &rc);.    if(
1e4d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e4e0 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
1e4f0 70 2d 3e 74 65 72 6d 2e 61 5b 6e 50 72 65 66 69  p->term.a[nPrefi
1e500 78 5d 2c 20 26 70 2d 3e 61 4e 6f 64 65 5b 70 2d  x], &p->aNode[p-
1e510 3e 69 4f 66 66 5d 2c 20 6e 53 75 66 66 69 78 29  >iOff], nSuffix)
1e520 3b 0a 20 20 20 20 20 20 70 2d 3e 74 65 72 6d 2e  ;.      p->term.
1e530 6e 20 3d 20 6e 50 72 65 66 69 78 2b 6e 53 75 66  n = nPrefix+nSuf
1e540 66 69 78 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  fix;.      p->iO
1e550 66 66 20 2b 3d 20 6e 53 75 66 66 69 78 3b 0a 20  ff += nSuffix;. 
1e560 20 20 20 20 20 69 66 28 20 70 2d 3e 69 43 68 69       if( p->iChi
1e570 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ld==0 ){.       
1e580 20 70 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 33   p->iOff += fts3
1e590 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 2d 3e  GetVarint32(&p->
1e5a0 61 4e 6f 64 65 5b 70 2d 3e 69 4f 66 66 5d 2c 20  aNode[p->iOff], 
1e5b0 26 70 2d 3e 6e 44 6f 63 6c 69 73 74 29 3b 0a 20  &p->nDoclist);. 
1e5c0 20 20 20 20 20 20 20 70 2d 3e 61 44 6f 63 6c 69         p->aDocli
1e5d0 73 74 20 3d 20 26 70 2d 3e 61 4e 6f 64 65 5b 70  st = &p->aNode[p
1e5e0 2d 3e 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 20  ->iOff];.       
1e5f0 20 70 2d 3e 69 4f 66 66 20 2b 3d 20 70 2d 3e 6e   p->iOff += p->n
1e600 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 7d  Doclist;.      }
1e610 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
1e620 73 65 72 74 28 20 70 2d 3e 69 4f 66 66 3c 3d 70  sert( p->iOff<=p
1e630 2d 3e 6e 4e 6f 64 65 20 29 3b 0a 0a 20 20 72 65  ->nNode );..  re
1e640 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1e650 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 64 79  * Release all dy
1e660 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 20  namic resources 
1e670 68 65 6c 64 20 62 79 20 6e 6f 64 65 2d 72 65 61  held by node-rea
1e680 64 65 72 20 6f 62 6a 65 63 74 20 2a 70 2e 0a 2a  der object *p..*
1e690 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f  /.static void no
1e6a0 64 65 52 65 61 64 65 72 52 65 6c 65 61 73 65 28  deReaderRelease(
1e6b0 4e 6f 64 65 52 65 61 64 65 72 20 2a 70 29 7b 0a  NodeReader *p){.
1e6c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1e6d0 2d 3e 74 65 72 6d 2e 61 29 3b 0a 7d 0a 0a 2f 2a  ->term.a);.}../*
1e6e0 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
1e6f0 20 6e 6f 64 65 2d 72 65 61 64 65 72 20 6f 62 6a   node-reader obj
1e700 65 63 74 20 74 6f 20 72 65 61 64 20 74 68 65 20  ect to read the 
1e710 6e 6f 64 65 20 69 6e 20 62 75 66 66 65 72 20 61  node in buffer a
1e720 4e 6f 64 65 2f 6e 4e 6f 64 65 2e 0a 2a 2a 0a 2a  Node/nNode..**.*
1e730 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
1e740 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1e750 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 4e  turned and the N
1e760 6f 64 65 52 65 61 64 65 72 20 6f 62 6a 65 63 74  odeReader object
1e770 20 73 65 74 20 74 6f 20 0a 2a 2a 20 70 6f 69 6e   set to .** poin
1e780 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  t to the first e
1e790 6e 74 72 79 20 6f 6e 20 74 68 65 20 6e 6f 64 65  ntry on the node
1e7a0 20 28 69 66 20 61 6e 79 29 2e 20 4f 74 68 65 72   (if any). Other
1e7b0 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a  wise, an SQLite.
1e7c0 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
1e7d0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
1e7e0 61 74 69 63 20 69 6e 74 20 6e 6f 64 65 52 65 61  atic int nodeRea
1e7f0 64 65 72 49 6e 69 74 28 4e 6f 64 65 52 65 61 64  derInit(NodeRead
1e800 65 72 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  er *p, const cha
1e810 72 20 2a 61 4e 6f 64 65 2c 20 69 6e 74 20 6e 4e  r *aNode, int nN
1e820 6f 64 65 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70  ode){.  memset(p
1e830 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4e 6f 64 65  , 0, sizeof(Node
1e840 52 65 61 64 65 72 29 29 3b 0a 20 20 70 2d 3e 61  Reader));.  p->a
1e850 4e 6f 64 65 20 3d 20 61 4e 6f 64 65 3b 0a 20 20  Node = aNode;.  
1e860 70 2d 3e 6e 4e 6f 64 65 20 3d 20 6e 4e 6f 64 65  p->nNode = nNode
1e870 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
1e880 75 74 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ut if this is a 
1e890 6c 65 61 66 20 6f 72 20 61 6e 20 69 6e 74 65 72  leaf or an inter
1e8a0 6e 61 6c 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69  nal node. */.  i
1e8b0 66 28 20 70 2d 3e 61 4e 6f 64 65 5b 30 5d 20 29  f( p->aNode[0] )
1e8c0 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 69 6e 74 65  {.    /* An inte
1e8d0 72 6e 61 6c 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20  rnal node. */.  
1e8e0 20 20 70 2d 3e 69 4f 66 66 20 3d 20 31 20 2b 20    p->iOff = 1 + 
1e8f0 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61  sqlite3Fts3GetVa
1e900 72 69 6e 74 28 26 70 2d 3e 61 4e 6f 64 65 5b 31  rint(&p->aNode[1
1e910 5d 2c 20 26 70 2d 3e 69 43 68 69 6c 64 29 3b 0a  ], &p->iChild);.
1e920 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
1e930 69 4f 66 66 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  iOff = 1;.  }.. 
1e940 20 72 65 74 75 72 6e 20 6e 6f 64 65 52 65 61 64   return nodeRead
1e950 65 72 4e 65 78 74 28 70 29 3b 0a 7d 0a 0a 2f 2a  erNext(p);.}../*
1e960 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1e970 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 69 6c  n is called whil
1e980 65 20 77 72 69 74 69 6e 67 20 61 6e 20 46 54 53  e writing an FTS
1e990 20 73 65 67 6d 65 6e 74 20 65 61 63 68 20 74 69   segment each ti
1e9a0 6d 65 20 61 20 6c 65 61 66 20 6f 0a 2a 2a 20 6e  me a leaf o.** n
1e9b0 6f 64 65 20 69 73 20 66 69 6e 69 73 68 65 64 20  ode is finished 
1e9c0 61 6e 64 20 77 72 69 74 74 65 6e 20 74 6f 20 64  and written to d
1e9d0 69 73 6b 2e 20 54 68 65 20 6b 65 79 20 28 7a 54  isk. The key (zT
1e9e0 65 72 6d 2f 6e 54 65 72 6d 29 20 69 73 20 67 75  erm/nTerm) is gu
1e9f0 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62  aranteed.** to b
1ea00 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  e greater than t
1ea10 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 6f  he largest key o
1ea20 6e 20 74 68 65 20 6e 6f 64 65 20 6a 75 73 74 20  n the node just 
1ea30 77 72 69 74 74 65 6e 2c 20 62 75 74 20 73 6d 61  written, but sma
1ea40 6c 6c 65 72 0a 2a 2a 20 74 68 61 6e 20 6f 72 20  ller.** than or 
1ea50 65 71 75 61 6c 20 74 6f 20 74 68 65 20 66 69 72  equal to the fir
1ea60 73 74 20 6b 65 79 20 74 68 61 74 20 77 69 6c 6c  st key that will
1ea70 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
1ea80 68 65 20 6e 65 78 74 20 6c 65 61 66 0a 2a 2a 20  he next leaf.** 
1ea90 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  node..**.** The 
1eaa0 62 6c 6f 63 6b 20 69 64 20 6f 66 20 74 68 65 20  block id of the 
1eab0 6c 65 61 66 20 6e 6f 64 65 20 6a 75 73 74 20 77  leaf node just w
1eac0 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 20 6d  ritten to disk m
1ead0 61 79 20 62 65 20 66 6f 75 6e 64 20 69 6e 0a 2a  ay be found in.*
1eae0 2a 20 28 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64  * (pWriter->aNod
1eaf0 65 57 72 69 74 65 72 5b 30 5d 2e 69 42 6c 6f 63  eWriter[0].iBloc
1eb00 6b 29 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  k) when this fun
1eb10 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
1eb20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1eb30 74 73 33 49 6e 63 72 6d 65 72 67 65 50 75 73 68  ts3IncrmergePush
1eb40 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
1eb50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1eb60 20 20 20 20 2f 2a 20 46 74 73 33 20 74 61 62 6c      /* Fts3 tabl
1eb70 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 49 6e  e handle */.  In
1eb80 63 72 6d 65 72 67 65 57 72 69 74 65 72 20 2a 70  crmergeWriter *p
1eb90 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 2f 2a  Writer,       /*
1eba0 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a   Writer object *
1ebb0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1ebc0 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  zTerm,          
1ebd0 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 77      /* Term to w
1ebe0 72 69 74 65 20 74 6f 20 69 6e 74 65 72 6e 61 6c  rite to internal
1ebf0 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   node */.  int n
1ec00 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
1ec10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
1ec20 74 65 73 20 61 74 20 7a 54 65 72 6d 20 2a 2f 0a  tes at zTerm */.
1ec30 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ){.  sqlite3_int
1ec40 36 34 20 69 50 74 72 20 3d 20 70 57 72 69 74 65  64 iPtr = pWrite
1ec50 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 30  r->aNodeWriter[0
1ec60 5d 2e 69 42 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20  ].iBlock;.  int 
1ec70 69 4c 61 79 65 72 3b 0a 0a 20 20 61 73 73 65 72  iLayer;..  asser
1ec80 74 28 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 20 20  t( nTerm>0 );.  
1ec90 66 6f 72 28 69 4c 61 79 65 72 3d 31 3b 20 41 4c  for(iLayer=1; AL
1eca0 57 41 59 53 28 69 4c 61 79 65 72 3c 46 54 53 5f  WAYS(iLayer<FTS_
1ecb0 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c 45 5f 48  MAX_APPENDABLE_H
1ecc0 45 49 47 48 54 29 3b 20 69 4c 61 79 65 72 2b 2b  EIGHT); iLayer++
1ecd0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  ){.    sqlite3_i
1ece0 6e 74 36 34 20 69 4e 65 78 74 50 74 72 20 3d 20  nt64 iNextPtr = 
1ecf0 30 3b 0a 20 20 20 20 4e 6f 64 65 57 72 69 74 65  0;.    NodeWrite
1ed00 72 20 2a 70 4e 6f 64 65 20 3d 20 26 70 57 72 69  r *pNode = &pWri
1ed10 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72  ter->aNodeWriter
1ed20 5b 69 4c 61 79 65 72 5d 3b 0a 20 20 20 20 69 6e  [iLayer];.    in
1ed30 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1ed40 3b 0a 20 20 20 20 69 6e 74 20 6e 50 72 65 66 69  ;.    int nPrefi
1ed50 78 3b 0a 20 20 20 20 69 6e 74 20 6e 53 75 66 66  x;.    int nSuff
1ed60 69 78 3b 0a 20 20 20 20 69 6e 74 20 6e 53 70 61  ix;.    int nSpa
1ed70 63 65 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75  ce;..    /* Figu
1ed80 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20  re out how much 
1ed90 73 70 61 63 65 20 74 68 65 20 6b 65 79 20 77 69  space the key wi
1eda0 6c 6c 20 63 6f 6e 73 75 6d 65 20 69 66 20 69 74  ll consume if it
1edb0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 20   is written to. 
1edc0 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
1edd0 74 20 6e 6f 64 65 20 6f 66 20 6c 61 79 65 72 20  t node of layer 
1ede0 69 4c 61 79 65 72 2e 20 44 75 65 20 74 6f 20 74  iLayer. Due to t
1edf0 68 65 20 70 72 65 66 69 78 20 63 6f 6d 70 72 65  he prefix compre
1ee00 73 73 69 6f 6e 2c 20 0a 20 20 20 20 2a 2a 20 74  ssion, .    ** t
1ee10 68 65 20 73 70 61 63 65 20 72 65 71 75 69 72 65  he space require
1ee20 64 20 63 68 61 6e 67 65 73 20 64 65 70 65 6e 64  d changes depend
1ee30 69 6e 67 20 6f 6e 20 77 68 69 63 68 20 6e 6f 64  ing on which nod
1ee40 65 20 74 68 65 20 6b 65 79 20 69 73 20 74 6f 0a  e the key is to.
1ee50 20 20 20 20 2a 2a 20 62 65 20 61 64 64 65 64 20      ** be added 
1ee60 74 6f 2e 20 20 2a 2f 0a 20 20 20 20 6e 50 72 65  to.  */.    nPre
1ee70 66 69 78 20 3d 20 66 74 73 33 50 72 65 66 69 78  fix = fts3Prefix
1ee80 43 6f 6d 70 72 65 73 73 28 70 4e 6f 64 65 2d 3e  Compress(pNode->
1ee90 6b 65 79 2e 61 2c 20 70 4e 6f 64 65 2d 3e 6b 65  key.a, pNode->ke
1eea0 79 2e 6e 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  y.n, zTerm, nTer
1eeb0 6d 29 3b 0a 20 20 20 20 6e 53 75 66 66 69 78 20  m);.    nSuffix 
1eec0 3d 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66 69  = nTerm - nPrefi
1eed0 78 3b 0a 20 20 20 20 6e 53 70 61 63 65 20 20 3d  x;.    nSpace  =
1eee0 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69   sqlite3Fts3Vari
1eef0 6e 74 4c 65 6e 28 6e 50 72 65 66 69 78 29 3b 0a  ntLen(nPrefix);.
1ef00 20 20 20 20 6e 53 70 61 63 65 20 2b 3d 20 73 71      nSpace += sq
1ef10 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c  lite3Fts3VarintL
1ef20 65 6e 28 6e 53 75 66 66 69 78 29 20 2b 20 6e 53  en(nSuffix) + nS
1ef30 75 66 66 69 78 3b 0a 0a 20 20 20 20 69 66 28 20  uffix;..    if( 
1ef40 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 3d 3d 30 20  pNode->key.n==0 
1ef50 7c 7c 20 28 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b  || (pNode->block
1ef60 2e 6e 20 2b 20 6e 53 70 61 63 65 29 3c 3d 70 2d  .n + nSpace)<=p-
1ef70 3e 6e 4e 6f 64 65 53 69 7a 65 20 29 7b 20 0a 20  >nNodeSize ){ . 
1ef80 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
1ef90 75 72 72 65 6e 74 20 6e 6f 64 65 20 6f 66 20 6c  urrent node of l
1efa0 61 79 65 72 20 69 4c 61 79 65 72 20 63 6f 6e 74  ayer iLayer cont
1efb0 61 69 6e 73 20 7a 65 72 6f 20 6b 65 79 73 2c 20  ains zero keys, 
1efc0 6f 72 20 69 66 20 61 64 64 69 6e 67 0a 20 20 20  or if adding.   
1efd0 20 20 20 2a 2a 20 74 68 65 20 6b 65 79 20 74 6f     ** the key to
1efe0 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 63 61 75   it will not cau
1eff0 73 65 20 69 74 20 74 6f 20 67 72 6f 77 20 74 6f  se it to grow to
1f000 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 4e 6f   larger than nNo
1f010 64 65 53 69 7a 65 20 0a 20 20 20 20 20 20 2a 2a  deSize .      **
1f020 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
1f030 77 72 69 74 65 20 74 68 65 20 6b 65 79 20 68 65  write the key he
1f040 72 65 2e 20 20 2a 2f 0a 0a 20 20 20 20 20 20 42  re.  */..      B
1f050 6c 6f 62 20 2a 70 42 6c 6b 20 3d 20 26 70 4e 6f  lob *pBlk = &pNo
1f060 64 65 2d 3e 62 6c 6f 63 6b 3b 0a 20 20 20 20 20  de->block;.     
1f070 20 69 66 28 20 70 42 6c 6b 2d 3e 6e 3d 3d 30 20   if( pBlk->n==0 
1f080 29 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 47  ){.        blobG
1f090 72 6f 77 42 75 66 66 65 72 28 70 42 6c 6b 2c 20  rowBuffer(pBlk, 
1f0a0 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 2c 20 26 72  p->nNodeSize, &r
1f0b0 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
1f0c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f0d0 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c 6b 2d  .          pBlk-
1f0e0 3e 61 5b 30 5d 20 3d 20 28 63 68 61 72 29 69 4c  >a[0] = (char)iL
1f0f0 61 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20  ayer;.          
1f100 70 42 6c 6b 2d 3e 6e 20 3d 20 31 20 2b 20 73 71  pBlk->n = 1 + sq
1f110 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69  lite3Fts3PutVari
1f120 6e 74 28 26 70 42 6c 6b 2d 3e 61 5b 31 5d 2c 20  nt(&pBlk->a[1], 
1f130 69 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  iPtr);.        }
1f140 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1f150 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28 70 42  lobGrowBuffer(pB
1f160 6c 6b 2c 20 70 42 6c 6b 2d 3e 6e 20 2b 20 6e 53  lk, pBlk->n + nS
1f170 70 61 63 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  pace, &rc);.    
1f180 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 72    blobGrowBuffer
1f190 28 26 70 4e 6f 64 65 2d 3e 6b 65 79 2c 20 6e 54  (&pNode->key, nT
1f1a0 65 72 6d 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20  erm, &rc);..    
1f1b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f1c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
1f1d0 66 28 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 20  f( pNode->key.n 
1f1e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c  ){.          pBl
1f1f0 6b 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46  k->n += sqlite3F
1f200 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 42  ts3PutVarint(&pB
1f210 6c 6b 2d 3e 61 5b 70 42 6c 6b 2d 3e 6e 5d 2c 20  lk->a[pBlk->n], 
1f220 6e 50 72 65 66 69 78 29 3b 0a 20 20 20 20 20 20  nPrefix);.      
1f230 20 20 7d 0a 20 20 20 20 20 20 20 20 70 42 6c 6b    }.        pBlk
1f240 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ->n += sqlite3Ft
1f250 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 42 6c  s3PutVarint(&pBl
1f260 6b 2d 3e 61 5b 70 42 6c 6b 2d 3e 6e 5d 2c 20 6e  k->a[pBlk->n], n
1f270 53 75 66 66 69 78 29 3b 0a 20 20 20 20 20 20 20  Suffix);.       
1f280 20 6d 65 6d 63 70 79 28 26 70 42 6c 6b 2d 3e 61   memcpy(&pBlk->a
1f290 5b 70 42 6c 6b 2d 3e 6e 5d 2c 20 26 7a 54 65 72  [pBlk->n], &zTer
1f2a0 6d 5b 6e 50 72 65 66 69 78 5d 2c 20 6e 53 75 66  m[nPrefix], nSuf
1f2b0 66 69 78 29 3b 0a 20 20 20 20 20 20 20 20 70 42  fix);.        pB
1f2c0 6c 6b 2d 3e 6e 20 2b 3d 20 6e 53 75 66 66 69 78  lk->n += nSuffix
1f2d0 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ;..        memcp
1f2e0 79 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e 61 2c 20  y(pNode->key.a, 
1f2f0 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  zTerm, nTerm);. 
1f300 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 6b 65         pNode->ke
1f310 79 2e 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20  y.n = nTerm;.   
1f320 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
1f330 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69        /* Otherwi
1f340 73 65 2c 20 66 6c 75 73 68 20 74 68 65 20 63 75  se, flush the cu
1f350 72 72 65 6e 74 20 6e 6f 64 65 20 6f 66 20 6c 61  rrent node of la
1f360 79 65 72 20 69 4c 61 79 65 72 20 74 6f 20 64 69  yer iLayer to di
1f370 73 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  sk..      ** The
1f380 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  n allocate a new
1f390 2c 20 65 6d 70 74 79 20 73 69 62 6c 69 6e 67 20  , empty sibling 
1f3a0 6e 6f 64 65 2e 20 54 68 65 20 6b 65 79 20 77 69  node. The key wi
1f3b0 6c 6c 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20  ll be written.  
1f3c0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
1f3d0 70 61 72 65 6e 74 20 6f 66 20 74 68 69 73 20 6e  parent of this n
1f3e0 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ode. */.      rc
1f3f0 20 3d 20 66 74 73 33 57 72 69 74 65 53 65 67 6d   = fts3WriteSegm
1f400 65 6e 74 28 70 2c 20 70 4e 6f 64 65 2d 3e 69 42  ent(p, pNode->iB
1f410 6c 6f 63 6b 2c 20 70 4e 6f 64 65 2d 3e 62 6c 6f  lock, pNode->blo
1f420 63 6b 2e 61 2c 20 70 4e 6f 64 65 2d 3e 62 6c 6f  ck.a, pNode->blo
1f430 63 6b 2e 6e 29 3b 0a 0a 20 20 20 20 20 20 61 73  ck.n);..      as
1f440 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 62 6c 6f  sert( pNode->blo
1f450 63 6b 2e 6e 41 6c 6c 6f 63 3e 3d 70 2d 3e 6e 4e  ck.nAlloc>=p->nN
1f460 6f 64 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  odeSize );.     
1f470 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 5b   pNode->block.a[
1f480 30 5d 20 3d 20 28 63 68 61 72 29 69 4c 61 79 65  0] = (char)iLaye
1f490 72 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e  r;.      pNode->
1f4a0 62 6c 6f 63 6b 2e 6e 20 3d 20 31 20 2b 20 73 71  block.n = 1 + sq
1f4b0 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69  lite3Fts3PutVari
1f4c0 6e 74 28 26 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b  nt(&pNode->block
1f4d0 2e 61 5b 31 5d 2c 20 69 50 74 72 2b 31 29 3b 0a  .a[1], iPtr+1);.
1f4e0 0a 20 20 20 20 20 20 69 4e 65 78 74 50 74 72 20  .      iNextPtr 
1f4f0 3d 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b 3b  = pNode->iBlock;
1f500 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 69 42  .      pNode->iB
1f510 6c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 4e  lock++;.      pN
1f520 6f 64 65 2d 3e 6b 65 79 2e 6e 20 3d 20 30 3b 0a  ode->key.n = 0;.
1f530 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
1f540 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1f550 69 4e 65 78 74 50 74 72 3d 3d 30 20 29 20 72 65  iNextPtr==0 ) re
1f560 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 50 74  turn rc;.    iPt
1f570 72 20 3d 20 69 4e 65 78 74 50 74 72 3b 0a 20 20  r = iNextPtr;.  
1f580 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 30 20 29  }..  assert( 0 )
1f590 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1f5a0 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
1f5b0 74 65 72 6d 20 61 6e 64 20 28 6f 70 74 69 6f 6e  term and (option
1f5c0 61 6c 6c 79 29 20 64 6f 63 6c 69 73 74 20 74 6f  ally) doclist to
1f5d0 20 74 68 65 20 46 54 53 20 73 65 67 6d 65 6e 74   the FTS segment
1f5e0 20 6e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 0a   node currently.
1f5f0 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 62 6c 6f  ** stored in blo
1f600 62 20 2a 70 4e 6f 64 65 2e 20 54 68 65 20 6e 6f  b *pNode. The no
1f610 64 65 20 6e 65 65 64 20 6e 6f 74 20 63 6f 6e 74  de need not cont
1f620 61 69 6e 20 61 6e 79 20 74 65 72 6d 73 2c 20 62  ain any terms, b
1f630 75 74 20 74 68 65 0a 2a 2a 20 68 65 61 64 65 72  ut the.** header
1f640 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e   must be written
1f650 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e   before this fun
1f660 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
1f670 0a 2a 2a 0a 2a 2a 20 41 20 6e 6f 64 65 20 68 65  .**.** A node he
1f680 61 64 65 72 20 69 73 20 61 20 73 69 6e 67 6c 65  ader is a single
1f690 20 30 78 30 30 20 62 79 74 65 20 66 6f 72 20 61   0x00 byte for a
1f6a0 20 6c 65 61 66 20 6e 6f 64 65 2c 20 6f 72 20 61   leaf node, or a
1f6b0 20 68 65 69 67 68 74 20 76 61 72 69 6e 74 0a 2a   height varint.*
1f6c0 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68  * followed by th
1f6d0 65 20 6c 65 66 74 2d 68 61 6e 64 2d 63 68 69 6c  e left-hand-chil
1f6e0 64 20 76 61 72 69 6e 74 20 66 6f 72 20 61 6e 20  d varint for an 
1f6f0 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 0a 2a  internal node..*
1f700 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 74 6f  *.** The term to
1f710 20 62 65 20 61 70 70 65 6e 64 65 64 20 69 73 20   be appended is 
1f720 70 61 73 73 65 64 20 76 69 61 20 61 72 67 75 6d  passed via argum
1f730 65 6e 74 73 20 7a 54 65 72 6d 2f 6e 54 65 72 6d  ents zTerm/nTerm
1f740 2e 20 46 6f 72 20 61 20 0a 2a 2a 20 6c 65 61 66  . For a .** leaf
1f750 20 6e 6f 64 65 2c 20 74 68 65 20 64 6f 63 6c 69   node, the docli
1f760 73 74 20 69 73 20 70 61 73 73 65 64 20 61 73 20  st is passed as 
1f770 61 44 6f 63 6c 69 73 74 2f 6e 44 6f 63 6c 69 73  aDoclist/nDoclis
1f780 74 2e 20 46 6f 72 20 61 6e 20 69 6e 74 65 72 6e  t. For an intern
1f790 61 6c 0a 2a 2a 20 6e 6f 64 65 2c 20 62 6f 74 68  al.** node, both
1f7a0 20 61 44 6f 63 6c 69 73 74 20 61 6e 64 20 6e 44   aDoclist and nD
1f7b0 6f 63 6c 69 73 74 20 6d 75 73 74 20 62 65 20 70  oclist must be p
1f7c0 61 73 73 65 64 20 30 2e 0a 2a 2a 0a 2a 2a 20 49  assed 0..**.** I
1f7d0 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
1f7e0 65 20 76 61 6c 75 65 20 69 6e 20 62 6c 6f 62 20  e value in blob 
1f7f0 70 50 72 65 76 20 69 73 20 7a 65 72 6f 2c 20 74  pPrev is zero, t
1f800 68 65 6e 20 74 68 69 73 20 69 73 20 74 68 65 20  hen this is the 
1f810 66 69 72 73 74 0a 2a 2a 20 74 65 72 6d 20 77 72  first.** term wr
1f820 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6e 6f 64  itten to the nod
1f830 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70 50  e. Otherwise, pP
1f840 72 65 76 20 63 6f 6e 74 61 69 6e 73 20 61 20 63  rev contains a c
1f850 6f 70 79 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  opy of the .** p
1f860 72 65 76 69 6f 75 73 20 74 65 72 6d 2e 20 42 65  revious term. Be
1f870 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
1f880 6f 6e 20 72 65 74 75 72 6e 73 2c 20 69 74 20 69  on returns, it i
1f890 73 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e  s updated to con
1f8a0 74 61 69 6e 20 61 0a 2a 2a 20 63 6f 70 79 20 6f  tain a.** copy o
1f8b0 66 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 0a 2a  f zTerm/nTerm..*
1f8c0 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d  *.** It is assum
1f8d0 65 64 20 74 68 61 74 20 74 68 65 20 62 75 66 66  ed that the buff
1f8e0 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  er associated wi
1f8f0 74 68 20 70 4e 6f 64 65 20 69 73 20 61 6c 72 65  th pNode is alre
1f900 61 64 79 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f  ady large.** eno
1f910 75 67 68 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61  ugh to accommoda
1f920 74 65 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  te the new entry
1f930 2e 20 54 68 65 20 62 75 66 66 65 72 20 61 73 73  . The buffer ass
1f940 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50 72  ociated with pPr
1f950 65 76 0a 2a 2a 20 69 73 20 65 78 74 65 6e 64 65  ev.** is extende
1f960 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
1f970 6f 6e 20 69 66 20 72 65 71 75 72 69 72 65 64 2e  on if requrired.
1f980 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
1f990 6f 72 20 28 69 2e 65 2e 20 4f 4f 4d 20 63 6f 6e  or (i.e. OOM con
1f9a0 64 69 74 69 6f 6e 29 20 6f 63 63 75 72 73 2c 20  dition) occurs, 
1f9b0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1f9c0 63 6f 64 65 20 69 73 0a 2a 2a 20 72 65 74 75 72  code is.** retur
1f9d0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
1f9e0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
1f9f0 61 74 69 63 20 69 6e 74 20 66 74 73 33 41 70 70  atic int fts3App
1fa00 65 6e 64 54 6f 4e 6f 64 65 28 0a 20 20 42 6c 6f  endToNode(.  Blo
1fa10 62 20 2a 70 4e 6f 64 65 2c 20 20 20 20 20 20 20  b *pNode,       
1fa20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fa30 43 75 72 72 65 6e 74 20 6e 6f 64 65 20 69 6d 61  Current node ima
1fa40 67 65 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  ge to append to 
1fa50 2a 2f 0a 20 20 42 6c 6f 62 20 2a 70 50 72 65 76  */.  Blob *pPrev
1fa60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1fa70 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
1fa80 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f  ontaining previo
1fa90 75 73 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20  us term written 
1faa0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1fab0 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  *zTerm,         
1fac0 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 65 72 6d       /* New term
1fad0 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69   to write */.  i
1fae0 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 20 20  nt nTerm,       
1faf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fb00 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20  * Size of zTerm 
1fb10 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 6f  in bytes */.  co
1fb20 6e 73 74 20 63 68 61 72 20 2a 61 44 6f 63 6c 69  nst char *aDocli
1fb30 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st,           /*
1fb40 20 44 6f 63 6c 69 73 74 20 28 6f 72 20 4e 55 4c   Doclist (or NUL
1fb50 4c 29 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  L) to write */. 
1fb60 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 20 20 20   int nDoclist   
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb80 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 44 6f 63   /* Size of aDoc
1fb90 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  list in bytes */
1fba0 20 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20   .){.  int rc = 
1fbb0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
1fbc0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1fbd0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 62   code */.  int b
1fbe0 46 69 72 73 74 20 3d 20 28 70 50 72 65 76 2d 3e  First = (pPrev->
1fbf0 6e 3d 3d 30 29 3b 20 20 20 20 20 2f 2a 20 54 72  n==0);     /* Tr
1fc00 75 65 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ue if this is th
1fc10 65 20 66 69 72 73 74 20 74 65 72 6d 20 77 72 69  e first term wri
1fc20 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  tten */.  int nP
1fc30 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20  refix;          
1fc40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1fc50 65 20 6f 66 20 74 65 72 6d 20 70 72 65 66 69 78  e of term prefix
1fc60 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
1fc70 6e 74 20 6e 53 75 66 66 69 78 3b 20 20 20 20 20  nt nSuffix;     
1fc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fc90 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 73  * Size of term s
1fca0 75 66 66 69 78 20 69 6e 20 62 79 74 65 73 20 2a  uffix in bytes *
1fcb0 2f 0a 0a 20 20 2f 2a 20 4e 6f 64 65 20 6d 75 73  /..  /* Node mus
1fcc0 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
1fcd0 65 65 6e 20 73 74 61 72 74 65 64 2e 20 54 68 65  een started. The
1fce0 72 65 20 6d 75 73 74 20 62 65 20 61 20 64 6f 63  re must be a doc
1fcf0 6c 69 73 74 20 66 6f 72 20 61 0a 20 20 2a 2a 20  list for a.  ** 
1fd00 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 74  leaf node, and t
1fd10 68 65 72 65 20 6d 75 73 74 20 6e 6f 74 20 62 65  here must not be
1fd20 20 61 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 61   a doclist for a
1fd30 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e  n internal node.
1fd40 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
1fd50 4e 6f 64 65 2d 3e 6e 3e 30 20 29 3b 0a 20 20 61  Node->n>0 );.  a
1fd60 73 73 65 72 74 28 20 28 70 4e 6f 64 65 2d 3e 61  ssert( (pNode->a
1fd70 5b 30 5d 3d 3d 27 5c 30 27 29 3d 3d 28 61 44 6f  [0]=='\0')==(aDo
1fd80 63 6c 69 73 74 21 3d 30 29 20 29 3b 0a 0a 20 20  clist!=0) );..  
1fd90 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28 70  blobGrowBuffer(p
1fda0 50 72 65 76 2c 20 6e 54 65 72 6d 2c 20 26 72 63  Prev, nTerm, &rc
1fdb0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1fdc0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1fdd0 72 63 3b 0a 0a 20 20 6e 50 72 65 66 69 78 20 3d  rc;..  nPrefix =
1fde0 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72   fts3PrefixCompr
1fdf0 65 73 73 28 70 50 72 65 76 2d 3e 61 2c 20 70 50  ess(pPrev->a, pP
1fe00 72 65 76 2d 3e 6e 2c 20 7a 54 65 72 6d 2c 20 6e  rev->n, zTerm, n
1fe10 54 65 72 6d 29 3b 0a 20 20 6e 53 75 66 66 69 78  Term);.  nSuffix
1fe20 20 3d 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66   = nTerm - nPref
1fe30 69 78 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50 72  ix;.  memcpy(pPr
1fe40 65 76 2d 3e 61 2c 20 7a 54 65 72 6d 2c 20 6e 54  ev->a, zTerm, nT
1fe50 65 72 6d 29 3b 0a 20 20 70 50 72 65 76 2d 3e 6e  erm);.  pPrev->n
1fe60 20 3d 20 6e 54 65 72 6d 3b 0a 0a 20 20 69 66 28   = nTerm;..  if(
1fe70 20 62 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20   bFirst==0 ){.  
1fe80 20 20 70 4e 6f 64 65 2d 3e 6e 20 2b 3d 20 73 71    pNode->n += sq
1fe90 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69  lite3Fts3PutVari
1fea0 6e 74 28 26 70 4e 6f 64 65 2d 3e 61 5b 70 4e 6f  nt(&pNode->a[pNo
1feb0 64 65 2d 3e 6e 5d 2c 20 6e 50 72 65 66 69 78 29  de->n], nPrefix)
1fec0 3b 0a 20 20 7d 0a 20 20 70 4e 6f 64 65 2d 3e 6e  ;.  }.  pNode->n
1fed0 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50   += sqlite3Fts3P
1fee0 75 74 56 61 72 69 6e 74 28 26 70 4e 6f 64 65 2d  utVarint(&pNode-
1fef0 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d 2c 20 6e 53  >a[pNode->n], nS
1ff00 75 66 66 69 78 29 3b 0a 20 20 6d 65 6d 63 70 79  uffix);.  memcpy
1ff10 28 26 70 4e 6f 64 65 2d 3e 61 5b 70 4e 6f 64 65  (&pNode->a[pNode
1ff20 2d 3e 6e 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50 72  ->n], &zTerm[nPr
1ff30 65 66 69 78 5d 2c 20 6e 53 75 66 66 69 78 29 3b  efix], nSuffix);
1ff40 0a 20 20 70 4e 6f 64 65 2d 3e 6e 20 2b 3d 20 6e  .  pNode->n += n
1ff50 53 75 66 66 69 78 3b 0a 0a 20 20 69 66 28 20 61  Suffix;..  if( a
1ff60 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 70  Doclist ){.    p
1ff70 4e 6f 64 65 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  Node->n += sqlit
1ff80 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28  e3Fts3PutVarint(
1ff90 26 70 4e 6f 64 65 2d 3e 61 5b 70 4e 6f 64 65 2d  &pNode->a[pNode-
1ffa0 3e 6e 5d 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a  >n], nDoclist);.
1ffb0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 6f 64      memcpy(&pNod
1ffc0 65 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d 2c 20  e->a[pNode->n], 
1ffd0 61 44 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c 69  aDoclist, nDocli
1ffe0 73 74 29 3b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e  st);.    pNode->
1fff0 6e 20 2b 3d 20 6e 44 6f 63 6c 69 73 74 3b 0a 20  n += nDoclist;. 
20000 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e   }..  assert( pN
20010 6f 64 65 2d 3e 6e 3c 3d 70 4e 6f 64 65 2d 3e 6e  ode->n<=pNode->n
20020 41 6c 6c 6f 63 20 29 3b 0a 0a 20 20 72 65 74 75  Alloc );..  retu
20030 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
20040 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 68  ./*.** Append th
20050 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 61  e current term a
20060 6e 64 20 64 6f 63 6c 69 73 74 20 70 6f 69 6e 74  nd doclist point
20070 65 64 20 74 6f 20 62 79 20 63 75 72 73 6f 72 20  ed to by cursor 
20080 70 43 73 72 20 74 6f 20 74 68 65 0a 2a 2a 20 61  pCsr to the.** a
20090 70 70 65 6e 64 61 62 6c 65 20 62 2d 74 72 65 65  ppendable b-tree
200a0 20 73 65 67 6d 65 6e 74 20 6f 70 65 6e 65 64 20   segment opened 
200b0 66 6f 72 20 77 72 69 74 69 6e 67 20 62 79 20 70  for writing by p
200c0 57 72 69 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65  Writer..**.** Re
200d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
200e0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
200f0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
20100 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
20110 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
20120 74 73 33 49 6e 63 72 6d 65 72 67 65 41 70 70 65  ts3IncrmergeAppe
20130 6e 64 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  nd(.  Fts3Table 
20140 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
20150 20 20 20 20 20 20 2f 2a 20 46 74 73 33 20 74 61        /* Fts3 ta
20160 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
20170 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72 20  IncrmergeWriter 
20180 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20  *pWriter,       
20190 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74  /* Writer object
201a0 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53   */.  Fts3MultiS
201b0 65 67 52 65 61 64 65 72 20 2a 70 43 73 72 20 20  egReader *pCsr  
201c0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
201d0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d 20  containing term 
201e0 61 6e 64 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 29  and doclist */.)
201f0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
20200 7a 54 65 72 6d 20 3d 20 70 43 73 72 2d 3e 7a 54  zTerm = pCsr->zT
20210 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d  erm;.  int nTerm
20220 20 3d 20 70 43 73 72 2d 3e 6e 54 65 72 6d 3b 0a   = pCsr->nTerm;.
20230 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44    const char *aD
20240 6f 63 6c 69 73 74 20 3d 20 70 43 73 72 2d 3e 61  oclist = pCsr->a
20250 44 6f 63 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e  Doclist;.  int n
20260 44 6f 63 6c 69 73 74 20 3d 20 70 43 73 72 2d 3e  Doclist = pCsr->
20270 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 69 6e 74 20  nDoclist;.  int 
20280 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
20290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
202a0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
202b0 74 20 6e 53 70 61 63 65 3b 20 20 20 20 20 20 20  t nSpace;       
202c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
202d0 6f 74 61 6c 20 73 70 61 63 65 20 69 6e 20 62 79  otal space in by
202e0 74 65 73 20 72 65 71 75 69 72 65 64 20 6f 6e 20  tes required on 
202f0 6c 65 61 66 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  leaf */.  int nP
20300 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20  refix;          
20310 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
20320 6f 66 20 70 72 65 66 69 78 20 73 68 61 72 65 64  of prefix shared
20330 20 77 69 74 68 20 70 72 65 76 69 6f 75 73 20 74   with previous t
20340 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  erm */.  int nSu
20350 66 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20  ffix;           
20360 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
20370 66 20 73 75 66 66 69 78 20 28 6e 54 65 72 6d 20  f suffix (nTerm 
20380 2d 20 6e 50 72 65 66 69 78 29 20 2a 2f 0a 20 20  - nPrefix) */.  
20390 4e 6f 64 65 57 72 69 74 65 72 20 2a 70 4c 65 61  NodeWriter *pLea
203a0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  f;            /*
203b0 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20   Object used to 
203c0 77 72 69 74 65 20 6c 65 61 66 20 6e 6f 64 65 73  write leaf nodes
203d0 20 2a 2f 0a 0a 20 20 70 4c 65 61 66 20 3d 20 26   */..  pLeaf = &
203e0 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72  pWriter->aNodeWr
203f0 69 74 65 72 5b 30 5d 3b 0a 20 20 6e 50 72 65 66  iter[0];.  nPref
20400 69 78 20 3d 20 66 74 73 33 50 72 65 66 69 78 43  ix = fts3PrefixC
20410 6f 6d 70 72 65 73 73 28 70 4c 65 61 66 2d 3e 6b  ompress(pLeaf->k
20420 65 79 2e 61 2c 20 70 4c 65 61 66 2d 3e 6b 65 79  ey.a, pLeaf->key
20430 2e 6e 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  .n, zTerm, nTerm
20440 29 3b 0a 20 20 6e 53 75 66 66 69 78 20 3d 20 6e  );.  nSuffix = n
20450 54 65 72 6d 20 2d 20 6e 50 72 65 66 69 78 3b 0a  Term - nPrefix;.
20460 0a 20 20 6e 53 70 61 63 65 20 20 3d 20 73 71 6c  .  nSpace  = sql
20470 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65  ite3Fts3VarintLe
20480 6e 28 6e 50 72 65 66 69 78 29 3b 0a 20 20 6e 53  n(nPrefix);.  nS
20490 70 61 63 65 20 2b 3d 20 73 71 6c 69 74 65 33 46  pace += sqlite3F
204a0 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 53 75  ts3VarintLen(nSu
204b0 66 66 69 78 29 20 2b 20 6e 53 75 66 66 69 78 3b  ffix) + nSuffix;
204c0 0a 20 20 6e 53 70 61 63 65 20 2b 3d 20 73 71 6c  .  nSpace += sql
204d0 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65  ite3Fts3VarintLe
204e0 6e 28 6e 44 6f 63 6c 69 73 74 29 20 2b 20 6e 44  n(nDoclist) + nD
204f0 6f 63 6c 69 73 74 3b 0a 0a 20 20 2f 2a 20 49 66  oclist;..  /* If
20500 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 6c 6f   the current blo
20510 63 6b 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c  ck is not empty,
20520 20 61 6e 64 20 69 66 20 61 64 64 69 6e 67 20 74   and if adding t
20530 68 69 73 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74  his term/doclist
20540 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 75 72  .  ** to the cur
20550 72 65 6e 74 20 62 6c 6f 63 6b 20 77 6f 75 6c 64  rent block would
20560 20 6d 61 6b 65 20 69 74 20 6c 61 72 67 65 72 20   make it larger 
20570 74 68 61 6e 20 46 74 73 33 54 61 62 6c 65 2e 6e  than Fts3Table.n
20580 4e 6f 64 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79  NodeSize.  ** by
20590 74 65 73 2c 20 77 72 69 74 65 20 74 68 69 73 20  tes, write this 
205a0 62 6c 6f 63 6b 20 6f 75 74 20 74 6f 20 74 68 65  block out to the
205b0 20 64 61 74 61 62 61 73 65 2e 20 2a 2f 0a 20 20   database. */.  
205c0 69 66 28 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b  if( pLeaf->block
205d0 2e 6e 3e 30 20 26 26 20 28 70 4c 65 61 66 2d 3e  .n>0 && (pLeaf->
205e0 62 6c 6f 63 6b 2e 6e 20 2b 20 6e 53 70 61 63 65  block.n + nSpace
205f0 29 3e 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 29  )>p->nNodeSize )
20600 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 57  {.    rc = fts3W
20610 72 69 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 70  riteSegment(p, p
20620 4c 65 61 66 2d 3e 69 42 6c 6f 63 6b 2c 20 70 4c  Leaf->iBlock, pL
20630 65 61 66 2d 3e 62 6c 6f 63 6b 2e 61 2c 20 70 4c  eaf->block.a, pL
20640 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 29 3b 0a 20  eaf->block.n);. 
20650 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 57 6f 72     pWriter->nWor
20660 6b 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64  k++;..    /* Add
20670 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   the current ter
20680 6d 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  m to the parent 
20690 6e 6f 64 65 2e 20 54 68 65 20 74 65 72 6d 20 61  node. The term a
206a0 64 64 65 64 20 74 6f 20 74 68 65 20 0a 20 20 20  dded to the .   
206b0 20 2a 2a 20 70 61 72 65 6e 74 20 6d 75 73 74 3a   ** parent must:
206c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
206d0 20 61 29 20 62 65 20 67 72 65 61 74 65 72 20 74   a) be greater t
206e0 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  han the largest 
206f0 74 65 72 6d 20 6f 6e 20 74 68 65 20 6c 65 61 66  term on the leaf
20700 20 6e 6f 64 65 20 6a 75 73 74 20 77 72 69 74 74   node just writt
20710 65 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 74  en.    **      t
20720 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  o the database (
20730 73 74 69 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20  still available 
20740 69 6e 20 70 4c 65 61 66 2d 3e 6b 65 79 29 2c 20  in pLeaf->key), 
20750 61 6e 64 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  and.    **.    *
20760 2a 20 20 20 62 29 20 62 65 20 6c 65 73 73 20 74  *   b) be less t
20770 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
20780 74 68 65 20 74 65 72 6d 20 61 62 6f 75 74 20 74  the term about t
20790 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  o be added to th
207a0 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 20 20 20  e new.    **    
207b0 20 20 6c 65 61 66 20 6e 6f 64 65 20 28 7a 54 65    leaf node (zTe
207c0 72 6d 2f 6e 54 65 72 6d 29 2e 0a 20 20 20 20 2a  rm/nTerm)..    *
207d0 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65  *.    ** In othe
207e0 72 20 77 6f 72 64 73 2c 20 69 74 20 6d 75 73 74  r words, it must
207f0 20 62 65 20 74 68 65 20 70 72 65 66 69 78 20 6f   be the prefix o
20800 66 20 7a 54 65 72 6d 20 31 20 62 79 74 65 20 6c  f zTerm 1 byte l
20810 6f 6e 67 65 72 20 74 68 61 6e 0a 20 20 20 20 2a  onger than.    *
20820 2a 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65  * the common pre
20830 66 69 78 20 28 69 66 20 61 6e 79 29 20 6f 66 20  fix (if any) of 
20840 7a 54 65 72 6d 20 61 6e 64 20 70 57 72 69 74 65  zTerm and pWrite
20850 72 2d 3e 7a 54 65 72 6d 2e 0a 20 20 20 20 2a 2f  r->zTerm..    */
20860 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
20870 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20880 72 63 20 3d 20 66 74 73 33 49 6e 63 72 6d 65 72  rc = fts3Incrmer
20890 67 65 50 75 73 68 28 70 2c 20 70 57 72 69 74 65  gePush(p, pWrite
208a0 72 2c 20 7a 54 65 72 6d 2c 20 6e 50 72 65 66 69  r, zTerm, nPrefi
208b0 78 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  x+1);.    }..   
208c0 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74   /* Advance to t
208d0 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 62  he next output b
208e0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 70 4c 65 61  lock */.    pLea
208f0 66 2d 3e 69 42 6c 6f 63 6b 2b 2b 3b 0a 20 20 20  f->iBlock++;.   
20900 20 70 4c 65 61 66 2d 3e 6b 65 79 2e 6e 20 3d 20   pLeaf->key.n = 
20910 30 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e 62 6c  0;.    pLeaf->bl
20920 6f 63 6b 2e 6e 20 3d 20 30 3b 0a 0a 20 20 20 20  ock.n = 0;..    
20930 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d 3b  nSuffix = nTerm;
20940 0a 20 20 20 20 6e 53 70 61 63 65 20 20 3d 20 31  .    nSpace  = 1
20950 3b 0a 20 20 20 20 6e 53 70 61 63 65 20 2b 3d 20  ;.    nSpace += 
20960 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e  sqlite3Fts3Varin
20970 74 4c 65 6e 28 6e 53 75 66 66 69 78 29 20 2b 20  tLen(nSuffix) + 
20980 6e 53 75 66 66 69 78 3b 0a 20 20 20 20 6e 53 70  nSuffix;.    nSp
20990 61 63 65 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ace += sqlite3Ft
209a0 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 44 6f 63  s3VarintLen(nDoc
209b0 6c 69 73 74 29 20 2b 20 6e 44 6f 63 6c 69 73 74  list) + nDoclist
209c0 3b 0a 20 20 7d 0a 0a 20 20 70 57 72 69 74 65 72  ;.  }..  pWriter
209d0 2d 3e 6e 4c 65 61 66 44 61 74 61 20 2b 3d 20 6e  ->nLeafData += n
209e0 53 70 61 63 65 3b 0a 20 20 62 6c 6f 62 47 72 6f  Space;.  blobGro
209f0 77 42 75 66 66 65 72 28 26 70 4c 65 61 66 2d 3e  wBuffer(&pLeaf->
20a00 62 6c 6f 63 6b 2c 20 70 4c 65 61 66 2d 3e 62 6c  block, pLeaf->bl
20a10 6f 63 6b 2e 6e 20 2b 20 6e 53 70 61 63 65 2c 20  ock.n + nSpace, 
20a20 26 72 63 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  &rc);.  if( rc==
20a30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20a40 20 69 66 28 20 70 4c 65 61 66 2d 3e 62 6c 6f 63   if( pLeaf->bloc
20a50 6b 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  k.n==0 ){.      
20a60 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 20 3d  pLeaf->block.n =
20a70 20 31 3b 0a 20 20 20 20 20 20 70 4c 65 61 66 2d   1;.      pLeaf-
20a80 3e 62 6c 6f 63 6b 2e 61 5b 30 5d 20 3d 20 27 5c  >block.a[0] = '\
20a90 30 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  0';.    }.    rc
20aa0 20 3d 20 66 74 73 33 41 70 70 65 6e 64 54 6f 4e   = fts3AppendToN
20ab0 6f 64 65 28 0a 20 20 20 20 20 20 20 20 26 70 4c  ode(.        &pL
20ac0 65 61 66 2d 3e 62 6c 6f 63 6b 2c 20 26 70 4c 65  eaf->block, &pLe
20ad0 61 66 2d 3e 6b 65 79 2c 20 7a 54 65 72 6d 2c 20  af->key, zTerm, 
20ae0 6e 54 65 72 6d 2c 20 61 44 6f 63 6c 69 73 74 2c  nTerm, aDoclist,
20af0 20 6e 44 6f 63 6c 69 73 74 0a 20 20 20 20 29 3b   nDoclist.    );
20b00 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
20b10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
20b20 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
20b30 6c 65 64 20 74 6f 20 72 65 6c 65 61 73 65 20 61  led to release a
20b40 6c 6c 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75  ll dynamic resou
20b50 72 63 65 73 20 68 65 6c 64 20 62 79 20 74 68 65  rces held by the
20b60 0a 2a 2a 20 6d 65 72 67 65 2d 77 72 69 74 65 72  .** merge-writer
20b70 20 6f 62 6a 65 63 74 20 70 57 72 69 74 65 72 2c   object pWriter,
20b80 20 61 6e 64 20 69 66 20 6e 6f 20 65 72 72 6f 72   and if no error
20b90 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74   has occurred, t
20ba0 6f 20 66 6c 75 73 68 0a 2a 2a 20 61 6c 6c 20 6f  o flush.** all o
20bb0 75 74 73 74 61 6e 64 69 6e 67 20 6e 6f 64 65 20  utstanding node 
20bc0 62 75 66 66 65 72 73 20 68 65 6c 64 20 62 79 20  buffers held by 
20bd0 70 57 72 69 74 65 72 20 74 6f 20 64 69 73 6b 2e  pWriter to disk.
20be0 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69  .**.** If *pRc i
20bf0 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20  s not SQLITE_OK 
20c00 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
20c10 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
20c20 65 6e 20 6e 6f 20 61 74 74 65 6d 70 74 0a 2a 2a  en no attempt.**
20c30 20 69 73 20 6d 61 64 65 20 74 6f 20 77 72 69 74   is made to writ
20c40 65 20 61 6e 79 20 64 61 74 61 20 74 6f 20 64 69  e any data to di
20c50 73 6b 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 69  sk. Instead, thi
20c60 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 72 76 65  s function serve
20c70 73 20 6f 6e 6c 79 0a 2a 2a 20 74 6f 20 72 65 6c  s only.** to rel
20c80 65 61 73 65 20 6f 75 74 73 74 61 6e 64 69 6e 67  ease outstanding
20c90 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2a 0a 2a   resources..**.*
20ca0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
20cb0 2a 70 52 63 20 69 73 20 69 6e 69 74 69 61 6c 6c  *pRc is initiall
20cc0 79 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  y SQLITE_OK and 
20cd0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
20ce0 77 68 69 6c 65 0a 2a 2a 20 66 6c 75 73 68 69 6e  while.** flushin
20cf0 67 20 62 75 66 66 65 72 73 20 74 6f 20 64 69 73  g buffers to dis
20d00 6b 2c 20 2a 70 52 63 20 69 73 20 73 65 74 20 74  k, *pRc is set t
20d10 6f 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  o an SQLite erro
20d20 72 20 63 6f 64 65 20 62 65 66 6f 72 65 0a 2a 2a  r code before.**
20d30 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
20d40 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 49  tatic void fts3I
20d50 6e 63 72 6d 65 72 67 65 52 65 6c 65 61 73 65 28  ncrmergeRelease(
20d60 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
20d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d80 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65     /* FTS3 table
20d90 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 49 6e 63   handle */.  Inc
20da0 72 6d 65 72 67 65 57 72 69 74 65 72 20 2a 70 57  rmergeWriter *pW
20db0 72 69 74 65 72 2c 20 20 20 20 20 20 20 2f 2a 20  riter,       /* 
20dc0 4d 65 72 67 65 2d 77 72 69 74 65 72 20 6f 62 6a  Merge-writer obj
20dd0 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  ect */.  int *pR
20de0 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
20df0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
20e00 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a  UT: Error code *
20e10 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
20e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e30 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
20e40 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
20e50 68 20 6e 6f 6e 2d 72 6f 6f 74 20 6c 61 79 65 72  h non-root layer
20e60 73 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 6f 74  s */.  int iRoot
20e70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20e80 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
20e90 6f 66 20 72 6f 6f 74 20 69 6e 20 70 57 72 69 74  of root in pWrit
20ea0 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 20  er->aNodeWriter 
20eb0 2a 2f 0a 20 20 4e 6f 64 65 57 72 69 74 65 72 20  */.  NodeWriter 
20ec0 2a 70 52 6f 6f 74 3b 20 20 20 20 20 20 20 20 20  *pRoot;         
20ed0 20 20 20 20 20 2f 2a 20 4e 6f 64 65 57 72 69 74       /* NodeWrit
20ee0 65 72 20 66 6f 72 20 72 6f 6f 74 20 6e 6f 64 65  er for root node
20ef0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 2a   */.  int rc = *
20f00 70 52 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  pRc;            
20f10 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
20f20 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 53 65 74  ode */..  /* Set
20f30 20 69 52 6f 6f 74 20 74 6f 20 74 68 65 20 69 6e   iRoot to the in
20f40 64 65 78 20 69 6e 20 70 57 72 69 74 65 72 2d 3e  dex in pWriter->
20f50 61 4e 6f 64 65 57 72 69 74 65 72 5b 5d 20 6f 66  aNodeWriter[] of
20f60 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d   the output segm
20f70 65 6e 74 20 0a 20 20 2a 2a 20 72 6f 6f 74 20 6e  ent .  ** root n
20f80 6f 64 65 2e 20 49 66 20 74 68 65 20 73 65 67 6d  ode. If the segm
20f90 65 6e 74 20 66 69 74 73 20 65 6e 74 69 72 65 6c  ent fits entirel
20fa0 79 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 6c 65  y on a single le
20fb0 61 66 20 6e 6f 64 65 2c 20 69 52 6f 6f 74 0a 20  af node, iRoot. 
20fc0 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 65 74 20   ** will be set 
20fd0 74 6f 20 30 2e 20 49 66 20 74 68 65 20 72 6f 6f  to 0. If the roo
20fe0 74 20 6e 6f 64 65 20 69 73 20 74 68 65 20 70 61  t node is the pa
20ff0 72 65 6e 74 20 6f 66 20 74 68 65 20 6c 65 61 76  rent of the leav
21000 65 73 2c 20 69 52 6f 6f 74 0a 20 20 2a 2a 20 77  es, iRoot.  ** w
21010 69 6c 6c 20 62 65 20 31 2e 20 41 6e 64 20 73 6f  ill be 1. And so
21020 20 6f 6e 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 69   on.  */.  for(i
21030 52 6f 6f 74 3d 46 54 53 5f 4d 41 58 5f 41 50 50  Root=FTS_MAX_APP
21040 45 4e 44 41 42 4c 45 5f 48 45 49 47 48 54 2d 31  ENDABLE_HEIGHT-1
21050 3b 20 69 52 6f 6f 74 3e 3d 30 3b 20 69 52 6f 6f  ; iRoot>=0; iRoo
21060 74 2d 2d 29 7b 0a 20 20 20 20 4e 6f 64 65 57 72  t--){.    NodeWr
21070 69 74 65 72 20 2a 70 4e 6f 64 65 20 3d 20 26 70  iter *pNode = &p
21080 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69  Writer->aNodeWri
21090 74 65 72 5b 69 52 6f 6f 74 5d 3b 0a 20 20 20 20  ter[iRoot];.    
210a0 69 66 28 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b  if( pNode->block
210b0 2e 6e 3e 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  .n>0 ) break;.  
210c0 20 20 61 73 73 65 72 74 28 20 2a 70 52 63 20 7c    assert( *pRc |
210d0 7c 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e  | pNode->block.n
210e0 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 20 20  Alloc==0 );.    
210f0 61 73 73 65 72 74 28 20 2a 70 52 63 20 7c 7c 20  assert( *pRc || 
21100 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 41 6c 6c 6f  pNode->key.nAllo
21110 63 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  c==0 );.    sqli
21120 74 65 33 5f 66 72 65 65 28 70 4e 6f 64 65 2d 3e  te3_free(pNode->
21130 62 6c 6f 63 6b 2e 61 29 3b 0a 20 20 20 20 73 71  block.a);.    sq
21140 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 6f 64 65  lite3_free(pNode
21150 2d 3e 6b 65 79 2e 61 29 3b 0a 20 20 7d 0a 0a 20  ->key.a);.  }.. 
21160 20 2f 2a 20 45 6d 70 74 79 20 6f 75 74 70 75 74   /* Empty output
21170 20 73 65 67 6d 65 6e 74 2e 20 54 68 69 73 20 69   segment. This i
21180 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20  s a no-op. */.  
21190 69 66 28 20 69 52 6f 6f 74 3c 30 20 29 20 72 65  if( iRoot<0 ) re
211a0 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  turn;..  /* The 
211b0 65 6e 74 69 72 65 20 6f 75 74 70 75 74 20 73 65  entire output se
211c0 67 6d 65 6e 74 20 66 69 74 73 20 6f 6e 20 61 20  gment fits on a 
211d0 73 69 6e 67 6c 65 20 6e 6f 64 65 2e 20 4e 6f 72  single node. Nor
211e0 6d 61 6c 6c 79 2c 20 74 68 69 73 20 6d 65 61 6e  mally, this mean
211f0 73 0a 20 20 2a 2a 20 74 68 65 20 6e 6f 64 65 20  s.  ** the node 
21200 77 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  would be stored 
21210 61 73 20 61 20 62 6c 6f 62 20 69 6e 20 74 68 65  as a blob in the
21220 20 22 72 6f 6f 74 22 20 63 6f 6c 75 6d 6e 20 6f   "root" column o
21230 66 20 74 68 65 20 25 5f 73 65 67 64 69 72 0a 20  f the %_segdir. 
21240 20 2a 2a 20 74 61 62 6c 65 2e 20 48 6f 77 65 76   ** table. Howev
21250 65 72 2c 20 74 68 69 73 20 69 73 20 6e 6f 74 20  er, this is not 
21260 70 65 72 6d 69 74 74 65 64 20 69 6e 20 74 68 69  permitted in thi
21270 73 20 63 61 73 65 2e 20 54 68 65 20 70 72 6f 62  s case. The prob
21280 6c 65 6d 20 69 73 20 74 68 61 74 20 0a 20 20 2a  lem is that .  *
21290 2a 20 73 70 61 63 65 20 68 61 73 20 61 6c 72 65  * space has alre
212a0 61 64 79 20 62 65 65 6e 20 72 65 73 65 72 76 65  ady been reserve
212b0 64 20 69 6e 20 74 68 65 20 25 5f 73 65 67 6d 65  d in the %_segme
212c0 6e 74 73 20 74 61 62 6c 65 2c 20 61 6e 64 20 73  nts table, and s
212d0 6f 20 74 68 65 20 0a 20 20 2a 2a 20 73 74 61 72  o the .  ** star
212e0 74 5f 62 6c 6f 63 6b 20 61 6e 64 20 65 6e 64 5f  t_block and end_
212f0 62 6c 6f 63 6b 20 66 69 65 6c 64 73 20 6f 66 20  block fields of 
21300 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62  the %_segdir tab
21310 6c 65 20 6d 75 73 74 20 62 65 20 70 6f 70 75 6c  le must be popul
21320 61 74 65 64 2e 20 0a 20 20 2a 2a 20 41 6e 64 2c  ated. .  ** And,
21330 20 62 79 20 64 65 73 69 67 6e 20 6f 72 20 62 79   by design or by
21340 20 61 63 63 69 64 65 6e 74 2c 20 72 65 6c 65 61   accident, relea
21350 73 65 64 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  sed versions of 
21360 46 54 53 20 63 61 6e 6e 6f 74 20 68 61 6e 64 6c  FTS cannot handl
21370 65 20 0a 20 20 2a 2a 20 73 65 67 6d 65 6e 74 73  e .  ** segments
21380 20 74 68 61 74 20 66 69 74 20 65 6e 74 69 72 65   that fit entire
21390 6c 79 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 6e  ly on the root n
213a0 6f 64 65 20 77 69 74 68 20 73 74 61 72 74 5f 62  ode with start_b
213b0 6c 6f 63 6b 21 3d 30 2e 0a 20 20 2a 2a 0a 20 20  lock!=0..  **.  
213c0 2a 2a 20 49 6e 73 74 65 61 64 2c 20 63 72 65 61  ** Instead, crea
213d0 74 65 20 61 20 73 79 6e 74 68 65 74 69 63 20 72  te a synthetic r
213e0 6f 6f 74 20 6e 6f 64 65 20 74 68 61 74 20 63 6f  oot node that co
213f0 6e 74 61 69 6e 73 20 6e 6f 74 68 69 6e 67 20 62  ntains nothing b
21400 75 74 20 61 20 0a 20 20 2a 2a 20 70 6f 69 6e 74  ut a .  ** point
21410 65 72 20 74 6f 20 74 68 65 20 73 69 6e 67 6c 65  er to the single
21420 20 63 6f 6e 74 65 6e 74 20 6e 6f 64 65 2e 20 53   content node. S
21430 6f 20 74 68 61 74 20 74 68 65 20 73 65 67 6d 65  o that the segme
21440 6e 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  nt consists of a
21450 0a 20 20 2a 2a 20 73 69 6e 67 6c 65 20 6c 65 61  .  ** single lea
21460 66 20 61 6e 64 20 61 20 73 69 6e 67 6c 65 20 69  f and a single i
21470 6e 74 65 72 69 6f 72 20 28 72 6f 6f 74 29 20 6e  nterior (root) n
21480 6f 64 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ode..  **.  ** T
21490 6f 64 6f 3a 20 42 65 74 74 65 72 20 6d 69 67 68  odo: Better migh
214a0 74 20 62 65 20 74 6f 20 64 65 66 65 72 20 61 6c  t be to defer al
214b0 6c 6f 63 61 74 69 6e 67 20 73 70 61 63 65 20 69  locating space i
214c0 6e 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73  n the %_segments
214d0 20 0a 20 20 2a 2a 20 74 61 62 6c 65 20 75 6e 74   .  ** table unt
214e0 69 6c 20 77 65 20 61 72 65 20 73 75 72 65 20 69  il we are sure i
214f0 74 20 69 73 20 6e 65 65 64 65 64 2e 0a 20 20 2a  t is needed..  *
21500 2f 0a 20 20 69 66 28 20 69 52 6f 6f 74 3d 3d 30  /.  if( iRoot==0
21510 20 29 7b 0a 20 20 20 20 42 6c 6f 62 20 2a 70 42   ){.    Blob *pB
21520 6c 6f 63 6b 20 3d 20 26 70 57 72 69 74 65 72 2d  lock = &pWriter-
21530 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 31 5d 2e  >aNodeWriter[1].
21540 62 6c 6f 63 6b 3b 0a 20 20 20 20 62 6c 6f 62 47  block;.    blobG
21550 72 6f 77 42 75 66 66 65 72 28 70 42 6c 6f 63 6b  rowBuffer(pBlock
21560 2c 20 31 20 2b 20 46 54 53 33 5f 56 41 52 49 4e  , 1 + FTS3_VARIN
21570 54 5f 4d 41 58 2c 20 26 72 63 29 3b 0a 20 20 20  T_MAX, &rc);.   
21580 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21590 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 42 6c 6f  OK ){.      pBlo
215a0 63 6b 2d 3e 61 5b 30 5d 20 3d 20 30 78 30 31 3b  ck->a[0] = 0x01;
215b0 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b 2d 3e 6e  .      pBlock->n
215c0 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 46 74   = 1 + sqlite3Ft
215d0 73 33 50 75 74 56 61 72 69 6e 74 28 0a 20 20 20  s3PutVarint(.   
215e0 20 20 20 20 20 20 20 26 70 42 6c 6f 63 6b 2d 3e         &pBlock->
215f0 61 5b 31 5d 2c 20 70 57 72 69 74 65 72 2d 3e 61  a[1], pWriter->a
21600 4e 6f 64 65 57 72 69 74 65 72 5b 30 5d 2e 69 42  NodeWriter[0].iB
21610 6c 6f 63 6b 0a 20 20 20 20 20 20 29 3b 0a 20 20  lock.      );.  
21620 20 20 7d 0a 20 20 20 20 69 52 6f 6f 74 20 3d 20    }.    iRoot = 
21630 31 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d  1;.  }.  pRoot =
21640 20 26 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65   &pWriter->aNode
21650 57 72 69 74 65 72 5b 69 52 6f 6f 74 5d 3b 0a 0a  Writer[iRoot];..
21660 20 20 2f 2a 20 46 6c 75 73 68 20 61 6c 6c 20 63    /* Flush all c
21670 75 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e  urrently outstan
21680 64 69 6e 67 20 6e 6f 64 65 73 20 74 6f 20 64 69  ding nodes to di
21690 73 6b 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  sk. */.  for(i=0
216a0 3b 20 69 3c 69 52 6f 6f 74 3b 20 69 2b 2b 29 7b  ; i<iRoot; i++){
216b0 0a 20 20 20 20 4e 6f 64 65 57 72 69 74 65 72 20  .    NodeWriter 
216c0 2a 70 4e 6f 64 65 20 3d 20 26 70 57 72 69 74 65  *pNode = &pWrite
216d0 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 69  r->aNodeWriter[i
216e0 5d 3b 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65  ];.    if( pNode
216f0 2d 3e 62 6c 6f 63 6b 2e 6e 3e 30 20 26 26 20 72  ->block.n>0 && r
21700 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21710 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 57        rc = fts3W
21720 72 69 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 70  riteSegment(p, p
21730 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b 2c 20 70 4e  Node->iBlock, pN
21740 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 2c 20 70 4e  ode->block.a, pN
21750 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 29 3b 0a 20  ode->block.n);. 
21760 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
21770 5f 66 72 65 65 28 70 4e 6f 64 65 2d 3e 62 6c 6f  _free(pNode->blo
21780 63 6b 2e 61 29 3b 0a 20 20 20 20 73 71 6c 69 74  ck.a);.    sqlit
21790 65 33 5f 66 72 65 65 28 70 4e 6f 64 65 2d 3e 6b  e3_free(pNode->k
217a0 65 79 2e 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ey.a);.  }..  /*
217b0 20 57 72 69 74 65 20 74 68 65 20 25 5f 73 65 67   Write the %_seg
217c0 64 69 72 20 72 65 63 6f 72 64 2e 20 2a 2f 0a 20  dir record. */. 
217d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
217e0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  OK ){.    rc = f
217f0 74 73 33 57 72 69 74 65 53 65 67 64 69 72 28 70  ts3WriteSegdir(p
21800 2c 20 0a 20 20 20 20 20 20 20 20 70 57 72 69 74  , .        pWrit
21810 65 72 2d 3e 69 41 62 73 4c 65 76 65 6c 2b 31 2c  er->iAbsLevel+1,
21820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21830 2a 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 20  * level */.     
21840 20 20 20 70 57 72 69 74 65 72 2d 3e 69 49 64 78     pWriter->iIdx
21850 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21860 20 20 20 20 20 20 20 2f 2a 20 69 64 78 20 2a 2f         /* idx */
21870 0a 20 20 20 20 20 20 20 20 70 57 72 69 74 65 72  .        pWriter
21880 2d 3e 69 53 74 61 72 74 2c 20 20 20 20 20 20 20  ->iStart,       
21890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
218a0 73 74 61 72 74 5f 62 6c 6f 63 6b 20 2a 2f 0a 20  start_block */. 
218b0 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e         pWriter->
218c0 61 4e 6f 64 65 57 72 69 74 65 72 5b 30 5d 2e 69  aNodeWriter[0].i
218d0 42 6c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 6c 65  Block,     /* le
218e0 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 2a  aves_end_block *
218f0 2f 0a 20 20 20 20 20 20 20 20 70 57 72 69 74 65  /.        pWrite
21900 72 2d 3e 69 45 6e 64 2c 20 20 20 20 20 20 20 20  r->iEnd,        
21910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21920 20 65 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20   end_block */.  
21930 20 20 20 20 20 20 28 70 57 72 69 74 65 72 2d 3e        (pWriter->
21940 62 4e 6f 4c 65 61 66 44 61 74 61 3d 3d 30 20 3f  bNoLeafData==0 ?
21950 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44   pWriter->nLeafD
21960 61 74 61 20 3a 20 30 29 2c 20 20 20 2f 2a 20 65  ata : 0),   /* e
21970 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  nd_block */.    
21980 20 20 20 20 70 52 6f 6f 74 2d 3e 62 6c 6f 63 6b      pRoot->block
21990 2e 61 2c 20 70 52 6f 6f 74 2d 3e 62 6c 6f 63 6b  .a, pRoot->block
219a0 2e 6e 20 20 20 20 20 20 2f 2a 20 72 6f 6f 74 20  .n      /* root 
219b0 2a 2f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20  */.    );.  }.  
219c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 6f  sqlite3_free(pRo
219d0 6f 74 2d 3e 62 6c 6f 63 6b 2e 61 29 3b 0a 20 20  ot->block.a);.  
219e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 6f  sqlite3_free(pRo
219f0 6f 74 2d 3e 6b 65 79 2e 61 29 3b 0a 0a 20 20 2a  ot->key.a);..  *
21a00 70 52 63 20 3d 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  pRc = rc;.}../*.
21a10 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74  ** Compare the t
21a20 65 72 6d 20 69 6e 20 62 75 66 66 65 72 20 7a 4c  erm in buffer zL
21a30 68 73 20 28 73 69 7a 65 20 69 6e 20 62 79 74 65  hs (size in byte
21a40 73 20 6e 4c 68 73 29 20 77 69 74 68 20 74 68 61  s nLhs) with tha
21a50 74 20 69 6e 0a 2a 2a 20 7a 52 68 73 20 28 73 69  t in.** zRhs (si
21a60 7a 65 20 69 6e 20 62 79 74 65 73 20 6e 52 68 73  ze in bytes nRhs
21a70 29 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 2e 20  ) using memcmp. 
21a80 49 66 20 6f 6e 65 20 74 65 72 6d 20 69 73 20 61  If one term is a
21a90 20 70 72 65 66 69 78 20 6f 66 0a 2a 2a 20 74 68   prefix of.** th
21aa0 65 20 6f 74 68 65 72 2c 20 69 74 20 69 73 20 63  e other, it is c
21ab0 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
21ac0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
21ad0 20 6f 74 68 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65   other..**.** Re
21ae0 74 75 72 6e 20 2d 76 65 20 69 66 20 7a 4c 68 73  turn -ve if zLhs
21af0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
21b00 20 7a 52 68 73 2c 20 30 20 69 66 20 69 74 20 69   zRhs, 0 if it i
21b10 73 20 65 71 75 61 6c 2c 20 6f 72 20 2b 76 65 0a  s equal, or +ve.
21b20 2a 2a 20 69 66 20 69 74 20 69 73 20 67 72 65 61  ** if it is grea
21b30 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
21b40 6e 74 20 66 74 73 33 54 65 72 6d 43 6d 70 28 0a  nt fts3TermCmp(.
21b50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c    const char *zL
21b60 68 73 2c 20 69 6e 74 20 6e 4c 68 73 2c 20 20 20  hs, int nLhs,   
21b70 20 20 2f 2a 20 4c 48 53 20 6f 66 20 63 6f 6d 70    /* LHS of comp
21b80 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  arison */.  cons
21b90 74 20 63 68 61 72 20 2a 7a 52 68 73 2c 20 69 6e  t char *zRhs, in
21ba0 74 20 6e 52 68 73 20 20 20 20 20 20 2f 2a 20 52  t nRhs      /* R
21bb0 48 53 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  HS of comparison
21bc0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d   */.){.  int nCm
21bd0 70 20 3d 20 4d 49 4e 28 6e 4c 68 73 2c 20 6e 52  p = MIN(nLhs, nR
21be0 68 73 29 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  hs);.  int res;.
21bf0 0a 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28  .  res = memcmp(
21c00 7a 4c 68 73 2c 20 7a 52 68 73 2c 20 6e 43 6d 70  zLhs, zRhs, nCmp
21c10 29 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20  );.  if( res==0 
21c20 29 20 72 65 73 20 3d 20 6e 4c 68 73 20 2d 20 6e  ) res = nLhs - n
21c30 52 68 73 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  Rhs;..  return r
21c40 65 73 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 51 75  es;.}.../*.** Qu
21c50 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 74 68  ery to see if th
21c60 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 25  e entry in the %
21c70 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20  _segments table 
21c80 77 69 74 68 20 62 6c 6f 63 6b 69 64 20 69 45 6e  with blockid iEn
21c90 64 20 69 73 20 0a 2a 2a 20 4e 55 4c 4c 2e 20 49  d is .** NULL. I
21ca0 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
21cb0 73 20 61 6e 64 20 74 68 65 20 65 6e 74 72 79 20  s and the entry 
21cc0 69 73 20 4e 55 4c 4c 2c 20 73 65 74 20 2a 70 62  is NULL, set *pb
21cd0 52 65 73 20 31 20 62 65 66 6f 72 65 0a 2a 2a 20  Res 1 before.** 
21ce0 72 65 74 75 72 6e 69 6e 67 2e 20 4f 74 68 65 72  returning. Other
21cf0 77 69 73 65 2c 20 73 65 74 20 2a 70 62 52 65 73  wise, set *pbRes
21d00 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72   to 0. .**.** Or
21d10 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  , if an error oc
21d20 63 75 72 73 20 77 68 69 6c 65 20 71 75 65 72 79  curs while query
21d30 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
21d40 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  , return an SQLi
21d50 74 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  te .** error cod
21d60 65 2e 20 54 68 65 20 66 69 6e 61 6c 20 76 61 6c  e. The final val
21d70 75 65 20 6f 66 20 2a 70 62 52 65 73 20 69 73 20  ue of *pbRes is 
21d80 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69  undefined in thi
21d90 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  s case..**.** Th
21da0 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  is is used to te
21db0 73 74 20 69 66 20 61 20 73 65 67 6d 65 6e 74 20  st if a segment 
21dc0 69 73 20 61 6e 20 22 61 70 70 65 6e 64 61 62 6c  is an "appendabl
21dd0 65 22 20 73 65 67 6d 65 6e 74 2e 20 49 66 20 69  e" segment. If i
21de0 74 0a 2a 2a 20 69 73 2c 20 74 68 65 6e 20 61 20  t.** is, then a 
21df0 4e 55 4c 4c 20 65 6e 74 72 79 20 68 61 73 20 62  NULL entry has b
21e00 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74  een inserted int
21e10 6f 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73  o the %_segments
21e20 20 74 61 62 6c 65 0a 2a 2a 20 77 69 74 68 20 62   table.** with b
21e30 6c 6f 63 6b 69 64 20 25 5f 73 65 67 64 69 72 2e  lockid %_segdir.
21e40 65 6e 64 5f 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74  end_block..*/.st
21e50 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 73 41  atic int fts3IsA
21e60 70 70 65 6e 64 61 62 6c 65 28 46 74 73 33 54 61  ppendable(Fts3Ta
21e70 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  ble *p, sqlite3_
21e80 69 6e 74 36 34 20 69 45 6e 64 2c 20 69 6e 74 20  int64 iEnd, int 
21e90 2a 70 62 52 65 73 29 7b 0a 20 20 69 6e 74 20 62  *pbRes){.  int b
21ea0 52 65 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Res = 0;        
21eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
21ec0 73 75 6c 74 20 74 6f 20 73 65 74 20 2a 70 62 52  sult to set *pbR
21ed0 65 73 20 74 6f 20 2a 2f 0a 20 20 73 71 6c 69 74  es to */.  sqlit
21ee0 65 33 5f 73 74 6d 74 20 2a 70 43 68 65 63 6b 20  e3_stmt *pCheck 
21ef0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 53 74  = 0;       /* St
21f00 61 74 65 6d 65 6e 74 20 74 6f 20 71 75 65 72 79  atement to query
21f10 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 2a   database with *
21f20 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
21f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f40 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
21f50 64 65 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74  de */..  rc = ft
21f60 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
21f70 5f 53 45 47 4d 45 4e 54 5f 49 53 5f 41 50 50 45  _SEGMENT_IS_APPE
21f80 4e 44 41 42 4c 45 2c 20 26 70 43 68 65 63 6b 2c  NDABLE, &pCheck,
21f90 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
21fa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21fb0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
21fc0 36 34 28 70 43 68 65 63 6b 2c 20 31 2c 20 69 45  64(pCheck, 1, iE
21fd0 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  nd);.    if( SQL
21fe0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
21ff0 5f 73 74 65 70 28 70 43 68 65 63 6b 29 20 29 20  _step(pCheck) ) 
22000 62 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 63  bRes = 1;.    rc
22010 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
22020 28 70 43 68 65 63 6b 29 3b 0a 20 20 7d 0a 20 20  (pCheck);.  }.  
22030 0a 20 20 2a 70 62 52 65 73 20 3d 20 62 52 65 73  .  *pbRes = bRes
22040 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
22050 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
22060 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
22070 77 68 65 6e 20 69 6e 69 74 69 61 6c 69 7a 69 6e  when initializin
22080 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  g an incremental
22090 2d 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e  -merge operation
220a0 2e 0a 2a 2a 20 49 74 20 63 68 65 63 6b 73 20 69  ..** It checks i
220b0 66 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 73  f the existing s
220c0 65 67 6d 65 6e 74 20 77 69 74 68 20 69 6e 64 65  egment with inde
220d0 78 20 76 61 6c 75 65 20 69 49 64 78 20 61 74 20  x value iIdx at 
220e0 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 0a  absolute level .
220f0 2a 2a 20 28 69 41 62 73 4c 65 76 65 6c 2b 31 29  ** (iAbsLevel+1)
22100 20 63 61 6e 20 62 65 20 61 70 70 65 6e 64 65 64   can be appended
22110 20 74 6f 20 62 79 20 74 68 65 20 69 6e 63 72 65   to by the incre
22120 6d 65 6e 74 61 6c 20 6d 65 72 67 65 2e 20 49 66  mental merge. If
22130 20 69 74 20 63 61 6e 2c 20 74 68 65 0a 2a 2a 20   it can, the.** 
22140 6d 65 72 67 65 2d 77 72 69 74 65 72 20 6f 62 6a  merge-writer obj
22150 65 63 74 20 2a 70 57 72 69 74 65 72 20 69 73 20  ect *pWriter is 
22160 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 77  initialized to w
22170 72 69 74 65 20 74 6f 20 69 74 2e 0a 2a 2a 0a 2a  rite to it..**.*
22180 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 73 65  * An existing se
22190 67 6d 65 6e 74 20 63 61 6e 20 62 65 20 61 70 70  gment can be app
221a0 65 6e 64 65 64 20 74 6f 20 62 79 20 61 6e 20 69  ended to by an i
221b0 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65  ncremental merge
221c0 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49   if:.**.**   * I
221d0 74 20 77 61 73 20 69 6e 69 74 69 61 6c 6c 79 20  t was initially 
221e0 63 72 65 61 74 65 64 20 61 73 20 61 6e 20 61 70  created as an ap
221f0 70 65 6e 64 61 62 6c 65 20 73 65 67 6d 65 6e 74  pendable segment
22200 20 28 77 69 74 68 20 61 6c 6c 20 72 65 71 75 69   (with all requi
22210 72 65 64 0a 2a 2a 20 20 20 20 20 73 70 61 63 65  red.**     space
22220 20 70 72 65 2d 61 6c 6c 6f 63 61 74 65 64 29 2c   pre-allocated),
22230 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54   and.**.**   * T
22240 68 65 20 66 69 72 73 74 20 6b 65 79 20 72 65 61  he first key rea
22250 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74  d from the input
22260 20 28 61 72 67 75 6d 65 6e 74 73 20 7a 4b 65 79   (arguments zKey
22270 20 61 6e 64 20 6e 4b 65 79 29 20 69 73 20 0a 2a   and nKey) is .*
22280 2a 20 20 20 20 20 67 72 65 61 74 65 72 20 74 68  *     greater th
22290 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  an the largest k
222a0 65 79 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ey currently sto
222b0 72 65 64 20 69 6e 20 74 68 65 20 70 6f 74 65 6e  red in the poten
222c0 74 69 61 6c 0a 2a 2a 20 20 20 20 20 6f 75 74 70  tial.**     outp
222d0 75 74 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73  ut segment..*/.s
222e0 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e  tatic int fts3In
222f0 63 72 6d 65 72 67 65 4c 6f 61 64 28 0a 20 20 46  crmergeLoad(.  F
22300 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
22310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22320 2a 20 46 74 73 33 20 74 61 62 6c 65 20 68 61 6e  * Fts3 table han
22330 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dle */.  sqlite3
22340 5f 69 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c  _int64 iAbsLevel
22350 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f  ,        /* Abso
22360 6c 75 74 65 20 6c 65 76 65 6c 20 6f 66 20 69 6e  lute level of in
22370 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  put segments */.
22380 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20    int iIdx,     
22390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223a0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 61    /* Index of ca
223b0 6e 64 69 64 61 74 65 20 6f 75 74 70 75 74 20 73  ndidate output s
223c0 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73  egment */.  cons
223d0 74 20 63 68 61 72 20 2a 7a 4b 65 79 2c 20 20 20  t char *zKey,   
223e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
223f0 69 72 73 74 20 6b 65 79 20 74 6f 20 77 72 69 74  irst key to writ
22400 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c  e */.  int nKey,
22410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22420 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
22430 20 6f 66 20 62 79 74 65 73 20 69 6e 20 6e 4b 65   of bytes in nKe
22440 79 20 2a 2f 0a 20 20 49 6e 63 72 6d 65 72 67 65  y */.  Incrmerge
22450 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20  Writer *pWriter 
22460 20 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61         /* Popula
22470 74 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a  te this object *
22480 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
22490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224a0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
224b0 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
224c0 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74  e3_stmt *pSelect
224d0 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 45   = 0;      /* SE
224e0 4c 45 43 54 20 74 6f 20 72 65 61 64 20 25 5f 73  LECT to read %_s
224f0 65 67 64 69 72 20 65 6e 74 72 79 20 2a 2f 0a 0a  egdir entry */..
22500 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
22510 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54  mt(p, SQL_SELECT
22520 5f 53 45 47 44 49 52 2c 20 26 70 53 65 6c 65 63  _SEGDIR, &pSelec
22530 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  t, 0);.  if( rc=
22540 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22550 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
22560 69 53 74 61 72 74 20 3d 20 30 3b 20 20 20 20 20  iStart = 0;     
22570 2f 2a 20 56 61 6c 75 65 20 6f 66 20 25 5f 73 65  /* Value of %_se
22580 67 64 69 72 2e 73 74 61 72 74 5f 62 6c 6f 63 6b  gdir.start_block
22590 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
225a0 69 6e 74 36 34 20 69 4c 65 61 66 45 6e 64 20 3d  int64 iLeafEnd =
225b0 20 30 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f   0;   /* Value o
225c0 66 20 25 5f 73 65 67 64 69 72 2e 6c 65 61 76 65  f %_segdir.leave
225d0 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20  s_end_block */. 
225e0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
225f0 20 69 45 6e 64 20 3d 20 30 3b 20 20 20 20 20 20   iEnd = 0;      
22600 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 25 5f 73   /* Value of %_s
22610 65 67 64 69 72 2e 65 6e 64 5f 62 6c 6f 63 6b 20  egdir.end_block 
22620 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
22630 72 20 2a 61 52 6f 6f 74 20 3d 20 30 3b 20 20 20  r *aRoot = 0;   
22640 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
22650 74 6f 20 25 5f 73 65 67 64 69 72 2e 72 6f 6f 74  to %_segdir.root
22660 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 69   buffer */.    i
22670 6e 74 20 6e 52 6f 6f 74 20 3d 20 30 3b 20 20 20  nt nRoot = 0;   
22680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22690 53 69 7a 65 20 6f 66 20 61 52 6f 6f 74 5b 5d 20  Size of aRoot[] 
226a0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
226b0 69 6e 74 20 72 63 32 3b 20 20 20 20 20 20 20 20  int rc2;        
226c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
226d0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
226e0 6d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  m sqlite3_reset(
226f0 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 41 70  ) */.    int bAp
22700 70 65 6e 64 61 62 6c 65 20 3d 20 30 3b 20 20 20  pendable = 0;   
22710 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
22720 20 74 72 75 65 20 69 66 20 73 65 67 6d 65 6e 74   true if segment
22730 20 69 73 20 61 70 70 65 6e 64 61 62 6c 65 20 2a   is appendable *
22740 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  /..    /* Read t
22750 68 65 20 25 5f 73 65 67 64 69 72 20 65 6e 74 72  he %_segdir entr
22760 79 20 66 6f 72 20 69 6e 64 65 78 20 69 49 64 78  y for index iIdx
22770 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20   absolute level 
22780 28 69 41 62 73 4c 65 76 65 6c 2b 31 29 20 2a 2f  (iAbsLevel+1) */
22790 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
227a0 64 5f 69 6e 74 36 34 28 70 53 65 6c 65 63 74 2c  d_int64(pSelect,
227b0 20 31 2c 20 69 41 62 73 4c 65 76 65 6c 2b 31 29   1, iAbsLevel+1)
227c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
227d0 6e 64 5f 69 6e 74 28 70 53 65 6c 65 63 74 2c 20  nd_int(pSelect, 
227e0 32 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 69 66  2, iIdx);.    if
227f0 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
22800 53 65 6c 65 63 74 29 3d 3d 53 51 4c 49 54 45 5f  Select)==SQLITE_
22810 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 69 53 74  ROW ){.      iSt
22820 61 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  art = sqlite3_co
22830 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 65 6c 65  lumn_int64(pSele
22840 63 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 4c  ct, 1);.      iL
22850 65 61 66 45 6e 64 20 3d 20 73 71 6c 69 74 65 33  eafEnd = sqlite3
22860 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
22870 65 6c 65 63 74 2c 20 32 29 3b 0a 20 20 20 20 20  elect, 2);.     
22880 20 66 74 73 33 52 65 61 64 45 6e 64 42 6c 6f 63   fts3ReadEndBloc
22890 6b 46 69 65 6c 64 28 70 53 65 6c 65 63 74 2c 20  kField(pSelect, 
228a0 33 2c 20 26 69 45 6e 64 2c 20 26 70 57 72 69 74  3, &iEnd, &pWrit
228b0 65 72 2d 3e 6e 4c 65 61 66 44 61 74 61 29 3b 0a  er->nLeafData);.
228c0 20 20 20 20 20 20 69 66 28 20 70 57 72 69 74 65        if( pWrite
228d0 72 2d 3e 6e 4c 65 61 66 44 61 74 61 3c 30 20 29  r->nLeafData<0 )
228e0 7b 0a 20 20 20 20 20 20 20 20 70 57 72 69 74 65  {.        pWrite
228f0 72 2d 3e 6e 4c 65 61 66 44 61 74 61 20 3d 20 70  r->nLeafData = p
22900 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61 74  Writer->nLeafDat
22910 61 20 2a 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  a * -1;.      }.
22920 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62        pWriter->b
22930 4e 6f 4c 65 61 66 44 61 74 61 20 3d 20 28 70 57  NoLeafData = (pW
22940 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61 74 61  riter->nLeafData
22950 3d 3d 30 29 3b 0a 20 20 20 20 20 20 6e 52 6f 6f  ==0);.      nRoo
22960 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  t = sqlite3_colu
22970 6d 6e 5f 62 79 74 65 73 28 70 53 65 6c 65 63 74  mn_bytes(pSelect
22980 2c 20 34 29 3b 0a 20 20 20 20 20 20 61 52 6f 6f  , 4);.      aRoo
22990 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  t = sqlite3_colu
229a0 6d 6e 5f 62 6c 6f 62 28 70 53 65 6c 65 63 74 2c  mn_blob(pSelect,
229b0 20 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   4);.    }else{.
229c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
229d0 69 74 65 33 5f 72 65 73 65 74 28 70 53 65 6c 65  ite3_reset(pSele
229e0 63 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ct);.    }..    
229f0 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65  /* Check for the
22a00 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 6d 61 72   zero-length mar
22a10 6b 65 72 20 69 6e 20 74 68 65 20 25 5f 73 65 67  ker in the %_seg
22a20 6d 65 6e 74 73 20 74 61 62 6c 65 20 2a 2f 0a 20  ments table */. 
22a30 20 20 20 72 63 20 3d 20 66 74 73 33 49 73 41 70     rc = fts3IsAp
22a40 70 65 6e 64 61 62 6c 65 28 70 2c 20 69 45 6e 64  pendable(p, iEnd
22a50 2c 20 26 62 41 70 70 65 6e 64 61 62 6c 65 29 3b  , &bAppendable);
22a60 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
22a70 68 61 74 20 7a 4b 65 79 2f 6e 4b 65 79 20 69 73  hat zKey/nKey is
22a80 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
22a90 20 6c 61 72 67 65 73 74 20 6b 65 79 20 74 68 65   largest key the
22aa0 20 63 61 6e 64 69 64 61 74 65 20 2a 2f 0a 20 20   candidate */.  
22ab0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22ac0 5f 4f 4b 20 26 26 20 62 41 70 70 65 6e 64 61 62  _OK && bAppendab
22ad0 6c 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  le ){.      char
22ae0 20 2a 61 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20   *aLeaf = 0;.   
22af0 20 20 20 69 6e 74 20 6e 4c 65 61 66 20 3d 20 30     int nLeaf = 0
22b00 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ;..      rc = sq
22b10 6c 69 74 65 33 46 74 73 33 52 65 61 64 42 6c 6f  lite3Fts3ReadBlo
22b20 63 6b 28 70 2c 20 69 4c 65 61 66 45 6e 64 2c 20  ck(p, iLeafEnd, 
22b30 26 61 4c 65 61 66 2c 20 26 6e 4c 65 61 66 2c 20  &aLeaf, &nLeaf, 
22b40 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
22b50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22b60 20 20 20 20 20 20 20 4e 6f 64 65 52 65 61 64 65         NodeReade
22b70 72 20 72 65 61 64 65 72 3b 0a 20 20 20 20 20 20  r reader;.      
22b80 20 20 66 6f 72 28 72 63 20 3d 20 6e 6f 64 65 52    for(rc = nodeR
22b90 65 61 64 65 72 49 6e 69 74 28 26 72 65 61 64 65  eaderInit(&reade
22ba0 72 2c 20 61 4c 65 61 66 2c 20 6e 4c 65 61 66 29  r, aLeaf, nLeaf)
22bb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
22bc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  ==SQLITE_OK && r
22bd0 65 61 64 65 72 2e 61 4e 6f 64 65 3b 0a 20 20 20  eader.aNode;.   
22be0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 6f           rc = no
22bf0 64 65 52 65 61 64 65 72 4e 65 78 74 28 26 72 65  deReaderNext(&re
22c00 61 64 65 72 29 0a 20 20 20 20 20 20 20 20 29 7b  ader).        ){
22c10 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
22c20 74 28 20 72 65 61 64 65 72 2e 61 4e 6f 64 65 20  t( reader.aNode 
22c30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
22c40 20 20 20 20 20 69 66 28 20 66 74 73 33 54 65 72       if( fts3Ter
22c50 6d 43 6d 70 28 7a 4b 65 79 2c 20 6e 4b 65 79 2c  mCmp(zKey, nKey,
22c60 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 61 2c 20   reader.term.a, 
22c70 72 65 61 64 65 72 2e 74 65 72 6d 2e 6e 29 3c 3d  reader.term.n)<=
22c80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  0 ){.          b
22c90 41 70 70 65 6e 64 61 62 6c 65 20 3d 20 30 3b 0a  Appendable = 0;.
22ca0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22cb0 20 20 6e 6f 64 65 52 65 61 64 65 72 52 65 6c 65    nodeReaderRele
22cc0 61 73 65 28 26 72 65 61 64 65 72 29 3b 0a 20 20  ase(&reader);.  
22cd0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
22ce0 74 65 33 5f 66 72 65 65 28 61 4c 65 61 66 29 3b  te3_free(aLeaf);
22cf0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
22d00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
22d10 20 62 41 70 70 65 6e 64 61 62 6c 65 20 29 7b 0a   bAppendable ){.
22d20 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70        /* It is p
22d30 6f 73 73 69 62 6c 65 20 74 6f 20 61 70 70 65 6e  ossible to appen
22d40 64 20 74 6f 20 74 68 69 73 20 73 65 67 6d 65 6e  d to this segmen
22d50 74 2e 20 53 65 74 20 75 70 20 74 68 65 20 49 6e  t. Set up the In
22d60 63 72 6d 65 72 67 65 57 72 69 74 65 72 0a 20 20  crmergeWriter.  
22d70 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74 6f      ** object to
22d80 20 64 6f 20 73 6f 2e 20 20 2a 2f 0a 20 20 20 20   do so.  */.    
22d90 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
22da0 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 28 69 6e  nt nHeight = (in
22db0 74 29 61 52 6f 6f 74 5b 30 5d 3b 0a 20 20 20 20  t)aRoot[0];.    
22dc0 20 20 4e 6f 64 65 57 72 69 74 65 72 20 2a 70 4e    NodeWriter *pN
22dd0 6f 64 65 3b 0a 0a 20 20 20 20 20 20 70 57 72 69  ode;..      pWri
22de0 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74 20 3d 20  ter->nLeafEst = 
22df0 28 69 6e 74 29 28 28 69 45 6e 64 20 2d 20 69 53  (int)((iEnd - iS
22e00 74 61 72 74 29 20 2b 20 31 29 2f 46 54 53 5f 4d  tart) + 1)/FTS_M
22e10 41 58 5f 41 50 50 45 4e 44 41 42 4c 45 5f 48 45  AX_APPENDABLE_HE
22e20 49 47 48 54 3b 0a 20 20 20 20 20 20 70 57 72 69  IGHT;.      pWri
22e30 74 65 72 2d 3e 69 53 74 61 72 74 20 3d 20 69 53  ter->iStart = iS
22e40 74 61 72 74 3b 0a 20 20 20 20 20 20 70 57 72 69  tart;.      pWri
22e50 74 65 72 2d 3e 69 45 6e 64 20 3d 20 69 45 6e 64  ter->iEnd = iEnd
22e60 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d  ;.      pWriter-
22e70 3e 69 41 62 73 4c 65 76 65 6c 20 3d 20 69 41 62  >iAbsLevel = iAb
22e80 73 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20 70 57  sLevel;.      pW
22e90 72 69 74 65 72 2d 3e 69 49 64 78 20 3d 20 69 49  riter->iIdx = iI
22ea0 64 78 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69  dx;..      for(i
22eb0 3d 6e 48 65 69 67 68 74 2b 31 3b 20 69 3c 46 54  =nHeight+1; i<FT
22ec0 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c 45  S_MAX_APPENDABLE
22ed0 5f 48 45 49 47 48 54 3b 20 69 2b 2b 29 7b 0a 20  _HEIGHT; i++){. 
22ee0 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e         pWriter->
22ef0 61 4e 6f 64 65 57 72 69 74 65 72 5b 69 5d 2e 69  aNodeWriter[i].i
22f00 42 6c 6f 63 6b 20 3d 20 70 57 72 69 74 65 72 2d  Block = pWriter-
22f10 3e 69 53 74 61 72 74 20 2b 20 69 2a 70 57 72 69  >iStart + i*pWri
22f20 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74 3b 0a 20  ter->nLeafEst;. 
22f30 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 4e       }..      pN
22f40 6f 64 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  ode = &pWriter->
22f50 61 4e 6f 64 65 57 72 69 74 65 72 5b 6e 48 65 69  aNodeWriter[nHei
22f60 67 68 74 5d 3b 0a 20 20 20 20 20 20 70 4e 6f 64  ght];.      pNod
22f70 65 2d 3e 69 42 6c 6f 63 6b 20 3d 20 70 57 72 69  e->iBlock = pWri
22f80 74 65 72 2d 3e 69 53 74 61 72 74 20 2b 20 70 57  ter->iStart + pW
22f90 72 69 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74 2a  riter->nLeafEst*
22fa0 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 20 20 62  nHeight;.      b
22fb0 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28 26 70  lobGrowBuffer(&p
22fc0 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2c 20 4d 41 58  Node->block, MAX
22fd0 28 6e 52 6f 6f 74 2c 20 70 2d 3e 6e 4e 6f 64 65  (nRoot, p->nNode
22fe0 53 69 7a 65 29 2c 20 26 72 63 29 3b 0a 20 20 20  Size), &rc);.   
22ff0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
23000 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
23010 6d 65 6d 63 70 79 28 70 4e 6f 64 65 2d 3e 62 6c  memcpy(pNode->bl
23020 6f 63 6b 2e 61 2c 20 61 52 6f 6f 74 2c 20 6e 52  ock.a, aRoot, nR
23030 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  oot);.        pN
23040 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 20 3d 20 6e  ode->block.n = n
23050 52 6f 6f 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Root;.      }.. 
23060 20 20 20 20 20 66 6f 72 28 69 3d 6e 48 65 69 67       for(i=nHeig
23070 68 74 3b 20 69 3e 3d 30 20 26 26 20 72 63 3d 3d  ht; i>=0 && rc==
23080 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2d 2d 29 7b  SQLITE_OK; i--){
23090 0a 20 20 20 20 20 20 20 20 4e 6f 64 65 52 65 61  .        NodeRea
230a0 64 65 72 20 72 65 61 64 65 72 3b 0a 20 20 20 20  der reader;.    
230b0 20 20 20 20 70 4e 6f 64 65 20 3d 20 26 70 57 72      pNode = &pWr
230c0 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65  iter->aNodeWrite
230d0 72 5b 69 5d 3b 0a 0a 20 20 20 20 20 20 20 20 72  r[i];..        r
230e0 63 20 3d 20 6e 6f 64 65 52 65 61 64 65 72 49 6e  c = nodeReaderIn
230f0 69 74 28 26 72 65 61 64 65 72 2c 20 70 4e 6f 64  it(&reader, pNod
23100 65 2d 3e 62 6c 6f 63 6b 2e 61 2c 20 70 4e 6f 64  e->block.a, pNod
23110 65 2d 3e 62 6c 6f 63 6b 2e 6e 29 3b 0a 20 20 20  e->block.n);.   
23120 20 20 20 20 20 77 68 69 6c 65 28 20 72 65 61 64       while( read
23130 65 72 2e 61 4e 6f 64 65 20 26 26 20 72 63 3d 3d  er.aNode && rc==
23140 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
23150 20 6e 6f 64 65 52 65 61 64 65 72 4e 65 78 74 28   nodeReaderNext(
23160 26 72 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20  &reader);.      
23170 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 72    blobGrowBuffer
23180 28 26 70 4e 6f 64 65 2d 3e 6b 65 79 2c 20 72 65  (&pNode->key, re
23190 61 64 65 72 2e 74 65 72 6d 2e 6e 2c 20 26 72 63  ader.term.n, &rc
231a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
231b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
231c0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
231d0 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e 61 2c 20 72  (pNode->key.a, r
231e0 65 61 64 65 72 2e 74 65 72 6d 2e 61 2c 20 72 65  eader.term.a, re
231f0 61 64 65 72 2e 74 65 72 6d 2e 6e 29 3b 0a 20 20  ader.term.n);.  
23200 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 6b          pNode->k
23210 65 79 2e 6e 20 3d 20 72 65 61 64 65 72 2e 74 65  ey.n = reader.te
23220 72 6d 2e 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  rm.n;.          
23230 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20  if( i>0 ){.     
23240 20 20 20 20 20 20 20 63 68 61 72 20 2a 61 42 6c         char *aBl
23250 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ock = 0;.       
23260 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 63 6b 20       int nBlock 
23270 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
23280 20 70 4e 6f 64 65 20 3d 20 26 70 57 72 69 74 65   pNode = &pWrite
23290 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 69  r->aNodeWriter[i
232a0 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -1];.           
232b0 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b 20 3d   pNode->iBlock =
232c0 20 72 65 61 64 65 72 2e 69 43 68 69 6c 64 3b 0a   reader.iChild;.
232d0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
232e0 20 73 71 6c 69 74 65 33 46 74 73 33 52 65 61 64   sqlite3Fts3Read
232f0 42 6c 6f 63 6b 28 70 2c 20 72 65 61 64 65 72 2e  Block(p, reader.
23300 69 43 68 69 6c 64 2c 20 26 61 42 6c 6f 63 6b 2c  iChild, &aBlock,
23310 20 26 6e 42 6c 6f 63 6b 2c 20 30 29 3b 0a 20 20   &nBlock, 0);.  
23320 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 47 72            blobGr
23330 6f 77 42 75 66 66 65 72 28 26 70 4e 6f 64 65 2d  owBuffer(&pNode-
23340 3e 62 6c 6f 63 6b 2c 20 4d 41 58 28 6e 42 6c 6f  >block, MAX(nBlo
23350 63 6b 2c 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65  ck, p->nNodeSize
23360 29 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  ), &rc);.       
23370 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
23380 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23390 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
233a0 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 2c 20 61  Node->block.a, a
233b0 42 6c 6f 63 6b 2c 20 6e 42 6c 6f 63 6b 29 3b 0a  Block, nBlock);.
233c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
233d0 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 20 3d 20 6e  ode->block.n = n
233e0 42 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 20  Block;.         
233f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
23400 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 42   sqlite3_free(aB
23410 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  lock);.         
23420 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
23430 20 20 20 20 20 6e 6f 64 65 52 65 61 64 65 72 52       nodeReaderR
23440 65 6c 65 61 73 65 28 26 72 65 61 64 65 72 29 3b  elease(&reader);
23450 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
23460 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
23470 33 5f 72 65 73 65 74 28 70 53 65 6c 65 63 74 29  3_reset(pSelect)
23480 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
23490 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
234a0 63 32 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  c2;.  }..  retur
234b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
234c0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6c 61 72  etermine the lar
234d0 67 65 73 74 20 73 65 67 6d 65 6e 74 20 69 6e 64  gest segment ind
234e0 65 78 20 76 61 6c 75 65 20 74 68 61 74 20 65 78  ex value that ex
234f0 69 73 74 73 20 77 69 74 68 69 6e 20 61 62 73 6f  ists within abso
23500 6c 75 74 65 0a 2a 2a 20 6c 65 76 65 6c 20 69 41  lute.** level iA
23510 62 73 4c 65 76 65 6c 2b 31 2e 20 49 66 20 6e 6f  bsLevel+1. If no
23520 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
23530 65 74 20 2a 70 69 49 64 78 20 74 6f 20 74 68 69  et *piIdx to thi
23540 73 20 76 61 6c 75 65 20 70 6c 75 73 0a 2a 2a 20  s value plus.** 
23550 6f 6e 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  one before retur
23560 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  ning SQLITE_OK. 
23570 4f 72 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  Or, if there are
23580 20 6e 6f 20 73 65 67 6d 65 6e 74 73 20 61 74 20   no segments at 
23590 61 6c 6c 20 0a 2a 2a 20 77 69 74 68 69 6e 20 6c  all .** within l
235a0 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c 2c 20  evel iAbsLevel, 
235b0 73 65 74 20 2a 70 69 49 64 78 20 74 6f 20 7a 65  set *piIdx to ze
235c0 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ro..**.** If an 
235d0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
235e0 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
235f0 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66  rror code. The f
23600 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 0a 2a 2a  inal value of.**
23610 20 2a 70 69 49 64 78 20 69 73 20 75 6e 64 65 66   *piIdx is undef
23620 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73  ined in this cas
23630 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
23640 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 4f 75   fts3IncrmergeOu
23650 74 70 75 74 49 64 78 28 20 0a 20 20 46 74 73 33  tputIdx( .  Fts3
23660 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
23670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
23680 54 53 20 54 61 62 6c 65 20 68 61 6e 64 6c 65 20  TS Table handle 
23690 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
236a0 36 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20  64 iAbsLevel,   
236b0 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65       /* Absolute
236c0 20 69 6e 64 65 78 20 6f 66 20 69 6e 70 75 74 20   index of input 
236d0 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e  segments */.  in
236e0 74 20 2a 70 69 49 64 78 20 20 20 20 20 20 20 20  t *piIdx        
236f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23700 20 4f 55 54 3a 20 4e 65 78 74 20 66 72 65 65 20   OUT: Next free 
23710 69 6e 64 65 78 20 61 74 20 69 41 62 73 4c 65 76  index at iAbsLev
23720 65 6c 2b 31 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  el+1 */.){.  int
23730 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73   rc;.  sqlite3_s
23740 74 6d 74 20 2a 70 4f 75 74 70 75 74 49 64 78 20  tmt *pOutputIdx 
23750 3d 20 30 3b 20 20 20 2f 2a 20 53 51 4c 20 75 73  = 0;   /* SQL us
23760 65 64 20 74 6f 20 66 69 6e 64 20 6f 75 74 70 75  ed to find outpu
23770 74 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 72 63  t index */..  rc
23780 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
23790 2c 20 53 51 4c 5f 4e 45 58 54 5f 53 45 47 4d 45  , SQL_NEXT_SEGME
237a0 4e 54 5f 49 4e 44 45 58 2c 20 26 70 4f 75 74 70  NT_INDEX, &pOutp
237b0 75 74 49 64 78 2c 20 30 29 3b 0a 20 20 69 66 28  utIdx, 0);.  if(
237c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
237d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  {.    sqlite3_bi
237e0 6e 64 5f 69 6e 74 36 34 28 70 4f 75 74 70 75 74  nd_int64(pOutput
237f0 49 64 78 2c 20 31 2c 20 69 41 62 73 4c 65 76 65  Idx, 1, iAbsLeve
23800 6c 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l+1);.    sqlite
23810 33 5f 73 74 65 70 28 70 4f 75 74 70 75 74 49 64  3_step(pOutputId
23820 78 29 3b 0a 20 20 20 20 2a 70 69 49 64 78 20 3d  x);.    *piIdx =
23830 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
23840 69 6e 74 28 70 4f 75 74 70 75 74 49 64 78 2c 20  int(pOutputIdx, 
23850 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  0);.    rc = sql
23860 69 74 65 33 5f 72 65 73 65 74 28 70 4f 75 74 70  ite3_reset(pOutp
23870 75 74 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 72  utIdx);.  }..  r
23880 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
23890 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20  .** Allocate an 
238a0 61 70 70 65 6e 64 61 62 6c 65 20 6f 75 74 70 75  appendable outpu
238b0 74 20 73 65 67 6d 65 6e 74 20 6f 6e 20 61 62 73  t segment on abs
238c0 6f 6c 75 74 65 20 6c 65 76 65 6c 20 69 41 62 73  olute level iAbs
238d0 4c 65 76 65 6c 2b 31 0a 2a 2a 20 77 69 74 68 20  Level+1.** with 
238e0 69 64 78 20 76 61 6c 75 65 20 69 49 64 78 2e 0a  idx value iIdx..
238f0 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 25 5f 73  **.** In the %_s
23900 65 67 64 69 72 20 74 61 62 6c 65 2c 20 61 20 73  egdir table, a s
23910 65 67 6d 65 6e 74 20 69 73 20 64 65 66 69 6e 65  egment is define
23920 64 20 62 79 20 74 68 65 20 76 61 6c 75 65 73 20  d by the values 
23930 69 6e 20 74 68 72 65 65 0a 2a 2a 20 63 6f 6c 75  in three.** colu
23940 6d 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  mns:.**.**     s
23950 74 61 72 74 5f 62 6c 6f 63 6b 0a 2a 2a 20 20 20  tart_block.**   
23960 20 20 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f    leaves_end_blo
23970 63 6b 0a 2a 2a 20 20 20 20 20 65 6e 64 5f 62 6c  ck.**     end_bl
23980 6f 63 6b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ock.**.** When a
23990 6e 20 61 70 70 65 6e 64 61 62 6c 65 20 73 65 67  n appendable seg
239a0 6d 65 6e 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  ment is allocate
239b0 64 2c 20 69 74 20 69 73 20 65 73 74 69 6d 61 74  d, it is estimat
239c0 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 6d  ed that the.** m
239d0 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
239e0 20 6c 65 61 66 20 62 6c 6f 63 6b 73 20 74 68 61   leaf blocks tha
239f0 74 20 6d 61 79 20 62 65 20 72 65 71 75 69 72 65  t may be require
23a00 64 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  d is the sum of 
23a10 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
23a20 20 6c 65 61 66 20 62 6c 6f 63 6b 73 20 63 6f 6e   leaf blocks con
23a30 73 75 6d 65 64 20 62 79 20 74 68 65 20 69 6e 70  sumed by the inp
23a40 75 74 20 73 65 67 6d 65 6e 74 73 2c 20 70 6c 75  ut segments, plu
23a50 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  s the number.** 
23a60 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  of input segment
23a70 73 2c 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79  s, multiplied by
23a80 20 74 77 6f 2e 20 54 68 69 73 20 76 61 6c 75 65   two. This value
23a90 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 73 74   is stored in st
23aa0 61 63 6b 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65  ack .** variable
23ab0 20 6e 4c 65 61 66 45 73 74 2e 0a 2a 2a 0a 2a 2a   nLeafEst..**.**
23ac0 20 41 20 74 6f 74 61 6c 20 6f 66 20 31 36 2a 6e   A total of 16*n
23ad0 4c 65 61 66 45 73 74 20 62 6c 6f 63 6b 73 20 61  LeafEst blocks a
23ae0 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 77 68 65  re allocated whe
23af0 6e 20 61 6e 20 61 70 70 65 6e 64 61 62 6c 65 20  n an appendable 
23b00 73 65 67 6d 65 6e 74 0a 2a 2a 20 69 73 20 63 72  segment.** is cr
23b10 65 61 74 65 64 20 28 28 31 20 2b 20 65 6e 64 5f  eated ((1 + end_
23b20 62 6c 6f 63 6b 20 2d 20 73 74 61 72 74 5f 62 6c  block - start_bl
23b30 6f 63 6b 29 3d 3d 31 36 2a 6e 4c 65 61 66 45 73  ock)==16*nLeafEs
23b40 74 29 2e 20 54 68 65 20 63 6f 6e 74 69 67 75 6f  t). The contiguo
23b50 75 73 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 6c  us.** array of l
23b60 65 61 66 20 6e 6f 64 65 73 20 73 74 61 72 74 73  eaf nodes starts
23b70 20 61 74 20 74 68 65 20 66 69 72 73 74 20 62 6c   at the first bl
23b80 6f 63 6b 20 61 6c 6c 6f 63 61 74 65 64 2e 20 54  ock allocated. T
23b90 68 65 20 61 72 72 61 79 0a 2a 2a 20 6f 66 20 69  he array.** of i
23ba0 6e 74 65 72 69 6f 72 20 6e 6f 64 65 73 20 74 68  nterior nodes th
23bb0 61 74 20 61 72 65 20 70 61 72 65 6e 74 73 20 6f  at are parents o
23bc0 66 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 73  f the leaf nodes
23bd0 20 73 74 61 72 74 20 61 74 20 62 6c 6f 63 6b 0a   start at block.
23be0 2a 2a 20 28 73 74 61 72 74 5f 62 6c 6f 63 6b 20  ** (start_block 
23bf0 2b 20 28 31 20 2b 20 65 6e 64 5f 62 6c 6f 63 6b  + (1 + end_block
23c00 20 2d 20 73 74 61 72 74 5f 62 6c 6f 63 6b 29 20   - start_block) 
23c10 2f 20 31 36 29 2e 20 41 6e 64 20 73 6f 20 6f 6e  / 16). And so on
23c20 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61  ..**.** In the a
23c30 63 74 75 61 6c 20 63 6f 64 65 20 62 65 6c 6f 77  ctual code below
23c40 2c 20 74 68 65 20 76 61 6c 75 65 20 22 31 36 22  , the value "16"
23c50 20 69 73 20 72 65 70 6c 61 63 65 64 20 77 69 74   is replaced wit
23c60 68 20 74 68 65 20 0a 2a 2a 20 70 72 65 2d 70 72  h the .** pre-pr
23c70 6f 63 65 73 73 6f 72 20 6d 61 63 72 6f 20 46 54  ocessor macro FT
23c80 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c 45  S_MAX_APPENDABLE
23c90 5f 48 45 49 47 48 54 2e 0a 2a 2f 0a 73 74 61 74  _HEIGHT..*/.stat
23ca0 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72 6d  ic int fts3Incrm
23cb0 65 72 67 65 57 72 69 74 65 72 28 20 0a 20 20 46  ergeWriter( .  F
23cc0 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
23cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23ce0 2a 20 46 74 73 33 20 74 61 62 6c 65 20 68 61 6e  * Fts3 table han
23cf0 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dle */.  sqlite3
23d00 5f 69 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c  _int64 iAbsLevel
23d10 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f  ,        /* Abso
23d20 6c 75 74 65 20 6c 65 76 65 6c 20 6f 66 20 69 6e  lute level of in
23d30 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  put segments */.
23d40 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20    int iIdx,     
23d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d60 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65    /* Index of ne
23d70 77 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  w output segment
23d80 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53   */.  Fts3MultiS
23d90 65 67 52 65 61 64 65 72 20 2a 70 43 73 72 2c 20  egReader *pCsr, 
23da0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
23db0 74 68 61 74 20 64 61 74 61 20 77 69 6c 6c 20 62  that data will b
23dc0 65 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  e read from */. 
23dd0 20 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72   IncrmergeWriter
23de0 20 2a 70 57 72 69 74 65 72 20 20 20 20 20 20 20   *pWriter       
23df0 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69   /* Populate thi
23e00 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  s object */.){. 
23e10 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
23e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e30 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
23e40 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
23e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e60 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
23e70 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69   variable */.  i
23e80 6e 74 20 6e 4c 65 61 66 45 73 74 20 3d 20 30 3b  nt nLeafEst = 0;
23e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23ea0 2a 20 42 6c 6f 63 6b 73 20 61 6c 6c 6f 63 61 74  * Blocks allocat
23eb0 65 64 20 66 6f 72 20 6c 65 61 66 20 6e 6f 64 65  ed for leaf node
23ec0 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  s */.  sqlite3_s
23ed0 74 6d 74 20 2a 70 4c 65 61 66 45 73 74 20 3d 20  tmt *pLeafEst = 
23ee0 30 3b 20 20 20 20 20 2f 2a 20 53 51 4c 20 75 73  0;     /* SQL us
23ef0 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
23f00 6e 4c 65 61 66 45 73 74 20 2a 2f 0a 20 20 73 71  nLeafEst */.  sq
23f10 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 46 69 72  lite3_stmt *pFir
23f20 73 74 42 6c 6f 63 6b 20 3d 20 30 3b 20 20 2f 2a  stBlock = 0;  /*
23f30 20 53 51 4c 20 75 73 65 64 20 74 6f 20 64 65 74   SQL used to det
23f40 65 72 6d 69 6e 65 20 66 69 72 73 74 20 62 6c 6f  ermine first blo
23f50 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 43 61 6c 63  ck */..  /* Calc
23f60 75 6c 61 74 65 20 6e 4c 65 61 66 45 73 74 2e 20  ulate nLeafEst. 
23f70 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71  */.  rc = fts3Sq
23f80 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 4d 41 58  lStmt(p, SQL_MAX
23f90 5f 4c 45 41 46 5f 4e 4f 44 45 5f 45 53 54 49 4d  _LEAF_NODE_ESTIM
23fa0 41 54 45 2c 20 26 70 4c 65 61 66 45 73 74 2c 20  ATE, &pLeafEst, 
23fb0 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
23fc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
23fd0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
23fe0 34 28 70 4c 65 61 66 45 73 74 2c 20 31 2c 20 69  4(pLeafEst, 1, i
23ff0 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20 73  AbsLevel);.    s
24000 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
24010 34 28 70 4c 65 61 66 45 73 74 2c 20 32 2c 20 70  4(pLeafEst, 2, p
24020 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 29 3b 0a  Csr->nSegment);.
24030 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
24040 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
24050 28 70 4c 65 61 66 45 73 74 29 20 29 7b 0a 20 20  (pLeafEst) ){.  
24060 20 20 20 20 6e 4c 65 61 66 45 73 74 20 3d 20 73      nLeafEst = s
24070 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
24080 74 28 70 4c 65 61 66 45 73 74 2c 20 30 29 3b 0a  t(pLeafEst, 0);.
24090 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
240a0 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 4c 65  qlite3_reset(pLe
240b0 61 66 45 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66  afEst);.  }.  if
240c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
240d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
240e0 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65  /* Calculate the
240f0 20 66 69 72 73 74 20 62 6c 6f 63 6b 20 74 6f 20   first block to 
24100 75 73 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75  use in the outpu
24110 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 72  t segment */.  r
24120 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
24130 70 2c 20 53 51 4c 5f 4e 45 58 54 5f 53 45 47 4d  p, SQL_NEXT_SEGM
24140 45 4e 54 53 5f 49 44 2c 20 26 70 46 69 72 73 74  ENTS_ID, &pFirst
24150 42 6c 6f 63 6b 2c 20 30 29 3b 0a 20 20 69 66 28  Block, 0);.  if(
24160 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24170 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  {.    if( SQLITE
24180 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
24190 65 70 28 70 46 69 72 73 74 42 6c 6f 63 6b 29 20  ep(pFirstBlock) 
241a0 29 7b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72  ){.      pWriter
241b0 2d 3e 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74  ->iStart = sqlit
241c0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
241d0 70 46 69 72 73 74 42 6c 6f 63 6b 2c 20 30 29 3b  pFirstBlock, 0);
241e0 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e  .      pWriter->
241f0 69 45 6e 64 20 3d 20 70 57 72 69 74 65 72 2d 3e  iEnd = pWriter->
24200 69 53 74 61 72 74 20 2d 20 31 3b 0a 20 20 20 20  iStart - 1;.    
24210 20 20 70 57 72 69 74 65 72 2d 3e 69 45 6e 64 20    pWriter->iEnd 
24220 2b 3d 20 6e 4c 65 61 66 45 73 74 20 2a 20 46 54  += nLeafEst * FT
24230 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c 45  S_MAX_APPENDABLE
24240 5f 48 45 49 47 48 54 3b 0a 20 20 20 20 7d 0a 20  _HEIGHT;.    }. 
24250 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
24260 72 65 73 65 74 28 70 46 69 72 73 74 42 6c 6f 63  reset(pFirstBloc
24270 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  k);.  }.  if( rc
24280 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
24290 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 49  turn rc;..  /* I
242a0 6e 73 65 72 74 20 74 68 65 20 6d 61 72 6b 65 72  nsert the marker
242b0 20 69 6e 20 74 68 65 20 25 5f 73 65 67 6d 65 6e   in the %_segmen
242c0 74 73 20 74 61 62 6c 65 20 74 6f 20 6d 61 6b 65  ts table to make
242d0 20 73 75 72 65 20 6e 6f 62 6f 64 79 20 74 72 69   sure nobody tri
242e0 65 73 0a 20 20 2a 2a 20 74 6f 20 73 74 65 61 6c  es.  ** to steal
242f0 20 74 68 65 20 73 70 61 63 65 20 6a 75 73 74 20   the space just 
24300 61 6c 6c 6f 63 61 74 65 64 2e 20 54 68 69 73 20  allocated. This 
24310 69 73 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20  is also used to 
24320 69 64 65 6e 74 69 66 79 20 0a 20 20 2a 2a 20 61  identify .  ** a
24330 70 70 65 6e 64 61 62 6c 65 20 73 65 67 6d 65 6e  ppendable segmen
24340 74 73 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66  ts.  */.  rc = f
24350 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28  ts3WriteSegment(
24360 70 2c 20 70 57 72 69 74 65 72 2d 3e 69 45 6e 64  p, pWriter->iEnd
24370 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
24380 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
24390 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 57 72  eturn rc;..  pWr
243a0 69 74 65 72 2d 3e 69 41 62 73 4c 65 76 65 6c 20  iter->iAbsLevel 
243b0 3d 20 69 41 62 73 4c 65 76 65 6c 3b 0a 20 20 70  = iAbsLevel;.  p
243c0 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74  Writer->nLeafEst
243d0 20 3d 20 6e 4c 65 61 66 45 73 74 3b 0a 20 20 70   = nLeafEst;.  p
243e0 57 72 69 74 65 72 2d 3e 69 49 64 78 20 3d 20 69  Writer->iIdx = i
243f0 49 64 78 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 75  Idx;..  /* Set u
24400 70 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 4e  p the array of N
24410 6f 64 65 57 72 69 74 65 72 20 6f 62 6a 65 63 74  odeWriter object
24420 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  s */.  for(i=0; 
24430 69 3c 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44  i<FTS_MAX_APPEND
24440 41 42 4c 45 5f 48 45 49 47 48 54 3b 20 69 2b 2b  ABLE_HEIGHT; i++
24450 29 7b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  ){.    pWriter->
24460 61 4e 6f 64 65 57 72 69 74 65 72 5b 69 5d 2e 69  aNodeWriter[i].i
24470 42 6c 6f 63 6b 20 3d 20 70 57 72 69 74 65 72 2d  Block = pWriter-
24480 3e 69 53 74 61 72 74 20 2b 20 69 2a 70 57 72 69  >iStart + i*pWri
24490 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74 3b 0a 20  ter->nLeafEst;. 
244a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
244b0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
244c0 52 65 6d 6f 76 65 20 61 6e 20 65 6e 74 72 79 20  Remove an entry 
244d0 66 72 6f 6d 20 74 68 65 20 25 5f 73 65 67 64 69  from the %_segdi
244e0 72 20 74 61 62 6c 65 2e 20 54 68 69 73 20 69 6e  r table. This in
244f0 76 6f 6c 76 65 73 20 72 75 6e 6e 69 6e 67 20 74  volves running t
24500 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  he .** following
24510 20 74 77 6f 20 73 74 61 74 65 6d 65 6e 74 73 3a   two statements:
24520 0a 2a 2a 0a 2a 2a 20 20 20 44 45 4c 45 54 45 20  .**.**   DELETE 
24530 46 52 4f 4d 20 25 5f 73 65 67 64 69 72 20 57 48  FROM %_segdir WH
24540 45 52 45 20 6c 65 76 65 6c 20 3d 20 3a 69 41 62  ERE level = :iAb
24550 73 4c 65 76 65 6c 20 41 4e 44 20 69 64 78 20 3d  sLevel AND idx =
24560 20 3a 69 49 64 78 0a 2a 2a 20 20 20 55 50 44 41   :iIdx.**   UPDA
24570 54 45 20 25 5f 73 65 67 64 69 72 20 53 45 54 20  TE %_segdir SET 
24580 69 64 78 20 3d 20 69 64 78 20 2d 20 31 20 57 48  idx = idx - 1 WH
24590 45 52 45 20 6c 65 76 65 6c 20 3d 20 3a 69 41 62  ERE level = :iAb
245a0 73 4c 65 76 65 6c 20 41 4e 44 20 69 64 78 20 3e  sLevel AND idx >
245b0 20 3a 69 49 64 78 0a 2a 2a 0a 2a 2a 20 54 68 65   :iIdx.**.** The
245c0 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
245d0 74 20 72 65 6d 6f 76 65 73 20 74 68 65 20 73 70  t removes the sp
245e0 65 63 69 66 69 63 20 25 5f 73 65 67 64 69 72 20  ecific %_segdir 
245f0 6c 65 76 65 6c 2e 20 54 68 65 20 55 50 44 41 54  level. The UPDAT
24600 45 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  E .** statement 
24610 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
24620 20 72 65 6d 61 69 6e 69 6e 67 20 73 65 67 6d 65   remaining segme
24630 6e 74 73 20 68 61 76 65 20 63 6f 6e 74 69 67 75  nts have contigu
24640 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 0a  ously allocated.
24650 2a 2a 20 69 64 78 20 76 61 6c 75 65 73 2e 0a 2a  ** idx values..*
24660 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
24670 33 52 65 6d 6f 76 65 53 65 67 64 69 72 45 6e 74  3RemoveSegdirEnt
24680 72 79 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  ry(.  Fts3Table 
24690 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
246a0 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61        /* FTS3 ta
246b0 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
246c0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 41  sqlite3_int64 iA
246d0 62 73 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20  bsLevel,        
246e0 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65 76 65  /* Absolute leve
246f0 6c 20 74 6f 20 64 65 6c 65 74 65 20 66 72 6f 6d  l to delete from
24700 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 20   */.  int iIdx  
24710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24720 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
24730 66 20 25 5f 73 65 67 64 69 72 20 65 6e 74 72 79  f %_segdir entry
24740 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 29 7b   to delete */.){
24750 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
24760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24770 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
24780 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
24790 74 6d 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30  tmt *pDelete = 0
247a0 3b 20 20 20 20 20 20 2f 2a 20 44 45 4c 45 54 45  ;      /* DELETE
247b0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20   statement */.. 
247c0 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
247d0 74 28 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f  t(p, SQL_DELETE_
247e0 53 45 47 44 49 52 5f 45 4e 54 52 59 2c 20 26 70  SEGDIR_ENTRY, &p
247f0 44 65 6c 65 74 65 2c 20 30 29 3b 0a 20 20 69 66  Delete, 0);.  if
24800 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24810 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
24820 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c 65 74  ind_int64(pDelet
24830 65 2c 20 31 2c 20 69 41 62 73 4c 65 76 65 6c 29  e, 1, iAbsLevel)
24840 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
24850 6e 64 5f 69 6e 74 28 70 44 65 6c 65 74 65 2c 20  nd_int(pDelete, 
24860 32 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 73 71  2, iIdx);.    sq
24870 6c 69 74 65 33 5f 73 74 65 70 28 70 44 65 6c 65  lite3_step(pDele
24880 74 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  te);.    rc = sq
24890 6c 69 74 65 33 5f 72 65 73 65 74 28 70 44 65 6c  lite3_reset(pDel
248a0 65 74 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ete);.  }..  ret
248b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
248c0 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67   One or more seg
248d0 6d 65 6e 74 73 20 68 61 76 65 20 6a 75 73 74 20  ments have just 
248e0 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f  been removed fro
248f0 6d 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c  m absolute level
24900 20 69 41 62 73 4c 65 76 65 6c 2e 0a 2a 2a 20 55   iAbsLevel..** U
24910 70 64 61 74 65 20 74 68 65 20 27 69 64 78 27 20  pdate the 'idx' 
24920 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 72 65  values of the re
24930 6d 61 69 6e 69 6e 67 20 73 65 67 6d 65 6e 74 73  maining segments
24940 20 69 6e 20 74 68 65 20 6c 65 76 65 6c 20 73 6f   in the level so
24950 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 69 64 78   that.** the idx
24960 20 76 61 6c 75 65 73 20 61 72 65 20 61 20 63 6f   values are a co
24970 6e 74 69 67 75 6f 75 73 20 73 65 71 75 65 6e 63  ntiguous sequenc
24980 65 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20  e starting from 
24990 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
249a0 20 66 74 73 33 52 65 70 61 63 6b 53 65 67 64 69   fts3RepackSegdi
249b0 72 4c 65 76 65 6c 28 0a 20 20 46 74 73 33 54 61  rLevel(.  Fts3Ta
249c0 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
249d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
249e0 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  3 table handle *
249f0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
24a00 34 20 69 41 62 73 4c 65 76 65 6c 20 20 20 20 20  4 iAbsLevel     
24a10 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20      /* Absolute 
24a20 6c 65 76 65 6c 20 74 6f 20 72 65 70 61 63 6b 20  level to repack 
24a30 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
24a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
24a60 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
24a70 2a 61 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20  *aIdx = 0;      
24a80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
24a90 72 72 61 79 20 6f 66 20 72 65 6d 61 69 6e 69 6e  rray of remainin
24aa0 67 20 69 64 78 20 76 61 6c 75 65 73 20 2a 2f 0a  g idx values */.
24ab0 20 20 69 6e 74 20 6e 49 64 78 20 3d 20 30 3b 20    int nIdx = 0; 
24ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ad0 20 20 2f 2a 20 56 61 6c 69 64 20 65 6e 74 72 69    /* Valid entri
24ae0 65 73 20 69 6e 20 61 49 64 78 5b 5d 20 2a 2f 0a  es in aIdx[] */.
24af0 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30    int nAlloc = 0
24b00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24b10 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
24b20 69 7a 65 20 6f 66 20 61 49 64 78 5b 5d 20 2a 2f  ize of aIdx[] */
24b30 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
24b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b50 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
24b60 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  ariable */.  sql
24b70 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65  ite3_stmt *pSele
24b80 63 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  ct = 0;      /* 
24b90 53 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  Select statement
24ba0 20 74 6f 20 72 65 61 64 20 69 64 78 20 76 61 6c   to read idx val
24bb0 75 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ues */.  sqlite3
24bc0 5f 73 74 6d 74 20 2a 70 55 70 64 61 74 65 20 3d  _stmt *pUpdate =
24bd0 20 30 3b 20 20 20 20 20 20 2f 2a 20 55 70 64 61   0;      /* Upda
24be0 74 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  te statement to 
24bf0 6d 6f 64 69 66 79 20 69 64 78 20 76 61 6c 75 65  modify idx value
24c00 73 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73  s */..  rc = fts
24c10 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
24c20 53 45 4c 45 43 54 5f 49 4e 44 45 58 45 53 2c 20  SELECT_INDEXES, 
24c30 26 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  &pSelect, 0);.  
24c40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24c50 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  K ){.    int rc2
24c60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
24c70 6e 64 5f 69 6e 74 36 34 28 70 53 65 6c 65 63 74  nd_int64(pSelect
24c80 2c 20 31 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b  , 1, iAbsLevel);
24c90 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49  .    while( SQLI
24ca0 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
24cb0 73 74 65 70 28 70 53 65 6c 65 63 74 29 20 29 7b  step(pSelect) ){
24cc0 0a 20 20 20 20 20 20 69 66 28 20 6e 49 64 78 3e  .      if( nIdx>
24cd0 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  =nAlloc ){.     
24ce0 20 20 20 69 6e 74 20 2a 61 4e 65 77 3b 0a 20 20     int *aNew;.  
24cf0 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 2b 3d 20        nAlloc += 
24d00 31 36 3b 0a 20 20 20 20 20 20 20 20 61 4e 65 77  16;.        aNew
24d10 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
24d20 6f 63 28 61 49 64 78 2c 20 6e 41 6c 6c 6f 63 2a  oc(aIdx, nAlloc*
24d30 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20  sizeof(int));.  
24d40 20 20 20 20 20 20 69 66 28 20 21 61 4e 65 77 20        if( !aNew 
24d50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
24d60 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
24d70 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
24d80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24d90 20 20 20 61 49 64 78 20 3d 20 61 4e 65 77 3b 0a     aIdx = aNew;.
24da0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 49        }.      aI
24db0 64 78 5b 6e 49 64 78 2b 2b 5d 20 3d 20 73 71 6c  dx[nIdx++] = sql
24dc0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
24dd0 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
24de0 20 7d 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c   }.    rc2 = sql
24df0 69 74 65 33 5f 72 65 73 65 74 28 70 53 65 6c 65  ite3_reset(pSele
24e00 63 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ct);.    if( rc=
24e10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
24e20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 69 66  = rc2;.  }..  if
24e30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24e40 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  ){.    rc = fts3
24e50 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53  SqlStmt(p, SQL_S
24e60 48 49 46 54 5f 53 45 47 44 49 52 5f 45 4e 54 52  HIFT_SEGDIR_ENTR
24e70 59 2c 20 26 70 55 70 64 61 74 65 2c 20 30 29 3b  Y, &pUpdate, 0);
24e80 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
24e90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24ea0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
24eb0 36 34 28 70 55 70 64 61 74 65 2c 20 32 2c 20 69  64(pUpdate, 2, i
24ec0 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 0a  AbsLevel);.  }..
24ed0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 67    assert( p->bIg
24ee0 6e 6f 72 65 53 61 76 65 70 6f 69 6e 74 3d 3d 30  noreSavepoint==0
24ef0 20 29 3b 0a 20 20 70 2d 3e 62 49 67 6e 6f 72 65   );.  p->bIgnore
24f00 53 61 76 65 70 6f 69 6e 74 20 3d 20 31 3b 0a 20  Savepoint = 1;. 
24f10 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
24f20 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 49 64  LITE_OK && i<nId
24f30 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  x; i++){.    if(
24f40 20 61 49 64 78 5b 69 5d 21 3d 69 20 29 7b 0a 20   aIdx[i]!=i ){. 
24f50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
24f60 64 5f 69 6e 74 28 70 55 70 64 61 74 65 2c 20 33  d_int(pUpdate, 3
24f70 2c 20 61 49 64 78 5b 69 5d 29 3b 0a 20 20 20 20  , aIdx[i]);.    
24f80 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
24f90 6e 74 28 70 55 70 64 61 74 65 2c 20 31 2c 20 69  nt(pUpdate, 1, i
24fa0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24fb0 5f 73 74 65 70 28 70 55 70 64 61 74 65 29 3b 0a  _step(pUpdate);.
24fc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
24fd0 65 33 5f 72 65 73 65 74 28 70 55 70 64 61 74 65  e3_reset(pUpdate
24fe0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
24ff0 2d 3e 62 49 67 6e 6f 72 65 53 61 76 65 70 6f 69  ->bIgnoreSavepoi
25000 6e 74 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74  nt = 0;..  sqlit
25010 65 33 5f 66 72 65 65 28 61 49 64 78 29 3b 0a 20  e3_free(aIdx);. 
25020 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
25030 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 53  tatic void fts3S
25040 74 61 72 74 4e 6f 64 65 28 42 6c 6f 62 20 2a 70  tartNode(Blob *p
25050 4e 6f 64 65 2c 20 69 6e 74 20 69 48 65 69 67 68  Node, int iHeigh
25060 74 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  t, sqlite3_int64
25070 20 69 43 68 69 6c 64 29 7b 0a 20 20 70 4e 6f 64   iChild){.  pNod
25080 65 2d 3e 61 5b 30 5d 20 3d 20 28 63 68 61 72 29  e->a[0] = (char)
25090 69 48 65 69 67 68 74 3b 0a 20 20 69 66 28 20 69  iHeight;.  if( i
250a0 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 61 73 73  Child ){.    ass
250b0 65 72 74 28 20 70 4e 6f 64 65 2d 3e 6e 41 6c 6c  ert( pNode->nAll
250c0 6f 63 3e 3d 31 2b 73 71 6c 69 74 65 33 46 74 73  oc>=1+sqlite3Fts
250d0 33 56 61 72 69 6e 74 4c 65 6e 28 69 43 68 69 6c  3VarintLen(iChil
250e0 64 29 20 29 3b 0a 20 20 20 20 70 4e 6f 64 65 2d  d) );.    pNode-
250f0 3e 6e 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  >n = 1 + sqlite3
25100 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70  Fts3PutVarint(&p
25110 4e 6f 64 65 2d 3e 61 5b 31 5d 2c 20 69 43 68 69  Node->a[1], iChi
25120 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ld);.  }else{.  
25130 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d    assert( pNode-
25140 3e 6e 41 6c 6c 6f 63 3e 3d 31 20 29 3b 0a 20 20  >nAlloc>=1 );.  
25150 20 20 70 4e 6f 64 65 2d 3e 6e 20 3d 20 31 3b 0a    pNode->n = 1;.
25160 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    }.}../*.** The
25170 20 66 69 72 73 74 20 74 77 6f 20 61 72 67 75 6d   first two argum
25180 65 6e 74 73 20 61 72 65 20 61 20 70 6f 69 6e 74  ents are a point
25190 65 72 20 74 6f 20 61 6e 64 20 74 68 65 20 73 69  er to and the si
251a0 7a 65 20 6f 66 20 61 20 73 65 67 6d 65 6e 74 20  ze of a segment 
251b0 62 2d 74 72 65 65 0a 2a 2a 20 6e 6f 64 65 2e 20  b-tree.** node. 
251c0 54 68 65 20 6e 6f 64 65 20 6d 61 79 20 62 65 20  The node may be 
251d0 61 20 6c 65 61 66 20 6f 72 20 61 6e 20 69 6e 74  a leaf or an int
251e0 65 72 6e 61 6c 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a  ernal node..**.*
251f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
25200 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 6e 6f  creates a new no
25210 64 65 20 69 6d 61 67 65 20 69 6e 20 62 6c 6f 62  de image in blob
25220 20 6f 62 6a 65 63 74 20 2a 70 4e 65 77 20 62 79   object *pNew by
25230 20 63 6f 70 79 69 6e 67 0a 2a 2a 20 61 6c 6c 20   copying.** all 
25240 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20 67  terms that are g
25250 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
25260 71 75 61 6c 20 74 6f 20 7a 54 65 72 6d 2f 6e 54  qual to zTerm/nT
25270 65 72 6d 20 28 66 6f 72 20 6c 65 61 66 20 6e 6f  erm (for leaf no
25280 64 65 73 29 0a 2a 2a 20 6f 72 20 67 72 65 61 74  des).** or great
25290 65 72 20 74 68 61 6e 20 7a 54 65 72 6d 2f 6e 54  er than zTerm/nT
252a0 65 72 6d 20 28 66 6f 72 20 69 6e 74 65 72 6e 61  erm (for interna
252b0 6c 20 6e 6f 64 65 73 29 20 66 72 6f 6d 20 61 4e  l nodes) from aN
252c0 6f 64 65 2f 6e 4e 6f 64 65 2e 0a 2a 2f 0a 73 74  ode/nNode..*/.st
252d0 61 74 69 63 20 69 6e 74 20 66 74 73 33 54 72 75  atic int fts3Tru
252e0 6e 63 61 74 65 4e 6f 64 65 28 0a 20 20 63 6f 6e  ncateNode(.  con
252f0 73 74 20 63 68 61 72 20 2a 61 4e 6f 64 65 2c 20  st char *aNode, 
25300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25310 43 75 72 72 65 6e 74 20 6e 6f 64 65 20 69 6d 61  Current node ima
25320 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 6f 64  ge */.  int nNod
25330 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
25340 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
25350 6f 66 20 61 4e 6f 64 65 20 69 6e 20 62 79 74 65  of aNode in byte
25360 73 20 2a 2f 0a 20 20 42 6c 6f 62 20 2a 70 4e 65  s */.  Blob *pNe
25370 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
25380 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57         /* OUT: W
25390 72 69 74 65 20 6e 65 77 20 6e 6f 64 65 20 69 6d  rite new node im
253a0 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  age here */.  co
253b0 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c  nst char *zTerm,
253c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
253d0 20 4f 6d 69 74 20 61 6c 6c 20 74 65 72 6d 73 20   Omit all terms 
253e0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69  smaller than thi
253f0 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  s */.  int nTerm
25400 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25410 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
25420 66 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73  f zTerm in bytes
25430 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
25440 74 36 34 20 2a 70 69 42 6c 6f 63 6b 20 20 20 20  t64 *piBlock    
25450 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42 6c        /* OUT: Bl
25460 6f 63 6b 20 6e 75 6d 62 65 72 20 69 6e 20 6e 65  ock number in ne
25470 78 74 20 6c 61 79 65 72 20 64 6f 77 6e 20 2a 2f  xt layer down */
25480 0a 29 7b 0a 20 20 4e 6f 64 65 52 65 61 64 65 72  .){.  NodeReader
25490 20 72 65 61 64 65 72 3b 20 20 20 20 20 20 20 20   reader;        
254a0 20 20 20 20 20 20 2f 2a 20 52 65 61 64 65 72 20        /* Reader 
254b0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 42 6c 6f 62  object */.  Blob
254c0 20 70 72 65 76 20 3d 20 7b 30 2c 20 30 2c 20 30   prev = {0, 0, 0
254d0 7d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  };          /* P
254e0 72 65 76 69 6f 75 73 20 74 65 72 6d 20 77 72 69  revious term wri
254f0 74 74 65 6e 20 74 6f 20 6e 65 77 20 6e 6f 64 65  tten to new node
25500 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
25510 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
25520 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
25530 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 62 4c  code */.  int bL
25540 65 61 66 20 3d 20 61 4e 6f 64 65 5b 30 5d 3d 3d  eaf = aNode[0]==
25550 27 5c 30 27 3b 20 20 20 20 20 2f 2a 20 54 72 75  '\0';     /* Tru
25560 65 20 66 6f 72 20 61 20 6c 65 61 66 20 6e 6f 64  e for a leaf nod
25570 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  e */..  /* Alloc
25580 61 74 65 20 72 65 71 75 69 72 65 64 20 6f 75 74  ate required out
25590 70 75 74 20 73 70 61 63 65 20 2a 2f 0a 20 20 62  put space */.  b
255a0 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28 70 4e  lobGrowBuffer(pN
255b0 65 77 2c 20 6e 4e 6f 64 65 2c 20 26 72 63 29 3b  ew, nNode, &rc);
255c0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
255d0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
255e0 3b 0a 20 20 70 4e 65 77 2d 3e 6e 20 3d 20 30 3b  ;.  pNew->n = 0;
255f0 0a 0a 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20  ..  /* Populate 
25600 6e 65 77 20 6e 6f 64 65 20 62 75 66 66 65 72 20  new node buffer 
25610 2a 2f 0a 20 20 66 6f 72 28 72 63 20 3d 20 6e 6f  */.  for(rc = no
25620 64 65 52 65 61 64 65 72 49 6e 69 74 28 26 72 65  deReaderInit(&re
25630 61 64 65 72 2c 20 61 4e 6f 64 65 2c 20 6e 4e 6f  ader, aNode, nNo
25640 64 65 29 3b 20 0a 20 20 20 20 20 20 72 63 3d 3d  de); .      rc==
25650 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 61  SQLITE_OK && rea
25660 64 65 72 2e 61 4e 6f 64 65 3b 20 0a 20 20 20 20  der.aNode; .    
25670 20 20 72 63 20 3d 20 6e 6f 64 65 52 65 61 64 65    rc = nodeReade
25680 72 4e 65 78 74 28 26 72 65 61 64 65 72 29 0a 20  rNext(&reader). 
25690 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4e 65 77   ){.    if( pNew
256a0 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->n==0 ){.      
256b0 69 6e 74 20 72 65 73 20 3d 20 66 74 73 33 54 65  int res = fts3Te
256c0 72 6d 43 6d 70 28 72 65 61 64 65 72 2e 74 65 72  rmCmp(reader.ter
256d0 6d 2e 61 2c 20 72 65 61 64 65 72 2e 74 65 72 6d  m.a, reader.term
256e0 2e 6e 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  .n, zTerm, nTerm
256f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73  );.      if( res
25700 3c 30 20 7c 7c 20 28 62 4c 65 61 66 3d 3d 30 20  <0 || (bLeaf==0 
25710 26 26 20 72 65 73 3d 3d 30 29 20 29 20 63 6f 6e  && res==0) ) con
25720 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 74 73  tinue;.      fts
25730 33 53 74 61 72 74 4e 6f 64 65 28 70 4e 65 77 2c  3StartNode(pNew,
25740 20 28 69 6e 74 29 61 4e 6f 64 65 5b 30 5d 2c 20   (int)aNode[0], 
25750 72 65 61 64 65 72 2e 69 43 68 69 6c 64 29 3b 0a  reader.iChild);.
25760 20 20 20 20 20 20 2a 70 69 42 6c 6f 63 6b 20 3d        *piBlock =
25770 20 72 65 61 64 65 72 2e 69 43 68 69 6c 64 3b 0a   reader.iChild;.
25780 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 66      }.    rc = f
25790 74 73 33 41 70 70 65 6e 64 54 6f 4e 6f 64 65 28  ts3AppendToNode(
257a0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2c 20 26  .        pNew, &
257b0 70 72 65 76 2c 20 72 65 61 64 65 72 2e 74 65 72  prev, reader.ter
257c0 6d 2e 61 2c 20 72 65 61 64 65 72 2e 74 65 72 6d  m.a, reader.term
257d0 2e 6e 2c 0a 20 20 20 20 20 20 20 20 72 65 61 64  .n,.        read
257e0 65 72 2e 61 44 6f 63 6c 69 73 74 2c 20 72 65 61  er.aDoclist, rea
257f0 64 65 72 2e 6e 44 6f 63 6c 69 73 74 0a 20 20 20  der.nDoclist.   
25800 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
25810 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61  SQLITE_OK ) brea
25820 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65  k;.  }.  if( pNe
25830 77 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66  w->n==0 ){.    f
25840 74 73 33 53 74 61 72 74 4e 6f 64 65 28 70 4e 65  ts3StartNode(pNe
25850 77 2c 20 28 69 6e 74 29 61 4e 6f 64 65 5b 30 5d  w, (int)aNode[0]
25860 2c 20 72 65 61 64 65 72 2e 69 43 68 69 6c 64 29  , reader.iChild)
25870 3b 0a 20 20 20 20 2a 70 69 42 6c 6f 63 6b 20 3d  ;.    *piBlock =
25880 20 72 65 61 64 65 72 2e 69 43 68 69 6c 64 3b 0a   reader.iChild;.
25890 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e    }.  assert( pN
258a0 65 77 2d 3e 6e 3c 3d 70 4e 65 77 2d 3e 6e 41 6c  ew->n<=pNew->nAl
258b0 6c 6f 63 20 29 3b 0a 0a 20 20 6e 6f 64 65 52 65  loc );..  nodeRe
258c0 61 64 65 72 52 65 6c 65 61 73 65 28 26 72 65 61  aderRelease(&rea
258d0 64 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  der);.  sqlite3_
258e0 66 72 65 65 28 70 72 65 76 2e 61 29 3b 0a 20 20  free(prev.a);.  
258f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25900 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 74  .** Remove all t
25910 65 72 6d 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  erms smaller tha
25920 6e 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 20 66 72  n zTerm/nTerm fr
25930 6f 6d 20 73 65 67 6d 65 6e 74 20 69 49 64 78 20  om segment iIdx 
25940 69 6e 20 61 62 73 6f 6c 75 74 65 20 0a 2a 2a 20  in absolute .** 
25950 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c 2e  level iAbsLevel.
25960 20 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76   This may involv
25970 65 20 64 65 6c 65 74 69 6e 67 20 65 6e 74 72 69  e deleting entri
25980 65 73 20 66 72 6f 6d 20 74 68 65 20 25 5f 73 65  es from the %_se
25990 67 6d 65 6e 74 73 0a 2a 2a 20 74 61 62 6c 65 2c  gments.** table,
259a0 20 61 6e 64 20 6d 6f 64 69 66 79 69 6e 67 20 65   and modifying e
259b0 78 69 73 74 69 6e 67 20 65 6e 74 72 69 65 73 20  xisting entries 
259c0 69 6e 20 62 6f 74 68 20 74 68 65 20 25 5f 73 65  in both the %_se
259d0 67 6d 65 6e 74 73 20 61 6e 64 20 25 5f 73 65 67  gments and %_seg
259e0 64 69 72 0a 2a 2a 20 74 61 62 6c 65 73 2e 0a 2a  dir.** tables..*
259f0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
25a00 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
25a10 65 20 73 65 67 6d 65 6e 74 20 69 73 20 75 70 64  e segment is upd
25a20 61 74 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ated successfull
25a30 79 2e 20 4f 72 20 61 6e 0a 2a 2a 20 53 51 4c 69  y. Or an.** SQLi
25a40 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  te error code ot
25a50 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
25a60 69 63 20 69 6e 74 20 66 74 73 33 54 72 75 6e 63  ic int fts3Trunc
25a70 61 74 65 53 65 67 6d 65 6e 74 28 0a 20 20 46 74  ateSegment(.  Ft
25a80 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
25a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25aa0 20 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64   FTS3 table hand
25ab0 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
25ac0 69 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c 2c  int64 iAbsLevel,
25ad0 20 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c          /* Absol
25ae0 75 74 65 20 6c 65 76 65 6c 20 6f 66 20 73 65 67  ute level of seg
25af0 6d 65 6e 74 20 74 6f 20 6d 6f 64 69 66 79 20 2a  ment to modify *
25b00 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20  /.  int iIdx,   
25b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 77 69 74      /* Index wit
25b30 68 69 6e 20 6c 65 76 65 6c 20 6f 66 20 73 65 67  hin level of seg
25b40 6d 65 6e 74 20 74 6f 20 6d 6f 64 69 66 79 20 2a  ment to modify *
25b50 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
25b60 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  zTerm,          
25b70 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 65      /* Remove te
25b80 72 6d 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  rms smaller than
25b90 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e   this */.  int n
25ba0 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
25bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
25bc0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
25bd0 62 75 66 66 65 72 20 7a 54 65 72 6d 20 2a 2f 0a  buffer zTerm */.
25be0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
25bf0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
25c00 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
25c10 6f 64 65 20 2a 2f 0a 20 20 42 6c 6f 62 20 72 6f  ode */.  Blob ro
25c20 6f 74 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20  ot = {0,0,0};   
25c30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
25c40 72 6f 6f 74 20 70 61 67 65 20 69 6d 61 67 65 20  root page image 
25c50 2a 2f 0a 20 20 42 6c 6f 62 20 62 6c 6f 63 6b 20  */.  Blob block 
25c60 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 20 20 20  = {0,0,0};      
25c70 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75       /* Buffer u
25c80 73 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65  sed for any othe
25c90 72 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 73 71 6c  r block */.  sql
25ca0 69 74 65 33 5f 69 6e 74 36 34 20 69 42 6c 6f 63  ite3_int64 iBloc
25cb0 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  k = 0;       /* 
25cc0 42 6c 6f 63 6b 20 69 64 20 2a 2f 0a 20 20 73 71  Block id */.  sq
25cd0 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4e 65 77  lite3_int64 iNew
25ce0 53 74 61 72 74 20 3d 20 30 3b 20 20 20 20 2f 2a  Start = 0;    /*
25cf0 20 4e 65 77 20 76 61 6c 75 65 20 66 6f 72 20 69   New value for i
25d00 53 74 61 72 74 42 6c 6f 63 6b 20 2a 2f 0a 20 20  StartBlock */.  
25d10 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f  sqlite3_int64 iO
25d20 6c 64 53 74 61 72 74 20 3d 20 30 3b 20 20 20 20  ldStart = 0;    
25d30 2f 2a 20 4f 6c 64 20 76 61 6c 75 65 20 66 6f 72  /* Old value for
25d40 20 69 53 74 61 72 74 42 6c 6f 63 6b 20 2a 2f 0a   iStartBlock */.
25d50 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
25d60 70 46 65 74 63 68 20 3d 20 30 3b 20 20 20 20 20  pFetch = 0;     
25d70 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75    /* Statement u
25d80 73 65 64 20 74 6f 20 66 65 74 63 68 20 73 65 67  sed to fetch seg
25d90 64 69 72 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66  dir */..  rc = f
25da0 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51  ts3SqlStmt(p, SQ
25db0 4c 5f 53 45 4c 45 43 54 5f 53 45 47 44 49 52 2c  L_SELECT_SEGDIR,
25dc0 20 26 70 46 65 74 63 68 2c 20 30 29 3b 0a 20 20   &pFetch, 0);.  
25dd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25de0 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  K ){.    int rc2
25df0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25e00 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
25e10 33 5f 72 65 73 65 74 28 29 20 72 65 74 75 72 6e  3_reset() return
25e20 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 73 71 6c   code */.    sql
25e30 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
25e40 70 46 65 74 63 68 2c 20 31 2c 20 69 41 62 73 4c  pFetch, 1, iAbsL
25e50 65 76 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  evel);.    sqlit
25e60 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 46 65 74  e3_bind_int(pFet
25e70 63 68 2c 20 32 2c 20 69 49 64 78 29 3b 0a 20 20  ch, 2, iIdx);.  
25e80 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
25e90 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
25ea0 46 65 74 63 68 29 20 29 7b 0a 20 20 20 20 20 20  Fetch) ){.      
25eb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 52 6f 6f  const char *aRoo
25ec0 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  t = sqlite3_colu
25ed0 6d 6e 5f 62 6c 6f 62 28 70 46 65 74 63 68 2c 20  mn_blob(pFetch, 
25ee0 34 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 52  4);.      int nR
25ef0 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  oot = sqlite3_co
25f00 6c 75 6d 6e 5f 62 79 74 65 73 28 70 46 65 74 63  lumn_bytes(pFetc
25f10 68 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 4f 6c  h, 4);.      iOl
25f20 64 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  dStart = sqlite3
25f30 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 46  _column_int64(pF
25f40 65 74 63 68 2c 20 31 29 3b 0a 20 20 20 20 20 20  etch, 1);.      
25f50 72 63 20 3d 20 66 74 73 33 54 72 75 6e 63 61 74  rc = fts3Truncat
25f60 65 4e 6f 64 65 28 61 52 6f 6f 74 2c 20 6e 52 6f  eNode(aRoot, nRo
25f70 6f 74 2c 20 26 72 6f 6f 74 2c 20 7a 54 65 72 6d  ot, &root, zTerm
25f80 2c 20 6e 54 65 72 6d 2c 20 26 69 42 6c 6f 63 6b  , nTerm, &iBlock
25f90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 32  );.    }.    rc2
25fa0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
25fb0 28 70 46 65 74 63 68 29 3b 0a 20 20 20 20 69 66  (pFetch);.    if
25fc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25fd0 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a  ) rc = rc2;.  }.
25fe0 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
25ff0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 42 6c 6f 63  LITE_OK && iBloc
26000 6b 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 61  k ){.    char *a
26010 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 69  Block = 0;.    i
26020 6e 74 20 6e 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20  nt nBlock = 0;. 
26030 20 20 20 69 4e 65 77 53 74 61 72 74 20 3d 20 69     iNewStart = i
26040 42 6c 6f 63 6b 3b 0a 0a 20 20 20 20 72 63 20 3d  Block;..    rc =
26050 20 73 71 6c 69 74 65 33 46 74 73 33 52 65 61 64   sqlite3Fts3Read
26060 42 6c 6f 63 6b 28 70 2c 20 69 42 6c 6f 63 6b 2c  Block(p, iBlock,
26070 20 26 61 42 6c 6f 63 6b 2c 20 26 6e 42 6c 6f 63   &aBlock, &nBloc
26080 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  k, 0);.    if( r
26090 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
260a0 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 54        rc = fts3T
260b0 72 75 6e 63 61 74 65 4e 6f 64 65 28 61 42 6c 6f  runcateNode(aBlo
260c0 63 6b 2c 20 6e 42 6c 6f 63 6b 2c 20 26 62 6c 6f  ck, nBlock, &blo
260d0 63 6b 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  ck, zTerm, nTerm
260e0 2c 20 26 69 42 6c 6f 63 6b 29 3b 0a 20 20 20 20  , &iBlock);.    
260f0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
26100 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26110 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65 53   rc = fts3WriteS
26120 65 67 6d 65 6e 74 28 70 2c 20 69 4e 65 77 53 74  egment(p, iNewSt
26130 61 72 74 2c 20 62 6c 6f 63 6b 2e 61 2c 20 62 6c  art, block.a, bl
26140 6f 63 6b 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  ock.n);.    }.  
26150 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
26160 42 6c 6f 63 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Block);.  }..  /
26170 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65 77 53  * Variable iNewS
26180 74 61 72 74 20 6e 6f 77 20 63 6f 6e 74 61 69 6e  tart now contain
26190 73 20 74 68 65 20 66 69 72 73 74 20 76 61 6c 69  s the first vali
261a0 64 20 6c 65 61 66 20 6e 6f 64 65 2e 20 2a 2f 0a  d leaf node. */.
261b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
261c0 5f 4f 4b 20 26 26 20 69 4e 65 77 53 74 61 72 74  _OK && iNewStart
261d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
261e0 73 74 6d 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a  stmt *pDel = 0;.
261f0 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c      rc = fts3Sql
26200 53 74 6d 74 28 70 2c 20 53 51 4c 5f 44 45 4c 45  Stmt(p, SQL_DELE
26210 54 45 5f 53 45 47 4d 45 4e 54 53 5f 52 41 4e 47  TE_SEGMENTS_RANG
26220 45 2c 20 26 70 44 65 6c 2c 20 30 29 3b 0a 20 20  E, &pDel, 0);.  
26230 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26240 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
26250 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
26260 70 44 65 6c 2c 20 31 2c 20 69 4f 6c 64 53 74 61  pDel, 1, iOldSta
26270 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rt);.      sqlit
26280 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 44  e3_bind_int64(pD
26290 65 6c 2c 20 32 2c 20 69 4e 65 77 53 74 61 72 74  el, 2, iNewStart
262a0 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  -1);.      sqlit
262b0 65 33 5f 73 74 65 70 28 70 44 65 6c 29 3b 0a 20  e3_step(pDel);. 
262c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
262d0 33 5f 72 65 73 65 74 28 70 44 65 6c 29 3b 0a 20  3_reset(pDel);. 
262e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
262f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26300 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
26310 74 20 2a 70 43 68 6f 6d 70 20 3d 20 30 3b 0a 20  t *pChomp = 0;. 
26320 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53     rc = fts3SqlS
26330 74 6d 74 28 70 2c 20 53 51 4c 5f 43 48 4f 4d 50  tmt(p, SQL_CHOMP
26340 5f 53 45 47 44 49 52 2c 20 26 70 43 68 6f 6d 70  _SEGDIR, &pChomp
26350 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
26360 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26370 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
26380 64 5f 69 6e 74 36 34 28 70 43 68 6f 6d 70 2c 20  d_int64(pChomp, 
26390 31 2c 20 69 4e 65 77 53 74 61 72 74 29 3b 0a 20  1, iNewStart);. 
263a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
263b0 64 5f 62 6c 6f 62 28 70 43 68 6f 6d 70 2c 20 32  d_blob(pChomp, 2
263c0 2c 20 72 6f 6f 74 2e 61 2c 20 72 6f 6f 74 2e 6e  , root.a, root.n
263d0 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
263e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
263f0 62 69 6e 64 5f 69 6e 74 36 34 28 70 43 68 6f 6d  bind_int64(pChom
26400 70 2c 20 33 2c 20 69 41 62 73 4c 65 76 65 6c 29  p, 3, iAbsLevel)
26410 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
26420 62 69 6e 64 5f 69 6e 74 28 70 43 68 6f 6d 70 2c  bind_int(pChomp,
26430 20 34 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 20   4, iIdx);.     
26440 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43   sqlite3_step(pC
26450 68 6f 6d 70 29 3b 0a 20 20 20 20 20 20 72 63 20  homp);.      rc 
26460 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
26470 70 43 68 6f 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  pChomp);.    }. 
26480 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   }..  sqlite3_fr
26490 65 65 28 72 6f 6f 74 2e 61 29 3b 0a 20 20 73 71  ee(root.a);.  sq
264a0 6c 69 74 65 33 5f 66 72 65 65 28 62 6c 6f 63 6b  lite3_free(block
264b0 2e 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  .a);.  return rc
264c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
264d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
264e0 65 64 20 61 66 74 65 72 20 61 6e 20 69 6e 63 72  ed after an incr
264f0 6d 65 6e 74 61 6c 2d 6d 65 72 67 65 20 6f 70 65  mental-merge ope
26500 72 61 74 69 6f 6e 20 68 61 73 20 72 75 6e 20 74  ration has run t
26510 6f 0a 2a 2a 20 6d 65 72 67 65 20 28 6f 72 20 70  o.** merge (or p
26520 61 72 74 69 61 6c 6c 79 20 6d 65 72 67 65 29 20  artially merge) 
26530 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d  two or more segm
26540 65 6e 74 73 20 66 72 6f 6d 20 61 62 73 6f 6c 75  ents from absolu
26550 74 65 20 6c 65 76 65 6c 0a 2a 2a 20 69 41 62 73  te level.** iAbs
26560 4c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 45 61 63  Level..**.** Eac
26570 68 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 20  h input segment 
26580 69 73 20 65 69 74 68 65 72 20 72 65 6d 6f 76 65  is either remove
26590 64 20 66 72 6f 6d 20 74 68 65 20 64 62 20 63 6f  d from the db co
265a0 6d 70 6c 65 74 65 6c 79 20 28 69 66 20 61 6c 6c  mpletely (if all
265b0 20 6f 66 0a 2a 2a 20 69 74 73 20 64 61 74 61 20   of.** its data 
265c0 77 61 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68  was copied to th
265d0 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  e output segment
265e0 20 62 79 20 74 68 65 20 69 6e 63 72 6d 65 72 67   by the incrmerg
265f0 65 20 6f 70 65 72 61 74 69 6f 6e 29 0a 2a 2a 20  e operation).** 
26600 6f 72 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 70  or modified in p
26610 6c 61 63 65 20 73 6f 20 74 68 61 74 20 69 74 20  lace so that it 
26620 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f 6e 74 61 69  no longer contai
26630 6e 73 20 74 68 6f 73 65 20 65 6e 74 72 69 65 73  ns those entries
26640 20 74 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65   that.** have be
26650 65 6e 20 64 75 70 6c 69 63 61 74 65 64 20 69 6e  en duplicated in
26660 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d   the output segm
26670 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
26680 6e 74 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65  nt fts3Incrmerge
26690 43 68 6f 6d 70 28 0a 20 20 46 74 73 33 54 61 62  Chomp(.  Fts3Tab
266a0 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
266b0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20           /* FTS 
266c0 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
266d0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
266e0 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 20 20  iAbsLevel,      
266f0 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65    /* Absolute le
26700 76 65 6c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73  vel containing s
26710 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73  egments */.  Fts
26720 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20  3MultiSegReader 
26730 2a 70 43 73 72 2c 20 20 20 20 20 20 20 2f 2a 20  *pCsr,       /* 
26740 43 68 6f 6d 70 20 61 6c 6c 20 73 65 67 6d 65 6e  Chomp all segmen
26750 74 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69  ts opened by thi
26760 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e  s cursor */.  in
26770 74 20 2a 70 6e 52 65 6d 20 20 20 20 20 20 20 20  t *pnRem        
26780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26790 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   Number of segme
267a0 6e 74 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 20  nts not deleted 
267b0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
267c0 20 69 6e 74 20 6e 52 65 6d 20 3d 20 30 3b 0a 20   int nRem = 0;. 
267d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
267e0 5f 4f 4b 3b 0a 0a 20 20 66 6f 72 28 69 3d 70 43  _OK;..  for(i=pC
267f0 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 2d 31 3b 20  sr->nSegment-1; 
26800 69 3e 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49  i>=0 && rc==SQLI
26810 54 45 5f 4f 4b 3b 20 69 2d 2d 29 7b 0a 20 20 20  TE_OK; i--){.   
26820 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
26830 70 53 65 67 20 3d 20 30 3b 0a 20 20 20 20 69 6e  pSeg = 0;.    in
26840 74 20 6a 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  t j;..    /* Fin
26850 64 20 74 68 65 20 46 74 73 33 53 65 67 52 65 61  d the Fts3SegRea
26860 64 65 72 20 6f 62 6a 65 63 74 20 77 69 74 68 20  der object with 
26870 46 74 73 33 53 65 67 52 65 61 64 65 72 2e 69 49  Fts3SegReader.iI
26880 64 78 3d 3d 69 2e 20 49 74 20 69 73 20 68 69 64  dx==i. It is hid
26890 69 6e 67 0a 20 20 20 20 2a 2a 20 73 6f 6d 65 77  ing.    ** somew
268a0 68 65 72 65 20 69 6e 20 74 68 65 20 70 43 73 72  here in the pCsr
268b0 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 5d 20 61 72  ->apSegment[] ar
268c0 72 61 79 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ray.  */.    for
268d0 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70  (j=0; ALWAYS(j<p
268e0 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 29 3b 20  Csr->nSegment); 
268f0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 65 67  j++){.      pSeg
26900 20 3d 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65   = pCsr->apSegme
26910 6e 74 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28  nt[j];.      if(
26920 20 70 53 65 67 2d 3e 69 49 64 78 3d 3d 69 20 29   pSeg->iIdx==i )
26930 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
26940 20 20 61 73 73 65 72 74 28 20 6a 3c 70 43 73 72    assert( j<pCsr
26950 2d 3e 6e 53 65 67 6d 65 6e 74 20 26 26 20 70 53  ->nSegment && pS
26960 65 67 2d 3e 69 49 64 78 3d 3d 69 20 29 3b 0a 0a  eg->iIdx==i );..
26970 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 61 4e      if( pSeg->aN
26980 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
26990 2f 2a 20 53 65 67 2d 72 65 61 64 65 72 20 69 73  /* Seg-reader is
269a0 20 61 74 20 45 4f 46 2e 20 52 65 6d 6f 76 65 20   at EOF. Remove 
269b0 74 68 65 20 65 6e 74 69 72 65 20 69 6e 70 75 74  the entire input
269c0 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20   segment. */.   
269d0 20 20 20 72 63 20 3d 20 66 74 73 33 44 65 6c 65     rc = fts3Dele
269e0 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 53 65  teSegment(p, pSe
269f0 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
26a00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26a10 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33         rc = fts3
26a20 52 65 6d 6f 76 65 53 65 67 64 69 72 45 6e 74 72  RemoveSegdirEntr
26a30 79 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 2c 20  y(p, iAbsLevel, 
26a40 70 53 65 67 2d 3e 69 49 64 78 29 3b 0a 20 20 20  pSeg->iIdx);.   
26a50 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 6e 52 65     }.      *pnRe
26a60 6d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  m = 0;.    }else
26a70 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  {.      /* The i
26a80 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65  ncremental merge
26a90 20 64 69 64 20 6e 6f 74 20 63 6f 70 79 20 61 6c   did not copy al
26aa0 6c 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d 20  l the data from 
26ab0 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 73  this .      ** s
26ac0 65 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 75 70  egment to the up
26ad0 70 65 72 20 6c 65 76 65 6c 2e 20 54 68 65 20 73  per level. The s
26ae0 65 67 6d 65 6e 74 20 69 73 20 6d 6f 64 69 66 69  egment is modifi
26af0 65 64 20 69 6e 20 70 6c 61 63 65 0a 20 20 20 20  ed in place.    
26b00 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20    ** so that it 
26b10 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 6b 65 79 73  contains no keys
26b20 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 7a 54   smaller than zT
26b30 65 72 6d 2f 6e 54 65 72 6d 2e 20 2a 2f 20 0a 20  erm/nTerm. */ . 
26b40 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
26b50 2a 7a 54 65 72 6d 20 3d 20 70 53 65 67 2d 3e 7a  *zTerm = pSeg->z
26b60 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Term;.      int 
26b70 6e 54 65 72 6d 20 3d 20 70 53 65 67 2d 3e 6e 54  nTerm = pSeg->nT
26b80 65 72 6d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  erm;.      rc = 
26b90 66 74 73 33 54 72 75 6e 63 61 74 65 53 65 67 6d  fts3TruncateSegm
26ba0 65 6e 74 28 70 2c 20 69 41 62 73 4c 65 76 65 6c  ent(p, iAbsLevel
26bb0 2c 20 70 53 65 67 2d 3e 69 49 64 78 2c 20 7a 54  , pSeg->iIdx, zT
26bc0 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20  erm, nTerm);.   
26bd0 20 20 20 6e 52 65 6d 2b 2b 3b 0a 20 20 20 20 7d     nRem++;.    }
26be0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
26bf0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 52 65  SQLITE_OK && nRe
26c00 6d 21 3d 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e  m!=pCsr->nSegmen
26c10 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  t ){.    rc = ft
26c20 73 33 52 65 70 61 63 6b 53 65 67 64 69 72 4c 65  s3RepackSegdirLe
26c30 76 65 6c 28 70 2c 20 69 41 62 73 4c 65 76 65 6c  vel(p, iAbsLevel
26c40 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 52 65 6d  );.  }..  *pnRem
26c50 20 3d 20 6e 52 65 6d 3b 0a 20 20 72 65 74 75 72   = nRem;.  retur
26c60 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
26c70 74 6f 72 65 20 61 6e 20 69 6e 63 72 2d 6d 65 72  tore an incr-mer
26c80 67 65 20 68 69 6e 74 20 69 6e 20 74 68 65 20 64  ge hint in the d
26c90 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
26ca0 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72 6d  ic int fts3Incrm
26cb0 65 72 67 65 48 69 6e 74 53 74 6f 72 65 28 46 74  ergeHintStore(Ft
26cc0 73 33 54 61 62 6c 65 20 2a 70 2c 20 42 6c 6f 62  s3Table *p, Blob
26cd0 20 2a 70 48 69 6e 74 29 7b 0a 20 20 73 71 6c 69   *pHint){.  sqli
26ce0 74 65 33 5f 73 74 6d 74 20 2a 70 52 65 70 6c 61  te3_stmt *pRepla
26cf0 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ce = 0;.  int rc
26d00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
26d20 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 72  urn code */..  r
26d30 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
26d40 70 2c 20 53 51 4c 5f 52 45 50 4c 41 43 45 5f 53  p, SQL_REPLACE_S
26d50 54 41 54 2c 20 26 70 52 65 70 6c 61 63 65 2c 20  TAT, &pReplace, 
26d60 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
26d70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
26d80 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
26d90 70 52 65 70 6c 61 63 65 2c 20 31 2c 20 46 54 53  pReplace, 1, FTS
26da0 5f 53 54 41 54 5f 49 4e 43 52 4d 45 52 47 45 48  _STAT_INCRMERGEH
26db0 49 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  INT);.    sqlite
26dc0 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 52 65 70  3_bind_blob(pRep
26dd0 6c 61 63 65 2c 20 32 2c 20 70 48 69 6e 74 2d 3e  lace, 2, pHint->
26de0 61 2c 20 70 48 69 6e 74 2d 3e 6e 2c 20 53 51 4c  a, pHint->n, SQL
26df0 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
26e00 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 52   sqlite3_step(pR
26e10 65 70 6c 61 63 65 29 3b 0a 20 20 20 20 72 63 20  eplace);.    rc 
26e20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
26e30 70 52 65 70 6c 61 63 65 29 3b 0a 20 20 7d 0a 0a  pReplace);.  }..
26e40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26e50 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 61 6e 20 69 6e  /*.** Load an in
26e60 63 72 2d 6d 65 72 67 65 20 68 69 6e 74 20 66 72  cr-merge hint fr
26e70 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
26e80 20 54 68 65 20 69 6e 63 72 2d 6d 65 72 67 65 20   The incr-merge 
26e90 68 69 6e 74 2c 20 69 66 20 6f 6e 65 20 0a 2a 2a  hint, if one .**
26ea0 20 65 78 69 73 74 73 2c 20 69 73 20 73 74 6f 72   exists, is stor
26eb0 65 64 20 69 6e 20 74 68 65 20 72 6f 77 69 64 3d  ed in the rowid=
26ec0 3d 31 20 72 6f 77 20 6f 66 20 74 68 65 20 25 5f  =1 row of the %_
26ed0 73 74 61 74 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  stat table..**.*
26ee0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
26ef0 20 70 6f 70 75 6c 61 74 65 20 62 6c 6f 62 20 2a   populate blob *
26f00 70 48 69 6e 74 20 77 69 74 68 20 74 68 65 20 76  pHint with the v
26f10 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
26f20 68 65 20 25 5f 73 74 61 74 0a 2a 2a 20 74 61 62  he %_stat.** tab
26f30 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  le and return SQ
26f40 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69  LITE_OK. Otherwi
26f50 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  se, if an error 
26f60 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61  occurs, return a
26f70 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72 72 6f  n.** SQLite erro
26f80 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
26f90 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72 6d 65  c int fts3Incrme
26fa0 72 67 65 48 69 6e 74 4c 6f 61 64 28 46 74 73 33  rgeHintLoad(Fts3
26fb0 54 61 62 6c 65 20 2a 70 2c 20 42 6c 6f 62 20 2a  Table *p, Blob *
26fc0 70 48 69 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65  pHint){.  sqlite
26fd0 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 20  3_stmt *pSelect 
26fe0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  = 0;.  int rc;..
26ff0 20 20 70 48 69 6e 74 2d 3e 6e 20 3d 20 30 3b 0a    pHint->n = 0;.
27000 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
27010 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54  mt(p, SQL_SELECT
27020 5f 53 54 41 54 2c 20 26 70 53 65 6c 65 63 74 2c  _STAT, &pSelect,
27030 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
27040 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27050 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 73 71 6c  int rc2;.    sql
27060 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53  ite3_bind_int(pS
27070 65 6c 65 63 74 2c 20 31 2c 20 46 54 53 5f 53 54  elect, 1, FTS_ST
27080 41 54 5f 49 4e 43 52 4d 45 52 47 45 48 49 4e 54  AT_INCRMERGEHINT
27090 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
270a0 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
270b0 74 65 70 28 70 53 65 6c 65 63 74 29 20 29 7b 0a  tep(pSelect) ){.
270c0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
270d0 20 2a 61 48 69 6e 74 20 3d 20 73 71 6c 69 74 65   *aHint = sqlite
270e0 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53  3_column_blob(pS
270f0 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20  elect, 0);.     
27100 20 69 6e 74 20 6e 48 69 6e 74 20 3d 20 73 71 6c   int nHint = sql
27110 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
27120 73 28 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  s(pSelect, 0);. 
27130 20 20 20 20 20 69 66 28 20 61 48 69 6e 74 20 29       if( aHint )
27140 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 47 72  {.        blobGr
27150 6f 77 42 75 66 66 65 72 28 70 48 69 6e 74 2c 20  owBuffer(pHint, 
27160 6e 48 69 6e 74 2c 20 26 72 63 29 3b 0a 20 20 20  nHint, &rc);.   
27170 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
27180 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27190 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 6e 74      memcpy(pHint
271a0 2d 3e 61 2c 20 61 48 69 6e 74 2c 20 6e 48 69 6e  ->a, aHint, nHin
271b0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48  t);.          pH
271c0 69 6e 74 2d 3e 6e 20 3d 20 6e 48 69 6e 74 3b 0a  int->n = nHint;.
271d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
271e0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 32 20  }.    }.    rc2 
271f0 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
27200 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69 66  pSelect);.    if
27210 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27220 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a  ) rc = rc2;.  }.
27230 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
27240 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69  ./*.** If *pRc i
27250 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20  s not SQLITE_OK 
27260 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
27270 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
27280 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
27290 4f 74 68 65 72 77 69 73 65 2c 20 61 70 70 65 6e  Otherwise, appen
272a0 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68  d an entry to th
272b0 65 20 68 69 6e 74 20 73 74 6f 72 65 64 20 69 6e  e hint stored in
272c0 20 62 6c 6f 62 20 2a 70 48 69 6e 74 2e 20 45 61   blob *pHint. Ea
272d0 63 68 20 65 6e 74 72 79 0a 2a 2a 20 63 6f 6e 73  ch entry.** cons
272e0 69 73 74 73 20 6f 66 20 74 77 6f 20 76 61 72 69  ists of two vari
272f0 6e 74 73 2c 20 74 68 65 20 61 62 73 6f 6c 75 74  nts, the absolut
27300 65 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20 6f  e level number o
27310 66 20 74 68 65 20 69 6e 70 75 74 20 73 65 67 6d  f the input segm
27320 65 6e 74 73 20 0a 2a 2a 20 61 6e 64 20 74 68 65  ents .** and the
27330 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74   number of input
27340 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a   segments..**.**
27350 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
27360 6c 65 61 76 65 20 2a 70 52 63 20 73 65 74 20 74  leave *pRc set t
27370 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  o SQLITE_OK and 
27380 72 65 74 75 72 6e 2e 20 49 66 20 61 6e 20 65 72  return. If an er
27390 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73  ror occurs,.** s
273a0 65 74 20 2a 70 52 63 20 74 6f 20 61 6e 20 53 51  et *pRc to an SQ
273b0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
273c0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
273d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
273e0 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 48 69   fts3IncrmergeHi
273f0 6e 74 50 75 73 68 28 0a 20 20 42 6c 6f 62 20 2a  ntPush(.  Blob *
27400 70 48 69 6e 74 2c 20 20 20 20 20 20 20 20 20 20  pHint,          
27410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 69 6e            /* Hin
27420 74 20 62 6c 6f 62 20 74 6f 20 61 70 70 65 6e 64  t blob to append
27430 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 69 41 62   to */.  i64 iAb
27440 73 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20  sLevel,         
27450 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
27460 74 20 76 61 72 69 6e 74 20 74 6f 20 73 74 6f 72  t varint to stor
27470 65 20 69 6e 20 68 69 6e 74 20 2a 2f 0a 20 20 69  e in hint */.  i
27480 6e 74 20 6e 49 6e 70 75 74 2c 20 20 20 20 20 20  nt nInput,      
27490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
274a0 2a 20 53 65 63 6f 6e 64 20 76 61 72 69 6e 74 20  * Second varint 
274b0 74 6f 20 73 74 6f 72 65 20 69 6e 20 68 69 6e 74  to store in hint
274c0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63 20 20   */.  int *pRc  
274d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274e0 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
274f0 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 29   Error code */.)
27500 7b 0a 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66  {.  blobGrowBuff
27510 65 72 28 70 48 69 6e 74 2c 20 70 48 69 6e 74 2d  er(pHint, pHint-
27520 3e 6e 20 2b 20 32 2a 46 54 53 33 5f 56 41 52 49  >n + 2*FTS3_VARI
27530 4e 54 5f 4d 41 58 2c 20 70 52 63 29 3b 0a 20 20  NT_MAX, pRc);.  
27540 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
27550 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 48 69 6e 74  _OK ){.    pHint
27560 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ->n += sqlite3Ft
27570 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 48 69  s3PutVarint(&pHi
27580 6e 74 2d 3e 61 5b 70 48 69 6e 74 2d 3e 6e 5d 2c  nt->a[pHint->n],
27590 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20   iAbsLevel);.   
275a0 20 70 48 69 6e 74 2d 3e 6e 20 2b 3d 20 73 71 6c   pHint->n += sql
275b0 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e  ite3Fts3PutVarin
275c0 74 28 26 70 48 69 6e 74 2d 3e 61 5b 70 48 69 6e  t(&pHint->a[pHin
275d0 74 2d 3e 6e 5d 2c 20 28 69 36 34 29 6e 49 6e 70  t->n], (i64)nInp
275e0 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ut);.  }.}../*.*
275f0 2a 20 52 65 61 64 20 74 68 65 20 6c 61 73 74 20  * Read the last 
27600 65 6e 74 72 79 20 28 6d 6f 73 74 20 72 65 63 65  entry (most rece
27610 6e 74 6c 79 20 70 75 73 68 65 64 29 20 66 72 6f  ntly pushed) fro
27620 6d 20 74 68 65 20 68 69 6e 74 20 62 6c 6f 62 20  m the hint blob 
27630 2a 70 48 69 6e 74 0a 2a 2a 20 61 6e 64 20 74 68  *pHint.** and th
27640 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 65 6e  en remove the en
27650 74 72 79 2e 20 57 72 69 74 65 20 74 68 65 20 74  try. Write the t
27660 77 6f 20 76 61 6c 75 65 73 20 72 65 61 64 20 74  wo values read t
27670 6f 20 2a 70 69 41 62 73 4c 65 76 65 6c 20 61 6e  o *piAbsLevel an
27680 64 20 0a 2a 2a 20 2a 70 6e 49 6e 70 75 74 20 62  d .** *pnInput b
27690 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
276a0 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72  .**.** If no err
276b0 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
276c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  n SQLITE_OK. If 
276d0 74 68 65 20 68 69 6e 74 20 62 6c 6f 62 20 69 6e  the hint blob in
276e0 20 2a 70 48 69 6e 74 20 64 6f 65 73 0a 2a 2a 20   *pHint does.** 
276f0 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c  not contain at l
27700 65 61 73 74 20 74 77 6f 20 76 61 6c 69 64 20 76  east two valid v
27710 61 72 69 6e 74 73 2c 20 72 65 74 75 72 6e 20 53  arints, return S
27720 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54  QLITE_CORRUPT_VT
27730 41 42 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  AB..*/.static in
27740 74 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 48  t fts3IncrmergeH
27750 69 6e 74 50 6f 70 28 42 6c 6f 62 20 2a 70 48 69  intPop(Blob *pHi
27760 6e 74 2c 20 69 36 34 20 2a 70 69 41 62 73 4c 65  nt, i64 *piAbsLe
27770 76 65 6c 2c 20 69 6e 74 20 2a 70 6e 49 6e 70 75  vel, int *pnInpu
27780 74 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  t){.  const int 
27790 6e 48 69 6e 74 20 3d 20 70 48 69 6e 74 2d 3e 6e  nHint = pHint->n
277a0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 20  ;.  int i;..  i 
277b0 3d 20 70 48 69 6e 74 2d 3e 6e 2d 32 3b 0a 20 20  = pHint->n-2;.  
277c0 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20 28 70  while( i>0 && (p
277d0 48 69 6e 74 2d 3e 61 5b 69 2d 31 5d 20 26 20 30  Hint->a[i-1] & 0
277e0 78 38 30 29 20 29 20 69 2d 2d 3b 0a 20 20 77 68  x80) ) i--;.  wh
277f0 69 6c 65 28 20 69 3e 30 20 26 26 20 28 70 48 69  ile( i>0 && (pHi
27800 6e 74 2d 3e 61 5b 69 2d 31 5d 20 26 20 30 78 38  nt->a[i-1] & 0x8
27810 30 29 20 29 20 69 2d 2d 3b 0a 0a 20 20 70 48 69  0) ) i--;..  pHi
27820 6e 74 2d 3e 6e 20 3d 20 69 3b 0a 20 20 69 20 2b  nt->n = i;.  i +
27830 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74  = sqlite3Fts3Get
27840 56 61 72 69 6e 74 28 26 70 48 69 6e 74 2d 3e 61  Varint(&pHint->a
27850 5b 69 5d 2c 20 70 69 41 62 73 4c 65 76 65 6c 29  [i], piAbsLevel)
27860 3b 0a 20 20 69 20 2b 3d 20 66 74 73 33 47 65 74  ;.  i += fts3Get
27870 56 61 72 69 6e 74 33 32 28 26 70 48 69 6e 74 2d  Varint32(&pHint-
27880 3e 61 5b 69 5d 2c 20 70 6e 49 6e 70 75 74 29 3b  >a[i], pnInput);
27890 0a 20 20 69 66 28 20 69 21 3d 6e 48 69 6e 74 20  .  if( i!=nHint 
278a0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
278b0 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 0a 20  CORRUPT_VTAB;.. 
278c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
278d0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  K;.}.../*.** Att
278e0 65 6d 70 74 20 61 6e 20 69 6e 63 72 65 6d 65 6e  empt an incremen
278f0 74 61 6c 20 6d 65 72 67 65 20 74 68 61 74 20 77  tal merge that w
27900 72 69 74 65 73 20 6e 4d 65 72 67 65 20 6c 65 61  rites nMerge lea
27910 66 20 62 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  f blocks..**.** 
27920 49 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67  Incremental merg
27930 65 73 20 68 61 70 70 65 6e 20 6e 4d 69 6e 20 73  es happen nMin s
27940 65 67 6d 65 6e 74 73 20 61 74 20 61 20 74 69 6d  egments at a tim
27950 65 2e 20 54 68 65 20 73 65 67 6d 65 6e 74 73 20  e. The segments 
27960 0a 2a 2a 20 74 6f 20 62 65 20 6d 65 72 67 65 64  .** to be merged
27970 20 61 72 65 20 74 68 65 20 6e 4d 69 6e 20 6f 6c   are the nMin ol
27980 64 65 73 74 20 73 65 67 6d 65 6e 74 73 20 28 74  dest segments (t
27990 68 65 20 6f 6e 65 73 20 77 69 74 68 20 74 68 65  he ones with the
279a0 20 73 6d 61 6c 6c 65 73 74 20 0a 2a 2a 20 76 61   smallest .** va
279b0 6c 75 65 73 20 66 6f 72 20 74 68 65 20 5f 73 65  lues for the _se
279c0 67 64 69 72 2e 69 64 78 20 66 69 65 6c 64 29 20  gdir.idx field) 
279d0 69 6e 20 74 68 65 20 68 69 67 68 65 73 74 20 6c  in the highest l
279e0 65 76 65 6c 20 74 68 61 74 20 63 6f 6e 74 61 69  evel that contai
279f0 6e 73 20 0a 2a 2a 20 61 74 20 6c 65 61 73 74 20  ns .** at least 
27a00 6e 4d 69 6e 20 73 65 67 6d 65 6e 74 73 2e 20 4d  nMin segments. M
27a10 75 6c 74 69 70 6c 65 20 6d 65 72 67 65 73 20 6d  ultiple merges m
27a20 69 67 68 74 20 6f 63 63 75 72 20 69 6e 20 61 6e  ight occur in an
27a30 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20   attempt to .** 
27a40 77 72 69 74 65 20 74 68 65 20 71 75 6f 74 61 20  write the quota 
27a50 6f 66 20 6e 4d 65 72 67 65 20 6c 65 61 66 20 62  of nMerge leaf b
27a60 6c 6f 63 6b 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  locks..*/.int sq
27a70 6c 69 74 65 33 46 74 73 33 49 6e 63 72 6d 65 72  lite3Fts3Incrmer
27a80 67 65 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  ge(Fts3Table *p,
27a90 20 69 6e 74 20 6e 4d 65 72 67 65 2c 20 69 6e 74   int nMerge, int
27aa0 20 6e 4d 69 6e 29 7b 0a 20 20 69 6e 74 20 72 63   nMin){.  int rc
27ab0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
27ad0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
27ae0 74 20 6e 52 65 6d 20 3d 20 6e 4d 65 72 67 65 3b  t nRem = nMerge;
27af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27b00 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   Number of leaf 
27b10 70 61 67 65 73 20 79 65 74 20 74 6f 20 20 62 65  pages yet to  be
27b20 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 46 74   written */.  Ft
27b30 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
27b40 20 2a 70 43 73 72 3b 20 20 20 20 20 20 20 2f 2a   *pCsr;       /*
27b50 20 43 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20   Cursor used to 
27b60 72 65 61 64 20 69 6e 70 75 74 20 64 61 74 61 20  read input data 
27b70 2a 2f 0a 20 20 46 74 73 33 53 65 67 46 69 6c 74  */.  Fts3SegFilt
27b80 65 72 20 2a 70 46 69 6c 74 65 72 3b 20 20 20 20  er *pFilter;    
27b90 20 20 20 20 20 2f 2a 20 46 69 6c 74 65 72 20 75       /* Filter u
27ba0 73 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  sed with cursor 
27bb0 70 43 73 72 20 2a 2f 0a 20 20 49 6e 63 72 6d 65  pCsr */.  Incrme
27bc0 72 67 65 57 72 69 74 65 72 20 2a 70 57 72 69 74  rgeWriter *pWrit
27bd0 65 72 3b 20 20 20 20 20 20 20 2f 2a 20 57 72 69  er;       /* Wri
27be0 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
27bf0 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b 20 20 20  int nSeg = 0;   
27c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c10 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70  /* Number of inp
27c20 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  ut segments */. 
27c30 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
27c40 41 62 73 4c 65 76 65 6c 20 3d 20 30 3b 20 20 20  AbsLevel = 0;   
27c50 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65 76   /* Absolute lev
27c60 65 6c 20 6e 75 6d 62 65 72 20 74 6f 20 77 6f 72  el number to wor
27c70 6b 20 6f 6e 20 2a 2f 0a 20 20 42 6c 6f 62 20 68  k on */.  Blob h
27c80 69 6e 74 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b  int = {0, 0, 0};
27c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 69 6e            /* Hin
27ca0 74 20 72 65 61 64 20 66 72 6f 6d 20 25 5f 73 74  t read from %_st
27cb0 61 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  at table */.  in
27cc0 74 20 62 44 69 72 74 79 48 69 6e 74 20 3d 20 30  t bDirtyHint = 0
27cd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
27ce0 20 54 72 75 65 20 69 66 20 62 6c 6f 62 20 27 68   True if blob 'h
27cf0 69 6e 74 27 20 68 61 73 20 62 65 65 6e 20 6d 6f  int' has been mo
27d00 64 69 66 69 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  dified */..  /* 
27d10 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
27d20 6f 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20 66  or the cursor, f
27d30 69 6c 74 65 72 20 61 6e 64 20 77 72 69 74 65 72  ilter and writer
27d40 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 63 6f   objects */.  co
27d50 6e 73 74 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d  nst int nAlloc =
27d60 20 73 69 7a 65 6f 66 28 2a 70 43 73 72 29 20 2b   sizeof(*pCsr) +
27d70 20 73 69 7a 65 6f 66 28 2a 70 46 69 6c 74 65 72   sizeof(*pFilter
27d80 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 57 72 69  ) + sizeof(*pWri
27d90 74 65 72 29 3b 0a 20 20 70 57 72 69 74 65 72 20  ter);.  pWriter 
27da0 3d 20 28 49 6e 63 72 6d 65 72 67 65 57 72 69 74  = (IncrmergeWrit
27db0 65 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  er *)sqlite3_mal
27dc0 6c 6f 63 28 6e 41 6c 6c 6f 63 29 3b 0a 20 20 69  loc(nAlloc);.  i
27dd0 66 28 20 21 70 57 72 69 74 65 72 20 29 20 72 65  f( !pWriter ) re
27de0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
27df0 4d 3b 0a 20 20 70 46 69 6c 74 65 72 20 3d 20 28  M;.  pFilter = (
27e00 46 74 73 33 53 65 67 46 69 6c 74 65 72 20 2a 29  Fts3SegFilter *)
27e10 26 70 57 72 69 74 65 72 5b 31 5d 3b 0a 20 20 70  &pWriter[1];.  p
27e20 43 73 72 20 3d 20 28 46 74 73 33 4d 75 6c 74 69  Csr = (Fts3Multi
27e30 53 65 67 52 65 61 64 65 72 20 2a 29 26 70 46 69  SegReader *)&pFi
27e40 6c 74 65 72 5b 31 5d 3b 0a 0a 20 20 72 63 20 3d  lter[1];..  rc =
27e50 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 48 69   fts3IncrmergeHi
27e60 6e 74 4c 6f 61 64 28 70 2c 20 26 68 69 6e 74 29  ntLoad(p, &hint)
27e70 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
27e80 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 52 65 6d  QLITE_OK && nRem
27e90 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  >0 ){.    const 
27ea0 69 36 34 20 6e 4d 6f 64 20 3d 20 46 54 53 33 5f  i64 nMod = FTS3_
27eb0 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 20  SEGDIR_MAXLEVEL 
27ec0 2a 20 70 2d 3e 6e 49 6e 64 65 78 3b 0a 20 20 20  * p->nIndex;.   
27ed0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
27ee0 46 69 6e 64 4c 65 76 65 6c 20 3d 20 30 3b 20 2f  FindLevel = 0; /
27ef0 2a 20 53 51 4c 20 75 73 65 64 20 74 6f 20 64 65  * SQL used to de
27f00 74 65 72 6d 69 6e 65 20 69 41 62 73 4c 65 76 65  termine iAbsLeve
27f10 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 55 73  l */.    int bUs
27f20 65 48 69 6e 74 20 3d 20 30 3b 20 20 20 20 20 20  eHint = 0;      
27f30 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
27f40 66 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  f attempting to 
27f50 61 70 70 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e  append */.    in
27f60 74 20 69 49 64 78 20 3d 20 30 3b 20 20 20 20 20  t iIdx = 0;     
27f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
27f80 61 72 67 65 73 74 20 69 64 78 20 69 6e 20 6c 65  argest idx in le
27f90 76 65 6c 20 28 69 41 62 73 4c 65 76 65 6c 2b 31  vel (iAbsLevel+1
27fa0 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61  ) */..    /* Sea
27fb0 72 63 68 20 74 68 65 20 25 5f 73 65 67 64 69 72  rch the %_segdir
27fc0 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 61   table for the a
27fd0 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 77 69  bsolute level wi
27fe0 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 0a  th the smallest.
27ff0 20 20 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20      ** relative 
28000 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20 74 68 61  level number tha
28010 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65  t contains at le
28020 61 73 74 20 6e 4d 69 6e 20 73 65 67 6d 65 6e 74  ast nMin segment
28030 73 2c 20 69 66 20 61 6e 79 2e 0a 20 20 20 20 2a  s, if any..    *
28040 2a 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e  * If one is foun
28050 64 2c 20 73 65 74 20 69 41 62 73 4c 65 76 65 6c  d, set iAbsLevel
28060 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65   to the absolute
28070 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20 61 6e   level number an
28080 64 0a 20 20 20 20 2a 2a 20 6e 53 65 67 20 74 6f  d.    ** nSeg to
28090 20 6e 4d 69 6e 2e 20 49 66 20 6e 6f 20 6c 65 76   nMin. If no lev
280a0 65 6c 20 77 69 74 68 20 61 74 20 6c 65 61 73 74  el with at least
280b0 20 6e 4d 69 6e 20 73 65 67 6d 65 6e 74 73 20 63   nMin segments c
280c0 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 0a 20 20  an be found, .  
280d0 20 20 2a 2a 20 73 65 74 20 6e 53 65 67 20 74 6f    ** set nSeg to
280e0 20 2d 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   -1..    */.    
280f0 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
28100 28 70 2c 20 53 51 4c 5f 46 49 4e 44 5f 4d 45 52  (p, SQL_FIND_MER
28110 47 45 5f 4c 45 56 45 4c 2c 20 26 70 46 69 6e 64  GE_LEVEL, &pFind
28120 4c 65 76 65 6c 2c 20 30 29 3b 0a 20 20 20 20 73  Level, 0);.    s
28130 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
28140 70 46 69 6e 64 4c 65 76 65 6c 2c 20 31 2c 20 6e  pFindLevel, 1, n
28150 4d 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 73 71  Min);.    if( sq
28160 6c 69 74 65 33 5f 73 74 65 70 28 70 46 69 6e 64  lite3_step(pFind
28170 4c 65 76 65 6c 29 3d 3d 53 51 4c 49 54 45 5f 52  Level)==SQLITE_R
28180 4f 57 20 29 7b 0a 20 20 20 20 20 20 69 41 62 73  OW ){.      iAbs
28190 4c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 5f  Level = sqlite3_
281a0 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 46 69  column_int64(pFi
281b0 6e 64 4c 65 76 65 6c 2c 20 30 29 3b 0a 20 20 20  ndLevel, 0);.   
281c0 20 20 20 6e 53 65 67 20 3d 20 6e 4d 69 6e 3b 0a     nSeg = nMin;.
281d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
281e0 20 6e 53 65 67 20 3d 20 2d 31 3b 0a 20 20 20 20   nSeg = -1;.    
281f0 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
28200 65 33 5f 72 65 73 65 74 28 70 46 69 6e 64 4c 65  e3_reset(pFindLe
28210 76 65 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  vel);..    /* If
28220 20 74 68 65 20 68 69 6e 74 20 72 65 61 64 20 66   the hint read f
28230 72 6f 6d 20 74 68 65 20 25 5f 73 74 61 74 20 74  rom the %_stat t
28240 61 62 6c 65 20 69 73 20 6e 6f 74 20 65 6d 70 74  able is not empt
28250 79 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 0a  y, check if the.
28260 20 20 20 20 2a 2a 20 6c 61 73 74 20 65 6e 74 72      ** last entr
28270 79 20 69 6e 20 69 74 20 73 70 65 63 69 66 69 65  y in it specifie
28280 73 20 61 20 72 65 6c 61 74 69 76 65 20 6c 65 76  s a relative lev
28290 65 6c 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  el smaller than 
282a0 6f 72 20 65 71 75 61 6c 0a 20 20 20 20 2a 2a 20  or equal.    ** 
282b0 74 6f 20 74 68 65 20 6c 65 76 65 6c 20 69 64 65  to the level ide
282c0 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 62  ntified by the b
282d0 6c 6f 63 6b 20 61 62 6f 76 65 20 28 69 66 20 61  lock above (if a
282e0 6e 79 29 2e 20 49 66 20 73 6f 2c 20 74 68 69 73  ny). If so, this
282f0 20 0a 20 20 20 20 2a 2a 20 69 74 65 72 61 74 69   .    ** iterati
28300 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77  on of the loop w
28310 69 6c 6c 20 77 6f 72 6b 20 6f 6e 20 6d 65 72 67  ill work on merg
28320 69 6e 67 20 61 74 20 74 68 65 20 68 69 6e 74 65  ing at the hinte
28330 64 20 6c 65 76 65 6c 2e 0a 20 20 20 20 2a 2f 0a  d level..    */.
28340 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28350 54 45 5f 4f 4b 20 26 26 20 68 69 6e 74 2e 6e 20  TE_OK && hint.n 
28360 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 48 69  ){.      int nHi
28370 6e 74 20 3d 20 68 69 6e 74 2e 6e 3b 0a 20 20 20  nt = hint.n;.   
28380 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
28390 20 69 48 69 6e 74 41 62 73 4c 65 76 65 6c 20 3d   iHintAbsLevel =
283a0 20 30 3b 20 20 20 20 20 20 2f 2a 20 48 69 6e 74   0;      /* Hint
283b0 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 20 20   level */.      
283c0 69 6e 74 20 6e 48 69 6e 74 53 65 67 20 3d 20 30  int nHintSeg = 0
283d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
283e0 20 20 20 20 20 20 2f 2a 20 48 69 6e 74 20 6e 75        /* Hint nu
283f0 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73  mber of segments
28400 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20   */..      rc = 
28410 66 74 73 33 49 6e 63 72 6d 65 72 67 65 48 69 6e  fts3IncrmergeHin
28420 74 50 6f 70 28 26 68 69 6e 74 2c 20 26 69 48 69  tPop(&hint, &iHi
28430 6e 74 41 62 73 4c 65 76 65 6c 2c 20 26 6e 48 69  ntAbsLevel, &nHi
28440 6e 74 53 65 67 29 3b 0a 20 20 20 20 20 20 69 66  ntSeg);.      if
28450 28 20 6e 53 65 67 3c 30 20 7c 7c 20 28 69 41 62  ( nSeg<0 || (iAb
28460 73 4c 65 76 65 6c 20 25 20 6e 4d 6f 64 29 20 3e  sLevel % nMod) >
28470 3d 20 28 69 48 69 6e 74 41 62 73 4c 65 76 65 6c  = (iHintAbsLevel
28480 20 25 20 6e 4d 6f 64 29 20 29 7b 0a 20 20 20 20   % nMod) ){.    
28490 20 20 20 20 69 41 62 73 4c 65 76 65 6c 20 3d 20      iAbsLevel = 
284a0 69 48 69 6e 74 41 62 73 4c 65 76 65 6c 3b 0a 20  iHintAbsLevel;. 
284b0 20 20 20 20 20 20 20 6e 53 65 67 20 3d 20 6e 48         nSeg = nH
284c0 69 6e 74 53 65 67 3b 0a 20 20 20 20 20 20 20 20  intSeg;.        
284d0 62 55 73 65 48 69 6e 74 20 3d 20 31 3b 0a 20 20  bUseHint = 1;.  
284e0 20 20 20 20 20 20 62 44 69 72 74 79 48 69 6e 74        bDirtyHint
284f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
28500 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
28510 69 73 20 75 6e 64 6f 65 73 20 74 68 65 20 65 66  is undoes the ef
28520 66 65 63 74 20 6f 66 20 74 68 65 20 48 69 6e 74  fect of the Hint
28530 50 6f 70 28 29 20 61 62 6f 76 65 20 2d 20 73 6f  Pop() above - so
28540 20 74 68 61 74 20 6e 6f 20 65 6e 74 72 79 0a 20   that no entry. 
28550 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 6d         ** is rem
28560 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 68 69  oved from the hi
28570 6e 74 20 62 6c 6f 62 2e 20 20 2a 2f 0a 20 20 20  nt blob.  */.   
28580 20 20 20 20 20 68 69 6e 74 2e 6e 20 3d 20 6e 48       hint.n = nH
28590 69 6e 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  int;.      }.   
285a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 53   }..    /* If nS
285b0 65 67 20 69 73 20 6c 65 73 73 20 74 68 61 74 20  eg is less that 
285c0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 72 65  zero, then there
285d0 20 69 73 20 6e 6f 20 6c 65 76 65 6c 20 77 69 74   is no level wit
285e0 68 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 2a  h at least.    *
285f0 2a 20 6e 4d 69 6e 20 73 65 67 6d 65 6e 74 73 20  * nMin segments 
28600 61 6e 64 20 6e 6f 20 68 69 6e 74 20 69 6e 20 74  and no hint in t
28610 68 65 20 25 5f 73 74 61 74 20 74 61 62 6c 65 2e  he %_stat table.
28620 20 4e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 2e 0a   No work to do..
28630 20 20 20 20 2a 2a 20 45 78 69 74 20 65 61 72 6c      ** Exit earl
28640 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  y in this case. 
28650 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53 65 67   */.    if( nSeg
28660 3c 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  <0 ) break;..   
28670 20 2f 2a 20 4f 70 65 6e 20 61 20 63 75 72 73 6f   /* Open a curso
28680 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  r to iterate thr
28690 6f 75 67 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  ough the content
286a0 73 20 6f 66 20 74 68 65 20 6f 6c 64 65 73 74 20  s of the oldest 
286b0 6e 53 65 67 20 0a 20 20 20 20 2a 2a 20 69 6e 64  nSeg .    ** ind
286c0 65 78 65 73 20 6f 66 20 61 62 73 6f 6c 75 74 65  exes of absolute
286d0 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c   level iAbsLevel
286e0 2e 20 49 66 20 74 68 69 73 20 63 75 72 73 6f 72  . If this cursor
286f0 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67   is opened using
28700 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 27 68 69   .    ** the 'hi
28710 6e 74 27 20 70 61 72 61 6d 65 74 65 72 73 2c 20  nt' parameters, 
28720 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
28730 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6c 65  hat there are le
28740 73 73 20 74 68 61 6e 20 6e 53 65 67 0a 20 20 20  ss than nSeg.   
28750 20 2a 2a 20 73 65 67 6d 65 6e 74 73 20 61 76 61   ** segments ava
28760 69 6c 61 62 6c 65 20 69 6e 20 6c 65 76 65 6c 20  ilable in level 
28770 69 41 62 73 4c 65 76 65 6c 2e 20 49 6e 20 74 68  iAbsLevel. In th
28780 69 73 20 63 61 73 65 2c 20 6e 6f 20 77 6f 72 6b  is case, no work
28790 20 69 73 0a 20 20 20 20 2a 2a 20 64 6f 6e 65 20   is.    ** done 
287a0 6f 6e 20 69 41 62 73 4c 65 76 65 6c 20 2d 20 66  on iAbsLevel - f
287b0 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74  all through to t
287c0 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
287d0 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 0a 20  n of the loop . 
287e0 20 20 20 2a 2a 20 74 6f 20 73 74 61 72 74 20 77     ** to start w
287f0 6f 72 6b 20 6f 6e 20 73 6f 6d 65 20 6f 74 68 65  ork on some othe
28800 72 20 6c 65 76 65 6c 2e 20 20 2a 2f 0a 20 20 20  r level.  */.   
28810 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65 72 2c   memset(pWriter,
28820 20 30 2c 20 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20   0, nAlloc);.   
28830 20 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20   pFilter->flags 
28840 3d 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 52  = FTS3_SEGMENT_R
28850 45 51 55 49 52 45 5f 50 4f 53 3b 0a 0a 20 20 20  EQUIRE_POS;..   
28860 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28870 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
28880 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 4f 75   fts3IncrmergeOu
28890 74 70 75 74 49 64 78 28 70 2c 20 69 41 62 73 4c  tputIdx(p, iAbsL
288a0 65 76 65 6c 2c 20 26 69 49 64 78 29 3b 0a 20 20  evel, &iIdx);.  
288b0 20 20 20 20 61 73 73 65 72 74 28 20 62 55 73 65      assert( bUse
288c0 48 69 6e 74 3d 3d 31 20 7c 7c 20 62 55 73 65 48  Hint==1 || bUseH
288d0 69 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  int==0 );.      
288e0 69 66 28 20 69 49 64 78 3d 3d 30 20 7c 7c 20 28  if( iIdx==0 || (
288f0 62 55 73 65 48 69 6e 74 20 26 26 20 69 49 64 78  bUseHint && iIdx
28900 3d 3d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ==1) ){.        
28910 69 6e 74 20 62 49 67 6e 6f 72 65 20 3d 20 30 3b  int bIgnore = 0;
28920 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74  .        rc = ft
28930 73 33 53 65 67 6d 65 6e 74 49 73 4d 61 78 4c 65  s3SegmentIsMaxLe
28940 76 65 6c 28 70 2c 20 69 41 62 73 4c 65 76 65 6c  vel(p, iAbsLevel
28950 2b 31 2c 20 26 62 49 67 6e 6f 72 65 29 3b 0a 20  +1, &bIgnore);. 
28960 20 20 20 20 20 20 20 69 66 28 20 62 49 67 6e 6f         if( bIgno
28970 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  re ){.          
28980 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 7c  pFilter->flags |
28990 3d 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 49  = FTS3_SEGMENT_I
289a0 47 4e 4f 52 45 5f 45 4d 50 54 59 3b 0a 20 20 20  GNORE_EMPTY;.   
289b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
289c0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
289d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
289e0 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e       rc = fts3In
289f0 63 72 6d 65 72 67 65 43 73 72 28 70 2c 20 69 41  crmergeCsr(p, iA
28a00 62 73 4c 65 76 65 6c 2c 20 6e 53 65 67 2c 20 70  bsLevel, nSeg, p
28a10 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Csr);.    }.    
28a20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72  if( SQLITE_OK==r
28a30 63 20 26 26 20 70 43 73 72 2d 3e 6e 53 65 67 6d  c && pCsr->nSegm
28a40 65 6e 74 3d 3d 6e 53 65 67 0a 20 20 20 20 20 26  ent==nSeg.     &
28a50 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  & SQLITE_OK==(rc
28a60 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53 65   = sqlite3Fts3Se
28a70 67 52 65 61 64 65 72 53 74 61 72 74 28 70 2c 20  gReaderStart(p, 
28a80 70 43 73 72 2c 20 70 46 69 6c 74 65 72 29 29 0a  pCsr, pFilter)).
28a90 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 52       && SQLITE_R
28aa0 4f 57 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OW==(rc = sqlite
28ab0 33 46 74 73 33 53 65 67 52 65 61 64 65 72 53 74  3Fts3SegReaderSt
28ac0 65 70 28 70 2c 20 70 43 73 72 29 29 0a 20 20 20  ep(p, pCsr)).   
28ad0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 55   ){.      if( bU
28ae0 73 65 48 69 6e 74 20 26 26 20 69 49 64 78 3e 30  seHint && iIdx>0
28af0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
28b00 74 20 63 68 61 72 20 2a 7a 4b 65 79 20 3d 20 70  t char *zKey = p
28b10 43 73 72 2d 3e 7a 54 65 72 6d 3b 0a 20 20 20 20  Csr->zTerm;.    
28b20 20 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70      int nKey = p
28b30 43 73 72 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20  Csr->nTerm;.    
28b40 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63      rc = fts3Inc
28b50 72 6d 65 72 67 65 4c 6f 61 64 28 70 2c 20 69 41  rmergeLoad(p, iA
28b60 62 73 4c 65 76 65 6c 2c 20 69 49 64 78 2d 31 2c  bsLevel, iIdx-1,
28b70 20 7a 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 57 72   zKey, nKey, pWr
28b80 69 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  iter);.      }el
28b90 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
28ba0 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 57 72   fts3IncrmergeWr
28bb0 69 74 65 72 28 70 2c 20 69 41 62 73 4c 65 76 65  iter(p, iAbsLeve
28bc0 6c 2c 20 69 49 64 78 2c 20 70 43 73 72 2c 20 70  l, iIdx, pCsr, p
28bd0 57 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 7d  Writer);.      }
28be0 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ..      if( rc==
28bf0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 57 72  SQLITE_OK && pWr
28c00 69 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74 20 29  iter->nLeafEst )
28c10 7b 0a 20 20 20 20 20 20 20 20 66 74 73 33 4c 6f  {.        fts3Lo
28c20 67 4d 65 72 67 65 28 6e 53 65 67 2c 20 69 41 62  gMerge(nSeg, iAb
28c30 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 20  sLevel);.       
28c40 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 20 20   do {.          
28c50 72 63 20 3d 20 66 74 73 33 49 6e 63 72 6d 65 72  rc = fts3Incrmer
28c60 67 65 41 70 70 65 6e 64 28 70 2c 20 70 57 72 69  geAppend(p, pWri
28c70 74 65 72 2c 20 70 43 73 72 29 3b 0a 20 20 20 20  ter, pCsr);.    
28c80 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
28c90 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73  LITE_OK ) rc = s
28ca0 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61  qlite3Fts3SegRea
28cb0 64 65 72 53 74 65 70 28 70 2c 20 70 43 73 72 29  derStep(p, pCsr)
28cc0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
28cd0 70 57 72 69 74 65 72 2d 3e 6e 57 6f 72 6b 3e 3d  pWriter->nWork>=
28ce0 6e 52 65 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49  nRem && rc==SQLI
28cf0 54 45 5f 52 4f 57 20 29 20 72 63 20 3d 20 53 51  TE_ROW ) rc = SQ
28d00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
28d10 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
28d20 49 54 45 5f 52 4f 57 20 29 3b 0a 0a 20 20 20 20  ITE_ROW );..    
28d30 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 6f 72      /* Update or
28d40 20 64 65 6c 65 74 65 20 74 68 65 20 69 6e 70 75   delete the inpu
28d50 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  t segments */.  
28d60 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
28d70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28d80 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20 28 31 20       nRem -= (1 
28d90 2b 20 70 57 72 69 74 65 72 2d 3e 6e 57 6f 72 6b  + pWriter->nWork
28da0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
28db0 3d 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 43  = fts3IncrmergeC
28dc0 68 6f 6d 70 28 70 2c 20 69 41 62 73 4c 65 76 65  homp(p, iAbsLeve
28dd0 6c 2c 20 70 43 73 72 2c 20 26 6e 53 65 67 29 3b  l, pCsr, &nSeg);
28de0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
28df0 53 65 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Seg!=0 ){.      
28e00 20 20 20 20 20 20 62 44 69 72 74 79 48 69 6e 74        bDirtyHint
28e10 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
28e20 20 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 48    fts3IncrmergeH
28e30 69 6e 74 50 75 73 68 28 26 68 69 6e 74 2c 20 69  intPush(&hint, i
28e40 41 62 73 4c 65 76 65 6c 2c 20 6e 53 65 67 2c 20  AbsLevel, nSeg, 
28e50 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  &rc);.          
28e60 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
28e70 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6e    }..      if( n
28e80 53 65 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Seg!=0 ){.      
28e90 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66    pWriter->nLeaf
28ea0 44 61 74 61 20 3d 20 70 57 72 69 74 65 72 2d 3e  Data = pWriter->
28eb0 6e 4c 65 61 66 44 61 74 61 20 2a 20 2d 31 3b 0a  nLeafData * -1;.
28ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
28ed0 73 33 49 6e 63 72 6d 65 72 67 65 52 65 6c 65 61  s3IncrmergeRelea
28ee0 73 65 28 70 2c 20 70 57 72 69 74 65 72 2c 20 26  se(p, pWriter, &
28ef0 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  rc);.      if( n
28f00 53 65 67 3d 3d 30 20 26 26 20 70 57 72 69 74 65  Seg==0 && pWrite
28f10 72 2d 3e 62 4e 6f 4c 65 61 66 44 61 74 61 3d 3d  r->bNoLeafData==
28f20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  0 ){.        fts
28f30 33 50 72 6f 6d 6f 74 65 53 65 67 6d 65 6e 74 73  3PromoteSegments
28f40 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 2b 31 2c  (p, iAbsLevel+1,
28f50 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44   pWriter->nLeafD
28f60 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ata);.      }.  
28f70 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
28f80 46 74 73 33 53 65 67 52 65 61 64 65 72 46 69 6e  Fts3SegReaderFin
28f90 69 73 68 28 70 43 73 72 29 3b 0a 20 20 7d 0a 0a  ish(pCsr);.  }..
28fa0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 68    /* Write the h
28fb0 69 6e 74 20 76 61 6c 75 65 73 20 69 6e 74 6f 20  int values into 
28fc0 74 68 65 20 25 5f 73 74 61 74 20 74 61 62 6c 65  the %_stat table
28fd0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 69 6e   for the next in
28fe0 63 72 2d 6d 65 72 67 65 72 20 2a 2f 0a 20 20 69  cr-merger */.  i
28ff0 66 28 20 62 44 69 72 74 79 48 69 6e 74 20 26 26  f( bDirtyHint &&
29000 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29010 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 49  {.    rc = fts3I
29020 6e 63 72 6d 65 72 67 65 48 69 6e 74 53 74 6f 72  ncrmergeHintStor
29030 65 28 70 2c 20 26 68 69 6e 74 29 3b 0a 20 20 7d  e(p, &hint);.  }
29040 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
29050 28 70 57 72 69 74 65 72 29 3b 0a 20 20 73 71 6c  (pWriter);.  sql
29060 69 74 65 33 5f 66 72 65 65 28 68 69 6e 74 2e 61  ite3_free(hint.a
29070 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
29080 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
29090 20 74 68 65 20 74 65 78 74 20 62 65 67 69 6e 6e   the text beginn
290a0 69 6e 67 20 61 74 20 2a 70 7a 20 69 6e 74 6f 20  ing at *pz into 
290b0 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 20 72  an integer and r
290c0 65 74 75 72 6e 0a 2a 2a 20 69 74 73 20 76 61 6c  eturn.** its val
290d0 75 65 2e 20 20 41 64 76 61 6e 63 65 20 2a 70 7a  ue.  Advance *pz
290e0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
290f0 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72   first character
29100 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 69 6e 74   past.** the int
29110 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eger..*/.static 
29120 69 6e 74 20 66 74 73 33 47 65 74 69 6e 74 28 63  int fts3Getint(c
29130 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 29 7b  onst char **pz){
29140 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
29150 20 3d 20 2a 70 7a 3b 0a 20 20 69 6e 74 20 69 20   = *pz;.  int i 
29160 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a  = 0;.  while( (*
29170 7a 29 3e 3d 27 30 27 20 26 26 20 28 2a 7a 29 3c  z)>='0' && (*z)<
29180 3d 27 39 27 20 29 20 69 20 3d 20 31 30 2a 69 20  ='9' ) i = 10*i 
29190 2b 20 2a 28 7a 2b 2b 29 20 2d 20 27 30 27 3b 0a  + *(z++) - '0';.
291a0 20 20 2a 70 7a 20 3d 20 7a 3b 0a 20 20 72 65 74    *pz = z;.  ret
291b0 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn i;.}../*.** 
291c0 50 72 6f 63 65 73 73 20 73 74 61 74 65 6d 65 6e  Process statemen
291d0 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  ts of the form:.
291e0 2a 2a 0a 2a 2a 20 20 20 20 49 4e 53 45 52 54 20  **.**    INSERT 
291f0 49 4e 54 4f 20 74 61 62 6c 65 28 74 61 62 6c 65  INTO table(table
29200 29 20 56 41 4c 55 45 53 28 27 6d 65 72 67 65 3d  ) VALUES('merge=
29210 41 2c 42 27 29 3b 0a 2a 2a 0a 2a 2a 20 41 20 61  A,B');.**.** A a
29220 6e 64 20 42 20 61 72 65 20 69 6e 74 65 67 65 72  nd B are integer
29230 73 20 74 68 61 74 20 64 65 63 6f 64 65 20 74 6f  s that decode to
29240 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
29250 66 20 6c 65 61 66 20 70 61 67 65 73 0a 2a 2a 20  f leaf pages.** 
29260 77 72 69 74 74 65 6e 20 66 6f 72 20 74 68 65 20  written for the 
29270 6d 65 72 67 65 2c 20 61 6e 64 20 74 68 65 20 6d  merge, and the m
29280 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  inimum number of
29290 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 61 20 6c   segments on a l
292a0 65 76 65 6c 0a 2a 2a 20 62 65 66 6f 72 65 20 69  evel.** before i
292b0 74 20 77 69 6c 6c 20 62 65 20 73 65 6c 65 63 74  t will be select
292c0 65 64 20 66 6f 72 20 61 20 6d 65 72 67 65 2c 20  ed for a merge, 
292d0 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2f  respectively..*/
292e0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
292f0 44 6f 49 6e 63 72 6d 65 72 67 65 28 0a 20 20 46  DoIncrmerge(.  F
29300 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
29310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29320 2a 20 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e  * FTS3 table han
29330 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dle */.  const c
29340 68 61 72 20 2a 7a 50 61 72 61 6d 20 20 20 20 20  har *zParam     
29350 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d           /* Nul-
29360 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
29370 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 22 41 2c  g containing "A,
29380 42 22 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  B" */.){.  int r
29390 63 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20  c;.  int nMin = 
293a0 28 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e  (FTS3_MERGE_COUN
293b0 54 20 2f 20 32 29 3b 0a 20 20 69 6e 74 20 6e 4d  T / 2);.  int nM
293c0 65 72 67 65 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  erge = 0;.  cons
293d0 74 20 63 68 61 72 20 2a 7a 20 3d 20 7a 50 61 72  t char *z = zPar
293e0 61 6d 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74  am;..  /* Read t
293f0 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72  he first integer
29400 20 76 61 6c 75 65 20 2a 2f 0a 20 20 6e 4d 65 72   value */.  nMer
29410 67 65 20 3d 20 66 74 73 33 47 65 74 69 6e 74 28  ge = fts3Getint(
29420 26 7a 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  &z);..  /* If th
29430 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20  e first integer 
29440 76 61 6c 75 65 20 69 73 20 66 6f 6c 6c 6f 77 65  value is followe
29450 64 20 62 79 20 61 20 27 2c 27 2c 20 20 72 65 61  d by a ',',  rea
29460 64 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a  d the second.  *
29470 2a 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2e  * integer value.
29480 20 2a 2f 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d   */.  if( z[0]==
29490 27 2c 27 20 26 26 20 7a 5b 31 5d 21 3d 27 5c 30  ',' && z[1]!='\0
294a0 27 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20  ' ){.    z++;.  
294b0 20 20 6e 4d 69 6e 20 3d 20 66 74 73 33 47 65 74    nMin = fts3Get
294c0 69 6e 74 28 26 7a 29 3b 0a 20 20 7d 0a 0a 20 20  int(&z);.  }..  
294d0 69 66 28 20 7a 5b 30 5d 21 3d 27 5c 30 27 20 7c  if( z[0]!='\0' |
294e0 7c 20 6e 4d 69 6e 3c 32 20 29 7b 0a 20 20 20 20  | nMin<2 ){.    
294f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
29500 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  R;.  }else{.    
29510 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
29520 20 20 20 20 69 66 28 20 21 70 2d 3e 62 48 61 73      if( !p->bHas
29530 53 74 61 74 20 29 7b 0a 20 20 20 20 20 20 61 73  Stat ){.      as
29540 73 65 72 74 28 20 70 2d 3e 62 46 74 73 34 3d 3d  sert( p->bFts4==
29550 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
29560 65 33 46 74 73 33 43 72 65 61 74 65 53 74 61 74  e3Fts3CreateStat
29570 54 61 62 6c 65 28 26 72 63 2c 20 70 29 3b 0a 20  Table(&rc, p);. 
29580 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
29590 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
295a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
295b0 46 74 73 33 49 6e 63 72 6d 65 72 67 65 28 70 2c  Fts3Incrmerge(p,
295c0 20 6e 4d 65 72 67 65 2c 20 6e 4d 69 6e 29 3b 0a   nMerge, nMin);.
295d0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
295e0 33 46 74 73 33 53 65 67 6d 65 6e 74 73 43 6c 6f  3Fts3SegmentsClo
295f0 73 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  se(p);.  }.  ret
29600 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
29610 20 50 72 6f 63 65 73 73 20 73 74 61 74 65 6d 65   Process stateme
29620 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  nts of the form:
29630 0a 2a 2a 0a 2a 2a 20 20 20 20 49 4e 53 45 52 54  .**.**    INSERT
29640 20 49 4e 54 4f 20 74 61 62 6c 65 28 74 61 62 6c   INTO table(tabl
29650 65 29 20 56 41 4c 55 45 53 28 27 61 75 74 6f 6d  e) VALUES('autom
29660 65 72 67 65 3d 58 27 29 3b 0a 2a 2a 0a 2a 2a 20  erge=X');.**.** 
29670 77 68 65 72 65 20 58 20 69 73 20 61 6e 20 69 6e  where X is an in
29680 74 65 67 65 72 2e 20 20 58 3d 3d 30 20 6d 65 61  teger.  X==0 mea
29690 6e 73 20 74 6f 20 74 75 72 6e 20 61 75 74 6f 6d  ns to turn autom
296a0 65 72 67 65 20 6f 66 66 2e 20 20 58 21 3d 30 20  erge off.  X!=0 
296b0 6d 65 61 6e 73 0a 2a 2a 20 74 75 72 6e 20 69 74  means.** turn it
296c0 20 6f 6e 2e 20 20 54 68 65 20 73 65 74 74 69 6e   on.  The settin
296d0 67 20 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e  g is persistent.
296e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
296f0 74 73 33 44 6f 41 75 74 6f 69 6e 63 72 6d 65 72  ts3DoAutoincrmer
29700 67 65 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  ge(.  Fts3Table 
29710 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
29720 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61        /* FTS3 ta
29730 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
29740 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72  const char *zPar
29750 61 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  am              
29760 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  /* Nul-terminate
29770 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  d string contain
29780 69 6e 67 20 62 6f 6f 6c 65 61 6e 20 2a 2f 0a 29  ing boolean */.)
29790 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
297a0 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
297b0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
297c0 30 3b 0a 20 20 70 2d 3e 6e 41 75 74 6f 69 6e 63  0;.  p->nAutoinc
297d0 72 6d 65 72 67 65 20 3d 20 66 74 73 33 47 65 74  rmerge = fts3Get
297e0 69 6e 74 28 26 7a 50 61 72 61 6d 29 3b 0a 20 20  int(&zParam);.  
297f0 69 66 28 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72  if( p->nAutoincr
29800 6d 65 72 67 65 3d 3d 31 20 7c 7c 20 70 2d 3e 6e  merge==1 || p->n
29810 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 3e 46 54  Autoincrmerge>FT
29820 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 20 29  S3_MERGE_COUNT )
29830 7b 0a 20 20 20 20 70 2d 3e 6e 41 75 74 6f 69 6e  {.    p->nAutoin
29840 63 72 6d 65 72 67 65 20 3d 20 38 3b 0a 20 20 7d  crmerge = 8;.  }
29850 0a 20 20 69 66 28 20 21 70 2d 3e 62 48 61 73 53  .  if( !p->bHasS
29860 74 61 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  tat ){.    asser
29870 74 28 20 70 2d 3e 62 46 74 73 34 3d 3d 30 20 29  t( p->bFts4==0 )
29880 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
29890 33 43 72 65 61 74 65 53 74 61 74 54 61 62 6c 65  3CreateStatTable
298a0 28 26 72 63 2c 20 70 29 3b 0a 20 20 20 20 69 66  (&rc, p);.    if
298b0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
298c0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 74 73  ;.  }.  rc = fts
298d0 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
298e0 52 45 50 4c 41 43 45 5f 53 54 41 54 2c 20 26 70  REPLACE_STAT, &p
298f0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  Stmt, 0);.  if( 
29900 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
29910 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
29920 6e 74 28 70 53 74 6d 74 2c 20 31 2c 20 46 54 53  nt(pStmt, 1, FTS
29930 5f 53 54 41 54 5f 41 55 54 4f 49 4e 43 52 4d 45  _STAT_AUTOINCRME
29940 52 47 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  RGE);.  sqlite3_
29950 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20  bind_int(pStmt, 
29960 32 2c 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d  2, p->nAutoincrm
29970 65 72 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  erge);.  sqlite3
29980 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
29990 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
299a0 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 72 65 74  et(pStmt);.  ret
299b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
299c0 20 52 65 74 75 72 6e 20 61 20 36 34 2d 62 69 74   Return a 64-bit
299d0 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68   checksum for th
299e0 65 20 46 54 53 20 69 6e 64 65 78 20 65 6e 74 72  e FTS index entr
299f0 79 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  y specified by t
29a00 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20  he.** arguments 
29a10 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
29a20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 36 34 20  ..*/.static u64 
29a30 66 74 73 33 43 68 65 63 6b 73 75 6d 45 6e 74 72  fts3ChecksumEntr
29a40 79 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  y(.  const char 
29a50 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  *zTerm,         
29a60 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
29a70 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
29a80 6e 69 6e 67 20 74 65 72 6d 20 2a 2f 0a 20 20 69  ning term */.  i
29a90 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 20 20  nt nTerm,       
29aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29ab0 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20  * Size of zTerm 
29ac0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
29ad0 74 20 69 4c 61 6e 67 69 64 2c 20 20 20 20 20 20  t iLangid,      
29ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29af0 20 4c 61 6e 67 75 61 67 65 20 69 64 20 66 6f 72   Language id for
29b00 20 63 75 72 72 65 6e 74 20 72 6f 77 20 2a 2f 0a   current row */.
29b10 20 20 69 6e 74 20 69 49 6e 64 65 78 2c 20 20 20    int iIndex,   
29b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b30 20 20 2f 2a 20 49 6e 64 65 78 20 28 30 2e 2e 46    /* Index (0..F
29b40 74 73 33 54 61 62 6c 65 2e 6e 49 6e 64 65 78 2d  ts3Table.nIndex-
29b50 31 29 20 2a 2f 0a 20 20 69 36 34 20 69 44 6f 63  1) */.  i64 iDoc
29b60 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
29b70 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 69 64          /* Docid
29b80 20 66 6f 72 20 63 75 72 72 65 6e 74 20 72 6f 77   for current row
29b90 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  . */.  int iCol,
29ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bb0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
29bc0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
29bd0 20 69 50 6f 73 20 20 20 20 20 20 20 20 20 20 20   iPos           
29be0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29bf0 50 6f 73 69 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  Position */.){. 
29c00 20 69 6e 74 20 69 3b 0a 20 20 75 36 34 20 72 65   int i;.  u64 re
29c10 74 20 3d 20 28 75 36 34 29 69 44 6f 63 69 64 3b  t = (u64)iDocid;
29c20 0a 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c  ..  ret += (ret<
29c30 3c 33 29 20 2b 20 69 4c 61 6e 67 69 64 3b 0a 20  <3) + iLangid;. 
29c40 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29   ret += (ret<<3)
29c50 20 2b 20 69 49 6e 64 65 78 3b 0a 20 20 72 65 74   + iIndex;.  ret
29c60 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 69   += (ret<<3) + i
29c70 43 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72  Col;.  ret += (r
29c80 65 74 3c 3c 33 29 20 2b 20 69 50 6f 73 3b 0a 20  et<<3) + iPos;. 
29c90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72   for(i=0; i<nTer
29ca0 6d 3b 20 69 2b 2b 29 20 72 65 74 20 2b 3d 20 28  m; i++) ret += (
29cb0 72 65 74 3c 3c 33 29 20 2b 20 7a 54 65 72 6d 5b  ret<<3) + zTerm[
29cc0 69 5d 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 65  i];..  return re
29cd0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
29ce0 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66  rn a checksum of
29cf0 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20   all entries in 
29d00 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 74 68  the FTS index th
29d10 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  at correspond to
29d20 0a 2a 2a 20 6c 61 6e 67 75 61 67 65 20 69 64 20  .** language id 
29d30 69 4c 61 6e 67 69 64 2e 20 54 68 65 20 63 68 65  iLangid. The che
29d40 63 6b 73 75 6d 20 69 73 20 63 61 6c 63 75 6c 61  cksum is calcula
29d50 74 65 64 20 62 79 20 58 4f 52 69 6e 67 20 74 68  ted by XORing th
29d60 65 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 6f  e checksums.** o
29d70 66 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61  f each individua
29d80 6c 20 65 6e 74 72 79 20 28 73 65 65 20 66 74 73  l entry (see fts
29d90 33 43 68 65 63 6b 73 75 6d 45 6e 74 72 79 28 29  3ChecksumEntry()
29da0 29 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 0a 2a  ) together..**.*
29db0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
29dc0 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 76 61   the checksum va
29dd0 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  lue is returned 
29de0 61 6e 64 20 2a 70 52 63 20 73 65 74 20 74 6f 20  and *pRc set to 
29df0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74  SQLITE_OK..** Ot
29e00 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65  herwise, if an e
29e10 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 52  rror occurs, *pR
29e20 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 53  c is set to an S
29e30 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
29e40 2e 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20  . The.** return 
29e50 76 61 6c 75 65 20 69 73 20 75 6e 64 65 66 69 6e  value is undefin
29e60 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
29e70 0a 2a 2f 0a 73 74 61 74 69 63 20 75 36 34 20 66  .*/.static u64 f
29e80 74 73 33 43 68 65 63 6b 73 75 6d 49 6e 64 65 78  ts3ChecksumIndex
29e90 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
29ea0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29eb0 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c      /* FTS3 tabl
29ec0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  e handle */.  in
29ed0 74 20 69 4c 61 6e 67 69 64 2c 20 20 20 20 20 20  t iLangid,      
29ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29ef0 20 4c 61 6e 67 75 61 67 65 20 69 64 20 74 6f 20   Language id to 
29f00 72 65 74 75 72 6e 20 63 6b 73 75 6d 20 66 6f 72  return cksum for
29f10 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 78   */.  int iIndex
29f20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29f30 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
29f40 6f 20 63 6b 73 75 6d 20 28 30 2e 2e 70 2d 3e 6e  o cksum (0..p->n
29f50 49 6e 64 65 78 2d 31 29 20 2a 2f 0a 20 20 69 6e  Index-1) */.  in
29f60 74 20 2a 70 52 63 20 20 20 20 20 20 20 20 20 20  t *pRc          
29f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29f80 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 63 6f 64   OUT: Return cod
29f90 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 53 65  e */.){.  Fts3Se
29fa0 67 46 69 6c 74 65 72 20 66 69 6c 74 65 72 3b 0a  gFilter filter;.
29fb0 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65    Fts3MultiSegRe
29fc0 61 64 65 72 20 63 73 72 3b 0a 20 20 69 6e 74 20  ader csr;.  int 
29fd0 72 63 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 20  rc;.  u64 cksum 
29fe0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
29ff0 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
2a000 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69  );..  memset(&fi
2a010 6c 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  lter, 0, sizeof(
2a020 66 69 6c 74 65 72 29 29 3b 0a 20 20 6d 65 6d 73  filter));.  mems
2a030 65 74 28 26 63 73 72 2c 20 30 2c 20 73 69 7a 65  et(&csr, 0, size
2a040 6f 66 28 63 73 72 29 29 3b 0a 20 20 66 69 6c 74  of(csr));.  filt
2a050 65 72 2e 66 6c 61 67 73 20 3d 20 20 46 54 53 33  er.flags =  FTS3
2a060 5f 53 45 47 4d 45 4e 54 5f 52 45 51 55 49 52 45  _SEGMENT_REQUIRE
2a070 5f 50 4f 53 7c 46 54 53 33 5f 53 45 47 4d 45 4e  _POS|FTS3_SEGMEN
2a080 54 5f 49 47 4e 4f 52 45 5f 45 4d 50 54 59 3b 0a  T_IGNORE_EMPTY;.
2a090 20 20 66 69 6c 74 65 72 2e 66 6c 61 67 73 20 7c    filter.flags |
2a0a0 3d 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 53  = FTS3_SEGMENT_S
2a0b0 43 41 4e 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  CAN;..  rc = sql
2a0c0 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
2a0d0 72 43 75 72 73 6f 72 28 0a 20 20 20 20 20 20 70  rCursor(.      p
2a0e0 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
2a0f0 78 2c 20 46 54 53 33 5f 53 45 47 43 55 52 53 4f  x, FTS3_SEGCURSO
2a100 52 5f 41 4c 4c 2c 20 30 2c 20 30 2c 20 30 2c 20  R_ALL, 0, 0, 0, 
2a110 31 2c 26 63 73 72 0a 20 20 29 3b 0a 20 20 69 66  1,&csr.  );.  if
2a120 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a130 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
2a140 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72  te3Fts3SegReader
2a150 53 74 61 72 74 28 70 2c 20 26 63 73 72 2c 20 26  Start(p, &csr, &
2a160 66 69 6c 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  filter);.  }..  
2a170 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2a180 4b 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  K ){.    while( 
2a190 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 28 72 63 20  SQLITE_ROW==(rc 
2a1a0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  = sqlite3Fts3Seg
2a1b0 52 65 61 64 65 72 53 74 65 70 28 70 2c 20 26 63  ReaderStep(p, &c
2a1c0 73 72 29 29 20 29 7b 0a 20 20 20 20 20 20 63 68  sr)) ){.      ch
2a1d0 61 72 20 2a 70 43 73 72 20 3d 20 63 73 72 2e 61  ar *pCsr = csr.a
2a1e0 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 63  Doclist;.      c
2a1f0 68 61 72 20 2a 70 45 6e 64 20 3d 20 26 70 43 73  har *pEnd = &pCs
2a200 72 5b 63 73 72 2e 6e 44 6f 63 6c 69 73 74 5d 3b  r[csr.nDoclist];
2a210 0a 0a 20 20 20 20 20 20 69 36 34 20 69 44 6f 63  ..      i64 iDoc
2a220 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 36  id = 0;.      i6
2a230 34 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  4 iCol = 0;.    
2a240 20 20 69 36 34 20 69 50 6f 73 20 3d 20 30 3b 0a    i64 iPos = 0;.
2a250 0a 20 20 20 20 20 20 70 43 73 72 20 2b 3d 20 73  .      pCsr += s
2a260 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
2a270 69 6e 74 28 70 43 73 72 2c 20 26 69 44 6f 63 69  int(pCsr, &iDoci
2a280 64 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  d);.      while(
2a290 20 70 43 73 72 3c 70 45 6e 64 20 29 7b 0a 20 20   pCsr<pEnd ){.  
2a2a0 20 20 20 20 20 20 69 36 34 20 69 56 61 6c 20 3d        i64 iVal =
2a2b0 20 30 3b 0a 20 20 20 20 20 20 20 20 70 43 73 72   0;.        pCsr
2a2c0 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47   += sqlite3Fts3G
2a2d0 65 74 56 61 72 69 6e 74 28 70 43 73 72 2c 20 26  etVarint(pCsr, &
2a2e0 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  iVal);.        i
2a2f0 66 28 20 70 43 73 72 3c 70 45 6e 64 20 29 7b 0a  f( pCsr<pEnd ){.
2a300 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 56            if( iV
2a310 61 6c 3d 3d 30 20 7c 7c 20 69 56 61 6c 3d 3d 31  al==0 || iVal==1
2a320 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a330 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  iCol = 0;.      
2a340 20 20 20 20 20 20 69 50 6f 73 20 3d 20 30 3b 0a        iPos = 0;.
2a350 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2a360 69 56 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  iVal ){.        
2a370 20 20 20 20 20 20 70 43 73 72 20 2b 3d 20 73 71        pCsr += sq
2a380 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
2a390 6e 74 28 70 43 73 72 2c 20 26 69 43 6f 6c 29 3b  nt(pCsr, &iCol);
2a3a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
2a3b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2a3c0 20 20 70 43 73 72 20 2b 3d 20 73 71 6c 69 74 65    pCsr += sqlite
2a3d0 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 70  3Fts3GetVarint(p
2a3e0 43 73 72 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20  Csr, &iVal);.   
2a3f0 20 20 20 20 20 20 20 20 20 20 20 69 44 6f 63 69             iDoci
2a400 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20  d += iVal;.     
2a410 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a420 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a430 20 20 20 20 20 20 69 50 6f 73 20 2b 3d 20 28 69        iPos += (i
2a440 56 61 6c 20 2d 20 32 29 3b 0a 20 20 20 20 20 20  Val - 2);.      
2a450 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 63 6b        cksum = ck
2a460 73 75 6d 20 5e 20 66 74 73 33 43 68 65 63 6b 73  sum ^ fts3Checks
2a470 75 6d 45 6e 74 72 79 28 0a 20 20 20 20 20 20 20  umEntry(.       
2a480 20 20 20 20 20 20 20 20 20 63 73 72 2e 7a 54 65           csr.zTe
2a490 72 6d 2c 20 63 73 72 2e 6e 54 65 72 6d 2c 20 69  rm, csr.nTerm, i
2a4a0 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20  Langid, iIndex, 
2a4b0 69 44 6f 63 69 64 2c 0a 20 20 20 20 20 20 20 20  iDocid,.        
2a4c0 20 20 20 20 20 20 20 20 28 69 6e 74 29 69 43 6f          (int)iCo
2a4d0 6c 2c 20 28 69 6e 74 29 69 50 6f 73 0a 20 20 20  l, (int)iPos.   
2a4e0 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
2a4f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a500 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2a510 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 46 74 73    }.  sqlite3Fts
2a520 33 53 65 67 52 65 61 64 65 72 46 69 6e 69 73 68  3SegReaderFinish
2a530 28 26 63 73 72 29 3b 0a 0a 20 20 2a 70 52 63 20  (&csr);..  *pRc 
2a540 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 63  = rc;.  return c
2a550 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ksum;.}../*.** C
2a560 68 65 63 6b 20 69 66 20 74 68 65 20 63 6f 6e 74  heck if the cont
2a570 65 6e 74 73 20 6f 66 20 74 68 65 20 46 54 53 20  ents of the FTS 
2a580 69 6e 64 65 78 20 6d 61 74 63 68 20 74 68 65 20  index match the 
2a590 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73  current contents
2a5a0 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65   of the.** conte
2a5b0 6e 74 20 74 61 62 6c 65 2e 20 49 66 20 6e 6f 20  nt table. If no 
2a5c0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64  error occurs and
2a5d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 64 6f   the contents do
2a5e0 20 6d 61 74 63 68 2c 20 73 65 74 20 2a 70 62 4f   match, set *pbO
2a5f0 6b 0a 2a 2a 20 74 6f 20 74 72 75 65 20 61 6e 64  k.** to true and
2a600 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2a610 4b 2e 20 4f 72 20 69 66 20 74 68 65 20 63 6f 6e  K. Or if the con
2a620 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74  tents do not mat
2a630 63 68 2c 20 73 65 74 20 2a 70 62 4f 6b 0a 2a 2a  ch, set *pbOk.**
2a640 20 74 6f 20 66 61 6c 73 65 20 62 65 66 6f 72 65   to false before
2a650 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
2a660 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
2a670 63 75 72 73 20 28 65 2e 67 2e 20 61 6e 20 4f 4f  curs (e.g. an OO
2a680 4d 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 2c 20  M or IO error), 
2a690 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
2a6a0 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 2e   error .** code.
2a6b0 20 54 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65   The final value
2a6c0 20 6f 66 20 2a 70 62 4f 6b 20 69 73 20 75 6e 64   of *pbOk is und
2a6d0 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63  efined in this c
2a6e0 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
2a6f0 6e 74 20 66 74 73 33 49 6e 74 65 67 72 69 74 79  nt fts3Integrity
2a700 43 68 65 63 6b 28 46 74 73 33 54 61 62 6c 65 20  Check(Fts3Table 
2a710 2a 70 2c 20 69 6e 74 20 2a 70 62 4f 6b 29 7b 0a  *p, int *pbOk){.
2a720 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2a730 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2a740 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2a750 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73 75 6d 31   */.  u64 cksum1
2a760 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2a770 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
2a780 6d 20 62 61 73 65 64 20 6f 6e 20 46 54 53 20 69  m based on FTS i
2a790 6e 64 65 78 20 63 6f 6e 74 65 6e 74 73 20 2a 2f  ndex contents */
2a7a0 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d 20  .  u64 cksum2 = 
2a7b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2a7c0 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62     /* Checksum b
2a7d0 61 73 65 64 20 6f 6e 20 25 5f 63 6f 6e 74 65 6e  ased on %_conten
2a7e0 74 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20  t contents */.  
2a7f0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 41  sqlite3_stmt *pA
2a800 6c 6c 4c 61 6e 67 69 64 20 3d 20 30 3b 20 20 20  llLangid = 0;   
2a810 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 74 6f 20  /* Statement to 
2a820 72 65 74 75 72 6e 20 61 6c 6c 20 6c 61 6e 67 75  return all langu
2a830 61 67 65 2d 69 64 73 20 2a 2f 0a 0a 20 20 2f 2a  age-ids */..  /*
2a840 20 54 68 69 73 20 62 6c 6f 63 6b 20 63 61 6c 63   This block calc
2a850 75 6c 61 74 65 73 20 74 68 65 20 63 68 65 63 6b  ulates the check
2a860 73 75 6d 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  sum according to
2a870 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 2e 20   the FTS index. 
2a880 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71  */.  rc = fts3Sq
2a890 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c  lStmt(p, SQL_SEL
2a8a0 45 43 54 5f 41 4c 4c 5f 4c 41 4e 47 49 44 2c 20  ECT_ALL_LANGID, 
2a8b0 26 70 41 6c 6c 4c 61 6e 67 69 64 2c 20 30 29 3b  &pAllLangid, 0);
2a8c0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2a8d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
2a8e0 72 63 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rc2;.    sqlite3
2a8f0 5f 62 69 6e 64 5f 69 6e 74 28 70 41 6c 6c 4c 61  _bind_int(pAllLa
2a900 6e 67 69 64 2c 20 31 2c 20 70 2d 3e 6e 49 6e 64  ngid, 1, p->nInd
2a910 65 78 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ex);.    while( 
2a920 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2a930 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 41   sqlite3_step(pA
2a940 6c 6c 4c 61 6e 67 69 64 29 3d 3d 53 51 4c 49 54  llLangid)==SQLIT
2a950 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 69  E_ROW ){.      i
2a960 6e 74 20 69 4c 61 6e 67 69 64 20 3d 20 73 71 6c  nt iLangid = sql
2a970 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
2a980 70 41 6c 6c 4c 61 6e 67 69 64 2c 20 30 29 3b 0a  pAllLangid, 0);.
2a990 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
2a9a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
2a9b0 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20  >nIndex; i++){. 
2a9c0 20 20 20 20 20 20 20 63 6b 73 75 6d 31 20 3d 20         cksum1 = 
2a9d0 63 6b 73 75 6d 31 20 5e 20 66 74 73 33 43 68 65  cksum1 ^ fts3Che
2a9e0 63 6b 73 75 6d 49 6e 64 65 78 28 70 2c 20 69 4c  cksumIndex(p, iL
2a9f0 61 6e 67 69 64 2c 20 69 2c 20 26 72 63 29 3b 0a  angid, i, &rc);.
2aa00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2aa10 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
2aa20 72 65 73 65 74 28 70 41 6c 6c 4c 61 6e 67 69 64  reset(pAllLangid
2aa30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2aa40 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
2aa50 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  rc2;.  }..  /* T
2aa60 68 69 73 20 62 6c 6f 63 6b 20 63 61 6c 63 75 6c  his block calcul
2aa70 61 74 65 73 20 74 68 65 20 63 68 65 63 6b 73 75  ates the checksu
2aa80 6d 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  m according to t
2aa90 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62  he %_content tab
2aaa0 6c 65 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73  le */.  rc = fts
2aab0 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
2aac0 53 45 4c 45 43 54 5f 41 4c 4c 5f 4c 41 4e 47 49  SELECT_ALL_LANGI
2aad0 44 2c 20 26 70 41 6c 6c 4c 61 6e 67 69 64 2c 20  D, &pAllLangid, 
2aae0 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
2aaf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
2ab00 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
2ab10 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73 74 20 2a 70  _module const *p
2ab20 4d 6f 64 75 6c 65 20 3d 20 70 2d 3e 70 54 6f 6b  Module = p->pTok
2ab30 65 6e 69 7a 65 72 2d 3e 70 4d 6f 64 75 6c 65 3b  enizer->pModule;
2ab40 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
2ab50 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
2ab60 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
2ab70 20 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c   .    zSql = sql
2ab80 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
2ab90 4c 45 43 54 20 25 73 22 20 2c 20 70 2d 3e 7a 52  LECT %s" , p->zR
2aba0 65 61 64 45 78 70 72 6c 69 73 74 29 3b 0a 20 20  eadExprlist);.  
2abb0 20 20 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20    if( !zSql ){. 
2abc0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2abd0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
2abe0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
2abf0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
2ac00 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  (p->db, zSql, -1
2ac10 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
2ac20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2ac30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20  (zSql);.    }.. 
2ac40 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
2ac50 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
2ac60 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
2ac70 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
2ac80 20 20 20 20 69 36 34 20 69 44 6f 63 69 64 20 3d      i64 iDocid =
2ac90 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
2aca0 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 30 29 3b  int64(pStmt, 0);
2acb0 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 61 6e 67  .      int iLang
2acc0 20 3d 20 6c 61 6e 67 69 64 46 72 6f 6d 53 65 6c   = langidFromSel
2acd0 65 63 74 28 70 2c 20 70 53 74 6d 74 29 3b 0a 20  ect(p, pStmt);. 
2ace0 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 0a       int iCol;..
2acf0 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30        for(iCol=0
2ad00 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
2ad10 26 26 20 69 43 6f 6c 3c 70 2d 3e 6e 43 6f 6c 75  && iCol<p->nColu
2ad20 6d 6e 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  mn; iCol++){.   
2ad30 20 20 20 20 20 69 66 28 20 70 2d 3e 61 62 4e 6f       if( p->abNo
2ad40 74 69 6e 64 65 78 65 64 5b 69 43 6f 6c 5d 3d 3d  tindexed[iCol]==
2ad50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
2ad60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
2ad70 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
2ad80 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
2ad90 74 65 78 74 28 70 53 74 6d 74 2c 20 69 43 6f 6c  text(pStmt, iCol
2ada0 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  +1);.          i
2adb0 6e 74 20 6e 54 65 78 74 20 3d 20 73 71 6c 69 74  nt nText = sqlit
2adc0 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
2add0 70 53 74 6d 74 2c 20 69 43 6f 6c 2b 31 29 3b 0a  pStmt, iCol+1);.
2ade0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2adf0 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 63 75 72 73  3_tokenizer_curs
2ae00 6f 72 20 2a 70 54 20 3d 20 30 3b 0a 0a 20 20 20  or *pT = 0;..   
2ae10 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2ae20 74 65 33 46 74 73 33 4f 70 65 6e 54 6f 6b 65 6e  te3Fts3OpenToken
2ae30 69 7a 65 72 28 70 2d 3e 70 54 6f 6b 65 6e 69 7a  izer(p->pTokeniz
2ae40 65 72 2c 20 69 4c 61 6e 67 2c 20 7a 54 65 78 74  er, iLang, zText
2ae50 2c 20 6e 54 65 78 74 2c 26 70 54 29 3b 0a 20 20  , nText,&pT);.  
2ae60 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 72          while( r
2ae70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2ae80 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
2ae90 20 63 6f 6e 73 74 20 2a 7a 54 6f 6b 65 6e 3b 20   const *zToken; 
2aea0 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
2aeb0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 6f 6b 65 6e  containing token
2aec0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2aed0 69 6e 74 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 20  int nToken = 0; 
2aee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2aef0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
2af00 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20  token */.       
2af10 20 20 20 20 20 69 6e 74 20 69 44 75 6d 31 20 3d       int iDum1 =
2af20 20 30 2c 20 69 44 75 6d 32 20 3d 20 30 3b 20 2f   0, iDum2 = 0; /
2af30 2a 20 44 75 6d 6d 79 20 76 61 72 69 61 62 6c 65  * Dummy variable
2af40 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  s */.           
2af50 20 69 6e 74 20 69 50 6f 73 20 3d 20 30 3b 20 20   int iPos = 0;  
2af60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
2af70 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20  sition of token 
2af80 69 6e 20 7a 54 65 78 74 20 2a 2f 0a 0a 20 20 20  in zText */..   
2af90 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 4d           rc = pM
2afa0 6f 64 75 6c 65 2d 3e 78 4e 65 78 74 28 70 54 2c  odule->xNext(pT,
2afb0 20 26 7a 54 6f 6b 65 6e 2c 20 26 6e 54 6f 6b 65   &zToken, &nToke
2afc0 6e 2c 20 26 69 44 75 6d 31 2c 20 26 69 44 75 6d  n, &iDum1, &iDum
2afd0 32 2c 20 26 69 50 6f 73 29 3b 0a 20 20 20 20 20  2, &iPos);.     
2afe0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2aff0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b000 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b            int i;
2b010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
2b020 6b 73 75 6d 32 20 3d 20 63 6b 73 75 6d 32 20 5e  ksum2 = cksum2 ^
2b030 20 66 74 73 33 43 68 65 63 6b 73 75 6d 45 6e 74   fts3ChecksumEnt
2b040 72 79 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry(.            
2b050 20 20 20 20 20 20 7a 54 6f 6b 65 6e 2c 20 6e 54        zToken, nT
2b060 6f 6b 65 6e 2c 20 69 4c 61 6e 67 2c 20 30 2c 20  oken, iLang, 0, 
2b070 69 44 6f 63 69 64 2c 20 69 43 6f 6c 2c 20 69 50  iDocid, iCol, iP
2b080 6f 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  os.             
2b090 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2b0a0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e    for(i=1; i<p->
2b0b0 6e 49 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20  nIndex; i++){.  
2b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2b0d0 28 20 70 2d 3e 61 49 6e 64 65 78 5b 69 5d 2e 6e  ( p->aIndex[i].n
2b0e0 50 72 65 66 69 78 3c 3d 6e 54 6f 6b 65 6e 20 29  Prefix<=nToken )
2b0f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2b100 20 20 20 20 63 6b 73 75 6d 32 20 3d 20 63 6b 73      cksum2 = cks
2b110 75 6d 32 20 5e 20 66 74 73 33 43 68 65 63 6b 73  um2 ^ fts3Checks
2b120 75 6d 45 6e 74 72 79 28 0a 20 20 20 20 20 20 20  umEntry(.       
2b130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
2b140 54 6f 6b 65 6e 2c 20 70 2d 3e 61 49 6e 64 65 78  Token, p->aIndex
2b150 5b 69 5d 2e 6e 50 72 65 66 69 78 2c 20 69 4c 61  [i].nPrefix, iLa
2b160 6e 67 2c 20 69 2c 20 69 44 6f 63 69 64 2c 20 69  ng, i, iDocid, i
2b170 43 6f 6c 2c 20 69 50 6f 73 0a 20 20 20 20 20 20  Col, iPos.      
2b180 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
2b190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2b1a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2b1b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2b1c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2b1d0 20 20 20 20 20 69 66 28 20 70 54 20 29 20 70 4d       if( pT ) pM
2b1e0 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 54  odule->xClose(pT
2b1f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2b200 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
2b210 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f   ) rc = SQLITE_O
2b220 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
2b230 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2b240 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
2b250 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 0a 20 20  (pStmt);.  }..  
2b260 2a 70 62 4f 6b 20 3d 20 28 63 6b 73 75 6d 31 3d  *pbOk = (cksum1=
2b270 3d 63 6b 73 75 6d 32 29 3b 0a 20 20 72 65 74 75  =cksum2);.  retu
2b280 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2b290 52 75 6e 20 74 68 65 20 69 6e 74 65 67 72 69 74  Run the integrit
2b2a0 79 2d 63 68 65 63 6b 2e 20 49 66 20 6e 6f 20 65  y-check. If no e
2b2b0 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20  rror occurs and 
2b2c0 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
2b2d0 65 6e 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20 46  ents of.** the F
2b2e0 54 53 20 69 6e 64 65 78 20 61 72 65 20 63 6f 72  TS index are cor
2b2f0 72 65 63 74 2c 20 72 65 74 75 72 6e 20 53 51 4c  rect, return SQL
2b300 49 54 45 5f 4f 4b 2e 20 4f 72 2c 20 69 66 20 74  ITE_OK. Or, if t
2b310 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2b320 68 65 0a 2a 2a 20 46 54 53 20 69 6e 64 65 78 20  he.** FTS index 
2b330 61 72 65 20 69 6e 63 6f 72 72 65 63 74 2c 20 72  are incorrect, r
2b340 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2b350 52 55 50 54 5f 56 54 41 42 2e 0a 2a 2a 0a 2a 2a  RUPT_VTAB..**.**
2b360 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72   Or, if an error
2b370 20 28 65 2e 67 2e 20 61 6e 20 4f 4f 4d 20 6f 72   (e.g. an OOM or
2b380 20 49 4f 20 65 72 72 6f 72 29 20 6f 63 63 75 72   IO error) occur
2b390 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  s, return an SQL
2b3a0 69 74 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  ite .** error co
2b3b0 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  de..**.** The in
2b3c0 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 77 6f  tegrity-check wo
2b3d0 72 6b 73 20 61 73 20 66 6f 6c 6c 6f 77 73 2e 20  rks as follows. 
2b3e0 46 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e 20 61  For each token a
2b3f0 6e 64 20 69 6e 64 65 78 65 64 20 74 6f 6b 65 6e  nd indexed token
2b400 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e 20 74 68  .** prefix in th
2b410 65 20 64 6f 63 75 6d 65 6e 74 20 73 65 74 2c 20  e document set, 
2b420 61 20 36 34 2d 62 69 74 20 63 68 65 63 6b 73 75  a 64-bit checksu
2b430 6d 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20  m is calculated 
2b440 28 62 79 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 66  (by code.** in f
2b450 74 73 33 43 68 65 63 6b 73 75 6d 45 6e 74 72 79  ts3ChecksumEntry
2b460 28 29 29 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ()) based on the
2b470 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
2b480 2a 20 20 20 20 20 2b 20 54 68 65 20 69 6e 64 65  *     + The inde
2b490 78 20 6e 75 6d 62 65 72 20 28 30 20 66 6f 72 20  x number (0 for 
2b4a0 74 68 65 20 6d 61 69 6e 20 69 6e 64 65 78 2c 20  the main index, 
2b4b0 31 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  1 for the first 
2b4c0 70 72 65 66 69 78 0a 2a 2a 20 20 20 20 20 20 20  prefix.**       
2b4d0 69 6e 64 65 78 20 65 74 63 2e 29 2c 0a 2a 2a 20  index etc.),.** 
2b4e0 20 20 20 20 2b 20 54 68 65 20 74 6f 6b 65 6e 20      + The token 
2b4f0 28 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66 69 78  (or token prefix
2b500 29 20 74 65 78 74 20 69 74 73 65 6c 66 2c 20 0a  ) text itself, .
2b510 2a 2a 20 20 20 20 20 2b 20 54 68 65 20 6c 61 6e  **     + The lan
2b520 67 75 61 67 65 2d 69 64 20 6f 66 20 74 68 65 20  guage-id of the 
2b530 72 6f 77 20 69 74 20 61 70 70 65 61 72 73 20 69  row it appears i
2b540 6e 2c 0a 2a 2a 20 20 20 20 20 2b 20 54 68 65 20  n,.**     + The 
2b550 64 6f 63 69 64 20 6f 66 20 74 68 65 20 72 6f 77  docid of the row
2b560 20 69 74 20 61 70 70 65 61 72 73 20 69 6e 2c 0a   it appears in,.
2b570 2a 2a 20 20 20 20 20 2b 20 54 68 65 20 63 6f 6c  **     + The col
2b580 75 6d 6e 20 69 74 20 61 70 70 65 61 72 73 20 69  umn it appears i
2b590 6e 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 2b 20  n, and.**     + 
2b5a0 54 68 65 20 74 6f 6b 65 6e 73 20 70 6f 73 69 74  The tokens posit
2b5b0 69 6f 6e 20 77 69 74 68 69 6e 20 74 68 61 74 20  ion within that 
2b5c0 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  column..**.** Th
2b5d0 65 20 63 68 65 63 6b 73 75 6d 73 20 66 6f 72 20  e checksums for 
2b5e0 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 74  all entries in t
2b5f0 68 65 20 69 6e 64 65 78 20 61 72 65 20 58 4f 52  he index are XOR
2b600 65 64 20 74 6f 67 65 74 68 65 72 20 74 6f 20 63  ed together to c
2b610 72 65 61 74 65 0a 2a 2a 20 61 20 73 69 6e 67 6c  reate.** a singl
2b620 65 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74  e checksum for t
2b630 68 65 20 65 6e 74 69 72 65 20 69 6e 64 65 78 2e  he entire index.
2b640 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67  .**.** The integ
2b650 72 69 74 79 2d 63 68 65 63 6b 20 63 6f 64 65 20  rity-check code 
2b660 63 61 6c 63 75 6c 61 74 65 73 20 74 68 65 20 73  calculates the s
2b670 61 6d 65 20 63 68 65 63 6b 73 75 6d 20 69 6e 20  ame checksum in 
2b680 74 77 6f 20 77 61 79 73 3a 0a 2a 2a 0a 2a 2a 20  two ways:.**.** 
2b690 20 20 20 20 31 2e 20 42 79 20 73 63 61 6e 6e 69      1. By scanni
2b6a0 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
2b6b0 6f 66 20 74 68 65 20 46 54 53 20 69 6e 64 65 78  of the FTS index
2b6c0 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 32 2e  , and .**     2.
2b6d0 20 42 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 64   By scanning and
2b6e0 20 74 6f 6b 65 6e 69 7a 69 6e 67 20 74 68 65 20   tokenizing the 
2b6f0 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e 0a 2a  content table..*
2b700 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 77 6f 20  *.** If the two 
2b710 63 68 65 63 6b 73 75 6d 73 20 61 72 65 20 69 64  checksums are id
2b720 65 6e 74 69 63 61 6c 2c 20 74 68 65 20 69 6e 74  entical, the int
2b730 65 67 72 69 74 79 2d 63 68 65 63 6b 20 69 73 20  egrity-check is 
2b740 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 0a 2a  deemed to have.*
2b750 2a 20 70 61 73 73 65 64 2e 0a 2a 2f 0a 73 74 61  * passed..*/.sta
2b760 74 69 63 20 69 6e 74 20 66 74 73 33 44 6f 49 6e  tic int fts3DoIn
2b770 74 65 67 72 69 74 79 43 68 65 63 6b 28 0a 20 20  tegrityCheck(.  
2b780 46 74 73 33 54 61 62 6c 65 20 2a 70 20 20 20 20  Fts3Table *p    
2b790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b7a0 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20 68 61  /* FTS3 table ha
2b7b0 6e 64 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ndle */.){.  int
2b7c0 20 72 63 3b 0a 20 20 69 6e 74 20 62 4f 6b 20 3d   rc;.  int bOk =
2b7d0 20 30 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 49   0;.  rc = fts3I
2b7e0 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 70 2c  ntegrityCheck(p,
2b7f0 20 26 62 4f 6b 29 3b 0a 20 20 69 66 28 20 72 63   &bOk);.  if( rc
2b800 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
2b810 4f 6b 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c  Ok==0 ) rc = SQL
2b820 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42  ITE_CORRUPT_VTAB
2b830 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2b840 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20 61  ../*.** Handle a
2b850 20 27 73 70 65 63 69 61 6c 27 20 49 4e 53 45 52   'special' INSER
2b860 54 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  T of the form:.*
2b870 2a 0a 2a 2a 20 20 20 22 49 4e 53 45 52 54 20 49  *.**   "INSERT I
2b880 4e 54 4f 20 74 62 6c 28 74 62 6c 29 20 56 41 4c  NTO tbl(tbl) VAL
2b890 55 45 53 28 3c 65 78 70 72 3e 29 22 0a 2a 2a 0a  UES(<expr>)".**.
2b8a0 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 56 61 6c  ** Argument pVal
2b8b0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72 65   contains the re
2b8c0 73 75 6c 74 20 6f 66 20 3c 65 78 70 72 3e 2e 20  sult of <expr>. 
2b8d0 43 75 72 72 65 6e 74 6c 79 20 74 68 65 20 6f 6e  Currently the on
2b8e0 6c 79 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 66 75  ly .** meaningfu
2b8f0 6c 20 76 61 6c 75 65 20 74 6f 20 69 6e 73 65 72  l value to inser
2b900 74 20 69 73 20 74 68 65 20 74 65 78 74 20 27 6f  t is the text 'o
2b910 70 74 69 6d 69 7a 65 27 2e 0a 2a 2f 0a 73 74 61  ptimize'..*/.sta
2b920 74 69 63 20 69 6e 74 20 66 74 73 33 53 70 65 63  tic int fts3Spec
2b930 69 61 6c 49 6e 73 65 72 74 28 46 74 73 33 54 61  ialInsert(Fts3Ta
2b940 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  ble *p, sqlite3_
2b950 76 61 6c 75 65 20 2a 70 56 61 6c 29 7b 0a 20 20  value *pVal){.  
2b960 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
2b970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b980 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
2b990 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2b9a0 7a 56 61 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68  zVal = (const ch
2b9b0 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  ar *)sqlite3_val
2b9c0 75 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a 20  ue_text(pVal);. 
2b9d0 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69   int nVal = sqli
2b9e0 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
2b9f0 70 56 61 6c 29 3b 0a 0a 20 20 69 66 28 20 21 7a  pVal);..  if( !z
2ba00 56 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Val ){.    retur
2ba10 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2ba20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 61 6c    }else if( nVal
2ba30 3d 3d 38 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  ==8 && 0==sqlite
2ba40 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c  3_strnicmp(zVal,
2ba50 20 22 6f 70 74 69 6d 69 7a 65 22 2c 20 38 29 20   "optimize", 8) 
2ba60 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  ){.    rc = fts3
2ba70 44 6f 4f 70 74 69 6d 69 7a 65 28 70 2c 20 30 29  DoOptimize(p, 0)
2ba80 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56  ;.  }else if( nV
2ba90 61 6c 3d 3d 37 20 26 26 20 30 3d 3d 73 71 6c 69  al==7 && 0==sqli
2baa0 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61  te3_strnicmp(zVa
2bab0 6c 2c 20 22 72 65 62 75 69 6c 64 22 2c 20 37 29  l, "rebuild", 7)
2bac0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
2bad0 33 44 6f 52 65 62 75 69 6c 64 28 70 29 3b 0a 20  3DoRebuild(p);. 
2bae0 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 61 6c 3d   }else if( nVal=
2baf0 3d 31 35 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  =15 && 0==sqlite
2bb00 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c  3_strnicmp(zVal,
2bb10 20 22 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63   "integrity-chec
2bb20 6b 22 2c 20 31 35 29 20 29 7b 0a 20 20 20 20 72  k", 15) ){.    r
2bb30 63 20 3d 20 66 74 73 33 44 6f 49 6e 74 65 67 72  c = fts3DoIntegr
2bb40 69 74 79 43 68 65 63 6b 28 70 29 3b 0a 20 20 7d  ityCheck(p);.  }
2bb50 65 6c 73 65 20 69 66 28 20 6e 56 61 6c 3e 36 20  else if( nVal>6 
2bb60 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  && 0==sqlite3_st
2bb70 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22 6d 65  rnicmp(zVal, "me
2bb80 72 67 65 3d 22 2c 20 36 29 20 29 7b 0a 20 20 20  rge=", 6) ){.   
2bb90 20 72 63 20 3d 20 66 74 73 33 44 6f 49 6e 63 72   rc = fts3DoIncr
2bba0 6d 65 72 67 65 28 70 2c 20 26 7a 56 61 6c 5b 36  merge(p, &zVal[6
2bbb0 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ]);.  }else if( 
2bbc0 6e 56 61 6c 3e 31 30 20 26 26 20 30 3d 3d 73 71  nVal>10 && 0==sq
2bbd0 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a  lite3_strnicmp(z
2bbe0 56 61 6c 2c 20 22 61 75 74 6f 6d 65 72 67 65 3d  Val, "automerge=
2bbf0 22 2c 20 31 30 29 20 29 7b 0a 20 20 20 20 72 63  ", 10) ){.    rc
2bc00 20 3d 20 66 74 73 33 44 6f 41 75 74 6f 69 6e 63   = fts3DoAutoinc
2bc10 72 6d 65 72 67 65 28 70 2c 20 26 7a 56 61 6c 5b  rmerge(p, &zVal[
2bc20 31 30 5d 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  10]);.#ifdef SQL
2bc30 49 54 45 5f 54 45 53 54 0a 20 20 7d 65 6c 73 65  ITE_TEST.  }else
2bc40 20 69 66 28 20 6e 56 61 6c 3e 39 20 26 26 20 30   if( nVal>9 && 0
2bc50 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ==sqlite3_strnic
2bc60 6d 70 28 7a 56 61 6c 2c 20 22 6e 6f 64 65 73 69  mp(zVal, "nodesi
2bc70 7a 65 3d 22 2c 20 39 29 20 29 7b 0a 20 20 20 20  ze=", 9) ){.    
2bc80 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 3d 20 61  p->nNodeSize = a
2bc90 74 6f 69 28 26 7a 56 61 6c 5b 39 5d 29 3b 0a 20  toi(&zVal[9]);. 
2bca0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2bcb0 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  K;.  }else if( n
2bcc0 56 61 6c 3e 31 31 20 26 26 20 30 3d 3d 73 71 6c  Val>11 && 0==sql
2bcd0 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56  ite3_strnicmp(zV
2bce0 61 6c 2c 20 22 6d 61 78 70 65 6e 64 69 6e 67 3d  al, "maxpending=
2bcf0 22 2c 20 39 29 20 29 7b 0a 20 20 20 20 70 2d 3e  ", 9) ){.    p->
2bd00 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61 74 61 20  nMaxPendingData 
2bd10 3d 20 61 74 6f 69 28 26 7a 56 61 6c 5b 31 31 5d  = atoi(&zVal[11]
2bd20 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
2bd30 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
2bd40 66 28 20 6e 56 61 6c 3e 32 31 20 26 26 20 30 3d  f( nVal>21 && 0=
2bd50 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d  =sqlite3_strnicm
2bd60 70 28 7a 56 61 6c 2c 20 22 74 65 73 74 2d 6e 6f  p(zVal, "test-no
2bd70 2d 69 6e 63 72 2d 64 6f 63 6c 69 73 74 3d 22 2c  -incr-doclist=",
2bd80 20 32 31 29 20 29 7b 0a 20 20 20 20 70 2d 3e 62   21) ){.    p->b
2bd90 4e 6f 49 6e 63 72 44 6f 63 6c 69 73 74 20 3d 20  NoIncrDoclist = 
2bda0 61 74 6f 69 28 26 7a 56 61 6c 5b 32 31 5d 29 3b  atoi(&zVal[21]);
2bdb0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2bdc0 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  _OK;.#endif.  }e
2bdd0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
2bde0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
2bdf0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2be00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2be10 44 49 53 41 42 4c 45 5f 46 54 53 34 5f 44 45 46  DISABLE_FTS4_DEF
2be20 45 52 52 45 44 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  ERRED./*.** Dele
2be30 74 65 20 61 6c 6c 20 63 61 63 68 65 64 20 64 65  te all cached de
2be40 66 65 72 72 65 64 20 64 6f 63 6c 69 73 74 73 2e  ferred doclists.
2be50 20 44 65 66 65 72 72 65 64 20 64 6f 63 6c 69 73   Deferred doclis
2be60 74 73 20 61 72 65 20 63 61 63 68 65 64 0a 2a 2a  ts are cached.**
2be70 20 28 61 6c 6c 6f 63 61 74 65 64 29 20 62 79 20   (allocated) by 
2be80 74 68 65 20 73 71 6c 69 74 65 33 46 74 73 33 43  the sqlite3Fts3C
2be90 61 63 68 65 44 65 66 65 72 72 65 64 44 6f 63 6c  acheDeferredDocl
2bea0 69 73 74 73 28 29 20 66 75 6e 63 74 69 6f 6e 2e  ists() function.
2beb0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2bec0 46 74 73 33 46 72 65 65 44 65 66 65 72 72 65 64  Fts3FreeDeferred
2bed0 44 6f 63 6c 69 73 74 73 28 46 74 73 33 43 75 72  Doclists(Fts3Cur
2bee0 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 46 74  sor *pCsr){.  Ft
2bef0 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20  s3DeferredToken 
2bf00 2a 70 44 65 66 3b 0a 20 20 66 6f 72 28 70 44 65  *pDef;.  for(pDe
2bf10 66 3d 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65  f=pCsr->pDeferre
2bf20 64 3b 20 70 44 65 66 3b 20 70 44 65 66 3d 70 44  d; pDef; pDef=pD
2bf30 65 66 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ef->pNext){.    
2bf40 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 44  fts3PendingListD
2bf50 65 6c 65 74 65 28 70 44 65 66 2d 3e 70 4c 69 73  elete(pDef->pLis
2bf60 74 29 3b 0a 20 20 20 20 70 44 65 66 2d 3e 70 4c  t);.    pDef->pL
2bf70 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ist = 0;.  }.}..
2bf80 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 65  /*.** Free all e
2bf90 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 70 43  ntries in the pC
2bfa0 73 72 2d 3e 70 44 65 66 66 65 72 65 64 20 6c 69  sr->pDeffered li
2bfb0 73 74 2e 20 45 6e 74 72 69 65 73 20 61 72 65 20  st. Entries are 
2bfc0 61 64 64 65 64 20 74 6f 20 0a 2a 2a 20 74 68 69  added to .** thi
2bfd0 73 20 6c 69 73 74 20 75 73 69 6e 67 20 73 71 6c  s list using sql
2bfe0 69 74 65 33 46 74 73 33 44 65 66 65 72 54 6f 6b  ite3Fts3DeferTok
2bff0 65 6e 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  en()..*/.void sq
2c000 6c 69 74 65 33 46 74 73 33 46 72 65 65 44 65 66  lite3Fts3FreeDef
2c010 65 72 72 65 64 54 6f 6b 65 6e 73 28 46 74 73 33  erredTokens(Fts3
2c020 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20  Cursor *pCsr){. 
2c030 20 46 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b   Fts3DeferredTok
2c040 65 6e 20 2a 70 44 65 66 3b 0a 20 20 46 74 73 33  en *pDef;.  Fts3
2c050 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70  DeferredToken *p
2c060 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 44 65 66  Next;.  for(pDef
2c070 3d 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64  =pCsr->pDeferred
2c080 3b 20 70 44 65 66 3b 20 70 44 65 66 3d 70 4e 65  ; pDef; pDef=pNe
2c090 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
2c0a0 20 70 44 65 66 2d 3e 70 4e 65 78 74 3b 0a 20 20   pDef->pNext;.  
2c0b0 20 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73    fts3PendingLis
2c0c0 74 44 65 6c 65 74 65 28 70 44 65 66 2d 3e 70 4c  tDelete(pDef->pL
2c0d0 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
2c0e0 33 5f 66 72 65 65 28 70 44 65 66 29 3b 0a 20 20  3_free(pDef);.  
2c0f0 7d 0a 20 20 70 43 73 72 2d 3e 70 44 65 66 65 72  }.  pCsr->pDefer
2c100 72 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  red = 0;.}../*.*
2c110 2a 20 47 65 6e 65 72 61 74 65 20 64 65 66 65 72  * Generate defer
2c120 72 65 64 2d 64 6f 63 6c 69 73 74 73 20 66 6f 72  red-doclists for
2c130 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 69 6e 20 74   all tokens in t
2c140 68 65 20 70 43 73 72 2d 3e 70 44 65 66 65 72 72  he pCsr->pDeferr
2c150 65 64 20 6c 69 73 74 0a 2a 2a 20 62 61 73 65 64  ed list.** based
2c160 20 6f 6e 20 74 68 65 20 72 6f 77 20 74 68 61 74   on the row that
2c170 20 70 43 73 72 20 63 75 72 72 65 6e 74 6c 79 20   pCsr currently 
2c180 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a  points to..**.**
2c190 20 41 20 64 65 66 65 72 72 65 64 2d 64 6f 63 6c   A deferred-docl
2c1a0 69 73 74 20 69 73 20 6c 69 6b 65 20 61 6e 79 20  ist is like any 
2c1b0 6f 74 68 65 72 20 64 6f 63 6c 69 73 74 20 77 69  other doclist wi
2c1c0 74 68 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f  th position info
2c1d0 72 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 63 6c 75  rmation.** inclu
2c1e0 64 65 64 2c 20 65 78 63 65 70 74 20 74 68 61 74  ded, except that
2c1f0 20 69 74 20 6f 6e 6c 79 20 63 6f 6e 74 61 69 6e   it only contain
2c200 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 20  s entries for a 
2c210 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
2c220 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 6e 6f 74 20  e.** table, not 
2c230 66 6f 72 20 61 6c 6c 20 72 6f 77 73 2e 0a 2a 2f  for all rows..*/
2c240 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
2c250 43 61 63 68 65 44 65 66 65 72 72 65 64 44 6f 63  CacheDeferredDoc
2c260 6c 69 73 74 73 28 46 74 73 33 43 75 72 73 6f 72  lists(Fts3Cursor
2c270 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74 20 72   *pCsr){.  int r
2c280 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2c290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2c2a0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
2c2b0 66 28 20 70 43 73 72 2d 3e 70 44 65 66 65 72 72  f( pCsr->pDeferr
2c2c0 65 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ed ){.    int i;
2c2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c2e0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
2c2f0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
2c300 67 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  gh table columns
2c310 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
2c320 69 6e 74 36 34 20 69 44 6f 63 69 64 3b 20 20 20  int64 iDocid;   
2c330 20 20 20 20 20 20 2f 2a 20 44 6f 63 69 64 20 6f        /* Docid o
2c340 66 20 74 68 65 20 72 6f 77 20 70 43 73 72 20 70  f the row pCsr p
2c350 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 20 20 20 20  oints to */.    
2c360 46 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65  Fts3DeferredToke
2c370 6e 20 2a 70 44 65 66 3b 20 20 20 20 20 20 2f 2a  n *pDef;      /*
2c380 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
2c390 20 74 68 72 6f 75 67 68 20 64 65 66 65 72 72 65   through deferre
2c3a0 64 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20 0a 20  d tokens */.  . 
2c3b0 20 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20     Fts3Table *p 
2c3c0 3d 20 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70  = (Fts3Table *)p
2c3d0 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b  Csr->base.pVtab;
2c3e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b  .    sqlite3_tok
2c3f0 65 6e 69 7a 65 72 20 2a 70 54 20 3d 20 70 2d 3e  enizer *pT = p->
2c400 70 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 20 20  pTokenizer;.    
2c410 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65  sqlite3_tokenize
2c420 72 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73 74 20 2a  r_module const *
2c430 70 4d 6f 64 75 6c 65 20 3d 20 70 54 2d 3e 70 4d  pModule = pT->pM
2c440 6f 64 75 6c 65 3b 0a 20 20 20 0a 20 20 20 20 61  odule;.   .    a
2c450 73 73 65 72 74 28 20 70 43 73 72 2d 3e 69 73 52  ssert( pCsr->isR
2c460 65 71 75 69 72 65 53 65 65 6b 3d 3d 30 20 29 3b  equireSeek==0 );
2c470 0a 20 20 20 20 69 44 6f 63 69 64 20 3d 20 73 71  .    iDocid = sq
2c480 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
2c490 36 34 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20  64(pCsr->pStmt, 
2c4a0 30 29 3b 0a 20 20 0a 20 20 20 20 66 6f 72 28 69  0);.  .    for(i
2c4b0 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e  =0; i<p->nColumn
2c4c0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2c4d0 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  K; i++){.      i
2c4e0 66 28 20 70 2d 3e 61 62 4e 6f 74 69 6e 64 65 78  f( p->abNotindex
2c4f0 65 64 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ed[i]==0 ){.    
2c500 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2c510 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63  zText = (const c
2c520 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f  har *)sqlite3_co
2c530 6c 75 6d 6e 5f 74 65 78 74 28 70 43 73 72 2d 3e  lumn_text(pCsr->
2c540 70 53 74 6d 74 2c 20 69 2b 31 29 3b 0a 20 20 20  pStmt, i+1);.   
2c550 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b       sqlite3_tok
2c560 65 6e 69 7a 65 72 5f 63 75 72 73 6f 72 20 2a 70  enizer_cursor *p
2c570 54 43 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20  TC = 0;..       
2c580 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
2c590 33 4f 70 65 6e 54 6f 6b 65 6e 69 7a 65 72 28 70  3OpenTokenizer(p
2c5a0 54 2c 20 70 43 73 72 2d 3e 69 4c 61 6e 67 69 64  T, pCsr->iLangid
2c5b0 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26 70 54  , zText, -1, &pT
2c5c0 43 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  C);.        whil
2c5d0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
2c5e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68   ){.          ch
2c5f0 61 72 20 63 6f 6e 73 74 20 2a 7a 54 6f 6b 65 6e  ar const *zToken
2c600 3b 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65  ;       /* Buffe
2c610 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 6f 6b  r containing tok
2c620 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  en */.          
2c630 69 6e 74 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 20  int nToken = 0; 
2c640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2c650 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
2c660 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20  token */.       
2c670 20 20 20 69 6e 74 20 69 44 75 6d 31 20 3d 20 30     int iDum1 = 0
2c680 2c 20 69 44 75 6d 32 20 3d 20 30 3b 20 2f 2a 20  , iDum2 = 0; /* 
2c690 44 75 6d 6d 79 20 76 61 72 69 61 62 6c 65 73 20  Dummy variables 
2c6a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  */.          int
2c6b0 20 69 50 6f 73 20 3d 20 30 3b 20 20 20 20 20 20   iPos = 0;      
2c6c0 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69         /* Positi
2c6d0 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20 7a  on of token in z
2c6e0 54 65 78 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20  Text */..       
2c6f0 20 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d     rc = pModule-
2c700 3e 78 4e 65 78 74 28 70 54 43 2c 20 26 7a 54 6f  >xNext(pTC, &zTo
2c710 6b 65 6e 2c 20 26 6e 54 6f 6b 65 6e 2c 20 26 69  ken, &nToken, &i
2c720 44 75 6d 31 2c 20 26 69 44 75 6d 32 2c 20 26 69  Dum1, &iDum2, &i
2c730 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Pos);.          
2c740 66 6f 72 28 70 44 65 66 3d 70 43 73 72 2d 3e 70  for(pDef=pCsr->p
2c750 44 65 66 65 72 72 65 64 3b 20 70 44 65 66 20 26  Deferred; pDef &
2c760 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
2c770 20 70 44 65 66 3d 70 44 65 66 2d 3e 70 4e 65 78   pDef=pDef->pNex
2c780 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t){.            
2c790 46 74 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20  Fts3PhraseToken 
2c7a0 2a 70 50 54 20 3d 20 70 44 65 66 2d 3e 70 54 6f  *pPT = pDef->pTo
2c7b0 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ken;.           
2c7c0 20 69 66 28 20 28 70 44 65 66 2d 3e 69 43 6f 6c   if( (pDef->iCol
2c7d0 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 7c 7c 20  >=p->nColumn || 
2c7e0 70 44 65 66 2d 3e 69 43 6f 6c 3d 3d 69 29 0a 20  pDef->iCol==i). 
2c7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
2c800 26 20 28 70 50 54 2d 3e 62 46 69 72 73 74 3d 3d  & (pPT->bFirst==
2c810 30 20 7c 7c 20 69 50 6f 73 3d 3d 30 29 0a 20 20  0 || iPos==0).  
2c820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
2c830 20 28 70 50 54 2d 3e 6e 3d 3d 6e 54 6f 6b 65 6e   (pPT->n==nToken
2c840 20 7c 7c 20 28 70 50 54 2d 3e 69 73 50 72 65 66   || (pPT->isPref
2c850 69 78 20 26 26 20 70 50 54 2d 3e 6e 3c 6e 54 6f  ix && pPT->n<nTo
2c860 6b 65 6e 29 29 0a 20 20 20 20 20 20 20 20 20 20  ken)).          
2c870 20 20 20 20 20 20 26 26 20 28 30 3d 3d 6d 65 6d        && (0==mem
2c880 63 6d 70 28 7a 54 6f 6b 65 6e 2c 20 70 50 54 2d  cmp(zToken, pPT-
2c890 3e 7a 2c 20 70 50 54 2d 3e 6e 29 29 0a 20 20 20  >z, pPT->n)).   
2c8a0 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
2c8b0 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 33              fts3
2c8c0 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e  PendingListAppen
2c8d0 64 28 26 70 44 65 66 2d 3e 70 4c 69 73 74 2c 20  d(&pDef->pList, 
2c8e0 69 44 6f 63 69 64 2c 20 69 2c 20 69 50 6f 73 2c  iDocid, i, iPos,
2c8f0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20   &rc);.         
2c900 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2c910 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c920 20 20 20 69 66 28 20 70 54 43 20 29 20 70 4d 6f     if( pTC ) pMo
2c930 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 54 43  dule->xClose(pTC
2c940 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2c950 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
2c960 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2c970 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2c980 20 20 20 20 66 6f 72 28 70 44 65 66 3d 70 43 73      for(pDef=pCs
2c990 72 2d 3e 70 44 65 66 65 72 72 65 64 3b 20 70 44  r->pDeferred; pD
2c9a0 65 66 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ef && rc==SQLITE
2c9b0 5f 4f 4b 3b 20 70 44 65 66 3d 70 44 65 66 2d 3e  _OK; pDef=pDef->
2c9c0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
2c9d0 28 20 70 44 65 66 2d 3e 70 4c 69 73 74 20 29 7b  ( pDef->pList ){
2c9e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74  .        rc = ft
2c9f0 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70  s3PendingListApp
2ca00 65 6e 64 56 61 72 69 6e 74 28 26 70 44 65 66 2d  endVarint(&pDef-
2ca10 3e 70 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20  >pList, 0);.    
2ca20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2ca30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69   return rc;.}..i
2ca40 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 44 65  nt sqlite3Fts3De
2ca50 66 65 72 72 65 64 54 6f 6b 65 6e 4c 69 73 74 28  ferredTokenList(
2ca60 0a 20 20 46 74 73 33 44 65 66 65 72 72 65 64 54  .  Fts3DeferredT
2ca70 6f 6b 65 6e 20 2a 70 2c 20 0a 20 20 63 68 61 72  oken *p, .  char
2ca80 20 2a 2a 70 70 44 61 74 61 2c 20 0a 20 20 69 6e   **ppData, .  in
2ca90 74 20 2a 70 6e 44 61 74 61 0a 29 7b 0a 20 20 63  t *pnData.){.  c
2caa0 68 61 72 20 2a 70 52 65 74 3b 0a 20 20 69 6e 74  har *pRet;.  int
2cab0 20 6e 53 6b 69 70 3b 0a 20 20 73 71 6c 69 74 65   nSkip;.  sqlite
2cac0 33 5f 69 6e 74 36 34 20 64 75 6d 6d 79 3b 0a 0a  3_int64 dummy;..
2cad0 20 20 2a 70 70 44 61 74 61 20 3d 20 30 3b 0a 20    *ppData = 0;. 
2cae0 20 2a 70 6e 44 61 74 61 20 3d 20 30 3b 0a 0a 20   *pnData = 0;.. 
2caf0 20 69 66 28 20 70 2d 3e 70 4c 69 73 74 3d 3d 30   if( p->pList==0
2cb00 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2cb10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
2cb20 20 70 52 65 74 20 3d 20 28 63 68 61 72 20 2a 29   pRet = (char *)
2cb30 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70  sqlite3_malloc(p
2cb40 2d 3e 70 4c 69 73 74 2d 3e 6e 44 61 74 61 29 3b  ->pList->nData);
2cb50 0a 20 20 69 66 28 20 21 70 52 65 74 20 29 20 72  .  if( !pRet ) r
2cb60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2cb70 45 4d 3b 0a 0a 20 20 6e 53 6b 69 70 20 3d 20 73  EM;..  nSkip = s
2cb80 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
2cb90 69 6e 74 28 70 2d 3e 70 4c 69 73 74 2d 3e 61 44  int(p->pList->aD
2cba0 61 74 61 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  ata, &dummy);.  
2cbb0 2a 70 6e 44 61 74 61 20 3d 20 70 2d 3e 70 4c 69  *pnData = p->pLi
2cbc0 73 74 2d 3e 6e 44 61 74 61 20 2d 20 6e 53 6b 69  st->nData - nSki
2cbd0 70 3b 0a 20 20 2a 70 70 44 61 74 61 20 3d 20 70  p;.  *ppData = p
2cbe0 52 65 74 3b 0a 20 20 0a 20 20 6d 65 6d 63 70 79  Ret;.  .  memcpy
2cbf0 28 70 52 65 74 2c 20 26 70 2d 3e 70 4c 69 73 74  (pRet, &p->pList
2cc00 2d 3e 61 44 61 74 61 5b 6e 53 6b 69 70 5d 2c 20  ->aData[nSkip], 
2cc10 2a 70 6e 44 61 74 61 29 3b 0a 20 20 72 65 74 75  *pnData);.  retu
2cc20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2cc30 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e  ./*.** Add an en
2cc40 74 72 79 20 66 6f 72 20 74 6f 6b 65 6e 20 70 54  try for token pT
2cc50 6f 6b 65 6e 20 74 6f 20 74 68 65 20 70 43 73 72  oken to the pCsr
2cc60 2d 3e 70 44 65 66 65 72 72 65 64 20 6c 69 73 74  ->pDeferred list
2cc70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2cc80 46 74 73 33 44 65 66 65 72 54 6f 6b 65 6e 28 0a  Fts3DeferToken(.
2cc90 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43    Fts3Cursor *pC
2cca0 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sr,             
2ccb0 20 20 2f 2a 20 46 74 73 33 20 74 61 62 6c 65 20    /* Fts3 table 
2ccc0 63 75 72 73 6f 72 20 2a 2f 0a 20 20 46 74 73 33  cursor */.  Fts3
2ccd0 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70 54 6f  PhraseToken *pTo
2cce0 6b 65 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ken,        /* T
2ccf0 6f 6b 65 6e 20 74 6f 20 64 65 66 65 72 20 2a 2f  oken to defer */
2cd00 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20  .  int iCol     
2cd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 68 61     /* Column tha
2cd30 74 20 74 6f 6b 65 6e 20 6d 75 73 74 20 61 70 70  t token must app
2cd40 65 61 72 20 69 6e 20 28 6f 72 20 2d 31 29 20 2a  ear in (or -1) *
2cd50 2f 0a 29 7b 0a 20 20 46 74 73 33 44 65 66 65 72  /.){.  Fts3Defer
2cd60 72 65 64 54 6f 6b 65 6e 20 2a 70 44 65 66 65 72  redToken *pDefer
2cd70 72 65 64 3b 0a 20 20 70 44 65 66 65 72 72 65 64  red;.  pDeferred
2cd80 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
2cd90 63 28 73 69 7a 65 6f 66 28 2a 70 44 65 66 65 72  c(sizeof(*pDefer
2cda0 72 65 64 29 29 3b 0a 20 20 69 66 28 20 21 70 44  red));.  if( !pD
2cdb0 65 66 65 72 72 65 64 20 29 7b 0a 20 20 20 20 72  eferred ){.    r
2cdc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2cdd0 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  EM;.  }.  memset
2cde0 28 70 44 65 66 65 72 72 65 64 2c 20 30 2c 20 73  (pDeferred, 0, s
2cdf0 69 7a 65 6f 66 28 2a 70 44 65 66 65 72 72 65 64  izeof(*pDeferred
2ce00 29 29 3b 0a 20 20 70 44 65 66 65 72 72 65 64 2d  ));.  pDeferred-
2ce10 3e 70 54 6f 6b 65 6e 20 3d 20 70 54 6f 6b 65 6e  >pToken = pToken
2ce20 3b 0a 20 20 70 44 65 66 65 72 72 65 64 2d 3e 70  ;.  pDeferred->p
2ce30 4e 65 78 74 20 3d 20 70 43 73 72 2d 3e 70 44 65  Next = pCsr->pDe
2ce40 66 65 72 72 65 64 3b 20 0a 20 20 70 44 65 66 65  ferred; .  pDefe
2ce50 72 72 65 64 2d 3e 69 43 6f 6c 20 3d 20 69 43 6f  rred->iCol = iCo
2ce60 6c 3b 0a 20 20 70 43 73 72 2d 3e 70 44 65 66 65  l;.  pCsr->pDefe
2ce70 72 72 65 64 20 3d 20 70 44 65 66 65 72 72 65 64  rred = pDeferred
2ce80 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  ;..  assert( pTo
2ce90 6b 65 6e 2d 3e 70 44 65 66 65 72 72 65 64 3d 3d  ken->pDeferred==
2cea0 30 20 29 3b 0a 20 20 70 54 6f 6b 65 6e 2d 3e 70  0 );.  pToken->p
2ceb0 44 65 66 65 72 72 65 64 20 3d 20 70 44 65 66 65  Deferred = pDefe
2cec0 72 72 65 64 3b 0a 0a 20 20 72 65 74 75 72 6e 20  rred;..  return 
2ced0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
2cee0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74  dif../*.** SQLit
2cef0 65 20 76 61 6c 75 65 20 70 52 6f 77 69 64 20 63  e value pRowid c
2cf00 6f 6e 74 61 69 6e 73 20 74 68 65 20 72 6f 77 69  ontains the rowi
2cf10 64 20 6f 66 20 61 20 72 6f 77 20 74 68 61 74 20  d of a row that 
2cf20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
2cf30 65 0a 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20  e.** present in 
2cf40 74 68 65 20 46 54 53 33 20 74 61 62 6c 65 2e 20  the FTS3 table. 
2cf50 49 66 20 69 74 20 69 73 2c 20 64 65 6c 65 74 65  If it is, delete
2cf60 20 69 74 20 61 6e 64 20 61 64 6a 75 73 74 20 74   it and adjust t
2cf70 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  he contents.** o
2cf80 66 20 73 75 62 73 69 64 75 61 72 79 20 64 61 74  f subsiduary dat
2cf90 61 20 73 74 72 75 63 74 75 72 65 73 20 61 63 63  a structures acc
2cfa0 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61  ordingly..*/.sta
2cfb0 74 69 63 20 69 6e 74 20 66 74 73 33 44 65 6c 65  tic int fts3Dele
2cfc0 74 65 42 79 52 6f 77 69 64 28 0a 20 20 46 74 73  teByRowid(.  Fts
2cfd0 33 54 61 62 6c 65 20 2a 70 2c 20 0a 20 20 73 71  3Table *p, .  sq
2cfe0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 6f  lite3_value *pRo
2cff0 77 69 64 2c 20 0a 20 20 69 6e 74 20 2a 70 6e 43  wid, .  int *pnC
2d000 68 6e 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  hng,            
2d010 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
2d020 54 3a 20 44 65 63 72 65 6d 65 6e 74 20 69 66 20  T: Decrement if 
2d030 72 6f 77 20 69 73 20 64 65 6c 65 74 65 64 20 2a  row is deleted *
2d040 2f 0a 20 20 75 33 32 20 2a 61 53 7a 44 65 6c 0a  /.  u32 *aSzDel.
2d050 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2d060 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2d070 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2d080 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 62 46 6f  ode */.  int bFo
2d090 75 6e 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  und = 0;        
2d0a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2d0b0 20 69 66 20 2a 70 52 6f 77 69 64 20 72 65 61 6c   if *pRowid real
2d0c0 6c 79 20 69 73 20 69 6e 20 74 68 65 20 74 61 62  ly is in the tab
2d0d0 6c 65 20 2a 2f 0a 0a 20 20 66 74 73 33 44 65 6c  le */..  fts3Del
2d0e0 65 74 65 54 65 72 6d 73 28 26 72 63 2c 20 70 2c  eteTerms(&rc, p,
2d0f0 20 70 52 6f 77 69 64 2c 20 61 53 7a 44 65 6c 2c   pRowid, aSzDel,
2d100 20 26 62 46 6f 75 6e 64 29 3b 0a 20 20 69 66 28   &bFound);.  if(
2d110 20 62 46 6f 75 6e 64 20 26 26 20 72 63 3d 3d 53   bFound && rc==S
2d120 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d130 69 6e 74 20 69 73 45 6d 70 74 79 20 3d 20 30 3b  int isEmpty = 0;
2d140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d150 20 44 65 6c 65 74 69 6e 67 20 2a 70 52 6f 77 69   Deleting *pRowi
2d160 64 20 6c 65 61 76 65 73 20 74 68 65 20 74 61 62  d leaves the tab
2d170 6c 65 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20  le empty */.    
2d180 72 63 20 3d 20 66 74 73 33 49 73 45 6d 70 74 79  rc = fts3IsEmpty
2d190 28 70 2c 20 70 52 6f 77 69 64 2c 20 26 69 73 45  (p, pRowid, &isE
2d1a0 6d 70 74 79 29 3b 0a 20 20 20 20 69 66 28 20 72  mpty);.    if( r
2d1b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2d1c0 20 20 20 20 20 20 69 66 28 20 69 73 45 6d 70 74        if( isEmpt
2d1d0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  y ){.        /* 
2d1e0 44 65 6c 65 74 69 6e 67 20 74 68 69 73 20 72 6f  Deleting this ro
2d1f0 77 20 6d 65 61 6e 73 20 74 68 65 20 77 68 6f 6c  w means the whol
2d200 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
2d210 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20  . In this case. 
2d220 20 20 20 20 20 20 20 2a 2a 20 64 65 6c 65 74 65         ** delete
2d230 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2d240 20 61 6c 6c 20 74 68 72 65 65 20 74 61 62 6c 65   all three table
2d250 73 20 61 6e 64 20 74 68 72 6f 77 20 61 77 61 79  s and throw away
2d260 20 61 6e 79 0a 20 20 20 20 20 20 20 20 2a 2a 20   any.        ** 
2d270 64 61 74 61 20 69 6e 20 74 68 65 20 70 65 6e 64  data in the pend
2d280 69 6e 67 54 65 72 6d 73 20 68 61 73 68 20 74 61  ingTerms hash ta
2d290 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ble.  */.       
2d2a0 20 72 63 20 3d 20 66 74 73 33 44 65 6c 65 74 65   rc = fts3Delete
2d2b0 41 6c 6c 28 70 2c 20 31 29 3b 0a 20 20 20 20 20  All(p, 1);.     
2d2c0 20 20 20 2a 70 6e 43 68 6e 67 20 3d 20 30 3b 0a     *pnChng = 0;.
2d2d0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61          memset(a
2d2e0 53 7a 44 65 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  SzDel, 0, sizeof
2d2f0 28 75 33 32 29 20 2a 20 28 70 2d 3e 6e 43 6f 6c  (u32) * (p->nCol
2d300 75 6d 6e 2b 31 29 20 2a 20 32 29 3b 0a 20 20 20  umn+1) * 2);.   
2d310 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d320 20 20 2a 70 6e 43 68 6e 67 20 3d 20 2a 70 6e 43    *pnChng = *pnC
2d330 68 6e 67 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  hng - 1;.       
2d340 20 69 66 28 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74   if( p->zContent
2d350 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tbl==0 ){.      
2d360 20 20 20 20 66 74 73 33 53 71 6c 45 78 65 63 28      fts3SqlExec(
2d370 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c 45  &rc, p, SQL_DELE
2d380 54 45 5f 43 4f 4e 54 45 4e 54 2c 20 26 70 52 6f  TE_CONTENT, &pRo
2d390 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  wid);.        }.
2d3a0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62          if( p->b
2d3b0 48 61 73 44 6f 63 73 69 7a 65 20 29 7b 0a 20 20  HasDocsize ){.  
2d3c0 20 20 20 20 20 20 20 20 66 74 73 33 53 71 6c 45          fts3SqlE
2d3d0 78 65 63 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f  xec(&rc, p, SQL_
2d3e0 44 45 4c 45 54 45 5f 44 4f 43 53 49 5a 45 2c 20  DELETE_DOCSIZE, 
2d3f0 26 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  &pRowid);.      
2d400 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2d410 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
2d420 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2d430 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
2d440 74 68 65 20 77 6f 72 6b 20 66 6f 72 20 74 68 65  the work for the
2d450 20 78 55 70 64 61 74 65 20 6d 65 74 68 6f 64 20   xUpdate method 
2d460 6f 66 20 46 54 53 33 20 76 69 72 74 75 61 6c 0a  of FTS3 virtual.
2d470 2a 2a 20 74 61 62 6c 65 73 2e 20 54 68 65 20 73  ** tables. The s
2d480 63 68 65 6d 61 20 6f 66 20 74 68 65 20 76 69 72  chema of the vir
2d490 74 75 61 6c 20 74 61 62 6c 65 20 62 65 69 6e 67  tual table being
2d4a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41  :.**.**     CREA
2d4b0 54 45 20 54 41 42 4c 45 20 3c 74 61 62 6c 65 20  TE TABLE <table 
2d4c0 6e 61 6d 65 3e 28 20 0a 2a 2a 20 20 20 20 20 20  name>( .**      
2d4d0 20 3c 75 73 65 72 20 63 6f 6c 75 6d 6e 73 3e 2c   <user columns>,
2d4e0 0a 2a 2a 20 20 20 20 20 20 20 3c 74 61 62 6c 65  .**       <table
2d4f0 20 6e 61 6d 65 3e 20 48 49 44 44 45 4e 2c 20 0a   name> HIDDEN, .
2d500 2a 2a 20 20 20 20 20 20 20 64 6f 63 69 64 20 48  **       docid H
2d510 49 44 44 45 4e 2c 20 0a 2a 2a 20 20 20 20 20 20  IDDEN, .**      
2d520 20 3c 6c 61 6e 67 69 64 3e 20 48 49 44 44 45 4e   <langid> HIDDEN
2d530 0a 2a 2a 20 20 20 20 20 29 3b 0a 2a 2a 0a 2a 2a  .**     );.**.**
2d540 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
2d550 46 74 73 33 55 70 64 61 74 65 4d 65 74 68 6f 64  Fts3UpdateMethod
2d560 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  (.  sqlite3_vtab
2d570 20 2a 70 56 74 61 62 2c 20 20 20 20 20 20 20 20   *pVtab,        
2d580 20 20 20 20 2f 2a 20 46 54 53 33 20 76 74 61 62      /* FTS3 vtab
2d590 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
2d5a0 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20   nArg,          
2d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d5c0 53 69 7a 65 20 6f 66 20 61 72 67 75 6d 65 6e 74  Size of argument
2d5d0 20 61 72 72 61 79 20 2a 2f 0a 20 20 73 71 6c 69   array */.  sqli
2d5e0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
2d5f0 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  l,          /* A
2d600 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74  rray of argument
2d610 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e  s */.  sqlite_in
2d620 74 36 34 20 2a 70 52 6f 77 69 64 20 20 20 20 20  t64 *pRowid     
2d630 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54         /* OUT: T
2d640 68 65 20 61 66 66 65 63 74 65 64 20 28 6f 72 20  he affected (or 
2d650 65 66 66 65 63 74 65 64 29 20 72 6f 77 69 64 20  effected) rowid 
2d660 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 54 61 62 6c  */.){.  Fts3Tabl
2d670 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c  e *p = (Fts3Tabl
2d680 65 20 2a 29 70 56 74 61 62 3b 0a 20 20 69 6e 74  e *)pVtab;.  int
2d690 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d6b0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
2d6c0 20 69 6e 74 20 69 73 52 65 6d 6f 76 65 20 3d 20   int isRemove = 
2d6d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2d6e0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 6e 20   /* True for an 
2d6f0 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
2d700 20 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a 49 6e   */.  u32 *aSzIn
2d710 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
2d720 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f        /* Sizes o
2d730 66 20 69 6e 73 65 72 74 65 64 20 64 6f 63 75 6d  f inserted docum
2d740 65 6e 74 73 20 2a 2f 0a 20 20 75 33 32 20 2a 61  ents */.  u32 *a
2d750 53 7a 44 65 6c 20 3d 20 30 3b 20 20 20 20 20 20  SzDel = 0;      
2d760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
2d770 65 73 20 6f 66 20 64 65 6c 65 74 65 64 20 64 6f  es of deleted do
2d780 63 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  cuments */.  int
2d790 20 6e 43 68 6e 67 20 3d 20 30 3b 20 20 20 20 20   nChng = 0;     
2d7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d7b0 4e 65 74 20 63 68 61 6e 67 65 20 69 6e 20 6e 75  Net change in nu
2d7c0 6d 62 65 72 20 6f 66 20 64 6f 63 75 6d 65 6e 74  mber of document
2d7d0 73 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 73 65  s */.  int bInse
2d7e0 72 74 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20 2f  rtDone = 0;..  /
2d7f0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
2d800 69 74 20 6d 75 73 74 20 62 65 20 6b 6e 6f 77 6e  it must be known
2d810 20 69 66 20 74 68 65 20 25 5f 73 74 61 74 20 74   if the %_stat t
2d820 61 62 6c 65 20 65 78 69 73 74 73 20 6f 72 20 6e  able exists or n
2d830 6f 74 2e 0a 20 20 2a 2a 20 53 6f 20 62 48 61 73  ot..  ** So bHas
2d840 53 74 61 74 20 6d 61 79 20 6e 6f 74 20 62 65 20  Stat may not be 
2d850 32 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  2.  */.  assert(
2d860 20 70 2d 3e 62 48 61 73 53 74 61 74 3d 3d 30 20   p->bHasStat==0 
2d870 7c 7c 20 70 2d 3e 62 48 61 73 53 74 61 74 3d 3d  || p->bHasStat==
2d880 31 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  1 );..  assert( 
2d890 70 2d 3e 70 53 65 67 6d 65 6e 74 73 3d 3d 30 20  p->pSegments==0 
2d8a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 0a 20 20  );.  assert( .  
2d8b0 20 20 20 20 6e 41 72 67 3d 3d 31 20 20 20 20 20      nArg==1     
2d8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d8d0 2f 2a 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74  /* DELETE operat
2d8e0 69 6f 6e 73 20 2a 2f 0a 20 20 20 7c 7c 20 6e 41  ions */.   || nA
2d8f0 72 67 3d 3d 28 32 20 2b 20 70 2d 3e 6e 43 6f 6c  rg==(2 + p->nCol
2d900 75 6d 6e 20 2b 20 33 29 20 20 2f 2a 20 49 4e 53  umn + 3)  /* INS
2d910 45 52 54 20 6f 72 20 55 50 44 41 54 45 20 6f 70  ERT or UPDATE op
2d920 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 29 3b  erations */.  );
2d930 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
2d940 20 61 20 22 73 70 65 63 69 61 6c 22 20 49 4e 53   a "special" INS
2d950 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 2e 20 4f  ERT operation. O
2d960 6e 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  ne of the form:.
2d970 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 49 4e 53 45    **.  **   INSE
2d980 52 54 20 49 4e 54 4f 20 78 79 7a 28 78 79 7a 29  RT INTO xyz(xyz)
2d990 20 56 41 4c 55 45 53 28 27 63 6f 6d 6d 61 6e 64   VALUES('command
2d9a0 27 29 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ');.  */.  if( n
2d9b0 41 72 67 3e 31 20 0a 20 20 20 26 26 20 73 71 6c  Arg>1 .   && sql
2d9c0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
2d9d0 61 70 56 61 6c 5b 30 5d 29 3d 3d 53 51 4c 49 54  apVal[0])==SQLIT
2d9e0 45 5f 4e 55 4c 4c 20 0a 20 20 20 26 26 20 73 71  E_NULL .   && sq
2d9f0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
2da00 28 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d  (apVal[p->nColum
2da10 6e 2b 32 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55  n+2])!=SQLITE_NU
2da20 4c 4c 20 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  LL .  ){.    rc 
2da30 3d 20 66 74 73 33 53 70 65 63 69 61 6c 49 6e 73  = fts3SpecialIns
2da40 65 72 74 28 70 2c 20 61 70 56 61 6c 5b 70 2d 3e  ert(p, apVal[p->
2da50 6e 43 6f 6c 75 6d 6e 2b 32 5d 29 3b 0a 20 20 20  nColumn+2]);.   
2da60 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 6f 75 74   goto update_out
2da70 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 41 72  ;.  }..  if( nAr
2da80 67 3e 31 20 26 26 20 73 71 6c 69 74 65 33 5f 76  g>1 && sqlite3_v
2da90 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 32  alue_int(apVal[2
2daa0 20 2b 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b 20   + p->nColumn + 
2dab0 32 5d 29 3c 30 20 29 7b 0a 20 20 20 20 72 63 20  2])<0 ){.    rc 
2dac0 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  = SQLITE_CONSTRA
2dad0 49 4e 54 3b 0a 20 20 20 20 67 6f 74 6f 20 75 70  INT;.    goto up
2dae0 64 61 74 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  date_out;.  }.. 
2daf0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
2db00 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 63  ce to hold the c
2db10 68 61 6e 67 65 20 69 6e 20 64 6f 63 75 6d 65 6e  hange in documen
2db20 74 20 73 69 7a 65 73 20 2a 2f 0a 20 20 61 53 7a  t sizes */.  aSz
2db30 44 65 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Del = sqlite3_ma
2db40 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61 53 7a  lloc( sizeof(aSz
2db50 44 65 6c 5b 30 5d 29 2a 28 70 2d 3e 6e 43 6f 6c  Del[0])*(p->nCol
2db60 75 6d 6e 2b 31 29 2a 32 20 29 3b 0a 20 20 69 66  umn+1)*2 );.  if
2db70 28 20 61 53 7a 44 65 6c 3d 3d 30 20 29 7b 0a 20  ( aSzDel==0 ){. 
2db80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2db90 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 75  OMEM;.    goto u
2dba0 70 64 61 74 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  pdate_out;.  }. 
2dbb0 20 61 53 7a 49 6e 73 20 3d 20 26 61 53 7a 44 65   aSzIns = &aSzDe
2dbc0 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 5d 3b  l[p->nColumn+1];
2dbd0 0a 20 20 6d 65 6d 73 65 74 28 61 53 7a 44 65 6c  .  memset(aSzDel
2dbe0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 53 7a 44  , 0, sizeof(aSzD
2dbf0 65 6c 5b 30 5d 29 2a 28 70 2d 3e 6e 43 6f 6c 75  el[0])*(p->nColu
2dc00 6d 6e 2b 31 29 2a 32 29 3b 0a 0a 20 20 72 63 20  mn+1)*2);..  rc 
2dc10 3d 20 66 74 73 33 57 72 69 74 65 6c 6f 63 6b 28  = fts3Writelock(
2dc20 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  p);.  if( rc!=SQ
2dc30 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 75  LITE_OK ) goto u
2dc40 70 64 61 74 65 5f 6f 75 74 3b 0a 0a 20 20 2f 2a  pdate_out;..  /*
2dc50 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 49   If this is an I
2dc60 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 2c  NSERT operation,
2dc70 20 6f 72 20 61 6e 20 55 50 44 41 54 45 20 74 68   or an UPDATE th
2dc80 61 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20  at modifies the 
2dc90 72 6f 77 69 64 0a 20 20 2a 2a 20 76 61 6c 75 65  rowid.  ** value
2dca0 2c 20 74 68 65 6e 20 74 68 69 73 20 6f 70 65 72  , then this oper
2dcb0 61 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 63  ation requires c
2dcc0 6f 6e 73 74 72 61 69 6e 74 20 68 61 6e 64 6c 69  onstraint handli
2dcd0 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ng..  **.  ** If
2dce0 20 74 68 65 20 6f 6e 2d 63 6f 6e 66 6c 69 63 74   the on-conflict
2dcf0 20 6d 6f 64 65 20 69 73 20 52 45 50 4c 41 43 45   mode is REPLACE
2dd00 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68 61  , this means tha
2dd10 74 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 72  t the existing r
2dd20 6f 77 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62  ow.  ** should b
2dd30 65 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74  e deleted from t
2dd40 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
2dd50 72 65 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65  re inserting the
2dd60 20 6e 65 77 20 72 6f 77 2e 20 4f 72 2c 0a 20 20   new row. Or,.  
2dd70 2a 2a 20 69 66 20 74 68 65 20 6f 6e 2d 63 6f 6e  ** if the on-con
2dd80 66 6c 69 63 74 20 6d 6f 64 65 20 69 73 20 6f 74  flict mode is ot
2dd90 68 65 72 20 74 68 61 6e 20 52 45 50 4c 41 43 45  her than REPLACE
2dda0 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 65 74 68  , then this meth
2ddb0 6f 64 20 6d 75 73 74 0a 20 20 2a 2a 20 64 65 74  od must.  ** det
2ddc0 65 63 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74  ect the conflict
2ddd0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
2dde0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 62 65  TE_CONSTRAINT be
2ddf0 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67 20 74  fore beginning t
2de00 6f 0a 20 20 2a 2a 20 6d 6f 64 69 66 79 20 74 68  o.  ** modify th
2de10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2de20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67  .  */.  if( nArg
2de30 3e 31 20 26 26 20 70 2d 3e 7a 43 6f 6e 74 65 6e  >1 && p->zConten
2de40 74 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  tTbl==0 ){.    /
2de50 2a 20 46 69 6e 64 20 74 68 65 20 76 61 6c 75 65  * Find the value
2de60 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68 6f 6c   object that hol
2de70 64 73 20 74 68 65 20 6e 65 77 20 72 6f 77 69 64  ds the new rowid
2de80 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 73   value. */.    s
2de90 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 4e  qlite3_value *pN
2dea0 65 77 52 6f 77 69 64 20 3d 20 61 70 56 61 6c 5b  ewRowid = apVal[
2deb0 33 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20  3+p->nColumn];. 
2dec0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76     if( sqlite3_v
2ded0 61 6c 75 65 5f 74 79 70 65 28 70 4e 65 77 52 6f  alue_type(pNewRo
2dee0 77 69 64 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  wid)==SQLITE_NUL
2def0 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 52  L ){.      pNewR
2df00 6f 77 69 64 20 3d 20 61 70 56 61 6c 5b 31 5d 3b  owid = apVal[1];
2df10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
2df20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
2df30 70 65 28 70 4e 65 77 52 6f 77 69 64 29 21 3d 53  pe(pNewRowid)!=S
2df40 51 4c 49 54 45 5f 4e 55 4c 4c 20 26 26 20 28 20  QLITE_NULL && ( 
2df50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2df60 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61  _value_type(apVa
2df70 6c 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55  l[0])==SQLITE_NU
2df80 4c 4c 0a 20 20 20 20 20 7c 7c 20 73 71 6c 69 74  LL.     || sqlit
2df90 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
2dfa0 70 56 61 6c 5b 30 5d 29 21 3d 73 71 6c 69 74 65  pVal[0])!=sqlite
2dfb0 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 4e  3_value_int64(pN
2dfc0 65 77 52 6f 77 69 64 29 0a 20 20 20 20 29 29 7b  ewRowid).    )){
2dfd0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65  .      /* The ne
2dfe0 77 20 72 6f 77 69 64 20 69 73 20 6e 6f 74 20 4e  w rowid is not N
2dff0 55 4c 4c 20 28 69 6e 20 74 68 69 73 20 63 61 73  ULL (in this cas
2e000 65 20 74 68 65 20 72 6f 77 69 64 20 77 69 6c 6c  e the rowid will
2e010 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 61 75 74   be.      ** aut
2e020 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 73 69 67  omatically assig
2e030 6e 65 64 20 61 6e 64 20 74 68 65 72 65 20 69 73  ned and there is
2e040 20 6e 6f 20 63 68 61 6e 63 65 20 6f 66 20 61 20   no chance of a 
2e050 63 6f 6e 66 6c 69 63 74 29 2c 20 61 6e 64 20 0a  conflict), and .
2e060 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61        ** the sta
2e070 74 65 6d 65 6e 74 20 69 73 20 65 69 74 68 65 72  tement is either
2e080 20 61 6e 20 49 4e 53 45 52 54 20 6f 72 20 61 6e   an INSERT or an
2e090 20 55 50 44 41 54 45 20 74 68 61 74 20 6d 6f 64   UPDATE that mod
2e0a0 69 66 69 65 73 20 74 68 65 0a 20 20 20 20 20 20  ifies the.      
2e0b0 2a 2a 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 2e  ** rowid column.
2e0c0 20 53 6f 20 69 66 20 74 68 65 20 63 6f 6e 66 6c   So if the confl
2e0d0 69 63 74 20 6d 6f 64 65 20 69 73 20 52 45 50 4c  ict mode is REPL
2e0e0 41 43 45 2c 20 74 68 65 6e 20 64 65 6c 65 74 65  ACE, then delete
2e0f0 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 65 78   any.      ** ex
2e100 69 73 74 69 6e 67 20 72 6f 77 20 77 69 74 68 20  isting row with 
2e110 72 6f 77 69 64 3d 70 4e 65 77 52 6f 77 69 64 2e  rowid=pNewRowid.
2e120 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
2e130 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 63   ** Or, if the c
2e140 6f 6e 66 6c 69 63 74 20 6d 6f 64 65 20 69 73 20  onflict mode is 
2e150 6e 6f 74 20 52 45 50 4c 41 43 45 2c 20 69 6e 73  not REPLACE, ins
2e160 65 72 74 20 74 68 65 20 6e 65 77 20 72 65 63 6f  ert the new reco
2e170 72 64 20 69 6e 74 6f 20 0a 20 20 20 20 20 20 2a  rd into .      *
2e180 2a 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20  * the %_content 
2e190 74 61 62 6c 65 2e 20 49 66 20 77 65 20 68 69 74  table. If we hit
2e1a0 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 72   the duplicate r
2e1b0 6f 77 69 64 20 63 6f 6e 73 74 72 61 69 6e 74 20  owid constraint 
2e1c0 28 6f 72 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a  (or any.      **
2e1d0 20 6f 74 68 65 72 20 65 72 72 6f 72 29 20 77 68   other error) wh
2e1e0 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 20 72 65  ile doing so, re
2e1f0 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  turn immediately
2e200 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2e210 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   ** This branch 
2e220 6d 61 79 20 61 6c 73 6f 20 72 75 6e 20 69 66 20  may also run if 
2e230 70 4e 65 77 52 6f 77 69 64 20 63 6f 6e 74 61 69  pNewRowid contai
2e240 6e 73 20 61 20 76 61 6c 75 65 20 74 68 61 74 20  ns a value that 
2e250 63 61 6e 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20  cannot.      ** 
2e260 62 65 20 6c 6f 73 73 6c 65 73 73 6c 79 20 63 6f  be losslessly co
2e270 6e 76 65 72 74 65 64 20 74 6f 20 61 6e 20 69 6e  nverted to an in
2e280 74 65 67 65 72 2e 20 49 6e 20 74 68 69 73 20 63  teger. In this c
2e290 61 73 65 2c 20 74 68 65 20 65 76 65 6e 74 75 61  ase, the eventua
2e2a0 6c 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  l .      ** call
2e2b0 20 74 6f 20 66 74 73 33 49 6e 73 65 72 74 44 61   to fts3InsertDa
2e2c0 74 61 28 29 20 28 65 69 74 68 65 72 20 6a 75 73  ta() (either jus
2e2d0 74 20 62 65 6c 6f 77 20 6f 72 20 66 75 72 74 68  t below or furth
2e2e0 65 72 20 6f 6e 20 69 6e 20 74 68 69 73 0a 20 20  er on in this.  
2e2f0 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 29      ** function)
2e300 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c   will return SQL
2e310 49 54 45 5f 4d 49 53 4d 41 54 43 48 2e 20 49 66  ITE_MISMATCH. If
2e320 20 66 74 73 33 44 65 6c 65 74 65 42 79 52 6f 77   fts3DeleteByRow
2e330 69 64 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  id is .      ** 
2e340 69 6e 76 6f 6b 65 64 2c 20 69 74 20 77 69 6c 6c  invoked, it will
2e350 20 64 65 6c 65 74 65 20 7a 65 72 6f 20 72 6f 77   delete zero row
2e360 73 20 28 73 69 6e 63 65 20 6e 6f 20 72 6f 77 20  s (since no row 
2e370 77 69 6c 6c 20 68 61 76 65 0a 20 20 20 20 20 20  will have.      
2e380 2a 2a 20 64 6f 63 69 64 3d 24 70 4e 65 77 52 6f  ** docid=$pNewRo
2e390 77 69 64 20 69 66 20 24 70 4e 65 77 52 6f 77 69  wid if $pNewRowi
2e3a0 64 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65  d is not an inte
2e3b0 67 65 72 20 76 61 6c 75 65 29 2e 0a 20 20 20 20  ger value)..    
2e3c0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73    */.      if( s
2e3d0 71 6c 69 74 65 33 5f 76 74 61 62 5f 6f 6e 5f 63  qlite3_vtab_on_c
2e3e0 6f 6e 66 6c 69 63 74 28 70 2d 3e 64 62 29 3d 3d  onflict(p->db)==
2e3f0 53 51 4c 49 54 45 5f 52 45 50 4c 41 43 45 20 29  SQLITE_REPLACE )
2e400 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
2e410 74 73 33 44 65 6c 65 74 65 42 79 52 6f 77 69 64  ts3DeleteByRowid
2e420 28 70 2c 20 70 4e 65 77 52 6f 77 69 64 2c 20 26  (p, pNewRowid, &
2e430 6e 43 68 6e 67 2c 20 61 53 7a 44 65 6c 29 3b 0a  nChng, aSzDel);.
2e440 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2e450 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e       rc = fts3In
2e460 73 65 72 74 44 61 74 61 28 70 2c 20 61 70 56 61  sertData(p, apVa
2e470 6c 2c 20 70 52 6f 77 69 64 29 3b 0a 20 20 20 20  l, pRowid);.    
2e480 20 20 20 20 62 49 6e 73 65 72 74 44 6f 6e 65 20      bInsertDone 
2e490 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
2e4a0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21   }.  }.  if( rc!
2e4b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e4c0 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 6f 75    goto update_ou
2e4d0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  t;.  }..  /* If 
2e4e0 74 68 69 73 20 69 73 20 61 20 44 45 4c 45 54 45  this is a DELETE
2e4f0 20 6f 72 20 55 50 44 41 54 45 20 6f 70 65 72 61   or UPDATE opera
2e500 74 69 6f 6e 2c 20 72 65 6d 6f 76 65 20 74 68 65  tion, remove the
2e510 20 6f 6c 64 20 72 65 63 6f 72 64 2e 20 2a 2f 0a   old record. */.
2e520 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
2e530 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 30  lue_type(apVal[0
2e540 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  ])!=SQLITE_NULL 
2e550 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
2e560 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
2e570 65 28 61 70 56 61 6c 5b 30 5d 29 3d 3d 53 51 4c  e(apVal[0])==SQL
2e580 49 54 45 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20  ITE_INTEGER );. 
2e590 20 20 20 72 63 20 3d 20 66 74 73 33 44 65 6c 65     rc = fts3Dele
2e5a0 74 65 42 79 52 6f 77 69 64 28 70 2c 20 61 70 56  teByRowid(p, apV
2e5b0 61 6c 5b 30 5d 2c 20 26 6e 43 68 6e 67 2c 20 61  al[0], &nChng, a
2e5c0 53 7a 44 65 6c 29 3b 0a 20 20 20 20 69 73 52 65  SzDel);.    isRe
2e5d0 6d 6f 76 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  move = 1;.  }.  
2e5e0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
2e5f0 20 61 6e 20 49 4e 53 45 52 54 20 6f 72 20 55 50   an INSERT or UP
2e600 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 2c 20  DATE operation, 
2e610 69 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 72  insert the new r
2e620 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 69 66 28 20  ecord. */.  if( 
2e630 6e 41 72 67 3e 31 20 26 26 20 72 63 3d 3d 53 51  nArg>1 && rc==SQ
2e640 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2e650 6e 74 20 69 4c 61 6e 67 69 64 20 3d 20 73 71 6c  nt iLangid = sql
2e660 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
2e670 70 56 61 6c 5b 32 20 2b 20 70 2d 3e 6e 43 6f 6c  pVal[2 + p->nCol
2e680 75 6d 6e 20 2b 20 32 5d 29 3b 0a 20 20 20 20 69  umn + 2]);.    i
2e690 66 28 20 62 49 6e 73 65 72 74 44 6f 6e 65 3d 3d  f( bInsertDone==
2e6a0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
2e6b0 66 74 73 33 49 6e 73 65 72 74 44 61 74 61 28 70  fts3InsertData(p
2e6c0 2c 20 61 70 56 61 6c 2c 20 70 52 6f 77 69 64 29  , apVal, pRowid)
2e6d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2e6e0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
2e6f0 54 20 26 26 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74  T && p->zContent
2e700 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tbl==0 ){.      
2e710 20 20 72 63 20 3d 20 46 54 53 5f 43 4f 52 52 55    rc = FTS_CORRU
2e720 50 54 5f 56 54 41 42 3b 0a 20 20 20 20 20 20 7d  PT_VTAB;.      }
2e730 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2e740 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2e750 28 21 69 73 52 65 6d 6f 76 65 20 7c 7c 20 2a 70  (!isRemove || *p
2e760 52 6f 77 69 64 21 3d 70 2d 3e 69 50 72 65 76 44  Rowid!=p->iPrevD
2e770 6f 63 69 64 20 29 20 29 7b 0a 20 20 20 20 20 20  ocid ) ){.      
2e780 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67  rc = fts3Pending
2e790 54 65 72 6d 73 44 6f 63 69 64 28 70 2c 20 69 4c  TermsDocid(p, iL
2e7a0 61 6e 67 69 64 2c 20 2a 70 52 6f 77 69 64 29 3b  angid, *pRowid);
2e7b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2e7c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2e7d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
2e7e0 3e 69 50 72 65 76 44 6f 63 69 64 3d 3d 2a 70 52  >iPrevDocid==*pR
2e7f0 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 72 63  owid );.      rc
2e800 20 3d 20 66 74 73 33 49 6e 73 65 72 74 54 65 72   = fts3InsertTer
2e810 6d 73 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 61  ms(p, iLangid, a
2e820 70 56 61 6c 2c 20 61 53 7a 49 6e 73 29 3b 0a 20  pVal, aSzIns);. 
2e830 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
2e840 62 48 61 73 44 6f 63 73 69 7a 65 20 29 7b 0a 20  bHasDocsize ){. 
2e850 20 20 20 20 20 66 74 73 33 49 6e 73 65 72 74 44       fts3InsertD
2e860 6f 63 73 69 7a 65 28 26 72 63 2c 20 70 2c 20 61  ocsize(&rc, p, a
2e870 53 7a 49 6e 73 29 3b 0a 20 20 20 20 7d 0a 20 20  SzIns);.    }.  
2e880 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20 7d 0a 0a    nChng++;.  }..
2e890 20 20 69 66 28 20 70 2d 3e 62 46 74 73 34 20 29    if( p->bFts4 )
2e8a0 7b 0a 20 20 20 20 66 74 73 33 55 70 64 61 74 65  {.    fts3Update
2e8b0 44 6f 63 54 6f 74 61 6c 73 28 26 72 63 2c 20 70  DocTotals(&rc, p
2e8c0 2c 20 61 53 7a 49 6e 73 2c 20 61 53 7a 44 65 6c  , aSzIns, aSzDel
2e8d0 2c 20 6e 43 68 6e 67 29 3b 0a 20 20 7d 0a 0a 20  , nChng);.  }.. 
2e8e0 75 70 64 61 74 65 5f 6f 75 74 3a 0a 20 20 73 71  update_out:.  sq
2e8f0 6c 69 74 65 33 5f 66 72 65 65 28 61 53 7a 44 65  lite3_free(aSzDe
2e900 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73  l);.  sqlite3Fts
2e910 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28 70  3SegmentsClose(p
2e920 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2e930 7d 0a 0a 2f 2a 20 0a 2a 2a 20 46 6c 75 73 68 20  }../* .** Flush 
2e940 61 6e 79 20 64 61 74 61 20 69 6e 20 74 68 65 20  any data in the 
2e950 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68 61  pending-terms ha
2e960 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b  sh table to disk
2e970 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
2e980 0a 2a 2a 20 6d 65 72 67 65 20 61 6c 6c 20 73 65  .** merge all se
2e990 67 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61  gments in the da
2e9a0 74 61 62 61 73 65 20 28 69 6e 63 6c 75 64 69 6e  tabase (includin
2e9b0 67 20 74 68 65 20 6e 65 77 20 73 65 67 6d 65 6e  g the new segmen
2e9c0 74 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65 20  t, if .** there 
2e9d0 77 61 73 20 61 6e 79 20 64 61 74 61 20 74 6f 20  was any data to 
2e9e0 66 6c 75 73 68 29 20 69 6e 74 6f 20 61 20 73 69  flush) into a si
2e9f0 6e 67 6c 65 20 73 65 67 6d 65 6e 74 2e 20 0a 2a  ngle segment. .*
2ea00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
2ea10 33 4f 70 74 69 6d 69 7a 65 28 46 74 73 33 54 61  3Optimize(Fts3Ta
2ea20 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ble *p){.  int r
2ea30 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
2ea40 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53  3_exec(p->db, "S
2ea50 41 56 45 50 4f 49 4e 54 20 66 74 73 33 22 2c 20  AVEPOINT fts3", 
2ea60 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  0, 0, 0);.  if( 
2ea70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2ea80 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 6f  .    rc = fts3Do
2ea90 4f 70 74 69 6d 69 7a 65 28 70 2c 20 31 29 3b 0a  Optimize(p, 1);.
2eaa0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2eab0 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
2eac0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
2ead0 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69    int rc2 = sqli
2eae0 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
2eaf0 22 52 45 4c 45 41 53 45 20 66 74 73 33 22 2c 20  "RELEASE fts3", 
2eb00 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
2eb10 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
2eb20 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
2eb30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2eb40 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
2eb50 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  db, "ROLLBACK TO
2eb60 20 66 74 73 33 22 2c 20 30 2c 20 30 2c 20 30 29   fts3", 0, 0, 0)
2eb70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2eb80 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c  exec(p->db, "REL
2eb90 45 41 53 45 20 66 74 73 33 22 2c 20 30 2c 20 30  EASE fts3", 0, 0
2eba0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
2ebb0 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67    sqlite3Fts3Seg
2ebc0 6d 65 6e 74 73 43 6c 6f 73 65 28 70 29 3b 0a 20  mentsClose(p);. 
2ebd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
2ebe0 65 6e 64 69 66 0a                                endif.