/ Hex Artifact Content
Login

Artifact 6a6391d6b01114f885e24e1f66bbc11ffba0e9e2:


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 69 6e 74 20 62 4c 6f   PT */.  int bLo
12e0: 6f 6b 75 70 3b 20 20 20 20 20 20 20 20 20 20 20  okup;           
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 0a 20 20 73 71 6c 69 74 65 33  ly */..  sqlite3
1320: 5f 69 6e 74 36 34 20 69 53 74 61 72 74 42 6c 6f  _int64 iStartBlo
1330: 63 6b 3b 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  ck;      /* Rowi
1340: 64 20 6f 66 20 66 69 72 73 74 20 6c 65 61 66 20  d of first leaf 
1350: 62 6c 6f 63 6b 20 74 6f 20 74 72 61 76 65 72 73  block to travers
1360: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
1370: 6e 74 36 34 20 69 4c 65 61 66 45 6e 64 42 6c 6f  nt64 iLeafEndBlo
1380: 63 6b 3b 20 20 20 20 2f 2a 20 52 6f 77 69 64 20  ck;    /* Rowid 
1390: 6f 66 20 66 69 6e 61 6c 20 6c 65 61 66 20 62 6c  of final leaf bl
13a0: 6f 63 6b 20 74 6f 20 74 72 61 76 65 72 73 65 20  ock to traverse 
13b0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
13c0: 36 34 20 69 45 6e 64 42 6c 6f 63 6b 3b 20 20 20  64 iEndBlock;   
13d0: 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 6f 66       /* Rowid of
13e0: 20 66 69 6e 61 6c 20 62 6c 6f 63 6b 20 69 6e 20   final block in 
13f0: 73 65 67 6d 65 6e 74 20 28 6f 72 20 30 29 20 2a  segment (or 0) *
1400: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
1410: 34 20 69 43 75 72 72 65 6e 74 42 6c 6f 63 6b 3b  4 iCurrentBlock;
1420: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c      /* Current l
1430: 65 61 66 20 62 6c 6f 63 6b 20 28 6f 72 20 30 29  eaf block (or 0)
1440: 20 2a 2f 0a 0a 20 20 63 68 61 72 20 2a 61 4e 6f   */..  char *aNo
1450: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
1460: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1470: 72 20 74 6f 20 6e 6f 64 65 20 64 61 74 61 20 28  r to node data (
1480: 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e  or NULL) */.  in
1490: 74 20 6e 4e 6f 64 65 3b 20 20 20 20 20 20 20 20  t nNode;        
14a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14b0: 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
14c0: 61 74 20 61 4e 6f 64 65 20 28 6f 72 20 30 29 20  at aNode (or 0) 
14d0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 70 75 6c 61  */.  int nPopula
14e0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
14f0: 20 20 20 20 20 2f 2a 20 49 66 20 3e 30 2c 20 62       /* If >0, b
1500: 79 74 65 73 20 6f 66 20 62 75 66 66 65 72 20 61  ytes of buffer a
1510: 4e 6f 64 65 5b 5d 20 6c 6f 61 64 65 64 20 2a 2f  Node[] loaded */
1520: 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20  .  sqlite3_blob 
1530: 2a 70 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20  *pBlob;         
1540: 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c     /* If not NUL
1550: 4c 2c 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 74  L, blob handle t
1560: 6f 20 72 65 61 64 20 6e 6f 64 65 20 2a 2f 0a 0a  o read node */..
1570: 20 20 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a    Fts3HashElem *
1580: 2a 70 70 4e 65 78 74 45 6c 65 6d 3b 0a 0a 20 20  *ppNextElem;..  
1590: 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 73 65 74  /* Variables set
15a0: 20 62 79 20 66 74 73 33 53 65 67 52 65 61 64 65   by fts3SegReade
15b0: 72 4e 65 78 74 28 29 2e 20 54 68 65 73 65 20 6d  rNext(). These m
15c0: 61 79 20 62 65 20 72 65 61 64 20 64 69 72 65 63  ay be read direc
15d0: 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20  tly.  ** by the 
15e0: 63 61 6c 6c 65 72 2e 20 54 68 65 79 20 61 72 65  caller. They are
15f0: 20 76 61 6c 69 64 20 66 72 6f 6d 20 74 68 65 20   valid from the 
1600: 74 69 6d 65 20 53 65 67 6d 65 6e 74 52 65 61 64  time SegmentRead
1610: 65 72 4e 65 77 28 29 20 72 65 74 75 72 6e 73 0a  erNew() returns.
1620: 20 20 2a 2a 20 75 6e 74 69 6c 20 53 65 67 6d 65    ** until Segme
1630: 6e 74 52 65 61 64 65 72 4e 65 78 74 28 29 20 72  ntReaderNext() r
1640: 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67  eturns something
1650: 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
1660: 54 45 5f 4f 4b 0a 20 20 2a 2a 20 28 69 2e 65 2e  TE_OK.  ** (i.e.
1670: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 29 2e 0a 20   SQLITE_DONE).. 
1680: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   */.  int nTerm;
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
16b0: 6f 66 20 62 79 74 65 73 20 69 6e 20 63 75 72 72  of bytes in curr
16c0: 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 63 68  ent term */.  ch
16d0: 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20 20 20  ar *zTerm;      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16f0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72   Pointer to curr
1700: 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  ent term */.  in
1710: 74 20 6e 54 65 72 6d 41 6c 6c 6f 63 3b 20 20 20  t nTermAlloc;   
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1730: 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   Allocated size 
1740: 6f 66 20 7a 54 65 72 6d 20 62 75 66 66 65 72 20  of zTerm buffer 
1750: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 6f 63 6c  */.  char *aDocl
1760: 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
1770: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1780: 74 6f 20 64 6f 63 6c 69 73 74 20 6f 66 20 63 75  to doclist of cu
1790: 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20  rrent entry */. 
17a0: 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 20 20   int nDoclist;  
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c   /* Size of docl
17d0: 69 73 74 20 69 6e 20 63 75 72 72 65 6e 74 20 65  ist in current e
17e0: 6e 74 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  ntry */..  /* Th
17f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
1800: 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 62  ables are used b
1810: 79 20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e  y fts3SegReaderN
1820: 65 78 74 44 6f 63 69 64 28 29 20 74 6f 20 69 74  extDocid() to it
1830: 65 72 61 74 65 20 0a 20 20 2a 2a 20 74 68 72 6f  erate .  ** thro
1840: 75 67 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ugh the current 
1850: 64 6f 63 6c 69 73 74 20 28 61 44 6f 63 6c 69 73  doclist (aDoclis
1860: 74 2f 6e 44 6f 63 6c 69 73 74 29 2e 0a 20 20 2a  t/nDoclist)..  *
1870: 2f 0a 20 20 63 68 61 72 20 2a 70 4f 66 66 73 65  /.  char *pOffse
1880: 74 4c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 4f 66  tList;.  int nOf
1890: 66 73 65 74 4c 69 73 74 3b 20 20 20 20 20 20 20  fsetList;       
18a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
18b0: 64 65 73 63 65 6e 64 69 6e 67 20 70 65 6e 64 69  descending pendi
18c0: 6e 67 20 73 65 67 2d 72 65 61 64 65 72 73 20 6f  ng seg-readers o
18d0: 6e 6c 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nly */.  sqlite3
18e0: 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 3b 0a 7d  _int64 iDocid;.}
18f0: 3b 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 33 53  ;..#define fts3S
1900: 65 67 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e  egReaderIsPendin
1910: 67 28 70 29 20 28 28 70 29 2d 3e 70 70 4e 65 78  g(p) ((p)->ppNex
1920: 74 45 6c 65 6d 21 3d 30 29 0a 23 64 65 66 69 6e  tElem!=0).#defin
1930: 65 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49  e fts3SegReaderI
1940: 73 52 6f 6f 74 4f 6e 6c 79 28 70 29 20 28 28 70  sRootOnly(p) ((p
1950: 29 2d 3e 61 4e 6f 64 65 3d 3d 28 63 68 61 72 20  )->aNode==(char 
1960: 2a 29 26 28 70 29 5b 31 5d 29 0a 0a 2f 2a 0a 2a  *)&(p)[1])../*.*
1970: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
1980: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
1990: 69 73 20 75 73 65 64 20 74 6f 20 63 72 65 61 74  is used to creat
19a0: 65 20 61 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  e a segment b-tr
19b0: 65 65 20 69 6e 20 74 68 65 0a 2a 2a 20 64 61 74  ee in the.** dat
19c0: 61 62 61 73 65 2e 20 54 68 65 20 69 6e 74 65 72  abase. The inter
19d0: 6e 61 6c 20 64 65 74 61 69 6c 73 20 6f 66 20 74  nal details of t
19e0: 68 69 73 20 74 79 70 65 20 61 72 65 20 6f 6e 6c  his type are onl
19f0: 79 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68  y accessed by th
1a00: 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 66  e.** following f
1a10: 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
1a20: 20 20 66 74 73 33 53 65 67 57 72 69 74 65 72 41    fts3SegWriterA
1a30: 64 64 28 29 0a 2a 2a 20 20 20 66 74 73 33 53 65  dd().**   fts3Se
1a40: 67 57 72 69 74 65 72 46 6c 75 73 68 28 29 0a 2a  gWriterFlush().*
1a50: 2a 20 20 20 66 74 73 33 53 65 67 57 72 69 74 65  *   fts3SegWrite
1a60: 72 46 72 65 65 28 29 0a 2a 2f 0a 73 74 72 75 63  rFree().*/.struc
1a70: 74 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20  t SegmentWriter 
1a80: 7b 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20  {.  SegmentNode 
1a90: 2a 70 54 72 65 65 3b 20 20 20 20 20 20 20 20 20  *pTree;         
1aa0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1ab0: 6f 20 69 6e 74 65 72 69 6f 72 20 74 72 65 65 20  o interior tree 
1ac0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 73  structure */.  s
1ad0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 46 69  qlite3_int64 iFi
1ae0: 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rst;           /
1af0: 2a 20 46 69 72 73 74 20 73 6c 6f 74 20 69 6e 20  * First slot in 
1b00: 25 5f 73 65 67 6d 65 6e 74 73 20 77 72 69 74 74  %_segments writt
1b10: 65 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  en */.  sqlite3_
1b20: 69 6e 74 36 34 20 69 46 72 65 65 3b 20 20 20 20  int64 iFree;    
1b30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1b40: 66 72 65 65 20 73 6c 6f 74 20 69 6e 20 25 5f 73  free slot in %_s
1b50: 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  egments */.  cha
1b60: 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20 20 20 20  r *zTerm;       
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b80: 50 6f 69 6e 74 65 72 20 74 6f 20 70 72 65 76 69  Pointer to previ
1b90: 6f 75 73 20 74 65 72 6d 20 62 75 66 66 65 72 20  ous term buffer 
1ba0: 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20  */.  int nTerm; 
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1bd0: 66 20 62 79 74 65 73 20 69 6e 20 7a 54 65 72 6d  f bytes in zTerm
1be0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 6c 6c 6f   */.  int nMallo
1bf0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1c00: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1c10: 20 6d 61 6c 6c 6f 63 27 64 20 62 75 66 66 65 72   malloc'd buffer
1c20: 20 61 74 20 7a 4d 61 6c 6c 6f 63 20 2a 2f 0a 20   at zMalloc */. 
1c30: 20 63 68 61 72 20 2a 7a 4d 61 6c 6c 6f 63 3b 20   char *zMalloc; 
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c50: 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 73 70 61   /* Malloc'd spa
1c60: 63 65 20 28 70 6f 73 73 69 62 6c 79 29 20 75 73  ce (possibly) us
1c70: 65 64 20 66 6f 72 20 7a 54 65 72 6d 20 2a 2f 0a  ed for zTerm */.
1c80: 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20    int nSize;    
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 6c 6c    /* Size of all
1cb0: 6f 63 61 74 69 6f 6e 20 61 74 20 61 44 61 74 61  ocation at aData
1cc0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b   */.  int nData;
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
1cf0: 66 20 64 61 74 61 20 69 6e 20 61 44 61 74 61 20  f data in aData 
1d00: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61  */.  char *aData
1d10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d20: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1d30: 74 6f 20 62 6c 6f 63 6b 20 66 72 6f 6d 20 6d 61  to block from ma
1d40: 6c 6c 6f 63 28 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  lloc() */.};../*
1d50: 0a 2a 2a 20 54 79 70 65 20 53 65 67 6d 65 6e 74  .** Type Segment
1d60: 4e 6f 64 65 20 69 73 20 75 73 65 64 20 62 79 20  Node is used by 
1d70: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  the following th
1d80: 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  ree functions to
1d90: 20 63 72 65 61 74 65 0a 2a 2a 20 74 68 65 20 69   create.** the i
1da0: 6e 74 65 72 69 6f 72 20 70 61 72 74 20 6f 66 20  nterior part of 
1db0: 74 68 65 20 73 65 67 6d 65 6e 74 20 62 2b 2d 74  the segment b+-t
1dc0: 72 65 65 20 73 74 72 75 63 74 75 72 65 73 20 28  ree structures (
1dd0: 65 76 65 72 79 74 68 69 6e 67 20 65 78 63 65 70  everything excep
1de0: 74 0a 2a 2a 20 74 68 65 20 6c 65 61 66 20 6e 6f  t.** the leaf no
1df0: 64 65 73 29 2e 20 54 68 65 73 65 20 66 75 6e 63  des). These func
1e00: 74 69 6f 6e 73 20 61 6e 64 20 74 79 70 65 20 61  tions and type a
1e10: 72 65 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65  re only ever use
1e20: 64 20 62 79 20 63 6f 64 65 0a 2a 2a 20 77 69 74  d by code.** wit
1e30: 68 69 6e 20 74 68 65 20 66 74 73 33 53 65 67 57  hin the fts3SegW
1e40: 72 69 74 65 72 58 58 58 28 29 20 66 61 6d 69 6c  riterXXX() famil
1e50: 79 20 6f 66 20 66 75 6e 63 74 69 6f 6e 73 20 64  y of functions d
1e60: 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a  escribed above..
1e70: 2a 2a 0a 2a 2a 20 20 20 66 74 73 33 4e 6f 64 65  **.**   fts3Node
1e80: 41 64 64 54 65 72 6d 28 29 0a 2a 2a 20 20 20 66  AddTerm().**   f
1e90: 74 73 33 4e 6f 64 65 57 72 69 74 65 28 29 0a 2a  ts3NodeWrite().*
1ea0: 2a 20 20 20 66 74 73 33 4e 6f 64 65 46 72 65 65  *   fts3NodeFree
1eb0: 28 29 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20  ().**.** When a 
1ec0: 62 2b 74 72 65 65 20 69 73 20 77 72 69 74 74 65  b+tree is writte
1ed0: 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
1ee0: 65 20 28 65 69 74 68 65 72 20 61 73 20 61 20 72  e (either as a r
1ef0: 65 73 75 6c 74 20 6f 66 20 61 20 6d 65 72 67 65  esult of a merge
1f00: 0a 2a 2a 20 6f 72 20 74 68 65 20 70 65 6e 64 69  .** or the pendi
1f10: 6e 67 2d 74 65 72 6d 73 20 74 61 62 6c 65 20 62  ng-terms table b
1f20: 65 69 6e 67 20 66 6c 75 73 68 65 64 29 2c 20 6c  eing flushed), l
1f30: 65 61 76 65 73 20 61 72 65 20 77 72 69 74 74 65  eaves are writte
1f40: 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 64  n into the .** d
1f50: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 73 20  atabase file as 
1f60: 73 6f 6f 6e 20 61 73 20 74 68 65 79 20 61 72 65  soon as they are
1f70: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 70 6f 70 75   completely popu
1f80: 6c 61 74 65 64 2e 20 54 68 65 20 69 6e 74 65 72  lated. The inter
1f90: 69 6f 72 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  ior of.** the tr
1fa0: 65 65 20 69 73 20 61 73 73 65 6d 62 6c 65 64 20  ee is assembled 
1fb0: 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 77 72  in memory and wr
1fc0: 69 74 74 65 6e 20 6f 75 74 20 6f 6e 6c 79 20 6f  itten out only o
1fd0: 6e 63 65 20 61 6c 6c 20 6c 65 61 76 65 73 20 68  nce all leaves h
1fe0: 61 76 65 0a 2a 2a 20 62 65 65 6e 20 70 6f 70 75  ave.** been popu
1ff0: 6c 61 74 65 64 20 61 6e 64 20 73 74 6f 72 65 64  lated and stored
2000: 2e 20 54 68 69 73 20 69 73 20 4f 6b 2c 20 61 73  . This is Ok, as
2010: 20 74 68 65 20 62 2b 2d 74 72 65 65 20 66 61 6e   the b+-tree fan
2020: 6f 75 74 20 69 73 20 75 73 75 61 6c 6c 79 0a 2a  out is usually.*
2030: 2a 20 76 65 72 79 20 6c 61 72 67 65 2c 20 6d 65  * very large, me
2040: 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 20 69  aning that the i
2050: 6e 74 65 72 69 6f 72 20 6f 66 20 74 68 65 20 74  nterior of the t
2060: 72 65 65 20 63 6f 6e 73 75 6d 65 73 20 72 65 6c  ree consumes rel
2070: 61 74 69 76 65 6c 79 20 0a 2a 2a 20 6c 69 74 74  atively .** litt
2080: 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  le memory..*/.st
2090: 72 75 63 74 20 53 65 67 6d 65 6e 74 4e 6f 64 65  ruct SegmentNode
20a0: 20 7b 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65   {.  SegmentNode
20b0: 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20   *pParent;      
20c0: 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 6e       /* Parent n
20d0: 6f 64 65 20 28 6f 72 20 4e 55 4c 4c 20 66 6f 72  ode (or NULL for
20e0: 20 72 6f 6f 74 20 6e 6f 64 65 29 20 2a 2f 0a 20   root node) */. 
20f0: 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 52   SegmentNode *pR
2100: 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20 20  ight;           
2110: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 72   /* Pointer to r
2120: 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 2a 2f 0a  ight-sibling */.
2130: 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70    SegmentNode *p
2140: 4c 65 66 74 6d 6f 73 74 3b 20 20 20 20 20 20 20  Leftmost;       
2150: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2160: 6c 65 66 74 2d 6d 6f 73 74 20 6e 6f 64 65 20 6f  left-most node o
2170: 66 20 74 68 69 73 20 64 65 70 74 68 20 2a 2f 0a  f this depth */.
2180: 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20    int nEntry;   
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
21b0: 65 72 6d 73 20 77 72 69 74 74 65 6e 20 74 6f 20  erms written to 
21c0: 6e 6f 64 65 20 73 6f 20 66 61 72 20 2a 2f 0a 20  node so far */. 
21d0: 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20   char *zTerm;   
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
2200: 72 65 76 69 6f 75 73 20 74 65 72 6d 20 62 75 66  revious term buf
2210: 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  fer */.  int nTe
2220: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
2230: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2240: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a  er of bytes in z
2250: 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  Term */.  int nM
2260: 61 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20  alloc;          
2270: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
2280: 65 20 6f 66 20 6d 61 6c 6c 6f 63 27 64 20 62 75  e of malloc'd bu
2290: 66 66 65 72 20 61 74 20 7a 4d 61 6c 6c 6f 63 20  ffer at zMalloc 
22a0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 6c 6c  */.  char *zMall
22b0: 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  oc;             
22c0: 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64       /* Malloc'd
22d0: 20 73 70 61 63 65 20 28 70 6f 73 73 69 62 6c 79   space (possibly
22e0: 29 20 75 73 65 64 20 66 6f 72 20 7a 54 65 72 6d  ) used for zTerm
22f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b   */.  int nData;
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2310: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
2320: 66 20 76 61 6c 69 64 20 64 61 74 61 20 73 6f 20  f valid data so 
2330: 66 61 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  far */.  char *a
2340: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
2350: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65           /* Node
2360: 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   data */.};../*.
2370: 2a 2a 20 56 61 6c 69 64 20 76 61 6c 75 65 73 20  ** Valid values 
2380: 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 61  for the second a
2390: 72 67 75 6d 65 6e 74 20 74 6f 20 66 74 73 33 53  rgument to fts3S
23a0: 71 6c 53 74 6d 74 28 29 2e 0a 2a 2f 0a 23 64 65  qlStmt()..*/.#de
23b0: 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f  fine SQL_DELETE_
23c0: 43 4f 4e 54 45 4e 54 20 20 20 20 20 20 20 20 20  CONTENT         
23d0: 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 53 51      0.#define SQ
23e0: 4c 5f 49 53 5f 45 4d 50 54 59 20 20 20 20 20 20  L_IS_EMPTY      
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 0a 23               1.#
2400: 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54  define SQL_DELET
2410: 45 5f 41 4c 4c 5f 43 4f 4e 54 45 4e 54 20 20 20  E_ALL_CONTENT   
2420: 20 20 20 20 20 20 32 20 0a 23 64 65 66 69 6e 65        2 .#define
2430: 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f   SQL_DELETE_ALL_
2440: 53 45 47 4d 45 4e 54 53 20 20 20 20 20 20 20 20  SEGMENTS        
2450: 33 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44 45  3.#define SQL_DE
2460: 4c 45 54 45 5f 41 4c 4c 5f 53 45 47 44 49 52 20  LETE_ALL_SEGDIR 
2470: 20 20 20 20 20 20 20 20 20 34 0a 23 64 65 66 69           4.#defi
2480: 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c  ne SQL_DELETE_AL
2490: 4c 5f 44 4f 43 53 49 5a 45 20 20 20 20 20 20 20  L_DOCSIZE       
24a0: 20 20 35 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f    5.#define SQL_
24b0: 44 45 4c 45 54 45 5f 41 4c 4c 5f 53 54 41 54 20  DELETE_ALL_STAT 
24c0: 20 20 20 20 20 20 20 20 20 20 20 36 0a 23 64 65             6.#de
24d0: 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f  fine SQL_SELECT_
24e0: 43 4f 4e 54 45 4e 54 5f 42 59 5f 52 4f 57 49 44  CONTENT_BY_ROWID
24f0: 20 20 20 20 37 0a 23 64 65 66 69 6e 65 20 53 51      7.#define SQ
2500: 4c 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54 5f 49  L_NEXT_SEGMENT_I
2510: 4e 44 45 58 20 20 20 20 20 20 20 20 20 38 0a 23  NDEX         8.#
2520: 64 65 66 69 6e 65 20 53 51 4c 5f 49 4e 53 45 52  define SQL_INSER
2530: 54 5f 53 45 47 4d 45 4e 54 53 20 20 20 20 20 20  T_SEGMENTS      
2540: 20 20 20 20 20 20 39 0a 23 64 65 66 69 6e 65 20        9.#define 
2550: 53 51 4c 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54  SQL_NEXT_SEGMENT
2560: 53 5f 49 44 20 20 20 20 20 20 20 20 20 20 31 30  S_ID          10
2570: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 49 4e 53  .#define SQL_INS
2580: 45 52 54 5f 53 45 47 44 49 52 20 20 20 20 20 20  ERT_SEGDIR      
2590: 20 20 20 20 20 20 20 31 31 0a 23 64 65 66 69 6e         11.#defin
25a0: 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c 45 56  e SQL_SELECT_LEV
25b0: 45 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EL              
25c0: 31 32 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53  12.#define SQL_S
25d0: 45 4c 45 43 54 5f 4c 45 56 45 4c 5f 52 41 4e 47  ELECT_LEVEL_RANG
25e0: 45 20 20 20 20 20 20 20 20 31 33 0a 23 64 65 66  E        13.#def
25f0: 69 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c  ine SQL_SELECT_L
2600: 45 56 45 4c 5f 43 4f 55 4e 54 20 20 20 20 20 20  EVEL_COUNT      
2610: 20 20 31 34 0a 23 64 65 66 69 6e 65 20 53 51 4c    14.#define SQL
2620: 5f 53 45 4c 45 43 54 5f 53 45 47 44 49 52 5f 4d  _SELECT_SEGDIR_M
2630: 41 58 5f 4c 45 56 45 4c 20 20 20 31 35 0a 23 64  AX_LEVEL   15.#d
2640: 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45  efine SQL_DELETE
2650: 5f 53 45 47 44 49 52 5f 4c 45 56 45 4c 20 20 20  _SEGDIR_LEVEL   
2660: 20 20 20 20 31 36 0a 23 64 65 66 69 6e 65 20 53      16.#define S
2670: 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 4d 45 4e  QL_DELETE_SEGMEN
2680: 54 53 5f 52 41 4e 47 45 20 20 20 20 20 31 37 0a  TS_RANGE     17.
2690: 23 64 65 66 69 6e 65 20 53 51 4c 5f 43 4f 4e 54  #define SQL_CONT
26a0: 45 4e 54 5f 49 4e 53 45 52 54 20 20 20 20 20 20  ENT_INSERT      
26b0: 20 20 20 20 20 20 31 38 0a 23 64 65 66 69 6e 65        18.#define
26c0: 20 53 51 4c 5f 44 45 4c 45 54 45 5f 44 4f 43 53   SQL_DELETE_DOCS
26d0: 49 5a 45 20 20 20 20 20 20 20 20 20 20 20 20 31  IZE            1
26e0: 39 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 52 45  9.#define SQL_RE
26f0: 50 4c 41 43 45 5f 44 4f 43 53 49 5a 45 20 20 20  PLACE_DOCSIZE   
2700: 20 20 20 20 20 20 20 20 32 30 0a 23 64 65 66 69          20.#defi
2710: 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 44 4f  ne SQL_SELECT_DO
2720: 43 53 49 5a 45 20 20 20 20 20 20 20 20 20 20 20  CSIZE           
2730: 20 32 31 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f   21.#define SQL_
2740: 53 45 4c 45 43 54 5f 53 54 41 54 20 20 20 20 20  SELECT_STAT     
2750: 20 20 20 20 20 20 20 20 20 20 32 32 0a 23 64 65            22.#de
2760: 66 69 6e 65 20 53 51 4c 5f 52 45 50 4c 41 43 45  fine SQL_REPLACE
2770: 5f 53 54 41 54 20 20 20 20 20 20 20 20 20 20 20  _STAT           
2780: 20 20 20 32 33 0a 0a 23 64 65 66 69 6e 65 20 53     23..#define S
2790: 51 4c 5f 53 45 4c 45 43 54 5f 41 4c 4c 5f 50 52  QL_SELECT_ALL_PR
27a0: 45 46 49 58 5f 4c 45 56 45 4c 20 20 20 32 34 0a  EFIX_LEVEL   24.
27b0: 23 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45  #define SQL_DELE
27c0: 54 45 5f 41 4c 4c 5f 54 45 52 4d 53 5f 53 45 47  TE_ALL_TERMS_SEG
27d0: 44 49 52 20 20 20 32 35 0a 23 64 65 66 69 6e 65  DIR   25.#define
27e0: 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 44   SQL_DELETE_SEGD
27f0: 49 52 5f 52 41 4e 47 45 20 20 20 20 20 20 20 32  IR_RANGE       2
2800: 36 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45  6.#define SQL_SE
2810: 4c 45 43 54 5f 41 4c 4c 5f 4c 41 4e 47 49 44 20  LECT_ALL_LANGID 
2820: 20 20 20 20 20 20 20 20 32 37 0a 23 64 65 66 69          27.#defi
2830: 6e 65 20 53 51 4c 5f 46 49 4e 44 5f 4d 45 52 47  ne SQL_FIND_MERG
2840: 45 5f 4c 45 56 45 4c 20 20 20 20 20 20 20 20 20  E_LEVEL         
2850: 20 32 38 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f   28.#define SQL_
2860: 4d 41 58 5f 4c 45 41 46 5f 4e 4f 44 45 5f 45 53  MAX_LEAF_NODE_ES
2870: 54 49 4d 41 54 45 20 20 20 20 32 39 0a 23 64 65  TIMATE    29.#de
2880: 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f  fine SQL_DELETE_
2890: 53 45 47 44 49 52 5f 45 4e 54 52 59 20 20 20 20  SEGDIR_ENTRY    
28a0: 20 20 20 33 30 0a 23 64 65 66 69 6e 65 20 53 51     30.#define SQ
28b0: 4c 5f 53 48 49 46 54 5f 53 45 47 44 49 52 5f 45  L_SHIFT_SEGDIR_E
28c0: 4e 54 52 59 20 20 20 20 20 20 20 20 33 31 0a 23  NTRY        31.#
28d0: 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45 43  define SQL_SELEC
28e0: 54 5f 53 45 47 44 49 52 20 20 20 20 20 20 20 20  T_SEGDIR        
28f0: 20 20 20 20 20 33 32 0a 23 64 65 66 69 6e 65 20       32.#define 
2900: 53 51 4c 5f 43 48 4f 4d 50 5f 53 45 47 44 49 52  SQL_CHOMP_SEGDIR
2910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33 33                33
2920: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 47  .#define SQL_SEG
2930: 4d 45 4e 54 5f 49 53 5f 41 50 50 45 4e 44 41 42  MENT_IS_APPENDAB
2940: 4c 45 20 20 20 20 20 33 34 0a 23 64 65 66 69 6e  LE     34.#defin
2950: 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 49 4e 44  e SQL_SELECT_IND
2960: 45 58 45 53 20 20 20 20 20 20 20 20 20 20 20 20  EXES            
2970: 33 35 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53  35.#define SQL_S
2980: 45 4c 45 43 54 5f 4d 58 4c 45 56 45 4c 20 20 20  ELECT_MXLEVEL   
2990: 20 20 20 20 20 20 20 20 20 33 36 0a 0a 2f 2a 0a           36../*.
29a0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
29b0: 20 69 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61   is used to obta
29c0: 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 70 72 65  in an SQLite pre
29d0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
29e0: 68 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72 20 74 68  handle.** for th
29f0: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 64 65 6e  e statement iden
2a00: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73 65  tified by the se
2a10: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 49  cond argument. I
2a20: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  f successful,.**
2a30: 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 74   *pp is set to t
2a40: 68 65 20 72 65 71 75 65 73 74 65 64 20 73 74 61  he requested sta
2a50: 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 61 6e  tement handle an
2a60: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
2a70: 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  rned..** Otherwi
2a80: 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  se, an SQLite er
2a90: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2aa0: 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20  rned and *pp is 
2ab0: 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20  set to 0..**.** 
2ac0: 49 66 20 61 72 67 75 6d 65 6e 74 20 61 70 56 61  If argument apVa
2ad0: 6c 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  l is not NULL, t
2ae0: 68 65 6e 20 69 74 20 6d 75 73 74 20 70 6f 69 6e  hen it must poin
2af0: 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 77 69  t to an array wi
2b00: 74 68 0a 2a 2a 20 61 74 20 6c 65 61 73 74 20 61  th.** at least a
2b10: 73 20 6d 61 6e 79 20 65 6e 74 72 69 65 73 20 61  s many entries a
2b20: 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
2b30: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 6f  statement has bo
2b40: 75 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65  und .** paramete
2b50: 72 73 2e 20 54 68 65 20 76 61 6c 75 65 73 20 61  rs. The values a
2b60: 72 65 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 20  re bound to the 
2b70: 73 74 61 74 65 6d 65 6e 74 73 20 70 61 72 61 6d  statements param
2b80: 65 74 65 72 73 20 62 65 66 6f 72 65 0a 2a 2a 20  eters before.** 
2b90: 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
2ba0: 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 71 6c  atic int fts3Sql
2bb0: 53 74 6d 74 28 0a 20 20 46 74 73 33 54 61 62 6c  Stmt(.  Fts3Tabl
2bc0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
2bd0: 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75          /* Virtu
2be0: 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  al table handle 
2bf0: 2a 2f 0a 20 20 69 6e 74 20 65 53 74 6d 74 2c 20  */.  int eStmt, 
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c10: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
2c20: 68 65 20 53 51 4c 5f 58 58 58 20 63 6f 6e 73 74  he SQL_XXX const
2c30: 61 6e 74 73 20 61 62 6f 76 65 20 2a 2f 0a 20 20  ants above */.  
2c40: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
2c50: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
2c60: 2f 2a 20 4f 55 54 3a 20 53 74 61 74 65 6d 65 6e  /* OUT: Statemen
2c70: 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71  t handle */.  sq
2c80: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
2c90: 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Val           /*
2ca0: 20 56 61 6c 75 65 73 20 74 6f 20 62 69 6e 64 20   Values to bind 
2cb0: 74 6f 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  to statement */.
2cc0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
2cd0: 2a 61 7a 53 71 6c 5b 5d 20 3d 20 7b 0a 2f 2a 20  *azSql[] = {./* 
2ce0: 30 20 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46  0  */  "DELETE F
2cf0: 52 4f 4d 20 25 51 2e 27 25 71 5f 63 6f 6e 74 65  ROM %Q.'%q_conte
2d00: 6e 74 27 20 57 48 45 52 45 20 72 6f 77 69 64 20  nt' WHERE rowid 
2d10: 3d 20 3f 22 2c 0a 2f 2a 20 31 20 20 2a 2f 20 20  = ?",./* 1  */  
2d20: 22 53 45 4c 45 43 54 20 4e 4f 54 20 45 58 49 53  "SELECT NOT EXIS
2d30: 54 53 28 53 45 4c 45 43 54 20 64 6f 63 69 64 20  TS(SELECT docid 
2d40: 46 52 4f 4d 20 25 51 2e 27 25 71 5f 63 6f 6e 74  FROM %Q.'%q_cont
2d50: 65 6e 74 27 20 57 48 45 52 45 20 72 6f 77 69 64  ent' WHERE rowid
2d60: 21 3d 3f 29 22 2c 0a 2f 2a 20 32 20 20 2a 2f 20  !=?)",./* 2  */ 
2d70: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
2d80: 2e 27 25 71 5f 63 6f 6e 74 65 6e 74 27 22 2c 0a  .'%q_content'",.
2d90: 2f 2a 20 33 20 20 2a 2f 20 20 22 44 45 4c 45 54  /* 3  */  "DELET
2da0: 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65  E FROM %Q.'%q_se
2db0: 67 6d 65 6e 74 73 27 22 2c 0a 2f 2a 20 34 20 20  gments'",./* 4  
2dc0: 2a 2f 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d  */  "DELETE FROM
2dd0: 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 22   %Q.'%q_segdir'"
2de0: 2c 0a 2f 2a 20 35 20 20 2a 2f 20 20 22 44 45 4c  ,./* 5  */  "DEL
2df0: 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  ETE FROM %Q.'%q_
2e00: 64 6f 63 73 69 7a 65 27 22 2c 0a 2f 2a 20 36 20  docsize'",./* 6 
2e10: 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46 52 4f   */  "DELETE FRO
2e20: 4d 20 25 51 2e 27 25 71 5f 73 74 61 74 27 22 2c  M %Q.'%q_stat'",
2e30: 0a 2f 2a 20 37 20 20 2a 2f 20 20 22 53 45 4c 45  ./* 7  */  "SELE
2e40: 43 54 20 25 73 20 57 48 45 52 45 20 72 6f 77 69  CT %s WHERE rowi
2e50: 64 3d 3f 22 2c 0a 2f 2a 20 38 20 20 2a 2f 20 20  d=?",./* 8  */  
2e60: 22 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20  "SELECT (SELECT 
2e70: 6d 61 78 28 69 64 78 29 20 46 52 4f 4d 20 25 51  max(idx) FROM %Q
2e80: 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57 48 45  .'%q_segdir' WHE
2e90: 52 45 20 6c 65 76 65 6c 20 3d 20 3f 29 20 2b 20  RE level = ?) + 
2ea0: 31 22 2c 0a 2f 2a 20 39 20 20 2a 2f 20 20 22 52  1",./* 9  */  "R
2eb0: 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 51 2e 27  EPLACE INTO %Q.'
2ec0: 25 71 5f 73 65 67 6d 65 6e 74 73 27 28 62 6c 6f  %q_segments'(blo
2ed0: 63 6b 69 64 2c 20 62 6c 6f 63 6b 29 20 56 41 4c  ckid, block) VAL
2ee0: 55 45 53 28 3f 2c 20 3f 29 22 2c 0a 2f 2a 20 31  UES(?, ?)",./* 1
2ef0: 30 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 63 6f  0 */  "SELECT co
2f00: 61 6c 65 73 63 65 28 28 53 45 4c 45 43 54 20 6d  alesce((SELECT m
2f10: 61 78 28 62 6c 6f 63 6b 69 64 29 20 46 52 4f 4d  ax(blockid) FROM
2f20: 20 25 51 2e 27 25 71 5f 73 65 67 6d 65 6e 74 73   %Q.'%q_segments
2f30: 27 29 20 2b 20 31 2c 20 31 29 22 2c 0a 2f 2a 20  ') + 1, 1)",./* 
2f40: 31 31 20 2a 2f 20 20 22 52 45 50 4c 41 43 45 20  11 */  "REPLACE 
2f50: 49 4e 54 4f 20 25 51 2e 27 25 71 5f 73 65 67 64  INTO %Q.'%q_segd
2f60: 69 72 27 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f  ir' VALUES(?,?,?
2f70: 2c 3f 2c 3f 2c 3f 29 22 2c 0a 0a 20 20 20 20 20  ,?,?,?)",..     
2f80: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 73       /* Return s
2f90: 65 67 6d 65 6e 74 73 20 69 6e 20 6f 72 64 65 72  egments in order
2fa0: 20 66 72 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20   from oldest to 
2fb0: 6e 65 77 65 73 74 2e 2a 2f 20 0a 2f 2a 20 31 32  newest.*/ ./* 12
2fc0: 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 69 64 78   */  "SELECT idx
2fd0: 2c 20 73 74 61 72 74 5f 62 6c 6f 63 6b 2c 20 6c  , start_block, l
2fe0: 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 2c  eaves_end_block,
2ff0: 20 65 6e 64 5f 62 6c 6f 63 6b 2c 20 72 6f 6f 74   end_block, root
3000: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
3010: 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64  FROM %Q.'%q_segd
3020: 69 72 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20  ir' WHERE level 
3030: 3d 20 3f 20 4f 52 44 45 52 20 42 59 20 69 64 78  = ? ORDER BY idx
3040: 20 41 53 43 22 2c 0a 2f 2a 20 31 33 20 2a 2f 20   ASC",./* 13 */ 
3050: 20 22 53 45 4c 45 43 54 20 69 64 78 2c 20 73 74   "SELECT idx, st
3060: 61 72 74 5f 62 6c 6f 63 6b 2c 20 6c 65 61 76 65  art_block, leave
3070: 73 5f 65 6e 64 5f 62 6c 6f 63 6b 2c 20 65 6e 64  s_end_block, end
3080: 5f 62 6c 6f 63 6b 2c 20 72 6f 6f 74 20 22 0a 20  _block, root ". 
3090: 20 20 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d             "FROM
30a0: 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20   %Q.'%q_segdir' 
30b0: 57 48 45 52 45 20 6c 65 76 65 6c 20 42 45 54 57  WHERE level BETW
30c0: 45 45 4e 20 3f 20 41 4e 44 20 3f 22 0a 20 20 20  EEN ? AND ?".   
30d0: 20 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20           "ORDER 
30e0: 42 59 20 6c 65 76 65 6c 20 44 45 53 43 2c 20 69  BY level DESC, i
30f0: 64 78 20 41 53 43 22 2c 0a 0a 2f 2a 20 31 34 20  dx ASC",../* 14 
3100: 2a 2f 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e  */  "SELECT coun
3110: 74 28 2a 29 20 46 52 4f 4d 20 25 51 2e 27 25 71  t(*) FROM %Q.'%q
3120: 5f 73 65 67 64 69 72 27 20 57 48 45 52 45 20 6c  _segdir' WHERE l
3130: 65 76 65 6c 20 3d 20 3f 22 2c 0a 2f 2a 20 31 35  evel = ?",./* 15
3140: 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 6d 61 78   */  "SELECT max
3150: 28 6c 65 76 65 6c 29 20 46 52 4f 4d 20 25 51 2e  (level) FROM %Q.
3160: 27 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52  '%q_segdir' WHER
3170: 45 20 6c 65 76 65 6c 20 42 45 54 57 45 45 4e 20  E level BETWEEN 
3180: 3f 20 41 4e 44 20 3f 22 2c 0a 0a 2f 2a 20 31 36  ? AND ?",../* 16
3190: 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46 52 4f   */  "DELETE FRO
31a0: 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27  M %Q.'%q_segdir'
31b0: 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f   WHERE level = ?
31c0: 22 2c 0a 2f 2a 20 31 37 20 2a 2f 20 20 22 44 45  ",./* 17 */  "DE
31d0: 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71  LETE FROM %Q.'%q
31e0: 5f 73 65 67 6d 65 6e 74 73 27 20 57 48 45 52 45  _segments' WHERE
31f0: 20 62 6c 6f 63 6b 69 64 20 42 45 54 57 45 45 4e   blockid BETWEEN
3200: 20 3f 20 41 4e 44 20 3f 22 2c 0a 2f 2a 20 31 38   ? AND ?",./* 18
3210: 20 2a 2f 20 20 22 49 4e 53 45 52 54 20 49 4e 54   */  "INSERT INT
3220: 4f 20 25 51 2e 27 25 71 5f 63 6f 6e 74 65 6e 74  O %Q.'%q_content
3230: 27 20 56 41 4c 55 45 53 28 25 73 29 22 2c 0a 2f  ' VALUES(%s)",./
3240: 2a 20 31 39 20 2a 2f 20 20 22 44 45 4c 45 54 45  * 19 */  "DELETE
3250: 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 64 6f 63   FROM %Q.'%q_doc
3260: 73 69 7a 65 27 20 57 48 45 52 45 20 64 6f 63 69  size' WHERE doci
3270: 64 20 3d 20 3f 22 2c 0a 2f 2a 20 32 30 20 2a 2f  d = ?",./* 20 */
3280: 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20    "REPLACE INTO 
3290: 25 51 2e 27 25 71 5f 64 6f 63 73 69 7a 65 27 20  %Q.'%q_docsize' 
32a0: 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 0a 2f 2a  VALUES(?,?)",./*
32b0: 20 32 31 20 2a 2f 20 20 22 53 45 4c 45 43 54 20   21 */  "SELECT 
32c0: 73 69 7a 65 20 46 52 4f 4d 20 25 51 2e 27 25 71  size FROM %Q.'%q
32d0: 5f 64 6f 63 73 69 7a 65 27 20 57 48 45 52 45 20  _docsize' WHERE 
32e0: 64 6f 63 69 64 3d 3f 22 2c 0a 2f 2a 20 32 32 20  docid=?",./* 22 
32f0: 2a 2f 20 20 22 53 45 4c 45 43 54 20 76 61 6c 75  */  "SELECT valu
3300: 65 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 74  e FROM %Q.'%q_st
3310: 61 74 27 20 57 48 45 52 45 20 69 64 3d 3f 22 2c  at' WHERE id=?",
3320: 0a 2f 2a 20 32 33 20 2a 2f 20 20 22 52 45 50 4c  ./* 23 */  "REPL
3330: 41 43 45 20 49 4e 54 4f 20 25 51 2e 27 25 71 5f  ACE INTO %Q.'%q_
3340: 73 74 61 74 27 20 56 41 4c 55 45 53 28 3f 2c 3f  stat' VALUES(?,?
3350: 29 22 2c 0a 2f 2a 20 32 34 20 2a 2f 20 20 22 22  )",./* 24 */  ""
3360: 2c 0a 2f 2a 20 32 35 20 2a 2f 20 20 22 22 2c 0a  ,./* 25 */  "",.
3370: 0a 2f 2a 20 32 36 20 2a 2f 20 22 44 45 4c 45 54  ./* 26 */ "DELET
3380: 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65  E FROM %Q.'%q_se
3390: 67 64 69 72 27 20 57 48 45 52 45 20 6c 65 76 65  gdir' WHERE leve
33a0: 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20  l BETWEEN ? AND 
33b0: 3f 22 2c 0a 2f 2a 20 32 37 20 2a 2f 20 22 53 45  ?",./* 27 */ "SE
33c0: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 6c 65  LECT DISTINCT le
33d0: 76 65 6c 20 2f 20 28 31 30 32 34 20 2a 20 3f 29  vel / (1024 * ?)
33e0: 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67   FROM %Q.'%q_seg
33f0: 64 69 72 27 22 2c 0a 0a 2f 2a 20 54 68 69 73 20  dir'",../* This 
3400: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75 73 65  statement is use
3410: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  d to determine w
3420: 68 69 63 68 20 6c 65 76 65 6c 20 74 6f 20 72 65  hich level to re
3430: 61 64 20 74 68 65 20 69 6e 70 75 74 20 66 72 6f  ad the input fro
3440: 6d 0a 2a 2a 20 77 68 65 6e 20 70 65 72 66 6f 72  m.** when perfor
3450: 6d 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ming an incremen
3460: 74 61 6c 20 6d 65 72 67 65 2e 20 49 74 20 72 65  tal merge. It re
3470: 74 75 72 6e 73 20 74 68 65 20 61 62 73 6f 6c 75  turns the absolu
3480: 74 65 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 0a  te level number.
3490: 2a 2a 20 6f 66 20 74 68 65 20 6f 6c 64 65 73 74  ** of the oldest
34a0: 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 64 62   level in the db
34b0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
34c0: 74 20 6c 65 61 73 74 20 3f 20 73 65 67 6d 65 6e  t least ? segmen
34d0: 74 73 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20 6e 6f  ts. Or,.** if no
34e0: 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 46 54   level in the FT
34f0: 53 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 73  S index contains
3500: 20 6d 6f 72 65 20 74 68 61 6e 20 3f 20 73 65 67   more than ? seg
3510: 6d 65 6e 74 73 2c 20 74 68 65 20 73 74 61 74 65  ments, the state
3520: 6d 65 6e 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20  ment.** returns 
3530: 7a 65 72 6f 20 72 6f 77 73 2e 20 20 2a 2f 0a 2f  zero rows.  */./
3540: 2a 20 32 38 20 2a 2f 20 22 53 45 4c 45 43 54 20  * 28 */ "SELECT 
3550: 6c 65 76 65 6c 20 46 52 4f 4d 20 25 51 2e 27 25  level FROM %Q.'%
3560: 71 5f 73 65 67 64 69 72 27 20 47 52 4f 55 50 20  q_segdir' GROUP 
3570: 42 59 20 6c 65 76 65 6c 20 48 41 56 49 4e 47 20  BY level HAVING 
3580: 63 6f 75 6e 74 28 2a 29 3e 3d 3f 22 0a 20 20 20  count(*)>=?".   
3590: 20 20 20 20 20 20 22 20 20 4f 52 44 45 52 20 42        "  ORDER B
35a0: 59 20 28 6c 65 76 65 6c 20 25 25 20 31 30 32 34  Y (level %% 1024
35b0: 29 20 41 53 43 20 4c 49 4d 49 54 20 31 22 2c 0a  ) ASC LIMIT 1",.
35c0: 0a 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  ./* Estimate the
35d0: 20 75 70 70 65 72 20 6c 69 6d 69 74 20 6f 6e 20   upper limit on 
35e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  the number of le
35f0: 61 66 20 6e 6f 64 65 73 20 69 6e 20 61 20 6e 65  af nodes in a ne
3600: 77 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 63 72 65  w segment.** cre
3610: 61 74 65 64 20 62 79 20 6d 65 72 67 69 6e 67 20  ated by merging 
3620: 74 68 65 20 6f 6c 64 65 73 74 20 3a 32 20 73 65  the oldest :2 se
3630: 67 6d 65 6e 74 73 20 66 72 6f 6d 20 61 62 73 6f  gments from abso
3640: 6c 75 74 65 20 6c 65 76 65 6c 20 3a 31 2e 20 53  lute level :1. S
3650: 65 65 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ee .** function 
3660: 73 71 6c 69 74 65 33 46 74 73 33 49 6e 63 72 6d  sqlite3Fts3Incrm
3670: 65 72 67 65 28 29 20 66 6f 72 20 64 65 74 61 69  erge() for detai
3680: 6c 73 2e 20 20 2a 2f 0a 2f 2a 20 32 39 20 2a 2f  ls.  */./* 29 */
3690: 20 22 53 45 4c 45 43 54 20 32 20 2a 20 74 6f 74   "SELECT 2 * tot
36a0: 61 6c 28 31 20 2b 20 6c 65 61 76 65 73 5f 65 6e  al(1 + leaves_en
36b0: 64 5f 62 6c 6f 63 6b 20 2d 20 73 74 61 72 74 5f  d_block - start_
36c0: 62 6c 6f 63 6b 29 20 22 0a 20 20 20 20 20 20 20  block) ".       
36d0: 20 20 22 20 20 46 52 4f 4d 20 25 51 2e 27 25 71    "  FROM %Q.'%q
36e0: 5f 73 65 67 64 69 72 27 20 57 48 45 52 45 20 6c  _segdir' WHERE l
36f0: 65 76 65 6c 20 3d 20 3f 20 41 4e 44 20 69 64 78  evel = ? AND idx
3700: 20 3c 20 3f 22 2c 0a 0a 2f 2a 20 53 51 4c 5f 44   < ?",../* SQL_D
3710: 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 45 4e 54  ELETE_SEGDIR_ENT
3720: 52 59 0a 2a 2a 20 20 20 44 65 6c 65 74 65 20 74  RY.**   Delete t
3730: 68 65 20 25 5f 73 65 67 64 69 72 20 65 6e 74 72  he %_segdir entr
3740: 79 20 6f 6e 20 61 62 73 6f 6c 75 74 65 20 6c 65  y on absolute le
3750: 76 65 6c 20 3a 31 20 77 69 74 68 20 69 6e 64 65  vel :1 with inde
3760: 78 20 3a 32 2e 20 20 2a 2f 0a 2f 2a 20 33 30 20  x :2.  */./* 30 
3770: 2a 2f 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  */ "DELETE FROM 
3780: 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57  %Q.'%q_segdir' W
3790: 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f 20 41  HERE level = ? A
37a0: 4e 44 20 69 64 78 20 3d 20 3f 22 2c 0a 0a 2f 2a  ND idx = ?",../*
37b0: 20 53 51 4c 5f 53 48 49 46 54 5f 53 45 47 44 49   SQL_SHIFT_SEGDI
37c0: 52 5f 45 4e 54 52 59 0a 2a 2a 20 20 20 4d 6f 64  R_ENTRY.**   Mod
37d0: 69 66 79 20 74 68 65 20 69 64 78 20 76 61 6c 75  ify the idx valu
37e0: 65 20 66 6f 72 20 74 68 65 20 73 65 67 6d 65 6e  e for the segmen
37f0: 74 20 77 69 74 68 20 69 64 78 3d 3a 33 20 6f 6e  t with idx=:3 on
3800: 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20   absolute level 
3810: 3a 32 0a 2a 2a 20 20 20 74 6f 20 3a 31 2e 20 20  :2.**   to :1.  
3820: 2a 2f 0a 2f 2a 20 33 31 20 2a 2f 20 22 55 50 44  */./* 31 */ "UPD
3830: 41 54 45 20 25 51 2e 27 25 71 5f 73 65 67 64 69  ATE %Q.'%q_segdi
3840: 72 27 20 53 45 54 20 69 64 78 20 3d 20 3f 20 57  r' SET idx = ? W
3850: 48 45 52 45 20 6c 65 76 65 6c 3d 3f 20 41 4e 44  HERE level=? AND
3860: 20 69 64 78 3d 3f 22 2c 0a 0a 2f 2a 20 53 51 4c   idx=?",../* SQL
3870: 5f 53 45 4c 45 43 54 5f 53 45 47 44 49 52 0a 2a  _SELECT_SEGDIR.*
3880: 2a 20 20 20 52 65 61 64 20 61 20 73 69 6e 67 6c  *   Read a singl
3890: 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65  e entry from the
38a0: 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 2e   %_segdir table.
38b0: 20 54 68 65 20 65 6e 74 72 79 20 66 72 6f 6d 20   The entry from 
38c0: 61 62 73 6f 6c 75 74 65 20 0a 2a 2a 20 20 20 6c  absolute .**   l
38d0: 65 76 65 6c 20 3a 31 20 77 69 74 68 20 69 6e 64  evel :1 with ind
38e0: 65 78 20 76 61 6c 75 65 20 3a 32 2e 20 20 2a 2f  ex value :2.  */
38f0: 0a 2f 2a 20 33 32 20 2a 2f 20 20 22 53 45 4c 45  ./* 32 */  "SELE
3900: 43 54 20 69 64 78 2c 20 73 74 61 72 74 5f 62 6c  CT idx, start_bl
3910: 6f 63 6b 2c 20 6c 65 61 76 65 73 5f 65 6e 64 5f  ock, leaves_end_
3920: 62 6c 6f 63 6b 2c 20 65 6e 64 5f 62 6c 6f 63 6b  block, end_block
3930: 2c 20 72 6f 6f 74 20 22 0a 20 20 20 20 20 20 20  , root ".       
3940: 20 20 20 20 20 22 46 52 4f 4d 20 25 51 2e 27 25       "FROM %Q.'%
3950: 71 5f 73 65 67 64 69 72 27 20 57 48 45 52 45 20  q_segdir' WHERE 
3960: 6c 65 76 65 6c 20 3d 20 3f 20 41 4e 44 20 69 64  level = ? AND id
3970: 78 20 3d 20 3f 22 2c 0a 0a 2f 2a 20 53 51 4c 5f  x = ?",../* SQL_
3980: 43 48 4f 4d 50 5f 53 45 47 44 49 52 0a 2a 2a 20  CHOMP_SEGDIR.** 
3990: 20 20 55 70 64 61 74 65 20 74 68 65 20 73 74 61    Update the sta
39a0: 72 74 5f 62 6c 6f 63 6b 20 28 3a 31 29 20 61 6e  rt_block (:1) an
39b0: 64 20 72 6f 6f 74 20 28 3a 32 29 20 66 69 65 6c  d root (:2) fiel
39c0: 64 73 20 6f 66 20 74 68 65 20 25 5f 73 65 67 64  ds of the %_segd
39d0: 69 72 0a 2a 2a 20 20 20 65 6e 74 72 79 20 6c 6f  ir.**   entry lo
39e0: 63 61 74 65 64 20 6f 6e 20 61 62 73 6f 6c 75 74  cated on absolut
39f0: 65 20 6c 65 76 65 6c 20 3a 33 20 77 69 74 68 20  e level :3 with 
3a00: 69 6e 64 65 78 20 3a 34 2e 20 20 2a 2f 0a 2f 2a  index :4.  */./*
3a10: 20 33 33 20 2a 2f 20 20 22 55 50 44 41 54 45 20   33 */  "UPDATE 
3a20: 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20 53  %Q.'%q_segdir' S
3a30: 45 54 20 73 74 61 72 74 5f 62 6c 6f 63 6b 20 3d  ET start_block =
3a40: 20 3f 2c 20 72 6f 6f 74 20 3d 20 3f 22 0a 20 20   ?, root = ?".  
3a50: 20 20 20 20 20 20 20 20 20 20 22 57 48 45 52 45            "WHERE
3a60: 20 6c 65 76 65 6c 20 3d 20 3f 20 41 4e 44 20 69   level = ? AND i
3a70: 64 78 20 3d 20 3f 22 2c 0a 0a 2f 2a 20 53 51 4c  dx = ?",../* SQL
3a80: 5f 53 45 47 4d 45 4e 54 5f 49 53 5f 41 50 50 45  _SEGMENT_IS_APPE
3a90: 4e 44 41 42 4c 45 0a 2a 2a 20 20 20 52 65 74 75  NDABLE.**   Retu
3aa0: 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  rn a single row 
3ab0: 69 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 77  if the segment w
3ac0: 69 74 68 20 65 6e 64 5f 62 6c 6f 63 6b 3d 3f 20  ith end_block=? 
3ad0: 69 73 20 61 70 70 65 6e 64 61 62 6c 65 2e 20 4f  is appendable. O
3ae0: 72 0a 2a 2a 20 20 20 6e 6f 20 72 6f 77 73 20 6f  r.**   no rows o
3af0: 74 68 65 72 77 69 73 65 2e 20 20 2a 2f 0a 2f 2a  therwise.  */./*
3b00: 20 33 34 20 2a 2f 20 20 22 53 45 4c 45 43 54 20   34 */  "SELECT 
3b10: 31 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65  1 FROM %Q.'%q_se
3b20: 67 6d 65 6e 74 73 27 20 57 48 45 52 45 20 62 6c  gments' WHERE bl
3b30: 6f 63 6b 69 64 3d 3f 20 41 4e 44 20 62 6c 6f 63  ockid=? AND bloc
3b40: 6b 20 49 53 20 4e 55 4c 4c 22 2c 0a 0a 2f 2a 20  k IS NULL",../* 
3b50: 53 51 4c 5f 53 45 4c 45 43 54 5f 49 4e 44 45 58  SQL_SELECT_INDEX
3b60: 45 53 0a 2a 2a 20 20 20 52 65 74 75 72 6e 20 74  ES.**   Return t
3b70: 68 65 20 6c 69 73 74 20 6f 66 20 76 61 6c 69 64  he list of valid
3b80: 20 73 65 67 6d 65 6e 74 20 69 6e 64 65 78 65 73   segment indexes
3b90: 20 66 6f 72 20 61 62 73 6f 6c 75 74 65 20 6c 65   for absolute le
3ba0: 76 65 6c 20 3f 20 20 2a 2f 0a 2f 2a 20 33 35 20  vel ?  */./* 35 
3bb0: 2a 2f 20 20 22 53 45 4c 45 43 54 20 69 64 78 20  */  "SELECT idx 
3bc0: 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64  FROM %Q.'%q_segd
3bd0: 69 72 27 20 57 48 45 52 45 20 6c 65 76 65 6c 3d  ir' WHERE level=
3be0: 3f 20 4f 52 44 45 52 20 42 59 20 31 20 41 53 43  ? ORDER BY 1 ASC
3bf0: 22 2c 0a 0a 2f 2a 20 53 51 4c 5f 53 45 4c 45 43  ",../* SQL_SELEC
3c00: 54 5f 4d 58 4c 45 56 45 4c 0a 2a 2a 20 20 20 52  T_MXLEVEL.**   R
3c10: 65 74 75 72 6e 20 74 68 65 20 6c 61 72 67 65 73  eturn the larges
3c20: 74 20 72 65 6c 61 74 69 76 65 20 6c 65 76 65 6c  t relative level
3c30: 20 69 6e 20 74 68 65 20 46 54 53 20 69 6e 64 65   in the FTS inde
3c40: 78 20 6f 72 20 69 6e 64 65 78 65 73 2e 20 20 2a  x or indexes.  *
3c50: 2f 0a 2f 2a 20 33 36 20 2a 2f 20 20 22 53 45 4c  /./* 36 */  "SEL
3c60: 45 43 54 20 6d 61 78 28 20 6c 65 76 65 6c 20 25  ECT max( level %
3c70: 25 20 31 30 32 34 20 29 20 46 52 4f 4d 20 25 51  % 1024 ) FROM %Q
3c80: 2e 27 25 71 5f 73 65 67 64 69 72 27 22 0a 20 20  .'%q_segdir'".  
3c90: 7d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  };.  int rc = SQ
3ca0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74  LITE_OK;.  sqlit
3cb0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
3cc0: 0a 20 20 61 73 73 65 72 74 28 20 53 69 7a 65 6f  .  assert( Sizeo
3cd0: 66 41 72 72 61 79 28 61 7a 53 71 6c 29 3d 3d 53  fArray(azSql)==S
3ce0: 69 7a 65 6f 66 41 72 72 61 79 28 70 2d 3e 61 53  izeofArray(p->aS
3cf0: 74 6d 74 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tmt) );.  assert
3d00: 28 20 65 53 74 6d 74 3c 53 69 7a 65 6f 66 41 72  ( eStmt<SizeofAr
3d10: 72 61 79 28 61 7a 53 71 6c 29 20 26 26 20 65 53  ray(azSql) && eS
3d20: 74 6d 74 3e 3d 30 20 29 3b 0a 20 20 0a 20 20 70  tmt>=0 );.  .  p
3d30: 53 74 6d 74 20 3d 20 70 2d 3e 61 53 74 6d 74 5b  Stmt = p->aStmt[
3d40: 65 53 74 6d 74 5d 3b 0a 20 20 69 66 28 20 21 70  eStmt];.  if( !p
3d50: 53 74 6d 74 20 29 7b 0a 20 20 20 20 63 68 61 72  Stmt ){.    char
3d60: 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 69 66 28 20   *zSql;.    if( 
3d70: 65 53 74 6d 74 3d 3d 53 51 4c 5f 43 4f 4e 54 45  eStmt==SQL_CONTE
3d80: 4e 54 5f 49 4e 53 45 52 54 20 29 7b 0a 20 20 20  NT_INSERT ){.   
3d90: 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
3da0: 33 5f 6d 70 72 69 6e 74 66 28 61 7a 53 71 6c 5b  3_mprintf(azSql[
3db0: 65 53 74 6d 74 5d 2c 20 70 2d 3e 7a 44 62 2c 20  eStmt], p->zDb, 
3dc0: 70 2d 3e 7a 4e 61 6d 65 2c 20 70 2d 3e 7a 57 72  p->zName, p->zWr
3dd0: 69 74 65 45 78 70 72 6c 69 73 74 29 3b 0a 20 20  iteExprlist);.  
3de0: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 6d    }else if( eStm
3df0: 74 3d 3d 53 51 4c 5f 53 45 4c 45 43 54 5f 43 4f  t==SQL_SELECT_CO
3e00: 4e 54 45 4e 54 5f 42 59 5f 52 4f 57 49 44 20 29  NTENT_BY_ROWID )
3e10: 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73  {.      zSql = s
3e20: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
3e30: 7a 53 71 6c 5b 65 53 74 6d 74 5d 2c 20 70 2d 3e  zSql[eStmt], p->
3e40: 7a 52 65 61 64 45 78 70 72 6c 69 73 74 29 3b 0a  zReadExprlist);.
3e50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3e60: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
3e70: 6d 70 72 69 6e 74 66 28 61 7a 53 71 6c 5b 65 53  mprintf(azSql[eS
3e80: 74 6d 74 5d 2c 20 70 2d 3e 7a 44 62 2c 20 70 2d  tmt], p->zDb, p-
3e90: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
3ea0: 20 20 20 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a     if( !zSql ){.
3eb0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
3ec0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
3ed0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
3ee0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
3ef0: 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
3f00: 31 2c 20 26 70 53 74 6d 74 2c 20 4e 55 4c 4c 29  1, &pStmt, NULL)
3f10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
3f20: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
3f30: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
3f40: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74  LITE_OK || pStmt
3f50: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ==0 );.      p->
3f60: 61 53 74 6d 74 5b 65 53 74 6d 74 5d 20 3d 20 70  aStmt[eStmt] = p
3f70: 53 74 6d 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Stmt;.    }.  }.
3f80: 20 20 69 66 28 20 61 70 56 61 6c 20 29 7b 0a 20    if( apVal ){. 
3f90: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
3fa0: 74 20 6e 50 61 72 61 6d 20 3d 20 73 71 6c 69 74  t nParam = sqlit
3fb0: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
3fc0: 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  r_count(pStmt);.
3fd0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
3fe0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
3ff0: 6e 50 61 72 61 6d 3b 20 69 2b 2b 29 7b 0a 20 20  nParam; i++){.  
4000: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
4010: 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 53 74 6d  _bind_value(pStm
4020: 74 2c 20 69 2b 31 2c 20 61 70 56 61 6c 5b 69 5d  t, i+1, apVal[i]
4030: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
4040: 70 70 20 3d 20 70 53 74 6d 74 3b 0a 20 20 72 65  pp = pStmt;.  re
4050: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61  turn rc;.}...sta
4060: 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 6c 65  tic int fts3Sele
4070: 63 74 44 6f 63 73 69 7a 65 28 0a 20 20 46 74 73  ctDocsize(.  Fts
4080: 33 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20  3Table *pTab,   
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
40a0: 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c  FTS3 table handl
40b0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
40c0: 6e 74 36 34 20 69 44 6f 63 69 64 2c 20 20 20 20  nt64 iDocid,    
40d0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 69 64 20         /* Docid 
40e0: 74 6f 20 62 69 6e 64 20 66 6f 72 20 53 51 4c 5f  to bind for SQL_
40f0: 53 45 4c 45 43 54 5f 44 4f 43 53 49 5a 45 20 2a  SELECT_DOCSIZE *
4100: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
4110: 20 2a 2a 70 70 53 74 6d 74 20 20 20 20 20 20 20   **ppStmt       
4120: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 74 61 74      /* OUT: Stat
4130: 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a  ement handle */.
4140: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
4150: 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20 20  t *pStmt = 0;   
4160: 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e       /* Statemen
4170: 74 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d  t requested from
4180: 20 66 74 73 33 53 71 6c 53 74 6d 74 28 29 20 2a   fts3SqlStmt() *
4190: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
41a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41b0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
41c0: 64 65 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74  de */..  rc = ft
41d0: 73 33 53 71 6c 53 74 6d 74 28 70 54 61 62 2c 20  s3SqlStmt(pTab, 
41e0: 53 51 4c 5f 53 45 4c 45 43 54 5f 44 4f 43 53 49  SQL_SELECT_DOCSI
41f0: 5a 45 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  ZE, &pStmt, 0);.
4200: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4210: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
4220: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
4230: 74 6d 74 2c 20 31 2c 20 69 44 6f 63 69 64 29 3b  tmt, 1, iDocid);
4240: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
4250: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
4260: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
4270: 45 5f 52 4f 57 20 7c 7c 20 73 71 6c 69 74 65 33  E_ROW || sqlite3
4280: 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74  _column_type(pSt
4290: 6d 74 2c 20 30 29 21 3d 53 51 4c 49 54 45 5f 42  mt, 0)!=SQLITE_B
42a0: 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 72 63 20  LOB ){.      rc 
42b0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
42c0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66  pStmt);.      if
42d0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
42e0: 29 20 72 63 20 3d 20 46 54 53 5f 43 4f 52 52 55  ) rc = FTS_CORRU
42f0: 50 54 5f 56 54 41 42 3b 0a 20 20 20 20 20 20 70  PT_VTAB;.      p
4300: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Stmt = 0;.    }e
4310: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
4320: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
4330: 0a 20 20 7d 0a 0a 20 20 2a 70 70 53 74 6d 74 20  .  }..  *ppStmt 
4340: 3d 20 70 53 74 6d 74 3b 0a 20 20 72 65 74 75 72  = pStmt;.  retur
4350: 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c  n rc;.}..int sql
4360: 69 74 65 33 46 74 73 33 53 65 6c 65 63 74 44 6f  ite3Fts3SelectDo
4370: 63 74 6f 74 61 6c 28 0a 20 20 46 74 73 33 54 61  ctotal(.  Fts3Ta
4380: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
4390: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73            /* Fts
43a0: 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  3 table handle *
43b0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
43c0: 20 2a 2a 70 70 53 74 6d 74 20 20 20 20 20 20 20   **ppStmt       
43d0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 74 61 74      /* OUT: Stat
43e0: 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a  ement handle */.
43f0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
4400: 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
4410: 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 66  int rc;.  rc = f
4420: 74 73 33 53 71 6c 53 74 6d 74 28 70 54 61 62 2c  ts3SqlStmt(pTab,
4430: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 54 41 54   SQL_SELECT_STAT
4440: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
4450: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4460: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
4470: 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c  _bind_int(pStmt,
4480: 20 31 2c 20 46 54 53 5f 53 54 41 54 5f 44 4f 43   1, FTS_STAT_DOC
4490: 54 4f 54 41 4c 29 3b 0a 20 20 20 20 69 66 28 20  TOTAL);.    if( 
44a0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
44b0: 6d 74 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57 0a  mt)!=SQLITE_ROW.
44c0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f       || sqlite3_
44d0: 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d  column_type(pStm
44e0: 74 2c 20 30 29 21 3d 53 51 4c 49 54 45 5f 42 4c  t, 0)!=SQLITE_BL
44f0: 4f 42 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  OB.    ){.      
4500: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
4510: 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  et(pStmt);.     
4520: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4530: 4f 4b 20 29 20 72 63 20 3d 20 46 54 53 5f 43 4f  OK ) rc = FTS_CO
4540: 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 20 20  RRUPT_VTAB;.    
4550: 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20    pStmt = 0;.   
4560: 20 7d 0a 20 20 7d 0a 20 20 2a 70 70 53 74 6d 74   }.  }.  *ppStmt
4570: 20 3d 20 70 53 74 6d 74 3b 0a 20 20 72 65 74 75   = pStmt;.  retu
4580: 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71  rn rc;.}..int sq
4590: 6c 69 74 65 33 46 74 73 33 53 65 6c 65 63 74 44  lite3Fts3SelectD
45a0: 6f 63 73 69 7a 65 28 0a 20 20 46 74 73 33 54 61  ocsize(.  Fts3Ta
45b0: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
45c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73            /* Fts
45d0: 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  3 table handle *
45e0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
45f0: 34 20 69 44 6f 63 69 64 2c 20 20 20 20 20 20 20  4 iDocid,       
4600: 20 20 20 20 2f 2a 20 44 6f 63 69 64 20 74 6f 20      /* Docid to 
4610: 72 65 61 64 20 73 69 7a 65 20 64 61 74 61 20 66  read size data f
4620: 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  or */.  sqlite3_
4630: 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 20 20 20  stmt **ppStmt   
4640: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
4650: 53 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65  Statement handle
4660: 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
4670: 66 74 73 33 53 65 6c 65 63 74 44 6f 63 73 69 7a  fts3SelectDocsiz
4680: 65 28 70 54 61 62 2c 20 69 44 6f 63 69 64 2c 20  e(pTab, iDocid, 
4690: 70 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ppStmt);.}../*.*
46a0: 2a 20 53 69 6d 69 6c 61 72 20 74 6f 20 66 74 73  * Similar to fts
46b0: 33 53 71 6c 53 74 6d 74 28 29 2e 20 45 78 63 65  3SqlStmt(). Exce
46c0: 70 74 2c 20 61 66 74 65 72 20 62 69 6e 64 69 6e  pt, after bindin
46d0: 67 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73  g the parameters
46e0: 20 69 6e 0a 2a 2a 20 61 72 72 61 79 20 61 70 56   in.** array apV
46f0: 61 6c 5b 5d 20 74 6f 20 74 68 65 20 53 51 4c 20  al[] to the SQL 
4700: 73 74 61 74 65 6d 65 6e 74 20 69 64 65 6e 74 69  statement identi
4710: 66 69 65 64 20 62 79 20 65 53 74 6d 74 2c 20 74  fied by eStmt, t
4720: 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  he statement.** 
4730: 69 73 20 65 78 65 63 75 74 65 64 2e 0a 2a 2a 0a  is executed..**.
4740: 2a 2a 20 52 65 74 75 72 6e 73 20 53 51 4c 49 54  ** Returns SQLIT
4750: 45 5f 4f 4b 20 69 66 20 74 68 65 20 73 74 61 74  E_OK if the stat
4760: 65 6d 65 6e 74 20 69 73 20 73 75 63 63 65 73 73  ement is success
4770: 66 75 6c 6c 79 20 65 78 65 63 75 74 65 64 2c 20  fully executed, 
4780: 6f 72 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20  or an.** SQLite 
4790: 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
47a0: 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
47b0: 76 6f 69 64 20 66 74 73 33 53 71 6c 45 78 65 63  void fts3SqlExec
47c0: 28 0a 20 20 69 6e 74 20 2a 70 52 43 2c 20 20 20  (.  int *pRC,   
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
47e0: 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
47f0: 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
4800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4810: 20 46 54 53 33 20 74 61 62 6c 65 20 2a 2f 0a 20   FTS3 table */. 
4820: 20 69 6e 74 20 65 53 74 6d 74 2c 20 20 20 20 20   int eStmt,     
4830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
4840: 65 78 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 20  ex of statement 
4850: 74 6f 20 65 76 61 6c 75 61 74 65 20 2a 2f 0a 20  to evaluate */. 
4860: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
4870: 2a 61 70 56 61 6c 20 20 20 20 2f 2a 20 50 61 72  *apVal    /* Par
4880: 61 6d 65 74 65 72 73 20 74 6f 20 62 69 6e 64 20  ameters to bind 
4890: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
48a0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
48b0: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 2a 70 52  nt rc;.  if( *pR
48c0: 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 72 63  C ) return;.  rc
48d0: 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
48e0: 2c 20 65 53 74 6d 74 2c 20 26 70 53 74 6d 74 2c  , eStmt, &pStmt,
48f0: 20 61 70 56 61 6c 29 3b 20 0a 20 20 69 66 28 20   apVal); .  if( 
4900: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
4910: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65  .    sqlite3_ste
4920: 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 72 63  p(pStmt);.    rc
4930: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
4940: 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 2a  (pStmt);.  }.  *
4950: 70 52 43 20 3d 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  pRC = rc;.}.../*
4960: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
4970: 6e 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  n ensures that t
4980: 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 62  he caller has ob
4990: 74 61 69 6e 65 64 20 61 20 73 68 61 72 65 64 2d  tained a shared-
49a0: 63 61 63 68 65 0a 2a 2a 20 74 61 62 6c 65 2d 6c  cache.** table-l
49b0: 6f 63 6b 20 6f 6e 20 74 68 65 20 25 5f 63 6f 6e  ock on the %_con
49c0: 74 65 6e 74 20 74 61 62 6c 65 2e 20 54 68 69 73  tent table. This
49d0: 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66   is required bef
49e0: 6f 72 65 20 72 65 61 64 69 6e 67 0a 2a 2a 20 64  ore reading.** d
49f0: 61 74 61 20 66 72 6f 6d 20 74 68 65 20 66 74 73  ata from the fts
4a00: 33 20 74 61 62 6c 65 2e 20 49 66 20 74 68 69 73  3 table. If this
4a10: 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 61 63 71   lock is not acq
4a20: 75 69 72 65 64 20 66 69 72 73 74 2c 20 74 68 65  uired first, the
4a30: 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  n.** the caller 
4a40: 6d 61 79 20 65 6e 64 20 75 70 20 68 6f 6c 64 69  may end up holdi
4a50: 6e 67 20 72 65 61 64 2d 6c 6f 63 6b 73 20 6f 6e  ng read-locks on
4a60: 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20   the %_segments 
4a70: 61 6e 64 20 25 5f 73 65 67 64 69 72 0a 2a 2a 20  and %_segdir.** 
4a80: 74 61 62 6c 65 73 2c 20 62 75 74 20 6e 6f 20 72  tables, but no r
4a90: 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead-lock on the 
4aa0: 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e  %_content table.
4ab0: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4ac0: 20 0a 2a 2a 20 61 20 73 65 63 6f 6e 64 20 63 6f   .** a second co
4ad0: 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nnection will be
4ae0: 20 61 62 6c 65 20 74 6f 20 77 72 69 74 65 20 74   able to write t
4af0: 6f 20 74 68 65 20 66 74 73 33 20 74 61 62 6c 65  o the fts3 table
4b00: 2c 20 62 75 74 0a 2a 2a 20 61 74 74 65 6d 70 74  , but.** attempt
4b10: 69 6e 67 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ing to commit th
4b20: 6f 73 65 20 77 72 69 74 65 73 20 6d 69 67 68 74  ose writes might
4b30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
4b40: 4f 43 4b 45 44 20 6f 72 0a 2a 2a 20 53 51 4c 49  OCKED or.** SQLI
4b50: 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
4b60: 43 41 43 48 45 20 28 62 65 63 61 75 73 65 20 74  CACHE (because t
4b70: 68 65 20 63 6f 6d 6d 69 74 20 61 74 74 65 6d 70  he commit attemp
4b80: 74 73 20 74 6f 20 6f 62 74 61 69 6e 20 0a 2a 2a  ts to obtain .**
4b90: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 6f 6e 20   write-locks on 
4ba0: 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 61  the %_segments a
4bb0: 6e 64 20 25 5f 73 65 67 64 69 72 20 2a 2a 20 74  nd %_segdir ** t
4bc0: 61 62 6c 65 73 29 2e 20 0a 2a 2a 0a 2a 2a 20 57  ables). .**.** W
4bd0: 65 20 74 72 79 20 74 6f 20 61 76 6f 69 64 20 74  e try to avoid t
4be0: 68 69 73 20 62 65 63 61 75 73 65 20 69 66 20 46  his because if F
4bf0: 54 53 33 20 72 65 74 75 72 6e 73 20 61 6e 79 20  TS3 returns any 
4c00: 65 72 72 6f 72 20 77 68 65 6e 20 63 6f 6d 6d 69  error when commi
4c10: 74 74 69 6e 67 0a 2a 2a 20 61 20 74 72 61 6e 73  tting.** a trans
4c20: 61 63 74 69 6f 6e 2c 20 74 68 65 20 77 68 6f 6c  action, the whol
4c30: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  e transaction wi
4c40: 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ll be rolled bac
4c50: 6b 2e 20 41 6e 64 20 74 68 69 73 20 69 73 0a 2a  k. And this is.*
4c60: 2a 20 6e 6f 74 20 77 68 61 74 20 75 73 65 72 73  * not what users
4c70: 20 65 78 70 65 63 74 20 77 68 65 6e 20 74 68 65   expect when the
4c80: 79 20 67 65 74 20 53 51 4c 49 54 45 5f 4c 4f 43  y get SQLITE_LOC
4c90: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 2e  KED_SHAREDCACHE.
4ca0: 20 49 74 20 63 61 6e 0a 2a 2a 20 73 74 69 6c 6c   It can.** still
4cb0: 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 75   happen if the u
4cc0: 73 65 72 20 72 65 61 64 73 20 64 61 74 61 20 64  ser reads data d
4cd0: 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65  irectly from the
4ce0: 20 25 5f 73 65 67 6d 65 6e 74 73 20 6f 72 0a 2a   %_segments or.*
4cf0: 2a 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65  * %_segdir table
4d00: 73 20 69 6e 73 74 65 61 64 20 6f 66 20 67 6f 69  s instead of goi
4d10: 6e 67 20 74 68 72 6f 75 67 68 20 46 54 53 33 20  ng through FTS3 
4d20: 74 68 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 54 68  though..**.** Th
4d30: 69 73 20 72 65 61 73 6f 6e 69 6e 67 20 64 6f 65  is reasoning doe
4d40: 73 20 6e 6f 74 20 61 70 70 6c 79 20 74 6f 20 61  s not apply to a
4d50: 20 63 6f 6e 74 65 6e 74 3d 78 78 78 20 74 61 62   content=xxx tab
4d60: 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
4d70: 65 33 46 74 73 33 52 65 61 64 4c 6f 63 6b 28 46  e3Fts3ReadLock(F
4d80: 74 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  ts3Table *p){.  
4d90: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4db0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
4dc0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
4dd0: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20   *pStmt;        
4de0: 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
4df0: 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20   used to obtain 
4e00: 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 69 66 28 20 70  lock */..  if( p
4e10: 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d 30  ->zContentTbl==0
4e20: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
4e30: 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
4e40: 53 45 4c 45 43 54 5f 43 4f 4e 54 45 4e 54 5f 42  SELECT_CONTENT_B
4e50: 59 5f 52 4f 57 49 44 2c 20 26 70 53 74 6d 74 2c  Y_ROWID, &pStmt,
4e60: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
4e70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4e80: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
4e90: 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 31 29 3b  _null(pStmt, 1);
4ea0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
4eb0: 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  tep(pStmt);.    
4ec0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
4ed0: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  eset(pStmt);.   
4ee0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
4ef0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
4f00: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
4f10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 54 53 20 6d  ;.}../*.** FTS m
4f20: 61 69 6e 74 61 69 6e 73 20 61 20 73 65 70 61 72  aintains a separ
4f30: 61 74 65 20 69 6e 64 65 78 65 73 20 66 6f 72 20  ate indexes for 
4f40: 65 61 63 68 20 6c 61 6e 67 75 61 67 65 2d 69 64  each language-id
4f50: 20 28 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67   (a 32-bit integ
4f60: 65 72 29 2e 0a 2a 2a 20 57 69 74 68 69 6e 20 65  er)..** Within e
4f70: 61 63 68 20 6c 61 6e 67 75 61 67 65 20 69 64 2c  ach language id,
4f80: 20 61 20 73 65 70 61 72 61 74 65 20 69 6e 64 65   a separate inde
4f90: 78 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20  x is maintained 
4fa0: 74 6f 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20  to store the.** 
4fb0: 64 6f 63 75 6d 65 6e 74 20 74 65 72 6d 73 2c 20  document terms, 
4fc0: 61 6e 64 20 65 61 63 68 20 63 6f 6e 66 69 67 75  and each configu
4fd0: 72 65 64 20 70 72 65 66 69 78 20 73 69 7a 65 20  red prefix size 
4fe0: 28 63 6f 6e 66 69 67 75 72 65 64 20 74 68 65 20  (configured the 
4ff0: 46 54 53 20 0a 2a 2a 20 22 70 72 65 66 69 78 3d  FTS .** "prefix=
5000: 22 20 6f 70 74 69 6f 6e 29 2e 20 41 6e 64 20 65  " option). And e
5010: 61 63 68 20 69 6e 64 65 78 20 63 6f 6e 73 69 73  ach index consis
5020: 74 73 20 6f 66 20 6d 75 6c 74 69 70 6c 65 20 6c  ts of multiple l
5030: 65 76 65 6c 73 20 28 22 72 65 6c 61 74 69 76 65  evels ("relative
5040: 0a 2a 2a 20 6c 65 76 65 6c 73 22 29 2e 0a 2a 2a  .** levels")..**
5050: 0a 2a 2a 20 41 6c 6c 20 74 68 72 65 65 20 6f 66  .** All three of
5060: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 28 74   these values (t
5070: 68 65 20 6c 61 6e 67 75 61 67 65 20 69 64 2c 20  he language id, 
5080: 74 68 65 20 73 70 65 63 69 66 69 63 20 69 6e 64  the specific ind
5090: 65 78 20 61 6e 64 20 74 68 65 0a 2a 2a 20 6c 65  ex and the.** le
50a0: 76 65 6c 20 77 69 74 68 69 6e 20 74 68 65 20 69  vel within the i
50b0: 6e 64 65 78 29 20 61 72 65 20 65 6e 63 6f 64 65  ndex) are encode
50c0: 64 20 69 6e 20 36 34 2d 62 69 74 20 69 6e 74 65  d in 64-bit inte
50d0: 67 65 72 20 76 61 6c 75 65 73 20 73 74 6f 72 65  ger values store
50e0: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 25 5f 73 65  d.** in the %_se
50f0: 67 64 69 72 20 74 61 62 6c 65 20 6f 6e 20 64 69  gdir table on di
5100: 73 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  sk. This functio
5110: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6e  n is used to con
5120: 76 65 72 74 20 74 68 72 65 65 0a 2a 2a 20 73 65  vert three.** se
5130: 70 61 72 61 74 65 20 63 6f 6d 70 6f 6e 65 6e 74  parate component
5140: 20 76 61 6c 75 65 73 20 69 6e 74 6f 20 74 68 65   values into the
5150: 20 73 69 6e 67 6c 65 20 36 34 2d 62 69 74 20 69   single 64-bit i
5160: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 74 68 61  nteger value tha
5170: 74 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64  t.** can be used
5180: 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 25 5f   to query the %_
5190: 73 65 67 64 69 72 20 74 61 62 6c 65 2e 0a 2a 2a  segdir table..**
51a0: 0a 2a 2a 20 53 70 65 63 69 66 69 63 61 6c 6c 79  .** Specifically
51b0: 2c 20 65 61 63 68 20 6c 61 6e 67 75 61 67 65 2d  , each language-
51c0: 69 64 2f 69 6e 64 65 78 20 63 6f 6d 62 69 6e 61  id/index combina
51d0: 74 69 6f 6e 20 69 73 20 61 6c 6c 6f 63 61 74 65  tion is allocate
51e0: 64 20 31 30 32 34 20 0a 2a 2a 20 36 34 2d 62 69  d 1024 .** 64-bi
51f0: 74 20 69 6e 74 65 67 65 72 20 6c 65 76 65 6c 20  t integer level 
5200: 76 61 6c 75 65 73 20 28 22 61 62 73 6f 6c 75 74  values ("absolut
5210: 65 20 6c 65 76 65 6c 73 22 29 2e 20 54 68 65 20  e levels"). The 
5220: 6d 61 69 6e 20 74 65 72 6d 73 20 69 6e 64 65 78  main terms index
5230: 0a 2a 2a 20 66 6f 72 20 6c 61 6e 67 75 61 67 65  .** for language
5240: 2d 69 64 20 30 20 69 73 20 61 6c 6c 6f 63 61 74  -id 0 is allocat
5250: 65 20 76 61 6c 75 65 73 20 30 2d 31 30 32 33 2e  e values 0-1023.
5260: 20 54 68 65 20 66 69 72 73 74 20 70 72 65 66 69   The first prefi
5270: 78 20 69 6e 64 65 78 0a 2a 2a 20 28 69 66 20 61  x index.** (if a
5280: 6e 79 29 20 66 6f 72 20 6c 61 6e 67 75 61 67 65  ny) for language
5290: 2d 69 64 20 30 20 69 73 20 61 6c 6c 6f 63 61 74  -id 0 is allocat
52a0: 65 64 20 76 61 6c 75 65 73 20 31 30 32 34 2d 32  ed values 1024-2
52b0: 30 34 37 2e 20 41 6e 64 20 73 6f 20 6f 6e 2e 0a  047. And so on..
52c0: 2a 2a 20 4c 61 6e 67 75 61 67 65 20 31 20 69 6e  ** Language 1 in
52d0: 64 65 78 65 73 20 61 72 65 20 61 6c 6c 6f 63 61  dexes are alloca
52e0: 74 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ted immediately 
52f0: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 61 6e 67 75 61  following langua
5300: 67 65 20 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 2c 20  ge 0..**.** So, 
5310: 66 6f 72 20 61 20 73 79 73 74 65 6d 20 77 69 74  for a system wit
5320: 68 20 6e 50 72 65 66 69 78 20 70 72 65 66 69 78  h nPrefix prefix
5330: 20 69 6e 64 65 78 65 73 20 63 6f 6e 66 69 67 75   indexes configu
5340: 72 65 64 2c 20 74 68 65 20 62 6c 6f 63 6b 20 6f  red, the block o
5350: 66 0a 2a 2a 20 61 62 73 6f 6c 75 74 65 20 6c 65  f.** absolute le
5360: 76 65 6c 73 20 74 68 61 74 20 63 6f 72 72 65 73  vels that corres
5370: 70 6f 6e 64 73 20 74 6f 20 6c 61 6e 67 75 61 67  ponds to languag
5380: 65 2d 69 64 20 69 4c 61 6e 67 69 64 20 61 6e 64  e-id iLangid and
5390: 20 69 6e 64 65 78 20 0a 2a 2a 20 69 49 6e 64 65   index .** iInde
53a0: 78 20 73 74 61 72 74 73 20 61 74 20 61 62 73 6f  x starts at abso
53b0: 6c 75 74 65 20 6c 65 76 65 6c 20 28 28 69 4c 61  lute level ((iLa
53c0: 6e 67 69 64 20 2a 20 28 6e 50 72 65 66 69 78 2b  ngid * (nPrefix+
53d0: 31 29 20 2b 20 69 49 6e 64 65 78 29 20 2a 20 31  1) + iIndex) * 1
53e0: 30 32 34 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  024)..*/.static 
53f0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 67 65  sqlite3_int64 ge
5400: 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 0a  tAbsoluteLevel(.
5410: 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
5420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5430: 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20    /* FTS3 table 
5440: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
5450: 69 4c 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20  iLangid,        
5460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
5470: 61 6e 67 75 61 67 65 20 69 64 20 2a 2f 0a 20 20  anguage id */.  
5480: 69 6e 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20  int iIndex,     
5490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54a0: 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 61  /* Index in p->a
54b0: 49 6e 64 65 78 5b 5d 20 2a 2f 0a 20 20 69 6e 74  Index[] */.  int
54c0: 20 69 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20   iLevel         
54d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
54e0: 4c 65 76 65 6c 20 6f 66 20 73 65 67 6d 65 6e 74  Level of segment
54f0: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
5500: 33 5f 69 6e 74 36 34 20 69 42 61 73 65 3b 20 20  3_int64 iBase;  
5510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
5520: 73 74 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65  st absolute leve
5530: 6c 20 66 6f 72 20 69 4c 61 6e 67 69 64 2f 69 49  l for iLangid/iI
5540: 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 74  ndex */.  assert
5550: 28 20 69 4c 61 6e 67 69 64 3e 3d 30 20 29 3b 0a  ( iLangid>=0 );.
5560: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 49 6e    assert( p->nIn
5570: 64 65 78 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  dex>0 );.  asser
5580: 74 28 20 69 49 6e 64 65 78 3e 3d 30 20 26 26 20  t( iIndex>=0 && 
5590: 69 49 6e 64 65 78 3c 70 2d 3e 6e 49 6e 64 65 78  iIndex<p->nIndex
55a0: 20 29 3b 0a 0a 20 20 69 42 61 73 65 20 3d 20 28   );..  iBase = (
55b0: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 69  (sqlite3_int64)i
55c0: 4c 61 6e 67 69 64 20 2a 20 70 2d 3e 6e 49 6e 64  Langid * p->nInd
55d0: 65 78 20 2b 20 69 49 6e 64 65 78 29 20 2a 20 46  ex + iIndex) * F
55e0: 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45  TS3_SEGDIR_MAXLE
55f0: 56 45 4c 3b 0a 20 20 72 65 74 75 72 6e 20 69 42  VEL;.  return iB
5600: 61 73 65 20 2b 20 69 4c 65 76 65 6c 3b 0a 7d 0a  ase + iLevel;.}.
5610: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 70 53 74  ./*.** Set *ppSt
5620: 6d 74 20 74 6f 20 61 20 73 74 61 74 65 6d 65 6e  mt to a statemen
5630: 74 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6d 61  t handle that ma
5640: 79 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65  y be used to ite
5650: 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20  rate through.** 
5660: 61 6c 6c 20 72 6f 77 73 20 69 6e 20 74 68 65 20  all rows in the 
5670: 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 2c 20  %_segdir table, 
5680: 66 72 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e  from oldest to n
5690: 65 77 65 73 74 2e 20 49 66 20 73 75 63 63 65 73  ewest. If succes
56a0: 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20  sful,.** return 
56b0: 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e  SQLITE_OK. If an
56c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
56d0: 69 6c 65 20 70 72 65 70 61 72 69 6e 67 20 74 68  ile preparing th
56e0: 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 0a 2a 2a  e statement, .**
56f0: 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
5700: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  e error code..**
5710: 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c  .** There is onl
5720: 79 20 65 76 65 72 20 6f 6e 65 20 69 6e 73 74 61  y ever one insta
5730: 6e 63 65 20 6f 66 20 74 68 69 73 20 53 51 4c 20  nce of this SQL 
5740: 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 70 69 6c  statement compil
5750: 65 64 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 46  ed for.** each F
5760: 54 53 33 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  TS3 table..**.**
5770: 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72   The statement r
5780: 65 74 75 72 6e 73 20 74 68 65 20 66 6f 6c 6c 6f  eturns the follo
5790: 77 69 6e 67 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  wing columns fro
57a0: 6d 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74  m the %_segdir t
57b0: 61 62 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a  able:.**.**   0:
57c0: 20 69 64 78 0a 2a 2a 20 20 20 31 3a 20 73 74 61   idx.**   1: sta
57d0: 72 74 5f 62 6c 6f 63 6b 0a 2a 2a 20 20 20 32 3a  rt_block.**   2:
57e0: 20 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63   leaves_end_bloc
57f0: 6b 0a 2a 2a 20 20 20 33 3a 20 65 6e 64 5f 62 6c  k.**   3: end_bl
5800: 6f 63 6b 0a 2a 2a 20 20 20 34 3a 20 72 6f 6f 74  ock.**   4: root
5810: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
5820: 74 73 33 41 6c 6c 53 65 67 64 69 72 73 28 0a 20  ts3AllSegdirs(. 
5830: 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5850: 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20 2a   /* FTS3 table *
5860: 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c  /.  int iLangid,
5870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5880: 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20      /* Language 
5890: 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f  being queried */
58a0: 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 2c 20 20  .  int iIndex,  
58b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58c0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20     /* Index for 
58d0: 70 2d 3e 61 49 6e 64 65 78 5b 5d 20 2a 2f 0a 20  p->aIndex[] */. 
58e0: 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20   int iLevel,    
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5900: 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 73 65 6c   /* Level to sel
5910: 65 63 74 20 28 72 65 6c 61 74 69 76 65 20 6c 65  ect (relative le
5920: 76 65 6c 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  vel) */.  sqlite
5930: 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 20  3_stmt **ppStmt 
5940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
5950: 3a 20 43 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  : Compiled state
5960: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
5970: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73   rc;.  sqlite3_s
5980: 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
5990: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 76 65  .  assert( iLeve
59a0: 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f  l==FTS3_SEGCURSO
59b0: 52 5f 41 4c 4c 20 7c 7c 20 69 4c 65 76 65 6c 3e  R_ALL || iLevel>
59c0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
59d0: 69 4c 65 76 65 6c 3c 46 54 53 33 5f 53 45 47 44  iLevel<FTS3_SEGD
59e0: 49 52 5f 4d 41 58 4c 45 56 45 4c 20 29 3b 0a 20  IR_MAXLEVEL );. 
59f0: 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 3e   assert( iIndex>
5a00: 3d 30 20 26 26 20 69 49 6e 64 65 78 3c 70 2d 3e  =0 && iIndex<p->
5a10: 6e 49 6e 64 65 78 20 29 3b 0a 0a 20 20 69 66 28  nIndex );..  if(
5a20: 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20   iLevel<0 ){.   
5a30: 20 2f 2a 20 22 53 45 4c 45 43 54 20 2a 20 46 52   /* "SELECT * FR
5a40: 4f 4d 20 25 5f 73 65 67 64 69 72 20 57 48 45 52  OM %_segdir WHER
5a50: 45 20 6c 65 76 65 6c 20 42 45 54 57 45 45 4e 20  E level BETWEEN 
5a60: 3f 20 41 4e 44 20 3f 20 4f 52 44 45 52 20 42 59  ? AND ? ORDER BY
5a70: 20 2e 2e 2e 22 20 2a 2f 0a 20 20 20 20 72 63 20   ..." */.    rc 
5a80: 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
5a90: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c 45 56 45   SQL_SELECT_LEVE
5aa0: 4c 5f 52 41 4e 47 45 2c 20 26 70 53 74 6d 74 2c  L_RANGE, &pStmt,
5ab0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
5ac0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20  =SQLITE_OK ){ . 
5ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
5ae0: 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31  d_int64(pStmt, 1
5af0: 2c 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76  , getAbsoluteLev
5b00: 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69  el(p, iLangid, i
5b10: 49 6e 64 65 78 2c 20 30 29 29 3b 0a 20 20 20 20  Index, 0));.    
5b20: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
5b30: 6e 74 36 34 28 70 53 74 6d 74 2c 20 32 2c 20 0a  nt64(pStmt, 2, .
5b40: 20 20 20 20 20 20 20 20 20 20 67 65 74 41 62 73            getAbs
5b50: 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c  oluteLevel(p, iL
5b60: 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 46  angid, iIndex, F
5b70: 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45  TS3_SEGDIR_MAXLE
5b80: 56 45 4c 2d 31 29 0a 20 20 20 20 20 20 29 3b 0a  VEL-1).      );.
5b90: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
5ba0: 20 20 20 2f 2a 20 22 53 45 4c 45 43 54 20 2a 20     /* "SELECT * 
5bb0: 46 52 4f 4d 20 25 5f 73 65 67 64 69 72 20 57 48  FROM %_segdir WH
5bc0: 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f 20 4f 52  ERE level = ? OR
5bd0: 44 45 52 20 42 59 20 2e 2e 2e 22 20 2a 2f 0a 20  DER BY ..." */. 
5be0: 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53     rc = fts3SqlS
5bf0: 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43  tmt(p, SQL_SELEC
5c00: 54 5f 4c 45 56 45 4c 2c 20 26 70 53 74 6d 74 2c  T_LEVEL, &pStmt,
5c10: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
5c20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20  =SQLITE_OK ){ . 
5c30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
5c40: 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31  d_int64(pStmt, 1
5c50: 2c 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76  , getAbsoluteLev
5c60: 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69  el(p, iLangid, i
5c70: 49 6e 64 65 78 2c 69 4c 65 76 65 6c 29 29 3b 0a  Index,iLevel));.
5c80: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70 53      }.  }.  *ppS
5c90: 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 72  tmt = pStmt;.  r
5ca0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
5cb0: 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 73 69 6e  .** Append a sin
5cc0: 67 6c 65 20 76 61 72 69 6e 74 20 74 6f 20 61 20  gle varint to a 
5cd0: 50 65 6e 64 69 6e 67 4c 69 73 74 20 62 75 66 66  PendingList buff
5ce0: 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  er. SQLITE_OK is
5cf0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 66 20   returned.** if 
5d00: 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
5d10: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
5d20: 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
5d30: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
5d40: 6f 6e 20 61 6c 73 6f 20 73 65 72 76 65 73 20 74  on also serves t
5d50: 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50  o allocate the P
5d60: 65 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63  endingList struc
5d70: 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20  ture itself..** 
5d80: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20  For example, to 
5d90: 63 72 65 61 74 65 20 61 20 6e 65 77 20 50 65 6e  create a new Pen
5da0: 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63 74 75  dingList structu
5db0: 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 77  re containing tw
5dc0: 6f 0a 2a 2a 20 76 61 72 69 6e 74 73 3a 0a 2a 2a  o.** varints:.**
5dd0: 0a 2a 2a 20 20 20 50 65 6e 64 69 6e 67 4c 69 73  .**   PendingLis
5de0: 74 20 2a 70 20 3d 20 30 3b 0a 2a 2a 20 20 20 66  t *p = 0;.**   f
5df0: 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70  ts3PendingListAp
5e00: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2c 20 31  pendVarint(&p, 1
5e10: 29 3b 0a 2a 2a 20 20 20 66 74 73 33 50 65 6e 64  );.**   fts3Pend
5e20: 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72  ingListAppendVar
5e30: 69 6e 74 28 26 70 2c 20 32 29 3b 0a 2a 2f 0a 73  int(&p, 2);.*/.s
5e40: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 50 65  tatic int fts3Pe
5e50: 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56  ndingListAppendV
5e60: 61 72 69 6e 74 28 0a 20 20 50 65 6e 64 69 6e 67  arint(.  Pending
5e70: 4c 69 73 74 20 2a 2a 70 70 2c 20 20 20 20 20 20  List **pp,      
5e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
5e90: 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 50  UT: Pointer to P
5ea0: 65 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63  endingList struc
5eb0: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  t */.  sqlite3_i
5ec0: 6e 74 36 34 20 69 20 20 20 20 20 20 20 20 20 20  nt64 i          
5ed0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
5ee0: 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74  to append to dat
5ef0: 61 20 2a 2f 0a 29 7b 0a 20 20 50 65 6e 64 69 6e  a */.){.  Pendin
5f00: 67 4c 69 73 74 20 2a 70 20 3d 20 2a 70 70 3b 0a  gList *p = *pp;.
5f10: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6f  .  /* Allocate o
5f20: 72 20 67 72 6f 77 20 74 68 65 20 50 65 6e 64 69  r grow the Pendi
5f30: 6e 67 4c 69 73 74 20 61 73 20 72 65 71 75 69 72  ngList as requir
5f40: 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 21 70 20  ed. */.  if( !p 
5f50: 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  ){.    p = sqlit
5f60: 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
5f70: 28 2a 70 29 20 2b 20 31 30 30 29 3b 0a 20 20 20  (*p) + 100);.   
5f80: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 20   if( !p ){.     
5f90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
5fa0: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
5fb0: 70 2d 3e 6e 53 70 61 63 65 20 3d 20 31 30 30 3b  p->nSpace = 100;
5fc0: 0a 20 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20  .    p->aData = 
5fd0: 28 63 68 61 72 20 2a 29 26 70 5b 31 5d 3b 0a 20  (char *)&p[1];. 
5fe0: 20 20 20 70 2d 3e 6e 44 61 74 61 20 3d 20 30 3b     p->nData = 0;
5ff0: 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20  .  }.  else if( 
6000: 70 2d 3e 6e 44 61 74 61 2b 46 54 53 33 5f 56 41  p->nData+FTS3_VA
6010: 52 49 4e 54 5f 4d 41 58 2b 31 3e 70 2d 3e 6e 53  RINT_MAX+1>p->nS
6020: 70 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  pace ){.    int 
6030: 6e 4e 65 77 20 3d 20 70 2d 3e 6e 53 70 61 63 65  nNew = p->nSpace
6040: 20 2a 20 32 3b 0a 20 20 20 20 70 20 3d 20 73 71   * 2;.    p = sq
6050: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 2c  lite3_realloc(p,
6060: 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 6e 4e   sizeof(*p) + nN
6070: 65 77 29 3b 0a 20 20 20 20 69 66 28 20 21 70 20  ew);.    if( !p 
6080: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6090: 5f 66 72 65 65 28 2a 70 70 29 3b 0a 20 20 20 20  _free(*pp);.    
60a0: 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 20 20 20    *pp = 0;.     
60b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
60c0: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
60d0: 70 2d 3e 6e 53 70 61 63 65 20 3d 20 6e 4e 65 77  p->nSpace = nNew
60e0: 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74 61 20 3d  ;.    p->aData =
60f0: 20 28 63 68 61 72 20 2a 29 26 70 5b 31 5d 3b 0a   (char *)&p[1];.
6100: 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64    }..  /* Append
6110: 20 74 68 65 20 6e 65 77 20 73 65 72 69 61 6c 69   the new seriali
6120: 7a 65 64 20 76 61 72 69 6e 74 20 74 6f 20 74 68  zed varint to th
6130: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 73  e end of the lis
6140: 74 2e 20 2a 2f 0a 20 20 70 2d 3e 6e 44 61 74 61  t. */.  p->nData
6150: 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50   += sqlite3Fts3P
6160: 75 74 56 61 72 69 6e 74 28 26 70 2d 3e 61 44 61  utVarint(&p->aDa
6170: 74 61 5b 70 2d 3e 6e 44 61 74 61 5d 2c 20 69 29  ta[p->nData], i)
6180: 3b 0a 20 20 70 2d 3e 61 44 61 74 61 5b 70 2d 3e  ;.  p->aData[p->
6190: 6e 44 61 74 61 5d 20 3d 20 27 5c 30 27 3b 0a 20  nData] = '\0';. 
61a0: 20 2a 70 70 20 3d 20 70 3b 0a 20 20 72 65 74 75   *pp = p;.  retu
61b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
61c0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 64 6f 63  ./*.** Add a doc
61d0: 69 64 2f 63 6f 6c 75 6d 6e 2f 70 6f 73 69 74 69  id/column/positi
61e0: 6f 6e 20 65 6e 74 72 79 20 74 6f 20 61 20 50 65  on entry to a Pe
61f0: 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63 74  ndingList struct
6200: 75 72 65 2e 20 4e 6f 6e 2d 7a 65 72 6f 0a 2a 2a  ure. Non-zero.**
6210: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
6220: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 69 73  the structure is
6230: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
6240: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 64  ed as part of ad
6250: 64 69 6e 67 0a 2a 2a 20 74 68 65 20 65 6e 74 72  ding.** the entr
6260: 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 7a 65  y. Otherwise, ze
6270: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ro..**.** If an 
6280: 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
6290: 2c 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f  , *pRc is set to
62a0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 62 65   SQLITE_NOMEM be
62b0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
62c0: 2a 2a 20 5a 65 72 6f 20 69 73 20 61 6c 77 61 79  ** Zero is alway
62d0: 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68  s returned in th
62e0: 69 73 20 63 61 73 65 2e 20 4f 74 68 65 72 77 69  is case. Otherwi
62f0: 73 65 2c 20 69 66 20 6e 6f 20 4f 4f 4d 20 65 72  se, if no OOM er
6300: 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69  ror occurs,.** i
6310: 74 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  t is set to SQLI
6320: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
6330: 20 69 6e 74 20 66 74 73 33 50 65 6e 64 69 6e 67   int fts3Pending
6340: 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50 65  ListAppend(.  Pe
6350: 6e 64 69 6e 67 4c 69 73 74 20 2a 2a 70 70 2c 20  ndingList **pp, 
6360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6370: 20 49 4e 2f 4f 55 54 3a 20 50 65 6e 64 69 6e 67   IN/OUT: Pending
6380: 4c 69 73 74 20 73 74 72 75 63 74 75 72 65 20 2a  List structure *
6390: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
63a0: 34 20 69 44 6f 63 69 64 2c 20 20 20 20 20 20 20  4 iDocid,       
63b0: 20 20 20 20 2f 2a 20 44 6f 63 69 64 20 66 6f 72      /* Docid for
63c0: 20 65 6e 74 72 79 20 74 6f 20 61 64 64 20 2a 2f   entry to add */
63d0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
63e0: 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   iCol,          
63f0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 66 6f 72     /* Column for
6400: 20 65 6e 74 72 79 20 74 6f 20 61 64 64 20 2a 2f   entry to add */
6410: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
6420: 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20   iPos,          
6430: 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f     /* Position o
6440: 66 20 74 65 72 6d 20 66 6f 72 20 65 6e 74 72 79  f term for entry
6450: 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69 6e 74   to add */.  int
6460: 20 2a 70 52 63 20 20 20 20 20 20 20 20 20 20 20   *pRc           
6470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6480: 4f 55 54 3a 20 52 65 74 75 72 6e 20 63 6f 64 65  OUT: Return code
6490: 20 2a 2f 0a 29 7b 0a 20 20 50 65 6e 64 69 6e 67   */.){.  Pending
64a0: 4c 69 73 74 20 2a 70 20 3d 20 2a 70 70 3b 0a 20  List *p = *pp;. 
64b0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
64c0: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
64d0: 21 70 20 7c 7c 20 70 2d 3e 69 4c 61 73 74 44 6f  !p || p->iLastDo
64e0: 63 69 64 3c 3d 69 44 6f 63 69 64 20 29 3b 0a 0a  cid<=iDocid );..
64f0: 20 20 69 66 28 20 21 70 20 7c 7c 20 70 2d 3e 69    if( !p || p->i
6500: 4c 61 73 74 44 6f 63 69 64 21 3d 69 44 6f 63 69  LastDocid!=iDoci
6510: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
6520: 5f 69 6e 74 36 34 20 69 44 65 6c 74 61 20 3d 20  _int64 iDelta = 
6530: 69 44 6f 63 69 64 20 2d 20 28 70 20 3f 20 70 2d  iDocid - (p ? p-
6540: 3e 69 4c 61 73 74 44 6f 63 69 64 20 3a 20 30 29  >iLastDocid : 0)
6550: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
6560: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
6570: 6e 44 61 74 61 3c 70 2d 3e 6e 53 70 61 63 65 20  nData<p->nSpace 
6580: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
6590: 20 70 2d 3e 61 44 61 74 61 5b 70 2d 3e 6e 44 61   p->aData[p->nDa
65a0: 74 61 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ta]==0 );.      
65b0: 70 2d 3e 6e 44 61 74 61 2b 2b 3b 0a 20 20 20 20  p->nData++;.    
65c0: 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  }.    if( SQLITE
65d0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 66 74 73 33 50  _OK!=(rc = fts3P
65e0: 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64  endingListAppend
65f0: 56 61 72 69 6e 74 28 26 70 2c 20 69 44 65 6c 74  Varint(&p, iDelt
6600: 61 29 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  a)) ){.      got
6610: 6f 20 70 65 6e 64 69 6e 67 6c 69 73 74 61 70 70  o pendinglistapp
6620: 65 6e 64 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  end_out;.    }. 
6630: 20 20 20 70 2d 3e 69 4c 61 73 74 43 6f 6c 20 3d     p->iLastCol =
6640: 20 2d 31 3b 0a 20 20 20 20 70 2d 3e 69 4c 61 73   -1;.    p->iLas
6650: 74 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20 70 2d  tPos = 0;.    p-
6660: 3e 69 4c 61 73 74 44 6f 63 69 64 20 3d 20 69 44  >iLastDocid = iD
6670: 6f 63 69 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ocid;.  }.  if( 
6680: 69 43 6f 6c 3e 30 20 26 26 20 70 2d 3e 69 4c 61  iCol>0 && p->iLa
6690: 73 74 43 6f 6c 21 3d 69 43 6f 6c 20 29 7b 0a 20  stCol!=iCol ){. 
66a0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
66b0: 21 3d 28 72 63 20 3d 20 66 74 73 33 50 65 6e 64  !=(rc = fts3Pend
66c0: 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72  ingListAppendVar
66d0: 69 6e 74 28 26 70 2c 20 31 29 29 0a 20 20 20 20  int(&p, 1)).    
66e0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
66f0: 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67  rc = fts3Pending
6700: 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e 74  ListAppendVarint
6710: 28 26 70 2c 20 69 43 6f 6c 29 29 0a 20 20 20 20  (&p, iCol)).    
6720: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 65  ){.      goto pe
6730: 6e 64 69 6e 67 6c 69 73 74 61 70 70 65 6e 64 5f  ndinglistappend_
6740: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
6750: 2d 3e 69 4c 61 73 74 43 6f 6c 20 3d 20 69 43 6f  ->iLastCol = iCo
6760: 6c 3b 0a 20 20 20 20 70 2d 3e 69 4c 61 73 74 50  l;.    p->iLastP
6770: 6f 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  os = 0;.  }.  if
6780: 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20  ( iCol>=0 ){.   
6790: 20 61 73 73 65 72 74 28 20 69 50 6f 73 3e 70 2d   assert( iPos>p-
67a0: 3e 69 4c 61 73 74 50 6f 73 20 7c 7c 20 28 69 50  >iLastPos || (iP
67b0: 6f 73 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 61 73  os==0 && p->iLas
67c0: 74 50 6f 73 3d 3d 30 29 20 29 3b 0a 20 20 20 20  tPos==0) );.    
67d0: 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67  rc = fts3Pending
67e0: 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e 74  ListAppendVarint
67f0: 28 26 70 2c 20 32 2b 69 50 6f 73 2d 70 2d 3e 69  (&p, 2+iPos-p->i
6800: 4c 61 73 74 50 6f 73 29 3b 0a 20 20 20 20 69 66  LastPos);.    if
6810: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6820: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 61 73  ){.      p->iLas
6830: 74 50 6f 73 20 3d 20 69 50 6f 73 3b 0a 20 20 20  tPos = iPos;.   
6840: 20 7d 0a 20 20 7d 0a 0a 20 70 65 6e 64 69 6e 67   }.  }.. pending
6850: 6c 69 73 74 61 70 70 65 6e 64 5f 6f 75 74 3a 0a  listappend_out:.
6860: 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 69    *pRc = rc;.  i
6870: 66 28 20 70 21 3d 2a 70 70 20 29 7b 0a 20 20 20  f( p!=*pp ){.   
6880: 20 2a 70 70 20 3d 20 70 3b 0a 20 20 20 20 72 65   *pp = p;.    re
6890: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
68a0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
68b0: 20 46 72 65 65 20 61 20 50 65 6e 64 69 6e 67 4c   Free a PendingL
68c0: 69 73 74 20 6f 62 6a 65 63 74 20 61 6c 6c 6f 63  ist object alloc
68d0: 61 74 65 64 20 62 79 20 66 74 73 33 50 65 6e 64  ated by fts3Pend
68e0: 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 28 29 2e  ingListAppend().
68f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6900: 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 44  fts3PendingListD
6910: 65 6c 65 74 65 28 50 65 6e 64 69 6e 67 4c 69 73  elete(PendingLis
6920: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c  t *pList){.  sql
6930: 69 74 65 33 5f 66 72 65 65 28 70 4c 69 73 74 29  ite3_free(pList)
6940: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
6950: 6e 20 65 6e 74 72 79 20 74 6f 20 6f 6e 65 20 6f  n entry to one o
6960: 66 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65  f the pending-te
6970: 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65 73 2e  rms hash tables.
6980: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
6990: 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 41  ts3PendingTermsA
69a0: 64 64 4f 6e 65 28 0a 20 20 46 74 73 33 54 61 62  ddOne(.  Fts3Tab
69b0: 6c 65 20 2a 70 2c 0a 20 20 69 6e 74 20 69 43 6f  le *p,.  int iCo
69c0: 6c 2c 0a 20 20 69 6e 74 20 69 50 6f 73 2c 0a 20  l,.  int iPos,. 
69d0: 20 46 74 73 33 48 61 73 68 20 2a 70 48 61 73 68   Fts3Hash *pHash
69e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
69f0: 20 2f 2a 20 50 65 6e 64 69 6e 67 20 74 65 72 6d   /* Pending term
6a00: 73 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20  s hash table to 
6a10: 61 64 64 20 65 6e 74 72 79 20 74 6f 20 2a 2f 0a  add entry to */.
6a20: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
6a30: 6f 6b 65 6e 2c 0a 20 20 69 6e 74 20 6e 54 6f 6b  oken,.  int nTok
6a40: 65 6e 0a 29 7b 0a 20 20 50 65 6e 64 69 6e 67 4c  en.){.  PendingL
6a50: 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e  ist *pList;.  in
6a60: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
6a70: 3b 0a 0a 20 20 70 4c 69 73 74 20 3d 20 28 50 65  ;..  pList = (Pe
6a80: 6e 64 69 6e 67 4c 69 73 74 20 2a 29 66 74 73 33  ndingList *)fts3
6a90: 48 61 73 68 46 69 6e 64 28 70 48 61 73 68 2c 20  HashFind(pHash, 
6aa0: 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b  zToken, nToken);
6ab0: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
6ac0: 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44      p->nPendingD
6ad0: 61 74 61 20 2d 3d 20 28 70 4c 69 73 74 2d 3e 6e  ata -= (pList->n
6ae0: 44 61 74 61 20 2b 20 6e 54 6f 6b 65 6e 20 2b 20  Data + nToken + 
6af0: 73 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68 45  sizeof(Fts3HashE
6b00: 6c 65 6d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  lem));.  }.  if(
6b10: 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74   fts3PendingList
6b20: 41 70 70 65 6e 64 28 26 70 4c 69 73 74 2c 20 70  Append(&pList, p
6b30: 2d 3e 69 50 72 65 76 44 6f 63 69 64 2c 20 69 43  ->iPrevDocid, iC
6b40: 6f 6c 2c 20 69 50 6f 73 2c 20 26 72 63 29 20 29  ol, iPos, &rc) )
6b50: 7b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  {.    if( pList=
6b60: 3d 66 74 73 33 48 61 73 68 49 6e 73 65 72 74 28  =fts3HashInsert(
6b70: 70 48 61 73 68 2c 20 7a 54 6f 6b 65 6e 2c 20 6e  pHash, zToken, n
6b80: 54 6f 6b 65 6e 2c 20 70 4c 69 73 74 29 20 29 7b  Token, pList) ){
6b90: 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  .      /* Malloc
6ba0: 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 69 6e   failed while in
6bb0: 73 65 72 74 69 6e 67 20 74 68 65 20 6e 65 77 20  serting the new 
6bc0: 65 6e 74 72 79 2e 20 54 68 69 73 20 63 61 6e 20  entry. This can 
6bd0: 6f 6e 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 68  only .      ** h
6be0: 61 70 70 65 6e 20 69 66 20 74 68 65 72 65 20 77  appen if there w
6bf0: 61 73 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 65  as no previous e
6c00: 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74 6f  ntry for this to
6c10: 6b 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ken..      */.  
6c20: 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 66      assert( 0==f
6c30: 74 73 33 48 61 73 68 46 69 6e 64 28 70 48 61 73  ts3HashFind(pHas
6c40: 68 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  h, zToken, nToke
6c50: 6e 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  n) );.      sqli
6c60: 74 65 33 5f 66 72 65 65 28 70 4c 69 73 74 29 3b  te3_free(pList);
6c70: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
6c80: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
6c90: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
6ca0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
6cb0: 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 2b  ->nPendingData +
6cc0: 3d 20 28 70 4c 69 73 74 2d 3e 6e 44 61 74 61 20  = (pList->nData 
6cd0: 2b 20 6e 54 6f 6b 65 6e 20 2b 20 73 69 7a 65 6f  + nToken + sizeo
6ce0: 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d 29 29  f(Fts3HashElem))
6cf0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
6d00: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 6b 65  c;.}../*.** Toke
6d10: 6e 69 7a 65 20 74 68 65 20 6e 75 6c 2d 74 65 72  nize the nul-ter
6d20: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 7a  minated string z
6d30: 54 65 78 74 20 61 6e 64 20 61 64 64 20 61 6c 6c  Text and add all
6d40: 20 74 6f 6b 65 6e 73 20 74 6f 20 74 68 65 0a 2a   tokens to the.*
6d50: 2a 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20  * pending-terms 
6d60: 68 61 73 68 2d 74 61 62 6c 65 2e 20 54 68 65 20  hash-table. The 
6d70: 64 6f 63 69 64 20 75 73 65 64 20 69 73 20 74 68  docid used is th
6d80: 61 74 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  at currently sto
6d90: 72 65 64 20 69 6e 0a 2a 2a 20 70 2d 3e 69 50 72  red in.** p->iPr
6da0: 65 76 44 6f 63 69 64 2c 20 61 6e 64 20 74 68 65  evDocid, and the
6db0: 20 63 6f 6c 75 6d 6e 20 69 73 20 73 70 65 63 69   column is speci
6dc0: 66 69 65 64 20 62 79 20 61 72 67 75 6d 65 6e 74  fied by argument
6dd0: 20 69 43 6f 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   iCol..**.** If 
6de0: 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
6df0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
6e00: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  d. Otherwise, an
6e10: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
6e20: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
6e30: 74 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72  t fts3PendingTer
6e40: 6d 73 41 64 64 28 0a 20 20 46 74 73 33 54 61 62  msAdd(.  Fts3Tab
6e50: 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
6e60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
6e70: 65 20 69 6e 74 6f 20 77 68 69 63 68 20 74 65 78  e into which tex
6e80: 74 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  t will be insert
6e90: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e  ed */.  int iLan
6ea0: 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  gid,            
6eb0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75          /* Langu
6ec0: 61 67 65 20 69 64 20 74 6f 20 75 73 65 20 2a 2f  age id to use */
6ed0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6ee0: 54 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20  Text,           
6ef0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 64 6f     /* Text of do
6f00: 63 75 6d 65 6e 74 20 74 6f 20 62 65 20 69 6e 73  cument to be ins
6f10: 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  erted */.  int i
6f20: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
6f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
6f40: 6c 75 6d 6e 20 69 6e 74 6f 20 77 68 69 63 68 20  lumn into which 
6f50: 74 65 78 74 20 69 73 20 62 65 69 6e 67 20 69 6e  text is being in
6f60: 73 65 72 74 65 64 20 2a 2f 0a 20 20 75 33 32 20  serted */.  u32 
6f70: 2a 70 6e 57 6f 72 64 20 20 20 20 20 20 20 20 20  *pnWord         
6f80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
6f90: 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 74 6f  UT: Number of to
6fa0: 6b 65 6e 73 20 69 6e 73 65 72 74 65 64 20 2a 2f  kens inserted */
6fb0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
6fc0: 69 6e 74 20 69 53 74 61 72 74 3b 0a 20 20 69 6e  int iStart;.  in
6fd0: 74 20 69 45 6e 64 3b 0a 20 20 69 6e 74 20 69 50  t iEnd;.  int iP
6fe0: 6f 73 3b 0a 20 20 69 6e 74 20 6e 57 6f 72 64 20  os;.  int nWord 
6ff0: 3d 20 30 3b 0a 0a 20 20 63 68 61 72 20 63 6f 6e  = 0;..  char con
7000: 73 74 20 2a 7a 54 6f 6b 65 6e 3b 0a 20 20 69 6e  st *zToken;.  in
7010: 74 20 6e 54 6f 6b 65 6e 3b 0a 0a 20 20 73 71 6c  t nToken;..  sql
7020: 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a  ite3_tokenizer *
7030: 70 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 70 2d 3e  pTokenizer = p->
7040: 70 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 73 71  pTokenizer;.  sq
7050: 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
7060: 6d 6f 64 75 6c 65 20 63 6f 6e 73 74 20 2a 70 4d  module const *pM
7070: 6f 64 75 6c 65 20 3d 20 70 54 6f 6b 65 6e 69 7a  odule = pTokeniz
7080: 65 72 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 73  er->pModule;.  s
7090: 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
70a0: 5f 63 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20  _cursor *pCsr;. 
70b0: 20 69 6e 74 20 28 2a 78 4e 65 78 74 29 28 73 71   int (*xNext)(sq
70c0: 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
70d0: 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c  cursor *pCursor,
70e0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
70f0: 72 2a 2a 2c 69 6e 74 2a 2c 69 6e 74 2a 2c 69 6e  r**,int*,int*,in
7100: 74 2a 2c 69 6e 74 2a 29 3b 0a 0a 20 20 61 73 73  t*,int*);..  ass
7110: 65 72 74 28 20 70 54 6f 6b 65 6e 69 7a 65 72 20  ert( pTokenizer 
7120: 26 26 20 70 4d 6f 64 75 6c 65 20 29 3b 0a 0a 20  && pModule );.. 
7130: 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20   /* If the user 
7140: 68 61 73 20 69 6e 73 65 72 74 65 64 20 61 20 4e  has inserted a N
7150: 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68 69 73 20  ULL value, this 
7160: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
7170: 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a  called with.  **
7180: 20 7a 54 65 78 74 3d 3d 30 2e 20 49 6e 20 74 68   zText==0. In th
7190: 69 73 20 63 61 73 65 2c 20 61 64 64 20 7a 65 72  is case, add zer
71a0: 6f 20 74 6f 6b 65 6e 20 65 6e 74 72 69 65 73 20  o token entries 
71b0: 74 6f 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  to the hash tabl
71c0: 65 20 61 6e 64 20 0a 20 20 2a 2a 20 72 65 74 75  e and .  ** retu
71d0: 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 69  rn early. */.  i
71e0: 66 28 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20  f( zText==0 ){. 
71f0: 20 20 20 2a 70 6e 57 6f 72 64 20 3d 20 30 3b 0a     *pnWord = 0;.
7200: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7210: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  E_OK;.  }..  rc 
7220: 3d 20 73 71 6c 69 74 65 33 46 74 73 33 4f 70 65  = sqlite3Fts3Ope
7230: 6e 54 6f 6b 65 6e 69 7a 65 72 28 70 54 6f 6b 65  nTokenizer(pToke
7240: 6e 69 7a 65 72 2c 20 69 4c 61 6e 67 69 64 2c 20  nizer, iLangid, 
7250: 7a 54 65 78 74 2c 20 2d 31 2c 20 26 70 43 73 72  zText, -1, &pCsr
7260: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
7270: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
7280: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
7290: 78 4e 65 78 74 20 3d 20 70 4d 6f 64 75 6c 65 2d  xNext = pModule-
72a0: 3e 78 4e 65 78 74 3b 0a 20 20 77 68 69 6c 65 28  >xNext;.  while(
72b0: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 0a 20   SQLITE_OK==rc. 
72c0: 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f       && SQLITE_O
72d0: 4b 3d 3d 28 72 63 20 3d 20 78 4e 65 78 74 28 70  K==(rc = xNext(p
72e0: 43 73 72 2c 20 26 7a 54 6f 6b 65 6e 2c 20 26 6e  Csr, &zToken, &n
72f0: 54 6f 6b 65 6e 2c 20 26 69 53 74 61 72 74 2c 20  Token, &iStart, 
7300: 26 69 45 6e 64 2c 20 26 69 50 6f 73 29 29 0a 20  &iEnd, &iPos)). 
7310: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
7320: 20 20 20 69 66 28 20 69 50 6f 73 3e 3d 6e 57 6f     if( iPos>=nWo
7330: 72 64 20 29 20 6e 57 6f 72 64 20 3d 20 69 50 6f  rd ) nWord = iPo
7340: 73 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 73  s+1;..    /* Pos
7350: 69 74 69 6f 6e 73 20 63 61 6e 6e 6f 74 20 62 65  itions cannot be
7360: 20 6e 65 67 61 74 69 76 65 3b 20 77 65 20 75 73   negative; we us
7370: 65 20 2d 31 20 61 73 20 61 20 74 65 72 6d 69 6e  e -1 as a termin
7380: 61 74 6f 72 20 69 6e 74 65 72 6e 61 6c 6c 79 2e  ator internally.
7390: 0a 20 20 20 20 2a 2a 20 54 6f 6b 65 6e 73 20 6d  .    ** Tokens m
73a0: 75 73 74 20 68 61 76 65 20 61 20 6e 6f 6e 2d 7a  ust have a non-z
73b0: 65 72 6f 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20  ero length..    
73c0: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 6f 73 3c  */.    if( iPos<
73d0: 30 20 7c 7c 20 21 7a 54 6f 6b 65 6e 20 7c 7c 20  0 || !zToken || 
73e0: 6e 54 6f 6b 65 6e 3c 3d 30 20 29 7b 0a 20 20 20  nToken<=0 ){.   
73f0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
7400: 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
7410: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
7420: 20 41 64 64 20 74 68 65 20 74 65 72 6d 20 74 6f   Add the term to
7430: 20 74 68 65 20 74 65 72 6d 73 20 69 6e 64 65 78   the terms index
7440: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73   */.    rc = fts
7450: 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 41 64 64  3PendingTermsAdd
7460: 4f 6e 65 28 0a 20 20 20 20 20 20 20 20 70 2c 20  One(.        p, 
7470: 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 26 70 2d 3e  iCol, iPos, &p->
7480: 61 49 6e 64 65 78 5b 30 5d 2e 68 50 65 6e 64 69  aIndex[0].hPendi
7490: 6e 67 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  ng, zToken, nTok
74a0: 65 6e 0a 20 20 20 20 29 3b 0a 20 20 20 20 0a 20  en.    );.    . 
74b0: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 65     /* Add the te
74c0: 72 6d 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68  rm to each of th
74d0: 65 20 70 72 65 66 69 78 20 69 6e 64 65 78 65 73  e prefix indexes
74e0: 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
74f0: 74 6f 6f 20 0a 20 20 20 20 2a 2a 20 73 68 6f 72  too .    ** shor
7500: 74 20 66 6f 72 2e 20 2a 2f 0a 20 20 20 20 66 6f  t for. */.    fo
7510: 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=1; rc==SQLIT
7520: 45 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 49 6e  E_OK && i<p->nIn
7530: 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  dex; i++){.     
7540: 20 73 74 72 75 63 74 20 46 74 73 33 49 6e 64 65   struct Fts3Inde
7550: 78 20 2a 70 49 6e 64 65 78 20 3d 20 26 70 2d 3e  x *pIndex = &p->
7560: 61 49 6e 64 65 78 5b 69 5d 3b 0a 20 20 20 20 20  aIndex[i];.     
7570: 20 69 66 28 20 6e 54 6f 6b 65 6e 3c 70 49 6e 64   if( nToken<pInd
7580: 65 78 2d 3e 6e 50 72 65 66 69 78 20 29 20 63 6f  ex->nPrefix ) co
7590: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 72 63  ntinue;.      rc
75a0: 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65   = fts3PendingTe
75b0: 72 6d 73 41 64 64 4f 6e 65 28 0a 20 20 20 20 20  rmsAddOne(.     
75c0: 20 20 20 20 20 70 2c 20 69 43 6f 6c 2c 20 69 50       p, iCol, iP
75d0: 6f 73 2c 20 26 70 49 6e 64 65 78 2d 3e 68 50 65  os, &pIndex->hPe
75e0: 6e 64 69 6e 67 2c 20 7a 54 6f 6b 65 6e 2c 20 70  nding, zToken, p
75f0: 49 6e 64 65 78 2d 3e 6e 50 72 65 66 69 78 0a 20  Index->nPrefix. 
7600: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
7610: 7d 0a 0a 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43  }..  pModule->xC
7620: 6c 6f 73 65 28 70 43 73 72 29 3b 0a 20 20 2a 70  lose(pCsr);.  *p
7630: 6e 57 6f 72 64 20 3d 20 6e 57 6f 72 64 3b 0a 20  nWord = nWord;. 
7640: 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
7650: 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54  ITE_DONE ? SQLIT
7660: 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f  E_OK : rc);.}../
7670: 2a 20 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68  * .** Calling th
7680: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69  is function indi
7690: 63 61 74 65 73 20 74 68 61 74 20 73 75 62 73 65  cates that subse
76a0: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 0a  quent calls to .
76b0: 2a 2a 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65  ** fts3PendingTe
76c0: 72 6d 73 41 64 64 28 29 20 61 72 65 20 74 6f 20  rmsAdd() are to 
76d0: 61 64 64 20 74 65 72 6d 2f 70 6f 73 69 74 69 6f  add term/positio
76e0: 6e 2d 6c 69 73 74 20 70 61 69 72 73 20 66 6f 72  n-list pairs for
76f0: 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
7700: 20 6f 66 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   of the document
7710: 20 77 69 74 68 20 64 6f 63 69 64 20 69 44 6f 63   with docid iDoc
7720: 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  id..*/.static in
7730: 74 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72  t fts3PendingTer
7740: 6d 73 44 6f 63 69 64 28 0a 20 20 46 74 73 33 54  msDocid(.  Fts3T
7750: 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
7760: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
7770: 6c 6c 2d 74 65 78 74 20 74 61 62 6c 65 20 68 61  ll-text table ha
7780: 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ndle */.  int iL
7790: 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20 20  angid,          
77a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e            /* Lan
77b0: 67 75 61 67 65 20 69 64 20 6f 66 20 72 6f 77 20  guage id of row 
77c0: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f  being written */
77d0: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
77e0: 69 44 6f 63 69 64 20 20 20 20 20 20 20 20 20 20  iDocid          
77f0: 20 20 20 2f 2a 20 44 6f 63 69 64 20 6f 66 20 72     /* Docid of r
7800: 6f 77 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ow being written
7810: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
7820: 20 69 4c 61 6e 67 69 64 3e 3d 30 20 29 3b 0a 0a   iLangid>=0 );..
7830: 20 20 2f 2a 20 54 4f 44 4f 28 73 68 65 73 73 29    /* TODO(shess)
7840: 20 45 78 70 6c 6f 72 65 20 77 68 65 74 68 65 72   Explore whether
7850: 20 70 61 72 74 69 61 6c 6c 79 20 66 6c 75 73 68   partially flush
7860: 69 6e 67 20 74 68 65 20 62 75 66 66 65 72 20 6f  ing the buffer o
7870: 6e 0a 20 20 2a 2a 20 66 6f 72 63 65 64 2d 66 6c  n.  ** forced-fl
7880: 75 73 68 20 77 6f 75 6c 64 20 70 72 6f 76 69 64  ush would provid
7890: 65 20 62 65 74 74 65 72 20 70 65 72 66 6f 72 6d  e better perform
78a0: 61 6e 63 65 2e 20 20 49 20 73 75 73 70 65 63 74  ance.  I suspect
78b0: 20 74 68 61 74 20 69 66 0a 20 20 2a 2a 20 77 65   that if.  ** we
78c0: 20 6f 72 64 65 72 65 64 20 74 68 65 20 64 6f 63   ordered the doc
78d0: 6c 69 73 74 73 20 62 79 20 73 69 7a 65 20 61 6e  lists by size an
78e0: 64 20 66 6c 75 73 68 65 64 20 74 68 65 20 6c 61  d flushed the la
78f0: 72 67 65 73 74 20 75 6e 74 69 6c 20 74 68 65 0a  rgest until the.
7900: 20 20 2a 2a 20 62 75 66 66 65 72 20 77 61 73 20    ** buffer was 
7910: 68 61 6c 66 20 65 6d 70 74 79 2c 20 74 68 61 74  half empty, that
7920: 20 77 6f 75 6c 64 20 6c 65 74 20 74 68 65 20 6c   would let the l
7930: 65 73 73 20 66 72 65 71 75 65 6e 74 20 74 65 72  ess frequent ter
7940: 6d 73 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 65  ms.  ** generate
7950: 20 6c 6f 6e 67 65 72 20 64 6f 63 6c 69 73 74 73   longer doclists
7960: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44 6f  ..  */.  if( iDo
7970: 63 69 64 3c 3d 70 2d 3e 69 50 72 65 76 44 6f 63  cid<=p->iPrevDoc
7980: 69 64 20 0a 20 20 20 7c 7c 20 70 2d 3e 69 50 72  id .   || p->iPr
7990: 65 76 4c 61 6e 67 69 64 21 3d 69 4c 61 6e 67 69  evLangid!=iLangi
79a0: 64 0a 20 20 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64  d.   || p->nPend
79b0: 69 6e 67 44 61 74 61 3e 70 2d 3e 6e 4d 61 78 50  ingData>p->nMaxP
79c0: 65 6e 64 69 6e 67 44 61 74 61 20 0a 20 20 29 7b  endingData .  ){
79d0: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
79e0: 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67  lite3Fts3Pending
79f0: 54 65 72 6d 73 46 6c 75 73 68 28 70 29 3b 0a 20  TermsFlush(p);. 
7a00: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
7a10: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
7a20: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 50 72 65 76  ;.  }.  p->iPrev
7a30: 44 6f 63 69 64 20 3d 20 69 44 6f 63 69 64 3b 0a  Docid = iDocid;.
7a40: 20 20 70 2d 3e 69 50 72 65 76 4c 61 6e 67 69 64    p->iPrevLangid
7a50: 20 3d 20 69 4c 61 6e 67 69 64 3b 0a 20 20 72 65   = iLangid;.  re
7a60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7a70: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64  }../*.** Discard
7a80: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
7a90: 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72   the pending-ter
7aa0: 6d 73 20 68 61 73 68 20 74 61 62 6c 65 73 2e 20  ms hash tables. 
7ab0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7ac0: 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73  Fts3PendingTerms
7ad0: 43 6c 65 61 72 28 46 74 73 33 54 61 62 6c 65 20  Clear(Fts3Table 
7ae0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
7af0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49  for(i=0; i<p->nI
7b00: 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ndex; i++){.    
7b10: 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 70 45  Fts3HashElem *pE
7b20: 6c 65 6d 3b 0a 20 20 20 20 46 74 73 33 48 61 73  lem;.    Fts3Has
7b30: 68 20 2a 70 48 61 73 68 20 3d 20 26 70 2d 3e 61  h *pHash = &p->a
7b40: 49 6e 64 65 78 5b 69 5d 2e 68 50 65 6e 64 69 6e  Index[i].hPendin
7b50: 67 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d  g;.    for(pElem
7b60: 3d 66 74 73 33 48 61 73 68 46 69 72 73 74 28 70  =fts3HashFirst(p
7b70: 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
7b80: 6c 65 6d 3d 66 74 73 33 48 61 73 68 4e 65 78 74  lem=fts3HashNext
7b90: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20  (pElem)){.      
7ba0: 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70 4c 69  PendingList *pLi
7bb0: 73 74 20 3d 20 28 50 65 6e 64 69 6e 67 4c 69 73  st = (PendingLis
7bc0: 74 20 2a 29 66 74 73 33 48 61 73 68 44 61 74 61  t *)fts3HashData
7bd0: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 66  (pElem);.      f
7be0: 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 44 65  ts3PendingListDe
7bf0: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
7c00: 20 7d 0a 20 20 20 20 66 74 73 33 48 61 73 68 43   }.    fts3HashC
7c10: 6c 65 61 72 28 70 48 61 73 68 29 3b 0a 20 20 7d  lear(pHash);.  }
7c20: 0a 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61  .  p->nPendingDa
7c30: 74 61 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ta = 0;.}../*.**
7c40: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
7c50: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
7c60: 78 55 70 64 61 74 65 28 29 20 6d 65 74 68 6f 64  xUpdate() method
7c70: 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 49   as part of an I
7c80: 4e 53 45 52 54 0a 2a 2a 20 6f 70 65 72 61 74 69  NSERT.** operati
7c90: 6f 6e 2e 20 49 74 20 61 64 64 73 20 65 6e 74 72  on. It adds entr
7ca0: 69 65 73 20 66 6f 72 20 65 61 63 68 20 74 65 72  ies for each ter
7cb0: 6d 20 69 6e 20 74 68 65 20 6e 65 77 20 72 65 63  m in the new rec
7cc0: 6f 72 64 20 74 6f 20 74 68 65 0a 2a 2a 20 70 65  ord to the.** pe
7cd0: 6e 64 69 6e 67 54 65 72 6d 73 20 68 61 73 68 20  ndingTerms hash 
7ce0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  table..**.** Arg
7cf0: 75 6d 65 6e 74 20 61 70 56 61 6c 20 69 73 20 74  ument apVal is t
7d00: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 73  he same as the s
7d10: 69 6d 69 6c 61 72 6c 79 20 6e 61 6d 65 64 20 61  imilarly named a
7d20: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
7d30: 6f 0a 2a 2a 20 66 74 73 33 49 6e 73 65 72 74 44  o.** fts3InsertD
7d40: 61 74 61 28 29 2e 20 50 61 72 61 6d 65 74 65 72  ata(). Parameter
7d50: 20 69 44 6f 63 69 64 20 69 73 20 74 68 65 20 64   iDocid is the d
7d60: 6f 63 69 64 20 6f 66 20 74 68 65 20 6e 65 77 20  ocid of the new 
7d70: 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  row..*/.static i
7d80: 6e 74 20 66 74 73 33 49 6e 73 65 72 74 54 65 72  nt fts3InsertTer
7d90: 6d 73 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  ms(.  Fts3Table 
7da0: 2a 70 2c 20 0a 20 20 69 6e 74 20 69 4c 61 6e 67  *p, .  int iLang
7db0: 69 64 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76  id, .  sqlite3_v
7dc0: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20 0a 20  alue **apVal, . 
7dd0: 20 75 33 32 20 2a 61 53 7a 0a 29 7b 0a 20 20 69   u32 *aSz.){.  i
7de0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
7df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7e00: 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
7e10: 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 32  ble */.  for(i=2
7e20: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32  ; i<p->nColumn+2
7e30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
7e40: 74 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d 20  t char *zText = 
7e50: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
7e60: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
7e70: 28 61 70 56 61 6c 5b 69 5d 29 3b 0a 20 20 20 20  (apVal[i]);.    
7e80: 69 6e 74 20 72 63 20 3d 20 66 74 73 33 50 65 6e  int rc = fts3Pen
7e90: 64 69 6e 67 54 65 72 6d 73 41 64 64 28 70 2c 20  dingTermsAdd(p, 
7ea0: 69 4c 61 6e 67 69 64 2c 20 7a 54 65 78 74 2c 20  iLangid, zText, 
7eb0: 69 2d 32 2c 20 26 61 53 7a 5b 69 2d 32 5d 29 3b  i-2, &aSz[i-2]);
7ec0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
7ed0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7ee0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
7ef0: 0a 20 20 20 20 61 53 7a 5b 70 2d 3e 6e 43 6f 6c  .    aSz[p->nCol
7f00: 75 6d 6e 5d 20 2b 3d 20 73 71 6c 69 74 65 33 5f  umn] += sqlite3_
7f10: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 70 56 61  value_bytes(apVa
7f20: 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74  l[i]);.  }.  ret
7f30: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7f40: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
7f50: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
7f60: 62 79 20 74 68 65 20 78 55 70 64 61 74 65 28 29  by the xUpdate()
7f70: 20 6d 65 74 68 6f 64 20 66 6f 72 20 61 6e 20 49   method for an I
7f80: 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 2e  NSERT operation.
7f90: 0a 2a 2a 20 54 68 65 20 61 70 56 61 6c 20 70 61  .** The apVal pa
7fa0: 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65  rameter is passe
7fb0: 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  d a copy of the 
7fc0: 61 70 56 61 6c 20 61 72 67 75 6d 65 6e 74 20 70  apVal argument p
7fd0: 61 73 73 65 64 20 62 79 0a 2a 2a 20 53 51 4c 69  assed by.** SQLi
7fe0: 74 65 20 74 6f 20 74 68 65 20 78 55 70 64 61 74  te to the xUpdat
7ff0: 65 28 29 20 6d 65 74 68 6f 64 2e 20 69 2e 65 3a  e() method. i.e:
8000: 0a 2a 2a 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 30  .**.**   apVal[0
8010: 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ]               
8020: 20 4e 6f 74 20 75 73 65 64 20 66 6f 72 20 49 4e   Not used for IN
8030: 53 45 52 54 2e 0a 2a 2a 20 20 20 61 70 56 61 6c  SERT..**   apVal
8040: 5b 31 5d 20 20 20 20 20 20 20 20 20 20 20 20 20  [1]             
8050: 20 20 20 72 6f 77 69 64 0a 2a 2a 20 20 20 61 70     rowid.**   ap
8060: 56 61 6c 5b 32 5d 20 20 20 20 20 20 20 20 20 20  Val[2]          
8070: 20 20 20 20 20 20 4c 65 66 74 2d 6d 6f 73 74 20        Left-most 
8080: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c  user-defined col
8090: 75 6d 6e 0a 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a 20  umn.**   ....** 
80a0: 20 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75    apVal[p->nColu
80b0: 6d 6e 2b 31 5d 20 20 20 20 20 52 69 67 68 74 2d  mn+1]     Right-
80c0: 6d 6f 73 74 20 75 73 65 72 2d 64 65 66 69 6e 65  most user-define
80d0: 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 61 70  d column.**   ap
80e0: 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32  Val[p->nColumn+2
80f0: 5d 20 20 20 20 20 48 69 64 64 65 6e 20 63 6f 6c  ]     Hidden col
8100: 75 6d 6e 20 77 69 74 68 20 73 61 6d 65 20 6e 61  umn with same na
8110: 6d 65 20 61 73 20 74 61 62 6c 65 0a 2a 2a 20 20  me as table.**  
8120: 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d   apVal[p->nColum
8130: 6e 2b 33 5d 20 20 20 20 20 48 69 64 64 65 6e 20  n+3]     Hidden 
8140: 22 64 6f 63 69 64 22 20 63 6f 6c 75 6d 6e 20 28  "docid" column (
8150: 61 6c 69 61 73 20 66 6f 72 20 72 6f 77 69 64 29  alias for rowid)
8160: 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 70 2d 3e 6e  .**   apVal[p->n
8170: 43 6f 6c 75 6d 6e 2b 34 5d 20 20 20 20 20 48 69  Column+4]     Hi
8180: 64 64 65 6e 20 6c 61 6e 67 75 61 67 65 69 64 20  dden languageid 
8190: 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63  column.*/.static
81a0: 20 69 6e 74 20 66 74 73 33 49 6e 73 65 72 74 44   int fts3InsertD
81b0: 61 74 61 28 0a 20 20 46 74 73 33 54 61 62 6c 65  ata(.  Fts3Table
81c0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
81d0: 20 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 2d 74         /* Full-t
81e0: 65 78 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  ext table */.  s
81f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
8200: 70 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  pVal,          /
8210: 2a 20 41 72 72 61 79 20 6f 66 20 76 61 6c 75 65  * Array of value
8220: 73 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20  s to insert */. 
8230: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
8240: 70 69 44 6f 63 69 64 20 20 20 20 20 20 20 20 20  piDocid         
8250: 20 2f 2a 20 4f 55 54 3a 20 44 6f 63 69 64 20 66   /* OUT: Docid f
8260: 6f 72 20 72 6f 77 20 6a 75 73 74 20 69 6e 73 65  or row just inse
8270: 72 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  rted */.){.  int
8280: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
8290: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
82a0: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
82b0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
82c0: 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 3b 20 20  ContentInsert;  
82d0: 20 2f 2a 20 49 4e 53 45 52 54 20 49 4e 54 4f 20   /* INSERT INTO 
82e0: 25 5f 63 6f 6e 74 65 6e 74 20 56 41 4c 55 45 53  %_content VALUES
82f0: 28 2e 2e 2e 29 20 2a 2f 0a 0a 20 20 69 66 28 20  (...) */..  if( 
8300: 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 20 29  p->zContentTbl )
8310: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61  {.    sqlite3_va
8320: 6c 75 65 20 2a 70 52 6f 77 69 64 20 3d 20 61 70  lue *pRowid = ap
8330: 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 33  Val[p->nColumn+3
8340: 5d 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ];.    if( sqlit
8350: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 52  e3_value_type(pR
8360: 6f 77 69 64 29 3d 3d 53 51 4c 49 54 45 5f 4e 55  owid)==SQLITE_NU
8370: 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 77  LL ){.      pRow
8380: 69 64 20 3d 20 61 70 56 61 6c 5b 31 5d 3b 0a 20  id = apVal[1];. 
8390: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
83a0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
83b0: 70 52 6f 77 69 64 29 21 3d 53 51 4c 49 54 45 5f  pRowid)!=SQLITE_
83c0: 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20  INTEGER ){.     
83d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
83e0: 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d  ONSTRAINT;.    }
83f0: 0a 20 20 20 20 2a 70 69 44 6f 63 69 64 20 3d 20  .    *piDocid = 
8400: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
8410: 74 36 34 28 70 52 6f 77 69 64 29 3b 0a 20 20 20  t64(pRowid);.   
8420: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8430: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  K;.  }..  /* Loc
8440: 61 74 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ate the statemen
8450: 74 20 68 61 6e 64 6c 65 20 75 73 65 64 20 74 6f  t handle used to
8460: 20 69 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74   insert data int
8470: 6f 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 0a  o the %_content.
8480: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20    ** table. The 
8490: 53 51 4c 20 66 6f 72 20 74 68 69 73 20 73 74 61  SQL for this sta
84a0: 74 65 6d 65 6e 74 20 69 73 3a 0a 20 20 2a 2a 0a  tement is:.  **.
84b0: 20 20 2a 2a 20 20 20 49 4e 53 45 52 54 20 49 4e    **   INSERT IN
84c0: 54 4f 20 25 5f 63 6f 6e 74 65 6e 74 20 56 41 4c  TO %_content VAL
84d0: 55 45 53 28 3f 2c 20 3f 2c 20 3f 2c 20 2e 2e 2e  UES(?, ?, ?, ...
84e0: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ).  **.  ** The 
84f0: 73 74 61 74 65 6d 65 6e 74 20 66 65 61 74 75 72  statement featur
8500: 65 73 20 4e 20 27 3f 27 20 76 61 72 69 61 62 6c  es N '?' variabl
8510: 65 73 2c 20 77 68 65 72 65 20 4e 20 69 73 20 74  es, where N is t
8520: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 65  he number of use
8530: 72 0a 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 63  r.  ** defined c
8540: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 46 54  olumns in the FT
8550: 53 33 20 74 61 62 6c 65 2c 20 70 6c 75 73 20 6f  S3 table, plus o
8560: 6e 65 20 66 6f 72 20 74 68 65 20 64 6f 63 69 64  ne for the docid
8570: 20 66 69 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72   field..  */.  r
8580: 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
8590: 70 2c 20 53 51 4c 5f 43 4f 4e 54 45 4e 54 5f 49  p, SQL_CONTENT_I
85a0: 4e 53 45 52 54 2c 20 26 70 43 6f 6e 74 65 6e 74  NSERT, &pContent
85b0: 49 6e 73 65 72 74 2c 20 26 61 70 56 61 6c 5b 31  Insert, &apVal[1
85c0: 5d 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ]);.  if( rc==SQ
85d0: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 7a 4c  LITE_OK && p->zL
85e0: 61 6e 67 75 61 67 65 69 64 20 29 7b 0a 20 20 20  anguageid ){.   
85f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
8600: 6e 64 5f 69 6e 74 28 0a 20 20 20 20 20 20 20 20  nd_int(.        
8610: 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 2c 20  pContentInsert, 
8620: 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 2c 20 0a 20  p->nColumn+2, . 
8630: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76         sqlite3_v
8640: 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 70  alue_int(apVal[p
8650: 2d 3e 6e 43 6f 6c 75 6d 6e 2b 34 5d 29 0a 20 20  ->nColumn+4]).  
8660: 20 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72    );.  }.  if( r
8670: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
8680: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
8690: 54 68 65 72 65 20 69 73 20 61 20 71 75 69 72 6b  There is a quirk
86a0: 20 68 65 72 65 2e 20 54 68 65 20 75 73 65 72 73   here. The users
86b0: 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
86c0: 74 20 6d 61 79 20 68 61 76 65 20 73 70 65 63 69  t may have speci
86d0: 66 69 65 64 0a 20 20 2a 2a 20 61 20 76 61 6c 75  fied.  ** a valu
86e0: 65 20 66 6f 72 20 74 68 65 20 22 72 6f 77 69 64  e for the "rowid
86f0: 22 20 66 69 65 6c 64 2c 20 66 6f 72 20 74 68 65  " field, for the
8700: 20 22 64 6f 63 69 64 22 20 66 69 65 6c 64 2c 20   "docid" field, 
8710: 6f 72 20 66 6f 72 20 62 6f 74 68 2e 0a 20 20 2a  or for both..  *
8720: 2a 20 57 68 69 63 68 20 69 73 20 61 20 70 72 6f  * Which is a pro
8730: 62 6c 65 6d 2c 20 73 69 6e 63 65 20 22 72 6f 77  blem, since "row
8740: 69 64 22 20 61 6e 64 20 22 64 6f 63 69 64 22 20  id" and "docid" 
8750: 61 72 65 20 61 6c 69 61 73 65 73 20 66 6f 72 20  are aliases for 
8760: 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 76 61  the.  ** same va
8770: 6c 75 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  lue. For example
8780: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 49 4e  :.  **.  **   IN
8790: 53 45 52 54 20 49 4e 54 4f 20 66 74 73 33 74 62  SERT INTO fts3tb
87a0: 6c 28 72 6f 77 69 64 2c 20 64 6f 63 69 64 29 20  l(rowid, docid) 
87b0: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
87c0: 2a 2a 0a 20 20 2a 2a 20 49 6e 20 46 54 53 33 2c  **.  ** In FTS3,
87d0: 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f   this is an erro
87e0: 72 2e 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f  r. It is an erro
87f0: 72 20 74 6f 20 73 70 65 63 69 66 79 20 6e 6f 6e  r to specify non
8800: 2d 4e 55 4c 4c 20 76 61 6c 75 65 73 0a 20 20 2a  -NULL values.  *
8810: 2a 20 66 6f 72 20 62 6f 74 68 20 64 6f 63 69 64  * for both docid
8820: 20 61 6e 64 20 73 6f 6d 65 20 6f 74 68 65 72 20   and some other 
8830: 72 6f 77 69 64 20 61 6c 69 61 73 2e 0a 20 20 2a  rowid alias..  *
8840: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e  /.  if( SQLITE_N
8850: 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c  ULL!=sqlite3_val
8860: 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 33 2b  ue_type(apVal[3+
8870: 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 29 20 29 7b 0a  p->nColumn]) ){.
8880: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e      if( SQLITE_N
8890: 55 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c  ULL==sqlite3_val
88a0: 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 30 5d  ue_type(apVal[0]
88b0: 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54 45  ).     && SQLITE
88c0: 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76  _NULL!=sqlite3_v
88d0: 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b  alue_type(apVal[
88e0: 31 5d 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  1]).    ){.     
88f0: 20 2f 2a 20 41 20 72 6f 77 69 64 2f 64 6f 63 69   /* A rowid/doci
8900: 64 20 63 6f 6e 66 6c 69 63 74 2e 20 2a 2f 0a 20  d conflict. */. 
8910: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8920: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
8930: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8940: 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 43 6f 6e  _bind_value(pCon
8950: 74 65 6e 74 49 6e 73 65 72 74 2c 20 31 2c 20 61  tentInsert, 1, a
8960: 70 56 61 6c 5b 33 2b 70 2d 3e 6e 43 6f 6c 75 6d  pVal[3+p->nColum
8970: 6e 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  n]);.    if( rc!
8980: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
8990: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
89a0: 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 73 74  * Execute the st
89b0: 61 74 65 6d 65 6e 74 20 74 6f 20 69 6e 73 65 72  atement to inser
89c0: 74 20 74 68 65 20 72 65 63 6f 72 64 2e 20 53 65  t the record. Se
89d0: 74 20 2a 70 69 44 6f 63 69 64 20 74 6f 20 74 68  t *piDocid to th
89e0: 65 20 0a 20 20 2a 2a 20 6e 65 77 20 64 6f 63 69  e .  ** new doci
89f0: 64 20 76 61 6c 75 65 2e 20 0a 20 20 2a 2f 0a 20  d value. .  */. 
8a00: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43   sqlite3_step(pC
8a10: 6f 6e 74 65 6e 74 49 6e 73 65 72 74 29 3b 0a 20  ontentInsert);. 
8a20: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
8a30: 73 65 74 28 70 43 6f 6e 74 65 6e 74 49 6e 73 65  set(pContentInse
8a40: 72 74 29 3b 0a 0a 20 20 2a 70 69 44 6f 63 69 64  rt);..  *piDocid
8a50: 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f   = sqlite3_last_
8a60: 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 70 2d 3e  insert_rowid(p->
8a70: 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  db);.  return rc
8a80: 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  ;.}..../*.** Rem
8a90: 6f 76 65 20 61 6c 6c 20 64 61 74 61 20 66 72 6f  ove all data fro
8aa0: 6d 20 74 68 65 20 46 54 53 33 20 74 61 62 6c 65  m the FTS3 table
8ab0: 2e 20 43 6c 65 61 72 20 74 68 65 20 68 61 73 68  . Clear the hash
8ac0: 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
8ad0: 67 0a 2a 2a 20 70 65 6e 64 69 6e 67 20 74 65 72  g.** pending ter
8ae0: 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ms..*/.static in
8af0: 74 20 66 74 73 33 44 65 6c 65 74 65 41 6c 6c 28  t fts3DeleteAll(
8b00: 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 69 6e  Fts3Table *p, in
8b10: 74 20 62 43 6f 6e 74 65 6e 74 29 7b 0a 20 20 69  t bContent){.  i
8b20: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
8b30: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
8b40: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
8b50: 0a 0a 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74  ..  /* Discard t
8b60: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
8b70: 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73  he pending-terms
8b80: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f 0a   hash table. */.
8b90: 20 20 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e    sqlite3Fts3Pen
8ba0: 64 69 6e 67 54 65 72 6d 73 43 6c 65 61 72 28 70  dingTermsClear(p
8bb0: 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  );..  /* Delete 
8bc0: 65 76 65 72 79 74 68 69 6e 67 20 66 72 6f 6d 20  everything from 
8bd0: 74 68 65 20 73 68 61 64 6f 77 20 74 61 62 6c 65  the shadow table
8be0: 73 2e 20 45 78 63 65 70 74 2c 20 6c 65 61 76 65  s. Except, leave
8bf0: 20 25 5f 63 6f 6e 74 65 6e 74 20 61 73 0a 20 20   %_content as.  
8c00: 2a 2a 20 69 73 20 69 66 20 62 43 6f 6e 74 65 6e  ** is if bConten
8c10: 74 20 69 73 20 66 61 6c 73 65 2e 20 20 2a 2f 0a  t is false.  */.
8c20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 43 6f    assert( p->zCo
8c30: 6e 74 65 6e 74 54 62 6c 3d 3d 30 20 7c 7c 20 62  ntentTbl==0 || b
8c40: 43 6f 6e 74 65 6e 74 3d 3d 30 20 29 3b 0a 20 20  Content==0 );.  
8c50: 69 66 28 20 62 43 6f 6e 74 65 6e 74 20 29 20 66  if( bContent ) f
8c60: 74 73 33 53 71 6c 45 78 65 63 28 26 72 63 2c 20  ts3SqlExec(&rc, 
8c70: 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c  p, SQL_DELETE_AL
8c80: 4c 5f 43 4f 4e 54 45 4e 54 2c 20 30 29 3b 0a 20  L_CONTENT, 0);. 
8c90: 20 66 74 73 33 53 71 6c 45 78 65 63 28 26 72 63   fts3SqlExec(&rc
8ca0: 2c 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f  , p, SQL_DELETE_
8cb0: 41 4c 4c 5f 53 45 47 4d 45 4e 54 53 2c 20 30 29  ALL_SEGMENTS, 0)
8cc0: 3b 0a 20 20 66 74 73 33 53 71 6c 45 78 65 63 28  ;.  fts3SqlExec(
8cd0: 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c 45  &rc, p, SQL_DELE
8ce0: 54 45 5f 41 4c 4c 5f 53 45 47 44 49 52 2c 20 30  TE_ALL_SEGDIR, 0
8cf0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 62 48 61 73  );.  if( p->bHas
8d00: 44 6f 63 73 69 7a 65 20 29 7b 0a 20 20 20 20 66  Docsize ){.    f
8d10: 74 73 33 53 71 6c 45 78 65 63 28 26 72 63 2c 20  ts3SqlExec(&rc, 
8d20: 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c  p, SQL_DELETE_AL
8d30: 4c 5f 44 4f 43 53 49 5a 45 2c 20 30 29 3b 0a 20  L_DOCSIZE, 0);. 
8d40: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 62 48 61 73   }.  if( p->bHas
8d50: 53 74 61 74 20 29 7b 0a 20 20 20 20 66 74 73 33  Stat ){.    fts3
8d60: 53 71 6c 45 78 65 63 28 26 72 63 2c 20 70 2c 20  SqlExec(&rc, p, 
8d70: 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 53  SQL_DELETE_ALL_S
8d80: 54 41 54 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  TAT, 0);.  }.  r
8d90: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
8da0: 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
8db0: 20 6c 61 6e 67 69 64 46 72 6f 6d 53 65 6c 65 63   langidFromSelec
8dc0: 74 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20  t(Fts3Table *p, 
8dd0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
8de0: 65 6c 65 63 74 29 7b 0a 20 20 69 6e 74 20 69 4c  elect){.  int iL
8df0: 61 6e 67 69 64 20 3d 20 30 3b 0a 20 20 69 66 28  angid = 0;.  if(
8e00: 20 70 2d 3e 7a 4c 61 6e 67 75 61 67 65 69 64 20   p->zLanguageid 
8e10: 29 20 69 4c 61 6e 67 69 64 20 3d 20 73 71 6c 69  ) iLangid = sqli
8e20: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
8e30: 53 65 6c 65 63 74 2c 20 70 2d 3e 6e 43 6f 6c 75  Select, p->nColu
8e40: 6d 6e 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  mn+1);.  return 
8e50: 69 4c 61 6e 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  iLangid;.}../*.*
8e60: 2a 20 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d  * The first elem
8e70: 65 6e 74 20 69 6e 20 74 68 65 20 61 70 56 61 6c  ent in the apVal
8e80: 5b 5d 20 61 72 72 61 79 20 69 73 20 61 73 73 75  [] array is assu
8e90: 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  med to contain t
8ea0: 68 65 20 64 6f 63 69 64 0a 2a 2a 20 28 61 6e 20  he docid.** (an 
8eb0: 69 6e 74 65 67 65 72 29 20 6f 66 20 61 20 72 6f  integer) of a ro
8ec0: 77 20 61 62 6f 75 74 20 74 6f 20 62 65 20 64 65  w about to be de
8ed0: 6c 65 74 65 64 2e 20 52 65 6d 6f 76 65 20 61 6c  leted. Remove al
8ee0: 6c 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  l terms from the
8ef0: 0a 2a 2a 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e  .** full-text in
8f00: 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
8f10: 6f 69 64 20 66 74 73 33 44 65 6c 65 74 65 54 65  oid fts3DeleteTe
8f20: 72 6d 73 28 20 0a 20 20 69 6e 74 20 2a 70 52 43  rms( .  int *pRC
8f30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8f40: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
8f50: 2f 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  /.  Fts3Table *p
8f60: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
8f70: 68 65 20 46 54 53 20 74 61 62 6c 65 20 74 6f 20  he FTS table to 
8f80: 64 65 6c 65 74 65 20 66 72 6f 6d 20 2a 2f 0a 20  delete from */. 
8f90: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
8fa0: 70 52 6f 77 69 64 2c 20 20 2f 2a 20 54 68 65 20  pRowid,  /* The 
8fb0: 64 6f 63 69 64 20 74 6f 20 62 65 20 64 65 6c 65  docid to be dele
8fc0: 74 65 64 20 2a 2f 0a 20 20 75 33 32 20 2a 61 53  ted */.  u32 *aS
8fd0: 7a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z               
8fe0: 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 64 65 6c   /* Sizes of del
8ff0: 65 74 65 64 20 64 6f 63 75 6d 65 6e 74 20 77 72  eted document wr
9000: 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b  itten here */.){
9010: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
9020: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65  ite3_stmt *pSele
9030: 63 74 3b 0a 0a 20 20 69 66 28 20 2a 70 52 43 20  ct;..  if( *pRC 
9040: 29 20 72 65 74 75 72 6e 3b 0a 20 20 72 63 20 3d  ) return;.  rc =
9050: 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
9060: 53 51 4c 5f 53 45 4c 45 43 54 5f 43 4f 4e 54 45  SQL_SELECT_CONTE
9070: 4e 54 5f 42 59 5f 52 4f 57 49 44 2c 20 26 70 53  NT_BY_ROWID, &pS
9080: 65 6c 65 63 74 2c 20 26 70 52 6f 77 69 64 29 3b  elect, &pRowid);
9090: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
90a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
90b0: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
90c0: 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74  te3_step(pSelect
90d0: 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
90e0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 61 6e  ;.      int iLan
90f0: 67 69 64 20 3d 20 6c 61 6e 67 69 64 46 72 6f 6d  gid = langidFrom
9100: 53 65 6c 65 63 74 28 70 2c 20 70 53 65 6c 65 63  Select(p, pSelec
9110: 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  t);.      rc = f
9120: 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 44  ts3PendingTermsD
9130: 6f 63 69 64 28 70 2c 20 69 4c 61 6e 67 69 64 2c  ocid(p, iLangid,
9140: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
9150: 69 6e 74 36 34 28 70 53 65 6c 65 63 74 2c 20 30  int64(pSelect, 0
9160: 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ));.      for(i=
9170: 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1; rc==SQLITE_OK
9180: 20 26 26 20 69 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d   && i<=p->nColum
9190: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
91a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
91b0: 78 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  xt = (const char
91c0: 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   *)sqlite3_colum
91d0: 6e 5f 74 65 78 74 28 70 53 65 6c 65 63 74 2c 20  n_text(pSelect, 
91e0: 69 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  i);.        rc =
91f0: 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d   fts3PendingTerm
9200: 73 41 64 64 28 70 2c 20 69 4c 61 6e 67 69 64 2c  sAdd(p, iLangid,
9210: 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26 61 53 7a   zText, -1, &aSz
9220: 5b 69 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  [i-1]);.        
9230: 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20  aSz[p->nColumn] 
9240: 2b 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  += sqlite3_colum
9250: 6e 5f 62 79 74 65 73 28 70 53 65 6c 65 63 74 2c  n_bytes(pSelect,
9260: 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   i);.      }.   
9270: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
9280: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
9290: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
92a0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
92b0: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20  *pRC = rc;.     
92c0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
92d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20   }.    }.    rc 
92e0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
92f0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 65 6c 73  pSelect);.  }els
9300: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  e{.    sqlite3_r
9310: 65 73 65 74 28 70 53 65 6c 65 63 74 29 3b 0a 20  eset(pSelect);. 
9320: 20 7d 0a 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a   }.  *pRC = rc;.
9330: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64  }../*.** Forward
9340: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 6f 20   declaration to 
9350: 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20  account for the 
9360: 63 69 72 63 75 6c 61 72 20 64 65 70 65 6e 64 65  circular depende
9370: 6e 63 79 20 62 65 74 77 65 65 6e 0a 2a 2a 20 66  ncy between.** f
9380: 75 6e 63 74 69 6f 6e 73 20 66 74 73 33 53 65 67  unctions fts3Seg
9390: 6d 65 6e 74 4d 65 72 67 65 28 29 20 61 6e 64 20  mentMerge() and 
93a0: 66 74 73 33 41 6c 6c 6f 63 61 74 65 53 65 67 64  fts3AllocateSegd
93b0: 69 72 49 64 78 28 29 2e 0a 2a 2f 0a 73 74 61 74  irIdx()..*/.stat
93c0: 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 6d 65  ic int fts3Segme
93d0: 6e 74 4d 65 72 67 65 28 46 74 73 33 54 61 62 6c  ntMerge(Fts3Tabl
93e0: 65 20 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69  e *, int, int, i
93f0: 6e 74 29 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  nt);../* .** Thi
9400: 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  s function alloc
9410: 61 74 65 73 20 61 20 6e 65 77 20 6c 65 76 65 6c  ates a new level
9420: 20 69 4c 65 76 65 6c 20 69 6e 64 65 78 20 69 6e   iLevel index in
9430: 20 74 68 65 20 73 65 67 64 69 72 20 74 61 62 6c   the segdir tabl
9440: 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 69  e..** Usually, i
9450: 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6c 6f 63  ndexes are alloc
9460: 61 74 65 64 20 77 69 74 68 69 6e 20 61 20 6c 65  ated within a le
9470: 76 65 6c 20 73 65 71 75 65 6e 74 69 61 6c 6c 79  vel sequentially
9480: 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 77 69 74   starting.** wit
9490: 68 20 30 2c 20 73 6f 20 74 68 65 20 61 6c 6c 6f  h 0, so the allo
94a0: 63 61 74 65 64 20 69 6e 64 65 78 20 69 73 20 6f  cated index is o
94b0: 6e 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ne greater than 
94c0: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
94d0: 65 64 0a 2a 2a 20 62 79 3a 0a 2a 2a 0a 2a 2a 20  ed.** by:.**.** 
94e0: 20 20 53 45 4c 45 43 54 20 6d 61 78 28 69 64 78    SELECT max(idx
94f0: 29 20 46 52 4f 4d 20 25 5f 73 65 67 64 69 72 20  ) FROM %_segdir 
9500: 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3a 69  WHERE level = :i
9510: 4c 65 76 65 6c 0a 2a 2a 0a 2a 2a 20 48 6f 77 65  Level.**.** Howe
9520: 76 65 72 2c 20 69 66 20 74 68 65 72 65 20 61 72  ver, if there ar
9530: 65 20 61 6c 72 65 61 64 79 20 46 54 53 33 5f 4d  e already FTS3_M
9540: 45 52 47 45 5f 43 4f 55 4e 54 20 69 6e 64 65 78  ERGE_COUNT index
9550: 65 73 20 61 74 20 74 68 65 20 72 65 71 75 65 73  es at the reques
9560: 74 65 64 0a 2a 2a 20 6c 65 76 65 6c 2c 20 74 68  ted.** level, th
9570: 65 79 20 61 72 65 20 6d 65 72 67 65 64 20 69 6e  ey are merged in
9580: 74 6f 20 61 20 73 69 6e 67 6c 65 20 6c 65 76 65  to a single leve
9590: 6c 20 28 69 4c 65 76 65 6c 2b 31 29 20 73 65 67  l (iLevel+1) seg
95a0: 6d 65 6e 74 20 61 6e 64 20 74 68 65 20 0a 2a 2a  ment and the .**
95b0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78   allocated index
95c0: 20 69 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   is 0..**.** If 
95d0: 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 69 49  successful, *piI
95e0: 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  dx is set to the
95f0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78   allocated index
9600: 20 73 6c 6f 74 20 61 6e 64 20 53 51 4c 49 54 45   slot and SQLITE
9610: 5f 4f 4b 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  _OK.** returned.
9620: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53   Otherwise, an S
9630: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
9640: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
9650: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
9660: 41 6c 6c 6f 63 61 74 65 53 65 67 64 69 72 49 64  AllocateSegdirId
9670: 78 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  x(.  Fts3Table *
9680: 70 2c 20 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69  p, .  int iLangi
9690: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
96a0: 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67        /* Languag
96b0: 65 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49  e id */.  int iI
96c0: 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
96d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
96e0: 65 78 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65 78  ex for p->aIndex
96f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c   */.  int iLevel
9700: 2c 20 0a 20 20 69 6e 74 20 2a 70 69 49 64 78 0a  , .  int *piIdx.
9710: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
9720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9730: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
9740: 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
9750: 5f 73 74 6d 74 20 2a 70 4e 65 78 74 49 64 78 3b  _stmt *pNextIdx;
9760: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72           /* Quer
9770: 79 20 66 6f 72 20 6e 65 78 74 20 69 64 78 20 61  y for next idx a
9780: 74 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 2a  t level iLevel *
9790: 2f 0a 20 20 69 6e 74 20 69 4e 65 78 74 20 3d 20  /.  int iNext = 
97a0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
97b0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
97c0: 20 71 75 65 72 79 20 70 4e 65 78 74 49 64 78 20   query pNextIdx 
97d0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c  */..  assert( iL
97e0: 61 6e 67 69 64 3e 3d 30 20 29 3b 0a 20 20 61 73  angid>=0 );.  as
97f0: 73 65 72 74 28 20 70 2d 3e 6e 49 6e 64 65 78 3e  sert( p->nIndex>
9800: 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  =1 );..  /* Set 
9810: 76 61 72 69 61 62 6c 65 20 69 4e 65 78 74 20 74  variable iNext t
9820: 6f 20 74 68 65 20 6e 65 78 74 20 61 76 61 69 6c  o the next avail
9830: 61 62 6c 65 20 73 65 67 64 69 72 20 69 6e 64 65  able segdir inde
9840: 78 20 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65  x at level iLeve
9850: 6c 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73  l. */.  rc = fts
9860: 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
9870: 4e 45 58 54 5f 53 45 47 4d 45 4e 54 5f 49 4e 44  NEXT_SEGMENT_IND
9880: 45 58 2c 20 26 70 4e 65 78 74 49 64 78 2c 20 30  EX, &pNextIdx, 0
9890: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
98a0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
98b0: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
98c0: 28 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74 49  (.        pNextI
98d0: 64 78 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c 75  dx, 1, getAbsolu
98e0: 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67  teLevel(p, iLang
98f0: 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65 76  id, iIndex, iLev
9900: 65 6c 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  el).    );.    i
9910: 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
9920: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 4e 65 78  qlite3_step(pNex
9930: 74 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 69  tIdx) ){.      i
9940: 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 5f 63  Next = sqlite3_c
9950: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 4e 65 78 74 49  olumn_int(pNextI
9960: 64 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  dx, 0);.    }.  
9970: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
9980: 65 73 65 74 28 70 4e 65 78 74 49 64 78 29 3b 0a  eset(pNextIdx);.
9990: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
99a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
99b0: 2f 2a 20 49 66 20 69 4e 65 78 74 20 69 73 20 46  /* If iNext is F
99c0: 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 2c  TS3_MERGE_COUNT,
99d0: 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
99e0: 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 69 73   level iLevel is
99f0: 20 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a 20   already.    ** 
9a00: 66 75 6c 6c 2c 20 6d 65 72 67 65 20 61 6c 6c 20  full, merge all 
9a10: 73 65 67 6d 65 6e 74 73 20 69 6e 20 6c 65 76 65  segments in leve
9a20: 6c 20 69 4c 65 76 65 6c 20 69 6e 74 6f 20 61 20  l iLevel into a 
9a30: 73 69 6e 67 6c 65 20 69 4c 65 76 65 6c 2b 31 0a  single iLevel+1.
9a40: 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 61      ** segment a
9a50: 6e 64 20 61 6c 6c 6f 63 61 74 65 20 28 6e 65 77  nd allocate (new
9a60: 6c 79 20 66 72 65 65 64 29 20 69 6e 64 65 78 20  ly freed) index 
9a70: 30 20 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65  0 at level iLeve
9a80: 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  l. Otherwise,.  
9a90: 20 20 2a 2a 20 69 66 20 69 4e 65 78 74 20 69 73    ** if iNext is
9aa0: 20 6c 65 73 73 20 74 68 61 6e 20 46 54 53 33 5f   less than FTS3_
9ab0: 4d 45 52 47 45 5f 43 4f 55 4e 54 2c 20 61 6c 6c  MERGE_COUNT, all
9ac0: 6f 63 61 74 65 20 69 6e 64 65 78 20 69 4e 65 78  ocate index iNex
9ad0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
9ae0: 28 20 69 4e 65 78 74 3e 3d 46 54 53 33 5f 4d 45  ( iNext>=FTS3_ME
9af0: 52 47 45 5f 43 4f 55 4e 54 20 29 7b 0a 20 20 20  RGE_COUNT ){.   
9b00: 20 20 20 66 74 73 33 4c 6f 67 4d 65 72 67 65 28     fts3LogMerge(
9b10: 31 36 2c 20 67 65 74 41 62 73 6f 6c 75 74 65 4c  16, getAbsoluteL
9b20: 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c  evel(p, iLangid,
9b30: 20 69 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 29   iIndex, iLevel)
9b40: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  );.      rc = ft
9b50: 73 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 70  s3SegmentMerge(p
9b60: 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
9b70: 78 2c 20 69 4c 65 76 65 6c 29 3b 0a 20 20 20 20  x, iLevel);.    
9b80: 20 20 2a 70 69 49 64 78 20 3d 20 30 3b 0a 20 20    *piIdx = 0;.  
9b90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
9ba0: 70 69 49 64 78 20 3d 20 69 4e 65 78 74 3b 0a 20  piIdx = iNext;. 
9bb0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
9bc0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
9bd0: 54 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74  The %_segments t
9be0: 61 62 6c 65 20 69 73 20 64 65 63 6c 61 72 65 64  able is declared
9bf0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
9c00: 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
9c10: 45 20 25 5f 73 65 67 6d 65 6e 74 73 28 62 6c 6f  E %_segments(blo
9c20: 63 6b 69 64 20 49 4e 54 45 47 45 52 20 50 52 49  ckid INTEGER PRI
9c30: 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20  MARY KEY, block 
9c40: 42 4c 4f 42 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73  BLOB).**.** This
9c50: 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20   function reads 
9c60: 64 61 74 61 20 66 72 6f 6d 20 61 20 73 69 6e 67  data from a sing
9c70: 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 25 5f  le row of the %_
9c80: 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 2e 20  segments table. 
9c90: 54 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  The.** specific 
9ca0: 72 6f 77 20 69 73 20 69 64 65 6e 74 69 66 69 65  row is identifie
9cb0: 64 20 62 79 20 74 68 65 20 69 42 6c 6f 63 6b 69  d by the iBlocki
9cc0: 64 20 70 61 72 61 6d 65 74 65 72 2e 20 49 66 20  d parameter. If 
9cd0: 70 61 42 6c 6f 62 20 69 73 20 6e 6f 74 0a 2a 2a  paBlob is not.**
9ce0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 61 20 62 75   NULL, then a bu
9cf0: 66 66 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  ffer is allocate
9d00: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  d using sqlite3_
9d10: 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 70  malloc() and pop
9d20: 75 6c 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ulated.** with t
9d30: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
9d40: 68 65 20 62 6c 6f 62 20 73 74 6f 72 65 64 20 69  he blob stored i
9d50: 6e 20 74 68 65 20 22 62 6c 6f 63 6b 22 20 63 6f  n the "block" co
9d60: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20  lumn of the .** 
9d70: 69 64 65 6e 74 69 66 69 65 64 20 74 61 62 6c 65  identified table
9d80: 20 72 6f 77 20 69 73 2e 20 57 68 65 74 68 65 72   row is. Whether
9d90: 20 6f 72 20 6e 6f 74 20 70 61 42 6c 6f 62 20 69   or not paBlob i
9da0: 73 20 4e 55 4c 4c 2c 20 2a 70 6e 42 6c 6f 62 20  s NULL, *pnBlob 
9db0: 69 73 20 73 65 74 0a 2a 2a 20 74 6f 20 74 68 65  is set.** to the
9dc0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f   size of the blo
9dd0: 62 20 69 6e 20 62 79 74 65 73 20 62 65 66 6f 72  b in bytes befor
9de0: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
9df0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
9e00: 63 63 75 72 73 2c 20 6f 72 20 74 68 65 20 74 61  ccurs, or the ta
9e10: 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ble does not con
9e20: 74 61 69 6e 20 74 68 65 20 73 70 65 63 69 66 69  tain the specifi
9e30: 65 64 20 72 6f 77 2c 0a 2a 2a 20 61 6e 20 53 51  ed row,.** an SQ
9e40: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
9e50: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
9e60: 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
9e70: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
9e80: 66 0a 2a 2a 20 70 61 42 6c 6f 62 20 69 73 20 6e  f.** paBlob is n
9e90: 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  on-NULL, then it
9ea0: 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
9eb0: 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
9ec0: 6c 6c 65 72 20 74 6f 0a 2a 2a 20 65 76 65 6e 74  ller to.** event
9ed0: 75 61 6c 6c 79 20 66 72 65 65 20 74 68 65 20 72  ually free the r
9ee0: 65 74 75 72 6e 65 64 20 62 75 66 66 65 72 2e 0a  eturned buffer..
9ef0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
9f00: 69 6f 6e 20 6d 61 79 20 6c 65 61 76 65 20 61 6e  ion may leave an
9f10: 20 6f 70 65 6e 20 73 71 6c 69 74 65 33 5f 62 6c   open sqlite3_bl
9f20: 6f 62 2a 20 68 61 6e 64 6c 65 20 69 6e 20 74 68  ob* handle in th
9f30: 65 0a 2a 2a 20 46 74 73 33 54 61 62 6c 65 2e 70  e.** Fts3Table.p
9f40: 53 65 67 6d 65 6e 74 73 20 76 61 72 69 61 62 6c  Segments variabl
9f50: 65 2e 20 54 68 69 73 20 68 61 6e 64 6c 65 20 69  e. This handle i
9f60: 73 20 72 65 75 73 65 64 20 62 79 20 73 75 62 73  s reused by subs
9f70: 65 71 75 65 6e 74 20 63 61 6c 6c 73 0a 2a 2a 20  equent calls.** 
9f80: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
9f90: 2e 20 54 68 65 20 68 61 6e 64 6c 65 20 6d 61 79  . The handle may
9fa0: 20 62 65 20 63 6c 6f 73 65 64 20 62 79 20 63 61   be closed by ca
9fb0: 6c 6c 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c  lling the.** sql
9fc0: 69 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73  ite3Fts3Segments
9fd0: 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  Close() function
9fe0: 2e 20 52 65 75 73 69 6e 67 20 61 20 62 6c 6f 62  . Reusing a blob
9ff0: 20 68 61 6e 64 6c 65 20 69 73 20 61 20 68 61 6e   handle is a han
a000: 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63  dy.** performanc
a010: 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2c 20 62  e improvement, b
a020: 75 74 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64  ut the blob hand
a030: 6c 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  le should always
a040: 20 62 65 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 65   be closed.** be
a050: 66 6f 72 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20  fore control is 
a060: 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
a070: 75 73 65 72 20 28 74 6f 20 70 72 65 76 65 6e 74  user (to prevent
a080: 20 61 20 6c 6f 63 6b 20 62 65 69 6e 67 20 68 65   a lock being he
a090: 6c 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74  ld.** on the dat
a0a0: 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 6c  abase file for l
a0b0: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 65 63 65 73  onger than neces
a0c0: 73 61 72 79 29 2e 20 54 68 75 73 2c 20 61 6e 79  sary). Thus, any
a0d0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 2a   virtual table.*
a0e0: 2a 20 6d 65 74 68 6f 64 20 28 78 46 69 6c 74 65  * method (xFilte
a0f0: 72 20 65 74 63 2e 29 20 74 68 61 74 20 6d 61 79  r etc.) that may
a100: 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64   directly or ind
a110: 69 72 65 63 74 6c 79 20 63 61 6c 6c 20 74 68 69  irectly call thi
a120: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  s function.** mu
a130: 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 46  st call sqlite3F
a140: 74 73 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65  ts3SegmentsClose
a150: 28 29 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  () before return
a160: 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
a170: 74 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b  te3Fts3ReadBlock
a180: 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
a190: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a1a0: 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c      /* FTS3 tabl
a1b0: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71  e handle */.  sq
a1c0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 42 6c 6f  lite3_int64 iBlo
a1d0: 63 6b 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a  ckid,         /*
a1e0: 20 41 63 63 65 73 73 20 74 68 65 20 72 6f 77 20   Access the row 
a1f0: 77 69 74 68 20 62 6c 6f 63 6b 69 64 3d 24 69 42  with blockid=$iB
a200: 6c 6f 63 6b 69 64 20 2a 2f 0a 20 20 63 68 61 72  lockid */.  char
a210: 20 2a 2a 70 61 42 6c 6f 62 2c 20 20 20 20 20 20   **paBlob,      
a220: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
a230: 55 54 3a 20 42 6c 6f 62 20 64 61 74 61 20 69 6e  UT: Blob data in
a240: 20 6d 61 6c 6c 6f 63 27 64 20 62 75 66 66 65 72   malloc'd buffer
a250: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 6c 6f   */.  int *pnBlo
a260: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
a270: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69        /* OUT: Si
a280: 7a 65 20 6f 66 20 62 6c 6f 62 20 64 61 74 61 20  ze of blob data 
a290: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 61 64  */.  int *pnLoad
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2b0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42 79 74       /* OUT: Byt
a2c0: 65 73 20 61 63 74 75 61 6c 6c 79 20 6c 6f 61 64  es actually load
a2d0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ed */.){.  int r
a2e0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
a2f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
a300: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
a310: 2f 2a 20 70 6e 42 6c 6f 62 20 6d 75 73 74 20 62  /* pnBlob must b
a320: 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 70 61 42 6c  e non-NULL. paBl
a330: 6f 62 20 6d 61 79 20 62 65 20 4e 55 4c 4c 20 6f  ob may be NULL o
a340: 72 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 2a 2f 0a 20  r non-NULL. */. 
a350: 20 61 73 73 65 72 74 28 20 70 6e 42 6c 6f 62 20   assert( pnBlob 
a360: 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 53 65  );..  if( p->pSe
a370: 67 6d 65 6e 74 73 20 29 7b 0a 20 20 20 20 72 63  gments ){.    rc
a380: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
a390: 72 65 6f 70 65 6e 28 70 2d 3e 70 53 65 67 6d 65  reopen(p->pSegme
a3a0: 6e 74 73 2c 20 69 42 6c 6f 63 6b 69 64 29 3b 0a  nts, iBlockid);.
a3b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
a3c0: 20 30 3d 3d 70 2d 3e 7a 53 65 67 6d 65 6e 74 73   0==p->zSegments
a3d0: 54 62 6c 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Tbl ){.      p->
a3e0: 7a 53 65 67 6d 65 6e 74 73 54 62 6c 20 3d 20 73  zSegmentsTbl = s
a3f0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
a400: 25 73 5f 73 65 67 6d 65 6e 74 73 22 2c 20 70 2d  %s_segments", p-
a410: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  >zName);.      i
a420: 66 28 20 30 3d 3d 70 2d 3e 7a 53 65 67 6d 65 6e  f( 0==p->zSegmen
a430: 74 73 54 62 6c 20 29 20 72 65 74 75 72 6e 20 53  tsTbl ) return S
a440: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
a450: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
a460: 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 0a 20  te3_blob_open(. 
a470: 20 20 20 20 20 20 70 2d 3e 64 62 2c 20 70 2d 3e        p->db, p->
a480: 7a 44 62 2c 20 70 2d 3e 7a 53 65 67 6d 65 6e 74  zDb, p->zSegment
a490: 73 54 62 6c 2c 20 22 62 6c 6f 63 6b 22 2c 20 69  sTbl, "block", i
a4a0: 42 6c 6f 63 6b 69 64 2c 20 30 2c 20 26 70 2d 3e  Blockid, 0, &p->
a4b0: 70 53 65 67 6d 65 6e 74 73 0a 20 20 20 20 29 3b  pSegments.    );
a4c0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
a4d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a4e0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 71 6c   int nByte = sql
a4f0: 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28  ite3_blob_bytes(
a500: 70 2d 3e 70 53 65 67 6d 65 6e 74 73 29 3b 0a 20  p->pSegments);. 
a510: 20 20 20 2a 70 6e 42 6c 6f 62 20 3d 20 6e 42 79     *pnBlob = nBy
a520: 74 65 3b 0a 20 20 20 20 69 66 28 20 70 61 42 6c  te;.    if( paBl
a530: 6f 62 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  ob ){.      char
a540: 20 2a 61 42 79 74 65 20 3d 20 73 71 6c 69 74 65   *aByte = sqlite
a550: 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 20 2b  3_malloc(nByte +
a560: 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49   FTS3_NODE_PADDI
a570: 4e 47 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  NG);.      if( !
a580: 61 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20  aByte ){.       
a590: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
a5a0: 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
a5b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 6e 4c  .        if( pnL
a5c0: 6f 61 64 20 26 26 20 6e 42 79 74 65 3e 28 46 54  oad && nByte>(FT
a5d0: 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 5f 54 48  S3_NODE_CHUNK_TH
a5e0: 52 45 53 48 4f 4c 44 29 20 29 7b 0a 20 20 20 20  RESHOLD) ){.    
a5f0: 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 46 54        nByte = FT
a600: 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 53 49 5a  S3_NODE_CHUNKSIZ
a610: 45 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e  E;.          *pn
a620: 4c 6f 61 64 20 3d 20 6e 42 79 74 65 3b 0a 20 20  Load = nByte;.  
a630: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a640: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
a650: 62 5f 72 65 61 64 28 70 2d 3e 70 53 65 67 6d 65  b_read(p->pSegme
a660: 6e 74 73 2c 20 61 42 79 74 65 2c 20 6e 42 79 74  nts, aByte, nByt
a670: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6d  e, 0);.        m
a680: 65 6d 73 65 74 28 26 61 42 79 74 65 5b 6e 42 79  emset(&aByte[nBy
a690: 74 65 5d 2c 20 30 2c 20 46 54 53 33 5f 4e 4f 44  te], 0, FTS3_NOD
a6a0: 45 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 20 20  E_PADDING);.    
a6b0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
a6c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
a6d0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
a6e0: 61 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20  aByte);.        
a6f0: 20 20 61 42 79 74 65 20 3d 20 30 3b 0a 20 20 20    aByte = 0;.   
a700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
a710: 20 20 20 20 20 2a 70 61 42 6c 6f 62 20 3d 20 61       *paBlob = a
a720: 42 79 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Byte;.    }.  }.
a730: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a740: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
a750: 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 61 74 20   blob handle at 
a760: 70 2d 3e 70 53 65 67 6d 65 6e 74 73 2c 20 69 66  p->pSegments, if
a770: 20 69 74 20 69 73 20 6f 70 65 6e 2e 20 53 65 65   it is open. See
a780: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 0a   comments above.
a790: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 46 74  ** the sqlite3Ft
a7a0: 73 33 52 65 61 64 42 6c 6f 63 6b 28 29 20 66 75  s3ReadBlock() fu
a7b0: 6e 63 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69  nction for detai
a7c0: 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ls..*/.void sqli
a7d0: 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73 43  te3Fts3SegmentsC
a7e0: 6c 6f 73 65 28 46 74 73 33 54 61 62 6c 65 20 2a  lose(Fts3Table *
a7f0: 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c  p){.  sqlite3_bl
a800: 6f 62 5f 63 6c 6f 73 65 28 70 2d 3e 70 53 65 67  ob_close(p->pSeg
a810: 6d 65 6e 74 73 29 3b 0a 20 20 70 2d 3e 70 53 65  ments);.  p->pSe
a820: 67 6d 65 6e 74 73 20 3d 20 30 3b 0a 7d 0a 20 20  gments = 0;.}.  
a830: 20 20 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74    .static int ft
a840: 73 33 53 65 67 52 65 61 64 65 72 49 6e 63 72 52  s3SegReaderIncrR
a850: 65 61 64 28 46 74 73 33 53 65 67 52 65 61 64 65  ead(Fts3SegReade
a860: 72 20 2a 70 52 65 61 64 65 72 29 7b 0a 20 20 69  r *pReader){.  i
a870: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
a880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a890: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
a8a0: 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69  s to read */.  i
a8b0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
a8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a8d0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
a8e0: 0a 0a 20 20 6e 52 65 61 64 20 3d 20 4d 49 4e 28  ..  nRead = MIN(
a8f0: 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 20 2d  pReader->nNode -
a900: 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c   pReader->nPopul
a910: 61 74 65 2c 20 46 54 53 33 5f 4e 4f 44 45 5f 43  ate, FTS3_NODE_C
a920: 48 55 4e 4b 53 49 5a 45 29 3b 0a 20 20 72 63 20  HUNKSIZE);.  rc 
a930: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  = sqlite3_blob_r
a940: 65 61 64 28 0a 20 20 20 20 20 20 70 52 65 61 64  ead(.      pRead
a950: 65 72 2d 3e 70 42 6c 6f 62 2c 20 0a 20 20 20 20  er->pBlob, .    
a960: 20 20 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64    &pReader->aNod
a970: 65 5b 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75  e[pReader->nPopu
a980: 6c 61 74 65 5d 2c 0a 20 20 20 20 20 20 6e 52 65  late],.      nRe
a990: 61 64 2c 0a 20 20 20 20 20 20 70 52 65 61 64 65  ad,.      pReade
a9a0: 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 0a 20 20 29  r->nPopulate.  )
a9b0: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
a9c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 52  ITE_OK ){.    pR
a9d0: 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65  eader->nPopulate
a9e0: 20 2b 3d 20 6e 52 65 61 64 3b 0a 20 20 20 20 6d   += nRead;.    m
a9f0: 65 6d 73 65 74 28 26 70 52 65 61 64 65 72 2d 3e  emset(&pReader->
aa00: 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e  aNode[pReader->n
aa10: 50 6f 70 75 6c 61 74 65 5d 2c 20 30 2c 20 46 54  Populate], 0, FT
aa20: 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49 4e 47 29  S3_NODE_PADDING)
aa30: 3b 0a 20 20 20 20 69 66 28 20 70 52 65 61 64 65  ;.    if( pReade
aa40: 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 3d 3d 70 52  r->nPopulate==pR
aa50: 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 20 29 7b 0a  eader->nNode ){.
aa60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c        sqlite3_bl
aa70: 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61 64 65 72  ob_close(pReader
aa80: 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20  ->pBlob);.      
aa90: 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 20 3d  pReader->pBlob =
aaa0: 20 30 3b 0a 20 20 20 20 20 20 70 52 65 61 64 65   0;.      pReade
aab0: 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 20 3d 20 30  r->nPopulate = 0
aac0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
aad0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
aae0: 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65  ic int fts3SegRe
aaf0: 61 64 65 72 52 65 71 75 69 72 65 28 46 74 73 33  aderRequire(Fts3
ab00: 53 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64  SegReader *pRead
ab10: 65 72 2c 20 63 68 61 72 20 2a 70 46 72 6f 6d 2c  er, char *pFrom,
ab20: 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69   int nByte){.  i
ab30: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
ab40: 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 52  K;.  assert( !pR
ab50: 65 61 64 65 72 2d 3e 70 42 6c 6f 62 20 0a 20 20  eader->pBlob .  
ab60: 20 20 20 20 20 7c 7c 20 28 70 46 72 6f 6d 3e 3d       || (pFrom>=
ab70: 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20 26  pReader->aNode &
ab80: 26 20 70 46 72 6f 6d 3c 26 70 52 65 61 64 65 72  & pFrom<&pReader
ab90: 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d  ->aNode[pReader-
aba0: 3e 6e 4e 6f 64 65 5d 29 0a 20 20 29 3b 0a 20 20  >nNode]).  );.  
abb0: 77 68 69 6c 65 28 20 70 52 65 61 64 65 72 2d 3e  while( pReader->
abc0: 70 42 6c 6f 62 20 26 26 20 72 63 3d 3d 53 51 4c  pBlob && rc==SQL
abd0: 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20 26 26 20  ITE_OK .     && 
abe0: 20 28 70 46 72 6f 6d 20 2d 20 70 52 65 61 64 65   (pFrom - pReade
abf0: 72 2d 3e 61 4e 6f 64 65 20 2b 20 6e 42 79 74 65  r->aNode + nByte
ac00: 29 3e 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75  )>pReader->nPopu
ac10: 6c 61 74 65 0a 20 20 29 7b 0a 20 20 20 20 72 63  late.  ){.    rc
ac20: 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72   = fts3SegReader
ac30: 49 6e 63 72 52 65 61 64 28 70 52 65 61 64 65 72  IncrRead(pReader
ac40: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
ac50: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
ac60: 20 61 6e 20 46 74 73 33 53 65 67 52 65 61 64 65   an Fts3SegReade
ac70: 72 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  r cursor to poin
ac80: 74 20 61 74 20 45 4f 46 2e 0a 2a 2f 0a 73 74 61  t at EOF..*/.sta
ac90: 74 69 63 20 76 6f 69 64 20 66 74 73 33 53 65 67  tic void fts3Seg
aca0: 52 65 61 64 65 72 53 65 74 45 6f 66 28 46 74 73  ReaderSetEof(Fts
acb0: 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67  3SegReader *pSeg
acc0: 29 7b 0a 20 20 69 66 28 20 21 66 74 73 33 53 65  ){.  if( !fts3Se
acd0: 67 52 65 61 64 65 72 49 73 52 6f 6f 74 4f 6e 6c  gReaderIsRootOnl
ace0: 79 28 70 53 65 67 29 20 29 7b 0a 20 20 20 20 73  y(pSeg) ){.    s
acf0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 67  qlite3_free(pSeg
ad00: 2d 3e 61 4e 6f 64 65 29 3b 0a 20 20 20 20 73 71  ->aNode);.    sq
ad10: 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65  lite3_blob_close
ad20: 28 70 53 65 67 2d 3e 70 42 6c 6f 62 29 3b 0a 20  (pSeg->pBlob);. 
ad30: 20 20 20 70 53 65 67 2d 3e 70 42 6c 6f 62 20 3d     pSeg->pBlob =
ad40: 20 30 3b 0a 20 20 7d 0a 20 20 70 53 65 67 2d 3e   0;.  }.  pSeg->
ad50: 61 4e 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  aNode = 0;.}../*
ad60: 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65  .** Move the ite
ad70: 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
ad80: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
ad90: 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 74  nt to the next t
ada0: 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 73 65  erm in the.** se
adb0: 67 6d 65 6e 74 2e 20 49 66 20 73 75 63 63 65 73  gment. If succes
adc0: 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
add0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
ade0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 78 74  there is no next
adf0: 20 74 65 72 6d 2c 0a 2a 2a 20 53 51 4c 49 54 45   term,.** SQLITE
ae00: 5f 44 4f 4e 45 2e 20 4f 74 68 65 72 77 69 73 65  _DONE. Otherwise
ae10: 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
ae20: 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
ae30: 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61  c int fts3SegRea
ae40: 64 65 72 4e 65 78 74 28 0a 20 20 46 74 73 33 54  derNext(.  Fts3T
ae50: 61 62 6c 65 20 2a 70 2c 20 0a 20 20 46 74 73 33  able *p, .  Fts3
ae60: 53 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64  SegReader *pRead
ae70: 65 72 2c 0a 20 20 69 6e 74 20 62 49 6e 63 72 0a  er,.  int bIncr.
ae80: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
ae90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aea0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
aeb0: 6f 64 65 20 6f 66 20 76 61 72 69 6f 75 73 20 73  ode of various s
aec0: 75 62 2d 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20  ub-routines */. 
aed0: 20 63 68 61 72 20 2a 70 4e 65 78 74 3b 20 20 20   char *pNext;   
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aef0: 20 2f 2a 20 43 75 72 73 6f 72 20 76 61 72 69 61   /* Cursor varia
af00: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72  ble */.  int nPr
af10: 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20  efix;           
af20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
af30: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
af40: 65 72 6d 20 70 72 65 66 69 78 20 2a 2f 0a 20 20  erm prefix */.  
af50: 69 6e 74 20 6e 53 75 66 66 69 78 3b 20 20 20 20  int nSuffix;    
af60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af70: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
af80: 65 73 20 69 6e 20 74 65 72 6d 20 73 75 66 66 69  es in term suffi
af90: 78 20 2a 2f 0a 0a 20 20 69 66 28 20 21 70 52 65  x */..  if( !pRe
afa0: 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20 29  ader->aDoclist )
afb0: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 52  {.    pNext = pR
afc0: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 3b 0a 20 20  eader->aNode;.  
afd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 78 74  }else{.    pNext
afe0: 20 3d 20 26 70 52 65 61 64 65 72 2d 3e 61 44 6f   = &pReader->aDo
aff0: 63 6c 69 73 74 5b 70 52 65 61 64 65 72 2d 3e 6e  clist[pReader->n
b000: 44 6f 63 6c 69 73 74 5d 3b 0a 20 20 7d 0a 0a 20  Doclist];.  }.. 
b010: 20 69 66 28 20 21 70 4e 65 78 74 20 7c 7c 20 70   if( !pNext || p
b020: 4e 65 78 74 3e 3d 26 70 52 65 61 64 65 72 2d 3e  Next>=&pReader->
b030: 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e  aNode[pReader->n
b040: 4e 6f 64 65 5d 20 29 7b 0a 0a 20 20 20 20 69 66  Node] ){..    if
b050: 28 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49  ( fts3SegReaderI
b060: 73 50 65 6e 64 69 6e 67 28 70 52 65 61 64 65 72  sPending(pReader
b070: 29 20 29 7b 0a 20 20 20 20 20 20 46 74 73 33 48  ) ){.      Fts3H
b080: 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 20 3d  ashElem *pElem =
b090: 20 2a 28 70 52 65 61 64 65 72 2d 3e 70 70 4e 65   *(pReader->ppNe
b0a0: 78 74 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 69  xtElem);.      i
b0b0: 66 28 20 70 45 6c 65 6d 3d 3d 30 20 29 7b 0a 20  f( pElem==0 ){. 
b0c0: 20 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e         pReader->
b0d0: 61 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  aNode = 0;.     
b0e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b0f0: 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70 4c 69  PendingList *pLi
b100: 73 74 20 3d 20 28 50 65 6e 64 69 6e 67 4c 69 73  st = (PendingLis
b110: 74 20 2a 29 66 74 73 33 48 61 73 68 44 61 74 61  t *)fts3HashData
b120: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 20  (pElem);.       
b130: 20 70 52 65 61 64 65 72 2d 3e 7a 54 65 72 6d 20   pReader->zTerm 
b140: 3d 20 28 63 68 61 72 20 2a 29 66 74 73 33 48 61  = (char *)fts3Ha
b150: 73 68 4b 65 79 28 70 45 6c 65 6d 29 3b 0a 20 20  shKey(pElem);.  
b160: 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e        pReader->n
b170: 54 65 72 6d 20 3d 20 66 74 73 33 48 61 73 68 4b  Term = fts3HashK
b180: 65 79 73 69 7a 65 28 70 45 6c 65 6d 29 3b 0a 20  eysize(pElem);. 
b190: 20 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e         pReader->
b1a0: 6e 4e 6f 64 65 20 3d 20 70 52 65 61 64 65 72 2d  nNode = pReader-
b1b0: 3e 6e 44 6f 63 6c 69 73 74 20 3d 20 70 4c 69 73  >nDoclist = pLis
b1c0: 74 2d 3e 6e 44 61 74 61 20 2b 20 31 3b 0a 20 20  t->nData + 1;.  
b1d0: 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 61        pReader->a
b1e0: 4e 6f 64 65 20 3d 20 70 52 65 61 64 65 72 2d 3e  Node = pReader->
b1f0: 61 44 6f 63 6c 69 73 74 20 3d 20 70 4c 69 73 74  aDoclist = pList
b200: 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20  ->aData;.       
b210: 20 70 52 65 61 64 65 72 2d 3e 70 70 4e 65 78 74   pReader->ppNext
b220: 45 6c 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Elem++;.        
b230: 61 73 73 65 72 74 28 20 70 52 65 61 64 65 72 2d  assert( pReader-
b240: 3e 61 4e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  >aNode );.      
b250: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
b260: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
b270: 0a 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64  .    fts3SegRead
b280: 65 72 53 65 74 45 6f 66 28 70 52 65 61 64 65 72  erSetEof(pReader
b290: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 69 43  );..    /* If iC
b2a0: 75 72 72 65 6e 74 42 6c 6f 63 6b 3e 3d 69 4c 65  urrentBlock>=iLe
b2b0: 61 66 45 6e 64 42 6c 6f 63 6b 2c 20 74 68 69 73  afEndBlock, this
b2c0: 20 69 73 20 61 6e 20 45 4f 46 20 63 6f 6e 64 69   is an EOF condi
b2d0: 74 69 6f 6e 2e 20 41 6c 6c 20 6c 65 61 66 20 0a  tion. All leaf .
b2e0: 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 73 20 68 61      ** blocks ha
b2f0: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
b300: 74 72 61 76 65 72 73 65 64 2e 20 20 2a 2f 0a 20  traversed.  */. 
b310: 20 20 20 61 73 73 65 72 74 28 20 70 52 65 61 64     assert( pRead
b320: 65 72 2d 3e 69 43 75 72 72 65 6e 74 42 6c 6f 63  er->iCurrentBloc
b330: 6b 3c 3d 70 52 65 61 64 65 72 2d 3e 69 4c 65 61  k<=pReader->iLea
b340: 66 45 6e 64 42 6c 6f 63 6b 20 29 3b 0a 20 20 20  fEndBlock );.   
b350: 20 69 66 28 20 70 52 65 61 64 65 72 2d 3e 69 43   if( pReader->iC
b360: 75 72 72 65 6e 74 42 6c 6f 63 6b 3e 3d 70 52 65  urrentBlock>=pRe
b370: 61 64 65 72 2d 3e 69 4c 65 61 66 45 6e 64 42 6c  ader->iLeafEndBl
b380: 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ock ){.      ret
b390: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
b3a0: 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 73     }..    rc = s
b3b0: 71 6c 69 74 65 33 46 74 73 33 52 65 61 64 42 6c  qlite3Fts3ReadBl
b3c0: 6f 63 6b 28 0a 20 20 20 20 20 20 20 20 70 2c 20  ock(.        p, 
b3d0: 2b 2b 70 52 65 61 64 65 72 2d 3e 69 43 75 72 72  ++pReader->iCurr
b3e0: 65 6e 74 42 6c 6f 63 6b 2c 20 26 70 52 65 61 64  entBlock, &pRead
b3f0: 65 72 2d 3e 61 4e 6f 64 65 2c 20 26 70 52 65 61  er->aNode, &pRea
b400: 64 65 72 2d 3e 6e 4e 6f 64 65 2c 20 0a 20 20 20  der->nNode, .   
b410: 20 20 20 20 20 28 62 49 6e 63 72 20 3f 20 26 70       (bIncr ? &p
b420: 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74  Reader->nPopulat
b430: 65 20 3a 20 30 29 0a 20 20 20 20 29 3b 0a 20 20  e : 0).    );.  
b440: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b450: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
b460: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65  .    assert( pRe
b470: 61 64 65 72 2d 3e 70 42 6c 6f 62 3d 3d 30 20 29  ader->pBlob==0 )
b480: 3b 0a 20 20 20 20 69 66 28 20 62 49 6e 63 72 20  ;.    if( bIncr 
b490: 26 26 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70  && pReader->nPop
b4a0: 75 6c 61 74 65 3c 70 52 65 61 64 65 72 2d 3e 6e  ulate<pReader->n
b4b0: 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 70 52  Node ){.      pR
b4c0: 65 61 64 65 72 2d 3e 70 42 6c 6f 62 20 3d 20 70  eader->pBlob = p
b4d0: 2d 3e 70 53 65 67 6d 65 6e 74 73 3b 0a 20 20 20  ->pSegments;.   
b4e0: 20 20 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73 20     p->pSegments 
b4f0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
b500: 4e 65 78 74 20 3d 20 70 52 65 61 64 65 72 2d 3e  Next = pReader->
b510: 61 4e 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 61 73  aNode;.  }..  as
b520: 73 65 72 74 28 20 21 66 74 73 33 53 65 67 52 65  sert( !fts3SegRe
b530: 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28 70 52  aderIsPending(pR
b540: 65 61 64 65 72 29 20 29 3b 0a 0a 20 20 72 63 20  eader) );..  rc 
b550: 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72 52  = fts3SegReaderR
b560: 65 71 75 69 72 65 28 70 52 65 61 64 65 72 2c 20  equire(pReader, 
b570: 70 4e 65 78 74 2c 20 46 54 53 33 5f 56 41 52 49  pNext, FTS3_VARI
b580: 4e 54 5f 4d 41 58 2a 32 29 3b 0a 20 20 69 66 28  NT_MAX*2);.  if(
b590: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b5a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 0a 20   return rc;.  . 
b5b0: 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 74   /* Because of t
b5c0: 68 65 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44  he FTS3_NODE_PAD
b5d0: 44 49 4e 47 20 62 79 74 65 73 20 6f 66 20 70 61  DING bytes of pa
b5e0: 64 64 69 6e 67 2c 20 74 68 65 20 66 6f 6c 6c 6f  dding, the follo
b5f0: 77 69 6e 67 20 69 73 20 0a 20 20 2a 2a 20 73 61  wing is .  ** sa
b600: 66 65 20 28 6e 6f 20 72 69 73 6b 20 6f 66 20 6f  fe (no risk of o
b610: 76 65 72 72 65 61 64 29 20 65 76 65 6e 20 69 66  verread) even if
b620: 20 74 68 65 20 6e 6f 64 65 20 64 61 74 61 20 69   the node data i
b630: 73 20 63 6f 72 72 75 70 74 65 64 2e 20 2a 2f 0a  s corrupted. */.
b640: 20 20 70 4e 65 78 74 20 2b 3d 20 73 71 6c 69 74    pNext += sqlit
b650: 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 33  e3Fts3GetVarint3
b660: 32 28 70 4e 65 78 74 2c 20 26 6e 50 72 65 66 69  2(pNext, &nPrefi
b670: 78 29 3b 0a 20 20 70 4e 65 78 74 20 2b 3d 20 73  x);.  pNext += s
b680: 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
b690: 69 6e 74 33 32 28 70 4e 65 78 74 2c 20 26 6e 53  int32(pNext, &nS
b6a0: 75 66 66 69 78 29 3b 0a 20 20 69 66 28 20 6e 50  uffix);.  if( nP
b6b0: 72 65 66 69 78 3c 30 20 7c 7c 20 6e 53 75 66 66  refix<0 || nSuff
b6c0: 69 78 3c 3d 30 20 0a 20 20 20 7c 7c 20 26 70 4e  ix<=0 .   || &pN
b6d0: 65 78 74 5b 6e 53 75 66 66 69 78 5d 3e 26 70 52  ext[nSuffix]>&pR
b6e0: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65  eader->aNode[pRe
b6f0: 61 64 65 72 2d 3e 6e 4e 6f 64 65 5d 20 0a 20 20  ader->nNode] .  
b700: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 54  ){.    return FT
b710: 53 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a  S_CORRUPT_VTAB;.
b720: 20 20 7d 0a 0a 20 20 69 66 28 20 6e 50 72 65 66    }..  if( nPref
b730: 69 78 2b 6e 53 75 66 66 69 78 3e 70 52 65 61 64  ix+nSuffix>pRead
b740: 65 72 2d 3e 6e 54 65 72 6d 41 6c 6c 6f 63 20 29  er->nTermAlloc )
b750: 7b 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d  {.    int nNew =
b760: 20 28 6e 50 72 65 66 69 78 2b 6e 53 75 66 66 69   (nPrefix+nSuffi
b770: 78 29 2a 32 3b 0a 20 20 20 20 63 68 61 72 20 2a  x)*2;.    char *
b780: 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72  zNew = sqlite3_r
b790: 65 61 6c 6c 6f 63 28 70 52 65 61 64 65 72 2d 3e  ealloc(pReader->
b7a0: 7a 54 65 72 6d 2c 20 6e 4e 65 77 29 3b 0a 20 20  zTerm, nNew);.  
b7b0: 20 20 69 66 28 20 21 7a 4e 65 77 20 29 7b 0a 20    if( !zNew ){. 
b7c0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
b7d0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
b7e0: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 7a 54 65      pReader->zTe
b7f0: 72 6d 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20 70  rm = zNew;.    p
b800: 52 65 61 64 65 72 2d 3e 6e 54 65 72 6d 41 6c 6c  Reader->nTermAll
b810: 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 7d 0a 0a  oc = nNew;.  }..
b820: 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65    rc = fts3SegRe
b830: 61 64 65 72 52 65 71 75 69 72 65 28 70 52 65 61  aderRequire(pRea
b840: 64 65 72 2c 20 70 4e 65 78 74 2c 20 6e 53 75 66  der, pNext, nSuf
b850: 66 69 78 2b 46 54 53 33 5f 56 41 52 49 4e 54 5f  fix+FTS3_VARINT_
b860: 4d 41 58 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  MAX);.  if( rc!=
b870: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
b880: 72 6e 20 72 63 3b 0a 0a 20 20 6d 65 6d 63 70 79  rn rc;..  memcpy
b890: 28 26 70 52 65 61 64 65 72 2d 3e 7a 54 65 72 6d  (&pReader->zTerm
b8a0: 5b 6e 50 72 65 66 69 78 5d 2c 20 70 4e 65 78 74  [nPrefix], pNext
b8b0: 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 70 52  , nSuffix);.  pR
b8c0: 65 61 64 65 72 2d 3e 6e 54 65 72 6d 20 3d 20 6e  eader->nTerm = n
b8d0: 50 72 65 66 69 78 2b 6e 53 75 66 66 69 78 3b 0a  Prefix+nSuffix;.
b8e0: 20 20 70 4e 65 78 74 20 2b 3d 20 6e 53 75 66 66    pNext += nSuff
b8f0: 69 78 3b 0a 20 20 70 4e 65 78 74 20 2b 3d 20 73  ix;.  pNext += s
b900: 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
b910: 69 6e 74 33 32 28 70 4e 65 78 74 2c 20 26 70 52  int32(pNext, &pR
b920: 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 29  eader->nDoclist)
b930: 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 61 44 6f  ;.  pReader->aDo
b940: 63 6c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20  clist = pNext;. 
b950: 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65   pReader->pOffse
b960: 74 4c 69 73 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  tList = 0;..  /*
b970: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
b980: 64 6f 63 6c 69 73 74 20 64 6f 65 73 20 6e 6f 74  doclist does not
b990: 20 61 70 70 65 61 72 20 74 6f 20 65 78 74 65 6e   appear to exten
b9a0: 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  d past the end o
b9b0: 66 20 74 68 65 0a 20 20 2a 2a 20 62 2d 74 72 65  f the.  ** b-tre
b9c0: 65 20 6e 6f 64 65 2e 20 41 6e 64 20 74 68 61 74  e node. And that
b9d0: 20 74 68 65 20 66 69 6e 61 6c 20 62 79 74 65 20   the final byte 
b9e0: 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20 69  of the doclist i
b9f0: 73 20 30 78 30 30 2e 20 49 66 20 65 69 74 68 65  s 0x00. If eithe
ba00: 72 20 0a 20 20 2a 2a 20 6f 66 20 74 68 65 73 65  r .  ** of these
ba10: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 75   statements is u
ba20: 6e 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20  ntrue, then the 
ba30: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69  data structure i
ba40: 73 20 63 6f 72 72 75 70 74 2e 0a 20 20 2a 2f 0a  s corrupt..  */.
ba50: 20 20 69 66 28 20 26 70 52 65 61 64 65 72 2d 3e    if( &pReader->
ba60: 61 44 6f 63 6c 69 73 74 5b 70 52 65 61 64 65 72  aDoclist[pReader
ba70: 2d 3e 6e 44 6f 63 6c 69 73 74 5d 3e 26 70 52 65  ->nDoclist]>&pRe
ba80: 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61  ader->aNode[pRea
ba90: 64 65 72 2d 3e 6e 4e 6f 64 65 5d 20 0a 20 20 20  der->nNode] .   
baa0: 7c 7c 20 28 70 52 65 61 64 65 72 2d 3e 6e 50 6f  || (pReader->nPo
bab0: 70 75 6c 61 74 65 3d 3d 30 20 26 26 20 70 52 65  pulate==0 && pRe
bac0: 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b 70  ader->aDoclist[p
bad0: 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74  Reader->nDoclist
bae0: 2d 31 5d 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  -1]).  ){.    re
baf0: 74 75 72 6e 20 46 54 53 5f 43 4f 52 52 55 50 54  turn FTS_CORRUPT
bb00: 5f 56 54 41 42 3b 0a 20 20 7d 0a 20 20 72 65 74  _VTAB;.  }.  ret
bb10: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
bb20: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
bb30: 53 65 67 52 65 61 64 65 72 20 74 6f 20 70 6f 69  SegReader to poi
bb40: 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  nt to the first 
bb50: 64 6f 63 69 64 20 69 6e 20 74 68 65 20 64 6f 63  docid in the doc
bb60: 6c 69 73 74 20 61 73 73 6f 63 69 61 74 65 64 0a  list associated.
bb70: 2a 2a 20 77 69 74 68 20 74 68 65 20 63 75 72 72  ** with the curr
bb80: 65 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61  ent term..*/.sta
bb90: 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 52  tic int fts3SegR
bba0: 65 61 64 65 72 46 69 72 73 74 44 6f 63 69 64 28  eaderFirstDocid(
bbb0: 46 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62 2c  Fts3Table *pTab,
bbc0: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
bbd0: 70 52 65 61 64 65 72 29 7b 0a 20 20 69 6e 74 20  pReader){.  int 
bbe0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
bbf0: 20 20 61 73 73 65 72 74 28 20 70 52 65 61 64 65    assert( pReade
bc00: 72 2d 3e 61 44 6f 63 6c 69 73 74 20 29 3b 0a 20  r->aDoclist );. 
bc10: 20 61 73 73 65 72 74 28 20 21 70 52 65 61 64 65   assert( !pReade
bc20: 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 29  r->pOffsetList )
bc30: 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 62 44  ;.  if( pTab->bD
bc40: 65 73 63 49 64 78 20 26 26 20 66 74 73 33 53 65  escIdx && fts3Se
bc50: 67 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e 67  gReaderIsPending
bc60: 28 70 52 65 61 64 65 72 29 20 29 7b 0a 20 20 20  (pReader) ){.   
bc70: 20 75 38 20 62 45 6f 66 20 3d 20 30 3b 0a 20 20   u8 bEof = 0;.  
bc80: 20 20 70 52 65 61 64 65 72 2d 3e 69 44 6f 63 69    pReader->iDoci
bc90: 64 20 3d 20 30 3b 0a 20 20 20 20 70 52 65 61 64  d = 0;.    pRead
bca0: 65 72 2d 3e 6e 4f 66 66 73 65 74 4c 69 73 74 20  er->nOffsetList 
bcb0: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
bcc0: 46 74 73 33 44 6f 63 6c 69 73 74 50 72 65 76 28  Fts3DoclistPrev(
bcd0: 30 2c 0a 20 20 20 20 20 20 20 20 70 52 65 61 64  0,.        pRead
bce0: 65 72 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 70 52  er->aDoclist, pR
bcf0: 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 2c  eader->nDoclist,
bd00: 20 26 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73   &pReader->pOffs
bd10: 65 74 4c 69 73 74 2c 20 0a 20 20 20 20 20 20 20  etList, .       
bd20: 20 26 70 52 65 61 64 65 72 2d 3e 69 44 6f 63 69   &pReader->iDoci
bd30: 64 2c 20 26 70 52 65 61 64 65 72 2d 3e 6e 4f 66  d, &pReader->nOf
bd40: 66 73 65 74 4c 69 73 74 2c 20 26 62 45 6f 66 0a  fsetList, &bEof.
bd50: 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
bd60: 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67      rc = fts3Seg
bd70: 52 65 61 64 65 72 52 65 71 75 69 72 65 28 70 52  ReaderRequire(pR
bd80: 65 61 64 65 72 2c 20 70 52 65 61 64 65 72 2d 3e  eader, pReader->
bd90: 61 44 6f 63 6c 69 73 74 2c 20 46 54 53 33 5f 56  aDoclist, FTS3_V
bda0: 41 52 49 4e 54 5f 4d 41 58 29 3b 0a 20 20 20 20  ARINT_MAX);.    
bdb0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
bdc0: 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  K ){.      int n
bdd0: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65   = sqlite3Fts3Ge
bde0: 74 56 61 72 69 6e 74 28 70 52 65 61 64 65 72 2d  tVarint(pReader-
bdf0: 3e 61 44 6f 63 6c 69 73 74 2c 20 26 70 52 65 61  >aDoclist, &pRea
be00: 64 65 72 2d 3e 69 44 6f 63 69 64 29 3b 0a 20 20  der->iDocid);.  
be10: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 4f 66      pReader->pOf
be20: 66 73 65 74 4c 69 73 74 20 3d 20 26 70 52 65 61  fsetList = &pRea
be30: 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b 6e 5d  der->aDoclist[n]
be40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
be50: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
be60: 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 53 65  * Advance the Se
be70: 67 52 65 61 64 65 72 20 74 6f 20 70 6f 69 6e 74  gReader to point
be80: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 6f 63   to the next doc
be90: 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73  id in the doclis
bea0: 74 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  t.** associated 
beb0: 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74  with the current
bec0: 20 74 65 72 6d 2e 0a 2a 2a 20 0a 2a 2a 20 49 66   term..** .** If
bed0: 20 61 72 67 75 6d 65 6e 74 73 20 70 70 4f 66 66   arguments ppOff
bee0: 73 65 74 4c 69 73 74 20 61 6e 64 20 70 6e 4f 66  setList and pnOf
bef0: 66 73 65 74 4c 69 73 74 20 61 72 65 20 6e 6f 74  fsetList are not
bf00: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 0a 2a 2a 20   NULL, then .** 
bf10: 2a 70 70 4f 66 66 73 65 74 4c 69 73 74 20 69 73  *ppOffsetList is
bf20: 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
bf30: 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d   the first colum
bf40: 6e 2d 6f 66 66 73 65 74 20 6c 69 73 74 0a 2a 2a  n-offset list.**
bf50: 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20   in the doclist 
bf60: 65 6e 74 72 79 20 28 69 2e 65 2e 20 69 6d 6d 65  entry (i.e. imme
bf70: 64 69 61 74 65 6c 79 20 70 61 73 74 20 74 68 65  diately past the
bf80: 20 64 6f 63 69 64 20 76 61 72 69 6e 74 29 2e 0a   docid varint)..
bf90: 2a 2a 20 2a 70 6e 4f 66 66 73 65 74 4c 69 73 74  ** *pnOffsetList
bfa0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c   is set to the l
bfb0: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 65 74  ength of the set
bfc0: 20 6f 66 20 63 6f 6c 75 6d 6e 2d 6f 66 66 73 65   of column-offse
bfd0: 74 0a 2a 2a 20 6c 69 73 74 73 2c 20 6e 6f 74 20  t.** lists, not 
bfe0: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 75  including the nu
bff0: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
c000: 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  e. For example:.
c010: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
c020: 73 33 53 65 67 52 65 61 64 65 72 4e 65 78 74 44  s3SegReaderNextD
c030: 6f 63 69 64 28 0a 20 20 46 74 73 33 54 61 62 6c  ocid(.  Fts3Tabl
c040: 65 20 2a 70 54 61 62 2c 0a 20 20 46 74 73 33 53  e *pTab,.  Fts3S
c050: 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 65  egReader *pReade
c060: 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  r,         /* Re
c070: 61 64 65 72 20 74 6f 20 61 64 76 61 6e 63 65 20  ader to advance 
c080: 74 6f 20 6e 65 78 74 20 64 6f 63 69 64 20 2a 2f  to next docid */
c090: 0a 20 20 63 68 61 72 20 2a 2a 70 70 4f 66 66 73  .  char **ppOffs
c0a0: 65 74 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  etList,         
c0b0: 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74     /* OUT: Point
c0c0: 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 70 6f  er to current po
c0d0: 73 69 74 69 6f 6e 2d 6c 69 73 74 20 2a 2f 0a 20  sition-list */. 
c0e0: 20 69 6e 74 20 2a 70 6e 4f 66 66 73 65 74 4c 69   int *pnOffsetLi
c0f0: 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
c100: 20 2f 2a 20 4f 55 54 3a 20 4c 65 6e 67 74 68 20   /* OUT: Length 
c110: 6f 66 20 2a 70 70 4f 66 66 73 65 74 4c 69 73 74  of *ppOffsetList
c120: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a   in bytes */.){.
c130: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c140: 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 70 20  E_OK;.  char *p 
c150: 3d 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73  = pReader->pOffs
c160: 65 74 4c 69 73 74 3b 0a 20 20 63 68 61 72 20 63  etList;.  char c
c170: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
c180: 20 70 20 29 3b 0a 0a 20 20 69 66 28 20 70 54 61   p );..  if( pTa
c190: 62 2d 3e 62 44 65 73 63 49 64 78 20 26 26 20 66  b->bDescIdx && f
c1a0: 74 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65  ts3SegReaderIsPe
c1b0: 6e 64 69 6e 67 28 70 52 65 61 64 65 72 29 20 29  nding(pReader) )
c1c0: 7b 0a 20 20 20 20 2f 2a 20 41 20 70 65 6e 64 69  {.    /* A pendi
c1d0: 6e 67 2d 74 65 72 6d 73 20 73 65 67 2d 72 65 61  ng-terms seg-rea
c1e0: 64 65 72 20 66 6f 72 20 61 6e 20 46 54 53 34 20  der for an FTS4 
c1f0: 74 61 62 6c 65 20 74 68 61 74 20 75 73 65 73 20  table that uses 
c200: 6f 72 64 65 72 3d 64 65 73 63 2e 0a 20 20 20 20  order=desc..    
c210: 2a 2a 20 50 65 6e 64 69 6e 67 2d 74 65 72 6d 73  ** Pending-terms
c220: 20 64 6f 63 6c 69 73 74 73 20 61 72 65 20 61 6c   doclists are al
c230: 77 61 79 73 20 62 75 69 6c 74 20 75 70 20 69 6e  ways built up in
c240: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
c250: 2c 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20 68  , so.    ** we h
c260: 61 76 65 20 74 6f 20 69 74 65 72 61 74 65 20 74  ave to iterate t
c270: 68 72 6f 75 67 68 20 74 68 65 6d 20 62 61 63 6b  hrough them back
c280: 77 61 72 64 73 20 68 65 72 65 2e 20 2a 2f 0a 20  wards here. */. 
c290: 20 20 20 75 38 20 62 45 6f 66 20 3d 20 30 3b 0a     u8 bEof = 0;.
c2a0: 20 20 20 20 69 66 28 20 70 70 4f 66 66 73 65 74      if( ppOffset
c2b0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  List ){.      *p
c2c0: 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 70 52  pOffsetList = pR
c2d0: 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69  eader->pOffsetLi
c2e0: 73 74 3b 0a 20 20 20 20 20 20 2a 70 6e 4f 66 66  st;.      *pnOff
c2f0: 73 65 74 4c 69 73 74 20 3d 20 70 52 65 61 64 65  setList = pReade
c300: 72 2d 3e 6e 4f 66 66 73 65 74 4c 69 73 74 20 2d  r->nOffsetList -
c310: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   1;.    }.    sq
c320: 6c 69 74 65 33 46 74 73 33 44 6f 63 6c 69 73 74  lite3Fts3Doclist
c330: 50 72 65 76 28 30 2c 0a 20 20 20 20 20 20 20 20  Prev(0,.        
c340: 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73  pReader->aDoclis
c350: 74 2c 20 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63  t, pReader->nDoc
c360: 6c 69 73 74 2c 20 26 70 2c 20 26 70 52 65 61 64  list, &p, &pRead
c370: 65 72 2d 3e 69 44 6f 63 69 64 2c 0a 20 20 20 20  er->iDocid,.    
c380: 20 20 20 20 26 70 52 65 61 64 65 72 2d 3e 6e 4f      &pReader->nO
c390: 66 66 73 65 74 4c 69 73 74 2c 20 26 62 45 6f 66  ffsetList, &bEof
c3a0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
c3b0: 62 45 6f 66 20 29 7b 0a 20 20 20 20 20 20 70 52  bEof ){.      pR
c3c0: 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69  eader->pOffsetLi
c3d0: 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  st = 0;.    }els
c3e0: 65 7b 0a 20 20 20 20 20 20 70 52 65 61 64 65 72  e{.      pReader
c3f0: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20  ->pOffsetList = 
c400: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  p;.    }.  }else
c410: 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 45 6e 64  {.    char *pEnd
c420: 20 3d 20 26 70 52 65 61 64 65 72 2d 3e 61 44 6f   = &pReader->aDo
c430: 63 6c 69 73 74 5b 70 52 65 61 64 65 72 2d 3e 6e  clist[pReader->n
c440: 44 6f 63 6c 69 73 74 5d 3b 0a 0a 20 20 20 20 2f  Doclist];..    /
c450: 2a 20 50 6f 69 6e 74 65 72 20 70 20 63 75 72 72  * Pointer p curr
c460: 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 61 74 20  ently points at 
c470: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
c480: 66 20 61 6e 20 6f 66 66 73 65 74 20 6c 69 73 74  f an offset list
c490: 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c  . The.    ** fol
c4a0: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 61 64 76  lowing block adv
c4b0: 61 6e 63 65 73 20 69 74 20 74 6f 20 70 6f 69 6e  ances it to poin
c4c0: 74 20 6f 6e 65 20 62 79 74 65 20 70 61 73 74 20  t one byte past 
c4d0: 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a  the end of.    *
c4e0: 2a 20 74 68 65 20 73 61 6d 65 20 6f 66 66 73 65  * the same offse
c4f0: 74 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 77  t list. */.    w
c500: 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 0a 20 20  hile( 1 ){.  .  
c510: 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
c520: 77 69 6e 67 20 6c 69 6e 65 20 6f 66 20 63 6f 64  wing line of cod
c530: 65 20 28 61 6e 64 20 74 68 65 20 22 70 2b 2b 22  e (and the "p++"
c540: 20 62 65 6c 6f 77 20 74 68 65 20 77 68 69 6c 65   below the while
c550: 28 29 20 6c 6f 6f 70 29 20 69 73 0a 20 20 20 20  () loop) is.    
c560: 20 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 6c    ** normally al
c570: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
c580: 65 64 20 74 6f 20 6d 6f 76 65 20 70 6f 69 6e 74  ed to move point
c590: 65 72 20 70 20 74 6f 20 74 68 65 20 64 65 73 69  er p to the desi
c5a0: 72 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 70 6f  red .      ** po
c5b0: 73 69 74 69 6f 6e 2e 20 54 68 65 20 65 78 63 65  sition. The exce
c5c0: 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 69 73  ption is if this
c5d0: 20 6e 6f 64 65 20 69 73 20 62 65 69 6e 67 20 6c   node is being l
c5e0: 6f 61 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 0a  oaded from disk.
c5f0: 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65        ** increme
c600: 6e 74 61 6c 6c 79 20 61 6e 64 20 70 6f 69 6e 74  ntally and point
c610: 65 72 20 22 70 22 20 6e 6f 77 20 70 6f 69 6e 74  er "p" now point
c620: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  s to the first b
c630: 79 74 65 20 70 61 73 73 65 64 0a 20 20 20 20 20  yte passed.     
c640: 20 2a 2a 20 74 68 65 20 70 6f 70 75 6c 61 74 65   ** the populate
c650: 64 20 70 61 72 74 20 6f 66 20 70 52 65 61 64 65  d part of pReade
c660: 72 2d 3e 61 4e 6f 64 65 5b 5d 2e 0a 20 20 20 20  r->aNode[]..    
c670: 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65    */.      while
c680: 28 20 2a 70 20 7c 20 63 20 29 20 63 20 3d 20 2a  ( *p | c ) c = *
c690: 70 2b 2b 20 26 20 30 78 38 30 3b 0a 20 20 20 20  p++ & 0x80;.    
c6a0: 20 20 61 73 73 65 72 74 28 20 2a 70 3d 3d 30 20    assert( *p==0 
c6b0: 29 3b 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20  );.  .      if( 
c6c0: 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 3d 3d  pReader->pBlob==
c6d0: 30 20 7c 7c 20 70 3c 26 70 52 65 61 64 65 72 2d  0 || p<&pReader-
c6e0: 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e  >aNode[pReader->
c6f0: 6e 50 6f 70 75 6c 61 74 65 5d 20 29 20 62 72 65  nPopulate] ) bre
c700: 61 6b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  ak;.      rc = f
c710: 74 73 33 53 65 67 52 65 61 64 65 72 49 6e 63 72  ts3SegReaderIncr
c720: 52 65 61 64 28 70 52 65 61 64 65 72 29 3b 0a 20  Read(pReader);. 
c730: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
c740: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
c750: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2b  rc;.    }.    p+
c760: 2b 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  +;.  .    /* If 
c770: 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61  required, popula
c780: 74 65 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  te the output va
c790: 72 69 61 62 6c 65 73 20 77 69 74 68 20 61 20 70  riables with a p
c7a0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 64 20 74 68  ointer to and th
c7b0: 65 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66  e.    ** size of
c7c0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 66   the previous of
c7d0: 66 73 65 74 2d 6c 69 73 74 2e 0a 20 20 20 20 2a  fset-list..    *
c7e0: 2f 0a 20 20 20 20 69 66 28 20 70 70 4f 66 66 73  /.    if( ppOffs
c7f0: 65 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  etList ){.      
c800: 2a 70 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20  *ppOffsetList = 
c810: 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74  pReader->pOffset
c820: 4c 69 73 74 3b 0a 20 20 20 20 20 20 2a 70 6e 4f  List;.      *pnO
c830: 66 66 73 65 74 4c 69 73 74 20 3d 20 28 69 6e 74  ffsetList = (int
c840: 29 28 70 20 2d 20 70 52 65 61 64 65 72 2d 3e 70  )(p - pReader->p
c850: 4f 66 66 73 65 74 4c 69 73 74 20 2d 20 31 29 3b  OffsetList - 1);
c860: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c  .    }..    whil
c870: 65 28 20 70 3c 70 45 6e 64 20 26 26 20 2a 70 3d  e( p<pEnd && *p=
c880: 3d 30 20 29 20 70 2b 2b 3b 0a 20 20 0a 20 20 20  =0 ) p++;.  .   
c890: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
c8a0: 20 6e 6f 20 6d 6f 72 65 20 65 6e 74 72 69 65 73   no more entries
c8b0: 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 2c   in the doclist,
c8c0: 20 73 65 74 20 70 4f 66 66 73 65 74 4c 69 73 74   set pOffsetList
c8d0: 20 74 6f 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2e   to.    ** NULL.
c8e0: 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20   Otherwise, set 
c8f0: 46 74 73 33 53 65 67 52 65 61 64 65 72 2e 69 44  Fts3SegReader.iD
c900: 6f 63 69 64 20 74 6f 20 74 68 65 20 6e 65 78 74  ocid to the next
c910: 20 64 6f 63 69 64 20 61 6e 64 0a 20 20 20 20 2a   docid and.    *
c920: 2a 20 46 74 73 33 53 65 67 52 65 61 64 65 72 2e  * Fts3SegReader.
c930: 70 4f 66 66 73 65 74 4c 69 73 74 20 74 6f 20 70  pOffsetList to p
c940: 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74  oint to the next
c950: 20 6f 66 66 73 65 74 20 6c 69 73 74 20 62 65 66   offset list bef
c960: 6f 72 65 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  ore.    ** retur
c970: 6e 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ning..    */.   
c980: 20 69 66 28 20 70 3e 3d 70 45 6e 64 20 29 7b 0a   if( p>=pEnd ){.
c990: 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70        pReader->p
c9a0: 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 30 3b 0a  OffsetList = 0;.
c9b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c9c0: 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61   rc = fts3SegRea
c9d0: 64 65 72 52 65 71 75 69 72 65 28 70 52 65 61 64  derRequire(pRead
c9e0: 65 72 2c 20 70 2c 20 46 54 53 33 5f 56 41 52 49  er, p, FTS3_VARI
c9f0: 4e 54 5f 4d 41 58 29 3b 0a 20 20 20 20 20 20 69  NT_MAX);.      i
ca00: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
ca10: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
ca20: 74 65 33 5f 69 6e 74 36 34 20 69 44 65 6c 74 61  te3_int64 iDelta
ca30: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64 65  ;.        pReade
ca40: 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d  r->pOffsetList =
ca50: 20 70 20 2b 20 73 71 6c 69 74 65 33 46 74 73 33   p + sqlite3Fts3
ca60: 47 65 74 56 61 72 69 6e 74 28 70 2c 20 26 69 44  GetVarint(p, &iD
ca70: 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69  elta);.        i
ca80: 66 28 20 70 54 61 62 2d 3e 62 44 65 73 63 49 64  f( pTab->bDescId
ca90: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  x ){.          p
caa0: 52 65 61 64 65 72 2d 3e 69 44 6f 63 69 64 20 2d  Reader->iDocid -
cab0: 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  = iDelta;.      
cac0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
cad0: 20 20 20 70 52 65 61 64 65 72 2d 3e 69 44 6f 63     pReader->iDoc
cae0: 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20  id += iDelta;.  
caf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
cb00: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
cb10: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
cb20: 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  ...int sqlite3Ft
cb30: 73 33 4d 73 72 4f 76 66 6c 28 0a 20 20 46 74 73  s3MsrOvfl(.  Fts
cb40: 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 0a  3Cursor *pCsr, .
cb50: 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65    Fts3MultiSegRe
cb60: 61 64 65 72 20 2a 70 4d 73 72 2c 0a 20 20 69 6e  ader *pMsr,.  in
cb70: 74 20 2a 70 6e 4f 76 66 6c 0a 29 7b 0a 20 20 46  t *pnOvfl.){.  F
cb80: 74 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 28 46  ts3Table *p = (F
cb90: 74 73 33 54 61 62 6c 65 2a 29 70 43 73 72 2d 3e  ts3Table*)pCsr->
cba0: 62 61 73 65 2e 70 56 74 61 62 3b 0a 20 20 69 6e  base.pVtab;.  in
cbb0: 74 20 6e 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69  t nOvfl = 0;.  i
cbc0: 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 72 63 20  nt ii;.  int rc 
cbd0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
cbe0: 6e 74 20 70 67 73 7a 20 3d 20 70 2d 3e 6e 50 67  nt pgsz = p->nPg
cbf0: 73 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  sz;..  assert( p
cc00: 2d 3e 62 46 74 73 34 20 29 3b 0a 20 20 61 73 73  ->bFts4 );.  ass
cc10: 65 72 74 28 20 70 67 73 7a 3e 30 20 29 3b 0a 0a  ert( pgsz>0 );..
cc20: 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d    for(ii=0; rc==
cc30: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c  SQLITE_OK && ii<
cc40: 70 4d 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 20  pMsr->nSegment; 
cc50: 69 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 33 53  ii++){.    Fts3S
cc60: 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 65  egReader *pReade
cc70: 72 20 3d 20 70 4d 73 72 2d 3e 61 70 53 65 67 6d  r = pMsr->apSegm
cc80: 65 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28  ent[ii];.    if(
cc90: 20 21 66 74 73 33 53 65 67 52 65 61 64 65 72 49   !fts3SegReaderI
cca0: 73 50 65 6e 64 69 6e 67 28 70 52 65 61 64 65 72  sPending(pReader
ccb0: 29 20 0a 20 20 20 20 20 26 26 20 21 66 74 73 33  ) .     && !fts3
ccc0: 53 65 67 52 65 61 64 65 72 49 73 52 6f 6f 74 4f  SegReaderIsRootO
ccd0: 6e 6c 79 28 70 52 65 61 64 65 72 29 20 0a 20 20  nly(pReader) .  
cce0: 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
ccf0: 65 33 5f 69 6e 74 36 34 20 6a 6a 3b 0a 20 20 20  e3_int64 jj;.   
cd00: 20 20 20 66 6f 72 28 6a 6a 3d 70 52 65 61 64 65     for(jj=pReade
cd10: 72 2d 3e 69 53 74 61 72 74 42 6c 6f 63 6b 3b 20  r->iStartBlock; 
cd20: 6a 6a 3c 3d 70 52 65 61 64 65 72 2d 3e 69 4c 65  jj<=pReader->iLe
cd30: 61 66 45 6e 64 42 6c 6f 63 6b 3b 20 6a 6a 2b 2b  afEndBlock; jj++
cd40: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
cd50: 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 72 63  Blob;.        rc
cd60: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 52 65   = sqlite3Fts3Re
cd70: 61 64 42 6c 6f 63 6b 28 70 2c 20 6a 6a 2c 20 30  adBlock(p, jj, 0
cd80: 2c 20 26 6e 42 6c 6f 62 2c 20 30 29 3b 0a 20 20  , &nBlob, 0);.  
cd90: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
cda0: 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b  LITE_OK ) break;
cdb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6e 42  .        if( (nB
cdc0: 6c 6f 62 2b 33 35 29 3e 70 67 73 7a 20 29 7b 0a  lob+35)>pgsz ){.
cdd0: 20 20 20 20 20 20 20 20 20 20 6e 4f 76 66 6c 20            nOvfl 
cde0: 2b 3d 20 28 6e 42 6c 6f 62 20 2b 20 33 34 29 2f  += (nBlob + 34)/
cdf0: 70 67 73 7a 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pgsz;.        }.
ce00: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ce10: 7d 0a 20 20 2a 70 6e 4f 76 66 6c 20 3d 20 6e 4f  }.  *pnOvfl = nO
ce20: 76 66 6c 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  vfl;.  return rc
ce30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
ce40: 61 6c 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  all allocations 
ce50: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
ce60: 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  the iterator pas
ce70: 73 65 64 20 61 73 20 74 68 65 20 0a 2a 2a 20 73  sed as the .** s
ce80: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
ce90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
cea0: 74 73 33 53 65 67 52 65 61 64 65 72 46 72 65 65  ts3SegReaderFree
ceb0: 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a  (Fts3SegReader *
cec0: 70 52 65 61 64 65 72 29 7b 0a 20 20 69 66 28 20  pReader){.  if( 
ced0: 70 52 65 61 64 65 72 20 26 26 20 21 66 74 73 33  pReader && !fts3
cee0: 53 65 67 52 65 61 64 65 72 49 73 50 65 6e 64 69  SegReaderIsPendi
cef0: 6e 67 28 70 52 65 61 64 65 72 29 20 29 7b 0a 20  ng(pReader) ){. 
cf00: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
cf10: 70 52 65 61 64 65 72 2d 3e 7a 54 65 72 6d 29 3b  pReader->zTerm);
cf20: 0a 20 20 20 20 69 66 28 20 21 66 74 73 33 53 65  .    if( !fts3Se
cf30: 67 52 65 61 64 65 72 49 73 52 6f 6f 74 4f 6e 6c  gReaderIsRootOnl
cf40: 79 28 70 52 65 61 64 65 72 29 20 29 7b 0a 20 20  y(pReader) ){.  
cf50: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
cf60: 28 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 29  (pReader->aNode)
cf70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
cf80: 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61 64  blob_close(pRead
cf90: 65 72 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 20 20  er->pBlob);.    
cfa0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
cfb0: 66 72 65 65 28 70 52 65 61 64 65 72 29 3b 0a 7d  free(pReader);.}
cfc0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
cfd0: 20 61 20 6e 65 77 20 53 65 67 52 65 61 64 65 72   a new SegReader
cfe0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74 20   object..*/.int 
cff0: 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
d000: 61 64 65 72 4e 65 77 28 0a 20 20 69 6e 74 20 69  aderNew(.  int i
d010: 41 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  Age,            
d020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
d030: 67 6d 65 6e 74 20 22 61 67 65 22 2e 20 2a 2f 0a  gment "age". */.
d040: 20 20 69 6e 74 20 62 4c 6f 6f 6b 75 70 2c 20 20    int bLookup,  
d050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d060: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
d070: 6c 6f 6f 6b 75 70 20 6f 6e 6c 79 20 2a 2f 0a 20  lookup only */. 
d080: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
d090: 53 74 61 72 74 4c 65 61 66 2c 20 20 20 20 20 20  StartLeaf,      
d0a0: 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20 74   /* First leaf t
d0b0: 6f 20 74 72 61 76 65 72 73 65 20 2a 2f 0a 20 20  o traverse */.  
d0c0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45  sqlite3_int64 iE
d0d0: 6e 64 4c 65 61 66 2c 20 20 20 20 20 20 20 20 20  ndLeaf,         
d0e0: 2f 2a 20 46 69 6e 61 6c 20 6c 65 61 66 20 74 6f  /* Final leaf to
d0f0: 20 74 72 61 76 65 72 73 65 20 2a 2f 0a 20 20 73   traverse */.  s
d100: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e  qlite3_int64 iEn
d110: 64 42 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 2f  dBlock,        /
d120: 2a 20 46 69 6e 61 6c 20 62 6c 6f 63 6b 20 6f 66  * Final block of
d130: 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f   segment */.  co
d140: 6e 73 74 20 63 68 61 72 20 2a 7a 52 6f 6f 74 2c  nst char *zRoot,
d150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d160: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
d170: 6e 67 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a  ng root node */.
d180: 20 20 69 6e 74 20 6e 52 6f 6f 74 2c 20 20 20 20    int nRoot,    
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1a0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
d1b0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 72  fer containing r
d1c0: 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 46 74  oot node */.  Ft
d1d0: 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a 70 70  s3SegReader **pp
d1e0: 52 65 61 64 65 72 20 20 20 20 20 20 20 20 2f 2a  Reader        /*
d1f0: 20 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 64 20   OUT: Allocated 
d200: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2f  Fts3SegReader */
d210: 0a 29 7b 0a 20 20 46 74 73 33 53 65 67 52 65 61  .){.  Fts3SegRea
d220: 64 65 72 20 2a 70 52 65 61 64 65 72 3b 20 20 20  der *pReader;   
d230: 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61        /* Newly a
d240: 6c 6c 6f 63 61 74 65 64 20 53 65 67 52 65 61 64  llocated SegRead
d250: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
d260: 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 20 20  nt nExtra = 0;  
d270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d280: 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
d290: 61 74 65 20 73 65 67 6d 65 6e 74 20 72 6f 6f 74  ate segment root
d2a0: 20 6e 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65   node */..  asse
d2b0: 72 74 28 20 69 53 74 61 72 74 4c 65 61 66 3c 3d  rt( iStartLeaf<=
d2c0: 69 45 6e 64 4c 65 61 66 20 29 3b 0a 20 20 69 66  iEndLeaf );.  if
d2d0: 28 20 69 53 74 61 72 74 4c 65 61 66 3d 3d 30 20  ( iStartLeaf==0 
d2e0: 29 7b 0a 20 20 20 20 6e 45 78 74 72 61 20 3d 20  ){.    nExtra = 
d2f0: 6e 52 6f 6f 74 20 2b 20 46 54 53 33 5f 4e 4f 44  nRoot + FTS3_NOD
d300: 45 5f 50 41 44 44 49 4e 47 3b 0a 20 20 7d 0a 0a  E_PADDING;.  }..
d310: 20 20 70 52 65 61 64 65 72 20 3d 20 28 46 74 73    pReader = (Fts
d320: 33 53 65 67 52 65 61 64 65 72 20 2a 29 73 71 6c  3SegReader *)sql
d330: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
d340: 6f 66 28 46 74 73 33 53 65 67 52 65 61 64 65 72  of(Fts3SegReader
d350: 29 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69  ) + nExtra);.  i
d360: 66 28 20 21 70 52 65 61 64 65 72 20 29 7b 0a 20  f( !pReader ){. 
d370: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d380: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65  _NOMEM;.  }.  me
d390: 6d 73 65 74 28 70 52 65 61 64 65 72 2c 20 30 2c  mset(pReader, 0,
d3a0: 20 73 69 7a 65 6f 66 28 46 74 73 33 53 65 67 52   sizeof(Fts3SegR
d3b0: 65 61 64 65 72 29 29 3b 0a 20 20 70 52 65 61 64  eader));.  pRead
d3c0: 65 72 2d 3e 69 49 64 78 20 3d 20 69 41 67 65 3b  er->iIdx = iAge;
d3d0: 0a 20 20 70 52 65 61 64 65 72 2d 3e 62 4c 6f 6f  .  pReader->bLoo
d3e0: 6b 75 70 20 3d 20 62 4c 6f 6f 6b 75 70 3b 0a 20  kup = bLookup;. 
d3f0: 20 70 52 65 61 64 65 72 2d 3e 69 53 74 61 72 74   pReader->iStart
d400: 42 6c 6f 63 6b 20 3d 20 69 53 74 61 72 74 4c 65  Block = iStartLe
d410: 61 66 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 69  af;.  pReader->i
d420: 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 20 3d 20 69  LeafEndBlock = i
d430: 45 6e 64 4c 65 61 66 3b 0a 20 20 70 52 65 61 64  EndLeaf;.  pRead
d440: 65 72 2d 3e 69 45 6e 64 42 6c 6f 63 6b 20 3d 20  er->iEndBlock = 
d450: 69 45 6e 64 42 6c 6f 63 6b 3b 0a 0a 20 20 69 66  iEndBlock;..  if
d460: 28 20 6e 45 78 74 72 61 20 29 7b 0a 20 20 20 20  ( nExtra ){.    
d470: 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 73 65  /* The entire se
d480: 67 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20  gment is stored 
d490: 69 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  in the root node
d4a0: 2e 20 2a 2f 0a 20 20 20 20 70 52 65 61 64 65 72  . */.    pReader
d4b0: 2d 3e 61 4e 6f 64 65 20 3d 20 28 63 68 61 72 20  ->aNode = (char 
d4c0: 2a 29 26 70 52 65 61 64 65 72 5b 31 5d 3b 0a 20  *)&pReader[1];. 
d4d0: 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64     pReader->nNod
d4e0: 65 20 3d 20 6e 52 6f 6f 74 3b 0a 20 20 20 20 6d  e = nRoot;.    m
d4f0: 65 6d 63 70 79 28 70 52 65 61 64 65 72 2d 3e 61  emcpy(pReader->a
d500: 4e 6f 64 65 2c 20 7a 52 6f 6f 74 2c 20 6e 52 6f  Node, zRoot, nRo
d510: 6f 74 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ot);.    memset(
d520: 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b  &pReader->aNode[
d530: 6e 52 6f 6f 74 5d 2c 20 30 2c 20 46 54 53 33 5f  nRoot], 0, FTS3_
d540: 4e 4f 44 45 5f 50 41 44 44 49 4e 47 29 3b 0a 20  NODE_PADDING);. 
d550: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 61   }else{.    pRea
d560: 64 65 72 2d 3e 69 43 75 72 72 65 6e 74 42 6c 6f  der->iCurrentBlo
d570: 63 6b 20 3d 20 69 53 74 61 72 74 4c 65 61 66 2d  ck = iStartLeaf-
d580: 31 3b 0a 20 20 7d 0a 20 20 2a 70 70 52 65 61 64  1;.  }.  *ppRead
d590: 65 72 20 3d 20 70 52 65 61 64 65 72 3b 0a 20 20  er = pReader;.  
d5a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d5b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
d5c0: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
d5d0: 66 75 6e 63 74 69 6f 6e 20 75 73 65 64 20 61 73  function used as
d5e0: 20 61 20 71 73 6f 72 74 28 29 20 63 61 6c 6c 62   a qsort() callb
d5f0: 61 63 6b 20 77 68 65 6e 20 73 6f 72 74 69 6e 67  ack when sorting
d600: 0a 2a 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20  .** an array of 
d610: 70 65 6e 64 69 6e 67 20 74 65 72 6d 73 20 62 79  pending terms by
d620: 20 74 65 72 6d 2e 20 54 68 69 73 20 6f 63 63 75   term. This occu
d630: 72 73 20 61 73 20 70 61 72 74 20 6f 66 20 66 6c  rs as part of fl
d640: 75 73 68 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f  ushing.** the co
d650: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 65  ntents of the pe
d660: 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68  nding-terms hash
d670: 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 64 61   table to the da
d680: 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
d690: 63 20 69 6e 74 20 66 74 73 33 43 6f 6d 70 61 72  c int fts3Compar
d6a0: 65 45 6c 65 6d 42 79 54 65 72 6d 28 63 6f 6e 73  eElemByTerm(cons
d6b0: 74 20 76 6f 69 64 20 2a 6c 68 73 2c 20 63 6f 6e  t void *lhs, con
d6c0: 73 74 20 76 6f 69 64 20 2a 72 68 73 29 7b 0a 20  st void *rhs){. 
d6d0: 20 63 68 61 72 20 2a 7a 31 20 3d 20 66 74 73 33   char *z1 = fts3
d6e0: 48 61 73 68 4b 65 79 28 2a 28 46 74 73 33 48 61  HashKey(*(Fts3Ha
d6f0: 73 68 45 6c 65 6d 20 2a 2a 29 6c 68 73 29 3b 0a  shElem **)lhs);.
d700: 20 20 63 68 61 72 20 2a 7a 32 20 3d 20 66 74 73    char *z2 = fts
d710: 33 48 61 73 68 4b 65 79 28 2a 28 46 74 73 33 48  3HashKey(*(Fts3H
d720: 61 73 68 45 6c 65 6d 20 2a 2a 29 72 68 73 29 3b  ashElem **)rhs);
d730: 0a 20 20 69 6e 74 20 6e 31 20 3d 20 66 74 73 33  .  int n1 = fts3
d740: 48 61 73 68 4b 65 79 73 69 7a 65 28 2a 28 46 74  HashKeysize(*(Ft
d750: 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29 6c 68  s3HashElem **)lh
d760: 73 29 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20 66  s);.  int n2 = f
d770: 74 73 33 48 61 73 68 4b 65 79 73 69 7a 65 28 2a  ts3HashKeysize(*
d780: 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a  (Fts3HashElem **
d790: 29 72 68 73 29 3b 0a 0a 20 20 69 6e 74 20 6e 20  )rhs);..  int n 
d7a0: 3d 20 28 6e 31 3c 6e 32 20 3f 20 6e 31 20 3a 20  = (n1<n2 ? n1 : 
d7b0: 6e 32 29 3b 0a 20 20 69 6e 74 20 63 20 3d 20 6d  n2);.  int c = m
d7c0: 65 6d 63 6d 70 28 7a 31 2c 20 7a 32 2c 20 6e 29  emcmp(z1, z2, n)
d7d0: 3b 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a  ;.  if( c==0 ){.
d7e0: 20 20 20 20 63 20 3d 20 6e 31 20 2d 20 6e 32 3b      c = n1 - n2;
d7f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 3b  .  }.  return c;
d800: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
d810: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
d820: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 20 46  to allocate an F
d830: 74 73 33 53 65 67 52 65 61 64 65 72 20 74 68 61  ts3SegReader tha
d840: 74 20 69 74 65 72 61 74 65 73 20 74 68 72 6f 75  t iterates throu
d850: 67 68 0a 2a 2a 20 61 20 73 75 62 73 65 74 20 6f  gh.** a subset o
d860: 66 20 74 68 65 20 74 65 72 6d 73 20 73 74 6f 72  f the terms stor
d870: 65 64 20 69 6e 20 74 68 65 20 46 74 73 33 54 61  ed in the Fts3Ta
d880: 62 6c 65 2e 70 65 6e 64 69 6e 67 54 65 72 6d 73  ble.pendingTerms
d890: 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66   array..**.** If
d8a0: 20 74 68 65 20 69 73 50 72 65 66 69 78 49 74 65   the isPrefixIte
d8b0: 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 7a  r parameter is z
d8c0: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ero, then the re
d8d0: 74 75 72 6e 65 64 20 53 65 67 52 65 61 64 65 72  turned SegReader
d8e0: 20 69 74 65 72 61 74 65 73 0a 2a 2a 20 74 68 72   iterates.** thr
d8f0: 6f 75 67 68 20 65 61 63 68 20 74 65 72 6d 20 69  ough each term i
d900: 6e 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65  n the pending-te
d910: 72 6d 73 20 74 61 62 6c 65 2e 20 4f 72 2c 20 69  rms table. Or, i
d920: 66 20 69 73 50 72 65 66 69 78 49 74 65 72 20 69  f isPrefixIter i
d930: 73 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69  s.** non-zero, i
d940: 74 20 69 74 65 72 61 74 65 73 20 74 68 72 6f 75  t iterates throu
d950: 67 68 20 65 61 63 68 20 74 65 72 6d 20 61 6e 64  gh each term and
d960: 20 69 74 73 20 70 72 65 66 69 78 65 73 2e 20 46   its prefixes. F
d970: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a  or example, if.*
d980: 2a 20 74 68 65 20 70 65 6e 64 69 6e 67 20 74 65  * the pending te
d990: 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65 20 63  rms hash table c
d9a0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 72 6d  ontains the term
d9b0: 73 20 22 73 71 6c 69 74 65 22 2c 20 22 6d 79 73  s "sqlite", "mys
d9c0: 71 6c 22 20 61 6e 64 0a 2a 2a 20 22 66 69 72 65  ql" and.** "fire
d9d0: 62 69 72 64 22 2c 20 74 68 65 6e 20 74 68 65 20  bird", then the 
d9e0: 69 74 65 72 61 74 6f 72 20 76 69 73 69 74 73 20  iterator visits 
d9f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 27 74  the following 't
da00: 65 72 6d 73 27 20 28 69 6e 20 74 68 65 20 6f 72  erms' (in the or
da10: 64 65 72 0a 2a 2a 20 73 68 6f 77 6e 29 3a 0a 2a  der.** shown):.*
da20: 2a 0a 2a 2a 20 20 20 66 20 66 69 20 66 69 72 20  *.**   f fi fir 
da30: 66 69 72 65 20 66 69 72 65 62 20 66 69 72 65 62  fire fireb fireb
da40: 69 20 66 69 72 65 62 69 72 20 66 69 72 65 62 69  i firebir firebi
da50: 72 64 0a 2a 2a 20 20 20 6d 20 6d 79 20 6d 79 73  rd.**   m my mys
da60: 20 6d 79 73 71 20 6d 79 73 71 6c 0a 2a 2a 20 20   mysq mysql.**  
da70: 20 73 20 73 71 20 73 71 6c 20 73 71 6c 69 20 73   s sq sql sqli s
da80: 71 6c 69 74 20 73 71 6c 69 74 65 0a 2a 2a 0a 2a  qlit sqlite.**.*
da90: 2a 20 57 68 65 72 65 61 73 20 69 66 20 69 73 50  * Whereas if isP
daa0: 72 65 66 69 78 49 74 65 72 20 69 73 20 7a 65 72  refixIter is zer
dab0: 6f 2c 20 74 68 65 20 74 65 72 6d 73 20 76 69 73  o, the terms vis
dac0: 69 74 65 64 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20  ited are:.**.** 
dad0: 20 20 66 69 72 65 62 69 72 64 20 6d 79 73 71 6c    firebird mysql
dae0: 20 73 71 6c 69 74 65 0a 2a 2f 0a 69 6e 74 20 73   sqlite.*/.int s
daf0: 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61  qlite3Fts3SegRea
db00: 64 65 72 50 65 6e 64 69 6e 67 28 0a 20 20 46 74  derPending(.  Ft
db10: 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
db30: 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68   Virtual table h
db40: 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  andle */.  int i
db50: 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20  Index,          
db60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
db70: 64 65 78 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65  dex for p->aInde
db80: 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  x */.  const cha
db90: 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20  r *zTerm,       
dba0: 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74         /* Term t
dbb0: 6f 20 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a  o search for */.
dbc0: 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20    int nTerm,    
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbe0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
dbf0: 66 65 72 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 69  fer zTerm */.  i
dc00: 6e 74 20 62 50 72 65 66 69 78 2c 20 20 20 20 20  nt bPrefix,     
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dc20: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 70 72 65  * True for a pre
dc30: 66 69 78 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a  fix iterator */.
dc40: 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
dc50: 2a 2a 70 70 52 65 61 64 65 72 20 20 20 20 20 20  **ppReader      
dc60: 20 20 2f 2a 20 4f 55 54 3a 20 53 65 67 52 65 61    /* OUT: SegRea
dc70: 64 65 72 20 66 6f 72 20 70 65 6e 64 69 6e 67 2d  der for pending-
dc80: 74 65 72 6d 73 20 2a 2f 0a 29 7b 0a 20 20 46 74  terms */.){.  Ft
dc90: 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 65  s3SegReader *pRe
dca0: 61 64 65 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a  ader = 0;     /*
dcb0: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 6f   Fts3SegReader o
dcc0: 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72 6e 20  bject to return 
dcd0: 2a 2f 0a 20 20 46 74 73 33 48 61 73 68 45 6c 65  */.  Fts3HashEle
dce0: 6d 20 2a 70 45 3b 20 20 20 20 20 20 20 20 20 20  m *pE;          
dcf0: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
dd00: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 46   variable */.  F
dd10: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 61 45  ts3HashElem **aE
dd20: 6c 65 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  lem = 0;       /
dd30: 2a 20 41 72 72 61 79 20 6f 66 20 74 65 72 6d 20  * Array of term 
dd40: 68 61 73 68 20 65 6e 74 72 69 65 73 20 74 6f 20  hash entries to 
dd50: 73 63 61 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  scan */.  int nE
dd60: 6c 65 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20  lem = 0;        
dd70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
dd80: 65 20 6f 66 20 61 72 72 61 79 20 61 74 20 61 45  e of array at aE
dd90: 6c 65 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  lem */.  int rc 
dda0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
ddb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
ddc0: 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 46 74 73  rn Code */.  Fts
ddd0: 33 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20  3Hash *pHash;.. 
dde0: 20 70 48 61 73 68 20 3d 20 26 70 2d 3e 61 49 6e   pHash = &p->aIn
ddf0: 64 65 78 5b 69 49 6e 64 65 78 5d 2e 68 50 65 6e  dex[iIndex].hPen
de00: 64 69 6e 67 3b 0a 20 20 69 66 28 20 62 50 72 65  ding;.  if( bPre
de10: 66 69 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  fix ){.    int n
de20: 41 6c 6c 6f 63 20 3d 20 30 3b 20 20 20 20 20 20  Alloc = 0;      
de30: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
de40: 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 61 72   of allocated ar
de50: 72 61 79 20 61 74 20 61 45 6c 65 6d 20 2a 2f 0a  ray at aElem */.
de60: 0a 20 20 20 20 66 6f 72 28 70 45 3d 66 74 73 33  .    for(pE=fts3
de70: 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29  HashFirst(pHash)
de80: 3b 20 70 45 3b 20 70 45 3d 66 74 73 33 48 61 73  ; pE; pE=fts3Has
de90: 68 4e 65 78 74 28 70 45 29 29 7b 0a 20 20 20 20  hNext(pE)){.    
dea0: 20 20 63 68 61 72 20 2a 7a 4b 65 79 20 3d 20 28    char *zKey = (
deb0: 63 68 61 72 20 2a 29 66 74 73 33 48 61 73 68 4b  char *)fts3HashK
dec0: 65 79 28 70 45 29 3b 0a 20 20 20 20 20 20 69 6e  ey(pE);.      in
ded0: 74 20 6e 4b 65 79 20 3d 20 66 74 73 33 48 61 73  t nKey = fts3Has
dee0: 68 4b 65 79 73 69 7a 65 28 70 45 29 3b 0a 20 20  hKeysize(pE);.  
def0: 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d 30      if( nTerm==0
df00: 20 7c 7c 20 28 6e 4b 65 79 3e 3d 6e 54 65 72 6d   || (nKey>=nTerm
df10: 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 4b   && 0==memcmp(zK
df20: 65 79 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  ey, zTerm, nTerm
df30: 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  )) ){.        if
df40: 28 20 6e 45 6c 65 6d 3d 3d 6e 41 6c 6c 6f 63 20  ( nElem==nAlloc 
df50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 46 74 73  ){.          Fts
df60: 33 48 61 73 68 45 6c 65 6d 20 2a 2a 61 45 6c 65  3HashElem **aEle
df70: 6d 32 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 41  m2;.          nA
df80: 6c 6c 6f 63 20 2b 3d 20 31 36 3b 0a 20 20 20 20  lloc += 16;.    
df90: 20 20 20 20 20 20 61 45 6c 65 6d 32 20 3d 20 28        aElem2 = (
dfa0: 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29  Fts3HashElem **)
dfb0: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
dfc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
dfd0: 45 6c 65 6d 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a  Elem, nAlloc*siz
dfe0: 65 6f 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d  eof(Fts3HashElem
dff0: 20 2a 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b   *).          );
e000: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
e010: 61 45 6c 65 6d 32 20 29 7b 0a 20 20 20 20 20 20  aElem2 ){.      
e020: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
e030: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
e040: 20 20 20 20 20 6e 45 6c 65 6d 20 3d 20 30 3b 0a       nElem = 0;.
e050: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
e060: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
e070: 20 20 20 20 20 20 20 20 20 61 45 6c 65 6d 20 3d           aElem =
e080: 20 61 45 6c 65 6d 32 3b 0a 20 20 20 20 20 20 20   aElem2;.       
e090: 20 7d 0a 0a 20 20 20 20 20 20 20 20 61 45 6c 65   }..        aEle
e0a0: 6d 5b 6e 45 6c 65 6d 2b 2b 5d 20 3d 20 70 45 3b  m[nElem++] = pE;
e0b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
e0c0: 20 20 20 20 2f 2a 20 49 66 20 6d 6f 72 65 20 74      /* If more t
e0d0: 68 61 6e 20 6f 6e 65 20 74 65 72 6d 20 6d 61 74  han one term mat
e0e0: 63 68 65 73 20 74 68 65 20 70 72 65 66 69 78 2c  ches the prefix,
e0f0: 20 73 6f 72 74 20 74 68 65 20 46 74 73 33 48 61   sort the Fts3Ha
e100: 73 68 45 6c 65 6d 0a 20 20 20 20 2a 2a 20 6f 62  shElem.    ** ob
e110: 6a 65 63 74 73 20 69 6e 20 74 65 72 6d 20 6f 72  jects in term or
e120: 64 65 72 20 75 73 69 6e 67 20 71 73 6f 72 74 28  der using qsort(
e130: 29 2e 20 54 68 69 73 20 75 73 65 73 20 74 68 65  ). This uses the
e140: 20 73 61 6d 65 20 63 6f 6d 70 61 72 69 73 6f 6e   same comparison
e150: 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b  .    ** callback
e160: 20 61 73 20 69 73 20 75 73 65 64 20 77 68 65 6e   as is used when
e170: 20 66 6c 75 73 68 69 6e 67 20 74 65 72 6d 73 20   flushing terms 
e180: 74 6f 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a  to disk..    */.
e190: 20 20 20 20 69 66 28 20 6e 45 6c 65 6d 3e 31 20      if( nElem>1 
e1a0: 29 7b 0a 20 20 20 20 20 20 71 73 6f 72 74 28 61  ){.      qsort(a
e1b0: 45 6c 65 6d 2c 20 6e 45 6c 65 6d 2c 20 73 69 7a  Elem, nElem, siz
e1c0: 65 6f 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d  eof(Fts3HashElem
e1d0: 20 2a 29 2c 20 66 74 73 33 43 6f 6d 70 61 72 65   *), fts3Compare
e1e0: 45 6c 65 6d 42 79 54 65 72 6d 29 3b 0a 20 20 20  ElemByTerm);.   
e1f0: 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   }..  }else{.   
e200: 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20 69 73   /* The query is
e210: 20 61 20 73 69 6d 70 6c 65 20 74 65 72 6d 20 6c   a simple term l
e220: 6f 6f 6b 75 70 20 74 68 61 74 20 6d 61 74 63 68  ookup that match
e230: 65 73 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 74  es at most one t
e240: 65 72 6d 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  erm in.    ** th
e250: 65 20 69 6e 64 65 78 2e 20 41 6c 6c 20 74 68 61  e index. All tha
e260: 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69 73  t is required is
e270: 20 61 20 73 74 72 61 69 67 68 74 20 68 61 73 68   a straight hash
e280: 2d 6c 6f 6f 6b 75 70 2e 20 0a 20 20 20 20 2a 2a  -lookup. .    **
e290: 0a 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20  .    ** Because 
e2a0: 74 68 65 20 73 74 61 63 6b 20 61 64 64 72 65 73  the stack addres
e2b0: 73 20 6f 66 20 70 45 20 6d 61 79 20 62 65 20 61  s of pE may be a
e2c0: 63 63 65 73 73 65 64 20 76 69 61 20 74 68 65 20  ccessed via the 
e2d0: 61 45 6c 65 6d 20 70 6f 69 6e 74 65 72 0a 20 20  aElem pointer.  
e2e0: 20 20 2a 2a 20 62 65 6c 6f 77 2c 20 74 68 65 20    ** below, the 
e2f0: 22 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 70  "Fts3HashElem *p
e300: 45 22 20 6d 75 73 74 20 62 65 20 64 65 63 6c 61  E" must be decla
e310: 72 65 64 20 73 6f 20 74 68 61 74 20 69 74 20 69  red so that it i
e320: 73 20 76 61 6c 69 64 0a 20 20 20 20 2a 2a 20 77  s valid.    ** w
e330: 69 74 68 69 6e 20 74 68 69 73 20 65 6e 74 69 72  ithin this entir
e340: 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6e 6f 74 20  e function, not 
e350: 6a 75 73 74 20 74 68 69 73 20 22 65 6c 73 65 7b  just this "else{
e360: 2e 2e 2e 7d 22 20 62 6c 6f 63 6b 2e 0a 20 20 20  ...}" block..   
e370: 20 2a 2f 0a 20 20 20 20 70 45 20 3d 20 66 74 73   */.    pE = fts
e380: 33 48 61 73 68 46 69 6e 64 45 6c 65 6d 28 70 48  3HashFindElem(pH
e390: 61 73 68 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  ash, zTerm, nTer
e3a0: 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 45 20 29  m);.    if( pE )
e3b0: 7b 0a 20 20 20 20 20 20 61 45 6c 65 6d 20 3d 20  {.      aElem = 
e3c0: 26 70 45 3b 0a 20 20 20 20 20 20 6e 45 6c 65 6d  &pE;.      nElem
e3d0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
e3e0: 0a 20 20 69 66 28 20 6e 45 6c 65 6d 3e 30 20 29  .  if( nElem>0 )
e3f0: 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  {.    int nByte 
e400: 3d 20 73 69 7a 65 6f 66 28 46 74 73 33 53 65 67  = sizeof(Fts3Seg
e410: 52 65 61 64 65 72 29 20 2b 20 28 6e 45 6c 65 6d  Reader) + (nElem
e420: 2b 31 29 2a 73 69 7a 65 6f 66 28 46 74 73 33 48  +1)*sizeof(Fts3H
e430: 61 73 68 45 6c 65 6d 20 2a 29 3b 0a 20 20 20 20  ashElem *);.    
e440: 70 52 65 61 64 65 72 20 3d 20 28 46 74 73 33 53  pReader = (Fts3S
e450: 65 67 52 65 61 64 65 72 20 2a 29 73 71 6c 69 74  egReader *)sqlit
e460: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29  e3_malloc(nByte)
e470: 3b 0a 20 20 20 20 69 66 28 20 21 70 52 65 61 64  ;.    if( !pRead
e480: 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  er ){.      rc =
e490: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
e4a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e4b0: 6d 65 6d 73 65 74 28 70 52 65 61 64 65 72 2c 20  memset(pReader, 
e4c0: 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  0, nByte);.     
e4d0: 20 70 52 65 61 64 65 72 2d 3e 69 49 64 78 20 3d   pReader->iIdx =
e4e0: 20 30 78 37 46 46 46 46 46 46 46 3b 0a 20 20 20   0x7FFFFFFF;.   
e4f0: 20 20 20 70 52 65 61 64 65 72 2d 3e 70 70 4e 65     pReader->ppNe
e500: 78 74 45 6c 65 6d 20 3d 20 28 46 74 73 33 48 61  xtElem = (Fts3Ha
e510: 73 68 45 6c 65 6d 20 2a 2a 29 26 70 52 65 61 64  shElem **)&pRead
e520: 65 72 5b 31 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  er[1];.      mem
e530: 63 70 79 28 70 52 65 61 64 65 72 2d 3e 70 70 4e  cpy(pReader->ppN
e540: 65 78 74 45 6c 65 6d 2c 20 61 45 6c 65 6d 2c 20  extElem, aElem, 
e550: 6e 45 6c 65 6d 2a 73 69 7a 65 6f 66 28 46 74 73  nElem*sizeof(Fts
e560: 33 48 61 73 68 45 6c 65 6d 20 2a 29 29 3b 0a 20  3HashElem *));. 
e570: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
e580: 62 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20 73  bPrefix ){.    s
e590: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 45 6c 65  qlite3_free(aEle
e5a0: 6d 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 52 65 61  m);.  }.  *ppRea
e5b0: 64 65 72 20 3d 20 70 52 65 61 64 65 72 3b 0a 20  der = pReader;. 
e5c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e5d0: 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
e5e0: 20 65 6e 74 72 69 65 73 20 70 6f 69 6e 74 65 64   entries pointed
e5f0: 20 74 6f 20 62 79 20 74 77 6f 20 46 74 73 33 53   to by two Fts3S
e600: 65 67 52 65 61 64 65 72 20 73 74 72 75 63 74 75  egReader structu
e610: 72 65 73 2e 20 0a 2a 2a 20 43 6f 6d 70 61 72 69  res. .** Compari
e620: 73 6f 6e 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  son is as follow
e630: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 45 4f  s:.**.**   1) EO
e640: 46 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  F is greater tha
e650: 6e 20 6e 6f 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  n not EOF..**.**
e660: 20 20 20 32 29 20 54 68 65 20 63 75 72 72 65 6e     2) The curren
e670: 74 20 74 65 72 6d 73 20 28 69 66 20 61 6e 79 29  t terms (if any)
e680: 20 61 72 65 20 63 6f 6d 70 61 72 65 64 20 75 73   are compared us
e690: 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66  ing memcmp(). If
e6a0: 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 74 65 72   one.**      ter
e6b0: 6d 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66  m is a prefix of
e6c0: 20 61 6e 6f 74 68 65 72 2c 20 74 68 65 20 6c 6f   another, the lo
e6d0: 6e 67 65 72 20 74 65 72 6d 20 69 73 20 63 6f 6e  nger term is con
e6e0: 73 69 64 65 72 65 64 20 74 68 65 0a 2a 2a 20 20  sidered the.**  
e6f0: 20 20 20 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a      larger..**.*
e700: 2a 20 20 20 33 29 20 42 79 20 73 65 67 6d 65 6e  *   3) By segmen
e710: 74 20 61 67 65 2e 20 41 6e 20 6f 6c 64 65 72 20  t age. An older 
e720: 73 65 67 6d 65 6e 74 20 69 73 20 63 6f 6e 73 69  segment is consi
e730: 64 65 72 65 64 20 6c 61 72 67 65 72 2e 0a 2a 2f  dered larger..*/
e740: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
e750: 53 65 67 52 65 61 64 65 72 43 6d 70 28 46 74 73  SegReaderCmp(Fts
e760: 33 53 65 67 52 65 61 64 65 72 20 2a 70 4c 68 73  3SegReader *pLhs
e770: 2c 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20  , Fts3SegReader 
e780: 2a 70 52 68 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRhs){.  int rc
e790: 3b 0a 20 20 69 66 28 20 70 4c 68 73 2d 3e 61 4e  ;.  if( pLhs->aN
e7a0: 6f 64 65 20 26 26 20 70 52 68 73 2d 3e 61 4e 6f  ode && pRhs->aNo
e7b0: 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  de ){.    int rc
e7c0: 32 20 3d 20 70 4c 68 73 2d 3e 6e 54 65 72 6d 20  2 = pLhs->nTerm 
e7d0: 2d 20 70 52 68 73 2d 3e 6e 54 65 72 6d 3b 0a 20  - pRhs->nTerm;. 
e7e0: 20 20 20 69 66 28 20 72 63 32 3c 30 20 29 7b 0a     if( rc2<0 ){.
e7f0: 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d        rc = memcm
e800: 70 28 70 4c 68 73 2d 3e 7a 54 65 72 6d 2c 20 70  p(pLhs->zTerm, p
e810: 52 68 73 2d 3e 7a 54 65 72 6d 2c 20 70 4c 68 73  Rhs->zTerm, pLhs
e820: 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20 7d 65  ->nTerm);.    }e
e830: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
e840: 6d 65 6d 63 6d 70 28 70 4c 68 73 2d 3e 7a 54 65  memcmp(pLhs->zTe
e850: 72 6d 2c 20 70 52 68 73 2d 3e 7a 54 65 72 6d 2c  rm, pRhs->zTerm,
e860: 20 70 52 68 73 2d 3e 6e 54 65 72 6d 29 3b 0a 20   pRhs->nTerm);. 
e870: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
e880: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
e890: 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   rc2;.    }.  }e
e8a0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 28 70  lse{.    rc = (p
e8b0: 4c 68 73 2d 3e 61 4e 6f 64 65 3d 3d 30 29 20 2d  Lhs->aNode==0) -
e8c0: 20 28 70 52 68 73 2d 3e 61 4e 6f 64 65 3d 3d 30   (pRhs->aNode==0
e8d0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
e8e0: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  =0 ){.    rc = p
e8f0: 52 68 73 2d 3e 69 49 64 78 20 2d 20 70 4c 68 73  Rhs->iIdx - pLhs
e900: 2d 3e 69 49 64 78 3b 0a 20 20 7d 0a 20 20 61 73  ->iIdx;.  }.  as
e910: 73 65 72 74 28 20 72 63 21 3d 30 20 29 3b 0a 20  sert( rc!=0 );. 
e920: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e930: 2a 0a 2a 2a 20 41 20 64 69 66 66 65 72 65 6e 74  *.** A different
e940: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
e950: 74 69 6f 6e 20 66 6f 72 20 53 65 67 52 65 61 64  tion for SegRead
e960: 65 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 49  er structures. I
e970: 6e 20 74 68 69 73 0a 2a 2a 20 76 65 72 73 69 6f  n this.** versio
e980: 6e 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  n, it is assumed
e990: 20 74 68 61 74 20 65 61 63 68 20 53 65 67 52 65   that each SegRe
e9a0: 61 64 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 61  ader points to a
e9b0: 6e 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 61 20  n entry in.** a 
e9c0: 64 6f 63 6c 69 73 74 20 66 6f 72 20 69 64 65 6e  doclist for iden
e9d0: 74 69 63 61 6c 20 74 65 72 6d 73 2e 20 43 6f 6d  tical terms. Com
e9e0: 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20  parison is made 
e9f0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
ea00: 2a 20 20 20 31 29 20 45 4f 46 20 28 65 6e 64 20  *   1) EOF (end 
ea10: 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 74 68  of doclist in th
ea20: 69 73 20 63 61 73 65 29 20 69 73 20 67 72 65 61  is case) is grea
ea30: 74 65 72 20 74 68 61 6e 20 6e 6f 74 20 45 4f 46  ter than not EOF
ea40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 42 79 20  ..**.**   2) By 
ea50: 63 75 72 72 65 6e 74 20 64 6f 63 69 64 2e 0a 2a  current docid..*
ea60: 2a 0a 2a 2a 20 20 20 33 29 20 42 79 20 73 65 67  *.**   3) By seg
ea70: 6d 65 6e 74 20 61 67 65 2e 20 41 6e 20 6f 6c 64  ment age. An old
ea80: 65 72 20 73 65 67 6d 65 6e 74 20 69 73 20 63 6f  er segment is co
ea90: 6e 73 69 64 65 72 65 64 20 6c 61 72 67 65 72 2e  nsidered larger.
eaa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
eab0: 74 73 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c  ts3SegReaderDocl
eac0: 69 73 74 43 6d 70 28 46 74 73 33 53 65 67 52 65  istCmp(Fts3SegRe
ead0: 61 64 65 72 20 2a 70 4c 68 73 2c 20 46 74 73 33  ader *pLhs, Fts3
eae0: 53 65 67 52 65 61 64 65 72 20 2a 70 52 68 73 29  SegReader *pRhs)
eaf0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 28 70 4c  {.  int rc = (pL
eb00: 68 73 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3d  hs->pOffsetList=
eb10: 3d 30 29 2d 28 70 52 68 73 2d 3e 70 4f 66 66 73  =0)-(pRhs->pOffs
eb20: 65 74 4c 69 73 74 3d 3d 30 29 3b 0a 20 20 69 66  etList==0);.  if
eb30: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ( rc==0 ){.    i
eb40: 66 28 20 70 4c 68 73 2d 3e 69 44 6f 63 69 64 3d  f( pLhs->iDocid=
eb50: 3d 70 52 68 73 2d 3e 69 44 6f 63 69 64 20 29 7b  =pRhs->iDocid ){
eb60: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 52 68 73  .      rc = pRhs
eb70: 2d 3e 69 49 64 78 20 2d 20 70 4c 68 73 2d 3e 69  ->iIdx - pLhs->i
eb80: 49 64 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Idx;.    }else{.
eb90: 20 20 20 20 20 20 72 63 20 3d 20 28 70 4c 68 73        rc = (pLhs
eba0: 2d 3e 69 44 6f 63 69 64 20 3e 20 70 52 68 73 2d  ->iDocid > pRhs-
ebb0: 3e 69 44 6f 63 69 64 29 20 3f 20 31 20 3a 20 2d  >iDocid) ? 1 : -
ebc0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  1;.    }.  }.  a
ebd0: 73 73 65 72 74 28 20 70 4c 68 73 2d 3e 61 4e 6f  ssert( pLhs->aNo
ebe0: 64 65 20 26 26 20 70 52 68 73 2d 3e 61 4e 6f 64  de && pRhs->aNod
ebf0: 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  e );.  return rc
ec00: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66  ;.}.static int f
ec10: 74 73 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c  ts3SegReaderDocl
ec20: 69 73 74 43 6d 70 52 65 76 28 46 74 73 33 53 65  istCmpRev(Fts3Se
ec30: 67 52 65 61 64 65 72 20 2a 70 4c 68 73 2c 20 46  gReader *pLhs, F
ec40: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 52  ts3SegReader *pR
ec50: 68 73 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  hs){.  int rc = 
ec60: 28 70 4c 68 73 2d 3e 70 4f 66 66 73 65 74 4c 69  (pLhs->pOffsetLi
ec70: 73 74 3d 3d 30 29 2d 28 70 52 68 73 2d 3e 70 4f  st==0)-(pRhs->pO
ec80: 66 66 73 65 74 4c 69 73 74 3d 3d 30 29 3b 0a 20  ffsetList==0);. 
ec90: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
eca0: 20 20 69 66 28 20 70 4c 68 73 2d 3e 69 44 6f 63    if( pLhs->iDoc
ecb0: 69 64 3d 3d 70 52 68 73 2d 3e 69 44 6f 63 69 64  id==pRhs->iDocid
ecc0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
ecd0: 52 68 73 2d 3e 69 49 64 78 20 2d 20 70 4c 68 73  Rhs->iIdx - pLhs
ece0: 2d 3e 69 49 64 78 3b 0a 20 20 20 20 7d 65 6c 73  ->iIdx;.    }els
ecf0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 70  e{.      rc = (p
ed00: 4c 68 73 2d 3e 69 44 6f 63 69 64 20 3c 20 70 52  Lhs->iDocid < pR
ed10: 68 73 2d 3e 69 44 6f 63 69 64 29 20 3f 20 31 20  hs->iDocid) ? 1 
ed20: 3a 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  : -1;.    }.  }.
ed30: 20 20 61 73 73 65 72 74 28 20 70 4c 68 73 2d 3e    assert( pLhs->
ed40: 61 4e 6f 64 65 20 26 26 20 70 52 68 73 2d 3e 61  aNode && pRhs->a
ed50: 4e 6f 64 65 20 29 3b 0a 20 20 72 65 74 75 72 6e  Node );.  return
ed60: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
ed70: 6d 70 61 72 65 20 74 68 65 20 74 65 72 6d 20 74  mpare the term t
ed80: 68 61 74 20 74 68 65 20 46 74 73 33 53 65 67 52  hat the Fts3SegR
ed90: 65 61 64 65 72 20 6f 62 6a 65 63 74 20 70 61 73  eader object pas
eda0: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
edb0: 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 70 6f 69   argument.** poi
edc0: 6e 74 73 20 74 6f 20 77 69 74 68 20 74 68 65 20  nts to with the 
edd0: 74 65 72 6d 20 73 70 65 63 69 66 69 65 64 20 62  term specified b
ede0: 79 20 61 72 67 75 6d 65 6e 74 73 20 7a 54 65 72  y arguments zTer
edf0: 6d 20 61 6e 64 20 6e 54 65 72 6d 2e 20 0a 2a 2a  m and nTerm. .**
ee00: 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 67 20  .** If the pSeg 
ee10: 69 74 65 72 61 74 6f 72 20 69 73 20 61 6c 72 65  iterator is alre
ee20: 61 64 79 20 61 74 20 45 4f 46 2c 20 72 65 74 75  ady at EOF, retu
ee30: 72 6e 20 30 2e 20 4f 74 68 65 72 77 69 73 65 2c  rn 0. Otherwise,
ee40: 20 72 65 74 75 72 6e 0a 2a 2a 20 2d 76 65 20 69   return.** -ve i
ee50: 66 20 74 68 65 20 70 53 65 67 20 74 65 72 6d 20  f the pSeg term 
ee60: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 54 65  is less than zTe
ee70: 72 6d 2f 6e 54 65 72 6d 2c 20 30 20 69 66 20 74  rm/nTerm, 0 if t
ee80: 68 65 20 74 77 6f 20 74 65 72 6d 73 20 61 72 65  he two terms are
ee90: 0a 2a 2a 20 65 71 75 61 6c 2c 20 6f 72 20 2b 76  .** equal, or +v
eea0: 65 20 69 66 20 74 68 65 20 70 53 65 67 20 74 65  e if the pSeg te
eeb0: 72 6d 20 69 73 20 67 72 65 61 74 65 72 20 74 68  rm is greater th
eec0: 61 6e 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 0a  an zTerm/nTerm..
eed0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
eee0: 73 33 53 65 67 52 65 61 64 65 72 54 65 72 6d 43  s3SegReaderTermC
eef0: 6d 70 28 0a 20 20 46 74 73 33 53 65 67 52 65 61  mp(.  Fts3SegRea
ef00: 64 65 72 20 2a 70 53 65 67 2c 20 20 20 20 20 20  der *pSeg,      
ef10: 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74        /* Segment
ef20: 20 72 65 61 64 65 72 20 6f 62 6a 65 63 74 20 2a   reader object *
ef30: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
ef40: 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  zTerm,          
ef50: 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 63      /* Term to c
ef60: 6f 6d 70 61 72 65 20 74 6f 20 2a 2f 0a 20 20 69  ompare to */.  i
ef70: 6e 74 20 6e 54 65 72 6d 20 20 20 20 20 20 20 20  nt nTerm        
ef80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ef90: 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 7a  * Size of term z
efa0: 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f  Term in bytes */
efb0: 0a 29 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20  .){.  int res = 
efc0: 30 3b 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 61  0;.  if( pSeg->a
efd0: 4e 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Node ){.    if( 
efe0: 70 53 65 67 2d 3e 6e 54 65 72 6d 3e 6e 54 65 72  pSeg->nTerm>nTer
eff0: 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d  m ){.      res =
f000: 20 6d 65 6d 63 6d 70 28 70 53 65 67 2d 3e 7a 54   memcmp(pSeg->zT
f010: 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  erm, zTerm, nTer
f020: 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  m);.    }else{. 
f030: 20 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d       res = memcm
f040: 70 28 70 53 65 67 2d 3e 7a 54 65 72 6d 2c 20 7a  p(pSeg->zTerm, z
f050: 54 65 72 6d 2c 20 70 53 65 67 2d 3e 6e 54 65 72  Term, pSeg->nTer
f060: 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  m);.    }.    if
f070: 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
f080: 20 20 72 65 73 20 3d 20 70 53 65 67 2d 3e 6e 54    res = pSeg->nT
f090: 65 72 6d 2d 6e 54 65 72 6d 3b 0a 20 20 20 20 7d  erm-nTerm;.    }
f0a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
f0b0: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75  s;.}../*.** Argu
f0c0: 6d 65 6e 74 20 61 70 53 65 67 6d 65 6e 74 20 69  ment apSegment i
f0d0: 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 53  s an array of nS
f0e0: 65 67 6d 65 6e 74 20 65 6c 65 6d 65 6e 74 73 2e  egment elements.
f0f0: 20 49 74 20 69 73 20 6b 6e 6f 77 6e 20 74 68 61   It is known tha
f100: 74 0a 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 28  t.** the final (
f110: 6e 53 65 67 6d 65 6e 74 2d 6e 53 75 73 70 65 63  nSegment-nSuspec
f120: 74 29 20 6d 65 6d 62 65 72 73 20 61 72 65 20 61  t) members are a
f130: 6c 72 65 61 64 79 20 69 6e 20 73 6f 72 74 65 64  lready in sorted
f140: 20 6f 72 64 65 72 0a 2a 2a 20 28 61 63 63 6f 72   order.** (accor
f150: 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 70  ding to the comp
f160: 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
f170: 70 72 6f 76 69 64 65 64 29 2e 20 54 68 69 73 20  provided). This 
f180: 66 75 6e 63 74 69 6f 6e 20 73 68 75 66 66 6c 65  function shuffle
f190: 73 0a 2a 2a 20 74 68 65 20 61 72 72 61 79 20 61  s.** the array a
f1a0: 72 6f 75 6e 64 20 75 6e 74 69 6c 20 61 6c 6c 20  round until all 
f1b0: 65 6e 74 72 69 65 73 20 61 72 65 20 69 6e 20 73  entries are in s
f1c0: 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a  orted order..*/.
f1d0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
f1e0: 53 65 67 52 65 61 64 65 72 53 6f 72 74 28 0a 20  SegReaderSort(. 
f1f0: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
f200: 2a 61 70 53 65 67 6d 65 6e 74 2c 20 20 20 20 20  *apSegment,     
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f220: 2f 2a 20 41 72 72 61 79 20 74 6f 20 73 6f 72 74  /* Array to sort
f230: 20 65 6e 74 72 69 65 73 20 6f 66 20 2a 2f 0a 20   entries of */. 
f240: 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 2c 20 20   int nSegment,  
f250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f270: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 70 53 65 67  /* Size of apSeg
f280: 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20  ment array */.  
f290: 69 6e 74 20 6e 53 75 73 70 65 63 74 2c 20 20 20  int nSuspect,   
f2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f2c0: 2a 20 55 6e 73 6f 72 74 65 64 20 65 6e 74 72 79  * Unsorted entry
f2d0: 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 69 6e 74 20   count */.  int 
f2e0: 28 2a 78 43 6d 70 29 28 46 74 73 33 53 65 67 52  (*xCmp)(Fts3SegR
f2f0: 65 61 64 65 72 20 2a 2c 20 46 74 73 33 53 65 67  eader *, Fts3Seg
f300: 52 65 61 64 65 72 20 2a 29 20 20 2f 2a 20 43 6f  Reader *)  /* Co
f310: 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
f320: 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  n */.){.  int i;
f330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
f350: 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
f360: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 53 75  /..  assert( nSu
f370: 73 70 65 63 74 3c 3d 6e 53 65 67 6d 65 6e 74 20  spect<=nSegment 
f380: 29 3b 0a 0a 20 20 69 66 28 20 6e 53 75 73 70 65  );..  if( nSuspe
f390: 63 74 3d 3d 6e 53 65 67 6d 65 6e 74 20 29 20 6e  ct==nSegment ) n
f3a0: 53 75 73 70 65 63 74 2d 2d 3b 0a 20 20 66 6f 72  Suspect--;.  for
f3b0: 28 69 3d 6e 53 75 73 70 65 63 74 2d 31 3b 20 69  (i=nSuspect-1; i
f3c0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
f3d0: 6e 74 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  nt j;.    for(j=
f3e0: 69 3b 20 6a 3c 28 6e 53 65 67 6d 65 6e 74 2d 31  i; j<(nSegment-1
f3f0: 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 46  ); j++){.      F
f400: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 54  ts3SegReader *pT
f410: 6d 70 3b 0a 20 20 20 20 20 20 69 66 28 20 78 43  mp;.      if( xC
f420: 6d 70 28 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2c  mp(apSegment[j],
f430: 20 61 70 53 65 67 6d 65 6e 74 5b 6a 2b 31 5d 29   apSegment[j+1])
f440: 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  <0 ) break;.    
f450: 20 20 70 54 6d 70 20 3d 20 61 70 53 65 67 6d 65    pTmp = apSegme
f460: 6e 74 5b 6a 2b 31 5d 3b 0a 20 20 20 20 20 20 61  nt[j+1];.      a
f470: 70 53 65 67 6d 65 6e 74 5b 6a 2b 31 5d 20 3d 20  pSegment[j+1] = 
f480: 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 3b 0a 20 20  apSegment[j];.  
f490: 20 20 20 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d      apSegment[j]
f4a0: 20 3d 20 70 54 6d 70 3b 0a 20 20 20 20 7d 0a 20   = pTmp;.    }. 
f4b0: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   }..#ifndef NDEB
f4c0: 55 47 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  UG.  /* Check th
f4d0: 61 74 20 74 68 65 20 6c 69 73 74 20 72 65 61 6c  at the list real
f4e0: 6c 79 20 69 73 20 73 6f 72 74 65 64 20 6e 6f 77  ly is sorted now
f4f0: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
f500: 69 3c 28 6e 53 75 73 70 65 63 74 2d 31 29 3b 20  i<(nSuspect-1); 
f510: 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
f520: 28 20 78 43 6d 70 28 61 70 53 65 67 6d 65 6e 74  ( xCmp(apSegment
f530: 5b 69 5d 2c 20 61 70 53 65 67 6d 65 6e 74 5b 69  [i], apSegment[i
f540: 2b 31 5d 29 3c 30 20 29 3b 0a 20 20 7d 0a 23 65  +1])<0 );.  }.#e
f550: 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 49  ndif.}../* .** I
f560: 6e 73 65 72 74 20 61 20 72 65 63 6f 72 64 20 69  nsert a record i
f570: 6e 74 6f 20 74 68 65 20 25 5f 73 65 67 6d 65 6e  nto the %_segmen
f580: 74 73 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ts table..*/.sta
f590: 74 69 63 20 69 6e 74 20 66 74 73 33 57 72 69 74  tic int fts3Writ
f5a0: 65 53 65 67 6d 65 6e 74 28 0a 20 20 46 74 73 33  eSegment(.  Fts3
f5b0: 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
f5c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
f5d0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
f5e0: 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dle */.  sqlite3
f5f0: 5f 69 6e 74 36 34 20 69 42 6c 6f 63 6b 2c 20 20  _int64 iBlock,  
f600: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63           /* Bloc
f610: 6b 20 69 64 20 66 6f 72 20 6e 65 77 20 62 6c 6f  k id for new blo
f620: 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 2c  ck */.  char *z,
f630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f640: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
f650: 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e  er to buffer con
f660: 74 61 69 6e 69 6e 67 20 62 6c 6f 63 6b 20 64 61  taining block da
f670: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20  ta */.  int n   
f680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f690: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
f6a0: 6f 66 20 62 75 66 66 65 72 20 7a 20 69 6e 20 62  of buffer z in b
f6b0: 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ytes */.){.  sql
f6c0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
f6d0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73  ;.  int rc = fts
f6e0: 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
f6f0: 49 4e 53 45 52 54 5f 53 45 47 4d 45 4e 54 53 2c  INSERT_SEGMENTS,
f700: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69   &pStmt, 0);.  i
f710: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
f720: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
f730: 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
f740: 2c 20 31 2c 20 69 42 6c 6f 63 6b 29 3b 0a 20 20  , 1, iBlock);.  
f750: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62    sqlite3_bind_b
f760: 6c 6f 62 28 70 53 74 6d 74 2c 20 32 2c 20 7a 2c  lob(pStmt, 2, z,
f770: 20 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49   n, SQLITE_STATI
f780: 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  C);.    sqlite3_
f790: 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20  step(pStmt);.   
f7a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
f7b0: 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a  set(pStmt);.  }.
f7c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f7d0: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 6c  /*.** Find the l
f7e0: 61 72 67 65 73 74 20 72 65 6c 61 74 69 76 65 20  argest relative 
f7f0: 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20 69 6e 20  level number in 
f800: 74 68 65 20 74 61 62 6c 65 2e 20 49 66 20 73 75  the table. If su
f810: 63 63 65 73 73 66 75 6c 2c 20 73 65 74 0a 2a 2a  ccessful, set.**
f820: 20 2a 70 6e 4d 61 78 20 74 6f 20 74 68 69 73 20   *pnMax to this 
f830: 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75 72 6e  value and return
f840: 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65   SQLITE_OK. Othe
f850: 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72  rwise, if an err
f860: 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 65  or occurs,.** se
f870: 74 20 2a 70 6e 4d 61 78 20 74 6f 20 7a 65 72 6f  t *pnMax to zero
f880: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53   and return an S
f890: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
f8a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f8b0: 46 74 73 33 4d 61 78 4c 65 76 65 6c 28 46 74 73  Fts3MaxLevel(Fts
f8c0: 33 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 2a  3Table *p, int *
f8d0: 70 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 72 63  pnMax){.  int rc
f8e0: 3b 0a 20 20 69 6e 74 20 6d 78 4c 65 76 65 6c 20  ;.  int mxLevel 
f8f0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  = 0;.  sqlite3_s
f900: 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
f910: 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
f920: 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43  tmt(p, SQL_SELEC
f930: 54 5f 4d 58 4c 45 56 45 4c 2c 20 26 70 53 74 6d  T_MXLEVEL, &pStm
f940: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  t, 0);.  if( rc=
f950: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f960: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
f970: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
f980: 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 6d  Stmt) ){.      m
f990: 78 4c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  xLevel = sqlite3
f9a0: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
f9b0: 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  t, 0);.    }.   
f9c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
f9d0: 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a  set(pStmt);.  }.
f9e0: 20 20 2a 70 6e 4d 61 78 20 3d 20 6d 78 4c 65 76    *pnMax = mxLev
f9f0: 65 6c 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  el;.  return rc;
fa00: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 49 6e 73 65 72  .}../* .** Inser
fa10: 74 20 61 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  t a record into 
fa20: 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62  the %_segdir tab
fa30: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
fa40: 74 20 66 74 73 33 57 72 69 74 65 53 65 67 64 69  t fts3WriteSegdi
fa50: 72 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  r(.  Fts3Table *
fa60: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
fa70: 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
fa80: 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
fa90: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
faa0: 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20  iLevel,         
fab0: 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22    /* Value for "
fac0: 6c 65 76 65 6c 22 20 66 69 65 6c 64 20 28 61 62  level" field (ab
fad0: 73 6f 6c 75 74 65 20 6c 65 76 65 6c 29 20 2a 2f  solute level) */
fae0: 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20  .  int iIdx,    
faf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb00: 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20     /* Value for 
fb10: 22 69 64 78 22 20 66 69 65 6c 64 20 2a 2f 0a 20  "idx" field */. 
fb20: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
fb30: 53 74 61 72 74 42 6c 6f 63 6b 2c 20 20 20 20 20  StartBlock,     
fb40: 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 73   /* Value for "s
fb50: 74 61 72 74 5f 62 6c 6f 63 6b 22 20 66 69 65 6c  tart_block" fiel
fb60: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  d */.  sqlite3_i
fb70: 6e 74 36 34 20 69 4c 65 61 66 45 6e 64 42 6c 6f  nt64 iLeafEndBlo
fb80: 63 6b 2c 20 20 20 20 2f 2a 20 56 61 6c 75 65 20  ck,    /* Value 
fb90: 66 6f 72 20 22 6c 65 61 76 65 73 5f 65 6e 64 5f  for "leaves_end_
fba0: 62 6c 6f 63 6b 22 20 66 69 65 6c 64 20 2a 2f 0a  block" field */.
fbb0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
fbc0: 69 45 6e 64 42 6c 6f 63 6b 2c 20 20 20 20 20 20  iEndBlock,      
fbd0: 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22    /* Value for "
fbe0: 65 6e 64 5f 62 6c 6f 63 6b 22 20 66 69 65 6c 64  end_block" field
fbf0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 6f 6f   */.  char *zRoo
fc00: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
fc10: 20 20 20 20 20 20 2f 2a 20 42 6c 6f 62 20 76 61        /* Blob va
fc20: 6c 75 65 20 66 6f 72 20 22 72 6f 6f 74 22 20 66  lue for "root" f
fc30: 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ield */.  int nR
fc40: 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20 20 20  oot             
fc50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
fc60: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
fc70: 62 75 66 66 65 72 20 7a 52 6f 6f 74 20 2a 2f 0a  buffer zRoot */.
fc80: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
fc90: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
fca0: 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
fcb0: 28 70 2c 20 53 51 4c 5f 49 4e 53 45 52 54 5f 53  (p, SQL_INSERT_S
fcc0: 45 47 44 49 52 2c 20 26 70 53 74 6d 74 2c 20 30  EGDIR, &pStmt, 0
fcd0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
fce0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
fcf0: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
fd00: 28 70 53 74 6d 74 2c 20 31 2c 20 69 4c 65 76 65  (pStmt, 1, iLeve
fd10: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
fd20: 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20  bind_int(pStmt, 
fd30: 32 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 73 71  2, iIdx);.    sq
fd40: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
fd50: 28 70 53 74 6d 74 2c 20 33 2c 20 69 53 74 61 72  (pStmt, 3, iStar
fd60: 74 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 73 71 6c  tBlock);.    sql
fd70: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
fd80: 70 53 74 6d 74 2c 20 34 2c 20 69 4c 65 61 66 45  pStmt, 4, iLeafE
fd90: 6e 64 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 73 71  ndBlock);.    sq
fda0: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
fdb0: 28 70 53 74 6d 74 2c 20 35 2c 20 69 45 6e 64 42  (pStmt, 5, iEndB
fdc0: 6c 6f 63 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  lock);.    sqlit
fdd0: 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74  e3_bind_blob(pSt
fde0: 6d 74 2c 20 36 2c 20 7a 52 6f 6f 74 2c 20 6e 52  mt, 6, zRoot, nR
fdf0: 6f 6f 74 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  oot, SQLITE_STAT
fe00: 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  IC);.    sqlite3
fe10: 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
fe20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
fe30: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 7d  eset(pStmt);.  }
fe40: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
fe50: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
fe60: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63 6f  e size of the co
fe70: 6d 6d 6f 6e 20 70 72 65 66 69 78 20 28 69 66 20  mmon prefix (if 
fe80: 61 6e 79 29 20 73 68 61 72 65 64 20 62 79 20 7a  any) shared by z
fe90: 50 72 65 76 20 61 6e 64 0a 2a 2a 20 7a 4e 65 78  Prev and.** zNex
fea0: 74 2c 20 69 6e 20 62 79 74 65 73 2e 20 46 6f 72  t, in bytes. For
feb0: 20 65 78 61 6d 70 6c 65 2c 20 0a 2a 2a 0a 2a 2a   example, .**.**
fec0: 20 20 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d     fts3PrefixCom
fed0: 70 72 65 73 73 28 22 61 62 63 22 2c 20 33 2c 20  press("abc", 3, 
fee0: 22 61 62 63 64 65 66 22 2c 20 36 29 20 20 20 2f  "abcdef", 6)   /
fef0: 2f 20 72 65 74 75 72 6e 73 20 33 0a 2a 2a 20 20  / returns 3.**  
ff00: 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72   fts3PrefixCompr
ff10: 65 73 73 28 22 61 62 58 22 2c 20 33 2c 20 22 61  ess("abX", 3, "a
ff20: 62 63 64 65 66 22 2c 20 36 29 20 20 20 2f 2f 20  bcdef", 6)   // 
ff30: 72 65 74 75 72 6e 73 20 32 0a 2a 2a 20 20 20 66  returns 2.**   f
ff40: 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73  ts3PrefixCompres
ff50: 73 28 22 61 62 58 22 2c 20 33 2c 20 22 58 62 63  s("abX", 3, "Xbc
ff60: 64 65 66 22 2c 20 36 29 20 20 20 2f 2f 20 72 65  def", 6)   // re
ff70: 74 75 72 6e 73 20 30 0a 2a 2f 0a 73 74 61 74 69  turns 0.*/.stati
ff80: 63 20 69 6e 74 20 66 74 73 33 50 72 65 66 69 78  c int fts3Prefix
ff90: 43 6f 6d 70 72 65 73 73 28 0a 20 20 63 6f 6e 73  Compress(.  cons
ffa0: 74 20 63 68 61 72 20 2a 7a 50 72 65 76 2c 20 20  t char *zPrev,  
ffb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
ffc0: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
ffd0: 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 2a   previous term *
ffe0: 2f 0a 20 20 69 6e 74 20 6e 50 72 65 76 2c 20 20  /.  int nPrev,  
fff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10000 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
10010 75 66 66 65 72 20 7a 50 72 65 76 20 69 6e 20 62  uffer zPrev in b
10020 79 74 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ytes */.  const 
10030 63 68 61 72 20 2a 7a 4e 65 78 74 2c 20 20 20 20  char *zNext,    
10040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
10050 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e  fer containing n
10060 65 78 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  ext term */.  in
10070 74 20 6e 4e 65 78 74 20 20 20 20 20 20 20 20 20  t nNext         
10080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10090 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
100a0 7a 4e 65 78 74 20 69 6e 20 62 79 74 65 73 20 2a  zNext in bytes *
100b0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  /.){.  int n;.  
100c0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
100d0 28 6e 4e 65 78 74 29 3b 0a 20 20 66 6f 72 28 6e  (nNext);.  for(n
100e0 3d 30 3b 20 6e 3c 6e 50 72 65 76 20 26 26 20 7a  =0; n<nPrev && z
100f0 50 72 65 76 5b 6e 5d 3d 3d 7a 4e 65 78 74 5b 6e  Prev[n]==zNext[n
10100 5d 3b 20 6e 2b 2b 29 3b 0a 20 20 72 65 74 75 72  ]; n++);.  retur
10110 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n n;.}../*.** Ad
10120 64 20 74 65 72 6d 20 7a 54 65 72 6d 20 74 6f 20  d term zTerm to 
10130 74 68 65 20 53 65 67 6d 65 6e 74 4e 6f 64 65 2e  the SegmentNode.
10140 20 49 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   It is guarantee
10150 64 20 74 68 61 74 20 7a 54 65 72 6d 20 69 73 20  d that zTerm is 
10160 6c 61 72 67 65 72 0a 2a 2a 20 28 61 63 63 6f 72  larger.** (accor
10170 64 69 6e 67 20 74 6f 20 6d 65 6d 63 6d 70 29 20  ding to memcmp) 
10180 74 68 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75  than the previou
10190 73 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69  s term..*/.stati
101a0 63 20 69 6e 74 20 66 74 73 33 4e 6f 64 65 41 64  c int fts3NodeAd
101b0 64 54 65 72 6d 28 0a 20 20 46 74 73 33 54 61 62  dTerm(.  Fts3Tab
101c0 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
101d0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74           /* Virt
101e0 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  ual table handle
101f0 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64   */.  SegmentNod
10200 65 20 2a 2a 70 70 54 72 65 65 2c 20 20 20 20 20  e **ppTree,     
10210 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
10220 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 68 61 6e   SegmentNode han
10230 64 6c 65 20 2a 2f 20 0a 20 20 69 6e 74 20 69 73  dle */ .  int is
10240 43 6f 70 79 54 65 72 6d 2c 20 20 20 20 20 20 20  CopyTerm,       
10250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
10260 65 20 69 66 20 7a 54 65 72 6d 2f 6e 54 65 72 6d  e if zTerm/nTerm
10270 20 69 73 20 74 72 61 6e 73 69 65 6e 74 20 2a 2f   is transient */
10280 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
10290 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
102a0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
102b0 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
102c0 6e 67 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  ng term */.  int
102d0 20 6e 54 65 72 6d 20 20 20 20 20 20 20 20 20 20   nTerm          
102e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
102f0 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e 20  Size of term in 
10300 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 65  bytes */.){.  Se
10310 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65  gmentNode *pTree
10320 20 3d 20 2a 70 70 54 72 65 65 3b 0a 20 20 69 6e   = *ppTree;.  in
10330 74 20 72 63 3b 0a 20 20 53 65 67 6d 65 6e 74 4e  t rc;.  SegmentN
10340 6f 64 65 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a  ode *pNew;..  /*
10350 20 46 69 72 73 74 20 74 72 79 20 74 6f 20 61 70   First try to ap
10360 70 65 6e 64 20 74 68 65 20 74 65 72 6d 20 74 6f  pend the term to
10370 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64   the current nod
10380 65 2e 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20  e. Return early 
10390 69 66 20 0a 20 20 2a 2a 20 74 68 69 73 20 69 73  if .  ** this is
103a0 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a   possible..  */.
103b0 20 20 69 66 28 20 70 54 72 65 65 20 29 7b 0a 20    if( pTree ){. 
103c0 20 20 20 69 6e 74 20 6e 44 61 74 61 20 3d 20 70     int nData = p
103d0 54 72 65 65 2d 3e 6e 44 61 74 61 3b 20 20 20 20  Tree->nData;    
103e0 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65   /* Current size
103f0 20 6f 66 20 6e 6f 64 65 20 69 6e 20 62 79 74 65   of node in byte
10400 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65  s */.    int nRe
10410 71 20 3d 20 6e 44 61 74 61 3b 20 20 20 20 20 20  q = nData;      
10420 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72         /* Requir
10430 65 64 20 73 70 61 63 65 20 61 66 74 65 72 20 61  ed space after a
10440 64 64 69 6e 67 20 7a 54 65 72 6d 20 2a 2f 0a 20  dding zTerm */. 
10450 20 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20     int nPrefix; 
10460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10470 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
10480 74 65 73 20 6f 66 20 70 72 65 66 69 78 20 63 6f  tes of prefix co
10490 6d 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  mpression */.   
104a0 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 20 20 20   int nSuffix;   
104b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
104c0 2a 20 53 75 66 66 69 78 20 6c 65 6e 67 74 68 20  * Suffix length 
104d0 2a 2f 0a 0a 20 20 20 20 6e 50 72 65 66 69 78 20  */..    nPrefix 
104e0 3d 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70  = fts3PrefixComp
104f0 72 65 73 73 28 70 54 72 65 65 2d 3e 7a 54 65 72  ress(pTree->zTer
10500 6d 2c 20 70 54 72 65 65 2d 3e 6e 54 65 72 6d 2c  m, pTree->nTerm,
10510 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   zTerm, nTerm);.
10520 20 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54      nSuffix = nT
10530 65 72 6d 2d 6e 50 72 65 66 69 78 3b 0a 0a 20 20  erm-nPrefix;..  
10540 20 20 6e 52 65 71 20 2b 3d 20 73 71 6c 69 74 65    nReq += sqlite
10550 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e  3Fts3VarintLen(n
10560 50 72 65 66 69 78 29 2b 73 71 6c 69 74 65 33 46  Prefix)+sqlite3F
10570 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 53 75  ts3VarintLen(nSu
10580 66 66 69 78 29 2b 6e 53 75 66 66 69 78 3b 0a 20  ffix)+nSuffix;. 
10590 20 20 20 69 66 28 20 6e 52 65 71 3c 3d 70 2d 3e     if( nReq<=p->
105a0 6e 4e 6f 64 65 53 69 7a 65 20 7c 7c 20 21 70 54  nNodeSize || !pT
105b0 72 65 65 2d 3e 7a 54 65 72 6d 20 29 7b 0a 0a 20  ree->zTerm ){.. 
105c0 20 20 20 20 20 69 66 28 20 6e 52 65 71 3e 70 2d       if( nReq>p-
105d0 3e 6e 4e 6f 64 65 53 69 7a 65 20 29 7b 0a 20 20  >nNodeSize ){.  
105e0 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 75 73        /* An unus
105f0 75 61 6c 20 63 61 73 65 3a 20 74 68 69 73 20 69  ual case: this i
10600 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
10610 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
10620 74 68 65 20 6e 6f 64 65 0a 20 20 20 20 20 20 20  the node.       
10630 20 2a 2a 20 61 6e 64 20 74 68 65 20 73 74 61 74   ** and the stat
10640 69 63 20 6e 6f 64 65 20 62 75 66 66 65 72 20 28  ic node buffer (
10650 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 62 79 74  p->nNodeSize byt
10660 65 73 29 20 69 73 20 6e 6f 74 20 6c 61 72 67 65  es) is not large
10670 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 6e 6f 75  .        ** enou
10680 67 68 2e 20 55 73 65 20 61 20 73 65 70 61 72 61  gh. Use a separa
10690 74 65 6c 79 20 6d 61 6c 6c 6f 63 65 64 20 62 75  tely malloced bu
106a0 66 66 65 72 20 69 6e 73 74 65 61 64 20 54 68 69  ffer instead Thi
106b0 73 20 77 61 73 74 65 73 0a 20 20 20 20 20 20 20  s wastes.       
106c0 20 2a 2a 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65   ** p->nNodeSize
106d0 20 62 79 74 65 73 2c 20 62 75 74 20 73 69 6e 63   bytes, but sinc
106e0 65 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20  e this scenario 
106f0 6f 6e 6c 79 20 63 6f 6d 65 73 20 61 62 6f 75 74  only comes about
10700 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   when.        **
10710 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
10720 6e 74 61 69 6e 20 74 77 6f 20 74 65 72 6d 73 20  ntain two terms 
10730 74 68 61 74 20 73 68 61 72 65 20 61 20 70 72 65  that share a pre
10740 66 69 78 20 6f 66 20 61 6c 6d 6f 73 74 20 32 4b  fix of almost 2K
10750 42 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  B, .        ** t
10760 68 69 73 20 69 73 20 6e 6f 74 20 65 78 70 65 63  his is not expec
10770 74 65 64 20 74 6f 20 62 65 20 61 20 73 65 72 69  ted to be a seri
10780 6f 75 73 20 70 72 6f 62 6c 65 6d 2e 20 0a 20 20  ous problem. .  
10790 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
107a0 20 61 73 73 65 72 74 28 20 70 54 72 65 65 2d 3e   assert( pTree->
107b0 61 44 61 74 61 3d 3d 28 63 68 61 72 20 2a 29 26  aData==(char *)&
107c0 70 54 72 65 65 5b 31 5d 20 29 3b 0a 20 20 20 20  pTree[1] );.    
107d0 20 20 20 20 70 54 72 65 65 2d 3e 61 44 61 74 61      pTree->aData
107e0 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
107f0 65 33 5f 6d 61 6c 6c 6f 63 28 6e 52 65 71 29 3b  e3_malloc(nReq);
10800 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 54  .        if( !pT
10810 72 65 65 2d 3e 61 44 61 74 61 20 29 7b 0a 20 20  ree->aData ){.  
10820 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
10830 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
10840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
10850 20 20 20 20 20 20 69 66 28 20 70 54 72 65 65 2d        if( pTree-
10860 3e 7a 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20  >zTerm ){.      
10870 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
10880 20 70 72 65 66 69 78 2d 6c 65 6e 67 74 68 20 66   prefix-length f
10890 69 65 6c 64 20 66 6f 72 20 66 69 72 73 74 20 74  ield for first t
108a0 65 72 6d 20 69 6e 20 61 20 6e 6f 64 65 20 2a 2f  erm in a node */
108b0 0a 20 20 20 20 20 20 20 20 6e 44 61 74 61 20 2b  .        nData +
108c0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74  = sqlite3Fts3Put
108d0 56 61 72 69 6e 74 28 26 70 54 72 65 65 2d 3e 61  Varint(&pTree->a
108e0 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 6e 50 72  Data[nData], nPr
108f0 65 66 69 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  efix);.      }..
10900 20 20 20 20 20 20 6e 44 61 74 61 20 2b 3d 20 73        nData += s
10910 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72  qlite3Fts3PutVar
10920 69 6e 74 28 26 70 54 72 65 65 2d 3e 61 44 61 74  int(&pTree->aDat
10930 61 5b 6e 44 61 74 61 5d 2c 20 6e 53 75 66 66 69  a[nData], nSuffi
10940 78 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  x);.      memcpy
10950 28 26 70 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e  (&pTree->aData[n
10960 44 61 74 61 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50  Data], &zTerm[nP
10970 72 65 66 69 78 5d 2c 20 6e 53 75 66 66 69 78 29  refix], nSuffix)
10980 3b 0a 20 20 20 20 20 20 70 54 72 65 65 2d 3e 6e  ;.      pTree->n
10990 44 61 74 61 20 3d 20 6e 44 61 74 61 20 2b 20 6e  Data = nData + n
109a0 53 75 66 66 69 78 3b 0a 20 20 20 20 20 20 70 54  Suffix;.      pT
109b0 72 65 65 2d 3e 6e 45 6e 74 72 79 2b 2b 3b 0a 0a  ree->nEntry++;..
109c0 20 20 20 20 20 20 69 66 28 20 69 73 43 6f 70 79        if( isCopy
109d0 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Term ){.        
109e0 69 66 28 20 70 54 72 65 65 2d 3e 6e 4d 61 6c 6c  if( pTree->nMall
109f0 6f 63 3c 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20  oc<nTerm ){.    
10a00 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77        char *zNew
10a10 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
10a20 6f 63 28 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f  oc(pTree->zMallo
10a30 63 2c 20 6e 54 65 72 6d 2a 32 29 3b 0a 20 20 20  c, nTerm*2);.   
10a40 20 20 20 20 20 20 20 69 66 28 20 21 7a 4e 65 77         if( !zNew
10a50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
10a60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
10a70 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  MEM;.          }
10a80 0a 20 20 20 20 20 20 20 20 20 20 70 54 72 65 65  .          pTree
10a90 2d 3e 6e 4d 61 6c 6c 6f 63 20 3d 20 6e 54 65 72  ->nMalloc = nTer
10aa0 6d 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70  m*2;.          p
10ab0 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20  Tree->zMalloc = 
10ac0 7a 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  zNew;.        }.
10ad0 20 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e 7a          pTree->z
10ae0 54 65 72 6d 20 3d 20 70 54 72 65 65 2d 3e 7a 4d  Term = pTree->zM
10af0 61 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 20 20 6d  alloc;.        m
10b00 65 6d 63 70 79 28 70 54 72 65 65 2d 3e 7a 54 65  emcpy(pTree->zTe
10b10 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  rm, zTerm, nTerm
10b20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 72 65 65  );.        pTree
10b30 2d 3e 6e 54 65 72 6d 20 3d 20 6e 54 65 72 6d 3b  ->nTerm = nTerm;
10b40 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10b50 20 20 20 20 20 20 70 54 72 65 65 2d 3e 7a 54 65        pTree->zTe
10b60 72 6d 20 3d 20 28 63 68 61 72 20 2a 29 7a 54 65  rm = (char *)zTe
10b70 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 72 65  rm;.        pTre
10b80 65 2d 3e 6e 54 65 72 6d 20 3d 20 6e 54 65 72 6d  e->nTerm = nTerm
10b90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10ba0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10bb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
10bc0 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f  * If control flo
10bd0 77 73 20 74 6f 20 68 65 72 65 2c 20 69 74 20 77  ws to here, it w
10be0 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  as not possible 
10bf0 74 6f 20 61 70 70 65 6e 64 20 7a 54 65 72 6d 20  to append zTerm 
10c00 74 6f 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  to the.  ** curr
10c10 65 6e 74 20 6e 6f 64 65 2e 20 43 72 65 61 74 65  ent node. Create
10c20 20 61 20 6e 65 77 20 6e 6f 64 65 20 28 61 20 72   a new node (a r
10c30 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20  ight-sibling of 
10c40 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65  the current node
10c50 29 2e 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  )..  ** If this 
10c60 69 73 20 74 68 65 20 66 69 72 73 74 20 6e 6f 64  is the first nod
10c70 65 20 69 6e 20 74 68 65 20 74 72 65 65 2c 20 74  e in the tree, t
10c80 68 65 20 74 65 72 6d 20 69 73 20 61 64 64 65 64  he term is added
10c90 20 74 6f 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a   to it..  **.  *
10ca0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  * Otherwise, the
10cb0 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 61 64 64   term is not add
10cc0 65 64 20 74 6f 20 74 68 65 20 6e 65 77 20 6e 6f  ed to the new no
10cd0 64 65 2c 20 69 74 20 69 73 20 6c 65 66 74 20 65  de, it is left e
10ce0 6d 70 74 79 20 66 6f 72 0a 20 20 2a 2a 20 6e 6f  mpty for.  ** no
10cf0 77 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20  w. Instead, the 
10d00 74 65 72 6d 20 69 73 20 69 6e 73 65 72 74 65 64  term is inserted
10d10 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
10d20 20 6f 66 20 70 54 72 65 65 2e 20 49 66 20 70 54   of pTree. If pT
10d30 72 65 65 20 0a 20 20 2a 2a 20 68 61 73 20 6e 6f  ree .  ** has no
10d40 20 70 61 72 65 6e 74 2c 20 6f 6e 65 20 69 73 20   parent, one is 
10d50 63 72 65 61 74 65 64 20 68 65 72 65 2e 0a 20 20  created here..  
10d60 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 28 53 65 67  */.  pNew = (Seg
10d70 6d 65 6e 74 4e 6f 64 65 20 2a 29 73 71 6c 69 74  mentNode *)sqlit
10d80 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
10d90 28 53 65 67 6d 65 6e 74 4e 6f 64 65 29 20 2b 20  (SegmentNode) + 
10da0 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 29 3b 0a 20  p->nNodeSize);. 
10db0 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20   if( !pNew ){.  
10dc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10dd0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d  NOMEM;.  }.  mem
10de0 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
10df0 65 6f 66 28 53 65 67 6d 65 6e 74 4e 6f 64 65 29  eof(SegmentNode)
10e00 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e 44 61 74 61  );.  pNew->nData
10e10 20 3d 20 31 20 2b 20 46 54 53 33 5f 56 41 52 49   = 1 + FTS3_VARI
10e20 4e 54 5f 4d 41 58 3b 0a 20 20 70 4e 65 77 2d 3e  NT_MAX;.  pNew->
10e30 61 44 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29  aData = (char *)
10e40 26 70 4e 65 77 5b 31 5d 3b 0a 0a 20 20 69 66 28  &pNew[1];..  if(
10e50 20 70 54 72 65 65 20 29 7b 0a 20 20 20 20 53 65   pTree ){.    Se
10e60 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 50 61 72 65  gmentNode *pPare
10e70 6e 74 20 3d 20 70 54 72 65 65 2d 3e 70 50 61 72  nt = pTree->pPar
10e80 65 6e 74 3b 0a 20 20 20 20 72 63 20 3d 20 66 74  ent;.    rc = ft
10e90 73 33 4e 6f 64 65 41 64 64 54 65 72 6d 28 70 2c  s3NodeAddTerm(p,
10ea0 20 26 70 50 61 72 65 6e 74 2c 20 69 73 43 6f 70   &pParent, isCop
10eb0 79 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54  yTerm, zTerm, nT
10ec0 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54  erm);.    if( pT
10ed0 72 65 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20  ree->pParent==0 
10ee0 29 7b 0a 20 20 20 20 20 20 70 54 72 65 65 2d 3e  ){.      pTree->
10ef0 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e  pParent = pParen
10f00 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 72  t;.    }.    pTr
10f10 65 65 2d 3e 70 52 69 67 68 74 20 3d 20 70 4e 65  ee->pRight = pNe
10f20 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65  w;.    pNew->pLe
10f30 66 74 6d 6f 73 74 20 3d 20 70 54 72 65 65 2d 3e  ftmost = pTree->
10f40 70 4c 65 66 74 6d 6f 73 74 3b 0a 20 20 20 20 70  pLeftmost;.    p
10f50 4e 65 77 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70  New->pParent = p
10f60 50 61 72 65 6e 74 3b 0a 20 20 20 20 70 4e 65 77  Parent;.    pNew
10f70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 70 54 72 65  ->zMalloc = pTre
10f80 65 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20  e->zMalloc;.    
10f90 70 4e 65 77 2d 3e 6e 4d 61 6c 6c 6f 63 20 3d 20  pNew->nMalloc = 
10fa0 70 54 72 65 65 2d 3e 6e 4d 61 6c 6c 6f 63 3b 0a  pTree->nMalloc;.
10fb0 20 20 20 20 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c      pTree->zMall
10fc0 6f 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  oc = 0;.  }else{
10fd0 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74  .    pNew->pLeft
10fe0 6d 6f 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20  most = pNew;.   
10ff0 20 72 63 20 3d 20 66 74 73 33 4e 6f 64 65 41 64   rc = fts3NodeAd
11000 64 54 65 72 6d 28 70 2c 20 26 70 4e 65 77 2c 20  dTerm(p, &pNew, 
11010 69 73 43 6f 70 79 54 65 72 6d 2c 20 7a 54 65 72  isCopyTerm, zTer
11020 6d 2c 20 6e 54 65 72 6d 29 3b 20 0a 20 20 7d 0a  m, nTerm); .  }.
11030 0a 20 20 2a 70 70 54 72 65 65 20 3d 20 70 4e 65  .  *ppTree = pNe
11040 77 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  w;.  return rc;.
11050 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  }../*.** Helper 
11060 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 66 74 73  function for fts
11070 33 4e 6f 64 65 57 72 69 74 65 28 29 2e 0a 2a 2f  3NodeWrite()..*/
11080 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
11090 54 72 65 65 46 69 6e 69 73 68 4e 6f 64 65 28 0a  TreeFinishNode(.
110a0 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70    SegmentNode *p
110b0 54 72 65 65 2c 20 0a 20 20 69 6e 74 20 69 48 65  Tree, .  int iHe
110c0 69 67 68 74 2c 20 0a 20 20 73 71 6c 69 74 65 33  ight, .  sqlite3
110d0 5f 69 6e 74 36 34 20 69 4c 65 66 74 43 68 69 6c  _int64 iLeftChil
110e0 64 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 74 61 72  d.){.  int nStar
110f0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69 48 65  t;.  assert( iHe
11100 69 67 68 74 3e 3d 31 20 26 26 20 69 48 65 69 67  ight>=1 && iHeig
11110 68 74 3c 31 32 38 20 29 3b 0a 20 20 6e 53 74 61  ht<128 );.  nSta
11120 72 74 20 3d 20 46 54 53 33 5f 56 41 52 49 4e 54  rt = FTS3_VARINT
11130 5f 4d 41 58 20 2d 20 73 71 6c 69 74 65 33 46 74  _MAX - sqlite3Ft
11140 73 33 56 61 72 69 6e 74 4c 65 6e 28 69 4c 65 66  s3VarintLen(iLef
11150 74 43 68 69 6c 64 29 3b 0a 20 20 70 54 72 65 65  tChild);.  pTree
11160 2d 3e 61 44 61 74 61 5b 6e 53 74 61 72 74 5d 20  ->aData[nStart] 
11170 3d 20 28 63 68 61 72 29 69 48 65 69 67 68 74 3b  = (char)iHeight;
11180 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 50 75  .  sqlite3Fts3Pu
11190 74 56 61 72 69 6e 74 28 26 70 54 72 65 65 2d 3e  tVarint(&pTree->
111a0 61 44 61 74 61 5b 6e 53 74 61 72 74 2b 31 5d 2c  aData[nStart+1],
111b0 20 69 4c 65 66 74 43 68 69 6c 64 29 3b 0a 20 20   iLeftChild);.  
111c0 72 65 74 75 72 6e 20 6e 53 74 61 72 74 3b 0a 7d  return nStart;.}
111d0 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
111e0 65 20 62 75 66 66 65 72 20 66 6f 72 20 74 68 65  e buffer for the
111f0 20 73 65 67 6d 65 6e 74 20 6e 6f 64 65 20 70 54   segment node pT
11200 72 65 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ree and all of i
11210 74 73 20 70 65 65 72 73 20 74 6f 20 74 68 65 0a  ts peers to the.
11220 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  ** database. The
11230 6e 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  n call this func
11240 74 69 6f 6e 20 72 65 63 75 72 73 69 76 65 6c 79  tion recursively
11250 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 70 61   to write the pa
11260 72 65 6e 74 20 6f 66 20 0a 2a 2a 20 70 54 72 65  rent of .** pTre
11270 65 20 61 6e 64 20 69 74 73 20 70 65 65 72 73 20  e and its peers 
11280 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
11290 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20   .**.** Except, 
112a0 69 66 20 70 54 72 65 65 20 69 73 20 61 20 72 6f  if pTree is a ro
112b0 6f 74 20 6e 6f 64 65 2c 20 64 6f 20 6e 6f 74 20  ot node, do not 
112c0 77 72 69 74 65 20 69 74 20 74 6f 20 74 68 65 20  write it to the 
112d0 64 61 74 61 62 61 73 65 2e 20 49 6e 73 74 65 61  database. Instea
112e0 64 2c 0a 2a 2a 20 73 65 74 20 6f 75 74 70 75 74  d,.** set output
112f0 20 76 61 72 69 61 62 6c 65 73 20 2a 70 61 52 6f   variables *paRo
11300 6f 74 20 61 6e 64 20 2a 70 6e 52 6f 6f 74 20 74  ot and *pnRoot t
11310 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 6f  o contain the ro
11320 6f 74 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49  ot node..**.** I
11330 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  f successful, SQ
11340 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
11350 6e 65 64 20 61 6e 64 20 6f 75 74 70 75 74 20 76  ned and output v
11360 61 72 69 61 62 6c 65 20 2a 70 69 4c 61 73 74 20  ariable *piLast 
11370 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 74 68 65  is.** set to the
11380 20 6c 61 72 67 65 73 74 20 62 6c 6f 63 6b 69 64   largest blockid
11390 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
113a0 64 61 74 61 62 61 73 65 20 28 6f 72 20 7a 65 72  database (or zer
113b0 6f 20 69 66 20 6e 6f 0a 2a 2a 20 62 6c 6f 63 6b  o if no.** block
113c0 73 20 77 65 72 65 20 77 72 69 74 74 65 6e 20 74  s were written t
113d0 6f 20 74 68 65 20 64 62 29 2e 20 4f 74 68 65 72  o the db). Other
113e0 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20  wise, an SQLite 
113f0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a  error code is .*
11400 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  * returned..*/.s
11410 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 4e 6f  tatic int fts3No
11420 64 65 57 72 69 74 65 28 0a 20 20 46 74 73 33 54  deWrite(.  Fts3T
11430 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
11440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69             /* Vi
11450 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64  rtual table hand
11460 6c 65 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e  le */.  SegmentN
11470 6f 64 65 20 2a 70 54 72 65 65 2c 20 20 20 20 20  ode *pTree,     
11480 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65          /* Segme
11490 6e 74 4e 6f 64 65 20 68 61 6e 64 6c 65 20 2a 2f  ntNode handle */
114a0 0a 20 20 69 6e 74 20 69 48 65 69 67 68 74 2c 20  .  int iHeight, 
114b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114c0 20 20 20 2f 2a 20 48 65 69 67 68 74 20 6f 66 20     /* Height of 
114d0 74 68 69 73 20 6e 6f 64 65 20 69 6e 20 74 72 65  this node in tre
114e0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
114f0 6e 74 36 34 20 69 4c 65 61 66 2c 20 20 20 20 20  nt64 iLeaf,     
11500 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20         /* Block 
11510 69 64 20 6f 66 20 66 69 72 73 74 20 6c 65 61 66  id of first leaf
11520 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   node */.  sqlit
11530 65 33 5f 69 6e 74 36 34 20 69 46 72 65 65 2c 20  e3_int64 iFree, 
11540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c             /* Bl
11550 6f 63 6b 20 69 64 20 6f 66 20 6e 65 78 74 20 66  ock id of next f
11560 72 65 65 20 73 6c 6f 74 20 69 6e 20 25 5f 73 65  ree slot in %_se
11570 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 71 6c 69  gments */.  sqli
11580 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4c 61 73  te3_int64 *piLas
11590 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  t,          /* O
115a0 55 54 3a 20 42 6c 6f 63 6b 20 69 64 20 6f 66 20  UT: Block id of 
115b0 6c 61 73 74 20 65 6e 74 72 79 20 77 72 69 74 74  last entry writt
115c0 65 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  en */.  char **p
115d0 61 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20  aRoot,          
115e0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
115f0 44 61 74 61 20 66 6f 72 20 72 6f 6f 74 20 6e 6f  Data for root no
11600 64 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 52  de */.  int *pnR
11610 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20 20 20  oot             
11620 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
11630 53 69 7a 65 20 6f 66 20 72 6f 6f 74 20 6e 6f 64  Size of root nod
11640 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b  e in bytes */.){
11650 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11660 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70  TE_OK;..  if( !p
11670 54 72 65 65 2d 3e 70 50 61 72 65 6e 74 20 29 7b  Tree->pParent ){
11680 0a 20 20 20 20 2f 2a 20 52 6f 6f 74 20 6e 6f 64  .    /* Root nod
11690 65 20 6f 66 20 74 68 65 20 74 72 65 65 2e 20 2a  e of the tree. *
116a0 2f 0a 20 20 20 20 69 6e 74 20 6e 53 74 61 72 74  /.    int nStart
116b0 20 3d 20 66 74 73 33 54 72 65 65 46 69 6e 69 73   = fts3TreeFinis
116c0 68 4e 6f 64 65 28 70 54 72 65 65 2c 20 69 48 65  hNode(pTree, iHe
116d0 69 67 68 74 2c 20 69 4c 65 61 66 29 3b 0a 20 20  ight, iLeaf);.  
116e0 20 20 2a 70 69 4c 61 73 74 20 3d 20 69 46 72 65    *piLast = iFre
116f0 65 2d 31 3b 0a 20 20 20 20 2a 70 6e 52 6f 6f 74  e-1;.    *pnRoot
11700 20 3d 20 70 54 72 65 65 2d 3e 6e 44 61 74 61 20   = pTree->nData 
11710 2d 20 6e 53 74 61 72 74 3b 0a 20 20 20 20 2a 70  - nStart;.    *p
11720 61 52 6f 6f 74 20 3d 20 26 70 54 72 65 65 2d 3e  aRoot = &pTree->
11730 61 44 61 74 61 5b 6e 53 74 61 72 74 5d 3b 0a 20  aData[nStart];. 
11740 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53 65 67 6d   }else{.    Segm
11750 65 6e 74 4e 6f 64 65 20 2a 70 49 74 65 72 3b 0a  entNode *pIter;.
11760 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
11770 34 20 69 4e 65 78 74 46 72 65 65 20 3d 20 69 46  4 iNextFree = iF
11780 72 65 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ree;.    sqlite3
11790 5f 69 6e 74 36 34 20 69 4e 65 78 74 4c 65 61 66  _int64 iNextLeaf
117a0 20 3d 20 69 4c 65 61 66 3b 0a 20 20 20 20 66 6f   = iLeaf;.    fo
117b0 72 28 70 49 74 65 72 3d 70 54 72 65 65 2d 3e 70  r(pIter=pTree->p
117c0 4c 65 66 74 6d 6f 73 74 3b 20 70 49 74 65 72 20  Leftmost; pIter 
117d0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
117e0 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
117f0 52 69 67 68 74 29 7b 0a 20 20 20 20 20 20 69 6e  Right){.      in
11800 74 20 6e 53 74 61 72 74 20 3d 20 66 74 73 33 54  t nStart = fts3T
11810 72 65 65 46 69 6e 69 73 68 4e 6f 64 65 28 70 49  reeFinishNode(pI
11820 74 65 72 2c 20 69 48 65 69 67 68 74 2c 20 69 4e  ter, iHeight, iN
11830 65 78 74 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  extLeaf);.      
11840 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 70 49 74  int nWrite = pIt
11850 65 72 2d 3e 6e 44 61 74 61 20 2d 20 6e 53 74 61  er->nData - nSta
11860 72 74 3b 0a 20 20 0a 20 20 20 20 20 20 72 63 20  rt;.  .      rc 
11870 3d 20 66 74 73 33 57 72 69 74 65 53 65 67 6d 65  = fts3WriteSegme
11880 6e 74 28 70 2c 20 69 4e 65 78 74 46 72 65 65 2c  nt(p, iNextFree,
11890 20 26 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 6e   &pIter->aData[n
118a0 53 74 61 72 74 5d 2c 20 6e 57 72 69 74 65 29 3b  Start], nWrite);
118b0 0a 20 20 20 20 20 20 69 4e 65 78 74 46 72 65 65  .      iNextFree
118c0 2b 2b 3b 0a 20 20 20 20 20 20 69 4e 65 78 74 4c  ++;.      iNextL
118d0 65 61 66 20 2b 3d 20 28 70 49 74 65 72 2d 3e 6e  eaf += (pIter->n
118e0 45 6e 74 72 79 2b 31 29 3b 0a 20 20 20 20 7d 0a  Entry+1);.    }.
118f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
11900 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
11910 73 73 65 72 74 28 20 69 4e 65 78 74 4c 65 61 66  ssert( iNextLeaf
11920 3d 3d 69 46 72 65 65 20 29 3b 0a 20 20 20 20 20  ==iFree );.     
11930 20 72 63 20 3d 20 66 74 73 33 4e 6f 64 65 57 72   rc = fts3NodeWr
11940 69 74 65 28 0a 20 20 20 20 20 20 20 20 20 20 70  ite(.          p
11950 2c 20 70 54 72 65 65 2d 3e 70 50 61 72 65 6e 74  , pTree->pParent
11960 2c 20 69 48 65 69 67 68 74 2b 31 2c 20 69 46 72  , iHeight+1, iFr
11970 65 65 2c 20 69 4e 65 78 74 46 72 65 65 2c 20 70  ee, iNextFree, p
11980 69 4c 61 73 74 2c 20 70 61 52 6f 6f 74 2c 20 70  iLast, paRoot, p
11990 6e 52 6f 6f 74 0a 20 20 20 20 20 20 29 3b 0a 20  nRoot.      );. 
119a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
119b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
119c0 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
119d0 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f  allocations asso
119e0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
119f0 74 72 65 65 20 70 54 72 65 65 2e 0a 2a 2f 0a 73  tree pTree..*/.s
11a00 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 4e  tatic void fts3N
11a10 6f 64 65 46 72 65 65 28 53 65 67 6d 65 6e 74 4e  odeFree(SegmentN
11a20 6f 64 65 20 2a 70 54 72 65 65 29 7b 0a 20 20 69  ode *pTree){.  i
11a30 66 28 20 70 54 72 65 65 20 29 7b 0a 20 20 20 20  f( pTree ){.    
11a40 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 20 3d  SegmentNode *p =
11a50 20 70 54 72 65 65 2d 3e 70 4c 65 66 74 6d 6f 73   pTree->pLeftmos
11a60 74 3b 0a 20 20 20 20 66 74 73 33 4e 6f 64 65 46  t;.    fts3NodeF
11a70 72 65 65 28 70 2d 3e 70 50 61 72 65 6e 74 29 3b  ree(p->pParent);
11a80 0a 20 20 20 20 77 68 69 6c 65 28 20 70 20 29 7b  .    while( p ){
11a90 0a 20 20 20 20 20 20 53 65 67 6d 65 6e 74 4e 6f  .      SegmentNo
11aa0 64 65 20 2a 70 52 69 67 68 74 20 3d 20 70 2d 3e  de *pRight = p->
11ab0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66  pRight;.      if
11ac0 28 20 70 2d 3e 61 44 61 74 61 21 3d 28 63 68 61  ( p->aData!=(cha
11ad0 72 20 2a 29 26 70 5b 31 5d 20 29 7b 0a 20 20 20  r *)&p[1] ){.   
11ae0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
11af0 65 28 70 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  e(p->aData);.   
11b00 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
11b10 74 28 20 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20  t( pRight==0 || 
11b20 70 2d 3e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  p->zMalloc==0 );
11b30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
11b40 72 65 65 28 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  ree(p->zMalloc);
11b50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
11b60 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 70 20  ree(p);.      p 
11b70 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 7d 0a  = pRight;.    }.
11b80 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
11b90 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20 73   a term to the s
11ba0 65 67 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 6e  egment being con
11bb0 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65 20  structed by the 
11bc0 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 6f 62  SegmentWriter ob
11bd0 6a 65 63 74 0a 2a 2a 20 2a 70 70 57 72 69 74 65  ject.** *ppWrite
11be0 72 2e 20 57 68 65 6e 20 61 64 64 69 6e 67 20 74  r. When adding t
11bf0 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 74 6f  he first term to
11c00 20 61 20 73 65 67 6d 65 6e 74 2c 20 2a 70 70 57   a segment, *ppW
11c10 72 69 74 65 72 20 73 68 6f 75 6c 64 0a 2a 2a 20  riter should.** 
11c20 62 65 20 70 61 73 73 65 64 20 4e 55 4c 4c 2e 20  be passed NULL. 
11c30 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  This function wi
11c40 6c 6c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ll allocate a ne
11c50 77 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20  w SegmentWriter 
11c60 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 72 65  object.** and re
11c70 74 75 72 6e 20 69 74 20 76 69 61 20 74 68 65 20  turn it via the 
11c80 69 6e 70 75 74 2f 6f 75 74 70 75 74 20 76 61 72  input/output var
11c90 69 61 62 6c 65 20 2a 70 70 57 72 69 74 65 72 20  iable *ppWriter 
11ca0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
11cb0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
11cc0 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
11cd0 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
11ce0 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ise, an SQLite e
11cf0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
11d00 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67  atic int fts3Seg
11d10 57 72 69 74 65 72 41 64 64 28 0a 20 20 46 74 73  WriterAdd(.  Fts
11d20 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
11d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11d40 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  Virtual table ha
11d50 6e 64 6c 65 20 2a 2f 0a 20 20 53 65 67 6d 65 6e  ndle */.  Segmen
11d60 74 57 72 69 74 65 72 20 2a 2a 70 70 57 72 69 74  tWriter **ppWrit
11d70 65 72 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f  er,       /* IN/
11d80 4f 55 54 3a 20 53 65 67 6d 65 6e 74 57 72 69 74  OUT: SegmentWrit
11d90 65 72 20 68 61 6e 64 6c 65 20 2a 2f 20 0a 20 20  er handle */ .  
11da0 69 6e 74 20 69 73 43 6f 70 79 54 65 72 6d 2c 20  int isCopyTerm, 
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11dc0 2f 2a 20 54 72 75 65 20 69 66 20 62 75 66 66 65  /* True if buffe
11dd0 72 20 7a 54 65 72 6d 20 6d 75 73 74 20 62 65 20  r zTerm must be 
11de0 63 6f 70 69 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  copied */.  cons
11df0 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20  t char *zTerm,  
11e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
11e10 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
11e20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d   containing term
11e30 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c   */.  int nTerm,
11e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e50 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
11e60 20 74 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a   term in bytes *
11e70 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
11e80 61 44 6f 63 6c 69 73 74 2c 20 20 20 20 20 20 20  aDoclist,       
11e90 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
11ea0 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
11eb0 69 6e 67 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20  ing doclist */. 
11ec0 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 20 20 20   int nDoclist   
11ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ee0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c   /* Size of docl
11ef0 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ist in bytes */.
11f00 29 7b 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78  ){.  int nPrefix
11f10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11f20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
11f30 74 65 72 6d 20 70 72 65 66 69 78 20 69 6e 20 62  term prefix in b
11f40 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  ytes */.  int nS
11f50 75 66 66 69 78 3b 20 20 20 20 20 20 20 20 20 20  uffix;          
11f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
11f70 65 20 6f 66 20 74 65 72 6d 20 73 75 66 66 69 78  e of term suffix
11f80 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
11f90 6e 74 20 6e 52 65 71 3b 20 20 20 20 20 20 20 20  nt nReq;        
11fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11fb0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
11fc0 73 20 72 65 71 75 69 72 65 64 20 6f 6e 20 6c 65  s required on le
11fd0 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  af page */.  int
11fe0 20 6e 44 61 74 61 3b 0a 20 20 53 65 67 6d 65 6e   nData;.  Segmen
11ff0 74 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  tWriter *pWriter
12000 20 3d 20 2a 70 70 57 72 69 74 65 72 3b 0a 0a 20   = *ppWriter;.. 
12010 20 69 66 28 20 21 70 57 72 69 74 65 72 20 29 7b   if( !pWriter ){
12020 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
12030 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
12040 53 74 6d 74 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c  Stmt;..    /* Al
12050 6c 6f 63 61 74 65 20 74 68 65 20 53 65 67 6d 65  locate the Segme
12060 6e 74 57 72 69 74 65 72 20 73 74 72 75 63 74 75  ntWriter structu
12070 72 65 20 2a 2f 0a 20 20 20 20 70 57 72 69 74 65  re */.    pWrite
12080 72 20 3d 20 28 53 65 67 6d 65 6e 74 57 72 69 74  r = (SegmentWrit
12090 65 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  er *)sqlite3_mal
120a0 6c 6f 63 28 73 69 7a 65 6f 66 28 53 65 67 6d 65  loc(sizeof(Segme
120b0 6e 74 57 72 69 74 65 72 29 29 3b 0a 20 20 20 20  ntWriter));.    
120c0 69 66 28 20 21 70 57 72 69 74 65 72 20 29 20 72  if( !pWriter ) r
120d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
120e0 45 4d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  EM;.    memset(p
120f0 57 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  Writer, 0, sizeo
12100 66 28 53 65 67 6d 65 6e 74 57 72 69 74 65 72 29  f(SegmentWriter)
12110 29 3b 0a 20 20 20 20 2a 70 70 57 72 69 74 65 72  );.    *ppWriter
12120 20 3d 20 70 57 72 69 74 65 72 3b 0a 0a 20 20 20   = pWriter;..   
12130 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62   /* Allocate a b
12140 75 66 66 65 72 20 69 6e 20 77 68 69 63 68 20 74  uffer in which t
12150 6f 20 61 63 63 75 6d 75 6c 61 74 65 20 64 61 74  o accumulate dat
12160 61 20 2a 2f 0a 20 20 20 20 70 57 72 69 74 65 72  a */.    pWriter
12170 2d 3e 61 44 61 74 61 20 3d 20 28 63 68 61 72 20  ->aData = (char 
12180 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
12190 28 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 29 3b 0a  (p->nNodeSize);.
121a0 20 20 20 20 69 66 28 20 21 70 57 72 69 74 65 72      if( !pWriter
121b0 2d 3e 61 44 61 74 61 20 29 20 72 65 74 75 72 6e  ->aData ) return
121c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
121d0 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 53 69 7a     pWriter->nSiz
121e0 65 20 3d 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65  e = p->nNodeSize
121f0 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 74  ;..    /* Find t
12200 68 65 20 6e 65 78 74 20 66 72 65 65 20 62 6c 6f  he next free blo
12210 63 6b 69 64 20 69 6e 20 74 68 65 20 25 5f 73 65  ckid in the %_se
12220 67 6d 65 6e 74 73 20 74 61 62 6c 65 20 2a 2f 0a  gments table */.
12230 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c      rc = fts3Sql
12240 53 74 6d 74 28 70 2c 20 53 51 4c 5f 4e 45 58 54  Stmt(p, SQL_NEXT
12250 5f 53 45 47 4d 45 4e 54 53 5f 49 44 2c 20 26 70  _SEGMENTS_ID, &p
12260 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  Stmt, 0);.    if
12270 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12280 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
12290 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
122a0 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
122b0 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 70 57  tmt) ){.      pW
122c0 72 69 74 65 72 2d 3e 69 46 72 65 65 20 3d 20 73  riter->iFree = s
122d0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
122e0 74 36 34 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  t64(pStmt, 0);. 
122f0 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 46       pWriter->iF
12300 69 72 73 74 20 3d 20 70 57 72 69 74 65 72 2d 3e  irst = pWriter->
12310 69 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20  iFree;.    }.   
12320 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
12330 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  set(pStmt);.    
12340 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12350 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
12360 20 7d 0a 20 20 6e 44 61 74 61 20 3d 20 70 57 72   }.  nData = pWr
12370 69 74 65 72 2d 3e 6e 44 61 74 61 3b 0a 0a 20 20  iter->nData;..  
12380 6e 50 72 65 66 69 78 20 3d 20 66 74 73 33 50 72  nPrefix = fts3Pr
12390 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70 57 72  efixCompress(pWr
123a0 69 74 65 72 2d 3e 7a 54 65 72 6d 2c 20 70 57 72  iter->zTerm, pWr
123b0 69 74 65 72 2d 3e 6e 54 65 72 6d 2c 20 7a 54 65  iter->nTerm, zTe
123c0 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 6e 53  rm, nTerm);.  nS
123d0 75 66 66 69 78 20 3d 20 6e 54 65 72 6d 2d 6e 50  uffix = nTerm-nP
123e0 72 65 66 69 78 3b 0a 0a 20 20 2f 2a 20 46 69 67  refix;..  /* Fig
123f0 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
12400 20 62 79 74 65 73 20 61 72 65 20 72 65 71 75 69   bytes are requi
12410 72 65 64 20 62 79 20 74 68 69 73 20 6e 65 77 20  red by this new 
12420 65 6e 74 72 79 20 2a 2f 0a 20 20 6e 52 65 71 20  entry */.  nReq 
12430 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72  = sqlite3Fts3Var
12440 69 6e 74 4c 65 6e 28 6e 50 72 65 66 69 78 29 20  intLen(nPrefix) 
12450 2b 20 20 20 20 2f 2a 20 76 61 72 69 6e 74 20 63  +    /* varint c
12460 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69 78  ontaining prefix
12470 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c   size */.    sql
12480 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65  ite3Fts3VarintLe
12490 6e 28 6e 53 75 66 66 69 78 29 20 2b 20 20 20 20  n(nSuffix) +    
124a0 20 20 20 20 20 2f 2a 20 76 61 72 69 6e 74 20 63       /* varint c
124b0 6f 6e 74 61 69 6e 69 6e 67 20 73 75 66 66 69 78  ontaining suffix
124c0 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 6e 53 75   size */.    nSu
124d0 66 66 69 78 20 2b 20 20 20 20 20 20 20 20 20 20  ffix +          
124e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124f0 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 73 75 66       /* Term suf
12500 66 69 78 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  fix */.    sqlit
12510 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28  e3Fts3VarintLen(
12520 6e 44 6f 63 6c 69 73 74 29 20 2b 20 20 20 20 20  nDoclist) +     
12530 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f     /* Size of do
12540 63 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6e 44 6f  clist */.    nDo
12550 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  clist;          
12560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12570 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20       /* Doclist 
12580 64 61 74 61 20 2a 2f 0a 0a 20 20 69 66 28 20 6e  data */..  if( n
12590 44 61 74 61 3e 30 20 26 26 20 6e 44 61 74 61 2b  Data>0 && nData+
125a0 6e 52 65 71 3e 70 2d 3e 6e 4e 6f 64 65 53 69 7a  nReq>p->nNodeSiz
125b0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  e ){.    int rc;
125c0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72  ..    /* The cur
125d0 72 65 6e 74 20 6c 65 61 66 20 6e 6f 64 65 20 69  rent leaf node i
125e0 73 20 66 75 6c 6c 2e 20 57 72 69 74 65 20 69 74  s full. Write it
125f0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
12600 62 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20  base. */.    rc 
12610 3d 20 66 74 73 33 57 72 69 74 65 53 65 67 6d 65  = fts3WriteSegme
12620 6e 74 28 70 2c 20 70 57 72 69 74 65 72 2d 3e 69  nt(p, pWriter->i
12630 46 72 65 65 2b 2b 2c 20 70 57 72 69 74 65 72 2d  Free++, pWriter-
12640 3e 61 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a  >aData, nData);.
12650 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12660 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
12670 63 3b 0a 20 20 20 20 70 2d 3e 6e 4c 65 61 66 41  c;.    p->nLeafA
12680 64 64 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 41 64  dd++;..    /* Ad
12690 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65  d the current te
126a0 72 6d 20 74 6f 20 74 68 65 20 69 6e 74 65 72 69  rm to the interi
126b0 6f 72 20 6e 6f 64 65 20 74 72 65 65 2e 20 54 68  or node tree. Th
126c0 65 20 74 65 72 6d 20 61 64 64 65 64 20 74 6f 0a  e term added to.
126d0 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 74 65 72      ** the inter
126e0 69 6f 72 20 74 72 65 65 20 6d 75 73 74 3a 0a 20  ior tree must:. 
126f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 61     **.    **   a
12700 29 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  ) be greater tha
12710 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20 74 65  n the largest te
12720 72 6d 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 6e  rm on the leaf n
12730 6f 64 65 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ode just written
12740 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 74 6f 20  .    **      to 
12750 74 68 65 20 64 61 74 61 62 61 73 65 20 28 73 74  the database (st
12760 69 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  ill available in
12770 20 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d 29   pWriter->zTerm)
12780 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 0a 20 20 20  , and.    **.   
12790 20 2a 2a 20 20 20 62 29 20 62 65 20 6c 65 73 73   **   b) be less
127a0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
127b0 6f 20 74 68 65 20 74 65 72 6d 20 61 62 6f 75 74  o the term about
127c0 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
127d0 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 20  the new.    **  
127e0 20 20 20 20 6c 65 61 66 20 6e 6f 64 65 20 28 7a      leaf node (z
127f0 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 20 20 20  Term/nTerm)..   
12800 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74   **.    ** In ot
12810 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20 6d 75  her words, it mu
12820 73 74 20 62 65 20 74 68 65 20 70 72 65 66 69 78  st be the prefix
12830 20 6f 66 20 7a 54 65 72 6d 20 31 20 62 79 74 65   of zTerm 1 byte
12840 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 20 20 20   longer than.   
12850 20 2a 2a 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70   ** the common p
12860 72 65 66 69 78 20 28 69 66 20 61 6e 79 29 20 6f  refix (if any) o
12870 66 20 7a 54 65 72 6d 20 61 6e 64 20 70 57 72 69  f zTerm and pWri
12880 74 65 72 2d 3e 7a 54 65 72 6d 2e 0a 20 20 20 20  ter->zTerm..    
12890 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  */.    assert( n
128a0 50 72 65 66 69 78 3c 6e 54 65 72 6d 20 29 3b 0a  Prefix<nTerm );.
128b0 20 20 20 20 72 63 20 3d 20 66 74 73 33 4e 6f 64      rc = fts3Nod
128c0 65 41 64 64 54 65 72 6d 28 70 2c 20 26 70 57 72  eAddTerm(p, &pWr
128d0 69 74 65 72 2d 3e 70 54 72 65 65 2c 20 69 73 43  iter->pTree, isC
128e0 6f 70 79 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20  opyTerm, zTerm, 
128f0 6e 50 72 65 66 69 78 2b 31 29 3b 0a 20 20 20 20  nPrefix+1);.    
12900 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12910 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
12920 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20      nData = 0;. 
12930 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 54 65 72     pWriter->nTer
12940 6d 20 3d 20 30 3b 0a 0a 20 20 20 20 6e 50 72 65  m = 0;..    nPre
12950 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 6e 53 75  fix = 0;.    nSu
12960 66 66 69 78 20 3d 20 6e 54 65 72 6d 3b 0a 20 20  ffix = nTerm;.  
12970 20 20 6e 52 65 71 20 3d 20 31 20 2b 20 20 20 20    nReq = 1 +    
12980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 76 61 72            /* var
129a0 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  int containing p
129b0 72 65 66 69 78 20 73 69 7a 65 20 2a 2f 0a 20 20  refix size */.  
129c0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 56      sqlite3Fts3V
129d0 61 72 69 6e 74 4c 65 6e 28 6e 54 65 72 6d 29 20  arintLen(nTerm) 
129e0 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 76 61 72  +         /* var
129f0 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73  int containing s
12a00 75 66 66 69 78 20 73 69 7a 65 20 2a 2f 0a 20 20  uffix size */.  
12a10 20 20 20 20 6e 54 65 72 6d 20 2b 20 20 20 20 20      nTerm +     
12a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72            /* Ter
12a40 6d 20 73 75 66 66 69 78 20 2a 2f 0a 20 20 20 20  m suffix */.    
12a50 20 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72    sqlite3Fts3Var
12a60 69 6e 74 4c 65 6e 28 6e 44 6f 63 6c 69 73 74 29  intLen(nDoclist)
12a70 20 2b 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20   +      /* Size 
12a80 6f 66 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20  of doclist */.  
12a90 20 20 20 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20      nDoclist;   
12aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63            /* Doc
12ac0 6c 69 73 74 20 64 61 74 61 20 2a 2f 0a 20 20 7d  list data */.  }
12ad0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 75  ..  /* If the bu
12ae0 66 66 65 72 20 63 75 72 72 65 6e 74 6c 79 20 61  ffer currently a
12af0 6c 6c 6f 63 61 74 65 64 20 69 73 20 74 6f 6f 20  llocated is too 
12b00 73 6d 61 6c 6c 20 66 6f 72 20 74 68 69 73 20 65  small for this e
12b10 6e 74 72 79 2c 20 72 65 61 6c 6c 6f 63 0a 20 20  ntry, realloc.  
12b20 2a 2a 20 74 68 65 20 62 75 66 66 65 72 20 74 6f  ** the buffer to
12b30 20 6d 61 6b 65 20 69 74 20 6c 61 72 67 65 20 65   make it large e
12b40 6e 6f 75 67 68 2e 0a 20 20 2a 2f 0a 20 20 69 66  nough..  */.  if
12b50 28 20 6e 52 65 71 3e 70 57 72 69 74 65 72 2d 3e  ( nReq>pWriter->
12b60 6e 53 69 7a 65 20 29 7b 0a 20 20 20 20 63 68 61  nSize ){.    cha
12b70 72 20 2a 61 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *aNew = sqlite
12b80 33 5f 72 65 61 6c 6c 6f 63 28 70 57 72 69 74 65  3_realloc(pWrite
12b90 72 2d 3e 61 44 61 74 61 2c 20 6e 52 65 71 29 3b  r->aData, nReq);
12ba0 0a 20 20 20 20 69 66 28 20 21 61 4e 65 77 20 29  .    if( !aNew )
12bb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
12bc0 4f 4d 45 4d 3b 0a 20 20 20 20 70 57 72 69 74 65  OMEM;.    pWrite
12bd0 72 2d 3e 61 44 61 74 61 20 3d 20 61 4e 65 77 3b  r->aData = aNew;
12be0 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 53  .    pWriter->nS
12bf0 69 7a 65 20 3d 20 6e 52 65 71 3b 0a 20 20 7d 0a  ize = nReq;.  }.
12c00 20 20 61 73 73 65 72 74 28 20 6e 44 61 74 61 2b    assert( nData+
12c10 6e 52 65 71 3c 3d 70 57 72 69 74 65 72 2d 3e 6e  nReq<=pWriter->n
12c20 53 69 7a 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 70  Size );..  /* Ap
12c30 70 65 6e 64 20 74 68 65 20 70 72 65 66 69 78 2d  pend the prefix-
12c40 63 6f 6d 70 72 65 73 73 65 64 20 74 65 72 6d 20  compressed term 
12c50 61 6e 64 20 64 6f 63 6c 69 73 74 20 74 6f 20 74  and doclist to t
12c60 68 65 20 62 75 66 66 65 72 2e 20 2a 2f 0a 20 20  he buffer. */.  
12c70 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 33  nData += sqlite3
12c80 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70  Fts3PutVarint(&p
12c90 57 72 69 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44  Writer->aData[nD
12ca0 61 74 61 5d 2c 20 6e 50 72 65 66 69 78 29 3b 0a  ata], nPrefix);.
12cb0 20 20 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69 74    nData += sqlit
12cc0 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28  e3Fts3PutVarint(
12cd0 26 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 5b  &pWriter->aData[
12ce0 6e 44 61 74 61 5d 2c 20 6e 53 75 66 66 69 78 29  nData], nSuffix)
12cf0 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 57 72 69  ;.  memcpy(&pWri
12d00 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61  ter->aData[nData
12d10 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50 72 65 66 69  ], &zTerm[nPrefi
12d20 78 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20  x], nSuffix);.  
12d30 6e 44 61 74 61 20 2b 3d 20 6e 53 75 66 66 69 78  nData += nSuffix
12d40 3b 0a 20 20 6e 44 61 74 61 20 2b 3d 20 73 71 6c  ;.  nData += sql
12d50 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e  ite3Fts3PutVarin
12d60 74 28 26 70 57 72 69 74 65 72 2d 3e 61 44 61 74  t(&pWriter->aDat
12d70 61 5b 6e 44 61 74 61 5d 2c 20 6e 44 6f 63 6c 69  a[nData], nDocli
12d80 73 74 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70  st);.  memcpy(&p
12d90 57 72 69 74 65 72 2d 3e 61 44 61 74 61 5b 6e 44  Writer->aData[nD
12da0 61 74 61 5d 2c 20 61 44 6f 63 6c 69 73 74 2c 20  ata], aDoclist, 
12db0 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 70 57 72  nDoclist);.  pWr
12dc0 69 74 65 72 2d 3e 6e 44 61 74 61 20 3d 20 6e 44  iter->nData = nD
12dd0 61 74 61 20 2b 20 6e 44 6f 63 6c 69 73 74 3b 0a  ata + nDoclist;.
12de0 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 63  .  /* Save the c
12df0 75 72 72 65 6e 74 20 74 65 72 6d 20 73 6f 20 74  urrent term so t
12e00 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 75 73  hat it can be us
12e10 65 64 20 74 6f 20 70 72 65 66 69 78 2d 63 6f 6d  ed to prefix-com
12e20 70 72 65 73 73 20 74 68 65 20 6e 65 78 74 2e 0a  press the next..
12e30 20 20 2a 2a 20 49 66 20 74 68 65 20 69 73 43 6f    ** If the isCo
12e40 70 79 54 65 72 6d 20 70 61 72 61 6d 65 74 65 72  pyTerm parameter
12e50 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
12e60 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
12e70 64 20 74 6f 20 62 79 0a 20 20 2a 2a 20 7a 54 65  d to by.  ** zTe
12e80 72 6d 20 69 73 20 74 72 61 6e 73 69 65 6e 74 2c  rm is transient,
12e90 20 73 6f 20 74 61 6b 65 20 61 20 63 6f 70 79 20   so take a copy 
12ea0 6f 66 20 74 68 65 20 74 65 72 6d 20 64 61 74 61  of the term data
12eb0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6a 75 73  . Otherwise, jus
12ec0 74 0a 20 20 2a 2a 20 73 74 6f 72 65 20 61 20 63  t.  ** store a c
12ed0 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  opy of the point
12ee0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  er..  */.  if( i
12ef0 73 43 6f 70 79 54 65 72 6d 20 29 7b 0a 20 20 20  sCopyTerm ){.   
12f00 20 69 66 28 20 6e 54 65 72 6d 3e 70 57 72 69 74   if( nTerm>pWrit
12f10 65 72 2d 3e 6e 4d 61 6c 6c 6f 63 20 29 7b 0a 20  er->nMalloc ){. 
12f20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 20       char *zNew 
12f30 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
12f40 63 28 70 57 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c  c(pWriter->zMall
12f50 6f 63 2c 20 6e 54 65 72 6d 2a 32 29 3b 0a 20 20  oc, nTerm*2);.  
12f60 20 20 20 20 69 66 28 20 21 7a 4e 65 77 20 29 7b      if( !zNew ){
12f70 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
12f80 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
12f90 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57 72 69      }.      pWri
12fa0 74 65 72 2d 3e 6e 4d 61 6c 6c 6f 63 20 3d 20 6e  ter->nMalloc = n
12fb0 54 65 72 6d 2a 32 3b 0a 20 20 20 20 20 20 70 57  Term*2;.      pW
12fc0 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d  riter->zMalloc =
12fd0 20 7a 4e 65 77 3b 0a 20 20 20 20 20 20 70 57 72   zNew;.      pWr
12fe0 69 74 65 72 2d 3e 7a 54 65 72 6d 20 3d 20 7a 4e  iter->zTerm = zN
12ff0 65 77 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ew;.    }.    as
13000 73 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 7a  sert( pWriter->z
13010 54 65 72 6d 3d 3d 70 57 72 69 74 65 72 2d 3e 7a  Term==pWriter->z
13020 4d 61 6c 6c 6f 63 20 29 3b 0a 20 20 20 20 6d 65  Malloc );.    me
13030 6d 63 70 79 28 70 57 72 69 74 65 72 2d 3e 7a 54  mcpy(pWriter->zT
13040 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  erm, zTerm, nTer
13050 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  m);.  }else{.   
13060 20 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d 20   pWriter->zTerm 
13070 3d 20 28 63 68 61 72 20 2a 29 7a 54 65 72 6d 3b  = (char *)zTerm;
13080 0a 20 20 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e  .  }.  pWriter->
13090 6e 54 65 72 6d 20 3d 20 6e 54 65 72 6d 3b 0a 0a  nTerm = nTerm;..
130a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
130b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75  OK;.}../*.** Flu
130c0 73 68 20 61 6c 6c 20 64 61 74 61 20 61 73 73 6f  sh all data asso
130d0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
130e0 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 6f 62  SegmentWriter ob
130f0 6a 65 63 74 20 70 57 72 69 74 65 72 20 74 6f 20  ject pWriter to 
13100 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  the.** database.
13110 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
13120 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 61 66  ust be called af
13130 74 65 72 20 61 6c 6c 20 74 65 72 6d 73 20 68 61  ter all terms ha
13140 76 65 20 62 65 65 6e 20 61 64 64 65 64 0a 2a 2a  ve been added.**
13150 20 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20   to the segment 
13160 75 73 69 6e 67 20 66 74 73 33 53 65 67 57 72 69  using fts3SegWri
13170 74 65 72 41 64 64 28 29 2e 20 49 66 20 73 75 63  terAdd(). If suc
13180 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
13190 4f 4b 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  OK is.** returne
131a0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  d. Otherwise, an
131b0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
131c0 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
131d0 74 20 66 74 73 33 53 65 67 57 72 69 74 65 72 46  t fts3SegWriterF
131e0 6c 75 73 68 28 0a 20 20 46 74 73 33 54 61 62 6c  lush(.  Fts3Tabl
131f0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
13200 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75          /* Virtu
13210 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  al table handle 
13220 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 57 72 69 74  */.  SegmentWrit
13230 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20  er *pWriter,    
13240 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 57       /* SegmentW
13250 72 69 74 65 72 20 74 6f 20 66 6c 75 73 68 20 74  riter to flush t
13260 6f 20 74 68 65 20 64 62 20 2a 2f 0a 20 20 73 71  o the db */.  sq
13270 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 65 76  lite3_int64 iLev
13280 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  el,           /*
13290 20 56 61 6c 75 65 20 66 6f 72 20 27 6c 65 76 65   Value for 'leve
132a0 6c 27 20 63 6f 6c 75 6d 6e 20 6f 66 20 25 5f 73  l' column of %_s
132b0 65 67 64 69 72 20 2a 2f 0a 20 20 69 6e 74 20 69  egdir */.  int i
132c0 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20  Idx             
132d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
132e0 6c 75 65 20 66 6f 72 20 27 69 64 78 27 20 63 6f  lue for 'idx' co
132f0 6c 75 6d 6e 20 6f 66 20 25 5f 73 65 67 64 69 72  lumn of %_segdir
13300 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
13310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13320 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
13330 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 66 28  rn code */.  if(
13340 20 70 57 72 69 74 65 72 2d 3e 70 54 72 65 65 20   pWriter->pTree 
13350 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  ){.    sqlite3_i
13360 6e 74 36 34 20 69 4c 61 73 74 20 3d 20 30 3b 20  nt64 iLast = 0; 
13370 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20       /* Largest 
13380 62 6c 6f 63 6b 20 69 64 20 77 72 69 74 74 65 6e  block id written
13390 20 74 6f 20 64 61 74 61 62 61 73 65 20 2a 2f 0a   to database */.
133a0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
133b0 34 20 69 4c 61 73 74 4c 65 61 66 3b 20 20 20 20  4 iLastLeaf;    
133c0 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 6c 65 61    /* Largest lea
133d0 66 20 62 6c 6f 63 6b 20 69 64 20 77 72 69 74 74  f block id writt
133e0 65 6e 20 74 6f 20 64 62 20 2a 2f 0a 20 20 20 20  en to db */.    
133f0 63 68 61 72 20 2a 7a 52 6f 6f 74 20 3d 20 4e 55  char *zRoot = NU
13400 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  LL;           /*
13410 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
13420 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 72 6f  er containing ro
13430 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 20 20 69  ot node */.    i
13440 6e 74 20 6e 52 6f 6f 74 20 3d 20 30 3b 20 20 20  nt nRoot = 0;   
13450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13460 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 7a  Size of buffer z
13470 52 6f 6f 74 20 2a 2f 0a 0a 20 20 20 20 69 4c 61  Root */..    iLa
13480 73 74 4c 65 61 66 20 3d 20 70 57 72 69 74 65 72  stLeaf = pWriter
13490 2d 3e 69 46 72 65 65 3b 0a 20 20 20 20 72 63 20  ->iFree;.    rc 
134a0 3d 20 66 74 73 33 57 72 69 74 65 53 65 67 6d 65  = fts3WriteSegme
134b0 6e 74 28 70 2c 20 70 57 72 69 74 65 72 2d 3e 69  nt(p, pWriter->i
134c0 46 72 65 65 2b 2b 2c 20 70 57 72 69 74 65 72 2d  Free++, pWriter-
134d0 3e 61 44 61 74 61 2c 20 70 57 72 69 74 65 72 2d  >aData, pWriter-
134e0 3e 6e 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  >nData);.    if(
134f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
13500 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  {.      rc = fts
13510 33 4e 6f 64 65 57 72 69 74 65 28 70 2c 20 70 57  3NodeWrite(p, pW
13520 72 69 74 65 72 2d 3e 70 54 72 65 65 2c 20 31 2c  riter->pTree, 1,
13530 0a 20 20 20 20 20 20 20 20 20 20 70 57 72 69 74  .          pWrit
13540 65 72 2d 3e 69 46 69 72 73 74 2c 20 70 57 72 69  er->iFirst, pWri
13550 74 65 72 2d 3e 69 46 72 65 65 2c 20 26 69 4c 61  ter->iFree, &iLa
13560 73 74 2c 20 26 7a 52 6f 6f 74 2c 20 26 6e 52 6f  st, &zRoot, &nRo
13570 6f 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ot);.    }.    i
13580 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13590 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
135a0 74 73 33 57 72 69 74 65 53 65 67 64 69 72 28 0a  ts3WriteSegdir(.
135b0 20 20 20 20 20 20 20 20 20 20 70 2c 20 69 4c 65            p, iLe
135c0 76 65 6c 2c 20 69 49 64 78 2c 20 70 57 72 69 74  vel, iIdx, pWrit
135d0 65 72 2d 3e 69 46 69 72 73 74 2c 20 69 4c 61 73  er->iFirst, iLas
135e0 74 4c 65 61 66 2c 20 69 4c 61 73 74 2c 20 7a 52  tLeaf, iLast, zR
135f0 6f 6f 74 2c 20 6e 52 6f 6f 74 29 3b 0a 20 20 20  oot, nRoot);.   
13600 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
13610 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 74 72  /* The entire tr
13620 65 65 20 66 69 74 73 20 6f 6e 20 74 68 65 20 72  ee fits on the r
13630 6f 6f 74 20 6e 6f 64 65 2e 20 57 72 69 74 65 20  oot node. Write 
13640 69 74 20 74 6f 20 74 68 65 20 73 65 67 64 69 72  it to the segdir
13650 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 72   table. */.    r
13660 63 20 3d 20 66 74 73 33 57 72 69 74 65 53 65 67  c = fts3WriteSeg
13670 64 69 72 28 0a 20 20 20 20 20 20 20 20 70 2c 20  dir(.        p, 
13680 69 4c 65 76 65 6c 2c 20 69 49 64 78 2c 20 30 2c  iLevel, iIdx, 0,
13690 20 30 2c 20 30 2c 20 70 57 72 69 74 65 72 2d 3e   0, 0, pWriter->
136a0 61 44 61 74 61 2c 20 70 57 72 69 74 65 72 2d 3e  aData, pWriter->
136b0 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 70 2d  nData);.  }.  p-
136c0 3e 6e 4c 65 61 66 41 64 64 2b 2b 3b 0a 20 20 72  >nLeafAdd++;.  r
136d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
136e0 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6d  ** Release all m
136f0 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68  emory held by th
13700 65 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20  e SegmentWriter 
13710 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
13720 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 61   the .** first a
13730 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
13740 69 63 20 76 6f 69 64 20 66 74 73 33 53 65 67 57  ic void fts3SegW
13750 72 69 74 65 72 46 72 65 65 28 53 65 67 6d 65 6e  riterFree(Segmen
13760 74 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  tWriter *pWriter
13770 29 7b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  ){.  if( pWriter
13780 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
13790 66 72 65 65 28 70 57 72 69 74 65 72 2d 3e 61 44  free(pWriter->aD
137a0 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ata);.    sqlite
137b0 33 5f 66 72 65 65 28 70 57 72 69 74 65 72 2d 3e  3_free(pWriter->
137c0 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 66 74  zMalloc);.    ft
137d0 73 33 4e 6f 64 65 46 72 65 65 28 70 57 72 69 74  s3NodeFree(pWrit
137e0 65 72 2d 3e 70 54 72 65 65 29 3b 0a 20 20 20 20  er->pTree);.    
137f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57 72  sqlite3_free(pWr
13800 69 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  iter);.  }.}../*
13810 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 76 61  .** The first va
13820 6c 75 65 20 69 6e 20 74 68 65 20 61 70 56 61 6c  lue in the apVal
13830 5b 5d 20 61 72 72 61 79 20 69 73 20 61 73 73 75  [] array is assu
13840 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61  med to contain a
13850 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 20 54 68  n integer..** Th
13860 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74  is function test
13870 73 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  s if there exist
13880 20 61 6e 79 20 64 6f 63 75 6d 65 6e 74 73 20 77   any documents w
13890 69 74 68 20 64 6f 63 69 64 20 76 61 6c 75 65 73  ith docid values
138a0 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 64 69 66   that.** are dif
138b0 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 61 74  ferent from that
138c0 20 69 6e 74 65 67 65 72 2e 20 69 2e 65 2e 20 69   integer. i.e. i
138d0 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 64  f deleting the d
138e0 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 64 6f 63  ocument with doc
138f0 69 64 0a 2a 2a 20 70 52 6f 77 69 64 20 77 6f 75  id.** pRowid wou
13900 6c 64 20 6d 65 61 6e 20 74 68 65 20 46 54 53 33  ld mean the FTS3
13910 20 74 61 62 6c 65 20 77 65 72 65 20 65 6d 70 74   table were empt
13920 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  y..**.** If succ
13930 65 73 73 66 75 6c 2c 20 2a 70 69 73 45 6d 70 74  essful, *pisEmpt
13940 79 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  y is set to true
13950 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
13960 20 65 6d 70 74 79 20 65 78 63 65 70 74 20 66 6f   empty except fo
13970 72 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 20 70 52  r.** document pR
13980 6f 77 69 64 2c 20 6f 72 20 66 61 6c 73 65 20 6f  owid, or false o
13990 74 68 65 72 77 69 73 65 2c 20 61 6e 64 20 53 51  therwise, and SQ
139a0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
139b0 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72  ned. If an.** er
139c0 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
139d0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
139e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
139f0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
13a00 49 73 45 6d 70 74 79 28 46 74 73 33 54 61 62 6c  IsEmpty(Fts3Tabl
13a10 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 61  e *p, sqlite3_va
13a20 6c 75 65 20 2a 70 52 6f 77 69 64 2c 20 69 6e 74  lue *pRowid, int
13a30 20 2a 70 69 73 45 6d 70 74 79 29 7b 0a 20 20 73   *pisEmpty){.  s
13a40 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
13a50 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  mt;.  int rc;.  
13a60 69 66 28 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54  if( p->zContentT
13a70 62 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  bl ){.    /* If 
13a80 75 73 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  using the conten
13a90 74 3d 78 78 78 20 6f 70 74 69 6f 6e 2c 20 61 73  t=xxx option, as
13aa0 73 75 6d 65 20 74 68 65 20 74 61 62 6c 65 20 69  sume the table i
13ab0 73 20 6e 65 76 65 72 20 65 6d 70 74 79 20 2a 2f  s never empty */
13ac0 0a 20 20 20 20 2a 70 69 73 45 6d 70 74 79 20 3d  .    *pisEmpty =
13ad0 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   0;.    rc = SQL
13ae0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
13af0 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71  .    rc = fts3Sq
13b00 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 49 53 5f  lStmt(p, SQL_IS_
13b10 45 4d 50 54 59 2c 20 26 70 53 74 6d 74 2c 20 26  EMPTY, &pStmt, &
13b20 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28  pRowid);.    if(
13b30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
13b40 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  {.      if( SQLI
13b50 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
13b60 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
13b70 20 20 20 20 20 20 20 2a 70 69 73 45 6d 70 74 79         *pisEmpty
13b80 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
13b90 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b  n_int(pStmt, 0);
13ba0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
13bb0 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
13bc0 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a  t(pStmt);.    }.
13bd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
13be0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  .}../*.** Set *p
13bf0 6e 4d 61 78 20 74 6f 20 74 68 65 20 6c 61 72 67  nMax to the larg
13c00 65 73 74 20 73 65 67 6d 65 6e 74 20 6c 65 76 65  est segment leve
13c10 6c 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  l in the databas
13c20 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a  e for the index.
13c30 2a 2a 20 69 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  ** iIndex..**.**
13c40 20 53 65 67 6d 65 6e 74 20 6c 65 76 65 6c 73 20   Segment levels 
13c50 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
13c60 65 20 27 6c 65 76 65 6c 27 20 63 6f 6c 75 6d 6e  e 'level' column
13c70 20 6f 66 20 74 68 65 20 25 5f 73 65 67 64 69 72   of the %_segdir
13c80 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   table..**.** Re
13c90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
13ca0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
13cb0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
13cc0 20 63 6f 64 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f   code if not..*/
13cd0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
13ce0 53 65 67 6d 65 6e 74 4d 61 78 4c 65 76 65 6c 28  SegmentMaxLevel(
13cf0 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
13d00 20 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c   .  int iLangid,
13d10 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 2c 20 0a  .  int iIndex, .
13d20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
13d30 2a 70 6e 4d 61 78 0a 29 7b 0a 20 20 73 71 6c 69  *pnMax.){.  sqli
13d40 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
13d50 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
13d60 65 72 74 28 20 69 49 6e 64 65 78 3e 3d 30 20 26  ert( iIndex>=0 &
13d70 26 20 69 49 6e 64 65 78 3c 70 2d 3e 6e 49 6e 64  & iIndex<p->nInd
13d80 65 78 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  ex );..  /* Set 
13d90 70 53 74 6d 74 20 74 6f 20 74 68 65 20 63 6f 6d  pStmt to the com
13da0 70 69 6c 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  piled version of
13db0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45  :.  **.  **   SE
13dc0 4c 45 43 54 20 6d 61 78 28 6c 65 76 65 6c 29 20  LECT max(level) 
13dd0 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64  FROM %Q.'%q_segd
13de0 69 72 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20  ir' WHERE level 
13df0 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 0a  BETWEEN ? AND ?.
13e00 20 20 2a 2a 0a 20 20 2a 2a 20 28 31 30 32 34 20    **.  ** (1024 
13e10 69 73 20 61 63 74 75 61 6c 6c 79 20 74 68 65 20  is actually the 
13e20 76 61 6c 75 65 20 6f 66 20 6d 61 63 72 6f 20 46  value of macro F
13e30 54 53 33 5f 53 45 47 44 49 52 5f 50 52 45 46 49  TS3_SEGDIR_PREFI
13e40 58 4c 45 56 45 4c 5f 53 54 52 29 2e 0a 20 20 2a  XLEVEL_STR)..  *
13e50 2f 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  /.  rc = fts3Sql
13e60 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45  Stmt(p, SQL_SELE
13e70 43 54 5f 53 45 47 44 49 52 5f 4d 41 58 5f 4c 45  CT_SEGDIR_MAX_LE
13e80 56 45 4c 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  VEL, &pStmt, 0);
13e90 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
13ea0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
13eb0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ;.  sqlite3_bind
13ec0 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 2c  _int64(pStmt, 1,
13ed0 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65   getAbsoluteLeve
13ee0 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49  l(p, iLangid, iI
13ef0 6e 64 65 78 2c 20 30 29 29 3b 0a 20 20 73 71 6c  ndex, 0));.  sql
13f00 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
13f10 70 53 74 6d 74 2c 20 32 2c 20 0a 20 20 20 20 20  pStmt, 2, .     
13f20 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65   getAbsoluteLeve
13f30 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49  l(p, iLangid, iI
13f40 6e 64 65 78 2c 20 46 54 53 33 5f 53 45 47 44 49  ndex, FTS3_SEGDI
13f50 52 5f 4d 41 58 4c 45 56 45 4c 2d 31 29 0a 20 20  R_MAXLEVEL-1).  
13f60 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
13f70 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
13f80 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
13f90 2a 70 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33  *pnMax = sqlite3
13fa0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
13fb0 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  tmt, 0);.  }.  r
13fc0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 72 65  eturn sqlite3_re
13fd0 73 65 74 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f  set(pStmt);.}../
13fe0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20  *.** Delete all 
13ff0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 25  entries in the %
14000 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20  _segments table 
14010 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
14020 74 68 65 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 6f  the segment.** o
14030 70 65 6e 65 64 20 77 69 74 68 20 73 65 67 2d 72  pened with seg-r
14040 65 61 64 65 72 20 70 53 65 67 2e 20 54 68 69 73  eader pSeg. This
14050 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
14060 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 63 6f  ot affect the co
14070 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65  ntents.** of the
14080 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 2e   %_segdir table.
14090 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
140a0 74 73 33 44 65 6c 65 74 65 53 65 67 6d 65 6e 74  ts3DeleteSegment
140b0 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
140c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
140d0 20 20 20 20 2f 2a 20 46 54 53 20 74 61 62 6c 65      /* FTS table
140e0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73   handle */.  Fts
140f0 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67  3SegReader *pSeg
14100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14110 53 65 67 6d 65 6e 74 20 74 6f 20 64 65 6c 65 74  Segment to delet
14120 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
14130 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
14140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
14150 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 66  urn code */.  if
14160 28 20 70 53 65 67 2d 3e 69 53 74 61 72 74 42 6c  ( pSeg->iStartBl
14170 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ock ){.    sqlit
14180 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74 65  e3_stmt *pDelete
14190 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20  ;        /* SQL 
141a0 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 64 65 6c  statement to del
141b0 65 74 65 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20  ete rows */.    
141c0 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
141d0 28 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53  (p, SQL_DELETE_S
141e0 45 47 4d 45 4e 54 53 5f 52 41 4e 47 45 2c 20 26  EGMENTS_RANGE, &
141f0 70 44 65 6c 65 74 65 2c 20 30 29 3b 0a 20 20 20  pDelete, 0);.   
14200 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14210 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
14220 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
14230 44 65 6c 65 74 65 2c 20 31 2c 20 70 53 65 67 2d  Delete, 1, pSeg-
14240 3e 69 53 74 61 72 74 42 6c 6f 63 6b 29 3b 0a 20  >iStartBlock);. 
14250 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
14260 64 5f 69 6e 74 36 34 28 70 44 65 6c 65 74 65 2c  d_int64(pDelete,
14270 20 32 2c 20 70 53 65 67 2d 3e 69 45 6e 64 42 6c   2, pSeg->iEndBl
14280 6f 63 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ock);.      sqli
14290 74 65 33 5f 73 74 65 70 28 70 44 65 6c 65 74 65  te3_step(pDelete
142a0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
142b0 6c 69 74 65 33 5f 72 65 73 65 74 28 70 44 65 6c  lite3_reset(pDel
142c0 65 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ete);.    }.  }.
142d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
142e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
142f0 69 6f 6e 20 69 73 20 75 73 65 64 20 61 66 74 65  ion is used afte
14300 72 20 6d 65 72 67 69 6e 67 20 6d 75 6c 74 69 70  r merging multip
14310 6c 65 20 73 65 67 6d 65 6e 74 73 20 69 6e 74 6f  le segments into
14320 20 61 20 73 69 6e 67 6c 65 20 6c 61 72 67 65 0a   a single large.
14330 2a 2a 20 73 65 67 6d 65 6e 74 20 74 6f 20 64 65  ** segment to de
14340 6c 65 74 65 20 74 68 65 20 6f 6c 64 2c 20 6e 6f  lete the old, no
14350 77 20 72 65 64 75 6e 64 61 6e 74 2c 20 73 65 67  w redundant, seg
14360 6d 65 6e 74 20 62 2d 74 72 65 65 73 2e 20 53 70  ment b-trees. Sp
14370 65 63 69 66 69 63 61 6c 6c 79 2c 0a 2a 2a 20 69  ecifically,.** i
14380 74 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 31 29 20 44  t:.** .**   1) D
14390 65 6c 65 74 65 73 20 61 6c 6c 20 25 5f 73 65 67  eletes all %_seg
143a0 6d 65 6e 74 73 20 65 6e 74 72 69 65 73 20 66 6f  ments entries fo
143b0 72 20 74 68 65 20 73 65 67 6d 65 6e 74 73 20 61  r the segments a
143c0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
143d0 2a 2a 20 20 20 20 20 20 65 61 63 68 20 6f 66 20  **      each of 
143e0 74 68 65 20 53 65 67 52 65 61 64 65 72 20 6f 62  the SegReader ob
143f0 6a 65 63 74 73 20 69 6e 20 74 68 65 20 61 72 72  jects in the arr
14400 61 79 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ay passed as the
14410 20 74 68 69 72 64 20 0a 2a 2a 20 20 20 20 20 20   third .**      
14420 61 72 67 75 6d 65 6e 74 2c 20 61 6e 64 0a 2a 2a  argument, and.**
14430 0a 2a 2a 20 20 20 32 29 20 64 65 6c 65 74 65 73  .**   2) deletes
14440 20 61 6c 6c 20 25 5f 73 65 67 64 69 72 20 65 6e   all %_segdir en
14450 74 72 69 65 73 20 77 69 74 68 20 6c 65 76 65 6c  tries with level
14460 20 69 4c 65 76 65 6c 2c 20 6f 72 20 61 6c 6c 20   iLevel, or all 
14470 25 5f 73 65 67 64 69 72 0a 2a 2a 20 20 20 20 20  %_segdir.**     
14480 20 65 6e 74 72 69 65 73 20 72 65 67 61 72 64 6c   entries regardl
14490 65 73 73 20 6f 66 20 6c 65 76 65 6c 20 69 66 20  ess of level if 
144a0 28 69 4c 65 76 65 6c 3c 30 29 2e 0a 2a 2a 0a 2a  (iLevel<0)..**.*
144b0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
144c0 65 74 75 72 6e 65 64 20 69 66 20 73 75 63 63 65  eturned if succe
144d0 73 73 66 75 6c 2c 20 6f 74 68 65 72 77 69 73 65  ssful, otherwise
144e0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
144f0 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
14500 20 69 6e 74 20 66 74 73 33 44 65 6c 65 74 65 53   int fts3DeleteS
14510 65 67 64 69 72 28 0a 20 20 46 74 73 33 54 61 62  egdir(.  Fts3Tab
14520 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
14530 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74           /* Virt
14540 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  ual table handle
14550 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69   */.  int iLangi
14560 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
14570 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67        /* Languag
14580 65 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49  e id */.  int iI
14590 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
145a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
145b0 65 78 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65 78  ex for p->aIndex
145c0 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c   */.  int iLevel
145d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
145e0 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f        /* Level o
145f0 66 20 25 5f 73 65 67 64 69 72 20 65 6e 74 72 69  f %_segdir entri
14600 65 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  es to delete */.
14610 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
14620 2a 2a 61 70 53 65 67 6d 65 6e 74 2c 20 20 20 20  **apSegment,    
14630 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 53 65    /* Array of Se
14640 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74 73 20  gReader objects 
14650 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 65 72  */.  int nReader
14660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14670 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
14680 61 72 72 61 79 20 61 70 53 65 67 6d 65 6e 74 20  array apSegment 
14690 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
146a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
146b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
146c0 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n Code */.  int 
146d0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
146e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
146f0 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
14700 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
14710 6d 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b  mt *pDelete = 0;
14720 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61        /* SQL sta
14730 74 65 6d 65 6e 74 20 74 6f 20 64 65 6c 65 74 65  tement to delete
14740 20 72 6f 77 73 20 2a 2f 0a 0a 20 20 66 6f 72 28   rows */..  for(
14750 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
14760 4f 4b 20 26 26 20 69 3c 6e 52 65 61 64 65 72 3b  OK && i<nReader;
14770 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20   i++){.    rc = 
14780 66 74 73 33 44 65 6c 65 74 65 53 65 67 6d 65 6e  fts3DeleteSegmen
14790 74 28 70 2c 20 61 70 53 65 67 6d 65 6e 74 5b 69  t(p, apSegment[i
147a0 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ]);.  }.  if( rc
147b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
147c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
147d0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65  }..  assert( iLe
147e0 76 65 6c 3e 3d 30 20 7c 7c 20 69 4c 65 76 65 6c  vel>=0 || iLevel
147f0 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52  ==FTS3_SEGCURSOR
14800 5f 41 4c 4c 20 29 3b 0a 20 20 69 66 28 20 69 4c  _ALL );.  if( iL
14810 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55  evel==FTS3_SEGCU
14820 52 53 4f 52 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  RSOR_ALL ){.    
14830 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
14840 28 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53  (p, SQL_DELETE_S
14850 45 47 44 49 52 5f 52 41 4e 47 45 2c 20 26 70 44  EGDIR_RANGE, &pD
14860 65 6c 65 74 65 2c 20 30 29 3b 0a 20 20 20 20 69  elete, 0);.    i
14870 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14880 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14890 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 44 65  3_bind_int64(pDe
148a0 6c 65 74 65 2c 20 31 2c 20 67 65 74 41 62 73 6f  lete, 1, getAbso
148b0 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61  luteLevel(p, iLa
148c0 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 30 29  ngid, iIndex, 0)
148d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
148e0 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c  _bind_int64(pDel
148f0 65 74 65 2c 20 32 2c 20 0a 20 20 20 20 20 20 20  ete, 2, .       
14900 20 20 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65     getAbsoluteLe
14910 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20  vel(p, iLangid, 
14920 69 49 6e 64 65 78 2c 20 46 54 53 33 5f 53 45 47  iIndex, FTS3_SEG
14930 44 49 52 5f 4d 41 58 4c 45 56 45 4c 2d 31 29 0a  DIR_MAXLEVEL-1).
14940 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
14950 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
14960 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
14970 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 44 49  SQL_DELETE_SEGDI
14980 52 5f 4c 45 56 45 4c 2c 20 26 70 44 65 6c 65 74  R_LEVEL, &pDelet
14990 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
149a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
149b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
149c0 6e 64 5f 69 6e 74 36 34 28 0a 20 20 20 20 20 20  nd_int64(.      
149d0 20 20 20 20 70 44 65 6c 65 74 65 2c 20 31 2c 20      pDelete, 1, 
149e0 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c  getAbsoluteLevel
149f0 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e  (p, iLangid, iIn
14a00 64 65 78 2c 20 69 4c 65 76 65 6c 29 0a 20 20 20  dex, iLevel).   
14a10 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a     );.    }.  }.
14a20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
14a30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
14a40 74 65 33 5f 73 74 65 70 28 70 44 65 6c 65 74 65  te3_step(pDelete
14a50 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
14a60 74 65 33 5f 72 65 73 65 74 28 70 44 65 6c 65 74  te3_reset(pDelet
14a70 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  e);.  }..  retur
14a80 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
14a90 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
14aa0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 62 75 66  n is called, buf
14ab0 66 65 72 20 2a 70 70 4c 69 73 74 20 28 73 69 7a  fer *ppList (siz
14ac0 65 20 2a 70 6e 4c 69 73 74 20 62 79 74 65 73 29  e *pnList bytes)
14ad0 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20 61 20   contains .** a 
14ae0 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 74 68  position list th
14af0 61 74 20 6d 61 79 20 28 6f 72 20 6d 61 79 20 6e  at may (or may n
14b00 6f 74 29 20 66 65 61 74 75 72 65 20 6d 75 6c 74  ot) feature mult
14b10 69 70 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 54 68  iple columns. Th
14b20 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
14b30 64 6a 75 73 74 73 20 74 68 65 20 70 6f 69 6e 74  djusts the point
14b40 65 72 20 2a 70 70 4c 69 73 74 20 61 6e 64 20 74  er *ppList and t
14b50 68 65 20 6c 65 6e 67 74 68 20 2a 70 6e 4c 69 73  he length *pnLis
14b60 74 20 73 6f 20 74 68 61 74 20 74 68 65 79 0a 2a  t so that they.*
14b70 2a 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 73  * identify the s
14b80 75 62 73 65 74 20 6f 66 20 74 68 65 20 70 6f 73  ubset of the pos
14b90 69 74 69 6f 6e 20 6c 69 73 74 20 74 68 61 74 20  ition list that 
14ba0 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 63  corresponds to c
14bb0 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 0a 2a 2a 0a 2a  olumn iCol..**.*
14bc0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
14bd0 6f 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  o entries in the
14be0 20 69 6e 70 75 74 20 70 6f 73 69 74 69 6f 6e 20   input position 
14bf0 6c 69 73 74 20 66 6f 72 20 63 6f 6c 75 6d 6e 20  list for column 
14c00 69 43 6f 6c 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70  iCol, then.** *p
14c10 6e 4c 69 73 74 20 69 73 20 73 65 74 20 74 6f 20  nList is set to 
14c20 7a 65 72 6f 20 62 65 66 6f 72 65 20 72 65 74 75  zero before retu
14c30 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
14c40 20 76 6f 69 64 20 66 74 73 33 43 6f 6c 75 6d 6e   void fts3Column
14c50 46 69 6c 74 65 72 28 0a 20 20 69 6e 74 20 69 43  Filter(.  int iC
14c60 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
14c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
14c80 75 6d 6e 20 74 6f 20 66 69 6c 74 65 72 20 6f 6e  umn to filter on
14c90 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 4c   */.  char **ppL
14ca0 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
14cb0 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
14cc0 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73 69   Pointer to posi
14cd0 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 69  tion list */.  i
14ce0 6e 74 20 2a 70 6e 4c 69 73 74 20 20 20 20 20 20  nt *pnList      
14cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14d00 2a 20 49 4e 2f 4f 55 54 3a 20 53 69 7a 65 20 6f  * IN/OUT: Size o
14d10 66 20 62 75 66 66 65 72 20 2a 70 70 4c 69 73 74  f buffer *ppList
14d20 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a   in bytes */.){.
14d30 20 20 63 68 61 72 20 2a 70 4c 69 73 74 20 3d 20    char *pList = 
14d40 2a 70 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 6e  *ppList;.  int n
14d50 4c 69 73 74 20 3d 20 2a 70 6e 4c 69 73 74 3b 0a  List = *pnList;.
14d60 20 20 63 68 61 72 20 2a 70 45 6e 64 20 3d 20 26    char *pEnd = &
14d70 70 4c 69 73 74 5b 6e 4c 69 73 74 5d 3b 0a 20 20  pList[nList];.  
14d80 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30  int iCurrent = 0
14d90 3b 0a 20 20 63 68 61 72 20 2a 70 20 3d 20 70 4c  ;.  char *p = pL
14da0 69 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ist;..  assert( 
14db0 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 77 68 69  iCol>=0 );.  whi
14dc0 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 63 68 61  le( 1 ){.    cha
14dd0 72 20 63 20 3d 20 30 3b 0a 20 20 20 20 77 68 69  r c = 0;.    whi
14de0 6c 65 28 20 70 3c 70 45 6e 64 20 26 26 20 28 63  le( p<pEnd && (c
14df0 20 7c 20 2a 70 29 26 30 78 46 45 20 29 20 63 20   | *p)&0xFE ) c 
14e00 3d 20 2a 70 2b 2b 20 26 20 30 78 38 30 3b 0a 20  = *p++ & 0x80;. 
14e10 20 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d   .    if( iCol==
14e20 69 43 75 72 72 65 6e 74 20 29 7b 0a 20 20 20 20  iCurrent ){.    
14e30 20 20 6e 4c 69 73 74 20 3d 20 28 69 6e 74 29 28    nList = (int)(
14e40 70 20 2d 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  p - pList);.    
14e50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
14e60 20 20 20 20 6e 4c 69 73 74 20 2d 3d 20 28 69 6e      nList -= (in
14e70 74 29 28 70 20 2d 20 70 4c 69 73 74 29 3b 0a 20  t)(p - pList);. 
14e80 20 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20     pList = p;.  
14e90 20 20 69 66 28 20 6e 4c 69 73 74 3d 3d 30 20 29    if( nList==0 )
14ea0 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
14eb0 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 26 70 4c     }.    p = &pL
14ec0 69 73 74 5b 31 5d 3b 0a 20 20 20 20 70 20 2b 3d  ist[1];.    p +=
14ed0 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56   sqlite3Fts3GetV
14ee0 61 72 69 6e 74 33 32 28 70 2c 20 26 69 43 75 72  arint32(p, &iCur
14ef0 72 65 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70  rent);.  }..  *p
14f00 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pList = pList;. 
14f10 20 2a 70 6e 4c 69 73 74 20 3d 20 6e 4c 69 73 74   *pnList = nList
14f20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 63 68 65  ;.}../*.** Cache
14f30 20 64 61 74 61 20 69 6e 20 74 68 65 20 46 74 73   data in the Fts
14f40 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 2e  3MultiSegReader.
14f50 61 42 75 66 66 65 72 5b 5d 20 62 75 66 66 65 72  aBuffer[] buffer
14f60 20 28 6f 76 65 72 77 72 69 74 69 6e 67 20 61 6e   (overwriting an
14f70 79 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 64 61  y.** existing da
14f80 74 61 29 2e 20 47 72 6f 77 20 74 68 65 20 62 75  ta). Grow the bu
14f90 66 66 65 72 20 69 66 20 72 65 71 75 69 72 65 64  ffer if required
14fa0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
14fb0 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51  ssful, return SQ
14fc0 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69  LITE_OK. Otherwi
14fd0 73 65 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72  se, if an OOM er
14fe0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
14ff0 65 64 0a 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20  ed.** trying to 
15000 72 65 73 69 7a 65 20 74 68 65 20 62 75 66 66 65  resize the buffe
15010 72 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r, return SQLITE
15020 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69  _NOMEM..*/.stati
15030 63 20 69 6e 74 20 66 74 73 33 4d 73 72 42 75 66  c int fts3MsrBuf
15040 66 65 72 44 61 74 61 28 0a 20 20 46 74 73 33 4d  ferData(.  Fts3M
15050 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70  ultiSegReader *p
15060 4d 73 72 2c 20 20 20 20 20 20 20 2f 2a 20 4d 75  Msr,       /* Mu
15070 6c 74 69 2d 73 65 67 6d 65 6e 74 2d 72 65 61 64  lti-segment-read
15080 65 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  er handle */.  c
15090 68 61 72 20 2a 70 4c 69 73 74 2c 0a 20 20 69 6e  har *pList,.  in
150a0 74 20 6e 4c 69 73 74 0a 29 7b 0a 20 20 69 66 28  t nList.){.  if(
150b0 20 6e 4c 69 73 74 3e 70 4d 73 72 2d 3e 6e 42 75   nList>pMsr->nBu
150c0 66 66 65 72 20 29 7b 0a 20 20 20 20 63 68 61 72  ffer ){.    char
150d0 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4d 73 72   *pNew;.    pMsr
150e0 2d 3e 6e 42 75 66 66 65 72 20 3d 20 6e 4c 69 73  ->nBuffer = nLis
150f0 74 2a 32 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  t*2;.    pNew = 
15100 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
15110 72 65 61 6c 6c 6f 63 28 70 4d 73 72 2d 3e 61 42  realloc(pMsr->aB
15120 75 66 66 65 72 2c 20 70 4d 73 72 2d 3e 6e 42 75  uffer, pMsr->nBu
15130 66 66 65 72 29 3b 0a 20 20 20 20 69 66 28 20 21  ffer);.    if( !
15140 70 4e 65 77 20 29 20 72 65 74 75 72 6e 20 53 51  pNew ) return SQ
15150 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
15160 70 4d 73 72 2d 3e 61 42 75 66 66 65 72 20 3d 20  pMsr->aBuffer = 
15170 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 6d 65 6d  pNew;.  }..  mem
15180 63 70 79 28 70 4d 73 72 2d 3e 61 42 75 66 66 65  cpy(pMsr->aBuffe
15190 72 2c 20 70 4c 69 73 74 2c 20 6e 4c 69 73 74 29  r, pList, nList)
151a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
151b0 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c  E_OK;.}..int sql
151c0 69 74 65 33 46 74 73 33 4d 73 72 49 6e 63 72 4e  ite3Fts3MsrIncrN
151d0 65 78 74 28 0a 20 20 46 74 73 33 54 61 62 6c 65  ext(.  Fts3Table
151e0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
151f0 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61         /* Virtua
15200 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  l table handle *
15210 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67  /.  Fts3MultiSeg
15220 52 65 61 64 65 72 20 2a 70 4d 73 72 2c 20 20 20  Reader *pMsr,   
15230 20 20 20 20 2f 2a 20 4d 75 6c 74 69 2d 73 65 67      /* Multi-seg
15240 6d 65 6e 74 2d 72 65 61 64 65 72 20 68 61 6e 64  ment-reader hand
15250 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
15260 69 6e 74 36 34 20 2a 70 69 44 6f 63 69 64 2c 20  int64 *piDocid, 
15270 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
15280 44 6f 63 69 64 20 76 61 6c 75 65 20 2a 2f 0a 20  Docid value */. 
15290 20 63 68 61 72 20 2a 2a 70 61 50 6f 73 6c 69 73   char **paPoslis
152a0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
152b0 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72   /* OUT: Pointer
152c0 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73   to position lis
152d0 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 50 6f  t */.  int *pnPo
152e0 73 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20  slist           
152f0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
15300 69 7a 65 20 6f 66 20 70 6f 73 69 74 69 6f 6e 20  ize of position 
15310 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  list in bytes */
15320 0a 29 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65  .){.  int nMerge
15330 20 3d 20 70 4d 73 72 2d 3e 6e 41 64 76 61 6e 63   = pMsr->nAdvanc
15340 65 3b 0a 20 20 46 74 73 33 53 65 67 52 65 61 64  e;.  Fts3SegRead
15350 65 72 20 2a 2a 61 70 53 65 67 6d 65 6e 74 20 3d  er **apSegment =
15360 20 70 4d 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74   pMsr->apSegment
15370 3b 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70 29 28  ;.  int (*xCmp)(
15380 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2c  Fts3SegReader *,
15390 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
153a0 29 20 3d 20 28 0a 20 20 20 20 70 2d 3e 62 44 65  ) = (.    p->bDe
153b0 73 63 49 64 78 20 3f 20 66 74 73 33 53 65 67 52  scIdx ? fts3SegR
153c0 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 52  eaderDoclistCmpR
153d0 65 76 20 3a 20 66 74 73 33 53 65 67 52 65 61 64  ev : fts3SegRead
153e0 65 72 44 6f 63 6c 69 73 74 43 6d 70 0a 20 20 29  erDoclistCmp.  )
153f0 3b 0a 0a 20 20 69 66 28 20 6e 4d 65 72 67 65 3d  ;..  if( nMerge=
15400 3d 30 20 29 7b 0a 20 20 20 20 2a 70 61 50 6f 73  =0 ){.    *paPos
15410 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 72 65  list = 0;.    re
15420 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15430 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 31 20    }..  while( 1 
15440 29 7b 0a 20 20 20 20 46 74 73 33 53 65 67 52 65  ){.    Fts3SegRe
15450 61 64 65 72 20 2a 70 53 65 67 3b 0a 20 20 20 20  ader *pSeg;.    
15460 70 53 65 67 20 3d 20 70 4d 73 72 2d 3e 61 70 53  pSeg = pMsr->apS
15470 65 67 6d 65 6e 74 5b 30 5d 3b 0a 0a 20 20 20 20  egment[0];..    
15480 69 66 28 20 70 53 65 67 2d 3e 70 4f 66 66 73 65  if( pSeg->pOffse
15490 74 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  tList==0 ){.    
154a0 20 20 2a 70 61 50 6f 73 6c 69 73 74 20 3d 20 30    *paPoslist = 0
154b0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
154c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
154d0 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 63 68  int rc;.      ch
154e0 61 72 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 20  ar *pList;.     
154f0 20 69 6e 74 20 6e 4c 69 73 74 3b 0a 20 20 20 20   int nList;.    
15500 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73    int j;.      s
15510 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 6f  qlite3_int64 iDo
15520 63 69 64 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b  cid = apSegment[
15530 30 5d 2d 3e 69 44 6f 63 69 64 3b 0a 0a 20 20 20  0]->iDocid;..   
15540 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52     rc = fts3SegR
15550 65 61 64 65 72 4e 65 78 74 44 6f 63 69 64 28 70  eaderNextDocid(p
15560 2c 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2c 20  , apSegment[0], 
15570 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b  &pList, &nList);
15580 0a 20 20 20 20 20 20 6a 20 3d 20 31 3b 0a 20 20  .      j = 1;.  
15590 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
155a0 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20 20  QLITE_OK .      
155b0 20 20 26 26 20 6a 3c 6e 4d 65 72 67 65 0a 20 20    && j<nMerge.  
155c0 20 20 20 20 20 20 26 26 20 61 70 53 65 67 6d 65        && apSegme
155d0 6e 74 5b 6a 5d 2d 3e 70 4f 66 66 73 65 74 4c 69  nt[j]->pOffsetLi
155e0 73 74 0a 20 20 20 20 20 20 20 20 26 26 20 61 70  st.        && ap
155f0 53 65 67 6d 65 6e 74 5b 6a 5d 2d 3e 69 44 6f 63  Segment[j]->iDoc
15600 69 64 3d 3d 69 44 6f 63 69 64 0a 20 20 20 20 20  id==iDocid.     
15610 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
15620 20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e 65   fts3SegReaderNe
15630 78 74 44 6f 63 69 64 28 70 2c 20 61 70 53 65 67  xtDocid(p, apSeg
15640 6d 65 6e 74 5b 6a 5d 2c 20 30 2c 20 30 29 3b 0a  ment[j], 0, 0);.
15650 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
15660 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
15670 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
15680 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
15690 66 74 73 33 53 65 67 52 65 61 64 65 72 53 6f 72  fts3SegReaderSor
156a0 74 28 70 4d 73 72 2d 3e 61 70 53 65 67 6d 65 6e  t(pMsr->apSegmen
156b0 74 2c 20 6e 4d 65 72 67 65 2c 20 6a 2c 20 78 43  t, nMerge, j, xC
156c0 6d 70 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  mp);..      if( 
156d0 70 4d 73 72 2d 3e 69 43 6f 6c 46 69 6c 74 65 72  pMsr->iColFilter
156e0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  >=0 ){.        f
156f0 74 73 33 43 6f 6c 75 6d 6e 46 69 6c 74 65 72 28  ts3ColumnFilter(
15700 70 4d 73 72 2d 3e 69 43 6f 6c 46 69 6c 74 65 72  pMsr->iColFilter
15710 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74  , &pList, &nList
15720 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
15730 20 20 69 66 28 20 6e 4c 69 73 74 3e 30 20 29 7b    if( nList>0 ){
15740 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73  .        if( fts
15750 33 53 65 67 52 65 61 64 65 72 49 73 50 65 6e 64  3SegReaderIsPend
15760 69 6e 67 28 61 70 53 65 67 6d 65 6e 74 5b 30 5d  ing(apSegment[0]
15770 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
15780 63 20 3d 20 66 74 73 33 4d 73 72 42 75 66 66 65  c = fts3MsrBuffe
15790 72 44 61 74 61 28 70 4d 73 72 2c 20 70 4c 69 73  rData(pMsr, pLis
157a0 74 2c 20 6e 4c 69 73 74 2b 31 29 3b 0a 20 20 20  t, nList+1);.   
157b0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
157c0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
157d0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  n rc;.          
157e0 2a 70 61 50 6f 73 6c 69 73 74 20 3d 20 70 4d 73  *paPoslist = pMs
157f0 72 2d 3e 61 42 75 66 66 65 72 3b 0a 20 20 20 20  r->aBuffer;.    
15800 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
15810 4d 73 72 2d 3e 61 42 75 66 66 65 72 5b 6e 4c 69  Msr->aBuffer[nLi
15820 73 74 5d 20 26 20 30 78 46 45 29 3d 3d 30 78 30  st] & 0xFE)==0x0
15830 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  0 );.        }el
15840 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  se{.          *p
15850 61 50 6f 73 6c 69 73 74 20 3d 20 70 4c 69 73 74  aPoslist = pList
15860 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15870 20 20 20 20 2a 70 69 44 6f 63 69 64 20 3d 20 69      *piDocid = i
15880 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20 2a  Docid;.        *
15890 70 6e 50 6f 73 6c 69 73 74 20 3d 20 6e 4c 69 73  pnPoslist = nLis
158a0 74 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  t;.        break
158b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
158c0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
158d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74  LITE_OK;.}..stat
158e0 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65  ic int fts3SegRe
158f0 61 64 65 72 53 74 61 72 74 28 0a 20 20 46 74 73  aderStart(.  Fts
15900 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
15910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15920 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  Virtual table ha
15930 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 4d 75  ndle */.  Fts3Mu
15940 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70 43  ltiSegReader *pC
15950 73 72 2c 20 20 20 20 20 20 20 2f 2a 20 43 75 72  sr,       /* Cur
15960 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  sor object */.  
15970 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72  const char *zTer
15980 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
15990 2f 2a 20 54 65 72 6d 20 73 65 61 72 63 68 65 64  /* Term searched
159a0 20 66 6f 72 20 28 6f 72 20 4e 55 4c 4c 29 20 2a   for (or NULL) *
159b0 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 20 20 20  /.  int nTerm   
159c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159d0 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
159e0 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20   zTerm in bytes 
159f0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
15a00 20 69 6e 74 20 6e 53 65 67 20 3d 20 70 43 73 72   int nSeg = pCsr
15a10 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 0a 20 20 2f  ->nSegment;..  /
15a20 2a 20 49 66 20 74 68 65 20 46 74 73 33 53 65 67  * If the Fts3Seg
15a30 46 69 6c 74 65 72 20 64 65 66 69 6e 65 73 20 61  Filter defines a
15a40 20 73 70 65 63 69 66 69 63 20 74 65 72 6d 20 28   specific term (
15a50 6f 72 20 74 65 72 6d 20 70 72 65 66 69 78 29 20  or term prefix) 
15a60 74 6f 20 73 65 61 72 63 68 20 0a 20 20 2a 2a 20  to search .  ** 
15a70 66 6f 72 2c 20 74 68 65 6e 20 61 64 76 61 6e 63  for, then advanc
15a80 65 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 69  e each segment i
15a90 74 65 72 61 74 6f 72 20 75 6e 74 69 6c 20 69 74  terator until it
15aa0 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 74 65 72   points to a ter
15ab0 6d 20 6f 66 0a 20 20 2a 2a 20 65 71 75 61 6c 20  m of.  ** equal 
15ac0 6f 72 20 67 72 65 61 74 65 72 20 76 61 6c 75 65  or greater value
15ad0 20 74 68 61 6e 20 74 68 65 20 73 70 65 63 69 66   than the specif
15ae0 69 65 64 20 74 65 72 6d 2e 20 54 68 69 73 20 70  ied term. This p
15af0 72 65 76 65 6e 74 73 20 6d 61 6e 79 0a 20 20 2a  revents many.  *
15b00 2a 20 75 6e 6e 65 63 65 73 73 61 72 79 20 6d 65  * unnecessary me
15b10 72 67 65 2f 73 6f 72 74 20 6f 70 65 72 61 74 69  rge/sort operati
15b20 6f 6e 73 20 66 6f 72 20 74 68 65 20 63 61 73 65  ons for the case
15b30 20 77 68 65 72 65 20 73 69 6e 67 6c 65 20 73 65   where single se
15b40 67 6d 65 6e 74 0a 20 20 2a 2a 20 62 2d 74 72 65  gment.  ** b-tre
15b50 65 20 6c 65 61 66 20 6e 6f 64 65 73 20 63 6f 6e  e leaf nodes con
15b60 74 61 69 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f  tain more than o
15b70 6e 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20  ne term..  */.  
15b80 66 6f 72 28 69 3d 30 3b 20 70 43 73 72 2d 3e 62  for(i=0; pCsr->b
15b90 52 65 73 74 61 72 74 3d 3d 30 20 26 26 20 69 3c  Restart==0 && i<
15ba0 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 20  pCsr->nSegment; 
15bb0 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  i++){.    int re
15bc0 73 20 3d 20 30 3b 0a 20 20 20 20 46 74 73 33 53  s = 0;.    Fts3S
15bd0 65 67 52 65 61 64 65 72 20 2a 70 53 65 67 20 3d  egReader *pSeg =
15be0 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74   pCsr->apSegment
15bf0 5b 69 5d 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  [i];.    do {.  
15c00 20 20 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73      int rc = fts
15c10 33 53 65 67 52 65 61 64 65 72 4e 65 78 74 28 70  3SegReaderNext(p
15c20 2c 20 70 53 65 67 2c 20 30 29 3b 0a 20 20 20 20  , pSeg, 0);.    
15c30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15c40 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
15c50 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 7a 54 65  .    }while( zTe
15c60 72 6d 20 26 26 20 28 72 65 73 20 3d 20 66 74 73  rm && (res = fts
15c70 33 53 65 67 52 65 61 64 65 72 54 65 72 6d 43 6d  3SegReaderTermCm
15c80 70 28 70 53 65 67 2c 20 7a 54 65 72 6d 2c 20 6e  p(pSeg, zTerm, n
15c90 54 65 72 6d 29 29 3c 30 20 29 3b 0a 0a 20 20 20  Term))<0 );..   
15ca0 20 69 66 28 20 70 53 65 67 2d 3e 62 4c 6f 6f 6b   if( pSeg->bLook
15cb0 75 70 20 26 26 20 72 65 73 21 3d 30 20 29 7b 0a  up && res!=0 ){.
15cc0 20 20 20 20 20 20 66 74 73 33 53 65 67 52 65 61        fts3SegRea
15cd0 64 65 72 53 65 74 45 6f 66 28 70 53 65 67 29 3b  derSetEof(pSeg);
15ce0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73  .    }.  }.  fts
15cf0 33 53 65 67 52 65 61 64 65 72 53 6f 72 74 28 70  3SegReaderSort(p
15d00 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 2c 20  Csr->apSegment, 
15d10 6e 53 65 67 2c 20 6e 53 65 67 2c 20 66 74 73 33  nSeg, nSeg, fts3
15d20 53 65 67 52 65 61 64 65 72 43 6d 70 29 3b 0a 0a  SegReaderCmp);..
15d30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15d40 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  OK;.}..int sqlit
15d50 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 53  e3Fts3SegReaderS
15d60 74 61 72 74 28 0a 20 20 46 74 73 33 54 61 62 6c  tart(.  Fts3Tabl
15d70 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
15d80 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75          /* Virtu
15d90 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  al table handle 
15da0 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65  */.  Fts3MultiSe
15db0 67 52 65 61 64 65 72 20 2a 70 43 73 72 2c 20 20  gReader *pCsr,  
15dc0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
15dd0 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 33 53  bject */.  Fts3S
15de0 65 67 46 69 6c 74 65 72 20 2a 70 46 69 6c 74 65  egFilter *pFilte
15df0 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  r          /* Re
15e00 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 72 61  strictions on ra
15e10 6e 67 65 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  nge of iteration
15e20 20 2a 2f 0a 29 7b 0a 20 20 70 43 73 72 2d 3e 70   */.){.  pCsr->p
15e30 46 69 6c 74 65 72 20 3d 20 70 46 69 6c 74 65 72  Filter = pFilter
15e40 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 33 53  ;.  return fts3S
15e50 65 67 52 65 61 64 65 72 53 74 61 72 74 28 70 2c  egReaderStart(p,
15e60 20 70 43 73 72 2c 20 70 46 69 6c 74 65 72 2d 3e   pCsr, pFilter->
15e70 7a 54 65 72 6d 2c 20 70 46 69 6c 74 65 72 2d 3e  zTerm, pFilter->
15e80 6e 54 65 72 6d 29 3b 0a 7d 0a 0a 69 6e 74 20 73  nTerm);.}..int s
15e90 71 6c 69 74 65 33 46 74 73 33 4d 73 72 49 6e 63  qlite3Fts3MsrInc
15ea0 72 53 74 61 72 74 28 0a 20 20 46 74 73 33 54 61  rStart(.  Fts3Ta
15eb0 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
15ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
15ed0 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
15ee0 65 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69  e */.  Fts3Multi
15ef0 53 65 67 52 65 61 64 65 72 20 2a 70 43 73 72 2c  SegReader *pCsr,
15f00 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
15f10 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
15f20 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   iCol,          
15f30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15f40 43 6f 6c 75 6d 6e 20 74 6f 20 6d 61 74 63 68 20  Column to match 
15f50 6f 6e 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  on. */.  const c
15f60 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20  har *zTerm,     
15f70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d           /* Term
15f80 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
15f90 75 67 68 20 61 20 64 6f 63 6c 69 73 74 20 66 6f  ugh a doclist fo
15fa0 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  r */.  int nTerm
15fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fc0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
15fd0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 54 65   of bytes in zTe
15fe0 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  rm */.){.  int i
15ff0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
16000 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 70 43 73  t nSegment = pCs
16010 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 69  r->nSegment;.  i
16020 6e 74 20 28 2a 78 43 6d 70 29 28 46 74 73 33 53  nt (*xCmp)(Fts3S
16030 65 67 52 65 61 64 65 72 20 2a 2c 20 46 74 73 33  egReader *, Fts3
16040 53 65 67 52 65 61 64 65 72 20 2a 29 20 3d 20 28  SegReader *) = (
16050 0a 20 20 20 20 70 2d 3e 62 44 65 73 63 49 64 78  .    p->bDescIdx
16060 20 3f 20 66 74 73 33 53 65 67 52 65 61 64 65 72   ? fts3SegReader
16070 44 6f 63 6c 69 73 74 43 6d 70 52 65 76 20 3a 20  DoclistCmpRev : 
16080 66 74 73 33 53 65 67 52 65 61 64 65 72 44 6f 63  fts3SegReaderDoc
16090 6c 69 73 74 43 6d 70 0a 20 20 29 3b 0a 0a 20 20  listCmp.  );..  
160a0 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 70 46  assert( pCsr->pF
160b0 69 6c 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73  ilter==0 );.  as
160c0 73 65 72 74 28 20 7a 54 65 72 6d 20 26 26 20 6e  sert( zTerm && n
160d0 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  Term>0 );..  /* 
160e0 41 64 76 61 6e 63 65 20 65 61 63 68 20 73 65 67  Advance each seg
160f0 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 20 75 6e  ment iterator un
16100 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  til it points to
16110 20 74 68 65 20 74 65 72 6d 20 7a 54 65 72 6d 2f   the term zTerm/
16120 6e 54 65 72 6d 2e 20 2a 2f 0a 20 20 72 63 20 3d  nTerm. */.  rc =
16130 20 66 74 73 33 53 65 67 52 65 61 64 65 72 53 74   fts3SegReaderSt
16140 61 72 74 28 70 2c 20 70 43 73 72 2c 20 7a 54 65  art(p, pCsr, zTe
16150 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 69 66  rm, nTerm);.  if
16160 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16170 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
16180 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 68 6f 77  /* Determine how
16190 20 6d 61 6e 79 20 6f 66 20 74 68 65 20 73 65 67   many of the seg
161a0 6d 65 6e 74 73 20 61 63 74 75 61 6c 6c 79 20 70  ments actually p
161b0 6f 69 6e 74 20 74 6f 20 7a 54 65 72 6d 2f 6e 54  oint to zTerm/nT
161c0 65 72 6d 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  erm. */.  for(i=
161d0 30 3b 20 69 3c 6e 53 65 67 6d 65 6e 74 3b 20 69  0; i<nSegment; i
161e0 2b 2b 29 7b 0a 20 20 20 20 46 74 73 33 53 65 67  ++){.    Fts3Seg
161f0 52 65 61 64 65 72 20 2a 70 53 65 67 20 3d 20 70  Reader *pSeg = p
16200 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69  Csr->apSegment[i
16210 5d 3b 0a 20 20 20 20 69 66 28 20 21 70 53 65 67  ];.    if( !pSeg
16220 2d 3e 61 4e 6f 64 65 20 7c 7c 20 66 74 73 33 53  ->aNode || fts3S
16230 65 67 52 65 61 64 65 72 54 65 72 6d 43 6d 70 28  egReaderTermCmp(
16240 70 53 65 67 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  pSeg, zTerm, nTe
16250 72 6d 29 20 29 7b 0a 20 20 20 20 20 20 62 72 65  rm) ){.      bre
16260 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
16270 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65 20 3d  pCsr->nAdvance =
16280 20 69 3b 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63   i;..  /* Advanc
16290 65 20 65 61 63 68 20 6f 66 20 74 68 65 20 73 65  e each of the se
162a0 67 6d 65 6e 74 73 20 74 6f 20 70 6f 69 6e 74 20  gments to point 
162b0 74 6f 20 74 68 65 20 66 69 72 73 74 20 64 6f 63  to the first doc
162c0 69 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  id. */.  for(i=0
162d0 3b 20 69 3c 70 43 73 72 2d 3e 6e 41 64 76 61 6e  ; i<pCsr->nAdvan
162e0 63 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63  ce; i++){.    rc
162f0 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72   = fts3SegReader
16300 46 69 72 73 74 44 6f 63 69 64 28 70 2c 20 70 43  FirstDocid(p, pC
16310 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69 5d  sr->apSegment[i]
16320 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
16330 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
16340 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 66 74 73 33  n rc;.  }.  fts3
16350 53 65 67 52 65 61 64 65 72 53 6f 72 74 28 70 43  SegReaderSort(pC
16360 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 2c 20 69  sr->apSegment, i
16370 2c 20 69 2c 20 78 43 6d 70 29 3b 0a 0a 20 20 61  , i, xCmp);..  a
16380 73 73 65 72 74 28 20 69 43 6f 6c 3c 30 20 7c 7c  ssert( iCol<0 ||
16390 20 69 43 6f 6c 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e   iCol<p->nColumn
163a0 20 29 3b 0a 20 20 70 43 73 72 2d 3e 69 43 6f 6c   );.  pCsr->iCol
163b0 46 69 6c 74 65 72 20 3d 20 69 43 6f 6c 3b 0a 0a  Filter = iCol;..
163c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
163d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
163e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
163f0 6c 6c 65 64 20 6f 6e 20 61 20 4d 75 6c 74 69 53  lled on a MultiS
16400 65 67 52 65 61 64 65 72 20 74 68 61 74 20 68 61  egReader that ha
16410 73 20 62 65 65 6e 20 73 74 61 72 74 65 64 20 75  s been started u
16420 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 46  sing.** sqlite3F
16430 74 73 33 4d 73 72 49 6e 63 72 53 74 61 72 74 28  ts3MsrIncrStart(
16440 29 2e 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 63  ). One or more c
16450 61 6c 6c 73 20 74 6f 20 4d 73 72 49 6e 63 72 4e  alls to MsrIncrN
16460 65 78 74 28 29 20 6d 61 79 20 61 6c 73 6f 0a 2a  ext() may also.*
16470 2a 20 68 61 76 65 20 62 65 65 6e 20 6d 61 64 65  * have been made
16480 2e 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  . Calling this f
16490 75 6e 63 74 69 6f 6e 20 70 75 74 73 20 74 68 65  unction puts the
164a0 20 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20   MultiSegReader 
164b0 69 6e 20 73 75 63 68 0a 2a 2a 20 61 20 73 74 61  in such.** a sta
164c0 74 65 20 74 68 61 74 20 69 66 20 74 68 65 20 6e  te that if the n
164d0 65 78 74 20 74 77 6f 20 63 61 6c 6c 73 20 61 72  ext two calls ar
164e0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69 74  e:.**.**   sqlit
164f0 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 53  e3Fts3SegReaderS
16500 74 61 72 74 28 29 0a 2a 2a 20 20 20 73 71 6c 69  tart().**   sqli
16510 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72  te3Fts3SegReader
16520 53 74 65 70 28 29 0a 2a 2a 0a 2a 2a 20 74 68 65  Step().**.** the
16530 6e 20 74 68 65 20 65 6e 74 69 72 65 20 64 6f 63  n the entire doc
16540 6c 69 73 74 20 66 6f 72 20 74 68 65 20 74 65 72  list for the ter
16550 6d 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69  m is available i
16560 6e 20 0a 2a 2a 20 4d 75 6c 74 69 53 65 67 52 65  n .** MultiSegRe
16570 61 64 65 72 2e 61 44 6f 63 6c 69 73 74 2f 6e 44  ader.aDoclist/nD
16580 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73  oclist..*/.int s
16590 71 6c 69 74 65 33 46 74 73 33 4d 73 72 49 6e 63  qlite3Fts3MsrInc
165a0 72 52 65 73 74 61 72 74 28 46 74 73 33 4d 75 6c  rRestart(Fts3Mul
165b0 74 69 53 65 67 52 65 61 64 65 72 20 2a 70 43 73  tiSegReader *pCs
165c0 72 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  r){.  int i;    
165d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165e0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
165f0 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
16600 20 73 65 67 6d 65 6e 74 2d 72 65 61 64 65 72 73   segment-readers
16610 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
16620 43 73 72 2d 3e 7a 54 65 72 6d 3d 3d 30 20 29 3b  Csr->zTerm==0 );
16630 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d  .  assert( pCsr-
16640 3e 6e 54 65 72 6d 3d 3d 30 20 29 3b 0a 20 20 61  >nTerm==0 );.  a
16650 73 73 65 72 74 28 20 70 43 73 72 2d 3e 61 44 6f  ssert( pCsr->aDo
16660 63 6c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 61 73  clist==0 );.  as
16670 73 65 72 74 28 20 70 43 73 72 2d 3e 6e 44 6f 63  sert( pCsr->nDoc
16680 6c 69 73 74 3d 3d 30 20 29 3b 0a 0a 20 20 70 43  list==0 );..  pC
16690 73 72 2d 3e 6e 41 64 76 61 6e 63 65 20 3d 20 30  sr->nAdvance = 0
166a0 3b 0a 20 20 70 43 73 72 2d 3e 62 52 65 73 74 61  ;.  pCsr->bResta
166b0 72 74 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d  rt = 1;.  for(i=
166c0 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 53 65 67 6d  0; i<pCsr->nSegm
166d0 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  ent; i++){.    p
166e0 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69  Csr->apSegment[i
166f0 5d 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d  ]->pOffsetList =
16700 20 30 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 70   0;.    pCsr->ap
16710 53 65 67 6d 65 6e 74 5b 69 5d 2d 3e 6e 4f 66 66  Segment[i]->nOff
16720 73 65 74 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  setList = 0;.   
16730 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74   pCsr->apSegment
16740 5b 69 5d 2d 3e 69 44 6f 63 69 64 20 3d 20 30 3b  [i]->iDocid = 0;
16750 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
16760 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 69 6e  QLITE_OK;.}...in
16770 74 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  t sqlite3Fts3Seg
16780 52 65 61 64 65 72 53 74 65 70 28 0a 20 20 46 74  ReaderStep(.  Ft
16790 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
167a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
167b0 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68   Virtual table h
167c0 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 4d  andle */.  Fts3M
167d0 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70  ultiSegReader *p
167e0 43 73 72 20 20 20 20 20 20 20 20 2f 2a 20 43 75  Csr        /* Cu
167f0 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  rsor object */.)
16800 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
16810 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 6e 74 20 69  ITE_OK;..  int i
16820 73 49 67 6e 6f 72 65 45 6d 70 74 79 20 3d 20 20  sIgnoreEmpty =  
16830 28 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e  (pCsr->pFilter->
16840 66 6c 61 67 73 20 26 20 46 54 53 33 5f 53 45 47  flags & FTS3_SEG
16850 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d 50 54  MENT_IGNORE_EMPT
16860 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 71 75  Y);.  int isRequ
16870 69 72 65 50 6f 73 20 3d 20 20 20 28 70 43 73 72  irePos =   (pCsr
16880 2d 3e 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73  ->pFilter->flags
16890 20 26 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f   & FTS3_SEGMENT_
168a0 52 45 51 55 49 52 45 5f 50 4f 53 29 3b 0a 20 20  REQUIRE_POS);.  
168b0 69 6e 74 20 69 73 43 6f 6c 46 69 6c 74 65 72 20  int isColFilter 
168c0 3d 20 20 20 20 28 70 43 73 72 2d 3e 70 46 69 6c  =    (pCsr->pFil
168d0 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
168e0 33 5f 53 45 47 4d 45 4e 54 5f 43 4f 4c 55 4d 4e  3_SEGMENT_COLUMN
168f0 5f 46 49 4c 54 45 52 29 3b 0a 20 20 69 6e 74 20  _FILTER);.  int 
16900 69 73 50 72 65 66 69 78 20 3d 20 20 20 20 20 20  isPrefix =      
16910 20 28 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 2d   (pCsr->pFilter-
16920 3e 66 6c 61 67 73 20 26 20 46 54 53 33 5f 53 45  >flags & FTS3_SE
16930 47 4d 45 4e 54 5f 50 52 45 46 49 58 29 3b 0a 20  GMENT_PREFIX);. 
16940 20 69 6e 74 20 69 73 53 63 61 6e 20 3d 20 20 20   int isScan =   
16950 20 20 20 20 20 20 28 70 43 73 72 2d 3e 70 46 69        (pCsr->pFi
16960 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  lter->flags & FT
16970 53 33 5f 53 45 47 4d 45 4e 54 5f 53 43 41 4e 29  S3_SEGMENT_SCAN)
16980 3b 0a 20 20 69 6e 74 20 69 73 46 69 72 73 74 20  ;.  int isFirst 
16990 3d 20 20 20 20 20 20 20 20 28 70 43 73 72 2d 3e  =        (pCsr->
169a0 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26  pFilter->flags &
169b0 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 46 49   FTS3_SEGMENT_FI
169c0 52 53 54 29 3b 0a 0a 20 20 46 74 73 33 53 65 67  RST);..  Fts3Seg
169d0 52 65 61 64 65 72 20 2a 2a 61 70 53 65 67 6d 65  Reader **apSegme
169e0 6e 74 20 3d 20 70 43 73 72 2d 3e 61 70 53 65 67  nt = pCsr->apSeg
169f0 6d 65 6e 74 3b 0a 20 20 69 6e 74 20 6e 53 65 67  ment;.  int nSeg
16a00 6d 65 6e 74 20 3d 20 70 43 73 72 2d 3e 6e 53 65  ment = pCsr->nSe
16a10 67 6d 65 6e 74 3b 0a 20 20 46 74 73 33 53 65 67  gment;.  Fts3Seg
16a20 46 69 6c 74 65 72 20 2a 70 46 69 6c 74 65 72 20  Filter *pFilter 
16a30 3d 20 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 3b  = pCsr->pFilter;
16a40 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70 29 28 46  .  int (*xCmp)(F
16a50 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2c 20  ts3SegReader *, 
16a60 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 29  Fts3SegReader *)
16a70 20 3d 20 28 0a 20 20 20 20 70 2d 3e 62 44 65 73   = (.    p->bDes
16a80 63 49 64 78 20 3f 20 66 74 73 33 53 65 67 52 65  cIdx ? fts3SegRe
16a90 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 52 65  aderDoclistCmpRe
16aa0 76 20 3a 20 66 74 73 33 53 65 67 52 65 61 64 65  v : fts3SegReade
16ab0 72 44 6f 63 6c 69 73 74 43 6d 70 0a 20 20 29 3b  rDoclistCmp.  );
16ac0 0a 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 6e 53  ..  if( pCsr->nS
16ad0 65 67 6d 65 6e 74 3d 3d 30 20 29 20 72 65 74 75  egment==0 ) retu
16ae0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
16af0 20 64 6f 20 7b 0a 20 20 20 20 69 6e 74 20 6e 4d   do {.    int nM
16b00 65 72 67 65 3b 0a 20 20 20 20 69 6e 74 20 69 3b  erge;.    int i;
16b10 0a 20 20 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e  .  .    /* Advan
16b20 63 65 20 74 68 65 20 66 69 72 73 74 20 70 43 73  ce the first pCs
16b30 72 2d 3e 6e 41 64 76 61 6e 63 65 20 65 6e 74 72  r->nAdvance entr
16b40 69 65 73 20 69 6e 20 74 68 65 20 61 70 53 65 67  ies in the apSeg
16b50 6d 65 6e 74 5b 5d 20 61 72 72 61 79 0a 20 20 20  ment[] array.   
16b60 20 2a 2a 20 66 6f 72 77 61 72 64 2e 20 54 68 65   ** forward. The
16b70 6e 20 73 6f 72 74 20 74 68 65 20 6c 69 73 74 20  n sort the list 
16b80 69 6e 20 6f 72 64 65 72 20 6f 66 20 63 75 72 72  in order of curr
16b90 65 6e 74 20 74 65 72 6d 20 61 67 61 69 6e 2e 20  ent term again. 
16ba0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72   .    */.    for
16bb0 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 41  (i=0; i<pCsr->nA
16bc0 64 76 61 6e 63 65 3b 20 69 2b 2b 29 7b 0a 20 20  dvance; i++){.  
16bd0 20 20 20 20 46 74 73 33 53 65 67 52 65 61 64 65      Fts3SegReade
16be0 72 20 2a 70 53 65 67 20 3d 20 61 70 53 65 67 6d  r *pSeg = apSegm
16bf0 65 6e 74 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  ent[i];.      if
16c00 28 20 70 53 65 67 2d 3e 62 4c 6f 6f 6b 75 70 20  ( pSeg->bLookup 
16c10 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 33 53  ){.        fts3S
16c20 65 67 52 65 61 64 65 72 53 65 74 45 6f 66 28 70  egReaderSetEof(p
16c30 53 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Seg);.      }els
16c40 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
16c50 66 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 78  fts3SegReaderNex
16c60 74 28 70 2c 20 70 53 65 67 2c 20 30 29 3b 0a 20  t(p, pSeg, 0);. 
16c70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
16c80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16c90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16ca0 7d 0a 20 20 20 20 66 74 73 33 53 65 67 52 65 61  }.    fts3SegRea
16cb0 64 65 72 53 6f 72 74 28 61 70 53 65 67 6d 65 6e  derSort(apSegmen
16cc0 74 2c 20 6e 53 65 67 6d 65 6e 74 2c 20 70 43 73  t, nSegment, pCs
16cd0 72 2d 3e 6e 41 64 76 61 6e 63 65 2c 20 66 74 73  r->nAdvance, fts
16ce0 33 53 65 67 52 65 61 64 65 72 43 6d 70 29 3b 0a  3SegReaderCmp);.
16cf0 20 20 20 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e      pCsr->nAdvan
16d00 63 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  ce = 0;..    /* 
16d10 49 66 20 61 6c 6c 20 74 68 65 20 73 65 67 2d 72  If all the seg-r
16d20 65 61 64 65 72 73 20 61 72 65 20 61 74 20 45 4f  eaders are at EO
16d30 46 2c 20 77 65 27 72 65 20 66 69 6e 69 73 68 65  F, we're finishe
16d40 64 2e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d. return SQLITE
16d50 5f 4f 4b 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  _OK. */.    asse
16d60 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
16d70 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 61 70 53  K );.    if( apS
16d80 65 67 6d 65 6e 74 5b 30 5d 2d 3e 61 4e 6f 64 65  egment[0]->aNode
16d90 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  ==0 ) break;..  
16da0 20 20 70 43 73 72 2d 3e 6e 54 65 72 6d 20 3d 20    pCsr->nTerm = 
16db0 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 6e 54  apSegment[0]->nT
16dc0 65 72 6d 3b 0a 20 20 20 20 70 43 73 72 2d 3e 7a  erm;.    pCsr->z
16dd0 54 65 72 6d 20 3d 20 61 70 53 65 67 6d 65 6e 74  Term = apSegment
16de0 5b 30 5d 2d 3e 7a 54 65 72 6d 3b 0a 0a 20 20 20  [0]->zTerm;..   
16df0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
16e00 20 70 72 65 66 69 78 2d 73 65 61 72 63 68 2c 20   prefix-search, 
16e10 61 6e 64 20 69 66 20 74 68 65 20 74 65 72 6d 20  and if the term 
16e20 74 68 61 74 20 61 70 53 65 67 6d 65 6e 74 5b 30  that apSegment[0
16e30 5d 20 70 6f 69 6e 74 73 0a 20 20 20 20 2a 2a 20  ] points.    ** 
16e40 74 6f 20 64 6f 65 73 20 6e 6f 74 20 73 68 61 72  to does not shar
16e50 65 20 61 20 73 75 66 66 69 78 20 77 69 74 68 20  e a suffix with 
16e60 70 46 69 6c 74 65 72 2d 3e 7a 54 65 72 6d 2f 6e  pFilter->zTerm/n
16e70 54 65 72 6d 2c 20 74 68 65 6e 20 61 6c 6c 20 0a  Term, then all .
16e80 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20      ** required 
16e90 63 61 6c 6c 62 61 63 6b 73 20 68 61 76 65 20 62  callbacks have b
16ea0 65 65 6e 20 6d 61 64 65 2e 20 49 6e 20 74 68 69  een made. In thi
16eb0 73 20 63 61 73 65 20 65 78 69 74 20 65 61 72 6c  s case exit earl
16ec0 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
16ed0 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 66 20 74   Similarly, if t
16ee0 68 69 73 20 69 73 20 61 20 73 65 61 72 63 68 20  his is a search 
16ef0 66 6f 72 20 61 6e 20 65 78 61 63 74 20 6d 61 74  for an exact mat
16f00 63 68 2c 20 61 6e 64 20 74 68 65 20 66 69 72 73  ch, and the firs
16f10 74 20 74 65 72 6d 0a 20 20 20 20 2a 2a 20 6f 66  t term.    ** of
16f20 20 73 65 67 6d 65 6e 74 20 61 70 53 65 67 6d 65   segment apSegme
16f30 6e 74 5b 30 5d 20 69 73 20 6e 6f 74 20 61 20 6d  nt[0] is not a m
16f40 61 74 63 68 2c 20 65 78 69 74 20 65 61 72 6c 79  atch, exit early
16f50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
16f60 20 70 46 69 6c 74 65 72 2d 3e 7a 54 65 72 6d 20   pFilter->zTerm 
16f70 26 26 20 21 69 73 53 63 61 6e 20 29 7b 0a 20 20  && !isScan ){.  
16f80 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 6e 54      if( pCsr->nT
16f90 65 72 6d 3c 70 46 69 6c 74 65 72 2d 3e 6e 54 65  erm<pFilter->nTe
16fa0 72 6d 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 21  rm .       || (!
16fb0 69 73 50 72 65 66 69 78 20 26 26 20 70 43 73 72  isPrefix && pCsr
16fc0 2d 3e 6e 54 65 72 6d 3e 70 46 69 6c 74 65 72 2d  ->nTerm>pFilter-
16fd0 3e 6e 54 65 72 6d 29 0a 20 20 20 20 20 20 20 7c  >nTerm).       |
16fe0 7c 20 6d 65 6d 63 6d 70 28 70 43 73 72 2d 3e 7a  | memcmp(pCsr->z
16ff0 54 65 72 6d 2c 20 70 46 69 6c 74 65 72 2d 3e 7a  Term, pFilter->z
17000 54 65 72 6d 2c 20 70 46 69 6c 74 65 72 2d 3e 6e  Term, pFilter->n
17010 54 65 72 6d 29 20 0a 20 20 20 20 20 20 29 7b 0a  Term) .      ){.
17020 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
17030 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
17040 20 20 6e 4d 65 72 67 65 20 3d 20 31 3b 0a 20 20    nMerge = 1;.  
17050 20 20 77 68 69 6c 65 28 20 6e 4d 65 72 67 65 3c    while( nMerge<
17060 6e 53 65 67 6d 65 6e 74 20 0a 20 20 20 20 20 20  nSegment .      
17070 20 20 26 26 20 61 70 53 65 67 6d 65 6e 74 5b 6e    && apSegment[n
17080 4d 65 72 67 65 5d 2d 3e 61 4e 6f 64 65 0a 20 20  Merge]->aNode.  
17090 20 20 20 20 20 20 26 26 20 61 70 53 65 67 6d 65        && apSegme
170a0 6e 74 5b 6e 4d 65 72 67 65 5d 2d 3e 6e 54 65 72  nt[nMerge]->nTer
170b0 6d 3d 3d 70 43 73 72 2d 3e 6e 54 65 72 6d 20 0a  m==pCsr->nTerm .
170c0 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 6d 65          && 0==me
170d0 6d 63 6d 70 28 70 43 73 72 2d 3e 7a 54 65 72 6d  mcmp(pCsr->zTerm
170e0 2c 20 61 70 53 65 67 6d 65 6e 74 5b 6e 4d 65 72  , apSegment[nMer
170f0 67 65 5d 2d 3e 7a 54 65 72 6d 2c 20 70 43 73 72  ge]->zTerm, pCsr
17100 2d 3e 6e 54 65 72 6d 29 0a 20 20 20 20 29 7b 0a  ->nTerm).    ){.
17110 20 20 20 20 20 20 6e 4d 65 72 67 65 2b 2b 3b 0a        nMerge++;.
17120 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
17130 74 28 20 69 73 49 67 6e 6f 72 65 45 6d 70 74 79  t( isIgnoreEmpty
17140 20 7c 7c 20 28 69 73 52 65 71 75 69 72 65 50 6f   || (isRequirePo
17150 73 20 26 26 20 21 69 73 43 6f 6c 46 69 6c 74 65  s && !isColFilte
17160 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4d  r) );.    if( nM
17170 65 72 67 65 3d 3d 31 20 0a 20 20 20 20 20 26 26  erge==1 .     &&
17180 20 21 69 73 49 67 6e 6f 72 65 45 6d 70 74 79 20   !isIgnoreEmpty 
17190 0a 20 20 20 20 20 26 26 20 21 69 73 46 69 72 73  .     && !isFirs
171a0 74 20 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 62  t .     && (p->b
171b0 44 65 73 63 49 64 78 3d 3d 30 20 7c 7c 20 66 74  DescIdx==0 || ft
171c0 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65 6e  s3SegReaderIsPen
171d0 64 69 6e 67 28 61 70 53 65 67 6d 65 6e 74 5b 30  ding(apSegment[0
171e0 5d 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20  ])==0).    ){.  
171f0 20 20 20 20 70 43 73 72 2d 3e 6e 44 6f 63 6c 69      pCsr->nDocli
17200 73 74 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 30  st = apSegment[0
17210 5d 2d 3e 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 20  ]->nDoclist;.   
17220 20 20 20 69 66 28 20 66 74 73 33 53 65 67 52 65     if( fts3SegRe
17230 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28 61 70  aderIsPending(ap
17240 53 65 67 6d 65 6e 74 5b 30 5d 29 20 29 7b 0a 20  Segment[0]) ){. 
17250 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33         rc = fts3
17260 4d 73 72 42 75 66 66 65 72 44 61 74 61 28 70 43  MsrBufferData(pC
17270 73 72 2c 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d  sr, apSegment[0]
17280 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 70 43 73 72  ->aDoclist, pCsr
17290 2d 3e 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20  ->nDoclist);.   
172a0 20 20 20 20 20 70 43 73 72 2d 3e 61 44 6f 63 6c       pCsr->aDocl
172b0 69 73 74 20 3d 20 70 43 73 72 2d 3e 61 42 75 66  ist = pCsr->aBuf
172c0 66 65 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  fer;.      }else
172d0 7b 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e  {.        pCsr->
172e0 61 44 6f 63 6c 69 73 74 20 3d 20 61 70 53 65 67  aDoclist = apSeg
172f0 6d 65 6e 74 5b 30 5d 2d 3e 61 44 6f 63 6c 69 73  ment[0]->aDoclis
17300 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
17310 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17320 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  OK ) rc = SQLITE
17330 5f 52 4f 57 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  _ROW;.    }else{
17340 0a 20 20 20 20 20 20 69 6e 74 20 6e 44 6f 63 6c  .      int nDocl
17350 69 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ist = 0;        
17360 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f     /* Size of do
17370 63 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 73  clist */.      s
17380 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 72  qlite3_int64 iPr
17390 65 76 20 3d 20 30 3b 20 20 20 20 2f 2a 20 50 72  ev = 0;    /* Pr
173a0 65 76 69 6f 75 73 20 64 6f 63 69 64 20 73 74 6f  evious docid sto
173b0 72 65 64 20 69 6e 20 64 6f 63 6c 69 73 74 20 2a  red in doclist *
173c0 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  /..      /* The 
173d0 63 75 72 72 65 6e 74 20 74 65 72 6d 20 6f 66 20  current term of 
173e0 74 68 65 20 66 69 72 73 74 20 6e 4d 65 72 67 65  the first nMerge
173f0 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
17400 61 72 72 61 79 0a 20 20 20 20 20 20 2a 2a 20 6f  array.      ** o
17410 66 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20  f Fts3SegReader 
17420 6f 62 6a 65 63 74 73 20 69 73 20 74 68 65 20 73  objects is the s
17430 61 6d 65 2e 20 54 68 65 20 64 6f 63 6c 69 73 74  ame. The doclist
17440 73 20 6d 75 73 74 20 62 65 20 6d 65 72 67 65 64  s must be merged
17450 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 20  .      ** and a 
17460 73 69 6e 67 6c 65 20 74 65 72 6d 20 72 65 74 75  single term retu
17470 72 6e 65 64 20 77 69 74 68 20 74 68 65 20 6d 65  rned with the me
17480 72 67 65 64 20 64 6f 63 6c 69 73 74 2e 0a 20 20  rged doclist..  
17490 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72      */.      for
174a0 28 69 3d 30 3b 20 69 3c 6e 4d 65 72 67 65 3b 20  (i=0; i<nMerge; 
174b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 74  i++){.        ft
174c0 73 33 53 65 67 52 65 61 64 65 72 46 69 72 73 74  s3SegReaderFirst
174d0 44 6f 63 69 64 28 70 2c 20 61 70 53 65 67 6d 65  Docid(p, apSegme
174e0 6e 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  nt[i]);.      }.
174f0 20 20 20 20 20 20 66 74 73 33 53 65 67 52 65 61        fts3SegRea
17500 64 65 72 53 6f 72 74 28 61 70 53 65 67 6d 65 6e  derSort(apSegmen
17510 74 2c 20 6e 4d 65 72 67 65 2c 20 6e 4d 65 72 67  t, nMerge, nMerg
17520 65 2c 20 78 43 6d 70 29 3b 0a 20 20 20 20 20 20  e, xCmp);.      
17530 77 68 69 6c 65 28 20 61 70 53 65 67 6d 65 6e 74  while( apSegment
17540 5b 30 5d 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74  [0]->pOffsetList
17550 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
17560 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
17570 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17580 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74  of segments that
17590 20 73 68 61 72 65 20 61 20 64 6f 63 69 64 20 2a   share a docid *
175a0 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  /.        char *
175b0 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69  pList;.        i
175c0 6e 74 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20  nt nList;.      
175d0 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20    int nByte;.   
175e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
175f0 36 34 20 69 44 6f 63 69 64 20 3d 20 61 70 53 65  64 iDocid = apSe
17600 67 6d 65 6e 74 5b 30 5d 2d 3e 69 44 6f 63 69 64  gment[0]->iDocid
17610 3b 0a 20 20 20 20 20 20 20 20 66 74 73 33 53 65  ;.        fts3Se
17620 67 52 65 61 64 65 72 4e 65 78 74 44 6f 63 69 64  gReaderNextDocid
17630 28 70 2c 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d  (p, apSegment[0]
17640 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74  , &pList, &nList
17650 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 31  );.        j = 1
17660 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
17670 20 6a 3c 6e 4d 65 72 67 65 0a 20 20 20 20 20 20   j<nMerge.      
17680 20 20 20 20 20 20 26 26 20 61 70 53 65 67 6d 65        && apSegme
17690 6e 74 5b 6a 5d 2d 3e 70 4f 66 66 73 65 74 4c 69  nt[j]->pOffsetLi
176a0 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  st.            &
176b0 26 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2d 3e  & apSegment[j]->
176c0 69 44 6f 63 69 64 3d 3d 69 44 6f 63 69 64 0a 20  iDocid==iDocid. 
176d0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
176e0 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65      fts3SegReade
176f0 72 4e 65 78 74 44 6f 63 69 64 28 70 2c 20 61 70  rNextDocid(p, ap
17700 53 65 67 6d 65 6e 74 5b 6a 5d 2c 20 30 2c 20 30  Segment[j], 0, 0
17710 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 2b 2b  );.          j++
17720 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
17730 20 20 20 20 20 69 66 28 20 69 73 43 6f 6c 46 69       if( isColFi
17740 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  lter ){.        
17750 20 20 66 74 73 33 43 6f 6c 75 6d 6e 46 69 6c 74    fts3ColumnFilt
17760 65 72 28 70 46 69 6c 74 65 72 2d 3e 69 43 6f 6c  er(pFilter->iCol
17770 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74  , &pList, &nList
17780 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
17790 20 20 20 20 20 20 69 66 28 20 21 69 73 49 67 6e        if( !isIgn
177a0 6f 72 65 45 6d 70 74 79 20 7c 7c 20 6e 4c 69 73  oreEmpty || nLis
177b0 74 3e 30 20 29 7b 0a 0a 20 20 20 20 20 20 20 20  t>0 ){..        
177c0 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74    /* Calculate t
177d0 68 65 20 27 64 6f 63 69 64 27 20 64 65 6c 74 61  he 'docid' delta
177e0 20 76 61 6c 75 65 20 74 6f 20 77 72 69 74 65 20   value to write 
177f0 69 6e 74 6f 20 74 68 65 20 6d 65 72 67 65 64 20  into the merged 
17800 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 6f  .          ** do
17810 63 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20  clist. */.      
17820 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
17830 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  4 iDelta;.      
17840 20 20 20 20 69 66 28 20 70 2d 3e 62 44 65 73 63      if( p->bDesc
17850 49 64 78 20 26 26 20 6e 44 6f 63 6c 69 73 74 3e  Idx && nDoclist>
17860 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
17870 20 69 44 65 6c 74 61 20 3d 20 69 50 72 65 76 20   iDelta = iPrev 
17880 2d 20 69 44 6f 63 69 64 3b 0a 20 20 20 20 20 20  - iDocid;.      
17890 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
178a0 20 20 20 20 20 20 20 69 44 65 6c 74 61 20 3d 20         iDelta = 
178b0 69 44 6f 63 69 64 20 2d 20 69 50 72 65 76 3b 0a  iDocid - iPrev;.
178c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
178d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 44        assert( iD
178e0 65 6c 74 61 3e 30 20 7c 7c 20 28 6e 44 6f 63 6c  elta>0 || (nDocl
178f0 69 73 74 3d 3d 30 20 26 26 20 69 44 65 6c 74 61  ist==0 && iDelta
17900 3d 3d 69 44 6f 63 69 64 29 20 29 3b 0a 20 20 20  ==iDocid) );.   
17910 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
17920 44 6f 63 6c 69 73 74 3e 30 20 7c 7c 20 69 44 65  Doclist>0 || iDe
17930 6c 74 61 3d 3d 69 44 6f 63 69 64 20 29 3b 0a 0a  lta==iDocid );..
17940 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 20            nByte 
17950 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72  = sqlite3Fts3Var
17960 69 6e 74 4c 65 6e 28 69 44 65 6c 74 61 29 20 2b  intLen(iDelta) +
17970 20 28 69 73 52 65 71 75 69 72 65 50 6f 73 3f 6e   (isRequirePos?n
17980 4c 69 73 74 2b 31 3a 30 29 3b 0a 20 20 20 20 20  List+1:0);.     
17990 20 20 20 20 20 69 66 28 20 6e 44 6f 63 6c 69 73       if( nDoclis
179a0 74 2b 6e 42 79 74 65 3e 70 43 73 72 2d 3e 6e 42  t+nByte>pCsr->nB
179b0 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20  uffer ){.       
179c0 20 20 20 20 20 63 68 61 72 20 2a 61 4e 65 77 3b       char *aNew;
179d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 73  .            pCs
179e0 72 2d 3e 6e 42 75 66 66 65 72 20 3d 20 28 6e 44  r->nBuffer = (nD
179f0 6f 63 6c 69 73 74 2b 6e 42 79 74 65 29 2a 32 3b  oclist+nByte)*2;
17a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 4e 65  .            aNe
17a10 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
17a20 6c 6f 63 28 70 43 73 72 2d 3e 61 42 75 66 66 65  loc(pCsr->aBuffe
17a30 72 2c 20 70 43 73 72 2d 3e 6e 42 75 66 66 65 72  r, pCsr->nBuffer
17a40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
17a50 66 28 20 21 61 4e 65 77 20 29 7b 0a 20 20 20 20  f( !aNew ){.    
17a60 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
17a70 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
17a80 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
17a90 20 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 61           pCsr->a
17aa0 42 75 66 66 65 72 20 3d 20 61 4e 65 77 3b 0a 20  Buffer = aNew;. 
17ab0 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
17ac0 20 20 20 20 20 20 69 66 28 20 69 73 46 69 72 73        if( isFirs
17ad0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
17ae0 20 63 68 61 72 20 2a 61 20 3d 20 26 70 43 73 72   char *a = &pCsr
17af0 2d 3e 61 42 75 66 66 65 72 5b 6e 44 6f 63 6c 69  ->aBuffer[nDocli
17b00 73 74 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  st];.           
17b10 20 69 6e 74 20 6e 57 72 69 74 65 3b 0a 20 20 20   int nWrite;.   
17b20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
17b30 20 20 20 20 20 6e 57 72 69 74 65 20 3d 20 73 71       nWrite = sq
17b40 6c 69 74 65 33 46 74 73 33 46 69 72 73 74 46 69  lite3Fts3FirstFi
17b50 6c 74 65 72 28 69 44 65 6c 74 61 2c 20 70 4c 69  lter(iDelta, pLi
17b60 73 74 2c 20 6e 4c 69 73 74 2c 20 61 29 3b 0a 20  st, nList, a);. 
17b70 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e             if( n
17b80 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 20  Write ){.       
17b90 20 20 20 20 20 20 20 69 50 72 65 76 20 3d 20 69         iPrev = i
17ba0 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20 20  Docid;.         
17bb0 20 20 20 20 20 6e 44 6f 63 6c 69 73 74 20 2b 3d       nDoclist +=
17bc0 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20   nWrite;.       
17bd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17be0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17bf0 20 20 20 20 6e 44 6f 63 6c 69 73 74 20 2b 3d 20      nDoclist += 
17c00 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
17c10 72 69 6e 74 28 26 70 43 73 72 2d 3e 61 42 75 66  rint(&pCsr->aBuf
17c20 66 65 72 5b 6e 44 6f 63 6c 69 73 74 5d 2c 20 69  fer[nDoclist], i
17c30 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20  Delta);.        
17c40 20 20 20 20 69 50 72 65 76 20 3d 20 69 44 6f 63      iPrev = iDoc
17c50 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  id;.            
17c60 69 66 28 20 69 73 52 65 71 75 69 72 65 50 6f 73  if( isRequirePos
17c70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
17c80 20 20 6d 65 6d 63 70 79 28 26 70 43 73 72 2d 3e    memcpy(&pCsr->
17c90 61 42 75 66 66 65 72 5b 6e 44 6f 63 6c 69 73 74  aBuffer[nDoclist
17ca0 5d 2c 20 70 4c 69 73 74 2c 20 6e 4c 69 73 74 29  ], pList, nList)
17cb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
17cc0 6e 44 6f 63 6c 69 73 74 20 2b 3d 20 6e 4c 69 73  nDoclist += nLis
17cd0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
17ce0 20 70 43 73 72 2d 3e 61 42 75 66 66 65 72 5b 6e   pCsr->aBuffer[n
17cf0 44 6f 63 6c 69 73 74 2b 2b 5d 20 3d 20 27 5c 30  Doclist++] = '\0
17d00 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ';.            }
17d10 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
17d20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
17d30 66 74 73 33 53 65 67 52 65 61 64 65 72 53 6f 72  fts3SegReaderSor
17d40 74 28 61 70 53 65 67 6d 65 6e 74 2c 20 6e 4d 65  t(apSegment, nMe
17d50 72 67 65 2c 20 6a 2c 20 78 43 6d 70 29 3b 0a 20  rge, j, xCmp);. 
17d60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
17d70 20 6e 44 6f 63 6c 69 73 74 3e 30 20 29 7b 0a 20   nDoclist>0 ){. 
17d80 20 20 20 20 20 20 20 70 43 73 72 2d 3e 61 44 6f         pCsr->aDo
17d90 63 6c 69 73 74 20 3d 20 70 43 73 72 2d 3e 61 42  clist = pCsr->aB
17da0 75 66 66 65 72 3b 0a 20 20 20 20 20 20 20 20 70  uffer;.        p
17db0 43 73 72 2d 3e 6e 44 6f 63 6c 69 73 74 20 3d 20  Csr->nDoclist = 
17dc0 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20  nDoclist;.      
17dd0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f    rc = SQLITE_RO
17de0 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  W;.      }.    }
17df0 0a 20 20 20 20 70 43 73 72 2d 3e 6e 41 64 76 61  .    pCsr->nAdva
17e00 6e 63 65 20 3d 20 6e 4d 65 72 67 65 3b 0a 20 20  nce = nMerge;.  
17e10 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
17e20 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 72 65 74 75  TE_OK );..  retu
17e30 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 76 6f 69 64 20  rn rc;.}...void 
17e40 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
17e50 61 64 65 72 46 69 6e 69 73 68 28 0a 20 20 46 74  aderFinish(.  Ft
17e60 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
17e70 20 2a 70 43 73 72 20 20 20 20 20 20 20 2f 2a 20   *pCsr       /* 
17e80 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  Cursor object */
17e90 0a 29 7b 0a 20 20 69 66 28 20 70 43 73 72 20 29  .){.  if( pCsr )
17ea0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
17eb0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72   for(i=0; i<pCsr
17ec0 2d 3e 6e 53 65 67 6d 65 6e 74 3b 20 69 2b 2b 29  ->nSegment; i++)
17ed0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  {.      sqlite3F
17ee0 74 73 33 53 65 67 52 65 61 64 65 72 46 72 65 65  ts3SegReaderFree
17ef0 28 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74  (pCsr->apSegment
17f00 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
17f10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73  sqlite3_free(pCs
17f20 72 2d 3e 61 70 53 65 67 6d 65 6e 74 29 3b 0a 20  r->apSegment);. 
17f30 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
17f40 70 43 73 72 2d 3e 61 42 75 66 66 65 72 29 3b 0a  pCsr->aBuffer);.
17f50 0a 20 20 20 20 70 43 73 72 2d 3e 6e 53 65 67 6d  .    pCsr->nSegm
17f60 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 43 73  ent = 0;.    pCs
17f70 72 2d 3e 61 70 53 65 67 6d 65 6e 74 20 3d 20 30  r->apSegment = 0
17f80 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 42 75 66  ;.    pCsr->aBuf
17f90 66 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  fer = 0;.  }.}..
17fa0 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 61 6c 6c 20  /*.** Merge all 
17fb0 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 73 65 67  level iLevel seg
17fc0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74  ments in the dat
17fd0 61 62 61 73 65 20 69 6e 74 6f 20 61 20 73 69 6e  abase into a sin
17fe0 67 6c 65 20 0a 2a 2a 20 69 4c 65 76 65 6c 2b 31  gle .** iLevel+1
17ff0 20 73 65 67 6d 65 6e 74 2e 20 4f 72 2c 20 69 66   segment. Or, if
18000 20 69 4c 65 76 65 6c 3c 30 2c 20 6d 65 72 67 65   iLevel<0, merge
18010 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e   all segments in
18020 74 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 73  to a.** single s
18030 65 67 6d 65 6e 74 20 77 69 74 68 20 61 20 6c 65  egment with a le
18040 76 65 6c 20 65 71 75 61 6c 20 74 6f 20 74 68 65  vel equal to the
18050 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 6c 61 72   numerically lar
18060 67 65 73 74 20 6c 65 76 65 6c 20 0a 2a 2a 20 63  gest level .** c
18070 75 72 72 65 6e 74 6c 79 20 70 72 65 73 65 6e 74  urrently present
18080 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
18090 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
180a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
180b0 65 64 20 77 69 74 68 20 69 4c 65 76 65 6c 3c 30  ed with iLevel<0
180c0 2c 20 62 75 74 20 74 68 65 72 65 20 69 73 20 6f  , but there is o
180d0 6e 6c 79 20 6f 6e 65 0a 2a 2a 20 73 65 67 6d 65  nly one.** segme
180e0 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  nt in the databa
180f0 73 65 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  se, SQLITE_DONE 
18100 69 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65  is returned imme
18110 64 69 61 74 65 6c 79 2e 20 0a 2a 2a 20 4f 74 68  diately. .** Oth
18120 65 72 77 69 73 65 2c 20 69 66 20 73 75 63 63 65  erwise, if succe
18130 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
18140 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
18150 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
18160 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20  , .** an SQLite 
18170 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
18180 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
18190 63 20 69 6e 74 20 66 74 73 33 53 65 67 6d 65 6e  c int fts3Segmen
181a0 74 4d 65 72 67 65 28 0a 20 20 46 74 73 33 54 61  tMerge(.  Fts3Ta
181b0 62 6c 65 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69  ble *p, .  int i
181c0 4c 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20  Langid,         
181d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
181e0 6e 67 75 61 67 65 20 69 64 20 74 6f 20 6d 65 72  nguage id to mer
181f0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64  ge */.  int iInd
18200 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ex,             
18210 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
18220 20 69 6e 20 70 2d 3e 61 49 6e 64 65 78 5b 5d 20   in p->aIndex[] 
18230 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e  to merge */.  in
18240 74 20 69 4c 65 76 65 6c 20 20 20 20 20 20 20 20  t iLevel        
18250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18260 20 4c 65 76 65 6c 20 74 6f 20 6d 65 72 67 65 20   Level to merge 
18270 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
18280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18290 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
182a0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
182b0 69 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20  iIdx = 0;       
182c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
182d0 6e 64 65 78 20 6f 66 20 6e 65 77 20 73 65 67 6d  ndex of new segm
182e0 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ent */.  sqlite3
182f0 5f 69 6e 74 36 34 20 69 4e 65 77 4c 65 76 65 6c  _int64 iNewLevel
18300 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4c 65 76 65   = 0;    /* Leve
18310 6c 2f 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74  l/index to creat
18320 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 61 74  e new segment at
18330 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 57 72 69   */.  SegmentWri
18340 74 65 72 20 2a 70 57 72 69 74 65 72 20 3d 20 30  ter *pWriter = 0
18350 3b 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f  ;     /* Used to
18360 20 77 72 69 74 65 20 74 68 65 20 6e 65 77 2c 20   write the new, 
18370 6d 65 72 67 65 64 2c 20 73 65 67 6d 65 6e 74 20  merged, segment 
18380 2a 2f 0a 20 20 46 74 73 33 53 65 67 46 69 6c 74  */.  Fts3SegFilt
18390 65 72 20 66 69 6c 74 65 72 3b 20 20 20 20 20 20  er filter;      
183a0 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20       /* Segment 
183b0 74 65 72 6d 20 66 69 6c 74 65 72 20 63 6f 6e 64  term filter cond
183c0 69 74 69 6f 6e 20 2a 2f 0a 20 20 46 74 73 33 4d  ition */.  Fts3M
183d0 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 63 73  ultiSegReader cs
183e0 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  r;         /* Cu
183f0 72 73 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20  rsor to iterate 
18400 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 28 73 29  through level(s)
18410 20 2a 2f 0a 20 20 69 6e 74 20 62 49 67 6e 6f 72   */.  int bIgnor
18420 65 45 6d 70 74 79 20 3d 20 30 3b 20 20 20 20 20  eEmpty = 0;     
18430 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
18440 20 69 67 6e 6f 72 65 20 65 6d 70 74 79 20 73 65   ignore empty se
18450 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 61 73 73  gments */..  ass
18460 65 72 74 28 20 69 4c 65 76 65 6c 3d 3d 46 54 53  ert( iLevel==FTS
18470 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c 0a  3_SEGCURSOR_ALL.
18480 20 20 20 20 20 20 20 7c 7c 20 69 4c 65 76 65 6c         || iLevel
18490 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52  ==FTS3_SEGCURSOR
184a0 5f 50 45 4e 44 49 4e 47 0a 20 20 20 20 20 20 20  _PENDING.       
184b0 7c 7c 20 69 4c 65 76 65 6c 3e 3d 30 0a 20 20 29  || iLevel>=0.  )
184c0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 76  ;.  assert( iLev
184d0 65 6c 3c 46 54 53 33 5f 53 45 47 44 49 52 5f 4d  el<FTS3_SEGDIR_M
184e0 41 58 4c 45 56 45 4c 20 29 3b 0a 20 20 61 73 73  AXLEVEL );.  ass
184f0 65 72 74 28 20 69 49 6e 64 65 78 3e 3d 30 20 26  ert( iIndex>=0 &
18500 26 20 69 49 6e 64 65 78 3c 70 2d 3e 6e 49 6e 64  & iIndex<p->nInd
18510 65 78 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  ex );..  rc = sq
18520 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64  lite3Fts3SegRead
18530 65 72 43 75 72 73 6f 72 28 70 2c 20 69 4c 61 6e  erCursor(p, iLan
18540 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65  gid, iIndex, iLe
18550 76 65 6c 2c 20 30 2c 20 30 2c 20 31 2c 20 30 2c  vel, 0, 0, 1, 0,
18560 20 26 63 73 72 29 3b 0a 20 20 69 66 28 20 72 63   &csr);.  if( rc
18570 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63  !=SQLITE_OK || c
18580 73 72 2e 6e 53 65 67 6d 65 6e 74 3d 3d 30 20 29  sr.nSegment==0 )
18590 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a   goto finished;.
185a0 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3d 3d 46  .  if( iLevel==F
185b0 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c  TS3_SEGCURSOR_AL
185c0 4c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  L ){.    /* This
185d0 20 63 61 6c 6c 20 69 73 20 74 6f 20 6d 65 72 67   call is to merg
185e0 65 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69  e all segments i
185f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  n the database t
18600 6f 20 61 20 73 69 6e 67 6c 65 0a 20 20 20 20 2a  o a single.    *
18610 2a 20 73 65 67 6d 65 6e 74 2e 20 54 68 65 20 6c  * segment. The l
18620 65 76 65 6c 20 6f 66 20 74 68 65 20 6e 65 77 20  evel of the new 
18630 73 65 67 6d 65 6e 74 20 69 73 20 65 71 75 61 6c  segment is equal
18640 20 74 6f 20 74 68 65 20 74 68 65 20 6e 75 6d 65   to the the nume
18650 72 69 63 61 6c 6c 79 20 0a 20 20 20 20 2a 2a 20  rically .    ** 
18660 67 72 65 61 74 65 73 74 20 73 65 67 6d 65 6e 74  greatest segment
18670 20 6c 65 76 65 6c 20 63 75 72 72 65 6e 74 6c 79   level currently
18680 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
18690 64 61 74 61 62 61 73 65 20 66 6f 72 20 74 68 69  database for thi
186a0 73 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e 20  s.    ** index. 
186b0 54 68 65 20 69 64 78 20 6f 66 20 74 68 65 20 6e  The idx of the n
186c0 65 77 20 73 65 67 6d 65 6e 74 20 69 73 20 61 6c  ew segment is al
186d0 77 61 79 73 20 30 2e 20 20 2a 2f 0a 20 20 20 20  ways 0.  */.    
186e0 69 66 28 20 63 73 72 2e 6e 53 65 67 6d 65 6e 74  if( csr.nSegment
186f0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==1 ){.      rc 
18700 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
18710 20 20 20 20 20 67 6f 74 6f 20 66 69 6e 69 73 68       goto finish
18720 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ed;.    }.    rc
18730 20 3d 20 66 74 73 33 53 65 67 6d 65 6e 74 4d 61   = fts3SegmentMa
18740 78 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69  xLevel(p, iLangi
18750 64 2c 20 69 49 6e 64 65 78 2c 20 26 69 4e 65 77  d, iIndex, &iNew
18760 4c 65 76 65 6c 29 3b 0a 20 20 20 20 62 49 67 6e  Level);.    bIgn
18770 6f 72 65 45 6d 70 74 79 20 3d 20 31 3b 0a 0a 20  oreEmpty = 1;.. 
18780 20 7d 65 6c 73 65 20 69 66 28 20 69 4c 65 76 65   }else if( iLeve
18790 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f  l==FTS3_SEGCURSO
187a0 52 5f 50 45 4e 44 49 4e 47 20 29 7b 0a 20 20 20  R_PENDING ){.   
187b0 20 69 4e 65 77 4c 65 76 65 6c 20 3d 20 67 65 74   iNewLevel = get
187c0 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c  AbsoluteLevel(p,
187d0 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78   iLangid, iIndex
187e0 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 66  , 0);.    rc = f
187f0 74 73 33 41 6c 6c 6f 63 61 74 65 53 65 67 64 69  ts3AllocateSegdi
18800 72 49 64 78 28 70 2c 20 69 4c 61 6e 67 69 64 2c  rIdx(p, iLangid,
18810 20 69 49 6e 64 65 78 2c 20 30 2c 20 26 69 49 64   iIndex, 0, &iId
18820 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  x);.  }else{.   
18830 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73   /* This call is
18840 20 74 6f 20 6d 65 72 67 65 20 61 6c 6c 20 73 65   to merge all se
18850 67 6d 65 6e 74 73 20 61 74 20 6c 65 76 65 6c 20  gments at level 
18860 69 4c 65 76 65 6c 2e 20 66 69 6e 64 20 74 68 65  iLevel. find the
18870 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 61 76 61   next.    ** ava
18880 69 6c 61 62 6c 65 20 73 65 67 6d 65 6e 74 20 69  ilable segment i
18890 6e 64 65 78 20 61 74 20 6c 65 76 65 6c 20 69 4c  ndex at level iL
188a0 65 76 65 6c 2b 31 2e 20 54 68 65 20 63 61 6c 6c  evel+1. The call
188b0 20 74 6f 0a 20 20 20 20 2a 2a 20 66 74 73 33 41   to.    ** fts3A
188c0 6c 6c 6f 63 61 74 65 53 65 67 64 69 72 49 64 78  llocateSegdirIdx
188d0 28 29 20 77 69 6c 6c 20 6d 65 72 67 65 20 74 68  () will merge th
188e0 65 20 73 65 67 6d 65 6e 74 73 20 61 74 20 6c 65  e segments at le
188f0 76 65 6c 20 69 4c 65 76 65 6c 2b 31 20 74 6f 20  vel iLevel+1 to 
18900 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65  .    ** a single
18910 20 69 4c 65 76 65 6c 2b 32 20 73 65 67 6d 65 6e   iLevel+2 segmen
18920 74 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20  t if necessary. 
18930 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73   */.    rc = fts
18940 33 41 6c 6c 6f 63 61 74 65 53 65 67 64 69 72 49  3AllocateSegdirI
18950 64 78 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69  dx(p, iLangid, i
18960 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 2b 31 2c  Index, iLevel+1,
18970 20 26 69 49 64 78 29 3b 0a 20 20 20 20 69 4e 65   &iIdx);.    iNe
18980 77 4c 65 76 65 6c 20 3d 20 67 65 74 41 62 73 6f  wLevel = getAbso
18990 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61  luteLevel(p, iLa
189a0 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c  ngid, iIndex, iL
189b0 65 76 65 6c 2b 31 29 3b 0a 20 20 7d 0a 20 20 69  evel+1);.  }.  i
189c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
189d0 20 29 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64   ) goto finished
189e0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 73 72 2e  ;.  assert( csr.
189f0 6e 53 65 67 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  nSegment>0 );.  
18a00 61 73 73 65 72 74 28 20 69 4e 65 77 4c 65 76 65  assert( iNewLeve
18a10 6c 3e 3d 67 65 74 41 62 73 6f 6c 75 74 65 4c 65  l>=getAbsoluteLe
18a20 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20  vel(p, iLangid, 
18a30 69 49 6e 64 65 78 2c 20 30 29 20 29 3b 0a 20 20  iIndex, 0) );.  
18a40 61 73 73 65 72 74 28 20 69 4e 65 77 4c 65 76 65  assert( iNewLeve
18a50 6c 3c 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76  l<getAbsoluteLev
18a60 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69  el(p, iLangid, i
18a70 49 6e 64 65 78 2c 46 54 53 33 5f 53 45 47 44 49  Index,FTS3_SEGDI
18a80 52 5f 4d 41 58 4c 45 56 45 4c 29 20 29 3b 0a 0a  R_MAXLEVEL) );..
18a90 20 20 6d 65 6d 73 65 74 28 26 66 69 6c 74 65 72    memset(&filter
18aa0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 33  , 0, sizeof(Fts3
18ab0 53 65 67 46 69 6c 74 65 72 29 29 3b 0a 20 20 66  SegFilter));.  f
18ac0 69 6c 74 65 72 2e 66 6c 61 67 73 20 3d 20 46 54  ilter.flags = FT
18ad0 53 33 5f 53 45 47 4d 45 4e 54 5f 52 45 51 55 49  S3_SEGMENT_REQUI
18ae0 52 45 5f 50 4f 53 3b 0a 20 20 66 69 6c 74 65 72  RE_POS;.  filter
18af0 2e 66 6c 61 67 73 20 7c 3d 20 28 62 49 67 6e 6f  .flags |= (bIgno
18b00 72 65 45 6d 70 74 79 20 3f 20 46 54 53 33 5f 53  reEmpty ? FTS3_S
18b10 45 47 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d  EGMENT_IGNORE_EM
18b20 50 54 59 20 3a 20 30 29 3b 0a 0a 20 20 72 63 20  PTY : 0);..  rc 
18b30 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  = sqlite3Fts3Seg
18b40 52 65 61 64 65 72 53 74 61 72 74 28 70 2c 20 26  ReaderStart(p, &
18b50 63 73 72 2c 20 26 66 69 6c 74 65 72 29 3b 0a 20  csr, &filter);. 
18b60 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 4f   while( SQLITE_O
18b70 4b 3d 3d 72 63 20 29 7b 0a 20 20 20 20 72 63 20  K==rc ){.    rc 
18b80 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  = sqlite3Fts3Seg
18b90 52 65 61 64 65 72 53 74 65 70 28 70 2c 20 26 63  ReaderStep(p, &c
18ba0 73 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  sr);.    if( rc!
18bb0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 20 62 72  =SQLITE_ROW ) br
18bc0 65 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20 66 74  eak;.    rc = ft
18bd0 73 33 53 65 67 57 72 69 74 65 72 41 64 64 28 70  s3SegWriterAdd(p
18be0 2c 20 26 70 57 72 69 74 65 72 2c 20 31 2c 20 0a  , &pWriter, 1, .
18bf0 20 20 20 20 20 20 20 20 63 73 72 2e 7a 54 65 72          csr.zTer
18c00 6d 2c 20 63 73 72 2e 6e 54 65 72 6d 2c 20 63 73  m, csr.nTerm, cs
18c10 72 2e 61 44 6f 63 6c 69 73 74 2c 20 63 73 72 2e  r.aDoclist, csr.
18c20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 7d 0a 20  nDoclist);.  }. 
18c30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18c40 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69 73 68  OK ) goto finish
18c50 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57  ed;.  assert( pW
18c60 72 69 74 65 72 20 29 3b 0a 0a 20 20 69 66 28 20  riter );..  if( 
18c70 69 4c 65 76 65 6c 21 3d 46 54 53 33 5f 53 45 47  iLevel!=FTS3_SEG
18c80 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 20 29  CURSOR_PENDING )
18c90 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 44  {.    rc = fts3D
18ca0 65 6c 65 74 65 53 65 67 64 69 72 28 0a 20 20 20  eleteSegdir(.   
18cb0 20 20 20 20 20 70 2c 20 69 4c 61 6e 67 69 64 2c       p, iLangid,
18cc0 20 69 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 2c   iIndex, iLevel,
18cd0 20 63 73 72 2e 61 70 53 65 67 6d 65 6e 74 2c 20   csr.apSegment, 
18ce0 63 73 72 2e 6e 53 65 67 6d 65 6e 74 0a 20 20 20  csr.nSegment.   
18cf0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
18d00 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
18d10 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 7d 0a 20   finished;.  }. 
18d20 20 72 63 20 3d 20 66 74 73 33 53 65 67 57 72 69   rc = fts3SegWri
18d30 74 65 72 46 6c 75 73 68 28 70 2c 20 70 57 72 69  terFlush(p, pWri
18d40 74 65 72 2c 20 69 4e 65 77 4c 65 76 65 6c 2c 20  ter, iNewLevel, 
18d50 69 49 64 78 29 3b 0a 0a 20 66 69 6e 69 73 68 65  iIdx);.. finishe
18d60 64 3a 0a 20 20 66 74 73 33 53 65 67 57 72 69 74  d:.  fts3SegWrit
18d70 65 72 46 72 65 65 28 70 57 72 69 74 65 72 29 3b  erFree(pWriter);
18d80 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65  .  sqlite3Fts3Se
18d90 67 52 65 61 64 65 72 46 69 6e 69 73 68 28 26 63  gReaderFinish(&c
18da0 73 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  sr);.  return rc
18db0 3b 0a 7d 0a 0a 0a 2f 2a 20 0a 2a 2a 20 46 6c 75  ;.}.../* .** Flu
18dc0 73 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  sh the contents 
18dd0 6f 66 20 70 65 6e 64 69 6e 67 54 65 72 6d 73 20  of pendingTerms 
18de0 74 6f 20 6c 65 76 65 6c 20 30 20 73 65 67 6d 65  to level 0 segme
18df0 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nts..*/.int sqli
18e00 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65  te3Fts3PendingTe
18e10 72 6d 73 46 6c 75 73 68 28 46 74 73 33 54 61 62  rmsFlush(Fts3Tab
18e20 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  le *p){.  int rc
18e30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
18e40 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 0a  int i;.        .
18e50 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
18e60 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d  QLITE_OK && i<p-
18e70 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20  >nIndex; i++){. 
18e80 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 6d     rc = fts3Segm
18e90 65 6e 74 4d 65 72 67 65 28 70 2c 20 70 2d 3e 69  entMerge(p, p->i
18ea0 50 72 65 76 4c 61 6e 67 69 64 2c 20 69 2c 20 46  PrevLangid, i, F
18eb0 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 50 45  TS3_SEGCURSOR_PE
18ec0 4e 44 49 4e 47 29 3b 0a 20 20 20 20 69 66 28 20  NDING);.    if( 
18ed0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
18ee0 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
18ef0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 46  ;.  }.  sqlite3F
18f00 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 43  ts3PendingTermsC
18f10 6c 65 61 72 28 70 29 3b 0a 0a 20 20 2f 2a 20 44  lear(p);..  /* D
18f20 65 74 65 72 6d 69 6e 65 20 74 68 65 20 61 75 74  etermine the aut
18f30 6f 2d 69 6e 63 72 2d 6d 65 72 67 65 20 73 65 74  o-incr-merge set
18f40 74 69 6e 67 20 69 66 20 75 6e 6b 6e 6f 77 6e 2e  ting if unknown.
18f50 20 20 49 66 20 65 6e 61 62 6c 65 64 2c 0a 20 20    If enabled,.  
18f60 2a 2a 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  ** estimate the 
18f70 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 62  number of leaf b
18f80 6c 6f 63 6b 73 20 6f 66 20 63 6f 6e 74 65 6e 74  locks of content
18f90 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 0a 20   to be written. 
18fa0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
18fb0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 62 48  LITE_OK && p->bH
18fc0 61 73 53 74 61 74 0a 20 20 20 26 26 20 70 2d 3e  asStat.   && p->
18fd0 62 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 3d 3d  bAutoincrmerge==
18fe0 30 78 66 66 20 26 26 20 70 2d 3e 6e 4c 65 61 66  0xff && p->nLeaf
18ff0 41 64 64 3e 30 0a 20 20 29 7b 0a 20 20 20 20 73  Add>0.  ){.    s
19000 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
19010 6d 74 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  mt = 0;.    rc =
19020 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
19030 53 51 4c 5f 53 45 4c 45 43 54 5f 53 54 41 54 2c  SQL_SELECT_STAT,
19040 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
19050 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19060 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
19070 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74  te3_bind_int(pSt
19080 6d 74 2c 20 31 2c 20 46 54 53 5f 53 54 41 54 5f  mt, 1, FTS_STAT_
19090 41 55 54 4f 49 4e 43 52 4d 45 52 47 45 29 3b 0a  AUTOINCRMERGE);.
190a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
190b0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
190c0 20 20 20 20 20 20 70 2d 3e 62 41 75 74 6f 69 6e        p->bAutoin
190d0 63 72 6d 65 72 67 65 20 3d 20 28 72 63 3d 3d 53  crmerge = (rc==S
190e0 51 4c 49 54 45 5f 52 4f 57 20 26 26 20 73 71 6c  QLITE_ROW && sql
190f0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
19100 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 20 20  pStmt, 0));.    
19110 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
19120 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  eset(pStmt);.   
19130 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
19140 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 63  rc;.}../*.** Enc
19150 6f 64 65 20 4e 20 69 6e 74 65 67 65 72 73 20 61  ode N integers a
19160 73 20 76 61 72 69 6e 74 73 20 69 6e 74 6f 20 61  s varints into a
19170 20 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69 63   blob..*/.static
19180 20 76 6f 69 64 20 66 74 73 33 45 6e 63 6f 64 65   void fts3Encode
19190 49 6e 74 41 72 72 61 79 28 0a 20 20 69 6e 74 20  IntArray(.  int 
191a0 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  N,             /
191b0 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
191c0 69 6e 74 65 67 65 72 73 20 74 6f 20 65 6e 63 6f  integers to enco
191d0 64 65 20 2a 2f 0a 20 20 75 33 32 20 2a 61 2c 20  de */.  u32 *a, 
191e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
191f0 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73  e integer values
19200 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 66   */.  char *zBuf
19210 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ,        /* Writ
19220 65 20 74 68 65 20 42 4c 4f 42 20 68 65 72 65 20  e the BLOB here 
19230 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 42 75 66 20  */.  int *pNBuf 
19240 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
19250 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
19260 20 69 66 20 7a 42 75 66 5b 5d 20 75 73 65 64 20   if zBuf[] used 
19270 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
19280 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a   i, j;.  for(i=j
19290 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<N; i++){. 
192a0 20 20 20 6a 20 2b 3d 20 73 71 6c 69 74 65 33 46     j += sqlite3F
192b0 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 7a 42  ts3PutVarint(&zB
192c0 75 66 5b 6a 5d 2c 20 28 73 71 6c 69 74 65 33 5f  uf[j], (sqlite3_
192d0 69 6e 74 36 34 29 61 5b 69 5d 29 3b 0a 20 20 7d  int64)a[i]);.  }
192e0 0a 20 20 2a 70 4e 42 75 66 20 3d 20 6a 3b 0a 7d  .  *pNBuf = j;.}
192f0 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61  ../*.** Decode a
19300 20 62 6c 6f 62 20 6f 66 20 76 61 72 69 6e 74 73   blob of varints
19310 20 69 6e 74 6f 20 4e 20 69 6e 74 65 67 65 72 73   into N integers
19320 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
19330 66 74 73 33 44 65 63 6f 64 65 49 6e 74 41 72 72  fts3DecodeIntArr
19340 61 79 28 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20  ay(.  int N,    
19350 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19360 6e 75 6d 62 65 72 20 6f 66 20 69 6e 74 65 67 65  number of intege
19370 72 73 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a  rs to decode */.
19380 20 20 75 33 32 20 2a 61 2c 20 20 20 20 20 20 20    u32 *a,       
19390 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
193a0 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73  e integer values
193b0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
193c0 20 2a 7a 42 75 66 2c 20 20 2f 2a 20 54 68 65 20   *zBuf,  /* The 
193d0 42 4c 4f 42 20 63 6f 6e 74 61 69 6e 69 6e 67 20  BLOB containing 
193e0 74 68 65 20 76 61 72 69 6e 74 73 20 2a 2f 0a 20  the varints */. 
193f0 20 69 6e 74 20 6e 42 75 66 20 20 20 20 20 20 20   int nBuf       
19400 20 20 20 20 2f 2a 20 73 69 7a 65 20 6f 66 20 74      /* size of t
19410 68 65 20 42 4c 4f 42 20 2a 2f 0a 29 7b 0a 20 20  he BLOB */.){.  
19420 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 55 4e 55 53  int i, j;.  UNUS
19430 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 42 75  ED_PARAMETER(nBu
19440 66 29 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  f);.  for(i=j=0;
19450 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<N; i++){.    
19460 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 78 3b  sqlite3_int64 x;
19470 0a 20 20 20 20 6a 20 2b 3d 20 73 71 6c 69 74 65  .    j += sqlite
19480 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 26  3Fts3GetVarint(&
19490 7a 42 75 66 5b 6a 5d 2c 20 26 78 29 3b 0a 20 20  zBuf[j], &x);.  
194a0 20 20 61 73 73 65 72 74 28 6a 3c 3d 6e 42 75 66    assert(j<=nBuf
194b0 29 3b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 28 75  );.    a[i] = (u
194c0 33 32 29 28 78 20 26 20 30 78 66 66 66 66 66 66  32)(x & 0xffffff
194d0 66 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ff);.  }.}../*.*
194e0 2a 20 49 6e 73 65 72 74 20 74 68 65 20 73 69 7a  * Insert the siz
194f0 65 73 20 28 69 6e 20 74 6f 6b 65 6e 73 29 20 66  es (in tokens) f
19500 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f  or each column o
19510 66 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 0a 2a  f the document.*
19520 2a 20 77 69 74 68 20 64 6f 63 69 64 20 65 71 75  * with docid equ
19530 61 6c 20 74 6f 20 70 2d 3e 69 50 72 65 76 44 6f  al to p->iPrevDo
19540 63 69 64 2e 20 20 54 68 65 20 73 69 7a 65 73 20  cid.  The sizes 
19550 61 72 65 20 65 6e 63 6f 64 65 64 20 61 73 0a 2a  are encoded as.*
19560 2a 20 61 20 62 6c 6f 62 20 6f 66 20 76 61 72 69  * a blob of vari
19570 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nts..*/.static v
19580 6f 69 64 20 66 74 73 33 49 6e 73 65 72 74 44 6f  oid fts3InsertDo
19590 63 73 69 7a 65 28 0a 20 20 69 6e 74 20 2a 70 52  csize(.  int *pR
195a0 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C,              
195b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
195c0 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  lt code */.  Fts
195d0 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
195e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
195f0 54 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68  Table into which
19600 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20   to insert */.  
19610 75 33 32 20 2a 61 53 7a 20 20 20 20 20 20 20 20  u32 *aSz        
19620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19630 2f 2a 20 53 69 7a 65 73 20 6f 66 20 65 61 63 68  /* Sizes of each
19640 20 63 6f 6c 75 6d 6e 2c 20 69 6e 20 74 6f 6b 65   column, in toke
19650 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  ns */.){.  char 
19660 2a 70 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20  *pBlob;         
19670 20 20 20 20 2f 2a 20 54 68 65 20 42 4c 4f 42 20      /* The BLOB 
19680 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20  encoding of the 
19690 64 6f 63 75 6d 65 6e 74 20 73 69 7a 65 20 2a 2f  document size */
196a0 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20  .  int nBlob;   
196b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
196c0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
196d0 6e 20 74 68 65 20 42 4c 4f 42 20 2a 2f 0a 20 20  n the BLOB */.  
196e0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
196f0 74 6d 74 3b 20 20 20 20 20 2f 2a 20 53 74 61 74  tmt;     /* Stat
19700 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 69 6e  ement used to in
19710 73 65 72 74 20 74 68 65 20 65 6e 63 6f 64 69 6e  sert the encodin
19720 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  g */.  int rc;  
19730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19740 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
19750 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
19760 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20   */..  if( *pRC 
19770 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 42 6c 6f  ) return;.  pBlo
19780 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  b = sqlite3_mall
19790 6f 63 28 20 31 30 2a 70 2d 3e 6e 43 6f 6c 75 6d  oc( 10*p->nColum
197a0 6e 20 29 3b 0a 20 20 69 66 28 20 70 42 6c 6f 62  n );.  if( pBlob
197b0 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  ==0 ){.    *pRC 
197c0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
197d0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
197e0 20 20 66 74 73 33 45 6e 63 6f 64 65 49 6e 74 41    fts3EncodeIntA
197f0 72 72 61 79 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2c  rray(p->nColumn,
19800 20 61 53 7a 2c 20 70 42 6c 6f 62 2c 20 26 6e 42   aSz, pBlob, &nB
19810 6c 6f 62 29 3b 0a 20 20 72 63 20 3d 20 66 74 73  lob);.  rc = fts
19820 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
19830 52 45 50 4c 41 43 45 5f 44 4f 43 53 49 5a 45 2c  REPLACE_DOCSIZE,
19840 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69   &pStmt, 0);.  i
19850 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c  f( rc ){.    sql
19860 69 74 65 33 5f 66 72 65 65 28 70 42 6c 6f 62 29  ite3_free(pBlob)
19870 3b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  ;.    *pRC = rc;
19880 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
19890 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
198a0 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20  int64(pStmt, 1, 
198b0 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 29 3b 0a  p->iPrevDocid);.
198c0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62    sqlite3_bind_b
198d0 6c 6f 62 28 70 53 74 6d 74 2c 20 32 2c 20 70 42  lob(pStmt, 2, pB
198e0 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 73 71 6c 69  lob, nBlob, sqli
198f0 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 73 71 6c  te3_free);.  sql
19900 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
19910 3b 0a 20 20 2a 70 52 43 20 3d 20 73 71 6c 69 74  ;.  *pRC = sqlit
19920 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
19930 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64  .}../*.** Record
19940 20 30 20 6f 66 20 74 68 65 20 25 5f 73 74 61 74   0 of the %_stat
19950 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20   table contains 
19960 61 20 62 6c 6f 62 20 63 6f 6e 73 69 73 74 69 6e  a blob consistin
19970 67 20 6f 66 20 4e 20 76 61 72 69 6e 74 73 2c 0a  g of N varints,.
19980 2a 2a 20 77 68 65 72 65 20 4e 20 69 73 20 74 68  ** where N is th
19990 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 65 72  e number of user
199a0 20 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73   defined columns
199b0 20 69 6e 20 74 68 65 20 66 74 73 33 20 74 61 62   in the fts3 tab
199c0 6c 65 20 70 6c 75 73 0a 2a 2a 20 74 77 6f 2e 20  le plus.** two. 
199d0 49 66 20 6e 43 6f 6c 20 69 73 20 74 68 65 20 6e  If nCol is the n
199e0 75 6d 62 65 72 20 6f 66 20 75 73 65 72 20 64 65  umber of user de
199f0 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 2c 20 74  fined columns, t
19a00 68 65 6e 20 76 61 6c 75 65 73 20 6f 66 20 74 68  hen values of th
19a10 65 20 0a 2a 2a 20 76 61 72 69 6e 74 73 20 61 72  e .** varints ar
19a20 65 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73  e set as follows
19a30 3a 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 6e 74  :.**.**   Varint
19a40 20 30 3a 20 20 20 20 20 20 20 54 6f 74 61 6c 20   0:       Total 
19a50 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
19a60 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  n the table..**.
19a70 2a 2a 20 20 20 56 61 72 69 6e 74 20 31 2e 2e 6e  **   Varint 1..n
19a80 43 6f 6c 3a 20 46 6f 72 20 65 61 63 68 20 63 6f  Col: For each co
19a90 6c 75 6d 6e 2c 20 74 68 65 20 74 6f 74 61 6c 20  lumn, the total 
19aa0 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73  number of tokens
19ab0 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20   stored in.**   
19ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ad0 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 61  the column for a
19ae0 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74  ll rows of the t
19af0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61  able..**.**   Va
19b00 72 69 6e 74 20 31 2b 6e 43 6f 6c 3a 20 20 54 68  rint 1+nCol:  Th
19b10 65 20 74 6f 74 61 6c 20 73 69 7a 65 2c 20 69 6e  e total size, in
19b20 20 62 79 74 65 73 2c 20 6f 66 20 61 6c 6c 20 74   bytes, of all t
19b30 65 78 74 20 76 61 6c 75 65 73 20 69 6e 20 61 6c  ext values in al
19b40 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
19b50 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f         columns o
19b60 66 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68  f all rows of th
19b70 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73  e table..**.*/.s
19b80 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 55  tatic void fts3U
19b90 70 64 61 74 65 44 6f 63 54 6f 74 61 6c 73 28 0a  pdateDocTotals(.
19ba0 20 20 69 6e 74 20 2a 70 52 43 2c 20 20 20 20 20    int *pRC,     
19bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bc0 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
19bd0 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 54 61  code */.  Fts3Ta
19be0 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
19bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
19c00 6c 65 20 62 65 69 6e 67 20 75 70 64 61 74 65 64  le being updated
19c10 20 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a 49 6e   */.  u32 *aSzIn
19c20 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
19c30 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 69 6e        /* Size in
19c40 63 72 65 61 73 65 73 20 2a 2f 0a 20 20 75 33 32  creases */.  u32
19c50 20 2a 61 53 7a 44 65 6c 2c 20 20 20 20 20 20 20   *aSzDel,       
19c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19c70 53 69 7a 65 20 64 65 63 72 65 61 73 65 73 20 2a  Size decreases *
19c80 2f 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20 20 20  /.  int nChng   
19c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ca0 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 69 6e      /* Change in
19cb0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 64   the number of d
19cc0 6f 63 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  ocuments */.){. 
19cd0 20 63 68 61 72 20 2a 70 42 6c 6f 62 3b 20 20 20   char *pBlob;   
19ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f            /* Sto
19cf0 72 61 67 65 20 66 6f 72 20 42 4c 4f 42 20 77 72  rage for BLOB wr
19d00 69 74 74 65 6e 20 69 6e 74 6f 20 25 5f 73 74 61  itten into %_sta
19d10 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62  t */.  int nBlob
19d20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19d30 2f 2a 20 53 69 7a 65 20 6f 66 20 42 4c 4f 42 20  /* Size of BLOB 
19d40 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 25 5f 73  written into %_s
19d50 74 61 74 20 2a 2f 0a 20 20 75 33 32 20 2a 61 3b  tat */.  u32 *a;
19d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d70 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 69 6e    /* Array of in
19d80 74 65 67 65 72 73 20 74 68 61 74 20 62 65 63 6f  tegers that beco
19d90 6d 65 73 20 74 68 65 20 42 4c 4f 42 20 2a 2f 0a  mes the BLOB */.
19da0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
19db0 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 53 74  pStmt;     /* St
19dc0 61 74 65 6d 65 6e 74 20 66 6f 72 20 72 65 61 64  atement for read
19dd0 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 20  ing and writing 
19de0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
19df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19e00 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
19e10 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
19e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
19e30 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
19e40 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  subfunctions */.
19e50 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 53 74  .  const int nSt
19e60 61 74 20 3d 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  at = p->nColumn+
19e70 32 3b 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  2;..  if( *pRC )
19e80 20 72 65 74 75 72 6e 3b 0a 20 20 61 20 3d 20 73   return;.  a = s
19e90 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 28  qlite3_malloc( (
19ea0 73 69 7a 65 6f 66 28 75 33 32 29 2b 31 30 29 2a  sizeof(u32)+10)*
19eb0 6e 53 74 61 74 20 29 3b 0a 20 20 69 66 28 20 61  nStat );.  if( a
19ec0 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  ==0 ){.    *pRC 
19ed0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
19ee0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
19ef0 20 20 70 42 6c 6f 62 20 3d 20 28 63 68 61 72 2a    pBlob = (char*
19f00 29 26 61 5b 6e 53 74 61 74 5d 3b 0a 20 20 72 63  )&a[nStat];.  rc
19f10 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
19f20 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 54 41  , SQL_SELECT_STA
19f30 54 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  T, &pStmt, 0);. 
19f40 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
19f50 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a  qlite3_free(a);.
19f60 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
19f70 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
19f80 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
19f90 74 28 70 53 74 6d 74 2c 20 31 2c 20 46 54 53 5f  t(pStmt, 1, FTS_
19fa0 53 54 41 54 5f 44 4f 43 54 4f 54 41 4c 29 3b 0a  STAT_DOCTOTAL);.
19fb0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
19fc0 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
19fd0 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 66 74 73  E_ROW ){.    fts
19fe0 33 44 65 63 6f 64 65 49 6e 74 41 72 72 61 79 28  3DecodeIntArray(
19ff0 6e 53 74 61 74 2c 20 61 2c 0a 20 20 20 20 20 20  nStat, a,.      
1a000 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
1a010 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 30 29  n_blob(pStmt, 0)
1a020 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ,.         sqlit
1a030 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
1a040 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 7d 65  pStmt, 0));.  }e
1a050 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  lse{.    memset(
1a060 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 33 32  a, 0, sizeof(u32
1a070 29 2a 28 6e 53 74 61 74 29 20 29 3b 0a 20 20 7d  )*(nStat) );.  }
1a080 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1a090 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
1a0a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a0b0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
1a0c0 5f 66 72 65 65 28 61 29 3b 0a 20 20 20 20 2a 70  _free(a);.    *p
1a0d0 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74  RC = rc;.    ret
1a0e0 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  urn;.  }.  if( n
1a0f0 43 68 6e 67 3c 30 20 26 26 20 61 5b 30 5d 3c 28  Chng<0 && a[0]<(
1a100 75 33 32 29 28 2d 6e 43 68 6e 67 29 20 29 7b 0a  u32)(-nChng) ){.
1a110 20 20 20 20 61 5b 30 5d 20 3d 20 30 3b 0a 20 20      a[0] = 0;.  
1a120 7d 65 6c 73 65 7b 0a 20 20 20 20 61 5b 30 5d 20  }else{.    a[0] 
1a130 2b 3d 20 6e 43 68 6e 67 3b 0a 20 20 7d 0a 20 20  += nChng;.  }.  
1a140 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
1a150 6f 6c 75 6d 6e 2b 31 3b 20 69 2b 2b 29 7b 0a 20  olumn+1; i++){. 
1a160 20 20 20 75 33 32 20 78 20 3d 20 61 5b 69 2b 31     u32 x = a[i+1
1a170 5d 3b 0a 20 20 20 20 69 66 28 20 78 2b 61 53 7a  ];.    if( x+aSz
1a180 49 6e 73 5b 69 5d 20 3c 20 61 53 7a 44 65 6c 5b  Ins[i] < aSzDel[
1a190 69 5d 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20  i] ){.      x = 
1a1a0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1a1b0 20 20 20 20 78 20 3d 20 78 20 2b 20 61 53 7a 49      x = x + aSzI
1a1c0 6e 73 5b 69 5d 20 2d 20 61 53 7a 44 65 6c 5b 69  ns[i] - aSzDel[i
1a1d0 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 5b 69  ];.    }.    a[i
1a1e0 2b 31 5d 20 3d 20 78 3b 0a 20 20 7d 0a 20 20 66  +1] = x;.  }.  f
1a1f0 74 73 33 45 6e 63 6f 64 65 49 6e 74 41 72 72 61  ts3EncodeIntArra
1a200 79 28 6e 53 74 61 74 2c 20 61 2c 20 70 42 6c 6f  y(nStat, a, pBlo
1a210 62 2c 20 26 6e 42 6c 6f 62 29 3b 0a 20 20 72 63  b, &nBlob);.  rc
1a220 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
1a230 2c 20 53 51 4c 5f 52 45 50 4c 41 43 45 5f 53 54  , SQL_REPLACE_ST
1a240 41 54 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  AT, &pStmt, 0);.
1a250 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1a260 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b  sqlite3_free(a);
1a270 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
1a280 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1a290 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
1a2a0 6e 74 28 70 53 74 6d 74 2c 20 31 2c 20 46 54 53  nt(pStmt, 1, FTS
1a2b0 5f 53 54 41 54 5f 44 4f 43 54 4f 54 41 4c 29 3b  _STAT_DOCTOTAL);
1a2c0 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
1a2d0 62 6c 6f 62 28 70 53 74 6d 74 2c 20 32 2c 20 70  blob(pStmt, 2, p
1a2e0 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 53 51 4c  Blob, nBlob, SQL
1a2f0 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73  ITE_STATIC);.  s
1a300 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
1a310 74 29 3b 0a 20 20 2a 70 52 43 20 3d 20 73 71 6c  t);.  *pRC = sql
1a320 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
1a330 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
1a340 65 28 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  e(a);.}../*.** M
1a350 65 72 67 65 20 74 68 65 20 65 6e 74 69 72 65 20  erge the entire 
1a360 64 61 74 61 62 61 73 65 20 73 6f 20 74 68 61 74  database so that
1a370 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20 73 65   there is one se
1a380 67 6d 65 6e 74 20 66 6f 72 20 65 61 63 68 20 0a  gment for each .
1a390 2a 2a 20 69 49 6e 64 65 78 2f 69 4c 61 6e 67 69  ** iIndex/iLangi
1a3a0 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 0a 2a  d combination..*
1a3b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1a3c0 33 44 6f 4f 70 74 69 6d 69 7a 65 28 46 74 73 33  3DoOptimize(Fts3
1a3d0 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 62 52  Table *p, int bR
1a3e0 65 74 75 72 6e 44 6f 6e 65 29 7b 0a 20 20 69 6e  eturnDone){.  in
1a3f0 74 20 62 53 65 65 6e 44 6f 6e 65 20 3d 20 30 3b  t bSeenDone = 0;
1a400 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
1a410 69 74 65 33 5f 73 74 6d 74 20 2a 70 41 6c 6c 4c  ite3_stmt *pAllL
1a420 61 6e 67 69 64 20 3d 20 30 3b 0a 0a 20 20 72 63  angid = 0;..  rc
1a430 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
1a440 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 41 4c 4c  , SQL_SELECT_ALL
1a450 5f 4c 41 4e 47 49 44 2c 20 26 70 41 6c 6c 4c 61  _LANGID, &pAllLa
1a460 6e 67 69 64 2c 20 30 29 3b 0a 20 20 69 66 28 20  ngid, 0);.  if( 
1a470 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a480 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20  .    int rc2;.  
1a490 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
1a4a0 6e 74 28 70 41 6c 6c 4c 61 6e 67 69 64 2c 20 31  nt(pAllLangid, 1
1a4b0 2c 20 70 2d 3e 6e 49 6e 64 65 78 29 3b 0a 20 20  , p->nIndex);.  
1a4c0 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
1a4d0 5f 73 74 65 70 28 70 41 6c 6c 4c 61 6e 67 69 64  _step(pAllLangid
1a4e0 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
1a4f0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
1a500 20 20 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 20      int iLangid 
1a510 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
1a520 5f 69 6e 74 28 70 41 6c 6c 4c 61 6e 67 69 64 2c  _int(pAllLangid,
1a530 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   0);.      for(i
1a540 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
1a550 4b 20 26 26 20 69 3c 70 2d 3e 6e 49 6e 64 65 78  K && i<p->nIndex
1a560 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1a570 72 63 20 3d 20 66 74 73 33 53 65 67 6d 65 6e 74  rc = fts3Segment
1a580 4d 65 72 67 65 28 70 2c 20 69 4c 61 6e 67 69 64  Merge(p, iLangid
1a590 2c 20 69 2c 20 46 54 53 33 5f 53 45 47 43 55 52  , i, FTS3_SEGCUR
1a5a0 53 4f 52 5f 41 4c 4c 29 3b 0a 20 20 20 20 20 20  SOR_ALL);.      
1a5b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a5c0 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
1a5d0 20 20 20 62 53 65 65 6e 44 6f 6e 65 20 3d 20 31     bSeenDone = 1
1a5e0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1a5f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1a600 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1a610 20 20 7d 0a 20 20 20 20 72 63 32 20 3d 20 73 71    }.    rc2 = sq
1a620 6c 69 74 65 33 5f 72 65 73 65 74 28 70 41 6c 6c  lite3_reset(pAll
1a630 4c 61 6e 67 69 64 29 3b 0a 20 20 20 20 69 66 28  Langid);.    if(
1a640 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a650 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a   rc = rc2;.  }..
1a660 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67    sqlite3Fts3Seg
1a670 6d 65 6e 74 73 43 6c 6f 73 65 28 70 29 3b 0a 20  mentsClose(p);. 
1a680 20 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64   sqlite3Fts3Pend
1a690 69 6e 67 54 65 72 6d 73 43 6c 65 61 72 28 70 29  ingTermsClear(p)
1a6a0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  ;..  return (rc=
1a6b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 52  =SQLITE_OK && bR
1a6c0 65 74 75 72 6e 44 6f 6e 65 20 26 26 20 62 53 65  eturnDone && bSe
1a6d0 65 6e 44 6f 6e 65 29 20 3f 20 53 51 4c 49 54 45  enDone) ? SQLITE
1a6e0 5f 44 4f 4e 45 20 3a 20 72 63 3b 0a 7d 0a 0a 2f  _DONE : rc;.}../
1a6f0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1a700 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
1a710 6e 20 74 68 65 20 75 73 65 72 20 65 78 65 63 75  n the user execu
1a720 74 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  tes the followin
1a730 67 20 73 74 61 74 65 6d 65 6e 74 3a 0a 2a 2a 0a  g statement:.**.
1a740 2a 2a 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  **     INSERT IN
1a750 54 4f 20 3c 74 62 6c 3e 28 3c 74 62 6c 3e 29 20  TO <tbl>(<tbl>) 
1a760 56 41 4c 55 45 53 28 27 72 65 62 75 69 6c 64 27  VALUES('rebuild'
1a770 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 6e 74  );.**.** The ent
1a780 69 72 65 20 46 54 53 20 69 6e 64 65 78 20 69 73  ire FTS index is
1a790 20 64 69 73 63 61 72 64 65 64 20 61 6e 64 20 72   discarded and r
1a7a0 65 62 75 69 6c 74 2e 20 49 66 20 74 68 65 20 74  ebuilt. If the t
1a7b0 61 62 6c 65 20 69 73 20 6f 6e 65 20 0a 2a 2a 20  able is one .** 
1a7c0 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68  created using th
1a7d0 65 20 63 6f 6e 74 65 6e 74 3d 78 78 78 20 6f 70  e content=xxx op
1a7e0 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 6e  tion, then the n
1a7f0 65 77 20 69 6e 64 65 78 20 69 73 20 62 61 73 65  ew index is base
1a800 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72  d on.** the curr
1a810 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ent contents of 
1a820 74 68 65 20 78 78 78 20 74 61 62 6c 65 2e 20 4f  the xxx table. O
1a830 74 68 65 72 77 69 73 65 2c 20 69 74 20 69 73 20  therwise, it is 
1a840 72 65 62 75 69 6c 74 20 62 61 73 65 64 0a 2a 2a  rebuilt based.**
1a850 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   on the contents
1a860 20 6f 66 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e   of the %_conten
1a870 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  t table..*/.stat
1a880 69 63 20 69 6e 74 20 66 74 73 33 44 6f 52 65 62  ic int fts3DoReb
1a890 75 69 6c 64 28 46 74 73 33 54 61 62 6c 65 20 2a  uild(Fts3Table *
1a8a0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  p){.  int rc;   
1a8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8c0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1a8d0 43 6f 64 65 20 2a 2f 0a 0a 20 20 72 63 20 3d 20  Code */..  rc = 
1a8e0 66 74 73 33 44 65 6c 65 74 65 41 6c 6c 28 70 2c  fts3DeleteAll(p,
1a8f0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
1a900 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a910 75 33 32 20 2a 61 53 7a 20 3d 20 30 3b 0a 20 20  u32 *aSz = 0;.  
1a920 20 20 75 33 32 20 2a 61 53 7a 49 6e 73 20 3d 20    u32 *aSzIns = 
1a930 30 3b 0a 20 20 20 20 75 33 32 20 2a 61 53 7a 44  0;.    u32 *aSzD
1a940 65 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  el = 0;.    sqli
1a950 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
1a960 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 45 6e  = 0;.    int nEn
1a970 74 72 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  try = 0;..    /*
1a980 20 43 6f 6d 70 6f 73 65 20 61 6e 64 20 70 72 65   Compose and pre
1a990 70 61 72 65 20 61 6e 20 53 51 4c 20 73 74 61 74  pare an SQL stat
1a9a0 65 6d 65 6e 74 20 74 6f 20 6c 6f 6f 70 20 74 68  ement to loop th
1a9b0 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 74 65 6e  rough the conten
1a9c0 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63  t table */.    c
1a9d0 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69  har *zSql = sqli
1a9e0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
1a9f0 45 43 54 20 25 73 22 20 2c 20 70 2d 3e 7a 52 65  ECT %s" , p->zRe
1aa00 61 64 45 78 70 72 6c 69 73 74 29 3b 0a 20 20 20  adExprlist);.   
1aa10 20 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20   if( !zSql ){.  
1aa20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1aa30 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
1aa40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1aa50 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
1aa60 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  p->db, zSql, -1,
1aa70 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
1aa80 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1aa90 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  zSql);.    }..  
1aaa0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1aab0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
1aac0 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
1aad0 75 33 32 29 20 2a 20 28 70 2d 3e 6e 43 6f 6c 75  u32) * (p->nColu
1aae0 6d 6e 2b 31 29 2a 33 3b 0a 20 20 20 20 20 20 61  mn+1)*3;.      a
1aaf0 53 7a 20 3d 20 28 75 33 32 20 2a 29 73 71 6c 69  Sz = (u32 *)sqli
1ab00 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65  te3_malloc(nByte
1ab10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 7a  );.      if( aSz
1ab20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1ab30 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1ab40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1ab50 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 53         memset(aS
1ab60 7a 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20  z, 0, nByte);.  
1ab70 20 20 20 20 20 20 61 53 7a 49 6e 73 20 3d 20 26        aSzIns = &
1ab80 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31  aSz[p->nColumn+1
1ab90 5d 3b 0a 20 20 20 20 20 20 20 20 61 53 7a 44 65  ];.        aSzDe
1aba0 6c 20 3d 20 26 61 53 7a 49 6e 73 5b 70 2d 3e 6e  l = &aSzIns[p->n
1abb0 43 6f 6c 75 6d 6e 2b 31 5d 3b 0a 20 20 20 20 20  Column+1];.     
1abc0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 68   }.    }..    wh
1abd0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1abe0 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
1abf0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
1ac00 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 69  Stmt) ){.      i
1ac10 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 69  nt iCol;.      i
1ac20 6e 74 20 69 4c 61 6e 67 69 64 20 3d 20 6c 61 6e  nt iLangid = lan
1ac30 67 69 64 46 72 6f 6d 53 65 6c 65 63 74 28 70 2c  gidFromSelect(p,
1ac40 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72   pStmt);.      r
1ac50 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54  c = fts3PendingT
1ac60 65 72 6d 73 44 6f 63 69 64 28 70 2c 20 69 4c 61  ermsDocid(p, iLa
1ac70 6e 67 69 64 2c 20 73 71 6c 69 74 65 33 5f 63 6f  ngid, sqlite3_co
1ac80 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
1ac90 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61 53 7a  , 0));.      aSz
1aca0 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d 20 30  [p->nColumn] = 0
1acb0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c  ;.      for(iCol
1acc0 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
1acd0 4b 20 26 26 20 69 43 6f 6c 3c 70 2d 3e 6e 43 6f  K && iCol<p->nCo
1ace0 6c 75 6d 6e 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  lumn; iCol++){. 
1acf0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
1ad00 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68  r *z = (const ch
1ad10 61 72 20 2a 29 20 73 71 6c 69 74 65 33 5f 63 6f  ar *) sqlite3_co
1ad20 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
1ad30 20 69 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20   iCol+1);.      
1ad40 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69    rc = fts3Pendi
1ad50 6e 67 54 65 72 6d 73 41 64 64 28 70 2c 20 69 4c  ngTermsAdd(p, iL
1ad60 61 6e 67 69 64 2c 20 7a 2c 20 69 43 6f 6c 2c 20  angid, z, iCol, 
1ad70 26 61 53 7a 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20  &aSz[iCol]);.   
1ad80 20 20 20 20 20 61 53 7a 5b 70 2d 3e 6e 43 6f 6c       aSz[p->nCol
1ad90 75 6d 6e 5d 20 2b 3d 20 73 71 6c 69 74 65 33 5f  umn] += sqlite3_
1ada0 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
1adb0 6d 74 2c 20 69 43 6f 6c 2b 31 29 3b 0a 20 20 20  mt, iCol+1);.   
1adc0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1add0 2d 3e 62 48 61 73 44 6f 63 73 69 7a 65 20 29 7b  ->bHasDocsize ){
1ade0 0a 20 20 20 20 20 20 20 20 66 74 73 33 49 6e 73  .        fts3Ins
1adf0 65 72 74 44 6f 63 73 69 7a 65 28 26 72 63 2c 20  ertDocsize(&rc, 
1ae00 70 2c 20 61 53 7a 29 3b 0a 20 20 20 20 20 20 7d  p, aSz);.      }
1ae10 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1ae20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ae30 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
1ae40 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
1ae50 20 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a       pStmt = 0;.
1ae60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ae70 20 20 20 20 20 6e 45 6e 74 72 79 2b 2b 3b 0a 20       nEntry++;. 
1ae80 20 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d         for(iCol=
1ae90 30 3b 20 69 43 6f 6c 3c 3d 70 2d 3e 6e 43 6f 6c  0; iCol<=p->nCol
1aea0 75 6d 6e 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  umn; iCol++){.  
1aeb0 20 20 20 20 20 20 20 20 61 53 7a 49 6e 73 5b 69          aSzIns[i
1aec0 43 6f 6c 5d 20 2b 3d 20 61 53 7a 5b 69 43 6f 6c  Col] += aSz[iCol
1aed0 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
1aee0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1aef0 66 28 20 70 2d 3e 62 46 74 73 34 20 29 7b 0a 20  f( p->bFts4 ){. 
1af00 20 20 20 20 20 66 74 73 33 55 70 64 61 74 65 44       fts3UpdateD
1af10 6f 63 54 6f 74 61 6c 73 28 26 72 63 2c 20 70 2c  ocTotals(&rc, p,
1af20 20 61 53 7a 49 6e 73 2c 20 61 53 7a 44 65 6c 2c   aSzIns, aSzDel,
1af30 20 6e 45 6e 74 72 79 29 3b 0a 20 20 20 20 7d 0a   nEntry);.    }.
1af40 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1af50 28 61 53 7a 29 3b 0a 0a 20 20 20 20 69 66 28 20  (aSz);..    if( 
1af60 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 69  pStmt ){.      i
1af70 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  nt rc2 = sqlite3
1af80 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
1af90 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1afa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1afb0 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
1afc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1afd0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1afe0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
1aff0 6e 63 74 69 6f 6e 20 6f 70 65 6e 73 20 61 20 63  nction opens a c
1b000 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20 72 65  ursor used to re
1b010 61 64 20 74 68 65 20 69 6e 70 75 74 20 64 61 74  ad the input dat
1b020 61 20 66 6f 72 20 61 6e 20 0a 2a 2a 20 69 6e 63  a for an .** inc
1b030 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f  remental merge o
1b040 70 65 72 61 74 69 6f 6e 2e 20 53 70 65 63 69 66  peration. Specif
1b050 69 63 61 6c 6c 79 2c 20 69 74 20 6f 70 65 6e 73  ically, it opens
1b060 20 61 20 63 75 72 73 6f 72 20 74 6f 20 73 63 61   a cursor to sca
1b070 6e 0a 2a 2a 20 74 68 65 20 6f 6c 64 65 73 74 20  n.** the oldest 
1b080 6e 53 65 67 20 73 65 67 6d 65 6e 74 73 20 28 69  nSeg segments (i
1b090 64 78 3d 30 20 74 68 72 6f 75 67 68 20 69 64 78  dx=0 through idx
1b0a0 3d 28 6e 53 65 67 2d 31 29 29 20 69 6e 20 61 62  =(nSeg-1)) in ab
1b0b0 73 6f 6c 75 74 65 20 0a 2a 2a 20 6c 65 76 65 6c  solute .** level
1b0c0 20 69 41 62 73 4c 65 76 65 6c 2e 0a 2a 2f 0a 73   iAbsLevel..*/.s
1b0d0 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e  tatic int fts3In
1b0e0 63 72 6d 65 72 67 65 43 73 72 28 0a 20 20 46 74  crmergeCsr(.  Ft
1b0f0 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
1b100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b110 20 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64   FTS3 table hand
1b120 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
1b130 69 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c 2c  int64 iAbsLevel,
1b140 20 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c          /* Absol
1b150 75 74 65 20 6c 65 76 65 6c 20 74 6f 20 6f 70 65  ute level to ope
1b160 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 2c  n */.  int nSeg,
1b170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b180 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1b190 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20   of segments to 
1b1a0 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74 73 33 4d  merge */.  Fts3M
1b1b0 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70  ultiSegReader *p
1b1c0 43 73 72 20 20 20 20 20 20 20 20 2f 2a 20 43 75  Csr        /* Cu
1b1d0 72 73 6f 72 20 6f 62 6a 65 63 74 20 74 6f 20 70  rsor object to p
1b1e0 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20  opulate */.){.  
1b1f0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1b200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b210 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
1b220 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
1b230 20 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20 20 20   *pStmt = 0;    
1b240 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
1b250 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 25 5f   used to read %_
1b260 73 65 67 64 69 72 20 65 6e 74 72 79 20 2a 2f 20  segdir entry */ 
1b270 20 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20   .  int nByte;  
1b280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b290 20 20 20 20 2f 2a 20 42 79 74 65 73 20 61 6c 6c      /* Bytes all
1b2a0 6f 63 61 74 65 64 20 61 74 20 70 43 73 72 2d 3e  ocated at pCsr->
1b2b0 61 70 53 65 67 6d 65 6e 74 5b 5d 20 2a 2f 0a 0a  apSegment[] */..
1b2c0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
1b2d0 61 63 65 20 66 6f 72 20 74 68 65 20 46 74 73 33  ace for the Fts3
1b2e0 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 2e 61  MultiSegReader.a
1b2f0 43 73 72 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  Csr[] array */. 
1b300 20 6d 65 6d 73 65 74 28 70 43 73 72 2c 20 30 2c   memset(pCsr, 0,
1b310 20 73 69 7a 65 6f 66 28 2a 70 43 73 72 29 29 3b   sizeof(*pCsr));
1b320 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
1b330 66 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20  f(Fts3SegReader 
1b340 2a 29 20 2a 20 6e 53 65 67 3b 0a 20 20 70 43 73  *) * nSeg;.  pCs
1b350 72 2d 3e 61 70 53 65 67 6d 65 6e 74 20 3d 20 28  r->apSegment = (
1b360 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a  Fts3SegReader **
1b370 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
1b380 6e 42 79 74 65 29 3b 0a 0a 20 20 69 66 28 20 70  nByte);..  if( p
1b390 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 3d 3d  Csr->apSegment==
1b3a0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
1b3b0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
1b3c0 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  lse{.    memset(
1b3d0 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 2c  pCsr->apSegment,
1b3e0 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20   0, nByte);.    
1b3f0 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
1b400 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c  (p, SQL_SELECT_L
1b410 45 56 45 4c 2c 20 26 70 53 74 6d 74 2c 20 30 29  EVEL, &pStmt, 0)
1b420 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1b430 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b440 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
1b450 72 63 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rc2;.    sqlite3
1b460 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d  _bind_int64(pStm
1b470 74 2c 20 31 2c 20 69 41 62 73 4c 65 76 65 6c 29  t, 1, iAbsLevel)
1b480 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
1b490 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 30 20  sr->nSegment==0 
1b4a0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
1b4b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1b4c0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
1b4d0 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
1b4e0 20 26 26 20 69 3c 6e 53 65 67 3b 20 69 2b 2b 29   && i<nSeg; i++)
1b4f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1b500 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
1b510 72 4e 65 77 28 69 2c 20 30 2c 0a 20 20 20 20 20  rNew(i, 0,.     
1b520 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
1b530 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
1b540 20 31 29 2c 20 20 20 20 20 20 20 20 2f 2a 20 73   1),        /* s
1b550 65 67 64 69 72 2e 73 74 61 72 74 5f 62 6c 6f 63  egdir.start_bloc
1b560 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  k */.          s
1b570 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
1b580 74 36 34 28 70 53 74 6d 74 2c 20 32 29 2c 20 20  t64(pStmt, 2),  
1b590 20 20 20 20 20 20 2f 2a 20 73 65 67 64 69 72 2e        /* segdir.
1b5a0 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b  leaves_end_block
1b5b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
1b5c0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
1b5d0 36 34 28 70 53 74 6d 74 2c 20 33 29 2c 20 20 20  64(pStmt, 3),   
1b5e0 20 20 20 20 20 2f 2a 20 73 65 67 64 69 72 2e 65       /* segdir.e
1b5f0 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  nd_block */.    
1b600 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
1b610 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  lumn_blob(pStmt,
1b620 20 34 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20   4),         /* 
1b630 73 65 67 64 69 72 2e 72 6f 6f 74 20 2a 2f 0a 20  segdir.root */. 
1b640 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1b650 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
1b660 74 6d 74 2c 20 34 29 2c 20 20 20 20 20 20 20 20  tmt, 4),        
1b670 2f 2a 20 73 65 67 64 69 72 2e 72 6f 6f 74 20 2a  /* segdir.root *
1b680 2f 0a 20 20 20 20 20 20 20 20 20 20 26 70 43 73  /.          &pCs
1b690 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69 5d 0a  r->apSegment[i].
1b6a0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70        );.      p
1b6b0 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b  Csr->nSegment++;
1b6c0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 32 20 3d  .    }.    rc2 =
1b6d0 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
1b6e0 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Stmt);.    if( r
1b6f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
1b700 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20  c = rc2;.  }..  
1b710 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 74 79  return rc;.}..ty
1b720 70 65 64 65 66 20 73 74 72 75 63 74 20 49 6e 63  pedef struct Inc
1b730 72 6d 65 72 67 65 57 72 69 74 65 72 20 49 6e 63  rmergeWriter Inc
1b740 72 6d 65 72 67 65 57 72 69 74 65 72 3b 0a 74 79  rmergeWriter;.ty
1b750 70 65 64 65 66 20 73 74 72 75 63 74 20 4e 6f 64  pedef struct Nod
1b760 65 57 72 69 74 65 72 20 4e 6f 64 65 57 72 69 74  eWriter NodeWrit
1b770 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  er;.typedef stru
1b780 63 74 20 42 6c 6f 62 20 42 6c 6f 62 3b 0a 74 79  ct Blob Blob;.ty
1b790 70 65 64 65 66 20 73 74 72 75 63 74 20 4e 6f 64  pedef struct Nod
1b7a0 65 52 65 61 64 65 72 20 4e 6f 64 65 52 65 61 64  eReader NodeRead
1b7b0 65 72 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  er;../*.** An in
1b7c0 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
1b7d0 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
1b7e0 65 20 69 73 20 75 73 65 64 20 61 73 20 61 20 64  e is used as a d
1b7f0 79 6e 61 6d 69 63 20 62 75 66 66 65 72 0a 2a 2a  ynamic buffer.**
1b800 20 74 6f 20 62 75 69 6c 64 20 75 70 20 6e 6f 64   to build up nod
1b810 65 73 20 6f 72 20 6f 74 68 65 72 20 62 6c 6f 62  es or other blob
1b820 73 20 6f 66 20 64 61 74 61 20 69 6e 2e 0a 2a 2a  s of data in..**
1b830 0a 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e  .** The function
1b840 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28   blobGrowBuffer(
1b850 29 20 69 73 20 75 73 65 64 20 74 6f 20 65 78 74  ) is used to ext
1b860 65 6e 64 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  end the allocati
1b870 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 42 6c  on..*/.struct Bl
1b880 6f 62 20 7b 0a 20 20 63 68 61 72 20 2a 61 3b 20  ob {.  char *a; 
1b890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8a0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1b8b0 72 20 74 6f 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  r to allocation 
1b8c0 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
1b8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1b8f0 66 20 76 61 6c 69 64 20 62 79 74 65 73 20 6f 66  f valid bytes of
1b900 20 64 61 74 61 20 69 6e 20 61 5b 5d 20 2a 2f 0a   data in a[] */.
1b910 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20    int nAlloc;   
1b920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b930 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
1b940 69 7a 65 20 6f 66 20 61 5b 5d 20 28 6e 41 6c 6c  ize of a[] (nAll
1b950 6f 63 3e 3d 6e 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  oc>=n) */.};../*
1b960 0a 2a 2a 20 54 68 69 73 20 73 74 72 75 63 74 75  .** This structu
1b970 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 62 75  re is used to bu
1b980 69 6c 64 20 75 70 20 62 75 66 66 65 72 73 20 63  ild up buffers c
1b990 6f 6e 74 61 69 6e 69 6e 67 20 73 65 67 6d 65 6e  ontaining segmen
1b9a0 74 20 62 2d 74 72 65 65 20 0a 2a 2a 20 6e 6f 64  t b-tree .** nod
1b9b0 65 73 20 28 62 6c 6f 63 6b 73 29 2e 0a 2a 2f 0a  es (blocks)..*/.
1b9c0 73 74 72 75 63 74 20 4e 6f 64 65 57 72 69 74 65  struct NodeWrite
1b9d0 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  r {.  sqlite3_in
1b9e0 74 36 34 20 69 42 6c 6f 63 6b 3b 20 20 20 20 20  t64 iBlock;     
1b9f0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
1ba00 20 62 6c 6f 63 6b 20 69 64 20 2a 2f 0a 20 20 42   block id */.  B
1ba10 6c 6f 62 20 6b 65 79 3b 20 20 20 20 20 20 20 20  lob key;        
1ba20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ba30 2a 20 4c 61 73 74 20 6b 65 79 20 77 72 69 74 74  * Last key writt
1ba40 65 6e 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  en to the curren
1ba50 74 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 42 6c 6f  t block */.  Blo
1ba60 62 20 62 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20  b block;        
1ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ba80 43 75 72 72 65 6e 74 20 62 6c 6f 63 6b 20 69 6d  Current block im
1ba90 61 67 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  age */.};../*.**
1baa0 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66 20 74 68   An object of th
1bab0 69 73 20 74 79 70 65 20 63 6f 6e 74 61 69 6e 73  is type contains
1bac0 20 74 68 65 20 73 74 61 74 65 20 72 65 71 75 69   the state requi
1bad0 72 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 72  red to create or
1bae0 20 61 70 70 65 6e 64 0a 2a 2a 20 74 6f 20 61 6e   append.** to an
1baf0 20 61 70 70 65 6e 64 61 62 6c 65 20 62 2d 74 72   appendable b-tr
1bb00 65 65 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73  ee segment..*/.s
1bb10 74 72 75 63 74 20 49 6e 63 72 6d 65 72 67 65 57  truct IncrmergeW
1bb20 72 69 74 65 72 20 7b 0a 20 20 69 6e 74 20 6e 4c  riter {.  int nL
1bb30 65 61 66 45 73 74 3b 20 20 20 20 20 20 20 20 20  eafEst;         
1bb40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
1bb50 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
1bb60 20 6c 65 61 66 20 62 6c 6f 63 6b 73 20 2a 2f 0a   leaf blocks */.
1bb70 20 20 69 6e 74 20 6e 57 6f 72 6b 3b 20 20 20 20    int nWork;    
1bb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb90 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
1bba0 65 61 66 20 70 61 67 65 73 20 66 6c 75 73 68 65  eaf pages flushe
1bbb0 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  d */.  sqlite3_i
1bbc0 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c 3b 20  nt64 iAbsLevel; 
1bbd0 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75         /* Absolu
1bbe0 74 65 20 6c 65 76 65 6c 20 6f 66 20 69 6e 70 75  te level of inpu
1bbf0 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  t segments */.  
1bc00 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20 20  int iIdx;       
1bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 2a 6f 75 74  /* Index of *out
1bc30 70 75 74 2a 20 73 65 67 6d 65 6e 74 20 69 6e 20  put* segment in 
1bc40 69 41 62 73 4c 65 76 65 6c 2b 31 20 2a 2f 0a 20  iAbsLevel+1 */. 
1bc50 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1bc60 53 74 61 72 74 3b 20 20 20 20 20 20 20 20 20 20  Start;          
1bc70 20 2f 2a 20 42 6c 6f 63 6b 20 6e 75 6d 62 65 72   /* Block number
1bc80 20 6f 66 20 66 69 72 73 74 20 61 6c 6c 6f 63 61   of first alloca
1bc90 74 65 64 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 73  ted block */.  s
1bca0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e  qlite3_int64 iEn
1bcb0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
1bcc0 2a 20 42 6c 6f 63 6b 20 6e 75 6d 62 65 72 20 6f  * Block number o
1bcd0 66 20 6c 61 73 74 20 61 6c 6c 6f 63 61 74 65 64  f last allocated
1bce0 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 4e 6f 64 65   block */.  Node
1bcf0 57 72 69 74 65 72 20 61 4e 6f 64 65 57 72 69 74  Writer aNodeWrit
1bd00 65 72 5b 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e  er[FTS_MAX_APPEN
1bd10 44 41 42 4c 45 5f 48 45 49 47 48 54 5d 3b 0a 7d  DABLE_HEIGHT];.}
1bd20 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65  ;../*.** An obje
1bd30 63 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ct of the follow
1bd40 69 6e 67 20 74 79 70 65 20 69 73 20 75 73 65 64  ing type is used
1bd50 20 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 72   to read data fr
1bd60 6f 6d 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 46  om a single.** F
1bd70 54 53 20 73 65 67 6d 65 6e 74 20 6e 6f 64 65 2e  TS segment node.
1bd80 20 53 65 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69   See the followi
1bd90 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ng functions:.**
1bda0 0a 2a 2a 20 20 20 20 20 6e 6f 64 65 52 65 61 64  .**     nodeRead
1bdb0 65 72 49 6e 69 74 28 29 0a 2a 2a 20 20 20 20 20  erInit().**     
1bdc0 6e 6f 64 65 52 65 61 64 65 72 4e 65 78 74 28 29  nodeReaderNext()
1bdd0 0a 2a 2a 20 20 20 20 20 6e 6f 64 65 52 65 61 64  .**     nodeRead
1bde0 65 72 52 65 6c 65 61 73 65 28 29 0a 2a 2f 0a 73  erRelease().*/.s
1bdf0 74 72 75 63 74 20 4e 6f 64 65 52 65 61 64 65 72  truct NodeReader
1be00 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   {.  const char 
1be10 2a 61 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 6e 4e  *aNode;.  int nN
1be20 6f 64 65 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b  ode;.  int iOff;
1be30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be40 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
1be50 74 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  t offset within 
1be60 61 4e 6f 64 65 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a  aNode[] */..  /*
1be70 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
1be80 73 2e 20 43 6f 6e 74 61 69 6e 69 6e 67 20 74 68  s. Containing th
1be90 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 20 65  e current node e
1bea0 6e 74 72 79 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  ntry. */.  sqlit
1beb0 65 33 5f 69 6e 74 36 34 20 69 43 68 69 6c 64 3b  e3_int64 iChild;
1bec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1bed0 69 6e 74 65 72 20 74 6f 20 63 68 69 6c 64 20 6e  inter to child n
1bee0 6f 64 65 20 2a 2f 0a 20 20 42 6c 6f 62 20 74 65  ode */.  Blob te
1bef0 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
1bf00 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
1bf10 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 63 6f  ent term */.  co
1bf20 6e 73 74 20 63 68 61 72 20 2a 61 44 6f 63 6c 69  nst char *aDocli
1bf30 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
1bf40 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c   Pointer to docl
1bf50 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f  ist */.  int nDo
1bf60 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  clist;          
1bf70 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1bf80 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 62   of doclist in b
1bf90 79 74 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ytes */.};../*.*
1bfa0 2a 20 49 66 20 2a 70 52 63 20 69 73 20 6e 6f 74  * If *pRc is not
1bfb0 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20   SQLITE_OK when 
1bfc0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1bfd0 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
1bfe0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72   no-op..** Other
1bff0 77 69 73 65 2c 20 69 66 20 74 68 65 20 61 6c 6c  wise, if the all
1c000 6f 63 61 74 69 6f 6e 20 61 74 20 70 42 6c 6f 62  ocation at pBlob
1c010 2d 3e 61 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ->a is not alrea
1c020 64 79 20 61 74 20 6c 65 61 73 74 20 6e 4d 69 6e  dy at least nMin
1c030 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a  .** bytes in siz
1c040 65 2c 20 65 78 74 65 6e 64 20 28 72 65 61 6c 6c  e, extend (reall
1c050 6f 63 29 20 69 74 20 74 6f 20 62 65 20 73 6f 2e  oc) it to be so.
1c060 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d  .**.** If an OOM
1c070 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
1c080 65 74 20 2a 70 52 63 20 74 6f 20 53 51 4c 49 54  et *pRc to SQLIT
1c090 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 6c 65 61 76  E_NOMEM and leav
1c0a0 65 20 70 42 6c 6f 62 2d 3e 61 0a 2a 2a 20 75 6e  e pBlob->a.** un
1c0b0 6d 6f 64 69 66 69 65 64 2e 20 4f 74 68 65 72 77  modified. Otherw
1c0c0 69 73 65 2c 20 69 66 20 74 68 65 20 61 6c 6c 6f  ise, if the allo
1c0d0 63 61 74 69 6f 6e 20 73 75 63 63 65 65 64 73 2c  cation succeeds,
1c0e0 20 75 70 64 61 74 65 20 70 42 6c 6f 62 2d 3e 6e   update pBlob->n
1c0f0 41 6c 6c 6f 63 0a 2a 2a 20 74 6f 20 72 65 66 6c  Alloc.** to refl
1c100 65 63 74 20 74 68 65 20 6e 65 77 20 73 69 7a 65  ect the new size
1c110 20 6f 66 20 74 68 65 20 70 42 6c 6f 62 2d 3e 61   of the pBlob->a
1c120 5b 5d 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74  [] buffer..*/.st
1c130 61 74 69 63 20 76 6f 69 64 20 62 6c 6f 62 47 72  atic void blobGr
1c140 6f 77 42 75 66 66 65 72 28 42 6c 6f 62 20 2a 70  owBuffer(Blob *p
1c150 42 6c 6f 62 2c 20 69 6e 74 20 6e 4d 69 6e 2c 20  Blob, int nMin, 
1c160 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 69 66 28  int *pRc){.  if(
1c170 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
1c180 20 26 26 20 6e 4d 69 6e 3e 70 42 6c 6f 62 2d 3e   && nMin>pBlob->
1c190 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e  nAlloc ){.    in
1c1a0 74 20 6e 41 6c 6c 6f 63 20 3d 20 6e 4d 69 6e 3b  t nAlloc = nMin;
1c1b0 0a 20 20 20 20 63 68 61 72 20 2a 61 20 3d 20 28  .    char *a = (
1c1c0 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 72  char *)sqlite3_r
1c1d0 65 61 6c 6c 6f 63 28 70 42 6c 6f 62 2d 3e 61 2c  ealloc(pBlob->a,
1c1e0 20 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66   nAlloc);.    if
1c1f0 28 20 61 20 29 7b 0a 20 20 20 20 20 20 70 42 6c  ( a ){.      pBl
1c200 6f 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 41 6c  ob->nAlloc = nAl
1c210 6c 6f 63 3b 0a 20 20 20 20 20 20 70 42 6c 6f 62  loc;.      pBlob
1c220 2d 3e 61 20 3d 20 61 3b 0a 20 20 20 20 7d 65 6c  ->a = a;.    }el
1c230 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d  se{.      *pRc =
1c240 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1c250 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1c260 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 61 64 76  * Attempt to adv
1c270 61 6e 63 65 20 74 68 65 20 6e 6f 64 65 2d 72 65  ance the node-re
1c280 61 64 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73  ader object pass
1c290 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
1c2a0 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20 74  argument to.** t
1c2b0 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 6f 6e  he next entry on
1c2c0 20 74 68 65 20 6e 6f 64 65 2e 20 0a 2a 2a 0a 2a   the node. .**.*
1c2d0 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  * Return an erro
1c2e0 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72  r code if an err
1c2f0 6f 72 20 6f 63 63 75 72 73 20 28 53 51 4c 49 54  or occurs (SQLIT
1c300 45 5f 4e 4f 4d 45 4d 20 69 73 20 70 6f 73 73 69  E_NOMEM is possi
1c310 62 6c 65 29 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  ble). .** Otherw
1c320 69 73 65 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ise return SQLIT
1c330 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69  E_OK. If there i
1c340 73 20 6e 6f 20 6e 65 78 74 20 65 6e 74 72 79 20  s no next entry 
1c350 6f 6e 20 74 68 65 20 6e 6f 64 65 0a 2a 2a 20 28  on the node.** (
1c360 65 2e 67 2e 20 62 65 63 61 75 73 65 20 74 68 65  e.g. because the
1c370 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 69   current entry i
1c380 73 20 74 68 65 20 6c 61 73 74 29 20 73 65 74 20  s the last) set 
1c390 4e 6f 64 65 52 65 61 64 65 72 2d 3e 61 4e 6f 64  NodeReader->aNod
1c3a0 65 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 20 74 6f 20  e to.** NULL to 
1c3b0 69 6e 64 69 63 61 74 65 20 45 4f 46 2e 20 4f 74  indicate EOF. Ot
1c3c0 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74  herwise, populat
1c3d0 65 20 74 68 65 20 4e 6f 64 65 52 65 61 64 65 72  e the NodeReader
1c3e0 20 73 74 72 75 63 74 75 72 65 20 6f 75 74 70 75   structure outpu
1c3f0 74 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20  t .** variables 
1c400 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72  for the new entr
1c410 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
1c420 20 6e 6f 64 65 52 65 61 64 65 72 4e 65 78 74 28   nodeReaderNext(
1c430 4e 6f 64 65 52 65 61 64 65 72 20 2a 70 29 7b 0a  NodeReader *p){.
1c440 20 20 69 6e 74 20 62 46 69 72 73 74 20 3d 20 28    int bFirst = (
1c450 70 2d 3e 74 65 72 6d 2e 6e 3d 3d 30 29 3b 20 20  p->term.n==0);  
1c460 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 66 69    /* True for fi
1c470 72 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20  rst term on the 
1c480 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  node */.  int nP
1c490 72 65 66 69 78 20 3d 20 30 3b 20 20 20 20 20 20  refix = 0;      
1c4a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
1c4b0 65 73 20 74 6f 20 63 6f 70 79 20 66 72 6f 6d 20  es to copy from 
1c4c0 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 2a 2f  previous term */
1c4d0 0a 20 20 69 6e 74 20 6e 53 75 66 66 69 78 20 3d  .  int nSuffix =
1c4e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1c4f0 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
1c500 70 70 65 6e 64 20 74 6f 20 74 68 65 20 70 72 65  ppend to the pre
1c510 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  fix */.  int rc 
1c520 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
1c530 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1c540 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73  rn code */..  as
1c550 73 65 72 74 28 20 70 2d 3e 61 4e 6f 64 65 20 29  sert( p->aNode )
1c560 3b 0a 20 20 69 66 28 20 70 2d 3e 69 43 68 69 6c  ;.  if( p->iChil
1c570 64 20 26 26 20 62 46 69 72 73 74 3d 3d 30 20 29  d && bFirst==0 )
1c580 20 70 2d 3e 69 43 68 69 6c 64 2b 2b 3b 0a 20 20   p->iChild++;.  
1c590 69 66 28 20 70 2d 3e 69 4f 66 66 3e 3d 70 2d 3e  if( p->iOff>=p->
1c5a0 6e 4e 6f 64 65 20 29 7b 0a 20 20 20 20 2f 2a 20  nNode ){.    /* 
1c5b0 45 4f 46 20 2a 2f 0a 20 20 20 20 70 2d 3e 61 4e  EOF */.    p->aN
1c5c0 6f 64 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ode = 0;.  }else
1c5d0 7b 0a 20 20 20 20 69 66 28 20 62 46 69 72 73 74  {.    if( bFirst
1c5e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
1c5f0 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46  iOff += sqlite3F
1c600 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts3GetVarint32(&
1c610 70 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f 66 66  p->aNode[p->iOff
1c620 5d 2c 20 26 6e 50 72 65 66 69 78 29 3b 0a 20 20  ], &nPrefix);.  
1c630 20 20 7d 0a 20 20 20 20 70 2d 3e 69 4f 66 66 20    }.    p->iOff 
1c640 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65  += sqlite3Fts3Ge
1c650 74 56 61 72 69 6e 74 33 32 28 26 70 2d 3e 61 4e  tVarint32(&p->aN
1c660 6f 64 65 5b 70 2d 3e 69 4f 66 66 5d 2c 20 26 6e  ode[p->iOff], &n
1c670 53 75 66 66 69 78 29 3b 0a 0a 20 20 20 20 62 6c  Suffix);..    bl
1c680 6f 62 47 72 6f 77 42 75 66 66 65 72 28 26 70 2d  obGrowBuffer(&p-
1c690 3e 74 65 72 6d 2c 20 6e 50 72 65 66 69 78 2b 6e  >term, nPrefix+n
1c6a0 53 75 66 66 69 78 2c 20 26 72 63 29 3b 0a 20 20  Suffix, &rc);.  
1c6b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c6c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  _OK ){.      mem
1c6d0 63 70 79 28 26 70 2d 3e 74 65 72 6d 2e 61 5b 6e  cpy(&p->term.a[n
1c6e0 50 72 65 66 69 78 5d 2c 20 26 70 2d 3e 61 4e 6f  Prefix], &p->aNo
1c6f0 64 65 5b 70 2d 3e 69 4f 66 66 5d 2c 20 6e 53 75  de[p->iOff], nSu
1c700 66 66 69 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ffix);.      p->
1c710 74 65 72 6d 2e 6e 20 3d 20 6e 50 72 65 66 69 78  term.n = nPrefix
1c720 2b 6e 53 75 66 66 69 78 3b 0a 20 20 20 20 20 20  +nSuffix;.      
1c730 70 2d 3e 69 4f 66 66 20 2b 3d 20 6e 53 75 66 66  p->iOff += nSuff
1c740 69 78 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ix;.      if( p-
1c750 3e 69 43 68 69 6c 64 3d 3d 30 20 29 7b 0a 20 20  >iChild==0 ){.  
1c760 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 20 2b 3d        p->iOff +=
1c770 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56   sqlite3Fts3GetV
1c780 61 72 69 6e 74 33 32 28 26 70 2d 3e 61 4e 6f 64  arint32(&p->aNod
1c790 65 5b 70 2d 3e 69 4f 66 66 5d 2c 20 26 70 2d 3e  e[p->iOff], &p->
1c7a0 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20  nDoclist);.     
1c7b0 20 20 20 70 2d 3e 61 44 6f 63 6c 69 73 74 20 3d     p->aDoclist =
1c7c0 20 26 70 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f   &p->aNode[p->iO
1c7d0 66 66 5d 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ff];.        p->
1c7e0 69 4f 66 66 20 2b 3d 20 70 2d 3e 6e 44 6f 63 6c  iOff += p->nDocl
1c7f0 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ist;.      }.   
1c800 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
1c810 28 20 70 2d 3e 69 4f 66 66 3c 3d 70 2d 3e 6e 4e  ( p->iOff<=p->nN
1c820 6f 64 65 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  ode );..  return
1c830 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1c840 6c 65 61 73 65 20 61 6c 6c 20 64 79 6e 61 6d 69  lease all dynami
1c850 63 20 72 65 73 6f 75 72 63 65 73 20 68 65 6c 64  c resources held
1c860 20 62 79 20 6e 6f 64 65 2d 72 65 61 64 65 72 20   by node-reader 
1c870 6f 62 6a 65 63 74 20 2a 70 2e 0a 2a 2f 0a 73 74  object *p..*/.st
1c880 61 74 69 63 20 76 6f 69 64 20 6e 6f 64 65 52 65  atic void nodeRe
1c890 61 64 65 72 52 65 6c 65 61 73 65 28 4e 6f 64 65  aderRelease(Node
1c8a0 52 65 61 64 65 72 20 2a 70 29 7b 0a 20 20 73 71  Reader *p){.  sq
1c8b0 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 74 65  lite3_free(p->te
1c8c0 72 6d 2e 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rm.a);.}../*.** 
1c8d0 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 6f 64  Initialize a nod
1c8e0 65 2d 72 65 61 64 65 72 20 6f 62 6a 65 63 74 20  e-reader object 
1c8f0 74 6f 20 72 65 61 64 20 74 68 65 20 6e 6f 64 65  to read the node
1c900 20 69 6e 20 62 75 66 66 65 72 20 61 4e 6f 64 65   in buffer aNode
1c910 2f 6e 4e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  /nNode..**.** If
1c920 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
1c930 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1c940 65 64 20 61 6e 64 20 74 68 65 20 4e 6f 64 65 52  ed and the NodeR
1c950 65 61 64 65 72 20 6f 62 6a 65 63 74 20 73 65 74  eader object set
1c960 20 74 6f 20 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f   to .** point to
1c970 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1c980 20 6f 6e 20 74 68 65 20 6e 6f 64 65 20 28 69 66   on the node (if
1c990 20 61 6e 79 29 2e 20 4f 74 68 65 72 77 69 73 65   any). Otherwise
1c9a0 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65  , an SQLite.** e
1c9b0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1c9c0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1c9d0 20 69 6e 74 20 6e 6f 64 65 52 65 61 64 65 72 49   int nodeReaderI
1c9e0 6e 69 74 28 4e 6f 64 65 52 65 61 64 65 72 20 2a  nit(NodeReader *
1c9f0 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  p, const char *a
1ca00 4e 6f 64 65 2c 20 69 6e 74 20 6e 4e 6f 64 65 29  Node, int nNode)
1ca10 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
1ca20 20 73 69 7a 65 6f 66 28 4e 6f 64 65 52 65 61 64   sizeof(NodeRead
1ca30 65 72 29 29 3b 0a 20 20 70 2d 3e 61 4e 6f 64 65  er));.  p->aNode
1ca40 20 3d 20 61 4e 6f 64 65 3b 0a 20 20 70 2d 3e 6e   = aNode;.  p->n
1ca50 4e 6f 64 65 20 3d 20 6e 4e 6f 64 65 3b 0a 0a 20  Node = nNode;.. 
1ca60 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 69   /* Figure out i
1ca70 66 20 74 68 69 73 20 69 73 20 61 20 6c 65 61 66  f this is a leaf
1ca80 20 6f 72 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   or an internal 
1ca90 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70  node. */.  if( p
1caa0 2d 3e 61 4e 6f 64 65 5b 30 5d 20 29 7b 0a 20 20  ->aNode[0] ){.  
1cab0 20 20 2f 2a 20 41 6e 20 69 6e 74 65 72 6e 61 6c    /* An internal
1cac0 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 70 2d   node. */.    p-
1cad0 3e 69 4f 66 66 20 3d 20 31 20 2b 20 73 71 6c 69  >iOff = 1 + sqli
1cae0 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74  te3Fts3GetVarint
1caf0 28 26 70 2d 3e 61 4e 6f 64 65 5b 31 5d 2c 20 26  (&p->aNode[1], &
1cb00 70 2d 3e 69 43 68 69 6c 64 29 3b 0a 20 20 7d 65  p->iChild);.  }e
1cb10 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 69 4f 66 66  lse{.    p->iOff
1cb20 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   = 1;.  }..  ret
1cb30 75 72 6e 20 6e 6f 64 65 52 65 61 64 65 72 4e 65  urn nodeReaderNe
1cb40 78 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xt(p);.}../*.** 
1cb50 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1cb60 20 63 61 6c 6c 65 64 20 77 68 69 6c 65 20 77 72   called while wr
1cb70 69 74 69 6e 67 20 61 6e 20 46 54 53 20 73 65 67  iting an FTS seg
1cb80 6d 65 6e 74 20 65 61 63 68 20 74 69 6d 65 20 61  ment each time a
1cb90 20 6c 65 61 66 20 6f 0a 2a 2a 20 6e 6f 64 65 20   leaf o.** node 
1cba0 69 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20  is finished and 
1cbb0 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
1cbc0 20 54 68 65 20 6b 65 79 20 28 7a 54 65 72 6d 2f   The key (zTerm/
1cbd0 6e 54 65 72 6d 29 20 69 73 20 67 75 61 72 61 6e  nTerm) is guaran
1cbe0 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 67 72  teed.** to be gr
1cbf0 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c  eater than the l
1cc00 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 74 68  argest key on th
1cc10 65 20 6e 6f 64 65 20 6a 75 73 74 20 77 72 69 74  e node just writ
1cc20 74 65 6e 2c 20 62 75 74 20 73 6d 61 6c 6c 65 72  ten, but smaller
1cc30 0a 2a 2a 20 74 68 61 6e 20 6f 72 20 65 71 75 61  .** than or equa
1cc40 6c 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 6b  l to the first k
1cc50 65 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ey that will be 
1cc60 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6e  written to the n
1cc70 65 78 74 20 6c 65 61 66 0a 2a 2a 20 6e 6f 64 65  ext leaf.** node
1cc80 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 6c 6f 63  ..**.** The bloc
1cc90 6b 20 69 64 20 6f 66 20 74 68 65 20 6c 65 61 66  k id of the leaf
1cca0 20 6e 6f 64 65 20 6a 75 73 74 20 77 72 69 74 74   node just writt
1ccb0 65 6e 20 74 6f 20 64 69 73 6b 20 6d 61 79 20 62  en to disk may b
1ccc0 65 20 66 6f 75 6e 64 20 69 6e 0a 2a 2a 20 28 70  e found in.** (p
1ccd0 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69  Writer->aNodeWri
1cce0 74 65 72 5b 30 5d 2e 69 42 6c 6f 63 6b 29 20 77  ter[0].iBlock) w
1ccf0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1cd00 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  n is called..*/.
1cd10 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49  static int fts3I
1cd20 6e 63 72 6d 65 72 67 65 50 75 73 68 28 0a 20 20  ncrmergePush(.  
1cd30 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
1cd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd50 2f 2a 20 46 74 73 33 20 74 61 62 6c 65 20 68 61  /* Fts3 table ha
1cd60 6e 64 6c 65 20 2a 2f 0a 20 20 49 6e 63 72 6d 65  ndle */.  Incrme
1cd70 72 67 65 57 72 69 74 65 72 20 2a 70 57 72 69 74  rgeWriter *pWrit
1cd80 65 72 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69  er,       /* Wri
1cd90 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
1cda0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72  const char *zTer
1cdb0 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
1cdc0 2f 2a 20 54 65 72 6d 20 74 6f 20 77 72 69 74 65  /* Term to write
1cdd0 20 74 6f 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64   to internal nod
1cde0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  e */.  int nTerm
1cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce00 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
1ce10 61 74 20 7a 54 65 72 6d 20 2a 2f 0a 29 7b 0a 20  at zTerm */.){. 
1ce20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1ce30 50 74 72 20 3d 20 70 57 72 69 74 65 72 2d 3e 61  Ptr = pWriter->a
1ce40 4e 6f 64 65 57 72 69 74 65 72 5b 30 5d 2e 69 42  NodeWriter[0].iB
1ce50 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 69 4c 61 79  lock;.  int iLay
1ce60 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  er;..  assert( n
1ce70 54 65 72 6d 3e 30 20 29 3b 0a 20 20 66 6f 72 28  Term>0 );.  for(
1ce80 69 4c 61 79 65 72 3d 31 3b 20 41 4c 57 41 59 53  iLayer=1; ALWAYS
1ce90 28 69 4c 61 79 65 72 3c 46 54 53 5f 4d 41 58 5f  (iLayer<FTS_MAX_
1cea0 41 50 50 45 4e 44 41 42 4c 45 5f 48 45 49 47 48  APPENDABLE_HEIGH
1ceb0 54 29 3b 20 69 4c 61 79 65 72 2b 2b 29 7b 0a 20  T); iLayer++){. 
1cec0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
1ced0 20 69 4e 65 78 74 50 74 72 20 3d 20 30 3b 0a 20   iNextPtr = 0;. 
1cee0 20 20 20 4e 6f 64 65 57 72 69 74 65 72 20 2a 70     NodeWriter *p
1cef0 4e 6f 64 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Node = &pWriter-
1cf00 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 69 4c 61  >aNodeWriter[iLa
1cf10 79 65 72 5d 3b 0a 20 20 20 20 69 6e 74 20 72 63  yer];.    int rc
1cf20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1cf30 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 0a 20    int nPrefix;. 
1cf40 20 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 0a     int nSuffix;.
1cf50 20 20 20 20 69 6e 74 20 6e 53 70 61 63 65 3b 0a      int nSpace;.
1cf60 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
1cf70 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63  ut how much spac
1cf80 65 20 74 68 65 20 6b 65 79 20 77 69 6c 6c 20 63  e the key will c
1cf90 6f 6e 73 75 6d 65 20 69 66 20 69 74 20 69 73 20  onsume if it is 
1cfa0 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a  written to.    *
1cfb0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f  * the current no
1cfc0 64 65 20 6f 66 20 6c 61 79 65 72 20 69 4c 61 79  de of layer iLay
1cfd0 65 72 2e 20 44 75 65 20 74 6f 20 74 68 65 20 70  er. Due to the p
1cfe0 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f  refix compressio
1cff0 6e 2c 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  n, .    ** the s
1d000 70 61 63 65 20 72 65 71 75 69 72 65 64 20 63 68  pace required ch
1d010 61 6e 67 65 73 20 64 65 70 65 6e 64 69 6e 67 20  anges depending 
1d020 6f 6e 20 77 68 69 63 68 20 6e 6f 64 65 20 74 68  on which node th
1d030 65 20 6b 65 79 20 69 73 20 74 6f 0a 20 20 20 20  e key is to.    
1d040 2a 2a 20 62 65 20 61 64 64 65 64 20 74 6f 2e 20  ** be added to. 
1d050 20 2a 2f 0a 20 20 20 20 6e 50 72 65 66 69 78 20   */.    nPrefix 
1d060 3d 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70  = fts3PrefixComp
1d070 72 65 73 73 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e  ress(pNode->key.
1d080 61 2c 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 2c  a, pNode->key.n,
1d090 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   zTerm, nTerm);.
1d0a0 20 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54      nSuffix = nT
1d0b0 65 72 6d 20 2d 20 6e 50 72 65 66 69 78 3b 0a 20  erm - nPrefix;. 
1d0c0 20 20 20 6e 53 70 61 63 65 20 20 3d 20 73 71 6c     nSpace  = sql
1d0d0 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65  ite3Fts3VarintLe
1d0e0 6e 28 6e 50 72 65 66 69 78 29 3b 0a 20 20 20 20  n(nPrefix);.    
1d0f0 6e 53 70 61 63 65 20 2b 3d 20 73 71 6c 69 74 65  nSpace += sqlite
1d100 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e  3Fts3VarintLen(n
1d110 53 75 66 66 69 78 29 20 2b 20 6e 53 75 66 66 69  Suffix) + nSuffi
1d120 78 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 6f 64  x;..    if( pNod
1d130 65 2d 3e 6b 65 79 2e 6e 3d 3d 30 20 7c 7c 20 28  e->key.n==0 || (
1d140 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 20 2b  pNode->block.n +
1d150 20 6e 53 70 61 63 65 29 3c 3d 70 2d 3e 6e 4e 6f   nSpace)<=p->nNo
1d160 64 65 53 69 7a 65 20 29 7b 20 0a 20 20 20 20 20  deSize ){ .     
1d170 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65   /* If the curre
1d180 6e 74 20 6e 6f 64 65 20 6f 66 20 6c 61 79 65 72  nt node of layer
1d190 20 69 4c 61 79 65 72 20 63 6f 6e 74 61 69 6e 73   iLayer contains
1d1a0 20 7a 65 72 6f 20 6b 65 79 73 2c 20 6f 72 20 69   zero keys, or i
1d1b0 66 20 61 64 64 69 6e 67 0a 20 20 20 20 20 20 2a  f adding.      *
1d1c0 2a 20 74 68 65 20 6b 65 79 20 74 6f 20 69 74 20  * the key to it 
1d1d0 77 69 6c 6c 20 6e 6f 74 20 63 61 75 73 65 20 69  will not cause i
1d1e0 74 20 74 6f 20 67 72 6f 77 20 74 6f 20 6c 61 72  t to grow to lar
1d1f0 67 65 72 20 74 68 61 6e 20 6e 4e 6f 64 65 53 69  ger than nNodeSi
1d200 7a 65 20 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  ze .      ** byt
1d210 65 73 20 69 6e 20 73 69 7a 65 2c 20 77 72 69 74  es in size, writ
1d220 65 20 74 68 65 20 6b 65 79 20 68 65 72 65 2e 20  e the key here. 
1d230 20 2a 2f 0a 0a 20 20 20 20 20 20 42 6c 6f 62 20   */..      Blob 
1d240 2a 70 42 6c 6b 20 3d 20 26 70 4e 6f 64 65 2d 3e  *pBlk = &pNode->
1d250 62 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 69 66 28  block;.      if(
1d260 20 70 42 6c 6b 2d 3e 6e 3d 3d 30 20 29 7b 0a 20   pBlk->n==0 ){. 
1d270 20 20 20 20 20 20 20 62 6c 6f 62 47 72 6f 77 42         blobGrowB
1d280 75 66 66 65 72 28 70 42 6c 6b 2c 20 70 2d 3e 6e  uffer(pBlk, p->n
1d290 4e 6f 64 65 53 69 7a 65 2c 20 26 72 63 29 3b 0a  NodeSize, &rc);.
1d2a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1d2b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d2c0 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e 61 5b 30         pBlk->a[0
1d2d0 5d 20 3d 20 28 63 68 61 72 29 69 4c 61 79 65 72  ] = (char)iLayer
1d2e0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c 6b  ;.          pBlk
1d2f0 2d 3e 6e 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ->n = 1 + sqlite
1d300 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26  3Fts3PutVarint(&
1d310 70 42 6c 6b 2d 3e 61 5b 31 5d 2c 20 69 50 74 72  pBlk->a[1], iPtr
1d320 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1d330 20 20 20 7d 0a 20 20 20 20 20 20 62 6c 6f 62 47     }.      blobG
1d340 72 6f 77 42 75 66 66 65 72 28 70 42 6c 6b 2c 20  rowBuffer(pBlk, 
1d350 70 42 6c 6b 2d 3e 6e 20 2b 20 6e 53 70 61 63 65  pBlk->n + nSpace
1d360 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 62 6c  , &rc);.      bl
1d370 6f 62 47 72 6f 77 42 75 66 66 65 72 28 26 70 4e  obGrowBuffer(&pN
1d380 6f 64 65 2d 3e 6b 65 79 2c 20 6e 54 65 72 6d 2c  ode->key, nTerm,
1d390 20 26 72 63 29 3b 0a 0a 20 20 20 20 20 20 69 66   &rc);..      if
1d3a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d3b0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1d3c0 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 20 29 7b 0a 20  Node->key.n ){. 
1d3d0 20 20 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e 6e           pBlk->n
1d3e0 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50   += sqlite3Fts3P
1d3f0 75 74 56 61 72 69 6e 74 28 26 70 42 6c 6b 2d 3e  utVarint(&pBlk->
1d400 61 5b 70 42 6c 6b 2d 3e 6e 5d 2c 20 6e 50 72 65  a[pBlk->n], nPre
1d410 66 69 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  fix);.        }.
1d420 20 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e 6e 20          pBlk->n 
1d430 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75  += sqlite3Fts3Pu
1d440 74 56 61 72 69 6e 74 28 26 70 42 6c 6b 2d 3e 61  tVarint(&pBlk->a
1d450 5b 70 42 6c 6b 2d 3e 6e 5d 2c 20 6e 53 75 66 66  [pBlk->n], nSuff
1d460 69 78 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ix);.        mem
1d470 63 70 79 28 26 70 42 6c 6b 2d 3e 61 5b 70 42 6c  cpy(&pBlk->a[pBl
1d480 6b 2d 3e 6e 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50  k->n], &zTerm[nP
1d490 72 65 66 69 78 5d 2c 20 6e 53 75 66 66 69 78 29  refix], nSuffix)
1d4a0 3b 0a 20 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e  ;.        pBlk->
1d4b0 6e 20 2b 3d 20 6e 53 75 66 66 69 78 3b 0a 0a 20  n += nSuffix;.. 
1d4c0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e         memcpy(pN
1d4d0 6f 64 65 2d 3e 6b 65 79 2e 61 2c 20 7a 54 65 72  ode->key.a, zTer
1d4e0 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20  m, nTerm);.     
1d4f0 20 20 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 20     pNode->key.n 
1d500 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = nTerm;.      }
1d510 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d520 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    /* Otherwise, 
1d530 66 6c 75 73 68 20 74 68 65 20 74 68 65 20 63 75  flush the the cu
1d540 72 72 65 6e 74 20 6e 6f 64 65 20 6f 66 20 6c 61  rrent node of la
1d550 79 65 72 20 69 4c 61 79 65 72 20 74 6f 20 64 69  yer iLayer to di
1d560 73 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  sk..      ** The
1d570 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  n allocate a new
1d580 2c 20 65 6d 70 74 79 20 73 69 62 6c 69 6e 67 20  , empty sibling 
1d590 6e 6f 64 65 2e 20 54 68 65 20 6b 65 79 20 77 69  node. The key wi
1d5a0 6c 6c 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20  ll be written.  
1d5b0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
1d5c0 70 61 72 65 6e 74 20 6f 66 20 74 68 69 73 20 6e  parent of this n
1d5d0 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ode. */.      rc
1d5e0 20 3d 20 66 74 73 33 57 72 69 74 65 53 65 67 6d   = fts3WriteSegm
1d5f0 65 6e 74 28 70 2c 20 70 4e 6f 64 65 2d 3e 69 42  ent(p, pNode->iB
1d600 6c 6f 63 6b 2c 20 70 4e 6f 64 65 2d 3e 62 6c 6f  lock, pNode->blo
1d610 63 6b 2e 61 2c 20 70 4e 6f 64 65 2d 3e 62 6c 6f  ck.a, pNode->blo
1d620 63 6b 2e 6e 29 3b 0a 0a 20 20 20 20 20 20 61 73  ck.n);..      as
1d630 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 62 6c 6f  sert( pNode->blo
1d640 63 6b 2e 6e 41 6c 6c 6f 63 3e 3d 70 2d 3e 6e 4e  ck.nAlloc>=p->nN
1d650 6f 64 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  odeSize );.     
1d660 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 5b   pNode->block.a[
1d670 30 5d 20 3d 20 28 63 68 61 72 29 69 4c 61 79 65  0] = (char)iLaye
1d680 72 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e  r;.      pNode->
1d690 62 6c 6f 63 6b 2e 6e 20 3d 20 31 20 2b 20 73 71  block.n = 1 + sq
1d6a0 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69  lite3Fts3PutVari
1d6b0 6e 74 28 26 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b  nt(&pNode->block
1d6c0 2e 61 5b 31 5d 2c 20 69 50 74 72 2b 31 29 3b 0a  .a[1], iPtr+1);.
1d6d0 0a 20 20 20 20 20 20 69 4e 65 78 74 50 74 72 20  .      iNextPtr 
1d6e0 3d 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b 3b  = pNode->iBlock;
1d6f0 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 69 42  .      pNode->iB
1d700 6c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 4e  lock++;.      pN
1d710 6f 64 65 2d 3e 6b 65 79 2e 6e 20 3d 20 30 3b 0a  ode->key.n = 0;.
1d720 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
1d730 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1d740 69 4e 65 78 74 50 74 72 3d 3d 30 20 29 20 72 65  iNextPtr==0 ) re
1d750 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 50 74  turn rc;.    iPt
1d760 72 20 3d 20 69 4e 65 78 74 50 74 72 3b 0a 20 20  r = iNextPtr;.  
1d770 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 30 20 29  }..  assert( 0 )
1d780 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1d790 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
1d7a0 74 65 72 6d 20 61 6e 64 20 28 6f 70 74 69 6f 6e  term and (option
1d7b0 61 6c 6c 79 29 20 64 6f 63 6c 69 73 74 20 74 6f  ally) doclist to
1d7c0 20 74 68 65 20 46 54 53 20 73 65 67 6d 65 6e 74   the FTS segment
1d7d0 20 6e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 0a   node currently.
1d7e0 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 62 6c 6f  ** stored in blo
1d7f0 62 20 2a 70 4e 6f 64 65 2e 20 54 68 65 20 6e 6f  b *pNode. The no
1d800 64 65 20 6e 65 65 64 20 6e 6f 74 20 63 6f 6e 74  de need not cont
1d810 61 69 6e 20 61 6e 79 20 74 65 72 6d 73 2c 20 62  ain any terms, b
1d820 75 74 20 74 68 65 0a 2a 2a 20 68 65 61 64 65 72  ut the.** header
1d830 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e   must be written
1d840 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e   before this fun
1d850 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
1d860 0a 2a 2a 0a 2a 2a 20 41 20 6e 6f 64 65 20 68 65  .**.** A node he
1d870 61 64 65 72 20 69 73 20 61 20 73 69 6e 67 6c 65  ader is a single
1d880 20 30 78 30 30 20 62 79 74 65 20 66 6f 72 20 61   0x00 byte for a
1d890 20 6c 65 61 66 20 6e 6f 64 65 2c 20 6f 72 20 61   leaf node, or a
1d8a0 20 68 65 69 67 68 74 20 76 61 72 69 6e 74 0a 2a   height varint.*
1d8b0 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68  * followed by th
1d8c0 65 20 6c 65 66 74 2d 68 61 6e 64 2d 63 68 69 6c  e left-hand-chil
1d8d0 64 20 76 61 72 69 6e 74 20 66 6f 72 20 61 6e 20  d varint for an 
1d8e0 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 0a 2a  internal node..*
1d8f0 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 74 6f  *.** The term to
1d900 20 62 65 20 61 70 70 65 6e 64 65 64 20 69 73 20   be appended is 
1d910 70 61 73 73 65 64 20 76 69 61 20 61 72 67 75 6d  passed via argum
1d920 65 6e 74 73 20 7a 54 65 72 6d 2f 6e 54 65 72 6d  ents zTerm/nTerm
1d930 2e 20 46 6f 72 20 61 20 0a 2a 2a 20 6c 65 61 66  . For a .** leaf
1d940 20 6e 6f 64 65 2c 20 74 68 65 20 64 6f 63 6c 69   node, the docli
1d950 73 74 20 69 73 20 70 61 73 73 65 64 20 61 73 20  st is passed as 
1d960 61 44 6f 63 6c 69 73 74 2f 6e 44 6f 63 6c 69 73  aDoclist/nDoclis
1d970 74 2e 20 46 6f 72 20 61 6e 20 69 6e 74 65 72 6e  t. For an intern
1d980 61 6c 0a 2a 2a 20 6e 6f 64 65 2c 20 62 6f 74 68  al.** node, both
1d990 20 61 44 6f 63 6c 69 73 74 20 61 6e 64 20 6e 44   aDoclist and nD
1d9a0 6f 63 6c 69 73 74 20 6d 75 73 74 20 62 65 20 70  oclist must be p
1d9b0 61 73 73 65 64 20 30 2e 0a 2a 2a 0a 2a 2a 20 49  assed 0..**.** I
1d9c0 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
1d9d0 65 20 76 61 6c 75 65 20 69 6e 20 62 6c 6f 62 20  e value in blob 
1d9e0 70 50 72 65 76 20 69 73 20 7a 65 72 6f 2c 20 74  pPrev is zero, t
1d9f0 68 65 6e 20 74 68 69 73 20 69 73 20 74 68 65 20  hen this is the 
1da00 66 69 72 73 74 0a 2a 2a 20 74 65 72 6d 20 77 72  first.** term wr
1da10 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6e 6f 64  itten to the nod
1da20 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70 50  e. Otherwise, pP
1da30 72 65 76 20 63 6f 6e 74 61 69 6e 73 20 61 20 63  rev contains a c
1da40 6f 70 79 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  opy of the .** p
1da50 72 65 76 69 6f 75 73 20 74 65 72 6d 2e 20 42 65  revious term. Be
1da60 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
1da70 6f 6e 20 72 65 74 75 72 6e 73 2c 20 69 74 20 69  on returns, it i
1da80 73 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e  s updated to con
1da90 74 61 69 6e 20 61 0a 2a 2a 20 63 6f 70 79 20 6f  tain a.** copy o
1daa0 66 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 0a 2a  f zTerm/nTerm..*
1dab0 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d  *.** It is assum
1dac0 65 64 20 74 68 61 74 20 74 68 65 20 62 75 66 66  ed that the buff
1dad0 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  er associated wi
1dae0 74 68 20 70 4e 6f 64 65 20 69 73 20 61 6c 72 65  th pNode is alre
1daf0 61 64 79 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f  ady large.** eno
1db00 75 67 68 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61  ugh to accommoda
1db10 74 65 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  te the new entry
1db20 2e 20 54 68 65 20 62 75 66 66 65 72 20 61 73 73  . The buffer ass
1db30 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50 72  ociated with pPr
1db40 65 76 0a 2a 2a 20 69 73 20 65 78 74 65 6e 64 65  ev.** is extende
1db50 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
1db60 6f 6e 20 69 66 20 72 65 71 75 72 69 72 65 64 2e  on if requrired.
1db70 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
1db80 6f 72 20 28 69 2e 65 2e 20 4f 4f 4d 20 63 6f 6e  or (i.e. OOM con
1db90 64 69 74 69 6f 6e 29 20 6f 63 63 75 72 73 2c 20  dition) occurs, 
1dba0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1dbb0 63 6f 64 65 20 69 73 0a 2a 2a 20 72 65 74 75 72  code is.** retur
1dbc0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
1dbd0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
1dbe0 61 74 69 63 20 69 6e 74 20 66 74 73 33 41 70 70  atic int fts3App
1dbf0 65 6e 64 54 6f 4e 6f 64 65 28 0a 20 20 42 6c 6f  endToNode(.  Blo
1dc00 62 20 2a 70 4e 6f 64 65 2c 20 20 20 20 20 20 20  b *pNode,       
1dc10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dc20 43 75 72 72 65 6e 74 20 6e 6f 64 65 20 69 6d 61  Current node ima
1dc30 67 65 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  ge to append to 
1dc40 2a 2f 0a 20 20 42 6c 6f 62 20 2a 70 50 72 65 76  */.  Blob *pPrev
1dc50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1dc60 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
1dc70 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f  ontaining previo
1dc80 75 73 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20  us term written 
1dc90 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1dca0 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  *zTerm,         
1dcb0 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 65 72 6d       /* New term
1dcc0 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69   to write */.  i
1dcd0 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 20 20  nt nTerm,       
1dce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dcf0 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20  * Size of zTerm 
1dd00 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 6f  in bytes */.  co
1dd10 6e 73 74 20 63 68 61 72 20 2a 61 44 6f 63 6c 69  nst char *aDocli
1dd20 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st,           /*
1dd30 20 44 6f 63 6c 69 73 74 20 28 6f 72 20 4e 55 4c   Doclist (or NUL
1dd40 4c 29 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  L) to write */. 
1dd50 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 20 20 20   int nDoclist   
1dd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd70 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 44 6f 63   /* Size of aDoc
1dd80 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  list in bytes */
1dd90 20 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20   .){.  int rc = 
1dda0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
1ddb0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1ddc0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 62   code */.  int b
1ddd0 46 69 72 73 74 20 3d 20 28 70 50 72 65 76 2d 3e  First = (pPrev->
1dde0 6e 3d 3d 30 29 3b 20 20 20 20 20 2f 2a 20 54 72  n==0);     /* Tr
1ddf0 75 65 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ue if this is th
1de00 65 20 66 69 72 73 74 20 74 65 72 6d 20 77 72 69  e first term wri
1de10 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  tten */.  int nP
1de20 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20  refix;          
1de30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1de40 65 20 6f 66 20 74 65 72 6d 20 70 72 65 66 69 78  e of term prefix
1de50 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
1de60 6e 74 20 6e 53 75 66 66 69 78 3b 20 20 20 20 20  nt nSuffix;     
1de70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1de80 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 73  * Size of term s
1de90 75 66 66 69 78 20 69 6e 20 62 79 74 65 73 20 2a  uffix in bytes *
1dea0 2f 0a 0a 20 20 2f 2a 20 4e 6f 64 65 20 6d 75 73  /..  /* Node mus
1deb0 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
1dec0 65 65 6e 20 73 74 61 72 74 65 64 2e 20 54 68 65  een started. The
1ded0 72 65 20 6d 75 73 74 20 62 65 20 61 20 64 6f 63  re must be a doc
1dee0 6c 69 73 74 20 66 6f 72 20 61 0a 20 20 2a 2a 20  list for a.  ** 
1def0 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 74  leaf node, and t
1df00 68 65 72 65 20 6d 75 73 74 20 6e 6f 74 20 62 65  here must not be
1df10 20 61 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 61   a doclist for a
1df20 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e  n internal node.
1df30 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
1df40 4e 6f 64 65 2d 3e 6e 3e 30 20 29 3b 0a 20 20 61  Node->n>0 );.  a
1df50 73 73 65 72 74 28 20 28 70 4e 6f 64 65 2d 3e 61  ssert( (pNode->a
1df60 5b 30 5d 3d 3d 27 5c 30 27 29 3d 3d 28 61 44 6f  [0]=='\0')==(aDo
1df70 63 6c 69 73 74 21 3d 30 29 20 29 3b 0a 0a 20 20  clist!=0) );..  
1df80 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28 70  blobGrowBuffer(p
1df90 50 72 65 76 2c 20 6e 54 65 72 6d 2c 20 26 72 63  Prev, nTerm, &rc
1dfa0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1dfb0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1dfc0 72 63 3b 0a 0a 20 20 6e 50 72 65 66 69 78 20 3d  rc;..  nPrefix =
1dfd0 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72   fts3PrefixCompr
1dfe0 65 73 73 28 70 50 72 65 76 2d 3e 61 2c 20 70 50  ess(pPrev->a, pP
1dff0 72 65 76 2d 3e 6e 2c 20 7a 54 65 72 6d 2c 20 6e  rev->n, zTerm, n
1e000 54 65 72 6d 29 3b 0a 20 20 6e 53 75 66 66 69 78  Term);.  nSuffix
1e010 20 3d 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66   = nTerm - nPref
1e020 69 78 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50 72  ix;.  memcpy(pPr
1e030 65 76 2d 3e 61 2c 20 7a 54 65 72 6d 2c 20 6e 54  ev->a, zTerm, nT
1e040 65 72 6d 29 3b 0a 20 20 70 50 72 65 76 2d 3e 6e  erm);.  pPrev->n
1e050 20 3d 20 6e 54 65 72 6d 3b 0a 0a 20 20 69 66 28   = nTerm;..  if(
1e060 20 62 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20   bFirst==0 ){.  
1e070 20 20 70 4e 6f 64 65 2d 3e 6e 20 2b 3d 20 73 71    pNode->n += sq
1e080 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69  lite3Fts3PutVari
1e090 6e 74 28 26 70 4e 6f 64 65 2d 3e 61 5b 70 4e 6f  nt(&pNode->a[pNo
1e0a0 64 65 2d 3e 6e 5d 2c 20 6e 50 72 65 66 69 78 29  de->n], nPrefix)
1e0b0 3b 0a 20 20 7d 0a 20 20 70 4e 6f 64 65 2d 3e 6e  ;.  }.  pNode->n
1e0c0 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50   += sqlite3Fts3P
1e0d0 75 74 56 61 72 69 6e 74 28 26 70 4e 6f 64 65 2d  utVarint(&pNode-
1e0e0 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d 2c 20 6e 53  >a[pNode->n], nS
1e0f0 75 66 66 69 78 29 3b 0a 20 20 6d 65 6d 63 70 79  uffix);.  memcpy
1e100 28 26 70 4e 6f 64 65 2d 3e 61 5b 70 4e 6f 64 65  (&pNode->a[pNode
1e110 2d 3e 6e 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50 72  ->n], &zTerm[nPr
1e120 65 66 69 78 5d 2c 20 6e 53 75 66 66 69 78 29 3b  efix], nSuffix);
1e130 0a 20 20 70 4e 6f 64 65 2d 3e 6e 20 2b 3d 20 6e  .  pNode->n += n
1e140 53 75 66 66 69 78 3b 0a 0a 20 20 69 66 28 20 61  Suffix;..  if( a
1e150 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 70  Doclist ){.    p
1e160 4e 6f 64 65 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  Node->n += sqlit
1e170 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28  e3Fts3PutVarint(
1e180 26 70 4e 6f 64 65 2d 3e 61 5b 70 4e 6f 64 65 2d  &pNode->a[pNode-
1e190 3e 6e 5d 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a  >n], nDoclist);.
1e1a0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 6f 64      memcpy(&pNod
1e1b0 65 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d 2c 20  e->a[pNode->n], 
1e1c0 61 44 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c 69  aDoclist, nDocli
1e1d0 73 74 29 3b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e  st);.    pNode->
1e1e0 6e 20 2b 3d 20 6e 44 6f 63 6c 69 73 74 3b 0a 20  n += nDoclist;. 
1e1f0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e   }..  assert( pN
1e200 6f 64 65 2d 3e 6e 3c 3d 70 4e 6f 64 65 2d 3e 6e  ode->n<=pNode->n
1e210 41 6c 6c 6f 63 20 29 3b 0a 0a 20 20 72 65 74 75  Alloc );..  retu
1e220 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1e230 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 68  ./*.** Append th
1e240 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 61  e current term a
1e250 6e 64 20 64 6f 63 6c 69 73 74 20 70 6f 69 6e 74  nd doclist point
1e260 65 64 20 74 6f 20 62 79 20 63 75 72 73 6f 72 20  ed to by cursor 
1e270 70 43 73 72 20 74 6f 20 74 68 65 0a 2a 2a 20 61  pCsr to the.** a
1e280 70 70 65 6e 64 61 62 6c 65 20 62 2d 74 72 65 65  ppendable b-tree
1e290 20 73 65 67 6d 65 6e 74 20 6f 70 65 6e 65 64 20   segment opened 
1e2a0 66 6f 72 20 77 72 69 74 69 6e 67 20 62 79 20 70  for writing by p
1e2b0 57 72 69 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65  Writer..**.** Re
1e2c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
1e2d0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
1e2e0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1e2f0 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
1e300 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1e310 74 73 33 49 6e 63 72 6d 65 72 67 65 41 70 70 65  ts3IncrmergeAppe
1e320 6e 64 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  nd(.  Fts3Table 
1e330 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1e340 20 20 20 20 20 20 2f 2a 20 46 74 73 33 20 74 61        /* Fts3 ta
1e350 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
1e360 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72 20  IncrmergeWriter 
1e370 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20  *pWriter,       
1e380 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74  /* Writer object
1e390 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53   */.  Fts3MultiS
1e3a0 65 67 52 65 61 64 65 72 20 2a 70 43 73 72 20 20  egReader *pCsr  
1e3b0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
1e3c0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d 20  containing term 
1e3d0 61 6e 64 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 29  and doclist */.)
1e3e0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1e3f0 7a 54 65 72 6d 20 3d 20 70 43 73 72 2d 3e 7a 54  zTerm = pCsr->zT
1e400 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d  erm;.  int nTerm
1e410 20 3d 20 70 43 73 72 2d 3e 6e 54 65 72 6d 3b 0a   = pCsr->nTerm;.
1e420 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44    const char *aD
1e430 6f 63 6c 69 73 74 20 3d 20 70 43 73 72 2d 3e 61  oclist = pCsr->a
1e440 44 6f 63 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e  Doclist;.  int n
1e450 44 6f 63 6c 69 73 74 20 3d 20 70 43 73 72 2d 3e  Doclist = pCsr->
1e460 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 69 6e 74 20  nDoclist;.  int 
1e470 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1e480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1e490 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1e4a0 74 20 6e 53 70 61 63 65 3b 20 20 20 20 20 20 20  t nSpace;       
1e4b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e4c0 6f 74 61 6c 20 73 70 61 63 65 20 69 6e 20 62 79  otal space in by
1e4d0 74 65 73 20 72 65 71 75 69 72 65 64 20 6f 6e 20  tes required on 
1e4e0 6c 65 61 66 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  leaf */.  int nP
1e4f0 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20  refix;          
1e500 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1e510 6f 66 20 70 72 65 66 69 78 20 73 68 61 72 65 64  of prefix shared
1e520 20 77 69 74 68 20 70 72 65 76 69 6f 75 73 20 74   with previous t
1e530 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  erm */.  int nSu
1e540 66 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20  ffix;           
1e550 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1e560 66 20 73 75 66 66 69 78 20 28 6e 54 65 72 6d 20  f suffix (nTerm 
1e570 2d 20 6e 50 72 65 66 69 78 29 20 2a 2f 0a 20 20  - nPrefix) */.  
1e580 4e 6f 64 65 57 72 69 74 65 72 20 2a 70 4c 65 61  NodeWriter *pLea
1e590 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  f;            /*
1e5a0 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20   Object used to 
1e5b0 77 72 69 74 65 20 6c 65 61 66 20 6e 6f 64 65 73  write leaf nodes
1e5c0 20 2a 2f 0a 0a 20 20 70 4c 65 61 66 20 3d 20 26   */..  pLeaf = &
1e5d0 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72  pWriter->aNodeWr
1e5e0 69 74 65 72 5b 30 5d 3b 0a 20 20 6e 50 72 65 66  iter[0];.  nPref
1e5f0 69 78 20 3d 20 66 74 73 33 50 72 65 66 69 78 43  ix = fts3PrefixC
1e600 6f 6d 70 72 65 73 73 28 70 4c 65 61 66 2d 3e 6b  ompress(pLeaf->k
1e610 65 79 2e 61 2c 20 70 4c 65 61 66 2d 3e 6b 65 79  ey.a, pLeaf->key
1e620 2e 6e 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  .n, zTerm, nTerm
1e630 29 3b 0a 20 20 6e 53 75 66 66 69 78 20 3d 20 6e  );.  nSuffix = n
1e640 54 65 72 6d 20 2d 20 6e 50 72 65 66 69 78 3b 0a  Term - nPrefix;.
1e650 0a 20 20 6e 53 70 61 63 65 20 20 3d 20 73 71 6c  .  nSpace  = sql
1e660 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65  ite3Fts3VarintLe
1e670 6e 28 6e 50 72 65 66 69 78 29 3b 0a 20 20 6e 53  n(nPrefix);.  nS
1e680 70 61 63 65 20 2b 3d 20 73 71 6c 69 74 65 33 46  pace += sqlite3F
1e690 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 53 75  ts3VarintLen(nSu
1e6a0 66 66 69 78 29 20 2b 20 6e 53 75 66 66 69 78 3b  ffix) + nSuffix;
1e6b0 0a 20 20 6e 53 70 61 63 65 20 2b 3d 20 73 71 6c  .  nSpace += sql
1e6c0 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65  ite3Fts3VarintLe
1e6d0 6e 28 6e 44 6f 63 6c 69 73 74 29 20 2b 20 6e 44  n(nDoclist) + nD
1e6e0 6f 63 6c 69 73 74 3b 0a 0a 20 20 2f 2a 20 49 66  oclist;..  /* If
1e6f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 6c 6f   the current blo
1e700 63 6b 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c  ck is not empty,
1e710 20 61 6e 64 20 69 66 20 61 64 64 69 6e 67 20 74   and if adding t
1e720 68 69 73 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74  his term/doclist
1e730 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 75 72  .  ** to the cur
1e740 72 65 6e 74 20 62 6c 6f 63 6b 20 77 6f 75 6c 64  rent block would
1e750 20 6d 61 6b 65 20 69 74 20 6c 61 72 67 65 72 20   make it larger 
1e760 74 68 61 6e 20 46 74 73 33 54 61 62 6c 65 2e 6e  than Fts3Table.n
1e770 4e 6f 64 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79  NodeSize.  ** by
1e780 74 65 73 2c 20 77 72 69 74 65 20 74 68 69 73 20  tes, write this 
1e790 62 6c 6f 63 6b 20 6f 75 74 20 74 6f 20 74 68 65  block out to the
1e7a0 20 64 61 74 61 62 61 73 65 2e 20 2a 2f 0a 20 20   database. */.  
1e7b0 69 66 28 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b  if( pLeaf->block
1e7c0 2e 6e 3e 30 20 26 26 20 28 70 4c 65 61 66 2d 3e  .n>0 && (pLeaf->
1e7d0 62 6c 6f 63 6b 2e 6e 20 2b 20 6e 53 70 61 63 65  block.n + nSpace
1e7e0 29 3e 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 29  )>p->nNodeSize )
1e7f0 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 57  {.    rc = fts3W
1e800 72 69 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 70  riteSegment(p, p
1e810 4c 65 61 66 2d 3e 69 42 6c 6f 63 6b 2c 20 70 4c  Leaf->iBlock, pL
1e820 65 61 66 2d 3e 62 6c 6f 63 6b 2e 61 2c 20 70 4c  eaf->block.a, pL
1e830 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 29 3b 0a 20  eaf->block.n);. 
1e840 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 57 6f 72     pWriter->nWor
1e850 6b 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64  k++;..    /* Add
1e860 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   the current ter
1e870 6d 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  m to the parent 
1e880 6e 6f 64 65 2e 20 54 68 65 20 74 65 72 6d 20 61  node. The term a
1e890 64 64 65 64 20 74 6f 20 74 68 65 20 0a 20 20 20  dded to the .   
1e8a0 20 2a 2a 20 70 61 72 65 6e 74 20 6d 75 73 74 3a   ** parent must:
1e8b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1e8c0 20 61 29 20 62 65 20 67 72 65 61 74 65 72 20 74   a) be greater t
1e8d0 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  han the largest 
1e8e0 74 65 72 6d 20 6f 6e 20 74 68 65 20 6c 65 61 66  term on the leaf
1e8f0 20 6e 6f 64 65 20 6a 75 73 74 20 77 72 69 74 74   node just writt
1e900 65 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 74  en.    **      t
1e910 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  o the database (
1e920 73 74 69 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20  still available 
1e930 69 6e 20 70 4c 65 61 66 2d 3e 6b 65 79 29 2c 20  in pLeaf->key), 
1e940 61 6e 64 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  and.    **.    *
1e950 2a 20 20 20 62 29 20 62 65 20 6c 65 73 73 20 74  *   b) be less t
1e960 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
1e970 74 68 65 20 74 65 72 6d 20 61 62 6f 75 74 20 74  the term about t
1e980 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  o be added to th
1e990 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 20 20 20  e new.    **    
1e9a0 20 20 6c 65 61 66 20 6e 6f 64 65 20 28 7a 54 65    leaf node (zTe
1e9b0 72 6d 2f 6e 54 65 72 6d 29 2e 0a 20 20 20 20 2a  rm/nTerm)..    *
1e9c0 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65  *.    ** In othe
1e9d0 72 20 77 6f 72 64 73 2c 20 69 74 20 6d 75 73 74  r words, it must
1e9e0 20 62 65 20 74 68 65 20 70 72 65 66 69 78 20 6f   be the prefix o
1e9f0 66 20 7a 54 65 72 6d 20 31 20 62 79 74 65 20 6c  f zTerm 1 byte l
1ea00 6f 6e 67 65 72 20 74 68 61 6e 0a 20 20 20 20 2a  onger than.    *
1ea10 2a 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65  * the common pre
1ea20 66 69 78 20 28 69 66 20 61 6e 79 29 20 6f 66 20  fix (if any) of 
1ea30 7a 54 65 72 6d 20 61 6e 64 20 70 57 72 69 74 65  zTerm and pWrite
1ea40 72 2d 3e 7a 54 65 72 6d 2e 0a 20 20 20 20 2a 2f  r->zTerm..    */
1ea50 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1ea60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ea70 72 63 20 3d 20 66 74 73 33 49 6e 63 72 6d 65 72  rc = fts3Incrmer
1ea80 67 65 50 75 73 68 28 70 2c 20 70 57 72 69 74 65  gePush(p, pWrite
1ea90 72 2c 20 7a 54 65 72 6d 2c 20 6e 50 72 65 66 69  r, zTerm, nPrefi
1eaa0 78 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  x+1);.    }..   
1eab0 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74   /* Advance to t
1eac0 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 62  he next output b
1ead0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 70 4c 65 61  lock */.    pLea
1eae0 66 2d 3e 69 42 6c 6f 63 6b 2b 2b 3b 0a 20 20 20  f->iBlock++;.   
1eaf0 20 70 4c 65 61 66 2d 3e 6b 65 79 2e 6e 20 3d 20   pLeaf->key.n = 
1eb00 30 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e 62 6c  0;.    pLeaf->bl
1eb10 6f 63 6b 2e 6e 20 3d 20 30 3b 0a 0a 20 20 20 20  ock.n = 0;..    
1eb20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d 3b  nSuffix = nTerm;
1eb30 0a 20 20 20 20 6e 53 70 61 63 65 20 20 3d 20 31  .    nSpace  = 1
1eb40 3b 0a 20 20 20 20 6e 53 70 61 63 65 20 2b 3d 20  ;.    nSpace += 
1eb50 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e  sqlite3Fts3Varin
1eb60 74 4c 65 6e 28 6e 53 75 66 66 69 78 29 20 2b 20  tLen(nSuffix) + 
1eb70 6e 53 75 66 66 69 78 3b 0a 20 20 20 20 6e 53 70  nSuffix;.    nSp
1eb80 61 63 65 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ace += sqlite3Ft
1eb90 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 44 6f 63  s3VarintLen(nDoc
1eba0 6c 69 73 74 29 20 2b 20 6e 44 6f 63 6c 69 73 74  list) + nDoclist
1ebb0 3b 0a 20 20 7d 0a 0a 20 20 62 6c 6f 62 47 72 6f  ;.  }..  blobGro
1ebc0 77 42 75 66 66 65 72 28 26 70 4c 65 61 66 2d 3e  wBuffer(&pLeaf->
1ebd0 62 6c 6f 63 6b 2c 20 70 4c 65 61 66 2d 3e 62 6c  block, pLeaf->bl
1ebe0 6f 63 6b 2e 6e 20 2b 20 6e 53 70 61 63 65 2c 20  ock.n + nSpace, 
1ebf0 26 72 63 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  &rc);..  if( rc=
1ec00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ec10 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 62 6c 6f    if( pLeaf->blo
1ec20 63 6b 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ck.n==0 ){.     
1ec30 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 20   pLeaf->block.n 
1ec40 3d 20 31 3b 0a 20 20 20 20 20 20 70 4c 65 61 66  = 1;.      pLeaf
1ec50 2d 3e 62 6c 6f 63 6b 2e 61 5b 30 5d 20 3d 20 27  ->block.a[0] = '
1ec60 5c 30 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  \0';.    }.    r
1ec70 63 20 3d 20 66 74 73 33 41 70 70 65 6e 64 54 6f  c = fts3AppendTo
1ec80 4e 6f 64 65 28 0a 20 20 20 20 20 20 20 20 26 70  Node(.        &p
1ec90 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2c 20 26 70 4c  Leaf->block, &pL
1eca0 65 61 66 2d 3e 6b 65 79 2c 20 7a 54 65 72 6d 2c  eaf->key, zTerm,
1ecb0 20 6e 54 65 72 6d 2c 20 61 44 6f 63 6c 69 73 74   nTerm, aDoclist
1ecc0 2c 20 6e 44 6f 63 6c 69 73 74 0a 20 20 20 20 29  , nDoclist.    )
1ecd0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1ece0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1ecf0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1ed00 6c 6c 65 64 20 74 6f 20 72 65 6c 65 61 73 65 20  lled to release 
1ed10 61 6c 6c 20 64 79 6e 61 6d 69 63 20 72 65 73 6f  all dynamic reso
1ed20 75 72 63 65 73 20 68 65 6c 64 20 62 79 20 74 68  urces held by th
1ed30 65 0a 2a 2a 20 6d 65 72 67 65 2d 77 72 69 74 65  e.** merge-write
1ed40 72 20 6f 62 6a 65 63 74 20 70 57 72 69 74 65 72  r object pWriter
1ed50 2c 20 61 6e 64 20 69 66 20 6e 6f 20 65 72 72 6f  , and if no erro
1ed60 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20  r has occurred, 
1ed70 74 6f 20 66 6c 75 73 68 0a 2a 2a 20 61 6c 6c 20  to flush.** all 
1ed80 6f 75 74 73 74 61 6e 64 69 6e 67 20 6e 6f 64 65  outstanding node
1ed90 20 62 75 66 66 65 72 73 20 68 65 6c 64 20 62 79   buffers held by
1eda0 20 70 57 72 69 74 65 72 20 74 6f 20 64 69 73 6b   pWriter to disk
1edb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20  ..**.** If *pRc 
1edc0 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b  is not SQLITE_OK
1edd0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
1ede0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ion is called, t
1edf0 68 65 6e 20 6e 6f 20 61 74 74 65 6d 70 74 0a 2a  hen no attempt.*
1ee00 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 77 72 69  * is made to wri
1ee10 74 65 20 61 6e 79 20 64 61 74 61 20 74 6f 20 64  te any data to d
1ee20 69 73 6b 2e 20 49 6e 73 74 65 61 64 2c 20 74 68  isk. Instead, th
1ee30 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 72 76  is function serv
1ee40 65 73 20 6f 6e 6c 79 0a 2a 2a 20 74 6f 20 72 65  es only.** to re
1ee50 6c 65 61 73 65 20 6f 75 74 73 74 61 6e 64 69 6e  lease outstandin
1ee60 67 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2a 0a  g resources..**.
1ee70 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
1ee80 20 2a 70 52 63 20 69 73 20 69 6e 69 74 69 61 6c   *pRc is initial
1ee90 6c 79 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  ly SQLITE_OK and
1eea0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1eeb0 20 77 68 69 6c 65 0a 2a 2a 20 66 6c 75 73 68 69   while.** flushi
1eec0 6e 67 20 62 75 66 66 65 72 73 20 74 6f 20 64 69  ng buffers to di
1eed0 73 6b 2c 20 2a 70 52 63 20 69 73 20 73 65 74 20  sk, *pRc is set 
1eee0 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  to an SQLite err
1eef0 6f 72 20 63 6f 64 65 20 62 65 66 6f 72 65 0a 2a  or code before.*
1ef00 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  * returning..*/.
1ef10 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
1ef20 49 6e 63 72 6d 65 72 67 65 52 65 6c 65 61 73 65  IncrmergeRelease
1ef30 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
1ef40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ef50 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c      /* FTS3 tabl
1ef60 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 49 6e  e handle */.  In
1ef70 63 72 6d 65 72 67 65 57 72 69 74 65 72 20 2a 70  crmergeWriter *p
1ef80 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 2f 2a  Writer,       /*
1ef90 20 4d 65 72 67 65 2d 77 72 69 74 65 72 20 6f 62   Merge-writer ob
1efa0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ject */.  int *p
1efb0 52 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc              
1efc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
1efd0 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20  OUT: Error code 
1efe0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
1eff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f000 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
1f010 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
1f020 67 68 20 6e 6f 6e 2d 72 6f 6f 74 20 6c 61 79 65  gh non-root laye
1f030 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 6f  rs */.  int iRoo
1f040 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1f050 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1f060 20 6f 66 20 72 6f 6f 74 20 69 6e 20 70 57 72 69   of root in pWri
1f070 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72  ter->aNodeWriter
1f080 20 2a 2f 0a 20 20 4e 6f 64 65 57 72 69 74 65 72   */.  NodeWriter
1f090 20 2a 70 52 6f 6f 74 3b 20 20 20 20 20 20 20 20   *pRoot;        
1f0a0 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65 57 72 69        /* NodeWri
1f0b0 74 65 72 20 66 6f 72 20 72 6f 6f 74 20 6e 6f 64  ter for root nod
1f0c0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
1f0d0 2a 70 52 63 3b 20 20 20 20 20 20 20 20 20 20 20  *pRc;           
1f0e0 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
1f0f0 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 53 65  code */..  /* Se
1f100 74 20 69 52 6f 6f 74 20 74 6f 20 74 68 65 20 69  t iRoot to the i
1f110 6e 64 65 78 20 69 6e 20 70 57 72 69 74 65 72 2d  ndex in pWriter-
1f120 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 5d 20 6f  >aNodeWriter[] o
1f130 66 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67  f the output seg
1f140 6d 65 6e 74 20 0a 20 20 2a 2a 20 72 6f 6f 74 20  ment .  ** root 
1f150 6e 6f 64 65 2e 20 49 66 20 74 68 65 20 73 65 67  node. If the seg
1f160 6d 65 6e 74 20 66 69 74 73 20 65 6e 74 69 72 65  ment fits entire
1f170 6c 79 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 6c  ly on a single l
1f180 65 61 66 20 6e 6f 64 65 2c 20 69 52 6f 6f 74 0a  eaf node, iRoot.
1f190 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 65 74    ** will be set
1f1a0 20 74 6f 20 30 2e 20 49 66 20 74 68 65 20 72 6f   to 0. If the ro
1f1b0 6f 74 20 6e 6f 64 65 20 69 73 20 74 68 65 20 70  ot node is the p
1f1c0 61 72 65 6e 74 20 6f 66 20 74 68 65 20 6c 65 61  arent of the lea
1f1d0 76 65 73 2c 20 69 52 6f 6f 74 0a 20 20 2a 2a 20  ves, iRoot.  ** 
1f1e0 77 69 6c 6c 20 62 65 20 31 2e 20 41 6e 64 20 73  will be 1. And s
1f1f0 6f 20 6f 6e 2e 20 20 2a 2f 0a 20 20 66 6f 72 28  o on.  */.  for(
1f200 69 52 6f 6f 74 3d 46 54 53 5f 4d 41 58 5f 41 50  iRoot=FTS_MAX_AP
1f210 50 45 4e 44 41 42 4c 45 5f 48 45 49 47 48 54 2d  PENDABLE_HEIGHT-
1f220 31 3b 20 69 52 6f 6f 74 3e 3d 30 3b 20 69 52 6f  1; iRoot>=0; iRo
1f230 6f 74 2d 2d 29 7b 0a 20 20 20 20 4e 6f 64 65 57  ot--){.    NodeW
1f240 72 69 74 65 72 20 2a 70 4e 6f 64 65 20 3d 20 26  riter *pNode = &
1f250 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72  pWriter->aNodeWr
1f260 69 74 65 72 5b 69 52 6f 6f 74 5d 3b 0a 20 20 20  iter[iRoot];.   
1f270 20 69 66 28 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63   if( pNode->bloc
1f280 6b 2e 6e 3e 30 20 29 20 62 72 65 61 6b 3b 0a 20  k.n>0 ) break;. 
1f290 20 20 20 61 73 73 65 72 74 28 20 2a 70 52 63 20     assert( *pRc 
1f2a0 7c 7c 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e  || pNode->block.
1f2b0 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 20  nAlloc==0 );.   
1f2c0 20 61 73 73 65 72 74 28 20 2a 70 52 63 20 7c 7c   assert( *pRc ||
1f2d0 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 41 6c 6c   pNode->key.nAll
1f2e0 6f 63 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  oc==0 );.    sql
1f2f0 69 74 65 33 5f 66 72 65 65 28 70 4e 6f 64 65 2d  ite3_free(pNode-
1f300 3e 62 6c 6f 63 6b 2e 61 29 3b 0a 20 20 20 20 73  >block.a);.    s
1f310 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 6f 64  qlite3_free(pNod
1f320 65 2d 3e 6b 65 79 2e 61 29 3b 0a 20 20 7d 0a 0a  e->key.a);.  }..
1f330 20 20 2f 2a 20 45 6d 70 74 79 20 6f 75 74 70 75    /* Empty outpu
1f340 74 20 73 65 67 6d 65 6e 74 2e 20 54 68 69 73 20  t segment. This 
1f350 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20  is a no-op. */. 
1f360 20 69 66 28 20 69 52 6f 6f 74 3c 30 20 29 20 72   if( iRoot<0 ) r
1f370 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65  eturn;..  /* The
1f380 20 65 6e 74 69 72 65 20 6f 75 74 70 75 74 20 73   entire output s
1f390 65 67 6d 65 6e 74 20 66 69 74 73 20 6f 6e 20 61  egment fits on a
1f3a0 20 73 69 6e 67 6c 65 20 6e 6f 64 65 2e 20 4e 6f   single node. No
1f3b0 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 6d 65 61  rmally, this mea
1f3c0 6e 73 0a 20 20 2a 2a 20 74 68 65 20 6e 6f 64 65  ns.  ** the node
1f3d0 20 77 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64   would be stored
1f3e0 20 61 73 20 61 20 62 6c 6f 62 20 69 6e 20 74 68   as a blob in th
1f3f0 65 20 22 72 6f 6f 74 22 20 63 6f 6c 75 6d 6e 20  e "root" column 
1f400 6f 66 20 74 68 65 20 25 5f 73 65 67 64 69 72 0a  of the %_segdir.
1f410 20 20 2a 2a 20 74 61 62 6c 65 2e 20 48 6f 77 65    ** table. Howe
1f420 76 65 72 2c 20 74 68 69 73 20 69 73 20 6e 6f 74  ver, this is not
1f430 20 70 65 72 6d 69 74 74 65 64 20 69 6e 20 74 68   permitted in th
1f440 69 73 20 63 61 73 65 2e 20 54 68 65 20 70 72 6f  is case. The pro
1f450 62 6c 65 6d 20 69 73 20 74 68 61 74 20 0a 20 20  blem is that .  
1f460 2a 2a 20 73 70 61 63 65 20 68 61 73 20 61 6c 72  ** space has alr
1f470 65 61 64 79 20 62 65 65 6e 20 72 65 73 65 72 76  eady been reserv
1f480 65 64 20 69 6e 20 74 68 65 20 25 5f 73 65 67 6d  ed in the %_segm
1f490 65 6e 74 73 20 74 61 62 6c 65 2c 20 61 6e 64 20  ents table, and 
1f4a0 73 6f 20 74 68 65 20 0a 20 20 2a 2a 20 73 74 61  so the .  ** sta
1f4b0 72 74 5f 62 6c 6f 63 6b 20 61 6e 64 20 65 6e 64  rt_block and end
1f4c0 5f 62 6c 6f 63 6b 20 66 69 65 6c 64 73 20 6f 66  _block fields of
1f4d0 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61   the %_segdir ta
1f4e0 62 6c 65 20 6d 75 73 74 20 62 65 20 70 6f 70 75  ble must be popu
1f4f0 6c 61 74 65 64 2e 20 0a 20 20 2a 2a 20 41 6e 64  lated. .  ** And
1f500 2c 20 62 79 20 64 65 73 69 67 6e 20 6f 72 20 62  , by design or b
1f510 79 20 61 63 63 69 64 65 6e 74 2c 20 72 65 6c 65  y accident, rele
1f520 61 73 65 64 20 76 65 72 73 69 6f 6e 73 20 6f 66  ased versions of
1f530 20 46 54 53 20 63 61 6e 6e 6f 74 20 68 61 6e 64   FTS cannot hand
1f540 6c 65 20 0a 20 20 2a 2a 20 73 65 67 6d 65 6e 74  le .  ** segment
1f550 73 20 74 68 61 74 20 66 69 74 20 65 6e 74 69 72  s that fit entir
1f560 65 6c 79 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20  ely on the root 
1f570 6e 6f 64 65 20 77 69 74 68 20 73 74 61 72 74 5f  node with start_
1f580 62 6c 6f 63 6b 21 3d 30 2e 0a 20 20 2a 2a 0a 20  block!=0..  **. 
1f590 20 2a 2a 20 49 6e 73 74 65 61 64 2c 20 63 72 65   ** Instead, cre
1f5a0 61 74 65 20 61 20 73 79 6e 74 68 65 74 69 63 20  ate a synthetic 
1f5b0 72 6f 6f 74 20 6e 6f 64 65 20 74 68 61 74 20 63  root node that c
1f5c0 6f 6e 74 61 69 6e 73 20 6e 6f 74 68 69 6e 67 20  ontains nothing 
1f5d0 62 75 74 20 61 20 0a 20 20 2a 2a 20 70 6f 69 6e  but a .  ** poin
1f5e0 74 65 72 20 74 6f 20 74 68 65 20 73 69 6e 67 6c  ter to the singl
1f5f0 65 20 63 6f 6e 74 65 6e 74 20 6e 6f 64 65 2e 20  e content node. 
1f600 53 6f 20 74 68 61 74 20 74 68 65 20 73 65 67 6d  So that the segm
1f610 65 6e 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ent consists of 
1f620 61 0a 20 20 2a 2a 20 73 69 6e 67 6c 65 20 6c 65  a.  ** single le
1f630 61 66 20 61 6e 64 20 61 20 73 69 6e 67 6c 65 20  af and a single 
1f640 69 6e 74 65 72 69 6f 72 20 28 72 6f 6f 74 29 20  interior (root) 
1f650 6e 6f 64 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  node..  **.  ** 
1f660 54 6f 64 6f 3a 20 42 65 74 74 65 72 20 6d 69 67  Todo: Better mig
1f670 68 74 20 62 65 20 74 6f 20 64 65 66 65 72 20 61  ht be to defer a
1f680 6c 6c 6f 63 61 74 69 6e 67 20 73 70 61 63 65 20  llocating space 
1f690 69 6e 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74  in the %_segment
1f6a0 73 20 0a 20 20 2a 2a 20 74 61 62 6c 65 20 75 6e  s .  ** table un
1f6b0 74 69 6c 20 77 65 20 61 72 65 20 73 75 72 65 20  til we are sure 
1f6c0 69 74 20 69 73 20 6e 65 65 64 65 64 2e 0a 20 20  it is needed..  
1f6d0 2a 2f 0a 20 20 69 66 28 20 69 52 6f 6f 74 3d 3d  */.  if( iRoot==
1f6e0 30 20 29 7b 0a 20 20 20 20 42 6c 6f 62 20 2a 70  0 ){.    Blob *p
1f6f0 42 6c 6f 63 6b 20 3d 20 26 70 57 72 69 74 65 72  Block = &pWriter
1f700 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 31 5d  ->aNodeWriter[1]
1f710 2e 62 6c 6f 63 6b 3b 0a 20 20 20 20 62 6c 6f 62  .block;.    blob
1f720 47 72 6f 77 42 75 66 66 65 72 28 70 42 6c 6f 63  GrowBuffer(pBloc
1f730 6b 2c 20 31 20 2b 20 46 54 53 33 5f 56 41 52 49  k, 1 + FTS3_VARI
1f740 4e 54 5f 4d 41 58 2c 20 26 72 63 29 3b 0a 20 20  NT_MAX, &rc);.  
1f750 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f760 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 42 6c  _OK ){.      pBl
1f770 6f 63 6b 2d 3e 61 5b 30 5d 20 3d 20 30 78 30 31  ock->a[0] = 0x01
1f780 3b 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b 2d 3e  ;.      pBlock->
1f790 6e 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 46  n = 1 + sqlite3F
1f7a0 74 73 33 50 75 74 56 61 72 69 6e 74 28 0a 20 20  ts3PutVarint(.  
1f7b0 20 20 20 20 20 20 20 20 26 70 42 6c 6f 63 6b 2d          &pBlock-
1f7c0 3e 61 5b 31 5d 2c 20 70 57 72 69 74 65 72 2d 3e  >a[1], pWriter->
1f7d0 61 4e 6f 64 65 57 72 69 74 65 72 5b 30 5d 2e 69  aNodeWriter[0].i
1f7e0 42 6c 6f 63 6b 0a 20 20 20 20 20 20 29 3b 0a 20  Block.      );. 
1f7f0 20 20 20 7d 0a 20 20 20 20 69 52 6f 6f 74 20 3d     }.    iRoot =
1f800 20 31 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20   1;.  }.  pRoot 
1f810 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64  = &pWriter->aNod
1f820 65 57 72 69 74 65 72 5b 69 52 6f 6f 74 5d 3b 0a  eWriter[iRoot];.
1f830 0a 20 20 2f 2a 20 46 6c 75 73 68 20 61 6c 6c 20  .  /* Flush all 
1f840 63 75 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61  currently outsta
1f850 6e 64 69 6e 67 20 6e 6f 64 65 73 20 74 6f 20 64  nding nodes to d
1f860 69 73 6b 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  isk. */.  for(i=
1f870 30 3b 20 69 3c 69 52 6f 6f 74 3b 20 69 2b 2b 29  0; i<iRoot; i++)
1f880 7b 0a 20 20 20 20 4e 6f 64 65 57 72 69 74 65 72  {.    NodeWriter
1f890 20 2a 70 4e 6f 64 65 20 3d 20 26 70 57 72 69 74   *pNode = &pWrit
1f8a0 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b  er->aNodeWriter[
1f8b0 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 4e 6f 64  i];.    if( pNod
1f8c0 65 2d 3e 62 6c 6f 63 6b 2e 6e 3e 30 20 26 26 20  e->block.n>0 && 
1f8d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f8e0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33  .      rc = fts3
1f8f0 57 72 69 74 65 53 65 67 6d 65 6e 74 28 70 2c 20  WriteSegment(p, 
1f900 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b 2c 20 70  pNode->iBlock, p
1f910 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 2c 20 70  Node->block.a, p
1f920 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 29 3b 0a  Node->block.n);.
1f930 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1f940 33 5f 66 72 65 65 28 70 4e 6f 64 65 2d 3e 62 6c  3_free(pNode->bl
1f950 6f 63 6b 2e 61 29 3b 0a 20 20 20 20 73 71 6c 69  ock.a);.    sqli
1f960 74 65 33 5f 66 72 65 65 28 70 4e 6f 64 65 2d 3e  te3_free(pNode->
1f970 6b 65 79 2e 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f  key.a);.  }..  /
1f980 2a 20 57 72 69 74 65 20 74 68 65 20 25 5f 73 65  * Write the %_se
1f990 67 64 69 72 20 72 65 63 6f 72 64 2e 20 2a 2f 0a  gdir record. */.
1f9a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f9b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1f9c0 66 74 73 33 57 72 69 74 65 53 65 67 64 69 72 28  fts3WriteSegdir(
1f9d0 70 2c 20 0a 20 20 20 20 20 20 20 20 70 57 72 69  p, .        pWri
1f9e0 74 65 72 2d 3e 69 41 62 73 4c 65 76 65 6c 2b 31  ter->iAbsLevel+1
1f9f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1fa00 2f 2a 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  /* level */.    
1fa10 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 49 64      pWriter->iId
1fa20 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
1fa30 20 20 20 20 20 20 20 20 2f 2a 20 69 64 78 20 2a          /* idx *
1fa40 2f 0a 20 20 20 20 20 20 20 20 70 57 72 69 74 65  /.        pWrite
1fa50 72 2d 3e 69 53 74 61 72 74 2c 20 20 20 20 20 20  r->iStart,      
1fa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fa70 20 73 74 61 72 74 5f 62 6c 6f 63 6b 20 2a 2f 0a   start_block */.
1fa80 20 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d          pWriter-
1fa90 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 30 5d 2e  >aNodeWriter[0].
1faa0 69 42 6c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 6c  iBlock,     /* l
1fab0 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20  eaves_end_block 
1fac0 2a 2f 0a 20 20 20 20 20 20 20 20 70 57 72 69 74  */.        pWrit
1fad0 65 72 2d 3e 69 45 6e 64 2c 20 20 20 20 20 20 20  er->iEnd,       
1fae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1faf0 2a 20 65 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20  * end_block */. 
1fb00 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 62 6c         pRoot->bl
1fb10 6f 63 6b 2e 61 2c 20 70 52 6f 6f 74 2d 3e 62 6c  ock.a, pRoot->bl
1fb20 6f 63 6b 2e 6e 20 20 20 20 20 20 2f 2a 20 72 6f  ock.n      /* ro
1fb30 6f 74 20 2a 2f 0a 20 20 20 20 29 3b 0a 20 20 7d  ot */.    );.  }
1fb40 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1fb50 70 52 6f 6f 74 2d 3e 62 6c 6f 63 6b 2e 61 29 3b  pRoot->block.a);
1fb60 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1fb70 70 52 6f 6f 74 2d 3e 6b 65 79 2e 61 29 3b 0a 0a  pRoot->key.a);..
1fb80 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 7d 0a 0a    *pRc = rc;.}..
1fb90 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
1fba0 65 20 74 65 72 6d 20 69 6e 20 62 75 66 66 65 72  e term in buffer
1fbb0 20 7a 4c 68 73 20 28 73 69 7a 65 20 69 6e 20 62   zLhs (size in b
1fbc0 79 74 65 73 20 6e 4c 68 73 29 20 77 69 74 68 20  ytes nLhs) with 
1fbd0 74 68 61 74 20 69 6e 0a 2a 2a 20 7a 52 68 73 20  that in.** zRhs 
1fbe0 28 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6e  (size in bytes n
1fbf0 52 68 73 29 20 75 73 69 6e 67 20 6d 65 6d 63 6d  Rhs) using memcm
1fc00 70 2e 20 49 66 20 6f 6e 65 20 74 65 72 6d 20 69  p. If one term i
1fc10 73 20 61 20 70 72 65 66 69 78 20 6f 66 0a 2a 2a  s a prefix of.**
1fc20 20 74 68 65 20 6f 74 68 65 72 2c 20 69 74 20 69   the other, it i
1fc30 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  s considered to 
1fc40 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  be smaller than 
1fc50 74 68 65 20 6f 74 68 65 72 2e 0a 2a 2a 0a 2a 2a  the other..**.**
1fc60 20 52 65 74 75 72 6e 20 2d 76 65 20 69 66 20 7a   Return -ve if z
1fc70 4c 68 73 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  Lhs is smaller t
1fc80 68 61 6e 20 7a 52 68 73 2c 20 30 20 69 66 20 69  han zRhs, 0 if i
1fc90 74 20 69 73 20 65 71 75 61 6c 2c 20 6f 72 20 2b  t is equal, or +
1fca0 76 65 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 67  ve.** if it is g
1fcb0 72 65 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  reater..*/.stati
1fcc0 63 20 69 6e 74 20 66 74 73 33 54 65 72 6d 43 6d  c int fts3TermCm
1fcd0 70 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  p(.  const char 
1fce0 2a 7a 4c 68 73 2c 20 69 6e 74 20 6e 4c 68 73 2c  *zLhs, int nLhs,
1fcf0 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20 63       /* LHS of c
1fd00 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 63  omparison */.  c
1fd10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 68 73 2c  onst char *zRhs,
1fd20 20 69 6e 74 20 6e 52 68 73 20 20 20 20 20 20 2f   int nRhs      /
1fd30 2a 20 52 48 53 20 6f 66 20 63 6f 6d 70 61 72 69  * RHS of compari
1fd40 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  son */.){.  int 
1fd50 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 4c 68 73 2c  nCmp = MIN(nLhs,
1fd60 20 6e 52 68 73 29 3b 0a 20 20 69 6e 74 20 72 65   nRhs);.  int re
1fd70 73 3b 0a 0a 20 20 72 65 73 20 3d 20 6d 65 6d 63  s;..  res = memc
1fd80 6d 70 28 7a 4c 68 73 2c 20 7a 52 68 73 2c 20 6e  mp(zLhs, zRhs, n
1fd90 43 6d 70 29 3b 0a 20 20 69 66 28 20 72 65 73 3d  Cmp);.  if( res=
1fda0 3d 30 20 29 20 72 65 73 20 3d 20 6e 4c 68 73 20  =0 ) res = nLhs 
1fdb0 2d 20 6e 52 68 73 3b 0a 0a 20 20 72 65 74 75 72  - nRhs;..  retur
1fdc0 6e 20 72 65 73 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  n res;.}.../*.**
1fdd0 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66   Query to see if
1fde0 20 74 68 65 20 65 6e 74 72 79 20 69 6e 20 74 68   the entry in th
1fdf0 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62  e %_segments tab
1fe00 6c 65 20 77 69 74 68 20 62 6c 6f 63 6b 69 64 20  le with blockid 
1fe10 69 45 6e 64 20 69 73 20 0a 2a 2a 20 4e 55 4c 4c  iEnd is .** NULL
1fe20 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  . If no error oc
1fe30 63 75 72 73 20 61 6e 64 20 74 68 65 20 65 6e 74  curs and the ent
1fe40 72 79 20 69 73 20 4e 55 4c 4c 2c 20 73 65 74 20  ry is NULL, set 
1fe50 2a 70 62 52 65 73 20 31 20 62 65 66 6f 72 65 0a  *pbRes 1 before.
1fe60 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 20 4f 74  ** returning. Ot
1fe70 68 65 72 77 69 73 65 2c 20 73 65 74 20 2a 70 62  herwise, set *pb
1fe80 52 65 73 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a  Res to 0. .**.**
1fe90 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72   Or, if an error
1fea0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 71 75   occurs while qu
1feb0 65 72 79 69 6e 67 20 74 68 65 20 64 61 74 61 62  erying the datab
1fec0 61 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 53  ase, return an S
1fed0 51 4c 69 74 65 20 0a 2a 2a 20 65 72 72 6f 72 20  QLite .** error 
1fee0 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 20  code. The final 
1fef0 76 61 6c 75 65 20 6f 66 20 2a 70 62 52 65 73 20  value of *pbRes 
1ff00 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  is undefined in 
1ff10 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
1ff20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
1ff30 20 74 65 73 74 20 69 66 20 61 20 73 65 67 6d 65   test if a segme
1ff40 6e 74 20 69 73 20 61 6e 20 22 61 70 70 65 6e 64  nt is an "append
1ff50 61 62 6c 65 22 20 73 65 67 6d 65 6e 74 2e 20 49  able" segment. I
1ff60 66 20 69 74 0a 2a 2a 20 69 73 2c 20 74 68 65 6e  f it.** is, then
1ff70 20 61 20 4e 55 4c 4c 20 65 6e 74 72 79 20 68 61   a NULL entry ha
1ff80 73 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20  s been inserted 
1ff90 69 6e 74 6f 20 74 68 65 20 25 5f 73 65 67 6d 65  into the %_segme
1ffa0 6e 74 73 20 74 61 62 6c 65 0a 2a 2a 20 77 69 74  nts table.** wit
1ffb0 68 20 62 6c 6f 63 6b 69 64 20 25 5f 73 65 67 64  h blockid %_segd
1ffc0 69 72 2e 65 6e 64 5f 62 6c 6f 63 6b 2e 0a 2a 2f  ir.end_block..*/
1ffd0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
1ffe0 49 73 41 70 70 65 6e 64 61 62 6c 65 28 46 74 73  IsAppendable(Fts
1fff0 33 54 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74  3Table *p, sqlit
20000 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 2c 20 69  e3_int64 iEnd, i
20010 6e 74 20 2a 70 62 52 65 73 29 7b 0a 20 20 69 6e  nt *pbRes){.  in
20020 74 20 62 52 65 73 20 3d 20 30 3b 20 20 20 20 20  t bRes = 0;     
20030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20040 20 52 65 73 75 6c 74 20 74 6f 20 73 65 74 20 2a   Result to set *
20050 70 62 52 65 73 20 74 6f 20 2a 2f 0a 20 20 73 71  pbRes to */.  sq
20060 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 43 68 65  lite3_stmt *pChe
20070 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ck = 0;       /*
20080 20 53 74 61 74 65 6d 65 6e 74 20 74 6f 20 71 75   Statement to qu
20090 65 72 79 20 64 61 74 61 62 61 73 65 20 77 69 74  ery database wit
200a0 68 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  h */.  int rc;  
200b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200c0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
200d0 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 72 63 20 3d   code */..  rc =
200e0 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
200f0 53 51 4c 5f 53 45 47 4d 45 4e 54 5f 49 53 5f 41  SQL_SEGMENT_IS_A
20100 50 50 45 4e 44 41 42 4c 45 2c 20 26 70 43 68 65  PPENDABLE, &pChe
20110 63 6b 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ck, 0);.  if( rc
20120 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20130 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
20140 69 6e 74 36 34 28 70 43 68 65 63 6b 2c 20 31 2c  int64(pCheck, 1,
20150 20 69 45 6e 64 29 3b 0a 20 20 20 20 69 66 28 20   iEnd);.    if( 
20160 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
20170 74 65 33 5f 73 74 65 70 28 70 43 68 65 63 6b 29  te3_step(pCheck)
20180 20 29 20 62 52 65 73 20 3d 20 31 3b 0a 20 20 20   ) bRes = 1;.   
20190 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
201a0 73 65 74 28 70 43 68 65 63 6b 29 3b 0a 20 20 7d  set(pCheck);.  }
201b0 0a 20 20 0a 20 20 2a 70 62 52 65 73 20 3d 20 62  .  .  *pbRes = b
201c0 52 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  Res;.  return rc
201d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
201e0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
201f0 65 64 20 77 68 65 6e 20 69 6e 69 74 69 61 6c 69  ed when initiali
20200 7a 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e  zing an incremen
20210 74 61 6c 2d 6d 65 72 67 65 20 6f 70 65 72 61 74  tal-merge operat
20220 69 6f 6e 2e 0a 2a 2a 20 49 74 20 63 68 65 63 6b  ion..** It check
20230 73 20 69 66 20 74 68 65 20 65 78 69 73 74 69 6e  s if the existin
20240 67 20 73 65 67 6d 65 6e 74 20 77 69 74 68 20 69  g segment with i
20250 6e 64 65 78 20 76 61 6c 75 65 20 69 49 64 78 20  ndex value iIdx 
20260 61 74 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65  at absolute leve
20270 6c 20 0a 2a 2a 20 28 69 41 62 73 4c 65 76 65 6c  l .** (iAbsLevel
20280 2b 31 29 20 63 61 6e 20 62 65 20 61 70 70 65 6e  +1) can be appen
20290 64 65 64 20 74 6f 20 62 79 20 74 68 65 20 69 6e  ded to by the in
202a0 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 2e  cremental merge.
202b0 20 49 66 20 69 74 20 63 61 6e 2c 20 74 68 65 0a   If it can, the.
202c0 2a 2a 20 6d 65 72 67 65 2d 77 72 69 74 65 72 20  ** merge-writer 
202d0 6f 62 6a 65 63 74 20 2a 70 57 72 69 74 65 72 20  object *pWriter 
202e0 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
202f0 6f 20 77 72 69 74 65 20 74 6f 20 69 74 2e 0a 2a  o write to it..*
20300 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e 67  *.** An existing
20310 20 73 65 67 6d 65 6e 74 20 63 61 6e 20 62 65 20   segment can be 
20320 61 70 70 65 6e 64 65 64 20 74 6f 20 62 79 20 61  appended to by a
20330 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  n incremental me
20340 72 67 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  rge if:.**.**   
20350 2a 20 49 74 20 77 61 73 20 69 6e 69 74 69 61 6c  * It was initial
20360 6c 79 20 63 72 65 61 74 65 64 20 61 73 20 61 6e  ly created as an
20370 20 61 70 70 65 6e 64 61 62 6c 65 20 73 65 67 6d   appendable segm
20380 65 6e 74 20 28 77 69 74 68 20 61 6c 6c 20 72 65  ent (with all re
20390 71 75 69 72 65 64 0a 2a 2a 20 20 20 20 20 73 70  quired.**     sp
203a0 61 63 65 20 70 72 65 2d 61 6c 6c 6f 63 61 74 65  ace pre-allocate
203b0 64 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  d), and.**.**   
203c0 2a 20 54 68 65 20 66 69 72 73 74 20 6b 65 79 20  * The first key 
203d0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e  read from the in
203e0 70 75 74 20 28 61 72 67 75 6d 65 6e 74 73 20 7a  put (arguments z
203f0 4b 65 79 20 61 6e 64 20 6e 4b 65 79 29 20 69 73  Key and nKey) is
20400 20 0a 2a 2a 20 20 20 20 20 67 72 65 61 74 65 72   .**     greater
20410 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73   than the larges
20420 74 20 6b 65 79 20 63 75 72 72 65 6e 74 6c 79 20  t key currently 
20430 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 6f  stored in the po
20440 74 65 6e 74 69 61 6c 0a 2a 2a 20 20 20 20 20 6f  tential.**     o
20450 75 74 70 75 74 20 73 65 67 6d 65 6e 74 2e 0a 2a  utput segment..*
20460 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
20470 33 49 6e 63 72 6d 65 72 67 65 4c 6f 61 64 28 0a  3IncrmergeLoad(.
20480 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
20490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204a0 20 20 2f 2a 20 46 74 73 33 20 74 61 62 6c 65 20    /* Fts3 table 
204b0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69  handle */.  sqli
204c0 74 65 33 5f 69 6e 74 36 34 20 69 41 62 73 4c 65  te3_int64 iAbsLe
204d0 76 65 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 41  vel,        /* A
204e0 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 6f 66  bsolute level of
204f0 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
20500 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20  */.  int iIdx,  
20510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20520 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
20530 20 63 61 6e 64 69 64 61 74 65 20 6f 75 74 70 75   candidate outpu
20540 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 63  t segment */.  c
20550 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 2c  onst char *zKey,
20560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20570 2a 20 46 69 72 73 74 20 6b 65 79 20 74 6f 20 77  * First key to w
20580 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b  rite */.  int nK
20590 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
205a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
205b0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
205c0 6e 4b 65 79 20 2a 2f 0a 20 20 49 6e 63 72 6d 65  nKey */.  Incrme
205d0 72 67 65 57 72 69 74 65 72 20 2a 70 57 72 69 74  rgeWriter *pWrit
205e0 65 72 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 70  er        /* Pop
205f0 75 6c 61 74 65 20 74 68 69 73 20 6f 62 6a 65 63  ulate this objec
20600 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
20610 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
20630 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  urn code */.  sq
20640 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c  lite3_stmt *pSel
20650 65 63 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  ect = 0;      /*
20660 20 53 45 4c 45 43 54 20 74 6f 20 72 65 61 64 20   SELECT to read 
20670 25 5f 73 65 67 64 69 72 20 65 6e 74 72 79 20 2a  %_segdir entry *
20680 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71  /..  rc = fts3Sq
20690 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c  lStmt(p, SQL_SEL
206a0 45 43 54 5f 53 45 47 44 49 52 2c 20 26 70 53 65  ECT_SEGDIR, &pSe
206b0 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  lect, 0);.  if( 
206c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
206d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
206e0 36 34 20 69 53 74 61 72 74 20 3d 20 30 3b 20 20  64 iStart = 0;  
206f0 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 25     /* Value of %
20700 5f 73 65 67 64 69 72 2e 73 74 61 72 74 5f 62 6c  _segdir.start_bl
20710 6f 63 6b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ock */.    sqlit
20720 65 33 5f 69 6e 74 36 34 20 69 4c 65 61 66 45 6e  e3_int64 iLeafEn
20730 64 20 3d 20 30 3b 20 20 20 2f 2a 20 56 61 6c 75  d = 0;   /* Valu
20740 65 20 6f 66 20 25 5f 73 65 67 64 69 72 2e 6c 65  e of %_segdir.le
20750 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 2a  aves_end_block *
20760 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  /.    sqlite3_in
20770 74 36 34 20 69 45 6e 64 20 3d 20 30 3b 20 20 20  t64 iEnd = 0;   
20780 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
20790 25 5f 73 65 67 64 69 72 2e 65 6e 64 5f 62 6c 6f  %_segdir.end_blo
207a0 63 6b 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  ck */.    const 
207b0 63 68 61 72 20 2a 61 52 6f 6f 74 20 3d 20 30 3b  char *aRoot = 0;
207c0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
207d0 65 72 20 74 6f 20 25 5f 73 65 67 64 69 72 2e 72  er to %_segdir.r
207e0 6f 6f 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  oot buffer */.  
207f0 20 20 69 6e 74 20 6e 52 6f 6f 74 20 3d 20 30 3b    int nRoot = 0;
20800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20810 2f 2a 20 53 69 7a 65 20 6f 66 20 61 52 6f 6f 74  /* Size of aRoot
20820 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  [] in bytes */. 
20830 20 20 20 69 6e 74 20 72 63 32 3b 20 20 20 20 20     int rc2;     
20840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20850 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
20860 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 72 65 73  from sqlite3_res
20870 65 74 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  et() */.    int 
20880 62 41 70 70 65 6e 64 61 62 6c 65 20 3d 20 30 3b  bAppendable = 0;
20890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
208a0 20 74 6f 20 74 72 75 65 20 69 66 20 73 65 67 6d   to true if segm
208b0 65 6e 74 20 69 73 20 61 70 70 65 6e 64 61 62 6c  ent is appendabl
208c0 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61  e */..    /* Rea
208d0 64 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 65  d the %_segdir e
208e0 6e 74 72 79 20 66 6f 72 20 69 6e 64 65 78 20 69  ntry for index i
208f0 49 64 78 20 61 62 73 6f 6c 75 74 65 20 6c 65 76  Idx absolute lev
20900 65 6c 20 28 69 41 62 73 4c 65 76 65 6c 2b 31 29  el (iAbsLevel+1)
20910 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
20920 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 65 6c 65  bind_int64(pSele
20930 63 74 2c 20 31 2c 20 69 41 62 73 4c 65 76 65 6c  ct, 1, iAbsLevel
20940 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +1);.    sqlite3
20950 5f 62 69 6e 64 5f 69 6e 74 28 70 53 65 6c 65 63  _bind_int(pSelec
20960 74 2c 20 32 2c 20 69 49 64 78 29 3b 0a 20 20 20  t, 2, iIdx);.   
20970 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65   if( sqlite3_ste
20980 70 28 70 53 65 6c 65 63 74 29 3d 3d 53 51 4c 49  p(pSelect)==SQLI
20990 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
209a0 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
209b0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
209c0 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20 20 20 20  elect, 1);.     
209d0 20 69 4c 65 61 66 45 6e 64 20 3d 20 73 71 6c 69   iLeafEnd = sqli
209e0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
209f0 28 70 53 65 6c 65 63 74 2c 20 32 29 3b 0a 20 20  (pSelect, 2);.  
20a00 20 20 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74      iEnd = sqlit
20a10 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
20a20 70 53 65 6c 65 63 74 2c 20 33 29 3b 0a 20 20 20  pSelect, 3);.   
20a30 20 20 20 6e 52 6f 6f 74 20 3d 20 73 71 6c 69 74     nRoot = sqlit
20a40 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
20a50 70 53 65 6c 65 63 74 2c 20 34 29 3b 0a 20 20 20  pSelect, 4);.   
20a60 20 20 20 61 52 6f 6f 74 20 3d 20 73 71 6c 69 74     aRoot = sqlit
20a70 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
20a80 53 65 6c 65 63 74 2c 20 34 29 3b 0a 20 20 20 20  Select, 4);.    
20a90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
20aa0 75 72 6e 20 73 71 6c 69 74 65 33 5f 72 65 73 65  urn sqlite3_rese
20ab0 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  t(pSelect);.    
20ac0 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
20ad0 66 6f 72 20 74 68 65 20 7a 65 72 6f 2d 6c 65 6e  for the zero-len
20ae0 67 74 68 20 6d 61 72 6b 65 72 20 69 6e 20 74 68  gth marker in th
20af0 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62  e %_segments tab
20b00 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66  le */.    rc = f
20b10 74 73 33 49 73 41 70 70 65 6e 64 61 62 6c 65 28  ts3IsAppendable(
20b20 70 2c 20 69 45 6e 64 2c 20 26 62 41 70 70 65 6e  p, iEnd, &bAppen
20b30 64 61 62 6c 65 29 3b 0a 0a 20 20 20 20 2f 2a 20  dable);..    /* 
20b40 43 68 65 63 6b 20 74 68 61 74 20 7a 4b 65 79 2f  Check that zKey/
20b50 6e 4b 65 79 20 69 73 20 6c 61 72 67 65 72 20 74  nKey is larger t
20b60 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  han the largest 
20b70 6b 65 79 20 74 68 65 20 63 61 6e 64 69 64 61 74  key the candidat
20b80 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  e */.    if( rc=
20b90 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 41  =SQLITE_OK && bA
20ba0 70 70 65 6e 64 61 62 6c 65 20 29 7b 0a 20 20 20  ppendable ){.   
20bb0 20 20 20 63 68 61 72 20 2a 61 4c 65 61 66 20 3d     char *aLeaf =
20bc0 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c   0;.      int nL
20bd0 65 61 66 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  eaf = 0;..      
20be0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
20bf0 52 65 61 64 42 6c 6f 63 6b 28 70 2c 20 69 4c 65  ReadBlock(p, iLe
20c00 61 66 45 6e 64 2c 20 26 61 4c 65 61 66 2c 20 26  afEnd, &aLeaf, &
20c10 6e 4c 65 61 66 2c 20 30 29 3b 0a 20 20 20 20 20  nLeaf, 0);.     
20c20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20c30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 6f  OK ){.        No
20c40 64 65 52 65 61 64 65 72 20 72 65 61 64 65 72 3b  deReader reader;
20c50 0a 20 20 20 20 20 20 20 20 66 6f 72 28 72 63 20  .        for(rc 
20c60 3d 20 6e 6f 64 65 52 65 61 64 65 72 49 6e 69 74  = nodeReaderInit
20c70 28 26 72 65 61 64 65 72 2c 20 61 4c 65 61 66 2c  (&reader, aLeaf,
20c80 20 6e 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20   nLeaf);.       
20c90 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
20ca0 4f 4b 20 26 26 20 72 65 61 64 65 72 2e 61 4e 6f  OK && reader.aNo
20cb0 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  de;.            
20cc0 72 63 20 3d 20 6e 6f 64 65 52 65 61 64 65 72 4e  rc = nodeReaderN
20cd0 65 78 74 28 26 72 65 61 64 65 72 29 0a 20 20 20  ext(&reader).   
20ce0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
20cf0 20 20 61 73 73 65 72 74 28 20 72 65 61 64 65 72    assert( reader
20d00 2e 61 4e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  .aNode );.      
20d10 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
20d20 66 74 73 33 54 65 72 6d 43 6d 70 28 7a 4b 65 79  fts3TermCmp(zKey
20d30 2c 20 6e 4b 65 79 2c 20 72 65 61 64 65 72 2e 74  , nKey, reader.t
20d40 65 72 6d 2e 61 2c 20 72 65 61 64 65 72 2e 74 65  erm.a, reader.te
20d50 72 6d 2e 6e 29 3c 3d 30 20 29 7b 0a 20 20 20 20  rm.n)<=0 ){.    
20d60 20 20 20 20 20 20 62 41 70 70 65 6e 64 61 62 6c        bAppendabl
20d70 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
20d80 0a 20 20 20 20 20 20 20 20 6e 6f 64 65 52 65 61  .        nodeRea
20d90 64 65 72 52 65 6c 65 61 73 65 28 26 72 65 61 64  derRelease(&read
20da0 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
20db0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
20dc0 61 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a 0a 20  aLeaf);.    }.. 
20dd0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20de0 45 5f 4f 4b 20 26 26 20 62 41 70 70 65 6e 64 61  E_OK && bAppenda
20df0 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ble ){.      /* 
20e00 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  It is possible t
20e10 6f 20 61 70 70 65 6e 64 20 74 6f 20 74 68 69 73  o append to this
20e20 20 73 65 67 6d 65 6e 74 2e 20 53 65 74 20 75 70   segment. Set up
20e30 20 74 68 65 20 49 6e 63 72 6d 65 72 67 65 57 72   the IncrmergeWr
20e40 69 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 62  iter.      ** ob
20e50 6a 65 63 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20  ject to do so.  
20e60 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  */.      int i;.
20e70 20 20 20 20 20 20 69 6e 74 20 6e 48 65 69 67 68        int nHeigh
20e80 74 20 3d 20 28 69 6e 74 29 61 52 6f 6f 74 5b 30  t = (int)aRoot[0
20e90 5d 3b 0a 20 20 20 20 20 20 4e 6f 64 65 57 72 69  ];.      NodeWri
20ea0 74 65 72 20 2a 70 4e 6f 64 65 3b 0a 0a 20 20 20  ter *pNode;..   
20eb0 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61     pWriter->nLea
20ec0 66 45 73 74 20 3d 20 28 69 6e 74 29 28 28 69 45  fEst = (int)((iE
20ed0 6e 64 20 2d 20 69 53 74 61 72 74 29 20 2b 20 31  nd - iStart) + 1
20ee0 29 2f 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44  )/FTS_MAX_APPEND
20ef0 41 42 4c 45 5f 48 45 49 47 48 54 3b 0a 20 20 20  ABLE_HEIGHT;.   
20f00 20 20 20 70 57 72 69 74 65 72 2d 3e 69 53 74 61     pWriter->iSta
20f10 72 74 20 3d 20 69 53 74 61 72 74 3b 0a 20 20 20  rt = iStart;.   
20f20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 45 6e 64     pWriter->iEnd
20f30 20 3d 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 70   = iEnd;.      p
20f40 57 72 69 74 65 72 2d 3e 69 41 62 73 4c 65 76 65  Writer->iAbsLeve
20f50 6c 20 3d 20 69 41 62 73 4c 65 76 65 6c 3b 0a 20  l = iAbsLevel;. 
20f60 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 49       pWriter->iI
20f70 64 78 20 3d 20 69 49 64 78 3b 0a 0a 20 20 20 20  dx = iIdx;..    
20f80 20 20 66 6f 72 28 69 3d 6e 48 65 69 67 68 74 2b    for(i=nHeight+
20f90 31 3b 20 69 3c 46 54 53 5f 4d 41 58 5f 41 50 50  1; i<FTS_MAX_APP
20fa0 45 4e 44 41 42 4c 45 5f 48 45 49 47 48 54 3b 20  ENDABLE_HEIGHT; 
20fb0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 57  i++){.        pW
20fc0 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74  riter->aNodeWrit
20fd0 65 72 5b 69 5d 2e 69 42 6c 6f 63 6b 20 3d 20 70  er[i].iBlock = p
20fe0 57 72 69 74 65 72 2d 3e 69 53 74 61 72 74 20 2b  Writer->iStart +
20ff0 20 69 2a 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61   i*pWriter->nLea
21000 66 45 73 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  fEst;.      }.. 
21010 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 26 70 57       pNode = &pW
21020 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74  riter->aNodeWrit
21030 65 72 5b 6e 48 65 69 67 68 74 5d 3b 0a 20 20 20  er[nHeight];.   
21040 20 20 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b     pNode->iBlock
21050 20 3d 20 70 57 72 69 74 65 72 2d 3e 69 53 74 61   = pWriter->iSta
21060 72 74 20 2b 20 70 57 72 69 74 65 72 2d 3e 6e 4c  rt + pWriter->nL
21070 65 61 66 45 73 74 2a 6e 48 65 69 67 68 74 3b 0a  eafEst*nHeight;.
21080 20 20 20 20 20 20 62 6c 6f 62 47 72 6f 77 42 75        blobGrowBu
21090 66 66 65 72 28 26 70 4e 6f 64 65 2d 3e 62 6c 6f  ffer(&pNode->blo
210a0 63 6b 2c 20 4d 41 58 28 6e 52 6f 6f 74 2c 20 70  ck, MAX(nRoot, p
210b0 2d 3e 6e 4e 6f 64 65 53 69 7a 65 29 2c 20 26 72  ->nNodeSize), &r
210c0 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c);.      if( rc
210d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
210e0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e         memcpy(pN
210f0 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 2c 20 61 52  ode->block.a, aR
21100 6f 6f 74 2c 20 6e 52 6f 6f 74 29 3b 0a 20 20 20  oot, nRoot);.   
21110 20 20 20 20 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63       pNode->bloc
21120 6b 2e 6e 20 3d 20 6e 52 6f 6f 74 3b 0a 20 20 20  k.n = nRoot;.   
21130 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28     }..      for(
21140 69 3d 6e 48 65 69 67 68 74 3b 20 69 3e 3d 30 20  i=nHeight; i>=0 
21150 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
21160 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  ; i--){.        
21170 4e 6f 64 65 52 65 61 64 65 72 20 72 65 61 64 65  NodeReader reade
21180 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f 64 65  r;.        pNode
21190 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 4e 6f   = &pWriter->aNo
211a0 64 65 57 72 69 74 65 72 5b 69 5d 3b 0a 0a 20 20  deWriter[i];..  
211b0 20 20 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 52        rc = nodeR
211c0 65 61 64 65 72 49 6e 69 74 28 26 72 65 61 64 65  eaderInit(&reade
211d0 72 2c 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e  r, pNode->block.
211e0 61 2c 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e  a, pNode->block.
211f0 6e 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  n);.        whil
21200 65 28 20 72 65 61 64 65 72 2e 61 4e 6f 64 65 20  e( reader.aNode 
21210 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
21220 20 29 20 72 63 20 3d 20 6e 6f 64 65 52 65 61 64   ) rc = nodeRead
21230 65 72 4e 65 78 74 28 26 72 65 61 64 65 72 29 3b  erNext(&reader);
21240 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 47 72 6f  .        blobGro
21250 77 42 75 66 66 65 72 28 26 70 4e 6f 64 65 2d 3e  wBuffer(&pNode->
21260 6b 65 79 2c 20 72 65 61 64 65 72 2e 74 65 72 6d  key, reader.term
21270 2e 6e 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  .n, &rc);.      
21280 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21290 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
212a0 20 6d 65 6d 63 70 79 28 70 4e 6f 64 65 2d 3e 6b   memcpy(pNode->k
212b0 65 79 2e 61 2c 20 72 65 61 64 65 72 2e 74 65 72  ey.a, reader.ter
212c0 6d 2e 61 2c 20 72 65 61 64 65 72 2e 74 65 72 6d  m.a, reader.term
212d0 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  .n);.          p
212e0 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 20 3d 20 72 65  Node->key.n = re
212f0 61 64 65 72 2e 74 65 72 6d 2e 6e 3b 0a 20 20 20  ader.term.n;.   
21300 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29         if( i>0 )
21310 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  {.            ch
21320 61 72 20 2a 61 42 6c 6f 63 6b 20 3d 20 30 3b 0a  ar *aBlock = 0;.
21330 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
21340 6e 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20  nBlock = 0;.    
21350 20 20 20 20 20 20 20 20 70 4e 6f 64 65 20 3d 20          pNode = 
21360 26 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57  &pWriter->aNodeW
21370 72 69 74 65 72 5b 69 2d 31 5d 3b 0a 20 20 20 20  riter[i-1];.    
21380 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 69          pNode->i
21390 42 6c 6f 63 6b 20 3d 20 72 65 61 64 65 72 2e 69  Block = reader.i
213a0 43 68 69 6c 64 3b 0a 20 20 20 20 20 20 20 20 20  Child;.         
213b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
213c0 74 73 33 52 65 61 64 42 6c 6f 63 6b 28 70 2c 20  ts3ReadBlock(p, 
213d0 72 65 61 64 65 72 2e 69 43 68 69 6c 64 2c 20 26  reader.iChild, &
213e0 61 42 6c 6f 63 6b 2c 20 26 6e 42 6c 6f 63 6b 2c  aBlock, &nBlock,
213f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
21400 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28   blobGrowBuffer(
21410 26 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2c 20 4d  &pNode->block, M
21420 41 58 28 6e 42 6c 6f 63 6b 2c 20 70 2d 3e 6e 4e  AX(nBlock, p->nN
21430 6f 64 65 53 69 7a 65 29 2c 20 26 72 63 29 3b 0a  odeSize), &rc);.
21440 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
21450 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21460 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  .              m
21470 65 6d 63 70 79 28 70 4e 6f 64 65 2d 3e 62 6c 6f  emcpy(pNode->blo
21480 63 6b 2e 61 2c 20 61 42 6c 6f 63 6b 2c 20 6e 42  ck.a, aBlock, nB
21490 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  lock);.         
214a0 20 20 20 20 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63       pNode->bloc
214b0 6b 2e 6e 20 3d 20 6e 42 6c 6f 63 6b 3b 0a 20 20  k.n = nBlock;.  
214c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
214d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
214e0 66 72 65 65 28 61 42 6c 6f 63 6b 29 3b 0a 20 20  free(aBlock);.  
214f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21500 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 6f 64 65    }.        node
21510 52 65 61 64 65 72 52 65 6c 65 61 73 65 28 26 72  ReaderRelease(&r
21520 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  eader);.      }.
21530 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 32 20 3d      }..    rc2 =
21540 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
21550 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69 66 28  Select);.    if(
21560 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21570 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a   rc = rc2;.  }..
21580 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21590 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
215a0 74 68 65 20 6c 61 72 67 65 73 74 20 73 65 67 6d  the largest segm
215b0 65 6e 74 20 69 6e 64 65 78 20 76 61 6c 75 65 20  ent index value 
215c0 74 68 61 74 20 65 78 69 73 74 73 20 77 69 74 68  that exists with
215d0 69 6e 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 6c  in absolute.** l
215e0 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c 2b 31  evel iAbsLevel+1
215f0 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  . If no error oc
21600 63 75 72 73 2c 20 73 65 74 20 2a 70 69 49 64 78  curs, set *piIdx
21610 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 70   to this value p
21620 6c 75 73 0a 2a 2a 20 6f 6e 65 20 62 65 66 6f 72  lus.** one befor
21630 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  e returning SQLI
21640 54 45 5f 4f 4b 2e 20 4f 72 2c 20 69 66 20 74 68  TE_OK. Or, if th
21650 65 72 65 20 61 72 65 20 6e 6f 20 73 65 67 6d 65  ere are no segme
21660 6e 74 73 20 61 74 20 61 6c 6c 20 0a 2a 2a 20 77  nts at all .** w
21670 69 74 68 69 6e 20 6c 65 76 65 6c 20 69 41 62 73  ithin level iAbs
21680 4c 65 76 65 6c 2c 20 73 65 74 20 2a 70 69 49 64  Level, set *piId
21690 78 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  x to zero..**.**
216a0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
216b0 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 53  urs, return an S
216c0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
216d0 2e 20 54 68 65 20 66 69 6e 61 6c 20 76 61 6c 75  . The final valu
216e0 65 20 6f 66 0a 2a 2a 20 2a 70 69 49 64 78 20 69  e of.** *piIdx i
216f0 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  s undefined in t
21700 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61  his case..*/.sta
21710 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72  tic int fts3Incr
21720 6d 65 72 67 65 4f 75 74 70 75 74 49 64 78 28 20  mergeOutputIdx( 
21730 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
21740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21750 20 20 20 2f 2a 20 46 54 53 20 54 61 62 6c 65 20     /* FTS Table 
21760 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69  handle */.  sqli
21770 74 65 33 5f 69 6e 74 36 34 20 69 41 62 73 4c 65  te3_int64 iAbsLe
21780 76 65 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 41  vel,        /* A
21790 62 73 6f 6c 75 74 65 20 69 6e 64 65 78 20 6f 66  bsolute index of
217a0 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
217b0 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 49 64 78 20  */.  int *piIdx 
217c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217d0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78       /* OUT: Nex
217e0 74 20 66 72 65 65 20 69 6e 64 65 78 20 61 74 20  t free index at 
217f0 69 41 62 73 4c 65 76 65 6c 2b 31 20 2a 2f 0a 29  iAbsLevel+1 */.)
21800 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
21810 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 4f 75 74  lite3_stmt *pOut
21820 70 75 74 49 64 78 20 3d 20 30 3b 20 20 20 2f 2a  putIdx = 0;   /*
21830 20 53 51 4c 20 75 73 65 64 20 74 6f 20 66 69 6e   SQL used to fin
21840 64 20 6f 75 74 70 75 74 20 69 6e 64 65 78 20 2a  d output index *
21850 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71  /..  rc = fts3Sq
21860 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 4e 45 58  lStmt(p, SQL_NEX
21870 54 5f 53 45 47 4d 45 4e 54 5f 49 4e 44 45 58 2c  T_SEGMENT_INDEX,
21880 20 26 70 4f 75 74 70 75 74 49 64 78 2c 20 30 29   &pOutputIdx, 0)
21890 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
218a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
218b0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
218c0 70 4f 75 74 70 75 74 49 64 78 2c 20 31 2c 20 69  pOutputIdx, 1, i
218d0 41 62 73 4c 65 76 65 6c 2b 31 29 3b 0a 20 20 20  AbsLevel+1);.   
218e0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 4f   sqlite3_step(pO
218f0 75 74 70 75 74 49 64 78 29 3b 0a 20 20 20 20 2a  utputIdx);.    *
21900 70 69 49 64 78 20 3d 20 73 71 6c 69 74 65 33 5f  piIdx = sqlite3_
21910 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 4f 75 74 70  column_int(pOutp
21920 75 74 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 72  utIdx, 0);.    r
21930 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
21940 74 28 70 4f 75 74 70 75 74 49 64 78 29 3b 0a 20  t(pOutputIdx);. 
21950 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
21960 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 6f 63  .}../* .** Alloc
21970 61 74 65 20 61 6e 20 61 70 70 65 6e 64 61 62 6c  ate an appendabl
21980 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  e output segment
21990 20 6f 6e 20 61 62 73 6f 6c 75 74 65 20 6c 65 76   on absolute lev
219a0 65 6c 20 69 41 62 73 4c 65 76 65 6c 2b 31 0a 2a  el iAbsLevel+1.*
219b0 2a 20 77 69 74 68 20 69 64 78 20 76 61 6c 75 65  * with idx value
219c0 20 69 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20   iIdx..**.** In 
219d0 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62  the %_segdir tab
219e0 6c 65 2c 20 61 20 73 65 67 6d 65 6e 74 20 69 73  le, a segment is
219f0 20 64 65 66 69 6e 65 64 20 62 79 20 74 68 65 20   defined by the 
21a00 76 61 6c 75 65 73 20 69 6e 20 74 68 72 65 65 0a  values in three.
21a10 2a 2a 20 63 6f 6c 75 6d 6e 73 3a 0a 2a 2a 0a 2a  ** columns:.**.*
21a20 2a 20 20 20 20 20 73 74 61 72 74 5f 62 6c 6f 63  *     start_bloc
21a30 6b 0a 2a 2a 20 20 20 20 20 6c 65 61 76 65 73 5f  k.**     leaves_
21a40 65 6e 64 5f 62 6c 6f 63 6b 0a 2a 2a 20 20 20 20  end_block.**    
21a50 20 65 6e 64 5f 62 6c 6f 63 6b 0a 2a 2a 0a 2a 2a   end_block.**.**
21a60 20 57 68 65 6e 20 61 6e 20 61 70 70 65 6e 64 61   When an appenda
21a70 62 6c 65 20 73 65 67 6d 65 6e 74 20 69 73 20 61  ble segment is a
21a80 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20  llocated, it is 
21a90 65 73 74 69 6d 61 74 65 64 20 74 68 61 74 20 74  estimated that t
21aa0 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 6e 75  he.** maximum nu
21ab0 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 62 6c 6f  mber of leaf blo
21ac0 63 6b 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  cks that may be 
21ad0 72 65 71 75 69 72 65 64 20 69 73 20 74 68 65 20  required is the 
21ae0 73 75 6d 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75  sum of the.** nu
21af0 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 62 6c 6f  mber of leaf blo
21b00 63 6b 73 20 63 6f 6e 73 75 6d 65 64 20 62 79 20  cks consumed by 
21b10 74 68 65 20 69 6e 70 75 74 20 73 65 67 6d 65 6e  the input segmen
21b20 74 73 2c 20 70 6c 75 73 20 74 68 65 20 6e 75 6d  ts, plus the num
21b30 62 65 72 0a 2a 2a 20 6f 66 20 69 6e 70 75 74 20  ber.** of input 
21b40 73 65 67 6d 65 6e 74 73 2c 20 6d 75 6c 74 69 70  segments, multip
21b50 6c 69 65 64 20 62 79 20 74 77 6f 2e 20 54 68 69  lied by two. Thi
21b60 73 20 76 61 6c 75 65 20 69 73 20 73 74 6f 72 65  s value is store
21b70 64 20 69 6e 20 73 74 61 63 6b 20 0a 2a 2a 20 76  d in stack .** v
21b80 61 72 69 61 62 6c 65 20 6e 4c 65 61 66 45 73 74  ariable nLeafEst
21b90 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20  ..**.** A total 
21ba0 6f 66 20 31 36 2a 6e 4c 65 61 66 45 73 74 20 62  of 16*nLeafEst b
21bb0 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 63 61  locks are alloca
21bc0 74 65 64 20 77 68 65 6e 20 61 6e 20 61 70 70 65  ted when an appe
21bd0 6e 64 61 62 6c 65 20 73 65 67 6d 65 6e 74 0a 2a  ndable segment.*
21be0 2a 20 69 73 20 63 72 65 61 74 65 64 20 28 28 31  * is created ((1
21bf0 20 2b 20 65 6e 64 5f 62 6c 6f 63 6b 20 2d 20 73   + end_block - s
21c00 74 61 72 74 5f 62 6c 6f 63 6b 29 3d 3d 31 36 2a  tart_block)==16*
21c10 6e 4c 65 61 66 45 73 74 29 2e 20 54 68 65 20 63  nLeafEst). The c
21c20 6f 6e 74 69 67 75 6f 75 73 0a 2a 2a 20 61 72 72  ontiguous.** arr
21c30 61 79 20 6f 66 20 6c 65 61 66 20 6e 6f 64 65 73  ay of leaf nodes
21c40 20 73 74 61 72 74 73 20 61 74 20 74 68 65 20 66   starts at the f
21c50 69 72 73 74 20 62 6c 6f 63 6b 20 61 6c 6c 6f 63  irst block alloc
21c60 61 74 65 64 2e 20 54 68 65 20 61 72 72 61 79 0a  ated. The array.
21c70 2a 2a 20 6f 66 20 69 6e 74 65 72 69 6f 72 20 6e  ** of interior n
21c80 6f 64 65 73 20 74 68 61 74 20 61 72 65 20 70 61  odes that are pa
21c90 72 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 65 61  rents of the lea
21ca0 66 20 6e 6f 64 65 73 20 73 74 61 72 74 20 61 74  f nodes start at
21cb0 20 62 6c 6f 63 6b 0a 2a 2a 20 28 73 74 61 72 74   block.** (start
21cc0 5f 62 6c 6f 63 6b 20 2b 20 28 31 20 2b 20 65 6e  _block + (1 + en
21cd0 64 5f 62 6c 6f 63 6b 20 2d 20 73 74 61 72 74 5f  d_block - start_
21ce0 62 6c 6f 63 6b 29 20 2f 20 31 36 29 2e 20 41 6e  block) / 16). An
21cf0 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  d so on..**.** I
21d00 6e 20 74 68 65 20 61 63 74 75 61 6c 20 63 6f 64  n the actual cod
21d10 65 20 62 65 6c 6f 77 2c 20 74 68 65 20 76 61 6c  e below, the val
21d20 75 65 20 22 31 36 22 20 69 73 20 72 65 70 6c 61  ue "16" is repla
21d30 63 65 64 20 77 69 74 68 20 74 68 65 20 0a 2a 2a  ced with the .**
21d40 20 70 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d   pre-processor m
21d50 61 63 72 6f 20 46 54 53 5f 4d 41 58 5f 41 50 50  acro FTS_MAX_APP
21d60 45 4e 44 41 42 4c 45 5f 48 45 49 47 48 54 2e 0a  ENDABLE_HEIGHT..
21d70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
21d80 73 33 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65  s3IncrmergeWrite
21d90 72 28 20 0a 20 20 46 74 73 33 54 61 62 6c 65 20  r( .  Fts3Table 
21da0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
21db0 20 20 20 20 20 20 2f 2a 20 46 74 73 33 20 74 61        /* Fts3 ta
21dc0 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
21dd0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 41  sqlite3_int64 iA
21de0 62 73 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20  bsLevel,        
21df0 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65 76 65  /* Absolute leve
21e00 6c 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65  l of input segme
21e10 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  nts */.  int iId
21e20 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
21e30 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
21e40 78 20 6f 66 20 6e 65 77 20 6f 75 74 70 75 74 20  x of new output 
21e50 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73  segment */.  Fts
21e60 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20  3MultiSegReader 
21e70 2a 70 43 73 72 2c 20 20 20 20 20 20 20 2f 2a 20  *pCsr,       /* 
21e80 43 75 72 73 6f 72 20 74 68 61 74 20 64 61 74 61  Cursor that data
21e90 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72   will be read fr
21ea0 6f 6d 20 2a 2f 0a 20 20 49 6e 63 72 6d 65 72 67  om */.  Incrmerg
21eb0 65 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  eWriter *pWriter
21ec0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c          /* Popul
21ed0 61 74 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20  ate this object 
21ee0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
21ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f00 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
21f10 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n Code */.  int 
21f20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
21f30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
21f40 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
21f50 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66 45   */.  int nLeafE
21f60 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
21f70 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 73 20        /* Blocks 
21f80 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 6c 65  allocated for le
21f90 61 66 20 6e 6f 64 65 73 20 2a 2f 0a 20 20 73 71  af nodes */.  sq
21fa0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 4c 65 61  lite3_stmt *pLea
21fb0 66 45 73 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a  fEst = 0;     /*
21fc0 20 53 51 4c 20 75 73 65 64 20 74 6f 20 64 65 74   SQL used to det
21fd0 65 72 6d 69 6e 65 20 6e 4c 65 61 66 45 73 74 20  ermine nLeafEst 
21fe0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
21ff0 74 20 2a 70 46 69 72 73 74 42 6c 6f 63 6b 20 3d  t *pFirstBlock =
22000 20 30 3b 20 20 2f 2a 20 53 51 4c 20 75 73 65 64   0;  /* SQL used
22010 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 66 69   to determine fi
22020 72 73 74 20 62 6c 6f 63 6b 20 2a 2f 0a 0a 20 20  rst block */..  
22030 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 6e 4c 65  /* Calculate nLe
22040 61 66 45 73 74 2e 20 2a 2f 0a 20 20 72 63 20 3d  afEst. */.  rc =
22050 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
22060 53 51 4c 5f 4d 41 58 5f 4c 45 41 46 5f 4e 4f 44  SQL_MAX_LEAF_NOD
22070 45 5f 45 53 54 49 4d 41 54 45 2c 20 26 70 4c 65  E_ESTIMATE, &pLe
22080 61 66 45 73 74 2c 20 30 29 3b 0a 20 20 69 66 28  afEst, 0);.  if(
22090 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
220a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  {.    sqlite3_bi
220b0 6e 64 5f 69 6e 74 36 34 28 70 4c 65 61 66 45 73  nd_int64(pLeafEs
220c0 74 2c 20 31 2c 20 69 41 62 73 4c 65 76 65 6c 29  t, 1, iAbsLevel)
220d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
220e0 6e 64 5f 69 6e 74 36 34 28 70 4c 65 61 66 45 73  nd_int64(pLeafEs
220f0 74 2c 20 32 2c 20 70 43 73 72 2d 3e 6e 53 65 67  t, 2, pCsr->nSeg
22100 6d 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 53  ment);.    if( S
22110 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
22120 65 33 5f 73 74 65 70 28 70 4c 65 61 66 45 73 74  e3_step(pLeafEst
22130 29 20 29 7b 0a 20 20 20 20 20 20 6e 4c 65 61 66  ) ){.      nLeaf
22140 45 73 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Est = sqlite3_co
22150 6c 75 6d 6e 5f 69 6e 74 28 70 4c 65 61 66 45 73  lumn_int(pLeafEs
22160 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  t, 0);.    }.   
22170 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
22180 73 65 74 28 70 4c 65 61 66 45 73 74 29 3b 0a 20  set(pLeafEst);. 
22190 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
221a0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
221b0 72 63 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c  rc;..  /* Calcul
221c0 61 74 65 20 74 68 65 20 66 69 72 73 74 20 62 6c  ate the first bl
221d0 6f 63 6b 20 74 6f 20 75 73 65 20 69 6e 20 74 68  ock to use in th
221e0 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  e output segment
221f0 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73 33 53   */.  rc = fts3S
22200 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 4e 45  qlStmt(p, SQL_NE
22210 58 54 5f 53 45 47 4d 45 4e 54 53 5f 49 44 2c 20  XT_SEGMENTS_ID, 
22220 26 70 46 69 72 73 74 42 6c 6f 63 6b 2c 20 30 29  &pFirstBlock, 0)
22230 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
22240 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
22250 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
22260 69 74 65 33 5f 73 74 65 70 28 70 46 69 72 73 74  ite3_step(pFirst
22270 42 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  Block) ){.      
22280 70 57 72 69 74 65 72 2d 3e 69 53 74 61 72 74 20  pWriter->iStart 
22290 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
222a0 5f 69 6e 74 36 34 28 70 46 69 72 73 74 42 6c 6f  _int64(pFirstBlo
222b0 63 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 57  ck, 0);.      pW
222c0 72 69 74 65 72 2d 3e 69 45 6e 64 20 3d 20 70 57  riter->iEnd = pW
222d0 72 69 74 65 72 2d 3e 69 53 74 61 72 74 20 2d 20  riter->iStart - 
222e0 31 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72  1;.      pWriter
222f0 2d 3e 69 45 6e 64 20 2b 3d 20 6e 4c 65 61 66 45  ->iEnd += nLeafE
22300 73 74 20 2a 20 46 54 53 5f 4d 41 58 5f 41 50 50  st * FTS_MAX_APP
22310 45 4e 44 41 42 4c 45 5f 48 45 49 47 48 54 3b 0a  ENDABLE_HEIGHT;.
22320 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
22330 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 46 69  qlite3_reset(pFi
22340 72 73 74 42 6c 6f 63 6b 29 3b 0a 20 20 7d 0a 20  rstBlock);.  }. 
22350 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
22360 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
22370 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  .  /* Insert the
22380 20 6d 61 72 6b 65 72 20 69 6e 20 74 68 65 20 25   marker in the %
22390 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20  _segments table 
223a0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 6e 6f 62  to make sure nob
223b0 6f 64 79 20 74 72 69 65 73 0a 20 20 2a 2a 20 74  ody tries.  ** t
223c0 6f 20 73 74 65 61 6c 20 74 68 65 20 73 70 61 63  o steal the spac
223d0 65 20 6a 75 73 74 20 61 6c 6c 6f 63 61 74 65 64  e just allocated
223e0 2e 20 54 68 69 73 20 69 73 20 61 6c 73 6f 20 75  . This is also u
223f0 73 65 64 20 74 6f 20 69 64 65 6e 74 69 66 79 20  sed to identify 
22400 0a 20 20 2a 2a 20 61 70 70 65 6e 64 61 62 6c 65  .  ** appendable
22410 20 73 65 67 6d 65 6e 74 73 2e 20 20 2a 2f 0a 20   segments.  */. 
22420 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65 53   rc = fts3WriteS
22430 65 67 6d 65 6e 74 28 70 2c 20 70 57 72 69 74 65  egment(p, pWrite
22440 72 2d 3e 69 45 6e 64 2c 20 30 2c 20 30 29 3b 0a  r->iEnd, 0, 0);.
22450 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
22460 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
22470 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 41 62  ..  pWriter->iAb
22480 73 4c 65 76 65 6c 20 3d 20 69 41 62 73 4c 65 76  sLevel = iAbsLev
22490 65 6c 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e  el;.  pWriter->n
224a0 4c 65 61 66 45 73 74 20 3d 20 6e 4c 65 61 66 45  LeafEst = nLeafE
224b0 73 74 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69  st;.  pWriter->i
224c0 49 64 78 20 3d 20 69 49 64 78 3b 0a 0a 20 20 2f  Idx = iIdx;..  /
224d0 2a 20 53 65 74 20 75 70 20 74 68 65 20 61 72 72  * Set up the arr
224e0 61 79 20 6f 66 20 4e 6f 64 65 57 72 69 74 65 72  ay of NodeWriter
224f0 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 66 6f   objects */.  fo
22500 72 28 69 3d 30 3b 20 69 3c 46 54 53 5f 4d 41 58  r(i=0; i<FTS_MAX
22510 5f 41 50 50 45 4e 44 41 42 4c 45 5f 48 45 49 47  _APPENDABLE_HEIG
22520 48 54 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 57  HT; i++){.    pW
22530 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74  riter->aNodeWrit
22540 65 72 5b 69 5d 2e 69 42 6c 6f 63 6b 20 3d 20 70  er[i].iBlock = p
22550 57 72 69 74 65 72 2d 3e 69 53 74 61 72 74 20 2b  Writer->iStart +
22560 20 69 2a 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61   i*pWriter->nLea
22570 66 45 73 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  fEst;.  }.  retu
22580 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
22590 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6e  ./*.** Remove an
225a0 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
225b0 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 2e 20  %_segdir table. 
225c0 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 72 75  This involves ru
225d0 6e 6e 69 6e 67 20 74 68 65 20 0a 2a 2a 20 66 6f  nning the .** fo
225e0 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 73 74 61 74  llowing two stat
225f0 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ements:.**.**   
22600 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 73 65  DELETE FROM %_se
22610 67 64 69 72 20 57 48 45 52 45 20 6c 65 76 65 6c  gdir WHERE level
22620 20 3d 20 3a 69 41 62 73 4c 65 76 65 6c 20 41 4e   = :iAbsLevel AN
22630 44 20 69 64 78 20 3d 20 3a 69 49 64 78 0a 2a 2a  D idx = :iIdx.**
22640 20 20 20 55 50 44 41 54 45 20 25 5f 73 65 67 64     UPDATE %_segd
22650 69 72 20 53 45 54 20 69 64 78 20 3d 20 69 64 78  ir SET idx = idx
22660 20 2d 20 31 20 57 48 45 52 45 20 6c 65 76 65 6c   - 1 WHERE level
22670 20 3d 20 3a 69 41 62 73 4c 65 76 65 6c 20 41 4e   = :iAbsLevel AN
22680 44 20 69 64 78 20 3e 20 3a 69 49 64 78 0a 2a 2a  D idx > :iIdx.**
22690 0a 2a 2a 20 54 68 65 20 44 45 4c 45 54 45 20 73  .** The DELETE s
226a0 74 61 74 65 6d 65 6e 74 20 72 65 6d 6f 76 65 73  tatement removes
226b0 20 74 68 65 20 73 70 65 63 69 66 69 63 20 25 5f   the specific %_
226c0 73 65 67 64 69 72 20 6c 65 76 65 6c 2e 20 54 68  segdir level. Th
226d0 65 20 55 50 44 41 54 45 20 0a 2a 2a 20 73 74 61  e UPDATE .** sta
226e0 74 65 6d 65 6e 74 20 65 6e 73 75 72 65 73 20 74  tement ensures t
226f0 68 61 74 20 74 68 65 20 72 65 6d 61 69 6e 69 6e  hat the remainin
22700 67 20 73 65 67 6d 65 6e 74 73 20 68 61 76 65 20  g segments have 
22710 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 61 6c 6c  contiguously all
22720 6f 63 61 74 65 64 0a 2a 2a 20 69 64 78 20 76 61  ocated.** idx va
22730 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lues..*/.static 
22740 69 6e 74 20 66 74 73 33 52 65 6d 6f 76 65 53 65  int fts3RemoveSe
22750 67 64 69 72 45 6e 74 72 79 28 0a 20 20 46 74 73  gdirEntry(.  Fts
22760 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
22770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22780 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c  FTS3 table handl
22790 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
227a0 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c 2c 20  nt64 iAbsLevel, 
227b0 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75         /* Absolu
227c0 74 65 20 6c 65 76 65 6c 20 74 6f 20 64 65 6c 65  te level to dele
227d0 74 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  te from */.  int
227e0 20 69 49 64 78 20 20 20 20 20 20 20 20 20 20 20   iIdx           
227f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22800 49 6e 64 65 78 20 6f 66 20 25 5f 73 65 67 64 69  Index of %_segdi
22810 72 20 65 6e 74 72 79 20 74 6f 20 64 65 6c 65 74  r entry to delet
22820 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
22830 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
22850 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  urn code */.  sq
22860 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c  lite3_stmt *pDel
22870 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  ete = 0;      /*
22880 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
22890 74 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73  t */..  rc = fts
228a0 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
228b0 44 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 45 4e  DELETE_SEGDIR_EN
228c0 54 52 59 2c 20 26 70 44 65 6c 65 74 65 2c 20 30  TRY, &pDelete, 0
228d0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
228e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
228f0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
22900 28 70 44 65 6c 65 74 65 2c 20 31 2c 20 69 41 62  (pDelete, 1, iAb
22910 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20 73 71 6c  sLevel);.    sql
22920 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 44  ite3_bind_int(pD
22930 65 6c 65 74 65 2c 20 32 2c 20 69 49 64 78 29 3b  elete, 2, iIdx);
22940 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65  .    sqlite3_ste
22950 70 28 70 44 65 6c 65 74 65 29 3b 0a 20 20 20 20  p(pDelete);.    
22960 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
22970 65 74 28 70 44 65 6c 65 74 65 29 3b 0a 20 20 7d  et(pDelete);.  }
22980 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
22990 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 6d  ../*.** One or m
229a0 6f 72 65 20 73 65 67 6d 65 6e 74 73 20 68 61 76  ore segments hav
229b0 65 20 6a 75 73 74 20 62 65 65 6e 20 72 65 6d 6f  e just been remo
229c0 76 65 64 20 66 72 6f 6d 20 61 62 73 6f 6c 75 74  ved from absolut
229d0 65 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65  e level iAbsLeve
229e0 6c 2e 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  l..** Update the
229f0 20 27 69 64 78 27 20 76 61 6c 75 65 73 20 6f 66   'idx' values of
22a00 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 73   the remaining s
22a10 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6c  egments in the l
22a20 65 76 65 6c 20 73 6f 20 74 68 61 74 0a 2a 2a 20  evel so that.** 
22a30 74 68 65 20 69 64 78 20 76 61 6c 75 65 73 20 61  the idx values a
22a40 72 65 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 20  re a contiguous 
22a50 73 65 71 75 65 6e 63 65 20 73 74 61 72 74 69 6e  sequence startin
22a60 67 20 66 72 6f 6d 20 30 2e 0a 2a 2f 0a 73 74 61  g from 0..*/.sta
22a70 74 69 63 20 69 6e 74 20 66 74 73 33 52 65 70 61  tic int fts3Repa
22a80 63 6b 53 65 67 64 69 72 4c 65 76 65 6c 28 0a 20  ckSegdirLevel(. 
22a90 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
22aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ab0 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20 68   /* FTS3 table h
22ac0 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  andle */.  sqlit
22ad0 65 33 5f 69 6e 74 36 34 20 69 41 62 73 4c 65 76  e3_int64 iAbsLev
22ae0 65 6c 20 20 20 20 20 20 20 20 20 2f 2a 20 41 62  el         /* Ab
22af0 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 74 6f 20  solute level to 
22b00 72 65 70 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69  repack */.){.  i
22b10 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
22b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22b30 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
22b40 0a 20 20 69 6e 74 20 2a 61 49 64 78 20 3d 20 30  .  int *aIdx = 0
22b50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22b60 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72     /* Array of r
22b70 65 6d 61 69 6e 69 6e 67 20 69 64 78 20 76 61 6c  emaining idx val
22b80 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 64  ues */.  int nId
22b90 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  x = 0;          
22ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69           /* Vali
22bb0 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61 49 64  d entries in aId
22bc0 78 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c  x[] */.  int nAl
22bd0 6c 6f 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20  loc = 0;        
22be0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
22bf0 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 49  cated size of aI
22c00 64 78 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  dx[] */.  int i;
22c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
22c30 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
22c40 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
22c50 20 2a 70 53 65 6c 65 63 74 20 3d 20 30 3b 20 20   *pSelect = 0;  
22c60 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 73 74      /* Select st
22c70 61 74 65 6d 65 6e 74 20 74 6f 20 72 65 61 64 20  atement to read 
22c80 69 64 78 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  idx values */.  
22c90 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 55  sqlite3_stmt *pU
22ca0 70 64 61 74 65 20 3d 20 30 3b 20 20 20 20 20 20  pdate = 0;      
22cb0 2f 2a 20 55 70 64 61 74 65 20 73 74 61 74 65 6d  /* Update statem
22cc0 65 6e 74 20 74 6f 20 6d 6f 64 69 66 79 20 69 64  ent to modify id
22cd0 78 20 76 61 6c 75 65 73 20 2a 2f 0a 0a 20 20 72  x values */..  r
22ce0 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
22cf0 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 49 4e  p, SQL_SELECT_IN
22d00 44 45 58 45 53 2c 20 26 70 53 65 6c 65 63 74 2c  DEXES, &pSelect,
22d10 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
22d20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22d30 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 73 71 6c  int rc2;.    sql
22d40 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
22d50 70 53 65 6c 65 63 74 2c 20 31 2c 20 69 41 62 73  pSelect, 1, iAbs
22d60 4c 65 76 65 6c 29 3b 0a 20 20 20 20 77 68 69 6c  Level);.    whil
22d70 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  e( SQLITE_ROW==s
22d80 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c  qlite3_step(pSel
22d90 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66  ect) ){.      if
22da0 28 20 6e 49 64 78 3e 3d 6e 41 6c 6c 6f 63 20 29  ( nIdx>=nAlloc )
22db0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 2a 61  {.        int *a
22dc0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 6e 41 6c  New;.        nAl
22dd0 6c 6f 63 20 2b 3d 20 31 36 3b 0a 20 20 20 20 20  loc += 16;.     
22de0 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65     aNew = sqlite
22df0 33 5f 72 65 61 6c 6c 6f 63 28 61 49 64 78 2c 20  3_realloc(aIdx, 
22e00 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 69 6e  nAlloc*sizeof(in
22e10 74 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t));.        if(
22e20 20 21 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20   !aNew ){.      
22e30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22e40 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
22e50 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
22e60 7d 0a 20 20 20 20 20 20 20 20 61 49 64 78 20 3d  }.        aIdx =
22e70 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20   aNew;.      }. 
22e80 20 20 20 20 20 61 49 64 78 5b 6e 49 64 78 2b 2b       aIdx[nIdx++
22e90 5d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ] = sqlite3_colu
22ea0 6d 6e 5f 69 6e 74 28 70 53 65 6c 65 63 74 2c 20  mn_int(pSelect, 
22eb0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  0);.    }.    rc
22ec0 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  2 = sqlite3_rese
22ed0 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  t(pSelect);.    
22ee0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22ef0 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20  K ) rc = rc2;.  
22f00 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
22f10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
22f20 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
22f30 2c 20 53 51 4c 5f 53 48 49 46 54 5f 53 45 47 44  , SQL_SHIFT_SEGD
22f40 49 52 5f 45 4e 54 52 59 2c 20 26 70 55 70 64 61  IR_ENTRY, &pUpda
22f50 74 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  te, 0);.  }.  if
22f60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22f70 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
22f80 69 6e 64 5f 69 6e 74 36 34 28 70 55 70 64 61 74  ind_int64(pUpdat
22f90 65 2c 20 32 2c 20 69 41 62 73 4c 65 76 65 6c 29  e, 2, iAbsLevel)
22fa0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
22fb0 20 70 2d 3e 62 49 67 6e 6f 72 65 53 61 76 65 70   p->bIgnoreSavep
22fc0 6f 69 6e 74 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e  oint==0 );.  p->
22fd0 62 49 67 6e 6f 72 65 53 61 76 65 70 6f 69 6e 74  bIgnoreSavepoint
22fe0 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 1;.  for(i=0;
22ff0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
23000 26 20 69 3c 6e 49 64 78 3b 20 69 2b 2b 29 7b 0a  & i<nIdx; i++){.
23010 20 20 20 20 69 66 28 20 61 49 64 78 5b 69 5d 21      if( aIdx[i]!
23020 3d 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =i ){.      sqli
23030 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 55 70  te3_bind_int(pUp
23040 64 61 74 65 2c 20 33 2c 20 61 49 64 78 5b 69 5d  date, 3, aIdx[i]
23050 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23060 5f 62 69 6e 64 5f 69 6e 74 28 70 55 70 64 61 74  _bind_int(pUpdat
23070 65 2c 20 31 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, 1, i);.      
23080 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 55 70  sqlite3_step(pUp
23090 64 61 74 65 29 3b 0a 20 20 20 20 20 20 72 63 20  date);.      rc 
230a0 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
230b0 70 55 70 64 61 74 65 29 3b 0a 20 20 20 20 7d 0a  pUpdate);.    }.
230c0 20 20 7d 0a 20 20 70 2d 3e 62 49 67 6e 6f 72 65    }.  p->bIgnore
230d0 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 0a  Savepoint = 0;..
230e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
230f0 49 64 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Idx);.  return r
23100 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  c;.}..static voi
23110 64 20 66 74 73 33 53 74 61 72 74 4e 6f 64 65 28  d fts3StartNode(
23120 42 6c 6f 62 20 2a 70 4e 6f 64 65 2c 20 69 6e 74  Blob *pNode, int
23130 20 69 48 65 69 67 68 74 2c 20 73 71 6c 69 74 65   iHeight, sqlite
23140 33 5f 69 6e 74 36 34 20 69 43 68 69 6c 64 29 7b  3_int64 iChild){
23150 0a 20 20 70 4e 6f 64 65 2d 3e 61 5b 30 5d 20 3d  .  pNode->a[0] =
23160 20 28 63 68 61 72 29 69 48 65 69 67 68 74 3b 0a   (char)iHeight;.
23170 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a    if( iChild ){.
23180 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64      assert( pNod
23190 65 2d 3e 6e 41 6c 6c 6f 63 3e 3d 31 2b 73 71 6c  e->nAlloc>=1+sql
231a0 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65  ite3Fts3VarintLe
231b0 6e 28 69 43 68 69 6c 64 29 20 29 3b 0a 20 20 20  n(iChild) );.   
231c0 20 70 4e 6f 64 65 2d 3e 6e 20 3d 20 31 20 2b 20   pNode->n = 1 + 
231d0 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
231e0 72 69 6e 74 28 26 70 4e 6f 64 65 2d 3e 61 5b 31  rint(&pNode->a[1
231f0 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 7d 65  ], iChild);.  }e
23200 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
23210 20 70 4e 6f 64 65 2d 3e 6e 41 6c 6c 6f 63 3e 3d   pNode->nAlloc>=
23220 31 20 29 3b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e  1 );.    pNode->
23230 6e 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  n = 1;.  }.}../*
23240 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 77  .** The first tw
23250 6f 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  o arguments are 
23260 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 64  a pointer to and
23270 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 73   the size of a s
23280 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 0a 2a 2a  egment b-tree.**
23290 20 6e 6f 64 65 2e 20 54 68 65 20 6e 6f 64 65 20   node. The node 
232a0 6d 61 79 20 62 65 20 61 20 6c 65 61 66 20 6f 72  may be a leaf or
232b0 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64   an internal nod
232c0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  e..**.** This fu
232d0 6e 63 74 69 6f 6e 20 63 72 65 61 74 65 73 20 61  nction creates a
232e0 20 6e 65 77 20 6e 6f 64 65 20 69 6d 61 67 65 20   new node image 
232f0 69 6e 20 62 6c 6f 62 20 6f 62 6a 65 63 74 20 2a  in blob object *
23300 70 4e 65 77 20 62 79 20 63 6f 70 79 69 6e 67 0a  pNew by copying.
23310 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20 74 68 61  ** all terms tha
23320 74 20 61 72 65 20 67 72 65 61 74 65 72 20 74 68  t are greater th
23330 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
23340 54 65 72 6d 2f 6e 54 65 72 6d 20 28 66 6f 72 20  Term/nTerm (for 
23350 6c 65 61 66 20 6e 6f 64 65 73 29 0a 2a 2a 20 6f  leaf nodes).** o
23360 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  r greater than z
23370 54 65 72 6d 2f 6e 54 65 72 6d 20 28 66 6f 72 20  Term/nTerm (for 
23380 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 29 20  internal nodes) 
23390 66 72 6f 6d 20 61 4e 6f 64 65 2f 6e 4e 6f 64 65  from aNode/nNode
233a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
233b0 66 74 73 33 54 72 75 6e 63 61 74 65 4e 6f 64 65  fts3TruncateNode
233c0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
233d0 61 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  aNode,          
233e0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e      /* Current n
233f0 6f 64 65 20 69 6d 61 67 65 20 2a 2f 0a 20 20 69  ode image */.  i
23400 6e 74 20 6e 4e 6f 64 65 2c 20 20 20 20 20 20 20  nt nNode,       
23410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23420 2a 20 53 69 7a 65 20 6f 66 20 61 4e 6f 64 65 20  * Size of aNode 
23430 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 42 6c  in bytes */.  Bl
23440 6f 62 20 2a 70 4e 65 77 2c 20 20 20 20 20 20 20  ob *pNew,       
23450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23460 20 4f 55 54 3a 20 57 72 69 74 65 20 6e 65 77 20   OUT: Write new 
23470 6e 6f 64 65 20 69 6d 61 67 65 20 68 65 72 65 20  node image here 
23480 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
23490 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  *zTerm,         
234a0 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 61 6c 6c       /* Omit all
234b0 20 74 65 72 6d 73 20 73 6d 61 6c 6c 65 72 20 74   terms smaller t
234c0 68 61 6e 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e  han this */.  in
234d0 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 20 20 20  t nTerm,        
234e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
234f0 20 53 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69   Size of zTerm i
23500 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 73 71 6c  n bytes */.  sql
23510 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 42 6c  ite3_int64 *piBl
23520 6f 63 6b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ock          /* 
23530 4f 55 54 3a 20 42 6c 6f 63 6b 20 6e 75 6d 62 65  OUT: Block numbe
23540 72 20 69 6e 20 6e 65 78 74 20 6c 61 79 65 72 20  r in next layer 
23550 64 6f 77 6e 20 2a 2f 0a 29 7b 0a 20 20 4e 6f 64  down */.){.  Nod
23560 65 52 65 61 64 65 72 20 72 65 61 64 65 72 3b 20  eReader reader; 
23570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23580 52 65 61 64 65 72 20 6f 62 6a 65 63 74 20 2a 2f  Reader object */
23590 0a 20 20 42 6c 6f 62 20 70 72 65 76 20 3d 20 7b  .  Blob prev = {
235a0 30 2c 20 30 2c 20 30 7d 3b 20 20 20 20 20 20 20  0, 0, 0};       
235b0 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 74     /* Previous t
235c0 65 72 6d 20 77 72 69 74 74 65 6e 20 74 6f 20 6e  erm written to n
235d0 65 77 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  ew node */.  int
235e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
235f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23600 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
23610 20 69 6e 74 20 62 4c 65 61 66 20 3d 20 61 4e 6f   int bLeaf = aNo
23620 64 65 5b 30 5d 3d 3d 27 5c 30 27 3b 20 20 20 20  de[0]=='\0';    
23630 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 6c   /* True for a l
23640 65 61 66 20 6e 6f 64 65 20 2a 2f 0a 0a 20 20 2f  eaf node */..  /
23650 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65 71 75 69  * Allocate requi
23660 72 65 64 20 6f 75 74 70 75 74 20 73 70 61 63 65  red output space
23670 20 2a 2f 0a 20 20 62 6c 6f 62 47 72 6f 77 42 75   */.  blobGrowBu
23680 66 66 65 72 28 70 4e 65 77 2c 20 6e 4e 6f 64 65  ffer(pNew, nNode
23690 2c 20 26 72 63 29 3b 0a 20 20 69 66 28 20 72 63  , &rc);.  if( rc
236a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
236b0 74 75 72 6e 20 72 63 3b 0a 20 20 70 4e 65 77 2d  turn rc;.  pNew-
236c0 3e 6e 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 50 6f  >n = 0;..  /* Po
236d0 70 75 6c 61 74 65 20 6e 65 77 20 6e 6f 64 65 20  pulate new node 
236e0 62 75 66 66 65 72 20 2a 2f 0a 20 20 66 6f 72 28  buffer */.  for(
236f0 72 63 20 3d 20 6e 6f 64 65 52 65 61 64 65 72 49  rc = nodeReaderI
23700 6e 69 74 28 26 72 65 61 64 65 72 2c 20 61 4e 6f  nit(&reader, aNo
23710 64 65 2c 20 6e 4e 6f 64 65 29 3b 20 0a 20 20 20  de, nNode); .   
23720 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
23730 20 26 26 20 72 65 61 64 65 72 2e 61 4e 6f 64 65   && reader.aNode
23740 3b 20 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 6f  ; .      rc = no
23750 64 65 52 65 61 64 65 72 4e 65 78 74 28 26 72 65  deReaderNext(&re
23760 61 64 65 72 29 0a 20 20 29 7b 0a 20 20 20 20 69  ader).  ){.    i
23770 66 28 20 70 4e 65 77 2d 3e 6e 3d 3d 30 20 29 7b  f( pNew->n==0 ){
23780 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d  .      int res =
23790 20 66 74 73 33 54 65 72 6d 43 6d 70 28 72 65 61   fts3TermCmp(rea
237a0 64 65 72 2e 74 65 72 6d 2e 61 2c 20 72 65 61 64  der.term.a, read
237b0 65 72 2e 74 65 72 6d 2e 6e 2c 20 7a 54 65 72 6d  er.term.n, zTerm
237c0 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , nTerm);.      
237d0 69 66 28 20 72 65 73 3c 30 20 7c 7c 20 28 62 4c  if( res<0 || (bL
237e0 65 61 66 3d 3d 30 20 26 26 20 72 65 73 3d 3d 30  eaf==0 && res==0
237f0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
23800 20 20 20 20 66 74 73 33 53 74 61 72 74 4e 6f 64      fts3StartNod
23810 65 28 70 4e 65 77 2c 20 28 69 6e 74 29 61 4e 6f  e(pNew, (int)aNo
23820 64 65 5b 30 5d 2c 20 72 65 61 64 65 72 2e 69 43  de[0], reader.iC
23830 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 2a 70 69  hild);.      *pi
23840 42 6c 6f 63 6b 20 3d 20 72 65 61 64 65 72 2e 69  Block = reader.i
23850 43 68 69 6c 64 3b 0a 20 20 20 20 7d 0a 20 20 20  Child;.    }.   
23860 20 72 63 20 3d 20 66 74 73 33 41 70 70 65 6e 64   rc = fts3Append
23870 54 6f 4e 6f 64 65 28 0a 20 20 20 20 20 20 20 20  ToNode(.        
23880 70 4e 65 77 2c 20 26 70 72 65 76 2c 20 72 65 61  pNew, &prev, rea
23890 64 65 72 2e 74 65 72 6d 2e 61 2c 20 72 65 61 64  der.term.a, read
238a0 65 72 2e 74 65 72 6d 2e 6e 2c 0a 20 20 20 20 20  er.term.n,.     
238b0 20 20 20 72 65 61 64 65 72 2e 61 44 6f 63 6c 69     reader.aDocli
238c0 73 74 2c 20 72 65 61 64 65 72 2e 6e 44 6f 63 6c  st, reader.nDocl
238d0 69 73 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ist.    );.    i
238e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
238f0 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
23900 69 66 28 20 70 4e 65 77 2d 3e 6e 3d 3d 30 20 29  if( pNew->n==0 )
23910 7b 0a 20 20 20 20 66 74 73 33 53 74 61 72 74 4e  {.    fts3StartN
23920 6f 64 65 28 70 4e 65 77 2c 20 28 69 6e 74 29 61  ode(pNew, (int)a
23930 4e 6f 64 65 5b 30 5d 2c 20 72 65 61 64 65 72 2e  Node[0], reader.
23940 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 2a 70 69  iChild);.    *pi
23950 42 6c 6f 63 6b 20 3d 20 72 65 61 64 65 72 2e 69  Block = reader.i
23960 43 68 69 6c 64 3b 0a 20 20 7d 0a 20 20 61 73 73  Child;.  }.  ass
23970 65 72 74 28 20 70 4e 65 77 2d 3e 6e 3c 3d 70 4e  ert( pNew->n<=pN
23980 65 77 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 0a 20  ew->nAlloc );.. 
23990 20 6e 6f 64 65 52 65 61 64 65 72 52 65 6c 65 61   nodeReaderRelea
239a0 73 65 28 26 72 65 61 64 65 72 29 3b 0a 20 20 73  se(&reader);.  s
239b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 72 65 76  qlite3_free(prev
239c0 2e 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  .a);.  return rc
239d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
239e0 65 20 61 6c 6c 20 74 65 72 6d 73 20 73 6d 61 6c  e all terms smal
239f0 6c 65 72 20 74 68 61 6e 20 7a 54 65 72 6d 2f 6e  ler than zTerm/n
23a00 54 65 72 6d 20 66 72 6f 6d 20 73 65 67 6d 65 6e  Term from segmen
23a10 74 20 69 49 64 78 20 69 6e 20 61 62 73 6f 6c 75  t iIdx in absolu
23a20 74 65 20 0a 2a 2a 20 6c 65 76 65 6c 20 69 41 62  te .** level iAb
23a30 73 4c 65 76 65 6c 2e 20 54 68 69 73 20 6d 61 79  sLevel. This may
23a40 20 69 6e 76 6f 6c 76 65 20 64 65 6c 65 74 69 6e   involve deletin
23a50 67 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74  g entries from t
23a60 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 0a 2a 2a  he %_segments.**
23a70 20 74 61 62 6c 65 2c 20 61 6e 64 20 6d 6f 64 69   table, and modi
23a80 66 79 69 6e 67 20 65 78 69 73 74 69 6e 67 20 65  fying existing e
23a90 6e 74 72 69 65 73 20 69 6e 20 62 6f 74 68 20 74  ntries in both t
23aa0 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 61 6e  he %_segments an
23ab0 64 20 25 5f 73 65 67 64 69 72 0a 2a 2a 20 74 61  d %_segdir.** ta
23ac0 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  bles..**.** SQLI
23ad0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
23ae0 64 20 69 66 20 74 68 65 20 73 65 67 6d 65 6e 74  d if the segment
23af0 20 69 73 20 75 70 64 61 74 65 64 20 73 75 63 63   is updated succ
23b00 65 73 73 66 75 6c 6c 79 2e 20 4f 72 20 61 6e 0a  essfully. Or an.
23b10 2a 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  ** SQLite error 
23b20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
23b30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
23b40 73 33 54 72 75 6e 63 61 74 65 53 65 67 6d 65 6e  s3TruncateSegmen
23b50 74 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  t(.  Fts3Table *
23b60 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
23b70 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62       /* FTS3 tab
23b80 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73  le handle */.  s
23b90 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 41 62  qlite3_int64 iAb
23ba0 73 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 2f  sLevel,        /
23bb0 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c  * Absolute level
23bc0 20 6f 66 20 73 65 67 6d 65 6e 74 20 74 6f 20 6d   of segment to m
23bd0 6f 64 69 66 79 20 2a 2f 0a 20 20 69 6e 74 20 69  odify */.  int i
23be0 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
23bf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
23c00 64 65 78 20 77 69 74 68 69 6e 20 6c 65 76 65 6c  dex within level
23c10 20 6f 66 20 73 65 67 6d 65 6e 74 20 74 6f 20 6d   of segment to m
23c20 6f 64 69 66 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  odify */.  const
23c30 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20   char *zTerm,   
23c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
23c50 6d 6f 76 65 20 74 65 72 6d 73 20 73 6d 61 6c 6c  move terms small
23c60 65 72 20 74 68 61 6e 20 74 68 69 73 20 2a 2f 0a  er than this */.
23c70 20 20 69 6e 74 20 6e 54 65 72 6d 20 20 20 20 20    int nTerm     
23c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c90 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
23ca0 74 65 73 20 69 6e 20 62 75 66 66 65 72 20 7a 54  tes in buffer zT
23cb0 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  erm */.){.  int 
23cc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
23cd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
23ce0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
23cf0 42 6c 6f 62 20 72 6f 6f 74 20 3d 20 7b 30 2c 30  Blob root = {0,0
23d00 2c 30 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20  ,0};            
23d10 2f 2a 20 4e 65 77 20 72 6f 6f 74 20 70 61 67 65  /* New root page
23d20 20 69 6d 61 67 65 20 2a 2f 0a 20 20 42 6c 6f 62   image */.  Blob
23d30 20 62 6c 6f 63 6b 20 3d 20 7b 30 2c 30 2c 30 7d   block = {0,0,0}
23d40 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ;           /* B
23d50 75 66 66 65 72 20 75 73 65 64 20 66 6f 72 20 61  uffer used for a
23d60 6e 79 20 6f 74 68 65 72 20 62 6c 6f 63 6b 20 2a  ny other block *
23d70 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
23d80 34 20 69 42 6c 6f 63 6b 20 3d 20 30 3b 20 20 20  4 iBlock = 0;   
23d90 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 69 64 20      /* Block id 
23da0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
23db0 36 34 20 69 4e 65 77 53 74 61 72 74 20 3d 20 30  64 iNewStart = 0
23dc0 3b 20 20 20 20 2f 2a 20 4e 65 77 20 76 61 6c 75  ;    /* New valu
23dd0 65 20 66 6f 72 20 69 53 74 61 72 74 42 6c 6f 63  e for iStartBloc
23de0 6b 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  k */.  sqlite3_i
23df0 6e 74 36 34 20 69 4f 6c 64 53 74 61 72 74 20 3d  nt64 iOldStart =
23e00 20 30 3b 20 20 20 20 2f 2a 20 4f 6c 64 20 76 61   0;    /* Old va
23e10 6c 75 65 20 66 6f 72 20 69 53 74 61 72 74 42 6c  lue for iStartBl
23e20 6f 63 6b 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ock */.  sqlite3
23e30 5f 73 74 6d 74 20 2a 70 46 65 74 63 68 20 3d 20  _stmt *pFetch = 
23e40 30 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74  0;       /* Stat
23e50 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 66 65  ement used to fe
23e60 74 63 68 20 73 65 67 64 69 72 20 2a 2f 0a 0a 20  tch segdir */.. 
23e70 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
23e80 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f  t(p, SQL_SELECT_
23e90 53 45 47 44 49 52 2c 20 26 70 46 65 74 63 68 2c  SEGDIR, &pFetch,
23ea0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
23eb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23ec0 69 6e 74 20 72 63 32 3b 20 20 20 20 20 20 20 20  int rc2;        
23ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23ee0 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29   sqlite3_reset()
23ef0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
23f00 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
23f10 5f 69 6e 74 36 34 28 70 46 65 74 63 68 2c 20 31  _int64(pFetch, 1
23f20 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20  , iAbsLevel);.  
23f30 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
23f40 6e 74 28 70 46 65 74 63 68 2c 20 32 2c 20 69 49  nt(pFetch, 2, iI
23f50 64 78 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  dx);.    if( SQL
23f60 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
23f70 5f 73 74 65 70 28 70 46 65 74 63 68 29 20 29 7b  _step(pFetch) ){
23f80 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
23f90 72 20 2a 61 52 6f 6f 74 20 3d 20 73 71 6c 69 74  r *aRoot = sqlit
23fa0 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
23fb0 46 65 74 63 68 2c 20 34 29 3b 0a 20 20 20 20 20  Fetch, 4);.     
23fc0 20 69 6e 74 20 6e 52 6f 6f 74 20 3d 20 73 71 6c   int nRoot = sql
23fd0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
23fe0 73 28 70 46 65 74 63 68 2c 20 34 29 3b 0a 20 20  s(pFetch, 4);.  
23ff0 20 20 20 20 69 4f 6c 64 53 74 61 72 74 20 3d 20      iOldStart = 
24000 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
24010 6e 74 36 34 28 70 46 65 74 63 68 2c 20 31 29 3b  nt64(pFetch, 1);
24020 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33  .      rc = fts3
24030 54 72 75 6e 63 61 74 65 4e 6f 64 65 28 61 52 6f  TruncateNode(aRo
24040 6f 74 2c 20 6e 52 6f 6f 74 2c 20 26 72 6f 6f 74  ot, nRoot, &root
24050 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , zTerm, nTerm, 
24060 26 69 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a  &iBlock);.    }.
24070 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
24080 33 5f 72 65 73 65 74 28 70 46 65 74 63 68 29 3b  3_reset(pFetch);
24090 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
240a0 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
240b0 32 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  2;.  }..  while(
240c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
240d0 26 20 69 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  & iBlock ){.    
240e0 63 68 61 72 20 2a 61 42 6c 6f 63 6b 20 3d 20 30  char *aBlock = 0
240f0 3b 0a 20 20 20 20 69 6e 74 20 6e 42 6c 6f 63 6b  ;.    int nBlock
24100 20 3d 20 30 3b 0a 20 20 20 20 69 4e 65 77 53 74   = 0;.    iNewSt
24110 61 72 74 20 3d 20 69 42 6c 6f 63 6b 3b 0a 0a 20  art = iBlock;.. 
24120 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
24130 74 73 33 52 65 61 64 42 6c 6f 63 6b 28 70 2c 20  ts3ReadBlock(p, 
24140 69 42 6c 6f 63 6b 2c 20 26 61 42 6c 6f 63 6b 2c  iBlock, &aBlock,
24150 20 26 6e 42 6c 6f 63 6b 2c 20 30 29 3b 0a 20 20   &nBlock, 0);.  
24160 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24170 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
24180 3d 20 66 74 73 33 54 72 75 6e 63 61 74 65 4e 6f  = fts3TruncateNo
24190 64 65 28 61 42 6c 6f 63 6b 2c 20 6e 42 6c 6f 63  de(aBlock, nBloc
241a0 6b 2c 20 26 62 6c 6f 63 6b 2c 20 7a 54 65 72 6d  k, &block, zTerm
241b0 2c 20 6e 54 65 72 6d 2c 20 26 69 42 6c 6f 63 6b  , nTerm, &iBlock
241c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
241d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
241e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  {.      rc = fts
241f0 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28 70 2c  3WriteSegment(p,
24200 20 69 4e 65 77 53 74 61 72 74 2c 20 62 6c 6f 63   iNewStart, bloc
24210 6b 2e 61 2c 20 62 6c 6f 63 6b 2e 6e 29 3b 0a 20  k.a, block.n);. 
24220 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
24230 5f 66 72 65 65 28 61 42 6c 6f 63 6b 29 3b 0a 20  _free(aBlock);. 
24240 20 7d 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c   }..  /* Variabl
24250 65 20 69 4e 65 77 53 74 61 72 74 20 6e 6f 77 20  e iNewStart now 
24260 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 72  contains the fir
24270 73 74 20 76 61 6c 69 64 20 6c 65 61 66 20 6e 6f  st valid leaf no
24280 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  de. */.  if( rc=
24290 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4e  =SQLITE_OK && iN
242a0 65 77 53 74 61 72 74 20 29 7b 0a 20 20 20 20 73  ewStart ){.    s
242b0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65  qlite3_stmt *pDe
242c0 6c 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  l = 0;.    rc = 
242d0 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
242e0 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 4d 45 4e  QL_DELETE_SEGMEN
242f0 54 53 5f 52 41 4e 47 45 2c 20 26 70 44 65 6c 2c  TS_RANGE, &pDel,
24300 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
24310 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24320 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
24330 5f 69 6e 74 36 34 28 70 44 65 6c 2c 20 31 2c 20  _int64(pDel, 1, 
24340 69 4f 6c 64 53 74 61 72 74 29 3b 0a 20 20 20 20  iOldStart);.    
24350 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
24360 6e 74 36 34 28 70 44 65 6c 2c 20 32 2c 20 69 4e  nt64(pDel, 2, iN
24370 65 77 53 74 61 72 74 2d 31 29 3b 0a 20 20 20 20  ewStart-1);.    
24380 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
24390 44 65 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Del);.      rc =
243a0 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
243b0 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Del);.    }.  }.
243c0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
243d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
243e0 74 65 33 5f 73 74 6d 74 20 2a 70 43 68 6f 6d 70  te3_stmt *pChomp
243f0 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 66   = 0;.    rc = f
24400 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51  ts3SqlStmt(p, SQ
24410 4c 5f 43 48 4f 4d 50 5f 53 45 47 44 49 52 2c 20  L_CHOMP_SEGDIR, 
24420 26 70 43 68 6f 6d 70 2c 20 30 29 3b 0a 20 20 20  &pChomp, 0);.   
24430 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24440 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
24450 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
24460 43 68 6f 6d 70 2c 20 31 2c 20 69 4e 65 77 53 74  Chomp, 1, iNewSt
24470 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  art);.      sqli
24480 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 43  te3_bind_blob(pC
24490 68 6f 6d 70 2c 20 32 2c 20 72 6f 6f 74 2e 61 2c  homp, 2, root.a,
244a0 20 72 6f 6f 74 2e 6e 2c 20 53 51 4c 49 54 45 5f   root.n, SQLITE_
244b0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73  STATIC);.      s
244c0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
244d0 34 28 70 43 68 6f 6d 70 2c 20 33 2c 20 69 41 62  4(pChomp, 3, iAb
244e0 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 73  sLevel);.      s
244f0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
24500 70 43 68 6f 6d 70 2c 20 34 2c 20 69 49 64 78 29  pChomp, 4, iIdx)
24510 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
24520 73 74 65 70 28 70 43 68 6f 6d 70 29 3b 0a 20 20  step(pChomp);.  
24530 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24540 5f 72 65 73 65 74 28 70 43 68 6f 6d 70 29 3b 0a  _reset(pChomp);.
24550 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c      }.  }..  sql
24560 69 74 65 33 5f 66 72 65 65 28 72 6f 6f 74 2e 61  ite3_free(root.a
24570 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
24580 65 28 62 6c 6f 63 6b 2e 61 29 3b 0a 20 20 72 65  e(block.a);.  re
24590 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
245a0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
245b0 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
245c0 61 6e 20 69 6e 63 72 6d 65 6e 74 61 6c 2d 6d 65  an incrmental-me
245d0 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 20 68 61  rge operation ha
245e0 73 20 72 75 6e 20 74 6f 0a 2a 2a 20 6d 65 72 67  s run to.** merg
245f0 65 20 28 6f 72 20 70 61 72 74 69 61 6c 6c 79 20  e (or partially 
24600 6d 65 72 67 65 29 20 74 77 6f 20 6f 72 20 6d 6f  merge) two or mo
24610 72 65 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d  re segments from
24620 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 0a   absolute level.
24630 2a 2a 20 69 41 62 73 4c 65 76 65 6c 2e 0a 2a 2a  ** iAbsLevel..**
24640 0a 2a 2a 20 45 61 63 68 20 69 6e 70 75 74 20 73  .** Each input s
24650 65 67 6d 65 6e 74 20 69 73 20 65 69 74 68 65 72  egment is either
24660 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
24670 65 20 64 62 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e db completely 
24680 28 69 66 20 61 6c 6c 20 6f 66 0a 2a 2a 20 69 74  (if all of.** it
24690 73 20 64 61 74 61 20 77 61 73 20 63 6f 70 69 65  s data was copie
246a0 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  d to the output 
246b0 73 65 67 6d 65 6e 74 20 62 79 20 74 68 65 20 69  segment by the i
246c0 6e 63 72 6d 65 72 67 65 20 6f 70 65 72 61 74 69  ncrmerge operati
246d0 6f 6e 29 0a 2a 2a 20 6f 72 20 6d 6f 64 69 66 69  on).** or modifi
246e0 65 64 20 69 6e 20 70 6c 61 63 65 20 73 6f 20 74  ed in place so t
246f0 68 61 74 20 69 74 20 6e 6f 20 6c 6f 6e 67 65 72  hat it no longer
24700 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f 73 65 20   contains those 
24710 65 6e 74 72 69 65 73 20 74 68 61 74 0a 2a 2a 20  entries that.** 
24720 68 61 76 65 20 62 65 65 6e 20 64 75 70 6c 69 63  have been duplic
24730 61 74 65 64 20 69 6e 20 74 68 65 20 6f 75 74 70  ated in the outp
24740 75 74 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73  ut segment..*/.s
24750 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e  tatic int fts3In
24760 63 72 6d 65 72 67 65 43 68 6f 6d 70 28 0a 20 20  crmergeChomp(.  
24770 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
24780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24790 2f 2a 20 46 54 53 20 74 61 62 6c 65 20 68 61 6e  /* FTS table han
247a0 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dle */.  sqlite3
247b0 5f 69 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c  _int64 iAbsLevel
247c0 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f  ,        /* Abso
247d0 6c 75 74 65 20 6c 65 76 65 6c 20 63 6f 6e 74 61  lute level conta
247e0 69 6e 69 6e 67 20 73 65 67 6d 65 6e 74 73 20 2a  ining segments *
247f0 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67  /.  Fts3MultiSeg
24800 52 65 61 64 65 72 20 2a 70 43 73 72 2c 20 20 20  Reader *pCsr,   
24810 20 20 20 20 2f 2a 20 43 68 6f 6d 70 20 61 6c 6c      /* Chomp all
24820 20 73 65 67 6d 65 6e 74 73 20 6f 70 65 6e 65 64   segments opened
24830 20 62 79 20 74 68 69 73 20 63 75 72 73 6f 72 20   by this cursor 
24840 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 52 65 6d 20  */.  int *pnRem 
24850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24860 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
24870 66 20 73 65 67 6d 65 6e 74 73 20 6e 6f 74 20 64  f segments not d
24880 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 69  eleted */.){.  i
24890 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 52 65 6d  nt i;.  int nRem
248a0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
248b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 66   SQLITE_OK;..  f
248c0 6f 72 28 69 3d 70 43 73 72 2d 3e 6e 53 65 67 6d  or(i=pCsr->nSegm
248d0 65 6e 74 2d 31 3b 20 69 3e 3d 30 20 26 26 20 72  ent-1; i>=0 && r
248e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2d  c==SQLITE_OK; i-
248f0 2d 29 7b 0a 20 20 20 20 46 74 73 33 53 65 67 52  -){.    Fts3SegR
24900 65 61 64 65 72 20 2a 70 53 65 67 20 3d 20 30 3b  eader *pSeg = 0;
24910 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 20  .    int j;..   
24920 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 46 74 73   /* Find the Fts
24930 33 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63  3SegReader objec
24940 74 20 77 69 74 68 20 46 74 73 33 53 65 67 52 65  t with Fts3SegRe
24950 61 64 65 72 2e 69 49 64 78 3d 3d 69 2e 20 49 74  ader.iIdx==i. It
24960 20 69 73 20 68 69 64 69 6e 67 0a 20 20 20 20 2a   is hiding.    *
24970 2a 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74  * somewhere in t
24980 68 65 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65  he pCsr->apSegme
24990 6e 74 5b 5d 20 61 72 72 61 79 2e 20 20 2a 2f 0a  nt[] array.  */.
249a0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 41 4c 57      for(j=0; ALW
249b0 41 59 53 28 6a 3c 70 43 73 72 2d 3e 6e 53 65 67  AYS(j<pCsr->nSeg
249c0 6d 65 6e 74 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ment); j++){.   
249d0 20 20 20 70 53 65 67 20 3d 20 70 43 73 72 2d 3e     pSeg = pCsr->
249e0 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 3b 0a 20 20  apSegment[j];.  
249f0 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 69 49      if( pSeg->iI
24a00 64 78 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20  dx==i ) break;. 
24a10 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
24a20 20 6a 3c 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e   j<pCsr->nSegmen
24a30 74 20 26 26 20 70 53 65 67 2d 3e 69 49 64 78 3d  t && pSeg->iIdx=
24a40 3d 69 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  =i );..    if( p
24a50 53 65 67 2d 3e 61 4e 6f 64 65 3d 3d 30 20 29 7b  Seg->aNode==0 ){
24a60 0a 20 20 20 20 20 20 2f 2a 20 53 65 67 2d 72 65  .      /* Seg-re
24a70 61 64 65 72 20 69 73 20 61 74 20 45 4f 46 2e 20  ader is at EOF. 
24a80 52 65 6d 6f 76 65 20 74 68 65 20 65 6e 74 69 72  Remove the entir
24a90 65 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 2e  e input segment.
24aa0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 66   */.      rc = f
24ab0 74 73 33 44 65 6c 65 74 65 53 65 67 6d 65 6e 74  ts3DeleteSegment
24ac0 28 70 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20  (p, pSeg);.     
24ad0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24ae0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
24af0 20 3d 20 66 74 73 33 52 65 6d 6f 76 65 53 65 67   = fts3RemoveSeg
24b00 64 69 72 45 6e 74 72 79 28 70 2c 20 69 41 62 73  dirEntry(p, iAbs
24b10 4c 65 76 65 6c 2c 20 70 53 65 67 2d 3e 69 49 64  Level, pSeg->iId
24b20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
24b30 20 20 2a 70 6e 52 65 6d 20 3d 20 30 3b 0a 20 20    *pnRem = 0;.  
24b40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
24b50 2a 20 54 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  * The incrementa
24b60 6c 20 6d 65 72 67 65 20 64 69 64 20 6e 6f 74 20  l merge did not 
24b70 63 6f 70 79 20 61 6c 6c 20 74 68 65 20 64 61 74  copy all the dat
24b80 61 20 66 72 6f 6d 20 74 68 69 73 20 0a 20 20 20  a from this .   
24b90 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 74 6f     ** segment to
24ba0 20 74 68 65 20 75 70 70 65 72 20 6c 65 76 65 6c   the upper level
24bb0 2e 20 54 68 65 20 73 65 67 6d 65 6e 74 20 69 73  . The segment is
24bc0 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 70 6c 61   modified in pla
24bd0 63 65 0a 20 20 20 20 20 20 2a 2a 20 73 6f 20 74  ce.      ** so t
24be0 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  hat it contains 
24bf0 6e 6f 20 6b 65 79 73 20 73 6d 61 6c 6c 65 72 20  no keys smaller 
24c00 74 68 61 6e 20 7a 54 65 72 6d 2f 6e 54 65 72 6d  than zTerm/nTerm
24c10 2e 20 2a 2f 20 0a 20 20 20 20 20 20 63 6f 6e 73  . */ .      cons
24c20 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20  t char *zTerm = 
24c30 70 53 65 67 2d 3e 7a 54 65 72 6d 3b 0a 20 20 20  pSeg->zTerm;.   
24c40 20 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70     int nTerm = p
24c50 53 65 67 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20  Seg->nTerm;.    
24c60 20 20 72 63 20 3d 20 66 74 73 33 54 72 75 6e 63    rc = fts3Trunc
24c70 61 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 69 41  ateSegment(p, iA
24c80 62 73 4c 65 76 65 6c 2c 20 70 53 65 67 2d 3e 69  bsLevel, pSeg->i
24c90 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  Idx, zTerm, nTer
24ca0 6d 29 3b 0a 20 20 20 20 20 20 6e 52 65 6d 2b 2b  m);.      nRem++
24cb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
24cc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24cd0 20 26 26 20 6e 52 65 6d 21 3d 70 43 73 72 2d 3e   && nRem!=pCsr->
24ce0 6e 53 65 67 6d 65 6e 74 20 29 7b 0a 20 20 20 20  nSegment ){.    
24cf0 72 63 20 3d 20 66 74 73 33 52 65 70 61 63 6b 53  rc = fts3RepackS
24d00 65 67 64 69 72 4c 65 76 65 6c 28 70 2c 20 69 41  egdirLevel(p, iA
24d10 62 73 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 0a 20  bsLevel);.  }.. 
24d20 20 2a 70 6e 52 65 6d 20 3d 20 6e 52 65 6d 3b 0a   *pnRem = nRem;.
24d30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24d40 2f 2a 0a 2a 2a 20 53 74 6f 72 65 20 61 6e 20 69  /*.** Store an i
24d50 6e 63 72 2d 6d 65 72 67 65 20 68 69 6e 74 20 69  ncr-merge hint i
24d60 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
24d70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
24d80 73 33 49 6e 63 72 6d 65 72 67 65 48 69 6e 74 53  s3IncrmergeHintS
24d90 74 6f 72 65 28 46 74 73 33 54 61 62 6c 65 20 2a  tore(Fts3Table *
24da0 70 2c 20 42 6c 6f 62 20 2a 70 48 69 6e 74 29 7b  p, Blob *pHint){
24db0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
24dc0 2a 70 52 65 70 6c 61 63 65 20 3d 20 30 3b 0a 20  *pReplace = 0;. 
24dd0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
24de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24df0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
24e00 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53  */..  rc = fts3S
24e10 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 52 45  qlStmt(p, SQL_RE
24e20 50 4c 41 43 45 5f 53 54 41 54 2c 20 26 70 52 65  PLACE_STAT, &pRe
24e30 70 6c 61 63 65 2c 20 30 29 3b 0a 20 20 69 66 28  place, 0);.  if(
24e40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24e50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  {.    sqlite3_bi
24e60 6e 64 5f 69 6e 74 28 70 52 65 70 6c 61 63 65 2c  nd_int(pReplace,
24e70 20 31 2c 20 46 54 53 5f 53 54 41 54 5f 49 4e 43   1, FTS_STAT_INC
24e80 52 4d 45 52 47 45 48 49 4e 54 29 3b 0a 20 20 20  RMERGEHINT);.   
24e90 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
24ea0 6f 62 28 70 52 65 70 6c 61 63 65 2c 20 32 2c 20  ob(pReplace, 2, 
24eb0 70 48 69 6e 74 2d 3e 61 2c 20 70 48 69 6e 74 2d  pHint->a, pHint-
24ec0 3e 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  >n, SQLITE_STATI
24ed0 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  C);.    sqlite3_
24ee0 73 74 65 70 28 70 52 65 70 6c 61 63 65 29 3b 0a  step(pReplace);.
24ef0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24f00 5f 72 65 73 65 74 28 70 52 65 70 6c 61 63 65 29  _reset(pReplace)
24f10 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
24f20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61  rc;.}../*.** Loa
24f30 64 20 61 6e 20 69 6e 63 72 2d 6d 65 72 67 65 20  d an incr-merge 
24f40 68 69 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61  hint from the da
24f50 74 61 62 61 73 65 2e 20 54 68 65 20 69 6e 63 72  tabase. The incr
24f60 2d 6d 65 72 67 65 20 68 69 6e 74 2c 20 69 66 20  -merge hint, if 
24f70 6f 6e 65 20 0a 2a 2a 20 65 78 69 73 74 73 2c 20  one .** exists, 
24f80 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
24f90 20 72 6f 77 69 64 3d 3d 31 20 72 6f 77 20 6f 66   rowid==1 row of
24fa0 20 74 68 65 20 25 5f 73 74 61 74 20 74 61 62 6c   the %_stat tabl
24fb0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  e..**.** If succ
24fc0 65 73 73 66 75 6c 2c 20 70 6f 70 75 6c 61 74 65  essful, populate
24fd0 20 62 6c 6f 62 20 2a 70 48 69 6e 74 20 77 69 74   blob *pHint wit
24fe0 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  h the value read
24ff0 20 66 72 6f 6d 20 74 68 65 20 25 5f 73 74 61 74   from the %_stat
25000 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 72 65  .** table and re
25010 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
25020 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e  Otherwise, if an
25030 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
25040 65 74 75 72 6e 20 61 6e 0a 2a 2a 20 53 51 4c 69  eturn an.** SQLi
25050 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
25060 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
25070 33 49 6e 63 72 6d 65 72 67 65 48 69 6e 74 4c 6f  3IncrmergeHintLo
25080 61 64 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  ad(Fts3Table *p,
25090 20 42 6c 6f 62 20 2a 70 48 69 6e 74 29 7b 0a 20   Blob *pHint){. 
250a0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
250b0 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 69 6e  Select = 0;.  in
250c0 74 20 72 63 3b 0a 0a 20 20 70 48 69 6e 74 2d 3e  t rc;..  pHint->
250d0 6e 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 66 74  n = 0;.  rc = ft
250e0 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
250f0 5f 53 45 4c 45 43 54 5f 53 54 41 54 2c 20 26 70  _SELECT_STAT, &p
25100 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66  Select, 0);.  if
25110 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25120 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
25130 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
25140 5f 69 6e 74 28 70 53 65 6c 65 63 74 2c 20 31 2c  _int(pSelect, 1,
25150 20 46 54 53 5f 53 54 41 54 5f 49 4e 43 52 4d 45   FTS_STAT_INCRME
25160 52 47 45 48 49 4e 54 29 3b 0a 20 20 20 20 69 66  RGEHINT);.    if
25170 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
25180 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65  lite3_step(pSele
25190 63 74 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ct) ){.      con
251a0 73 74 20 63 68 61 72 20 2a 61 48 69 6e 74 20 3d  st char *aHint =
251b0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
251c0 62 6c 6f 62 28 70 53 65 6c 65 63 74 2c 20 30 29  blob(pSelect, 0)
251d0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 48 69 6e  ;.      int nHin
251e0 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  t = sqlite3_colu
251f0 6d 6e 5f 62 79 74 65 73 28 70 53 65 6c 65 63 74  mn_bytes(pSelect
25200 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
25210 61 48 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  aHint ){.       
25220 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28   blobGrowBuffer(
25230 70 48 69 6e 74 2c 20 6e 48 69 6e 74 2c 20 26 72  pHint, nHint, &r
25240 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
25250 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25260 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
25270 79 28 70 48 69 6e 74 2d 3e 61 2c 20 61 48 69 6e  y(pHint->a, aHin
25280 74 2c 20 6e 48 69 6e 74 29 3b 0a 20 20 20 20 20  t, nHint);.     
25290 20 20 20 20 20 70 48 69 6e 74 2d 3e 6e 20 3d 20       pHint->n = 
252a0 6e 48 69 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d  nHint;.        }
252b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
252c0 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
252d0 5f 72 65 73 65 74 28 70 53 65 6c 65 63 74 29 3b  _reset(pSelect);
252e0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
252f0 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
25300 32 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  2;.  }..  return
25310 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
25320 20 2a 70 52 63 20 69 73 20 6e 6f 74 20 53 51 4c   *pRc is not SQL
25330 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73  ITE_OK when this
25340 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
25350 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
25360 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  op..** Otherwise
25370 2c 20 61 70 70 65 6e 64 20 61 6e 20 65 6e 74 72  , append an entr
25380 79 20 74 6f 20 74 68 65 20 68 69 6e 74 20 73 74  y to the hint st
25390 6f 72 65 64 20 69 6e 20 62 6c 6f 62 20 2a 70 48  ored in blob *pH
253a0 69 6e 74 2e 20 45 61 63 68 20 65 6e 74 72 79 0a  int. Each entry.
253b0 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  ** consists of t
253c0 77 6f 20 76 61 72 69 6e 74 73 2c 20 74 68 65 20  wo varints, the 
253d0 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 6e  absolute level n
253e0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 70  umber of the inp
253f0 75 74 20 73 65 67 6d 65 6e 74 73 20 0a 2a 2a 20  ut segments .** 
25400 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
25410 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73  f input segments
25420 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
25430 73 73 66 75 6c 2c 20 6c 65 61 76 65 20 2a 70 52  ssful, leave *pR
25440 63 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  c set to SQLITE_
25450 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 2e 20 49  OK and return. I
25460 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
25470 73 2c 0a 2a 2a 20 73 65 74 20 2a 70 52 63 20 74  s,.** set *pRc t
25480 6f 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  o an SQLite erro
25490 72 20 63 6f 64 65 20 62 65 66 6f 72 65 20 72 65  r code before re
254a0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
254b0 69 63 20 76 6f 69 64 20 66 74 73 33 49 6e 63 72  ic void fts3Incr
254c0 6d 65 72 67 65 48 69 6e 74 50 75 73 68 28 0a 20  mergeHintPush(. 
254d0 20 42 6c 6f 62 20 2a 70 48 69 6e 74 2c 20 20 20   Blob *pHint,   
254e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254f0 20 2f 2a 20 48 69 6e 74 20 62 6c 6f 62 20 74 6f   /* Hint blob to
25500 20 61 70 70 65 6e 64 20 74 6f 20 2a 2f 0a 20 20   append to */.  
25510 69 36 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 20  i64 iAbsLevel,  
25520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25530 2f 2a 20 46 69 72 73 74 20 76 61 72 69 6e 74 20  /* First varint 
25540 74 6f 20 73 74 6f 72 65 20 69 6e 20 68 69 6e 74  to store in hint
25550 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74   */.  int nInput
25560 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25570 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20        /* Second 
25580 76 61 72 69 6e 74 20 74 6f 20 73 74 6f 72 65 20  varint to store 
25590 69 6e 20 68 69 6e 74 20 2a 2f 0a 20 20 69 6e 74  in hint */.  int
255a0 20 2a 70 52 63 20 20 20 20 20 20 20 20 20 20 20   *pRc           
255b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
255c0 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f  IN/OUT: Error co
255d0 64 65 20 2a 2f 0a 29 7b 0a 20 20 62 6c 6f 62 47  de */.){.  blobG
255e0 72 6f 77 42 75 66 66 65 72 28 70 48 69 6e 74 2c  rowBuffer(pHint,
255f0 20 70 48 69 6e 74 2d 3e 6e 20 2b 20 32 2a 46 54   pHint->n + 2*FT
25600 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 2c 20 70  S3_VARINT_MAX, p
25610 52 63 29 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d  Rc);.  if( *pRc=
25620 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25630 20 20 70 48 69 6e 74 2d 3e 6e 20 2b 3d 20 73 71    pHint->n += sq
25640 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69  lite3Fts3PutVari
25650 6e 74 28 26 70 48 69 6e 74 2d 3e 61 5b 70 48 69  nt(&pHint->a[pHi
25660 6e 74 2d 3e 6e 5d 2c 20 69 41 62 73 4c 65 76 65  nt->n], iAbsLeve
25670 6c 29 3b 0a 20 20 20 20 70 48 69 6e 74 2d 3e 6e  l);.    pHint->n
25680 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50   += sqlite3Fts3P
25690 75 74 56 61 72 69 6e 74 28 26 70 48 69 6e 74 2d  utVarint(&pHint-
256a0 3e 61 5b 70 48 69 6e 74 2d 3e 6e 5d 2c 20 28 69  >a[pHint->n], (i
256b0 36 34 29 6e 49 6e 70 75 74 29 3b 0a 20 20 7d 0a  64)nInput);.  }.
256c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  }../*.** Read th
256d0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 28 6d 6f  e last entry (mo
256e0 73 74 20 72 65 63 65 6e 74 6c 79 20 70 75 73 68  st recently push
256f0 65 64 29 20 66 72 6f 6d 20 74 68 65 20 68 69 6e  ed) from the hin
25700 74 20 62 6c 6f 62 20 2a 70 48 69 6e 74 0a 2a 2a  t blob *pHint.**
25710 20 61 6e 64 20 74 68 65 6e 20 72 65 6d 6f 76 65   and then remove
25720 20 74 68 65 20 65 6e 74 72 79 2e 20 57 72 69 74   the entry. Writ
25730 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73  e the two values
25740 20 72 65 61 64 20 74 6f 20 2a 70 69 41 62 73 4c   read to *piAbsL
25750 65 76 65 6c 20 61 6e 64 20 0a 2a 2a 20 2a 70 6e  evel and .** *pn
25760 49 6e 70 75 74 20 62 65 66 6f 72 65 20 72 65 74  Input before ret
25770 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
25780 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
25790 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
257a0 4f 4b 2e 20 49 66 20 74 68 65 20 68 69 6e 74 20  OK. If the hint 
257b0 62 6c 6f 62 20 69 6e 20 2a 70 48 69 6e 74 20 64  blob in *pHint d
257c0 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61  oes.** not conta
257d0 69 6e 20 61 74 20 6c 65 61 73 74 20 74 77 6f 20  in at least two 
257e0 76 61 6c 69 64 20 76 61 72 69 6e 74 73 2c 20 72  valid varints, r
257f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
25800 52 55 50 54 5f 56 54 41 42 2e 0a 2a 2f 0a 73 74  RUPT_VTAB..*/.st
25810 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63  atic int fts3Inc
25820 72 6d 65 72 67 65 48 69 6e 74 50 6f 70 28 42 6c  rmergeHintPop(Bl
25830 6f 62 20 2a 70 48 69 6e 74 2c 20 69 36 34 20 2a  ob *pHint, i64 *
25840 70 69 41 62 73 4c 65 76 65 6c 2c 20 69 6e 74 20  piAbsLevel, int 
25850 2a 70 6e 49 6e 70 75 74 29 7b 0a 20 20 63 6f 6e  *pnInput){.  con
25860 73 74 20 69 6e 74 20 6e 48 69 6e 74 20 3d 20 70  st int nHint = p
25870 48 69 6e 74 2d 3e 6e 3b 0a 20 20 69 6e 74 20 69  Hint->n;.  int i
25880 3b 0a 0a 20 20 69 20 3d 20 70 48 69 6e 74 2d 3e  ;..  i = pHint->
25890 6e 2d 32 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e  n-2;.  while( i>
258a0 30 20 26 26 20 28 70 48 69 6e 74 2d 3e 61 5b 69  0 && (pHint->a[i
258b0 2d 31 5d 20 26 20 30 78 38 30 29 20 29 20 69 2d  -1] & 0x80) ) i-
258c0 2d 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20  -;.  while( i>0 
258d0 26 26 20 28 70 48 69 6e 74 2d 3e 61 5b 69 2d 31  && (pHint->a[i-1
258e0 5d 20 26 20 30 78 38 30 29 20 29 20 69 2d 2d 3b  ] & 0x80) ) i--;
258f0 0a 0a 20 20 70 48 69 6e 74 2d 3e 6e 20 3d 20 69  ..  pHint->n = i
25900 3b 0a 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33  ;.  i += sqlite3
25910 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 26 70  Fts3GetVarint(&p
25920 48 69 6e 74 2d 3e 61 5b 69 5d 2c 20 70 69 41 62  Hint->a[i], piAb
25930 73 4c 65 76 65 6c 29 3b 0a 20 20 69 20 2b 3d 20  sLevel);.  i += 
25940 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61  sqlite3Fts3GetVa
25950 72 69 6e 74 33 32 28 26 70 48 69 6e 74 2d 3e 61  rint32(&pHint->a
25960 5b 69 5d 2c 20 70 6e 49 6e 70 75 74 29 3b 0a 20  [i], pnInput);. 
25970 20 69 66 28 20 69 21 3d 6e 48 69 6e 74 20 29 20   if( i!=nHint ) 
25980 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
25990 52 52 55 50 54 5f 56 54 41 42 3b 0a 0a 20 20 72  RRUPT_VTAB;..  r
259a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
259b0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  .}.../*.** Attem
259c0 70 74 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  pt an incrementa
259d0 6c 20 6d 65 72 67 65 20 74 68 61 74 20 77 72 69  l merge that wri
259e0 74 65 73 20 6e 4d 65 72 67 65 20 6c 65 61 66 20  tes nMerge leaf 
259f0 62 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e  blocks..**.** In
25a00 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 73  cremental merges
25a10 20 68 61 70 70 65 6e 20 6e 4d 69 6e 20 73 65 67   happen nMin seg
25a20 6d 65 6e 74 73 20 61 74 20 61 20 74 69 6d 65 2e  ments at a time.
25a30 20 54 68 65 20 74 77 6f 0a 2a 2a 20 73 65 67 6d   The two.** segm
25a40 65 6e 74 73 20 74 6f 20 62 65 20 6d 65 72 67 65  ents to be merge
25a50 64 20 61 72 65 20 74 68 65 20 6e 4d 69 6e 20 6f  d are the nMin o
25a60 6c 64 65 73 74 20 73 65 67 6d 65 6e 74 73 20 28  ldest segments (
25a70 74 68 65 20 6f 6e 65 73 20 77 69 74 68 0a 2a 2a  the ones with.**
25a80 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 69 6e   the smallest in
25a90 64 65 78 65 73 29 20 69 6e 20 74 68 65 20 68 69  dexes) in the hi
25aa0 67 68 65 73 74 20 6c 65 76 65 6c 20 74 68 61 74  ghest level that
25ab0 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61   contains at lea
25ac0 73 74 0a 2a 2a 20 6e 4d 69 6e 20 73 65 67 6d 65  st.** nMin segme
25ad0 6e 74 73 2e 20 4d 75 6c 74 69 70 6c 65 20 6d 65  nts. Multiple me
25ae0 72 67 65 73 20 6d 69 67 68 74 20 6f 63 63 75 72  rges might occur
25af0 20 69 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 74   in an attempt t
25b00 6f 20 77 72 69 74 65 20 74 68 65 20 0a 2a 2a 20  o write the .** 
25b10 71 75 6f 74 61 20 6f 66 20 6e 4d 65 72 67 65 20  quota of nMerge 
25b20 6c 65 61 66 20 62 6c 6f 63 6b 73 2e 0a 2a 2f 0a  leaf blocks..*/.
25b30 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 49  int sqlite3Fts3I
25b40 6e 63 72 6d 65 72 67 65 28 46 74 73 33 54 61 62  ncrmerge(Fts3Tab
25b50 6c 65 20 2a 70 2c 20 69 6e 74 20 6e 4d 65 72 67  le *p, int nMerg
25b60 65 2c 20 69 6e 74 20 6e 4d 69 6e 29 7b 0a 20 20  e, int nMin){.  
25b70 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
25b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b90 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
25ba0 2f 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 6e  /.  int nRem = n
25bb0 4d 65 72 67 65 3b 20 20 20 20 20 20 20 20 20 20  Merge;          
25bc0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
25bd0 20 6c 65 61 66 20 70 61 67 65 73 20 79 65 74 20   leaf pages yet 
25be0 74 6f 20 20 62 65 20 77 72 69 74 74 65 6e 20 2a  to  be written *
25bf0 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67  /.  Fts3MultiSeg
25c00 52 65 61 64 65 72 20 2a 70 43 73 72 3b 20 20 20  Reader *pCsr;   
25c10 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 75 73      /* Cursor us
25c20 65 64 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74  ed to read input
25c30 20 64 61 74 61 20 2a 2f 0a 20 20 46 74 73 33 53   data */.  Fts3S
25c40 65 67 46 69 6c 74 65 72 20 2a 70 46 69 6c 74 65  egFilter *pFilte
25c50 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  r;         /* Fi
25c60 6c 74 65 72 20 75 73 65 64 20 77 69 74 68 20 63  lter used with c
25c70 75 72 73 6f 72 20 70 43 73 72 20 2a 2f 0a 20 20  ursor pCsr */.  
25c80 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72 20  IncrmergeWriter 
25c90 2a 70 57 72 69 74 65 72 3b 20 20 20 20 20 20 20  *pWriter;       
25ca0 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74  /* Writer object
25cb0 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d   */.  int nSeg =
25cc0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
25cd0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
25ce0 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  of input segment
25cf0 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  s */.  sqlite3_i
25d00 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c 20 3d  nt64 iAbsLevel =
25d10 20 30 3b 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75   0;    /* Absolu
25d20 74 65 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20  te level number 
25d30 74 6f 20 77 6f 72 6b 20 6f 6e 20 2a 2f 0a 20 20  to work on */.  
25d40 42 6c 6f 62 20 68 69 6e 74 20 3d 20 7b 30 2c 20  Blob hint = {0, 
25d50 30 2c 20 30 7d 3b 20 20 20 20 20 20 20 20 20 20  0, 0};          
25d60 2f 2a 20 48 69 6e 74 20 72 65 61 64 20 66 72 6f  /* Hint read fro
25d70 6d 20 25 5f 73 74 61 74 20 74 61 62 6c 65 20 2a  m %_stat table *
25d80 2f 0a 20 20 69 6e 74 20 62 44 69 72 74 79 48 69  /.  int bDirtyHi
25d90 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
25da0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 62      /* True if b
25db0 6c 6f 62 20 27 68 69 6e 74 27 20 68 61 73 20 62  lob 'hint' has b
25dc0 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a  een modified */.
25dd0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
25de0 70 61 63 65 20 66 6f 72 20 74 68 65 20 63 75 72  pace for the cur
25df0 73 6f 72 2c 20 66 69 6c 74 65 72 20 61 6e 64 20  sor, filter and 
25e00 77 72 69 74 65 72 20 6f 62 6a 65 63 74 73 20 2a  writer objects *
25e10 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 41  /.  const int nA
25e20 6c 6c 6f 63 20 3d 20 73 69 7a 65 6f 66 28 2a 70  lloc = sizeof(*p
25e30 43 73 72 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70  Csr) + sizeof(*p
25e40 46 69 6c 74 65 72 29 20 2b 20 73 69 7a 65 6f 66  Filter) + sizeof
25e50 28 2a 70 57 72 69 74 65 72 29 3b 0a 20 20 70 57  (*pWriter);.  pW
25e60 72 69 74 65 72 20 3d 20 28 49 6e 63 72 6d 65 72  riter = (Incrmer
25e70 67 65 57 72 69 74 65 72 20 2a 29 73 71 6c 69 74  geWriter *)sqlit
25e80 65 33 5f 6d 61 6c 6c 6f 63 28 6e 41 6c 6c 6f 63  e3_malloc(nAlloc
25e90 29 3b 0a 20 20 69 66 28 20 21 70 57 72 69 74 65  );.  if( !pWrite
25ea0 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  r ) return SQLIT
25eb0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 46 69 6c 74  E_NOMEM;.  pFilt
25ec0 65 72 20 3d 20 28 46 74 73 33 53 65 67 46 69 6c  er = (Fts3SegFil
25ed0 74 65 72 20 2a 29 26 70 57 72 69 74 65 72 5b 31  ter *)&pWriter[1
25ee0 5d 3b 0a 20 20 70 43 73 72 20 3d 20 28 46 74 73  ];.  pCsr = (Fts
25ef0 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20  3MultiSegReader 
25f00 2a 29 26 70 46 69 6c 74 65 72 5b 31 5d 3b 0a 0a  *)&pFilter[1];..
25f10 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72 6d    rc = fts3Incrm
25f20 65 72 67 65 48 69 6e 74 4c 6f 61 64 28 70 2c 20  ergeHintLoad(p, 
25f30 26 68 69 6e 74 29 3b 0a 20 20 77 68 69 6c 65 28  &hint);.  while(
25f40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
25f50 26 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20  & nRem>0 ){.    
25f60 63 6f 6e 73 74 20 69 36 34 20 6e 4d 6f 64 20 3d  const i64 nMod =
25f70 20 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58   FTS3_SEGDIR_MAX
25f80 4c 45 56 45 4c 20 2a 20 70 2d 3e 6e 49 6e 64 65  LEVEL * p->nInde
25f90 78 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  x;.    sqlite3_s
25fa0 74 6d 74 20 2a 70 46 69 6e 64 4c 65 76 65 6c 20  tmt *pFindLevel 
25fb0 3d 20 30 3b 20 2f 2a 20 53 51 4c 20 75 73 65 64  = 0; /* SQL used
25fc0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 41   to determine iA
25fd0 62 73 4c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69  bsLevel */.    i
25fe0 6e 74 20 62 55 73 65 48 69 6e 74 20 3d 20 30 3b  nt bUseHint = 0;
25ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26000 54 72 75 65 20 69 66 20 61 74 74 65 6d 70 74 69  True if attempti
26010 6e 67 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a  ng to append */.
26020 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74  .    /* Search t
26030 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c  he %_segdir tabl
26040 65 20 66 6f 72 20 74 68 65 20 61 62 73 6f 6c 75  e for the absolu
26050 74 65 20 6c 65 76 65 6c 20 77 69 74 68 20 74 68  te level with th
26060 65 20 73 6d 61 6c 6c 65 73 74 0a 20 20 20 20 2a  e smallest.    *
26070 2a 20 72 65 6c 61 74 69 76 65 20 6c 65 76 65 6c  * relative level
26080 20 6e 75 6d 62 65 72 20 74 68 61 74 20 63 6f 6e   number that con
26090 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6e  tains at least n
260a0 4d 69 6e 20 73 65 67 6d 65 6e 74 73 2c 20 69 66  Min segments, if
260b0 20 61 6e 79 2e 0a 20 20 20 20 2a 2a 20 49 66 20   any..    ** If 
260c0 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20 73 65  one is found, se
260d0 74 20 69 41 62 73 4c 65 76 65 6c 20 74 6f 20 74  t iAbsLevel to t
260e0 68 65 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65  he absolute leve
260f0 6c 20 6e 75 6d 62 65 72 20 61 6e 64 0a 20 20 20  l number and.   
26100 20 2a 2a 20 6e 53 65 67 20 74 6f 20 6e 4d 69 6e   ** nSeg to nMin
26110 2e 20 49 66 20 6e 6f 20 6c 65 76 65 6c 20 77 69  . If no level wi
26120 74 68 20 61 74 20 6c 65 61 73 74 20 6e 4d 69 6e  th at least nMin
26130 20 73 65 67 6d 65 6e 74 73 20 63 61 6e 20 62 65   segments can be
26140 20 66 6f 75 6e 64 2c 20 0a 20 20 20 20 2a 2a 20   found, .    ** 
26150 73 65 74 20 6e 53 65 67 20 74 6f 20 2d 31 2e 0a  set nSeg to -1..
26160 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
26170 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
26180 51 4c 5f 46 49 4e 44 5f 4d 45 52 47 45 5f 4c 45  QL_FIND_MERGE_LE
26190 56 45 4c 2c 20 26 70 46 69 6e 64 4c 65 76 65 6c  VEL, &pFindLevel
261a0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
261b0 33 5f 62 69 6e 64 5f 69 6e 74 28 70 46 69 6e 64  3_bind_int(pFind
261c0 4c 65 76 65 6c 2c 20 31 2c 20 6e 4d 69 6e 29 3b  Level, 1, nMin);
261d0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
261e0 5f 73 74 65 70 28 70 46 69 6e 64 4c 65 76 65 6c  _step(pFindLevel
261f0 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
26200 0a 20 20 20 20 20 20 69 41 62 73 4c 65 76 65 6c  .      iAbsLevel
26210 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
26220 6e 5f 69 6e 74 36 34 28 70 46 69 6e 64 4c 65 76  n_int64(pFindLev
26230 65 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 6e 53  el, 0);.      nS
26240 65 67 20 3d 20 6e 4d 69 6e 3b 0a 20 20 20 20 7d  eg = nMin;.    }
26250 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 65 67  else{.      nSeg
26260 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
26270 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
26280 73 65 74 28 70 46 69 6e 64 4c 65 76 65 6c 29 3b  set(pFindLevel);
26290 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
262a0 68 69 6e 74 20 72 65 61 64 20 66 72 6f 6d 20 74  hint read from t
262b0 68 65 20 25 5f 73 74 61 74 20 74 61 62 6c 65 20  he %_stat table 
262c0 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 63 68  is not empty, ch
262d0 65 63 6b 20 69 66 20 74 68 65 0a 20 20 20 20 2a  eck if the.    *
262e0 2a 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  * last entry in 
262f0 69 74 20 73 70 65 63 69 66 69 65 73 20 61 20 72  it specifies a r
26300 65 6c 61 74 69 76 65 20 6c 65 76 65 6c 20 73 6d  elative level sm
26310 61 6c 6c 65 72 20 74 68 61 6e 20 6f 72 20 65 71  aller than or eq
26320 75 61 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  ual.    ** to th
26330 65 20 6c 65 76 65 6c 20 69 64 65 6e 74 69 66 69  e level identifi
26340 65 64 20 62 79 20 74 68 65 20 62 6c 6f 63 6b 20  ed by the block 
26350 61 62 6f 76 65 20 28 69 66 20 61 6e 79 29 2e 20  above (if any). 
26360 49 66 20 73 6f 2c 20 74 68 69 73 20 0a 20 20 20  If so, this .   
26370 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20 6f 66   ** iteration of
26380 20 74 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 77   the loop will w
26390 6f 72 6b 20 6f 6e 20 6d 65 72 67 69 6e 67 20 61  ork on merging a
263a0 74 20 74 68 65 20 68 69 6e 74 65 64 20 6c 65 76  t the hinted lev
263b0 65 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  el..    */.    i
263c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
263d0 20 26 26 20 68 69 6e 74 2e 6e 20 29 7b 0a 20 20   && hint.n ){.  
263e0 20 20 20 20 69 6e 74 20 6e 48 69 6e 74 20 3d 20      int nHint = 
263f0 68 69 6e 74 2e 6e 3b 0a 20 20 20 20 20 20 73 71  hint.n;.      sq
26400 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 48 69 6e  lite3_int64 iHin
26410 74 41 62 73 4c 65 76 65 6c 20 3d 20 30 3b 20 20  tAbsLevel = 0;  
26420 20 20 20 20 2f 2a 20 48 69 6e 74 20 6c 65 76 65      /* Hint leve
26430 6c 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  l */.      int n
26440 48 69 6e 74 53 65 67 20 3d 20 30 3b 20 20 20 20  HintSeg = 0;    
26450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26460 20 2f 2a 20 48 69 6e 74 20 6e 75 6d 62 65 72 20   /* Hint number 
26470 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a  of segments */..
26480 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 49        rc = fts3I
26490 6e 63 72 6d 65 72 67 65 48 69 6e 74 50 6f 70 28  ncrmergeHintPop(
264a0 26 68 69 6e 74 2c 20 26 69 48 69 6e 74 41 62 73  &hint, &iHintAbs
264b0 4c 65 76 65 6c 2c 20 26 6e 48 69 6e 74 53 65 67  Level, &nHintSeg
264c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 53 65  );.      if( nSe
264d0 67 3c 30 20 7c 7c 20 28 69 41 62 73 4c 65 76 65  g<0 || (iAbsLeve
264e0 6c 20 25 20 6e 4d 6f 64 29 20 3e 3d 20 28 69 48  l % nMod) >= (iH
264f0 69 6e 74 41 62 73 4c 65 76 65 6c 20 25 20 6e 4d  intAbsLevel % nM
26500 6f 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  od) ){.        i
26510 41 62 73 4c 65 76 65 6c 20 3d 20 69 48 69 6e 74  AbsLevel = iHint
26520 41 62 73 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20  AbsLevel;.      
26530 20 20 6e 53 65 67 20 3d 20 6e 48 69 6e 74 53 65    nSeg = nHintSe
26540 67 3b 0a 20 20 20 20 20 20 20 20 62 55 73 65 48  g;.        bUseH
26550 69 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  int = 1;.       
26560 20 62 44 69 72 74 79 48 69 6e 74 20 3d 20 31 3b   bDirtyHint = 1;
26570 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
26580 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 75 6e        /* This un
26590 64 6f 65 73 20 74 68 65 20 65 66 66 65 63 74 20  does the effect 
265a0 6f 66 20 74 68 65 20 48 69 6e 74 50 6f 70 28 29  of the HintPop()
265b0 20 61 62 6f 76 65 20 2d 20 73 6f 20 74 68 61 74   above - so that
265c0 20 6e 6f 20 65 6e 74 72 79 0a 20 20 20 20 20 20   no entry.      
265d0 20 20 2a 2a 20 69 73 20 72 65 6d 6f 76 65 64 20    ** is removed 
265e0 66 72 6f 6d 20 74 68 65 20 68 69 6e 74 20 62 6c  from the hint bl
265f0 6f 62 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ob.  */.        
26600 68 69 6e 74 2e 6e 20 3d 20 6e 48 69 6e 74 3b 0a  hint.n = nHint;.
26610 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
26620 20 20 20 2f 2a 20 49 66 20 6e 53 65 67 20 69 73     /* If nSeg is
26630 20 6c 65 73 73 20 74 68 61 74 20 7a 65 72 6f 2c   less that zero,
26640 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
26650 6f 20 6c 65 76 65 6c 20 77 69 74 68 20 61 74 20  o level with at 
26660 6c 65 61 73 74 0a 20 20 20 20 2a 2a 20 6e 4d 69  least.    ** nMi
26670 6e 20 73 65 67 6d 65 6e 74 73 20 61 6e 64 20 6e  n segments and n
26680 6f 20 68 69 6e 74 20 69 6e 20 74 68 65 20 25 5f  o hint in the %_
26690 73 74 61 74 20 74 61 62 6c 65 2e 20 4e 6f 20 77  stat table. No w
266a0 6f 72 6b 20 74 6f 20 64 6f 2e 0a 20 20 20 20 2a  ork to do..    *
266b0 2a 20 45 78 69 74 20 65 61 72 6c 79 20 69 6e 20  * Exit early in 
266c0 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20  this case.  */. 
266d0 20 20 20 69 66 28 20 6e 53 65 67 3c 30 20 29 20     if( nSeg<0 ) 
266e0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 4f  break;..    /* O
266f0 70 65 6e 20 61 20 63 75 72 73 6f 72 20 74 6f 20  pen a cursor to 
26700 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
26710 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
26720 74 68 65 20 6f 6c 64 65 73 74 20 6e 53 65 67 20  the oldest nSeg 
26730 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 65 73 20  .    ** indexes 
26740 6f 66 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65  of absolute leve
26750 6c 20 69 41 62 73 4c 65 76 65 6c 2e 20 49 66 20  l iAbsLevel. If 
26760 74 68 69 73 20 63 75 72 73 6f 72 20 69 73 20 6f  this cursor is o
26770 70 65 6e 65 64 20 75 73 69 6e 67 20 0a 20 20 20  pened using .   
26780 20 2a 2a 20 74 68 65 20 27 68 69 6e 74 27 20 70   ** the 'hint' p
26790 61 72 61 6d 65 74 65 72 73 2c 20 69 74 20 69 73  arameters, it is
267a0 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 74   possible that t
267b0 68 65 72 65 20 61 72 65 20 6c 65 73 73 20 74 68  here are less th
267c0 61 6e 20 6e 53 65 67 0a 20 20 20 20 2a 2a 20 73  an nSeg.    ** s
267d0 65 67 6d 65 6e 74 73 20 61 76 61 69 6c 61 62 6c  egments availabl
267e0 65 20 69 6e 20 6c 65 76 65 6c 20 69 41 62 73 4c  e in level iAbsL
267f0 65 76 65 6c 2e 20 49 6e 20 74 68 69 73 20 63 61  evel. In this ca
26800 73 65 2c 20 6e 6f 20 77 6f 72 6b 20 69 73 0a 20  se, no work is. 
26810 20 20 20 2a 2a 20 64 6f 6e 65 20 6f 6e 20 69 41     ** done on iA
26820 62 73 4c 65 76 65 6c 20 2d 20 66 61 6c 6c 20 74  bsLevel - fall t
26830 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65  hrough to the ne
26840 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
26850 74 68 65 20 6c 6f 6f 70 20 0a 20 20 20 20 2a 2a  the loop .    **
26860 20 74 6f 20 73 74 61 72 74 20 77 6f 72 6b 20 6f   to start work o
26870 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 6c 65 76  n some other lev
26880 65 6c 2e 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  el.  */.    mems
26890 65 74 28 70 57 72 69 74 65 72 2c 20 30 2c 20 6e  et(pWriter, 0, n
268a0 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 70 46 69 6c  Alloc);.    pFil
268b0 74 65 72 2d 3e 66 6c 61 67 73 20 3d 20 46 54 53  ter->flags = FTS
268c0 33 5f 53 45 47 4d 45 4e 54 5f 52 45 51 55 49 52  3_SEGMENT_REQUIR
268d0 45 5f 50 4f 53 3b 0a 20 20 20 20 69 66 28 20 72  E_POS;.    if( r
268e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
268f0 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 49        rc = fts3I
26900 6e 63 72 6d 65 72 67 65 43 73 72 28 70 2c 20 69  ncrmergeCsr(p, i
26910 41 62 73 4c 65 76 65 6c 2c 20 6e 53 65 67 2c 20  AbsLevel, nSeg, 
26920 70 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pCsr);.    }.   
26930 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
26940 72 63 20 26 26 20 70 43 73 72 2d 3e 6e 53 65 67  rc && pCsr->nSeg
26950 6d 65 6e 74 3d 3d 6e 53 65 67 0a 20 20 20 20 20  ment==nSeg.     
26960 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  && SQLITE_OK==(r
26970 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53  c = sqlite3Fts3S
26980 65 67 52 65 61 64 65 72 53 74 61 72 74 28 70 2c  egReaderStart(p,
26990 20 70 43 73 72 2c 20 70 46 69 6c 74 65 72 29 29   pCsr, pFilter))
269a0 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f  .     && SQLITE_
269b0 52 4f 57 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74  ROW==(rc = sqlit
269c0 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 53  e3Fts3SegReaderS
269d0 74 65 70 28 70 2c 20 70 43 73 72 29 29 0a 20 20  tep(p, pCsr)).  
269e0 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69    ){.      int i
269f0 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Idx = 0;        
26a00 20 20 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73         /* Larges
26a10 74 20 69 64 78 20 69 6e 20 6c 65 76 65 6c 20 28  t idx in level (
26a20 69 41 62 73 4c 65 76 65 6c 2b 31 29 20 2a 2f 0a  iAbsLevel+1) */.
26a30 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 49        rc = fts3I
26a40 6e 63 72 6d 65 72 67 65 4f 75 74 70 75 74 49 64  ncrmergeOutputId
26a50 78 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 2c 20  x(p, iAbsLevel, 
26a60 26 69 49 64 78 29 3b 0a 20 20 20 20 20 20 69 66  &iIdx);.      if
26a70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26a80 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  ){.        if( b
26a90 55 73 65 48 69 6e 74 20 26 26 20 69 49 64 78 3e  UseHint && iIdx>
26aa0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
26ab0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 20  onst char *zKey 
26ac0 3d 20 70 43 73 72 2d 3e 7a 54 65 72 6d 3b 0a 20  = pCsr->zTerm;. 
26ad0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4b 65           int nKe
26ae0 79 20 3d 20 70 43 73 72 2d 3e 6e 54 65 72 6d 3b  y = pCsr->nTerm;
26af0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
26b00 66 74 73 33 49 6e 63 72 6d 65 72 67 65 4c 6f 61  fts3IncrmergeLoa
26b10 64 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 2c 20  d(p, iAbsLevel, 
26b20 69 49 64 78 2d 31 2c 20 7a 4b 65 79 2c 20 6e 4b  iIdx-1, zKey, nK
26b30 65 79 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  ey, pWriter);.  
26b40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26b50 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33         rc = fts3
26b60 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72 28  IncrmergeWriter(
26b70 70 2c 20 69 41 62 73 4c 65 76 65 6c 2c 20 69 49  p, iAbsLevel, iI
26b80 64 78 2c 20 70 43 73 72 2c 20 70 57 72 69 74 65  dx, pCsr, pWrite
26b90 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
26ba0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
26bb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
26bc0 26 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66  & pWriter->nLeaf
26bd0 45 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66  Est ){.        f
26be0 74 73 33 4c 6f 67 4d 65 72 67 65 28 6e 53 65 67  ts3LogMerge(nSeg
26bf0 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20  , iAbsLevel);.  
26c00 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20        do {.     
26c10 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e       rc = fts3In
26c20 63 72 6d 65 72 67 65 41 70 70 65 6e 64 28 70 2c  crmergeAppend(p,
26c30 20 70 57 72 69 74 65 72 2c 20 70 43 73 72 29 3b   pWriter, pCsr);
26c40 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
26c50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
26c60 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53  c = sqlite3Fts3S
26c70 65 67 52 65 61 64 65 72 53 74 65 70 28 70 2c 20  egReaderStep(p, 
26c80 70 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20 20  pCsr);.         
26c90 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 6e 57   if( pWriter->nW
26ca0 6f 72 6b 3e 3d 6e 52 65 6d 20 26 26 20 72 63 3d  ork>=nRem && rc=
26cb0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 20 72 63  =SQLITE_ROW ) rc
26cc0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
26cd0 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63        }while( rc
26ce0 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 3b 0a  ==SQLITE_ROW );.
26cf0 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 70 64 61  .        /* Upda
26d00 74 65 20 6f 72 20 64 65 6c 65 74 65 20 74 68 65  te or delete the
26d10 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
26d20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  */.        if( r
26d30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26d40 20 20 20 20 20 20 20 20 20 20 6e 52 65 6d 20 2d            nRem -
26d50 3d 20 28 31 20 2b 20 70 57 72 69 74 65 72 2d 3e  = (1 + pWriter->
26d60 6e 57 6f 72 6b 29 3b 0a 20 20 20 20 20 20 20 20  nWork);.        
26d70 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72 6d    rc = fts3Incrm
26d80 65 72 67 65 43 68 6f 6d 70 28 70 2c 20 69 41 62  ergeChomp(p, iAb
26d90 73 4c 65 76 65 6c 2c 20 70 43 73 72 2c 20 26 6e  sLevel, pCsr, &n
26da0 53 65 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Seg);.          
26db0 69 66 28 20 6e 53 65 67 21 3d 30 20 29 7b 0a 20  if( nSeg!=0 ){. 
26dc0 20 20 20 20 20 20 20 20 20 20 20 62 44 69 72 74             bDirt
26dd0 79 48 69 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20  yHint = 1;.     
26de0 20 20 20 20 20 20 20 66 74 73 33 49 6e 63 72 6d         fts3Incrm
26df0 65 72 67 65 48 69 6e 74 50 75 73 68 28 26 68 69  ergeHintPush(&hi
26e00 6e 74 2c 20 69 41 62 73 4c 65 76 65 6c 2c 20 6e  nt, iAbsLevel, n
26e10 53 65 67 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  Seg, &rc);.     
26e20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
26e30 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
26e40 66 74 73 33 49 6e 63 72 6d 65 72 67 65 52 65 6c  fts3IncrmergeRel
26e50 65 61 73 65 28 70 2c 20 70 57 72 69 74 65 72 2c  ease(p, pWriter,
26e60 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   &rc);.    }..  
26e70 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67    sqlite3Fts3Seg
26e80 52 65 61 64 65 72 46 69 6e 69 73 68 28 70 43 73  ReaderFinish(pCs
26e90 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72  r);.  }..  /* Wr
26ea0 69 74 65 20 74 68 65 20 68 69 6e 74 20 76 61 6c  ite the hint val
26eb0 75 65 73 20 69 6e 74 6f 20 74 68 65 20 25 5f 73  ues into the %_s
26ec0 74 61 74 20 74 61 62 6c 65 20 66 6f 72 20 74 68  tat table for th
26ed0 65 20 6e 65 78 74 20 69 6e 63 72 2d 6d 65 72 67  e next incr-merg
26ee0 65 72 20 2a 2f 0a 20 20 69 66 28 20 62 44 69 72  er */.  if( bDir
26ef0 74 79 48 69 6e 74 20 26 26 20 72 63 3d 3d 53 51  tyHint && rc==SQ
26f00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
26f10 63 20 3d 20 66 74 73 33 49 6e 63 72 6d 65 72 67  c = fts3Incrmerg
26f20 65 48 69 6e 74 53 74 6f 72 65 28 70 2c 20 26 68  eHintStore(p, &h
26f30 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  int);.  }..  sql
26f40 69 74 65 33 5f 66 72 65 65 28 70 57 72 69 74 65  ite3_free(pWrite
26f50 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  r);.  sqlite3_fr
26f60 65 65 28 68 69 6e 74 2e 61 29 3b 0a 20 20 72 65  ee(hint.a);.  re
26f70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
26f80 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 74 65  * Convert the te
26f90 78 74 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  xt beginning at 
26fa0 2a 70 7a 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65  *pz into an inte
26fb0 67 65 72 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ger and return.*
26fc0 2a 20 69 74 73 20 76 61 6c 75 65 2e 20 20 41 64  * its value.  Ad
26fd0 76 61 6e 63 65 20 2a 70 7a 20 74 6f 20 70 6f 69  vance *pz to poi
26fe0 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  nt to the first 
26ff0 63 68 61 72 61 63 74 65 72 20 70 61 73 74 0a 2a  character past.*
27000 2a 20 74 68 65 20 69 6e 74 65 67 65 72 2e 0a 2a  * the integer..*
27010 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
27020 33 47 65 74 69 6e 74 28 63 6f 6e 73 74 20 63 68  3Getint(const ch
27030 61 72 20 2a 2a 70 7a 29 7b 0a 20 20 63 6f 6e 73  ar **pz){.  cons
27040 74 20 63 68 61 72 20 2a 7a 20 3d 20 2a 70 7a 3b  t char *z = *pz;
27050 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
27060 77 68 69 6c 65 28 20 28 2a 7a 29 3e 3d 27 30 27  while( (*z)>='0'
27070 20 26 26 20 28 2a 7a 29 3c 3d 27 39 27 20 29 20   && (*z)<='9' ) 
27080 69 20 3d 20 31 30 2a 69 20 2b 20 2a 28 7a 2b 2b  i = 10*i + *(z++
27090 29 20 2d 20 27 30 27 3b 0a 20 20 2a 70 7a 20 3d  ) - '0';.  *pz =
270a0 20 7a 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a   z;.  return i;.
270b0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73  }../*.** Process
270c0 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 66 20 74   statements of t
270d0 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
270e0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 61    INSERT INTO ta
270f0 62 6c 65 28 74 61 62 6c 65 29 20 56 41 4c 55 45  ble(table) VALUE
27100 53 28 27 6d 65 72 67 65 3d 41 2c 42 27 29 3b 0a  S('merge=A,B');.
27110 2a 2a 0a 2a 2a 20 41 20 61 6e 64 20 42 20 61 72  **.** A and B ar
27120 65 20 69 6e 74 65 67 65 72 73 20 74 68 61 74 20  e integers that 
27130 64 65 63 6f 64 65 20 74 6f 20 62 65 20 74 68 65  decode to be the
27140 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   number of leaf 
27150 70 61 67 65 73 0a 2a 2a 20 77 72 69 74 74 65 6e  pages.** written
27160 20 66 6f 72 20 74 68 65 20 6d 65 72 67 65 2c 20   for the merge, 
27170 61 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20  and the minimum 
27180 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e  number of segmen
27190 74 73 20 6f 6e 20 61 20 6c 65 76 65 6c 0a 2a 2a  ts on a level.**
271a0 20 62 65 66 6f 72 65 20 69 74 20 77 69 6c 6c 20   before it will 
271b0 62 65 20 73 65 6c 65 63 74 65 64 20 66 6f 72 20  be selected for 
271c0 61 20 6d 65 72 67 65 2c 20 72 65 73 70 65 63 74  a merge, respect
271d0 69 76 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ively..*/.static
271e0 20 69 6e 74 20 66 74 73 33 44 6f 49 6e 63 72 6d   int fts3DoIncrm
271f0 65 72 67 65 28 0a 20 20 46 74 73 33 54 61 62 6c  erge(.  Fts3Tabl
27200 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
27210 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20          /* FTS3 
27220 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
27230 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
27240 61 72 61 6d 20 20 20 20 20 20 20 20 20 20 20 20  aram            
27250 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61    /* Nul-termina
27260 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  ted string conta
27270 69 6e 69 6e 67 20 22 41 2c 42 22 20 2a 2f 0a 29  ining "A,B" */.)
27280 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
27290 74 20 6e 4d 69 6e 20 3d 20 28 46 54 53 33 5f 4d  t nMin = (FTS3_M
272a0 45 52 47 45 5f 43 4f 55 4e 54 20 2f 20 32 29 3b  ERGE_COUNT / 2);
272b0 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 20 3d 20  .  int nMerge = 
272c0 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  0;.  const char 
272d0 2a 7a 20 3d 20 7a 50 61 72 61 6d 3b 0a 0a 20 20  *z = zParam;..  
272e0 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73  /* Read the firs
272f0 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  t integer value 
27300 2a 2f 0a 20 20 6e 4d 65 72 67 65 20 3d 20 66 74  */.  nMerge = ft
27310 73 33 47 65 74 69 6e 74 28 26 7a 29 3b 0a 0a 20  s3Getint(&z);.. 
27320 20 2f 2a 20 49 66 20 74 68 65 20 66 69 72 73 74   /* If the first
27330 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 69   integer value i
27340 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20  s followed by a 
27350 27 2c 27 2c 20 20 72 65 61 64 20 74 68 65 20 73  ',',  read the s
27360 65 63 6f 6e 64 0a 20 20 2a 2a 20 69 6e 74 65 67  econd.  ** integ
27370 65 72 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 69  er value. */.  i
27380 66 28 20 7a 5b 30 5d 3d 3d 27 2c 27 20 26 26 20  f( z[0]==',' && 
27390 7a 5b 31 5d 21 3d 27 5c 30 27 20 29 7b 0a 20 20  z[1]!='\0' ){.  
273a0 20 20 7a 2b 2b 3b 0a 20 20 20 20 6e 4d 69 6e 20    z++;.    nMin 
273b0 3d 20 66 74 73 33 47 65 74 69 6e 74 28 26 7a 29  = fts3Getint(&z)
273c0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 5b 30  ;.  }..  if( z[0
273d0 5d 21 3d 27 5c 30 27 20 7c 7c 20 6e 4d 69 6e 3c  ]!='\0' || nMin<
273e0 32 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  2 ){.    rc = SQ
273f0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65  LITE_ERROR;.  }e
27400 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
27410 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 66 28  LITE_OK;.    if(
27420 20 21 70 2d 3e 62 48 61 73 53 74 61 74 20 29 7b   !p->bHasStat ){
27430 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
27440 2d 3e 62 46 74 73 34 3d 3d 30 20 29 3b 0a 20 20  ->bFts4==0 );.  
27450 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 43      sqlite3Fts3C
27460 72 65 61 74 65 53 74 61 74 54 61 62 6c 65 28 26  reateStatTable(&
27470 72 63 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20  rc, p);.    }.  
27480 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27490 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
274a0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 63  = sqlite3Fts3Inc
274b0 72 6d 65 72 67 65 28 70 2c 20 6e 4d 65 72 67 65  rmerge(p, nMerge
274c0 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 7d 0a 20  , nMin);.    }. 
274d0 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65     sqlite3Fts3Se
274e0 67 6d 65 6e 74 73 43 6c 6f 73 65 28 70 29 3b 0a  gmentsClose(p);.
274f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
27500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73  .}../*.** Proces
27510 73 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 66 20  s statements of 
27520 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
27530 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
27540 61 62 6c 65 28 74 61 62 6c 65 29 20 56 41 4c 55  able(table) VALU
27550 45 53 28 27 61 75 74 6f 6d 65 72 67 65 3d 58 27  ES('automerge=X'
27560 29 3b 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 58  );.**.** where X
27570 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20   is an integer. 
27580 20 58 3d 3d 30 20 6d 65 61 6e 73 20 74 6f 20 74   X==0 means to t
27590 75 72 6e 20 61 75 74 6f 6d 65 72 67 65 20 6f 66  urn automerge of
275a0 66 2e 20 20 58 21 3d 30 20 6d 65 61 6e 73 0a 2a  f.  X!=0 means.*
275b0 2a 20 74 75 72 6e 20 69 74 20 6f 6e 2e 20 20 54  * turn it on.  T
275c0 68 65 20 73 65 74 74 69 6e 67 20 69 73 20 70 65  he setting is pe
275d0 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 73 74 61  rsistent..*/.sta
275e0 74 69 63 20 69 6e 74 20 66 74 73 33 44 6f 41 75  tic int fts3DoAu
275f0 74 6f 69 6e 63 72 6d 65 72 67 65 28 0a 20 20 46  toincrmerge(.  F
27600 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
27610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27620 2a 20 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e  * FTS3 table han
27630 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dle */.  const c
27640 68 61 72 20 2a 7a 50 61 72 61 6d 20 20 20 20 20  har *zParam     
27650 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d           /* Nul-
27660 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
27670 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 62 6f 6f  g containing boo
27680 6c 65 61 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lean */.){.  int
27690 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
276a0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
276b0 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 2d  *pStmt = 0;.  p-
276c0 3e 62 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 20  >bAutoincrmerge 
276d0 3d 20 66 74 73 33 47 65 74 69 6e 74 28 26 7a 50  = fts3Getint(&zP
276e0 61 72 61 6d 29 21 3d 30 3b 0a 20 20 69 66 28 20  aram)!=0;.  if( 
276f0 21 70 2d 3e 62 48 61 73 53 74 61 74 20 29 7b 0a  !p->bHasStat ){.
27700 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62      assert( p->b
27710 46 74 73 34 3d 3d 30 20 29 3b 0a 20 20 20 20 73  Fts4==0 );.    s
27720 71 6c 69 74 65 33 46 74 73 33 43 72 65 61 74 65  qlite3Fts3Create
27730 53 74 61 74 54 61 62 6c 65 28 26 72 63 2c 20 70  StatTable(&rc, p
27740 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
27750 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
27760 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
27770 74 28 70 2c 20 53 51 4c 5f 52 45 50 4c 41 43 45  t(p, SQL_REPLACE
27780 5f 53 54 41 54 2c 20 26 70 53 74 6d 74 2c 20 30  _STAT, &pStmt, 0
27790 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
277a0 74 75 72 6e 20 72 63 3b 3b 0a 20 20 73 71 6c 69  turn rc;;.  sqli
277b0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74  te3_bind_int(pSt
277c0 6d 74 2c 20 31 2c 20 46 54 53 5f 53 54 41 54 5f  mt, 1, FTS_STAT_
277d0 41 55 54 4f 49 4e 43 52 4d 45 52 47 45 29 3b 0a  AUTOINCRMERGE);.
277e0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
277f0 6e 74 28 70 53 74 6d 74 2c 20 32 2c 20 70 2d 3e  nt(pStmt, 2, p->
27800 62 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 29 3b  bAutoincrmerge);
27810 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  .  sqlite3_step(
27820 70 53 74 6d 74 29 3b 0a 20 20 72 63 20 3d 20 73  pStmt);.  rc = s
27830 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
27840 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  mt);.  return rc
27850 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
27860 6e 20 61 20 36 34 2d 62 69 74 20 63 68 65 63 6b  n a 64-bit check
27870 73 75 6d 20 66 6f 72 20 74 68 65 20 46 54 53 20  sum for the FTS 
27880 69 6e 64 65 78 20 65 6e 74 72 79 20 73 70 65 63  index entry spec
27890 69 66 69 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  ified by the.** 
278a0 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 69  arguments to thi
278b0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  s function..*/.s
278c0 74 61 74 69 63 20 75 36 34 20 66 74 73 33 43 68  tatic u64 fts3Ch
278d0 65 63 6b 73 75 6d 45 6e 74 72 79 28 0a 20 20 63  ecksumEntry(.  c
278e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
278f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
27900 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
27910 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
27920 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  erm */.  int nTe
27930 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
27940 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
27950 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62 79 74   of zTerm in byt
27960 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e  es */.  int iLan
27970 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  gid,            
27980 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75          /* Langu
27990 61 67 65 20 69 64 20 66 6f 72 20 63 75 72 72 65  age id for curre
279a0 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20  nt row */.  int 
279b0 69 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20  iIndex,         
279c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
279d0 6e 64 65 78 20 28 30 2e 2e 46 74 73 33 54 61 62  ndex (0..Fts3Tab
279e0 6c 65 2e 6e 49 6e 64 65 78 2d 31 29 20 2a 2f 0a  le.nIndex-1) */.
279f0 20 20 69 36 34 20 69 44 6f 63 69 64 2c 20 20 20    i64 iDocid,   
27a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a10 20 20 2f 2a 20 44 6f 63 69 64 20 66 6f 72 20 63    /* Docid for c
27a20 75 72 72 65 6e 74 20 72 6f 77 2e 20 2a 2f 0a 20  urrent row. */. 
27a30 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20   int iCol,      
27a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a50 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
27a60 72 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 20  r */.  int iPos 
27a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a80 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69         /* Positi
27a90 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  on */.){.  int i
27aa0 3b 0a 20 20 75 36 34 20 72 65 74 20 3d 20 28 75  ;.  u64 ret = (u
27ab0 36 34 29 69 44 6f 63 69 64 3b 0a 0a 20 20 72 65  64)iDocid;..  re
27ac0 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20  t += (ret<<3) + 
27ad0 69 4c 61 6e 67 69 64 3b 0a 20 20 72 65 74 20 2b  iLangid;.  ret +
27ae0 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 49 6e  = (ret<<3) + iIn
27af0 64 65 78 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72  dex;.  ret += (r
27b00 65 74 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a 20  et<<3) + iCol;. 
27b10 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29   ret += (ret<<3)
27b20 20 2b 20 69 50 6f 73 3b 0a 20 20 66 6f 72 28 69   + iPos;.  for(i
27b30 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b  =0; i<nTerm; i++
27b40 29 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33  ) ret += (ret<<3
27b50 29 20 2b 20 7a 54 65 72 6d 5b 69 5d 3b 0a 0a 20  ) + zTerm[i];.. 
27b60 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
27b70 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 63  /*.** Return a c
27b80 68 65 63 6b 73 75 6d 20 6f 66 20 61 6c 6c 20 65  hecksum of all e
27b90 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 46 54  ntries in the FT
27ba0 53 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 72  S index that cor
27bb0 72 65 73 70 6f 6e 64 20 74 6f 0a 2a 2a 20 6c 61  respond to.** la
27bc0 6e 67 75 61 67 65 20 69 64 20 69 4c 61 6e 67 69  nguage id iLangi
27bd0 64 2e 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20  d. The checksum 
27be0 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62 79  is calculated by
27bf0 20 58 4f 52 69 6e 67 20 74 68 65 20 63 68 65 63   XORing the chec
27c00 6b 73 75 6d 73 0a 2a 2a 20 6f 66 20 65 61 63 68  ksums.** of each
27c10 20 69 6e 64 69 76 69 64 75 61 6c 20 65 6e 74 72   individual entr
27c20 79 20 28 73 65 65 20 66 74 73 33 43 68 65 63 6b  y (see fts3Check
27c30 73 75 6d 45 6e 74 72 79 28 29 29 20 74 6f 67 65  sumEntry()) toge
27c40 74 68 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ther..**.** If s
27c50 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65 20 63  uccessful, the c
27c60 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 69 73  hecksum value is
27c70 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
27c80 52 63 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  Rc set to SQLITE
27c90 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  _OK..** Otherwis
27ca0 65 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  e, if an error o
27cb0 63 63 75 72 73 2c 20 2a 70 52 63 20 69 73 20 73  ccurs, *pRc is s
27cc0 65 74 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20  et to an SQLite 
27cd0 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 0a  error code. The.
27ce0 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
27cf0 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  is undefined in 
27d00 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74  this case..*/.st
27d10 61 74 69 63 20 75 36 34 20 66 74 73 33 43 68 65  atic u64 fts3Che
27d20 63 6b 73 75 6d 49 6e 64 65 78 28 0a 20 20 46 74  cksumIndex(.  Ft
27d30 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
27d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27d50 20 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64   FTS3 table hand
27d60 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e  le */.  int iLan
27d70 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  gid,            
27d80 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75          /* Langu
27d90 61 67 65 20 69 64 20 74 6f 20 72 65 74 75 72 6e  age id to return
27da0 20 63 6b 73 75 6d 20 66 6f 72 20 2a 2f 0a 20 20   cksum for */.  
27db0 69 6e 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20  int iIndex,     
27dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27dd0 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63 6b 73 75  /* Index to cksu
27de0 6d 20 28 30 2e 2e 70 2d 3e 6e 49 6e 64 65 78 2d  m (0..p->nIndex-
27df0 31 29 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63  1) */.  int *pRc
27e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e10 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
27e20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 29  Return code */.)
27e30 7b 0a 20 20 46 74 73 33 53 65 67 46 69 6c 74 65  {.  Fts3SegFilte
27e40 72 20 66 69 6c 74 65 72 3b 0a 20 20 46 74 73 33  r filter;.  Fts3
27e50 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 63  MultiSegReader c
27e60 73 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  sr;.  int rc;.  
27e70 75 36 34 20 63 6b 73 75 6d 20 3d 20 30 3b 0a 0a  u64 cksum = 0;..
27e80 20 20 61 73 73 65 72 74 28 20 2a 70 52 63 3d 3d    assert( *pRc==
27e90 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
27ea0 6d 65 6d 73 65 74 28 26 66 69 6c 74 65 72 2c 20  memset(&filter, 
27eb0 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c 74 65 72  0, sizeof(filter
27ec0 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 73  ));.  memset(&cs
27ed0 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 73 72  r, 0, sizeof(csr
27ee0 29 29 3b 0a 20 20 66 69 6c 74 65 72 2e 66 6c 61  ));.  filter.fla
27ef0 67 73 20 3d 20 20 46 54 53 33 5f 53 45 47 4d 45  gs =  FTS3_SEGME
27f00 4e 54 5f 52 45 51 55 49 52 45 5f 50 4f 53 7c 46  NT_REQUIRE_POS|F
27f10 54 53 33 5f 53 45 47 4d 45 4e 54 5f 49 47 4e 4f  TS3_SEGMENT_IGNO
27f20 52 45 5f 45 4d 50 54 59 3b 0a 20 20 66 69 6c 74  RE_EMPTY;.  filt
27f30 65 72 2e 66 6c 61 67 73 20 7c 3d 20 46 54 53 33  er.flags |= FTS3
27f40 5f 53 45 47 4d 45 4e 54 5f 53 43 41 4e 3b 0a 0a  _SEGMENT_SCAN;..
27f50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
27f60 73 33 53 65 67 52 65 61 64 65 72 43 75 72 73 6f  s3SegReaderCurso
27f70 72 28 0a 20 20 20 20 20 20 70 2c 20 69 4c 61 6e  r(.      p, iLan
27f80 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 46 54 53  gid, iIndex, FTS
27f90 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c 2c  3_SEGCURSOR_ALL,
27fa0 20 30 2c 20 30 2c 20 30 2c 20 31 2c 26 63 73 72   0, 0, 0, 1,&csr
27fb0 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  .  );.  if( rc==
27fc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27fd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
27fe0 33 53 65 67 52 65 61 64 65 72 53 74 61 72 74 28  3SegReaderStart(
27ff0 70 2c 20 26 63 73 72 2c 20 26 66 69 6c 74 65 72  p, &csr, &filter
28000 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
28010 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28020 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45     while( SQLITE
28030 5f 52 4f 57 3d 3d 28 72 63 20 3d 20 73 71 6c 69  _ROW==(rc = sqli
28040 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72  te3Fts3SegReader
28050 53 74 65 70 28 70 2c 20 26 63 73 72 29 29 20 29  Step(p, &csr)) )
28060 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 43  {.      char *pC
28070 73 72 20 3d 20 63 73 72 2e 61 44 6f 63 6c 69 73  sr = csr.aDoclis
28080 74 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  t;.      char *p
28090 45 6e 64 20 3d 20 26 70 43 73 72 5b 63 73 72 2e  End = &pCsr[csr.
280a0 6e 44 6f 63 6c 69 73 74 5d 3b 0a 0a 20 20 20 20  nDoclist];..    
280b0 20 20 69 36 34 20 69 44 6f 63 69 64 20 3d 20 30    i64 iDocid = 0
280c0 3b 0a 20 20 20 20 20 20 69 36 34 20 69 43 6f 6c  ;.      i64 iCol
280d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 36 34 20   = 0;.      i64 
280e0 69 50 6f 73 20 3d 20 30 3b 0a 0a 20 20 20 20 20  iPos = 0;..     
280f0 20 70 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33   pCsr += sqlite3
28100 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 70 43  Fts3GetVarint(pC
28110 73 72 2c 20 26 69 44 6f 63 69 64 29 3b 0a 20 20  sr, &iDocid);.  
28120 20 20 20 20 77 68 69 6c 65 28 20 70 43 73 72 3c      while( pCsr<
28130 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  pEnd ){.        
28140 69 36 34 20 69 56 61 6c 20 3d 20 30 3b 0a 20 20  i64 iVal = 0;.  
28150 20 20 20 20 20 20 70 43 73 72 20 2b 3d 20 73 71        pCsr += sq
28160 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
28170 6e 74 28 70 43 73 72 2c 20 26 69 56 61 6c 29 3b  nt(pCsr, &iVal);
28180 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 73  .        if( pCs
28190 72 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  r<pEnd ){.      
281a0 20 20 20 20 69 66 28 20 69 56 61 6c 3d 3d 30 20      if( iVal==0 
281b0 7c 7c 20 69 56 61 6c 3d 3d 31 20 29 7b 0a 20 20  || iVal==1 ){.  
281c0 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d            iCol =
281d0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
281e0 69 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  iPos = 0;.      
281f0 20 20 20 20 20 20 69 66 28 20 69 56 61 6c 20 29        if( iVal )
28200 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
28210 70 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 46  pCsr += sqlite3F
28220 74 73 33 47 65 74 56 61 72 69 6e 74 28 70 43 73  ts3GetVarint(pCs
28230 72 2c 20 26 69 43 6f 6c 29 3b 0a 20 20 20 20 20  r, &iCol);.     
28240 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
28250 20 20 20 20 20 20 20 20 20 20 20 20 70 43 73 72              pCsr
28260 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47   += sqlite3Fts3G
28270 65 74 56 61 72 69 6e 74 28 70 43 73 72 2c 20 26  etVarint(pCsr, &
28280 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  iVal);.         
28290 20 20 20 20 20 69 44 6f 63 69 64 20 2b 3d 20 69       iDocid += i
282a0 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Val;.           
282b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
282c0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
282d0 69 50 6f 73 20 2b 3d 20 28 69 56 61 6c 20 2d 20  iPos += (iVal - 
282e0 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
282f0 63 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 20 5e 20  cksum = cksum ^ 
28300 66 74 73 33 43 68 65 63 6b 73 75 6d 45 6e 74 72  fts3ChecksumEntr
28310 79 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y(.             
28320 20 20 20 63 73 72 2e 7a 54 65 72 6d 2c 20 63 73     csr.zTerm, cs
28330 72 2e 6e 54 65 72 6d 2c 20 69 4c 61 6e 67 69 64  r.nTerm, iLangid
28340 2c 20 69 49 6e 64 65 78 2c 20 69 44 6f 63 69 64  , iIndex, iDocid
28350 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28360 20 20 28 69 6e 74 29 69 43 6f 6c 2c 20 28 69 6e    (int)iCol, (in
28370 74 29 69 50 6f 73 0a 20 20 20 20 20 20 20 20 20  t)iPos.         
28380 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
28390 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
283a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
283b0 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
283c0 61 64 65 72 46 69 6e 69 73 68 28 26 63 73 72 29  aderFinish(&csr)
283d0 3b 0a 0a 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a  ;..  *pRc = rc;.
283e0 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
283f0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69  }../*.** Check i
28400 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  f the contents o
28410 66 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20  f the FTS index 
28420 6d 61 74 63 68 20 74 68 65 20 63 75 72 72 65 6e  match the curren
28430 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  t contents of th
28440 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 74 61 62  e.** content tab
28450 6c 65 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  le. If no error 
28460 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 63  occurs and the c
28470 6f 6e 74 65 6e 74 73 20 64 6f 20 6d 61 74 63 68  ontents do match
28480 2c 20 73 65 74 20 2a 70 62 4f 6b 0a 2a 2a 20 74  , set *pbOk.** t
28490 6f 20 74 72 75 65 20 61 6e 64 20 72 65 74 75 72  o true and retur
284a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 72 20  n SQLITE_OK. Or 
284b0 69 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  if the contents 
284c0 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2c 20 73 65  do not match, se
284d0 74 20 2a 70 62 4f 6b 0a 2a 2a 20 74 6f 20 66 61  t *pbOk.** to fa
284e0 6c 73 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  lse before retur
284f0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ning..**.** If a
28500 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28  n error occurs (
28510 65 2e 67 2e 20 61 6e 20 4f 4f 4d 20 6f 72 20 49  e.g. an OOM or I
28520 4f 20 65 72 72 6f 72 29 2c 20 72 65 74 75 72 6e  O error), return
28530 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
28540 20 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66   .** code. The f
28550 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 2a 70  inal value of *p
28560 62 4f 6b 20 69 73 20 75 6e 64 65 66 69 6e 65 64  bOk is undefined
28570 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
28580 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
28590 33 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28  3IntegrityCheck(
285a0 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 69 6e  Fts3Table *p, in
285b0 74 20 2a 70 62 4f 6b 29 7b 0a 20 20 69 6e 74 20  t *pbOk){.  int 
285c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
285d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
285e0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
285f0 75 36 34 20 63 6b 73 75 6d 31 20 3d 20 30 3b 20  u64 cksum1 = 0; 
28600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28610 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65  /* Checksum base
28620 64 20 6f 6e 20 46 54 53 20 69 6e 64 65 78 20 63  d on FTS index c
28630 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 75 36 34  ontents */.  u64
28640 20 63 6b 73 75 6d 32 20 3d 20 30 3b 20 20 20 20   cksum2 = 0;    
28650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28660 43 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f  Checksum based o
28670 6e 20 25 5f 63 6f 6e 74 65 6e 74 20 63 6f 6e 74  n %_content cont
28680 65 6e 74 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ents */.  sqlite
28690 33 5f 73 74 6d 74 20 2a 70 41 6c 6c 4c 61 6e 67  3_stmt *pAllLang
286a0 69 64 20 3d 20 30 3b 20 20 20 2f 2a 20 53 74 61  id = 0;   /* Sta
286b0 74 65 6d 65 6e 74 20 74 6f 20 72 65 74 75 72 6e  tement to return
286c0 20 61 6c 6c 20 6c 61 6e 67 75 61 67 65 2d 69 64   all language-id
286d0 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  s */..  /* This 
286e0 62 6c 6f 63 6b 20 63 61 6c 63 75 6c 61 74 65 73  block calculates
286f0 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 61 63   the checksum ac
28700 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 46  cording to the F
28710 54 53 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 72  TS index. */.  r
28720 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
28730 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 41 4c  p, SQL_SELECT_AL
28740 4c 5f 4c 41 4e 47 49 44 2c 20 26 70 41 6c 6c 4c  L_LANGID, &pAllL
28750 61 6e 67 69 64 2c 20 30 29 3b 0a 20 20 69 66 28  angid, 0);.  if(
28760 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28770 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20  {.    int rc2;. 
28780 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
28790 69 6e 74 28 70 41 6c 6c 4c 61 6e 67 69 64 2c 20  int(pAllLangid, 
287a0 31 2c 20 70 2d 3e 6e 49 6e 64 65 78 29 3b 0a 20  1, p->nIndex);. 
287b0 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
287c0 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74  LITE_OK && sqlit
287d0 65 33 5f 73 74 65 70 28 70 41 6c 6c 4c 61 6e 67  e3_step(pAllLang
287e0 69 64 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  id)==SQLITE_ROW 
287f0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 61  ){.      int iLa
28800 6e 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63  ngid = sqlite3_c
28810 6f 6c 75 6d 6e 5f 69 6e 74 28 70 41 6c 6c 4c 61  olumn_int(pAllLa
28820 6e 67 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  ngid, 0);.      
28830 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
28840 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 6e 64 65  (i=0; i<p->nInde
28850 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  x; i++){.       
28860 20 63 6b 73 75 6d 31 20 3d 20 63 6b 73 75 6d 31   cksum1 = cksum1
28870 20 5e 20 66 74 73 33 43 68 65 63 6b 73 75 6d 49   ^ fts3ChecksumI
28880 6e 64 65 78 28 70 2c 20 69 4c 61 6e 67 69 64 2c  ndex(p, iLangid,
28890 20 69 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20   i, &rc);.      
288a0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 32 20  }.    }.    rc2 
288b0 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
288c0 70 41 6c 6c 4c 61 6e 67 69 64 29 3b 0a 20 20 20  pAllLangid);.   
288d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
288e0 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
288f0 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c   }..  /* This bl
28900 6f 63 6b 20 63 61 6c 63 75 6c 61 74 65 73 20 74  ock calculates t
28910 68 65 20 63 68 65 63 6b 73 75 6d 20 61 63 63 6f  he checksum acco
28920 72 64 69 6e 67 20 74 6f 20 74 68 65 20 25 5f 63  rding to the %_c
28930 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  ontent table */.
28940 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
28950 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54  mt(p, SQL_SELECT
28960 5f 41 4c 4c 5f 4c 41 4e 47 49 44 2c 20 26 70 41  _ALL_LANGID, &pA
28970 6c 6c 4c 61 6e 67 69 64 2c 20 30 29 3b 0a 20 20  llLangid, 0);.  
28980 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28990 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
289a0 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c  _tokenizer_modul
289b0 65 20 63 6f 6e 73 74 20 2a 70 4d 6f 64 75 6c 65  e const *pModule
289c0 20 3d 20 70 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72   = p->pTokenizer
289d0 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 73  ->pModule;.    s
289e0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
289f0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  mt = 0;.    char
28a00 20 2a 7a 53 71 6c 3b 0a 20 20 20 0a 20 20 20 20   *zSql;.   .    
28a10 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
28a20 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 25  printf("SELECT %
28a30 73 22 20 2c 20 70 2d 3e 7a 52 65 61 64 45 78 70  s" , p->zReadExp
28a40 72 6c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20  rlist);.    if( 
28a50 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 72  !zSql ){.      r
28a60 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
28a70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
28a80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
28a90 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
28aa0 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
28ab0 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  mt, 0);.      sq
28ac0 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
28ad0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 68 69  ;.    }..    whi
28ae0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
28af0 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
28b00 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
28b10 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 69 36  tmt) ){.      i6
28b20 34 20 69 44 6f 63 69 64 20 3d 20 73 71 6c 69 74  4 iDocid = sqlit
28b30 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
28b40 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
28b50 20 69 6e 74 20 69 4c 61 6e 67 20 3d 20 6c 61 6e   int iLang = lan
28b60 67 69 64 46 72 6f 6d 53 65 6c 65 63 74 28 70 2c  gidFromSelect(p,
28b70 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69   pStmt);.      i
28b80 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20 20 20 20 20  nt iCol;..      
28b90 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 72 63 3d 3d  for(iCol=0; rc==
28ba0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 43 6f  SQLITE_OK && iCo
28bb0 6c 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 43  l<p->nColumn; iC
28bc0 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63  ol++){.        c
28bd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
28be0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
28bf0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
28c00 74 65 78 74 28 70 53 74 6d 74 2c 20 69 43 6f 6c  text(pStmt, iCol
28c10 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  +1);.        int
28c20 20 6e 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33   nText = sqlite3
28c30 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
28c40 74 6d 74 2c 20 69 43 6f 6c 2b 31 29 3b 0a 20 20  tmt, iCol+1);.  
28c50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 6f        sqlite3_to
28c60 6b 65 6e 69 7a 65 72 5f 63 75 72 73 6f 72 20 2a  kenizer_cursor *
28c70 70 54 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20  pT = 0;..       
28c80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
28c90 33 4f 70 65 6e 54 6f 6b 65 6e 69 7a 65 72 28 70  3OpenTokenizer(p
28ca0 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 2c 20 69 4c  ->pTokenizer, iL
28cb0 61 6e 67 2c 20 7a 54 65 78 74 2c 20 6e 54 65 78  ang, zText, nTex
28cc0 74 2c 20 26 70 54 29 3b 0a 20 20 20 20 20 20 20  t, &pT);.       
28cd0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
28ce0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28cf0 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
28d00 54 6f 6b 65 6e 3b 20 20 20 20 20 20 20 2f 2a 20  Token;       /* 
28d10 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
28d20 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 20  g token */.     
28d30 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b       int nToken;
28d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28d50 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
28d60 73 20 69 6e 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  s in token */.  
28d70 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 75 6d          int iDum
28d80 31 2c 20 69 44 75 6d 32 3b 20 20 20 20 20 20 20  1, iDum2;       
28d90 20 20 2f 2a 20 44 75 6d 6d 79 20 76 61 72 69 61    /* Dummy varia
28da0 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  bles */.        
28db0 20 20 69 6e 74 20 69 50 6f 73 3b 20 20 20 20 20    int iPos;     
28dc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
28dd0 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e  osition of token
28de0 20 69 6e 20 7a 54 65 78 74 20 2a 2f 0a 0a 20 20   in zText */..  
28df0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 4d 6f          rc = pMo
28e00 64 75 6c 65 2d 3e 78 4e 65 78 74 28 70 54 2c 20  dule->xNext(pT, 
28e10 26 7a 54 6f 6b 65 6e 2c 20 26 6e 54 6f 6b 65 6e  &zToken, &nToken
28e20 2c 20 26 69 44 75 6d 31 2c 20 26 69 44 75 6d 32  , &iDum1, &iDum2
28e30 2c 20 26 69 50 6f 73 29 3b 0a 20 20 20 20 20 20  , &iPos);.      
28e40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28e50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28e60 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
28e70 20 20 20 20 20 20 20 20 63 6b 73 75 6d 32 20 3d          cksum2 =
28e80 20 63 6b 73 75 6d 32 20 5e 20 66 74 73 33 43 68   cksum2 ^ fts3Ch
28e90 65 63 6b 73 75 6d 45 6e 74 72 79 28 0a 20 20 20  ecksumEntry(.   
28ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f               zTo
28eb0 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 69 4c 61  ken, nToken, iLa
28ec0 6e 67 2c 20 30 2c 20 69 44 6f 63 69 64 2c 20 69  ng, 0, iDocid, i
28ed0 43 6f 6c 2c 20 69 50 6f 73 0a 20 20 20 20 20 20  Col, iPos.      
28ee0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
28ef0 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
28f00 70 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b 29 7b  p->nIndex; i++){
28f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
28f20 66 28 20 70 2d 3e 61 49 6e 64 65 78 5b 69 5d 2e  f( p->aIndex[i].
28f30 6e 50 72 65 66 69 78 3c 3d 6e 54 6f 6b 65 6e 20  nPrefix<=nToken 
28f40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
28f50 20 20 20 63 6b 73 75 6d 32 20 3d 20 63 6b 73 75     cksum2 = cksu
28f60 6d 32 20 5e 20 66 74 73 33 43 68 65 63 6b 73 75  m2 ^ fts3Checksu
28f70 6d 45 6e 74 72 79 28 0a 20 20 20 20 20 20 20 20  mEntry(.        
28f80 20 20 20 20 20 20 20 20 20 20 7a 54 6f 6b 65 6e            zToken
28f90 2c 20 70 2d 3e 61 49 6e 64 65 78 5b 69 5d 2e 6e  , p->aIndex[i].n
28fa0 50 72 65 66 69 78 2c 20 69 4c 61 6e 67 2c 20 69  Prefix, iLang, i
28fb0 2c 20 69 44 6f 63 69 64 2c 20 69 43 6f 6c 2c 20  , iDocid, iCol, 
28fc0 69 50 6f 73 0a 20 20 20 20 20 20 20 20 20 20 20  iPos.           
28fd0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
28fe0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28ff0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
29000 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
29010 20 20 20 20 69 66 28 20 70 54 20 29 20 70 4d 6f      if( pT ) pMo
29020 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 54 29  dule->xClose(pT)
29030 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
29040 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20  ==SQLITE_DONE ) 
29050 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
29060 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
29070 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
29080 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a  ize(pStmt);.  }.
29090 0a 20 20 2a 70 62 4f 6b 20 3d 20 28 63 6b 73 75  .  *pbOk = (cksu
290a0 6d 31 3d 3d 63 6b 73 75 6d 32 29 3b 0a 20 20 72  m1==cksum2);.  r
290b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
290c0 2a 2a 20 52 75 6e 20 74 68 65 20 69 6e 74 65 67  ** Run the integ
290d0 72 69 74 79 2d 63 68 65 63 6b 2e 20 49 66 20 6e  rity-check. If n
290e0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61  o error occurs a
290f0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  nd the current c
29100 6f 6e 74 65 6e 74 73 20 6f 66 0a 2a 2a 20 74 68  ontents of.** th
29110 65 20 46 54 53 20 69 6e 64 65 78 20 61 72 65 20  e FTS index are 
29120 63 6f 72 72 65 63 74 2c 20 72 65 74 75 72 6e 20  correct, return 
29130 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 72 2c 20 69  SQLITE_OK. Or, i
29140 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  f the contents o
29150 66 20 74 68 65 0a 2a 2a 20 46 54 53 20 69 6e 64  f the.** FTS ind
29160 65 78 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74  ex are incorrect
29170 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
29180 43 4f 52 52 55 50 54 5f 56 54 41 42 2e 0a 2a 2a  CORRUPT_VTAB..**
29190 0a 2a 2a 20 4f 72 2c 20 69 66 20 61 6e 20 65 72  .** Or, if an er
291a0 72 6f 72 20 28 65 2e 67 2e 20 61 6e 20 4f 4f 4d  ror (e.g. an OOM
291b0 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 6f 63   or IO error) oc
291c0 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20  curs, return an 
291d0 53 51 4c 69 74 65 20 0a 2a 2a 20 65 72 72 6f 72  SQLite .** error
291e0 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   code..**.** The
291f0 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b   integrity-check
29200 20 77 6f 72 6b 73 20 61 73 20 66 6f 6c 6c 6f 77   works as follow
29210 73 2e 20 46 6f 72 20 65 61 63 68 20 74 6f 6b 65  s. For each toke
29220 6e 20 61 6e 64 20 69 6e 64 65 78 65 64 20 74 6f  n and indexed to
29230 6b 65 6e 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e  ken.** prefix in
29240 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 73 65   the document se
29250 74 2c 20 61 20 36 34 2d 62 69 74 20 63 68 65 63  t, a 64-bit chec
29260 6b 73 75 6d 20 69 73 20 63 61 6c 63 75 6c 61 74  ksum is calculat
29270 65 64 20 28 62 79 20 63 6f 64 65 0a 2a 2a 20 69  ed (by code.** i
29280 6e 20 66 74 73 33 43 68 65 63 6b 73 75 6d 45 6e  n fts3ChecksumEn
29290 74 72 79 28 29 29 20 62 61 73 65 64 20 6f 6e 20  try()) based on 
292a0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
292b0 2a 0a 2a 2a 20 20 20 20 20 2b 20 54 68 65 20 69  *.**     + The i
292c0 6e 64 65 78 20 6e 75 6d 62 65 72 20 28 30 20 66  ndex number (0 f
292d0 6f 72 20 74 68 65 20 6d 61 69 6e 20 69 6e 64 65  or the main inde
292e0 78 2c 20 31 20 66 6f 72 20 74 68 65 20 66 69 72  x, 1 for the fir
292f0 73 74 20 70 72 65 66 69 78 0a 2a 2a 20 20 20 20  st prefix.**    
29300 20 20 20 69 6e 64 65 78 20 65 74 63 2e 29 2c 0a     index etc.),.
29310 2a 2a 20 20 20 20 20 2b 20 54 68 65 20 74 6f 6b  **     + The tok
29320 65 6e 20 28 6f 72 20 74 6f 6b 65 6e 20 70 72 65  en (or token pre
29330 66 69 78 29 20 74 65 78 74 20 69 74 73 65 6c 66  fix) text itself
29340 2c 20 0a 2a 2a 20 20 20 20 20 2b 20 54 68 65 20  , .**     + The 
29350 6c 61 6e 67 75 61 67 65 2d 69 64 20 6f 66 20 74  language-id of t
29360 68 65 20 72 6f 77 20 69 74 20 61 70 70 65 61 72  he row it appear
29370 73 20 69 6e 2c 0a 2a 2a 20 20 20 20 20 2b 20 54  s in,.**     + T
29380 68 65 20 64 6f 63 69 64 20 6f 66 20 74 68 65 20  he docid of the 
29390 72 6f 77 20 69 74 20 61 70 70 65 61 72 73 20 69  row it appears i
293a0 6e 2c 0a 2a 2a 20 20 20 20 20 2b 20 54 68 65 20  n,.**     + The 
293b0 63 6f 6c 75 6d 6e 20 69 74 20 61 70 70 65 61 72  column it appear
293c0 73 20 69 6e 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  s in, and.**    
293d0 20 2b 20 54 68 65 20 74 6f 6b 65 6e 73 20 70 6f   + The tokens po
293e0 73 69 74 69 6f 6e 20 77 69 74 68 69 6e 20 74 68  sition within th
293f0 61 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a  at column..**.**
29400 20 54 68 65 20 63 68 65 63 6b 73 75 6d 73 20 66   The checksums f
29410 6f 72 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  or all entries i
29420 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20  n the index are 
29430 58 4f 52 65 64 20 74 6f 67 65 74 68 65 72 20 74  XORed together t
29440 6f 20 63 72 65 61 74 65 0a 2a 2a 20 61 20 73 69  o create.** a si
29450 6e 67 6c 65 20 63 68 65 63 6b 73 75 6d 20 66 6f  ngle checksum fo
29460 72 20 74 68 65 20 65 6e 74 69 72 65 20 69 6e 64  r the entire ind
29470 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ex..**.** The in
29480 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 63 6f  tegrity-check co
29490 64 65 20 63 61 6c 63 75 6c 61 74 65 73 20 74 68  de calculates th
294a0 65 20 73 61 6d 65 20 63 68 65 63 6b 73 75 6d 20  e same checksum 
294b0 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a 2a 0a  in two ways:.**.
294c0 2a 2a 20 20 20 20 20 31 2e 20 42 79 20 73 63 61  **     1. By sca
294d0 6e 6e 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  nning the conten
294e0 74 73 20 6f 66 20 74 68 65 20 46 54 53 20 69 6e  ts of the FTS in
294f0 64 65 78 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20  dex, and .**    
29500 20 32 2e 20 42 79 20 73 63 61 6e 6e 69 6e 67 20   2. By scanning 
29510 61 6e 64 20 74 6f 6b 65 6e 69 7a 69 6e 67 20 74  and tokenizing t
29520 68 65 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65  he content table
29530 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74  ..**.** If the t
29540 77 6f 20 63 68 65 63 6b 73 75 6d 73 20 61 72 65  wo checksums are
29550 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 20   identical, the 
29560 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20  integrity-check 
29570 69 73 20 64 65 65 6d 65 64 20 74 6f 20 68 61 76  is deemed to hav
29580 65 0a 2a 2a 20 70 61 73 73 65 64 2e 0a 2a 2f 0a  e.** passed..*/.
29590 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 44  static int fts3D
295a0 6f 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28  oIntegrityCheck(
295b0 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20  .  Fts3Table *p 
295c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295d0 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65     /* FTS3 table
295e0 20 68 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a 20 20   handle */.){.  
295f0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 4f  int rc;.  int bO
29600 6b 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 66 74  k = 0;.  rc = ft
29610 73 33 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  s3IntegrityCheck
29620 28 70 2c 20 26 62 4f 6b 29 3b 0a 20 20 69 66 28  (p, &bOk);.  if(
29630 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
29640 26 20 62 4f 6b 3d 3d 30 20 29 20 72 63 20 3d 20  & bOk==0 ) rc = 
29650 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56  SQLITE_CORRUPT_V
29660 54 41 42 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  TAB;.  return rc
29670 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c  ;.}../*.** Handl
29680 65 20 61 20 27 73 70 65 63 69 61 6c 27 20 49 4e  e a 'special' IN
29690 53 45 52 54 20 6f 66 20 74 68 65 20 66 6f 72 6d  SERT of the form
296a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 49 4e 53 45 52  :.**.**   "INSER
296b0 54 20 49 4e 54 4f 20 74 62 6c 28 74 62 6c 29 20  T INTO tbl(tbl) 
296c0 56 41 4c 55 45 53 28 3c 65 78 70 72 3e 29 22 0a  VALUES(<expr>)".
296d0 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  **.** Argument p
296e0 56 61 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  Val contains the
296f0 20 72 65 73 75 6c 74 20 6f 66 20 3c 65 78 70 72   result of <expr
29700 3e 2e 20 43 75 72 72 65 6e 74 6c 79 20 74 68 65  >. Currently the
29710 20 6f 6e 6c 79 20 0a 2a 2a 20 6d 65 61 6e 69 6e   only .** meanin
29720 67 66 75 6c 20 76 61 6c 75 65 20 74 6f 20 69 6e  gful value to in
29730 73 65 72 74 20 69 73 20 74 68 65 20 74 65 78 74  sert is the text
29740 20 27 6f 70 74 69 6d 69 7a 65 27 2e 0a 2a 2f 0a   'optimize'..*/.
29750 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53  static int fts3S
29760 70 65 63 69 61 6c 49 6e 73 65 72 74 28 46 74 73  pecialInsert(Fts
29770 33 54 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74  3Table *p, sqlit
29780 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 29 7b  e3_value *pVal){
29790 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
297a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297b0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
297c0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
297d0 72 20 2a 7a 56 61 6c 20 3d 20 28 63 6f 6e 73 74  r *zVal = (const
297e0 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f   char *)sqlite3_
297f0 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
29800 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73  ;.  int nVal = s
29810 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
29820 65 73 28 70 56 61 6c 29 3b 0a 0a 20 20 69 66 28  es(pVal);..  if(
29830 20 21 7a 56 61 6c 20 29 7b 0a 20 20 20 20 72 65   !zVal ){.    re
29840 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
29850 4d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  M;.  }else if( n
29860 56 61 6c 3d 3d 38 20 26 26 20 30 3d 3d 73 71 6c  Val==8 && 0==sql
29870 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56  ite3_strnicmp(zV
29880 61 6c 2c 20 22 6f 70 74 69 6d 69 7a 65 22 2c 20  al, "optimize", 
29890 38 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  8) ){.    rc = f
298a0 74 73 33 44 6f 4f 70 74 69 6d 69 7a 65 28 70 2c  ts3DoOptimize(p,
298b0 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   0);.  }else if(
298c0 20 6e 56 61 6c 3d 3d 37 20 26 26 20 30 3d 3d 73   nVal==7 && 0==s
298d0 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
298e0 7a 56 61 6c 2c 20 22 72 65 62 75 69 6c 64 22 2c  zVal, "rebuild",
298f0 20 37 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20   7) ){.    rc = 
29900 66 74 73 33 44 6f 52 65 62 75 69 6c 64 28 70 29  fts3DoRebuild(p)
29910 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56  ;.  }else if( nV
29920 61 6c 3d 3d 31 35 20 26 26 20 30 3d 3d 73 71 6c  al==15 && 0==sql
29930 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56  ite3_strnicmp(zV
29940 61 6c 2c 20 22 69 6e 74 65 67 72 69 74 79 2d 63  al, "integrity-c
29950 68 65 63 6b 22 2c 20 31 35 29 20 29 7b 0a 20 20  heck", 15) ){.  
29960 20 20 72 63 20 3d 20 66 74 73 33 44 6f 49 6e 74    rc = fts3DoInt
29970 65 67 72 69 74 79 43 68 65 63 6b 28 70 29 3b 0a  egrityCheck(p);.
29980 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 61 6c    }else if( nVal
29990 3e 36 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  >6 && 0==sqlite3
299a0 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20  _strnicmp(zVal, 
299b0 22 6d 65 72 67 65 3d 22 2c 20 36 29 20 29 7b 0a  "merge=", 6) ){.
299c0 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 6f 49      rc = fts3DoI
299d0 6e 63 72 6d 65 72 67 65 28 70 2c 20 26 7a 56 61  ncrmerge(p, &zVa
299e0 6c 5b 36 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69  l[6]);.  }else i
299f0 66 28 20 6e 56 61 6c 3e 31 30 20 26 26 20 30 3d  f( nVal>10 && 0=
29a00 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d  =sqlite3_strnicm
29a10 70 28 7a 56 61 6c 2c 20 22 61 75 74 6f 6d 65 72  p(zVal, "automer
29a20 67 65 3d 22 2c 20 31 30 29 20 29 7b 0a 20 20 20  ge=", 10) ){.   
29a30 20 72 63 20 3d 20 66 74 73 33 44 6f 41 75 74 6f   rc = fts3DoAuto
29a40 69 6e 63 72 6d 65 72 67 65 28 70 2c 20 26 7a 56  incrmerge(p, &zV
29a50 61 6c 5b 31 30 5d 29 3b 0a 23 69 66 64 65 66 20  al[10]);.#ifdef 
29a60 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7d 65  SQLITE_TEST.  }e
29a70 6c 73 65 20 69 66 28 20 6e 56 61 6c 3e 39 20 26  lse if( nVal>9 &
29a80 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  & 0==sqlite3_str
29a90 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22 6e 6f 64  nicmp(zVal, "nod
29aa0 65 73 69 7a 65 3d 22 2c 20 39 29 20 29 7b 0a 20  esize=", 9) ){. 
29ab0 20 20 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20     p->nNodeSize 
29ac0 3d 20 61 74 6f 69 28 26 7a 56 61 6c 5b 39 5d 29  = atoi(&zVal[9])
29ad0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
29ae0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
29af0 28 20 6e 56 61 6c 3e 31 31 20 26 26 20 30 3d 3d  ( nVal>11 && 0==
29b00 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
29b10 28 7a 56 61 6c 2c 20 22 6d 61 78 70 65 6e 64 69  (zVal, "maxpendi
29b20 6e 67 3d 22 2c 20 39 29 20 29 7b 0a 20 20 20 20  ng=", 9) ){.    
29b30 70 2d 3e 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61  p->nMaxPendingDa
29b40 74 61 20 3d 20 61 74 6f 69 28 26 7a 56 61 6c 5b  ta = atoi(&zVal[
29b50 31 31 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  11]);.    rc = S
29b60 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
29b70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
29b80 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
29b90 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
29ba0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  c;.}../*.** Dele
29bb0 74 65 20 61 6c 6c 20 63 61 63 68 65 64 20 64 65  te all cached de
29bc0 66 65 72 72 65 64 20 64 6f 63 6c 69 73 74 73 2e  ferred doclists.
29bd0 20 44 65 66 65 72 72 65 64 20 64 6f 63 6c 69 73   Deferred doclis
29be0 74 73 20 61 72 65 20 63 61 63 68 65 64 0a 2a 2a  ts are cached.**
29bf0 20 28 61 6c 6c 6f 63 61 74 65 64 29 20 62 79 20   (allocated) by 
29c00 74 68 65 20 73 71 6c 69 74 65 33 46 74 73 33 43  the sqlite3Fts3C
29c10 61 63 68 65 44 65 66 65 72 72 65 64 44 6f 63 6c  acheDeferredDocl
29c20 69 73 74 73 28 29 20 66 75 6e 63 74 69 6f 6e 2e  ists() function.
29c30 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
29c40 46 74 73 33 46 72 65 65 44 65 66 65 72 72 65 64  Fts3FreeDeferred
29c50 44 6f 63 6c 69 73 74 73 28 46 74 73 33 43 75 72  Doclists(Fts3Cur
29c60 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 46 74  sor *pCsr){.  Ft
29c70 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20  s3DeferredToken 
29c80 2a 70 44 65 66 3b 0a 20 20 66 6f 72 28 70 44 65  *pDef;.  for(pDe
29c90 66 3d 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65  f=pCsr->pDeferre
29ca0 64 3b 20 70 44 65 66 3b 20 70 44 65 66 3d 70 44  d; pDef; pDef=pD
29cb0 65 66 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ef->pNext){.    
29cc0 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 44  fts3PendingListD
29cd0 65 6c 65 74 65 28 70 44 65 66 2d 3e 70 4c 69 73  elete(pDef->pLis
29ce0 74 29 3b 0a 20 20 20 20 70 44 65 66 2d 3e 70 4c  t);.    pDef->pL
29cf0 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ist = 0;.  }.}..
29d00 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 65  /*.** Free all e
29d10 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 70 43  ntries in the pC
29d20 73 72 2d 3e 70 44 65 66 66 65 72 65 64 20 6c 69  sr->pDeffered li
29d30 73 74 2e 20 45 6e 74 72 69 65 73 20 61 72 65 20  st. Entries are 
29d40 61 64 64 65 64 20 74 6f 20 0a 2a 2a 20 74 68 69  added to .** thi
29d50 73 20 6c 69 73 74 20 75 73 69 6e 67 20 73 71 6c  s list using sql
29d60 69 74 65 33 46 74 73 33 44 65 66 65 72 54 6f 6b  ite3Fts3DeferTok
29d70 65 6e 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  en()..*/.void sq
29d80 6c 69 74 65 33 46 74 73 33 46 72 65 65 44 65 66  lite3Fts3FreeDef
29d90 65 72 72 65 64 54 6f 6b 65 6e 73 28 46 74 73 33  erredTokens(Fts3
29da0 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20  Cursor *pCsr){. 
29db0 20 46 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b   Fts3DeferredTok
29dc0 65 6e 20 2a 70 44 65 66 3b 0a 20 20 46 74 73 33  en *pDef;.  Fts3
29dd0 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70  DeferredToken *p
29de0 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 44 65 66  Next;.  for(pDef
29df0 3d 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64  =pCsr->pDeferred
29e00 3b 20 70 44 65 66 3b 20 70 44 65 66 3d 70 4e 65  ; pDef; pDef=pNe
29e10 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
29e20 20 70 44 65 66 2d 3e 70 4e 65 78 74 3b 0a 20 20   pDef->pNext;.  
29e30 20 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73    fts3PendingLis
29e40 74 44 65 6c 65 74 65 28 70 44 65 66 2d 3e 70 4c  tDelete(pDef->pL
29e50 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
29e60 33 5f 66 72 65 65 28 70 44 65 66 29 3b 0a 20 20  3_free(pDef);.  
29e70 7d 0a 20 20 70 43 73 72 2d 3e 70 44 65 66 65 72  }.  pCsr->pDefer
29e80 72 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  red = 0;.}../*.*
29e90 2a 20 47 65 6e 65 72 61 74 65 20 64 65 66 65 72  * Generate defer
29ea0 72 65 64 2d 64 6f 63 6c 69 73 74 73 20 66 6f 72  red-doclists for
29eb0 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 69 6e 20 74   all tokens in t
29ec0 68 65 20 70 43 73 72 2d 3e 70 44 65 66 65 72 72  he pCsr->pDeferr
29ed0 65 64 20 6c 69 73 74 0a 2a 2a 20 62 61 73 65 64  ed list.** based
29ee0 20 6f 6e 20 74 68 65 20 72 6f 77 20 74 68 61 74   on the row that
29ef0 20 70 43 73 72 20 63 75 72 72 65 6e 74 6c 79 20   pCsr currently 
29f00 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a  points to..**.**
29f10 20 41 20 64 65 66 65 72 72 65 64 2d 64 6f 63 6c   A deferred-docl
29f20 69 73 74 20 69 73 20 6c 69 6b 65 20 61 6e 79 20  ist is like any 
29f30 6f 74 68 65 72 20 64 6f 63 6c 69 73 74 20 77 69  other doclist wi
29f40 74 68 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f  th position info
29f50 72 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 63 6c 75  rmation.** inclu
29f60 64 65 64 2c 20 65 78 63 65 70 74 20 74 68 61 74  ded, except that
29f70 20 69 74 20 6f 6e 6c 79 20 63 6f 6e 74 61 69 6e   it only contain
29f80 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 20  s entries for a 
29f90 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
29fa0 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 6e 6f 74 20  e.** table, not 
29fb0 66 6f 72 20 61 6c 6c 20 72 6f 77 73 2e 0a 2a 2f  for all rows..*/
29fc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
29fd0 43 61 63 68 65 44 65 66 65 72 72 65 64 44 6f 63  CacheDeferredDoc
29fe0 6c 69 73 74 73 28 46 74 73 33 43 75 72 73 6f 72  lists(Fts3Cursor
29ff0 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74 20 72   *pCsr){.  int r
2a000 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2a010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2a020 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
2a030 66 28 20 70 43 73 72 2d 3e 70 44 65 66 65 72 72  f( pCsr->pDeferr
2a040 65 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ed ){.    int i;
2a050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a060 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
2a070 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
2a080 67 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  gh table columns
2a090 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
2a0a0 69 6e 74 36 34 20 69 44 6f 63 69 64 3b 20 20 20  int64 iDocid;   
2a0b0 20 20 20 20 20 20 2f 2a 20 44 6f 63 69 64 20 6f        /* Docid o
2a0c0 66 20 74 68 65 20 72 6f 77 20 70 43 73 72 20 70  f the row pCsr p
2a0d0 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 20 20 20 20  oints to */.    
2a0e0 46 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65  Fts3DeferredToke
2a0f0 6e 20 2a 70 44 65 66 3b 20 20 20 20 20 20 2f 2a  n *pDef;      /*
2a100 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
2a110 20 74 68 72 6f 75 67 68 20 64 65 66 65 72 72 65   through deferre
2a120 64 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20 0a 20  d tokens */.  . 
2a130 20 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20     Fts3Table *p 
2a140 3d 20 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70  = (Fts3Table *)p
2a150 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b  Csr->base.pVtab;
2a160 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b  .    sqlite3_tok
2a170 65 6e 69 7a 65 72 20 2a 70 54 20 3d 20 70 2d 3e  enizer *pT = p->
2a180 70 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 20 20  pTokenizer;.    
2a190 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65  sqlite3_tokenize
2a1a0 72 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73 74 20 2a  r_module const *
2a1b0 70 4d 6f 64 75 6c 65 20 3d 20 70 54 2d 3e 70 4d  pModule = pT->pM
2a1c0 6f 64 75 6c 65 3b 0a 20 20 20 0a 20 20 20 20 61  odule;.   .    a
2a1d0 73 73 65 72 74 28 20 70 43 73 72 2d 3e 69 73 52  ssert( pCsr->isR
2a1e0 65 71 75 69 72 65 53 65 65 6b 3d 3d 30 20 29 3b  equireSeek==0 );
2a1f0 0a 20 20 20 20 69 44 6f 63 69 64 20 3d 20 73 71  .    iDocid = sq
2a200 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
2a210 36 34 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20  64(pCsr->pStmt, 
2a220 30 29 3b 0a 20 20 0a 20 20 20 20 66 6f 72 28 69  0);.  .    for(i
2a230 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e  =0; i<p->nColumn
2a240 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2a250 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  K; i++){.      c
2a260 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
2a270 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
2a280 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
2a290 74 65 78 74 28 70 43 73 72 2d 3e 70 53 74 6d 74  text(pCsr->pStmt
2a2a0 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  , i+1);.      sq
2a2b0 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
2a2c0 63 75 72 73 6f 72 20 2a 70 54 43 20 3d 20 30 3b  cursor *pTC = 0;
2a2d0 0a 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73  .  .      rc = s
2a2e0 71 6c 69 74 65 33 46 74 73 33 4f 70 65 6e 54 6f  qlite3Fts3OpenTo
2a2f0 6b 65 6e 69 7a 65 72 28 70 54 2c 20 70 43 73 72  kenizer(pT, pCsr
2a300 2d 3e 69 4c 61 6e 67 69 64 2c 20 7a 54 65 78 74  ->iLangid, zText
2a310 2c 20 2d 31 2c 20 26 70 54 43 29 3b 0a 20 20 20  , -1, &pTC);.   
2a320 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
2a330 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a340 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
2a350 54 6f 6b 65 6e 3b 20 20 20 20 20 20 20 2f 2a 20  Token;       /* 
2a360 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
2a370 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 20  g token */.     
2a380 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 20 20     int nToken;  
2a390 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a3a0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
2a3b0 69 6e 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20  in token */.    
2a3c0 20 20 20 20 69 6e 74 20 69 44 75 6d 31 2c 20 69      int iDum1, i
2a3d0 44 75 6d 32 3b 20 20 20 20 20 20 20 20 20 2f 2a  Dum2;         /*
2a3e0 20 44 75 6d 6d 79 20 76 61 72 69 61 62 6c 65 73   Dummy variables
2a3f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
2a400 69 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20  iPos;           
2a410 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f        /* Positio
2a420 6e 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20 7a 54  n of token in zT
2a430 65 78 74 20 2a 2f 0a 20 20 0a 20 20 20 20 20 20  ext */.  .      
2a440 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e    rc = pModule->
2a450 78 4e 65 78 74 28 70 54 43 2c 20 26 7a 54 6f 6b  xNext(pTC, &zTok
2a460 65 6e 2c 20 26 6e 54 6f 6b 65 6e 2c 20 26 69 44  en, &nToken, &iD
2a470 75 6d 31 2c 20 26 69 44 75 6d 32 2c 20 26 69 50  um1, &iDum2, &iP
2a480 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  os);.        for
2a490 28 70 44 65 66 3d 70 43 73 72 2d 3e 70 44 65 66  (pDef=pCsr->pDef
2a4a0 65 72 72 65 64 3b 20 70 44 65 66 20 26 26 20 72  erred; pDef && r
2a4b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 44  c==SQLITE_OK; pD
2a4c0 65 66 3d 70 44 65 66 2d 3e 70 4e 65 78 74 29 7b  ef=pDef->pNext){
2a4d0 0a 20 20 20 20 20 20 20 20 20 20 46 74 73 33 50  .          Fts3P
2a4e0 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70 50 54 20  hraseToken *pPT 
2a4f0 3d 20 70 44 65 66 2d 3e 70 54 6f 6b 65 6e 3b 0a  = pDef->pToken;.
2a500 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
2a510 44 65 66 2d 3e 69 43 6f 6c 3e 3d 70 2d 3e 6e 43  Def->iCol>=p->nC
2a520 6f 6c 75 6d 6e 20 7c 7c 20 70 44 65 66 2d 3e 69  olumn || pDef->i
2a530 43 6f 6c 3d 3d 69 29 0a 20 20 20 20 20 20 20 20  Col==i).        
2a540 20 20 20 26 26 20 28 70 50 54 2d 3e 62 46 69 72     && (pPT->bFir
2a550 73 74 3d 3d 30 20 7c 7c 20 69 50 6f 73 3d 3d 30  st==0 || iPos==0
2a560 29 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  ).           && 
2a570 28 70 50 54 2d 3e 6e 3d 3d 6e 54 6f 6b 65 6e 20  (pPT->n==nToken 
2a580 7c 7c 20 28 70 50 54 2d 3e 69 73 50 72 65 66 69  || (pPT->isPrefi
2a590 78 20 26 26 20 70 50 54 2d 3e 6e 3c 6e 54 6f 6b  x && pPT->n<nTok
2a5a0 65 6e 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  en)).           
2a5b0 26 26 20 28 30 3d 3d 6d 65 6d 63 6d 70 28 7a 54  && (0==memcmp(zT
2a5c0 6f 6b 65 6e 2c 20 70 50 54 2d 3e 7a 2c 20 70 50  oken, pPT->z, pP
2a5d0 54 2d 3e 6e 29 29 0a 20 20 20 20 20 20 20 20 20  T->n)).         
2a5e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a5f0 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41  fts3PendingListA
2a600 70 70 65 6e 64 28 26 70 44 65 66 2d 3e 70 4c 69  ppend(&pDef->pLi
2a610 73 74 2c 20 69 44 6f 63 69 64 2c 20 69 2c 20 69  st, iDocid, i, i
2a620 50 6f 73 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  Pos, &rc);.     
2a630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2a640 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2a650 66 28 20 70 54 43 20 29 20 70 4d 6f 64 75 6c 65  f( pTC ) pModule
2a660 2d 3e 78 43 6c 6f 73 65 28 70 54 43 29 3b 0a 20  ->xClose(pTC);. 
2a670 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2a680 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20  ITE_DONE ) rc = 
2a690 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2a6a0 0a 20 20 0a 20 20 20 20 66 6f 72 28 70 44 65 66  .  .    for(pDef
2a6b0 3d 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64  =pCsr->pDeferred
2a6c0 3b 20 70 44 65 66 20 26 26 20 72 63 3d 3d 53 51  ; pDef && rc==SQ
2a6d0 4c 49 54 45 5f 4f 4b 3b 20 70 44 65 66 3d 70 44  LITE_OK; pDef=pD
2a6e0 65 66 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ef->pNext){.    
2a6f0 20 20 69 66 28 20 70 44 65 66 2d 3e 70 4c 69 73    if( pDef->pLis
2a700 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
2a710 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73  = fts3PendingLis
2a720 74 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  tAppendVarint(&p
2a730 44 65 66 2d 3e 70 4c 69 73 74 2c 20 30 29 3b 0a  Def->pList, 0);.
2a740 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2a750 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2a760 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  }..int sqlite3Ft
2a770 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 4c  s3DeferredTokenL
2a780 69 73 74 28 0a 20 20 46 74 73 33 44 65 66 65 72  ist(.  Fts3Defer
2a790 72 65 64 54 6f 6b 65 6e 20 2a 70 2c 20 0a 20 20  redToken *p, .  
2a7a0 63 68 61 72 20 2a 2a 70 70 44 61 74 61 2c 20 0a  char **ppData, .
2a7b0 20 20 69 6e 74 20 2a 70 6e 44 61 74 61 0a 29 7b    int *pnData.){
2a7c0 0a 20 20 63 68 61 72 20 2a 70 52 65 74 3b 0a 20  .  char *pRet;. 
2a7d0 20 69 6e 74 20 6e 53 6b 69 70 3b 0a 20 20 73 71   int nSkip;.  sq
2a7e0 6c 69 74 65 33 5f 69 6e 74 36 34 20 64 75 6d 6d  lite3_int64 dumm
2a7f0 79 3b 0a 0a 20 20 2a 70 70 44 61 74 61 20 3d 20  y;..  *ppData = 
2a800 30 3b 0a 20 20 2a 70 6e 44 61 74 61 20 3d 20 30  0;.  *pnData = 0
2a810 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 73  ;..  if( p->pLis
2a820 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
2a830 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2a840 7d 0a 0a 20 20 70 52 65 74 20 3d 20 28 63 68 61  }..  pRet = (cha
2a850 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r *)sqlite3_mall
2a860 6f 63 28 70 2d 3e 70 4c 69 73 74 2d 3e 6e 44 61  oc(p->pList->nDa
2a870 74 61 29 3b 0a 20 20 69 66 28 20 21 70 52 65 74  ta);.  if( !pRet
2a880 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2a890 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 6e 53 6b 69 70  _NOMEM;..  nSkip
2a8a0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65   = sqlite3Fts3Ge
2a8b0 74 56 61 72 69 6e 74 28 70 2d 3e 70 4c 69 73 74  tVarint(p->pList
2a8c0 2d 3e 61 44 61 74 61 2c 20 26 64 75 6d 6d 79 29  ->aData, &dummy)
2a8d0 3b 0a 20 20 2a 70 6e 44 61 74 61 20 3d 20 70 2d  ;.  *pnData = p-
2a8e0 3e 70 4c 69 73 74 2d 3e 6e 44 61 74 61 20 2d 20  >pList->nData - 
2a8f0 6e 53 6b 69 70 3b 0a 20 20 2a 70 70 44 61 74 61  nSkip;.  *ppData
2a900 20 3d 20 70 52 65 74 3b 0a 20 20 0a 20 20 6d 65   = pRet;.  .  me
2a910 6d 63 70 79 28 70 52 65 74 2c 20 26 70 2d 3e 70  mcpy(pRet, &p->p
2a920 4c 69 73 74 2d 3e 61 44 61 74 61 5b 6e 53 6b 69  List->aData[nSki
2a930 70 5d 2c 20 2a 70 6e 44 61 74 61 29 3b 0a 20 20  p], *pnData);.  
2a940 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a950 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
2a960 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 6f 6b 65  n entry for toke
2a970 6e 20 70 54 6f 6b 65 6e 20 74 6f 20 74 68 65 20  n pToken to the 
2a980 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64 20  pCsr->pDeferred 
2a990 6c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  list..*/.int sql
2a9a0 69 74 65 33 46 74 73 33 44 65 66 65 72 54 6f 6b  ite3Fts3DeferTok
2a9b0 65 6e 28 0a 20 20 46 74 73 33 43 75 72 73 6f 72  en(.  Fts3Cursor
2a9c0 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20   *pCsr,         
2a9d0 20 20 20 20 20 20 2f 2a 20 46 74 73 33 20 74 61        /* Fts3 ta
2a9e0 62 6c 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  ble cursor */.  
2a9f0 46 74 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20  Fts3PhraseToken 
2aa00 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20  *pToken,        
2aa10 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20 64 65 66 65  /* Token to defe
2aa20 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20  r */.  int iCol 
2aa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa40 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
2aa50 20 74 68 61 74 20 74 6f 6b 65 6e 20 6d 75 73 74   that token must
2aa60 20 61 70 70 65 61 72 20 69 6e 20 28 6f 72 20 2d   appear in (or -
2aa70 31 29 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 44  1) */.){.  Fts3D
2aa80 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70 44  eferredToken *pD
2aa90 65 66 65 72 72 65 64 3b 0a 20 20 70 44 65 66 65  eferred;.  pDefe
2aaa0 72 72 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rred = sqlite3_m
2aab0 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 44  alloc(sizeof(*pD
2aac0 65 66 65 72 72 65 64 29 29 3b 0a 20 20 69 66 28  eferred));.  if(
2aad0 20 21 70 44 65 66 65 72 72 65 64 20 29 7b 0a 20   !pDeferred ){. 
2aae0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2aaf0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65  _NOMEM;.  }.  me
2ab00 6d 73 65 74 28 70 44 65 66 65 72 72 65 64 2c 20  mset(pDeferred, 
2ab10 30 2c 20 73 69 7a 65 6f 66 28 2a 70 44 65 66 65  0, sizeof(*pDefe
2ab20 72 72 65 64 29 29 3b 0a 20 20 70 44 65 66 65 72  rred));.  pDefer
2ab30 72 65 64 2d 3e 70 54 6f 6b 65 6e 20 3d 20 70 54  red->pToken = pT
2ab40 6f 6b 65 6e 3b 0a 20 20 70 44 65 66 65 72 72 65  oken;.  pDeferre
2ab50 64 2d 3e 70 4e 65 78 74 20 3d 20 70 43 73 72 2d  d->pNext = pCsr-
2ab60 3e 70 44 65 66 65 72 72 65 64 3b 20 0a 20 20 70  >pDeferred; .  p
2ab70 44 65 66 65 72 72 65 64 2d 3e 69 43 6f 6c 20 3d  Deferred->iCol =
2ab80 20 69 43 6f 6c 3b 0a 20 20 70 43 73 72 2d 3e 70   iCol;.  pCsr->p
2ab90 44 65 66 65 72 72 65 64 20 3d 20 70 44 65 66 65  Deferred = pDefe
2aba0 72 72 65 64 3b 0a 0a 20 20 61 73 73 65 72 74 28  rred;..  assert(
2abb0 20 70 54 6f 6b 65 6e 2d 3e 70 44 65 66 65 72 72   pToken->pDeferr
2abc0 65 64 3d 3d 30 20 29 3b 0a 20 20 70 54 6f 6b 65  ed==0 );.  pToke
2abd0 6e 2d 3e 70 44 65 66 65 72 72 65 64 20 3d 20 70  n->pDeferred = p
2abe0 44 65 66 65 72 72 65 64 3b 0a 0a 20 20 72 65 74  Deferred;..  ret
2abf0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2ac00 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 76  ../*.** SQLite v
2ac10 61 6c 75 65 20 70 52 6f 77 69 64 20 63 6f 6e 74  alue pRowid cont
2ac20 61 69 6e 73 20 74 68 65 20 72 6f 77 69 64 20 6f  ains the rowid o
2ac30 66 20 61 20 72 6f 77 20 74 68 61 74 20 6d 61 79  f a row that may
2ac40 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a   or may not be.*
2ac50 2a 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  * present in the
2ac60 20 46 54 53 33 20 74 61 62 6c 65 2e 20 49 66 20   FTS3 table. If 
2ac70 69 74 20 69 73 2c 20 64 65 6c 65 74 65 20 69 74  it is, delete it
2ac80 20 61 6e 64 20 61 64 6a 75 73 74 20 74 68 65 20   and adjust the 
2ac90 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 73  contents.** of s
2aca0 75 62 73 69 64 75 61 72 79 20 64 61 74 61 20 73  ubsiduary data s
2acb0 74 72 75 63 74 75 72 65 73 20 61 63 63 6f 72 64  tructures accord
2acc0 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ingly..*/.static
2acd0 20 69 6e 74 20 66 74 73 33 44 65 6c 65 74 65 42   int fts3DeleteB
2ace0 79 52 6f 77 69 64 28 0a 20 20 46 74 73 33 54 61  yRowid(.  Fts3Ta
2acf0 62 6c 65 20 2a 70 2c 20 0a 20 20 73 71 6c 69 74  ble *p, .  sqlit
2ad00 65 33 5f 76 61 6c 75 65 20 2a 70 52 6f 77 69 64  e3_value *pRowid
2ad10 2c 20 0a 20 20 69 6e 74 20 2a 70 6e 44 6f 63 2c  , .  int *pnDoc,
2ad20 0a 20 20 75 33 32 20 2a 61 53 7a 44 65 6c 0a 29  .  u32 *aSzDel.)
2ad30 7b 0a 20 20 69 6e 74 20 69 73 45 6d 70 74 79 20  {.  int isEmpty 
2ad40 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
2ad50 66 74 73 33 49 73 45 6d 70 74 79 28 70 2c 20 70  fts3IsEmpty(p, p
2ad60 52 6f 77 69 64 2c 20 26 69 73 45 6d 70 74 79 29  Rowid, &isEmpty)
2ad70 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2ad80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
2ad90 20 69 73 45 6d 70 74 79 20 29 7b 0a 20 20 20 20   isEmpty ){.    
2ada0 20 20 2f 2a 20 44 65 6c 65 74 69 6e 67 20 74 68    /* Deleting th
2adb0 69 73 20 72 6f 77 20 6d 65 61 6e 73 20 74 68 65  is row means the
2adc0 20 77 68 6f 6c 65 20 74 61 62 6c 65 20 69 73 20   whole table is 
2add0 65 6d 70 74 79 2e 20 49 6e 20 74 68 69 73 20 63  empty. In this c
2ade0 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 6c  ase.      ** del
2adf0 65 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ete the contents
2ae00 20 6f 66 20 61 6c 6c 20 74 68 72 65 65 20 74 61   of all three ta
2ae10 62 6c 65 73 20 61 6e 64 20 74 68 72 6f 77 20 61  bles and throw a
2ae20 77 61 79 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a  way any.      **
2ae30 20 64 61 74 61 20 69 6e 20 74 68 65 20 70 65 6e   data in the pen
2ae40 64 69 6e 67 54 65 72 6d 73 20 68 61 73 68 20 74  dingTerms hash t
2ae50 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  able.  */.      
2ae60 72 63 20 3d 20 66 74 73 33 44 65 6c 65 74 65 41  rc = fts3DeleteA
2ae70 6c 6c 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20  ll(p, 1);.      
2ae80 2a 70 6e 44 6f 63 20 3d 20 2a 70 6e 44 6f 63 20  *pnDoc = *pnDoc 
2ae90 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  - 1;.    }else{.
2aea0 20 20 20 20 20 20 66 74 73 33 44 65 6c 65 74 65        fts3Delete
2aeb0 54 65 72 6d 73 28 26 72 63 2c 20 70 2c 20 70 52  Terms(&rc, p, pR
2aec0 6f 77 69 64 2c 20 61 53 7a 44 65 6c 29 3b 0a 20  owid, aSzDel);. 
2aed0 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 43 6f 6e       if( p->zCon
2aee0 74 65 6e 74 54 62 6c 3d 3d 30 20 29 7b 0a 20 20  tentTbl==0 ){.  
2aef0 20 20 20 20 20 20 66 74 73 33 53 71 6c 45 78 65        fts3SqlExe
2af00 63 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45  c(&rc, p, SQL_DE
2af10 4c 45 54 45 5f 43 4f 4e 54 45 4e 54 2c 20 26 70  LETE_CONTENT, &p
2af20 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
2af30 69 66 28 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  if( sqlite3_chan
2af40 67 65 73 28 70 2d 3e 64 62 29 20 29 20 2a 70 6e  ges(p->db) ) *pn
2af50 44 6f 63 20 3d 20 2a 70 6e 44 6f 63 20 2d 20 31  Doc = *pnDoc - 1
2af60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2af70 20 20 20 20 20 20 20 2a 70 6e 44 6f 63 20 3d 20         *pnDoc = 
2af80 2a 70 6e 44 6f 63 20 2d 20 31 3b 0a 20 20 20 20  *pnDoc - 1;.    
2af90 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
2afa0 3e 62 48 61 73 44 6f 63 73 69 7a 65 20 29 7b 0a  >bHasDocsize ){.
2afb0 20 20 20 20 20 20 20 20 66 74 73 33 53 71 6c 45          fts3SqlE
2afc0 78 65 63 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f  xec(&rc, p, SQL_
2afd0 44 45 4c 45 54 45 5f 44 4f 43 53 49 5a 45 2c 20  DELETE_DOCSIZE, 
2afe0 26 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  &pRowid);.      
2aff0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
2b000 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2b010 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2b020 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 66   does the work f
2b030 6f 72 20 74 68 65 20 78 55 70 64 61 74 65 20 6d  or the xUpdate m
2b040 65 74 68 6f 64 20 6f 66 20 46 54 53 33 20 76 69  ethod of FTS3 vi
2b050 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65 73 2e  rtual.** tables.
2b060 20 54 68 65 20 73 63 68 65 6d 61 20 6f 66 20 74   The schema of t
2b070 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
2b080 20 62 65 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20   being:.**.**   
2b090 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 3c    CREATE TABLE <
2b0a0 74 61 62 6c 65 20 6e 61 6d 65 3e 28 20 0a 2a 2a  table name>( .**
2b0b0 20 20 20 20 20 20 20 3c 75 73 65 72 20 63 6f 6c         <user col
2b0c0 75 6d 6e 73 3e 2c 0a 2a 2a 20 20 20 20 20 20 20  umns>,.**       
2b0d0 3c 74 61 62 6c 65 20 6e 61 6d 65 3e 20 48 49 44  <table name> HID
2b0e0 44 45 4e 2c 20 0a 2a 2a 20 20 20 20 20 20 20 64  DEN, .**       d
2b0f0 6f 63 69 64 20 48 49 44 44 45 4e 2c 20 0a 2a 2a  ocid HIDDEN, .**
2b100 20 20 20 20 20 20 20 3c 6c 61 6e 67 69 64 3e 20         <langid> 
2b110 48 49 44 44 45 4e 0a 2a 2a 20 20 20 20 20 29 3b  HIDDEN.**     );
2b120 0a 2a 2a 0a 2a 2a 20 0a 2a 2f 0a 69 6e 74 20 73  .**.** .*/.int s
2b130 71 6c 69 74 65 33 46 74 73 33 55 70 64 61 74 65  qlite3Fts3Update
2b140 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65  Method(.  sqlite
2b150 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20 20  3_vtab *pVtab,  
2b160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
2b170 33 20 76 74 61 62 20 6f 62 6a 65 63 74 20 2a 2f  3 vtab object */
2b180 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20  .  int nArg,    
2b190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1a0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72     /* Size of ar
2b1b0 67 75 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a  gument array */.
2b1c0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
2b1d0 2a 2a 61 70 56 61 6c 2c 20 20 20 20 20 20 20 20  **apVal,        
2b1e0 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72    /* Array of ar
2b1f0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 71 6c  guments */.  sql
2b200 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69  ite_int64 *pRowi
2b210 64 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d            /* 
2b220 4f 55 54 3a 20 54 68 65 20 61 66 66 65 63 74 65  OUT: The affecte
2b230 64 20 28 6f 72 20 65 66 66 65 63 74 65 64 29 20  d (or effected) 
2b240 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 46 74  rowid */.){.  Ft
2b250 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74  s3Table *p = (Ft
2b260 73 33 54 61 62 6c 65 20 2a 29 70 56 74 61 62 3b  s3Table *)pVtab;
2b270 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2b280 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2b290 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
2b2a0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 65 6d  e */.  int isRem
2b2b0 6f 76 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ove = 0;        
2b2c0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
2b2d0 6f 72 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  or an UPDATE or 
2b2e0 44 45 4c 45 54 45 20 2a 2f 0a 20 20 75 33 32 20  DELETE */.  u32 
2b2f0 2a 61 53 7a 49 6e 73 20 3d 20 30 3b 20 20 20 20  *aSzIns = 0;    
2b300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2b310 69 7a 65 73 20 6f 66 20 69 6e 73 65 72 74 65 64  izes of inserted
2b320 20 64 6f 63 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   documents */.  
2b330 75 33 32 20 2a 61 53 7a 44 65 6c 3b 20 20 20 20  u32 *aSzDel;    
2b340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b350 2f 2a 20 53 69 7a 65 73 20 6f 66 20 64 65 6c 65  /* Sizes of dele
2b360 74 65 64 20 64 6f 63 75 6d 65 6e 74 73 20 2a 2f  ted documents */
2b370 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30  .  int nChng = 0
2b380 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b390 20 20 20 2f 2a 20 4e 65 74 20 63 68 61 6e 67 65     /* Net change
2b3a0 20 69 6e 20 6e 75 6d 62 65 72 20 6f 66 20 64 6f   in number of do
2b3b0 63 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  cuments */.  int
2b3c0 20 62 49 6e 73 65 72 74 44 6f 6e 65 20 3d 20 30   bInsertDone = 0
2b3d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
2b3e0 70 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b 0a  pSegments==0 );.
2b3f0 20 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20    assert( .     
2b400 20 6e 41 72 67 3d 3d 31 20 20 20 20 20 20 20 20   nArg==1        
2b410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b420 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e  DELETE operation
2b430 73 20 2a 2f 0a 20 20 20 7c 7c 20 6e 41 72 67 3d  s */.   || nArg=
2b440 3d 28 32 20 2b 20 70 2d 3e 6e 43 6f 6c 75 6d 6e  =(2 + p->nColumn
2b450 20 2b 20 33 29 20 20 2f 2a 20 49 4e 53 45 52 54   + 3)  /* INSERT
2b460 20 6f 72 20 55 50 44 41 54 45 20 6f 70 65 72 61   or UPDATE opera
2b470 74 69 6f 6e 73 20 2a 2f 0a 20 20 29 3b 0a 0a 20  tions */.  );.. 
2b480 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20   /* Check for a 
2b490 22 73 70 65 63 69 61 6c 22 20 49 4e 53 45 52 54  "special" INSERT
2b4a0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 4f 6e 65 20   operation. One 
2b4b0 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a  of the form:.  *
2b4c0 2a 0a 20 20 2a 2a 20 20 20 49 4e 53 45 52 54 20  *.  **   INSERT 
2b4d0 49 4e 54 4f 20 78 79 7a 28 78 79 7a 29 20 56 41  INTO xyz(xyz) VA
2b4e0 4c 55 45 53 28 27 63 6f 6d 6d 61 6e 64 27 29 3b  LUES('command');
2b4f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67  .  */.  if( nArg
2b500 3e 31 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65  >1 .   && sqlite
2b510 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56  3_value_type(apV
2b520 61 6c 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e  al[0])==SQLITE_N
2b530 55 4c 4c 20 0a 20 20 20 26 26 20 73 71 6c 69 74  ULL .   && sqlit
2b540 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70  e3_value_type(ap
2b550 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32  Val[p->nColumn+2
2b560 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  ])!=SQLITE_NULL 
2b570 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  .  ){.    rc = f
2b580 74 73 33 53 70 65 63 69 61 6c 49 6e 73 65 72 74  ts3SpecialInsert
2b590 28 70 2c 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f  (p, apVal[p->nCo
2b5a0 6c 75 6d 6e 2b 32 5d 29 3b 0a 20 20 20 20 67 6f  lumn+2]);.    go
2b5b0 74 6f 20 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20  to update_out;. 
2b5c0 20 7d 0a 0a 20 20 69 66 28 20 6e 41 72 67 3e 31   }..  if( nArg>1
2b5d0 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   && sqlite3_valu
2b5e0 65 5f 69 6e 74 28 61 70 56 61 6c 5b 32 20 2b 20  e_int(apVal[2 + 
2b5f0 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b 20 32 5d 29  p->nColumn + 2])
2b600 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  <0 ){.    rc = S
2b610 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
2b620 3b 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74  ;.    goto updat
2b630 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e_out;.  }..  /*
2b640 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
2b650 74 6f 20 68 6f 6c 64 20 74 68 65 20 63 68 61 6e  to hold the chan
2b660 67 65 20 69 6e 20 64 6f 63 75 6d 65 6e 74 20 73  ge in document s
2b670 69 7a 65 73 20 2a 2f 0a 20 20 61 53 7a 49 6e 73  izes */.  aSzIns
2b680 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
2b690 63 28 20 73 69 7a 65 6f 66 28 61 53 7a 49 6e 73  c( sizeof(aSzIns
2b6a0 5b 30 5d 29 2a 28 70 2d 3e 6e 43 6f 6c 75 6d 6e  [0])*(p->nColumn
2b6b0 2b 31 29 2a 32 20 29 3b 0a 20 20 69 66 28 20 61  +1)*2 );.  if( a
2b6c0 53 7a 49 6e 73 3d 3d 30 20 29 7b 0a 20 20 20 20  SzIns==0 ){.    
2b6d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2b6e0 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61  M;.    goto upda
2b6f0 74 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 61 53  te_out;.  }.  aS
2b700 7a 44 65 6c 20 3d 20 26 61 53 7a 49 6e 73 5b 70  zDel = &aSzIns[p
2b710 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 5d 3b 0a 20 20  ->nColumn+1];.  
2b720 6d 65 6d 73 65 74 28 61 53 7a 49 6e 73 2c 20 30  memset(aSzIns, 0
2b730 2c 20 73 69 7a 65 6f 66 28 61 53 7a 49 6e 73 5b  , sizeof(aSzIns[
2b740 30 5d 29 2a 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  0])*(p->nColumn+
2b750 31 29 2a 32 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  1)*2);..  /* If 
2b760 74 68 69 73 20 69 73 20 61 6e 20 49 4e 53 45 52  this is an INSER
2b770 54 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20  T operation, or 
2b780 61 6e 20 55 50 44 41 54 45 20 74 68 61 74 20 6d  an UPDATE that m
2b790 6f 64 69 66 69 65 73 20 74 68 65 20 72 6f 77 69  odifies the rowi
2b7a0 64 0a 20 20 2a 2a 20 76 61 6c 75 65 2c 20 74 68  d.  ** value, th
2b7b0 65 6e 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  en this operatio
2b7c0 6e 20 72 65 71 75 69 72 65 73 20 63 6f 6e 73 74  n requires const
2b7d0 72 61 69 6e 74 20 68 61 6e 64 6c 69 6e 67 2e 0a  raint handling..
2b7e0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
2b7f0 20 6f 6e 2d 63 6f 6e 66 6c 69 63 74 20 6d 6f 64   on-conflict mod
2b800 65 20 69 73 20 52 45 50 4c 41 43 45 2c 20 74 68  e is REPLACE, th
2b810 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
2b820 65 20 65 78 69 73 74 69 6e 67 20 72 6f 77 0a 20  e existing row. 
2b830 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 64 65   ** should be de
2b840 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64  leted from the d
2b850 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 69  atabase before i
2b860 6e 73 65 72 74 69 6e 67 20 74 68 65 20 6e 65 77  nserting the new
2b870 20 72 6f 77 2e 20 4f 72 2c 0a 20 20 2a 2a 20 69   row. Or,.  ** i
2b880 66 20 74 68 65 20 6f 6e 2d 63 6f 6e 66 6c 69 63  f the on-conflic
2b890 74 20 6d 6f 64 65 20 69 73 20 6f 74 68 65 72 20  t mode is other 
2b8a0 74 68 61 6e 20 52 45 50 4c 41 43 45 2c 20 74 68  than REPLACE, th
2b8b0 65 6e 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6d  en this method m
2b8c0 75 73 74 0a 20 20 2a 2a 20 64 65 74 65 63 74 20  ust.  ** detect 
2b8d0 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6e 64  the conflict and
2b8e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2b8f0 4f 4e 53 54 52 41 49 4e 54 20 62 65 66 6f 72 65  ONSTRAINT before
2b900 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 20 20   beginning to.  
2b910 2a 2a 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61  ** modify the da
2b920 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
2b930 2f 0a 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26  /.  if( nArg>1 &
2b940 26 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c  & p->zContentTbl
2b950 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69  ==0 ){.    /* Fi
2b960 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 62 6a  nd the value obj
2b970 65 63 74 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ect that holds t
2b980 68 65 20 6e 65 77 20 72 6f 77 69 64 20 76 61 6c  he new rowid val
2b990 75 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ue. */.    sqlit
2b9a0 65 33 5f 76 61 6c 75 65 20 2a 70 4e 65 77 52 6f  e3_value *pNewRo
2b9b0 77 69 64 20 3d 20 61 70 56 61 6c 5b 33 2b 70 2d  wid = apVal[3+p-
2b9c0 3e 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 69  >nColumn];.    i
2b9d0 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
2b9e0 5f 74 79 70 65 28 70 4e 65 77 52 6f 77 69 64 29  _type(pNewRowid)
2b9f0 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b  ==SQLITE_NULL ){
2ba00 0a 20 20 20 20 20 20 70 4e 65 77 52 6f 77 69 64  .      pNewRowid
2ba10 20 3d 20 61 70 56 61 6c 5b 31 5d 3b 0a 20 20 20   = apVal[1];.   
2ba20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69   }..    if( sqli
2ba30 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70  te3_value_type(p
2ba40 4e 65 77 52 6f 77 69 64 29 21 3d 53 51 4c 49 54  NewRowid)!=SQLIT
2ba50 45 5f 4e 55 4c 4c 20 26 26 20 28 20 0a 20 20 20  E_NULL && ( .   
2ba60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
2ba70 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 30 5d  ue_type(apVal[0]
2ba80 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20  )==SQLITE_NULL. 
2ba90 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 76      || sqlite3_v
2baa0 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 56 61 6c  alue_int64(apVal
2bab0 5b 30 5d 29 21 3d 73 71 6c 69 74 65 33 5f 76 61  [0])!=sqlite3_va
2bac0 6c 75 65 5f 69 6e 74 36 34 28 70 4e 65 77 52 6f  lue_int64(pNewRo
2bad0 77 69 64 29 0a 20 20 20 20 29 29 7b 0a 20 20 20  wid).    )){.   
2bae0 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f     /* The new ro
2baf0 77 69 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  wid is not NULL 
2bb00 28 69 6e 20 74 68 69 73 20 63 61 73 65 20 74 68  (in this case th
2bb10 65 20 72 6f 77 69 64 20 77 69 6c 6c 20 62 65 0a  e rowid will be.
2bb20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74        ** automat
2bb30 69 63 61 6c 6c 79 20 61 73 73 69 67 6e 65 64 20  ically assigned 
2bb40 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
2bb50 63 68 61 6e 63 65 20 6f 66 20 61 20 63 6f 6e 66  chance of a conf
2bb60 6c 69 63 74 29 2c 20 61 6e 64 20 0a 20 20 20 20  lict), and .    
2bb70 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
2bb80 6e 74 20 69 73 20 65 69 74 68 65 72 20 61 6e 20  nt is either an 
2bb90 49 4e 53 45 52 54 20 6f 72 20 61 6e 20 55 50 44  INSERT or an UPD
2bba0 41 54 45 20 74 68 61 74 20 6d 6f 64 69 66 69 65  ATE that modifie
2bbb0 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72  s the.      ** r
2bbc0 6f 77 69 64 20 63 6f 6c 75 6d 6e 2e 20 53 6f 20  owid column. So 
2bbd0 69 66 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20  if the conflict 
2bbe0 6d 6f 64 65 20 69 73 20 52 45 50 4c 41 43 45 2c  mode is REPLACE,
2bbf0 20 74 68 65 6e 20 64 65 6c 65 74 65 20 61 6e 79   then delete any
2bc00 0a 20 20 20 20 20 20 2a 2a 20 65 78 69 73 74 69  .      ** existi
2bc10 6e 67 20 72 6f 77 20 77 69 74 68 20 72 6f 77 69  ng row with rowi
2bc20 64 3d 70 4e 65 77 52 6f 77 69 64 2e 20 0a 20 20  d=pNewRowid. .  
2bc30 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2bc40 4f 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 66 6c  Or, if the confl
2bc50 69 63 74 20 6d 6f 64 65 20 69 73 20 6e 6f 74 20  ict mode is not 
2bc60 52 45 50 4c 41 43 45 2c 20 69 6e 73 65 72 74 20  REPLACE, insert 
2bc70 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 69  the new record i
2bc80 6e 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  nto .      ** th
2bc90 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c  e %_content tabl
2bca0 65 2e 20 49 66 20 77 65 20 68 69 74 20 74 68 65  e. If we hit the
2bcb0 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77 69 64   duplicate rowid
2bcc0 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 6f 72 20   constraint (or 
2bcd0 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  any.      ** oth
2bce0 65 72 20 65 72 72 6f 72 29 20 77 68 69 6c 65 20  er error) while 
2bcf0 64 6f 69 6e 67 20 73 6f 2c 20 72 65 74 75 72 6e  doing so, return
2bd00 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
2bd10 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2bd20 54 68 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20  This branch may 
2bd30 61 6c 73 6f 20 72 75 6e 20 69 66 20 70 4e 65 77  also run if pNew
2bd40 52 6f 77 69 64 20 63 6f 6e 74 61 69 6e 73 20 61  Rowid contains a
2bd50 20 76 61 6c 75 65 20 74 68 61 74 20 63 61 6e 6e   value that cann
2bd60 6f 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 6c  ot.      ** be l
2bd70 6f 73 73 6c 65 73 73 6c 79 20 63 6f 6e 76 65 72  osslessly conver
2bd80 74 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  ted to an intege
2bd90 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  r. In this case,
2bda0 20 74 68 65 20 65 76 65 6e 74 75 61 6c 20 0a 20   the eventual . 
2bdb0 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
2bdc0 66 74 73 33 49 6e 73 65 72 74 44 61 74 61 28 29  fts3InsertData()
2bdd0 20 28 65 69 74 68 65 72 20 6a 75 73 74 20 62 65   (either just be
2bde0 6c 6f 77 20 6f 72 20 66 75 72 74 68 65 72 20 6f  low or further o
2bdf0 6e 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 20  n in this.      
2be00 2a 2a 20 66 75 6e 63 74 69 6f 6e 29 20 77 69 6c  ** function) wil
2be10 6c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  l return SQLITE_
2be20 4d 49 53 4d 41 54 43 48 2e 20 49 66 20 66 74 73  MISMATCH. If fts
2be30 33 44 65 6c 65 74 65 42 79 52 6f 77 69 64 20 69  3DeleteByRowid i
2be40 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 6f  s .      ** invo
2be50 6b 65 64 2c 20 69 74 20 77 69 6c 6c 20 64 65 6c  ked, it will del
2be60 65 74 65 20 7a 65 72 6f 20 72 6f 77 73 20 28 73  ete zero rows (s
2be70 69 6e 63 65 20 6e 6f 20 72 6f 77 20 77 69 6c 6c  ince no row will
2be80 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 64   have.      ** d
2be90 6f 63 69 64 3d 24 70 4e 65 77 52 6f 77 69 64 20  ocid=$pNewRowid 
2bea0 69 66 20 24 70 4e 65 77 52 6f 77 69 64 20 69 73  if $pNewRowid is
2beb0 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
2bec0 76 61 6c 75 65 29 2e 0a 20 20 20 20 20 20 2a 2f  value)..      */
2bed0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2bee0 65 33 5f 76 74 61 62 5f 6f 6e 5f 63 6f 6e 66 6c  e3_vtab_on_confl
2bef0 69 63 74 28 70 2d 3e 64 62 29 3d 3d 53 51 4c 49  ict(p->db)==SQLI
2bf00 54 45 5f 52 45 50 4c 41 43 45 20 29 7b 0a 20 20  TE_REPLACE ){.  
2bf10 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 44        rc = fts3D
2bf20 65 6c 65 74 65 42 79 52 6f 77 69 64 28 70 2c 20  eleteByRowid(p, 
2bf30 70 4e 65 77 52 6f 77 69 64 2c 20 26 6e 43 68 6e  pNewRowid, &nChn
2bf40 67 2c 20 61 53 7a 44 65 6c 29 3b 0a 20 20 20 20  g, aSzDel);.    
2bf50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2bf60 20 72 63 20 3d 20 66 74 73 33 49 6e 73 65 72 74   rc = fts3Insert
2bf70 44 61 74 61 28 70 2c 20 61 70 56 61 6c 2c 20 70  Data(p, apVal, p
2bf80 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
2bf90 62 49 6e 73 65 72 74 44 6f 6e 65 20 3d 20 31 3b  bInsertDone = 1;
2bfa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2bfb0 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
2bfc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
2bfd0 74 6f 20 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20  to update_out;. 
2bfe0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
2bff0 20 69 73 20 61 20 44 45 4c 45 54 45 20 6f 72 20   is a DELETE or 
2c000 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e  UPDATE operation
2c010 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 6c 64  , remove the old
2c020 20 72 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 69 66   record. */.  if
2c030 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
2c040 74 79 70 65 28 61 70 56 61 6c 5b 30 5d 29 21 3d  type(apVal[0])!=
2c050 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20  SQLITE_NULL ){. 
2c060 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2c070 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70  e3_value_type(ap
2c080 56 61 6c 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f  Val[0])==SQLITE_
2c090 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 72  INTEGER );.    r
2c0a0 63 20 3d 20 66 74 73 33 44 65 6c 65 74 65 42 79  c = fts3DeleteBy
2c0b0 52 6f 77 69 64 28 70 2c 20 61 70 56 61 6c 5b 30  Rowid(p, apVal[0
2c0c0 5d 2c 20 26 6e 43 68 6e 67 2c 20 61 53 7a 44 65  ], &nChng, aSzDe
2c0d0 6c 29 3b 0a 20 20 20 20 69 73 52 65 6d 6f 76 65  l);.    isRemove
2c0e0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
2c0f0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
2c100 49 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54 45  INSERT or UPDATE
2c110 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 73 65   operation, inse
2c120 72 74 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  rt the new recor
2c130 64 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67  d. */.  if( nArg
2c140 3e 31 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  >1 && rc==SQLITE
2c150 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  _OK ){.    int i
2c160 4c 61 6e 67 69 64 20 3d 20 73 71 6c 69 74 65 33  Langid = sqlite3
2c170 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c  _value_int(apVal
2c180 5b 32 20 2b 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20  [2 + p->nColumn 
2c190 2b 20 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 62  + 2]);.    if( b
2c1a0 49 6e 73 65 72 74 44 6f 6e 65 3d 3d 30 20 29 7b  InsertDone==0 ){
2c1b0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33  .      rc = fts3
2c1c0 49 6e 73 65 72 74 44 61 74 61 28 70 2c 20 61 70  InsertData(p, ap
2c1d0 56 61 6c 2c 20 70 52 6f 77 69 64 29 3b 0a 20 20  Val, pRowid);.  
2c1e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c1f0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26  TE_CONSTRAINT &&
2c200 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d   p->zContentTbl=
2c210 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
2c220 20 3d 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56   = FTS_CORRUPT_V
2c230 54 41 42 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  TAB;.      }.   
2c240 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
2c250 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 21 69 73  QLITE_OK && (!is
2c260 52 65 6d 6f 76 65 20 7c 7c 20 2a 70 52 6f 77 69  Remove || *pRowi
2c270 64 21 3d 70 2d 3e 69 50 72 65 76 44 6f 63 69 64  d!=p->iPrevDocid
2c280 20 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   ) ){.      rc =
2c290 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d   fts3PendingTerm
2c2a0 73 44 6f 63 69 64 28 70 2c 20 69 4c 61 6e 67 69  sDocid(p, iLangi
2c2b0 64 2c 20 2a 70 52 6f 77 69 64 29 3b 0a 20 20 20  d, *pRowid);.   
2c2c0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
2c2d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c2e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 50 72    assert( p->iPr
2c2f0 65 76 44 6f 63 69 64 3d 3d 2a 70 52 6f 77 69 64  evDocid==*pRowid
2c300 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   );.      rc = f
2c310 74 73 33 49 6e 73 65 72 74 54 65 72 6d 73 28 70  ts3InsertTerms(p
2c320 2c 20 69 4c 61 6e 67 69 64 2c 20 61 70 56 61 6c  , iLangid, apVal
2c330 2c 20 61 53 7a 49 6e 73 29 3b 0a 20 20 20 20 7d  , aSzIns);.    }
2c340 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 48 61 73  .    if( p->bHas
2c350 44 6f 63 73 69 7a 65 20 29 7b 0a 20 20 20 20 20  Docsize ){.     
2c360 20 66 74 73 33 49 6e 73 65 72 74 44 6f 63 73 69   fts3InsertDocsi
2c370 7a 65 28 26 72 63 2c 20 70 2c 20 61 53 7a 49 6e  ze(&rc, p, aSzIn
2c380 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43  s);.    }.    nC
2c390 68 6e 67 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66  hng++;.  }..  if
2c3a0 28 20 70 2d 3e 62 46 74 73 34 20 29 7b 0a 20 20  ( p->bFts4 ){.  
2c3b0 20 20 66 74 73 33 55 70 64 61 74 65 44 6f 63 54    fts3UpdateDocT
2c3c0 6f 74 61 6c 73 28 26 72 63 2c 20 70 2c 20 61 53  otals(&rc, p, aS
2c3d0 7a 49 6e 73 2c 20 61 53 7a 44 65 6c 2c 20 6e 43  zIns, aSzDel, nC
2c3e0 68 6e 67 29 3b 0a 20 20 7d 0a 0a 20 75 70 64 61  hng);.  }.. upda
2c3f0 74 65 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  te_out:.  sqlite
2c400 33 5f 66 72 65 65 28 61 53 7a 49 6e 73 29 3b 0a  3_free(aSzIns);.
2c410 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67    sqlite3Fts3Seg
2c420 6d 65 6e 74 73 43 6c 6f 73 65 28 70 29 3b 0a 20  mentsClose(p);. 
2c430 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2c440 2a 20 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20  * .** Flush any 
2c450 64 61 74 61 20 69 6e 20 74 68 65 20 70 65 6e 64  data in the pend
2c460 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20 74  ing-terms hash t
2c470 61 62 6c 65 20 74 6f 20 64 69 73 6b 2e 20 49 66  able to disk. If
2c480 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20   successful,.** 
2c490 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d 65 6e  merge all segmen
2c4a0 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ts in the databa
2c4b0 73 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 68  se (including th
2c4c0 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 2c 20 69  e new segment, i
2c4d0 66 20 0a 2a 2a 20 74 68 65 72 65 20 77 61 73 20  f .** there was 
2c4e0 61 6e 79 20 64 61 74 61 20 74 6f 20 66 6c 75 73  any data to flus
2c4f0 68 29 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  h) into a single
2c500 20 73 65 67 6d 65 6e 74 2e 20 0a 2a 2f 0a 69 6e   segment. .*/.in
2c510 74 20 73 71 6c 69 74 65 33 46 74 73 33 4f 70 74  t sqlite3Fts3Opt
2c520 69 6d 69 7a 65 28 46 74 73 33 54 61 62 6c 65 20  imize(Fts3Table 
2c530 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
2c540 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
2c550 65 63 28 70 2d 3e 64 62 2c 20 22 53 41 56 45 50  ec(p->db, "SAVEP
2c560 4f 49 4e 54 20 66 74 73 33 22 2c 20 30 2c 20 30  OINT fts3", 0, 0
2c570 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
2c580 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c590 20 72 63 20 3d 20 66 74 73 33 44 6f 4f 70 74 69   rc = fts3DoOpti
2c5a0 6d 69 7a 65 28 70 2c 20 31 29 3b 0a 20 20 20 20  mize(p, 1);.    
2c5b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2c5c0 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
2c5d0 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 6e  DONE ){.      in
2c5e0 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f  t rc2 = sqlite3_
2c5f0 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c  exec(p->db, "REL
2c600 45 41 53 45 20 66 74 73 33 22 2c 20 30 2c 20 30  EASE fts3", 0, 0
2c610 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2c620 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
2c630 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
2c640 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
2c650 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
2c660 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 66 74 73  "ROLLBACK TO fts
2c670 33 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  3", 0, 0, 0);.  
2c680 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
2c690 28 70 2d 3e 64 62 2c 20 22 52 45 4c 45 41 53 45  (p->db, "RELEASE
2c6a0 20 66 74 73 33 22 2c 20 30 2c 20 30 2c 20 30 29   fts3", 0, 0, 0)
2c6b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
2c6c0 6c 69 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74  lite3Fts3Segment
2c6d0 73 43 6c 6f 73 65 28 70 29 3b 0a 20 20 72 65 74  sClose(p);.  ret
2c6e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69  urn rc;.}..#endi
2c6f0 66 0a                                            f.