/ Hex Artifact Content
Login

Artifact dda9bec5dac9ecccbbd7b75a6b84bbef4729390c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 39 20 4f 63 74 20 32  /*.** 2009 Oct 2
0010: 33 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  3.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 69 73 20 70 61 72 74 20 6f 66   file is part of
0190: 20 74 68 65 20 53 51 4c 69 74 65 20 46 54 53 33   the SQLite FTS3
01a0: 20 65 78 74 65 6e 73 69 6f 6e 20 6d 6f 64 75 6c   extension modul
01b0: 65 2e 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c  e. Specifically,
01c0: 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 20 63 6f  .** this file co
01d0: 6e 74 61 69 6e 73 20 63 6f 64 65 20 74 6f 20 69  ntains code to i
01e0: 6e 73 65 72 74 2c 20 75 70 64 61 74 65 20 61 6e  nsert, update an
01f0: 64 20 64 65 6c 65 74 65 20 72 6f 77 73 20 66 72  d delete rows fr
0200: 6f 6d 20 46 54 53 33 0a 2a 2a 20 74 61 62 6c 65  om FTS3.** table
0210: 73 2e 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61  s. It also conta
0220: 69 6e 73 20 63 6f 64 65 20 74 6f 20 6d 65 72 67  ins code to merg
0230: 65 20 46 54 53 33 20 62 2d 74 72 65 65 20 73 65  e FTS3 b-tree se
0240: 67 6d 65 6e 74 73 2e 20 53 6f 6d 65 0a 2a 2a 20  gments. Some.** 
0250: 6f 66 20 74 68 65 20 73 75 62 2d 72 6f 75 74 69  of the sub-routi
0260: 6e 65 73 20 75 73 65 64 20 74 6f 20 6d 65 72 67  nes used to merg
0270: 65 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20 61  e segments are a
0280: 6c 73 6f 20 75 73 65 64 20 62 79 20 74 68 65 20  lso used by the 
0290: 71 75 65 72 79 20 0a 2a 2a 20 63 6f 64 65 20 69  query .** code i
02a0: 6e 20 66 74 73 33 2e 63 2e 0a 2a 2f 0a 0a 23 69  n fts3.c..*/..#i
02b0: 6e 63 6c 75 64 65 20 22 66 74 73 33 49 6e 74 2e  nclude "fts3Int.
02c0: 68 22 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  h".#if !defined(
02d0: 53 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20  SQLITE_CORE) || 
02e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
02f0: 4e 41 42 4c 45 5f 46 54 53 33 29 0a 0a 23 69 6e  NABLE_FTS3)..#in
0300: 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e  clude <string.h>
0310: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  .#include <asser
0320: 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  t.h>.#include <s
0330: 74 64 6c 69 62 2e 68 3e 0a 0a 0a 23 64 65 66 69  tdlib.h>...#defi
0340: 6e 65 20 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e  ne FTS_MAX_APPEN
0350: 44 41 42 4c 45 5f 48 45 49 47 48 54 20 31 36 0a  DABLE_HEIGHT 16.
0360: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 66 75 6c 6c  ./*.** When full
0370: 2d 74 65 78 74 20 69 6e 64 65 78 20 6e 6f 64 65  -text index node
0380: 73 20 61 72 65 20 6c 6f 61 64 65 64 20 66 72 6f  s are loaded fro
0390: 6d 20 64 69 73 6b 2c 20 74 68 65 20 62 75 66 66  m disk, the buff
03a0: 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20  er that they.** 
03b0: 61 72 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20  are loaded into 
03c0: 68 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  has the followin
03d0: 67 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  g number of byte
03e0: 73 20 6f 66 20 70 61 64 64 69 6e 67 20 61 74 20  s of padding at 
03f0: 74 68 65 20 65 6e 64 20 0a 2a 2a 20 6f 66 20 69  the end .** of i
0400: 74 2e 20 69 2e 65 2e 20 69 66 20 61 20 66 75 6c  t. i.e. if a ful
0410: 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 6e 6f 64  l-text index nod
0420: 65 20 69 73 20 39 30 30 20 62 79 74 65 73 20 69  e is 900 bytes i
0430: 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 61 20 62  n size, then a b
0440: 75 66 66 65 72 0a 2a 2a 20 6f 66 20 39 32 30 20  uffer.** of 920 
0450: 62 79 74 65 73 20 69 73 20 61 6c 6c 6f 63 61 74  bytes is allocat
0460: 65 64 20 66 6f 72 20 69 74 2e 0a 2a 2a 0a 2a 2a  ed for it..**.**
0470: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
0480: 20 69 66 20 77 65 20 68 61 76 65 20 61 20 70 6f   if we have a po
0490: 69 6e 74 65 72 20 69 6e 74 6f 20 61 20 62 75 66  inter into a buf
04a0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e  fer containing n
04b0: 6f 64 65 20 64 61 74 61 2c 0a 2a 2a 20 69 74 20  ode data,.** it 
04c0: 69 73 20 61 6c 77 61 79 73 20 73 61 66 65 20 74  is always safe t
04d0: 6f 20 72 65 61 64 20 75 70 20 74 6f 20 74 77 6f  o read up to two
04e0: 20 76 61 72 69 6e 74 73 20 66 72 6f 6d 20 69 74   varints from it
04f0: 20 77 69 74 68 6f 75 74 20 72 69 73 6b 69 6e 67   without risking
0500: 20 61 6e 0a 2a 2a 20 6f 76 65 72 72 65 61 64 2c   an.** overread,
0510: 20 65 76 65 6e 20 69 66 20 74 68 65 20 6e 6f 64   even if the nod
0520: 65 20 64 61 74 61 20 69 73 20 63 6f 72 72 75 70  e data is corrup
0530: 74 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ted..*/.#define 
0540: 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49 4e  FTS3_NODE_PADDIN
0550: 47 20 28 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d  G (FTS3_VARINT_M
0560: 41 58 2a 32 29 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64  AX*2)../*.** Und
0570: 65 72 20 63 65 72 74 61 69 6e 20 63 69 72 63 75  er certain circu
0580: 6d 73 74 61 6e 63 65 73 2c 20 62 2d 74 72 65 65  mstances, b-tree
0590: 20 6e 6f 64 65 73 20 28 64 6f 63 6c 69 73 74 73   nodes (doclists
05a0: 29 20 63 61 6e 20 62 65 20 6c 6f 61 64 65 64 20  ) can be loaded 
05b0: 69 6e 74 6f 0a 2a 2a 20 6d 65 6d 6f 72 79 20 69  into.** memory i
05c0: 6e 63 72 65 6d 65 6e 74 61 6c 6c 79 20 69 6e 73  ncrementally ins
05d0: 74 65 61 64 20 6f 66 20 61 6c 6c 20 61 74 20 6f  tead of all at o
05e0: 6e 63 65 2e 20 54 68 69 73 20 63 61 6e 20 62 65  nce. This can be
05f0: 20 61 20 62 69 67 20 70 65 72 66 6f 72 6d 61 6e   a big performan
0600: 63 65 0a 2a 2a 20 77 69 6e 20 28 72 65 64 75 63  ce.** win (reduc
0610: 65 64 20 49 4f 20 61 6e 64 20 43 50 55 29 20 69  ed IO and CPU) i
0620: 66 20 53 51 4c 69 74 65 20 73 74 6f 70 73 20 63  f SQLite stops c
0630: 61 6c 6c 69 6e 67 20 74 68 65 20 76 69 72 74 75  alling the virtu
0640: 61 6c 20 74 61 62 6c 65 20 78 4e 65 78 74 28 29  al table xNext()
0650: 0a 2a 2a 20 6d 65 74 68 6f 64 20 62 65 66 6f 72  .** method befor
0660: 65 20 72 65 74 72 69 65 76 69 6e 67 20 61 6c 6c  e retrieving all
0670: 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 28   query results (
0680: 61 73 20 6d 61 79 20 68 61 70 70 65 6e 2c 20 66  as may happen, f
0690: 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 69  or example,.** i
06a0: 66 20 61 20 71 75 65 72 79 20 68 61 73 20 61 20  f a query has a 
06b0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 29 2e 0a 2a  LIMIT clause)..*
06c0: 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 61 6c  *.** Incremental
06d0: 20 6c 6f 61 64 69 6e 67 20 69 73 20 75 73 65 64   loading is used
06e0: 20 66 6f 72 20 62 2d 74 72 65 65 20 6e 6f 64 65   for b-tree node
06f0: 73 20 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e  s FTS3_NODE_CHUN
0700: 4b 5f 54 48 52 45 53 48 4f 4c 44 20 0a 2a 2a 20  K_THRESHOLD .** 
0710: 62 79 74 65 73 20 61 6e 64 20 6c 61 72 67 65 72  bytes and larger
0720: 2e 20 4e 6f 64 65 73 20 61 72 65 20 6c 6f 61 64  . Nodes are load
0730: 65 64 20 69 6e 20 63 68 75 6e 6b 73 20 6f 66 20  ed in chunks of 
0740: 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 53  FTS3_NODE_CHUNKS
0750: 49 5a 45 20 62 79 74 65 73 2e 0a 2a 2a 20 54 68  IZE bytes..** Th
0760: 65 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  e code is writte
0770: 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 68 61  n so that the ha
0780: 72 64 20 6c 6f 77 65 72 2d 6c 69 6d 69 74 20 66  rd lower-limit f
0790: 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 73 65  or each of these
07a0: 20 76 61 6c 75 65 73 20 0a 2a 2a 20 69 73 20 31   values .** is 1
07b0: 2e 20 43 6c 65 61 72 6c 79 20 73 75 63 68 20 73  . Clearly such s
07c0: 6d 61 6c 6c 20 76 61 6c 75 65 73 20 77 6f 75 6c  mall values woul
07d0: 64 20 62 65 20 69 6e 65 66 66 69 63 69 65 6e 74  d be inefficient
07e0: 2c 20 62 75 74 20 63 61 6e 20 62 65 20 75 73 65  , but can be use
07f0: 66 75 6c 20 0a 2a 2a 20 66 6f 72 20 74 65 73 74  ful .** for test
0800: 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2a  ing purposes..**
0810: 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 6f 64 75  .** If this modu
0820: 6c 65 20 69 73 20 62 75 69 6c 74 20 77 69 74 68  le is built with
0830: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 64 65 66   SQLITE_TEST def
0840: 69 6e 65 64 2c 20 74 68 65 73 65 20 63 6f 6e 73  ined, these cons
0850: 74 61 6e 74 73 20 6d 61 79 0a 2a 2a 20 62 65 20  tants may.** be 
0860: 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75  overridden at ru
0870: 6e 74 69 6d 65 20 66 6f 72 20 74 65 73 74 69 6e  ntime for testin
0880: 67 20 70 75 72 70 6f 73 65 73 2e 20 46 69 6c 65  g purposes. File
0890: 20 66 74 73 33 5f 74 65 73 74 2e 63 20 63 6f 6e   fts3_test.c con
08a0: 74 61 69 6e 73 0a 2a 2a 20 61 20 54 63 6c 20 69  tains.** a Tcl i
08b0: 6e 74 65 72 66 61 63 65 20 74 6f 20 72 65 61 64  nterface to read
08c0: 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 76   and write the v
08d0: 61 6c 75 65 73 2e 0a 2a 2f 0a 23 69 66 64 65 66  alues..*/.#ifdef
08e0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
08f0: 20 74 65 73 74 5f 66 74 73 33 5f 6e 6f 64 65 5f   test_fts3_node_
0900: 63 68 75 6e 6b 73 69 7a 65 20 3d 20 28 34 2a 31  chunksize = (4*1
0910: 30 32 34 29 3b 0a 69 6e 74 20 74 65 73 74 5f 66  024);.int test_f
0920: 74 73 33 5f 6e 6f 64 65 5f 63 68 75 6e 6b 5f 74  ts3_node_chunk_t
0930: 68 72 65 73 68 6f 6c 64 20 3d 20 28 34 2a 31 30  hreshold = (4*10
0940: 32 34 29 2a 34 3b 0a 23 20 64 65 66 69 6e 65 20  24)*4;.# define 
0950: 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 53  FTS3_NODE_CHUNKS
0960: 49 5a 45 20 20 20 20 20 20 20 74 65 73 74 5f 66  IZE       test_f
0970: 74 73 33 5f 6e 6f 64 65 5f 63 68 75 6e 6b 73 69  ts3_node_chunksi
0980: 7a 65 0a 23 20 64 65 66 69 6e 65 20 46 54 53 33  ze.# define FTS3
0990: 5f 4e 4f 44 45 5f 43 48 55 4e 4b 5f 54 48 52 45  _NODE_CHUNK_THRE
09a0: 53 48 4f 4c 44 20 74 65 73 74 5f 66 74 73 33 5f  SHOLD test_fts3_
09b0: 6e 6f 64 65 5f 63 68 75 6e 6b 5f 74 68 72 65 73  node_chunk_thres
09c0: 68 6f 6c 64 0a 23 65 6c 73 65 0a 23 20 64 65 66  hold.#else.# def
09d0: 69 6e 65 20 46 54 53 33 5f 4e 4f 44 45 5f 43 48  ine FTS3_NODE_CH
09e0: 55 4e 4b 53 49 5a 45 20 28 34 2a 31 30 32 34 29  UNKSIZE (4*1024)
09f0: 20 0a 23 20 64 65 66 69 6e 65 20 46 54 53 33 5f   .# define FTS3_
0a00: 4e 4f 44 45 5f 43 48 55 4e 4b 5f 54 48 52 45 53  NODE_CHUNK_THRES
0a10: 48 4f 4c 44 20 28 46 54 53 33 5f 4e 4f 44 45 5f  HOLD (FTS3_NODE_
0a20: 43 48 55 4e 4b 53 49 5a 45 2a 34 29 0a 23 65 6e  CHUNKSIZE*4).#en
0a30: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  dif../*.** The t
0a40: 77 6f 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d  wo values that m
0a50: 61 79 20 62 65 20 6d 65 61 6e 69 6e 67 66 75 6c  ay be meaningful
0a60: 6c 79 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 20  ly bound to the 
0a70: 3a 31 20 70 61 72 61 6d 65 74 65 72 20 69 6e 0a  :1 parameter in.
0a80: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 53 51  ** statements SQ
0a90: 4c 5f 52 45 50 4c 41 43 45 5f 53 54 41 54 20 61  L_REPLACE_STAT a
0aa0: 6e 64 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 54  nd SQL_SELECT_ST
0ab0: 41 54 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46  AT..*/.#define F
0ac0: 54 53 5f 53 54 41 54 5f 44 4f 43 54 4f 54 41 4c  TS_STAT_DOCTOTAL
0ad0: 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20        0.#define 
0ae0: 46 54 53 5f 53 54 41 54 5f 49 4e 43 52 4d 45 52  FTS_STAT_INCRMER
0af0: 47 45 48 49 4e 54 20 31 0a 23 64 65 66 69 6e 65  GEHINT 1.#define
0b00: 20 46 54 53 5f 53 54 41 54 5f 41 55 54 4f 49 4e   FTS_STAT_AUTOIN
0b10: 43 52 4d 45 52 47 45 20 32 0a 0a 2f 2a 0a 2a 2a  CRMERGE 2../*.**
0b20: 20 49 66 20 46 54 53 5f 4c 4f 47 5f 4d 45 52 47   If FTS_LOG_MERG
0b30: 45 53 20 69 73 20 64 65 66 69 6e 65 64 2c 20 63  ES is defined, c
0b40: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  all sqlite3_log(
0b50: 29 20 74 6f 20 72 65 70 6f 72 74 20 65 61 63 68  ) to report each
0b60: 20 61 75 74 6f 6d 61 74 69 63 0a 2a 2a 20 61 6e   automatic.** an
0b70: 64 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  d incremental me
0b80: 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 20 74 68  rge operation th
0b90: 61 74 20 74 61 6b 65 73 20 70 6c 61 63 65 2e 20  at takes place. 
0ba0: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
0bb0: 20 0a 2a 2a 20 64 65 62 75 67 67 69 6e 67 20 46   .** debugging F
0bc0: 54 53 20 6f 6e 6c 79 2c 20 69 74 20 73 68 6f 75  TS only, it shou
0bd0: 6c 64 20 6e 6f 74 20 75 73 75 61 6c 6c 79 20 62  ld not usually b
0be0: 65 20 74 75 72 6e 65 64 20 6f 6e 20 69 6e 20 70  e turned on in p
0bf0: 72 6f 64 75 63 74 69 6f 6e 0a 2a 2a 20 73 79 73  roduction.** sys
0c00: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  tems..*/.#ifdef 
0c10: 46 54 53 33 5f 4c 4f 47 5f 4d 45 52 47 45 53 0a  FTS3_LOG_MERGES.
0c20: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
0c30: 4c 6f 67 4d 65 72 67 65 28 69 6e 74 20 6e 4d 65  LogMerge(int nMe
0c40: 72 67 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  rge, sqlite3_int
0c50: 36 34 20 69 41 62 73 4c 65 76 65 6c 29 7b 0a 20  64 iAbsLevel){. 
0c60: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
0c70: 49 54 45 5f 4f 4b 2c 20 22 25 64 2d 77 61 79 20  ITE_OK, "%d-way 
0c80: 6d 65 72 67 65 20 66 72 6f 6d 20 6c 65 76 65 6c  merge from level
0c90: 20 25 64 22 2c 20 6e 4d 65 72 67 65 2c 20 28 69   %d", nMerge, (i
0ca0: 6e 74 29 69 41 62 73 4c 65 76 65 6c 29 3b 0a 7d  nt)iAbsLevel);.}
0cb0: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 66  .#else.#define f
0cc0: 74 73 33 4c 6f 67 4d 65 72 67 65 28 78 2c 20 79  ts3LogMerge(x, y
0cd0: 29 0a 23 65 6e 64 69 66 0a 0a 0a 74 79 70 65 64  ).#endif...typed
0ce0: 65 66 20 73 74 72 75 63 74 20 50 65 6e 64 69 6e  ef struct Pendin
0cf0: 67 4c 69 73 74 20 50 65 6e 64 69 6e 67 4c 69 73  gList PendingLis
0d00: 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  t;.typedef struc
0d10: 74 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 53 65  t SegmentNode Se
0d20: 67 6d 65 6e 74 4e 6f 64 65 3b 0a 74 79 70 65 64  gmentNode;.typed
0d30: 65 66 20 73 74 72 75 63 74 20 53 65 67 6d 65 6e  ef struct Segmen
0d40: 74 57 72 69 74 65 72 20 53 65 67 6d 65 6e 74 57  tWriter SegmentW
0d50: 72 69 74 65 72 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  riter;../*.** An
0d60: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
0d70: 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 61 74 61 20   following data 
0d80: 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65  structure is use
0d90: 64 20 74 6f 20 62 75 69 6c 64 20 64 6f 63 6c 69  d to build docli
0da0: 73 74 73 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74  sts.** increment
0db0: 61 6c 6c 79 2e 20 53 65 65 20 66 75 6e 63 74 69  ally. See functi
0dc0: 6f 6e 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69  on fts3PendingLi
0dd0: 73 74 41 70 70 65 6e 64 28 29 20 66 6f 72 20 64  stAppend() for d
0de0: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 73 74 72 75 63  etails..*/.struc
0df0: 74 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 7b 0a  t PendingList {.
0e00: 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20 20 63    int nData;.  c
0e10: 68 61 72 20 2a 61 44 61 74 61 3b 0a 20 20 69 6e  har *aData;.  in
0e20: 74 20 6e 53 70 61 63 65 3b 0a 20 20 73 71 6c 69  t nSpace;.  sqli
0e30: 74 65 33 5f 69 6e 74 36 34 20 69 4c 61 73 74 44  te3_int64 iLastD
0e40: 6f 63 69 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ocid;.  sqlite3_
0e50: 69 6e 74 36 34 20 69 4c 61 73 74 43 6f 6c 3b 0a  int64 iLastCol;.
0e60: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
0e70: 69 4c 61 73 74 50 6f 73 3b 0a 7d 3b 0a 0a 0a 2f  iLastPos;.};.../
0e80: 2a 0a 2a 2a 20 45 61 63 68 20 63 75 72 73 6f 72  *.** Each cursor
0e90: 20 68 61 73 20 61 20 28 70 6f 73 73 69 62 6c 79   has a (possibly
0ea0: 20 65 6d 70 74 79 29 20 6c 69 6e 6b 65 64 20 6c   empty) linked l
0eb0: 69 73 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ist of the follo
0ec0: 77 69 6e 67 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f  wing objects..*/
0ed0: 0a 73 74 72 75 63 74 20 46 74 73 33 44 65 66 65  .struct Fts3Defe
0ee0: 72 72 65 64 54 6f 6b 65 6e 20 7b 0a 20 20 46 74  rredToken {.  Ft
0ef0: 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70  s3PhraseToken *p
0f00: 54 6f 6b 65 6e 3b 20 20 20 20 20 20 20 20 2f 2a  Token;        /*
0f10: 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 6f 72 72   Pointer to corr
0f20: 65 73 70 6f 6e 64 69 6e 67 20 65 78 70 72 20 74  esponding expr t
0f30: 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43  oken */.  int iC
0f40: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
0f50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
0f60: 75 6d 6e 20 74 6f 6b 65 6e 20 6d 75 73 74 20 6f  umn token must o
0f70: 63 63 75 72 20 69 6e 20 2a 2f 0a 20 20 46 74 73  ccur in */.  Fts
0f80: 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a  3DeferredToken *
0f90: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20  pNext;       /* 
0fa0: 4e 65 78 74 20 69 6e 20 6c 69 73 74 20 6f 66 20  Next in list of 
0fb0: 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 73 20  deferred tokens 
0fc0: 2a 2f 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73 74  */.  PendingList
0fd0: 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20   *pList;        
0fe0: 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20       /* Doclist 
0ff0: 69 73 20 61 73 73 65 6d 62 6c 65 64 20 68 65 72  is assembled her
1000: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  e */.};../*.** A
1010: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
1020: 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
1030: 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
1040: 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 72 6d  through the term
1050: 73 20 6f 6e 0a 2a 2a 20 61 20 63 6f 6e 74 69 67  s on.** a contig
1060: 75 6f 75 73 20 73 65 74 20 6f 66 20 73 65 67 6d  uous set of segm
1070: 65 6e 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20  ent b-tree leaf 
1080: 6e 6f 64 65 73 2e 20 41 6c 74 68 6f 75 67 68 20  nodes. Although 
1090: 74 68 65 20 64 65 74 61 69 6c 73 20 6f 66 0a 2a  the details of.*
10a0: 2a 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  * this structure
10b0: 20 61 72 65 20 6f 6e 6c 79 20 6d 61 6e 69 70 75   are only manipu
10c0: 6c 61 74 65 64 20 62 79 20 63 6f 64 65 20 69 6e  lated by code in
10d0: 20 74 68 69 73 20 66 69 6c 65 2c 20 6f 70 61 71   this file, opaq
10e0: 75 65 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 6f 66  ue handles.** of
10f0: 20 74 79 70 65 20 46 74 73 33 53 65 67 52 65 61   type Fts3SegRea
1100: 64 65 72 2a 20 61 72 65 20 61 6c 73 6f 20 75 73  der* are also us
1110: 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20 66 74  ed by code in ft
1120: 73 33 2e 63 20 74 6f 20 69 74 65 72 61 74 65 20  s3.c to iterate 
1130: 74 68 72 6f 75 67 68 0a 2a 2a 20 74 65 72 6d 73  through.** terms
1140: 20 77 68 65 6e 20 71 75 65 72 79 69 6e 67 20 74   when querying t
1150: 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  he full-text ind
1160: 65 78 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e  ex. See function
1170: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69 74  s:.**.**   sqlit
1180: 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 4e  e3Fts3SegReaderN
1190: 65 77 28 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ew().**   sqlite
11a0: 33 46 74 73 33 53 65 67 52 65 61 64 65 72 46 72  3Fts3SegReaderFr
11b0: 65 65 28 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ee().**   sqlite
11c0: 33 46 74 73 33 53 65 67 52 65 61 64 65 72 49 74  3Fts3SegReaderIt
11d0: 65 72 61 74 65 28 29 0a 2a 2a 0a 2a 2a 20 4d 65  erate().**.** Me
11e0: 74 68 6f 64 73 20 75 73 65 64 20 74 6f 20 6d 61  thods used to ma
11f0: 6e 69 70 75 6c 61 74 65 20 46 74 73 33 53 65 67  nipulate Fts3Seg
1200: 52 65 61 64 65 72 20 73 74 72 75 63 74 75 72 65  Reader structure
1210: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 66 74 73 33 53  s:.**.**   fts3S
1220: 65 67 52 65 61 64 65 72 4e 65 78 74 28 29 0a 2a  egReaderNext().*
1230: 2a 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65  *   fts3SegReade
1240: 72 46 69 72 73 74 44 6f 63 69 64 28 29 0a 2a 2a  rFirstDocid().**
1250: 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72     fts3SegReader
1260: 4e 65 78 74 44 6f 63 69 64 28 29 0a 2a 2f 0a 73  NextDocid().*/.s
1270: 74 72 75 63 74 20 46 74 73 33 53 65 67 52 65 61  truct Fts3SegRea
1280: 64 65 72 20 7b 0a 20 20 69 6e 74 20 69 49 64 78  der {.  int iIdx
1290: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12a0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
12b0: 20 77 69 74 68 69 6e 20 6c 65 76 65 6c 2c 20 6f   within level, o
12c0: 72 20 30 78 37 46 46 46 46 46 46 46 20 66 6f 72  r 0x7FFFFFFF for
12d0: 20 50 54 20 2a 2f 0a 20 20 75 38 20 62 4c 6f 6f   PT */.  u8 bLoo
12e0: 6b 75 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  kup;            
12f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1300: 20 66 6f 72 20 61 20 6c 6f 6f 6b 75 70 20 6f 6e   for a lookup on
1310: 6c 79 20 2a 2f 0a 20 20 75 38 20 72 6f 6f 74 4f  ly */.  u8 rootO
1320: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
1330: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1340: 66 6f 72 20 61 20 72 6f 6f 74 2d 6f 6e 6c 79 20  for a root-only 
1350: 72 65 61 64 65 72 20 2a 2f 0a 0a 20 20 73 71 6c  reader */..  sql
1360: 69 74 65 33 5f 69 6e 74 36 34 20 69 53 74 61 72  ite3_int64 iStar
1370: 74 42 6c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20  tBlock;      /* 
1380: 52 6f 77 69 64 20 6f 66 20 66 69 72 73 74 20 6c  Rowid of first l
1390: 65 61 66 20 62 6c 6f 63 6b 20 74 6f 20 74 72 61  eaf block to tra
13a0: 76 65 72 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  verse */.  sqlit
13b0: 65 33 5f 69 6e 74 36 34 20 69 4c 65 61 66 45 6e  e3_int64 iLeafEn
13c0: 64 42 6c 6f 63 6b 3b 20 20 20 20 2f 2a 20 52 6f  dBlock;    /* Ro
13d0: 77 69 64 20 6f 66 20 66 69 6e 61 6c 20 6c 65 61  wid of final lea
13e0: 66 20 62 6c 6f 63 6b 20 74 6f 20 74 72 61 76 65  f block to trave
13f0: 72 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rse */.  sqlite3
1400: 5f 69 6e 74 36 34 20 69 45 6e 64 42 6c 6f 63 6b  _int64 iEndBlock
1410: 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  ;        /* Rowi
1420: 64 20 6f 66 20 66 69 6e 61 6c 20 62 6c 6f 63 6b  d of final block
1430: 20 69 6e 20 73 65 67 6d 65 6e 74 20 28 6f 72 20   in segment (or 
1440: 30 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  0) */.  sqlite3_
1450: 69 6e 74 36 34 20 69 43 75 72 72 65 6e 74 42 6c  int64 iCurrentBl
1460: 6f 63 6b 3b 20 20 20 20 2f 2a 20 43 75 72 72 65  ock;    /* Curre
1470: 6e 74 20 6c 65 61 66 20 62 6c 6f 63 6b 20 28 6f  nt leaf block (o
1480: 72 20 30 29 20 2a 2f 0a 0a 20 20 63 68 61 72 20  r 0) */..  char 
1490: 2a 61 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  *aNode;         
14a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
14b0: 69 6e 74 65 72 20 74 6f 20 6e 6f 64 65 20 64 61  inter to node da
14c0: 74 61 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  ta (or NULL) */.
14d0: 20 20 69 6e 74 20 6e 4e 6f 64 65 3b 20 20 20 20    int nNode;    
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
1500: 66 65 72 20 61 74 20 61 4e 6f 64 65 20 28 6f 72  fer at aNode (or
1510: 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f   0) */.  int nPo
1520: 70 75 6c 61 74 65 3b 20 20 20 20 20 20 20 20 20  pulate;         
1530: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e           /* If >
1540: 30 2c 20 62 79 74 65 73 20 6f 66 20 62 75 66 66  0, bytes of buff
1550: 65 72 20 61 4e 6f 64 65 5b 5d 20 6c 6f 61 64 65  er aNode[] loade
1560: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62  d */.  sqlite3_b
1570: 6c 6f 62 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20  lob *pBlob;     
1580: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74         /* If not
1590: 20 4e 55 4c 4c 2c 20 62 6c 6f 62 20 68 61 6e 64   NULL, blob hand
15a0: 6c 65 20 74 6f 20 72 65 61 64 20 6e 6f 64 65 20  le to read node 
15b0: 2a 2f 0a 0a 20 20 46 74 73 33 48 61 73 68 45 6c  */..  Fts3HashEl
15c0: 65 6d 20 2a 2a 70 70 4e 65 78 74 45 6c 65 6d 3b  em **ppNextElem;
15d0: 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73  ..  /* Variables
15e0: 20 73 65 74 20 62 79 20 66 74 73 33 53 65 67 52   set by fts3SegR
15f0: 65 61 64 65 72 4e 65 78 74 28 29 2e 20 54 68 65  eaderNext(). The
1600: 73 65 20 6d 61 79 20 62 65 20 72 65 61 64 20 64  se may be read d
1610: 69 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20  irectly.  ** by 
1620: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65 79  the caller. They
1630: 20 61 72 65 20 76 61 6c 69 64 20 66 72 6f 6d 20   are valid from 
1640: 74 68 65 20 74 69 6d 65 20 53 65 67 6d 65 6e 74  the time Segment
1650: 52 65 61 64 65 72 4e 65 77 28 29 20 72 65 74 75  ReaderNew() retu
1660: 72 6e 73 0a 20 20 2a 2a 20 75 6e 74 69 6c 20 53  rns.  ** until S
1670: 65 67 6d 65 6e 74 52 65 61 64 65 72 4e 65 78 74  egmentReaderNext
1680: 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74  () returns somet
1690: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
16a0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 2a 2a 20 28  SQLITE_OK.  ** (
16b0: 69 2e 65 2e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  i.e. SQLITE_DONE
16c0: 29 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  )..  */.  int nT
16d0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
16e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
16f0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
1700: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a  current term */.
1710: 20 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20    char *zTerm;  
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1730: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1740: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a  current term */.
1750: 20 20 69 6e 74 20 6e 54 65 72 6d 41 6c 6c 6f 63    int nTermAlloc
1760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1770: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
1780: 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 62 75 66  ize of zTerm buf
1790: 66 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  fer */.  char *a
17a0: 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20  Doclist;        
17b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
17c0: 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 20 6f  ter to doclist o
17d0: 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  f current entry 
17e0: 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73  */.  int nDoclis
17f0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1800: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1810: 64 6f 63 6c 69 73 74 20 69 6e 20 63 75 72 72 65  doclist in curre
1820: 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 0a 20 20 2f  nt entry */..  /
1830: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1840: 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 75 73  variables are us
1850: 65 64 20 62 79 20 66 74 73 33 53 65 67 52 65 61  ed by fts3SegRea
1860: 64 65 72 4e 65 78 74 44 6f 63 69 64 28 29 20 74  derNextDocid() t
1870: 6f 20 69 74 65 72 61 74 65 20 0a 20 20 2a 2a 20  o iterate .  ** 
1880: 74 68 72 6f 75 67 68 20 74 68 65 20 63 75 72 72  through the curr
1890: 65 6e 74 20 64 6f 63 6c 69 73 74 20 28 61 44 6f  ent doclist (aDo
18a0: 63 6c 69 73 74 2f 6e 44 6f 63 6c 69 73 74 29 2e  clist/nDoclist).
18b0: 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 4f  .  */.  char *pO
18c0: 66 66 73 65 74 4c 69 73 74 3b 0a 20 20 69 6e 74  ffsetList;.  int
18d0: 20 6e 4f 66 66 73 65 74 4c 69 73 74 3b 20 20 20   nOffsetList;   
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18f0: 46 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20 70  For descending p
1900: 65 6e 64 69 6e 67 20 73 65 67 2d 72 65 61 64 65  ending seg-reade
1910: 72 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 71 6c  rs only */.  sql
1920: 69 74 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 69  ite3_int64 iDoci
1930: 64 3b 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 66  d;.};..#define f
1940: 74 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65  ts3SegReaderIsPe
1950: 6e 64 69 6e 67 28 70 29 20 28 28 70 29 2d 3e 70  nding(p) ((p)->p
1960: 70 4e 65 78 74 45 6c 65 6d 21 3d 30 29 0a 23 64  pNextElem!=0).#d
1970: 65 66 69 6e 65 20 66 74 73 33 53 65 67 52 65 61  efine fts3SegRea
1980: 64 65 72 49 73 52 6f 6f 74 4f 6e 6c 79 28 70 29  derIsRootOnly(p)
1990: 20 28 28 70 29 2d 3e 72 6f 6f 74 4f 6e 6c 79 21   ((p)->rootOnly!
19a0: 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  =0)../*.** An in
19b0: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
19c0: 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64  tructure is used
19d0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 73 65 67   to create a seg
19e0: 6d 65 6e 74 20 62 2d 74 72 65 65 20 69 6e 20 74  ment b-tree in t
19f0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  he.** database. 
1a00: 54 68 65 20 69 6e 74 65 72 6e 61 6c 20 64 65 74  The internal det
1a10: 61 69 6c 73 20 6f 66 20 74 68 69 73 20 74 79 70  ails of this typ
1a20: 65 20 61 72 65 20 6f 6e 6c 79 20 61 63 63 65 73  e are only acces
1a30: 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 66 6f  sed by the.** fo
1a40: 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
1a50: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 66 74 73 33 53  s:.**.**   fts3S
1a60: 65 67 57 72 69 74 65 72 41 64 64 28 29 0a 2a 2a  egWriterAdd().**
1a70: 20 20 20 66 74 73 33 53 65 67 57 72 69 74 65 72     fts3SegWriter
1a80: 46 6c 75 73 68 28 29 0a 2a 2a 20 20 20 66 74 73  Flush().**   fts
1a90: 33 53 65 67 57 72 69 74 65 72 46 72 65 65 28 29  3SegWriterFree()
1aa0: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 65 67 6d 65  .*/.struct Segme
1ab0: 6e 74 57 72 69 74 65 72 20 7b 0a 20 20 53 65 67  ntWriter {.  Seg
1ac0: 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65 3b  mentNode *pTree;
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ae0: 50 6f 69 6e 74 65 72 20 74 6f 20 69 6e 74 65 72  Pointer to inter
1af0: 69 6f 72 20 74 72 65 65 20 73 74 72 75 63 74 75  ior tree structu
1b00: 72 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  re */.  sqlite3_
1b10: 69 6e 74 36 34 20 69 46 69 72 73 74 3b 20 20 20  int64 iFirst;   
1b20: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1b30: 20 73 6c 6f 74 20 69 6e 20 25 5f 73 65 67 6d 65   slot in %_segme
1b40: 6e 74 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  nts written */. 
1b50: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1b60: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  Free;           
1b70: 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73 6c   /* Next free sl
1b80: 6f 74 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73  ot in %_segments
1b90: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 72   */.  char *zTer
1ba0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1bb0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1bc0: 20 74 6f 20 70 72 65 76 69 6f 75 73 20 74 65 72   to previous ter
1bd0: 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  m buffer */.  in
1be0: 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20  t nTerm;        
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c00: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1c10: 20 69 6e 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 69   in zTerm */.  i
1c20: 6e 74 20 6e 4d 61 6c 6c 6f 63 3b 20 20 20 20 20  nt nMalloc;     
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c40: 2a 20 53 69 7a 65 20 6f 66 20 6d 61 6c 6c 6f 63  * Size of malloc
1c50: 27 64 20 62 75 66 66 65 72 20 61 74 20 7a 4d 61  'd buffer at zMa
1c60: 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lloc */.  char *
1c70: 7a 4d 61 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20  zMalloc;        
1c80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6c            /* Mal
1c90: 6c 6f 63 27 64 20 73 70 61 63 65 20 28 70 6f 73  loc'd space (pos
1ca0: 73 69 62 6c 79 29 20 75 73 65 64 20 66 6f 72 20  sibly) used for 
1cb0: 7a 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e  zTerm */.  int n
1cc0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1cd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1ce0: 7a 65 20 6f 66 20 61 6c 6c 6f 63 61 74 69 6f 6e  ze of allocation
1cf0: 20 61 74 20 61 44 61 74 61 20 2a 2f 0a 20 20 69   at aData */.  i
1d00: 6e 74 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20  nt nData;       
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d20: 2a 20 42 79 74 65 73 20 6f 66 20 64 61 74 61 20  * Bytes of data 
1d30: 69 6e 20 61 44 61 74 61 20 2a 2f 0a 20 20 63 68  in aData */.  ch
1d40: 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20  ar *aData;      
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d60: 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 6c 6f 63   Pointer to bloc
1d70: 6b 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20  k from malloc() 
1d80: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 79 70  */.};../*.** Typ
1d90: 65 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 69 73  e SegmentNode is
1da0: 20 75 73 65 64 20 62 79 20 74 68 65 20 66 6f 6c   used by the fol
1db0: 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e  lowing three fun
1dc0: 63 74 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65  ctions to create
1dd0: 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 69 6f 72  .** the interior
1de0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 65 67   part of the seg
1df0: 6d 65 6e 74 20 62 2b 2d 74 72 65 65 20 73 74 72  ment b+-tree str
1e00: 75 63 74 75 72 65 73 20 28 65 76 65 72 79 74 68  uctures (everyth
1e10: 69 6e 67 20 65 78 63 65 70 74 0a 2a 2a 20 74 68  ing except.** th
1e20: 65 20 6c 65 61 66 20 6e 6f 64 65 73 29 2e 20 54  e leaf nodes). T
1e30: 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  hese functions a
1e40: 6e 64 20 74 79 70 65 20 61 72 65 20 6f 6e 6c 79  nd type are only
1e50: 20 65 76 65 72 20 75 73 65 64 20 62 79 20 63 6f   ever used by co
1e60: 64 65 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  de.** within the
1e70: 20 66 74 73 33 53 65 67 57 72 69 74 65 72 58 58   fts3SegWriterXX
1e80: 58 28 29 20 66 61 6d 69 6c 79 20 6f 66 20 66 75  X() family of fu
1e90: 6e 63 74 69 6f 6e 73 20 64 65 73 63 72 69 62 65  nctions describe
1ea0: 64 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20  d above..**.**  
1eb0: 20 66 74 73 33 4e 6f 64 65 41 64 64 54 65 72 6d   fts3NodeAddTerm
1ec0: 28 29 0a 2a 2a 20 20 20 66 74 73 33 4e 6f 64 65  ().**   fts3Node
1ed0: 57 72 69 74 65 28 29 0a 2a 2a 20 20 20 66 74 73  Write().**   fts
1ee0: 33 4e 6f 64 65 46 72 65 65 28 29 0a 2a 2a 0a 2a  3NodeFree().**.*
1ef0: 2a 20 57 68 65 6e 20 61 20 62 2b 74 72 65 65 20  * When a b+tree 
1f00: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
1f10: 65 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68  e database (eith
1f20: 65 72 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  er as a result o
1f30: 66 20 61 20 6d 65 72 67 65 0a 2a 2a 20 6f 72 20  f a merge.** or 
1f40: 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d  the pending-term
1f50: 73 20 74 61 62 6c 65 20 62 65 69 6e 67 20 66 6c  s table being fl
1f60: 75 73 68 65 64 29 2c 20 6c 65 61 76 65 73 20 61  ushed), leaves a
1f70: 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  re written into 
1f80: 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
1f90: 20 66 69 6c 65 20 61 73 20 73 6f 6f 6e 20 61 73   file as soon as
1fa0: 20 74 68 65 79 20 61 72 65 20 63 6f 6d 70 6c 65   they are comple
1fb0: 74 65 6c 79 20 70 6f 70 75 6c 61 74 65 64 2e 20  tely populated. 
1fc0: 54 68 65 20 69 6e 74 65 72 69 6f 72 20 6f 66 0a  The interior of.
1fd0: 2a 2a 20 74 68 65 20 74 72 65 65 20 69 73 20 61  ** the tree is a
1fe0: 73 73 65 6d 62 6c 65 64 20 69 6e 20 6d 65 6d 6f  ssembled in memo
1ff0: 72 79 20 61 6e 64 20 77 72 69 74 74 65 6e 20 6f  ry and written o
2000: 75 74 20 6f 6e 6c 79 20 6f 6e 63 65 20 61 6c 6c  ut only once all
2010: 20 6c 65 61 76 65 73 20 68 61 76 65 0a 2a 2a 20   leaves have.** 
2020: 62 65 65 6e 20 70 6f 70 75 6c 61 74 65 64 20 61  been populated a
2030: 6e 64 20 73 74 6f 72 65 64 2e 20 54 68 69 73 20  nd stored. This 
2040: 69 73 20 4f 6b 2c 20 61 73 20 74 68 65 20 62 2b  is Ok, as the b+
2050: 2d 74 72 65 65 20 66 61 6e 6f 75 74 20 69 73 20  -tree fanout is 
2060: 75 73 75 61 6c 6c 79 0a 2a 2a 20 76 65 72 79 20  usually.** very 
2070: 6c 61 72 67 65 2c 20 6d 65 61 6e 69 6e 67 20 74  large, meaning t
2080: 68 61 74 20 74 68 65 20 69 6e 74 65 72 69 6f 72  hat the interior
2090: 20 6f 66 20 74 68 65 20 74 72 65 65 20 63 6f 6e   of the tree con
20a0: 73 75 6d 65 73 20 72 65 6c 61 74 69 76 65 6c 79  sumes relatively
20b0: 20 0a 2a 2a 20 6c 69 74 74 6c 65 20 6d 65 6d 6f   .** little memo
20c0: 72 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 65  ry..*/.struct Se
20d0: 67 6d 65 6e 74 4e 6f 64 65 20 7b 0a 20 20 53 65  gmentNode {.  Se
20e0: 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 50 61 72 65  gmentNode *pPare
20f0: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  nt;           /*
2100: 20 50 61 72 65 6e 74 20 6e 6f 64 65 20 28 6f 72   Parent node (or
2110: 20 4e 55 4c 4c 20 66 6f 72 20 72 6f 6f 74 20 6e   NULL for root n
2120: 6f 64 65 29 20 2a 2f 0a 20 20 53 65 67 6d 65 6e  ode) */.  Segmen
2130: 74 4e 6f 64 65 20 2a 70 52 69 67 68 74 3b 20 20  tNode *pRight;  
2140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
2150: 6e 74 65 72 20 74 6f 20 72 69 67 68 74 2d 73 69  nter to right-si
2160: 62 6c 69 6e 67 20 2a 2f 0a 20 20 53 65 67 6d 65  bling */.  Segme
2170: 6e 74 4e 6f 64 65 20 2a 70 4c 65 66 74 6d 6f 73  ntNode *pLeftmos
2180: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  t;         /* Po
2190: 69 6e 74 65 72 20 74 6f 20 6c 65 66 74 2d 6d 6f  inter to left-mo
21a0: 73 74 20 6e 6f 64 65 20 6f 66 20 74 68 69 73 20  st node of this 
21b0: 64 65 70 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e  depth */.  int n
21c0: 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20 20  Entry;          
21d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
21e0: 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 77 72  mber of terms wr
21f0: 69 74 74 65 6e 20 74 6f 20 6e 6f 64 65 20 73 6f  itten to node so
2200: 20 66 61 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a   far */.  char *
2210: 7a 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  zTerm;          
2220: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
2230: 6e 74 65 72 20 74 6f 20 70 72 65 76 69 6f 75 73  nter to previous
2240: 20 74 65 72 6d 20 62 75 66 66 65 72 20 2a 2f 0a   term buffer */.
2250: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20    int nTerm;    
2260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2270: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2280: 79 74 65 73 20 69 6e 20 7a 54 65 72 6d 20 2a 2f  ytes in zTerm */
2290: 0a 20 20 69 6e 74 20 6e 4d 61 6c 6c 6f 63 3b 20  .  int nMalloc; 
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61     /* Size of ma
22c0: 6c 6c 6f 63 27 64 20 62 75 66 66 65 72 20 61 74  lloc'd buffer at
22d0: 20 7a 4d 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68   zMalloc */.  ch
22e0: 61 72 20 2a 7a 4d 61 6c 6c 6f 63 3b 20 20 20 20  ar *zMalloc;    
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2300: 20 4d 61 6c 6c 6f 63 27 64 20 73 70 61 63 65 20   Malloc'd space 
2310: 28 70 6f 73 73 69 62 6c 79 29 20 75 73 65 64 20  (possibly) used 
2320: 66 6f 72 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 69  for zTerm */.  i
2330: 6e 74 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20  nt nData;       
2340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2350: 2a 20 42 79 74 65 73 20 6f 66 20 76 61 6c 69 64  * Bytes of valid
2360: 20 64 61 74 61 20 73 6f 20 66 61 72 20 2a 2f 0a   data so far */.
2370: 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20    char *aData;  
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2390: 20 20 2f 2a 20 4e 6f 64 65 20 64 61 74 61 20 2a    /* Node data *
23a0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69  /.};../*.** Vali
23b0: 64 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65  d values for the
23c0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
23d0: 20 74 6f 20 66 74 73 33 53 71 6c 53 74 6d 74 28   to fts3SqlStmt(
23e0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51  )..*/.#define SQ
23f0: 4c 5f 44 45 4c 45 54 45 5f 43 4f 4e 54 45 4e 54  L_DELETE_CONTENT
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 23               0.#
2410: 64 65 66 69 6e 65 20 53 51 4c 5f 49 53 5f 45 4d  define SQL_IS_EM
2420: 50 54 59 20 20 20 20 20 20 20 20 20 20 20 20 20  PTY             
2430: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
2440: 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 43  SQL_DELETE_ALL_C
2450: 4f 4e 54 45 4e 54 20 20 20 20 20 20 20 20 20 32  ONTENT         2
2460: 20 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44 45   .#define SQL_DE
2470: 4c 45 54 45 5f 41 4c 4c 5f 53 45 47 4d 45 4e 54  LETE_ALL_SEGMENT
2480: 53 20 20 20 20 20 20 20 20 33 0a 23 64 65 66 69  S        3.#defi
2490: 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c  ne SQL_DELETE_AL
24a0: 4c 5f 53 45 47 44 49 52 20 20 20 20 20 20 20 20  L_SEGDIR        
24b0: 20 20 34 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f    4.#define SQL_
24c0: 44 45 4c 45 54 45 5f 41 4c 4c 5f 44 4f 43 53 49  DELETE_ALL_DOCSI
24d0: 5a 45 20 20 20 20 20 20 20 20 20 35 0a 23 64 65  ZE         5.#de
24e0: 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f  fine SQL_DELETE_
24f0: 41 4c 4c 5f 53 54 41 54 20 20 20 20 20 20 20 20  ALL_STAT        
2500: 20 20 20 20 36 0a 23 64 65 66 69 6e 65 20 53 51      6.#define SQ
2510: 4c 5f 53 45 4c 45 43 54 5f 43 4f 4e 54 45 4e 54  L_SELECT_CONTENT
2520: 5f 42 59 5f 52 4f 57 49 44 20 20 20 20 37 0a 23  _BY_ROWID    7.#
2530: 64 65 66 69 6e 65 20 53 51 4c 5f 4e 45 58 54 5f  define SQL_NEXT_
2540: 53 45 47 4d 45 4e 54 5f 49 4e 44 45 58 20 20 20  SEGMENT_INDEX   
2550: 20 20 20 20 20 20 38 0a 23 64 65 66 69 6e 65 20        8.#define 
2560: 53 51 4c 5f 49 4e 53 45 52 54 5f 53 45 47 4d 45  SQL_INSERT_SEGME
2570: 4e 54 53 20 20 20 20 20 20 20 20 20 20 20 20 39  NTS            9
2580: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 4e 45 58  .#define SQL_NEX
2590: 54 5f 53 45 47 4d 45 4e 54 53 5f 49 44 20 20 20  T_SEGMENTS_ID   
25a0: 20 20 20 20 20 20 20 31 30 0a 23 64 65 66 69 6e         10.#defin
25b0: 65 20 53 51 4c 5f 49 4e 53 45 52 54 5f 53 45 47  e SQL_INSERT_SEG
25c0: 44 49 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DIR             
25d0: 31 31 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53  11.#define SQL_S
25e0: 45 4c 45 43 54 5f 4c 45 56 45 4c 20 20 20 20 20  ELECT_LEVEL     
25f0: 20 20 20 20 20 20 20 20 20 31 32 0a 23 64 65 66           12.#def
2600: 69 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c  ine SQL_SELECT_L
2610: 45 56 45 4c 5f 52 41 4e 47 45 20 20 20 20 20 20  EVEL_RANGE      
2620: 20 20 31 33 0a 23 64 65 66 69 6e 65 20 53 51 4c    13.#define SQL
2630: 5f 53 45 4c 45 43 54 5f 4c 45 56 45 4c 5f 43 4f  _SELECT_LEVEL_CO
2640: 55 4e 54 20 20 20 20 20 20 20 20 31 34 0a 23 64  UNT        14.#d
2650: 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54  efine SQL_SELECT
2660: 5f 53 45 47 44 49 52 5f 4d 41 58 5f 4c 45 56 45  _SEGDIR_MAX_LEVE
2670: 4c 20 20 20 31 35 0a 23 64 65 66 69 6e 65 20 53  L   15.#define S
2680: 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 44 49 52  QL_DELETE_SEGDIR
2690: 5f 4c 45 56 45 4c 20 20 20 20 20 20 20 31 36 0a  _LEVEL       16.
26a0: 23 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45  #define SQL_DELE
26b0: 54 45 5f 53 45 47 4d 45 4e 54 53 5f 52 41 4e 47  TE_SEGMENTS_RANG
26c0: 45 20 20 20 20 20 31 37 0a 23 64 65 66 69 6e 65  E     17.#define
26d0: 20 53 51 4c 5f 43 4f 4e 54 45 4e 54 5f 49 4e 53   SQL_CONTENT_INS
26e0: 45 52 54 20 20 20 20 20 20 20 20 20 20 20 20 31  ERT            1
26f0: 38 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44 45  8.#define SQL_DE
2700: 4c 45 54 45 5f 44 4f 43 53 49 5a 45 20 20 20 20  LETE_DOCSIZE    
2710: 20 20 20 20 20 20 20 20 31 39 0a 23 64 65 66 69          19.#defi
2720: 6e 65 20 53 51 4c 5f 52 45 50 4c 41 43 45 5f 44  ne SQL_REPLACE_D
2730: 4f 43 53 49 5a 45 20 20 20 20 20 20 20 20 20 20  OCSIZE          
2740: 20 32 30 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f   20.#define SQL_
2750: 53 45 4c 45 43 54 5f 44 4f 43 53 49 5a 45 20 20  SELECT_DOCSIZE  
2760: 20 20 20 20 20 20 20 20 20 20 32 31 0a 23 64 65            21.#de
2770: 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f  fine SQL_SELECT_
2780: 53 54 41 54 20 20 20 20 20 20 20 20 20 20 20 20  STAT            
2790: 20 20 20 32 32 0a 23 64 65 66 69 6e 65 20 53 51     22.#define SQ
27a0: 4c 5f 52 45 50 4c 41 43 45 5f 53 54 41 54 20 20  L_REPLACE_STAT  
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 32 33 0a 0a              23..
27c0: 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45  #define SQL_SELE
27d0: 43 54 5f 41 4c 4c 5f 50 52 45 46 49 58 5f 4c 45  CT_ALL_PREFIX_LE
27e0: 56 45 4c 20 20 20 32 34 0a 23 64 65 66 69 6e 65  VEL   24.#define
27f0: 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f   SQL_DELETE_ALL_
2800: 54 45 52 4d 53 5f 53 45 47 44 49 52 20 20 20 32  TERMS_SEGDIR   2
2810: 35 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44 45  5.#define SQL_DE
2820: 4c 45 54 45 5f 53 45 47 44 49 52 5f 52 41 4e 47  LETE_SEGDIR_RANG
2830: 45 20 20 20 20 20 20 20 32 36 0a 23 64 65 66 69  E       26.#defi
2840: 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 41 4c  ne SQL_SELECT_AL
2850: 4c 5f 4c 41 4e 47 49 44 20 20 20 20 20 20 20 20  L_LANGID        
2860: 20 32 37 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f   27.#define SQL_
2870: 46 49 4e 44 5f 4d 45 52 47 45 5f 4c 45 56 45 4c  FIND_MERGE_LEVEL
2880: 20 20 20 20 20 20 20 20 20 20 32 38 0a 23 64 65            28.#de
2890: 66 69 6e 65 20 53 51 4c 5f 4d 41 58 5f 4c 45 41  fine SQL_MAX_LEA
28a0: 46 5f 4e 4f 44 45 5f 45 53 54 49 4d 41 54 45 20  F_NODE_ESTIMATE 
28b0: 20 20 20 32 39 0a 23 64 65 66 69 6e 65 20 53 51     29.#define SQ
28c0: 4c 5f 44 45 4c 45 54 45 5f 53 45 47 44 49 52 5f  L_DELETE_SEGDIR_
28d0: 45 4e 54 52 59 20 20 20 20 20 20 20 33 30 0a 23  ENTRY       30.#
28e0: 64 65 66 69 6e 65 20 53 51 4c 5f 53 48 49 46 54  define SQL_SHIFT
28f0: 5f 53 45 47 44 49 52 5f 45 4e 54 52 59 20 20 20  _SEGDIR_ENTRY   
2900: 20 20 20 20 20 33 31 0a 23 64 65 66 69 6e 65 20       31.#define 
2910: 53 51 4c 5f 53 45 4c 45 43 54 5f 53 45 47 44 49  SQL_SELECT_SEGDI
2920: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 33 32  R             32
2930: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 43 48 4f  .#define SQL_CHO
2940: 4d 50 5f 53 45 47 44 49 52 20 20 20 20 20 20 20  MP_SEGDIR       
2950: 20 20 20 20 20 20 20 33 33 0a 23 64 65 66 69 6e         33.#defin
2960: 65 20 53 51 4c 5f 53 45 47 4d 45 4e 54 5f 49 53  e SQL_SEGMENT_IS
2970: 5f 41 50 50 45 4e 44 41 42 4c 45 20 20 20 20 20  _APPENDABLE     
2980: 33 34 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53  34.#define SQL_S
2990: 45 4c 45 43 54 5f 49 4e 44 45 58 45 53 20 20 20  ELECT_INDEXES   
29a0: 20 20 20 20 20 20 20 20 20 33 35 0a 23 64 65 66           35.#def
29b0: 69 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4d  ine SQL_SELECT_M
29c0: 58 4c 45 56 45 4c 20 20 20 20 20 20 20 20 20 20  XLEVEL          
29d0: 20 20 33 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73    36../*.** This
29e0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
29f0: 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 53  d to obtain an S
2a00: 51 4c 69 74 65 20 70 72 65 70 61 72 65 64 20 73  QLite prepared s
2a10: 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 0a  tatement handle.
2a20: 2a 2a 20 66 6f 72 20 74 68 65 20 73 74 61 74 65  ** for the state
2a30: 6d 65 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20  ment identified 
2a40: 62 79 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  by the second ar
2a50: 67 75 6d 65 6e 74 2e 20 49 66 20 73 75 63 63 65  gument. If succe
2a60: 73 73 66 75 6c 2c 0a 2a 2a 20 2a 70 70 20 69 73  ssful,.** *pp is
2a70: 20 73 65 74 20 74 6f 20 74 68 65 20 72 65 71 75   set to the requ
2a80: 65 73 74 65 64 20 73 74 61 74 65 6d 65 6e 74 20  ested statement 
2a90: 68 61 6e 64 6c 65 20 61 6e 64 20 53 51 4c 49 54  handle and SQLIT
2aa0: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
2ab0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  * Otherwise, an 
2ac0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
2ad0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
2ae0: 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  d *pp is set to 
2af0: 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  0..**.** If argu
2b00: 6d 65 6e 74 20 61 70 56 61 6c 20 69 73 20 6e 6f  ment apVal is no
2b10: 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20  t NULL, then it 
2b20: 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  must point to an
2b30: 20 61 72 72 61 79 20 77 69 74 68 0a 2a 2a 20 61   array with.** a
2b40: 74 20 6c 65 61 73 74 20 61 73 20 6d 61 6e 79 20  t least as many 
2b50: 65 6e 74 72 69 65 73 20 61 73 20 74 68 65 20 72  entries as the r
2b60: 65 71 75 65 73 74 65 64 20 73 74 61 74 65 6d 65  equested stateme
2b70: 6e 74 20 68 61 73 20 62 6f 75 6e 64 20 0a 2a 2a  nt has bound .**
2b80: 20 70 61 72 61 6d 65 74 65 72 73 2e 20 54 68 65   parameters. The
2b90: 20 76 61 6c 75 65 73 20 61 72 65 20 62 6f 75 6e   values are boun
2ba0: 64 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65  d to the stateme
2bb0: 6e 74 73 20 70 61 72 61 6d 65 74 65 72 73 20 62  nts parameters b
2bc0: 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69  efore.** returni
2bd0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
2be0: 74 20 66 74 73 33 53 71 6c 53 74 6d 74 28 0a 20  t fts3SqlStmt(. 
2bf0: 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c10: 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
2c20: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  e handle */.  in
2c30: 74 20 65 53 74 6d 74 2c 20 20 20 20 20 20 20 20  t eStmt,        
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c50: 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 5f   One of the SQL_
2c60: 58 58 58 20 63 6f 6e 73 74 61 6e 74 73 20 61 62  XXX constants ab
2c70: 6f 76 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ove */.  sqlite3
2c80: 5f 73 74 6d 74 20 2a 2a 70 70 2c 20 20 20 20 20  _stmt **pp,     
2c90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2ca0: 20 53 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   Statement handl
2cb0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  e */.  sqlite3_v
2cc0: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20  alue **apVal    
2cd0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 73         /* Values
2ce0: 20 74 6f 20 62 69 6e 64 20 74 6f 20 73 74 61 74   to bind to stat
2cf0: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 6f  ement */.){.  co
2d00: 6e 73 74 20 63 68 61 72 20 2a 61 7a 53 71 6c 5b  nst char *azSql[
2d10: 5d 20 3d 20 7b 0a 2f 2a 20 30 20 20 2a 2f 20 20  ] = {./* 0  */  
2d20: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
2d30: 27 25 71 5f 63 6f 6e 74 65 6e 74 27 20 57 48 45  '%q_content' WHE
2d40: 52 45 20 72 6f 77 69 64 20 3d 20 3f 22 2c 0a 2f  RE rowid = ?",./
2d50: 2a 20 31 20 20 2a 2f 20 20 22 53 45 4c 45 43 54  * 1  */  "SELECT
2d60: 20 4e 4f 54 20 45 58 49 53 54 53 28 53 45 4c 45   NOT EXISTS(SELE
2d70: 43 54 20 64 6f 63 69 64 20 46 52 4f 4d 20 25 51  CT docid FROM %Q
2d80: 2e 27 25 71 5f 63 6f 6e 74 65 6e 74 27 20 57 48  .'%q_content' WH
2d90: 45 52 45 20 72 6f 77 69 64 21 3d 3f 29 22 2c 0a  ERE rowid!=?)",.
2da0: 2f 2a 20 32 20 20 2a 2f 20 20 22 44 45 4c 45 54  /* 2  */  "DELET
2db0: 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 63 6f  E FROM %Q.'%q_co
2dc0: 6e 74 65 6e 74 27 22 2c 0a 2f 2a 20 33 20 20 2a  ntent'",./* 3  *
2dd0: 2f 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  /  "DELETE FROM 
2de0: 25 51 2e 27 25 71 5f 73 65 67 6d 65 6e 74 73 27  %Q.'%q_segments'
2df0: 22 2c 0a 2f 2a 20 34 20 20 2a 2f 20 20 22 44 45  ",./* 4  */  "DE
2e00: 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71  LETE FROM %Q.'%q
2e10: 5f 73 65 67 64 69 72 27 22 2c 0a 2f 2a 20 35 20  _segdir'",./* 5 
2e20: 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46 52 4f   */  "DELETE FRO
2e30: 4d 20 25 51 2e 27 25 71 5f 64 6f 63 73 69 7a 65  M %Q.'%q_docsize
2e40: 27 22 2c 0a 2f 2a 20 36 20 20 2a 2f 20 20 22 44  '",./* 6  */  "D
2e50: 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25  ELETE FROM %Q.'%
2e60: 71 5f 73 74 61 74 27 22 2c 0a 2f 2a 20 37 20 20  q_stat'",./* 7  
2e70: 2a 2f 20 20 22 53 45 4c 45 43 54 20 25 73 20 57  */  "SELECT %s W
2e80: 48 45 52 45 20 72 6f 77 69 64 3d 3f 22 2c 0a 2f  HERE rowid=?",./
2e90: 2a 20 38 20 20 2a 2f 20 20 22 53 45 4c 45 43 54  * 8  */  "SELECT
2ea0: 20 28 53 45 4c 45 43 54 20 6d 61 78 28 69 64 78   (SELECT max(idx
2eb0: 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65  ) FROM %Q.'%q_se
2ec0: 67 64 69 72 27 20 57 48 45 52 45 20 6c 65 76 65  gdir' WHERE leve
2ed0: 6c 20 3d 20 3f 29 20 2b 20 31 22 2c 0a 2f 2a 20  l = ?) + 1",./* 
2ee0: 39 20 20 2a 2f 20 20 22 52 45 50 4c 41 43 45 20  9  */  "REPLACE 
2ef0: 49 4e 54 4f 20 25 51 2e 27 25 71 5f 73 65 67 6d  INTO %Q.'%q_segm
2f00: 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 2c 20 62  ents'(blockid, b
2f10: 6c 6f 63 6b 29 20 56 41 4c 55 45 53 28 3f 2c 20  lock) VALUES(?, 
2f20: 3f 29 22 2c 0a 2f 2a 20 31 30 20 2a 2f 20 20 22  ?)",./* 10 */  "
2f30: 53 45 4c 45 43 54 20 63 6f 61 6c 65 73 63 65 28  SELECT coalesce(
2f40: 28 53 45 4c 45 43 54 20 6d 61 78 28 62 6c 6f 63  (SELECT max(bloc
2f50: 6b 69 64 29 20 46 52 4f 4d 20 25 51 2e 27 25 71  kid) FROM %Q.'%q
2f60: 5f 73 65 67 6d 65 6e 74 73 27 29 20 2b 20 31 2c  _segments') + 1,
2f70: 20 31 29 22 2c 0a 2f 2a 20 31 31 20 2a 2f 20 20   1)",./* 11 */  
2f80: 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 51  "REPLACE INTO %Q
2f90: 2e 27 25 71 5f 73 65 67 64 69 72 27 20 56 41 4c  .'%q_segdir' VAL
2fa0: 55 45 53 28 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 29  UES(?,?,?,?,?,?)
2fb0: 22 2c 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  ",..          /*
2fc0: 20 52 65 74 75 72 6e 20 73 65 67 6d 65 6e 74 73   Return segments
2fd0: 20 69 6e 20 6f 72 64 65 72 20 66 72 6f 6d 20 6f   in order from o
2fe0: 6c 64 65 73 74 20 74 6f 20 6e 65 77 65 73 74 2e  ldest to newest.
2ff0: 2a 2f 20 0a 2f 2a 20 31 32 20 2a 2f 20 20 22 53  */ ./* 12 */  "S
3000: 45 4c 45 43 54 20 69 64 78 2c 20 73 74 61 72 74  ELECT idx, start
3010: 5f 62 6c 6f 63 6b 2c 20 6c 65 61 76 65 73 5f 65  _block, leaves_e
3020: 6e 64 5f 62 6c 6f 63 6b 2c 20 65 6e 64 5f 62 6c  nd_block, end_bl
3030: 6f 63 6b 2c 20 72 6f 6f 74 20 22 0a 20 20 20 20  ock, root ".    
3040: 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 25 51          "FROM %Q
3050: 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57 48 45  .'%q_segdir' WHE
3060: 52 45 20 6c 65 76 65 6c 20 3d 20 3f 20 4f 52 44  RE level = ? ORD
3070: 45 52 20 42 59 20 69 64 78 20 41 53 43 22 2c 0a  ER BY idx ASC",.
3080: 2f 2a 20 31 33 20 2a 2f 20 20 22 53 45 4c 45 43  /* 13 */  "SELEC
3090: 54 20 69 64 78 2c 20 73 74 61 72 74 5f 62 6c 6f  T idx, start_blo
30a0: 63 6b 2c 20 6c 65 61 76 65 73 5f 65 6e 64 5f 62  ck, leaves_end_b
30b0: 6c 6f 63 6b 2c 20 65 6e 64 5f 62 6c 6f 63 6b 2c  lock, end_block,
30c0: 20 72 6f 6f 74 20 22 0a 20 20 20 20 20 20 20 20   root ".        
30d0: 20 20 20 20 22 46 52 4f 4d 20 25 51 2e 27 25 71      "FROM %Q.'%q
30e0: 5f 73 65 67 64 69 72 27 20 57 48 45 52 45 20 6c  _segdir' WHERE l
30f0: 65 76 65 6c 20 42 45 54 57 45 45 4e 20 3f 20 41  evel BETWEEN ? A
3100: 4e 44 20 3f 22 0a 20 20 20 20 20 20 20 20 20 20  ND ?".          
3110: 20 20 22 4f 52 44 45 52 20 42 59 20 6c 65 76 65    "ORDER BY leve
3120: 6c 20 44 45 53 43 2c 20 69 64 78 20 41 53 43 22  l DESC, idx ASC"
3130: 2c 0a 0a 2f 2a 20 31 34 20 2a 2f 20 20 22 53 45  ,../* 14 */  "SE
3140: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
3150: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72  OM %Q.'%q_segdir
3160: 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20  ' WHERE level = 
3170: 3f 22 2c 0a 2f 2a 20 31 35 20 2a 2f 20 20 22 53  ?",./* 15 */  "S
3180: 45 4c 45 43 54 20 6d 61 78 28 6c 65 76 65 6c 29  ELECT max(level)
3190: 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67   FROM %Q.'%q_seg
31a0: 64 69 72 27 20 57 48 45 52 45 20 6c 65 76 65 6c  dir' WHERE level
31b0: 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f   BETWEEN ? AND ?
31c0: 22 2c 0a 0a 2f 2a 20 31 36 20 2a 2f 20 20 22 44  ",../* 16 */  "D
31d0: 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25  ELETE FROM %Q.'%
31e0: 71 5f 73 65 67 64 69 72 27 20 57 48 45 52 45 20  q_segdir' WHERE 
31f0: 6c 65 76 65 6c 20 3d 20 3f 22 2c 0a 2f 2a 20 31  level = ?",./* 1
3200: 37 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46 52  7 */  "DELETE FR
3210: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 6d 65 6e  OM %Q.'%q_segmen
3220: 74 73 27 20 57 48 45 52 45 20 62 6c 6f 63 6b 69  ts' WHERE blocki
3230: 64 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20  d BETWEEN ? AND 
3240: 3f 22 2c 0a 2f 2a 20 31 38 20 2a 2f 20 20 22 49  ?",./* 18 */  "I
3250: 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 27 25  NSERT INTO %Q.'%
3260: 71 5f 63 6f 6e 74 65 6e 74 27 20 56 41 4c 55 45  q_content' VALUE
3270: 53 28 25 73 29 22 2c 0a 2f 2a 20 31 39 20 2a 2f  S(%s)",./* 19 */
3280: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
3290: 51 2e 27 25 71 5f 64 6f 63 73 69 7a 65 27 20 57  Q.'%q_docsize' W
32a0: 48 45 52 45 20 64 6f 63 69 64 20 3d 20 3f 22 2c  HERE docid = ?",
32b0: 0a 2f 2a 20 32 30 20 2a 2f 20 20 22 52 45 50 4c  ./* 20 */  "REPL
32c0: 41 43 45 20 49 4e 54 4f 20 25 51 2e 27 25 71 5f  ACE INTO %Q.'%q_
32d0: 64 6f 63 73 69 7a 65 27 20 56 41 4c 55 45 53 28  docsize' VALUES(
32e0: 3f 2c 3f 29 22 2c 0a 2f 2a 20 32 31 20 2a 2f 20  ?,?)",./* 21 */ 
32f0: 20 22 53 45 4c 45 43 54 20 73 69 7a 65 20 46 52   "SELECT size FR
3300: 4f 4d 20 25 51 2e 27 25 71 5f 64 6f 63 73 69 7a  OM %Q.'%q_docsiz
3310: 65 27 20 57 48 45 52 45 20 64 6f 63 69 64 3d 3f  e' WHERE docid=?
3320: 22 2c 0a 2f 2a 20 32 32 20 2a 2f 20 20 22 53 45  ",./* 22 */  "SE
3330: 4c 45 43 54 20 76 61 6c 75 65 20 46 52 4f 4d 20  LECT value FROM 
3340: 25 51 2e 27 25 71 5f 73 74 61 74 27 20 57 48 45  %Q.'%q_stat' WHE
3350: 52 45 20 69 64 3d 3f 22 2c 0a 2f 2a 20 32 33 20  RE id=?",./* 23 
3360: 2a 2f 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54  */  "REPLACE INT
3370: 4f 20 25 51 2e 27 25 71 5f 73 74 61 74 27 20 56  O %Q.'%q_stat' V
3380: 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 0a 2f 2a 20  ALUES(?,?)",./* 
3390: 32 34 20 2a 2f 20 20 22 22 2c 0a 2f 2a 20 32 35  24 */  "",./* 25
33a0: 20 2a 2f 20 20 22 22 2c 0a 0a 2f 2a 20 32 36 20   */  "",../* 26 
33b0: 2a 2f 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  */ "DELETE FROM 
33c0: 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57  %Q.'%q_segdir' W
33d0: 48 45 52 45 20 6c 65 76 65 6c 20 42 45 54 57 45  HERE level BETWE
33e0: 45 4e 20 3f 20 41 4e 44 20 3f 22 2c 0a 2f 2a 20  EN ? AND ?",./* 
33f0: 32 37 20 2a 2f 20 22 53 45 4c 45 43 54 20 44 49  27 */ "SELECT DI
3400: 53 54 49 4e 43 54 20 6c 65 76 65 6c 20 2f 20 28  STINCT level / (
3410: 31 30 32 34 20 2a 20 3f 29 20 46 52 4f 4d 20 25  1024 * ?) FROM %
3420: 51 2e 27 25 71 5f 73 65 67 64 69 72 27 22 2c 0a  Q.'%q_segdir'",.
3430: 0a 2f 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65  ./* This stateme
3440: 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  nt is used to de
3450: 74 65 72 6d 69 6e 65 20 77 68 69 63 68 20 6c 65  termine which le
3460: 76 65 6c 20 74 6f 20 72 65 61 64 20 74 68 65 20  vel to read the 
3470: 69 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a 20 77 68  input from.** wh
3480: 65 6e 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 6e  en performing an
3490: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72   incremental mer
34a0: 67 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74  ge. It returns t
34b0: 68 65 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65  he absolute leve
34c0: 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 74  l number.** of t
34d0: 68 65 20 6f 6c 64 65 73 74 20 6c 65 76 65 6c 20  he oldest level 
34e0: 69 6e 20 74 68 65 20 64 62 20 74 68 61 74 20 63  in the db that c
34f0: 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74  ontains at least
3500: 20 3f 20 73 65 67 6d 65 6e 74 73 2e 20 4f 72 2c   ? segments. Or,
3510: 0a 2a 2a 20 69 66 20 6e 6f 20 6c 65 76 65 6c 20  .** if no level 
3520: 69 6e 20 74 68 65 20 46 54 53 20 69 6e 64 65 78  in the FTS index
3530: 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74   contains more t
3540: 68 61 6e 20 3f 20 73 65 67 6d 65 6e 74 73 2c 20  han ? segments, 
3550: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  the statement.**
3560: 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 72 6f   returns zero ro
3570: 77 73 2e 20 20 2a 2f 0a 2f 2a 20 32 38 20 2a 2f  ws.  */./* 28 */
3580: 20 22 53 45 4c 45 43 54 20 6c 65 76 65 6c 20 46   "SELECT level F
3590: 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69  ROM %Q.'%q_segdi
35a0: 72 27 20 47 52 4f 55 50 20 42 59 20 6c 65 76 65  r' GROUP BY leve
35b0: 6c 20 48 41 56 49 4e 47 20 63 6f 75 6e 74 28 2a  l HAVING count(*
35c0: 29 3e 3d 3f 22 0a 20 20 20 20 20 20 20 20 20 22  )>=?".         "
35d0: 20 20 4f 52 44 45 52 20 42 59 20 28 6c 65 76 65    ORDER BY (leve
35e0: 6c 20 25 25 20 31 30 32 34 29 20 41 53 43 20 4c  l %% 1024) ASC L
35f0: 49 4d 49 54 20 31 22 2c 0a 0a 2f 2a 20 45 73 74  IMIT 1",../* Est
3600: 69 6d 61 74 65 20 74 68 65 20 75 70 70 65 72 20  imate the upper 
3610: 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
3620: 62 65 72 20 6f 66 20 6c 65 61 66 20 6e 6f 64 65  ber of leaf node
3630: 73 20 69 6e 20 61 20 6e 65 77 20 73 65 67 6d 65  s in a new segme
3640: 6e 74 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79  nt.** created by
3650: 20 6d 65 72 67 69 6e 67 20 74 68 65 20 6f 6c 64   merging the old
3660: 65 73 74 20 3a 32 20 73 65 67 6d 65 6e 74 73 20  est :2 segments 
3670: 66 72 6f 6d 20 61 62 73 6f 6c 75 74 65 20 6c 65  from absolute le
3680: 76 65 6c 20 3a 31 2e 20 53 65 65 20 0a 2a 2a 20  vel :1. See .** 
3690: 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33  function sqlite3
36a0: 46 74 73 33 49 6e 63 72 6d 65 72 67 65 28 29 20  Fts3Incrmerge() 
36b0: 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 20 2a 2f  for details.  */
36c0: 0a 2f 2a 20 32 39 20 2a 2f 20 22 53 45 4c 45 43  ./* 29 */ "SELEC
36d0: 54 20 32 20 2a 20 74 6f 74 61 6c 28 31 20 2b 20  T 2 * total(1 + 
36e0: 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b  leaves_end_block
36f0: 20 2d 20 73 74 61 72 74 5f 62 6c 6f 63 6b 29 20   - start_block) 
3700: 22 0a 20 20 20 20 20 20 20 20 20 22 20 20 46 52  ".         "  FR
3710: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72  OM %Q.'%q_segdir
3720: 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20  ' WHERE level = 
3730: 3f 20 41 4e 44 20 69 64 78 20 3c 20 3f 22 2c 0a  ? AND idx < ?",.
3740: 0a 2f 2a 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53  ./* SQL_DELETE_S
3750: 45 47 44 49 52 5f 45 4e 54 52 59 0a 2a 2a 20 20  EGDIR_ENTRY.**  
3760: 20 44 65 6c 65 74 65 20 74 68 65 20 25 5f 73 65   Delete the %_se
3770: 67 64 69 72 20 65 6e 74 72 79 20 6f 6e 20 61 62  gdir entry on ab
3780: 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 3a 31 20  solute level :1 
3790: 77 69 74 68 20 69 6e 64 65 78 20 3a 32 2e 20 20  with index :2.  
37a0: 2a 2f 0a 2f 2a 20 33 30 20 2a 2f 20 22 44 45 4c  */./* 30 */ "DEL
37b0: 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  ETE FROM %Q.'%q_
37c0: 73 65 67 64 69 72 27 20 57 48 45 52 45 20 6c 65  segdir' WHERE le
37d0: 76 65 6c 20 3d 20 3f 20 41 4e 44 20 69 64 78 20  vel = ? AND idx 
37e0: 3d 20 3f 22 2c 0a 0a 2f 2a 20 53 51 4c 5f 53 48  = ?",../* SQL_SH
37f0: 49 46 54 5f 53 45 47 44 49 52 5f 45 4e 54 52 59  IFT_SEGDIR_ENTRY
3800: 0a 2a 2a 20 20 20 4d 6f 64 69 66 79 20 74 68 65  .**   Modify the
3810: 20 69 64 78 20 76 61 6c 75 65 20 66 6f 72 20 74   idx value for t
3820: 68 65 20 73 65 67 6d 65 6e 74 20 77 69 74 68 20  he segment with 
3830: 69 64 78 3d 3a 33 20 6f 6e 20 61 62 73 6f 6c 75  idx=:3 on absolu
3840: 74 65 20 6c 65 76 65 6c 20 3a 32 0a 2a 2a 20 20  te level :2.**  
3850: 20 74 6f 20 3a 31 2e 20 20 2a 2f 0a 2f 2a 20 33   to :1.  */./* 3
3860: 31 20 2a 2f 20 22 55 50 44 41 54 45 20 25 51 2e  1 */ "UPDATE %Q.
3870: 27 25 71 5f 73 65 67 64 69 72 27 20 53 45 54 20  '%q_segdir' SET 
3880: 69 64 78 20 3d 20 3f 20 57 48 45 52 45 20 6c 65  idx = ? WHERE le
3890: 76 65 6c 3d 3f 20 41 4e 44 20 69 64 78 3d 3f 22  vel=? AND idx=?"
38a0: 2c 0a 0a 2f 2a 20 53 51 4c 5f 53 45 4c 45 43 54  ,../* SQL_SELECT
38b0: 5f 53 45 47 44 49 52 0a 2a 2a 20 20 20 52 65 61  _SEGDIR.**   Rea
38c0: 64 20 61 20 73 69 6e 67 6c 65 20 65 6e 74 72 79  d a single entry
38d0: 20 66 72 6f 6d 20 74 68 65 20 25 5f 73 65 67 64   from the %_segd
38e0: 69 72 20 74 61 62 6c 65 2e 20 54 68 65 20 65 6e  ir table. The en
38f0: 74 72 79 20 66 72 6f 6d 20 61 62 73 6f 6c 75 74  try from absolut
3900: 65 20 0a 2a 2a 20 20 20 6c 65 76 65 6c 20 3a 31  e .**   level :1
3910: 20 77 69 74 68 20 69 6e 64 65 78 20 76 61 6c 75   with index valu
3920: 65 20 3a 32 2e 20 20 2a 2f 0a 2f 2a 20 33 32 20  e :2.  */./* 32 
3930: 2a 2f 20 20 22 53 45 4c 45 43 54 20 69 64 78 2c  */  "SELECT idx,
3940: 20 73 74 61 72 74 5f 62 6c 6f 63 6b 2c 20 6c 65   start_block, le
3950: 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 2c 20  aves_end_block, 
3960: 65 6e 64 5f 62 6c 6f 63 6b 2c 20 72 6f 6f 74 20  end_block, root 
3970: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 46  ".            "F
3980: 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69  ROM %Q.'%q_segdi
3990: 72 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d  r' WHERE level =
39a0: 20 3f 20 41 4e 44 20 69 64 78 20 3d 20 3f 22 2c   ? AND idx = ?",
39b0: 0a 0a 2f 2a 20 53 51 4c 5f 43 48 4f 4d 50 5f 53  ../* SQL_CHOMP_S
39c0: 45 47 44 49 52 0a 2a 2a 20 20 20 55 70 64 61 74  EGDIR.**   Updat
39d0: 65 20 74 68 65 20 73 74 61 72 74 5f 62 6c 6f 63  e the start_bloc
39e0: 6b 20 28 3a 31 29 20 61 6e 64 20 72 6f 6f 74 20  k (:1) and root 
39f0: 28 3a 32 29 20 66 69 65 6c 64 73 20 6f 66 20 74  (:2) fields of t
3a00: 68 65 20 25 5f 73 65 67 64 69 72 0a 2a 2a 20 20  he %_segdir.**  
3a10: 20 65 6e 74 72 79 20 6c 6f 63 61 74 65 64 20 6f   entry located o
3a20: 6e 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c  n absolute level
3a30: 20 3a 33 20 77 69 74 68 20 69 6e 64 65 78 20 3a   :3 with index :
3a40: 34 2e 20 20 2a 2f 0a 2f 2a 20 33 33 20 2a 2f 20  4.  */./* 33 */ 
3a50: 20 22 55 50 44 41 54 45 20 25 51 2e 27 25 71 5f   "UPDATE %Q.'%q_
3a60: 73 65 67 64 69 72 27 20 53 45 54 20 73 74 61 72  segdir' SET star
3a70: 74 5f 62 6c 6f 63 6b 20 3d 20 3f 2c 20 72 6f 6f  t_block = ?, roo
3a80: 74 20 3d 20 3f 22 0a 20 20 20 20 20 20 20 20 20  t = ?".         
3a90: 20 20 20 22 57 48 45 52 45 20 6c 65 76 65 6c 20     "WHERE level 
3aa0: 3d 20 3f 20 41 4e 44 20 69 64 78 20 3d 20 3f 22  = ? AND idx = ?"
3ab0: 2c 0a 0a 2f 2a 20 53 51 4c 5f 53 45 47 4d 45 4e  ,../* SQL_SEGMEN
3ac0: 54 5f 49 53 5f 41 50 50 45 4e 44 41 42 4c 45 0a  T_IS_APPENDABLE.
3ad0: 2a 2a 20 20 20 52 65 74 75 72 6e 20 61 20 73 69  **   Return a si
3ae0: 6e 67 6c 65 20 72 6f 77 20 69 66 20 74 68 65 20  ngle row if the 
3af0: 73 65 67 6d 65 6e 74 20 77 69 74 68 20 65 6e 64  segment with end
3b00: 5f 62 6c 6f 63 6b 3d 3f 20 69 73 20 61 70 70 65  _block=? is appe
3b10: 6e 64 61 62 6c 65 2e 20 4f 72 0a 2a 2a 20 20 20  ndable. Or.**   
3b20: 6e 6f 20 72 6f 77 73 20 6f 74 68 65 72 77 69 73  no rows otherwis
3b30: 65 2e 20 20 2a 2f 0a 2f 2a 20 33 34 20 2a 2f 20  e.  */./* 34 */ 
3b40: 20 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20   "SELECT 1 FROM 
3b50: 25 51 2e 27 25 71 5f 73 65 67 6d 65 6e 74 73 27  %Q.'%q_segments'
3b60: 20 57 48 45 52 45 20 62 6c 6f 63 6b 69 64 3d 3f   WHERE blockid=?
3b70: 20 41 4e 44 20 62 6c 6f 63 6b 20 49 53 20 4e 55   AND block IS NU
3b80: 4c 4c 22 2c 0a 0a 2f 2a 20 53 51 4c 5f 53 45 4c  LL",../* SQL_SEL
3b90: 45 43 54 5f 49 4e 44 45 58 45 53 0a 2a 2a 20 20  ECT_INDEXES.**  
3ba0: 20 52 65 74 75 72 6e 20 74 68 65 20 6c 69 73 74   Return the list
3bb0: 20 6f 66 20 76 61 6c 69 64 20 73 65 67 6d 65 6e   of valid segmen
3bc0: 74 20 69 6e 64 65 78 65 73 20 66 6f 72 20 61 62  t indexes for ab
3bd0: 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 3f 20 20  solute level ?  
3be0: 2a 2f 0a 2f 2a 20 33 35 20 2a 2f 20 20 22 53 45  */./* 35 */  "SE
3bf0: 4c 45 43 54 20 69 64 78 20 46 52 4f 4d 20 25 51  LECT idx FROM %Q
3c00: 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57 48 45  .'%q_segdir' WHE
3c10: 52 45 20 6c 65 76 65 6c 3d 3f 20 4f 52 44 45 52  RE level=? ORDER
3c20: 20 42 59 20 31 20 41 53 43 22 2c 0a 0a 2f 2a 20   BY 1 ASC",../* 
3c30: 53 51 4c 5f 53 45 4c 45 43 54 5f 4d 58 4c 45 56  SQL_SELECT_MXLEV
3c40: 45 4c 0a 2a 2a 20 20 20 52 65 74 75 72 6e 20 74  EL.**   Return t
3c50: 68 65 20 6c 61 72 67 65 73 74 20 72 65 6c 61 74  he largest relat
3c60: 69 76 65 20 6c 65 76 65 6c 20 69 6e 20 74 68 65  ive level in the
3c70: 20 46 54 53 20 69 6e 64 65 78 20 6f 72 20 69 6e   FTS index or in
3c80: 64 65 78 65 73 2e 20 20 2a 2f 0a 2f 2a 20 33 36  dexes.  */./* 36
3c90: 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 6d 61 78   */  "SELECT max
3ca0: 28 20 6c 65 76 65 6c 20 25 25 20 31 30 32 34 20  ( level %% 1024 
3cb0: 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65  ) FROM %Q.'%q_se
3cc0: 67 64 69 72 27 22 0a 20 20 7d 3b 0a 20 20 69 6e  gdir'".  };.  in
3cd0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
3ce0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
3cf0: 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 61 73 73 65   *pStmt;..  asse
3d00: 72 74 28 20 53 69 7a 65 6f 66 41 72 72 61 79 28  rt( SizeofArray(
3d10: 61 7a 53 71 6c 29 3d 3d 53 69 7a 65 6f 66 41 72  azSql)==SizeofAr
3d20: 72 61 79 28 70 2d 3e 61 53 74 6d 74 29 20 29 3b  ray(p->aStmt) );
3d30: 0a 20 20 61 73 73 65 72 74 28 20 65 53 74 6d 74  .  assert( eStmt
3d40: 3c 53 69 7a 65 6f 66 41 72 72 61 79 28 61 7a 53  <SizeofArray(azS
3d50: 71 6c 29 20 26 26 20 65 53 74 6d 74 3e 3d 30 20  ql) && eStmt>=0 
3d60: 29 3b 0a 20 20 0a 20 20 70 53 74 6d 74 20 3d 20  );.  .  pStmt = 
3d70: 70 2d 3e 61 53 74 6d 74 5b 65 53 74 6d 74 5d 3b  p->aStmt[eStmt];
3d80: 0a 20 20 69 66 28 20 21 70 53 74 6d 74 20 29 7b  .  if( !pStmt ){
3d90: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  .    char *zSql;
3da0: 0a 20 20 20 20 69 66 28 20 65 53 74 6d 74 3d 3d  .    if( eStmt==
3db0: 53 51 4c 5f 43 4f 4e 54 45 4e 54 5f 49 4e 53 45  SQL_CONTENT_INSE
3dc0: 52 54 20 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c  RT ){.      zSql
3dd0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
3de0: 74 66 28 61 7a 53 71 6c 5b 65 53 74 6d 74 5d 2c  tf(azSql[eStmt],
3df0: 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d   p->zDb, p->zNam
3e00: 65 2c 20 70 2d 3e 7a 57 72 69 74 65 45 78 70 72  e, p->zWriteExpr
3e10: 6c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  list);.    }else
3e20: 20 69 66 28 20 65 53 74 6d 74 3d 3d 53 51 4c 5f   if( eStmt==SQL_
3e30: 53 45 4c 45 43 54 5f 43 4f 4e 54 45 4e 54 5f 42  SELECT_CONTENT_B
3e40: 59 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  Y_ROWID ){.     
3e50: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
3e60: 6d 70 72 69 6e 74 66 28 61 7a 53 71 6c 5b 65 53  mprintf(azSql[eS
3e70: 74 6d 74 5d 2c 20 70 2d 3e 7a 52 65 61 64 45 78  tmt], p->zReadEx
3e80: 70 72 6c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c  prlist);.    }el
3e90: 73 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d  se{.      zSql =
3ea0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
3eb0: 28 61 7a 53 71 6c 5b 65 53 74 6d 74 5d 2c 20 70  (azSql[eStmt], p
3ec0: 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29  ->zDb, p->zName)
3ed0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3ee0: 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 72  !zSql ){.      r
3ef0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
3f00: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3f10: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
3f20: 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
3f30: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
3f40: 6d 74 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  mt, NULL);.     
3f50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
3f60: 71 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ql);.      asser
3f70: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
3f80: 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a   || pStmt==0 );.
3f90: 20 20 20 20 20 20 70 2d 3e 61 53 74 6d 74 5b 65        p->aStmt[e
3fa0: 53 74 6d 74 5d 20 3d 20 70 53 74 6d 74 3b 0a 20  Stmt] = pStmt;. 
3fb0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 61     }.  }.  if( a
3fc0: 70 56 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  pVal ){.    int 
3fd0: 69 3b 0a 20 20 20 20 69 6e 74 20 6e 50 61 72 61  i;.    int nPara
3fe0: 6d 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  m = sqlite3_bind
3ff0: 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
4000: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 66 6f 72  (pStmt);.    for
4010: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
4020: 5f 4f 4b 20 26 26 20 69 3c 6e 50 61 72 61 6d 3b  _OK && i<nParam;
4030: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20   i++){.      rc 
4040: 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76  = sqlite3_bind_v
4050: 61 6c 75 65 28 70 53 74 6d 74 2c 20 69 2b 31 2c  alue(pStmt, i+1,
4060: 20 61 70 56 61 6c 5b 69 5d 29 3b 0a 20 20 20 20   apVal[i]);.    
4070: 7d 0a 20 20 7d 0a 20 20 2a 70 70 20 3d 20 70 53  }.  }.  *pp = pS
4080: 74 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  tmt;.  return rc
4090: 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74  ;.}...static int
40a0: 20 66 74 73 33 53 65 6c 65 63 74 44 6f 63 73 69   fts3SelectDocsi
40b0: 7a 65 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  ze(.  Fts3Table 
40c0: 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
40d0: 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61        /* FTS3 ta
40e0: 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
40f0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44  sqlite3_int64 iD
4100: 6f 63 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  ocid,           
4110: 2f 2a 20 44 6f 63 69 64 20 74 6f 20 62 69 6e 64  /* Docid to bind
4120: 20 66 6f 72 20 53 51 4c 5f 53 45 4c 45 43 54 5f   for SQL_SELECT_
4130: 44 4f 43 53 49 5a 45 20 2a 2f 0a 20 20 73 71 6c  DOCSIZE */.  sql
4140: 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
4150: 6d 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mt           /* 
4160: 4f 55 54 3a 20 53 74 61 74 65 6d 65 6e 74 20 68  OUT: Statement h
4170: 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 71  andle */.){.  sq
4180: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
4190: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  t = 0;        /*
41a0: 20 53 74 61 74 65 6d 65 6e 74 20 72 65 71 75 65   Statement reque
41b0: 73 74 65 64 20 66 72 6f 6d 20 66 74 73 33 53 71  sted from fts3Sq
41c0: 6c 53 74 6d 74 28 29 20 2a 2f 0a 20 20 69 6e 74  lStmt() */.  int
41d0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
41f0: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
4200: 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
4210: 6d 74 28 70 54 61 62 2c 20 53 51 4c 5f 53 45 4c  mt(pTab, SQL_SEL
4220: 45 43 54 5f 44 4f 43 53 49 5a 45 2c 20 26 70 53  ECT_DOCSIZE, &pS
4230: 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tmt, 0);.  if( r
4240: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
4250: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
4260: 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 2c  _int64(pStmt, 1,
4270: 20 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 72 63   iDocid);.    rc
4280: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
4290: 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20  pStmt);.    if( 
42a0: 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 7c  rc!=SQLITE_ROW |
42b0: 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  | sqlite3_column
42c0: 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 30 29 21  _type(pStmt, 0)!
42d0: 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a  =SQLITE_BLOB ){.
42e0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
42f0: 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
4300: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
4310: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
4320: 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41 42  FTS_CORRUPT_VTAB
4330: 3b 0a 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20  ;.      pStmt = 
4340: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
4350: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4360: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
4370: 20 2a 70 70 53 74 6d 74 20 3d 20 70 53 74 6d 74   *ppStmt = pStmt
4380: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
4390: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
43a0: 33 53 65 6c 65 63 74 44 6f 63 74 6f 74 61 6c 28  3SelectDoctotal(
43b0: 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 54  .  Fts3Table *pT
43c0: 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
43d0: 20 20 20 2f 2a 20 46 74 73 33 20 74 61 62 6c 65     /* Fts3 table
43e0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c   handle */.  sql
43f0: 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
4400: 6d 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mt           /* 
4410: 4f 55 54 3a 20 53 74 61 74 65 6d 65 6e 74 20 68  OUT: Statement h
4420: 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 71  andle */.){.  sq
4430: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
4440: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  t = 0;.  int rc;
4450: 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
4460: 74 6d 74 28 70 54 61 62 2c 20 53 51 4c 5f 53 45  tmt(pTab, SQL_SE
4470: 4c 45 43 54 5f 53 54 41 54 2c 20 26 70 53 74 6d  LECT_STAT, &pStm
4480: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  t, 0);.  if( rc=
4490: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
44a0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
44b0: 6e 74 28 70 53 74 6d 74 2c 20 31 2c 20 46 54 53  nt(pStmt, 1, FTS
44c0: 5f 53 54 41 54 5f 44 4f 43 54 4f 54 41 4c 29 3b  _STAT_DOCTOTAL);
44d0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
44e0: 5f 73 74 65 70 28 70 53 74 6d 74 29 21 3d 53 51  _step(pStmt)!=SQ
44f0: 4c 49 54 45 5f 52 4f 57 0a 20 20 20 20 20 7c 7c  LITE_ROW.     ||
4500: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
4510: 74 79 70 65 28 70 53 74 6d 74 2c 20 30 29 21 3d  type(pStmt, 0)!=
4520: 53 51 4c 49 54 45 5f 42 4c 4f 42 0a 20 20 20 20  SQLITE_BLOB.    
4530: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
4540: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
4550: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
4560: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
4570: 20 3d 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56   = FTS_CORRUPT_V
4580: 54 41 42 3b 0a 20 20 20 20 20 20 70 53 74 6d 74  TAB;.      pStmt
4590: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
45a0: 20 20 2a 70 70 53 74 6d 74 20 3d 20 70 53 74 6d    *ppStmt = pStm
45b0: 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
45c0: 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  }..int sqlite3Ft
45d0: 73 33 53 65 6c 65 63 74 44 6f 63 73 69 7a 65 28  s3SelectDocsize(
45e0: 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 54  .  Fts3Table *pT
45f0: 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
4600: 20 20 20 2f 2a 20 46 74 73 33 20 74 61 62 6c 65     /* Fts3 table
4610: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c   handle */.  sql
4620: 69 74 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 69  ite3_int64 iDoci
4630: 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
4640: 44 6f 63 69 64 20 74 6f 20 72 65 61 64 20 73 69  Docid to read si
4650: 7a 65 20 64 61 74 61 20 66 6f 72 20 2a 2f 0a 20  ze data for */. 
4660: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a   sqlite3_stmt **
4670: 70 70 53 74 6d 74 20 20 20 20 20 20 20 20 20 20  ppStmt          
4680: 20 2f 2a 20 4f 55 54 3a 20 53 74 61 74 65 6d 65   /* OUT: Stateme
4690: 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a  nt handle */.){.
46a0: 20 20 72 65 74 75 72 6e 20 66 74 73 33 53 65 6c    return fts3Sel
46b0: 65 63 74 44 6f 63 73 69 7a 65 28 70 54 61 62 2c  ectDocsize(pTab,
46c0: 20 69 44 6f 63 69 64 2c 20 70 70 53 74 6d 74 29   iDocid, ppStmt)
46d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 69 6c  ;.}../*.** Simil
46e0: 61 72 20 74 6f 20 66 74 73 33 53 71 6c 53 74 6d  ar to fts3SqlStm
46f0: 74 28 29 2e 20 45 78 63 65 70 74 2c 20 61 66 74  t(). Except, aft
4700: 65 72 20 62 69 6e 64 69 6e 67 20 74 68 65 20 70  er binding the p
4710: 61 72 61 6d 65 74 65 72 73 20 69 6e 0a 2a 2a 20  arameters in.** 
4720: 61 72 72 61 79 20 61 70 56 61 6c 5b 5d 20 74 6f  array apVal[] to
4730: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
4740: 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  nt identified by
4750: 20 65 53 74 6d 74 2c 20 74 68 65 20 73 74 61 74   eStmt, the stat
4760: 65 6d 65 6e 74 0a 2a 2a 20 69 73 20 65 78 65 63  ement.** is exec
4770: 75 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  uted..**.** Retu
4780: 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  rns SQLITE_OK if
4790: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
47a0: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 65  s successfully e
47b0: 78 65 63 75 74 65 64 2c 20 6f 72 20 61 6e 0a 2a  xecuted, or an.*
47c0: 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  * SQLite error c
47d0: 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
47e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
47f0: 73 33 53 71 6c 45 78 65 63 28 0a 20 20 69 6e 74  s3SqlExec(.  int
4800: 20 2a 70 52 43 2c 20 20 20 20 20 20 20 20 20 20   *pRC,          
4810: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
4820: 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 54 61  code */.  Fts3Ta
4830: 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
4840: 20 20 20 2f 2a 20 54 68 65 20 46 54 53 33 20 74     /* The FTS3 t
4850: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 65 53  able */.  int eS
4860: 74 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  tmt,            
4870: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73     /* Index of s
4880: 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 76 61 6c  tatement to eval
4890: 75 61 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uate */.  sqlite
48a0: 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20  3_value **apVal 
48b0: 20 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 73     /* Parameters
48c0: 20 74 6f 20 62 69 6e 64 20 2a 2f 0a 29 7b 0a 20   to bind */.){. 
48d0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
48e0: 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Stmt;.  int rc;.
48f0: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
4900: 75 72 6e 3b 0a 20 20 72 63 20 3d 20 66 74 73 33  urn;.  rc = fts3
4910: 53 71 6c 53 74 6d 74 28 70 2c 20 65 53 74 6d 74  SqlStmt(p, eStmt
4920: 2c 20 26 70 53 74 6d 74 2c 20 61 70 56 61 6c 29  , &pStmt, apVal)
4930: 3b 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ; .  if( rc==SQL
4940: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
4950: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
4960: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
4970: 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
4980: 3b 0a 20 20 7d 0a 20 20 2a 70 52 43 20 3d 20 72  ;.  }.  *pRC = r
4990: 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  c;.}..static voi
49a0: 64 20 66 74 73 33 53 71 6c 45 78 65 63 49 36 34  d fts3SqlExecI64
49b0: 28 0a 20 20 69 6e 74 20 2a 70 52 43 2c 20 20 20  (.  int *pRC,   
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
49d0: 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
49e0: 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
49f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4a00: 20 46 54 53 33 20 74 61 62 6c 65 20 2a 2f 0a 20   FTS3 table */. 
4a10: 20 69 6e 74 20 65 53 74 6d 74 2c 20 20 20 20 20   int eStmt,     
4a20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
4a30: 65 78 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 20  ex of statement 
4a40: 74 6f 20 65 76 61 6c 75 61 74 65 20 2a 2f 0a 20  to evaluate */. 
4a50: 20 69 36 34 20 69 56 61 6c 0a 29 7b 0a 20 20 73   i64 iVal.){.  s
4a60: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
4a70: 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  mt;.  int rc;.  
4a80: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
4a90: 6e 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71  n;.  rc = fts3Sq
4aa0: 6c 53 74 6d 74 28 70 2c 20 65 53 74 6d 74 2c 20  lStmt(p, eStmt, 
4ab0: 26 70 53 74 6d 74 2c 20 30 29 3b 20 0a 20 20 69  &pStmt, 0); .  i
4ac0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4ad0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
4ae0: 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
4af0: 2c 20 31 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20  , 1, iVal);.    
4b00: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
4b10: 6d 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  mt);.    rc = sq
4b20: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
4b30: 74 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 43 20 3d  t);.  }.  *pRC =
4b40: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
4b50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 6e 73  his function ens
4b60: 75 72 65 73 20 74 68 61 74 20 74 68 65 20 63 61  ures that the ca
4b70: 6c 6c 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65  ller has obtaine
4b80: 64 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 0a  d an exclusive .
4b90: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
4ba0: 74 61 62 6c 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  table-lock on th
4bb0: 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65  e %_segdir table
4bc0: 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
4bd0: 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20 77 72  ed before .** wr
4be0: 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68  iting data to th
4bf0: 65 20 66 74 73 33 20 74 61 62 6c 65 2e 20 49 66  e fts3 table. If
4c00: 20 74 68 69 73 20 6c 6f 63 6b 20 69 73 20 6e 6f   this lock is no
4c10: 74 20 61 63 71 75 69 72 65 64 20 66 69 72 73 74  t acquired first
4c20: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61  , then.** the ca
4c30: 6c 6c 65 72 20 6d 61 79 20 65 6e 64 20 75 70 20  ller may end up 
4c40: 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 74 61  attempting to ta
4c50: 6b 65 20 74 68 69 73 20 6c 6f 63 6b 20 61 73 20  ke this lock as 
4c60: 70 61 72 74 20 6f 66 20 63 6f 6d 6d 69 74 74 69  part of committi
4c70: 6e 67 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74  ng.** a transact
4c80: 69 6f 6e 2c 20 63 61 75 73 69 6e 67 20 53 51 4c  ion, causing SQL
4c90: 69 74 65 20 74 6f 20 72 65 74 75 72 6e 20 53 51  ite to return SQ
4ca0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 6f 72 20 0a  LITE_LOCKED or .
4cb0: 2a 2a 20 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  ** LOCKED_SHARED
4cc0: 43 41 43 48 45 74 6f 20 61 20 43 4f 4d 4d 49 54  CACHEto a COMMIT
4cd0: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
4ce0: 49 74 20 69 73 20 62 65 73 74 20 74 6f 20 61 76  It is best to av
4cf0: 6f 69 64 20 74 68 69 73 20 62 65 63 61 75 73 65  oid this because
4d00: 20 69 66 20 46 54 53 33 20 72 65 74 75 72 6e 73   if FTS3 returns
4d10: 20 61 6e 79 20 65 72 72 6f 72 20 77 68 65 6e 20   any error when 
4d20: 0a 2a 2a 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  .** committing a
4d30: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
4d40: 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74  e whole transact
4d50: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c  ion will be roll
4d60: 65 64 20 62 61 63 6b 2e 20 0a 2a 2a 20 41 6e 64  ed back. .** And
4d70: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 77 68 61   this is not wha
4d80: 74 20 75 73 65 72 73 20 65 78 70 65 63 74 20 77  t users expect w
4d90: 68 65 6e 20 74 68 65 79 20 67 65 74 20 53 51 4c  hen they get SQL
4da0: 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
4db0: 44 43 41 43 48 45 2e 20 0a 2a 2a 20 49 74 20 63  DCACHE. .** It c
4dc0: 61 6e 20 73 74 69 6c 6c 20 68 61 70 70 65 6e 20  an still happen 
4dd0: 69 66 20 74 68 65 20 75 73 65 72 20 6c 6f 63 6b  if the user lock
4de0: 73 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  s the underlying
4df0: 20 74 61 62 6c 65 73 20 64 69 72 65 63 74 6c 79   tables directly
4e00: 20 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20   .** instead of 
4e10: 61 63 63 65 73 73 69 6e 67 20 74 68 65 6d 20 76  accessing them v
4e20: 69 61 20 46 54 53 2e 0a 2a 2f 0a 73 74 61 74 69  ia FTS..*/.stati
4e30: 63 20 69 6e 74 20 66 74 73 33 57 72 69 74 65 6c  c int fts3Writel
4e40: 6f 63 6b 28 46 74 73 33 54 61 62 6c 65 20 2a 70  ock(Fts3Table *p
4e50: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
4e60: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66  LITE_OK;.  .  if
4e70: 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74  ( p->nPendingDat
4e80: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  a==0 ){.    sqli
4e90: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
4ea0: 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71  .    rc = fts3Sq
4eb0: 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 44 45 4c  lStmt(p, SQL_DEL
4ec0: 45 54 45 5f 53 45 47 44 49 52 5f 4c 45 56 45 4c  ETE_SEGDIR_LEVEL
4ed0: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
4ee0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4ef0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
4f00: 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70  ite3_bind_null(p
4f10: 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  Stmt, 1);.      
4f20: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
4f30: 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  mt);.      rc = 
4f40: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
4f50: 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tmt);.    }.  }.
4f60: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4f70: 0a 2f 2a 0a 2a 2a 20 46 54 53 20 6d 61 69 6e 74  ./*.** FTS maint
4f80: 61 69 6e 73 20 61 20 73 65 70 61 72 61 74 65 20  ains a separate 
4f90: 69 6e 64 65 78 65 73 20 66 6f 72 20 65 61 63 68  indexes for each
4fa0: 20 6c 61 6e 67 75 61 67 65 2d 69 64 20 28 61 20   language-id (a 
4fb0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 29 2e  32-bit integer).
4fc0: 0a 2a 2a 20 57 69 74 68 69 6e 20 65 61 63 68 20  .** Within each 
4fd0: 6c 61 6e 67 75 61 67 65 20 69 64 2c 20 61 20 73  language id, a s
4fe0: 65 70 61 72 61 74 65 20 69 6e 64 65 78 20 69 73  eparate index is
4ff0: 20 6d 61 69 6e 74 61 69 6e 65 64 20 74 6f 20 73   maintained to s
5000: 74 6f 72 65 20 74 68 65 0a 2a 2a 20 64 6f 63 75  tore the.** docu
5010: 6d 65 6e 74 20 74 65 72 6d 73 2c 20 61 6e 64 20  ment terms, and 
5020: 65 61 63 68 20 63 6f 6e 66 69 67 75 72 65 64 20  each configured 
5030: 70 72 65 66 69 78 20 73 69 7a 65 20 28 63 6f 6e  prefix size (con
5040: 66 69 67 75 72 65 64 20 74 68 65 20 46 54 53 20  figured the FTS 
5050: 0a 2a 2a 20 22 70 72 65 66 69 78 3d 22 20 6f 70  .** "prefix=" op
5060: 74 69 6f 6e 29 2e 20 41 6e 64 20 65 61 63 68 20  tion). And each 
5070: 69 6e 64 65 78 20 63 6f 6e 73 69 73 74 73 20 6f  index consists o
5080: 66 20 6d 75 6c 74 69 70 6c 65 20 6c 65 76 65 6c  f multiple level
5090: 73 20 28 22 72 65 6c 61 74 69 76 65 0a 2a 2a 20  s ("relative.** 
50a0: 6c 65 76 65 6c 73 22 29 2e 0a 2a 2a 0a 2a 2a 20  levels")..**.** 
50b0: 41 6c 6c 20 74 68 72 65 65 20 6f 66 20 74 68 65  All three of the
50c0: 73 65 20 76 61 6c 75 65 73 20 28 74 68 65 20 6c  se values (the l
50d0: 61 6e 67 75 61 67 65 20 69 64 2c 20 74 68 65 20  anguage id, the 
50e0: 73 70 65 63 69 66 69 63 20 69 6e 64 65 78 20 61  specific index a
50f0: 6e 64 20 74 68 65 0a 2a 2a 20 6c 65 76 65 6c 20  nd the.** level 
5100: 77 69 74 68 69 6e 20 74 68 65 20 69 6e 64 65 78  within the index
5110: 29 20 61 72 65 20 65 6e 63 6f 64 65 64 20 69 6e  ) are encoded in
5120: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
5130: 76 61 6c 75 65 73 20 73 74 6f 72 65 64 0a 2a 2a  values stored.**
5140: 20 69 6e 20 74 68 65 20 25 5f 73 65 67 64 69 72   in the %_segdir
5150: 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2e 20   table on disk. 
5160: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
5170: 20 75 73 65 64 20 74 6f 20 63 6f 6e 76 65 72 74   used to convert
5180: 20 74 68 72 65 65 0a 2a 2a 20 73 65 70 61 72 61   three.** separa
5190: 74 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 76 61 6c  te component val
51a0: 75 65 73 20 69 6e 74 6f 20 74 68 65 20 73 69 6e  ues into the sin
51b0: 67 6c 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67  gle 64-bit integ
51c0: 65 72 20 76 61 6c 75 65 20 74 68 61 74 0a 2a 2a  er value that.**
51d0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
51e0: 71 75 65 72 79 20 74 68 65 20 25 5f 73 65 67 64  query the %_segd
51f0: 69 72 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ir table..**.** 
5200: 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 65 61  Specifically, ea
5210: 63 68 20 6c 61 6e 67 75 61 67 65 2d 69 64 2f 69  ch language-id/i
5220: 6e 64 65 78 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ndex combination
5230: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 31 30   is allocated 10
5240: 32 34 20 0a 2a 2a 20 36 34 2d 62 69 74 20 69 6e  24 .** 64-bit in
5250: 74 65 67 65 72 20 6c 65 76 65 6c 20 76 61 6c 75  teger level valu
5260: 65 73 20 28 22 61 62 73 6f 6c 75 74 65 20 6c 65  es ("absolute le
5270: 76 65 6c 73 22 29 2e 20 54 68 65 20 6d 61 69 6e  vels"). The main
5280: 20 74 65 72 6d 73 20 69 6e 64 65 78 0a 2a 2a 20   terms index.** 
5290: 66 6f 72 20 6c 61 6e 67 75 61 67 65 2d 69 64 20  for language-id 
52a0: 30 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 76 61  0 is allocate va
52b0: 6c 75 65 73 20 30 2d 31 30 32 33 2e 20 54 68 65  lues 0-1023. The
52c0: 20 66 69 72 73 74 20 70 72 65 66 69 78 20 69 6e   first prefix in
52d0: 64 65 78 0a 2a 2a 20 28 69 66 20 61 6e 79 29 20  dex.** (if any) 
52e0: 66 6f 72 20 6c 61 6e 67 75 61 67 65 2d 69 64 20  for language-id 
52f0: 30 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 76  0 is allocated v
5300: 61 6c 75 65 73 20 31 30 32 34 2d 32 30 34 37 2e  alues 1024-2047.
5310: 20 41 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 20 4c   And so on..** L
5320: 61 6e 67 75 61 67 65 20 31 20 69 6e 64 65 78 65  anguage 1 indexe
5330: 73 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 20  s are allocated 
5340: 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
5350: 6f 77 69 6e 67 20 6c 61 6e 67 75 61 67 65 20 30  owing language 0
5360: 2e 0a 2a 2a 0a 2a 2a 20 53 6f 2c 20 66 6f 72 20  ..**.** So, for 
5370: 61 20 73 79 73 74 65 6d 20 77 69 74 68 20 6e 50  a system with nP
5380: 72 65 66 69 78 20 70 72 65 66 69 78 20 69 6e 64  refix prefix ind
5390: 65 78 65 73 20 63 6f 6e 66 69 67 75 72 65 64 2c  exes configured,
53a0: 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 0a 2a 2a   the block of.**
53b0: 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 73   absolute levels
53c0: 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
53d0: 73 20 74 6f 20 6c 61 6e 67 75 61 67 65 2d 69 64  s to language-id
53e0: 20 69 4c 61 6e 67 69 64 20 61 6e 64 20 69 6e 64   iLangid and ind
53f0: 65 78 20 0a 2a 2a 20 69 49 6e 64 65 78 20 73 74  ex .** iIndex st
5400: 61 72 74 73 20 61 74 20 61 62 73 6f 6c 75 74 65  arts at absolute
5410: 20 6c 65 76 65 6c 20 28 28 69 4c 61 6e 67 69 64   level ((iLangid
5420: 20 2a 20 28 6e 50 72 65 66 69 78 2b 31 29 20 2b   * (nPrefix+1) +
5430: 20 69 49 6e 64 65 78 29 20 2a 20 31 30 32 34 29   iIndex) * 1024)
5440: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
5450: 74 65 33 5f 69 6e 74 36 34 20 67 65 74 41 62 73  te3_int64 getAbs
5460: 6f 6c 75 74 65 4c 65 76 65 6c 28 0a 20 20 46 74  oluteLevel(.  Ft
5470: 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
5480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5490: 20 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64   FTS3 table hand
54a0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e  le */.  int iLan
54b0: 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  gid,            
54c0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75          /* Langu
54d0: 61 67 65 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20  age id */.  int 
54e0: 69 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20  iIndex,         
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
5500: 6e 64 65 78 20 69 6e 20 70 2d 3e 61 49 6e 64 65  ndex in p->aInde
5510: 78 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  x[] */.  int iLe
5520: 76 65 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  vel             
5530: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65           /* Leve
5540: 6c 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f  l of segments */
5550: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  .){.  sqlite3_in
5560: 74 36 34 20 69 42 61 73 65 3b 20 20 20 20 20 20  t64 iBase;      
5570: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
5580: 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 66 6f  bsolute level fo
5590: 72 20 69 4c 61 6e 67 69 64 2f 69 49 6e 64 65 78  r iLangid/iIndex
55a0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 4c   */.  assert( iL
55b0: 61 6e 67 69 64 3e 3d 30 20 29 3b 0a 20 20 61 73  angid>=0 );.  as
55c0: 73 65 72 74 28 20 70 2d 3e 6e 49 6e 64 65 78 3e  sert( p->nIndex>
55d0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
55e0: 49 6e 64 65 78 3e 3d 30 20 26 26 20 69 49 6e 64  Index>=0 && iInd
55f0: 65 78 3c 70 2d 3e 6e 49 6e 64 65 78 20 29 3b 0a  ex<p->nIndex );.
5600: 0a 20 20 69 42 61 73 65 20 3d 20 28 28 73 71 6c  .  iBase = ((sql
5610: 69 74 65 33 5f 69 6e 74 36 34 29 69 4c 61 6e 67  ite3_int64)iLang
5620: 69 64 20 2a 20 70 2d 3e 6e 49 6e 64 65 78 20 2b  id * p->nIndex +
5630: 20 69 49 6e 64 65 78 29 20 2a 20 46 54 53 33 5f   iIndex) * FTS3_
5640: 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 3b  SEGDIR_MAXLEVEL;
5650: 0a 20 20 72 65 74 75 72 6e 20 69 42 61 73 65 20  .  return iBase 
5660: 2b 20 69 4c 65 76 65 6c 3b 0a 7d 0a 0a 2f 2a 0a  + iLevel;.}../*.
5670: 2a 2a 20 53 65 74 20 2a 70 70 53 74 6d 74 20 74  ** Set *ppStmt t
5680: 6f 20 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61  o a statement ha
5690: 6e 64 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65  ndle that may be
56a0: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
56b0: 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20   through.** all 
56c0: 72 6f 77 73 20 69 6e 20 74 68 65 20 25 5f 73 65  rows in the %_se
56d0: 67 64 69 72 20 74 61 62 6c 65 2c 20 66 72 6f 6d  gdir table, from
56e0: 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77 65 73   oldest to newes
56f0: 74 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  t. If successful
5700: 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49  ,.** return SQLI
5710: 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 65 72 72  TE_OK. If an err
5720: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
5730: 70 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74  preparing the st
5740: 61 74 65 6d 65 6e 74 2c 20 0a 2a 2a 20 72 65 74  atement, .** ret
5750: 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
5760: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
5770: 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  There is only ev
5780: 65 72 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  er one instance 
5790: 6f 66 20 74 68 69 73 20 53 51 4c 20 73 74 61 74  of this SQL stat
57a0: 65 6d 65 6e 74 20 63 6f 6d 70 69 6c 65 64 20 66  ement compiled f
57b0: 6f 72 0a 2a 2a 20 65 61 63 68 20 46 54 53 33 20  or.** each FTS3 
57c0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
57d0: 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
57e0: 6e 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ns the following
57f0: 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68   columns from th
5800: 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65  e %_segdir table
5810: 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 69 64 78  :.**.**   0: idx
5820: 0a 2a 2a 20 20 20 31 3a 20 73 74 61 72 74 5f 62  .**   1: start_b
5830: 6c 6f 63 6b 0a 2a 2a 20 20 20 32 3a 20 6c 65 61  lock.**   2: lea
5840: 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 0a 2a 2a  ves_end_block.**
5850: 20 20 20 33 3a 20 65 6e 64 5f 62 6c 6f 63 6b 0a     3: end_block.
5860: 2a 2a 20 20 20 34 3a 20 72 6f 6f 74 0a 2a 2f 0a  **   4: root.*/.
5870: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 41  int sqlite3Fts3A
5880: 6c 6c 53 65 67 64 69 72 73 28 0a 20 20 46 74 73  llSegdirs(.  Fts
5890: 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
58a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
58b0: 46 54 53 33 20 74 61 62 6c 65 20 2a 2f 0a 20 20  FTS3 table */.  
58c0: 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20 20 20  int iLangid,    
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58e0: 2f 2a 20 4c 61 6e 67 75 61 67 65 20 62 65 69 6e  /* Language bein
58f0: 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 69  g queried */.  i
5900: 6e 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20 20  nt iIndex,      
5910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5920: 2a 20 49 6e 64 65 78 20 66 6f 72 20 70 2d 3e 61  * Index for p->a
5930: 49 6e 64 65 78 5b 5d 20 2a 2f 0a 20 20 69 6e 74  Index[] */.  int
5940: 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20   iLevel,        
5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5960: 4c 65 76 65 6c 20 74 6f 20 73 65 6c 65 63 74 20  Level to select 
5970: 28 72 65 6c 61 74 69 76 65 20 6c 65 76 65 6c 29  (relative level)
5980: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
5990: 6d 74 20 2a 2a 70 70 53 74 6d 74 20 20 20 20 20  mt **ppStmt     
59a0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 6f        /* OUT: Co
59b0: 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
59c0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
59d0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
59e0: 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 61  *pStmt = 0;..  a
59f0: 73 73 65 72 74 28 20 69 4c 65 76 65 6c 3d 3d 46  ssert( iLevel==F
5a00: 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c  TS3_SEGCURSOR_AL
5a10: 4c 20 7c 7c 20 69 4c 65 76 65 6c 3e 3d 30 20 29  L || iLevel>=0 )
5a20: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 76  ;.  assert( iLev
5a30: 65 6c 3c 46 54 53 33 5f 53 45 47 44 49 52 5f 4d  el<FTS3_SEGDIR_M
5a40: 41 58 4c 45 56 45 4c 20 29 3b 0a 20 20 61 73 73  AXLEVEL );.  ass
5a50: 65 72 74 28 20 69 49 6e 64 65 78 3e 3d 30 20 26  ert( iIndex>=0 &
5a60: 26 20 69 49 6e 64 65 78 3c 70 2d 3e 6e 49 6e 64  & iIndex<p->nInd
5a70: 65 78 20 29 3b 0a 0a 20 20 69 66 28 20 69 4c 65  ex );..  if( iLe
5a80: 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20  vel<0 ){.    /* 
5a90: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 25  "SELECT * FROM %
5aa0: 5f 73 65 67 64 69 72 20 57 48 45 52 45 20 6c 65  _segdir WHERE le
5ab0: 76 65 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e  vel BETWEEN ? AN
5ac0: 44 20 3f 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e  D ? ORDER BY ...
5ad0: 22 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74  " */.    rc = ft
5ae0: 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
5af0: 5f 53 45 4c 45 43 54 5f 4c 45 56 45 4c 5f 52 41  _SELECT_LEVEL_RA
5b00: 4e 47 45 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  NGE, &pStmt, 0);
5b10: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
5b20: 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20  ITE_OK ){ .     
5b30: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
5b40: 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 67 65  t64(pStmt, 1, ge
5b50: 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70  tAbsoluteLevel(p
5b60: 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
5b70: 78 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 73 71  x, 0));.      sq
5b80: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
5b90: 28 70 53 74 6d 74 2c 20 32 2c 20 0a 20 20 20 20  (pStmt, 2, .    
5ba0: 20 20 20 20 20 20 67 65 74 41 62 73 6f 6c 75 74        getAbsolut
5bb0: 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69  eLevel(p, iLangi
5bc0: 64 2c 20 69 49 6e 64 65 78 2c 20 46 54 53 33 5f  d, iIndex, FTS3_
5bd0: 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 2d  SEGDIR_MAXLEVEL-
5be0: 31 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  1).      );.    
5bf0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
5c00: 2a 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  * "SELECT * FROM
5c10: 20 25 5f 73 65 67 64 69 72 20 57 48 45 52 45 20   %_segdir WHERE 
5c20: 6c 65 76 65 6c 20 3d 20 3f 20 4f 52 44 45 52 20  level = ? ORDER 
5c30: 42 59 20 2e 2e 2e 22 20 2a 2f 0a 20 20 20 20 72  BY ..." */.    r
5c40: 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
5c50: 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c 45  p, SQL_SELECT_LE
5c60: 56 45 4c 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  VEL, &pStmt, 0);
5c70: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
5c80: 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20  ITE_OK ){ .     
5c90: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
5ca0: 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 67 65  t64(pStmt, 1, ge
5cb0: 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70  tAbsoluteLevel(p
5cc0: 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
5cd0: 78 2c 69 4c 65 76 65 6c 29 29 3b 0a 20 20 20 20  x,iLevel));.    
5ce0: 7d 0a 20 20 7d 0a 20 20 2a 70 70 53 74 6d 74 20  }.  }.  *ppStmt 
5cf0: 3d 20 70 53 74 6d 74 3b 0a 20 20 72 65 74 75 72  = pStmt;.  retur
5d00: 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
5d10: 41 70 70 65 6e 64 20 61 20 73 69 6e 67 6c 65 20  Append a single 
5d20: 76 61 72 69 6e 74 20 74 6f 20 61 20 50 65 6e 64  varint to a Pend
5d30: 69 6e 67 4c 69 73 74 20 62 75 66 66 65 72 2e 20  ingList buffer. 
5d40: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
5d50: 75 72 6e 65 64 0a 2a 2a 20 69 66 20 73 75 63 63  urned.** if succ
5d60: 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
5d70: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
5d80: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
5d90: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
5da0: 6c 73 6f 20 73 65 72 76 65 73 20 74 6f 20 61 6c  lso serves to al
5db0: 6c 6f 63 61 74 65 20 74 68 65 20 50 65 6e 64 69  locate the Pendi
5dc0: 6e 67 4c 69 73 74 20 73 74 72 75 63 74 75 72 65  ngList structure
5dd0: 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 46 6f 72 20   itself..** For 
5de0: 65 78 61 6d 70 6c 65 2c 20 74 6f 20 63 72 65 61  example, to crea
5df0: 74 65 20 61 20 6e 65 77 20 50 65 6e 64 69 6e 67  te a new Pending
5e00: 4c 69 73 74 20 73 74 72 75 63 74 75 72 65 20 63  List structure c
5e10: 6f 6e 74 61 69 6e 69 6e 67 20 74 77 6f 0a 2a 2a  ontaining two.**
5e20: 20 76 61 72 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20   varints:.**.** 
5e30: 20 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70    PendingList *p
5e40: 20 3d 20 30 3b 0a 2a 2a 20 20 20 66 74 73 33 50   = 0;.**   fts3P
5e50: 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64  endingListAppend
5e60: 56 61 72 69 6e 74 28 26 70 2c 20 31 29 3b 0a 2a  Varint(&p, 1);.*
5e70: 2a 20 20 20 66 74 73 33 50 65 6e 64 69 6e 67 4c  *   fts3PendingL
5e80: 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e 74 28  istAppendVarint(
5e90: 26 70 2c 20 32 29 3b 0a 2a 2f 0a 73 74 61 74 69  &p, 2);.*/.stati
5ea0: 63 20 69 6e 74 20 66 74 73 33 50 65 6e 64 69 6e  c int fts3Pendin
5eb0: 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e  gListAppendVarin
5ec0: 74 28 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73 74  t(.  PendingList
5ed0: 20 2a 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20   **pp,          
5ee0: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
5ef0: 50 6f 69 6e 74 65 72 20 74 6f 20 50 65 6e 64 69  Pointer to Pendi
5f00: 6e 67 4c 69 73 74 20 73 74 72 75 63 74 20 2a 2f  ngList struct */
5f10: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
5f20: 20 69 20 20 20 20 20 20 20 20 20 20 20 20 20 20   i              
5f30: 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 61     /* Value to a
5f40: 70 70 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f  ppend to data */
5f50: 0a 29 7b 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73  .){.  PendingLis
5f60: 74 20 2a 70 20 3d 20 2a 70 70 3b 0a 0a 20 20 2f  t *p = *pp;..  /
5f70: 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 67 72  * Allocate or gr
5f80: 6f 77 20 74 68 65 20 50 65 6e 64 69 6e 67 4c 69  ow the PendingLi
5f90: 73 74 20 61 73 20 72 65 71 75 69 72 65 64 2e 20  st as required. 
5fa0: 2a 2f 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  */.  if( !p ){. 
5fb0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d     p = sqlite3_m
5fc0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 29  alloc(sizeof(*p)
5fd0: 20 2b 20 31 30 30 29 3b 0a 20 20 20 20 69 66 28   + 100);.    if(
5fe0: 20 21 70 20 29 7b 0a 20 20 20 20 20 20 72 65 74   !p ){.      ret
5ff0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
6000: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e  ;.    }.    p->n
6010: 53 70 61 63 65 20 3d 20 31 30 30 3b 0a 20 20 20  Space = 100;.   
6020: 20 70 2d 3e 61 44 61 74 61 20 3d 20 28 63 68 61   p->aData = (cha
6030: 72 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 70  r *)&p[1];.    p
6040: 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d  ->nData = 0;.  }
6050: 0a 20 20 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e  .  else if( p->n
6060: 44 61 74 61 2b 46 54 53 33 5f 56 41 52 49 4e 54  Data+FTS3_VARINT
6070: 5f 4d 41 58 2b 31 3e 70 2d 3e 6e 53 70 61 63 65  _MAX+1>p->nSpace
6080: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77   ){.    int nNew
6090: 20 3d 20 70 2d 3e 6e 53 70 61 63 65 20 2a 20 32   = p->nSpace * 2
60a0: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
60b0: 33 5f 72 65 61 6c 6c 6f 63 28 70 2c 20 73 69 7a  3_realloc(p, siz
60c0: 65 6f 66 28 2a 70 29 20 2b 20 6e 4e 65 77 29 3b  eof(*p) + nNew);
60d0: 0a 20 20 20 20 69 66 28 20 21 70 20 29 7b 0a 20  .    if( !p ){. 
60e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
60f0: 65 28 2a 70 70 29 3b 0a 20 20 20 20 20 20 2a 70  e(*pp);.      *p
6100: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  p = 0;.      ret
6110: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
6120: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e  ;.    }.    p->n
6130: 53 70 61 63 65 20 3d 20 6e 4e 65 77 3b 0a 20 20  Space = nNew;.  
6140: 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 28 63 68    p->aData = (ch
6150: 61 72 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 7d 0a  ar *)&p[1];.  }.
6160: 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65  .  /* Append the
6170: 20 6e 65 77 20 73 65 72 69 61 6c 69 7a 65 64 20   new serialized 
6180: 76 61 72 69 6e 74 20 74 6f 20 74 68 65 20 65 6e  varint to the en
6190: 64 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 20 2a  d of the list. *
61a0: 2f 0a 20 20 70 2d 3e 6e 44 61 74 61 20 2b 3d 20  /.  p->nData += 
61b0: 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
61c0: 72 69 6e 74 28 26 70 2d 3e 61 44 61 74 61 5b 70  rint(&p->aData[p
61d0: 2d 3e 6e 44 61 74 61 5d 2c 20 69 29 3b 0a 20 20  ->nData], i);.  
61e0: 70 2d 3e 61 44 61 74 61 5b 70 2d 3e 6e 44 61 74  p->aData[p->nDat
61f0: 61 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 2a 70 70  a] = '\0';.  *pp
6200: 20 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e 20 53   = p;.  return S
6210: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
6220: 2a 2a 20 41 64 64 20 61 20 64 6f 63 69 64 2f 63  ** Add a docid/c
6230: 6f 6c 75 6d 6e 2f 70 6f 73 69 74 69 6f 6e 20 65  olumn/position e
6240: 6e 74 72 79 20 74 6f 20 61 20 50 65 6e 64 69 6e  ntry to a Pendin
6250: 67 4c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e  gList structure.
6260: 20 4e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 73 20   Non-zero.** is 
6270: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
6280: 73 74 72 75 63 74 75 72 65 20 69 73 20 73 71 6c  structure is sql
6290: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 65 64 20 61  ite3_realloced a
62a0: 73 20 70 61 72 74 20 6f 66 20 61 64 64 69 6e 67  s part of adding
62b0: 0a 2a 2a 20 74 68 65 20 65 6e 74 72 79 2e 20 4f  .** the entry. O
62c0: 74 68 65 72 77 69 73 65 2c 20 7a 65 72 6f 2e 0a  therwise, zero..
62d0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
62e0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
62f0: 52 63 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  Rc is set to SQL
6300: 49 54 45 5f 4e 4f 4d 45 4d 20 62 65 66 6f 72 65  ITE_NOMEM before
6310: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 5a   returning..** Z
6320: 65 72 6f 20 69 73 20 61 6c 77 61 79 73 20 72 65  ero is always re
6330: 74 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63  turned in this c
6340: 61 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ase. Otherwise, 
6350: 69 66 20 6e 6f 20 4f 4f 4d 20 65 72 72 6f 72 20  if no OOM error 
6360: 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73  occurs,.** it is
6370: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
6380: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
6390: 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74   fts3PendingList
63a0: 41 70 70 65 6e 64 28 0a 20 20 50 65 6e 64 69 6e  Append(.  Pendin
63b0: 67 4c 69 73 74 20 2a 2a 70 70 2c 20 20 20 20 20  gList **pp,     
63c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
63d0: 4f 55 54 3a 20 50 65 6e 64 69 6e 67 4c 69 73 74  OUT: PendingList
63e0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
63f0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44  sqlite3_int64 iD
6400: 6f 63 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  ocid,           
6410: 2f 2a 20 44 6f 63 69 64 20 66 6f 72 20 65 6e 74  /* Docid for ent
6420: 72 79 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 73  ry to add */.  s
6430: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 43 6f  qlite3_int64 iCo
6440: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
6450: 2a 20 43 6f 6c 75 6d 6e 20 66 6f 72 20 65 6e 74  * Column for ent
6460: 72 79 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 73  ry to add */.  s
6470: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 6f  qlite3_int64 iPo
6480: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
6490: 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 65  * Position of te
64a0: 72 6d 20 66 6f 72 20 65 6e 74 72 79 20 74 6f 20  rm for entry to 
64b0: 61 64 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  add */.  int *pR
64c0: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
64d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
64e0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
64f0: 29 7b 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73 74  ){.  PendingList
6500: 20 2a 70 20 3d 20 2a 70 70 3b 0a 20 20 69 6e 74   *p = *pp;.  int
6510: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
6520: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 20 7c  ..  assert( !p |
6530: 7c 20 70 2d 3e 69 4c 61 73 74 44 6f 63 69 64 3c  | p->iLastDocid<
6540: 3d 69 44 6f 63 69 64 20 29 3b 0a 0a 20 20 69 66  =iDocid );..  if
6550: 28 20 21 70 20 7c 7c 20 70 2d 3e 69 4c 61 73 74  ( !p || p->iLast
6560: 44 6f 63 69 64 21 3d 69 44 6f 63 69 64 20 29 7b  Docid!=iDocid ){
6570: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
6580: 36 34 20 69 44 65 6c 74 61 20 3d 20 69 44 6f 63  64 iDelta = iDoc
6590: 69 64 20 2d 20 28 70 20 3f 20 70 2d 3e 69 4c 61  id - (p ? p->iLa
65a0: 73 74 44 6f 63 69 64 20 3a 20 30 29 3b 0a 20 20  stDocid : 0);.  
65b0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
65c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 44 61 74   assert( p->nDat
65d0: 61 3c 70 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 20  a<p->nSpace );. 
65e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
65f0: 61 44 61 74 61 5b 70 2d 3e 6e 44 61 74 61 5d 3d  aData[p->nData]=
6600: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  =0 );.      p->n
6610: 44 61 74 61 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Data++;.    }.  
6620: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
6630: 3d 28 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69  =(rc = fts3Pendi
6640: 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69  ngListAppendVari
6650: 6e 74 28 26 70 2c 20 69 44 65 6c 74 61 29 29 20  nt(&p, iDelta)) 
6660: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 65  ){.      goto pe
6670: 6e 64 69 6e 67 6c 69 73 74 61 70 70 65 6e 64 5f  ndinglistappend_
6680: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
6690: 2d 3e 69 4c 61 73 74 43 6f 6c 20 3d 20 2d 31 3b  ->iLastCol = -1;
66a0: 0a 20 20 20 20 70 2d 3e 69 4c 61 73 74 50 6f 73  .    p->iLastPos
66b0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 69 4c 61   = 0;.    p->iLa
66c0: 73 74 44 6f 63 69 64 20 3d 20 69 44 6f 63 69 64  stDocid = iDocid
66d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c  ;.  }.  if( iCol
66e0: 3e 30 20 26 26 20 70 2d 3e 69 4c 61 73 74 43 6f  >0 && p->iLastCo
66f0: 6c 21 3d 69 43 6f 6c 20 29 7b 0a 20 20 20 20 69  l!=iCol ){.    i
6700: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
6710: 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 4c  c = fts3PendingL
6720: 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e 74 28  istAppendVarint(
6730: 26 70 2c 20 31 29 29 0a 20 20 20 20 20 7c 7c 20  &p, 1)).     || 
6740: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
6750: 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74   fts3PendingList
6760: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2c  AppendVarint(&p,
6770: 20 69 43 6f 6c 29 29 0a 20 20 20 20 29 7b 0a 20   iCol)).    ){. 
6780: 20 20 20 20 20 67 6f 74 6f 20 70 65 6e 64 69 6e       goto pendin
6790: 67 6c 69 73 74 61 70 70 65 6e 64 5f 6f 75 74 3b  glistappend_out;
67a0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 4c  .    }.    p->iL
67b0: 61 73 74 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20  astCol = iCol;. 
67c0: 20 20 20 70 2d 3e 69 4c 61 73 74 50 6f 73 20 3d     p->iLastPos =
67d0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43   0;.  }.  if( iC
67e0: 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ol>=0 ){.    ass
67f0: 65 72 74 28 20 69 50 6f 73 3e 70 2d 3e 69 4c 61  ert( iPos>p->iLa
6800: 73 74 50 6f 73 20 7c 7c 20 28 69 50 6f 73 3d 3d  stPos || (iPos==
6810: 30 20 26 26 20 70 2d 3e 69 4c 61 73 74 50 6f 73  0 && p->iLastPos
6820: 3d 3d 30 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  ==0) );.    rc =
6830: 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74   fts3PendingList
6840: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2c  AppendVarint(&p,
6850: 20 32 2b 69 50 6f 73 2d 70 2d 3e 69 4c 61 73 74   2+iPos-p->iLast
6860: 50 6f 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Pos);.    if( rc
6870: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6880: 20 20 20 20 20 70 2d 3e 69 4c 61 73 74 50 6f 73       p->iLastPos
6890: 20 3d 20 69 50 6f 73 3b 0a 20 20 20 20 7d 0a 20   = iPos;.    }. 
68a0: 20 7d 0a 0a 20 70 65 6e 64 69 6e 67 6c 69 73 74   }.. pendinglist
68b0: 61 70 70 65 6e 64 5f 6f 75 74 3a 0a 20 20 2a 70  append_out:.  *p
68c0: 52 63 20 3d 20 72 63 3b 0a 20 20 69 66 28 20 70  Rc = rc;.  if( p
68d0: 21 3d 2a 70 70 20 29 7b 0a 20 20 20 20 2a 70 70  !=*pp ){.    *pp
68e0: 20 3d 20 70 3b 0a 20 20 20 20 72 65 74 75 72 6e   = p;.    return
68f0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
6900: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65   0;.}../*.** Fre
6910: 65 20 61 20 50 65 6e 64 69 6e 67 4c 69 73 74 20  e a PendingList 
6920: 6f 62 6a 65 63 74 20 61 6c 6c 6f 63 61 74 65 64  object allocated
6930: 20 62 79 20 66 74 73 33 50 65 6e 64 69 6e 67 4c   by fts3PendingL
6940: 69 73 74 41 70 70 65 6e 64 28 29 2e 0a 2a 2f 0a  istAppend()..*/.
6950: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
6960: 50 65 6e 64 69 6e 67 4c 69 73 74 44 65 6c 65 74  PendingListDelet
6970: 65 28 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70  e(PendingList *p
6980: 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  List){.  sqlite3
6990: 5f 66 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  _free(pList);.}.
69a0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e  ./*.** Add an en
69b0: 74 72 79 20 74 6f 20 6f 6e 65 20 6f 66 20 74 68  try to one of th
69c0: 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20  e pending-terms 
69d0: 68 61 73 68 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a  hash tables..*/.
69e0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 50  static int fts3P
69f0: 65 6e 64 69 6e 67 54 65 72 6d 73 41 64 64 4f 6e  endingTermsAddOn
6a00: 65 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  e(.  Fts3Table *
6a10: 70 2c 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 0a 20  p,.  int iCol,. 
6a20: 20 69 6e 74 20 69 50 6f 73 2c 0a 20 20 46 74 73   int iPos,.  Fts
6a30: 33 48 61 73 68 20 2a 70 48 61 73 68 2c 20 20 20  3Hash *pHash,   
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6a50: 50 65 6e 64 69 6e 67 20 74 65 72 6d 73 20 68 61  Pending terms ha
6a60: 73 68 20 74 61 62 6c 65 20 74 6f 20 61 64 64 20  sh table to add 
6a70: 65 6e 74 72 79 20 74 6f 20 2a 2f 0a 20 20 63 6f  entry to */.  co
6a80: 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e  nst char *zToken
6a90: 2c 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 0a 29  ,.  int nToken.)
6aa0: 7b 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73 74 20  {.  PendingList 
6ab0: 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 63  *pList;.  int rc
6ac0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
6ad0: 20 70 4c 69 73 74 20 3d 20 28 50 65 6e 64 69 6e   pList = (Pendin
6ae0: 67 4c 69 73 74 20 2a 29 66 74 73 33 48 61 73 68  gList *)fts3Hash
6af0: 46 69 6e 64 28 70 48 61 73 68 2c 20 7a 54 6f 6b  Find(pHash, zTok
6b00: 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 69  en, nToken);.  i
6b10: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
6b20: 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20  p->nPendingData 
6b30: 2d 3d 20 28 70 4c 69 73 74 2d 3e 6e 44 61 74 61  -= (pList->nData
6b40: 20 2b 20 6e 54 6f 6b 65 6e 20 2b 20 73 69 7a 65   + nToken + size
6b50: 6f 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d 29  of(Fts3HashElem)
6b60: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 74 73  );.  }.  if( fts
6b70: 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65  3PendingListAppe
6b80: 6e 64 28 26 70 4c 69 73 74 2c 20 70 2d 3e 69 50  nd(&pList, p->iP
6b90: 72 65 76 44 6f 63 69 64 2c 20 69 43 6f 6c 2c 20  revDocid, iCol, 
6ba0: 69 50 6f 73 2c 20 26 72 63 29 20 29 7b 0a 20 20  iPos, &rc) ){.  
6bb0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 66 74 73    if( pList==fts
6bc0: 33 48 61 73 68 49 6e 73 65 72 74 28 70 48 61 73  3HashInsert(pHas
6bd0: 68 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  h, zToken, nToke
6be0: 6e 2c 20 70 4c 69 73 74 29 20 29 7b 0a 20 20 20  n, pList) ){.   
6bf0: 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69     /* Malloc fai
6c00: 6c 65 64 20 77 68 69 6c 65 20 69 6e 73 65 72 74  led while insert
6c10: 69 6e 67 20 74 68 65 20 6e 65 77 20 65 6e 74 72  ing the new entr
6c20: 79 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  y. This can only
6c30: 20 0a 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65   .      ** happe
6c40: 6e 20 69 66 20 74 68 65 72 65 20 77 61 73 20 6e  n if there was n
6c50: 6f 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  o previous entry
6c60: 20 66 6f 72 20 74 68 69 73 20 74 6f 6b 65 6e 2e   for this token.
6c70: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
6c80: 61 73 73 65 72 74 28 20 30 3d 3d 66 74 73 33 48  assert( 0==fts3H
6c90: 61 73 68 46 69 6e 64 28 70 48 61 73 68 2c 20 7a  ashFind(pHash, z
6ca0: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 20 29  Token, nToken) )
6cb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
6cc0: 66 72 65 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  free(pList);.   
6cd0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
6ce0: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
6cf0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6d00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 50  _OK ){.    p->nP
6d10: 65 6e 64 69 6e 67 44 61 74 61 20 2b 3d 20 28 70  endingData += (p
6d20: 4c 69 73 74 2d 3e 6e 44 61 74 61 20 2b 20 6e 54  List->nData + nT
6d30: 6f 6b 65 6e 20 2b 20 73 69 7a 65 6f 66 28 46 74  oken + sizeof(Ft
6d40: 73 33 48 61 73 68 45 6c 65 6d 29 29 3b 0a 20 20  s3HashElem));.  
6d50: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6d60: 0a 0a 2f 2a 0a 2a 2a 20 54 6f 6b 65 6e 69 7a 65  ../*.** Tokenize
6d70: 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61   the nul-termina
6d80: 74 65 64 20 73 74 72 69 6e 67 20 7a 54 65 78 74  ted string zText
6d90: 20 61 6e 64 20 61 64 64 20 61 6c 6c 20 74 6f 6b   and add all tok
6da0: 65 6e 73 20 74 6f 20 74 68 65 0a 2a 2a 20 70 65  ens to the.** pe
6db0: 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68  nding-terms hash
6dc0: 2d 74 61 62 6c 65 2e 20 54 68 65 20 64 6f 63 69  -table. The doci
6dd0: 64 20 75 73 65 64 20 69 73 20 74 68 61 74 20 63  d used is that c
6de0: 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
6df0: 69 6e 0a 2a 2a 20 70 2d 3e 69 50 72 65 76 44 6f  in.** p->iPrevDo
6e00: 63 69 64 2c 20 61 6e 64 20 74 68 65 20 63 6f 6c  cid, and the col
6e10: 75 6d 6e 20 69 73 20 73 70 65 63 69 66 69 65 64  umn is specified
6e20: 20 62 79 20 61 72 67 75 6d 65 6e 74 20 69 43 6f   by argument iCo
6e30: 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  l..**.** If succ
6e40: 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
6e50: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
6e60: 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c  therwise, an SQL
6e70: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
6e80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
6e90: 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 41 64  s3PendingTermsAd
6ea0: 64 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  d(.  Fts3Table *
6eb0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
6ec0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 69 6e       /* Table in
6ed0: 74 6f 20 77 68 69 63 68 20 74 65 78 74 20 77 69  to which text wi
6ee0: 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 2a  ll be inserted *
6ef0: 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c  /.  int iLangid,
6f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f10: 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20      /* Language 
6f20: 69 64 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 63  id to use */.  c
6f30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
6f40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
6f50: 2a 20 54 65 78 74 20 6f 66 20 64 6f 63 75 6d 65  * Text of docume
6f60: 6e 74 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  nt to be inserte
6f70: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  d */.  int iCol,
6f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f90: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
6fa0: 20 69 6e 74 6f 20 77 68 69 63 68 20 74 65 78 74   into which text
6fb0: 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74   is being insert
6fc0: 65 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 6e 57  ed */.  u32 *pnW
6fd0: 6f 72 64 20 20 20 20 20 20 20 20 20 20 20 20 20  ord             
6fe0: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
6ff0: 54 3a 20 49 6e 63 72 2e 20 62 79 20 6e 75 6d 62  T: Incr. by numb
7000: 65 72 20 74 6f 6b 65 6e 73 20 69 6e 73 65 72 74  er tokens insert
7010: 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ed */.){.  int r
7020: 63 3b 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20  c;.  int iStart 
7030: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20  = 0;.  int iEnd 
7040: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 50 6f 73 20  = 0;.  int iPos 
7050: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 6f 72 64  = 0;.  int nWord
7060: 20 3d 20 30 3b 0a 0a 20 20 63 68 61 72 20 63 6f   = 0;..  char co
7070: 6e 73 74 20 2a 7a 54 6f 6b 65 6e 3b 0a 20 20 69  nst *zToken;.  i
7080: 6e 74 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 0a  nt nToken = 0;..
7090: 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69    sqlite3_tokeni
70a0: 7a 65 72 20 2a 70 54 6f 6b 65 6e 69 7a 65 72 20  zer *pTokenizer 
70b0: 3d 20 70 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 3b  = p->pTokenizer;
70c0: 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e  .  sqlite3_token
70d0: 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73  izer_module cons
70e0: 74 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 54 6f  t *pModule = pTo
70f0: 6b 65 6e 69 7a 65 72 2d 3e 70 4d 6f 64 75 6c 65  kenizer->pModule
7100: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65  ;.  sqlite3_toke
7110: 6e 69 7a 65 72 5f 63 75 72 73 6f 72 20 2a 70 43  nizer_cursor *pC
7120: 73 72 3b 0a 20 20 69 6e 74 20 28 2a 78 4e 65 78  sr;.  int (*xNex
7130: 74 29 28 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e  t)(sqlite3_token
7140: 69 7a 65 72 5f 63 75 72 73 6f 72 20 2a 70 43 75  izer_cursor *pCu
7150: 72 73 6f 72 2c 0a 20 20 20 20 20 20 63 6f 6e 73  rsor,.      cons
7160: 74 20 63 68 61 72 2a 2a 2c 69 6e 74 2a 2c 69 6e  t char**,int*,in
7170: 74 2a 2c 69 6e 74 2a 2c 69 6e 74 2a 29 3b 0a 0a  t*,int*,int*);..
7180: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
7190: 69 7a 65 72 20 26 26 20 70 4d 6f 64 75 6c 65 20  izer && pModule 
71a0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
71b0: 75 73 65 72 20 68 61 73 20 69 6e 73 65 72 74 65  user has inserte
71c0: 64 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20  d a NULL value, 
71d0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  this function ma
71e0: 79 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  y be called with
71f0: 0a 20 20 2a 2a 20 7a 54 65 78 74 3d 3d 30 2e 20  .  ** zText==0. 
7200: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 64  In this case, ad
7210: 64 20 7a 65 72 6f 20 74 6f 6b 65 6e 20 65 6e 74  d zero token ent
7220: 72 69 65 73 20 74 6f 20 74 68 65 20 68 61 73 68  ries to the hash
7230: 20 74 61 62 6c 65 20 61 6e 64 20 0a 20 20 2a 2a   table and .  **
7240: 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a   return early. *
7250: 2f 0a 20 20 69 66 28 20 7a 54 65 78 74 3d 3d 30  /.  if( zText==0
7260: 20 29 7b 0a 20 20 20 20 2a 70 6e 57 6f 72 64 20   ){.    *pnWord 
7270: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
7280: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
7290: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
72a0: 73 33 4f 70 65 6e 54 6f 6b 65 6e 69 7a 65 72 28  s3OpenTokenizer(
72b0: 70 54 6f 6b 65 6e 69 7a 65 72 2c 20 69 4c 61 6e  pTokenizer, iLan
72c0: 67 69 64 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20  gid, zText, -1, 
72d0: 26 70 43 73 72 29 3b 0a 20 20 69 66 28 20 72 63  &pCsr);.  if( rc
72e0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
72f0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
7300: 7d 0a 0a 20 20 78 4e 65 78 74 20 3d 20 70 4d 6f  }..  xNext = pMo
7310: 64 75 6c 65 2d 3e 78 4e 65 78 74 3b 0a 20 20 77  dule->xNext;.  w
7320: 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 4f 4b 3d  hile( SQLITE_OK=
7330: 3d 72 63 0a 20 20 20 20 20 20 26 26 20 53 51 4c  =rc.      && SQL
7340: 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 78 4e  ITE_OK==(rc = xN
7350: 65 78 74 28 70 43 73 72 2c 20 26 7a 54 6f 6b 65  ext(pCsr, &zToke
7360: 6e 2c 20 26 6e 54 6f 6b 65 6e 2c 20 26 69 53 74  n, &nToken, &iSt
7370: 61 72 74 2c 20 26 69 45 6e 64 2c 20 26 69 50 6f  art, &iEnd, &iPo
7380: 73 29 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  s)).  ){.    int
7390: 20 69 3b 0a 20 20 20 20 69 66 28 20 69 50 6f 73   i;.    if( iPos
73a0: 3e 3d 6e 57 6f 72 64 20 29 20 6e 57 6f 72 64 20  >=nWord ) nWord 
73b0: 3d 20 69 50 6f 73 2b 31 3b 0a 0a 20 20 20 20 2f  = iPos+1;..    /
73c0: 2a 20 50 6f 73 69 74 69 6f 6e 73 20 63 61 6e 6e  * Positions cann
73d0: 6f 74 20 62 65 20 6e 65 67 61 74 69 76 65 3b 20  ot be negative; 
73e0: 77 65 20 75 73 65 20 2d 31 20 61 73 20 61 20 74  we use -1 as a t
73f0: 65 72 6d 69 6e 61 74 6f 72 20 69 6e 74 65 72 6e  erminator intern
7400: 61 6c 6c 79 2e 0a 20 20 20 20 2a 2a 20 54 6f 6b  ally..    ** Tok
7410: 65 6e 73 20 6d 75 73 74 20 68 61 76 65 20 61 20  ens must have a 
7420: 6e 6f 6e 2d 7a 65 72 6f 20 6c 65 6e 67 74 68 2e  non-zero length.
7430: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
7440: 69 50 6f 73 3c 30 20 7c 7c 20 21 7a 54 6f 6b 65  iPos<0 || !zToke
7450: 6e 20 7c 7c 20 6e 54 6f 6b 65 6e 3c 3d 30 20 29  n || nToken<=0 )
7460: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
7470: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
7480: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
7490: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 65     /* Add the te
74a0: 72 6d 20 74 6f 20 74 68 65 20 74 65 72 6d 73 20  rm to the terms 
74b0: 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 72 63 20  index */.    rc 
74c0: 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72  = fts3PendingTer
74d0: 6d 73 41 64 64 4f 6e 65 28 0a 20 20 20 20 20 20  msAddOne(.      
74e0: 20 20 70 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c    p, iCol, iPos,
74f0: 20 26 70 2d 3e 61 49 6e 64 65 78 5b 30 5d 2e 68   &p->aIndex[0].h
7500: 50 65 6e 64 69 6e 67 2c 20 7a 54 6f 6b 65 6e 2c  Pending, zToken,
7510: 20 6e 54 6f 6b 65 6e 0a 20 20 20 20 29 3b 0a 20   nToken.    );. 
7520: 20 20 20 0a 20 20 20 20 2f 2a 20 41 64 64 20 74     .    /* Add t
7530: 68 65 20 74 65 72 6d 20 74 6f 20 65 61 63 68 20  he term to each 
7540: 6f 66 20 74 68 65 20 70 72 65 66 69 78 20 69 6e  of the prefix in
7550: 64 65 78 65 73 20 74 68 61 74 20 69 74 20 69 73  dexes that it is
7560: 20 6e 6f 74 20 74 6f 6f 20 0a 20 20 20 20 2a 2a   not too .    **
7570: 20 73 68 6f 72 74 20 66 6f 72 2e 20 2a 2f 0a 20   short for. */. 
7580: 20 20 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d     for(i=1; rc==
7590: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70  SQLITE_OK && i<p
75a0: 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a  ->nIndex; i++){.
75b0: 20 20 20 20 20 20 73 74 72 75 63 74 20 46 74 73        struct Fts
75c0: 33 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d  3Index *pIndex =
75d0: 20 26 70 2d 3e 61 49 6e 64 65 78 5b 69 5d 3b 0a   &p->aIndex[i];.
75e0: 20 20 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e        if( nToken
75f0: 3c 70 49 6e 64 65 78 2d 3e 6e 50 72 65 66 69 78  <pIndex->nPrefix
7600: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7610: 20 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64     rc = fts3Pend
7620: 69 6e 67 54 65 72 6d 73 41 64 64 4f 6e 65 28 0a  ingTermsAddOne(.
7630: 20 20 20 20 20 20 20 20 20 20 70 2c 20 69 43 6f            p, iCo
7640: 6c 2c 20 69 50 6f 73 2c 20 26 70 49 6e 64 65 78  l, iPos, &pIndex
7650: 2d 3e 68 50 65 6e 64 69 6e 67 2c 20 7a 54 6f 6b  ->hPending, zTok
7660: 65 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e 50 72 65  en, pIndex->nPre
7670: 66 69 78 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  fix.      );.   
7680: 20 7d 0a 20 20 7d 0a 0a 20 20 70 4d 6f 64 75 6c   }.  }..  pModul
7690: 65 2d 3e 78 43 6c 6f 73 65 28 70 43 73 72 29 3b  e->xClose(pCsr);
76a0: 0a 20 20 2a 70 6e 57 6f 72 64 20 2b 3d 20 6e 57  .  *pnWord += nW
76b0: 6f 72 64 3b 0a 20 20 72 65 74 75 72 6e 20 28 72  ord;.  return (r
76c0: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f  c==SQLITE_DONE ?
76d0: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29   SQLITE_OK : rc)
76e0: 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 43 61 6c 6c  ;.}../* .** Call
76f0: 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
7700: 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  n indicates that
7710: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
7720: 73 20 74 6f 20 0a 2a 2a 20 66 74 73 33 50 65 6e  s to .** fts3Pen
7730: 64 69 6e 67 54 65 72 6d 73 41 64 64 28 29 20 61  dingTermsAdd() a
7740: 72 65 20 74 6f 20 61 64 64 20 74 65 72 6d 2f 70  re to add term/p
7750: 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 70 61 69  osition-list pai
7760: 72 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 63 6f  rs for the.** co
7770: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 6f  ntents of the do
7780: 63 75 6d 65 6e 74 20 77 69 74 68 20 64 6f 63 69  cument with doci
7790: 64 20 69 44 6f 63 69 64 2e 0a 2a 2f 0a 73 74 61  d iDocid..*/.sta
77a0: 74 69 63 20 69 6e 74 20 66 74 73 33 50 65 6e 64  tic int fts3Pend
77b0: 69 6e 67 54 65 72 6d 73 44 6f 63 69 64 28 0a 20  ingTermsDocid(. 
77c0: 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
77d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77e0: 20 2f 2a 20 46 75 6c 6c 2d 74 65 78 74 20 74 61   /* Full-text ta
77f0: 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
7800: 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20 20 20  int iLangid,    
7810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7820: 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64 20 6f  /* Language id o
7830: 66 20 72 6f 77 20 62 65 69 6e 67 20 77 72 69 74  f row being writ
7840: 74 65 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f  ten */.  sqlite_
7850: 69 6e 74 36 34 20 69 44 6f 63 69 64 20 20 20 20  int64 iDocid    
7860: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 69           /* Doci
7870: 64 20 6f 66 20 72 6f 77 20 62 65 69 6e 67 20 77  d of row being w
7880: 72 69 74 74 65 6e 20 2a 2f 0a 29 7b 0a 20 20 61  ritten */.){.  a
7890: 73 73 65 72 74 28 20 69 4c 61 6e 67 69 64 3e 3d  ssert( iLangid>=
78a0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f 28  0 );..  /* TODO(
78b0: 73 68 65 73 73 29 20 45 78 70 6c 6f 72 65 20 77  shess) Explore w
78c0: 68 65 74 68 65 72 20 70 61 72 74 69 61 6c 6c 79  hether partially
78d0: 20 66 6c 75 73 68 69 6e 67 20 74 68 65 20 62 75   flushing the bu
78e0: 66 66 65 72 20 6f 6e 0a 20 20 2a 2a 20 66 6f 72  ffer on.  ** for
78f0: 63 65 64 2d 66 6c 75 73 68 20 77 6f 75 6c 64 20  ced-flush would 
7900: 70 72 6f 76 69 64 65 20 62 65 74 74 65 72 20 70  provide better p
7910: 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20 49 20 73  erformance.  I s
7920: 75 73 70 65 63 74 20 74 68 61 74 20 69 66 0a 20  uspect that if. 
7930: 20 2a 2a 20 77 65 20 6f 72 64 65 72 65 64 20 74   ** we ordered t
7940: 68 65 20 64 6f 63 6c 69 73 74 73 20 62 79 20 73  he doclists by s
7950: 69 7a 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20  ize and flushed 
7960: 74 68 65 20 6c 61 72 67 65 73 74 20 75 6e 74 69  the largest unti
7970: 6c 20 74 68 65 0a 20 20 2a 2a 20 62 75 66 66 65  l the.  ** buffe
7980: 72 20 77 61 73 20 68 61 6c 66 20 65 6d 70 74 79  r was half empty
7990: 2c 20 74 68 61 74 20 77 6f 75 6c 64 20 6c 65 74  , that would let
79a0: 20 74 68 65 20 6c 65 73 73 20 66 72 65 71 75 65   the less freque
79b0: 6e 74 20 74 65 72 6d 73 0a 20 20 2a 2a 20 67 65  nt terms.  ** ge
79c0: 6e 65 72 61 74 65 20 6c 6f 6e 67 65 72 20 64 6f  nerate longer do
79d0: 63 6c 69 73 74 73 2e 0a 20 20 2a 2f 0a 20 20 69  clists..  */.  i
79e0: 66 28 20 69 44 6f 63 69 64 3c 3d 70 2d 3e 69 50  f( iDocid<=p->iP
79f0: 72 65 76 44 6f 63 69 64 20 0a 20 20 20 7c 7c 20  revDocid .   || 
7a00: 70 2d 3e 69 50 72 65 76 4c 61 6e 67 69 64 21 3d  p->iPrevLangid!=
7a10: 69 4c 61 6e 67 69 64 0a 20 20 20 7c 7c 20 70 2d  iLangid.   || p-
7a20: 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 3e 70 2d  >nPendingData>p-
7a30: 3e 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61 74 61  >nMaxPendingData
7a40: 20 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 72   .  ){.    int r
7a50: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50  c = sqlite3Fts3P
7a60: 65 6e 64 69 6e 67 54 65 72 6d 73 46 6c 75 73 68  endingTermsFlush
7a70: 28 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  (p);.    if( rc!
7a80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
7a90: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 2d  urn rc;.  }.  p-
7aa0: 3e 69 50 72 65 76 44 6f 63 69 64 20 3d 20 69 44  >iPrevDocid = iD
7ab0: 6f 63 69 64 3b 0a 20 20 70 2d 3e 69 50 72 65 76  ocid;.  p->iPrev
7ac0: 4c 61 6e 67 69 64 20 3d 20 69 4c 61 6e 67 69 64  Langid = iLangid
7ad0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
7ae0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
7af0: 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65  iscard the conte
7b00: 6e 74 73 20 6f 66 20 74 68 65 20 70 65 6e 64 69  nts of the pendi
7b10: 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20 74 61  ng-terms hash ta
7b20: 62 6c 65 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  bles. .*/.void s
7b30: 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e  qlite3Fts3Pendin
7b40: 67 54 65 72 6d 73 43 6c 65 61 72 28 46 74 73 33  gTermsClear(Fts3
7b50: 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Table *p){.  int
7b60: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
7b70: 3c 70 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b 29  <p->nIndex; i++)
7b80: 7b 0a 20 20 20 20 46 74 73 33 48 61 73 68 45 6c  {.    Fts3HashEl
7b90: 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 20 20 46  em *pElem;.    F
7ba0: 74 73 33 48 61 73 68 20 2a 70 48 61 73 68 20 3d  ts3Hash *pHash =
7bb0: 20 26 70 2d 3e 61 49 6e 64 65 78 5b 69 5d 2e 68   &p->aIndex[i].h
7bc0: 50 65 6e 64 69 6e 67 3b 0a 20 20 20 20 66 6f 72  Pending;.    for
7bd0: 28 70 45 6c 65 6d 3d 66 74 73 33 48 61 73 68 46  (pElem=fts3HashF
7be0: 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c  irst(pHash); pEl
7bf0: 65 6d 3b 20 70 45 6c 65 6d 3d 66 74 73 33 48 61  em; pElem=fts3Ha
7c00: 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
7c10: 20 20 20 20 20 20 50 65 6e 64 69 6e 67 4c 69 73        PendingLis
7c20: 74 20 2a 70 4c 69 73 74 20 3d 20 28 50 65 6e 64  t *pList = (Pend
7c30: 69 6e 67 4c 69 73 74 20 2a 29 66 74 73 33 48 61  ingList *)fts3Ha
7c40: 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
7c50: 20 20 20 20 20 66 74 73 33 50 65 6e 64 69 6e 67       fts3Pending
7c60: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
7c70: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  );.    }.    fts
7c80: 33 48 61 73 68 43 6c 65 61 72 28 70 48 61 73 68  3HashClear(pHash
7c90: 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 50 65 6e  );.  }.  p->nPen
7ca0: 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 7d 0a  dingData = 0;.}.
7cb0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
7cc0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
7cd0: 79 20 74 68 65 20 78 55 70 64 61 74 65 28 29 20  y the xUpdate() 
7ce0: 6d 65 74 68 6f 64 20 61 73 20 70 61 72 74 20 6f  method as part o
7cf0: 66 20 61 6e 20 49 4e 53 45 52 54 0a 2a 2a 20 6f  f an INSERT.** o
7d00: 70 65 72 61 74 69 6f 6e 2e 20 49 74 20 61 64 64  peration. It add
7d10: 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61  s entries for ea
7d20: 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 6e  ch term in the n
7d30: 65 77 20 72 65 63 6f 72 64 20 74 6f 20 74 68 65  ew record to the
7d40: 0a 2a 2a 20 70 65 6e 64 69 6e 67 54 65 72 6d 73  .** pendingTerms
7d50: 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a 2a 0a   hash table..**.
7d60: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 61 70 56 61  ** Argument apVa
7d70: 6c 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  l is the same as
7d80: 20 74 68 65 20 73 69 6d 69 6c 61 72 6c 79 20 6e   the similarly n
7d90: 61 6d 65 64 20 61 72 67 75 6d 65 6e 74 20 70 61  amed argument pa
7da0: 73 73 65 64 20 74 6f 0a 2a 2a 20 66 74 73 33 49  ssed to.** fts3I
7db0: 6e 73 65 72 74 44 61 74 61 28 29 2e 20 50 61 72  nsertData(). Par
7dc0: 61 6d 65 74 65 72 20 69 44 6f 63 69 64 20 69 73  ameter iDocid is
7dd0: 20 74 68 65 20 64 6f 63 69 64 20 6f 66 20 74 68   the docid of th
7de0: 65 20 6e 65 77 20 72 6f 77 2e 0a 2a 2f 0a 73 74  e new row..*/.st
7df0: 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 73  atic int fts3Ins
7e00: 65 72 74 54 65 72 6d 73 28 0a 20 20 46 74 73 33  ertTerms(.  Fts3
7e10: 54 61 62 6c 65 20 2a 70 2c 20 0a 20 20 69 6e 74  Table *p, .  int
7e20: 20 69 4c 61 6e 67 69 64 2c 20 0a 20 20 73 71 6c   iLangid, .  sql
7e30: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56  ite3_value **apV
7e40: 61 6c 2c 20 0a 20 20 75 33 32 20 2a 61 53 7a 0a  al, .  u32 *aSz.
7e50: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e70: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
7e80: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 66   variable */.  f
7e90: 6f 72 28 69 3d 32 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=2; i<p->nCo
7ea0: 6c 75 6d 6e 2b 32 3b 20 69 2b 2b 29 7b 0a 20 20  lumn+2; i++){.  
7eb0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
7ec0: 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ext = (const cha
7ed0: 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  r *)sqlite3_valu
7ee0: 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 69 5d 29  e_text(apVal[i])
7ef0: 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 66  ;.    int rc = f
7f00: 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 41  ts3PendingTermsA
7f10: 64 64 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 7a  dd(p, iLangid, z
7f20: 54 65 78 74 2c 20 69 2d 32 2c 20 26 61 53 7a 5b  Text, i-2, &aSz[
7f30: 69 2d 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  i-2]);.    if( r
7f40: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
7f50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
7f60: 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 7a 5b 70  .    }.    aSz[p
7f70: 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 2b 3d 20 73 71  ->nColumn] += sq
7f80: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
7f90: 73 28 61 70 56 61 6c 5b 69 5d 29 3b 0a 20 20 7d  s(apVal[i]);.  }
7fa0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7fb0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
7fc0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
7fd0: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 78 55 70  alled by the xUp
7fe0: 64 61 74 65 28 29 20 6d 65 74 68 6f 64 20 66 6f  date() method fo
7ff0: 72 20 61 6e 20 49 4e 53 45 52 54 20 6f 70 65 72  r an INSERT oper
8000: 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 61 70  ation..** The ap
8010: 56 61 6c 20 70 61 72 61 6d 65 74 65 72 20 69 73  Val parameter is
8020: 20 70 61 73 73 65 64 20 61 20 63 6f 70 79 20 6f   passed a copy o
8030: 66 20 74 68 65 20 61 70 56 61 6c 20 61 72 67 75  f the apVal argu
8040: 6d 65 6e 74 20 70 61 73 73 65 64 20 62 79 0a 2a  ment passed by.*
8050: 2a 20 53 51 4c 69 74 65 20 74 6f 20 74 68 65 20  * SQLite to the 
8060: 78 55 70 64 61 74 65 28 29 20 6d 65 74 68 6f 64  xUpdate() method
8070: 2e 20 69 2e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  . i.e:.**.**   a
8080: 70 56 61 6c 5b 30 5d 20 20 20 20 20 20 20 20 20  pVal[0]         
8090: 20 20 20 20 20 20 20 4e 6f 74 20 75 73 65 64 20         Not used 
80a0: 66 6f 72 20 49 4e 53 45 52 54 2e 0a 2a 2a 20 20  for INSERT..**  
80b0: 20 61 70 56 61 6c 5b 31 5d 20 20 20 20 20 20 20   apVal[1]       
80c0: 20 20 20 20 20 20 20 20 20 72 6f 77 69 64 0a 2a           rowid.*
80d0: 2a 20 20 20 61 70 56 61 6c 5b 32 5d 20 20 20 20  *   apVal[2]    
80e0: 20 20 20 20 20 20 20 20 20 20 20 20 4c 65 66 74              Left
80f0: 2d 6d 6f 73 74 20 75 73 65 72 2d 64 65 66 69 6e  -most user-defin
8100: 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 2e  ed column.**   .
8110: 2e 2e 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 70 2d  ...**   apVal[p-
8120: 3e 6e 43 6f 6c 75 6d 6e 2b 31 5d 20 20 20 20 20  >nColumn+1]     
8130: 52 69 67 68 74 2d 6d 6f 73 74 20 75 73 65 72 2d  Right-most user-
8140: 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 0a 2a  defined column.*
8150: 2a 20 20 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f  *   apVal[p->nCo
8160: 6c 75 6d 6e 2b 32 5d 20 20 20 20 20 48 69 64 64  lumn+2]     Hidd
8170: 65 6e 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 73  en column with s
8180: 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 61 62 6c  ame name as tabl
8190: 65 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 70 2d 3e  e.**   apVal[p->
81a0: 6e 43 6f 6c 75 6d 6e 2b 33 5d 20 20 20 20 20 48  nColumn+3]     H
81b0: 69 64 64 65 6e 20 22 64 6f 63 69 64 22 20 63 6f  idden "docid" co
81c0: 6c 75 6d 6e 20 28 61 6c 69 61 73 20 66 6f 72 20  lumn (alias for 
81d0: 72 6f 77 69 64 29 0a 2a 2a 20 20 20 61 70 56 61  rowid).**   apVa
81e0: 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 34 5d 20  l[p->nColumn+4] 
81f0: 20 20 20 20 48 69 64 64 65 6e 20 6c 61 6e 67 75      Hidden langu
8200: 61 67 65 69 64 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a  ageid column.*/.
8210: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49  static int fts3I
8220: 6e 73 65 72 74 44 61 74 61 28 0a 20 20 46 74 73  nsertData(.  Fts
8230: 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8250: 46 75 6c 6c 2d 74 65 78 74 20 74 61 62 6c 65 20  Full-text table 
8260: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
8270: 75 65 20 2a 2a 61 70 56 61 6c 2c 20 20 20 20 20  ue **apVal,     
8280: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
8290: 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 73 65 72   values to inser
82a0: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  t */.  sqlite3_i
82b0: 6e 74 36 34 20 2a 70 69 52 6f 77 69 64 2c 20 20  nt64 *piRowid,  
82c0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
82d0: 6f 77 69 64 20 66 6f 72 20 72 6f 77 20 6a 75 73  owid for row jus
82e0: 74 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20  t inserted */.  
82f0: 69 36 34 20 69 52 6f 77 69 64 20 20 20 20 20 20  i64 iRowid      
8300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8310: 2f 2a 20 45 78 70 6c 69 63 69 74 20 72 6f 77 69  /* Explicit rowi
8320: 64 2c 20 69 66 20 70 69 52 6f 77 69 64 3d 3d 4e  d, if piRowid==N
8330: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ULL */.){.  int 
8340: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
8350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
8360: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
8370: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 43  sqlite3_stmt *pC
8380: 6f 6e 74 65 6e 74 49 6e 73 65 72 74 3b 20 20 20  ontentInsert;   
8390: 2f 2a 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 25  /* INSERT INTO %
83a0: 5f 63 6f 6e 74 65 6e 74 20 56 41 4c 55 45 53 28  _content VALUES(
83b0: 2e 2e 2e 29 20 2a 2f 0a 0a 20 20 69 66 28 20 70  ...) */..  if( p
83c0: 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 20 29 7b  ->zContentTbl ){
83d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  .    sqlite3_val
83e0: 75 65 20 2a 70 52 6f 77 69 64 3b 0a 20 20 20 20  ue *pRowid;.    
83f0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4c 61 6e 67  assert( p->nLang
8400: 75 61 67 65 69 64 42 69 74 73 3d 3d 30 20 26 26  uageidBits==0 &&
8410: 20 70 69 52 6f 77 69 64 20 29 3b 0a 20 20 20 20   piRowid );.    
8420: 70 52 6f 77 69 64 20 3d 20 61 70 56 61 6c 5b 70  pRowid = apVal[p
8430: 2d 3e 6e 43 6f 6c 75 6d 6e 2b 33 5d 3b 0a 20 20  ->nColumn+3];.  
8440: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
8450: 6c 75 65 5f 74 79 70 65 28 70 52 6f 77 69 64 29  lue_type(pRowid)
8460: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b  ==SQLITE_NULL ){
8470: 0a 20 20 20 20 20 20 70 52 6f 77 69 64 20 3d 20  .      pRowid = 
8480: 61 70 56 61 6c 5b 31 5d 3b 0a 20 20 20 20 7d 0a  apVal[1];.    }.
8490: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
84a0: 76 61 6c 75 65 5f 74 79 70 65 28 70 52 6f 77 69  value_type(pRowi
84b0: 64 29 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47  d)!=SQLITE_INTEG
84c0: 45 52 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ER ){.      retu
84d0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
84e0: 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  AINT;.    }.    
84f0: 2a 70 69 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  *piRowid = sqlit
8500: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 70  e3_value_int64(p
8510: 52 6f 77 69 64 29 3b 0a 20 20 20 20 72 65 74 75  Rowid);.    retu
8520: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
8530: 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
8540: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e  he statement han
8550: 64 6c 65 20 75 73 65 64 20 74 6f 20 69 6e 73 65  dle used to inse
8560: 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65  rt data into the
8570: 20 25 5f 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20   %_content.  ** 
8580: 74 61 62 6c 65 2e 20 54 68 65 20 53 51 4c 20 66  table. The SQL f
8590: 6f 72 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  or this statemen
85a0: 74 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t is:.  **.  ** 
85b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 5f    INSERT INTO %_
85c0: 63 6f 6e 74 65 6e 74 20 56 41 4c 55 45 53 28 3f  content VALUES(?
85d0: 2c 20 3f 2c 20 3f 2c 20 2e 2e 2e 29 0a 20 20 2a  , ?, ?, ...).  *
85e0: 2a 0a 20 20 2a 2a 20 54 68 65 20 73 74 61 74 65  *.  ** The state
85f0: 6d 65 6e 74 20 66 65 61 74 75 72 65 73 20 4e 20  ment features N 
8600: 27 3f 27 20 76 61 72 69 61 62 6c 65 73 2c 20 77  '?' variables, w
8610: 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75  here N is the nu
8620: 6d 62 65 72 20 6f 66 20 75 73 65 72 0a 20 20 2a  mber of user.  *
8630: 2a 20 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e  * defined column
8640: 73 20 69 6e 20 74 68 65 20 46 54 53 33 20 74 61  s in the FTS3 ta
8650: 62 6c 65 2c 20 70 6c 75 73 20 6f 6e 65 20 66 6f  ble, plus one fo
8660: 72 20 74 68 65 20 64 6f 63 69 64 20 66 69 65 6c  r the docid fiel
8670: 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66  d..  */.  rc = f
8680: 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51  ts3SqlStmt(p, SQ
8690: 4c 5f 43 4f 4e 54 45 4e 54 5f 49 4e 53 45 52 54  L_CONTENT_INSERT
86a0: 2c 20 26 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72  , &pContentInser
86b0: 74 2c 20 26 61 70 56 61 6c 5b 31 5d 29 3b 0a 20  t, &apVal[1]);. 
86c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
86d0: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 69  OK ){.    if( pi
86e0: 52 6f 77 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Rowid==0 ){.    
86f0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
8700: 6e 74 36 34 28 70 43 6f 6e 74 65 6e 74 49 6e 73  nt64(pContentIns
8710: 65 72 74 2c 20 31 2c 20 69 52 6f 77 69 64 29 3b  ert, 1, iRowid);
8720: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
8730: 2d 3e 7a 4c 61 6e 67 75 61 67 65 69 64 20 29 7b  ->zLanguageid ){
8740: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
8750: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 0a 20 20  te3_bind_int(.  
8760: 20 20 20 20 20 20 20 20 70 43 6f 6e 74 65 6e 74          pContent
8770: 49 6e 73 65 72 74 2c 20 70 2d 3e 6e 43 6f 6c 75  Insert, p->nColu
8780: 6d 6e 2b 32 2c 20 0a 20 20 20 20 20 20 20 20 20  mn+2, .         
8790: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
87a0: 6e 74 28 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c  nt(apVal[p->nCol
87b0: 75 6d 6e 2b 34 5d 29 0a 20 20 20 20 20 20 29 3b  umn+4]).      );
87c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
87d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
87e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
87f0: 2a 20 54 68 65 72 65 20 69 73 20 61 20 71 75 69  * There is a qui
8800: 72 6b 20 68 65 72 65 2e 20 54 68 65 20 75 73 65  rk here. The use
8810: 72 73 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  rs INSERT statem
8820: 65 6e 74 20 6d 61 79 20 68 61 76 65 20 73 70 65  ent may have spe
8830: 63 69 66 69 65 64 0a 20 20 2a 2a 20 61 20 76 61  cified.  ** a va
8840: 6c 75 65 20 66 6f 72 20 74 68 65 20 22 72 6f 77  lue for the "row
8850: 69 64 22 20 66 69 65 6c 64 2c 20 66 6f 72 20 74  id" field, for t
8860: 68 65 20 22 64 6f 63 69 64 22 20 66 69 65 6c 64  he "docid" field
8870: 2c 20 6f 72 20 66 6f 72 20 62 6f 74 68 2e 0a 20  , or for both.. 
8880: 20 2a 2a 20 57 68 69 63 68 20 69 73 20 61 20 70   ** Which is a p
8890: 72 6f 62 6c 65 6d 2c 20 73 69 6e 63 65 20 22 72  roblem, since "r
88a0: 6f 77 69 64 22 20 61 6e 64 20 22 64 6f 63 69 64  owid" and "docid
88b0: 22 20 61 72 65 20 61 6c 69 61 73 65 73 20 66 6f  " are aliases fo
88c0: 72 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20  r the.  ** same 
88d0: 76 61 6c 75 65 2e 20 46 6f 72 20 65 78 61 6d 70  value. For examp
88e0: 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  le:.  **.  **   
88f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 66 74 73 33  INSERT INTO fts3
8900: 74 62 6c 28 72 6f 77 69 64 2c 20 64 6f 63 69 64  tbl(rowid, docid
8910: 29 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  ) VALUES(1, 2);.
8920: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 46 54 53    **.  ** In FTS
8930: 33 2c 20 74 68 69 73 20 69 73 20 61 6e 20 65 72  3, this is an er
8940: 72 6f 72 2e 20 49 74 20 69 73 20 61 6e 20 65 72  ror. It is an er
8950: 72 6f 72 20 74 6f 20 73 70 65 63 69 66 79 20 6e  ror to specify n
8960: 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 73 0a 20  on-NULL values. 
8970: 20 2a 2a 20 66 6f 72 20 62 6f 74 68 20 64 6f 63   ** for both doc
8980: 69 64 20 61 6e 64 20 73 6f 6d 65 20 6f 74 68 65  id and some othe
8990: 72 20 72 6f 77 69 64 20 61 6c 69 61 73 2e 0a 20  r rowid alias.. 
89a0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
89b0: 3e 6e 4c 61 6e 67 75 61 67 65 69 64 42 69 74 73  >nLanguageidBits
89c0: 3d 3d 30 20 7c 7c 20 70 69 52 6f 77 69 64 3d 3d  ==0 || piRowid==
89d0: 30 0a 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74  0.      || sqlit
89e0: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70  e3_value_type(ap
89f0: 56 61 6c 5b 31 5d 29 21 3d 53 51 4c 49 54 45 5f  Val[1])!=SQLITE_
8a00: 4e 55 4c 4c 20 0a 20 20 29 3b 0a 20 20 69 66 28  NULL .  );.  if(
8a10: 20 70 69 52 6f 77 69 64 20 26 26 20 70 2d 3e 6e   piRowid && p->n
8a20: 4c 61 6e 67 75 61 67 65 69 64 42 69 74 73 3d 3d  LanguageidBits==
8a30: 30 20 0a 20 20 20 26 26 20 53 51 4c 49 54 45 5f  0 .   && SQLITE_
8a40: 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61  NULL!=sqlite3_va
8a50: 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 33  lue_type(apVal[3
8a60: 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 29 20 0a 20  +p->nColumn]) . 
8a70: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
8a80: 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28  ite3_bind_value(
8a90: 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 2c 20  pContentInsert, 
8aa0: 31 2c 20 61 70 56 61 6c 5b 33 2b 70 2d 3e 6e 43  1, apVal[3+p->nC
8ab0: 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 20 20 69 66 28  olumn]);.    if(
8ac0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8ad0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
8ae0: 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68  .  /* Execute th
8af0: 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 69  e statement to i
8b00: 6e 73 65 72 74 20 74 68 65 20 72 65 63 6f 72 64  nsert the record
8b10: 2e 20 53 65 74 20 2a 70 52 6f 77 69 64 20 74 6f  . Set *pRowid to
8b20: 20 74 68 65 20 0a 20 20 2a 2a 20 6e 65 77 20 64   the .  ** new d
8b30: 6f 63 69 64 20 76 61 6c 75 65 2e 20 0a 20 20 2a  ocid value. .  *
8b40: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  /.  sqlite3_step
8b50: 28 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 29  (pContentInsert)
8b60: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
8b70: 5f 72 65 73 65 74 28 70 43 6f 6e 74 65 6e 74 49  _reset(pContentI
8b80: 6e 73 65 72 74 29 3b 0a 0a 20 20 69 66 28 20 70  nsert);..  if( p
8b90: 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 2a 70  iRowid ){.    *p
8ba0: 69 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  iRowid = sqlite3
8bb0: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
8bc0: 69 64 28 70 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20  id(p->db);.  }. 
8bd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
8be0: 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c  ./*.** Remove al
8bf0: 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  l data from the 
8c00: 46 54 53 33 20 74 61 62 6c 65 2e 20 43 6c 65 61  FTS3 table. Clea
8c10: 72 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  r the hash table
8c20: 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 70   containing.** p
8c30: 65 6e 64 69 6e 67 20 74 65 72 6d 73 2e 0a 2a 2f  ending terms..*/
8c40: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
8c50: 44 65 6c 65 74 65 41 6c 6c 28 46 74 73 33 54 61  DeleteAll(Fts3Ta
8c60: 62 6c 65 20 2a 70 2c 20 69 6e 74 20 62 43 6f 6e  ble *p, int bCon
8c70: 74 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  tent){.  int rc 
8c80: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
8c90: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
8ca0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
8cb0: 20 44 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e   Discard the con
8cc0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 65 6e  tents of the pen
8cd0: 64 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20  ding-terms hash 
8ce0: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69  table. */.  sqli
8cf0: 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65  te3Fts3PendingTe
8d00: 72 6d 73 43 6c 65 61 72 28 70 29 3b 0a 0a 20 20  rmsClear(p);..  
8d10: 2f 2a 20 44 65 6c 65 74 65 20 65 76 65 72 79 74  /* Delete everyt
8d20: 68 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 73 68  hing from the sh
8d30: 61 64 6f 77 20 74 61 62 6c 65 73 2e 20 45 78 63  adow tables. Exc
8d40: 65 70 74 2c 20 6c 65 61 76 65 20 25 5f 63 6f 6e  ept, leave %_con
8d50: 74 65 6e 74 20 61 73 0a 20 20 2a 2a 20 69 73 20  tent as.  ** is 
8d60: 69 66 20 62 43 6f 6e 74 65 6e 74 20 69 73 20 66  if bContent is f
8d70: 61 6c 73 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65  alse.  */.  asse
8d80: 72 74 28 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54  rt( p->zContentT
8d90: 62 6c 3d 3d 30 20 7c 7c 20 62 43 6f 6e 74 65 6e  bl==0 || bConten
8da0: 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 62 43  t==0 );.  if( bC
8db0: 6f 6e 74 65 6e 74 20 29 20 66 74 73 33 53 71 6c  ontent ) fts3Sql
8dc0: 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53 51 4c  Exec(&rc, p, SQL
8dd0: 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 43 4f 4e 54  _DELETE_ALL_CONT
8de0: 45 4e 54 2c 20 30 29 3b 0a 20 20 66 74 73 33 53  ENT, 0);.  fts3S
8df0: 71 6c 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53  qlExec(&rc, p, S
8e00: 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 53 45  QL_DELETE_ALL_SE
8e10: 47 4d 45 4e 54 53 2c 20 30 29 3b 0a 20 20 66 74  GMENTS, 0);.  ft
8e20: 73 33 53 71 6c 45 78 65 63 28 26 72 63 2c 20 70  s3SqlExec(&rc, p
8e30: 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c  , SQL_DELETE_ALL
8e40: 5f 53 45 47 44 49 52 2c 20 30 29 3b 0a 20 20 69  _SEGDIR, 0);.  i
8e50: 66 28 20 70 2d 3e 62 48 61 73 44 6f 63 73 69 7a  f( p->bHasDocsiz
8e60: 65 20 29 7b 0a 20 20 20 20 66 74 73 33 53 71 6c  e ){.    fts3Sql
8e70: 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53 51 4c  Exec(&rc, p, SQL
8e80: 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 44 4f 43 53  _DELETE_ALL_DOCS
8e90: 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  IZE, 0);.  }.  i
8ea0: 66 28 20 70 2d 3e 62 48 61 73 53 74 61 74 20 29  f( p->bHasStat )
8eb0: 7b 0a 20 20 20 20 66 74 73 33 53 71 6c 45 78 65  {.    fts3SqlExe
8ec0: 63 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45  c(&rc, p, SQL_DE
8ed0: 4c 45 54 45 5f 41 4c 4c 5f 53 54 41 54 2c 20 30  LETE_ALL_STAT, 0
8ee0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
8ef0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a  rc;.}../*.**.*/.
8f00: 73 74 61 74 69 63 20 69 6e 74 20 6c 61 6e 67 69  static int langi
8f10: 64 46 72 6f 6d 53 65 6c 65 63 74 28 46 74 73 33  dFromSelect(Fts3
8f20: 54 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74 65  Table *p, sqlite
8f30: 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 29  3_stmt *pSelect)
8f40: 7b 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 20  {.  int iLangid 
8f50: 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 4c  = 0;.  if( p->zL
8f60: 61 6e 67 75 61 67 65 69 64 20 29 20 69 4c 61 6e  anguageid ) iLan
8f70: 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  gid = sqlite3_co
8f80: 6c 75 6d 6e 5f 69 6e 74 28 70 53 65 6c 65 63 74  lumn_int(pSelect
8f90: 2c 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 3b  , p->nColumn+1);
8fa0: 0a 20 20 72 65 74 75 72 6e 20 69 4c 61 6e 67 69  .  return iLangi
8fb0: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  d;.}../*.** The 
8fc0: 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 69 6e  first element in
8fd0: 20 74 68 65 20 61 70 56 61 6c 5b 5d 20 61 72 72   the apVal[] arr
8fe0: 61 79 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  ay is assumed to
8ff0: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 64 6f 63   contain the doc
9000: 69 64 0a 2a 2a 20 28 61 6e 20 69 6e 74 65 67 65  id.** (an intege
9010: 72 29 20 6f 66 20 61 20 72 6f 77 20 61 62 6f 75  r) of a row abou
9020: 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e  t to be deleted.
9030: 20 52 65 6d 6f 76 65 20 61 6c 6c 20 74 65 72 6d   Remove all term
9040: 73 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 75  s from the.** fu
9050: 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e 0a 2a  ll-text index..*
9060: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
9070: 73 33 44 65 6c 65 74 65 54 65 72 6d 73 28 20 0a  s3DeleteTerms( .
9080: 20 20 69 6e 74 20 2a 70 52 43 2c 20 20 20 20 20    int *pRC,     
9090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
90a0: 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  ult code */.  Ft
90b0: 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
90c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 54 53        /* The FTS
90d0: 20 74 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65   table to delete
90e0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 36 34 20 69   from */.  i64 i
90f0: 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20  Rowid,          
9100: 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20     /* The rowid 
9110: 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f  to be deleted */
9120: 0a 20 20 75 33 32 20 2a 61 53 7a 2c 20 20 20 20  .  u32 *aSz,    
9130: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
9140: 7a 65 73 20 6f 66 20 64 65 6c 65 74 65 64 20 64  zes of deleted d
9150: 6f 63 75 6d 65 6e 74 20 77 72 69 74 74 65 6e 20  ocument written 
9160: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  here */.  int *p
9170: 62 46 6f 75 6e 64 20 20 20 20 20 20 20 20 20 20  bFound          
9180: 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f    /* OUT: Set to
9190: 20 74 72 75 65 20 69 66 20 72 6f 77 20 72 65 61   true if row rea
91a0: 6c 6c 79 20 64 6f 65 73 20 65 78 69 73 74 20 2a  lly does exist *
91b0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
91c0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
91d0: 53 65 6c 65 63 74 3b 0a 0a 20 20 61 73 73 65 72  Select;..  asser
91e0: 74 28 20 2a 70 62 46 6f 75 6e 64 3d 3d 30 20 29  t( *pbFound==0 )
91f0: 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ;.  if( *pRC ) r
9200: 65 74 75 72 6e 3b 0a 20 20 72 63 20 3d 20 66 74  eturn;.  rc = ft
9210: 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
9220: 5f 53 45 4c 45 43 54 5f 43 4f 4e 54 45 4e 54 5f  _SELECT_CONTENT_
9230: 42 59 5f 52 4f 57 49 44 2c 20 26 70 53 65 6c 65  BY_ROWID, &pSele
9240: 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ct, 0);.  if( rc
9250: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
9260: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
9270: 69 6e 74 36 34 28 70 53 65 6c 65 63 74 2c 20 31  int64(pSelect, 1
9280: 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 69  , iRowid);.    i
9290: 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
92a0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c  qlite3_step(pSel
92b0: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  ect) ){.      in
92c0: 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  t i;.      int i
92d0: 4c 61 6e 67 69 64 20 3d 20 6c 61 6e 67 69 64 46  Langid = langidF
92e0: 72 6f 6d 53 65 6c 65 63 74 28 70 2c 20 70 53 65  romSelect(p, pSe
92f0: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 72 63 20  lect);.      rc 
9300: 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72  = fts3PendingTer
9310: 6d 73 44 6f 63 69 64 28 70 2c 20 69 4c 61 6e 67  msDocid(p, iLang
9320: 69 64 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id, sqlite3_colu
9330: 6d 6e 5f 69 6e 74 36 34 28 70 53 65 6c 65 63 74  mn_int64(pSelect
9340: 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 66 6f 72  , 0));.      for
9350: 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=1; rc==SQLITE
9360: 5f 4f 4b 20 26 26 20 69 3c 3d 70 2d 3e 6e 43 6f  _OK && i<=p->nCo
9370: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
9380: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
9390: 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63  zText = (const c
93a0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f  har *)sqlite3_co
93b0: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65 63  lumn_text(pSelec
93c0: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 72  t, i);.        r
93d0: 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54  c = fts3PendingT
93e0: 65 72 6d 73 41 64 64 28 70 2c 20 69 4c 61 6e 67  ermsAdd(p, iLang
93f0: 69 64 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26  id, zText, -1, &
9400: 61 53 7a 5b 69 2d 31 5d 29 3b 0a 20 20 20 20 20  aSz[i-1]);.     
9410: 20 20 20 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75 6d     aSz[p->nColum
9420: 6e 5d 20 2b 3d 20 73 71 6c 69 74 65 33 5f 63 6f  n] += sqlite3_co
9430: 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 65 6c 65  lumn_bytes(pSele
9440: 63 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a  ct, i);.      }.
9450: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
9460: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
9470: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74     sqlite3_reset
9480: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  (pSelect);.     
9490: 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
94a0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
94b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 62 46      }.      *pbF
94c0: 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ound = 1;.    }.
94d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
94e0: 5f 72 65 73 65 74 28 70 53 65 6c 65 63 74 29 3b  _reset(pSelect);
94f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
9500: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 65 6c  lite3_reset(pSel
9510: 65 63 74 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 43  ect);.  }.  *pRC
9520: 20 3d 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   = rc;.}../*.** 
9530: 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
9540: 69 6f 6e 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  ion to account f
9550: 6f 72 20 74 68 65 20 63 69 72 63 75 6c 61 72 20  or the circular 
9560: 64 65 70 65 6e 64 65 6e 63 79 20 62 65 74 77 65  dependency betwe
9570: 65 6e 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  en.** functions 
9580: 66 74 73 33 53 65 67 6d 65 6e 74 4d 65 72 67 65  fts3SegmentMerge
9590: 28 29 20 61 6e 64 20 66 74 73 33 41 6c 6c 6f 63  () and fts3Alloc
95a0: 61 74 65 53 65 67 64 69 72 49 64 78 28 29 2e 0a  ateSegdirIdx()..
95b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
95c0: 73 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 46  s3SegmentMerge(F
95d0: 74 73 33 54 61 62 6c 65 20 2a 2c 20 69 6e 74 2c  ts3Table *, int,
95e0: 20 69 6e 74 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 20   int, int);../* 
95f0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
9600: 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 6e 65  n allocates a ne
9610: 77 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 69  w level iLevel i
9620: 6e 64 65 78 20 69 6e 20 74 68 65 20 73 65 67 64  ndex in the segd
9630: 69 72 20 74 61 62 6c 65 2e 0a 2a 2a 20 55 73 75  ir table..** Usu
9640: 61 6c 6c 79 2c 20 69 6e 64 65 78 65 73 20 61 72  ally, indexes ar
9650: 65 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 74 68  e allocated with
9660: 69 6e 20 61 20 6c 65 76 65 6c 20 73 65 71 75 65  in a level seque
9670: 6e 74 69 61 6c 6c 79 20 73 74 61 72 74 69 6e 67  ntially starting
9680: 0a 2a 2a 20 77 69 74 68 20 30 2c 20 73 6f 20 74  .** with 0, so t
9690: 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 64  he allocated ind
96a0: 65 78 20 69 73 20 6f 6e 65 20 67 72 65 61 74 65  ex is one greate
96b0: 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65  r than the value
96c0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 62 79 3a   returned.** by:
96d0: 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
96e0: 6d 61 78 28 69 64 78 29 20 46 52 4f 4d 20 25 5f  max(idx) FROM %_
96f0: 73 65 67 64 69 72 20 57 48 45 52 45 20 6c 65 76  segdir WHERE lev
9700: 65 6c 20 3d 20 3a 69 4c 65 76 65 6c 0a 2a 2a 0a  el = :iLevel.**.
9710: 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  ** However, if t
9720: 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79  here are already
9730: 20 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e   FTS3_MERGE_COUN
9740: 54 20 69 6e 64 65 78 65 73 20 61 74 20 74 68 65  T indexes at the
9750: 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 6c 65   requested.** le
9760: 76 65 6c 2c 20 74 68 65 79 20 61 72 65 20 6d 65  vel, they are me
9770: 72 67 65 64 20 69 6e 74 6f 20 61 20 73 69 6e 67  rged into a sing
9780: 6c 65 20 6c 65 76 65 6c 20 28 69 4c 65 76 65 6c  le level (iLevel
9790: 2b 31 29 20 73 65 67 6d 65 6e 74 20 61 6e 64 20  +1) segment and 
97a0: 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  the .** allocate
97b0: 64 20 69 6e 64 65 78 20 69 73 20 30 2e 0a 2a 2a  d index is 0..**
97c0: 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
97d0: 6c 2c 20 2a 70 69 49 64 78 20 69 73 20 73 65 74  l, *piIdx is set
97e0: 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   to the allocate
97f0: 64 20 69 6e 64 65 78 20 73 6c 6f 74 20 61 6e 64  d index slot and
9800: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 72 65   SQLITE_OK.** re
9810: 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
9820: 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  e, an SQLite err
9830: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
9840: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
9850: 6e 74 20 66 74 73 33 41 6c 6c 6f 63 61 74 65 53  nt fts3AllocateS
9860: 65 67 64 69 72 49 64 78 28 0a 20 20 46 74 73 33  egdirIdx(.  Fts3
9870: 54 61 62 6c 65 20 2a 70 2c 20 0a 20 20 69 6e 74  Table *p, .  int
9880: 20 69 4c 61 6e 67 69 64 2c 20 20 20 20 20 20 20   iLangid,       
9890: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
98a0: 4c 61 6e 67 75 61 67 65 20 69 64 20 2a 2f 0a 20  Language id */. 
98b0: 20 69 6e 74 20 69 49 6e 64 65 78 2c 20 20 20 20   int iIndex,    
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98d0: 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20 70 2d   /* Index for p-
98e0: 3e 61 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  >aIndex */.  int
98f0: 20 69 4c 65 76 65 6c 2c 20 0a 20 20 69 6e 74 20   iLevel, .  int 
9900: 2a 70 69 49 64 78 0a 29 7b 0a 20 20 69 6e 74 20  *piIdx.){.  int 
9910: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
9920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
9930: 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
9940: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 4e  sqlite3_stmt *pN
9950: 65 78 74 49 64 78 3b 20 20 20 20 20 20 20 20 20  extIdx;         
9960: 2f 2a 20 51 75 65 72 79 20 66 6f 72 20 6e 65 78  /* Query for nex
9970: 74 20 69 64 78 20 61 74 20 6c 65 76 65 6c 20 69  t idx at level i
9980: 4c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  Level */.  int i
9990: 4e 65 78 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Next = 0;       
99a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
99b0: 73 75 6c 74 20 6f 66 20 71 75 65 72 79 20 70 4e  sult of query pN
99c0: 65 78 74 49 64 78 20 2a 2f 0a 0a 20 20 61 73 73  extIdx */..  ass
99d0: 65 72 74 28 20 69 4c 61 6e 67 69 64 3e 3d 30 20  ert( iLangid>=0 
99e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
99f0: 6e 49 6e 64 65 78 3e 3d 31 20 29 3b 0a 0a 20 20  nIndex>=1 );..  
9a00: 2f 2a 20 53 65 74 20 76 61 72 69 61 62 6c 65 20  /* Set variable 
9a10: 69 4e 65 78 74 20 74 6f 20 74 68 65 20 6e 65 78  iNext to the nex
9a20: 74 20 61 76 61 69 6c 61 62 6c 65 20 73 65 67 64  t available segd
9a30: 69 72 20 69 6e 64 65 78 20 61 74 20 6c 65 76 65  ir index at leve
9a40: 6c 20 69 4c 65 76 65 6c 2e 20 2a 2f 0a 20 20 72  l iLevel. */.  r
9a50: 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
9a60: 70 2c 20 53 51 4c 5f 4e 45 58 54 5f 53 45 47 4d  p, SQL_NEXT_SEGM
9a70: 45 4e 54 5f 49 4e 44 45 58 2c 20 26 70 4e 65 78  ENT_INDEX, &pNex
9a80: 74 49 64 78 2c 20 30 29 3b 0a 20 20 69 66 28 20  tIdx, 0);.  if( 
9a90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
9aa0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
9ab0: 64 5f 69 6e 74 36 34 28 0a 20 20 20 20 20 20 20  d_int64(.       
9ac0: 20 70 4e 65 78 74 49 64 78 2c 20 31 2c 20 67 65   pNextIdx, 1, ge
9ad0: 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70  tAbsoluteLevel(p
9ae0: 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
9af0: 78 2c 20 69 4c 65 76 65 6c 29 0a 20 20 20 20 29  x, iLevel).    )
9b00: 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
9b10: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
9b20: 65 70 28 70 4e 65 78 74 49 64 78 29 20 29 7b 0a  ep(pNextIdx) ){.
9b30: 20 20 20 20 20 20 69 4e 65 78 74 20 3d 20 73 71        iNext = sq
9b40: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
9b50: 28 70 4e 65 78 74 49 64 78 2c 20 30 29 3b 0a 20  (pNextIdx, 0);. 
9b60: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
9b70: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 4e 65 78  lite3_reset(pNex
9b80: 74 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  tIdx);.  }..  if
9b90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
9ba0: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 4e 65  ){.    /* If iNe
9bb0: 78 74 20 69 73 20 46 54 53 33 5f 4d 45 52 47 45  xt is FTS3_MERGE
9bc0: 5f 43 4f 55 4e 54 2c 20 69 6e 64 69 63 61 74 69  _COUNT, indicati
9bd0: 6e 67 20 74 68 61 74 20 6c 65 76 65 6c 20 69 4c  ng that level iL
9be0: 65 76 65 6c 20 69 73 20 61 6c 72 65 61 64 79 0a  evel is already.
9bf0: 20 20 20 20 2a 2a 20 66 75 6c 6c 2c 20 6d 65 72      ** full, mer
9c00: 67 65 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20  ge all segments 
9c10: 69 6e 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20  in level iLevel 
9c20: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 4c  into a single iL
9c30: 65 76 65 6c 2b 31 0a 20 20 20 20 2a 2a 20 73 65  evel+1.    ** se
9c40: 67 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 6f 63 61  gment and alloca
9c50: 74 65 20 28 6e 65 77 6c 79 20 66 72 65 65 64 29  te (newly freed)
9c60: 20 69 6e 64 65 78 20 30 20 61 74 20 6c 65 76 65   index 0 at leve
9c70: 6c 20 69 4c 65 76 65 6c 2e 20 4f 74 68 65 72 77  l iLevel. Otherw
9c80: 69 73 65 2c 0a 20 20 20 20 2a 2a 20 69 66 20 69  ise,.    ** if i
9c90: 4e 65 78 74 20 69 73 20 6c 65 73 73 20 74 68 61  Next is less tha
9ca0: 6e 20 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55  n FTS3_MERGE_COU
9cb0: 4e 54 2c 20 61 6c 6c 6f 63 61 74 65 20 69 6e 64  NT, allocate ind
9cc0: 65 78 20 69 4e 65 78 74 2e 0a 20 20 20 20 2a 2f  ex iNext..    */
9cd0: 0a 20 20 20 20 69 66 28 20 69 4e 65 78 74 3e 3d  .    if( iNext>=
9ce0: 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54  FTS3_MERGE_COUNT
9cf0: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 33 4c 6f   ){.      fts3Lo
9d00: 67 4d 65 72 67 65 28 31 36 2c 20 67 65 74 41 62  gMerge(16, getAb
9d10: 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69  soluteLevel(p, i
9d20: 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20  Langid, iIndex, 
9d30: 69 4c 65 76 65 6c 29 29 3b 0a 20 20 20 20 20 20  iLevel));.      
9d40: 72 63 20 3d 20 66 74 73 33 53 65 67 6d 65 6e 74  rc = fts3Segment
9d50: 4d 65 72 67 65 28 70 2c 20 69 4c 61 6e 67 69 64  Merge(p, iLangid
9d60: 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c  , iIndex, iLevel
9d70: 29 3b 0a 20 20 20 20 20 20 2a 70 69 49 64 78 20  );.      *piIdx 
9d80: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
9d90: 20 20 20 20 20 20 2a 70 69 49 64 78 20 3d 20 69        *piIdx = i
9da0: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
9db0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9dc0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 25 5f 73 65 67  ./*.** The %_seg
9dd0: 6d 65 6e 74 73 20 74 61 62 6c 65 20 69 73 20 64  ments table is d
9de0: 65 63 6c 61 72 65 64 20 61 73 20 66 6f 6c 6c 6f  eclared as follo
9df0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41  ws:.**.**   CREA
9e00: 54 45 20 54 41 42 4c 45 20 25 5f 73 65 67 6d 65  TE TABLE %_segme
9e10: 6e 74 73 28 62 6c 6f 63 6b 69 64 20 49 4e 54 45  nts(blockid INTE
9e20: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
9e30: 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 0a 2a 2a 0a   block BLOB).**.
9e40: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
9e50: 20 72 65 61 64 73 20 64 61 74 61 20 66 72 6f 6d   reads data from
9e60: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
9e70: 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20   the %_segments 
9e80: 74 61 62 6c 65 2e 20 54 68 65 0a 2a 2a 20 73 70  table. The.** sp
9e90: 65 63 69 66 69 63 20 72 6f 77 20 69 73 20 69 64  ecific row is id
9ea0: 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20  entified by the 
9eb0: 69 42 6c 6f 63 6b 69 64 20 70 61 72 61 6d 65 74  iBlockid paramet
9ec0: 65 72 2e 20 49 66 20 70 61 42 6c 6f 62 20 69 73  er. If paBlob is
9ed0: 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68   not.** NULL, th
9ee0: 65 6e 20 61 20 62 75 66 66 65 72 20 69 73 20 61  en a buffer is a
9ef0: 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73  llocated using s
9f00: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20  qlite3_malloc() 
9f10: 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 0a 2a 2a  and populated.**
9f20: 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e   with the conten
9f30: 74 73 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 73  ts of the blob s
9f40: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 22 62 6c  tored in the "bl
9f50: 6f 63 6b 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  ock" column of t
9f60: 68 65 20 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65  he .** identifie
9f70: 64 20 74 61 62 6c 65 20 72 6f 77 20 69 73 2e 20  d table row is. 
9f80: 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 70  Whether or not p
9f90: 61 42 6c 6f 62 20 69 73 20 4e 55 4c 4c 2c 20 2a  aBlob is NULL, *
9fa0: 70 6e 42 6c 6f 62 20 69 73 20 73 65 74 0a 2a 2a  pnBlob is set.**
9fb0: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
9fc0: 74 68 65 20 62 6c 6f 62 20 69 6e 20 62 79 74 65  the blob in byte
9fd0: 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
9fe0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
9ff0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6f 72  error occurs, or
a000: 20 74 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20   the table does 
a010: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  not contain the 
a020: 73 70 65 63 69 66 69 65 64 20 72 6f 77 2c 0a 2a  specified row,.*
a030: 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  * an SQLite erro
a040: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
a050: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  ed. Otherwise, S
a060: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
a070: 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 70 61 42 6c  rned. If.** paBl
a080: 6f 62 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20  ob is non-NULL, 
a090: 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72  then it is the r
a0a0: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
a0b0: 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 0a 2a   the caller to.*
a0c0: 2a 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  * eventually fre
a0d0: 65 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 62  e the returned b
a0e0: 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  uffer..**.** Thi
a0f0: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6c  s function may l
a100: 65 61 76 65 20 61 6e 20 6f 70 65 6e 20 73 71 6c  eave an open sql
a110: 69 74 65 33 5f 62 6c 6f 62 2a 20 68 61 6e 64 6c  ite3_blob* handl
a120: 65 20 69 6e 20 74 68 65 0a 2a 2a 20 46 74 73 33  e in the.** Fts3
a130: 54 61 62 6c 65 2e 70 53 65 67 6d 65 6e 74 73 20  Table.pSegments 
a140: 76 61 72 69 61 62 6c 65 2e 20 54 68 69 73 20 68  variable. This h
a150: 61 6e 64 6c 65 20 69 73 20 72 65 75 73 65 64 20  andle is reused 
a160: 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  by subsequent ca
a170: 6c 6c 73 0a 2a 2a 20 74 6f 20 74 68 69 73 20 66  lls.** to this f
a180: 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 68 61 6e  unction. The han
a190: 64 6c 65 20 6d 61 79 20 62 65 20 63 6c 6f 73 65  dle may be close
a1a0: 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65  d by calling the
a1b0: 0a 2a 2a 20 73 71 6c 69 74 65 33 46 74 73 33 53  .** sqlite3Fts3S
a1c0: 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28 29 20 66  egmentsClose() f
a1d0: 75 6e 63 74 69 6f 6e 2e 20 52 65 75 73 69 6e 67  unction. Reusing
a1e0: 20 61 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 69   a blob handle i
a1f0: 73 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72  s a handy.** per
a200: 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65  formance improve
a210: 6d 65 6e 74 2c 20 62 75 74 20 74 68 65 20 62 6c  ment, but the bl
a220: 6f 62 20 68 61 6e 64 6c 65 20 73 68 6f 75 6c 64  ob handle should
a230: 20 61 6c 77 61 79 73 20 62 65 20 63 6c 6f 73 65   always be close
a240: 64 0a 2a 2a 20 62 65 66 6f 72 65 20 63 6f 6e 74  d.** before cont
a250: 72 6f 6c 20 69 73 20 72 65 74 75 72 6e 65 64 20  rol is returned 
a260: 74 6f 20 74 68 65 20 75 73 65 72 20 28 74 6f 20  to the user (to 
a270: 70 72 65 76 65 6e 74 20 61 20 6c 6f 63 6b 20 62  prevent a lock b
a280: 65 69 6e 67 20 68 65 6c 64 0a 2a 2a 20 6f 6e 20  eing held.** on 
a290: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
a2a0: 65 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  e for longer tha
a2b0: 6e 20 6e 65 63 65 73 73 61 72 79 29 2e 20 54 68  n necessary). Th
a2c0: 75 73 2c 20 61 6e 79 20 76 69 72 74 75 61 6c 20  us, any virtual 
a2d0: 74 61 62 6c 65 0a 2a 2a 20 6d 65 74 68 6f 64 20  table.** method 
a2e0: 28 78 46 69 6c 74 65 72 20 65 74 63 2e 29 20 74  (xFilter etc.) t
a2f0: 68 61 74 20 6d 61 79 20 64 69 72 65 63 74 6c 79  hat may directly
a300: 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 20 63   or indirectly c
a310: 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
a320: 6e 0a 2a 2a 20 6d 75 73 74 20 63 61 6c 6c 20 73  n.** must call s
a330: 71 6c 69 74 65 33 46 74 73 33 53 65 67 6d 65 6e  qlite3Fts3Segmen
a340: 74 73 43 6c 6f 73 65 28 29 20 62 65 66 6f 72 65  tsClose() before
a350: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69   returning..*/.i
a360: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 52 65  nt sqlite3Fts3Re
a370: 61 64 42 6c 6f 63 6b 28 0a 20 20 46 74 73 33 54  adBlock(.  Fts3T
a380: 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
a390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
a3a0: 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  S3 table handle 
a3b0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
a3c0: 36 34 20 69 42 6c 6f 63 6b 69 64 2c 20 20 20 20  64 iBlockid,    
a3d0: 20 20 20 20 20 2f 2a 20 41 63 63 65 73 73 20 74       /* Access t
a3e0: 68 65 20 72 6f 77 20 77 69 74 68 20 62 6c 6f 63  he row with bloc
a3f0: 6b 69 64 3d 24 69 42 6c 6f 63 6b 69 64 20 2a 2f  kid=$iBlockid */
a400: 0a 20 20 63 68 61 72 20 2a 2a 70 61 42 6c 6f 62  .  char **paBlob
a410: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a420: 20 20 20 2f 2a 20 4f 55 54 3a 20 42 6c 6f 62 20     /* OUT: Blob 
a430: 64 61 74 61 20 69 6e 20 6d 61 6c 6c 6f 63 27 64  data in malloc'd
a440: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
a450: 20 2a 70 6e 42 6c 6f 62 2c 20 20 20 20 20 20 20   *pnBlob,       
a460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a470: 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 62 6c 6f  OUT: Size of blo
a480: 62 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  b data */.  int 
a490: 2a 70 6e 4c 6f 61 64 20 20 20 20 20 20 20 20 20  *pnLoad         
a4a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
a4b0: 55 54 3a 20 42 79 74 65 73 20 61 63 74 75 61 6c  UT: Bytes actual
a4c0: 6c 79 20 6c 6f 61 64 65 64 20 2a 2f 0a 29 7b 0a  ly loaded */.){.
a4d0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
a4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4f0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
a500: 20 2a 2f 0a 0a 20 20 2f 2a 20 70 6e 42 6c 6f 62   */..  /* pnBlob
a510: 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 4e 55 4c   must be non-NUL
a520: 4c 2e 20 70 61 42 6c 6f 62 20 6d 61 79 20 62 65  L. paBlob may be
a530: 20 4e 55 4c 4c 20 6f 72 20 6e 6f 6e 2d 4e 55 4c   NULL or non-NUL
a540: 4c 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  L. */.  assert( 
a550: 70 6e 42 6c 6f 62 20 29 3b 0a 0a 20 20 69 66 28  pnBlob );..  if(
a560: 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73 20 29 7b   p->pSegments ){
a570: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
a580: 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 70 2d  3_blob_reopen(p-
a590: 3e 70 53 65 67 6d 65 6e 74 73 2c 20 69 42 6c 6f  >pSegments, iBlo
a5a0: 63 6b 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ckid);.  }else{.
a5b0: 20 20 20 20 69 66 28 20 30 3d 3d 70 2d 3e 7a 53      if( 0==p->zS
a5c0: 65 67 6d 65 6e 74 73 54 62 6c 20 29 7b 0a 20 20  egmentsTbl ){.  
a5d0: 20 20 20 20 70 2d 3e 7a 53 65 67 6d 65 6e 74 73      p->zSegments
a5e0: 54 62 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Tbl = sqlite3_mp
a5f0: 72 69 6e 74 66 28 22 25 73 5f 73 65 67 6d 65 6e  rintf("%s_segmen
a600: 74 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  ts", p->zName);.
a610: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 2d 3e        if( 0==p->
a620: 7a 53 65 67 6d 65 6e 74 73 54 62 6c 20 29 20 72  zSegmentsTbl ) r
a630: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
a640: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  EM;.    }.    rc
a650: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
a660: 6f 70 65 6e 28 0a 20 20 20 20 20 20 20 70 2d 3e  open(.       p->
a670: 64 62 2c 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a  db, p->zDb, p->z
a680: 53 65 67 6d 65 6e 74 73 54 62 6c 2c 20 22 62 6c  SegmentsTbl, "bl
a690: 6f 63 6b 22 2c 20 69 42 6c 6f 63 6b 69 64 2c 20  ock", iBlockid, 
a6a0: 30 2c 20 26 70 2d 3e 70 53 65 67 6d 65 6e 74 73  0, &p->pSegments
a6b0: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69  .    );.  }..  i
a6c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
a6d0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   ){.    int nByt
a6e0: 65 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  e = sqlite3_blob
a6f0: 5f 62 79 74 65 73 28 70 2d 3e 70 53 65 67 6d 65  _bytes(p->pSegme
a700: 6e 74 73 29 3b 0a 20 20 20 20 2a 70 6e 42 6c 6f  nts);.    *pnBlo
a710: 62 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 69  b = nByte;.    i
a720: 66 28 20 70 61 42 6c 6f 62 20 29 7b 0a 20 20 20  f( paBlob ){.   
a730: 20 20 20 63 68 61 72 20 2a 61 42 79 74 65 20 3d     char *aByte =
a740: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
a750: 6e 42 79 74 65 20 2b 20 46 54 53 33 5f 4e 4f 44  nByte + FTS3_NOD
a760: 45 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 20 20  E_PADDING);.    
a770: 20 20 69 66 28 20 21 61 42 79 74 65 20 29 7b 0a    if( !aByte ){.
a780: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
a790: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
a7a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a7b0: 69 66 28 20 70 6e 4c 6f 61 64 20 26 26 20 6e 42  if( pnLoad && nB
a7c0: 79 74 65 3e 28 46 54 53 33 5f 4e 4f 44 45 5f 43  yte>(FTS3_NODE_C
a7d0: 48 55 4e 4b 5f 54 48 52 45 53 48 4f 4c 44 29 20  HUNK_THRESHOLD) 
a7e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 79  ){.          nBy
a7f0: 74 65 20 3d 20 46 54 53 33 5f 4e 4f 44 45 5f 43  te = FTS3_NODE_C
a800: 48 55 4e 4b 53 49 5a 45 3b 0a 20 20 20 20 20 20  HUNKSIZE;.      
a810: 20 20 20 20 2a 70 6e 4c 6f 61 64 20 3d 20 6e 42      *pnLoad = nB
a820: 79 74 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  yte;.        }. 
a830: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
a840: 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d  te3_blob_read(p-
a850: 3e 70 53 65 67 6d 65 6e 74 73 2c 20 61 42 79 74  >pSegments, aByt
a860: 65 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20  e, nByte, 0);.  
a870: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 42        memset(&aB
a880: 79 74 65 5b 6e 42 79 74 65 5d 2c 20 30 2c 20 46  yte[nByte], 0, F
a890: 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49 4e 47  TS3_NODE_PADDING
a8a0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
a8b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
a8c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a8d0: 33 5f 66 72 65 65 28 61 42 79 74 65 29 3b 0a 20  3_free(aByte);. 
a8e0: 20 20 20 20 20 20 20 20 20 61 42 79 74 65 20 3d           aByte =
a8f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
a900: 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 61 42      }.      *paB
a910: 6c 6f 62 20 3d 20 61 42 79 74 65 3b 0a 20 20 20  lob = aByte;.   
a920: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
a930: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c   rc;.}../*.** Cl
a940: 6f 73 65 20 74 68 65 20 62 6c 6f 62 20 68 61 6e  ose the blob han
a950: 64 6c 65 20 61 74 20 70 2d 3e 70 53 65 67 6d 65  dle at p->pSegme
a960: 6e 74 73 2c 20 69 66 20 69 74 20 69 73 20 6f 70  nts, if it is op
a970: 65 6e 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  en. See comments
a980: 20 61 62 6f 76 65 0a 2a 2a 20 74 68 65 20 73 71   above.** the sq
a990: 6c 69 74 65 33 46 74 73 33 52 65 61 64 42 6c 6f  lite3Fts3ReadBlo
a9a0: 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ck() function fo
a9b0: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f  r details..*/.vo
a9c0: 69 64 20 73 71 6c 69 74 65 33 46 74 73 33 53 65  id sqlite3Fts3Se
a9d0: 67 6d 65 6e 74 73 43 6c 6f 73 65 28 46 74 73 33  gmentsClose(Fts3
a9e0: 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 73 71 6c  Table *p){.  sql
a9f0: 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28  ite3_blob_close(
aa00: 70 2d 3e 70 53 65 67 6d 65 6e 74 73 29 3b 0a 20  p->pSegments);. 
aa10: 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73 20 3d 20   p->pSegments = 
aa20: 30 3b 0a 7d 0a 20 20 20 20 0a 73 74 61 74 69 63  0;.}.    .static
aa30: 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61 64   int fts3SegRead
aa40: 65 72 49 6e 63 72 52 65 61 64 28 46 74 73 33 53  erIncrRead(Fts3S
aa50: 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 65  egReader *pReade
aa60: 72 29 7b 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b  r){.  int nRead;
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
aa90: 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61 64  of bytes to read
aaa0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aac0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
aad0: 63 6f 64 65 20 2a 2f 0a 0a 20 20 6e 52 65 61 64  code */..  nRead
aae0: 20 3d 20 4d 49 4e 28 70 52 65 61 64 65 72 2d 3e   = MIN(pReader->
aaf0: 6e 4e 6f 64 65 20 2d 20 70 52 65 61 64 65 72 2d  nNode - pReader-
ab00: 3e 6e 50 6f 70 75 6c 61 74 65 2c 20 46 54 53 33  >nPopulate, FTS3
ab10: 5f 4e 4f 44 45 5f 43 48 55 4e 4b 53 49 5a 45 29  _NODE_CHUNKSIZE)
ab20: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
ab30: 5f 62 6c 6f 62 5f 72 65 61 64 28 0a 20 20 20 20  _blob_read(.    
ab40: 20 20 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62    pReader->pBlob
ab50: 2c 20 0a 20 20 20 20 20 20 26 70 52 65 61 64 65  , .      &pReade
ab60: 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65 72  r->aNode[pReader
ab70: 2d 3e 6e 50 6f 70 75 6c 61 74 65 5d 2c 0a 20 20  ->nPopulate],.  
ab80: 20 20 20 20 6e 52 65 61 64 2c 0a 20 20 20 20 20      nRead,.     
ab90: 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c   pReader->nPopul
aba0: 61 74 65 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20  ate.  );..  if( 
abb0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
abc0: 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 50  .    pReader->nP
abd0: 6f 70 75 6c 61 74 65 20 2b 3d 20 6e 52 65 61 64  opulate += nRead
abe0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 52  ;.    memset(&pR
abf0: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65  eader->aNode[pRe
ac00: 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 5d  ader->nPopulate]
ac10: 2c 20 30 2c 20 46 54 53 33 5f 4e 4f 44 45 5f 50  , 0, FTS3_NODE_P
ac20: 41 44 44 49 4e 47 29 3b 0a 20 20 20 20 69 66 28  ADDING);.    if(
ac30: 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c   pReader->nPopul
ac40: 61 74 65 3d 3d 70 52 65 61 64 65 72 2d 3e 6e 4e  ate==pReader->nN
ac50: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ode ){.      sql
ac60: 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28  ite3_blob_close(
ac70: 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 29 3b  pReader->pBlob);
ac80: 0a 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e  .      pReader->
ac90: 70 42 6c 6f 62 20 3d 20 30 3b 0a 20 20 20 20 20  pBlob = 0;.     
aca0: 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c   pReader->nPopul
acb0: 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ate = 0;.    }. 
acc0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
acd0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
ace0: 73 33 53 65 67 52 65 61 64 65 72 52 65 71 75 69  s3SegReaderRequi
acf0: 72 65 28 46 74 73 33 53 65 67 52 65 61 64 65 72  re(Fts3SegReader
ad00: 20 2a 70 52 65 61 64 65 72 2c 20 63 68 61 72 20   *pReader, char 
ad10: 2a 70 46 72 6f 6d 2c 20 69 6e 74 20 6e 42 79 74  *pFrom, int nByt
ad20: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
ad30: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
ad40: 72 74 28 20 21 70 52 65 61 64 65 72 2d 3e 70 42  rt( !pReader->pB
ad50: 6c 6f 62 20 0a 20 20 20 20 20 20 20 7c 7c 20 28  lob .       || (
ad60: 70 46 72 6f 6d 3e 3d 70 52 65 61 64 65 72 2d 3e  pFrom>=pReader->
ad70: 61 4e 6f 64 65 20 26 26 20 70 46 72 6f 6d 3c 26  aNode && pFrom<&
ad80: 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70  pReader->aNode[p
ad90: 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 5d 29 0a  Reader->nNode]).
ada0: 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 52    );.  while( pR
adb0: 65 61 64 65 72 2d 3e 70 42 6c 6f 62 20 26 26 20  eader->pBlob && 
adc0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20  rc==SQLITE_OK . 
add0: 20 20 20 20 26 26 20 20 28 70 46 72 6f 6d 20 2d      &&  (pFrom -
ade0: 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20   pReader->aNode 
adf0: 2b 20 6e 42 79 74 65 29 3e 70 52 65 61 64 65 72  + nByte)>pReader
ae00: 2d 3e 6e 50 6f 70 75 6c 61 74 65 0a 20 20 29 7b  ->nPopulate.  ){
ae10: 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65  .    rc = fts3Se
ae20: 67 52 65 61 64 65 72 49 6e 63 72 52 65 61 64 28  gReaderIncrRead(
ae30: 70 52 65 61 64 65 72 29 3b 0a 20 20 7d 0a 20 20  pReader);.  }.  
ae40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
ae50: 0a 2a 2a 20 53 65 74 20 61 6e 20 46 74 73 33 53  .** Set an Fts3S
ae60: 65 67 52 65 61 64 65 72 20 63 75 72 73 6f 72 20  egReader cursor 
ae70: 74 6f 20 70 6f 69 6e 74 20 61 74 20 45 4f 46 2e  to point at EOF.
ae80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ae90: 66 74 73 33 53 65 67 52 65 61 64 65 72 53 65 74  fts3SegReaderSet
aea0: 45 6f 66 28 46 74 73 33 53 65 67 52 65 61 64 65  Eof(Fts3SegReade
aeb0: 72 20 2a 70 53 65 67 29 7b 0a 20 20 69 66 28 20  r *pSeg){.  if( 
aec0: 21 66 74 73 33 53 65 67 52 65 61 64 65 72 49 73  !fts3SegReaderIs
aed0: 52 6f 6f 74 4f 6e 6c 79 28 70 53 65 67 29 20 29  RootOnly(pSeg) )
aee0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
aef0: 65 65 28 70 53 65 67 2d 3e 61 4e 6f 64 65 29 3b  ee(pSeg->aNode);
af00: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  .    sqlite3_blo
af10: 62 5f 63 6c 6f 73 65 28 70 53 65 67 2d 3e 70 42  b_close(pSeg->pB
af20: 6c 6f 62 29 3b 0a 20 20 20 20 70 53 65 67 2d 3e  lob);.    pSeg->
af30: 70 42 6c 6f 62 20 3d 20 30 3b 0a 20 20 7d 0a 20  pBlob = 0;.  }. 
af40: 20 70 53 65 67 2d 3e 61 4e 6f 64 65 20 3d 20 30   pSeg->aNode = 0
af50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
af60: 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  the iterator pas
af70: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
af80: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
af90: 20 6e 65 78 74 20 74 65 72 6d 20 69 6e 20 74 68   next term in th
afa0: 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 2e 20 49 66  e.** segment. If
afb0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
afc0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
afd0: 65 64 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  ed. If there is 
afe0: 6e 6f 20 6e 65 78 74 20 74 65 72 6d 2c 0a 2a 2a  no next term,.**
aff0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 74   SQLITE_DONE. Ot
b000: 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69  herwise, an SQLi
b010: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
b020: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
b030: 33 53 65 67 52 65 61 64 65 72 4e 65 78 74 28 0a  3SegReaderNext(.
b040: 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
b050: 0a 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72  .  Fts3SegReader
b060: 20 2a 70 52 65 61 64 65 72 2c 0a 20 20 69 6e 74   *pReader,.  int
b070: 20 62 49 6e 63 72 0a 29 7b 0a 20 20 69 6e 74 20   bIncr.){.  int 
b080: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
b090: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
b0a0: 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 76 61  eturn code of va
b0b0: 72 69 6f 75 73 20 73 75 62 2d 72 6f 75 74 69 6e  rious sub-routin
b0c0: 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 4e  es */.  char *pN
b0d0: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
b0e0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
b0f0: 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
b100: 69 6e 74 20 6e 50 72 65 66 69 78 3b 20 20 20 20  int nPrefix;    
b110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b120: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
b130: 65 73 20 69 6e 20 74 65 72 6d 20 70 72 65 66 69  es in term prefi
b140: 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 66 66  x */.  int nSuff
b150: 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ix;             
b160: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b170: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 65 72   of bytes in ter
b180: 6d 20 73 75 66 66 69 78 20 2a 2f 0a 0a 20 20 69  m suffix */..  i
b190: 66 28 20 21 70 52 65 61 64 65 72 2d 3e 61 44 6f  f( !pReader->aDo
b1a0: 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 70 4e 65  clist ){.    pNe
b1b0: 78 74 20 3d 20 70 52 65 61 64 65 72 2d 3e 61 4e  xt = pReader->aN
b1c0: 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ode;.  }else{.  
b1d0: 20 20 70 4e 65 78 74 20 3d 20 26 70 52 65 61 64    pNext = &pRead
b1e0: 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b 70 52 65  er->aDoclist[pRe
b1f0: 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 5d 3b  ader->nDoclist];
b200: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 4e 65  .  }..  if( !pNe
b210: 78 74 20 7c 7c 20 70 4e 65 78 74 3e 3d 26 70 52  xt || pNext>=&pR
b220: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65  eader->aNode[pRe
b230: 61 64 65 72 2d 3e 6e 4e 6f 64 65 5d 20 29 7b 0a  ader->nNode] ){.
b240: 0a 20 20 20 20 69 66 28 20 66 74 73 33 53 65 67  .    if( fts3Seg
b250: 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28  ReaderIsPending(
b260: 70 52 65 61 64 65 72 29 20 29 7b 0a 20 20 20 20  pReader) ){.    
b270: 20 20 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a    Fts3HashElem *
b280: 70 45 6c 65 6d 20 3d 20 2a 28 70 52 65 61 64 65  pElem = *(pReade
b290: 72 2d 3e 70 70 4e 65 78 74 45 6c 65 6d 29 3b 0a  r->ppNextElem);.
b2a0: 20 20 20 20 20 20 69 66 28 20 70 45 6c 65 6d 3d        if( pElem=
b2b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52  =0 ){.        pR
b2c0: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20 3d 20 30  eader->aNode = 0
b2d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b2e0: 20 20 20 20 20 20 20 50 65 6e 64 69 6e 67 4c 69         PendingLi
b2f0: 73 74 20 2a 70 4c 69 73 74 20 3d 20 28 50 65 6e  st *pList = (Pen
b300: 64 69 6e 67 4c 69 73 74 20 2a 29 66 74 73 33 48  dingList *)fts3H
b310: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
b320: 20 20 20 20 20 20 20 20 70 52 65 61 64 65 72 2d          pReader-
b330: 3e 7a 54 65 72 6d 20 3d 20 28 63 68 61 72 20 2a  >zTerm = (char *
b340: 29 66 74 73 33 48 61 73 68 4b 65 79 28 70 45 6c  )fts3HashKey(pEl
b350: 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65  em);.        pRe
b360: 61 64 65 72 2d 3e 6e 54 65 72 6d 20 3d 20 66 74  ader->nTerm = ft
b370: 73 33 48 61 73 68 4b 65 79 73 69 7a 65 28 70 45  s3HashKeysize(pE
b380: 6c 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 70 52  lem);.        pR
b390: 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 20 3d 20 70  eader->nNode = p
b3a0: 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74  Reader->nDoclist
b3b0: 20 3d 20 70 4c 69 73 74 2d 3e 6e 44 61 74 61 20   = pList->nData 
b3c0: 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 70 52 65  + 1;.        pRe
b3d0: 61 64 65 72 2d 3e 61 4e 6f 64 65 20 3d 20 70 52  ader->aNode = pR
b3e0: 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20  eader->aDoclist 
b3f0: 3d 20 70 4c 69 73 74 2d 3e 61 44 61 74 61 3b 0a  = pList->aData;.
b400: 20 20 20 20 20 20 20 20 70 52 65 61 64 65 72 2d          pReader-
b410: 3e 70 70 4e 65 78 74 45 6c 65 6d 2b 2b 3b 0a 20  >ppNextElem++;. 
b420: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b430: 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20 29 3b  Reader->aNode );
b440: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
b450: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b460: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 33  .    }..    fts3
b470: 53 65 67 52 65 61 64 65 72 53 65 74 45 6f 66 28  SegReaderSetEof(
b480: 70 52 65 61 64 65 72 29 3b 0a 0a 20 20 20 20 2f  pReader);..    /
b490: 2a 20 49 66 20 69 43 75 72 72 65 6e 74 42 6c 6f  * If iCurrentBlo
b4a0: 63 6b 3e 3d 69 4c 65 61 66 45 6e 64 42 6c 6f 63  ck>=iLeafEndBloc
b4b0: 6b 2c 20 74 68 69 73 20 69 73 20 61 6e 20 45 4f  k, this is an EO
b4c0: 46 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 41 6c 6c  F condition. All
b4d0: 20 6c 65 61 66 20 0a 20 20 20 20 2a 2a 20 62 6c   leaf .    ** bl
b4e0: 6f 63 6b 73 20 68 61 76 65 20 61 6c 72 65 61 64  ocks have alread
b4f0: 79 20 62 65 65 6e 20 74 72 61 76 65 72 73 65 64  y been traversed
b500: 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
b510: 28 20 70 52 65 61 64 65 72 2d 3e 69 43 75 72 72  ( pReader->iCurr
b520: 65 6e 74 42 6c 6f 63 6b 3c 3d 70 52 65 61 64 65  entBlock<=pReade
b530: 72 2d 3e 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b  r->iLeafEndBlock
b540: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 61   );.    if( pRea
b550: 64 65 72 2d 3e 69 43 75 72 72 65 6e 74 42 6c 6f  der->iCurrentBlo
b560: 63 6b 3e 3d 70 52 65 61 64 65 72 2d 3e 69 4c 65  ck>=pReader->iLe
b570: 61 66 45 6e 64 42 6c 6f 63 6b 20 29 7b 0a 20 20  afEndBlock ){.  
b580: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b590: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
b5a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
b5b0: 33 52 65 61 64 42 6c 6f 63 6b 28 0a 20 20 20 20  3ReadBlock(.    
b5c0: 20 20 20 20 70 2c 20 2b 2b 70 52 65 61 64 65 72      p, ++pReader
b5d0: 2d 3e 69 43 75 72 72 65 6e 74 42 6c 6f 63 6b 2c  ->iCurrentBlock,
b5e0: 20 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65   &pReader->aNode
b5f0: 2c 20 26 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64  , &pReader->nNod
b600: 65 2c 20 0a 20 20 20 20 20 20 20 20 28 62 49 6e  e, .        (bIn
b610: 63 72 20 3f 20 26 70 52 65 61 64 65 72 2d 3e 6e  cr ? &pReader->n
b620: 50 6f 70 75 6c 61 74 65 20 3a 20 30 29 0a 20 20  Populate : 0).  
b630: 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21    );.    if( rc!
b640: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
b650: 75 72 6e 20 72 63 3b 0a 20 20 20 20 61 73 73 65  urn rc;.    asse
b660: 72 74 28 20 70 52 65 61 64 65 72 2d 3e 70 42 6c  rt( pReader->pBl
b670: 6f 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ob==0 );.    if(
b680: 20 62 49 6e 63 72 20 26 26 20 70 52 65 61 64 65   bIncr && pReade
b690: 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 3c 70 52 65  r->nPopulate<pRe
b6a0: 61 64 65 72 2d 3e 6e 4e 6f 64 65 20 29 7b 0a 20  ader->nNode ){. 
b6b0: 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 42       pReader->pB
b6c0: 6c 6f 62 20 3d 20 70 2d 3e 70 53 65 67 6d 65 6e  lob = p->pSegmen
b6d0: 74 73 3b 0a 20 20 20 20 20 20 70 2d 3e 70 53 65  ts;.      p->pSe
b6e0: 67 6d 65 6e 74 73 20 3d 20 30 3b 0a 20 20 20 20  gments = 0;.    
b6f0: 7d 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 52  }.    pNext = pR
b700: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 3b 0a 20 20  eader->aNode;.  
b710: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21 66 74  }..  assert( !ft
b720: 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65 6e  s3SegReaderIsPen
b730: 64 69 6e 67 28 70 52 65 61 64 65 72 29 20 29 3b  ding(pReader) );
b740: 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53 65 67  ..  rc = fts3Seg
b750: 52 65 61 64 65 72 52 65 71 75 69 72 65 28 70 52  ReaderRequire(pR
b760: 65 61 64 65 72 2c 20 70 4e 65 78 74 2c 20 46 54  eader, pNext, FT
b770: 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 2a 32 29  S3_VARINT_MAX*2)
b780: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
b790: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
b7a0: 63 3b 0a 20 20 0a 20 20 2f 2a 20 42 65 63 61 75  c;.  .  /* Becau
b7b0: 73 65 20 6f 66 20 74 68 65 20 46 54 53 33 5f 4e  se of the FTS3_N
b7c0: 4f 44 45 5f 50 41 44 44 49 4e 47 20 62 79 74 65  ODE_PADDING byte
b7d0: 73 20 6f 66 20 70 61 64 64 69 6e 67 2c 20 74 68  s of padding, th
b7e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 0a  e following is .
b7f0: 20 20 2a 2a 20 73 61 66 65 20 28 6e 6f 20 72 69    ** safe (no ri
b800: 73 6b 20 6f 66 20 6f 76 65 72 72 65 61 64 29 20  sk of overread) 
b810: 65 76 65 6e 20 69 66 20 74 68 65 20 6e 6f 64 65  even if the node
b820: 20 64 61 74 61 20 69 73 20 63 6f 72 72 75 70 74   data is corrupt
b830: 65 64 2e 20 2a 2f 0a 20 20 70 4e 65 78 74 20 2b  ed. */.  pNext +
b840: 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74  = sqlite3Fts3Get
b850: 56 61 72 69 6e 74 33 32 28 70 4e 65 78 74 2c 20  Varint32(pNext, 
b860: 26 6e 50 72 65 66 69 78 29 3b 0a 20 20 70 4e 65  &nPrefix);.  pNe
b870: 78 74 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  xt += sqlite3Fts
b880: 33 47 65 74 56 61 72 69 6e 74 33 32 28 70 4e 65  3GetVarint32(pNe
b890: 78 74 2c 20 26 6e 53 75 66 66 69 78 29 3b 0a 20  xt, &nSuffix);. 
b8a0: 20 69 66 28 20 6e 50 72 65 66 69 78 3c 30 20 7c   if( nPrefix<0 |
b8b0: 7c 20 6e 53 75 66 66 69 78 3c 3d 30 20 0a 20 20  | nSuffix<=0 .  
b8c0: 20 7c 7c 20 26 70 4e 65 78 74 5b 6e 53 75 66 66   || &pNext[nSuff
b8d0: 69 78 5d 3e 26 70 52 65 61 64 65 72 2d 3e 61 4e  ix]>&pReader->aN
b8e0: 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e 4e 6f  ode[pReader->nNo
b8f0: 64 65 5d 20 0a 20 20 29 7b 0a 20 20 20 20 72 65  de] .  ){.    re
b900: 74 75 72 6e 20 46 54 53 5f 43 4f 52 52 55 50 54  turn FTS_CORRUPT
b910: 5f 56 54 41 42 3b 0a 20 20 7d 0a 0a 20 20 69 66  _VTAB;.  }..  if
b920: 28 20 6e 50 72 65 66 69 78 2b 6e 53 75 66 66 69  ( nPrefix+nSuffi
b930: 78 3e 70 52 65 61 64 65 72 2d 3e 6e 54 65 72 6d  x>pReader->nTerm
b940: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74  Alloc ){.    int
b950: 20 6e 4e 65 77 20 3d 20 28 6e 50 72 65 66 69 78   nNew = (nPrefix
b960: 2b 6e 53 75 66 66 69 78 29 2a 32 3b 0a 20 20 20  +nSuffix)*2;.   
b970: 20 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20 73 71   char *zNew = sq
b980: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 52  lite3_realloc(pR
b990: 65 61 64 65 72 2d 3e 7a 54 65 72 6d 2c 20 6e 4e  eader->zTerm, nN
b9a0: 65 77 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4e  ew);.    if( !zN
b9b0: 65 77 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ew ){.      retu
b9c0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
b9d0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 61 64  .    }.    pRead
b9e0: 65 72 2d 3e 7a 54 65 72 6d 20 3d 20 7a 4e 65 77  er->zTerm = zNew
b9f0: 3b 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e  ;.    pReader->n
ba00: 54 65 72 6d 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77  TermAlloc = nNew
ba10: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 66 74  ;.  }..  rc = ft
ba20: 73 33 53 65 67 52 65 61 64 65 72 52 65 71 75 69  s3SegReaderRequi
ba30: 72 65 28 70 52 65 61 64 65 72 2c 20 70 4e 65 78  re(pReader, pNex
ba40: 74 2c 20 6e 53 75 66 66 69 78 2b 46 54 53 33 5f  t, nSuffix+FTS3_
ba50: 56 41 52 49 4e 54 5f 4d 41 58 29 3b 0a 20 20 69  VARINT_MAX);.  i
ba60: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ba70: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
ba80: 20 6d 65 6d 63 70 79 28 26 70 52 65 61 64 65 72   memcpy(&pReader
ba90: 2d 3e 7a 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d  ->zTerm[nPrefix]
baa0: 2c 20 70 4e 65 78 74 2c 20 6e 53 75 66 66 69 78  , pNext, nSuffix
bab0: 29 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 6e 54  );.  pReader->nT
bac0: 65 72 6d 20 3d 20 6e 50 72 65 66 69 78 2b 6e 53  erm = nPrefix+nS
bad0: 75 66 66 69 78 3b 0a 20 20 70 4e 65 78 74 20 2b  uffix;.  pNext +
bae0: 3d 20 6e 53 75 66 66 69 78 3b 0a 20 20 70 4e 65  = nSuffix;.  pNe
baf0: 78 74 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  xt += sqlite3Fts
bb00: 33 47 65 74 56 61 72 69 6e 74 33 32 28 70 4e 65  3GetVarint32(pNe
bb10: 78 74 2c 20 26 70 52 65 61 64 65 72 2d 3e 6e 44  xt, &pReader->nD
bb20: 6f 63 6c 69 73 74 29 3b 0a 20 20 70 52 65 61 64  oclist);.  pRead
bb30: 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20 70  er->aDoclist = p
bb40: 4e 65 78 74 3b 0a 20 20 70 52 65 61 64 65 72 2d  Next;.  pReader-
bb50: 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 30  >pOffsetList = 0
bb60: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
bb70: 61 74 20 74 68 65 20 64 6f 63 6c 69 73 74 20 64  at the doclist d
bb80: 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 74  oes not appear t
bb90: 6f 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68  o extend past th
bba0: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a  e end of the.  *
bbb0: 2a 20 62 2d 74 72 65 65 20 6e 6f 64 65 2e 20 41  * b-tree node. A
bbc0: 6e 64 20 74 68 61 74 20 74 68 65 20 66 69 6e 61  nd that the fina
bbd0: 6c 20 62 79 74 65 20 6f 66 20 74 68 65 20 64 6f  l byte of the do
bbe0: 63 6c 69 73 74 20 69 73 20 30 78 30 30 2e 20 49  clist is 0x00. I
bbf0: 66 20 65 69 74 68 65 72 20 0a 20 20 2a 2a 20 6f  f either .  ** o
bc00: 66 20 74 68 65 73 65 20 73 74 61 74 65 6d 65 6e  f these statemen
bc10: 74 73 20 69 73 20 75 6e 74 72 75 65 2c 20 74 68  ts is untrue, th
bc20: 65 6e 20 74 68 65 20 64 61 74 61 20 73 74 72 75  en the data stru
bc30: 63 74 75 72 65 20 69 73 20 63 6f 72 72 75 70 74  cture is corrupt
bc40: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 26 70 52  ..  */.  if( &pR
bc50: 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b  eader->aDoclist[
bc60: 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73  pReader->nDoclis
bc70: 74 5d 3e 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f  t]>&pReader->aNo
bc80: 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64  de[pReader->nNod
bc90: 65 5d 20 0a 20 20 20 7c 7c 20 28 70 52 65 61 64  e] .   || (pRead
bca0: 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 3d 3d 30  er->nPopulate==0
bcb0: 20 26 26 20 70 52 65 61 64 65 72 2d 3e 61 44 6f   && pReader->aDo
bcc0: 63 6c 69 73 74 5b 70 52 65 61 64 65 72 2d 3e 6e  clist[pReader->n
bcd0: 44 6f 63 6c 69 73 74 2d 31 5d 29 0a 20 20 29 7b  Doclist-1]).  ){
bce0: 0a 20 20 20 20 72 65 74 75 72 6e 20 46 54 53 5f  .    return FTS_
bcf0: 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20  CORRUPT_VTAB;.  
bd00: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
bd10: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
bd20: 65 74 20 74 68 65 20 53 65 67 52 65 61 64 65 72  et the SegReader
bd30: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
bd40: 20 66 69 72 73 74 20 64 6f 63 69 64 20 69 6e 20   first docid in 
bd50: 74 68 65 20 64 6f 63 6c 69 73 74 20 61 73 73 6f  the doclist asso
bd60: 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
bd70: 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 2e  he current term.
bd80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
bd90: 74 73 33 53 65 67 52 65 61 64 65 72 46 69 72 73  ts3SegReaderFirs
bda0: 74 44 6f 63 69 64 28 46 74 73 33 54 61 62 6c 65  tDocid(Fts3Table
bdb0: 20 2a 70 54 61 62 2c 20 46 74 73 33 53 65 67 52   *pTab, Fts3SegR
bdc0: 65 61 64 65 72 20 2a 70 52 65 61 64 65 72 29 7b  eader *pReader){
bdd0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
bde0: 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
bdf0: 20 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69   pReader->aDocli
be00: 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  st );.  assert( 
be10: 21 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65  !pReader->pOffse
be20: 74 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70  tList );.  if( p
be30: 54 61 62 2d 3e 62 44 65 73 63 49 64 78 20 26 26  Tab->bDescIdx &&
be40: 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49 73   fts3SegReaderIs
be50: 50 65 6e 64 69 6e 67 28 70 52 65 61 64 65 72 29  Pending(pReader)
be60: 20 29 7b 0a 20 20 20 20 75 38 20 62 45 6f 66 20   ){.    u8 bEof 
be70: 3d 20 30 3b 0a 20 20 20 20 70 52 65 61 64 65 72  = 0;.    pReader
be80: 2d 3e 69 44 6f 63 69 64 20 3d 20 30 3b 0a 20 20  ->iDocid = 0;.  
be90: 20 20 70 52 65 61 64 65 72 2d 3e 6e 4f 66 66 73    pReader->nOffs
bea0: 65 74 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  etList = 0;.    
beb0: 73 71 6c 69 74 65 33 46 74 73 33 44 6f 63 6c 69  sqlite3Fts3Docli
bec0: 73 74 50 72 65 76 28 30 2c 0a 20 20 20 20 20 20  stPrev(0,.      
bed0: 20 20 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c    pReader->aDocl
bee0: 69 73 74 2c 20 70 52 65 61 64 65 72 2d 3e 6e 44  ist, pReader->nD
bef0: 6f 63 6c 69 73 74 2c 20 26 70 52 65 61 64 65 72  oclist, &pReader
bf00: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 2c 20 0a  ->pOffsetList, .
bf10: 20 20 20 20 20 20 20 20 26 70 52 65 61 64 65 72          &pReader
bf20: 2d 3e 69 44 6f 63 69 64 2c 20 26 70 52 65 61 64  ->iDocid, &pRead
bf30: 65 72 2d 3e 6e 4f 66 66 73 65 74 4c 69 73 74 2c  er->nOffsetList,
bf40: 20 26 62 45 6f 66 0a 20 20 20 20 29 3b 0a 20 20   &bEof.    );.  
bf50: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
bf60: 66 74 73 33 53 65 67 52 65 61 64 65 72 52 65 71  fts3SegReaderReq
bf70: 75 69 72 65 28 70 52 65 61 64 65 72 2c 20 70 52  uire(pReader, pR
bf80: 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 2c  eader->aDoclist,
bf90: 20 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58   FTS3_VARINT_MAX
bfa0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
bfb0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
bfc0: 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
bfd0: 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 70  3Fts3GetVarint(p
bfe0: 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74  Reader->aDoclist
bff0: 2c 20 26 70 52 65 61 64 65 72 2d 3e 69 44 6f 63  , &pReader->iDoc
c000: 69 64 29 3b 0a 20 20 20 20 20 20 70 52 65 61 64  id);.      pRead
c010: 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20  er->pOffsetList 
c020: 3d 20 26 70 52 65 61 64 65 72 2d 3e 61 44 6f 63  = &pReader->aDoc
c030: 6c 69 73 74 5b 6e 5d 3b 0a 20 20 20 20 7d 0a 20  list[n];.    }. 
c040: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
c050: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
c060: 20 74 68 65 20 53 65 67 52 65 61 64 65 72 20 74   the SegReader t
c070: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
c080: 65 78 74 20 64 6f 63 69 64 20 69 6e 20 74 68 65  ext docid in the
c090: 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 61 73 73 6f   doclist.** asso
c0a0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
c0b0: 63 75 72 72 65 6e 74 20 74 65 72 6d 2e 0a 2a 2a  current term..**
c0c0: 20 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74   .** If argument
c0d0: 73 20 70 70 4f 66 66 73 65 74 4c 69 73 74 20 61  s ppOffsetList a
c0e0: 6e 64 20 70 6e 4f 66 66 73 65 74 4c 69 73 74 20  nd pnOffsetList 
c0f0: 61 72 65 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68  are not NULL, th
c100: 65 6e 20 0a 2a 2a 20 2a 70 70 4f 66 66 73 65 74  en .** *ppOffset
c110: 4c 69 73 74 20 69 73 20 73 65 74 20 74 6f 20 70  List is set to p
c120: 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73  oint to the firs
c130: 74 20 63 6f 6c 75 6d 6e 2d 6f 66 66 73 65 74 20  t column-offset 
c140: 6c 69 73 74 0a 2a 2a 20 69 6e 20 74 68 65 20 64  list.** in the d
c150: 6f 63 6c 69 73 74 20 65 6e 74 72 79 20 28 69 2e  oclist entry (i.
c160: 65 2e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 70  e. immediately p
c170: 61 73 74 20 74 68 65 20 64 6f 63 69 64 20 76 61  ast the docid va
c180: 72 69 6e 74 29 2e 0a 2a 2a 20 2a 70 6e 4f 66 66  rint)..** *pnOff
c190: 73 65 74 4c 69 73 74 20 69 73 20 73 65 74 20 74  setList is set t
c1a0: 6f 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  o the length of 
c1b0: 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d  the set of colum
c1c0: 6e 2d 6f 66 66 73 65 74 0a 2a 2a 20 6c 69 73 74  n-offset.** list
c1d0: 73 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  s, not including
c1e0: 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61   the nul-termina
c1f0: 74 6f 72 20 62 79 74 65 2e 20 46 6f 72 20 65 78  tor byte. For ex
c200: 61 6d 70 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63  ample:.*/.static
c210: 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61 64   int fts3SegRead
c220: 65 72 4e 65 78 74 44 6f 63 69 64 28 0a 20 20 46  erNextDocid(.  F
c230: 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62 2c 0a  ts3Table *pTab,.
c240: 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
c250: 2a 70 52 65 61 64 65 72 2c 20 20 20 20 20 20 20  *pReader,       
c260: 20 20 2f 2a 20 52 65 61 64 65 72 20 74 6f 20 61    /* Reader to a
c270: 64 76 61 6e 63 65 20 74 6f 20 6e 65 78 74 20 64  dvance to next d
c280: 6f 63 69 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ocid */.  char *
c290: 2a 70 70 4f 66 66 73 65 74 4c 69 73 74 2c 20 20  *ppOffsetList,  
c2a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
c2b0: 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72  : Pointer to cur
c2c0: 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 2d 6c 69  rent position-li
c2d0: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4f  st */.  int *pnO
c2e0: 66 66 73 65 74 4c 69 73 74 20 20 20 20 20 20 20  ffsetList       
c2f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
c300: 4c 65 6e 67 74 68 20 6f 66 20 2a 70 70 4f 66 66  Length of *ppOff
c310: 73 65 74 4c 69 73 74 20 69 6e 20 62 79 74 65 73  setList in bytes
c320: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
c330: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
c340: 68 61 72 20 2a 70 20 3d 20 70 52 65 61 64 65 72  har *p = pReader
c350: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3b 0a 20  ->pOffsetList;. 
c360: 20 63 68 61 72 20 63 20 3d 20 30 3b 0a 0a 20 20   char c = 0;..  
c370: 61 73 73 65 72 74 28 20 70 20 29 3b 0a 0a 20 20  assert( p );..  
c380: 69 66 28 20 70 54 61 62 2d 3e 62 44 65 73 63 49  if( pTab->bDescI
c390: 64 78 20 26 26 20 66 74 73 33 53 65 67 52 65 61  dx && fts3SegRea
c3a0: 64 65 72 49 73 50 65 6e 64 69 6e 67 28 70 52 65  derIsPending(pRe
c3b0: 61 64 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ader) ){.    /* 
c3c0: 41 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20  A pending-terms 
c3d0: 73 65 67 2d 72 65 61 64 65 72 20 66 6f 72 20 61  seg-reader for a
c3e0: 6e 20 46 54 53 34 20 74 61 62 6c 65 20 74 68 61  n FTS4 table tha
c3f0: 74 20 75 73 65 73 20 6f 72 64 65 72 3d 64 65 73  t uses order=des
c400: 63 2e 0a 20 20 20 20 2a 2a 20 50 65 6e 64 69 6e  c..    ** Pendin
c410: 67 2d 74 65 72 6d 73 20 64 6f 63 6c 69 73 74 73  g-terms doclists
c420: 20 61 72 65 20 61 6c 77 61 79 73 20 62 75 69 6c   are always buil
c430: 74 20 75 70 20 69 6e 20 61 73 63 65 6e 64 69 6e  t up in ascendin
c440: 67 20 6f 72 64 65 72 2c 20 73 6f 0a 20 20 20 20  g order, so.    
c450: 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 69 74  ** we have to it
c460: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
c470: 65 6d 20 62 61 63 6b 77 61 72 64 73 20 68 65 72  em backwards her
c480: 65 2e 20 2a 2f 0a 20 20 20 20 75 38 20 62 45 6f  e. */.    u8 bEo
c490: 66 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  f = 0;.    if( p
c4a0: 70 4f 66 66 73 65 74 4c 69 73 74 20 29 7b 0a 20  pOffsetList ){. 
c4b0: 20 20 20 20 20 2a 70 70 4f 66 66 73 65 74 4c 69       *ppOffsetLi
c4c0: 73 74 20 3d 20 70 52 65 61 64 65 72 2d 3e 70 4f  st = pReader->pO
c4d0: 66 66 73 65 74 4c 69 73 74 3b 0a 20 20 20 20 20  ffsetList;.     
c4e0: 20 2a 70 6e 4f 66 66 73 65 74 4c 69 73 74 20 3d   *pnOffsetList =
c4f0: 20 70 52 65 61 64 65 72 2d 3e 6e 4f 66 66 73 65   pReader->nOffse
c500: 74 4c 69 73 74 20 2d 20 31 3b 0a 20 20 20 20 7d  tList - 1;.    }
c510: 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33  .    sqlite3Fts3
c520: 44 6f 63 6c 69 73 74 50 72 65 76 28 30 2c 0a 20  DoclistPrev(0,. 
c530: 20 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e         pReader->
c540: 61 44 6f 63 6c 69 73 74 2c 20 70 52 65 61 64 65  aDoclist, pReade
c550: 72 2d 3e 6e 44 6f 63 6c 69 73 74 2c 20 26 70 2c  r->nDoclist, &p,
c560: 20 26 70 52 65 61 64 65 72 2d 3e 69 44 6f 63 69   &pReader->iDoci
c570: 64 2c 0a 20 20 20 20 20 20 20 20 26 70 52 65 61  d,.        &pRea
c580: 64 65 72 2d 3e 6e 4f 66 66 73 65 74 4c 69 73 74  der->nOffsetList
c590: 2c 20 26 62 45 6f 66 0a 20 20 20 20 29 3b 0a 20  , &bEof.    );. 
c5a0: 20 20 20 69 66 28 20 62 45 6f 66 20 29 7b 0a 20     if( bEof ){. 
c5b0: 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 4f       pReader->pO
c5c0: 66 66 73 65 74 4c 69 73 74 20 3d 20 30 3b 0a 20  ffsetList = 0;. 
c5d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c5e0: 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74  pReader->pOffset
c5f0: 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a  List = p;.    }.
c600: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
c610: 72 20 2a 70 45 6e 64 20 3d 20 26 70 52 65 61 64  r *pEnd = &pRead
c620: 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b 70 52 65  er->aDoclist[pRe
c630: 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 5d 3b  ader->nDoclist];
c640: 0a 0a 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  ..    /* Pointer
c650: 20 70 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69   p currently poi
c660: 6e 74 73 20 61 74 20 74 68 65 20 66 69 72 73 74  nts at the first
c670: 20 62 79 74 65 20 6f 66 20 61 6e 20 6f 66 66 73   byte of an offs
c680: 65 74 20 6c 69 73 74 2e 20 54 68 65 0a 20 20 20  et list. The.   
c690: 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c   ** following bl
c6a0: 6f 63 6b 20 61 64 76 61 6e 63 65 73 20 69 74 20  ock advances it 
c6b0: 74 6f 20 70 6f 69 6e 74 20 6f 6e 65 20 62 79 74  to point one byt
c6c0: 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
c6d0: 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d  f.    ** the sam
c6e0: 65 20 6f 66 66 73 65 74 20 6c 69 73 74 2e 20 2a  e offset list. *
c6f0: 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20 29  /.    while( 1 )
c700: 7b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 54 68  {.  .      /* Th
c710: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 69 6e 65  e following line
c720: 20 6f 66 20 63 6f 64 65 20 28 61 6e 64 20 74 68   of code (and th
c730: 65 20 22 70 2b 2b 22 20 62 65 6c 6f 77 20 74 68  e "p++" below th
c740: 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70 29 20  e while() loop) 
c750: 69 73 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 72 6d  is.      ** norm
c760: 61 6c 6c 79 20 61 6c 6c 20 74 68 61 74 20 69 73  ally all that is
c770: 20 72 65 71 75 69 72 65 64 20 74 6f 20 6d 6f 76   required to mov
c780: 65 20 70 6f 69 6e 74 65 72 20 70 20 74 6f 20 74  e pointer p to t
c790: 68 65 20 64 65 73 69 72 65 64 20 0a 20 20 20 20  he desired .    
c7a0: 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 2e 20 54    ** position. T
c7b0: 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20  he exception is 
c7c0: 69 66 20 74 68 69 73 20 6e 6f 64 65 20 69 73 20  if this node is 
c7d0: 62 65 69 6e 67 20 6c 6f 61 64 65 64 20 66 72 6f  being loaded fro
c7e0: 6d 20 64 69 73 6b 0a 20 20 20 20 20 20 2a 2a 20  m disk.      ** 
c7f0: 69 6e 63 72 65 6d 65 6e 74 61 6c 6c 79 20 61 6e  incrementally an
c800: 64 20 70 6f 69 6e 74 65 72 20 22 70 22 20 6e 6f  d pointer "p" no
c810: 77 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  w points to the 
c820: 66 69 72 73 74 20 62 79 74 65 20 70 61 73 73 65  first byte passe
c830: 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70  d.      ** the p
c840: 6f 70 75 6c 61 74 65 64 20 70 61 72 74 20 6f 66  opulated part of
c850: 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b   pReader->aNode[
c860: 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ]..      */.    
c870: 20 20 77 68 69 6c 65 28 20 2a 70 20 7c 20 63 20    while( *p | c 
c880: 29 20 63 20 3d 20 2a 70 2b 2b 20 26 20 30 78 38  ) c = *p++ & 0x8
c890: 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
c8a0: 20 2a 70 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20   *p==0 );.  .   
c8b0: 20 20 20 69 66 28 20 70 52 65 61 64 65 72 2d 3e     if( pReader->
c8c0: 70 42 6c 6f 62 3d 3d 30 20 7c 7c 20 70 3c 26 70  pBlob==0 || p<&p
c8d0: 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52  Reader->aNode[pR
c8e0: 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65  eader->nPopulate
c8f0: 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
c900: 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61   rc = fts3SegRea
c910: 64 65 72 49 6e 63 72 52 65 61 64 28 70 52 65 61  derIncrRead(pRea
c920: 64 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  der);.      if( 
c930: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
c940: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
c950: 0a 20 20 20 20 70 2b 2b 3b 0a 20 20 0a 20 20 20  .    p++;.  .   
c960: 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c   /* If required,
c970: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 75   populate the ou
c980: 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 77  tput variables w
c990: 69 74 68 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ith a pointer to
c9a0: 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
c9b0: 73 69 7a 65 20 6f 66 20 74 68 65 20 70 72 65 76  size of the prev
c9c0: 69 6f 75 73 20 6f 66 66 73 65 74 2d 6c 69 73 74  ious offset-list
c9d0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
c9e0: 20 70 70 4f 66 66 73 65 74 4c 69 73 74 20 29 7b   ppOffsetList ){
c9f0: 0a 20 20 20 20 20 20 2a 70 70 4f 66 66 73 65 74  .      *ppOffset
ca00: 4c 69 73 74 20 3d 20 70 52 65 61 64 65 72 2d 3e  List = pReader->
ca10: 70 4f 66 66 73 65 74 4c 69 73 74 3b 0a 20 20 20  pOffsetList;.   
ca20: 20 20 20 2a 70 6e 4f 66 66 73 65 74 4c 69 73 74     *pnOffsetList
ca30: 20 3d 20 28 69 6e 74 29 28 70 20 2d 20 70 52 65   = (int)(p - pRe
ca40: 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73  ader->pOffsetLis
ca50: 74 20 2d 20 31 29 3b 0a 20 20 20 20 7d 0a 0a 20  t - 1);.    }.. 
ca60: 20 20 20 2f 2a 20 4c 69 73 74 20 6d 61 79 20 68     /* List may h
ca70: 61 76 65 20 62 65 65 6e 20 65 64 69 74 65 64 20  ave been edited 
ca80: 69 6e 20 70 6c 61 63 65 20 62 79 20 66 74 73 33  in place by fts3
ca90: 45 76 61 6c 4e 65 61 72 54 72 69 6d 28 29 20 2a  EvalNearTrim() *
caa0: 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 3c 70  /.    while( p<p
cab0: 45 6e 64 20 26 26 20 2a 70 3d 3d 30 20 29 20 70  End && *p==0 ) p
cac0: 2b 2b 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66  ++;.  .    /* If
cad0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
cae0: 72 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  re entries in th
caf0: 65 20 64 6f 63 6c 69 73 74 2c 20 73 65 74 20 70  e doclist, set p
cb00: 4f 66 66 73 65 74 4c 69 73 74 20 74 6f 0a 20 20  OffsetList to.  
cb10: 20 20 2a 2a 20 4e 55 4c 4c 2e 20 4f 74 68 65 72    ** NULL. Other
cb20: 77 69 73 65 2c 20 73 65 74 20 46 74 73 33 53 65  wise, set Fts3Se
cb30: 67 52 65 61 64 65 72 2e 69 44 6f 63 69 64 20 74  gReader.iDocid t
cb40: 6f 20 74 68 65 20 6e 65 78 74 20 64 6f 63 69 64  o the next docid
cb50: 20 61 6e 64 0a 20 20 20 20 2a 2a 20 46 74 73 33   and.    ** Fts3
cb60: 53 65 67 52 65 61 64 65 72 2e 70 4f 66 66 73 65  SegReader.pOffse
cb70: 74 4c 69 73 74 20 74 6f 20 70 6f 69 6e 74 20 74  tList to point t
cb80: 6f 20 74 68 65 20 6e 65 78 74 20 6f 66 66 73 65  o the next offse
cb90: 74 20 6c 69 73 74 20 62 65 66 6f 72 65 0a 20 20  t list before.  
cba0: 20 20 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a    ** returning..
cbb0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
cbc0: 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  >=pEnd ){.      
cbd0: 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74  pReader->pOffset
cbe0: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  List = 0;.    }e
cbf0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
cc00: 66 74 73 33 53 65 67 52 65 61 64 65 72 52 65 71  fts3SegReaderReq
cc10: 75 69 72 65 28 70 52 65 61 64 65 72 2c 20 70 2c  uire(pReader, p,
cc20: 20 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58   FTS3_VARINT_MAX
cc30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
cc40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
cc50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
cc60: 74 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20  t64 iDelta;.    
cc70: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 4f 66      pReader->pOf
cc80: 66 73 65 74 4c 69 73 74 20 3d 20 70 20 2b 20 73  fsetList = p + s
cc90: 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
cca0: 69 6e 74 28 70 2c 20 26 69 44 65 6c 74 61 29 3b  int(p, &iDelta);
ccb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61  .        if( pTa
ccc0: 62 2d 3e 62 44 65 73 63 49 64 78 20 29 7b 0a 20  b->bDescIdx ){. 
ccd0: 20 20 20 20 20 20 20 20 20 70 52 65 61 64 65 72           pReader
cce0: 2d 3e 69 44 6f 63 69 64 20 2d 3d 20 69 44 65 6c  ->iDocid -= iDel
ccf0: 74 61 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ta;.        }els
cd00: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65  e{.          pRe
cd10: 61 64 65 72 2d 3e 69 44 6f 63 69 64 20 2b 3d 20  ader->iDocid += 
cd20: 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20  iDelta;.        
cd30: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
cd40: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
cd50: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 69 6e 74  LITE_OK;.}...int
cd60: 20 73 71 6c 69 74 65 33 46 74 73 33 4d 73 72 4f   sqlite3Fts3MsrO
cd70: 76 66 6c 28 0a 20 20 46 74 73 33 43 75 72 73 6f  vfl(.  Fts3Curso
cd80: 72 20 2a 70 43 73 72 2c 20 0a 20 20 46 74 73 33  r *pCsr, .  Fts3
cd90: 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a  MultiSegReader *
cda0: 70 4d 73 72 2c 0a 20 20 69 6e 74 20 2a 70 6e 4f  pMsr,.  int *pnO
cdb0: 76 66 6c 0a 29 7b 0a 20 20 46 74 73 33 54 61 62  vfl.){.  Fts3Tab
cdc0: 6c 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62  le *p = (Fts3Tab
cdd0: 6c 65 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e 70  le*)pCsr->base.p
cde0: 56 74 61 62 3b 0a 20 20 69 6e 74 20 6e 4f 76 66  Vtab;.  int nOvf
cdf0: 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 69 3b  l = 0;.  int ii;
ce00: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
ce10: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 70 67 73  TE_OK;.  int pgs
ce20: 7a 20 3d 20 70 2d 3e 6e 50 67 73 7a 3b 0a 0a 20  z = p->nPgsz;.. 
ce30: 20 61 73 73 65 72 74 28 20 70 2d 3e 62 46 74 73   assert( p->bFts
ce40: 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  4 );.  assert( p
ce50: 67 73 7a 3e 30 20 29 3b 0a 0a 20 20 66 6f 72 28  gsz>0 );..  for(
ce60: 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ii=0; rc==SQLITE
ce70: 5f 4f 4b 20 26 26 20 69 69 3c 70 4d 73 72 2d 3e  _OK && ii<pMsr->
ce80: 6e 53 65 67 6d 65 6e 74 3b 20 69 69 2b 2b 29 7b  nSegment; ii++){
ce90: 0a 20 20 20 20 46 74 73 33 53 65 67 52 65 61 64  .    Fts3SegRead
cea0: 65 72 20 2a 70 52 65 61 64 65 72 20 3d 20 70 4d  er *pReader = pM
ceb0: 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69 69  sr->apSegment[ii
cec0: 5d 3b 0a 20 20 20 20 69 66 28 20 21 66 74 73 33  ];.    if( !fts3
ced0: 53 65 67 52 65 61 64 65 72 49 73 50 65 6e 64 69  SegReaderIsPendi
cee0: 6e 67 28 70 52 65 61 64 65 72 29 20 0a 20 20 20  ng(pReader) .   
cef0: 20 20 26 26 20 21 66 74 73 33 53 65 67 52 65 61    && !fts3SegRea
cf00: 64 65 72 49 73 52 6f 6f 74 4f 6e 6c 79 28 70 52  derIsRootOnly(pR
cf10: 65 61 64 65 72 29 20 0a 20 20 20 20 29 7b 0a 20  eader) .    ){. 
cf20: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
cf30: 36 34 20 6a 6a 3b 0a 20 20 20 20 20 20 66 6f 72  64 jj;.      for
cf40: 28 6a 6a 3d 70 52 65 61 64 65 72 2d 3e 69 53 74  (jj=pReader->iSt
cf50: 61 72 74 42 6c 6f 63 6b 3b 20 6a 6a 3c 3d 70 52  artBlock; jj<=pR
cf60: 65 61 64 65 72 2d 3e 69 4c 65 61 66 45 6e 64 42  eader->iLeafEndB
cf70: 6c 6f 63 6b 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20  lock; jj++){.   
cf80: 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 0a       int nBlob;.
cf90: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
cfa0: 69 74 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63  ite3Fts3ReadBloc
cfb0: 6b 28 70 2c 20 6a 6a 2c 20 30 2c 20 26 6e 42 6c  k(p, jj, 0, &nBl
cfc0: 6f 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ob, 0);.        
cfd0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
cfe0: 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  K ) break;.     
cff0: 20 20 20 69 66 28 20 28 6e 42 6c 6f 62 2b 33 35     if( (nBlob+35
d000: 29 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20  )>pgsz ){.      
d010: 20 20 20 20 6e 4f 76 66 6c 20 2b 3d 20 28 6e 42      nOvfl += (nB
d020: 6c 6f 62 20 2b 20 33 34 29 2f 70 67 73 7a 3b 0a  lob + 34)/pgsz;.
d030: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d040: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  }.    }.  }.  *p
d050: 6e 4f 76 66 6c 20 3d 20 6e 4f 76 66 6c 3b 0a 20  nOvfl = nOvfl;. 
d060: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
d070: 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 61 6c  *.** Free all al
d080: 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69  locations associ
d090: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 69 74  ated with the it
d0a0: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
d0b0: 20 74 68 65 20 0a 2a 2a 20 73 65 63 6f 6e 64 20   the .** second 
d0c0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  argument..*/.voi
d0d0: 64 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  d sqlite3Fts3Seg
d0e0: 52 65 61 64 65 72 46 72 65 65 28 46 74 73 33 53  ReaderFree(Fts3S
d0f0: 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 65  egReader *pReade
d100: 72 29 7b 0a 20 20 69 66 28 20 70 52 65 61 64 65  r){.  if( pReade
d110: 72 20 26 26 20 21 66 74 73 33 53 65 67 52 65 61  r && !fts3SegRea
d120: 64 65 72 49 73 50 65 6e 64 69 6e 67 28 70 52 65  derIsPending(pRe
d130: 61 64 65 72 29 20 29 7b 0a 20 20 20 20 73 71 6c  ader) ){.    sql
d140: 69 74 65 33 5f 66 72 65 65 28 70 52 65 61 64 65  ite3_free(pReade
d150: 72 2d 3e 7a 54 65 72 6d 29 3b 0a 20 20 20 20 69  r->zTerm);.    i
d160: 66 28 20 21 66 74 73 33 53 65 67 52 65 61 64 65  f( !fts3SegReade
d170: 72 49 73 52 6f 6f 74 4f 6e 6c 79 28 70 52 65 61  rIsRootOnly(pRea
d180: 64 65 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71  der) ){.      sq
d190: 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65 61 64  lite3_free(pRead
d1a0: 65 72 2d 3e 61 4e 6f 64 65 29 3b 0a 20 20 20 20  er->aNode);.    
d1b0: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63    sqlite3_blob_c
d1c0: 6c 6f 73 65 28 70 52 65 61 64 65 72 2d 3e 70 42  lose(pReader->pB
d1d0: 6c 6f 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lob);.    }.  }.
d1e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
d1f0: 52 65 61 64 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Reader);.}../*.*
d200: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
d210: 20 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63   SegReader objec
d220: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
d230: 33 46 74 73 33 53 65 67 52 65 61 64 65 72 4e 65  3Fts3SegReaderNe
d240: 77 28 0a 20 20 69 6e 74 20 69 41 67 65 2c 20 20  w(.  int iAge,  
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d260: 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20       /* Segment 
d270: 22 61 67 65 22 2e 20 2a 2f 0a 20 20 69 6e 74 20  "age". */.  int 
d280: 62 4c 6f 6f 6b 75 70 2c 20 20 20 20 20 20 20 20  bLookup,        
d290: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
d2a0: 72 75 65 20 66 6f 72 20 61 20 6c 6f 6f 6b 75 70  rue for a lookup
d2b0: 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 71 6c 69 74   only */.  sqlit
d2c0: 65 33 5f 69 6e 74 36 34 20 69 53 74 61 72 74 4c  e3_int64 iStartL
d2d0: 65 61 66 2c 20 20 20 20 20 20 20 2f 2a 20 46 69  eaf,       /* Fi
d2e0: 72 73 74 20 6c 65 61 66 20 74 6f 20 74 72 61 76  rst leaf to trav
d2f0: 65 72 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  erse */.  sqlite
d300: 33 5f 69 6e 74 36 34 20 69 45 6e 64 4c 65 61 66  3_int64 iEndLeaf
d310: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e  ,         /* Fin
d320: 61 6c 20 6c 65 61 66 20 74 6f 20 74 72 61 76 65  al leaf to trave
d330: 72 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rse */.  sqlite3
d340: 5f 69 6e 74 36 34 20 69 45 6e 64 42 6c 6f 63 6b  _int64 iEndBlock
d350: 2c 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 61  ,        /* Fina
d360: 6c 20 62 6c 6f 63 6b 20 6f 66 20 73 65 67 6d 65  l block of segme
d370: 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nt */.  const ch
d380: 61 72 20 2a 7a 52 6f 6f 74 2c 20 20 20 20 20 20  ar *zRoot,      
d390: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
d3a0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 72 6f 6f  r containing roo
d3b0: 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  t node */.  int 
d3c0: 6e 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20  nRoot,          
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
d3e0: 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 63 6f  ize of buffer co
d3f0: 6e 74 61 69 6e 69 6e 67 20 72 6f 6f 74 20 6e 6f  ntaining root no
d400: 64 65 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 52  de */.  Fts3SegR
d410: 65 61 64 65 72 20 2a 2a 70 70 52 65 61 64 65 72  eader **ppReader
d420: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
d430: 41 6c 6c 6f 63 61 74 65 64 20 46 74 73 33 53 65  Allocated Fts3Se
d440: 67 52 65 61 64 65 72 20 2a 2f 0a 29 7b 0a 20 20  gReader */.){.  
d450: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
d460: 52 65 61 64 65 72 3b 20 20 20 20 20 20 20 20 20  Reader;         
d470: 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  /* Newly allocat
d480: 65 64 20 53 65 67 52 65 61 64 65 72 20 6f 62 6a  ed SegReader obj
d490: 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ect */.  int nEx
d4a0: 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tra = 0;        
d4b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
d4c0: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 65  s to allocate se
d4d0: 67 6d 65 6e 74 20 72 6f 6f 74 20 6e 6f 64 65 20  gment root node 
d4e0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 53  */..  assert( iS
d4f0: 74 61 72 74 4c 65 61 66 3c 3d 69 45 6e 64 4c 65  tartLeaf<=iEndLe
d500: 61 66 20 29 3b 0a 20 20 69 66 28 20 69 53 74 61  af );.  if( iSta
d510: 72 74 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20  rtLeaf==0 ){.   
d520: 20 6e 45 78 74 72 61 20 3d 20 6e 52 6f 6f 74 20   nExtra = nRoot 
d530: 2b 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44  + FTS3_NODE_PADD
d540: 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 61  ING;.  }..  pRea
d550: 64 65 72 20 3d 20 28 46 74 73 33 53 65 67 52 65  der = (Fts3SegRe
d560: 61 64 65 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  ader *)sqlite3_m
d570: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46 74 73  alloc(sizeof(Fts
d580: 33 53 65 67 52 65 61 64 65 72 29 20 2b 20 6e 45  3SegReader) + nE
d590: 78 74 72 61 29 3b 0a 20 20 69 66 28 20 21 70 52  xtra);.  if( !pR
d5a0: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 72 65 74  eader ){.    ret
d5b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
d5c0: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
d5d0: 52 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f  Reader, 0, sizeo
d5e0: 66 28 46 74 73 33 53 65 67 52 65 61 64 65 72 29  f(Fts3SegReader)
d5f0: 29 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 69 49  );.  pReader->iI
d600: 64 78 20 3d 20 69 41 67 65 3b 0a 20 20 70 52 65  dx = iAge;.  pRe
d610: 61 64 65 72 2d 3e 62 4c 6f 6f 6b 75 70 20 3d 20  ader->bLookup = 
d620: 62 4c 6f 6f 6b 75 70 21 3d 30 3b 0a 20 20 70 52  bLookup!=0;.  pR
d630: 65 61 64 65 72 2d 3e 69 53 74 61 72 74 42 6c 6f  eader->iStartBlo
d640: 63 6b 20 3d 20 69 53 74 61 72 74 4c 65 61 66 3b  ck = iStartLeaf;
d650: 0a 20 20 70 52 65 61 64 65 72 2d 3e 69 4c 65 61  .  pReader->iLea
d660: 66 45 6e 64 42 6c 6f 63 6b 20 3d 20 69 45 6e 64  fEndBlock = iEnd
d670: 4c 65 61 66 3b 0a 20 20 70 52 65 61 64 65 72 2d  Leaf;.  pReader-
d680: 3e 69 45 6e 64 42 6c 6f 63 6b 20 3d 20 69 45 6e  >iEndBlock = iEn
d690: 64 42 6c 6f 63 6b 3b 0a 0a 20 20 69 66 28 20 6e  dBlock;..  if( n
d6a0: 45 78 74 72 61 20 29 7b 0a 20 20 20 20 2f 2a 20  Extra ){.    /* 
d6b0: 54 68 65 20 65 6e 74 69 72 65 20 73 65 67 6d 65  The entire segme
d6c0: 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  nt is stored in 
d6d0: 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 2a  the root node. *
d6e0: 2f 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e 61  /.    pReader->a
d6f0: 4e 6f 64 65 20 3d 20 28 63 68 61 72 20 2a 29 26  Node = (char *)&
d700: 70 52 65 61 64 65 72 5b 31 5d 3b 0a 20 20 20 20  pReader[1];.    
d710: 70 52 65 61 64 65 72 2d 3e 72 6f 6f 74 4f 6e 6c  pReader->rootOnl
d720: 79 20 3d 20 31 3b 0a 20 20 20 20 70 52 65 61 64  y = 1;.    pRead
d730: 65 72 2d 3e 6e 4e 6f 64 65 20 3d 20 6e 52 6f 6f  er->nNode = nRoo
d740: 74 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 52  t;.    memcpy(pR
d750: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 2c 20 7a 52  eader->aNode, zR
d760: 6f 6f 74 2c 20 6e 52 6f 6f 74 29 3b 0a 20 20 20  oot, nRoot);.   
d770: 20 6d 65 6d 73 65 74 28 26 70 52 65 61 64 65 72   memset(&pReader
d780: 2d 3e 61 4e 6f 64 65 5b 6e 52 6f 6f 74 5d 2c 20  ->aNode[nRoot], 
d790: 30 2c 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44  0, FTS3_NODE_PAD
d7a0: 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DING);.  }else{.
d7b0: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 69 43 75      pReader->iCu
d7c0: 72 72 65 6e 74 42 6c 6f 63 6b 20 3d 20 69 53 74  rrentBlock = iSt
d7d0: 61 72 74 4c 65 61 66 2d 31 3b 0a 20 20 7d 0a 20  artLeaf-1;.  }. 
d7e0: 20 2a 70 70 52 65 61 64 65 72 20 3d 20 70 52 65   *ppReader = pRe
d7f0: 61 64 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53  ader;.  return S
d800: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
d810: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63 6f 6d  ** This is a com
d820: 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
d830: 20 75 73 65 64 20 61 73 20 61 20 71 73 6f 72 74   used as a qsort
d840: 28 29 20 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e  () callback when
d850: 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 61 6e 20 61   sorting.** an a
d860: 72 72 61 79 20 6f 66 20 70 65 6e 64 69 6e 67 20  rray of pending 
d870: 74 65 72 6d 73 20 62 79 20 74 65 72 6d 2e 20 54  terms by term. T
d880: 68 69 73 20 6f 63 63 75 72 73 20 61 73 20 70 61  his occurs as pa
d890: 72 74 20 6f 66 20 66 6c 75 73 68 69 6e 67 0a 2a  rt of flushing.*
d8a0: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * the contents o
d8b0: 66 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65  f the pending-te
d8c0: 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65 20 74  rms hash table t
d8d0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  o the database..
d8e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
d8f0: 73 33 43 6f 6d 70 61 72 65 45 6c 65 6d 42 79 54  s3CompareElemByT
d900: 65 72 6d 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a  erm(const void *
d910: 6c 68 73 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  lhs, const void 
d920: 2a 72 68 73 29 7b 0a 20 20 63 68 61 72 20 2a 7a  *rhs){.  char *z
d930: 31 20 3d 20 66 74 73 33 48 61 73 68 4b 65 79 28  1 = fts3HashKey(
d940: 2a 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a  *(Fts3HashElem *
d950: 2a 29 6c 68 73 29 3b 0a 20 20 63 68 61 72 20 2a  *)lhs);.  char *
d960: 7a 32 20 3d 20 66 74 73 33 48 61 73 68 4b 65 79  z2 = fts3HashKey
d970: 28 2a 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20  (*(Fts3HashElem 
d980: 2a 2a 29 72 68 73 29 3b 0a 20 20 69 6e 74 20 6e  **)rhs);.  int n
d990: 31 20 3d 20 66 74 73 33 48 61 73 68 4b 65 79 73  1 = fts3HashKeys
d9a0: 69 7a 65 28 2a 28 46 74 73 33 48 61 73 68 45 6c  ize(*(Fts3HashEl
d9b0: 65 6d 20 2a 2a 29 6c 68 73 29 3b 0a 20 20 69 6e  em **)lhs);.  in
d9c0: 74 20 6e 32 20 3d 20 66 74 73 33 48 61 73 68 4b  t n2 = fts3HashK
d9d0: 65 79 73 69 7a 65 28 2a 28 46 74 73 33 48 61 73  eysize(*(Fts3Has
d9e0: 68 45 6c 65 6d 20 2a 2a 29 72 68 73 29 3b 0a 0a  hElem **)rhs);..
d9f0: 20 20 69 6e 74 20 6e 20 3d 20 28 6e 31 3c 6e 32    int n = (n1<n2
da00: 20 3f 20 6e 31 20 3a 20 6e 32 29 3b 0a 20 20 69   ? n1 : n2);.  i
da10: 6e 74 20 63 20 3d 20 6d 65 6d 63 6d 70 28 7a 31  nt c = memcmp(z1
da20: 2c 20 7a 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20  , z2, n);.  if( 
da30: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d 20  c==0 ){.    c = 
da40: 6e 31 20 2d 20 6e 32 3b 0a 20 20 7d 0a 20 20 72  n1 - n2;.  }.  r
da50: 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn c;.}../*.*
da60: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
da70: 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  is used to alloc
da80: 61 74 65 20 61 6e 20 46 74 73 33 53 65 67 52 65  ate an Fts3SegRe
da90: 61 64 65 72 20 74 68 61 74 20 69 74 65 72 61 74  ader that iterat
daa0: 65 73 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 20  es through.** a 
dab0: 73 75 62 73 65 74 20 6f 66 20 74 68 65 20 74 65  subset of the te
dac0: 72 6d 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  rms stored in th
dad0: 65 20 46 74 73 33 54 61 62 6c 65 2e 70 65 6e 64  e Fts3Table.pend
dae0: 69 6e 67 54 65 72 6d 73 20 61 72 72 61 79 2e 0a  ingTerms array..
daf0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73 50  **.** If the isP
db00: 72 65 66 69 78 49 74 65 72 20 70 61 72 61 6d 65  refixIter parame
db10: 74 65 72 20 69 73 20 7a 65 72 6f 2c 20 74 68 65  ter is zero, the
db20: 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 53  n the returned S
db30: 65 67 52 65 61 64 65 72 20 69 74 65 72 61 74 65  egReader iterate
db40: 73 0a 2a 2a 20 74 68 72 6f 75 67 68 20 65 61 63  s.** through eac
db50: 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 70 65  h term in the pe
db60: 6e 64 69 6e 67 2d 74 65 72 6d 73 20 74 61 62 6c  nding-terms tabl
db70: 65 2e 20 4f 72 2c 20 69 66 20 69 73 50 72 65 66  e. Or, if isPref
db80: 69 78 49 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 6e  ixIter is.** non
db90: 2d 7a 65 72 6f 2c 20 69 74 20 69 74 65 72 61 74  -zero, it iterat
dba0: 65 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  es through each 
dbb0: 74 65 72 6d 20 61 6e 64 20 69 74 73 20 70 72 65  term and its pre
dbc0: 66 69 78 65 73 2e 20 46 6f 72 20 65 78 61 6d 70  fixes. For examp
dbd0: 6c 65 2c 20 69 66 0a 2a 2a 20 74 68 65 20 70 65  le, if.** the pe
dbe0: 6e 64 69 6e 67 20 74 65 72 6d 73 20 68 61 73 68  nding terms hash
dbf0: 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20   table contains 
dc00: 74 68 65 20 74 65 72 6d 73 20 22 73 71 6c 69 74  the terms "sqlit
dc10: 65 22 2c 20 22 6d 79 73 71 6c 22 20 61 6e 64 0a  e", "mysql" and.
dc20: 2a 2a 20 22 66 69 72 65 62 69 72 64 22 2c 20 74  ** "firebird", t
dc30: 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 6f 72  hen the iterator
dc40: 20 76 69 73 69 74 73 20 74 68 65 20 66 6f 6c 6c   visits the foll
dc50: 6f 77 69 6e 67 20 27 74 65 72 6d 73 27 20 28 69  owing 'terms' (i
dc60: 6e 20 74 68 65 20 6f 72 64 65 72 0a 2a 2a 20 73  n the order.** s
dc70: 68 6f 77 6e 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 66  hown):.**.**   f
dc80: 20 66 69 20 66 69 72 20 66 69 72 65 20 66 69 72   fi fir fire fir
dc90: 65 62 20 66 69 72 65 62 69 20 66 69 72 65 62 69  eb firebi firebi
dca0: 72 20 66 69 72 65 62 69 72 64 0a 2a 2a 20 20 20  r firebird.**   
dcb0: 6d 20 6d 79 20 6d 79 73 20 6d 79 73 71 20 6d 79  m my mys mysq my
dcc0: 73 71 6c 0a 2a 2a 20 20 20 73 20 73 71 20 73 71  sql.**   s sq sq
dcd0: 6c 20 73 71 6c 69 20 73 71 6c 69 74 20 73 71 6c  l sqli sqlit sql
dce0: 69 74 65 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 61  ite.**.** Wherea
dcf0: 73 20 69 66 20 69 73 50 72 65 66 69 78 49 74 65  s if isPrefixIte
dd00: 72 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 20 74  r is zero, the t
dd10: 65 72 6d 73 20 76 69 73 69 74 65 64 20 61 72 65  erms visited are
dd20: 3a 0a 2a 2a 0a 2a 2a 20 20 20 66 69 72 65 62 69  :.**.**   firebi
dd30: 72 64 20 6d 79 73 71 6c 20 73 71 6c 69 74 65 0a  rd mysql sqlite.
dd40: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
dd50: 73 33 53 65 67 52 65 61 64 65 72 50 65 6e 64 69  s3SegReaderPendi
dd60: 6e 67 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  ng(.  Fts3Table 
dd70: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
dd80: 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c        /* Virtual
dd90: 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   table handle */
dda0: 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 2c 20 20  .  int iIndex,  
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddc0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20     /* Index for 
ddd0: 70 2d 3e 61 49 6e 64 65 78 20 2a 2f 0a 20 20 63  p->aIndex */.  c
dde0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
ddf0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
de00: 2a 20 54 65 72 6d 20 74 6f 20 73 65 61 72 63 68  * Term to search
de10: 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54   for */.  int nT
de20: 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
de30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
de40: 65 20 6f 66 20 62 75 66 66 65 72 20 7a 54 65 72  e of buffer zTer
de50: 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 50 72 65 66  m */.  int bPref
de60: 69 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ix,             
de70: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
de80: 6f 72 20 61 20 70 72 65 66 69 78 20 69 74 65 72  or a prefix iter
de90: 61 74 6f 72 20 2a 2f 0a 20 20 46 74 73 33 53 65  ator */.  Fts3Se
dea0: 67 52 65 61 64 65 72 20 2a 2a 70 70 52 65 61 64  gReader **ppRead
deb0: 65 72 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  er        /* OUT
dec0: 3a 20 53 65 67 52 65 61 64 65 72 20 66 6f 72 20  : SegReader for 
ded0: 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 2a 2f  pending-terms */
dee0: 0a 29 7b 0a 20 20 46 74 73 33 53 65 67 52 65 61  .){.  Fts3SegRea
def0: 64 65 72 20 2a 70 52 65 61 64 65 72 20 3d 20 30  der *pReader = 0
df00: 3b 20 20 20 20 20 2f 2a 20 46 74 73 33 53 65 67  ;     /* Fts3Seg
df10: 52 65 61 64 65 72 20 6f 62 6a 65 63 74 20 74 6f  Reader object to
df20: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 46 74 73   return */.  Fts
df30: 33 48 61 73 68 45 6c 65 6d 20 2a 70 45 3b 20 20  3HashElem *pE;  
df40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
df50: 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
df60: 65 20 2a 2f 0a 20 20 46 74 73 33 48 61 73 68 45  e */.  Fts3HashE
df70: 6c 65 6d 20 2a 2a 61 45 6c 65 6d 20 3d 20 30 3b  lem **aElem = 0;
df80: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
df90: 6f 66 20 74 65 72 6d 20 68 61 73 68 20 65 6e 74  of term hash ent
dfa0: 72 69 65 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a  ries to scan */.
dfb0: 20 20 69 6e 74 20 6e 45 6c 65 6d 20 3d 20 30 3b    int nElem = 0;
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfd0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72    /* Size of arr
dfe0: 61 79 20 61 74 20 61 45 6c 65 6d 20 2a 2f 0a 20  ay at aElem */. 
dff0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e000: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
e010: 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
e020: 2a 2f 0a 20 20 46 74 73 33 48 61 73 68 20 2a 70  */.  Fts3Hash *p
e030: 48 61 73 68 3b 0a 0a 20 20 70 48 61 73 68 20 3d  Hash;..  pHash =
e040: 20 26 70 2d 3e 61 49 6e 64 65 78 5b 69 49 6e 64   &p->aIndex[iInd
e050: 65 78 5d 2e 68 50 65 6e 64 69 6e 67 3b 0a 20 20  ex].hPending;.  
e060: 69 66 28 20 62 50 72 65 66 69 78 20 29 7b 0a 20  if( bPrefix ){. 
e070: 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20     int nAlloc = 
e080: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
e090: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 6c 6c 6f   /* Size of allo
e0a0: 63 61 74 65 64 20 61 72 72 61 79 20 61 74 20 61  cated array at a
e0b0: 45 6c 65 6d 20 2a 2f 0a 0a 20 20 20 20 66 6f 72  Elem */..    for
e0c0: 28 70 45 3d 66 74 73 33 48 61 73 68 46 69 72 73  (pE=fts3HashFirs
e0d0: 74 28 70 48 61 73 68 29 3b 20 70 45 3b 20 70 45  t(pHash); pE; pE
e0e0: 3d 66 74 73 33 48 61 73 68 4e 65 78 74 28 70 45  =fts3HashNext(pE
e0f0: 29 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  )){.      char *
e100: 7a 4b 65 79 20 3d 20 28 63 68 61 72 20 2a 29 66  zKey = (char *)f
e110: 74 73 33 48 61 73 68 4b 65 79 28 70 45 29 3b 0a  ts3HashKey(pE);.
e120: 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d        int nKey =
e130: 20 66 74 73 33 48 61 73 68 4b 65 79 73 69 7a 65   fts3HashKeysize
e140: 28 70 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20  (pE);.      if( 
e150: 6e 54 65 72 6d 3d 3d 30 20 7c 7c 20 28 6e 4b 65  nTerm==0 || (nKe
e160: 79 3e 3d 6e 54 65 72 6d 20 26 26 20 30 3d 3d 6d  y>=nTerm && 0==m
e170: 65 6d 63 6d 70 28 7a 4b 65 79 2c 20 7a 54 65 72  emcmp(zKey, zTer
e180: 6d 2c 20 6e 54 65 72 6d 29 29 20 29 7b 0a 20 20  m, nTerm)) ){.  
e190: 20 20 20 20 20 20 69 66 28 20 6e 45 6c 65 6d 3d        if( nElem=
e1a0: 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  =nAlloc ){.     
e1b0: 20 20 20 20 20 46 74 73 33 48 61 73 68 45 6c 65       Fts3HashEle
e1c0: 6d 20 2a 2a 61 45 6c 65 6d 32 3b 0a 20 20 20 20  m **aElem2;.    
e1d0: 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 2b 3d 20        nAlloc += 
e1e0: 31 36 3b 0a 20 20 20 20 20 20 20 20 20 20 61 45  16;.          aE
e1f0: 6c 65 6d 32 20 3d 20 28 46 74 73 33 48 61 73 68  lem2 = (Fts3Hash
e200: 45 6c 65 6d 20 2a 2a 29 73 71 6c 69 74 65 33 5f  Elem **)sqlite3_
e210: 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  realloc(.       
e220: 20 20 20 20 20 20 20 61 45 6c 65 6d 2c 20 6e 41         aElem, nA
e230: 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 46 74 73 33  lloc*sizeof(Fts3
e240: 48 61 73 68 45 6c 65 6d 20 2a 29 0a 20 20 20 20  HashElem *).    
e250: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
e260: 20 20 20 69 66 28 20 21 61 45 6c 65 6d 32 20 29     if( !aElem2 )
e270: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
e280: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
e290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 45 6c  .            nEl
e2a0: 65 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  em = 0;.        
e2b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e2c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
e2d0: 20 61 45 6c 65 6d 20 3d 20 61 45 6c 65 6d 32 3b   aElem = aElem2;
e2e0: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
e2f0: 20 20 20 20 61 45 6c 65 6d 5b 6e 45 6c 65 6d 2b      aElem[nElem+
e300: 2b 5d 20 3d 20 70 45 3b 0a 20 20 20 20 20 20 7d  +] = pE;.      }
e310: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
e320: 66 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  f more than one 
e330: 74 65 72 6d 20 6d 61 74 63 68 65 73 20 74 68 65  term matches the
e340: 20 70 72 65 66 69 78 2c 20 73 6f 72 74 20 74 68   prefix, sort th
e350: 65 20 46 74 73 33 48 61 73 68 45 6c 65 6d 0a 20  e Fts3HashElem. 
e360: 20 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e     ** objects in
e370: 20 74 65 72 6d 20 6f 72 64 65 72 20 75 73 69 6e   term order usin
e380: 67 20 71 73 6f 72 74 28 29 2e 20 54 68 69 73 20  g qsort(). This 
e390: 75 73 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f  uses the same co
e3a0: 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2a 20  mparison.    ** 
e3b0: 63 61 6c 6c 62 61 63 6b 20 61 73 20 69 73 20 75  callback as is u
e3c0: 73 65 64 20 77 68 65 6e 20 66 6c 75 73 68 69 6e  sed when flushin
e3d0: 67 20 74 65 72 6d 73 20 74 6f 20 64 69 73 6b 2e  g terms to disk.
e3e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
e3f0: 6e 45 6c 65 6d 3e 31 20 29 7b 0a 20 20 20 20 20  nElem>1 ){.     
e400: 20 71 73 6f 72 74 28 61 45 6c 65 6d 2c 20 6e 45   qsort(aElem, nE
e410: 6c 65 6d 2c 20 73 69 7a 65 6f 66 28 46 74 73 33  lem, sizeof(Fts3
e420: 48 61 73 68 45 6c 65 6d 20 2a 29 2c 20 66 74 73  HashElem *), fts
e430: 33 43 6f 6d 70 61 72 65 45 6c 65 6d 42 79 54 65  3CompareElemByTe
e440: 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65  rm);.    }..  }e
e450: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
e460: 71 75 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c  query is a simpl
e470: 65 20 74 65 72 6d 20 6c 6f 6f 6b 75 70 20 74 68  e term lookup th
e480: 61 74 20 6d 61 74 63 68 65 73 20 61 74 20 6d 6f  at matches at mo
e490: 73 74 20 6f 6e 65 20 74 65 72 6d 20 69 6e 0a 20  st one term in. 
e4a0: 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e     ** the index.
e4b0: 20 41 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71   All that is req
e4c0: 75 69 72 65 64 20 69 73 20 61 20 73 74 72 61 69  uired is a strai
e4d0: 67 68 74 20 68 61 73 68 2d 6c 6f 6f 6b 75 70 2e  ght hash-lookup.
e4e0: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
e4f0: 42 65 63 61 75 73 65 20 74 68 65 20 73 74 61 63  Because the stac
e500: 6b 20 61 64 64 72 65 73 73 20 6f 66 20 70 45 20  k address of pE 
e510: 6d 61 79 20 62 65 20 61 63 63 65 73 73 65 64 20  may be accessed 
e520: 76 69 61 20 74 68 65 20 61 45 6c 65 6d 20 70 6f  via the aElem po
e530: 69 6e 74 65 72 0a 20 20 20 20 2a 2a 20 62 65 6c  inter.    ** bel
e540: 6f 77 2c 20 74 68 65 20 22 46 74 73 33 48 61 73  ow, the "Fts3Has
e550: 68 45 6c 65 6d 20 2a 70 45 22 20 6d 75 73 74 20  hElem *pE" must 
e560: 62 65 20 64 65 63 6c 61 72 65 64 20 73 6f 20 74  be declared so t
e570: 68 61 74 20 69 74 20 69 73 20 76 61 6c 69 64 0a  hat it is valid.
e580: 20 20 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68      ** within th
e590: 69 73 20 65 6e 74 69 72 65 20 66 75 6e 63 74 69  is entire functi
e5a0: 6f 6e 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 69  on, not just thi
e5b0: 73 20 22 65 6c 73 65 7b 2e 2e 2e 7d 22 20 62 6c  s "else{...}" bl
e5c0: 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ock..    */.    
e5d0: 70 45 20 3d 20 66 74 73 33 48 61 73 68 46 69 6e  pE = fts3HashFin
e5e0: 64 45 6c 65 6d 28 70 48 61 73 68 2c 20 7a 54 65  dElem(pHash, zTe
e5f0: 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20  rm, nTerm);.    
e600: 69 66 28 20 70 45 20 29 7b 0a 20 20 20 20 20 20  if( pE ){.      
e610: 61 45 6c 65 6d 20 3d 20 26 70 45 3b 0a 20 20 20  aElem = &pE;.   
e620: 20 20 20 6e 45 6c 65 6d 20 3d 20 31 3b 0a 20 20     nElem = 1;.  
e630: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e    }.  }..  if( n
e640: 45 6c 65 6d 3e 30 20 29 7b 0a 20 20 20 20 69 6e  Elem>0 ){.    in
e650: 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66  t nByte = sizeof
e660: 28 46 74 73 33 53 65 67 52 65 61 64 65 72 29 20  (Fts3SegReader) 
e670: 2b 20 28 6e 45 6c 65 6d 2b 31 29 2a 73 69 7a 65  + (nElem+1)*size
e680: 6f 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20  of(Fts3HashElem 
e690: 2a 29 3b 0a 20 20 20 20 70 52 65 61 64 65 72 20  *);.    pReader 
e6a0: 3d 20 28 46 74 73 33 53 65 67 52 65 61 64 65 72  = (Fts3SegReader
e6b0: 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
e6c0: 63 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  c(nByte);.    if
e6d0: 28 20 21 70 52 65 61 64 65 72 20 29 7b 0a 20 20  ( !pReader ){.  
e6e0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e6f0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
e700: 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
e710: 52 65 61 64 65 72 2c 20 30 2c 20 6e 42 79 74 65  Reader, 0, nByte
e720: 29 3b 0a 20 20 20 20 20 20 70 52 65 61 64 65 72  );.      pReader
e730: 2d 3e 69 49 64 78 20 3d 20 30 78 37 46 46 46 46  ->iIdx = 0x7FFFF
e740: 46 46 46 3b 0a 20 20 20 20 20 20 70 52 65 61 64  FFF;.      pRead
e750: 65 72 2d 3e 70 70 4e 65 78 74 45 6c 65 6d 20 3d  er->ppNextElem =
e760: 20 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a   (Fts3HashElem *
e770: 2a 29 26 70 52 65 61 64 65 72 5b 31 5d 3b 0a 20  *)&pReader[1];. 
e780: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 52 65 61       memcpy(pRea
e790: 64 65 72 2d 3e 70 70 4e 65 78 74 45 6c 65 6d 2c  der->ppNextElem,
e7a0: 20 61 45 6c 65 6d 2c 20 6e 45 6c 65 6d 2a 73 69   aElem, nElem*si
e7b0: 7a 65 6f 66 28 46 74 73 33 48 61 73 68 45 6c 65  zeof(Fts3HashEle
e7c0: 6d 20 2a 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  m *));.    }.  }
e7d0: 0a 0a 20 20 69 66 28 20 62 50 72 65 66 69 78 20  ..  if( bPrefix 
e7e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
e7f0: 72 65 65 28 61 45 6c 65 6d 29 3b 0a 20 20 7d 0a  ree(aElem);.  }.
e800: 20 20 2a 70 70 52 65 61 64 65 72 20 3d 20 70 52    *ppReader = pR
e810: 65 61 64 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  eader;.  return 
e820: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  rc;.}../*.** Com
e830: 70 61 72 65 20 74 68 65 20 65 6e 74 72 69 65 73  pare the entries
e840: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
e850: 77 6f 20 46 74 73 33 53 65 67 52 65 61 64 65 72  wo Fts3SegReader
e860: 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 2a 2a   structures. .**
e870: 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61   Comparison is a
e880: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
e890: 20 20 20 31 29 20 45 4f 46 20 69 73 20 67 72 65     1) EOF is gre
e8a0: 61 74 65 72 20 74 68 61 6e 20 6e 6f 74 20 45 4f  ater than not EO
e8b0: 46 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 54 68  F..**.**   2) Th
e8c0: 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 73 20  e current terms 
e8d0: 28 69 66 20 61 6e 79 29 20 61 72 65 20 63 6f 6d  (if any) are com
e8e0: 70 61 72 65 64 20 75 73 69 6e 67 20 6d 65 6d 63  pared using memc
e8f0: 6d 70 28 29 2e 20 49 66 20 6f 6e 65 0a 2a 2a 20  mp(). If one.** 
e900: 20 20 20 20 20 74 65 72 6d 20 69 73 20 61 20 70       term is a p
e910: 72 65 66 69 78 20 6f 66 20 61 6e 6f 74 68 65 72  refix of another
e920: 2c 20 74 68 65 20 6c 6f 6e 67 65 72 20 74 65 72  , the longer ter
e930: 6d 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  m is considered 
e940: 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c 61 72 67  the.**      larg
e950: 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 29 20 42  er..**.**   3) B
e960: 79 20 73 65 67 6d 65 6e 74 20 61 67 65 2e 20 41  y segment age. A
e970: 6e 20 6f 6c 64 65 72 20 73 65 67 6d 65 6e 74 20  n older segment 
e980: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 6c 61  is considered la
e990: 72 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rger..*/.static 
e9a0: 69 6e 74 20 66 74 73 33 53 65 67 52 65 61 64 65  int fts3SegReade
e9b0: 72 43 6d 70 28 46 74 73 33 53 65 67 52 65 61 64  rCmp(Fts3SegRead
e9c0: 65 72 20 2a 70 4c 68 73 2c 20 46 74 73 33 53 65  er *pLhs, Fts3Se
e9d0: 67 52 65 61 64 65 72 20 2a 70 52 68 73 29 7b 0a  gReader *pRhs){.
e9e0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
e9f0: 70 4c 68 73 2d 3e 61 4e 6f 64 65 20 26 26 20 70  pLhs->aNode && p
ea00: 52 68 73 2d 3e 61 4e 6f 64 65 20 29 7b 0a 20 20  Rhs->aNode ){.  
ea10: 20 20 69 6e 74 20 72 63 32 20 3d 20 70 4c 68 73    int rc2 = pLhs
ea20: 2d 3e 6e 54 65 72 6d 20 2d 20 70 52 68 73 2d 3e  ->nTerm - pRhs->
ea30: 6e 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 72  nTerm;.    if( r
ea40: 63 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63  c2<0 ){.      rc
ea50: 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 68 73 2d 3e   = memcmp(pLhs->
ea60: 7a 54 65 72 6d 2c 20 70 52 68 73 2d 3e 7a 54 65  zTerm, pRhs->zTe
ea70: 72 6d 2c 20 70 4c 68 73 2d 3e 6e 54 65 72 6d 29  rm, pLhs->nTerm)
ea80: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ea90: 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70     rc = memcmp(p
eaa0: 4c 68 73 2d 3e 7a 54 65 72 6d 2c 20 70 52 68 73  Lhs->zTerm, pRhs
eab0: 2d 3e 7a 54 65 72 6d 2c 20 70 52 68 73 2d 3e 6e  ->zTerm, pRhs->n
eac0: 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Term);.    }.   
ead0: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
eae0: 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
eaf0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
eb00: 20 72 63 20 3d 20 28 70 4c 68 73 2d 3e 61 4e 6f   rc = (pLhs->aNo
eb10: 64 65 3d 3d 30 29 20 2d 20 28 70 52 68 73 2d 3e  de==0) - (pRhs->
eb20: 61 4e 6f 64 65 3d 3d 30 29 3b 0a 20 20 7d 0a 20  aNode==0);.  }. 
eb30: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
eb40: 20 20 72 63 20 3d 20 70 52 68 73 2d 3e 69 49 64    rc = pRhs->iId
eb50: 78 20 2d 20 70 4c 68 73 2d 3e 69 49 64 78 3b 0a  x - pLhs->iIdx;.
eb60: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63    }.  assert( rc
eb70: 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
eb80: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 64  rc;.}../*.** A d
eb90: 69 66 66 65 72 65 6e 74 20 63 6f 6d 70 61 72 69  ifferent compari
eba0: 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  son function for
ebb0: 20 53 65 67 52 65 61 64 65 72 20 73 74 72 75 63   SegReader struc
ebc0: 74 75 72 65 73 2e 20 49 6e 20 74 68 69 73 0a 2a  tures. In this.*
ebd0: 2a 20 76 65 72 73 69 6f 6e 2c 20 69 74 20 69 73  * version, it is
ebe0: 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 65 61   assumed that ea
ebf0: 63 68 20 53 65 67 52 65 61 64 65 72 20 70 6f 69  ch SegReader poi
ec00: 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  nts to an entry 
ec10: 69 6e 0a 2a 2a 20 61 20 64 6f 63 6c 69 73 74 20  in.** a doclist 
ec20: 66 6f 72 20 69 64 65 6e 74 69 63 61 6c 20 74 65  for identical te
ec30: 72 6d 73 2e 20 43 6f 6d 70 61 72 69 73 6f 6e 20  rms. Comparison 
ec40: 69 73 20 6d 61 64 65 20 61 73 20 66 6f 6c 6c 6f  is made as follo
ec50: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 45  ws:.**.**   1) E
ec60: 4f 46 20 28 65 6e 64 20 6f 66 20 64 6f 63 6c 69  OF (end of docli
ec70: 73 74 20 69 6e 20 74 68 69 73 20 63 61 73 65 29  st in this case)
ec80: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
ec90: 20 6e 6f 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20   not EOF..**.** 
eca0: 20 20 32 29 20 42 79 20 63 75 72 72 65 6e 74 20    2) By current 
ecb0: 64 6f 63 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 33  docid..**.**   3
ecc0: 29 20 42 79 20 73 65 67 6d 65 6e 74 20 61 67 65  ) By segment age
ecd0: 2e 20 41 6e 20 6f 6c 64 65 72 20 73 65 67 6d 65  . An older segme
ece0: 6e 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  nt is considered
ecf0: 20 6c 61 72 67 65 72 2e 0a 2a 2f 0a 73 74 61 74   larger..*/.stat
ed00: 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65  ic int fts3SegRe
ed10: 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 28 46  aderDoclistCmp(F
ed20: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 4c  ts3SegReader *pL
ed30: 68 73 2c 20 46 74 73 33 53 65 67 52 65 61 64 65  hs, Fts3SegReade
ed40: 72 20 2a 70 52 68 73 29 7b 0a 20 20 69 6e 74 20  r *pRhs){.  int 
ed50: 72 63 20 3d 20 28 70 4c 68 73 2d 3e 70 4f 66 66  rc = (pLhs->pOff
ed60: 73 65 74 4c 69 73 74 3d 3d 30 29 2d 28 70 52 68  setList==0)-(pRh
ed70: 73 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3d 3d  s->pOffsetList==
ed80: 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  0);.  if( rc==0 
ed90: 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 68 73 2d  ){.    if( pLhs-
eda0: 3e 69 44 6f 63 69 64 3d 3d 70 52 68 73 2d 3e 69  >iDocid==pRhs->i
edb0: 44 6f 63 69 64 20 29 7b 0a 20 20 20 20 20 20 72  Docid ){.      r
edc0: 63 20 3d 20 70 52 68 73 2d 3e 69 49 64 78 20 2d  c = pRhs->iIdx -
edd0: 20 70 4c 68 73 2d 3e 69 49 64 78 3b 0a 20 20 20   pLhs->iIdx;.   
ede0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
edf0: 20 3d 20 28 70 4c 68 73 2d 3e 69 44 6f 63 69 64   = (pLhs->iDocid
ee00: 20 3e 20 70 52 68 73 2d 3e 69 44 6f 63 69 64 29   > pRhs->iDocid)
ee10: 20 3f 20 31 20 3a 20 2d 31 3b 0a 20 20 20 20 7d   ? 1 : -1;.    }
ee20: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
ee30: 4c 68 73 2d 3e 61 4e 6f 64 65 20 26 26 20 70 52  Lhs->aNode && pR
ee40: 68 73 2d 3e 61 4e 6f 64 65 20 29 3b 0a 20 20 72  hs->aNode );.  r
ee50: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74  eturn rc;.}.stat
ee60: 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65  ic int fts3SegRe
ee70: 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 52 65  aderDoclistCmpRe
ee80: 76 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20  v(Fts3SegReader 
ee90: 2a 70 4c 68 73 2c 20 46 74 73 33 53 65 67 52 65  *pLhs, Fts3SegRe
eea0: 61 64 65 72 20 2a 70 52 68 73 29 7b 0a 20 20 69  ader *pRhs){.  i
eeb0: 6e 74 20 72 63 20 3d 20 28 70 4c 68 73 2d 3e 70  nt rc = (pLhs->p
eec0: 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30 29 2d 28  OffsetList==0)-(
eed0: 70 52 68 73 2d 3e 70 4f 66 66 73 65 74 4c 69 73  pRhs->pOffsetLis
eee0: 74 3d 3d 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  t==0);.  if( rc=
eef0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4c  =0 ){.    if( pL
ef00: 68 73 2d 3e 69 44 6f 63 69 64 3d 3d 70 52 68 73  hs->iDocid==pRhs
ef10: 2d 3e 69 44 6f 63 69 64 20 29 7b 0a 20 20 20 20  ->iDocid ){.    
ef20: 20 20 72 63 20 3d 20 70 52 68 73 2d 3e 69 49 64    rc = pRhs->iId
ef30: 78 20 2d 20 70 4c 68 73 2d 3e 69 49 64 78 3b 0a  x - pLhs->iIdx;.
ef40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ef50: 20 72 63 20 3d 20 28 70 4c 68 73 2d 3e 69 44 6f   rc = (pLhs->iDo
ef60: 63 69 64 20 3c 20 70 52 68 73 2d 3e 69 44 6f 63  cid < pRhs->iDoc
ef70: 69 64 29 20 3f 20 31 20 3a 20 2d 31 3b 0a 20 20  id) ? 1 : -1;.  
ef80: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
ef90: 28 20 70 4c 68 73 2d 3e 61 4e 6f 64 65 20 26 26  ( pLhs->aNode &&
efa0: 20 70 52 68 73 2d 3e 61 4e 6f 64 65 20 29 3b 0a   pRhs->aNode );.
efb0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
efc0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
efd0: 65 20 74 65 72 6d 20 74 68 61 74 20 74 68 65 20  e term that the 
efe0: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 6f 62  Fts3SegReader ob
eff0: 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
f000: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
f010: 74 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 77  t.** points to w
f020: 69 74 68 20 74 68 65 20 74 65 72 6d 20 73 70 65  ith the term spe
f030: 63 69 66 69 65 64 20 62 79 20 61 72 67 75 6d 65  cified by argume
f040: 6e 74 73 20 7a 54 65 72 6d 20 61 6e 64 20 6e 54  nts zTerm and nT
f050: 65 72 6d 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  erm. .**.** If t
f060: 68 65 20 70 53 65 67 20 69 74 65 72 61 74 6f 72  he pSeg iterator
f070: 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 45   is already at E
f080: 4f 46 2c 20 72 65 74 75 72 6e 20 30 2e 20 4f 74  OF, return 0. Ot
f090: 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 0a  herwise, return.
f0a0: 2a 2a 20 2d 76 65 20 69 66 20 74 68 65 20 70 53  ** -ve if the pS
f0b0: 65 67 20 74 65 72 6d 20 69 73 20 6c 65 73 73 20  eg term is less 
f0c0: 74 68 61 6e 20 7a 54 65 72 6d 2f 6e 54 65 72 6d  than zTerm/nTerm
f0d0: 2c 20 30 20 69 66 20 74 68 65 20 74 77 6f 20 74  , 0 if the two t
f0e0: 65 72 6d 73 20 61 72 65 0a 2a 2a 20 65 71 75 61  erms are.** equa
f0f0: 6c 2c 20 6f 72 20 2b 76 65 20 69 66 20 74 68 65  l, or +ve if the
f100: 20 70 53 65 67 20 74 65 72 6d 20 69 73 20 67 72   pSeg term is gr
f110: 65 61 74 65 72 20 74 68 61 6e 20 7a 54 65 72 6d  eater than zTerm
f120: 2f 6e 54 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69  /nTerm..*/.stati
f130: 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61  c int fts3SegRea
f140: 64 65 72 54 65 72 6d 43 6d 70 28 0a 20 20 46 74  derTermCmp(.  Ft
f150: 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65  s3SegReader *pSe
f160: 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  g,            /*
f170: 20 53 65 67 6d 65 6e 74 20 72 65 61 64 65 72 20   Segment reader 
f180: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73  object */.  cons
f190: 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20  t char *zTerm,  
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f1b0: 65 72 6d 20 74 6f 20 63 6f 6d 70 61 72 65 20 74  erm to compare t
f1c0: 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  o */.  int nTerm
f1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1e0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
f1f0: 66 20 74 65 72 6d 20 7a 54 65 72 6d 20 69 6e 20  f term zTerm in 
f200: 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  bytes */.){.  in
f210: 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 69 66 28  t res = 0;.  if(
f220: 20 70 53 65 67 2d 3e 61 4e 6f 64 65 20 29 7b 0a   pSeg->aNode ){.
f230: 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 6e 54      if( pSeg->nT
f240: 65 72 6d 3e 6e 54 65 72 6d 20 29 7b 0a 20 20 20  erm>nTerm ){.   
f250: 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28     res = memcmp(
f260: 70 53 65 67 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65  pSeg->zTerm, zTe
f270: 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20  rm, nTerm);.    
f280: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73  }else{.      res
f290: 20 3d 20 6d 65 6d 63 6d 70 28 70 53 65 67 2d 3e   = memcmp(pSeg->
f2a0: 7a 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 70 53  zTerm, zTerm, pS
f2b0: 65 67 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20  eg->nTerm);.    
f2c0: 7d 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30  }.    if( res==0
f2d0: 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20   ){.      res = 
f2e0: 70 53 65 67 2d 3e 6e 54 65 72 6d 2d 6e 54 65 72  pSeg->nTerm-nTer
f2f0: 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  m;.    }.  }.  r
f300: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
f310: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 61 70 53  .** Argument apS
f320: 65 67 6d 65 6e 74 20 69 73 20 61 6e 20 61 72 72  egment is an arr
f330: 61 79 20 6f 66 20 6e 53 65 67 6d 65 6e 74 20 65  ay of nSegment e
f340: 6c 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 6b  lements. It is k
f350: 6e 6f 77 6e 20 74 68 61 74 0a 2a 2a 20 74 68 65  nown that.** the
f360: 20 66 69 6e 61 6c 20 28 6e 53 65 67 6d 65 6e 74   final (nSegment
f370: 2d 6e 53 75 73 70 65 63 74 29 20 6d 65 6d 62 65  -nSuspect) membe
f380: 72 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  rs are already i
f390: 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 2a  n sorted order.*
f3a0: 2a 20 28 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  * (according to 
f3b0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66  the comparison f
f3c0: 75 6e 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 64  unction provided
f3d0: 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ). This function
f3e0: 20 73 68 75 66 66 6c 65 73 0a 2a 2a 20 74 68 65   shuffles.** the
f3f0: 20 61 72 72 61 79 20 61 72 6f 75 6e 64 20 75 6e   array around un
f400: 74 69 6c 20 61 6c 6c 20 65 6e 74 72 69 65 73 20  til all entries 
f410: 61 72 65 20 69 6e 20 73 6f 72 74 65 64 20 6f 72  are in sorted or
f420: 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  der..*/.static v
f430: 6f 69 64 20 66 74 73 33 53 65 67 52 65 61 64 65  oid fts3SegReade
f440: 72 53 6f 72 74 28 0a 20 20 46 74 73 33 53 65 67  rSort(.  Fts3Seg
f450: 52 65 61 64 65 72 20 2a 2a 61 70 53 65 67 6d 65  Reader **apSegme
f460: 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
f470: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
f480: 20 74 6f 20 73 6f 72 74 20 65 6e 74 72 69 65 73   to sort entries
f490: 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65   of */.  int nSe
f4a0: 67 6d 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20  gment,          
f4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
f4d0: 6f 66 20 61 70 53 65 67 6d 65 6e 74 20 61 72 72  of apSegment arr
f4e0: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 73  ay */.  int nSus
f4f0: 70 65 63 74 2c 20 20 20 20 20 20 20 20 20 20 20  pect,           
f500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f510: 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f 72 74         /* Unsort
f520: 65 64 20 65 6e 74 72 79 20 63 6f 75 6e 74 20 2a  ed entry count *
f530: 2f 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70 29 28  /.  int (*xCmp)(
f540: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2c  Fts3SegReader *,
f550: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
f560: 29 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e  )  /* Comparison
f570: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
f580: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
f590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5a0: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
f5b0: 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 61 73 73  riable */..  ass
f5c0: 65 72 74 28 20 6e 53 75 73 70 65 63 74 3c 3d 6e  ert( nSuspect<=n
f5d0: 53 65 67 6d 65 6e 74 20 29 3b 0a 0a 20 20 69 66  Segment );..  if
f5e0: 28 20 6e 53 75 73 70 65 63 74 3d 3d 6e 53 65 67  ( nSuspect==nSeg
f5f0: 6d 65 6e 74 20 29 20 6e 53 75 73 70 65 63 74 2d  ment ) nSuspect-
f600: 2d 3b 0a 20 20 66 6f 72 28 69 3d 6e 53 75 73 70  -;.  for(i=nSusp
f610: 65 63 74 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  ect-1; i>=0; i--
f620: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  ){.    int j;.  
f630: 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c 28 6e 53    for(j=i; j<(nS
f640: 65 67 6d 65 6e 74 2d 31 29 3b 20 6a 2b 2b 29 7b  egment-1); j++){
f650: 0a 20 20 20 20 20 20 46 74 73 33 53 65 67 52 65  .      Fts3SegRe
f660: 61 64 65 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20  ader *pTmp;.    
f670: 20 20 69 66 28 20 78 43 6d 70 28 61 70 53 65 67    if( xCmp(apSeg
f680: 6d 65 6e 74 5b 6a 5d 2c 20 61 70 53 65 67 6d 65  ment[j], apSegme
f690: 6e 74 5b 6a 2b 31 5d 29 3c 30 20 29 20 62 72 65  nt[j+1])<0 ) bre
f6a0: 61 6b 3b 0a 20 20 20 20 20 20 70 54 6d 70 20 3d  ak;.      pTmp =
f6b0: 20 61 70 53 65 67 6d 65 6e 74 5b 6a 2b 31 5d 3b   apSegment[j+1];
f6c0: 0a 20 20 20 20 20 20 61 70 53 65 67 6d 65 6e 74  .      apSegment
f6d0: 5b 6a 2b 31 5d 20 3d 20 61 70 53 65 67 6d 65 6e  [j+1] = apSegmen
f6e0: 74 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 70 53 65  t[j];.      apSe
f6f0: 67 6d 65 6e 74 5b 6a 5d 20 3d 20 70 54 6d 70 3b  gment[j] = pTmp;
f700: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e  .    }.  }..#ifn
f710: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20  def NDEBUG.  /* 
f720: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c  Check that the l
f730: 69 73 74 20 72 65 61 6c 6c 79 20 69 73 20 73 6f  ist really is so
f740: 72 74 65 64 20 6e 6f 77 2e 20 2a 2f 0a 20 20 66  rted now. */.  f
f750: 6f 72 28 69 3d 30 3b 20 69 3c 28 6e 53 75 73 70  or(i=0; i<(nSusp
f760: 65 63 74 2d 31 29 3b 20 69 2b 2b 29 7b 0a 20 20  ect-1); i++){.  
f770: 20 20 61 73 73 65 72 74 28 20 78 43 6d 70 28 61    assert( xCmp(a
f780: 70 53 65 67 6d 65 6e 74 5b 69 5d 2c 20 61 70 53  pSegment[i], apS
f790: 65 67 6d 65 6e 74 5b 69 2b 31 5d 29 3c 30 20 29  egment[i+1])<0 )
f7a0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
f7b0: 2f 2a 20 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20  /* .** Insert a 
f7c0: 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
f7d0: 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65  %_segments table
f7e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f7f0: 66 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74  fts3WriteSegment
f800: 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
f810: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f820: 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74      /* Virtual t
f830: 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
f840: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
f850: 42 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  Block,          
f860: 20 2f 2a 20 42 6c 6f 63 6b 20 69 64 20 66 6f 72   /* Block id for
f870: 20 6e 65 77 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20   new block */.  
f880: 63 68 61 72 20 2a 7a 2c 20 20 20 20 20 20 20 20  char *z,        
f890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8a0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
f8b0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
f8c0: 62 6c 6f 63 6b 20 64 61 74 61 20 2a 2f 0a 20 20  block data */.  
f8d0: 69 6e 74 20 6e 20 20 20 20 20 20 20 20 20 20 20  int n           
f8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8f0: 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
f900: 72 20 7a 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  r z in bytes */.
f910: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
f920: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
f930: 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
f940: 28 70 2c 20 53 51 4c 5f 49 4e 53 45 52 54 5f 53  (p, SQL_INSERT_S
f950: 45 47 4d 45 4e 54 53 2c 20 26 70 53 74 6d 74 2c  EGMENTS, &pStmt,
f960: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
f970: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f980: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
f990: 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 69 42 6c  64(pStmt, 1, iBl
f9a0: 6f 63 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ock);.    sqlite
f9b0: 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d  3_bind_blob(pStm
f9c0: 74 2c 20 32 2c 20 7a 2c 20 6e 2c 20 53 51 4c 49  t, 2, z, n, SQLI
f9d0: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
f9e0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
f9f0: 6d 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  mt);.    rc = sq
fa00: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
fa10: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
fa20: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69   rc;.}../*.** Fi
fa30: 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  nd the largest r
fa40: 65 6c 61 74 69 76 65 20 6c 65 76 65 6c 20 6e 75  elative level nu
fa50: 6d 62 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c  mber in the tabl
fa60: 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  e. If successful
fa70: 2c 20 73 65 74 0a 2a 2a 20 2a 70 6e 4d 61 78 20  , set.** *pnMax 
fa80: 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e  to this value an
fa90: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
faa0: 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  OK. Otherwise, i
fab0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
fac0: 73 2c 0a 2a 2a 20 73 65 74 20 2a 70 6e 4d 61 78  s,.** set *pnMax
fad0: 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 72 65 74   to zero and ret
fae0: 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
faf0: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  ror code..*/.int
fb00: 20 73 71 6c 69 74 65 33 46 74 73 33 4d 61 78 4c   sqlite3Fts3MaxL
fb10: 65 76 65 6c 28 46 74 73 33 54 61 62 6c 65 20 2a  evel(Fts3Table *
fb20: 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 29 7b 0a  p, int *pnMax){.
fb30: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
fb40: 6d 78 4c 65 76 65 6c 20 3d 20 30 3b 0a 20 20 73  mxLevel = 0;.  s
fb50: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
fb60: 6d 74 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20  mt = 0;..  rc = 
fb70: 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
fb80: 51 4c 5f 53 45 4c 45 43 54 5f 4d 58 4c 45 56 45  QL_SELECT_MXLEVE
fb90: 4c 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  L, &pStmt, 0);. 
fba0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
fbb0: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51  OK ){.    if( SQ
fbc0: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
fbd0: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
fbe0: 0a 20 20 20 20 20 20 6d 78 4c 65 76 65 6c 20 3d  .      mxLevel =
fbf0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
fc00: 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  int(pStmt, 0);. 
fc10: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
fc20: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
fc30: 74 29 3b 0a 20 20 7d 0a 20 20 2a 70 6e 4d 61 78  t);.  }.  *pnMax
fc40: 20 3d 20 6d 78 4c 65 76 65 6c 3b 0a 20 20 72 65   = mxLevel;.  re
fc50: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
fc60: 2a 2a 20 49 6e 73 65 72 74 20 61 20 72 65 63 6f  ** Insert a reco
fc70: 72 64 20 69 6e 74 6f 20 74 68 65 20 25 5f 73 65  rd into the %_se
fc80: 67 64 69 72 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  gdir table..*/.s
fc90: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 57 72  tatic int fts3Wr
fca0: 69 74 65 53 65 67 64 69 72 28 0a 20 20 46 74 73  iteSegdir(.  Fts
fcb0: 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
fcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fcd0: 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  Virtual table ha
fce0: 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ndle */.  sqlite
fcf0: 33 5f 69 6e 74 36 34 20 69 4c 65 76 65 6c 2c 20  3_int64 iLevel, 
fd00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
fd10: 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22 20 66  ue for "level" f
fd20: 69 65 6c 64 20 28 61 62 73 6f 6c 75 74 65 20 6c  ield (absolute l
fd30: 65 76 65 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 69  evel) */.  int i
fd40: 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
fd50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
fd60: 6c 75 65 20 66 6f 72 20 22 69 64 78 22 20 66 69  lue for "idx" fi
fd70: 65 6c 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  eld */.  sqlite3
fd80: 5f 69 6e 74 36 34 20 69 53 74 61 72 74 42 6c 6f  _int64 iStartBlo
fd90: 63 6b 2c 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  ck,      /* Valu
fda0: 65 20 66 6f 72 20 22 73 74 61 72 74 5f 62 6c 6f  e for "start_blo
fdb0: 63 6b 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 73  ck" field */.  s
fdc0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 65  qlite3_int64 iLe
fdd0: 61 66 45 6e 64 42 6c 6f 63 6b 2c 20 20 20 20 2f  afEndBlock,    /
fde0: 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 6c 65 61  * Value for "lea
fdf0: 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 22 20 66  ves_end_block" f
fe00: 69 65 6c 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ield */.  sqlite
fe10: 33 5f 69 6e 74 36 34 20 69 45 6e 64 42 6c 6f 63  3_int64 iEndBloc
fe20: 6b 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  k,        /* Val
fe30: 75 65 20 66 6f 72 20 22 65 6e 64 5f 62 6c 6f 63  ue for "end_bloc
fe40: 6b 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 63 68  k" field */.  ch
fe50: 61 72 20 2a 7a 52 6f 6f 74 2c 20 20 20 20 20 20  ar *zRoot,      
fe60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fe70: 20 42 6c 6f 62 20 76 61 6c 75 65 20 66 6f 72 20   Blob value for 
fe80: 22 72 6f 6f 74 22 20 66 69 65 6c 64 20 2a 2f 0a  "root" field */.
fe90: 20 20 69 6e 74 20 6e 52 6f 6f 74 20 20 20 20 20    int nRoot     
fea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
feb0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
fec0: 79 74 65 73 20 69 6e 20 62 75 66 66 65 72 20 7a  ytes in buffer z
fed0: 52 6f 6f 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  Root */.){.  sql
fee0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
fef0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73  ;.  int rc = fts
ff00: 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
ff10: 49 4e 53 45 52 54 5f 53 45 47 44 49 52 2c 20 26  INSERT_SEGDIR, &
ff20: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
ff30: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
ff40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  {.    sqlite3_bi
ff50: 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  nd_int64(pStmt, 
ff60: 31 2c 20 69 4c 65 76 65 6c 29 3b 0a 20 20 20 20  1, iLevel);.    
ff70: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
ff80: 28 70 53 74 6d 74 2c 20 32 2c 20 69 49 64 78 29  (pStmt, 2, iIdx)
ff90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
ffa0: 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  nd_int64(pStmt, 
ffb0: 33 2c 20 69 53 74 61 72 74 42 6c 6f 63 6b 29 3b  3, iStartBlock);
ffc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
ffd0: 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 34  d_int64(pStmt, 4
ffe0: 2c 20 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 29  , iLeafEndBlock)
fff0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
10000 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  nd_int64(pStmt, 
10010 35 2c 20 69 45 6e 64 42 6c 6f 63 6b 29 3b 0a 20  5, iEndBlock);. 
10020 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
10030 62 6c 6f 62 28 70 53 74 6d 74 2c 20 36 2c 20 7a  blob(pStmt, 6, z
10040 52 6f 6f 74 2c 20 6e 52 6f 6f 74 2c 20 53 51 4c  Root, nRoot, SQL
10050 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
10060 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
10070 74 6d 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  tmt);.    rc = s
10080 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
10090 6d 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  mt);.  }.  retur
100a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
100b0 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
100c0 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65  f the common pre
100d0 66 69 78 20 28 69 66 20 61 6e 79 29 20 73 68 61  fix (if any) sha
100e0 72 65 64 20 62 79 20 7a 50 72 65 76 20 61 6e 64  red by zPrev and
100f0 0a 2a 2a 20 7a 4e 65 78 74 2c 20 69 6e 20 62 79  .** zNext, in by
10100 74 65 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  tes. For example
10110 2c 20 0a 2a 2a 0a 2a 2a 20 20 20 66 74 73 33 50  , .**.**   fts3P
10120 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 22 61  refixCompress("a
10130 62 63 22 2c 20 33 2c 20 22 61 62 63 64 65 66 22  bc", 3, "abcdef"
10140 2c 20 36 29 20 20 20 2f 2f 20 72 65 74 75 72 6e  , 6)   // return
10150 73 20 33 0a 2a 2a 20 20 20 66 74 73 33 50 72 65  s 3.**   fts3Pre
10160 66 69 78 43 6f 6d 70 72 65 73 73 28 22 61 62 58  fixCompress("abX
10170 22 2c 20 33 2c 20 22 61 62 63 64 65 66 22 2c 20  ", 3, "abcdef", 
10180 36 29 20 20 20 2f 2f 20 72 65 74 75 72 6e 73 20  6)   // returns 
10190 32 0a 2a 2a 20 20 20 66 74 73 33 50 72 65 66 69  2.**   fts3Prefi
101a0 78 43 6f 6d 70 72 65 73 73 28 22 61 62 58 22 2c  xCompress("abX",
101b0 20 33 2c 20 22 58 62 63 64 65 66 22 2c 20 36 29   3, "Xbcdef", 6)
101c0 20 20 20 2f 2f 20 72 65 74 75 72 6e 73 20 30 0a     // returns 0.
101d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
101e0 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73  s3PrefixCompress
101f0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
10200 7a 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20  zPrev,          
10210 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
10220 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f 75  ntaining previou
10230 73 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  s term */.  int 
10240 6e 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20  nPrev,          
10250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
10260 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 7a 50  ize of buffer zP
10270 72 65 76 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  rev in bytes */.
10280 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
10290 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ext,            
102a0 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
102b0 61 69 6e 69 6e 67 20 6e 65 78 74 20 74 65 72 6d  aining next term
102c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 78 74 20   */.  int nNext 
102d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102e0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
102f0 20 62 75 66 66 65 72 20 7a 4e 65 78 74 20 69 6e   buffer zNext in
10300 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69   bytes */.){.  i
10310 6e 74 20 6e 3b 0a 20 20 55 4e 55 53 45 44 5f 50  nt n;.  UNUSED_P
10320 41 52 41 4d 45 54 45 52 28 6e 4e 65 78 74 29 3b  ARAMETER(nNext);
10330 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 50  .  for(n=0; n<nP
10340 72 65 76 20 26 26 20 7a 50 72 65 76 5b 6e 5d 3d  rev && zPrev[n]=
10350 3d 7a 4e 65 78 74 5b 6e 5d 3b 20 6e 2b 2b 29 3b  =zNext[n]; n++);
10360 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
10370 2f 2a 0a 2a 2a 20 41 64 64 20 74 65 72 6d 20 7a  /*.** Add term z
10380 54 65 72 6d 20 74 6f 20 74 68 65 20 53 65 67 6d  Term to the Segm
10390 65 6e 74 4e 6f 64 65 2e 20 49 74 20 69 73 20 67  entNode. It is g
103a0 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 7a  uaranteed that z
103b0 54 65 72 6d 20 69 73 20 6c 61 72 67 65 72 0a 2a  Term is larger.*
103c0 2a 20 28 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  * (according to 
103d0 6d 65 6d 63 6d 70 29 20 74 68 61 6e 20 74 68 65  memcmp) than the
103e0 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 2e 0a   previous term..
103f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
10400 73 33 4e 6f 64 65 41 64 64 54 65 72 6d 28 0a 20  s3NodeAddTerm(. 
10410 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
10420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10430 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
10440 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 65  e handle */.  Se
10450 67 6d 65 6e 74 4e 6f 64 65 20 2a 2a 70 70 54 72  gmentNode **ppTr
10460 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ee,           /*
10470 20 49 4e 2f 4f 55 54 3a 20 53 65 67 6d 65 6e 74   IN/OUT: Segment
10480 4e 6f 64 65 20 68 61 6e 64 6c 65 20 2a 2f 20 0a  Node handle */ .
10490 20 20 69 6e 74 20 69 73 43 6f 70 79 54 65 72 6d    int isCopyTerm
104a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
104b0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 7a 54 65    /* True if zTe
104c0 72 6d 2f 6e 54 65 72 6d 20 69 73 20 74 72 61 6e  rm/nTerm is tran
104d0 73 69 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  sient */.  const
104e0 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20   char *zTerm,   
104f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
10500 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
10510 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d 20  containing term 
10520 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 20 20  */.  int nTerm  
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10540 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
10550 74 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f  term in bytes */
10560 0a 29 7b 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64  .){.  SegmentNod
10570 65 20 2a 70 54 72 65 65 20 3d 20 2a 70 70 54 72  e *pTree = *ppTr
10580 65 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ee;.  int rc;.  
10590 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 4e 65  SegmentNode *pNe
105a0 77 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 74  w;..  /* First t
105b0 72 79 20 74 6f 20 61 70 70 65 6e 64 20 74 68 65  ry to append the
105c0 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63 75 72   term to the cur
105d0 72 65 6e 74 20 6e 6f 64 65 2e 20 52 65 74 75 72  rent node. Retur
105e0 6e 20 65 61 72 6c 79 20 69 66 20 0a 20 20 2a 2a  n early if .  **
105f0 20 74 68 69 73 20 69 73 20 70 6f 73 73 69 62 6c   this is possibl
10600 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  e..  */.  if( pT
10610 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ree ){.    int n
10620 44 61 74 61 20 3d 20 70 54 72 65 65 2d 3e 6e 44  Data = pTree->nD
10630 61 74 61 3b 20 20 20 20 20 2f 2a 20 43 75 72 72  ata;     /* Curr
10640 65 6e 74 20 73 69 7a 65 20 6f 66 20 6e 6f 64 65  ent size of node
10650 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
10660 20 69 6e 74 20 6e 52 65 71 20 3d 20 6e 44 61 74   int nReq = nDat
10670 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a;             /
10680 2a 20 52 65 71 75 69 72 65 64 20 73 70 61 63 65  * Required space
10690 20 61 66 74 65 72 20 61 64 64 69 6e 67 20 7a 54   after adding zT
106a0 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  erm */.    int n
106b0 50 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20  Prefix;         
106c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
106d0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70  er of bytes of p
106e0 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f  refix compressio
106f0 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 75  n */.    int nSu
10700 66 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20  ffix;           
10710 20 20 20 20 20 20 20 2f 2a 20 53 75 66 66 69 78         /* Suffix
10720 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a 20 20 20 20   length */..    
10730 6e 50 72 65 66 69 78 20 3d 20 66 74 73 33 50 72  nPrefix = fts3Pr
10740 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70 54 72  efixCompress(pTr
10750 65 65 2d 3e 7a 54 65 72 6d 2c 20 70 54 72 65 65  ee->zTerm, pTree
10760 2d 3e 6e 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20  ->nTerm, zTerm, 
10770 6e 54 65 72 6d 29 3b 0a 20 20 20 20 6e 53 75 66  nTerm);.    nSuf
10780 66 69 78 20 3d 20 6e 54 65 72 6d 2d 6e 50 72 65  fix = nTerm-nPre
10790 66 69 78 3b 0a 0a 20 20 20 20 6e 52 65 71 20 2b  fix;..    nReq +
107a0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72  = sqlite3Fts3Var
107b0 69 6e 74 4c 65 6e 28 6e 50 72 65 66 69 78 29 2b  intLen(nPrefix)+
107c0 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e  sqlite3Fts3Varin
107d0 74 4c 65 6e 28 6e 53 75 66 66 69 78 29 2b 6e 53  tLen(nSuffix)+nS
107e0 75 66 66 69 78 3b 0a 20 20 20 20 69 66 28 20 6e  uffix;.    if( n
107f0 52 65 71 3c 3d 70 2d 3e 6e 4e 6f 64 65 53 69 7a  Req<=p->nNodeSiz
10800 65 20 7c 7c 20 21 70 54 72 65 65 2d 3e 7a 54 65  e || !pTree->zTe
10810 72 6d 20 29 7b 0a 0a 20 20 20 20 20 20 69 66 28  rm ){..      if(
10820 20 6e 52 65 71 3e 70 2d 3e 6e 4e 6f 64 65 53 69   nReq>p->nNodeSi
10830 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ze ){.        /*
10840 20 41 6e 20 75 6e 75 73 75 61 6c 20 63 61 73 65   An unusual case
10850 3a 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  : this is the fi
10860 72 73 74 20 74 65 72 6d 20 74 6f 20 62 65 20 61  rst term to be a
10870 64 64 65 64 20 74 6f 20 74 68 65 20 6e 6f 64 65  dded to the node
10880 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  .        ** and 
10890 74 68 65 20 73 74 61 74 69 63 20 6e 6f 64 65 20  the static node 
108a0 62 75 66 66 65 72 20 28 70 2d 3e 6e 4e 6f 64 65  buffer (p->nNode
108b0 53 69 7a 65 20 62 79 74 65 73 29 20 69 73 20 6e  Size bytes) is n
108c0 6f 74 20 6c 61 72 67 65 0a 20 20 20 20 20 20 20  ot large.       
108d0 20 2a 2a 20 65 6e 6f 75 67 68 2e 20 55 73 65 20   ** enough. Use 
108e0 61 20 73 65 70 61 72 61 74 65 6c 79 20 6d 61 6c  a separately mal
108f0 6c 6f 63 65 64 20 62 75 66 66 65 72 20 69 6e 73  loced buffer ins
10900 74 65 61 64 20 54 68 69 73 20 77 61 73 74 65 73  tead This wastes
10910 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 2d 3e 6e  .        ** p->n
10920 4e 6f 64 65 53 69 7a 65 20 62 79 74 65 73 2c 20  NodeSize bytes, 
10930 62 75 74 20 73 69 6e 63 65 20 74 68 69 73 20 73  but since this s
10940 63 65 6e 61 72 69 6f 20 6f 6e 6c 79 20 63 6f 6d  cenario only com
10950 65 73 20 61 62 6f 75 74 20 77 68 65 6e 0a 20 20  es about when.  
10960 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
10970 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 20 74 77  abase contain tw
10980 6f 20 74 65 72 6d 73 20 74 68 61 74 20 73 68 61  o terms that sha
10990 72 65 20 61 20 70 72 65 66 69 78 20 6f 66 20 61  re a prefix of a
109a0 6c 6d 6f 73 74 20 32 4b 42 2c 20 0a 20 20 20 20  lmost 2KB, .    
109b0 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 6e      ** this is n
109c0 6f 74 20 65 78 70 65 63 74 65 64 20 74 6f 20 62  ot expected to b
109d0 65 20 61 20 73 65 72 69 6f 75 73 20 70 72 6f 62  e a serious prob
109e0 6c 65 6d 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f  lem. .        */
109f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
10a00 20 70 54 72 65 65 2d 3e 61 44 61 74 61 3d 3d 28   pTree->aData==(
10a10 63 68 61 72 20 2a 29 26 70 54 72 65 65 5b 31 5d  char *)&pTree[1]
10a20 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 72 65   );.        pTre
10a30 65 2d 3e 61 44 61 74 61 20 3d 20 28 63 68 61 72  e->aData = (char
10a40 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
10a50 63 28 6e 52 65 71 29 3b 0a 20 20 20 20 20 20 20  c(nReq);.       
10a60 20 69 66 28 20 21 70 54 72 65 65 2d 3e 61 44 61   if( !pTree->aDa
10a70 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ta ){.          
10a80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
10a90 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  MEM;.        }. 
10aa0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
10ab0 28 20 70 54 72 65 65 2d 3e 7a 54 65 72 6d 20 29  ( pTree->zTerm )
10ac0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
10ad0 72 65 20 69 73 20 6e 6f 20 70 72 65 66 69 78 2d  re is no prefix-
10ae0 6c 65 6e 67 74 68 20 66 69 65 6c 64 20 66 6f 72  length field for
10af0 20 66 69 72 73 74 20 74 65 72 6d 20 69 6e 20 61   first term in a
10b00 20 6e 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20   node */.       
10b10 20 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69 74 65   nData += sqlite
10b20 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26  3Fts3PutVarint(&
10b30 70 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e 44 61  pTree->aData[nDa
10b40 74 61 5d 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20  ta], nPrefix);. 
10b50 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6e 44       }..      nD
10b60 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ata += sqlite3Ft
10b70 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 54 72  s3PutVarint(&pTr
10b80 65 65 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d  ee->aData[nData]
10b90 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 20 20  , nSuffix);.    
10ba0 20 20 6d 65 6d 63 70 79 28 26 70 54 72 65 65 2d    memcpy(&pTree-
10bb0 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 26  >aData[nData], &
10bc0 7a 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 2c 20  zTerm[nPrefix], 
10bd0 6e 53 75 66 66 69 78 29 3b 0a 20 20 20 20 20 20  nSuffix);.      
10be0 70 54 72 65 65 2d 3e 6e 44 61 74 61 20 3d 20 6e  pTree->nData = n
10bf0 44 61 74 61 20 2b 20 6e 53 75 66 66 69 78 3b 0a  Data + nSuffix;.
10c00 20 20 20 20 20 20 70 54 72 65 65 2d 3e 6e 45 6e        pTree->nEn
10c10 74 72 79 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66  try++;..      if
10c20 28 20 69 73 43 6f 70 79 54 65 72 6d 20 29 7b 0a  ( isCopyTerm ){.
10c30 20 20 20 20 20 20 20 20 69 66 28 20 70 54 72 65          if( pTre
10c40 65 2d 3e 6e 4d 61 6c 6c 6f 63 3c 6e 54 65 72 6d  e->nMalloc<nTerm
10c50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68   ){.          ch
10c60 61 72 20 2a 7a 4e 65 77 20 3d 20 73 71 6c 69 74  ar *zNew = sqlit
10c70 65 33 5f 72 65 61 6c 6c 6f 63 28 70 54 72 65 65  e3_realloc(pTree
10c80 2d 3e 7a 4d 61 6c 6c 6f 63 2c 20 6e 54 65 72 6d  ->zMalloc, nTerm
10c90 2a 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  *2);.          i
10ca0 66 28 20 21 7a 4e 65 77 20 29 7b 0a 20 20 20 20  f( !zNew ){.    
10cb0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
10cc0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
10cd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10ce0 20 20 20 70 54 72 65 65 2d 3e 6e 4d 61 6c 6c 6f     pTree->nMallo
10cf0 63 20 3d 20 6e 54 65 72 6d 2a 32 3b 0a 20 20 20  c = nTerm*2;.   
10d00 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e 7a 4d         pTree->zM
10d10 61 6c 6c 6f 63 20 3d 20 7a 4e 65 77 3b 0a 20 20  alloc = zNew;.  
10d20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10d30 70 54 72 65 65 2d 3e 7a 54 65 72 6d 20 3d 20 70  pTree->zTerm = p
10d40 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20  Tree->zMalloc;. 
10d50 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54         memcpy(pT
10d60 72 65 65 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65 72  ree->zTerm, zTer
10d70 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20  m, nTerm);.     
10d80 20 20 20 70 54 72 65 65 2d 3e 6e 54 65 72 6d 20     pTree->nTerm 
10d90 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = nTerm;.      }
10da0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54  else{.        pT
10db0 72 65 65 2d 3e 7a 54 65 72 6d 20 3d 20 28 63 68  ree->zTerm = (ch
10dc0 61 72 20 2a 29 7a 54 65 72 6d 3b 0a 20 20 20 20  ar *)zTerm;.    
10dd0 20 20 20 20 70 54 72 65 65 2d 3e 6e 54 65 72 6d      pTree->nTerm
10de0 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20   = nTerm;.      
10df0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
10e00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
10e10 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e    }..  /* If con
10e20 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 68 65  trol flows to he
10e30 72 65 2c 20 69 74 20 77 61 73 20 6e 6f 74 20 70  re, it was not p
10e40 6f 73 73 69 62 6c 65 20 74 6f 20 61 70 70 65 6e  ossible to appen
10e50 64 20 7a 54 65 72 6d 20 74 6f 20 74 68 65 0a 20  d zTerm to the. 
10e60 20 2a 2a 20 63 75 72 72 65 6e 74 20 6e 6f 64 65   ** current node
10e70 2e 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6e  . Create a new n
10e80 6f 64 65 20 28 61 20 72 69 67 68 74 2d 73 69 62  ode (a right-sib
10e90 6c 69 6e 67 20 6f 66 20 74 68 65 20 63 75 72 72  ling of the curr
10ea0 65 6e 74 20 6e 6f 64 65 29 2e 0a 20 20 2a 2a 20  ent node)..  ** 
10eb0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
10ec0 69 72 73 74 20 6e 6f 64 65 20 69 6e 20 74 68 65  irst node in the
10ed0 20 74 72 65 65 2c 20 74 68 65 20 74 65 72 6d 20   tree, the term 
10ee0 69 73 20 61 64 64 65 64 20 74 6f 20 69 74 2e 0a  is added to it..
10ef0 20 20 2a 2a 0a 20 20 2a 2a 20 4f 74 68 65 72 77    **.  ** Otherw
10f00 69 73 65 2c 20 74 68 65 20 74 65 72 6d 20 69 73  ise, the term is
10f10 20 6e 6f 74 20 61 64 64 65 64 20 74 6f 20 74 68   not added to th
10f20 65 20 6e 65 77 20 6e 6f 64 65 2c 20 69 74 20 69  e new node, it i
10f30 73 20 6c 65 66 74 20 65 6d 70 74 79 20 66 6f 72  s left empty for
10f40 0a 20 20 2a 2a 20 6e 6f 77 2e 20 49 6e 73 74 65  .  ** now. Inste
10f50 61 64 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20  ad, the term is 
10f60 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
10f70 65 20 70 61 72 65 6e 74 20 6f 66 20 70 54 72 65  e parent of pTre
10f80 65 2e 20 49 66 20 70 54 72 65 65 20 0a 20 20 2a  e. If pTree .  *
10f90 2a 20 68 61 73 20 6e 6f 20 70 61 72 65 6e 74 2c  * has no parent,
10fa0 20 6f 6e 65 20 69 73 20 63 72 65 61 74 65 64 20   one is created 
10fb0 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 4e 65  here..  */.  pNe
10fc0 77 20 3d 20 28 53 65 67 6d 65 6e 74 4e 6f 64 65  w = (SegmentNode
10fd0 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
10fe0 63 28 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e 74  c(sizeof(Segment
10ff0 4e 6f 64 65 29 20 2b 20 70 2d 3e 6e 4e 6f 64 65  Node) + p->nNode
11000 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 21 70 4e  Size);.  if( !pN
11010 65 77 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ew ){.    return
11020 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
11030 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77   }.  memset(pNew
11040 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 65 67 6d  , 0, sizeof(Segm
11050 65 6e 74 4e 6f 64 65 29 29 3b 0a 20 20 70 4e 65  entNode));.  pNe
11060 77 2d 3e 6e 44 61 74 61 20 3d 20 31 20 2b 20 46  w->nData = 1 + F
11070 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 3b 0a  TS3_VARINT_MAX;.
11080 20 20 70 4e 65 77 2d 3e 61 44 61 74 61 20 3d 20    pNew->aData = 
11090 28 63 68 61 72 20 2a 29 26 70 4e 65 77 5b 31 5d  (char *)&pNew[1]
110a0 3b 0a 0a 20 20 69 66 28 20 70 54 72 65 65 20 29  ;..  if( pTree )
110b0 7b 0a 20 20 20 20 53 65 67 6d 65 6e 74 4e 6f 64  {.    SegmentNod
110c0 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 54 72  e *pParent = pTr
110d0 65 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20  ee->pParent;.   
110e0 20 72 63 20 3d 20 66 74 73 33 4e 6f 64 65 41 64   rc = fts3NodeAd
110f0 64 54 65 72 6d 28 70 2c 20 26 70 50 61 72 65 6e  dTerm(p, &pParen
11100 74 2c 20 69 73 43 6f 70 79 54 65 72 6d 2c 20 7a  t, isCopyTerm, z
11110 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20  Term, nTerm);.  
11120 20 20 69 66 28 20 70 54 72 65 65 2d 3e 70 50 61    if( pTree->pPa
11130 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rent==0 ){.     
11140 20 70 54 72 65 65 2d 3e 70 50 61 72 65 6e 74 20   pTree->pParent 
11150 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 7d  = pParent;.    }
11160 0a 20 20 20 20 70 54 72 65 65 2d 3e 70 52 69 67  .    pTree->pRig
11170 68 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70  ht = pNew;.    p
11180 4e 65 77 2d 3e 70 4c 65 66 74 6d 6f 73 74 20 3d  New->pLeftmost =
11190 20 70 54 72 65 65 2d 3e 70 4c 65 66 74 6d 6f 73   pTree->pLeftmos
111a0 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 50 61  t;.    pNew->pPa
111b0 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a  rent = pParent;.
111c0 20 20 20 20 70 4e 65 77 2d 3e 7a 4d 61 6c 6c 6f      pNew->zMallo
111d0 63 20 3d 20 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c  c = pTree->zMall
111e0 6f 63 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4d  oc;.    pNew->nM
111f0 61 6c 6c 6f 63 20 3d 20 70 54 72 65 65 2d 3e 6e  alloc = pTree->n
11200 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20 70 54 72 65  Malloc;.    pTre
11210 65 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  e->zMalloc = 0;.
11220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
11230 77 2d 3e 70 4c 65 66 74 6d 6f 73 74 20 3d 20 70  w->pLeftmost = p
11240 4e 65 77 3b 0a 20 20 20 20 72 63 20 3d 20 66 74  New;.    rc = ft
11250 73 33 4e 6f 64 65 41 64 64 54 65 72 6d 28 70 2c  s3NodeAddTerm(p,
11260 20 26 70 4e 65 77 2c 20 69 73 43 6f 70 79 54 65   &pNew, isCopyTe
11270 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  rm, zTerm, nTerm
11280 29 3b 20 0a 20 20 7d 0a 0a 20 20 2a 70 70 54 72  ); .  }..  *ppTr
11290 65 65 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74  ee = pNew;.  ret
112a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
112b0 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
112c0 20 66 6f 72 20 66 74 73 33 4e 6f 64 65 57 72 69   for fts3NodeWri
112d0 74 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  te()..*/.static 
112e0 69 6e 74 20 66 74 73 33 54 72 65 65 46 69 6e 69  int fts3TreeFini
112f0 73 68 4e 6f 64 65 28 0a 20 20 53 65 67 6d 65 6e  shNode(.  Segmen
11300 74 4e 6f 64 65 20 2a 70 54 72 65 65 2c 20 0a 20  tNode *pTree, . 
11310 20 69 6e 74 20 69 48 65 69 67 68 74 2c 20 0a 20   int iHeight, . 
11320 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
11330 4c 65 66 74 43 68 69 6c 64 0a 29 7b 0a 20 20 69  LeftChild.){.  i
11340 6e 74 20 6e 53 74 61 72 74 3b 0a 20 20 61 73 73  nt nStart;.  ass
11350 65 72 74 28 20 69 48 65 69 67 68 74 3e 3d 31 20  ert( iHeight>=1 
11360 26 26 20 69 48 65 69 67 68 74 3c 31 32 38 20 29  && iHeight<128 )
11370 3b 0a 20 20 6e 53 74 61 72 74 20 3d 20 46 54 53  ;.  nStart = FTS
11380 33 5f 56 41 52 49 4e 54 5f 4d 41 58 20 2d 20 73  3_VARINT_MAX - s
11390 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e 74  qlite3Fts3Varint
113a0 4c 65 6e 28 69 4c 65 66 74 43 68 69 6c 64 29 3b  Len(iLeftChild);
113b0 0a 20 20 70 54 72 65 65 2d 3e 61 44 61 74 61 5b  .  pTree->aData[
113c0 6e 53 74 61 72 74 5d 20 3d 20 28 63 68 61 72 29  nStart] = (char)
113d0 69 48 65 69 67 68 74 3b 0a 20 20 73 71 6c 69 74  iHeight;.  sqlit
113e0 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28  e3Fts3PutVarint(
113f0 26 70 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e 53  &pTree->aData[nS
11400 74 61 72 74 2b 31 5d 2c 20 69 4c 65 66 74 43 68  tart+1], iLeftCh
11410 69 6c 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  ild);.  return n
11420 53 74 61 72 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Start;.}../*.** 
11430 57 72 69 74 65 20 74 68 65 20 62 75 66 66 65 72  Write the buffer
11440 20 66 6f 72 20 74 68 65 20 73 65 67 6d 65 6e 74   for the segment
11450 20 6e 6f 64 65 20 70 54 72 65 65 20 61 6e 64 20   node pTree and 
11460 61 6c 6c 20 6f 66 20 69 74 73 20 70 65 65 72 73  all of its peers
11470 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
11480 61 73 65 2e 20 54 68 65 6e 20 63 61 6c 6c 20 74  ase. Then call t
11490 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 63  his function rec
114a0 75 72 73 69 76 65 6c 79 20 74 6f 20 77 72 69 74  ursively to writ
114b0 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  e the parent of 
114c0 0a 2a 2a 20 70 54 72 65 65 20 61 6e 64 20 69 74  .** pTree and it
114d0 73 20 70 65 65 72 73 20 74 6f 20 74 68 65 20 64  s peers to the d
114e0 61 74 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20  atabase. .**.** 
114f0 45 78 63 65 70 74 2c 20 69 66 20 70 54 72 65 65  Except, if pTree
11500 20 69 73 20 61 20 72 6f 6f 74 20 6e 6f 64 65 2c   is a root node,
11510 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74   do not write it
11520 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
11530 2e 20 49 6e 73 74 65 61 64 2c 0a 2a 2a 20 73 65  . Instead,.** se
11540 74 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  t output variabl
11550 65 73 20 2a 70 61 52 6f 6f 74 20 61 6e 64 20 2a  es *paRoot and *
11560 70 6e 52 6f 6f 74 20 74 6f 20 63 6f 6e 74 61 69  pnRoot to contai
11570 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e  n the root node.
11580 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
11590 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
115a0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
115b0 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20  output variable 
115c0 2a 70 69 4c 61 73 74 20 69 73 0a 2a 2a 20 73 65  *piLast is.** se
115d0 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73 74  t to the largest
115e0 20 62 6c 6f 63 6b 69 64 20 77 72 69 74 74 65 6e   blockid written
115f0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
11600 20 28 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 0a   (or zero if no.
11610 2a 2a 20 62 6c 6f 63 6b 73 20 77 65 72 65 20 77  ** blocks were w
11620 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 62  ritten to the db
11630 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  ). Otherwise, an
11640 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
11650 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  de is .** return
11660 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
11670 74 20 66 74 73 33 4e 6f 64 65 57 72 69 74 65 28  t fts3NodeWrite(
11680 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
11690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116a0 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
116b0 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
116c0 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72  SegmentNode *pTr
116d0 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ee,             
116e0 2f 2a 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 68  /* SegmentNode h
116f0 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  andle */.  int i
11700 48 65 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  Height,         
11710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 65             /* He
11720 69 67 68 74 20 6f 66 20 74 68 69 73 20 6e 6f 64  ight of this nod
11730 65 20 69 6e 20 74 72 65 65 20 2a 2f 0a 20 20 73  e in tree */.  s
11740 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 65  qlite3_int64 iLe
11750 61 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  af,            /
11760 2a 20 42 6c 6f 63 6b 20 69 64 20 6f 66 20 66 69  * Block id of fi
11770 72 73 74 20 6c 65 61 66 20 6e 6f 64 65 20 2a 2f  rst leaf node */
11780 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
11790 20 69 46 72 65 65 2c 20 20 20 20 20 20 20 20 20   iFree,         
117a0 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 69 64 20 6f     /* Block id o
117b0 66 20 6e 65 78 74 20 66 72 65 65 20 73 6c 6f 74  f next free slot
117c0 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73 20 2a   in %_segments *
117d0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
117e0 34 20 2a 70 69 4c 61 73 74 2c 20 20 20 20 20 20  4 *piLast,      
117f0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42 6c 6f 63      /* OUT: Bloc
11800 6b 20 69 64 20 6f 66 20 6c 61 73 74 20 65 6e 74  k id of last ent
11810 72 79 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  ry written */.  
11820 63 68 61 72 20 2a 2a 70 61 52 6f 6f 74 2c 20 20  char **paRoot,  
11830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11840 2f 2a 20 4f 55 54 3a 20 44 61 74 61 20 66 6f 72  /* OUT: Data for
11850 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20   root node */.  
11860 69 6e 74 20 2a 70 6e 52 6f 6f 74 20 20 20 20 20  int *pnRoot     
11870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11880 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20  /* OUT: Size of 
11890 72 6f 6f 74 20 6e 6f 64 65 20 69 6e 20 62 79 74  root node in byt
118a0 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  es */.){.  int r
118b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
118c0 20 20 69 66 28 20 21 70 54 72 65 65 2d 3e 70 50    if( !pTree->pP
118d0 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  arent ){.    /* 
118e0 52 6f 6f 74 20 6e 6f 64 65 20 6f 66 20 74 68 65  Root node of the
118f0 20 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e   tree. */.    in
11900 74 20 6e 53 74 61 72 74 20 3d 20 66 74 73 33 54  t nStart = fts3T
11910 72 65 65 46 69 6e 69 73 68 4e 6f 64 65 28 70 54  reeFinishNode(pT
11920 72 65 65 2c 20 69 48 65 69 67 68 74 2c 20 69 4c  ree, iHeight, iL
11930 65 61 66 29 3b 0a 20 20 20 20 2a 70 69 4c 61 73  eaf);.    *piLas
11940 74 20 3d 20 69 46 72 65 65 2d 31 3b 0a 20 20 20  t = iFree-1;.   
11950 20 2a 70 6e 52 6f 6f 74 20 3d 20 70 54 72 65 65   *pnRoot = pTree
11960 2d 3e 6e 44 61 74 61 20 2d 20 6e 53 74 61 72 74  ->nData - nStart
11970 3b 0a 20 20 20 20 2a 70 61 52 6f 6f 74 20 3d 20  ;.    *paRoot = 
11980 26 70 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e 53  &pTree->aData[nS
11990 74 61 72 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tart];.  }else{.
119a0 20 20 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20      SegmentNode 
119b0 2a 70 49 74 65 72 3b 0a 20 20 20 20 73 71 6c 69  *pIter;.    sqli
119c0 74 65 33 5f 69 6e 74 36 34 20 69 4e 65 78 74 46  te3_int64 iNextF
119d0 72 65 65 20 3d 20 69 46 72 65 65 3b 0a 20 20 20  ree = iFree;.   
119e0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
119f0 4e 65 78 74 4c 65 61 66 20 3d 20 69 4c 65 61 66  NextLeaf = iLeaf
11a00 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d  ;.    for(pIter=
11a10 70 54 72 65 65 2d 3e 70 4c 65 66 74 6d 6f 73 74  pTree->pLeftmost
11a20 3b 20 70 49 74 65 72 20 26 26 20 72 63 3d 3d 53  ; pIter && rc==S
11a30 51 4c 49 54 45 5f 4f 4b 3b 20 70 49 74 65 72 3d  QLITE_OK; pIter=
11a40 70 49 74 65 72 2d 3e 70 52 69 67 68 74 29 7b 0a  pIter->pRight){.
11a50 20 20 20 20 20 20 69 6e 74 20 6e 53 74 61 72 74        int nStart
11a60 20 3d 20 66 74 73 33 54 72 65 65 46 69 6e 69 73   = fts3TreeFinis
11a70 68 4e 6f 64 65 28 70 49 74 65 72 2c 20 69 48 65  hNode(pIter, iHe
11a80 69 67 68 74 2c 20 69 4e 65 78 74 4c 65 61 66 29  ight, iNextLeaf)
11a90 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69  ;.      int nWri
11aa0 74 65 20 3d 20 70 49 74 65 72 2d 3e 6e 44 61 74  te = pIter->nDat
11ab0 61 20 2d 20 6e 53 74 61 72 74 3b 0a 20 20 0a 20  a - nStart;.  . 
11ac0 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 57 72       rc = fts3Wr
11ad0 69 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 69 4e  iteSegment(p, iN
11ae0 65 78 74 46 72 65 65 2c 20 26 70 49 74 65 72 2d  extFree, &pIter-
11af0 3e 61 44 61 74 61 5b 6e 53 74 61 72 74 5d 2c 20  >aData[nStart], 
11b00 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 69  nWrite);.      i
11b10 4e 65 78 74 46 72 65 65 2b 2b 3b 0a 20 20 20 20  NextFree++;.    
11b20 20 20 69 4e 65 78 74 4c 65 61 66 20 2b 3d 20 28    iNextLeaf += (
11b30 70 49 74 65 72 2d 3e 6e 45 6e 74 72 79 2b 31 29  pIter->nEntry+1)
11b40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11b50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11b60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
11b70 4e 65 78 74 4c 65 61 66 3d 3d 69 46 72 65 65 20  NextLeaf==iFree 
11b80 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  );.      rc = ft
11b90 73 33 4e 6f 64 65 57 72 69 74 65 28 0a 20 20 20  s3NodeWrite(.   
11ba0 20 20 20 20 20 20 20 70 2c 20 70 54 72 65 65 2d         p, pTree-
11bb0 3e 70 50 61 72 65 6e 74 2c 20 69 48 65 69 67 68  >pParent, iHeigh
11bc0 74 2b 31 2c 20 69 46 72 65 65 2c 20 69 4e 65 78  t+1, iFree, iNex
11bd0 74 46 72 65 65 2c 20 70 69 4c 61 73 74 2c 20 70  tFree, piLast, p
11be0 61 52 6f 6f 74 2c 20 70 6e 52 6f 6f 74 0a 20 20  aRoot, pnRoot.  
11bf0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
11c00 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
11c10 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
11c20 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
11c30 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ons associated w
11c40 69 74 68 20 74 68 65 20 74 72 65 65 20 70 54 72  ith the tree pTr
11c50 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ee..*/.static vo
11c60 69 64 20 66 74 73 33 4e 6f 64 65 46 72 65 65 28  id fts3NodeFree(
11c70 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72  SegmentNode *pTr
11c80 65 65 29 7b 0a 20 20 69 66 28 20 70 54 72 65 65  ee){.  if( pTree
11c90 20 29 7b 0a 20 20 20 20 53 65 67 6d 65 6e 74 4e   ){.    SegmentN
11ca0 6f 64 65 20 2a 70 20 3d 20 70 54 72 65 65 2d 3e  ode *p = pTree->
11cb0 70 4c 65 66 74 6d 6f 73 74 3b 0a 20 20 20 20 66  pLeftmost;.    f
11cc0 74 73 33 4e 6f 64 65 46 72 65 65 28 70 2d 3e 70  ts3NodeFree(p->p
11cd0 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 77 68 69  Parent);.    whi
11ce0 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 20 20 53  le( p ){.      S
11cf0 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 52 69 67  egmentNode *pRig
11d00 68 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a  ht = p->pRight;.
11d10 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 44 61        if( p->aDa
11d20 74 61 21 3d 28 63 68 61 72 20 2a 29 26 70 5b 31  ta!=(char *)&p[1
11d30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ] ){.        sql
11d40 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 44 61  ite3_free(p->aDa
11d50 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ta);.      }.   
11d60 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68     assert( pRigh
11d70 74 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 4d 61 6c 6c  t==0 || p->zMall
11d80 6f 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  oc==0 );.      s
11d90 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
11da0 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 73  Malloc);.      s
11db0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
11dc0 20 20 20 20 20 20 70 20 3d 20 70 52 69 67 68 74        p = pRight
11dd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
11de0 2a 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d 20  *.** Add a term 
11df0 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62  to the segment b
11e00 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
11e10 20 62 79 20 74 68 65 20 53 65 67 6d 65 6e 74 57   by the SegmentW
11e20 72 69 74 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20  riter object.** 
11e30 2a 70 70 57 72 69 74 65 72 2e 20 57 68 65 6e 20  *ppWriter. When 
11e40 61 64 64 69 6e 67 20 74 68 65 20 66 69 72 73 74  adding the first
11e50 20 74 65 72 6d 20 74 6f 20 61 20 73 65 67 6d 65   term to a segme
11e60 6e 74 2c 20 2a 70 70 57 72 69 74 65 72 20 73 68  nt, *ppWriter sh
11e70 6f 75 6c 64 0a 2a 2a 20 62 65 20 70 61 73 73 65  ould.** be passe
11e80 64 20 4e 55 4c 4c 2e 20 54 68 69 73 20 66 75 6e  d NULL. This fun
11e90 63 74 69 6f 6e 20 77 69 6c 6c 20 61 6c 6c 6f 63  ction will alloc
11ea0 61 74 65 20 61 20 6e 65 77 20 53 65 67 6d 65 6e  ate a new Segmen
11eb0 74 57 72 69 74 65 72 20 6f 62 6a 65 63 74 0a 2a  tWriter object.*
11ec0 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74 20  * and return it 
11ed0 76 69 61 20 74 68 65 20 69 6e 70 75 74 2f 6f 75  via the input/ou
11ee0 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70  tput variable *p
11ef0 70 57 72 69 74 65 72 20 69 6e 20 74 68 69 73 20  pWriter in this 
11f00 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  case..**.** If s
11f10 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
11f20 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
11f30 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
11f40 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
11f50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
11f60 20 66 74 73 33 53 65 67 57 72 69 74 65 72 41 64   fts3SegWriterAd
11f70 64 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  d(.  Fts3Table *
11f80 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
11f90 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
11fa0 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
11fb0 20 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20    SegmentWriter 
11fc0 2a 2a 70 70 57 72 69 74 65 72 2c 20 20 20 20 20  **ppWriter,     
11fd0 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 65 67    /* IN/OUT: Seg
11fe0 6d 65 6e 74 57 72 69 74 65 72 20 68 61 6e 64 6c  mentWriter handl
11ff0 65 20 2a 2f 20 0a 20 20 69 6e 74 20 69 73 43 6f  e */ .  int isCo
12000 70 79 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  pyTerm,         
12010 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
12020 69 66 20 62 75 66 66 65 72 20 7a 54 65 72 6d 20  if buffer zTerm 
12030 6d 75 73 74 20 62 65 20 63 6f 70 69 65 64 20 2a  must be copied *
12040 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
12050 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  zTerm,          
12060 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
12070 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
12080 69 6e 67 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  ing term */.  in
12090 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 20 20 20  t nTerm,        
120a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
120b0 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e   Size of term in
120c0 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 6f 6e 73   bytes */.  cons
120d0 74 20 63 68 61 72 20 2a 61 44 6f 63 6c 69 73 74  t char *aDoclist
120e0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
120f0 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
12100 20 63 6f 6e 74 61 69 6e 69 6e 67 20 64 6f 63 6c   containing docl
12110 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f  ist */.  int nDo
12120 63 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20  clist           
12130 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
12140 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 62   of doclist in b
12150 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ytes */.){.  int
12160 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20 20   nPrefix;       
12170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12180 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 70 72 65  Size of term pre
12190 66 69 78 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  fix in bytes */.
121a0 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 20 20    int nSuffix;  
121b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121c0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72    /* Size of ter
121d0 6d 20 73 75 66 66 69 78 20 69 6e 20 62 79 74 65  m suffix in byte
121e0 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 71 3b  s */.  int nReq;
121f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12200 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
12210 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
12220 65 64 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 20  ed on leaf page 
12230 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a  */.  int nData;.
12240 20 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20    SegmentWriter 
12250 2a 70 57 72 69 74 65 72 20 3d 20 2a 70 70 57 72  *pWriter = *ppWr
12260 69 74 65 72 3b 0a 0a 20 20 69 66 28 20 21 70 57  iter;..  if( !pW
12270 72 69 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  riter ){.    int
12280 20 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   rc;.    sqlite3
12290 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
122a0 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74     /* Allocate t
122b0 68 65 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72  he SegmentWriter
122c0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
122d0 20 20 70 57 72 69 74 65 72 20 3d 20 28 53 65 67    pWriter = (Seg
122e0 6d 65 6e 74 57 72 69 74 65 72 20 2a 29 73 71 6c  mentWriter *)sql
122f0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
12300 6f 66 28 53 65 67 6d 65 6e 74 57 72 69 74 65 72  of(SegmentWriter
12310 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 57 72  ));.    if( !pWr
12320 69 74 65 72 20 29 20 72 65 74 75 72 6e 20 53 51  iter ) return SQ
12330 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
12340 6d 65 6d 73 65 74 28 70 57 72 69 74 65 72 2c 20  memset(pWriter, 
12350 30 2c 20 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e  0, sizeof(Segmen
12360 74 57 72 69 74 65 72 29 29 3b 0a 20 20 20 20 2a  tWriter));.    *
12370 70 70 57 72 69 74 65 72 20 3d 20 70 57 72 69 74  ppWriter = pWrit
12380 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f  er;..    /* Allo
12390 63 61 74 65 20 61 20 62 75 66 66 65 72 20 69 6e  cate a buffer in
123a0 20 77 68 69 63 68 20 74 6f 20 61 63 63 75 6d 75   which to accumu
123b0 6c 61 74 65 20 64 61 74 61 20 2a 2f 0a 20 20 20  late data */.   
123c0 20 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 20   pWriter->aData 
123d0 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
123e0 33 5f 6d 61 6c 6c 6f 63 28 70 2d 3e 6e 4e 6f 64  3_malloc(p->nNod
123f0 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  eSize);.    if( 
12400 21 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 20  !pWriter->aData 
12410 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
12420 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 57 72 69 74  NOMEM;.    pWrit
12430 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 70 2d 3e 6e  er->nSize = p->n
12440 4e 6f 64 65 53 69 7a 65 3b 0a 0a 20 20 20 20 2f  NodeSize;..    /
12450 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20  * Find the next 
12460 66 72 65 65 20 62 6c 6f 63 6b 69 64 20 69 6e 20  free blockid in 
12470 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74  the %_segments t
12480 61 62 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d  able */.    rc =
12490 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
124a0 53 51 4c 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54  SQL_NEXT_SEGMENT
124b0 53 5f 49 44 2c 20 26 70 53 74 6d 74 2c 20 30 29  S_ID, &pStmt, 0)
124c0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
124d0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
124e0 20 72 63 3b 0a 20 20 20 20 69 66 28 20 53 51 4c   rc;.    if( SQL
124f0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
12500 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
12510 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69        pWriter->i
12520 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  Free = sqlite3_c
12530 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d  olumn_int64(pStm
12540 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 57 72  t, 0);.      pWr
12550 69 74 65 72 2d 3e 69 46 69 72 73 74 20 3d 20 70  iter->iFirst = p
12560 57 72 69 74 65 72 2d 3e 69 46 72 65 65 3b 0a 20  Writer->iFree;. 
12570 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
12580 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
12590 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
125a0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
125b0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6e 44 61  rn rc;.  }.  nDa
125c0 74 61 20 3d 20 70 57 72 69 74 65 72 2d 3e 6e 44  ta = pWriter->nD
125d0 61 74 61 3b 0a 0a 20 20 6e 50 72 65 66 69 78 20  ata;..  nPrefix 
125e0 3d 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70  = fts3PrefixComp
125f0 72 65 73 73 28 70 57 72 69 74 65 72 2d 3e 7a 54  ress(pWriter->zT
12600 65 72 6d 2c 20 70 57 72 69 74 65 72 2d 3e 6e 54  erm, pWriter->nT
12610 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  erm, zTerm, nTer
12620 6d 29 3b 0a 20 20 6e 53 75 66 66 69 78 20 3d 20  m);.  nSuffix = 
12630 6e 54 65 72 6d 2d 6e 50 72 65 66 69 78 3b 0a 0a  nTerm-nPrefix;..
12640 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
12650 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 61  how many bytes a
12660 72 65 20 72 65 71 75 69 72 65 64 20 62 79 20 74  re required by t
12670 68 69 73 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  his new entry */
12680 0a 20 20 6e 52 65 71 20 3d 20 73 71 6c 69 74 65  .  nReq = sqlite
12690 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e  3Fts3VarintLen(n
126a0 50 72 65 66 69 78 29 20 2b 20 20 20 20 2f 2a 20  Prefix) +    /* 
126b0 76 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e  varint containin
126c0 67 20 70 72 65 66 69 78 20 73 69 7a 65 20 2a 2f  g prefix size */
126d0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33  .    sqlite3Fts3
126e0 56 61 72 69 6e 74 4c 65 6e 28 6e 53 75 66 66 69  VarintLen(nSuffi
126f0 78 29 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20  x) +         /* 
12700 76 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e  varint containin
12710 67 20 73 75 66 66 69 78 20 73 69 7a 65 20 2a 2f  g suffix size */
12720 0a 20 20 20 20 6e 53 75 66 66 69 78 20 2b 20 20  .    nSuffix +  
12730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12750 54 65 72 6d 20 73 75 66 66 69 78 20 2a 2f 0a 20  Term suffix */. 
12760 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 56 61     sqlite3Fts3Va
12770 72 69 6e 74 4c 65 6e 28 6e 44 6f 63 6c 69 73 74  rintLen(nDoclist
12780 29 20 2b 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ) +        /* Si
12790 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 2a 2f  ze of doclist */
127a0 0a 20 20 20 20 6e 44 6f 63 6c 69 73 74 3b 20 20  .    nDoclist;  
127b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
127d0 44 6f 63 6c 69 73 74 20 64 61 74 61 20 2a 2f 0a  Doclist data */.
127e0 0a 20 20 69 66 28 20 6e 44 61 74 61 3e 30 20 26  .  if( nData>0 &
127f0 26 20 6e 44 61 74 61 2b 6e 52 65 71 3e 70 2d 3e  & nData+nReq>p->
12800 6e 4e 6f 64 65 53 69 7a 65 20 29 7b 0a 20 20 20  nNodeSize ){.   
12810 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 2f 2a   int rc;..    /*
12820 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   The current lea
12830 66 20 6e 6f 64 65 20 69 73 20 66 75 6c 6c 2e 20  f node is full. 
12840 57 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20  Write it out to 
12850 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 2a 2f  the database. */
12860 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 57 72  .    rc = fts3Wr
12870 69 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 57  iteSegment(p, pW
12880 72 69 74 65 72 2d 3e 69 46 72 65 65 2b 2b 2c 20  riter->iFree++, 
12890 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 2c 20  pWriter->aData, 
128a0 6e 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  nData);.    if( 
128b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
128c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
128d0 2d 3e 6e 4c 65 61 66 41 64 64 2b 2b 3b 0a 0a 20  ->nLeafAdd++;.. 
128e0 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 63 75     /* Add the cu
128f0 72 72 65 6e 74 20 74 65 72 6d 20 74 6f 20 74 68  rrent term to th
12900 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20  e interior node 
12910 74 72 65 65 2e 20 54 68 65 20 74 65 72 6d 20 61  tree. The term a
12920 64 64 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 74  dded to.    ** t
12930 68 65 20 69 6e 74 65 72 69 6f 72 20 74 72 65 65  he interior tree
12940 20 6d 75 73 74 3a 0a 20 20 20 20 2a 2a 0a 20 20   must:.    **.  
12950 20 20 2a 2a 20 20 20 61 29 20 62 65 20 67 72 65    **   a) be gre
12960 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61  ater than the la
12970 72 67 65 73 74 20 74 65 72 6d 20 6f 6e 20 74 68  rgest term on th
12980 65 20 6c 65 61 66 20 6e 6f 64 65 20 6a 75 73 74  e leaf node just
12990 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20   written.    ** 
129a0 20 20 20 20 20 74 6f 20 74 68 65 20 64 61 74 61       to the data
129b0 62 61 73 65 20 28 73 74 69 6c 6c 20 61 76 61 69  base (still avai
129c0 6c 61 62 6c 65 20 69 6e 20 70 57 72 69 74 65 72  lable in pWriter
129d0 2d 3e 7a 54 65 72 6d 29 2c 20 61 6e 64 0a 20 20  ->zTerm), and.  
129e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 62 29    **.    **   b)
129f0 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   be less than or
12a00 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 65   equal to the te
12a10 72 6d 20 61 62 6f 75 74 20 74 6f 20 62 65 20 61  rm about to be a
12a20 64 64 65 64 20 74 6f 20 74 68 65 20 6e 65 77 0a  dded to the new.
12a30 20 20 20 20 2a 2a 20 20 20 20 20 20 6c 65 61 66      **      leaf
12a40 20 6e 6f 64 65 20 28 7a 54 65 72 6d 2f 6e 54 65   node (zTerm/nTe
12a50 72 6d 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  rm)..    **.    
12a60 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
12a70 73 2c 20 69 74 20 6d 75 73 74 20 62 65 20 74 68  s, it must be th
12a80 65 20 70 72 65 66 69 78 20 6f 66 20 7a 54 65 72  e prefix of zTer
12a90 6d 20 31 20 62 79 74 65 20 6c 6f 6e 67 65 72 20  m 1 byte longer 
12aa0 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  than.    ** the 
12ab0 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 28 69  common prefix (i
12ac0 66 20 61 6e 79 29 20 6f 66 20 7a 54 65 72 6d 20  f any) of zTerm 
12ad0 61 6e 64 20 70 57 72 69 74 65 72 2d 3e 7a 54 65  and pWriter->zTe
12ae0 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  rm..    */.    a
12af0 73 73 65 72 74 28 20 6e 50 72 65 66 69 78 3c 6e  ssert( nPrefix<n
12b00 54 65 72 6d 20 29 3b 0a 20 20 20 20 72 63 20 3d  Term );.    rc =
12b10 20 66 74 73 33 4e 6f 64 65 41 64 64 54 65 72 6d   fts3NodeAddTerm
12b20 28 70 2c 20 26 70 57 72 69 74 65 72 2d 3e 70 54  (p, &pWriter->pT
12b30 72 65 65 2c 20 69 73 43 6f 70 79 54 65 72 6d 2c  ree, isCopyTerm,
12b40 20 7a 54 65 72 6d 2c 20 6e 50 72 65 66 69 78 2b   zTerm, nPrefix+
12b50 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  1);.    if( rc!=
12b60 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
12b70 72 6e 20 72 63 3b 0a 0a 20 20 20 20 6e 44 61 74  rn rc;..    nDat
12b80 61 20 3d 20 30 3b 0a 20 20 20 20 70 57 72 69 74  a = 0;.    pWrit
12b90 65 72 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 0a  er->nTerm = 0;..
12ba0 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20 30 3b      nPrefix = 0;
12bb0 0a 20 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e  .    nSuffix = n
12bc0 54 65 72 6d 3b 0a 20 20 20 20 6e 52 65 71 20 3d  Term;.    nReq =
12bd0 20 31 20 2b 20 20 20 20 20 20 20 20 20 20 20 20   1 +            
12be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bf0 20 20 2f 2a 20 76 61 72 69 6e 74 20 63 6f 6e 74    /* varint cont
12c00 61 69 6e 69 6e 67 20 70 72 65 66 69 78 20 73 69  aining prefix si
12c10 7a 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ze */.      sqli
12c20 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e  te3Fts3VarintLen
12c30 28 6e 54 65 72 6d 29 20 2b 20 20 20 20 20 20 20  (nTerm) +       
12c40 20 20 2f 2a 20 76 61 72 69 6e 74 20 63 6f 6e 74    /* varint cont
12c50 61 69 6e 69 6e 67 20 73 75 66 66 69 78 20 73 69  aining suffix si
12c60 7a 65 20 2a 2f 0a 20 20 20 20 20 20 6e 54 65 72  ze */.      nTer
12c70 6d 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  m +             
12c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c90 20 20 2f 2a 20 54 65 72 6d 20 73 75 66 66 69 78    /* Term suffix
12ca0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
12cb0 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e  3Fts3VarintLen(n
12cc0 44 6f 63 6c 69 73 74 29 20 2b 20 20 20 20 20 20  Doclist) +      
12cd0 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69  /* Size of docli
12ce0 73 74 20 2a 2f 0a 20 20 20 20 20 20 6e 44 6f 63  st */.      nDoc
12cf0 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  list;           
12d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d10 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 64 61 74    /* Doclist dat
12d20 61 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  a */.  }..  /* I
12d30 66 20 74 68 65 20 62 75 66 66 65 72 20 63 75 72  f the buffer cur
12d40 72 65 6e 74 6c 79 20 61 6c 6c 6f 63 61 74 65 64  rently allocated
12d50 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f   is too small fo
12d60 72 20 74 68 69 73 20 65 6e 74 72 79 2c 20 72 65  r this entry, re
12d70 61 6c 6c 6f 63 0a 20 20 2a 2a 20 74 68 65 20 62  alloc.  ** the b
12d80 75 66 66 65 72 20 74 6f 20 6d 61 6b 65 20 69 74  uffer to make it
12d90 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2e 0a 20   large enough.. 
12da0 20 2a 2f 0a 20 20 69 66 28 20 6e 52 65 71 3e 70   */.  if( nReq>p
12db0 57 72 69 74 65 72 2d 3e 6e 53 69 7a 65 20 29 7b  Writer->nSize ){
12dc0 0a 20 20 20 20 63 68 61 72 20 2a 61 4e 65 77 20  .    char *aNew 
12dd0 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
12de0 63 28 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61  c(pWriter->aData
12df0 2c 20 6e 52 65 71 29 3b 0a 20 20 20 20 69 66 28  , nReq);.    if(
12e00 20 21 61 4e 65 77 20 29 20 72 65 74 75 72 6e 20   !aNew ) return 
12e10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
12e20 20 20 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61    pWriter->aData
12e30 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 70 57 72   = aNew;.    pWr
12e40 69 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 6e 52  iter->nSize = nR
12e50 65 71 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  eq;.  }.  assert
12e60 28 20 6e 44 61 74 61 2b 6e 52 65 71 3c 3d 70 57  ( nData+nReq<=pW
12e70 72 69 74 65 72 2d 3e 6e 53 69 7a 65 20 29 3b 0a  riter->nSize );.
12e80 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65  .  /* Append the
12e90 20 70 72 65 66 69 78 2d 63 6f 6d 70 72 65 73 73   prefix-compress
12ea0 65 64 20 74 65 72 6d 20 61 6e 64 20 64 6f 63 6c  ed term and docl
12eb0 69 73 74 20 74 6f 20 74 68 65 20 62 75 66 66 65  ist to the buffe
12ec0 72 2e 20 2a 2f 0a 20 20 6e 44 61 74 61 20 2b 3d  r. */.  nData +=
12ed0 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56   sqlite3Fts3PutV
12ee0 61 72 69 6e 74 28 26 70 57 72 69 74 65 72 2d 3e  arint(&pWriter->
12ef0 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 6e 50  aData[nData], nP
12f00 72 65 66 69 78 29 3b 0a 20 20 6e 44 61 74 61 20  refix);.  nData 
12f10 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75  += sqlite3Fts3Pu
12f20 74 56 61 72 69 6e 74 28 26 70 57 72 69 74 65 72  tVarint(&pWriter
12f30 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20  ->aData[nData], 
12f40 6e 53 75 66 66 69 78 29 3b 0a 20 20 6d 65 6d 63  nSuffix);.  memc
12f50 70 79 28 26 70 57 72 69 74 65 72 2d 3e 61 44 61  py(&pWriter->aDa
12f60 74 61 5b 6e 44 61 74 61 5d 2c 20 26 7a 54 65 72  ta[nData], &zTer
12f70 6d 5b 6e 50 72 65 66 69 78 5d 2c 20 6e 53 75 66  m[nPrefix], nSuf
12f80 66 69 78 29 3b 0a 20 20 6e 44 61 74 61 20 2b 3d  fix);.  nData +=
12f90 20 6e 53 75 66 66 69 78 3b 0a 20 20 6e 44 61 74   nSuffix;.  nDat
12fa0 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  a += sqlite3Fts3
12fb0 50 75 74 56 61 72 69 6e 74 28 26 70 57 72 69 74  PutVarint(&pWrit
12fc0 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d  er->aData[nData]
12fd0 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 6d  , nDoclist);.  m
12fe0 65 6d 63 70 79 28 26 70 57 72 69 74 65 72 2d 3e  emcpy(&pWriter->
12ff0 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 61 44  aData[nData], aD
13000 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74  oclist, nDoclist
13010 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 44  );.  pWriter->nD
13020 61 74 61 20 3d 20 6e 44 61 74 61 20 2b 20 6e 44  ata = nData + nD
13030 6f 63 6c 69 73 74 3b 0a 0a 20 20 2f 2a 20 53 61  oclist;..  /* Sa
13040 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ve the current t
13050 65 72 6d 20 73 6f 20 74 68 61 74 20 69 74 20 63  erm so that it c
13060 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70 72  an be used to pr
13070 65 66 69 78 2d 63 6f 6d 70 72 65 73 73 20 74 68  efix-compress th
13080 65 20 6e 65 78 74 2e 0a 20 20 2a 2a 20 49 66 20  e next..  ** If 
13090 74 68 65 20 69 73 43 6f 70 79 54 65 72 6d 20 70  the isCopyTerm p
130a0 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65  arameter is true
130b0 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66 66 65  , then the buffe
130c0 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a  r pointed to by.
130d0 20 20 2a 2a 20 7a 54 65 72 6d 20 69 73 20 74 72    ** zTerm is tr
130e0 61 6e 73 69 65 6e 74 2c 20 73 6f 20 74 61 6b 65  ansient, so take
130f0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 74   a copy of the t
13100 65 72 6d 20 64 61 74 61 2e 20 4f 74 68 65 72 77  erm data. Otherw
13110 69 73 65 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 73  ise, just.  ** s
13120 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20 74  tore a copy of t
13130 68 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f  he pointer..  */
13140 0a 20 20 69 66 28 20 69 73 43 6f 70 79 54 65 72  .  if( isCopyTer
13150 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 54 65  m ){.    if( nTe
13160 72 6d 3e 70 57 72 69 74 65 72 2d 3e 6e 4d 61 6c  rm>pWriter->nMal
13170 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 63 68 61  loc ){.      cha
13180 72 20 2a 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *zNew = sqlite
13190 33 5f 72 65 61 6c 6c 6f 63 28 70 57 72 69 74 65  3_realloc(pWrite
131a0 72 2d 3e 7a 4d 61 6c 6c 6f 63 2c 20 6e 54 65 72  r->zMalloc, nTer
131b0 6d 2a 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  m*2);.      if( 
131c0 21 7a 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20  !zNew ){.       
131d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
131e0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
131f0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 4d 61      pWriter->nMa
13200 6c 6c 6f 63 20 3d 20 6e 54 65 72 6d 2a 32 3b 0a  lloc = nTerm*2;.
13210 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 7a        pWriter->z
13220 4d 61 6c 6c 6f 63 20 3d 20 7a 4e 65 77 3b 0a 20  Malloc = zNew;. 
13230 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 7a 54       pWriter->zT
13240 65 72 6d 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20  erm = zNew;.    
13250 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  }.    assert( pW
13260 72 69 74 65 72 2d 3e 7a 54 65 72 6d 3d 3d 70 57  riter->zTerm==pW
13270 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c 6f 63 20 29  riter->zMalloc )
13280 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 57 72  ;.    memcpy(pWr
13290 69 74 65 72 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65  iter->zTerm, zTe
132a0 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 7d 65  rm, nTerm);.  }e
132b0 6c 73 65 7b 0a 20 20 20 20 70 57 72 69 74 65 72  lse{.    pWriter
132c0 2d 3e 7a 54 65 72 6d 20 3d 20 28 63 68 61 72 20  ->zTerm = (char 
132d0 2a 29 7a 54 65 72 6d 3b 0a 20 20 7d 0a 20 20 70  *)zTerm;.  }.  p
132e0 57 72 69 74 65 72 2d 3e 6e 54 65 72 6d 20 3d 20  Writer->nTerm = 
132f0 6e 54 65 72 6d 3b 0a 0a 20 20 72 65 74 75 72 6e  nTerm;..  return
13300 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13310 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6c 6c 20 64  *.** Flush all d
13320 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
13330 69 74 68 20 74 68 65 20 53 65 67 6d 65 6e 74 57  ith the SegmentW
13340 72 69 74 65 72 20 6f 62 6a 65 63 74 20 70 57 72  riter object pWr
13350 69 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 64  iter to the.** d
13360 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 66 75  atabase. This fu
13370 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 63  nction must be c
13380 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6c 6c 20  alled after all 
13390 74 65 72 6d 73 20 68 61 76 65 20 62 65 65 6e 20  terms have been 
133a0 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  added.** to the 
133b0 73 65 67 6d 65 6e 74 20 75 73 69 6e 67 20 66 74  segment using ft
133c0 73 33 53 65 67 57 72 69 74 65 72 41 64 64 28 29  s3SegWriterAdd()
133d0 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
133e0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a   SQLITE_OK is.**
133f0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
13400 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20  wise, an SQLite 
13410 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
13420 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65  tatic int fts3Se
13430 67 57 72 69 74 65 72 46 6c 75 73 68 28 0a 20 20  gWriterFlush(.  
13440 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
13450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13460 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  /* Virtual table
13470 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 65 67   handle */.  Seg
13480 6d 65 6e 74 57 72 69 74 65 72 20 2a 70 57 72 69  mentWriter *pWri
13490 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ter,         /* 
134a0 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 74 6f  SegmentWriter to
134b0 20 66 6c 75 73 68 20 74 6f 20 74 68 65 20 64 62   flush to the db
134c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
134d0 74 36 34 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  t64 iLevel,     
134e0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66        /* Value f
134f0 6f 72 20 27 6c 65 76 65 6c 27 20 63 6f 6c 75 6d  or 'level' colum
13500 6e 20 6f 66 20 25 5f 73 65 67 64 69 72 20 2a 2f  n of %_segdir */
13510 0a 20 20 69 6e 74 20 69 49 64 78 20 20 20 20 20  .  int iIdx     
13520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13530 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20     /* Value for 
13540 27 69 64 78 27 20 63 6f 6c 75 6d 6e 20 6f 66 20  'idx' column of 
13550 25 5f 73 65 67 64 69 72 20 2a 2f 0a 29 7b 0a 20  %_segdir */.){. 
13560 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13580 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
13590 2a 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  */.  if( pWriter
135a0 2d 3e 70 54 72 65 65 20 29 7b 0a 20 20 20 20 73  ->pTree ){.    s
135b0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 61  qlite3_int64 iLa
135c0 73 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  st = 0;      /* 
135d0 4c 61 72 67 65 73 74 20 62 6c 6f 63 6b 20 69 64  Largest block id
135e0 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61   written to data
135f0 62 61 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  base */.    sqli
13600 74 65 33 5f 69 6e 74 36 34 20 69 4c 61 73 74 4c  te3_int64 iLastL
13610 65 61 66 3b 20 20 20 20 20 20 2f 2a 20 4c 61 72  eaf;      /* Lar
13620 67 65 73 74 20 6c 65 61 66 20 62 6c 6f 63 6b 20  gest leaf block 
13630 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20 64 62  id written to db
13640 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 52   */.    char *zR
13650 6f 6f 74 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20  oot = NULL;     
13660 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
13670 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
13680 69 6e 69 6e 67 20 72 6f 6f 74 20 6e 6f 64 65 20  ining root node 
13690 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 6f 6f 74  */.    int nRoot
136a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
136b0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
136c0 62 75 66 66 65 72 20 7a 52 6f 6f 74 20 2a 2f 0a  buffer zRoot */.
136d0 0a 20 20 20 20 69 4c 61 73 74 4c 65 61 66 20 3d  .    iLastLeaf =
136e0 20 70 57 72 69 74 65 72 2d 3e 69 46 72 65 65 3b   pWriter->iFree;
136f0 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 57 72  .    rc = fts3Wr
13700 69 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 57  iteSegment(p, pW
13710 72 69 74 65 72 2d 3e 69 46 72 65 65 2b 2b 2c 20  riter->iFree++, 
13720 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 2c 20  pWriter->aData, 
13730 70 57 72 69 74 65 72 2d 3e 6e 44 61 74 61 29 3b  pWriter->nData);
13740 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
13750 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13760 72 63 20 3d 20 66 74 73 33 4e 6f 64 65 57 72 69  rc = fts3NodeWri
13770 74 65 28 70 2c 20 70 57 72 69 74 65 72 2d 3e 70  te(p, pWriter->p
13780 54 72 65 65 2c 20 31 2c 0a 20 20 20 20 20 20 20  Tree, 1,.       
13790 20 20 20 70 57 72 69 74 65 72 2d 3e 69 46 69 72     pWriter->iFir
137a0 73 74 2c 20 70 57 72 69 74 65 72 2d 3e 69 46 72  st, pWriter->iFr
137b0 65 65 2c 20 26 69 4c 61 73 74 2c 20 26 7a 52 6f  ee, &iLast, &zRo
137c0 6f 74 2c 20 26 6e 52 6f 6f 74 29 3b 0a 20 20 20  ot, &nRoot);.   
137d0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
137e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
137f0 20 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65    rc = fts3Write
13800 53 65 67 64 69 72 28 0a 20 20 20 20 20 20 20 20  Segdir(.        
13810 20 20 70 2c 20 69 4c 65 76 65 6c 2c 20 69 49 64    p, iLevel, iId
13820 78 2c 20 70 57 72 69 74 65 72 2d 3e 69 46 69 72  x, pWriter->iFir
13830 73 74 2c 20 69 4c 61 73 74 4c 65 61 66 2c 20 69  st, iLastLeaf, i
13840 4c 61 73 74 2c 20 7a 52 6f 6f 74 2c 20 6e 52 6f  Last, zRoot, nRo
13850 6f 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ot);.    }.  }el
13860 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65  se{.    /* The e
13870 6e 74 69 72 65 20 74 72 65 65 20 66 69 74 73 20  ntire tree fits 
13880 6f 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  on the root node
13890 2e 20 57 72 69 74 65 20 69 74 20 74 6f 20 74 68  . Write it to th
138a0 65 20 73 65 67 64 69 72 20 74 61 62 6c 65 2e 20  e segdir table. 
138b0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  */.    rc = fts3
138c0 57 72 69 74 65 53 65 67 64 69 72 28 0a 20 20 20  WriteSegdir(.   
138d0 20 20 20 20 20 70 2c 20 69 4c 65 76 65 6c 2c 20       p, iLevel, 
138e0 69 49 64 78 2c 20 30 2c 20 30 2c 20 30 2c 20 70  iIdx, 0, 0, 0, p
138f0 57 72 69 74 65 72 2d 3e 61 44 61 74 61 2c 20 70  Writer->aData, p
13900 57 72 69 74 65 72 2d 3e 6e 44 61 74 61 29 3b 0a  Writer->nData);.
13910 20 20 7d 0a 20 20 70 2d 3e 6e 4c 65 61 66 41 64    }.  p->nLeafAd
13920 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  d++;.  return rc
13930 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
13940 73 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 68 65  se all memory he
13950 6c 64 20 62 79 20 74 68 65 20 53 65 67 6d 65 6e  ld by the Segmen
13960 74 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 70  tWriter object p
13970 61 73 73 65 64 20 61 73 20 74 68 65 20 0a 2a 2a  assed as the .**
13980 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
13990 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
139a0 66 74 73 33 53 65 67 57 72 69 74 65 72 46 72 65  fts3SegWriterFre
139b0 65 28 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20  e(SegmentWriter 
139c0 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 69 66 28  *pWriter){.  if(
139d0 20 70 57 72 69 74 65 72 20 29 7b 0a 20 20 20 20   pWriter ){.    
139e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57 72  sqlite3_free(pWr
139f0 69 74 65 72 2d 3e 61 44 61 74 61 29 3b 0a 20 20  iter->aData);.  
13a00 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
13a10 57 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c 6f 63 29  Writer->zMalloc)
13a20 3b 0a 20 20 20 20 66 74 73 33 4e 6f 64 65 46 72  ;.    fts3NodeFr
13a30 65 65 28 70 57 72 69 74 65 72 2d 3e 70 54 72 65  ee(pWriter->pTre
13a40 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
13a50 66 72 65 65 28 70 57 72 69 74 65 72 29 3b 0a 20  free(pWriter);. 
13a60 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
13a70 66 69 72 73 74 20 76 61 6c 75 65 20 69 6e 20 74  first value in t
13a80 68 65 20 61 70 56 61 6c 5b 5d 20 61 72 72 61 79  he apVal[] array
13a90 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63   is assumed to c
13aa0 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65  ontain an intege
13ab0 72 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  r..** This funct
13ac0 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68 65  ion tests if the
13ad0 72 65 20 65 78 69 73 74 20 61 6e 79 20 64 6f 63  re exist any doc
13ae0 75 6d 65 6e 74 73 20 77 69 74 68 20 64 6f 63 69  uments with doci
13af0 64 20 76 61 6c 75 65 73 20 74 68 61 74 0a 2a 2a  d values that.**
13b00 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 66   are different f
13b10 72 6f 6d 20 74 68 61 74 20 69 6e 74 65 67 65 72  rom that integer
13b20 2e 20 69 2e 65 2e 20 69 66 20 64 65 6c 65 74 69  . i.e. if deleti
13b30 6e 67 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20  ng the document 
13b40 77 69 74 68 20 64 6f 63 69 64 0a 2a 2a 20 70 52  with docid.** pR
13b50 6f 77 69 64 20 77 6f 75 6c 64 20 6d 65 61 6e 20  owid would mean 
13b60 74 68 65 20 46 54 53 33 20 74 61 62 6c 65 20 77  the FTS3 table w
13b70 65 72 65 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a  ere empty..**.**
13b80 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
13b90 2a 70 69 73 45 6d 70 74 79 20 69 73 20 73 65 74  *pisEmpty is set
13ba0 20 74 6f 20 74 72 75 65 20 69 66 20 74 68 65 20   to true if the 
13bb0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 20 65  table is empty e
13bc0 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 64 6f 63  xcept for.** doc
13bd0 75 6d 65 6e 74 20 70 52 6f 77 69 64 2c 20 6f 72  ument pRowid, or
13be0 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
13bf0 2c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  , and SQLITE_OK 
13c00 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
13c10 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  an.** error occu
13c20 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  rs, an SQLite er
13c30 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
13c40 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
13c50 69 6e 74 20 66 74 73 33 49 73 45 6d 70 74 79 28  int fts3IsEmpty(
13c60 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 69 36  Fts3Table *p, i6
13c70 34 20 69 52 6f 77 69 64 2c 20 69 6e 74 20 2a 70  4 iRowid, int *p
13c80 69 73 45 6d 70 74 79 29 7b 0a 20 20 73 71 6c 69  isEmpty){.  sqli
13c90 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
13ca0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
13cb0 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 20   p->zContentTbl 
13cc0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 75 73 69  ){.    /* If usi
13cd0 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 3d 78  ng the content=x
13ce0 78 78 20 6f 70 74 69 6f 6e 2c 20 61 73 73 75 6d  xx option, assum
13cf0 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6e  e the table is n
13d00 65 76 65 72 20 65 6d 70 74 79 20 2a 2f 0a 20 20  ever empty */.  
13d10 20 20 2a 70 69 73 45 6d 70 74 79 20 3d 20 30 3b    *pisEmpty = 0;
13d20 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
13d30 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
13d40 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
13d50 6d 74 28 70 2c 20 53 51 4c 5f 49 53 5f 45 4d 50  mt(p, SQL_IS_EMP
13d60 54 59 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  TY, &pStmt, 0);.
13d70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
13d80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
13d90 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
13da0 34 28 70 53 74 6d 74 2c 20 31 2c 20 69 52 6f 77  4(pStmt, 1, iRow
13db0 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53  id);.      if( S
13dc0 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
13dd0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
13de0 7b 0a 20 20 20 20 20 20 20 20 2a 70 69 73 45 6d  {.        *pisEm
13df0 70 74 79 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  pty = sqlite3_co
13e00 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
13e10 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
13e20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
13e30 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  eset(pStmt);.   
13e40 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
13e50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
13e60 20 2a 70 6e 4d 61 78 20 74 6f 20 74 68 65 20 6c   *pnMax to the l
13e70 61 72 67 65 73 74 20 73 65 67 6d 65 6e 74 20 6c  argest segment l
13e80 65 76 65 6c 20 69 6e 20 74 68 65 20 64 61 74 61  evel in the data
13e90 62 61 73 65 20 66 6f 72 20 74 68 65 20 69 6e 64  base for the ind
13ea0 65 78 0a 2a 2a 20 69 49 6e 64 65 78 2e 0a 2a 2a  ex.** iIndex..**
13eb0 0a 2a 2a 20 53 65 67 6d 65 6e 74 20 6c 65 76 65  .** Segment leve
13ec0 6c 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ls are stored in
13ed0 20 74 68 65 20 27 6c 65 76 65 6c 27 20 63 6f 6c   the 'level' col
13ee0 75 6d 6e 20 6f 66 20 74 68 65 20 25 5f 73 65 67  umn of the %_seg
13ef0 64 69 72 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  dir table..**.**
13f00 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
13f10 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  K if successful,
13f20 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
13f30 72 6f 72 20 63 6f 64 65 20 69 66 20 6e 6f 74 2e  ror code if not.
13f40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
13f50 74 73 33 53 65 67 6d 65 6e 74 4d 61 78 4c 65 76  ts3SegmentMaxLev
13f60 65 6c 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20  el(.  Fts3Table 
13f70 2a 70 2c 20 0a 20 20 69 6e 74 20 69 4c 61 6e 67  *p, .  int iLang
13f80 69 64 2c 0a 20 20 69 6e 74 20 69 49 6e 64 65 78  id,.  int iIndex
13f90 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  , .  sqlite3_int
13fa0 36 34 20 2a 70 6e 4d 61 78 0a 29 7b 0a 20 20 73  64 *pnMax.){.  s
13fb0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
13fc0 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  mt;.  int rc;.  
13fd0 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 3e 3d  assert( iIndex>=
13fe0 30 20 26 26 20 69 49 6e 64 65 78 3c 70 2d 3e 6e  0 && iIndex<p->n
13ff0 49 6e 64 65 78 20 29 3b 0a 0a 20 20 2f 2a 20 53  Index );..  /* S
14000 65 74 20 70 53 74 6d 74 20 74 6f 20 74 68 65 20  et pStmt to the 
14010 63 6f 6d 70 69 6c 65 64 20 76 65 72 73 69 6f 6e  compiled version
14020 20 6f 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   of:.  **.  **  
14030 20 53 45 4c 45 43 54 20 6d 61 78 28 6c 65 76 65   SELECT max(leve
14040 6c 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73  l) FROM %Q.'%q_s
14050 65 67 64 69 72 27 20 57 48 45 52 45 20 6c 65 76  egdir' WHERE lev
14060 65 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44  el BETWEEN ? AND
14070 20 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 31 30   ?.  **.  ** (10
14080 32 34 20 69 73 20 61 63 74 75 61 6c 6c 79 20 74  24 is actually t
14090 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 61 63 72  he value of macr
140a0 6f 20 46 54 53 33 5f 53 45 47 44 49 52 5f 50 52  o FTS3_SEGDIR_PR
140b0 45 46 49 58 4c 45 56 45 4c 5f 53 54 52 29 2e 0a  EFIXLEVEL_STR)..
140c0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73 33    */.  rc = fts3
140d0 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53  SqlStmt(p, SQL_S
140e0 45 4c 45 43 54 5f 53 45 47 44 49 52 5f 4d 41 58  ELECT_SEGDIR_MAX
140f0 5f 4c 45 56 45 4c 2c 20 26 70 53 74 6d 74 2c 20  _LEVEL, &pStmt, 
14100 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
14110 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
14120 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62   rc;.  sqlite3_b
14130 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  ind_int64(pStmt,
14140 20 31 2c 20 67 65 74 41 62 73 6f 6c 75 74 65 4c   1, getAbsoluteL
14150 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c  evel(p, iLangid,
14160 20 69 49 6e 64 65 78 2c 20 30 29 29 3b 0a 20 20   iIndex, 0));.  
14170 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
14180 36 34 28 70 53 74 6d 74 2c 20 32 2c 20 0a 20 20  64(pStmt, 2, .  
14190 20 20 20 20 67 65 74 41 62 73 6f 6c 75 74 65 4c      getAbsoluteL
141a0 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c  evel(p, iLangid,
141b0 20 69 49 6e 64 65 78 2c 20 46 54 53 33 5f 53 45   iIndex, FTS3_SE
141c0 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 2d 31 29  GDIR_MAXLEVEL-1)
141d0 0a 20 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  .  );.  if( SQLI
141e0 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
141f0 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
14200 20 20 20 2a 70 6e 4d 61 78 20 3d 20 73 71 6c 69     *pnMax = sqli
14210 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
14220 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a  (pStmt, 0);.  }.
14230 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
14240 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 7d  _reset(pStmt);.}
14250 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
14260 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ll entries in th
14270 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62  e %_segments tab
14280 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
14290 74 68 20 74 68 65 20 73 65 67 6d 65 6e 74 0a 2a  th the segment.*
142a0 2a 20 6f 70 65 6e 65 64 20 77 69 74 68 20 73 65  * opened with se
142b0 67 2d 72 65 61 64 65 72 20 70 53 65 67 2e 20 54  g-reader pSeg. T
142c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
142d0 73 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65  s not affect the
142e0 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20   contents.** of 
142f0 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62  the %_segdir tab
14300 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
14310 74 20 66 74 73 33 44 65 6c 65 74 65 53 65 67 6d  t fts3DeleteSegm
14320 65 6e 74 28 0a 20 20 46 74 73 33 54 61 62 6c 65  ent(.  Fts3Table
14330 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
14340 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20 74 61         /* FTS ta
14350 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
14360 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
14370 53 65 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Seg             
14380 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 64 65  /* Segment to de
14390 6c 65 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lete */.){.  int
143a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
143b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
143c0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
143d0 20 69 66 28 20 70 53 65 67 2d 3e 69 53 74 61 72   if( pSeg->iStar
143e0 74 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71  tBlock ){.    sq
143f0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c  lite3_stmt *pDel
14400 65 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  ete;        /* S
14410 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  QL statement to 
14420 64 65 6c 65 74 65 20 72 6f 77 73 20 2a 2f 0a 20  delete rows */. 
14430 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53     rc = fts3SqlS
14440 74 6d 74 28 70 2c 20 53 51 4c 5f 44 45 4c 45 54  tmt(p, SQL_DELET
14450 45 5f 53 45 47 4d 45 4e 54 53 5f 52 41 4e 47 45  E_SEGMENTS_RANGE
14460 2c 20 26 70 44 65 6c 65 74 65 2c 20 30 29 3b 0a  , &pDelete, 0);.
14470 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14480 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
14490 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
144a0 34 28 70 44 65 6c 65 74 65 2c 20 31 2c 20 70 53  4(pDelete, 1, pS
144b0 65 67 2d 3e 69 53 74 61 72 74 42 6c 6f 63 6b 29  eg->iStartBlock)
144c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
144d0 62 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c 65  bind_int64(pDele
144e0 74 65 2c 20 32 2c 20 70 53 65 67 2d 3e 69 45 6e  te, 2, pSeg->iEn
144f0 64 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 73  dBlock);.      s
14500 71 6c 69 74 65 33 5f 73 74 65 70 28 70 44 65 6c  qlite3_step(pDel
14510 65 74 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ete);.      rc =
14520 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
14530 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 7d 0a 20  Delete);.    }. 
14540 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
14550 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
14560 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61  nction is used a
14570 66 74 65 72 20 6d 65 72 67 69 6e 67 20 6d 75 6c  fter merging mul
14580 74 69 70 6c 65 20 73 65 67 6d 65 6e 74 73 20 69  tiple segments i
14590 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 6c 61 72  nto a single lar
145a0 67 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 74 6f  ge.** segment to
145b0 20 64 65 6c 65 74 65 20 74 68 65 20 6f 6c 64 2c   delete the old,
145c0 20 6e 6f 77 20 72 65 64 75 6e 64 61 6e 74 2c 20   now redundant, 
145d0 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 73 2e  segment b-trees.
145e0 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 0a 2a   Specifically,.*
145f0 2a 20 69 74 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 31  * it:.** .**   1
14600 29 20 44 65 6c 65 74 65 73 20 61 6c 6c 20 25 5f  ) Deletes all %_
14610 73 65 67 6d 65 6e 74 73 20 65 6e 74 72 69 65 73  segments entries
14620 20 66 6f 72 20 74 68 65 20 73 65 67 6d 65 6e 74   for the segment
14630 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
14640 68 20 0a 2a 2a 20 20 20 20 20 20 65 61 63 68 20  h .**      each 
14650 6f 66 20 74 68 65 20 53 65 67 52 65 61 64 65 72  of the SegReader
14660 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20   objects in the 
14670 61 72 72 61 79 20 70 61 73 73 65 64 20 61 73 20  array passed as 
14680 74 68 65 20 74 68 69 72 64 20 0a 2a 2a 20 20 20  the third .**   
14690 20 20 20 61 72 67 75 6d 65 6e 74 2c 20 61 6e 64     argument, and
146a0 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 64 65 6c 65  .**.**   2) dele
146b0 74 65 73 20 61 6c 6c 20 25 5f 73 65 67 64 69 72  tes all %_segdir
146c0 20 65 6e 74 72 69 65 73 20 77 69 74 68 20 6c 65   entries with le
146d0 76 65 6c 20 69 4c 65 76 65 6c 2c 20 6f 72 20 61  vel iLevel, or a
146e0 6c 6c 20 25 5f 73 65 67 64 69 72 0a 2a 2a 20 20  ll %_segdir.**  
146f0 20 20 20 20 65 6e 74 72 69 65 73 20 72 65 67 61      entries rega
14700 72 64 6c 65 73 73 20 6f 66 20 6c 65 76 65 6c 20  rdless of level 
14710 69 66 20 28 69 4c 65 76 65 6c 3c 30 29 2e 0a 2a  if (iLevel<0)..*
14720 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
14730 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75  s returned if su
14740 63 63 65 73 73 66 75 6c 2c 20 6f 74 68 65 72 77  ccessful, otherw
14750 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72  ise an SQLite er
14760 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
14770 74 69 63 20 69 6e 74 20 66 74 73 33 44 65 6c 65  tic int fts3Dele
14780 74 65 53 65 67 64 69 72 28 0a 20 20 46 74 73 33  teSegdir(.  Fts3
14790 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
147a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
147b0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
147c0 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61  dle */.  int iLa
147d0 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  ngid,           
147e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67           /* Lang
147f0 75 61 67 65 20 69 64 20 2a 2f 0a 20 20 69 6e 74  uage id */.  int
14800 20 69 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20   iIndex,        
14810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14820 49 6e 64 65 78 20 66 6f 72 20 70 2d 3e 61 49 6e  Index for p->aIn
14830 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  dex */.  int iLe
14840 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vel,            
14850 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65           /* Leve
14860 6c 20 6f 66 20 25 5f 73 65 67 64 69 72 20 65 6e  l of %_segdir en
14870 74 72 69 65 73 20 74 6f 20 64 65 6c 65 74 65 20  tries to delete 
14880 2a 2f 0a 20 20 46 74 73 33 53 65 67 52 65 61 64  */.  Fts3SegRead
14890 65 72 20 2a 2a 61 70 53 65 67 6d 65 6e 74 2c 20  er **apSegment, 
148a0 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
148b0 20 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63   SegReader objec
148c0 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61  ts */.  int nRea
148d0 64 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20  der             
148e0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
148f0 6f 66 20 61 72 72 61 79 20 61 70 53 65 67 6d 65  of array apSegme
14900 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  nt */.){.  int r
14910 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
14920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
14930 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69  turn Code */.  i
14940 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
14950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14960 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
14970 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
14980 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74 65 20 3d  _stmt *pDelete =
14990 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 51 4c 20   0;      /* SQL 
149a0 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 64 65 6c  statement to del
149b0 65 74 65 20 72 6f 77 73 20 2a 2f 0a 0a 20 20 66  ete rows */..  f
149c0 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
149d0 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 52 65 61 64  TE_OK && i<nRead
149e0 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63  er; i++){.    rc
149f0 20 3d 20 66 74 73 33 44 65 6c 65 74 65 53 65 67   = fts3DeleteSeg
14a00 6d 65 6e 74 28 70 2c 20 61 70 53 65 67 6d 65 6e  ment(p, apSegmen
14a10 74 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28  t[i]);.  }.  if(
14a20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14a30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
14a40 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
14a50 69 4c 65 76 65 6c 3e 3d 30 20 7c 7c 20 69 4c 65  iLevel>=0 || iLe
14a60 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55 52  vel==FTS3_SEGCUR
14a70 53 4f 52 5f 41 4c 4c 20 29 3b 0a 20 20 69 66 28  SOR_ALL );.  if(
14a80 20 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45   iLevel==FTS3_SE
14a90 47 43 55 52 53 4f 52 5f 41 4c 4c 20 29 7b 0a 20  GCURSOR_ALL ){. 
14aa0 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53     rc = fts3SqlS
14ab0 74 6d 74 28 70 2c 20 53 51 4c 5f 44 45 4c 45 54  tmt(p, SQL_DELET
14ac0 45 5f 53 45 47 44 49 52 5f 52 41 4e 47 45 2c 20  E_SEGDIR_RANGE, 
14ad0 26 70 44 65 6c 65 74 65 2c 20 30 29 3b 0a 20 20  &pDelete, 0);.  
14ae0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14af0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
14b00 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
14b10 70 44 65 6c 65 74 65 2c 20 31 2c 20 67 65 74 41  pDelete, 1, getA
14b20 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20  bsoluteLevel(p, 
14b30 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c  iLangid, iIndex,
14b40 20 30 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   0));.      sqli
14b50 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
14b60 44 65 6c 65 74 65 2c 20 32 2c 20 0a 20 20 20 20  Delete, 2, .    
14b70 20 20 20 20 20 20 67 65 74 41 62 73 6f 6c 75 74        getAbsolut
14b80 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69  eLevel(p, iLangi
14b90 64 2c 20 69 49 6e 64 65 78 2c 20 46 54 53 33 5f  d, iIndex, FTS3_
14ba0 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 2d  SEGDIR_MAXLEVEL-
14bb0 31 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  1).      );.    
14bc0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
14bd0 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
14be0 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45  p, SQL_DELETE_SE
14bf0 47 44 49 52 5f 4c 45 56 45 4c 2c 20 26 70 44 65  GDIR_LEVEL, &pDe
14c00 6c 65 74 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  lete, 0);.    if
14c10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
14c20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14c30 5f 62 69 6e 64 5f 69 6e 74 36 34 28 0a 20 20 20  _bind_int64(.   
14c40 20 20 20 20 20 20 20 70 44 65 6c 65 74 65 2c 20         pDelete, 
14c50 31 2c 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65  1, getAbsoluteLe
14c60 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20  vel(p, iLangid, 
14c70 69 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 29 0a  iIndex, iLevel).
14c80 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
14c90 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
14ca0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
14cb0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 44 65 6c  qlite3_step(pDel
14cc0 65 74 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ete);.    rc = s
14cd0 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 44 65  qlite3_reset(pDe
14ce0 6c 65 74 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  lete);.  }..  re
14cf0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14d00 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
14d10 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
14d20 62 75 66 66 65 72 20 2a 70 70 4c 69 73 74 20 28  buffer *ppList (
14d30 73 69 7a 65 20 2a 70 6e 4c 69 73 74 20 62 79 74  size *pnList byt
14d40 65 73 29 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a  es) contains .**
14d50 20 61 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74   a position list
14d60 20 74 68 61 74 20 6d 61 79 20 28 6f 72 20 6d 61   that may (or ma
14d70 79 20 6e 6f 74 29 20 66 65 61 74 75 72 65 20 6d  y not) feature m
14d80 75 6c 74 69 70 6c 65 20 63 6f 6c 75 6d 6e 73 2e  ultiple columns.
14d90 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
14da0 6e 20 61 64 6a 75 73 74 73 20 74 68 65 20 70 6f  n adjusts the po
14db0 69 6e 74 65 72 20 2a 70 70 4c 69 73 74 20 61 6e  inter *ppList an
14dc0 64 20 74 68 65 20 6c 65 6e 67 74 68 20 2a 70 6e  d the length *pn
14dd0 4c 69 73 74 20 73 6f 20 74 68 61 74 20 74 68 65  List so that the
14de0 79 0a 2a 2a 20 69 64 65 6e 74 69 66 79 20 74 68  y.** identify th
14df0 65 20 73 75 62 73 65 74 20 6f 66 20 74 68 65 20  e subset of the 
14e00 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 74 68  position list th
14e10 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  at corresponds t
14e20 6f 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 0a 2a  o column iCol..*
14e30 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
14e40 65 20 6e 6f 20 65 6e 74 72 69 65 73 20 69 6e 20  e no entries in 
14e50 74 68 65 20 69 6e 70 75 74 20 70 6f 73 69 74 69  the input positi
14e60 6f 6e 20 6c 69 73 74 20 66 6f 72 20 63 6f 6c 75  on list for colu
14e70 6d 6e 20 69 43 6f 6c 2c 20 74 68 65 6e 0a 2a 2a  mn iCol, then.**
14e80 20 2a 70 6e 4c 69 73 74 20 69 73 20 73 65 74 20   *pnList is set 
14e90 74 6f 20 7a 65 72 6f 20 62 65 66 6f 72 65 20 72  to zero before r
14ea0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
14eb0 49 66 20 70 61 72 61 6d 65 74 65 72 20 62 5a 65  If parameter bZe
14ec0 72 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ro is non-zero, 
14ed0 74 68 65 6e 20 61 6e 79 20 70 61 72 74 20 6f 66  then any part of
14ee0 20 74 68 65 20 69 6e 70 75 74 20 6c 69 73 74 20   the input list 
14ef0 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65  following.** the
14f00 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 70   end of the outp
14f10 75 74 20 6c 69 73 74 20 69 73 20 7a 65 72 6f 65  ut list is zeroe
14f20 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  d before returni
14f30 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
14f40 69 64 20 66 74 73 33 43 6f 6c 75 6d 6e 46 69 6c  id fts3ColumnFil
14f50 74 65 72 28 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  ter(.  int iCol,
14f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f70 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
14f80 20 74 6f 20 66 69 6c 74 65 72 20 6f 6e 20 2a 2f   to filter on */
14f90 0a 20 20 69 6e 74 20 62 5a 65 72 6f 2c 20 20 20  .  int bZero,   
14fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fb0 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 75 74 20 61     /* Zero out a
14fc0 6e 79 74 68 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e  nything followin
14fd0 67 20 2a 70 70 4c 69 73 74 20 2a 2f 0a 20 20 63  g *ppList */.  c
14fe0 68 61 72 20 2a 2a 70 70 4c 69 73 74 2c 20 20 20  har **ppList,   
14ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15000 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65  * IN/OUT: Pointe
15010 72 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 6c 69  r to position li
15020 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c  st */.  int *pnL
15030 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ist             
15040 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
15050 54 3a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  T: Size of buffe
15060 72 20 2a 70 70 4c 69 73 74 20 69 6e 20 62 79 74  r *ppList in byt
15070 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  es */.){.  char 
15080 2a 70 4c 69 73 74 20 3d 20 2a 70 70 4c 69 73 74  *pList = *ppList
15090 3b 0a 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20  ;.  int nList = 
150a0 2a 70 6e 4c 69 73 74 3b 0a 20 20 63 68 61 72 20  *pnList;.  char 
150b0 2a 70 45 6e 64 20 3d 20 26 70 4c 69 73 74 5b 6e  *pEnd = &pList[n
150c0 4c 69 73 74 5d 3b 0a 20 20 69 6e 74 20 69 43 75  List];.  int iCu
150d0 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 68 61  rrent = 0;.  cha
150e0 72 20 2a 70 20 3d 20 70 4c 69 73 74 3b 0a 0a 20  r *p = pList;.. 
150f0 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30   assert( iCol>=0
15100 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29   );.  while( 1 )
15110 7b 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20 30  {.    char c = 0
15120 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 3c 70  ;.    while( p<p
15130 45 6e 64 20 26 26 20 28 63 20 7c 20 2a 70 29 26  End && (c | *p)&
15140 30 78 46 45 20 29 20 63 20 3d 20 2a 70 2b 2b 20  0xFE ) c = *p++ 
15150 26 20 30 78 38 30 3b 0a 20 20 0a 20 20 20 20 69  & 0x80;.  .    i
15160 66 28 20 69 43 6f 6c 3d 3d 69 43 75 72 72 65 6e  f( iCol==iCurren
15170 74 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69 73 74  t ){.      nList
15180 20 3d 20 28 69 6e 74 29 28 70 20 2d 20 70 4c 69   = (int)(p - pLi
15190 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
151a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 69  ;.    }..    nLi
151b0 73 74 20 2d 3d 20 28 69 6e 74 29 28 70 20 2d 20  st -= (int)(p - 
151c0 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c 69 73  pList);.    pLis
151d0 74 20 3d 20 70 3b 0a 20 20 20 20 69 66 28 20 6e  t = p;.    if( n
151e0 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
151f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
15200 20 20 70 20 3d 20 26 70 4c 69 73 74 5b 31 5d 3b    p = &pList[1];
15210 0a 20 20 20 20 70 20 2b 3d 20 73 71 6c 69 74 65  .    p += sqlite
15220 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 33 32  3Fts3GetVarint32
15230 28 70 2c 20 26 69 43 75 72 72 65 6e 74 29 3b 0a  (p, &iCurrent);.
15240 20 20 7d 0a 0a 20 20 69 66 28 20 62 5a 65 72 6f    }..  if( bZero
15250 20 26 26 20 26 70 4c 69 73 74 5b 6e 4c 69 73 74   && &pList[nList
15260 5d 21 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 6d  ]!=pEnd ){.    m
15270 65 6d 73 65 74 28 26 70 4c 69 73 74 5b 6e 4c 69  emset(&pList[nLi
15280 73 74 5d 2c 20 30 2c 20 70 45 6e 64 20 2d 20 26  st], 0, pEnd - &
15290 70 4c 69 73 74 5b 6e 4c 69 73 74 5d 29 3b 0a 20  pList[nList]);. 
152a0 20 7d 0a 20 20 2a 70 70 4c 69 73 74 20 3d 20 70   }.  *ppList = p
152b0 4c 69 73 74 3b 0a 20 20 2a 70 6e 4c 69 73 74 20  List;.  *pnList 
152c0 3d 20 6e 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  = nList;.}../*.*
152d0 2a 20 43 61 63 68 65 20 64 61 74 61 20 69 6e 20  * Cache data in 
152e0 74 68 65 20 46 74 73 33 4d 75 6c 74 69 53 65 67  the Fts3MultiSeg
152f0 52 65 61 64 65 72 2e 61 42 75 66 66 65 72 5b 5d  Reader.aBuffer[]
15300 20 62 75 66 66 65 72 20 28 6f 76 65 72 77 72 69   buffer (overwri
15310 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 65 78 69 73  ting any.** exis
15320 74 69 6e 67 20 64 61 74 61 29 2e 20 47 72 6f 77  ting data). Grow
15330 20 74 68 65 20 62 75 66 66 65 72 20 69 66 20 72   the buffer if r
15340 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  equired..**.** I
15350 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
15360 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
15370 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e  Otherwise, if an
15380 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e   OOM error is en
15390 63 6f 75 6e 74 65 72 65 64 0a 2a 2a 20 74 72 79  countered.** try
153a0 69 6e 67 20 74 6f 20 72 65 73 69 7a 65 20 74 68  ing to resize th
153b0 65 20 62 75 66 66 65 72 2c 20 72 65 74 75 72 6e  e buffer, return
153c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a   SQLITE_NOMEM..*
153d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
153e0 33 4d 73 72 42 75 66 66 65 72 44 61 74 61 28 0a  3MsrBufferData(.
153f0 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65    Fts3MultiSegRe
15400 61 64 65 72 20 2a 70 4d 73 72 2c 20 20 20 20 20  ader *pMsr,     
15410 20 20 2f 2a 20 4d 75 6c 74 69 2d 73 65 67 6d 65    /* Multi-segme
15420 6e 74 2d 72 65 61 64 65 72 20 68 61 6e 64 6c 65  nt-reader handle
15430 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 4c 69 73   */.  char *pLis
15440 74 2c 0a 20 20 69 6e 74 20 6e 4c 69 73 74 0a 29  t,.  int nList.)
15450 7b 0a 20 20 69 66 28 20 6e 4c 69 73 74 3e 70 4d  {.  if( nList>pM
15460 73 72 2d 3e 6e 42 75 66 66 65 72 20 29 7b 0a 20  sr->nBuffer ){. 
15470 20 20 20 63 68 61 72 20 2a 70 4e 65 77 3b 0a 20     char *pNew;. 
15480 20 20 20 70 4d 73 72 2d 3e 6e 42 75 66 66 65 72     pMsr->nBuffer
15490 20 3d 20 6e 4c 69 73 74 2a 32 3b 0a 20 20 20 20   = nList*2;.    
154a0 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73  pNew = (char *)s
154b0 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
154c0 4d 73 72 2d 3e 61 42 75 66 66 65 72 2c 20 70 4d  Msr->aBuffer, pM
154d0 73 72 2d 3e 6e 42 75 66 66 65 72 29 3b 0a 20 20  sr->nBuffer);.  
154e0 20 20 69 66 28 20 21 70 4e 65 77 20 29 20 72 65    if( !pNew ) re
154f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
15500 4d 3b 0a 20 20 20 20 70 4d 73 72 2d 3e 61 42 75  M;.    pMsr->aBu
15510 66 66 65 72 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  ffer = pNew;.  }
15520 0a 0a 20 20 6d 65 6d 63 70 79 28 70 4d 73 72 2d  ..  memcpy(pMsr-
15530 3e 61 42 75 66 66 65 72 2c 20 70 4c 69 73 74 2c  >aBuffer, pList,
15540 20 6e 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72   nList);.  retur
15550 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
15560 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 4d  int sqlite3Fts3M
15570 73 72 49 6e 63 72 4e 65 78 74 28 0a 20 20 46 74  srIncrNext(.  Ft
15580 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
15590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
155a0 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68   Virtual table h
155b0 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 4d  andle */.  Fts3M
155c0 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70  ultiSegReader *p
155d0 4d 73 72 2c 20 20 20 20 20 20 20 2f 2a 20 4d 75  Msr,       /* Mu
155e0 6c 74 69 2d 73 65 67 6d 65 6e 74 2d 72 65 61 64  lti-segment-read
155f0 65 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73  er handle */.  s
15600 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
15610 44 6f 63 69 64 2c 20 20 20 20 20 20 20 20 20 2f  Docid,         /
15620 2a 20 4f 55 54 3a 20 44 6f 63 69 64 20 76 61 6c  * OUT: Docid val
15630 75 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  ue */.  char **p
15640 61 50 6f 73 6c 69 73 74 2c 20 20 20 20 20 20 20  aPoslist,       
15650 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
15660 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73 69 74  Pointer to posit
15670 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  ion list */.  in
15680 74 20 2a 70 6e 50 6f 73 6c 69 73 74 20 20 20 20  t *pnPoslist    
15690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
156a0 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 70 6f   OUT: Size of po
156b0 73 69 74 69 6f 6e 20 6c 69 73 74 20 69 6e 20 62  sition list in b
156c0 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ytes */.){.  int
156d0 20 6e 4d 65 72 67 65 20 3d 20 70 4d 73 72 2d 3e   nMerge = pMsr->
156e0 6e 41 64 76 61 6e 63 65 3b 0a 20 20 46 74 73 33  nAdvance;.  Fts3
156f0 53 65 67 52 65 61 64 65 72 20 2a 2a 61 70 53 65  SegReader **apSe
15700 67 6d 65 6e 74 20 3d 20 70 4d 73 72 2d 3e 61 70  gment = pMsr->ap
15710 53 65 67 6d 65 6e 74 3b 0a 20 20 69 6e 74 20 28  Segment;.  int (
15720 2a 78 43 6d 70 29 28 46 74 73 33 53 65 67 52 65  *xCmp)(Fts3SegRe
15730 61 64 65 72 20 2a 2c 20 46 74 73 33 53 65 67 52  ader *, Fts3SegR
15740 65 61 64 65 72 20 2a 29 20 3d 20 28 0a 20 20 20  eader *) = (.   
15750 20 70 2d 3e 62 44 65 73 63 49 64 78 20 3f 20 66   p->bDescIdx ? f
15760 74 73 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c  ts3SegReaderDocl
15770 69 73 74 43 6d 70 52 65 76 20 3a 20 66 74 73 33  istCmpRev : fts3
15780 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74  SegReaderDoclist
15790 43 6d 70 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20  Cmp.  );..  if( 
157a0 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20  nMerge==0 ){.   
157b0 20 2a 70 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b   *paPoslist = 0;
157c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
157d0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 77 68  TE_OK;.  }..  wh
157e0 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 46 74  ile( 1 ){.    Ft
157f0 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65  s3SegReader *pSe
15800 67 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 70 4d  g;.    pSeg = pM
15810 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 30 5d  sr->apSegment[0]
15820 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d  ;..    if( pSeg-
15830 3e 70 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30 20  >pOffsetList==0 
15840 29 7b 0a 20 20 20 20 20 20 2a 70 61 50 6f 73 6c  ){.      *paPosl
15850 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  ist = 0;.      b
15860 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  reak;.    }else{
15870 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  .      int rc;. 
15880 20 20 20 20 20 63 68 61 72 20 2a 70 4c 69 73 74       char *pList
15890 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 73  ;.      int nLis
158a0 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  t;.      int j;.
158b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
158c0 74 36 34 20 69 44 6f 63 69 64 20 3d 20 61 70 53  t64 iDocid = apS
158d0 65 67 6d 65 6e 74 5b 30 5d 2d 3e 69 44 6f 63 69  egment[0]->iDoci
158e0 64 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 66  d;..      rc = f
158f0 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 78 74  ts3SegReaderNext
15900 44 6f 63 69 64 28 70 2c 20 61 70 53 65 67 6d 65  Docid(p, apSegme
15910 6e 74 5b 30 5d 2c 20 26 70 4c 69 73 74 2c 20 26  nt[0], &pList, &
15920 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 6a 20  nList);.      j 
15930 3d 20 31 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  = 1;.      while
15940 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15950 0a 20 20 20 20 20 20 20 20 26 26 20 6a 3c 6e 4d  .        && j<nM
15960 65 72 67 65 0a 20 20 20 20 20 20 20 20 26 26 20  erge.        && 
15970 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2d 3e 70 4f  apSegment[j]->pO
15980 66 66 73 65 74 4c 69 73 74 0a 20 20 20 20 20 20  ffsetList.      
15990 20 20 26 26 20 61 70 53 65 67 6d 65 6e 74 5b 6a    && apSegment[j
159a0 5d 2d 3e 69 44 6f 63 69 64 3d 3d 69 44 6f 63 69  ]->iDocid==iDoci
159b0 64 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  d.      ){.     
159c0 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52     rc = fts3SegR
159d0 65 61 64 65 72 4e 65 78 74 44 6f 63 69 64 28 70  eaderNextDocid(p
159e0 2c 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2c 20  , apSegment[j], 
159f0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6a  0, 0);.        j
15a00 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
15a10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15a20 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
15a30 0a 20 20 20 20 20 20 66 74 73 33 53 65 67 52 65  .      fts3SegRe
15a40 61 64 65 72 53 6f 72 74 28 70 4d 73 72 2d 3e 61  aderSort(pMsr->a
15a50 70 53 65 67 6d 65 6e 74 2c 20 6e 4d 65 72 67 65  pSegment, nMerge
15a60 2c 20 6a 2c 20 78 43 6d 70 29 3b 0a 0a 20 20 20  , j, xCmp);..   
15a70 20 20 20 69 66 28 20 6e 4c 69 73 74 3e 30 20 26     if( nList>0 &
15a80 26 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49  & fts3SegReaderI
15a90 73 50 65 6e 64 69 6e 67 28 61 70 53 65 67 6d 65  sPending(apSegme
15aa0 6e 74 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  nt[0]) ){.      
15ab0 20 20 72 63 20 3d 20 66 74 73 33 4d 73 72 42 75    rc = fts3MsrBu
15ac0 66 66 65 72 44 61 74 61 28 70 4d 73 72 2c 20 70  fferData(pMsr, p
15ad0 4c 69 73 74 2c 20 6e 4c 69 73 74 2b 31 29 3b 0a  List, nList+1);.
15ae0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
15af0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
15b00 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61  rn rc;.        a
15b10 73 73 65 72 74 28 20 28 70 4d 73 72 2d 3e 61 42  ssert( (pMsr->aB
15b20 75 66 66 65 72 5b 6e 4c 69 73 74 5d 20 26 20 30  uffer[nList] & 0
15b30 78 46 45 29 3d 3d 30 78 30 30 20 29 3b 0a 20 20  xFE)==0x00 );.  
15b40 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4d        pList = pM
15b50 73 72 2d 3e 61 42 75 66 66 65 72 3b 0a 20 20 20  sr->aBuffer;.   
15b60 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
15b70 70 4d 73 72 2d 3e 69 43 6f 6c 46 69 6c 74 65 72  pMsr->iColFilter
15b80 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  >=0 ){.        f
15b90 74 73 33 43 6f 6c 75 6d 6e 46 69 6c 74 65 72 28  ts3ColumnFilter(
15ba0 70 4d 73 72 2d 3e 69 43 6f 6c 46 69 6c 74 65 72  pMsr->iColFilter
15bb0 2c 20 31 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c  , 1, &pList, &nL
15bc0 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ist);.      }.. 
15bd0 20 20 20 20 20 69 66 28 20 6e 4c 69 73 74 3e 30       if( nList>0
15be0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 61 50   ){.        *paP
15bf0 6f 73 6c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  oslist = pList;.
15c00 20 20 20 20 20 20 20 20 2a 70 69 44 6f 63 69 64          *piDocid
15c10 20 3d 20 69 44 6f 63 69 64 3b 0a 20 20 20 20 20   = iDocid;.     
15c20 20 20 20 2a 70 6e 50 6f 73 6c 69 73 74 20 3d 20     *pnPoslist = 
15c30 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 62  nList;.        b
15c40 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
15c50 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
15c60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
15c70 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53  static int fts3S
15c80 65 67 52 65 61 64 65 72 53 74 61 72 74 28 0a 20  egReaderStart(. 
15c90 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
15ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cb0 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
15cc0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74  e handle */.  Ft
15cd0 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
15ce0 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 2f 2a   *pCsr,       /*
15cf0 20 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a   Cursor object *
15d00 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
15d10 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  zTerm,          
15d20 20 20 20 20 2f 2a 20 54 65 72 6d 20 73 65 61 72      /* Term sear
15d30 63 68 65 64 20 66 6f 72 20 28 6f 72 20 4e 55 4c  ched for (or NUL
15d40 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72  L) */.  int nTer
15d50 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
15d60 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
15d70 68 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62 79  h of zTerm in by
15d80 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tes */.){.  int 
15d90 69 3b 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d 20  i;.  int nSeg = 
15da0 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a  pCsr->nSegment;.
15db0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46 74 73  .  /* If the Fts
15dc0 33 53 65 67 46 69 6c 74 65 72 20 64 65 66 69 6e  3SegFilter defin
15dd0 65 73 20 61 20 73 70 65 63 69 66 69 63 20 74 65  es a specific te
15de0 72 6d 20 28 6f 72 20 74 65 72 6d 20 70 72 65 66  rm (or term pref
15df0 69 78 29 20 74 6f 20 73 65 61 72 63 68 20 0a 20  ix) to search . 
15e00 20 2a 2a 20 66 6f 72 2c 20 74 68 65 6e 20 61 64   ** for, then ad
15e10 76 61 6e 63 65 20 65 61 63 68 20 73 65 67 6d 65  vance each segme
15e20 6e 74 20 69 74 65 72 61 74 6f 72 20 75 6e 74 69  nt iterator unti
15e30 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  l it points to a
15e40 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 65 71   term of.  ** eq
15e50 75 61 6c 20 6f 72 20 67 72 65 61 74 65 72 20 76  ual or greater v
15e60 61 6c 75 65 20 74 68 61 6e 20 74 68 65 20 73 70  alue than the sp
15e70 65 63 69 66 69 65 64 20 74 65 72 6d 2e 20 54 68  ecified term. Th
15e80 69 73 20 70 72 65 76 65 6e 74 73 20 6d 61 6e 79  is prevents many
15e90 0a 20 20 2a 2a 20 75 6e 6e 65 63 65 73 73 61 72  .  ** unnecessar
15ea0 79 20 6d 65 72 67 65 2f 73 6f 72 74 20 6f 70 65  y merge/sort ope
15eb0 72 61 74 69 6f 6e 73 20 66 6f 72 20 74 68 65 20  rations for the 
15ec0 63 61 73 65 20 77 68 65 72 65 20 73 69 6e 67 6c  case where singl
15ed0 65 20 73 65 67 6d 65 6e 74 0a 20 20 2a 2a 20 62  e segment.  ** b
15ee0 2d 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73  -tree leaf nodes
15ef0 20 63 6f 6e 74 61 69 6e 20 6d 6f 72 65 20 74 68   contain more th
15f00 61 6e 20 6f 6e 65 20 74 65 72 6d 2e 0a 20 20 2a  an one term..  *
15f10 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 43 73  /.  for(i=0; pCs
15f20 72 2d 3e 62 52 65 73 74 61 72 74 3d 3d 30 20 26  r->bRestart==0 &
15f30 26 20 69 3c 70 43 73 72 2d 3e 6e 53 65 67 6d 65  & i<pCsr->nSegme
15f40 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  nt; i++){.    in
15f50 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 46  t res = 0;.    F
15f60 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 53  ts3SegReader *pS
15f70 65 67 20 3d 20 70 43 73 72 2d 3e 61 70 53 65 67  eg = pCsr->apSeg
15f80 6d 65 6e 74 5b 69 5d 3b 0a 20 20 20 20 64 6f 20  ment[i];.    do 
15f90 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  {.      int rc =
15fa0 20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e 65   fts3SegReaderNe
15fb0 78 74 28 70 2c 20 70 53 65 67 2c 20 30 29 3b 0a  xt(p, pSeg, 0);.
15fc0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
15fd0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
15fe0 20 72 63 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28   rc;.    }while(
15ff0 20 7a 54 65 72 6d 20 26 26 20 28 72 65 73 20 3d   zTerm && (res =
16000 20 66 74 73 33 53 65 67 52 65 61 64 65 72 54 65   fts3SegReaderTe
16010 72 6d 43 6d 70 28 70 53 65 67 2c 20 7a 54 65 72  rmCmp(pSeg, zTer
16020 6d 2c 20 6e 54 65 72 6d 29 29 3c 30 20 29 3b 0a  m, nTerm))<0 );.
16030 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 62  .    if( pSeg->b
16040 4c 6f 6f 6b 75 70 20 26 26 20 72 65 73 21 3d 30  Lookup && res!=0
16050 20 29 7b 0a 20 20 20 20 20 20 66 74 73 33 53 65   ){.      fts3Se
16060 67 52 65 61 64 65 72 53 65 74 45 6f 66 28 70 53  gReaderSetEof(pS
16070 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eg);.    }.  }. 
16080 20 66 74 73 33 53 65 67 52 65 61 64 65 72 53 6f   fts3SegReaderSo
16090 72 74 28 70 43 73 72 2d 3e 61 70 53 65 67 6d 65  rt(pCsr->apSegme
160a0 6e 74 2c 20 6e 53 65 67 2c 20 6e 53 65 67 2c 20  nt, nSeg, nSeg, 
160b0 66 74 73 33 53 65 67 52 65 61 64 65 72 43 6d 70  fts3SegReaderCmp
160c0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  );..  return SQL
160d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73  ITE_OK;.}..int s
160e0 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61  qlite3Fts3SegRea
160f0 64 65 72 53 74 61 72 74 28 0a 20 20 46 74 73 33  derStart(.  Fts3
16100 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
16110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
16120 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
16130 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c  dle */.  Fts3Mul
16140 74 69 53 65 67 52 65 61 64 65 72 20 2a 70 43 73  tiSegReader *pCs
16150 72 2c 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73  r,       /* Curs
16160 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  or object */.  F
16170 74 73 33 53 65 67 46 69 6c 74 65 72 20 2a 70 46  ts3SegFilter *pF
16180 69 6c 74 65 72 20 20 20 20 20 20 20 20 20 20 2f  ilter          /
16190 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 6f  * Restrictions o
161a0 6e 20 72 61 6e 67 65 20 6f 66 20 69 74 65 72 61  n range of itera
161b0 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 70 43 73  tion */.){.  pCs
161c0 72 2d 3e 70 46 69 6c 74 65 72 20 3d 20 70 46 69  r->pFilter = pFi
161d0 6c 74 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 66  lter;.  return f
161e0 74 73 33 53 65 67 52 65 61 64 65 72 53 74 61 72  ts3SegReaderStar
161f0 74 28 70 2c 20 70 43 73 72 2c 20 70 46 69 6c 74  t(p, pCsr, pFilt
16200 65 72 2d 3e 7a 54 65 72 6d 2c 20 70 46 69 6c 74  er->zTerm, pFilt
16210 65 72 2d 3e 6e 54 65 72 6d 29 3b 0a 7d 0a 0a 69  er->nTerm);.}..i
16220 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 4d 73  nt sqlite3Fts3Ms
16230 72 49 6e 63 72 53 74 61 72 74 28 0a 20 20 46 74  rIncrStart(.  Ft
16240 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
16250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16260 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68   Virtual table h
16270 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 4d  andle */.  Fts3M
16280 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70  ultiSegReader *p
16290 43 73 72 2c 20 20 20 20 20 20 20 2f 2a 20 43 75  Csr,       /* Cu
162a0 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  rsor object */. 
162b0 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20   int iCol,      
162c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162d0 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 6d 61   /* Column to ma
162e0 74 63 68 20 6f 6e 2e 20 2a 2f 0a 20 20 63 6f 6e  tch on. */.  con
162f0 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20  st char *zTerm, 
16300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16310 54 65 72 6d 20 74 6f 20 69 74 65 72 61 74 65 20  Term to iterate 
16320 74 68 72 6f 75 67 68 20 61 20 64 6f 63 6c 69 73  through a doclis
16330 74 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  t for */.  int n
16340 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
16350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
16360 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
16370 20 7a 54 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69   zTerm */.){.  i
16380 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nt i;.  int rc;.
16390 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d    int nSegment =
163a0 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b   pCsr->nSegment;
163b0 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70 29 28 46  .  int (*xCmp)(F
163c0 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2c 20  ts3SegReader *, 
163d0 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 29  Fts3SegReader *)
163e0 20 3d 20 28 0a 20 20 20 20 70 2d 3e 62 44 65 73   = (.    p->bDes
163f0 63 49 64 78 20 3f 20 66 74 73 33 53 65 67 52 65  cIdx ? fts3SegRe
16400 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 52 65  aderDoclistCmpRe
16410 76 20 3a 20 66 74 73 33 53 65 67 52 65 61 64 65  v : fts3SegReade
16420 72 44 6f 63 6c 69 73 74 43 6d 70 0a 20 20 29 3b  rDoclistCmp.  );
16430 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72  ..  assert( pCsr
16440 2d 3e 70 46 69 6c 74 65 72 3d 3d 30 20 29 3b 0a  ->pFilter==0 );.
16450 20 20 61 73 73 65 72 74 28 20 7a 54 65 72 6d 20    assert( zTerm 
16460 26 26 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20  && nTerm>0 );.. 
16470 20 2f 2a 20 41 64 76 61 6e 63 65 20 65 61 63 68   /* Advance each
16480 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f   segment iterato
16490 72 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74  r until it point
164a0 73 20 74 6f 20 74 68 65 20 74 65 72 6d 20 7a 54  s to the term zT
164b0 65 72 6d 2f 6e 54 65 72 6d 2e 20 2a 2f 0a 20 20  erm/nTerm. */.  
164c0 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64  rc = fts3SegRead
164d0 65 72 53 74 61 72 74 28 70 2c 20 70 43 73 72 2c  erStart(p, pCsr,
164e0 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   zTerm, nTerm);.
164f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16500 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
16510 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65  ..  /* Determine
16520 20 68 6f 77 20 6d 61 6e 79 20 6f 66 20 74 68 65   how many of the
16530 20 73 65 67 6d 65 6e 74 73 20 61 63 74 75 61 6c   segments actual
16540 6c 79 20 70 6f 69 6e 74 20 74 6f 20 7a 54 65 72  ly point to zTer
16550 6d 2f 6e 54 65 72 6d 2e 20 2a 2f 0a 20 20 66 6f  m/nTerm. */.  fo
16560 72 28 69 3d 30 3b 20 69 3c 6e 53 65 67 6d 65 6e  r(i=0; i<nSegmen
16570 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73  t; i++){.    Fts
16580 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67  3SegReader *pSeg
16590 20 3d 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65   = pCsr->apSegme
165a0 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 21  nt[i];.    if( !
165b0 70 53 65 67 2d 3e 61 4e 6f 64 65 20 7c 7c 20 66  pSeg->aNode || f
165c0 74 73 33 53 65 67 52 65 61 64 65 72 54 65 72 6d  ts3SegReaderTerm
165d0 43 6d 70 28 70 53 65 67 2c 20 7a 54 65 72 6d 2c  Cmp(pSeg, zTerm,
165e0 20 6e 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 20   nTerm) ){.     
165f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
16600 7d 0a 20 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e  }.  pCsr->nAdvan
16610 63 65 20 3d 20 69 3b 0a 0a 20 20 2f 2a 20 41 64  ce = i;..  /* Ad
16620 76 61 6e 63 65 20 65 61 63 68 20 6f 66 20 74 68  vance each of th
16630 65 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 70 6f  e segments to po
16640 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  int to the first
16650 20 64 6f 63 69 64 2e 20 2a 2f 0a 20 20 66 6f 72   docid. */.  for
16660 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 41  (i=0; i<pCsr->nA
16670 64 76 61 6e 63 65 3b 20 69 2b 2b 29 7b 0a 20 20  dvance; i++){.  
16680 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65    rc = fts3SegRe
16690 61 64 65 72 46 69 72 73 74 44 6f 63 69 64 28 70  aderFirstDocid(p
166a0 2c 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e  , pCsr->apSegmen
166b0 74 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  t[i]);.    if( r
166c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
166d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
166e0 66 74 73 33 53 65 67 52 65 61 64 65 72 53 6f 72  fts3SegReaderSor
166f0 74 28 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e  t(pCsr->apSegmen
16700 74 2c 20 69 2c 20 69 2c 20 78 43 6d 70 29 3b 0a  t, i, i, xCmp);.
16710 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3c  .  assert( iCol<
16720 30 20 7c 7c 20 69 43 6f 6c 3c 70 2d 3e 6e 43 6f  0 || iCol<p->nCo
16730 6c 75 6d 6e 20 29 3b 0a 20 20 70 43 73 72 2d 3e  lumn );.  pCsr->
16740 69 43 6f 6c 46 69 6c 74 65 72 20 3d 20 69 43 6f  iColFilter = iCo
16750 6c 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  l;..  return SQL
16760 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
16770 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
16780 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 4d 75  s called on a Mu
16790 6c 74 69 53 65 67 52 65 61 64 65 72 20 74 68 61  ltiSegReader tha
167a0 74 20 68 61 73 20 62 65 65 6e 20 73 74 61 72 74  t has been start
167b0 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  ed using.** sqli
167c0 74 65 33 46 74 73 33 4d 73 72 49 6e 63 72 53 74  te3Fts3MsrIncrSt
167d0 61 72 74 28 29 2e 20 4f 6e 65 20 6f 72 20 6d 6f  art(). One or mo
167e0 72 65 20 63 61 6c 6c 73 20 74 6f 20 4d 73 72 49  re calls to MsrI
167f0 6e 63 72 4e 65 78 74 28 29 20 6d 61 79 20 61 6c  ncrNext() may al
16800 73 6f 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  so.** have been 
16810 6d 61 64 65 2e 20 43 61 6c 6c 69 6e 67 20 74 68  made. Calling th
16820 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 75 74 73  is function puts
16830 20 74 68 65 20 4d 75 6c 74 69 53 65 67 52 65 61   the MultiSegRea
16840 64 65 72 20 69 6e 20 73 75 63 68 0a 2a 2a 20 61  der in such.** a
16850 20 73 74 61 74 65 20 74 68 61 74 20 69 66 20 74   state that if t
16860 68 65 20 6e 65 78 74 20 74 77 6f 20 63 61 6c 6c  he next two call
16870 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 73  s are:.**.**   s
16880 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61  qlite3Fts3SegRea
16890 64 65 72 53 74 61 72 74 28 29 0a 2a 2a 20 20 20  derStart().**   
168a0 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
168b0 61 64 65 72 53 74 65 70 28 29 0a 2a 2a 0a 2a 2a  aderStep().**.**
168c0 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65   then the entire
168d0 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 65   doclist for the
168e0 20 74 65 72 6d 20 69 73 20 61 76 61 69 6c 61 62   term is availab
168f0 6c 65 20 69 6e 20 0a 2a 2a 20 4d 75 6c 74 69 53  le in .** MultiS
16900 65 67 52 65 61 64 65 72 2e 61 44 6f 63 6c 69 73  egReader.aDoclis
16910 74 2f 6e 44 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 69  t/nDoclist..*/.i
16920 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 4d 73  nt sqlite3Fts3Ms
16930 72 49 6e 63 72 52 65 73 74 61 72 74 28 46 74 73  rIncrRestart(Fts
16940 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20  3MultiSegReader 
16950 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74 20 69 3b  *pCsr){.  int i;
16960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
16980 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
16990 6f 75 67 68 20 73 65 67 6d 65 6e 74 2d 72 65 61  ough segment-rea
169a0 64 65 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ders */..  asser
169b0 74 28 20 70 43 73 72 2d 3e 7a 54 65 72 6d 3d 3d  t( pCsr->zTerm==
169c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
169d0 43 73 72 2d 3e 6e 54 65 72 6d 3d 3d 30 20 29 3b  Csr->nTerm==0 );
169e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d  .  assert( pCsr-
169f0 3e 61 44 6f 63 6c 69 73 74 3d 3d 30 20 29 3b 0a  >aDoclist==0 );.
16a00 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
16a10 6e 44 6f 63 6c 69 73 74 3d 3d 30 20 29 3b 0a 0a  nDoclist==0 );..
16a20 20 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65    pCsr->nAdvance
16a30 20 3d 20 30 3b 0a 20 20 70 43 73 72 2d 3e 62 52   = 0;.  pCsr->bR
16a40 65 73 74 61 72 74 20 3d 20 31 3b 0a 20 20 66 6f  estart = 1;.  fo
16a50 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e  r(i=0; i<pCsr->n
16a60 53 65 67 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20  Segment; i++){. 
16a70 20 20 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65     pCsr->apSegme
16a80 6e 74 5b 69 5d 2d 3e 70 4f 66 66 73 65 74 4c 69  nt[i]->pOffsetLi
16a90 73 74 20 3d 20 30 3b 0a 20 20 20 20 70 43 73 72  st = 0;.    pCsr
16aa0 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69 5d 2d 3e  ->apSegment[i]->
16ab0 6e 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 30 3b  nOffsetList = 0;
16ac0 0a 20 20 20 20 70 43 73 72 2d 3e 61 70 53 65 67  .    pCsr->apSeg
16ad0 6d 65 6e 74 5b 69 5d 2d 3e 69 44 6f 63 69 64 20  ment[i]->iDocid 
16ae0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 0;.  }..  retu
16af0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
16b00 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
16b10 33 53 65 67 52 65 61 64 65 72 53 74 65 70 28 0a  3SegReaderStep(.
16b20 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
16b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b40 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
16b50 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46  le handle */.  F
16b60 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
16b70 72 20 2a 70 43 73 72 20 20 20 20 20 20 20 20 2f  r *pCsr        /
16b80 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  * Cursor object 
16b90 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
16ba0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
16bb0 6e 74 20 69 73 49 67 6e 6f 72 65 45 6d 70 74 79  nt isIgnoreEmpty
16bc0 20 3d 20 20 28 70 43 73 72 2d 3e 70 46 69 6c 74   =  (pCsr->pFilt
16bd0 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 33  er->flags & FTS3
16be0 5f 53 45 47 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f  _SEGMENT_IGNORE_
16bf0 45 4d 50 54 59 29 3b 0a 20 20 69 6e 74 20 69 73  EMPTY);.  int is
16c00 52 65 71 75 69 72 65 50 6f 73 20 3d 20 20 20 28  RequirePos =   (
16c10 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e 66  pCsr->pFilter->f
16c20 6c 61 67 73 20 26 20 46 54 53 33 5f 53 45 47 4d  lags & FTS3_SEGM
16c30 45 4e 54 5f 52 45 51 55 49 52 45 5f 50 4f 53 29  ENT_REQUIRE_POS)
16c40 3b 0a 20 20 69 6e 74 20 69 73 43 6f 6c 46 69 6c  ;.  int isColFil
16c50 74 65 72 20 3d 20 20 20 20 28 70 43 73 72 2d 3e  ter =    (pCsr->
16c60 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26  pFilter->flags &
16c70 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 43 4f   FTS3_SEGMENT_CO
16c80 4c 55 4d 4e 5f 46 49 4c 54 45 52 29 3b 0a 20 20  LUMN_FILTER);.  
16c90 69 6e 74 20 69 73 50 72 65 66 69 78 20 3d 20 20  int isPrefix =  
16ca0 20 20 20 20 20 28 70 43 73 72 2d 3e 70 46 69 6c       (pCsr->pFil
16cb0 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
16cc0 33 5f 53 45 47 4d 45 4e 54 5f 50 52 45 46 49 58  3_SEGMENT_PREFIX
16cd0 29 3b 0a 20 20 69 6e 74 20 69 73 53 63 61 6e 20  );.  int isScan 
16ce0 3d 20 20 20 20 20 20 20 20 20 28 70 43 73 72 2d  =         (pCsr-
16cf0 3e 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20  >pFilter->flags 
16d00 26 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 53  & FTS3_SEGMENT_S
16d10 43 41 4e 29 3b 0a 20 20 69 6e 74 20 69 73 46 69  CAN);.  int isFi
16d20 72 73 74 20 3d 20 20 20 20 20 20 20 20 28 70 43  rst =        (pC
16d30 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e 66 6c 61  sr->pFilter->fla
16d40 67 73 20 26 20 46 54 53 33 5f 53 45 47 4d 45 4e  gs & FTS3_SEGMEN
16d50 54 5f 46 49 52 53 54 29 3b 0a 0a 20 20 46 74 73  T_FIRST);..  Fts
16d60 33 53 65 67 52 65 61 64 65 72 20 2a 2a 61 70 53  3SegReader **apS
16d70 65 67 6d 65 6e 74 20 3d 20 70 43 73 72 2d 3e 61  egment = pCsr->a
16d80 70 53 65 67 6d 65 6e 74 3b 0a 20 20 69 6e 74 20  pSegment;.  int 
16d90 6e 53 65 67 6d 65 6e 74 20 3d 20 70 43 73 72 2d  nSegment = pCsr-
16da0 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 46 74 73  >nSegment;.  Fts
16db0 33 53 65 67 46 69 6c 74 65 72 20 2a 70 46 69 6c  3SegFilter *pFil
16dc0 74 65 72 20 3d 20 70 43 73 72 2d 3e 70 46 69 6c  ter = pCsr->pFil
16dd0 74 65 72 3b 0a 20 20 69 6e 74 20 28 2a 78 43 6d  ter;.  int (*xCm
16de0 70 29 28 46 74 73 33 53 65 67 52 65 61 64 65 72  p)(Fts3SegReader
16df0 20 2a 2c 20 46 74 73 33 53 65 67 52 65 61 64 65   *, Fts3SegReade
16e00 72 20 2a 29 20 3d 20 28 0a 20 20 20 20 70 2d 3e  r *) = (.    p->
16e10 62 44 65 73 63 49 64 78 20 3f 20 66 74 73 33 53  bDescIdx ? fts3S
16e20 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43  egReaderDoclistC
16e30 6d 70 52 65 76 20 3a 20 66 74 73 33 53 65 67 52  mpRev : fts3SegR
16e40 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 0a  eaderDoclistCmp.
16e50 20 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 73 72    );..  if( pCsr
16e60 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 30 20 29 20  ->nSegment==0 ) 
16e70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16e80 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 6e  ;..  do {.    in
16e90 74 20 6e 4d 65 72 67 65 3b 0a 20 20 20 20 69 6e  t nMerge;.    in
16ea0 74 20 69 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41  t i;.  .    /* A
16eb0 64 76 61 6e 63 65 20 74 68 65 20 66 69 72 73 74  dvance the first
16ec0 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65 20   pCsr->nAdvance 
16ed0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 61  entries in the a
16ee0 70 53 65 67 6d 65 6e 74 5b 5d 20 61 72 72 61 79  pSegment[] array
16ef0 0a 20 20 20 20 2a 2a 20 66 6f 72 77 61 72 64 2e  .    ** forward.
16f00 20 54 68 65 6e 20 73 6f 72 74 20 74 68 65 20 6c   Then sort the l
16f10 69 73 74 20 69 6e 20 6f 72 64 65 72 20 6f 66 20  ist in order of 
16f20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 61 67 61  current term aga
16f30 69 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20  in.  .    */.   
16f40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72   for(i=0; i<pCsr
16f50 2d 3e 6e 41 64 76 61 6e 63 65 3b 20 69 2b 2b 29  ->nAdvance; i++)
16f60 7b 0a 20 20 20 20 20 20 46 74 73 33 53 65 67 52  {.      Fts3SegR
16f70 65 61 64 65 72 20 2a 70 53 65 67 20 3d 20 61 70  eader *pSeg = ap
16f80 53 65 67 6d 65 6e 74 5b 69 5d 3b 0a 20 20 20 20  Segment[i];.    
16f90 20 20 69 66 28 20 70 53 65 67 2d 3e 62 4c 6f 6f    if( pSeg->bLoo
16fa0 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 20 20 66  kup ){.        f
16fb0 74 73 33 53 65 67 52 65 61 64 65 72 53 65 74 45  ts3SegReaderSetE
16fc0 6f 66 28 70 53 65 67 29 3b 0a 20 20 20 20 20 20  of(pSeg);.      
16fd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
16fe0 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65  c = fts3SegReade
16ff0 72 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 30  rNext(p, pSeg, 0
17000 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17010 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17020 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
17030 20 20 20 20 7d 0a 20 20 20 20 66 74 73 33 53 65      }.    fts3Se
17040 67 52 65 61 64 65 72 53 6f 72 74 28 61 70 53 65  gReaderSort(apSe
17050 67 6d 65 6e 74 2c 20 6e 53 65 67 6d 65 6e 74 2c  gment, nSegment,
17060 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65 2c   pCsr->nAdvance,
17070 20 66 74 73 33 53 65 67 52 65 61 64 65 72 43 6d   fts3SegReaderCm
17080 70 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 6e 41  p);.    pCsr->nA
17090 64 76 61 6e 63 65 20 3d 20 30 3b 0a 0a 20 20 20  dvance = 0;..   
170a0 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 73   /* If all the s
170b0 65 67 2d 72 65 61 64 65 72 73 20 61 72 65 20 61  eg-readers are a
170c0 74 20 45 4f 46 2c 20 77 65 27 72 65 20 66 69 6e  t EOF, we're fin
170d0 69 73 68 65 64 2e 20 72 65 74 75 72 6e 20 53 51  ished. return SQ
170e0 4c 49 54 45 5f 4f 4b 2e 20 2a 2f 0a 20 20 20 20  LITE_OK. */.    
170f0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
17100 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 69 66 28  TE_OK );.    if(
17110 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 61   apSegment[0]->a
17120 4e 6f 64 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Node==0 ) break;
17130 0a 0a 20 20 20 20 70 43 73 72 2d 3e 6e 54 65 72  ..    pCsr->nTer
17140 6d 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d  m = apSegment[0]
17150 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 70 43 73  ->nTerm;.    pCs
17160 72 2d 3e 7a 54 65 72 6d 20 3d 20 61 70 53 65 67  r->zTerm = apSeg
17170 6d 65 6e 74 5b 30 5d 2d 3e 7a 54 65 72 6d 3b 0a  ment[0]->zTerm;.
17180 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
17190 69 73 20 61 20 70 72 65 66 69 78 2d 73 65 61 72  is a prefix-sear
171a0 63 68 2c 20 61 6e 64 20 69 66 20 74 68 65 20 74  ch, and if the t
171b0 65 72 6d 20 74 68 61 74 20 61 70 53 65 67 6d 65  erm that apSegme
171c0 6e 74 5b 30 5d 20 70 6f 69 6e 74 73 0a 20 20 20  nt[0] points.   
171d0 20 2a 2a 20 74 6f 20 64 6f 65 73 20 6e 6f 74 20   ** to does not 
171e0 73 68 61 72 65 20 61 20 73 75 66 66 69 78 20 77  share a suffix w
171f0 69 74 68 20 70 46 69 6c 74 65 72 2d 3e 7a 54 65  ith pFilter->zTe
17200 72 6d 2f 6e 54 65 72 6d 2c 20 74 68 65 6e 20 61  rm/nTerm, then a
17210 6c 6c 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69  ll .    ** requi
17220 72 65 64 20 63 61 6c 6c 62 61 63 6b 73 20 68 61  red callbacks ha
17230 76 65 20 62 65 65 6e 20 6d 61 64 65 2e 20 49 6e  ve been made. In
17240 20 74 68 69 73 20 63 61 73 65 20 65 78 69 74 20   this case exit 
17250 65 61 72 6c 79 2e 0a 20 20 20 20 2a 2a 0a 20 20  early..    **.  
17260 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20    ** Similarly, 
17270 69 66 20 74 68 69 73 20 69 73 20 61 20 73 65 61  if this is a sea
17280 72 63 68 20 66 6f 72 20 61 6e 20 65 78 61 63 74  rch for an exact
17290 20 6d 61 74 63 68 2c 20 61 6e 64 20 74 68 65 20   match, and the 
172a0 66 69 72 73 74 20 74 65 72 6d 0a 20 20 20 20 2a  first term.    *
172b0 2a 20 6f 66 20 73 65 67 6d 65 6e 74 20 61 70 53  * of segment apS
172c0 65 67 6d 65 6e 74 5b 30 5d 20 69 73 20 6e 6f 74  egment[0] is not
172d0 20 61 20 6d 61 74 63 68 2c 20 65 78 69 74 20 65   a match, exit e
172e0 61 72 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  arly..    */.   
172f0 20 69 66 28 20 70 46 69 6c 74 65 72 2d 3e 7a 54   if( pFilter->zT
17300 65 72 6d 20 26 26 20 21 69 73 53 63 61 6e 20 29  erm && !isScan )
17310 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 73 72  {.      if( pCsr
17320 2d 3e 6e 54 65 72 6d 3c 70 46 69 6c 74 65 72 2d  ->nTerm<pFilter-
17330 3e 6e 54 65 72 6d 20 0a 20 20 20 20 20 20 20 7c  >nTerm .       |
17340 7c 20 28 21 69 73 50 72 65 66 69 78 20 26 26 20  | (!isPrefix && 
17350 70 43 73 72 2d 3e 6e 54 65 72 6d 3e 70 46 69 6c  pCsr->nTerm>pFil
17360 74 65 72 2d 3e 6e 54 65 72 6d 29 0a 20 20 20 20  ter->nTerm).    
17370 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 43 73     || memcmp(pCs
17380 72 2d 3e 7a 54 65 72 6d 2c 20 70 46 69 6c 74 65  r->zTerm, pFilte
17390 72 2d 3e 7a 54 65 72 6d 2c 20 70 46 69 6c 74 65  r->zTerm, pFilte
173a0 72 2d 3e 6e 54 65 72 6d 29 20 0a 20 20 20 20 20  r->nTerm) .     
173b0 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
173c0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
173d0 0a 0a 20 20 20 20 6e 4d 65 72 67 65 20 3d 20 31  ..    nMerge = 1
173e0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 4d 65  ;.    while( nMe
173f0 72 67 65 3c 6e 53 65 67 6d 65 6e 74 20 0a 20 20  rge<nSegment .  
17400 20 20 20 20 20 20 26 26 20 61 70 53 65 67 6d 65        && apSegme
17410 6e 74 5b 6e 4d 65 72 67 65 5d 2d 3e 61 4e 6f 64  nt[nMerge]->aNod
17420 65 0a 20 20 20 20 20 20 20 20 26 26 20 61 70 53  e.        && apS
17430 65 67 6d 65 6e 74 5b 6e 4d 65 72 67 65 5d 2d 3e  egment[nMerge]->
17440 6e 54 65 72 6d 3d 3d 70 43 73 72 2d 3e 6e 54 65  nTerm==pCsr->nTe
17450 72 6d 20 0a 20 20 20 20 20 20 20 20 26 26 20 30  rm .        && 0
17460 3d 3d 6d 65 6d 63 6d 70 28 70 43 73 72 2d 3e 7a  ==memcmp(pCsr->z
17470 54 65 72 6d 2c 20 61 70 53 65 67 6d 65 6e 74 5b  Term, apSegment[
17480 6e 4d 65 72 67 65 5d 2d 3e 7a 54 65 72 6d 2c 20  nMerge]->zTerm, 
17490 70 43 73 72 2d 3e 6e 54 65 72 6d 29 0a 20 20 20  pCsr->nTerm).   
174a0 20 29 7b 0a 20 20 20 20 20 20 6e 4d 65 72 67 65   ){.      nMerge
174b0 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  ++;.    }..    a
174c0 73 73 65 72 74 28 20 69 73 49 67 6e 6f 72 65 45  ssert( isIgnoreE
174d0 6d 70 74 79 20 7c 7c 20 28 69 73 52 65 71 75 69  mpty || (isRequi
174e0 72 65 50 6f 73 20 26 26 20 21 69 73 43 6f 6c 46  rePos && !isColF
174f0 69 6c 74 65 72 29 20 29 3b 0a 20 20 20 20 69 66  ilter) );.    if
17500 28 20 6e 4d 65 72 67 65 3d 3d 31 20 0a 20 20 20  ( nMerge==1 .   
17510 20 20 26 26 20 21 69 73 49 67 6e 6f 72 65 45 6d    && !isIgnoreEm
17520 70 74 79 20 0a 20 20 20 20 20 26 26 20 21 69 73  pty .     && !is
17530 46 69 72 73 74 20 0a 20 20 20 20 20 26 26 20 28  First .     && (
17540 70 2d 3e 62 44 65 73 63 49 64 78 3d 3d 30 20 7c  p->bDescIdx==0 |
17550 7c 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49  | fts3SegReaderI
17560 73 50 65 6e 64 69 6e 67 28 61 70 53 65 67 6d 65  sPending(apSegme
17570 6e 74 5b 30 5d 29 3d 3d 30 29 0a 20 20 20 20 29  nt[0])==0).    )
17580 7b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 6e 44  {.      pCsr->nD
17590 6f 63 6c 69 73 74 20 3d 20 61 70 53 65 67 6d 65  oclist = apSegme
175a0 6e 74 5b 30 5d 2d 3e 6e 44 6f 63 6c 69 73 74 3b  nt[0]->nDoclist;
175b0 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 33 53  .      if( fts3S
175c0 65 67 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e  egReaderIsPendin
175d0 67 28 61 70 53 65 67 6d 65 6e 74 5b 30 5d 29 20  g(apSegment[0]) 
175e0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
175f0 66 74 73 33 4d 73 72 42 75 66 66 65 72 44 61 74  fts3MsrBufferDat
17600 61 28 70 43 73 72 2c 20 61 70 53 65 67 6d 65 6e  a(pCsr, apSegmen
17610 74 5b 30 5d 2d 3e 61 44 6f 63 6c 69 73 74 2c 20  t[0]->aDoclist, 
17620 70 43 73 72 2d 3e 6e 44 6f 63 6c 69 73 74 29 3b  pCsr->nDoclist);
17630 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 61  .        pCsr->a
17640 44 6f 63 6c 69 73 74 20 3d 20 70 43 73 72 2d 3e  Doclist = pCsr->
17650 61 42 75 66 66 65 72 3b 0a 20 20 20 20 20 20 7d  aBuffer;.      }
17660 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
17670 73 72 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20 61  sr->aDoclist = a
17680 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 61 44 6f  pSegment[0]->aDo
17690 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  clist;.      }. 
176a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
176b0 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51  ITE_OK ) rc = SQ
176c0 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 20 20 7d 65  LITE_ROW;.    }e
176d0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
176e0 44 6f 63 6c 69 73 74 20 3d 20 30 3b 20 20 20 20  Doclist = 0;    
176f0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
17700 66 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 20  f doclist */.   
17710 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
17720 20 69 50 72 65 76 20 3d 20 30 3b 20 20 20 20 2f   iPrev = 0;    /
17730 2a 20 50 72 65 76 69 6f 75 73 20 64 6f 63 69 64  * Previous docid
17740 20 73 74 6f 72 65 64 20 69 6e 20 64 6f 63 6c 69   stored in docli
17750 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  st */..      /* 
17760 54 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d  The current term
17770 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6e 4d   of the first nM
17780 65 72 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  erge entries in 
17790 74 68 65 20 61 72 72 61 79 0a 20 20 20 20 20 20  the array.      
177a0 2a 2a 20 6f 66 20 46 74 73 33 53 65 67 52 65 61  ** of Fts3SegRea
177b0 64 65 72 20 6f 62 6a 65 63 74 73 20 69 73 20 74  der objects is t
177c0 68 65 20 73 61 6d 65 2e 20 54 68 65 20 64 6f 63  he same. The doc
177d0 6c 69 73 74 73 20 6d 75 73 74 20 62 65 20 6d 65  lists must be me
177e0 72 67 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 6e  rged.      ** an
177f0 64 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  d a single term 
17800 72 65 74 75 72 6e 65 64 20 77 69 74 68 20 74 68  returned with th
17810 65 20 6d 65 72 67 65 64 20 64 6f 63 6c 69 73 74  e merged doclist
17820 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
17830 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4d 65 72   for(i=0; i<nMer
17840 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
17850 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72 46    fts3SegReaderF
17860 69 72 73 74 44 6f 63 69 64 28 70 2c 20 61 70 53  irstDocid(p, apS
17870 65 67 6d 65 6e 74 5b 69 5d 29 3b 0a 20 20 20 20  egment[i]);.    
17880 20 20 7d 0a 20 20 20 20 20 20 66 74 73 33 53 65    }.      fts3Se
17890 67 52 65 61 64 65 72 53 6f 72 74 28 61 70 53 65  gReaderSort(apSe
178a0 67 6d 65 6e 74 2c 20 6e 4d 65 72 67 65 2c 20 6e  gment, nMerge, n
178b0 4d 65 72 67 65 2c 20 78 43 6d 70 29 3b 0a 20 20  Merge, xCmp);.  
178c0 20 20 20 20 77 68 69 6c 65 28 20 61 70 53 65 67      while( apSeg
178d0 6d 65 6e 74 5b 30 5d 2d 3e 70 4f 66 66 73 65 74  ment[0]->pOffset
178e0 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
178f0 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
17900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
17910 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
17920 74 68 61 74 20 73 68 61 72 65 20 61 20 64 6f 63  that share a doc
17930 69 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68  id */.        ch
17940 61 72 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 20  ar *pList;.     
17950 20 20 20 69 6e 74 20 6e 4c 69 73 74 3b 0a 20 20     int nList;.  
17960 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b        int nByte;
17970 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17980 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 20 3d 20  _int64 iDocid = 
17990 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 69 44  apSegment[0]->iD
179a0 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20 66 74  ocid;.        ft
179b0 73 33 53 65 67 52 65 61 64 65 72 4e 65 78 74 44  s3SegReaderNextD
179c0 6f 63 69 64 28 70 2c 20 61 70 53 65 67 6d 65 6e  ocid(p, apSegmen
179d0 74 5b 30 5d 2c 20 26 70 4c 69 73 74 2c 20 26 6e  t[0], &pList, &n
179e0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 6a  List);.        j
179f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68   = 1;.        wh
17a00 69 6c 65 28 20 6a 3c 6e 4d 65 72 67 65 0a 20 20  ile( j<nMerge.  
17a10 20 20 20 20 20 20 20 20 20 20 26 26 20 61 70 53            && apS
17a20 65 67 6d 65 6e 74 5b 6a 5d 2d 3e 70 4f 66 66 73  egment[j]->pOffs
17a30 65 74 4c 69 73 74 0a 20 20 20 20 20 20 20 20 20  etList.         
17a40 20 20 20 26 26 20 61 70 53 65 67 6d 65 6e 74 5b     && apSegment[
17a50 6a 5d 2d 3e 69 44 6f 63 69 64 3d 3d 69 44 6f 63  j]->iDocid==iDoc
17a60 69 64 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  id.        ){.  
17a70 20 20 20 20 20 20 20 20 66 74 73 33 53 65 67 52          fts3SegR
17a80 65 61 64 65 72 4e 65 78 74 44 6f 63 69 64 28 70  eaderNextDocid(p
17a90 2c 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2c 20  , apSegment[j], 
17aa0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
17ab0 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a   j++;.        }.
17ac0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 43  .        if( isC
17ad0 6f 6c 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20  olFilter ){.    
17ae0 20 20 20 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e        fts3Column
17af0 46 69 6c 74 65 72 28 70 46 69 6c 74 65 72 2d 3e  Filter(pFilter->
17b00 69 43 6f 6c 2c 20 30 2c 20 26 70 4c 69 73 74 2c  iCol, 0, &pList,
17b10 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20   &nList);.      
17b20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
17b30 20 21 69 73 49 67 6e 6f 72 65 45 6d 70 74 79 20   !isIgnoreEmpty 
17b40 7c 7c 20 6e 4c 69 73 74 3e 30 20 29 7b 0a 0a 20  || nList>0 ){.. 
17b50 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 63           /* Calc
17b60 75 6c 61 74 65 20 74 68 65 20 27 64 6f 63 69 64  ulate the 'docid
17b70 27 20 64 65 6c 74 61 20 76 61 6c 75 65 20 74 6f  ' delta value to
17b80 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65 20   write into the 
17b90 6d 65 72 67 65 64 20 0a 20 20 20 20 20 20 20 20  merged .        
17ba0 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2e 20 2a 2f    ** doclist. */
17bb0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
17bc0 65 33 5f 69 6e 74 36 34 20 69 44 65 6c 74 61 3b  e3_int64 iDelta;
17bd0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
17be0 2d 3e 62 44 65 73 63 49 64 78 20 26 26 20 6e 44  ->bDescIdx && nD
17bf0 6f 63 6c 69 73 74 3e 30 20 29 7b 0a 20 20 20 20  oclist>0 ){.    
17c00 20 20 20 20 20 20 20 20 69 44 65 6c 74 61 20 3d          iDelta =
17c10 20 69 50 72 65 76 20 2d 20 69 44 6f 63 69 64 3b   iPrev - iDocid;
17c20 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
17c30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 44  {.            iD
17c40 65 6c 74 61 20 3d 20 69 44 6f 63 69 64 20 2d 20  elta = iDocid - 
17c50 69 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20 20  iPrev;.         
17c60 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73   }.          ass
17c70 65 72 74 28 20 69 44 65 6c 74 61 3e 30 20 7c 7c  ert( iDelta>0 ||
17c80 20 28 6e 44 6f 63 6c 69 73 74 3d 3d 30 20 26 26   (nDoclist==0 &&
17c90 20 69 44 65 6c 74 61 3d 3d 69 44 6f 63 69 64 29   iDelta==iDocid)
17ca0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
17cb0 73 65 72 74 28 20 6e 44 6f 63 6c 69 73 74 3e 30  sert( nDoclist>0
17cc0 20 7c 7c 20 69 44 65 6c 74 61 3d 3d 69 44 6f 63   || iDelta==iDoc
17cd0 69 64 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  id );..         
17ce0 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33   nByte = sqlite3
17cf0 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 69 44  Fts3VarintLen(iD
17d00 65 6c 74 61 29 20 2b 20 28 69 73 52 65 71 75 69  elta) + (isRequi
17d10 72 65 50 6f 73 3f 6e 4c 69 73 74 2b 31 3a 30 29  rePos?nList+1:0)
17d20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
17d30 6e 44 6f 63 6c 69 73 74 2b 6e 42 79 74 65 3e 70  nDoclist+nByte>p
17d40 43 73 72 2d 3e 6e 42 75 66 66 65 72 20 29 7b 0a  Csr->nBuffer ){.
17d50 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
17d60 20 2a 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20   *aNew;.        
17d70 20 20 20 20 70 43 73 72 2d 3e 6e 42 75 66 66 65      pCsr->nBuffe
17d80 72 20 3d 20 28 6e 44 6f 63 6c 69 73 74 2b 6e 42  r = (nDoclist+nB
17d90 79 74 65 29 2a 32 3b 0a 20 20 20 20 20 20 20 20  yte)*2;.        
17da0 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74      aNew = sqlit
17db0 65 33 5f 72 65 61 6c 6c 6f 63 28 70 43 73 72 2d  e3_realloc(pCsr-
17dc0 3e 61 42 75 66 66 65 72 2c 20 70 43 73 72 2d 3e  >aBuffer, pCsr->
17dd0 6e 42 75 66 66 65 72 29 3b 0a 20 20 20 20 20 20  nBuffer);.      
17de0 20 20 20 20 20 20 69 66 28 20 21 61 4e 65 77 20        if( !aNew 
17df0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
17e00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
17e10 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
17e20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
17e30 70 43 73 72 2d 3e 61 42 75 66 66 65 72 20 3d 20  pCsr->aBuffer = 
17e40 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  aNew;.          
17e50 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  }..          if(
17e60 20 69 73 46 69 72 73 74 20 29 7b 0a 20 20 20 20   isFirst ){.    
17e70 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 61 20          char *a 
17e80 3d 20 26 70 43 73 72 2d 3e 61 42 75 66 66 65 72  = &pCsr->aBuffer
17e90 5b 6e 44 6f 63 6c 69 73 74 5d 3b 0a 20 20 20 20  [nDoclist];.    
17ea0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69          int nWri
17eb0 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 0a  te;.           .
17ec0 20 20 20 20 20 20 20 20 20 20 20 20 6e 57 72 69              nWri
17ed0 74 65 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  te = sqlite3Fts3
17ee0 46 69 72 73 74 46 69 6c 74 65 72 28 69 44 65 6c  FirstFilter(iDel
17ef0 74 61 2c 20 70 4c 69 73 74 2c 20 6e 4c 69 73 74  ta, pList, nList
17f00 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , a);.          
17f10 20 20 69 66 28 20 6e 57 72 69 74 65 20 29 7b 0a    if( nWrite ){.
17f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50                iP
17f30 72 65 76 20 3d 20 69 44 6f 63 69 64 3b 0a 20 20  rev = iDocid;.  
17f40 20 20 20 20 20 20 20 20 20 20 20 20 6e 44 6f 63              nDoc
17f50 6c 69 73 74 20 2b 3d 20 6e 57 72 69 74 65 3b 0a  list += nWrite;.
17f60 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
17f70 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
17f80 20 20 20 20 20 20 20 20 20 20 20 6e 44 6f 63 6c             nDocl
17f90 69 73 74 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ist += sqlite3Ft
17fa0 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 43 73  s3PutVarint(&pCs
17fb0 72 2d 3e 61 42 75 66 66 65 72 5b 6e 44 6f 63 6c  r->aBuffer[nDocl
17fc0 69 73 74 5d 2c 20 69 44 65 6c 74 61 29 3b 0a 20  ist], iDelta);. 
17fd0 20 20 20 20 20 20 20 20 20 20 20 69 50 72 65 76             iPrev
17fe0 20 3d 20 69 44 6f 63 69 64 3b 0a 20 20 20 20 20   = iDocid;.     
17ff0 20 20 20 20 20 20 20 69 66 28 20 69 73 52 65 71         if( isReq
18000 75 69 72 65 50 6f 73 20 29 7b 0a 20 20 20 20 20  uirePos ){.     
18010 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
18020 26 70 43 73 72 2d 3e 61 42 75 66 66 65 72 5b 6e  &pCsr->aBuffer[n
18030 44 6f 63 6c 69 73 74 5d 2c 20 70 4c 69 73 74 2c  Doclist], pList,
18040 20 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20   nList);.       
18050 20 20 20 20 20 20 20 6e 44 6f 63 6c 69 73 74 20         nDoclist 
18060 2b 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20  += nList;.      
18070 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 61 42          pCsr->aB
18080 75 66 66 65 72 5b 6e 44 6f 63 6c 69 73 74 2b 2b  uffer[nDoclist++
18090 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
180a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
180b0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20    }.        }.. 
180c0 20 20 20 20 20 20 20 66 74 73 33 53 65 67 52 65         fts3SegRe
180d0 61 64 65 72 53 6f 72 74 28 61 70 53 65 67 6d 65  aderSort(apSegme
180e0 6e 74 2c 20 6e 4d 65 72 67 65 2c 20 6a 2c 20 78  nt, nMerge, j, x
180f0 43 6d 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cmp);.      }.  
18100 20 20 20 20 69 66 28 20 6e 44 6f 63 6c 69 73 74      if( nDoclist
18110 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  >0 ){.        pC
18120 73 72 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20 70  sr->aDoclist = p
18130 43 73 72 2d 3e 61 42 75 66 66 65 72 3b 0a 20 20  Csr->aBuffer;.  
18140 20 20 20 20 20 20 70 43 73 72 2d 3e 6e 44 6f 63        pCsr->nDoc
18150 6c 69 73 74 20 3d 20 6e 44 6f 63 6c 69 73 74 3b  list = nDoclist;
18160 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
18170 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 20 20 20 20  LITE_ROW;.      
18180 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 73 72  }.    }.    pCsr
18190 2d 3e 6e 41 64 76 61 6e 63 65 20 3d 20 6e 4d 65  ->nAdvance = nMe
181a0 72 67 65 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72  rge;.  }while( r
181b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
181c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
181d0 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  ..void sqlite3Ft
181e0 73 33 53 65 67 52 65 61 64 65 72 46 69 6e 69 73  s3SegReaderFinis
181f0 68 28 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65  h(.  Fts3MultiSe
18200 67 52 65 61 64 65 72 20 2a 70 43 73 72 20 20 20  gReader *pCsr   
18210 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62      /* Cursor ob
18220 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ject */.){.  if(
18230 20 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74   pCsr ){.    int
18240 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
18250 20 69 3c 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e   i<pCsr->nSegmen
18260 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  t; i++){.      s
18270 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61  qlite3Fts3SegRea
18280 64 65 72 46 72 65 65 28 70 43 73 72 2d 3e 61 70  derFree(pCsr->ap
18290 53 65 67 6d 65 6e 74 5b 69 5d 29 3b 0a 20 20 20  Segment[i]);.   
182a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
182b0 72 65 65 28 70 43 73 72 2d 3e 61 70 53 65 67 6d  ree(pCsr->apSegm
182c0 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ent);.    sqlite
182d0 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61 42 75  3_free(pCsr->aBu
182e0 66 66 65 72 29 3b 0a 0a 20 20 20 20 70 43 73 72  ffer);..    pCsr
182f0 2d 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b 0a  ->nSegment = 0;.
18300 20 20 20 20 70 43 73 72 2d 3e 61 70 53 65 67 6d      pCsr->apSegm
18310 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 43 73  ent = 0;.    pCs
18320 72 2d 3e 61 42 75 66 66 65 72 20 3d 20 30 3b 0a  r->aBuffer = 0;.
18330 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72    }.}../*.** Mer
18340 67 65 20 61 6c 6c 20 6c 65 76 65 6c 20 69 4c 65  ge all level iLe
18350 76 65 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20  vel segments in 
18360 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 74  the database int
18370 6f 20 61 20 73 69 6e 67 6c 65 20 0a 2a 2a 20 69  o a single .** i
18380 4c 65 76 65 6c 2b 31 20 73 65 67 6d 65 6e 74 2e  Level+1 segment.
18390 20 4f 72 2c 20 69 66 20 69 4c 65 76 65 6c 3c 30   Or, if iLevel<0
183a0 2c 20 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d  , merge all segm
183b0 65 6e 74 73 20 69 6e 74 6f 20 61 0a 2a 2a 20 73  ents into a.** s
183c0 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 20 77 69  ingle segment wi
183d0 74 68 20 61 20 6c 65 76 65 6c 20 65 71 75 61 6c  th a level equal
183e0 20 74 6f 20 74 68 65 20 6e 75 6d 65 72 69 63 61   to the numerica
183f0 6c 6c 79 20 6c 61 72 67 65 73 74 20 6c 65 76 65  lly largest leve
18400 6c 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  l .** currently 
18410 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64  present in the d
18420 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
18430 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
18440 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 69  is called with i
18450 4c 65 76 65 6c 3c 30 2c 20 62 75 74 20 74 68 65  Level<0, but the
18460 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 0a 2a  re is only one.*
18470 2a 20 73 65 67 6d 65 6e 74 20 69 6e 20 74 68 65  * segment in the
18480 20 64 61 74 61 62 61 73 65 2c 20 53 51 4c 49 54   database, SQLIT
18490 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
184a0 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  ed immediately. 
184b0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
184c0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  f successful, SQ
184d0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
184e0 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ned. If an error
184f0 20 6f 63 63 75 72 73 2c 20 0a 2a 2a 20 61 6e 20   occurs, .** an 
18500 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
18510 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
18520 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
18530 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 0a 20  3SegmentMerge(. 
18540 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 0a   Fts3Table *p, .
18550 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20    int iLangid,  
18560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18570 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64    /* Language id
18580 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 69   to merge */.  i
18590 6e 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20 20  nt iIndex,      
185a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
185b0 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 61 49  * Index in p->aI
185c0 6e 64 65 78 5b 5d 20 74 6f 20 6d 65 72 67 65 20  ndex[] to merge 
185d0 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 20  */.  int iLevel 
185e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185f0 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f       /* Level to
18600 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69   merge */.){.  i
18610 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
18620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18630 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
18640 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b  .  int iIdx = 0;
18650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18660 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e     /* Index of n
18670 65 77 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ew segment */.  
18680 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4e  sqlite3_int64 iN
18690 65 77 4c 65 76 65 6c 20 3d 20 30 3b 20 20 20 20  ewLevel = 0;    
186a0 2f 2a 20 4c 65 76 65 6c 2f 69 6e 64 65 78 20 74  /* Level/index t
186b0 6f 20 63 72 65 61 74 65 20 6e 65 77 20 73 65 67  o create new seg
186c0 6d 65 6e 74 20 61 74 20 2a 2f 0a 20 20 53 65 67  ment at */.  Seg
186d0 6d 65 6e 74 57 72 69 74 65 72 20 2a 70 57 72 69  mentWriter *pWri
186e0 74 65 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ter = 0;     /* 
186f0 55 73 65 64 20 74 6f 20 77 72 69 74 65 20 74 68  Used to write th
18700 65 20 6e 65 77 2c 20 6d 65 72 67 65 64 2c 20 73  e new, merged, s
18710 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 33  egment */.  Fts3
18720 53 65 67 46 69 6c 74 65 72 20 66 69 6c 74 65 72  SegFilter filter
18730 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
18740 65 67 6d 65 6e 74 20 74 65 72 6d 20 66 69 6c 74  egment term filt
18750 65 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a  er condition */.
18760 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65    Fts3MultiSegRe
18770 61 64 65 72 20 63 73 72 3b 20 20 20 20 20 20 20  ader csr;       
18780 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 69    /* Cursor to i
18790 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c  terate through l
187a0 65 76 65 6c 28 73 29 20 2a 2f 0a 20 20 69 6e 74  evel(s) */.  int
187b0 20 62 49 67 6e 6f 72 65 45 6d 70 74 79 20 3d 20   bIgnoreEmpty = 
187c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
187d0 54 72 75 65 20 74 6f 20 69 67 6e 6f 72 65 20 65  True to ignore e
187e0 6d 70 74 79 20 73 65 67 6d 65 6e 74 73 20 2a 2f  mpty segments */
187f0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 76  ..  assert( iLev
18800 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53  el==FTS3_SEGCURS
18810 4f 52 5f 41 4c 4c 0a 20 20 20 20 20 20 20 7c 7c  OR_ALL.       ||
18820 20 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45   iLevel==FTS3_SE
18830 47 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 0a  GCURSOR_PENDING.
18840 20 20 20 20 20 20 20 7c 7c 20 69 4c 65 76 65 6c         || iLevel
18850 3e 3d 30 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  >=0.  );.  asser
18860 74 28 20 69 4c 65 76 65 6c 3c 46 54 53 33 5f 53  t( iLevel<FTS3_S
18870 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 20 29  EGDIR_MAXLEVEL )
18880 3b 0a 20 20 61 73 73 65 72 74 28 20 69 49 6e 64  ;.  assert( iInd
18890 65 78 3e 3d 30 20 26 26 20 69 49 6e 64 65 78 3c  ex>=0 && iIndex<
188a0 70 2d 3e 6e 49 6e 64 65 78 20 29 3b 0a 0a 20 20  p->nIndex );..  
188b0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
188c0 53 65 67 52 65 61 64 65 72 43 75 72 73 6f 72 28  SegReaderCursor(
188d0 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64  p, iLangid, iInd
188e0 65 78 2c 20 69 4c 65 76 65 6c 2c 20 30 2c 20 30  ex, iLevel, 0, 0
188f0 2c 20 31 2c 20 30 2c 20 26 63 73 72 29 3b 0a 20  , 1, 0, &csr);. 
18900 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18910 4f 4b 20 7c 7c 20 63 73 72 2e 6e 53 65 67 6d 65  OK || csr.nSegme
18920 6e 74 3d 3d 30 20 29 20 67 6f 74 6f 20 66 69 6e  nt==0 ) goto fin
18930 69 73 68 65 64 3b 0a 0a 20 20 69 66 28 20 69 4c  ished;..  if( iL
18940 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55  evel==FTS3_SEGCU
18950 52 53 4f 52 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  RSOR_ALL ){.    
18960 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20  /* This call is 
18970 74 6f 20 6d 65 72 67 65 20 61 6c 6c 20 73 65 67  to merge all seg
18980 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74  ments in the dat
18990 61 62 61 73 65 20 74 6f 20 61 20 73 69 6e 67 6c  abase to a singl
189a0 65 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74  e.    ** segment
189b0 2e 20 54 68 65 20 6c 65 76 65 6c 20 6f 66 20 74  . The level of t
189c0 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 69  he new segment i
189d0 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6e  s equal to the n
189e0 75 6d 65 72 69 63 61 6c 6c 79 0a 20 20 20 20 2a  umerically.    *
189f0 2a 20 67 72 65 61 74 65 73 74 20 73 65 67 6d 65  * greatest segme
18a00 6e 74 20 6c 65 76 65 6c 20 63 75 72 72 65 6e 74  nt level current
18a10 6c 79 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  ly present in th
18a20 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 74  e database for t
18a30 68 69 73 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78  his.    ** index
18a40 2e 20 54 68 65 20 69 64 78 20 6f 66 20 74 68 65  . The idx of the
18a50 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 69 73 20   new segment is 
18a60 61 6c 77 61 79 73 20 30 2e 20 20 2a 2f 0a 20 20  always 0.  */.  
18a70 20 20 69 66 28 20 63 73 72 2e 6e 53 65 67 6d 65    if( csr.nSegme
18a80 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  nt==1 ){.      r
18a90 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
18aa0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e 69  .      goto fini
18ab0 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  shed;.    }.    
18ac0 72 63 20 3d 20 66 74 73 33 53 65 67 6d 65 6e 74  rc = fts3Segment
18ad0 4d 61 78 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e  MaxLevel(p, iLan
18ae0 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 26 69 4e  gid, iIndex, &iN
18af0 65 77 4c 65 76 65 6c 29 3b 0a 20 20 20 20 62 49  ewLevel);.    bI
18b00 67 6e 6f 72 65 45 6d 70 74 79 20 3d 20 31 3b 0a  gnoreEmpty = 1;.
18b10 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 4c 65  .  }else if( iLe
18b20 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55 52  vel==FTS3_SEGCUR
18b30 53 4f 52 5f 50 45 4e 44 49 4e 47 20 29 7b 0a 20  SOR_PENDING ){. 
18b40 20 20 20 69 4e 65 77 4c 65 76 65 6c 20 3d 20 67     iNewLevel = g
18b50 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28  etAbsoluteLevel(
18b60 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64  p, iLangid, iInd
18b70 65 78 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d  ex, 0);.    rc =
18b80 20 66 74 73 33 41 6c 6c 6f 63 61 74 65 53 65 67   fts3AllocateSeg
18b90 64 69 72 49 64 78 28 70 2c 20 69 4c 61 6e 67 69  dirIdx(p, iLangi
18ba0 64 2c 20 69 49 6e 64 65 78 2c 20 30 2c 20 26 69  d, iIndex, 0, &i
18bb0 49 64 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Idx);.  }else{. 
18bc0 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
18bd0 69 73 20 74 6f 20 6d 65 72 67 65 20 61 6c 6c 20  is to merge all 
18be0 73 65 67 6d 65 6e 74 73 20 61 74 20 6c 65 76 65  segments at leve
18bf0 6c 20 69 4c 65 76 65 6c 2e 20 66 69 6e 64 20 74  l iLevel. find t
18c00 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 61  he next.    ** a
18c10 76 61 69 6c 61 62 6c 65 20 73 65 67 6d 65 6e 74  vailable segment
18c20 20 69 6e 64 65 78 20 61 74 20 6c 65 76 65 6c 20   index at level 
18c30 69 4c 65 76 65 6c 2b 31 2e 20 54 68 65 20 63 61  iLevel+1. The ca
18c40 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 66 74 73  ll to.    ** fts
18c50 33 41 6c 6c 6f 63 61 74 65 53 65 67 64 69 72 49  3AllocateSegdirI
18c60 64 78 28 29 20 77 69 6c 6c 20 6d 65 72 67 65 20  dx() will merge 
18c70 74 68 65 20 73 65 67 6d 65 6e 74 73 20 61 74 20  the segments at 
18c80 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2b 31 20 74  level iLevel+1 t
18c90 6f 20 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e 67  o .    ** a sing
18ca0 6c 65 20 69 4c 65 76 65 6c 2b 32 20 73 65 67 6d  le iLevel+2 segm
18cb0 65 6e 74 20 69 66 20 6e 65 63 65 73 73 61 72 79  ent if necessary
18cc0 2e 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66  .  */.    rc = f
18cd0 74 73 33 41 6c 6c 6f 63 61 74 65 53 65 67 64 69  ts3AllocateSegdi
18ce0 72 49 64 78 28 70 2c 20 69 4c 61 6e 67 69 64 2c  rIdx(p, iLangid,
18cf0 20 69 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 2b   iIndex, iLevel+
18d00 31 2c 20 26 69 49 64 78 29 3b 0a 20 20 20 20 69  1, &iIdx);.    i
18d10 4e 65 77 4c 65 76 65 6c 20 3d 20 67 65 74 41 62  NewLevel = getAb
18d20 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69  soluteLevel(p, i
18d30 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20  Langid, iIndex, 
18d40 69 4c 65 76 65 6c 2b 31 29 3b 0a 20 20 7d 0a 20  iLevel+1);.  }. 
18d50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18d60 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69 73 68  OK ) goto finish
18d70 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 63 73  ed;.  assert( cs
18d80 72 2e 6e 53 65 67 6d 65 6e 74 3e 30 20 29 3b 0a  r.nSegment>0 );.
18d90 20 20 61 73 73 65 72 74 28 20 69 4e 65 77 4c 65    assert( iNewLe
18da0 76 65 6c 3e 3d 67 65 74 41 62 73 6f 6c 75 74 65  vel>=getAbsolute
18db0 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64  Level(p, iLangid
18dc0 2c 20 69 49 6e 64 65 78 2c 20 30 29 20 29 3b 0a  , iIndex, 0) );.
18dd0 20 20 61 73 73 65 72 74 28 20 69 4e 65 77 4c 65    assert( iNewLe
18de0 76 65 6c 3c 67 65 74 41 62 73 6f 6c 75 74 65 4c  vel<getAbsoluteL
18df0 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c  evel(p, iLangid,
18e00 20 69 49 6e 64 65 78 2c 46 54 53 33 5f 53 45 47   iIndex,FTS3_SEG
18e10 44 49 52 5f 4d 41 58 4c 45 56 45 4c 29 20 29 3b  DIR_MAXLEVEL) );
18e20 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69 6c 74  ..  memset(&filt
18e30 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  er, 0, sizeof(Ft
18e40 73 33 53 65 67 46 69 6c 74 65 72 29 29 3b 0a 20  s3SegFilter));. 
18e50 20 66 69 6c 74 65 72 2e 66 6c 61 67 73 20 3d 20   filter.flags = 
18e60 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 52 45 51  FTS3_SEGMENT_REQ
18e70 55 49 52 45 5f 50 4f 53 3b 0a 20 20 66 69 6c 74  UIRE_POS;.  filt
18e80 65 72 2e 66 6c 61 67 73 20 7c 3d 20 28 62 49 67  er.flags |= (bIg
18e90 6e 6f 72 65 45 6d 70 74 79 20 3f 20 46 54 53 33  noreEmpty ? FTS3
18ea0 5f 53 45 47 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f  _SEGMENT_IGNORE_
18eb0 45 4d 50 54 59 20 3a 20 30 29 3b 0a 0a 20 20 72  EMPTY : 0);..  r
18ec0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53  c = sqlite3Fts3S
18ed0 65 67 52 65 61 64 65 72 53 74 61 72 74 28 70 2c  egReaderStart(p,
18ee0 20 26 63 73 72 2c 20 26 66 69 6c 74 65 72 29 3b   &csr, &filter);
18ef0 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45  .  while( SQLITE
18f00 5f 4f 4b 3d 3d 72 63 20 29 7b 0a 20 20 20 20 72  _OK==rc ){.    r
18f10 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53  c = sqlite3Fts3S
18f20 65 67 52 65 61 64 65 72 53 74 65 70 28 70 2c 20  egReaderStep(p, 
18f30 26 63 73 72 29 3b 0a 20 20 20 20 69 66 28 20 72  &csr);.    if( r
18f40 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 20  c!=SQLITE_ROW ) 
18f50 62 72 65 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20  break;.    rc = 
18f60 66 74 73 33 53 65 67 57 72 69 74 65 72 41 64 64  fts3SegWriterAdd
18f70 28 70 2c 20 26 70 57 72 69 74 65 72 2c 20 31 2c  (p, &pWriter, 1,
18f80 20 0a 20 20 20 20 20 20 20 20 63 73 72 2e 7a 54   .        csr.zT
18f90 65 72 6d 2c 20 63 73 72 2e 6e 54 65 72 6d 2c 20  erm, csr.nTerm, 
18fa0 63 73 72 2e 61 44 6f 63 6c 69 73 74 2c 20 63 73  csr.aDoclist, cs
18fb0 72 2e 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 7d  r.nDoclist);.  }
18fc0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
18fd0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69  E_OK ) goto fini
18fe0 73 68 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20  shed;.  assert( 
18ff0 70 57 72 69 74 65 72 20 29 3b 0a 0a 20 20 69 66  pWriter );..  if
19000 28 20 69 4c 65 76 65 6c 21 3d 46 54 53 33 5f 53  ( iLevel!=FTS3_S
19010 45 47 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47  EGCURSOR_PENDING
19020 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
19030 33 44 65 6c 65 74 65 53 65 67 64 69 72 28 0a 20  3DeleteSegdir(. 
19040 20 20 20 20 20 20 20 70 2c 20 69 4c 61 6e 67 69         p, iLangi
19050 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65 76 65  d, iIndex, iLeve
19060 6c 2c 20 63 73 72 2e 61 70 53 65 67 6d 65 6e 74  l, csr.apSegment
19070 2c 20 63 73 72 2e 6e 53 65 67 6d 65 6e 74 0a 20  , csr.nSegment. 
19080 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63     );.    if( rc
19090 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
190a0 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 7d  to finished;.  }
190b0 0a 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 57  .  rc = fts3SegW
190c0 72 69 74 65 72 46 6c 75 73 68 28 70 2c 20 70 57  riterFlush(p, pW
190d0 72 69 74 65 72 2c 20 69 4e 65 77 4c 65 76 65 6c  riter, iNewLevel
190e0 2c 20 69 49 64 78 29 3b 0a 0a 20 66 69 6e 69 73  , iIdx);.. finis
190f0 68 65 64 3a 0a 20 20 66 74 73 33 53 65 67 57 72  hed:.  fts3SegWr
19100 69 74 65 72 46 72 65 65 28 70 57 72 69 74 65 72  iterFree(pWriter
19110 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33  );.  sqlite3Fts3
19120 53 65 67 52 65 61 64 65 72 46 69 6e 69 73 68 28  SegReaderFinish(
19130 26 63 73 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  &csr);.  return 
19140 72 63 3b 0a 7d 0a 0a 0a 2f 2a 20 0a 2a 2a 20 46  rc;.}.../* .** F
19150 6c 75 73 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  lush the content
19160 73 20 6f 66 20 70 65 6e 64 69 6e 67 54 65 72 6d  s of pendingTerm
19170 73 20 74 6f 20 6c 65 76 65 6c 20 30 20 73 65 67  s to level 0 seg
19180 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ments..*/.int sq
19190 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67  lite3Fts3Pending
191a0 54 65 72 6d 73 46 6c 75 73 68 28 46 74 73 33 54  TermsFlush(Fts3T
191b0 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  able *p){.  int 
191c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
191d0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
191e0 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d   .  for(i=0; rc=
191f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
19200 70 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b 29 7b  p->nIndex; i++){
19210 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65  .    rc = fts3Se
19220 67 6d 65 6e 74 4d 65 72 67 65 28 70 2c 20 70 2d  gmentMerge(p, p-
19230 3e 69 50 72 65 76 4c 61 6e 67 69 64 2c 20 69 2c  >iPrevLangid, i,
19240 20 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f   FTS3_SEGCURSOR_
19250 50 45 4e 44 49 4e 47 29 3b 0a 20 20 20 20 69 66  PENDING);.    if
19260 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
19270 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  E ) rc = SQLITE_
19280 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OK;.  }.  sqlite
19290 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d  3Fts3PendingTerm
192a0 73 43 6c 65 61 72 28 70 29 3b 0a 0a 20 20 2f 2a  sClear(p);..  /*
192b0 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 61   Determine the a
192c0 75 74 6f 2d 69 6e 63 72 2d 6d 65 72 67 65 20 73  uto-incr-merge s
192d0 65 74 74 69 6e 67 20 69 66 20 75 6e 6b 6e 6f 77  etting if unknow
192e0 6e 2e 20 20 49 66 20 65 6e 61 62 6c 65 64 2c 0a  n.  If enabled,.
192f0 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 20 74 68    ** estimate th
19300 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  e number of leaf
19310 20 62 6c 6f 63 6b 73 20 6f 66 20 63 6f 6e 74 65   blocks of conte
19320 6e 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  nt to be written
19330 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
19340 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
19350 62 48 61 73 53 74 61 74 0a 20 20 20 26 26 20 70  bHasStat.   && p
19360 2d 3e 62 41 75 74 6f 69 6e 63 72 6d 65 72 67 65  ->bAutoincrmerge
19370 3d 3d 30 78 66 66 20 26 26 20 70 2d 3e 6e 4c 65  ==0xff && p->nLe
19380 61 66 41 64 64 3e 30 0a 20 20 29 7b 0a 20 20 20  afAdd>0.  ){.   
19390 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
193a0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 72 63  Stmt = 0;.    rc
193b0 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
193c0 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 54 41  , SQL_SELECT_STA
193d0 54 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  T, &pStmt, 0);. 
193e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
193f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
19400 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
19410 53 74 6d 74 2c 20 31 2c 20 46 54 53 5f 53 54 41  Stmt, 1, FTS_STA
19420 54 5f 41 55 54 4f 49 4e 43 52 4d 45 52 47 45 29  T_AUTOINCRMERGE)
19430 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
19440 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
19450 3b 0a 20 20 20 20 20 20 70 2d 3e 62 41 75 74 6f  ;.      p->bAuto
19460 69 6e 63 72 6d 65 72 67 65 20 3d 20 28 72 63 3d  incrmerge = (rc=
19470 3d 53 51 4c 49 54 45 5f 52 4f 57 20 26 26 20 73  =SQLITE_ROW && s
19480 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
19490 74 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20  t(pStmt, 0));.  
194a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
194b0 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
194c0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
194d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
194e0 6e 63 6f 64 65 20 4e 20 69 6e 74 65 67 65 72 73  ncode N integers
194f0 20 61 73 20 76 61 72 69 6e 74 73 20 69 6e 74 6f   as varints into
19500 20 61 20 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74   a blob..*/.stat
19510 69 63 20 76 6f 69 64 20 66 74 73 33 45 6e 63 6f  ic void fts3Enco
19520 64 65 49 6e 74 41 72 72 61 79 28 0a 20 20 69 6e  deIntArray(.  in
19530 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t N,            
19540 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
19550 66 20 69 6e 74 65 67 65 72 73 20 74 6f 20 65 6e  f integers to en
19560 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 2a 61  code */.  u32 *a
19570 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
19580 54 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  The integer valu
19590 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42  es */.  char *zB
195a0 75 66 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 72  uf,        /* Wr
195b0 69 74 65 20 74 68 65 20 42 4c 4f 42 20 68 65 72  ite the BLOB her
195c0 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 42 75  e */.  int *pNBu
195d0 66 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  f         /* Wri
195e0 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  te number of byt
195f0 65 73 20 69 66 20 7a 42 75 66 5b 5d 20 75 73 65  es if zBuf[] use
19600 64 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  d here */.){.  i
19610 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69  nt i, j;.  for(i
19620 3d 6a 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b  =j=0; i<N; i++){
19630 0a 20 20 20 20 6a 20 2b 3d 20 73 71 6c 69 74 65  .    j += sqlite
19640 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26  3Fts3PutVarint(&
19650 7a 42 75 66 5b 6a 5d 2c 20 28 73 71 6c 69 74 65  zBuf[j], (sqlite
19660 33 5f 69 6e 74 36 34 29 61 5b 69 5d 29 3b 0a 20  3_int64)a[i]);. 
19670 20 7d 0a 20 20 2a 70 4e 42 75 66 20 3d 20 6a 3b   }.  *pNBuf = j;
19680 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  .}../*.** Decode
19690 20 61 20 62 6c 6f 62 20 6f 66 20 76 61 72 69 6e   a blob of varin
196a0 74 73 20 69 6e 74 6f 20 4e 20 69 6e 74 65 67 65  ts into N intege
196b0 72 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  rs.*/.static voi
196c0 64 20 66 74 73 33 44 65 63 6f 64 65 49 6e 74 41  d fts3DecodeIntA
196d0 72 72 61 79 28 0a 20 20 69 6e 74 20 4e 2c 20 20  rray(.  int N,  
196e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
196f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 74 65  e number of inte
19700 67 65 72 73 20 74 6f 20 64 65 63 6f 64 65 20 2a  gers to decode *
19710 2f 0a 20 20 75 33 32 20 2a 61 2c 20 20 20 20 20  /.  u32 *a,     
19720 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
19730 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  the integer valu
19740 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  es */.  const ch
19750 61 72 20 2a 7a 42 75 66 2c 20 20 2f 2a 20 54 68  ar *zBuf,  /* Th
19760 65 20 42 4c 4f 42 20 63 6f 6e 74 61 69 6e 69 6e  e BLOB containin
19770 67 20 74 68 65 20 76 61 72 69 6e 74 73 20 2a 2f  g the varints */
19780 0a 20 20 69 6e 74 20 6e 42 75 66 20 20 20 20 20  .  int nBuf     
19790 20 20 20 20 20 20 2f 2a 20 73 69 7a 65 20 6f 66        /* size of
197a0 20 74 68 65 20 42 4c 4f 42 20 2a 2f 0a 29 7b 0a   the BLOB */.){.
197b0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 55 4e    int i, j;.  UN
197c0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
197d0 42 75 66 29 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  Buf);.  for(i=j=
197e0 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<N; i++){.  
197f0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
19800 78 3b 0a 20 20 20 20 6a 20 2b 3d 20 73 71 6c 69  x;.    j += sqli
19810 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74  te3Fts3GetVarint
19820 28 26 7a 42 75 66 5b 6a 5d 2c 20 26 78 29 3b 0a  (&zBuf[j], &x);.
19830 20 20 20 20 61 73 73 65 72 74 28 6a 3c 3d 6e 42      assert(j<=nB
19840 75 66 29 3b 0a 20 20 20 20 61 5b 69 5d 20 3d 20  uf);.    a[i] = 
19850 28 75 33 32 29 28 78 20 26 20 30 78 66 66 66 66  (u32)(x & 0xffff
19860 66 66 66 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ffff);.  }.}../*
19870 0a 2a 2a 20 49 6e 73 65 72 74 20 74 68 65 20 73  .** Insert the s
19880 69 7a 65 73 20 28 69 6e 20 74 6f 6b 65 6e 73 29  izes (in tokens)
19890 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
198a0 20 6f 66 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   of the document
198b0 0a 2a 2a 20 77 69 74 68 20 64 6f 63 69 64 20 65  .** with docid e
198c0 71 75 61 6c 20 74 6f 20 70 2d 3e 69 50 72 65 76  qual to p->iPrev
198d0 44 6f 63 69 64 2e 20 20 54 68 65 20 73 69 7a 65  Docid.  The size
198e0 73 20 61 72 65 20 65 6e 63 6f 64 65 64 20 61 73  s are encoded as
198f0 0a 2a 2a 20 61 20 62 6c 6f 62 20 6f 66 20 76 61  .** a blob of va
19900 72 69 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  rints..*/.static
19910 20 76 6f 69 64 20 66 74 73 33 49 6e 73 65 72 74   void fts3Insert
19920 44 6f 63 73 69 7a 65 28 0a 20 20 69 6e 74 20 2a  Docsize(.  int *
19930 70 52 43 2c 20 20 20 20 20 20 20 20 20 20 20 20  pRC,            
19940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
19950 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 46  sult code */.  F
19960 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
19970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19980 2a 20 54 61 62 6c 65 20 69 6e 74 6f 20 77 68 69  * Table into whi
19990 63 68 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a  ch to insert */.
199a0 20 20 75 33 32 20 2a 61 53 7a 20 20 20 20 20 20    u32 *aSz      
199b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199c0 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 65 61    /* Sizes of ea
199d0 63 68 20 63 6f 6c 75 6d 6e 2c 20 69 6e 20 74 6f  ch column, in to
199e0 6b 65 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  kens */.){.  cha
199f0 72 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20 20 20  r *pBlob;       
19a00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 4c 4f        /* The BLO
19a10 42 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68  B encoding of th
19a20 65 20 64 6f 63 75 6d 65 6e 74 20 73 69 7a 65 20  e document size 
19a30 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 20  */.  int nBlob; 
19a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19a50 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
19a60 20 69 6e 20 74 68 65 20 42 4c 4f 42 20 2a 2f 0a   in the BLOB */.
19a70 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
19a80 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 53 74  pStmt;     /* St
19a90 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20  atement used to 
19aa0 69 6e 73 65 72 74 20 74 68 65 20 65 6e 63 6f 64  insert the encod
19ab0 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ing */.  int rc;
19ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ad0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
19ae0 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f   from subfunctio
19af0 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52  ns */..  if( *pR
19b00 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 42  C ) return;.  pB
19b10 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  lob = sqlite3_ma
19b20 6c 6c 6f 63 28 20 31 30 2a 70 2d 3e 6e 43 6f 6c  lloc( 10*p->nCol
19b30 75 6d 6e 20 29 3b 0a 20 20 69 66 28 20 70 42 6c  umn );.  if( pBl
19b40 6f 62 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ob==0 ){.    *pR
19b50 43 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  C = SQLITE_NOMEM
19b60 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
19b70 7d 0a 20 20 66 74 73 33 45 6e 63 6f 64 65 49 6e  }.  fts3EncodeIn
19b80 74 41 72 72 61 79 28 70 2d 3e 6e 43 6f 6c 75 6d  tArray(p->nColum
19b90 6e 2c 20 61 53 7a 2c 20 70 42 6c 6f 62 2c 20 26  n, aSz, pBlob, &
19ba0 6e 42 6c 6f 62 29 3b 0a 20 20 72 63 20 3d 20 66  nBlob);.  rc = f
19bb0 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51  ts3SqlStmt(p, SQ
19bc0 4c 5f 52 45 50 4c 41 43 45 5f 44 4f 43 53 49 5a  L_REPLACE_DOCSIZ
19bd0 45 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  E, &pStmt, 0);. 
19be0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
19bf0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 6c 6f  qlite3_free(pBlo
19c00 62 29 3b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72  b);.    *pRC = r
19c10 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
19c20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e   }.  sqlite3_bin
19c30 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31  d_int64(pStmt, 1
19c40 2c 20 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 29  , p->iPrevDocid)
19c50 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ;.  sqlite3_bind
19c60 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 32 2c 20  _blob(pStmt, 2, 
19c70 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 73 71  pBlob, nBlob, sq
19c80 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 73  lite3_free);.  s
19c90 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
19ca0 74 29 3b 0a 20 20 2a 70 52 43 20 3d 20 73 71 6c  t);.  *pRC = sql
19cb0 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
19cc0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  );.}../*.** Reco
19cd0 72 64 20 30 20 6f 66 20 74 68 65 20 25 5f 73 74  rd 0 of the %_st
19ce0 61 74 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  at table contain
19cf0 73 20 61 20 62 6c 6f 62 20 63 6f 6e 73 69 73 74  s a blob consist
19d00 69 6e 67 20 6f 66 20 4e 20 76 61 72 69 6e 74 73  ing of N varints
19d10 2c 0a 2a 2a 20 77 68 65 72 65 20 4e 20 69 73 20  ,.** where N is 
19d20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73  the number of us
19d30 65 72 20 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d  er defined colum
19d40 6e 73 20 69 6e 20 74 68 65 20 66 74 73 33 20 74  ns in the fts3 t
19d50 61 62 6c 65 20 70 6c 75 73 0a 2a 2a 20 74 77 6f  able plus.** two
19d60 2e 20 49 66 20 6e 43 6f 6c 20 69 73 20 74 68 65  . If nCol is the
19d70 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 20   number of user 
19d80 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 2c  defined columns,
19d90 20 74 68 65 6e 20 76 61 6c 75 65 73 20 6f 66 20   then values of 
19da0 74 68 65 20 0a 2a 2a 20 76 61 72 69 6e 74 73 20  the .** varints 
19db0 61 72 65 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f  are set as follo
19dc0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69  ws:.**.**   Vari
19dd0 6e 74 20 30 3a 20 20 20 20 20 20 20 54 6f 74 61  nt 0:       Tota
19de0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  l number of rows
19df0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
19e00 2a 0a 2a 2a 20 20 20 56 61 72 69 6e 74 20 31 2e  *.**   Varint 1.
19e10 2e 6e 43 6f 6c 3a 20 46 6f 72 20 65 61 63 68 20  .nCol: For each 
19e20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 74 6f 74 61  column, the tota
19e30 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65  l number of toke
19e40 6e 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ns stored in.** 
19e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e60 20 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72    the column for
19e70 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65   all rows of the
19e80 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   table..**.**   
19e90 56 61 72 69 6e 74 20 31 2b 6e 43 6f 6c 3a 20 20  Varint 1+nCol:  
19ea0 54 68 65 20 74 6f 74 61 6c 20 73 69 7a 65 2c 20  The total size, 
19eb0 69 6e 20 62 79 74 65 73 2c 20 6f 66 20 61 6c 6c  in bytes, of all
19ec0 20 74 65 78 74 20 76 61 6c 75 65 73 20 69 6e 20   text values in 
19ed0 61 6c 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  all.**          
19ee0 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73           columns
19ef0 20 6f 66 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20   of all rows of 
19f00 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2f  the table..**.*/
19f10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
19f20 33 55 70 64 61 74 65 44 6f 63 54 6f 74 61 6c 73  3UpdateDocTotals
19f30 28 0a 20 20 69 6e 74 20 2a 70 52 43 2c 20 20 20  (.  int *pRC,   
19f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f50 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
19f60 74 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33  t code */.  Fts3
19f70 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
19f80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19f90 61 62 6c 65 20 62 65 69 6e 67 20 75 70 64 61 74  able being updat
19fa0 65 64 20 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a  ed */.  u32 *aSz
19fb0 49 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ins,            
19fc0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
19fd0 69 6e 63 72 65 61 73 65 73 20 2a 2f 0a 20 20 75  increases */.  u
19fe0 33 32 20 2a 61 53 7a 44 65 6c 2c 20 20 20 20 20  32 *aSzDel,     
19ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a000 2a 20 53 69 7a 65 20 64 65 63 72 65 61 73 65 73  * Size decreases
1a010 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20   */.  int nChng 
1a020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a030 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20        /* Change 
1a040 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  in the number of
1a050 20 64 6f 63 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   documents */.){
1a060 0a 20 20 63 68 61 72 20 2a 70 42 6c 6f 62 3b 20  .  char *pBlob; 
1a070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1a080 74 6f 72 61 67 65 20 66 6f 72 20 42 4c 4f 42 20  torage for BLOB 
1a090 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 25 5f 73  written into %_s
1a0a0 74 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c  tat */.  int nBl
1a0b0 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ob;             
1a0c0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 42 4c 4f    /* Size of BLO
1a0d0 42 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 25  B written into %
1a0e0 5f 73 74 61 74 20 2a 2f 0a 20 20 75 33 32 20 2a  _stat */.  u32 *
1a0f0 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
1a100 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
1a110 69 6e 74 65 67 65 72 73 20 74 68 61 74 20 62 65  integers that be
1a120 63 6f 6d 65 73 20 74 68 65 20 42 4c 4f 42 20 2a  comes the BLOB *
1a130 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
1a140 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20   *pStmt;     /* 
1a150 53 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 72 65  Statement for re
1a160 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e  ading and writin
1a170 67 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  g */.  int i;   
1a180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a190 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
1a1a0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
1a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a1c0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
1a1d0 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
1a1e0 2f 0a 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  /..  const int n
1a1f0 53 74 61 74 20 3d 20 70 2d 3e 6e 43 6f 6c 75 6d  Stat = p->nColum
1a200 6e 2b 32 3b 0a 0a 20 20 69 66 28 20 2a 70 52 43  n+2;..  if( *pRC
1a210 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 20 3d   ) return;.  a =
1a220 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
1a230 20 28 73 69 7a 65 6f 66 28 75 33 32 29 2b 31 30   (sizeof(u32)+10
1a240 29 2a 6e 53 74 61 74 20 29 3b 0a 20 20 69 66 28  )*nStat );.  if(
1a250 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52   a==0 ){.    *pR
1a260 43 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  C = SQLITE_NOMEM
1a270 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1a280 7d 0a 20 20 70 42 6c 6f 62 20 3d 20 28 63 68 61  }.  pBlob = (cha
1a290 72 2a 29 26 61 5b 6e 53 74 61 74 5d 3b 0a 20 20  r*)&a[nStat];.  
1a2a0 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
1a2b0 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53  (p, SQL_SELECT_S
1a2c0 54 41 54 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  TAT, &pStmt, 0);
1a2d0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1a2e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29   sqlite3_free(a)
1a2f0 3b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  ;.    *pRC = rc;
1a300 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1a310 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
1a320 69 6e 74 28 70 53 74 6d 74 2c 20 31 2c 20 46 54  int(pStmt, 1, FT
1a330 53 5f 53 54 41 54 5f 44 4f 43 54 4f 54 41 4c 29  S_STAT_DOCTOTAL)
1a340 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
1a350 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
1a360 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 66  ITE_ROW ){.    f
1a370 74 73 33 44 65 63 6f 64 65 49 6e 74 41 72 72 61  ts3DecodeIntArra
1a380 79 28 6e 53 74 61 74 2c 20 61 2c 0a 20 20 20 20  y(nStat, a,.    
1a390 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
1a3a0 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  umn_blob(pStmt, 
1a3b0 30 29 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c  0),.         sql
1a3c0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
1a3d0 73 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20  s(pStmt, 0));.  
1a3e0 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65  }else{.    memse
1a3f0 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  t(a, 0, sizeof(u
1a400 33 32 29 2a 28 6e 53 74 61 74 29 20 29 3b 0a 20  32)*(nStat) );. 
1a410 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
1a420 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
1a430 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a440 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
1a450 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20 20 20  e3_free(a);.    
1a460 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
1a470 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
1a480 20 6e 43 68 6e 67 3c 30 20 26 26 20 61 5b 30 5d   nChng<0 && a[0]
1a490 3c 28 75 33 32 29 28 2d 6e 43 68 6e 67 29 20 29  <(u32)(-nChng) )
1a4a0 7b 0a 20 20 20 20 61 5b 30 5d 20 3d 20 30 3b 0a  {.    a[0] = 0;.
1a4b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 5b 30    }else{.    a[0
1a4c0 5d 20 2b 3d 20 6e 43 68 6e 67 3b 0a 20 20 7d 0a  ] += nChng;.  }.
1a4d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
1a4e0 6e 43 6f 6c 75 6d 6e 2b 31 3b 20 69 2b 2b 29 7b  nColumn+1; i++){
1a4f0 0a 20 20 20 20 75 33 32 20 78 20 3d 20 61 5b 69  .    u32 x = a[i
1a500 2b 31 5d 3b 0a 20 20 20 20 69 66 28 20 78 2b 61  +1];.    if( x+a
1a510 53 7a 49 6e 73 5b 69 5d 20 3c 20 61 53 7a 44 65  SzIns[i] < aSzDe
1a520 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 78 20  l[i] ){.      x 
1a530 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1a540 20 20 20 20 20 20 78 20 3d 20 78 20 2b 20 61 53        x = x + aS
1a550 7a 49 6e 73 5b 69 5d 20 2d 20 61 53 7a 44 65 6c  zIns[i] - aSzDel
1a560 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  [i];.    }.    a
1a570 5b 69 2b 31 5d 20 3d 20 78 3b 0a 20 20 7d 0a 20  [i+1] = x;.  }. 
1a580 20 66 74 73 33 45 6e 63 6f 64 65 49 6e 74 41 72   fts3EncodeIntAr
1a590 72 61 79 28 6e 53 74 61 74 2c 20 61 2c 20 70 42  ray(nStat, a, pB
1a5a0 6c 6f 62 2c 20 26 6e 42 6c 6f 62 29 3b 0a 20 20  lob, &nBlob);.  
1a5b0 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
1a5c0 28 70 2c 20 53 51 4c 5f 52 45 50 4c 41 43 45 5f  (p, SQL_REPLACE_
1a5d0 53 54 41 54 2c 20 26 70 53 74 6d 74 2c 20 30 29  STAT, &pStmt, 0)
1a5e0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1a5f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
1a600 29 3b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63  );.    *pRC = rc
1a610 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1a620 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  }.  sqlite3_bind
1a630 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 2c 20 46  _int(pStmt, 1, F
1a640 54 53 5f 53 54 41 54 5f 44 4f 43 54 4f 54 41 4c  TS_STAT_DOCTOTAL
1a650 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  );.  sqlite3_bin
1a660 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 32 2c  d_blob(pStmt, 2,
1a670 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 53   pBlob, nBlob, S
1a680 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
1a690 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
1a6a0 74 6d 74 29 3b 0a 20 20 2a 70 52 43 20 3d 20 73  tmt);.  *pRC = s
1a6b0 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
1a6c0 6d 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  mt);.  sqlite3_f
1a6d0 72 65 65 28 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ree(a);.}../*.**
1a6e0 20 4d 65 72 67 65 20 74 68 65 20 65 6e 74 69 72   Merge the entir
1a6f0 65 20 64 61 74 61 62 61 73 65 20 73 6f 20 74 68  e database so th
1a700 61 74 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20  at there is one 
1a710 73 65 67 6d 65 6e 74 20 66 6f 72 20 65 61 63 68  segment for each
1a720 20 0a 2a 2a 20 69 49 6e 64 65 78 2f 69 4c 61 6e   .** iIndex/iLan
1a730 67 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e  gid combination.
1a740 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1a750 74 73 33 44 6f 4f 70 74 69 6d 69 7a 65 28 46 74  ts3DoOptimize(Ft
1a760 73 33 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20  s3Table *p, int 
1a770 62 52 65 74 75 72 6e 44 6f 6e 65 29 7b 0a 20 20  bReturnDone){.  
1a780 69 6e 74 20 62 53 65 65 6e 44 6f 6e 65 20 3d 20  int bSeenDone = 
1a790 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  0;.  int rc;.  s
1a7a0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 41 6c  qlite3_stmt *pAl
1a7b0 6c 4c 61 6e 67 69 64 20 3d 20 30 3b 0a 0a 20 20  lLangid = 0;..  
1a7c0 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
1a7d0 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 41  (p, SQL_SELECT_A
1a7e0 4c 4c 5f 4c 41 4e 47 49 44 2c 20 26 70 41 6c 6c  LL_LANGID, &pAll
1a7f0 4c 61 6e 67 69 64 2c 20 30 29 3b 0a 20 20 69 66  Langid, 0);.  if
1a800 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a810 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
1a820 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1a830 5f 69 6e 74 28 70 41 6c 6c 4c 61 6e 67 69 64 2c  _int(pAllLangid,
1a840 20 31 2c 20 70 2d 3e 6e 49 6e 64 65 78 29 3b 0a   1, p->nIndex);.
1a850 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
1a860 65 33 5f 73 74 65 70 28 70 41 6c 6c 4c 61 6e 67  e3_step(pAllLang
1a870 69 64 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  id)==SQLITE_ROW 
1a880 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
1a890 20 20 20 20 20 20 69 6e 74 20 69 4c 61 6e 67 69        int iLangi
1a8a0 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
1a8b0 6d 6e 5f 69 6e 74 28 70 41 6c 6c 4c 61 6e 67 69  mn_int(pAllLangi
1a8c0 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72  d, 0);.      for
1a8d0 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
1a8e0 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 49 6e 64  _OK && i<p->nInd
1a8f0 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ex; i++){.      
1a900 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 6d 65    rc = fts3Segme
1a910 6e 74 4d 65 72 67 65 28 70 2c 20 69 4c 61 6e 67  ntMerge(p, iLang
1a920 69 64 2c 20 69 2c 20 46 54 53 33 5f 53 45 47 43  id, i, FTS3_SEGC
1a930 55 52 53 4f 52 5f 41 4c 4c 29 3b 0a 20 20 20 20  URSOR_ALL);.    
1a940 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1a950 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1a960 20 20 20 20 20 62 53 65 65 6e 44 6f 6e 65 20 3d       bSeenDone =
1a970 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   1;.          rc
1a980 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1a990 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1a9a0 20 20 20 20 7d 0a 20 20 20 20 72 63 32 20 3d 20      }.    rc2 = 
1a9b0 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 41  sqlite3_reset(pA
1a9c0 6c 6c 4c 61 6e 67 69 64 29 3b 0a 20 20 20 20 69  llLangid);.    i
1a9d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a9e0 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d   ) rc = rc2;.  }
1a9f0 0a 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 53  ..  sqlite3Fts3S
1aa00 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28 70 29 3b  egmentsClose(p);
1aa10 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 50 65  .  sqlite3Fts3Pe
1aa20 6e 64 69 6e 67 54 65 72 6d 73 43 6c 65 61 72 28  ndingTermsClear(
1aa30 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72  p);..  return (r
1aa40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1aa50 62 52 65 74 75 72 6e 44 6f 6e 65 20 26 26 20 62  bReturnDone && b
1aa60 53 65 65 6e 44 6f 6e 65 29 20 3f 20 53 51 4c 49  SeenDone) ? SQLI
1aa70 54 45 5f 44 4f 4e 45 20 3a 20 72 63 3b 0a 7d 0a  TE_DONE : rc;.}.
1aa80 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1aa90 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
1aaa0 68 65 6e 20 74 68 65 20 75 73 65 72 20 65 78 65  hen the user exe
1aab0 63 75 74 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77  cutes the follow
1aac0 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 3a 0a 2a  ing statement:.*
1aad0 2a 0a 2a 2a 20 20 20 20 20 49 4e 53 45 52 54 20  *.**     INSERT 
1aae0 49 4e 54 4f 20 3c 74 62 6c 3e 28 3c 74 62 6c 3e  INTO <tbl>(<tbl>
1aaf0 29 20 56 41 4c 55 45 53 28 27 72 65 62 75 69 6c  ) VALUES('rebuil
1ab00 64 27 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  d');.**.** The e
1ab10 6e 74 69 72 65 20 46 54 53 20 69 6e 64 65 78 20  ntire FTS index 
1ab20 69 73 20 64 69 73 63 61 72 64 65 64 20 61 6e 64  is discarded and
1ab30 20 72 65 62 75 69 6c 74 2e 20 49 66 20 74 68 65   rebuilt. If the
1ab40 20 74 61 62 6c 65 20 69 73 20 6f 6e 65 20 0a 2a   table is one .*
1ab50 2a 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  * created using 
1ab60 74 68 65 20 63 6f 6e 74 65 6e 74 3d 78 78 78 20  the content=xxx 
1ab70 6f 70 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65  option, then the
1ab80 20 6e 65 77 20 69 6e 64 65 78 20 69 73 20 62 61   new index is ba
1ab90 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75  sed on.** the cu
1aba0 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f  rrent contents o
1abb0 66 20 74 68 65 20 78 78 78 20 74 61 62 6c 65 2e  f the xxx table.
1abc0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 69   Otherwise, it i
1abd0 73 20 72 65 62 75 69 6c 74 20 62 61 73 65 64 0a  s rebuilt based.
1abe0 2a 2a 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ** on the conten
1abf0 74 73 20 6f 66 20 74 68 65 20 25 5f 63 6f 6e 74  ts of the %_cont
1ac00 65 6e 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ent table..*/.st
1ac10 61 74 69 63 20 69 6e 74 20 66 74 73 33 44 6f 52  atic int fts3DoR
1ac20 65 62 75 69 6c 64 28 46 74 73 33 54 61 62 6c 65  ebuild(Fts3Table
1ac30 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20   *p){.  int rc; 
1ac40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1ac60 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20 20 72 63 20  n Code */..  rc 
1ac70 3d 20 66 74 73 33 44 65 6c 65 74 65 41 6c 6c 28  = fts3DeleteAll(
1ac80 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  p, 0);.  if( rc=
1ac90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1aca0 20 20 75 33 32 20 2a 61 53 7a 20 3d 20 30 3b 0a    u32 *aSz = 0;.
1acb0 20 20 20 20 75 33 32 20 2a 61 53 7a 49 6e 73 20      u32 *aSzIns 
1acc0 3d 20 30 3b 0a 20 20 20 20 75 33 32 20 2a 61 53  = 0;.    u32 *aS
1acd0 7a 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71  zDel = 0;.    sq
1ace0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1acf0 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  t = 0;.    int n
1ad00 45 6e 74 72 79 20 3d 20 30 3b 0a 0a 20 20 20 20  Entry = 0;..    
1ad10 2f 2a 20 43 6f 6d 70 6f 73 65 20 61 6e 64 20 70  /* Compose and p
1ad20 72 65 70 61 72 65 20 61 6e 20 53 51 4c 20 73 74  repare an SQL st
1ad30 61 74 65 6d 65 6e 74 20 74 6f 20 6c 6f 6f 70 20  atement to loop 
1ad40 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 74  through the cont
1ad50 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ent table */.   
1ad60 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71   char *zSql = sq
1ad70 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
1ad80 45 4c 45 43 54 20 25 73 22 20 2c 20 70 2d 3e 7a  ELECT %s" , p->z
1ad90 52 65 61 64 45 78 70 72 6c 69 73 74 29 3b 0a 20  ReadExprlist);. 
1ada0 20 20 20 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a     if( !zSql ){.
1adb0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1adc0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
1add0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
1ade0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
1adf0 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
1ae00 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
1ae10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1ae20 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 0a  e(zSql);.    }..
1ae30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ae40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
1ae50 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  nt nByte = sizeo
1ae60 66 28 75 33 32 29 20 2a 20 28 70 2d 3e 6e 43 6f  f(u32) * (p->nCo
1ae70 6c 75 6d 6e 2b 31 29 2a 33 3b 0a 20 20 20 20 20  lumn+1)*3;.     
1ae80 20 61 53 7a 20 3d 20 28 75 33 32 20 2a 29 73 71   aSz = (u32 *)sq
1ae90 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79  lite3_malloc(nBy
1aea0 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  te);.      if( a
1aeb0 53 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Sz==0 ){.       
1aec0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1aed0 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
1aee0 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
1aef0 61 53 7a 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  aSz, 0, nByte);.
1af00 20 20 20 20 20 20 20 20 61 53 7a 49 6e 73 20 3d          aSzIns =
1af10 20 26 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e   &aSz[p->nColumn
1af20 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 53 7a  +1];.        aSz
1af30 44 65 6c 20 3d 20 26 61 53 7a 49 6e 73 5b 70 2d  Del = &aSzIns[p-
1af40 3e 6e 43 6f 6c 75 6d 6e 2b 31 5d 3b 0a 20 20 20  >nColumn+1];.   
1af50 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1af60 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
1af70 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
1af80 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
1af90 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
1afa0 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20   int iCol;.     
1afb0 20 69 6e 74 20 69 4c 61 6e 67 69 64 20 3d 20 6c   int iLangid = l
1afc0 61 6e 67 69 64 46 72 6f 6d 53 65 6c 65 63 74 28  angidFromSelect(
1afd0 70 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  p, pStmt);.     
1afe0 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e   rc = fts3Pendin
1aff0 67 54 65 72 6d 73 44 6f 63 69 64 28 70 2c 20 69  gTermsDocid(p, i
1b000 4c 61 6e 67 69 64 2c 20 73 71 6c 69 74 65 33 5f  Langid, sqlite3_
1b010 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74  column_int64(pSt
1b020 6d 74 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 6d  mt, 0));.      m
1b030 65 6d 73 65 74 28 61 53 7a 2c 20 30 2c 20 73 69  emset(aSz, 0, si
1b040 7a 65 6f 66 28 61 53 7a 5b 30 5d 29 20 2a 20 28  zeof(aSz[0]) * (
1b050 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 29 3b 0a  p->nColumn+1));.
1b060 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30        for(iCol=0
1b070 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
1b080 26 26 20 69 43 6f 6c 3c 70 2d 3e 6e 43 6f 6c 75  && iCol<p->nColu
1b090 6d 6e 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  mn; iCol++){.   
1b0a0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1b0b0 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  *z = (const char
1b0c0 20 2a 29 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   *) sqlite3_colu
1b0d0 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  mn_text(pStmt, i
1b0e0 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  Col+1);.        
1b0f0 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67  rc = fts3Pending
1b100 54 65 72 6d 73 41 64 64 28 70 2c 20 69 4c 61 6e  TermsAdd(p, iLan
1b110 67 69 64 2c 20 7a 2c 20 69 43 6f 6c 2c 20 26 61  gid, z, iCol, &a
1b120 53 7a 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20 20 20  Sz[iCol]);.     
1b130 20 20 20 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75 6d     aSz[p->nColum
1b140 6e 5d 20 2b 3d 20 73 71 6c 69 74 65 33 5f 63 6f  n] += sqlite3_co
1b150 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
1b160 2c 20 69 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20  , iCol+1);.     
1b170 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
1b180 62 48 61 73 44 6f 63 73 69 7a 65 20 29 7b 0a 20  bHasDocsize ){. 
1b190 20 20 20 20 20 20 20 66 74 73 33 49 6e 73 65 72         fts3Inser
1b1a0 74 44 6f 63 73 69 7a 65 28 26 72 63 2c 20 70 2c  tDocsize(&rc, p,
1b1b0 20 61 53 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20   aSz);.      }. 
1b1c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1b1d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b1e0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
1b1f0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
1b200 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20     pStmt = 0;.  
1b210 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b220 20 20 20 6e 45 6e 74 72 79 2b 2b 3b 0a 20 20 20     nEntry++;.   
1b230 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b       for(iCol=0;
1b240 20 69 43 6f 6c 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d   iCol<=p->nColum
1b250 6e 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  n; iCol++){.    
1b260 20 20 20 20 20 20 61 53 7a 49 6e 73 5b 69 43 6f        aSzIns[iCo
1b270 6c 5d 20 2b 3d 20 61 53 7a 5b 69 43 6f 6c 5d 3b  l] += aSz[iCol];
1b280 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b290 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1b2a0 20 70 2d 3e 62 46 74 73 34 20 29 7b 0a 20 20 20   p->bFts4 ){.   
1b2b0 20 20 20 66 74 73 33 55 70 64 61 74 65 44 6f 63     fts3UpdateDoc
1b2c0 54 6f 74 61 6c 73 28 26 72 63 2c 20 70 2c 20 61  Totals(&rc, p, a
1b2d0 53 7a 49 6e 73 2c 20 61 53 7a 44 65 6c 2c 20 6e  SzIns, aSzDel, n
1b2e0 45 6e 74 72 79 29 3b 0a 20 20 20 20 7d 0a 20 20  Entry);.    }.  
1b2f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
1b300 53 7a 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 53  Sz);..    if( pS
1b310 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  tmt ){.      int
1b320 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66   rc2 = sqlite3_f
1b330 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
1b340 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1b350 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b360 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
1b370 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1b380 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b390 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1b3a0 74 69 6f 6e 20 6f 70 65 6e 73 20 61 20 63 75 72  tion opens a cur
1b3b0 73 6f 72 20 75 73 65 64 20 74 6f 20 72 65 61 64  sor used to read
1b3c0 20 74 68 65 20 69 6e 70 75 74 20 64 61 74 61 20   the input data 
1b3d0 66 6f 72 20 61 6e 20 0a 2a 2a 20 69 6e 63 72 65  for an .** incre
1b3e0 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65  mental merge ope
1b3f0 72 61 74 69 6f 6e 2e 20 53 70 65 63 69 66 69 63  ration. Specific
1b400 61 6c 6c 79 2c 20 69 74 20 6f 70 65 6e 73 20 61  ally, it opens a
1b410 20 63 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 0a   cursor to scan.
1b420 2a 2a 20 74 68 65 20 6f 6c 64 65 73 74 20 6e 53  ** the oldest nS
1b430 65 67 20 73 65 67 6d 65 6e 74 73 20 28 69 64 78  eg segments (idx
1b440 3d 30 20 74 68 72 6f 75 67 68 20 69 64 78 3d 28  =0 through idx=(
1b450 6e 53 65 67 2d 31 29 29 20 69 6e 20 61 62 73 6f  nSeg-1)) in abso
1b460 6c 75 74 65 20 0a 2a 2a 20 6c 65 76 65 6c 20 69  lute .** level i
1b470 41 62 73 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  AbsLevel..*/.sta
1b480 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72  tic int fts3Incr
1b490 6d 65 72 67 65 43 73 72 28 0a 20 20 46 74 73 33  mergeCsr(.  Fts3
1b4a0 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
1b4b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1b4c0 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  TS3 table handle
1b4d0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
1b4e0 74 36 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 20  t64 iAbsLevel,  
1b4f0 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74        /* Absolut
1b500 65 20 6c 65 76 65 6c 20 74 6f 20 6f 70 65 6e 20  e level to open 
1b510 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 2c 20 20  */.  int nSeg,  
1b520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b530 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1b540 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65  f segments to me
1b550 72 67 65 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c  rge */.  Fts3Mul
1b560 74 69 53 65 67 52 65 61 64 65 72 20 2a 70 43 73  tiSegReader *pCs
1b570 72 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73  r        /* Curs
1b580 6f 72 20 6f 62 6a 65 63 74 20 74 6f 20 70 6f 70  or object to pop
1b590 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ulate */.){.  in
1b5a0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1b5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b5c0 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
1b5d0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1b5e0 70 53 74 6d 74 20 3d 20 30 3b 20 20 20 20 20 20  pStmt = 0;      
1b5f0 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75    /* Statement u
1b600 73 65 64 20 74 6f 20 72 65 61 64 20 25 5f 73 65  sed to read %_se
1b610 67 64 69 72 20 65 6e 74 72 79 20 2a 2f 20 20 0a  gdir entry */  .
1b620 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
1b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b640 20 20 2f 2a 20 42 79 74 65 73 20 61 6c 6c 6f 63    /* Bytes alloc
1b650 61 74 65 64 20 61 74 20 70 43 73 72 2d 3e 61 70  ated at pCsr->ap
1b660 53 65 67 6d 65 6e 74 5b 5d 20 2a 2f 0a 0a 20 20  Segment[] */..  
1b670 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
1b680 65 20 66 6f 72 20 74 68 65 20 46 74 73 33 4d 75  e for the Fts3Mu
1b690 6c 74 69 53 65 67 52 65 61 64 65 72 2e 61 43 73  ltiSegReader.aCs
1b6a0 72 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 6d  r[] array */.  m
1b6b0 65 6d 73 65 74 28 70 43 73 72 2c 20 30 2c 20 73  emset(pCsr, 0, s
1b6c0 69 7a 65 6f 66 28 2a 70 43 73 72 29 29 3b 0a 20  izeof(*pCsr));. 
1b6d0 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
1b6e0 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 29  Fts3SegReader *)
1b6f0 20 2a 20 6e 53 65 67 3b 0a 20 20 70 43 73 72 2d   * nSeg;.  pCsr-
1b700 3e 61 70 53 65 67 6d 65 6e 74 20 3d 20 28 46 74  >apSegment = (Ft
1b710 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a 29 73  s3SegReader **)s
1b720 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42  qlite3_malloc(nB
1b730 79 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 43 73  yte);..  if( pCs
1b740 72 2d 3e 61 70 53 65 67 6d 65 6e 74 3d 3d 30 20  r->apSegment==0 
1b750 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1b760 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
1b770 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 43  e{.    memset(pC
1b780 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 2c 20 30  sr->apSegment, 0
1b790 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 72 63  , nByte);.    rc
1b7a0 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
1b7b0 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c 45 56  , SQL_SELECT_LEV
1b7c0 45 4c 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  EL, &pStmt, 0);.
1b7d0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1b7e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
1b7f0 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 72 63  nt i;.    int rc
1b800 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  2;.    sqlite3_b
1b810 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  ind_int64(pStmt,
1b820 20 31 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a   1, iAbsLevel);.
1b830 20 20 20 20 61 73 73 65 72 74 28 20 70 43 73 72      assert( pCsr
1b840 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 30 20 29 3b  ->nSegment==0 );
1b850 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
1b860 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73  ==SQLITE_OK && s
1b870 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
1b880 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 26  t)==SQLITE_ROW &
1b890 26 20 69 3c 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a  & i<nSeg; i++){.
1b8a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1b8b0 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 4e  e3Fts3SegReaderN
1b8c0 65 77 28 69 2c 20 30 2c 0a 20 20 20 20 20 20 20  ew(i, 0,.       
1b8d0 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
1b8e0 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31  n_int64(pStmt, 1
1b8f0 29 2c 20 20 20 20 20 20 20 20 2f 2a 20 73 65 67  ),        /* seg
1b900 64 69 72 2e 73 74 61 72 74 5f 62 6c 6f 63 6b 20  dir.start_block 
1b910 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
1b920 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
1b930 34 28 70 53 74 6d 74 2c 20 32 29 2c 20 20 20 20  4(pStmt, 2),    
1b940 20 20 20 20 2f 2a 20 73 65 67 64 69 72 2e 6c 65      /* segdir.le
1b950 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 2a  aves_end_block *
1b960 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  /.          sqli
1b970 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
1b980 28 70 53 74 6d 74 2c 20 33 29 2c 20 20 20 20 20  (pStmt, 3),     
1b990 20 20 20 2f 2a 20 73 65 67 64 69 72 2e 65 6e 64     /* segdir.end
1b9a0 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  _block */.      
1b9b0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75      sqlite3_colu
1b9c0 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 34  mn_blob(pStmt, 4
1b9d0 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65  ),         /* se
1b9e0 67 64 69 72 2e 72 6f 6f 74 20 2a 2f 0a 20 20 20  gdir.root */.   
1b9f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
1ba00 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
1ba10 74 2c 20 34 29 2c 20 20 20 20 20 20 20 20 2f 2a  t, 4),        /*
1ba20 20 73 65 67 64 69 72 2e 72 6f 6f 74 20 2a 2f 0a   segdir.root */.
1ba30 20 20 20 20 20 20 20 20 20 20 26 70 43 73 72 2d            &pCsr-
1ba40 3e 61 70 53 65 67 6d 65 6e 74 5b 69 5d 0a 20 20  >apSegment[i].  
1ba50 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70 43 73      );.      pCs
1ba60 72 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 20  r->nSegment++;. 
1ba70 20 20 20 7d 0a 20 20 20 20 72 63 32 20 3d 20 73     }.    rc2 = s
1ba80 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
1ba90 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  mt);.    if( rc=
1baa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
1bab0 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 72 65  = rc2;.  }..  re
1bac0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 74 79 70 65  turn rc;.}..type
1bad0 64 65 66 20 73 74 72 75 63 74 20 49 6e 63 72 6d  def struct Incrm
1bae0 65 72 67 65 57 72 69 74 65 72 20 49 6e 63 72 6d  ergeWriter Incrm
1baf0 65 72 67 65 57 72 69 74 65 72 3b 0a 74 79 70 65  ergeWriter;.type
1bb00 64 65 66 20 73 74 72 75 63 74 20 4e 6f 64 65 57  def struct NodeW
1bb10 72 69 74 65 72 20 4e 6f 64 65 57 72 69 74 65 72  riter NodeWriter
1bb20 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
1bb30 20 42 6c 6f 62 20 42 6c 6f 62 3b 0a 74 79 70 65   Blob Blob;.type
1bb40 64 65 66 20 73 74 72 75 63 74 20 4e 6f 64 65 52  def struct NodeR
1bb50 65 61 64 65 72 20 4e 6f 64 65 52 65 61 64 65 72  eader NodeReader
1bb60 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
1bb70 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
1bb80 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
1bb90 69 73 20 75 73 65 64 20 61 73 20 61 20 64 79 6e  is used as a dyn
1bba0 61 6d 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 74  amic buffer.** t
1bbb0 6f 20 62 75 69 6c 64 20 75 70 20 6e 6f 64 65 73  o build up nodes
1bbc0 20 6f 72 20 6f 74 68 65 72 20 62 6c 6f 62 73 20   or other blobs 
1bbd0 6f 66 20 64 61 74 61 20 69 6e 2e 0a 2a 2a 0a 2a  of data in..**.*
1bbe0 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 62  * The function b
1bbf0 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28 29 20  lobGrowBuffer() 
1bc00 69 73 20 75 73 65 64 20 74 6f 20 65 78 74 65 6e  is used to exten
1bc10 64 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  d the allocation
1bc20 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 42 6c 6f 62  ..*/.struct Blob
1bc30 20 7b 0a 20 20 63 68 61 72 20 2a 61 3b 20 20 20   {.  char *a;   
1bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc50 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1bc60 74 6f 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f  to allocation */
1bc70 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
1bc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc90 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1bca0 76 61 6c 69 64 20 62 79 74 65 73 20 6f 66 20 64  valid bytes of d
1bcb0 61 74 61 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20  ata in a[] */.  
1bcc0 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20  int nAlloc;     
1bcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bce0 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a  /* Allocated siz
1bcf0 65 20 6f 66 20 61 5b 5d 20 28 6e 41 6c 6c 6f 63  e of a[] (nAlloc
1bd00 3e 3d 6e 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  >=n) */.};../*.*
1bd10 2a 20 54 68 69 73 20 73 74 72 75 63 74 75 72 65  * This structure
1bd20 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c   is used to buil
1bd30 64 20 75 70 20 62 75 66 66 65 72 73 20 63 6f 6e  d up buffers con
1bd40 74 61 69 6e 69 6e 67 20 73 65 67 6d 65 6e 74 20  taining segment 
1bd50 62 2d 74 72 65 65 20 0a 2a 2a 20 6e 6f 64 65 73  b-tree .** nodes
1bd60 20 28 62 6c 6f 63 6b 73 29 2e 0a 2a 2f 0a 73 74   (blocks)..*/.st
1bd70 72 75 63 74 20 4e 6f 64 65 57 72 69 74 65 72 20  ruct NodeWriter 
1bd80 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
1bd90 34 20 69 42 6c 6f 63 6b 3b 20 20 20 20 20 20 20  4 iBlock;       
1bda0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62      /* Current b
1bdb0 6c 6f 63 6b 20 69 64 20 2a 2f 0a 20 20 42 6c 6f  lock id */.  Blo
1bdc0 62 20 6b 65 79 3b 20 20 20 20 20 20 20 20 20 20  b key;          
1bdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bde0 4c 61 73 74 20 6b 65 79 20 77 72 69 74 74 65 6e  Last key written
1bdf0 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
1be00 62 6c 6f 63 6b 20 2a 2f 0a 20 20 42 6c 6f 62 20  block */.  Blob 
1be10 62 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  block;          
1be20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
1be30 72 72 65 6e 74 20 62 6c 6f 63 6b 20 69 6d 61 67  rrent block imag
1be40 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  e */.};../*.** A
1be50 6e 20 6f 62 6a 65 63 74 20 6f 66 20 74 68 69 73  n object of this
1be60 20 74 79 70 65 20 63 6f 6e 74 61 69 6e 73 20 74   type contains t
1be70 68 65 20 73 74 61 74 65 20 72 65 71 75 69 72 65  he state require
1be80 64 20 74 6f 20 63 72 65 61 74 65 20 6f 72 20 61  d to create or a
1be90 70 70 65 6e 64 0a 2a 2a 20 74 6f 20 61 6e 20 61  ppend.** to an a
1bea0 70 70 65 6e 64 61 62 6c 65 20 62 2d 74 72 65 65  ppendable b-tree
1beb0 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 72   segment..*/.str
1bec0 75 63 74 20 49 6e 63 72 6d 65 72 67 65 57 72 69  uct IncrmergeWri
1bed0 74 65 72 20 7b 0a 20 20 69 6e 74 20 6e 4c 65 61  ter {.  int nLea
1bee0 66 45 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  fEst;           
1bef0 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
1bf00 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 6c   allocated for l
1bf10 65 61 66 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20  eaf blocks */.  
1bf20 69 6e 74 20 6e 57 6f 72 6b 3b 20 20 20 20 20 20  int nWork;      
1bf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf40 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
1bf50 66 20 70 61 67 65 73 20 66 6c 75 73 68 65 64 20  f pages flushed 
1bf60 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
1bf70 36 34 20 69 41 62 73 4c 65 76 65 6c 3b 20 20 20  64 iAbsLevel;   
1bf80 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65       /* Absolute
1bf90 20 6c 65 76 65 6c 20 6f 66 20 69 6e 70 75 74 20   level of input 
1bfa0 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e  segments */.  in
1bfb0 74 20 69 49 64 78 3b 20 20 20 20 20 20 20 20 20  t iIdx;         
1bfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bfd0 20 49 6e 64 65 78 20 6f 66 20 2a 6f 75 74 70 75   Index of *outpu
1bfe0 74 2a 20 73 65 67 6d 65 6e 74 20 69 6e 20 69 41  t* segment in iA
1bff0 62 73 4c 65 76 65 6c 2b 31 20 2a 2f 0a 20 20 73  bsLevel+1 */.  s
1c000 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 53 74  qlite3_int64 iSt
1c010 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  art;           /
1c020 2a 20 42 6c 6f 63 6b 20 6e 75 6d 62 65 72 20 6f  * Block number o
1c030 66 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65  f first allocate
1c040 64 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 73 71 6c  d block */.  sql
1c050 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 3b  ite3_int64 iEnd;
1c060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c070 42 6c 6f 63 6b 20 6e 75 6d 62 65 72 20 6f 66 20  Block number of 
1c080 6c 61 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 62  last allocated b
1c090 6c 6f 63 6b 20 2a 2f 0a 20 20 4e 6f 64 65 57 72  lock */.  NodeWr
1c0a0 69 74 65 72 20 61 4e 6f 64 65 57 72 69 74 65 72  iter aNodeWriter
1c0b0 5b 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41  [FTS_MAX_APPENDA
1c0c0 42 4c 45 5f 48 45 49 47 48 54 5d 3b 0a 7d 3b 0a  BLE_HEIGHT];.};.
1c0d0 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74  ./*.** An object
1c0e0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1c0f0 67 20 74 79 70 65 20 69 73 20 75 73 65 64 20 74  g type is used t
1c100 6f 20 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d  o read data from
1c110 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 46 54 53   a single.** FTS
1c120 20 73 65 67 6d 65 6e 74 20 6e 6f 64 65 2e 20 53   segment node. S
1c130 65 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ee the following
1c140 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a   functions:.**.*
1c150 2a 20 20 20 20 20 6e 6f 64 65 52 65 61 64 65 72  *     nodeReader
1c160 49 6e 69 74 28 29 0a 2a 2a 20 20 20 20 20 6e 6f  Init().**     no
1c170 64 65 52 65 61 64 65 72 4e 65 78 74 28 29 0a 2a  deReaderNext().*
1c180 2a 20 20 20 20 20 6e 6f 64 65 52 65 61 64 65 72  *     nodeReader
1c190 52 65 6c 65 61 73 65 28 29 0a 2a 2f 0a 73 74 72  Release().*/.str
1c1a0 75 63 74 20 4e 6f 64 65 52 65 61 64 65 72 20 7b  uct NodeReader {
1c1b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  .  const char *a
1c1c0 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 6e 4e 6f 64  Node;.  int nNod
1c1d0 65 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20 20  e;.  int iOff;  
1c1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1f0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
1c200 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 61 4e  offset within aN
1c210 6f 64 65 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 4f  ode[] */..  /* O
1c220 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 2e  utput variables.
1c230 20 43 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   Containing the 
1c240 63 75 72 72 65 6e 74 20 6e 6f 64 65 20 65 6e 74  current node ent
1c250 72 79 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ry. */.  sqlite3
1c260 5f 69 6e 74 36 34 20 69 43 68 69 6c 64 3b 20 20  _int64 iChild;  
1c270 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1c280 74 65 72 20 74 6f 20 63 68 69 6c 64 20 6e 6f 64  ter to child nod
1c290 65 20 2a 2f 0a 20 20 42 6c 6f 62 20 74 65 72 6d  e */.  Blob term
1c2a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c2b0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
1c2c0 74 20 74 65 72 6d 20 2a 2f 0a 20 20 63 6f 6e 73  t term */.  cons
1c2d0 74 20 63 68 61 72 20 2a 61 44 6f 63 6c 69 73 74  t char *aDoclist
1c2e0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
1c2f0 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73  ointer to doclis
1c300 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f 63 6c  t */.  int nDocl
1c310 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
1c320 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1c330 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 62 79 74  f doclist in byt
1c340 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  es */.};../*.** 
1c350 49 66 20 2a 70 52 63 20 69 73 20 6e 6f 74 20 53  If *pRc is not S
1c360 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68  QLITE_OK when th
1c370 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1c380 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
1c390 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  o-op..** Otherwi
1c3a0 73 65 2c 20 69 66 20 74 68 65 20 61 6c 6c 6f 63  se, if the alloc
1c3b0 61 74 69 6f 6e 20 61 74 20 70 42 6c 6f 62 2d 3e  ation at pBlob->
1c3c0 61 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  a is not already
1c3d0 20 61 74 20 6c 65 61 73 74 20 6e 4d 69 6e 0a 2a   at least nMin.*
1c3e0 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  * bytes in size,
1c3f0 20 65 78 74 65 6e 64 20 28 72 65 61 6c 6c 6f 63   extend (realloc
1c400 29 20 69 74 20 74 6f 20 62 65 20 73 6f 2e 0a 2a  ) it to be so..*
1c410 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65  *.** If an OOM e
1c420 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
1c430 20 2a 70 52 63 20 74 6f 20 53 51 4c 49 54 45 5f   *pRc to SQLITE_
1c440 4e 4f 4d 45 4d 20 61 6e 64 20 6c 65 61 76 65 20  NOMEM and leave 
1c450 70 42 6c 6f 62 2d 3e 61 0a 2a 2a 20 75 6e 6d 6f  pBlob->a.** unmo
1c460 64 69 66 69 65 64 2e 20 4f 74 68 65 72 77 69 73  dified. Otherwis
1c470 65 2c 20 69 66 20 74 68 65 20 61 6c 6c 6f 63 61  e, if the alloca
1c480 74 69 6f 6e 20 73 75 63 63 65 65 64 73 2c 20 75  tion succeeds, u
1c490 70 64 61 74 65 20 70 42 6c 6f 62 2d 3e 6e 41 6c  pdate pBlob->nAl
1c4a0 6c 6f 63 0a 2a 2a 20 74 6f 20 72 65 66 6c 65 63  loc.** to reflec
1c4b0 74 20 74 68 65 20 6e 65 77 20 73 69 7a 65 20 6f  t the new size o
1c4c0 66 20 74 68 65 20 70 42 6c 6f 62 2d 3e 61 5b 5d  f the pBlob->a[]
1c4d0 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74   buffer..*/.stat
1c4e0 69 63 20 76 6f 69 64 20 62 6c 6f 62 47 72 6f 77  ic void blobGrow
1c4f0 42 75 66 66 65 72 28 42 6c 6f 62 20 2a 70 42 6c  Buffer(Blob *pBl
1c500 6f 62 2c 20 69 6e 74 20 6e 4d 69 6e 2c 20 69 6e  ob, int nMin, in
1c510 74 20 2a 70 52 63 29 7b 0a 20 20 69 66 28 20 2a  t *pRc){.  if( *
1c520 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  pRc==SQLITE_OK &
1c530 26 20 6e 4d 69 6e 3e 70 42 6c 6f 62 2d 3e 6e 41  & nMin>pBlob->nA
1c540 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74 20  lloc ){.    int 
1c550 6e 41 6c 6c 6f 63 20 3d 20 6e 4d 69 6e 3b 0a 20  nAlloc = nMin;. 
1c560 20 20 20 63 68 61 72 20 2a 61 20 3d 20 28 63 68     char *a = (ch
1c570 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  ar *)sqlite3_rea
1c580 6c 6c 6f 63 28 70 42 6c 6f 62 2d 3e 61 2c 20 6e  lloc(pBlob->a, n
1c590 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20  Alloc);.    if( 
1c5a0 61 20 29 7b 0a 20 20 20 20 20 20 70 42 6c 6f 62  a ){.      pBlob
1c5b0 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f  ->nAlloc = nAllo
1c5c0 63 3b 0a 20 20 20 20 20 20 70 42 6c 6f 62 2d 3e  c;.      pBlob->
1c5d0 61 20 3d 20 61 3b 0a 20 20 20 20 7d 65 6c 73 65  a = a;.    }else
1c5e0 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53  {.      *pRc = S
1c5f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1c600 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1c610 41 74 74 65 6d 70 74 20 74 6f 20 61 64 76 61 6e  Attempt to advan
1c620 63 65 20 74 68 65 20 6e 6f 64 65 2d 72 65 61 64  ce the node-read
1c630 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  er object passed
1c640 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
1c650 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65  gument to.** the
1c660 20 6e 65 78 74 20 65 6e 74 72 79 20 6f 6e 20 74   next entry on t
1c670 68 65 20 6e 6f 64 65 2e 20 0a 2a 2a 0a 2a 2a 20  he node. .**.** 
1c680 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
1c690 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72  code if an error
1c6a0 20 6f 63 63 75 72 73 20 28 53 51 4c 49 54 45 5f   occurs (SQLITE_
1c6b0 4e 4f 4d 45 4d 20 69 73 20 70 6f 73 73 69 62 6c  NOMEM is possibl
1c6c0 65 29 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  e). .** Otherwis
1c6d0 65 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  e return SQLITE_
1c6e0 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  OK. If there is 
1c6f0 6e 6f 20 6e 65 78 74 20 65 6e 74 72 79 20 6f 6e  no next entry on
1c700 20 74 68 65 20 6e 6f 64 65 0a 2a 2a 20 28 65 2e   the node.** (e.
1c710 67 2e 20 62 65 63 61 75 73 65 20 74 68 65 20 63  g. because the c
1c720 75 72 72 65 6e 74 20 65 6e 74 72 79 20 69 73 20  urrent entry is 
1c730 74 68 65 20 6c 61 73 74 29 20 73 65 74 20 4e 6f  the last) set No
1c740 64 65 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20  deReader->aNode 
1c750 74 6f 0a 2a 2a 20 4e 55 4c 4c 20 74 6f 20 69 6e  to.** NULL to in
1c760 64 69 63 61 74 65 20 45 4f 46 2e 20 4f 74 68 65  dicate EOF. Othe
1c770 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20  rwise, populate 
1c780 74 68 65 20 4e 6f 64 65 52 65 61 64 65 72 20 73  the NodeReader s
1c790 74 72 75 63 74 75 72 65 20 6f 75 74 70 75 74 20  tructure output 
1c7a0 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 66 6f  .** variables fo
1c7b0 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 2e  r the new entry.
1c7c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
1c7d0 6f 64 65 52 65 61 64 65 72 4e 65 78 74 28 4e 6f  odeReaderNext(No
1c7e0 64 65 52 65 61 64 65 72 20 2a 70 29 7b 0a 20 20  deReader *p){.  
1c7f0 69 6e 74 20 62 46 69 72 73 74 20 3d 20 28 70 2d  int bFirst = (p-
1c800 3e 74 65 72 6d 2e 6e 3d 3d 30 29 3b 20 20 20 20  >term.n==0);    
1c810 2f 2a 20 54 72 75 65 20 66 6f 72 20 66 69 72 73  /* True for firs
1c820 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 6e 6f  t term on the no
1c830 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65  de */.  int nPre
1c840 66 69 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20  fix = 0;        
1c850 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
1c860 20 74 6f 20 63 6f 70 79 20 66 72 6f 6d 20 70 72   to copy from pr
1c870 65 76 69 6f 75 73 20 74 65 72 6d 20 2a 2f 0a 20  evious term */. 
1c880 20 69 6e 74 20 6e 53 75 66 66 69 78 20 3d 20 30   int nSuffix = 0
1c890 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c8a0 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 70 70   /* Bytes to app
1c8b0 65 6e 64 20 74 6f 20 74 68 65 20 70 72 65 66 69  end to the prefi
1c8c0 78 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  x */.  int rc = 
1c8d0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
1c8e0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1c8f0 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65   code */..  asse
1c900 72 74 28 20 70 2d 3e 61 4e 6f 64 65 20 29 3b 0a  rt( p->aNode );.
1c910 20 20 69 66 28 20 70 2d 3e 69 43 68 69 6c 64 20    if( p->iChild 
1c920 26 26 20 62 46 69 72 73 74 3d 3d 30 20 29 20 70  && bFirst==0 ) p
1c930 2d 3e 69 43 68 69 6c 64 2b 2b 3b 0a 20 20 69 66  ->iChild++;.  if
1c940 28 20 70 2d 3e 69 4f 66 66 3e 3d 70 2d 3e 6e 4e  ( p->iOff>=p->nN
1c950 6f 64 65 20 29 7b 0a 20 20 20 20 2f 2a 20 45 4f  ode ){.    /* EO
1c960 46 20 2a 2f 0a 20 20 20 20 70 2d 3e 61 4e 6f 64  F */.    p->aNod
1c970 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
1c980 20 20 20 20 69 66 28 20 62 46 69 72 73 74 3d 3d      if( bFirst==
1c990 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  0 ){.      p->iO
1c9a0 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  ff += sqlite3Fts
1c9b0 33 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 2d  3GetVarint32(&p-
1c9c0 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f 66 66 5d 2c  >aNode[p->iOff],
1c9d0 20 26 6e 50 72 65 66 69 78 29 3b 0a 20 20 20 20   &nPrefix);.    
1c9e0 7d 0a 20 20 20 20 70 2d 3e 69 4f 66 66 20 2b 3d  }.    p->iOff +=
1c9f0 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56   sqlite3Fts3GetV
1ca00 61 72 69 6e 74 33 32 28 26 70 2d 3e 61 4e 6f 64  arint32(&p->aNod
1ca10 65 5b 70 2d 3e 69 4f 66 66 5d 2c 20 26 6e 53 75  e[p->iOff], &nSu
1ca20 66 66 69 78 29 3b 0a 0a 20 20 20 20 62 6c 6f 62  ffix);..    blob
1ca30 47 72 6f 77 42 75 66 66 65 72 28 26 70 2d 3e 74  GrowBuffer(&p->t
1ca40 65 72 6d 2c 20 6e 50 72 65 66 69 78 2b 6e 53 75  erm, nPrefix+nSu
1ca50 66 66 69 78 2c 20 26 72 63 29 3b 0a 20 20 20 20  ffix, &rc);.    
1ca60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ca70 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  K ){.      memcp
1ca80 79 28 26 70 2d 3e 74 65 72 6d 2e 61 5b 6e 50 72  y(&p->term.a[nPr
1ca90 65 66 69 78 5d 2c 20 26 70 2d 3e 61 4e 6f 64 65  efix], &p->aNode
1caa0 5b 70 2d 3e 69 4f 66 66 5d 2c 20 6e 53 75 66 66  [p->iOff], nSuff
1cab0 69 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 74 65  ix);.      p->te
1cac0 72 6d 2e 6e 20 3d 20 6e 50 72 65 66 69 78 2b 6e  rm.n = nPrefix+n
1cad0 53 75 66 66 69 78 3b 0a 20 20 20 20 20 20 70 2d  Suffix;.      p-
1cae0 3e 69 4f 66 66 20 2b 3d 20 6e 53 75 66 66 69 78  >iOff += nSuffix
1caf0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69  ;.      if( p->i
1cb00 43 68 69 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Child==0 ){.    
1cb10 20 20 20 20 70 2d 3e 69 4f 66 66 20 2b 3d 20 73      p->iOff += s
1cb20 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
1cb30 69 6e 74 33 32 28 26 70 2d 3e 61 4e 6f 64 65 5b  int32(&p->aNode[
1cb40 70 2d 3e 69 4f 66 66 5d 2c 20 26 70 2d 3e 6e 44  p->iOff], &p->nD
1cb50 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  oclist);.       
1cb60 20 70 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20 26   p->aDoclist = &
1cb70 70 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f 66 66  p->aNode[p->iOff
1cb80 5d 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f  ];.        p->iO
1cb90 66 66 20 2b 3d 20 70 2d 3e 6e 44 6f 63 6c 69 73  ff += p->nDoclis
1cba0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1cbb0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1cbc0 70 2d 3e 69 4f 66 66 3c 3d 70 2d 3e 6e 4e 6f 64  p->iOff<=p->nNod
1cbd0 65 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  e );..  return r
1cbe0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  c;.}../*.** Rele
1cbf0 61 73 65 20 61 6c 6c 20 64 79 6e 61 6d 69 63 20  ase all dynamic 
1cc00 72 65 73 6f 75 72 63 65 73 20 68 65 6c 64 20 62  resources held b
1cc10 79 20 6e 6f 64 65 2d 72 65 61 64 65 72 20 6f 62  y node-reader ob
1cc20 6a 65 63 74 20 2a 70 2e 0a 2a 2f 0a 73 74 61 74  ject *p..*/.stat
1cc30 69 63 20 76 6f 69 64 20 6e 6f 64 65 52 65 61 64  ic void nodeRead
1cc40 65 72 52 65 6c 65 61 73 65 28 4e 6f 64 65 52 65  erRelease(NodeRe
1cc50 61 64 65 72 20 2a 70 29 7b 0a 20 20 73 71 6c 69  ader *p){.  sqli
1cc60 74 65 33 5f 66 72 65 65 28 70 2d 3e 74 65 72 6d  te3_free(p->term
1cc70 2e 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .a);.}../*.** In
1cc80 69 74 69 61 6c 69 7a 65 20 61 20 6e 6f 64 65 2d  itialize a node-
1cc90 72 65 61 64 65 72 20 6f 62 6a 65 63 74 20 74 6f  reader object to
1cca0 20 72 65 61 64 20 74 68 65 20 6e 6f 64 65 20 69   read the node i
1ccb0 6e 20 62 75 66 66 65 72 20 61 4e 6f 64 65 2f 6e  n buffer aNode/n
1ccc0 4e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  Node..**.** If s
1ccd0 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
1cce0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1ccf0 20 61 6e 64 20 74 68 65 20 4e 6f 64 65 52 65 61   and the NodeRea
1cd00 64 65 72 20 6f 62 6a 65 63 74 20 73 65 74 20 74  der object set t
1cd10 6f 20 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74  o .** point to t
1cd20 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 6f  he first entry o
1cd30 6e 20 74 68 65 20 6e 6f 64 65 20 28 69 66 20 61  n the node (if a
1cd40 6e 79 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ny). Otherwise, 
1cd50 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72  an SQLite.** err
1cd60 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1cd70 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
1cd80 6e 74 20 6e 6f 64 65 52 65 61 64 65 72 49 6e 69  nt nodeReaderIni
1cd90 74 28 4e 6f 64 65 52 65 61 64 65 72 20 2a 70 2c  t(NodeReader *p,
1cda0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 4e 6f   const char *aNo
1cdb0 64 65 2c 20 69 6e 74 20 6e 4e 6f 64 65 29 7b 0a  de, int nNode){.
1cdc0 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
1cdd0 69 7a 65 6f 66 28 4e 6f 64 65 52 65 61 64 65 72  izeof(NodeReader
1cde0 29 29 3b 0a 20 20 70 2d 3e 61 4e 6f 64 65 20 3d  ));.  p->aNode =
1cdf0 20 61 4e 6f 64 65 3b 0a 20 20 70 2d 3e 6e 4e 6f   aNode;.  p->nNo
1ce00 64 65 20 3d 20 6e 4e 6f 64 65 3b 0a 0a 20 20 2f  de = nNode;..  /
1ce10 2a 20 46 69 67 75 72 65 20 6f 75 74 20 69 66 20  * Figure out if 
1ce20 74 68 69 73 20 69 73 20 61 20 6c 65 61 66 20 6f  this is a leaf o
1ce30 72 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  r an internal no
1ce40 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  de. */.  if( p->
1ce50 61 4e 6f 64 65 5b 30 5d 20 29 7b 0a 20 20 20 20  aNode[0] ){.    
1ce60 2f 2a 20 41 6e 20 69 6e 74 65 72 6e 61 6c 20 6e  /* An internal n
1ce70 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 69  ode. */.    p->i
1ce80 4f 66 66 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  Off = 1 + sqlite
1ce90 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 26  3Fts3GetVarint(&
1cea0 70 2d 3e 61 4e 6f 64 65 5b 31 5d 2c 20 26 70 2d  p->aNode[1], &p-
1ceb0 3e 69 43 68 69 6c 64 29 3b 0a 20 20 7d 65 6c 73  >iChild);.  }els
1cec0 65 7b 0a 20 20 20 20 70 2d 3e 69 4f 66 66 20 3d  e{.    p->iOff =
1ced0 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   1;.  }..  retur
1cee0 6e 20 6e 6f 64 65 52 65 61 64 65 72 4e 65 78 74  n nodeReaderNext
1cef0 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  (p);.}../*.** Th
1cf00 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1cf10 61 6c 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74  alled while writ
1cf20 69 6e 67 20 61 6e 20 46 54 53 20 73 65 67 6d 65  ing an FTS segme
1cf30 6e 74 20 65 61 63 68 20 74 69 6d 65 20 61 20 6c  nt each time a l
1cf40 65 61 66 20 6f 0a 2a 2a 20 6e 6f 64 65 20 69 73  eaf o.** node is
1cf50 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20 77 72   finished and wr
1cf60 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 54  itten to disk. T
1cf70 68 65 20 6b 65 79 20 28 7a 54 65 72 6d 2f 6e 54  he key (zTerm/nT
1cf80 65 72 6d 29 20 69 73 20 67 75 61 72 61 6e 74 65  erm) is guarante
1cf90 65 64 0a 2a 2a 20 74 6f 20 62 65 20 67 72 65 61  ed.** to be grea
1cfa0 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72  ter than the lar
1cfb0 67 65 73 74 20 6b 65 79 20 6f 6e 20 74 68 65 20  gest key on the 
1cfc0 6e 6f 64 65 20 6a 75 73 74 20 77 72 69 74 74 65  node just writte
1cfd0 6e 2c 20 62 75 74 20 73 6d 61 6c 6c 65 72 0a 2a  n, but smaller.*
1cfe0 2a 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  * than or equal 
1cff0 74 6f 20 74 68 65 20 66 69 72 73 74 20 6b 65 79  to the first key
1d000 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 77 72   that will be wr
1d010 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6e 65 78  itten to the nex
1d020 74 20 6c 65 61 66 0a 2a 2a 20 6e 6f 64 65 2e 0a  t leaf.** node..
1d030 2a 2a 0a 2a 2a 20 54 68 65 20 62 6c 6f 63 6b 20  **.** The block 
1d040 69 64 20 6f 66 20 74 68 65 20 6c 65 61 66 20 6e  id of the leaf n
1d050 6f 64 65 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ode just written
1d060 20 74 6f 20 64 69 73 6b 20 6d 61 79 20 62 65 20   to disk may be 
1d070 66 6f 75 6e 64 20 69 6e 0a 2a 2a 20 28 70 57 72  found in.** (pWr
1d080 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65  iter->aNodeWrite
1d090 72 5b 30 5d 2e 69 42 6c 6f 63 6b 29 20 77 68 65  r[0].iBlock) whe
1d0a0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1d0b0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
1d0c0 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63  atic int fts3Inc
1d0d0 72 6d 65 72 67 65 50 75 73 68 28 0a 20 20 46 74  rmergePush(.  Ft
1d0e0 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
1d0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d100 20 46 74 73 33 20 74 61 62 6c 65 20 68 61 6e 64   Fts3 table hand
1d110 6c 65 20 2a 2f 0a 20 20 49 6e 63 72 6d 65 72 67  le */.  Incrmerg
1d120 65 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  eWriter *pWriter
1d130 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ,       /* Write
1d140 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  r object */.  co
1d150 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c  nst char *zTerm,
1d160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d170 20 54 65 72 6d 20 74 6f 20 77 72 69 74 65 20 74   Term to write t
1d180 6f 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20  o internal node 
1d190 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 20 20  */.  int nTerm  
1d1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1b0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 61 74       /* Bytes at
1d1c0 20 7a 54 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 73   zTerm */.){.  s
1d1d0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 74  qlite3_int64 iPt
1d1e0 72 20 3d 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f  r = pWriter->aNo
1d1f0 64 65 57 72 69 74 65 72 5b 30 5d 2e 69 42 6c 6f  deWriter[0].iBlo
1d200 63 6b 3b 0a 20 20 69 6e 74 20 69 4c 61 79 65 72  ck;.  int iLayer
1d210 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  ;..  assert( nTe
1d220 72 6d 3e 30 20 29 3b 0a 20 20 66 6f 72 28 69 4c  rm>0 );.  for(iL
1d230 61 79 65 72 3d 31 3b 20 41 4c 57 41 59 53 28 69  ayer=1; ALWAYS(i
1d240 4c 61 79 65 72 3c 46 54 53 5f 4d 41 58 5f 41 50  Layer<FTS_MAX_AP
1d250 50 45 4e 44 41 42 4c 45 5f 48 45 49 47 48 54 29  PENDABLE_HEIGHT)
1d260 3b 20 69 4c 61 79 65 72 2b 2b 29 7b 0a 20 20 20  ; iLayer++){.   
1d270 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1d280 4e 65 78 74 50 74 72 20 3d 20 30 3b 0a 20 20 20  NextPtr = 0;.   
1d290 20 4e 6f 64 65 57 72 69 74 65 72 20 2a 70 4e 6f   NodeWriter *pNo
1d2a0 64 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  de = &pWriter->a
1d2b0 4e 6f 64 65 57 72 69 74 65 72 5b 69 4c 61 79 65  NodeWriter[iLaye
1d2c0 72 5d 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  r];.    int rc =
1d2d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1d2e0 69 6e 74 20 6e 50 72 65 66 69 78 3b 0a 20 20 20  int nPrefix;.   
1d2f0 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 0a 20 20   int nSuffix;.  
1d300 20 20 69 6e 74 20 6e 53 70 61 63 65 3b 0a 0a 20    int nSpace;.. 
1d310 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
1d320 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20   how much space 
1d330 74 68 65 20 6b 65 79 20 77 69 6c 6c 20 63 6f 6e  the key will con
1d340 73 75 6d 65 20 69 66 20 69 74 20 69 73 20 77 72  sume if it is wr
1d350 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20  itten to.    ** 
1d360 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65  the current node
1d370 20 6f 66 20 6c 61 79 65 72 20 69 4c 61 79 65 72   of layer iLayer
1d380 2e 20 44 75 65 20 74 6f 20 74 68 65 20 70 72 65  . Due to the pre
1d390 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f 6e 2c  fix compression,
1d3a0 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 70 61   .    ** the spa
1d3b0 63 65 20 72 65 71 75 69 72 65 64 20 63 68 61 6e  ce required chan
1d3c0 67 65 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ges depending on
1d3d0 20 77 68 69 63 68 20 6e 6f 64 65 20 74 68 65 20   which node the 
1d3e0 6b 65 79 20 69 73 20 74 6f 0a 20 20 20 20 2a 2a  key is to.    **
1d3f0 20 62 65 20 61 64 64 65 64 20 74 6f 2e 20 20 2a   be added to.  *
1d400 2f 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20  /.    nPrefix = 
1d410 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65  fts3PrefixCompre
1d420 73 73 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e 61 2c  ss(pNode->key.a,
1d430 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 2c 20 7a   pNode->key.n, z
1d440 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20  Term, nTerm);.  
1d450 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72    nSuffix = nTer
1d460 6d 20 2d 20 6e 50 72 65 66 69 78 3b 0a 20 20 20  m - nPrefix;.   
1d470 20 6e 53 70 61 63 65 20 20 3d 20 73 71 6c 69 74   nSpace  = sqlit
1d480 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28  e3Fts3VarintLen(
1d490 6e 50 72 65 66 69 78 29 3b 0a 20 20 20 20 6e 53  nPrefix);.    nS
1d4a0 70 61 63 65 20 2b 3d 20 73 71 6c 69 74 65 33 46  pace += sqlite3F
1d4b0 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 53 75  ts3VarintLen(nSu
1d4c0 66 66 69 78 29 20 2b 20 6e 53 75 66 66 69 78 3b  ffix) + nSuffix;
1d4d0 0a 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d  ..    if( pNode-
1d4e0 3e 6b 65 79 2e 6e 3d 3d 30 20 7c 7c 20 28 70 4e  >key.n==0 || (pN
1d4f0 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 20 2b 20 6e  ode->block.n + n
1d500 53 70 61 63 65 29 3c 3d 70 2d 3e 6e 4e 6f 64 65  Space)<=p->nNode
1d510 53 69 7a 65 20 29 7b 20 0a 20 20 20 20 20 20 2f  Size ){ .      /
1d520 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
1d530 20 6e 6f 64 65 20 6f 66 20 6c 61 79 65 72 20 69   node of layer i
1d540 4c 61 79 65 72 20 63 6f 6e 74 61 69 6e 73 20 7a  Layer contains z
1d550 65 72 6f 20 6b 65 79 73 2c 20 6f 72 20 69 66 20  ero keys, or if 
1d560 61 64 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  adding.      ** 
1d570 74 68 65 20 6b 65 79 20 74 6f 20 69 74 20 77 69  the key to it wi
1d580 6c 6c 20 6e 6f 74 20 63 61 75 73 65 20 69 74 20  ll not cause it 
1d590 74 6f 20 67 72 6f 77 20 74 6f 20 6c 61 72 67 65  to grow to large
1d5a0 72 20 74 68 61 6e 20 6e 4e 6f 64 65 53 69 7a 65  r than nNodeSize
1d5b0 20 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73   .      ** bytes
1d5c0 20 69 6e 20 73 69 7a 65 2c 20 77 72 69 74 65 20   in size, write 
1d5d0 74 68 65 20 6b 65 79 20 68 65 72 65 2e 20 20 2a  the key here.  *
1d5e0 2f 0a 0a 20 20 20 20 20 20 42 6c 6f 62 20 2a 70  /..      Blob *p
1d5f0 42 6c 6b 20 3d 20 26 70 4e 6f 64 65 2d 3e 62 6c  Blk = &pNode->bl
1d600 6f 63 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ock;.      if( p
1d610 42 6c 6b 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20  Blk->n==0 ){.   
1d620 20 20 20 20 20 62 6c 6f 62 47 72 6f 77 42 75 66       blobGrowBuf
1d630 66 65 72 28 70 42 6c 6b 2c 20 70 2d 3e 6e 4e 6f  fer(pBlk, p->nNo
1d640 64 65 53 69 7a 65 2c 20 26 72 63 29 3b 0a 20 20  deSize, &rc);.  
1d650 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1d660 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d670 20 20 20 20 20 70 42 6c 6b 2d 3e 61 5b 30 5d 20       pBlk->a[0] 
1d680 3d 20 28 63 68 61 72 29 69 4c 61 79 65 72 3b 0a  = (char)iLayer;.
1d690 20 20 20 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e            pBlk->
1d6a0 6e 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 46  n = 1 + sqlite3F
1d6b0 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 42  ts3PutVarint(&pB
1d6c0 6c 6b 2d 3e 61 5b 31 5d 2c 20 69 50 74 72 29 3b  lk->a[1], iPtr);
1d6d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d6e0 20 7d 0a 20 20 20 20 20 20 62 6c 6f 62 47 72 6f   }.      blobGro
1d6f0 77 42 75 66 66 65 72 28 70 42 6c 6b 2c 20 70 42  wBuffer(pBlk, pB
1d700 6c 6b 2d 3e 6e 20 2b 20 6e 53 70 61 63 65 2c 20  lk->n + nSpace, 
1d710 26 72 63 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62  &rc);.      blob
1d720 47 72 6f 77 42 75 66 66 65 72 28 26 70 4e 6f 64  GrowBuffer(&pNod
1d730 65 2d 3e 6b 65 79 2c 20 6e 54 65 72 6d 2c 20 26  e->key, nTerm, &
1d740 72 63 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  rc);..      if( 
1d750 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d760 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 6f  .        if( pNo
1d770 64 65 2d 3e 6b 65 79 2e 6e 20 29 7b 0a 20 20 20  de->key.n ){.   
1d780 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e 6e 20 2b         pBlk->n +
1d790 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74  = sqlite3Fts3Put
1d7a0 56 61 72 69 6e 74 28 26 70 42 6c 6b 2d 3e 61 5b  Varint(&pBlk->a[
1d7b0 70 42 6c 6b 2d 3e 6e 5d 2c 20 6e 50 72 65 66 69  pBlk->n], nPrefi
1d7c0 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
1d7d0 20 20 20 20 20 20 70 42 6c 6b 2d 3e 6e 20 2b 3d        pBlk->n +=
1d7e0 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56   sqlite3Fts3PutV
1d7f0 61 72 69 6e 74 28 26 70 42 6c 6b 2d 3e 61 5b 70  arint(&pBlk->a[p
1d800 42 6c 6b 2d 3e 6e 5d 2c 20 6e 53 75 66 66 69 78  Blk->n], nSuffix
1d810 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
1d820 79 28 26 70 42 6c 6b 2d 3e 61 5b 70 42 6c 6b 2d  y(&pBlk->a[pBlk-
1d830 3e 6e 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50 72 65  >n], &zTerm[nPre
1d840 66 69 78 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a  fix], nSuffix);.
1d850 20 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e 6e 20          pBlk->n 
1d860 2b 3d 20 6e 53 75 66 66 69 78 3b 0a 0a 20 20 20  += nSuffix;..   
1d870 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 6f 64       memcpy(pNod
1d880 65 2d 3e 6b 65 79 2e 61 2c 20 7a 54 65 72 6d 2c  e->key.a, zTerm,
1d890 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20   nTerm);.       
1d8a0 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 20 3d 20   pNode->key.n = 
1d8b0 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  nTerm;.      }. 
1d8c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d8d0 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6c  /* Otherwise, fl
1d8e0 75 73 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ush the current 
1d8f0 6e 6f 64 65 20 6f 66 20 6c 61 79 65 72 20 69 4c  node of layer iL
1d900 61 79 65 72 20 74 6f 20 64 69 73 6b 2e 0a 20 20  ayer to disk..  
1d910 20 20 20 20 2a 2a 20 54 68 65 6e 20 61 6c 6c 6f      ** Then allo
1d920 63 61 74 65 20 61 20 6e 65 77 2c 20 65 6d 70 74  cate a new, empt
1d930 79 20 73 69 62 6c 69 6e 67 20 6e 6f 64 65 2e 20  y sibling node. 
1d940 54 68 65 20 6b 65 79 20 77 69 6c 6c 20 62 65 20  The key will be 
1d950 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 2a 2a  written.      **
1d960 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
1d970 20 6f 66 20 74 68 69 73 20 6e 6f 64 65 2e 20 2a   of this node. *
1d980 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  /.      rc = fts
1d990 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28 70 2c  3WriteSegment(p,
1d9a0 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b 2c 20   pNode->iBlock, 
1d9b0 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 2c 20  pNode->block.a, 
1d9c0 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 29 3b  pNode->block.n);
1d9d0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
1d9e0 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 41 6c  pNode->block.nAl
1d9f0 6c 6f 63 3e 3d 70 2d 3e 6e 4e 6f 64 65 53 69 7a  loc>=p->nNodeSiz
1da00 65 20 29 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65  e );.      pNode
1da10 2d 3e 62 6c 6f 63 6b 2e 61 5b 30 5d 20 3d 20 28  ->block.a[0] = (
1da20 63 68 61 72 29 69 4c 61 79 65 72 3b 0a 20 20 20  char)iLayer;.   
1da30 20 20 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e     pNode->block.
1da40 6e 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 46  n = 1 + sqlite3F
1da50 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 4e  ts3PutVarint(&pN
1da60 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 5b 31 5d 2c  ode->block.a[1],
1da70 20 69 50 74 72 2b 31 29 3b 0a 0a 20 20 20 20 20   iPtr+1);..     
1da80 20 69 4e 65 78 74 50 74 72 20 3d 20 70 4e 6f 64   iNextPtr = pNod
1da90 65 2d 3e 69 42 6c 6f 63 6b 3b 0a 20 20 20 20 20  e->iBlock;.     
1daa0 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b 2b 2b   pNode->iBlock++
1dab0 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 6b  ;.      pNode->k
1dac0 65 79 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ey.n = 0;.    }.
1dad0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1dae0 49 54 45 5f 4f 4b 20 7c 7c 20 69 4e 65 78 74 50  ITE_OK || iNextP
1daf0 74 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72  tr==0 ) return r
1db00 63 3b 0a 20 20 20 20 69 50 74 72 20 3d 20 69 4e  c;.    iPtr = iN
1db10 65 78 74 50 74 72 3b 0a 20 20 7d 0a 0a 20 20 61  extPtr;.  }..  a
1db20 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 72 65  ssert( 0 );.  re
1db30 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1db40 20 41 70 70 65 6e 64 20 61 20 74 65 72 6d 20 61   Append a term a
1db50 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
1db60 64 6f 63 6c 69 73 74 20 74 6f 20 74 68 65 20 46  doclist to the F
1db70 54 53 20 73 65 67 6d 65 6e 74 20 6e 6f 64 65 20  TS segment node 
1db80 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 73 74 6f  currently.** sto
1db90 72 65 64 20 69 6e 20 62 6c 6f 62 20 2a 70 4e 6f  red in blob *pNo
1dba0 64 65 2e 20 54 68 65 20 6e 6f 64 65 20 6e 65 65  de. The node nee
1dbb0 64 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  d not contain an
1dbc0 79 20 74 65 72 6d 73 2c 20 62 75 74 20 74 68 65  y terms, but the
1dbd0 0a 2a 2a 20 68 65 61 64 65 72 20 6d 75 73 74 20  .** header must 
1dbe0 62 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72  be written befor
1dbf0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
1dc00 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
1dc10 20 41 20 6e 6f 64 65 20 68 65 61 64 65 72 20 69   A node header i
1dc20 73 20 61 20 73 69 6e 67 6c 65 20 30 78 30 30 20  s a single 0x00 
1dc30 62 79 74 65 20 66 6f 72 20 61 20 6c 65 61 66 20  byte for a leaf 
1dc40 6e 6f 64 65 2c 20 6f 72 20 61 20 68 65 69 67 68  node, or a heigh
1dc50 74 20 76 61 72 69 6e 74 0a 2a 2a 20 66 6f 6c 6c  t varint.** foll
1dc60 6f 77 65 64 20 62 79 20 74 68 65 20 6c 65 66 74  owed by the left
1dc70 2d 68 61 6e 64 2d 63 68 69 6c 64 20 76 61 72 69  -hand-child vari
1dc80 6e 74 20 66 6f 72 20 61 6e 20 69 6e 74 65 72 6e  nt for an intern
1dc90 61 6c 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  al node..**.** T
1dca0 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 70  he term to be ap
1dcb0 70 65 6e 64 65 64 20 69 73 20 70 61 73 73 65 64  pended is passed
1dcc0 20 76 69 61 20 61 72 67 75 6d 65 6e 74 73 20 7a   via arguments z
1dcd0 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 46 6f 72 20  Term/nTerm. For 
1dce0 61 20 0a 2a 2a 20 6c 65 61 66 20 6e 6f 64 65 2c  a .** leaf node,
1dcf0 20 74 68 65 20 64 6f 63 6c 69 73 74 20 69 73 20   the doclist is 
1dd00 70 61 73 73 65 64 20 61 73 20 61 44 6f 63 6c 69  passed as aDocli
1dd10 73 74 2f 6e 44 6f 63 6c 69 73 74 2e 20 46 6f 72  st/nDoclist. For
1dd20 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20   an internal.** 
1dd30 6e 6f 64 65 2c 20 62 6f 74 68 20 61 44 6f 63 6c  node, both aDocl
1dd40 69 73 74 20 61 6e 64 20 6e 44 6f 63 6c 69 73 74  ist and nDoclist
1dd50 20 6d 75 73 74 20 62 65 20 70 61 73 73 65 64 20   must be passed 
1dd60 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  0..**.** If the 
1dd70 73 69 7a 65 20 6f 66 20 74 68 65 20 76 61 6c 75  size of the valu
1dd80 65 20 69 6e 20 62 6c 6f 62 20 70 50 72 65 76 20  e in blob pPrev 
1dd90 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  is zero, then th
1dda0 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  is is the first.
1ddb0 2a 2a 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20  ** term written 
1ddc0 74 6f 20 74 68 65 20 6e 6f 64 65 2e 20 4f 74 68  to the node. Oth
1ddd0 65 72 77 69 73 65 2c 20 70 50 72 65 76 20 63 6f  erwise, pPrev co
1dde0 6e 74 61 69 6e 73 20 61 20 63 6f 70 79 20 6f 66  ntains a copy of
1ddf0 20 74 68 65 20 0a 2a 2a 20 70 72 65 76 69 6f 75   the .** previou
1de00 73 20 74 65 72 6d 2e 20 42 65 66 6f 72 65 20 74  s term. Before t
1de10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
1de20 75 72 6e 73 2c 20 69 74 20 69 73 20 75 70 64 61  urns, it is upda
1de30 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61  ted to contain a
1de40 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 7a 54 65 72  .** copy of zTer
1de50 6d 2f 6e 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 49  m/nTerm..**.** I
1de60 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1de70 74 20 74 68 65 20 62 75 66 66 65 72 20 61 73 73  t the buffer ass
1de80 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 4e 6f  ociated with pNo
1de90 64 65 20 69 73 20 61 6c 72 65 61 64 79 20 6c 61  de is already la
1dea0 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 74 6f  rge.** enough to
1deb0 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65   accommodate the
1dec0 20 6e 65 77 20 65 6e 74 72 79 2e 20 54 68 65 20   new entry. The 
1ded0 62 75 66 66 65 72 20 61 73 73 6f 63 69 61 74 65  buffer associate
1dee0 64 20 77 69 74 68 20 70 50 72 65 76 0a 2a 2a 20  d with pPrev.** 
1def0 69 73 20 65 78 74 65 6e 64 65 64 20 62 79 20 74  is extended by t
1df00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20  his function if 
1df10 72 65 71 75 72 69 72 65 64 2e 0a 2a 2a 0a 2a 2a  requrired..**.**
1df20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 28 69 2e   If an error (i.
1df30 65 2e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  e. OOM condition
1df40 29 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  ) occurs, an SQL
1df50 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
1df60 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f  s.** returned. O
1df70 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
1df80 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
1df90 6e 74 20 66 74 73 33 41 70 70 65 6e 64 54 6f 4e  nt fts3AppendToN
1dfa0 6f 64 65 28 0a 20 20 42 6c 6f 62 20 2a 70 4e 6f  ode(.  Blob *pNo
1dfb0 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
1dfc0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
1dfd0 74 20 6e 6f 64 65 20 69 6d 61 67 65 20 74 6f 20  t node image to 
1dfe0 61 70 70 65 6e 64 20 74 6f 20 2a 2f 0a 20 20 42  append to */.  B
1dff0 6c 6f 62 20 2a 70 50 72 65 76 2c 20 20 20 20 20  lob *pPrev,     
1e000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e010 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
1e020 69 6e 67 20 70 72 65 76 69 6f 75 73 20 74 65 72  ing previous ter
1e030 6d 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 63  m written */.  c
1e040 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
1e050 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1e060 2a 20 4e 65 77 20 74 65 72 6d 20 74 6f 20 77 72  * New term to wr
1e070 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  ite */.  int nTe
1e080 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
1e090 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1e0a0 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62 79 74   of zTerm in byt
1e0b0 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  es */.  const ch
1e0c0 61 72 20 2a 61 44 6f 63 6c 69 73 74 2c 20 20 20  ar *aDoclist,   
1e0d0 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69          /* Docli
1e0e0 73 74 20 28 6f 72 20 4e 55 4c 4c 29 20 74 6f 20  st (or NULL) to 
1e0f0 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  write */.  int n
1e100 44 6f 63 6c 69 73 74 20 20 20 20 20 20 20 20 20  Doclist         
1e110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1e120 7a 65 20 6f 66 20 61 44 6f 63 6c 69 73 74 20 69  ze of aDoclist i
1e130 6e 20 62 79 74 65 73 20 2a 2f 20 0a 29 7b 0a 20  n bytes */ .){. 
1e140 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1e150 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
1e160 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1e170 2a 2f 0a 20 20 69 6e 74 20 62 46 69 72 73 74 20  */.  int bFirst 
1e180 3d 20 28 70 50 72 65 76 2d 3e 6e 3d 3d 30 29 3b  = (pPrev->n==0);
1e190 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1e1a0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1e1b0 74 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20 2a  t term written *
1e1c0 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b  /.  int nPrefix;
1e1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1e0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1e1f0 65 72 6d 20 70 72 65 66 69 78 20 69 6e 20 62 79  erm prefix in by
1e200 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  tes */.  int nSu
1e210 66 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20  ffix;           
1e220 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1e230 20 6f 66 20 74 65 72 6d 20 73 75 66 66 69 78 20   of term suffix 
1e240 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f  in bytes */..  /
1e250 2a 20 4e 6f 64 65 20 6d 75 73 74 20 68 61 76 65  * Node must have
1e260 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 74   already been st
1e270 61 72 74 65 64 2e 20 54 68 65 72 65 20 6d 75 73  arted. There mus
1e280 74 20 62 65 20 61 20 64 6f 63 6c 69 73 74 20 66  t be a doclist f
1e290 6f 72 20 61 0a 20 20 2a 2a 20 6c 65 61 66 20 6e  or a.  ** leaf n
1e2a0 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 6d  ode, and there m
1e2b0 75 73 74 20 6e 6f 74 20 62 65 20 61 20 64 6f 63  ust not be a doc
1e2c0 6c 69 73 74 20 66 6f 72 20 61 6e 20 69 6e 74 65  list for an inte
1e2d0 72 6e 61 6c 20 6e 6f 64 65 2e 20 20 2a 2f 0a 20  rnal node.  */. 
1e2e0 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e   assert( pNode->
1e2f0 6e 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  n>0 );.  assert(
1e300 20 28 70 4e 6f 64 65 2d 3e 61 5b 30 5d 3d 3d 27   (pNode->a[0]=='
1e310 5c 30 27 29 3d 3d 28 61 44 6f 63 6c 69 73 74 21  \0')==(aDoclist!
1e320 3d 30 29 20 29 3b 0a 0a 20 20 62 6c 6f 62 47 72  =0) );..  blobGr
1e330 6f 77 42 75 66 66 65 72 28 70 50 72 65 76 2c 20  owBuffer(pPrev, 
1e340 6e 54 65 72 6d 2c 20 26 72 63 29 3b 0a 20 20 69  nTerm, &rc);.  i
1e350 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e360 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
1e370 20 6e 50 72 65 66 69 78 20 3d 20 66 74 73 33 50   nPrefix = fts3P
1e380 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70 50  refixCompress(pP
1e390 72 65 76 2d 3e 61 2c 20 70 50 72 65 76 2d 3e 6e  rev->a, pPrev->n
1e3a0 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b  , zTerm, nTerm);
1e3b0 0a 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65  .  nSuffix = nTe
1e3c0 72 6d 20 2d 20 6e 50 72 65 66 69 78 3b 0a 20 20  rm - nPrefix;.  
1e3d0 6d 65 6d 63 70 79 28 70 50 72 65 76 2d 3e 61 2c  memcpy(pPrev->a,
1e3e0 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   zTerm, nTerm);.
1e3f0 20 20 70 50 72 65 76 2d 3e 6e 20 3d 20 6e 54 65    pPrev->n = nTe
1e400 72 6d 3b 0a 0a 20 20 69 66 28 20 62 46 69 72 73  rm;..  if( bFirs
1e410 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 6f 64  t==0 ){.    pNod
1e420 65 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46  e->n += sqlite3F
1e430 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 4e  ts3PutVarint(&pN
1e440 6f 64 65 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d  ode->a[pNode->n]
1e450 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 7d 0a  , nPrefix);.  }.
1e460 20 20 70 4e 6f 64 65 2d 3e 6e 20 2b 3d 20 73 71    pNode->n += sq
1e470 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69  lite3Fts3PutVari
1e480 6e 74 28 26 70 4e 6f 64 65 2d 3e 61 5b 70 4e 6f  nt(&pNode->a[pNo
1e490 64 65 2d 3e 6e 5d 2c 20 6e 53 75 66 66 69 78 29  de->n], nSuffix)
1e4a0 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 4e 6f 64  ;.  memcpy(&pNod
1e4b0 65 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d 2c 20  e->a[pNode->n], 
1e4c0 26 7a 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 2c  &zTerm[nPrefix],
1e4d0 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 70 4e 6f   nSuffix);.  pNo
1e4e0 64 65 2d 3e 6e 20 2b 3d 20 6e 53 75 66 66 69 78  de->n += nSuffix
1e4f0 3b 0a 0a 20 20 69 66 28 20 61 44 6f 63 6c 69 73  ;..  if( aDoclis
1e500 74 20 29 7b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e  t ){.    pNode->
1e510 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  n += sqlite3Fts3
1e520 50 75 74 56 61 72 69 6e 74 28 26 70 4e 6f 64 65  PutVarint(&pNode
1e530 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d 2c 20 6e  ->a[pNode->n], n
1e540 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 6d 65  Doclist);.    me
1e550 6d 63 70 79 28 26 70 4e 6f 64 65 2d 3e 61 5b 70  mcpy(&pNode->a[p
1e560 4e 6f 64 65 2d 3e 6e 5d 2c 20 61 44 6f 63 6c 69  Node->n], aDocli
1e570 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20  st, nDoclist);. 
1e580 20 20 20 70 4e 6f 64 65 2d 3e 6e 20 2b 3d 20 6e     pNode->n += n
1e590 44 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20  Doclist;.  }..  
1e5a0 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 6e  assert( pNode->n
1e5b0 3c 3d 70 4e 6f 64 65 2d 3e 6e 41 6c 6c 6f 63 20  <=pNode->nAlloc 
1e5c0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  );..  return SQL
1e5d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1e5e0 20 41 70 70 65 6e 64 20 74 68 65 20 63 75 72 72   Append the curr
1e5f0 65 6e 74 20 74 65 72 6d 20 61 6e 64 20 64 6f 63  ent term and doc
1e600 6c 69 73 74 20 70 6f 69 6e 74 65 64 20 74 6f 20  list pointed to 
1e610 62 79 20 63 75 72 73 6f 72 20 70 43 73 72 20 74  by cursor pCsr t
1e620 6f 20 74 68 65 0a 2a 2a 20 61 70 70 65 6e 64 61  o the.** appenda
1e630 62 6c 65 20 62 2d 74 72 65 65 20 73 65 67 6d 65  ble b-tree segme
1e640 6e 74 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72  nt opened for wr
1e650 69 74 69 6e 67 20 62 79 20 70 57 72 69 74 65 72  iting by pWriter
1e660 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
1e670 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
1e680 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
1e690 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
1e6a0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
1e6b0 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63  atic int fts3Inc
1e6c0 72 6d 65 72 67 65 41 70 70 65 6e 64 28 0a 20 20  rmergeAppend(.  
1e6d0 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
1e6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6f0 2f 2a 20 46 74 73 33 20 74 61 62 6c 65 20 68 61  /* Fts3 table ha
1e700 6e 64 6c 65 20 2a 2f 0a 20 20 49 6e 63 72 6d 65  ndle */.  Incrme
1e710 72 67 65 57 72 69 74 65 72 20 2a 70 57 72 69 74  rgeWriter *pWrit
1e720 65 72 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69  er,       /* Wri
1e730 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
1e740 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
1e750 65 72 20 2a 70 43 73 72 20 20 20 20 20 20 20 20  er *pCsr        
1e760 2f 2a 20 43 75 72 73 6f 72 20 63 6f 6e 74 61 69  /* Cursor contai
1e770 6e 69 6e 67 20 74 65 72 6d 20 61 6e 64 20 64 6f  ning term and do
1e780 63 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 63 6f  clist */.){.  co
1e790 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20  nst char *zTerm 
1e7a0 3d 20 70 43 73 72 2d 3e 7a 54 65 72 6d 3b 0a 20  = pCsr->zTerm;. 
1e7b0 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70 43 73   int nTerm = pCs
1e7c0 72 2d 3e 6e 54 65 72 6d 3b 0a 20 20 63 6f 6e 73  r->nTerm;.  cons
1e7d0 74 20 63 68 61 72 20 2a 61 44 6f 63 6c 69 73 74  t char *aDoclist
1e7e0 20 3d 20 70 43 73 72 2d 3e 61 44 6f 63 6c 69 73   = pCsr->aDoclis
1e7f0 74 3b 0a 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73  t;.  int nDoclis
1e800 74 20 3d 20 70 43 73 72 2d 3e 6e 44 6f 63 6c 69  t = pCsr->nDocli
1e810 73 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  st;.  int rc = S
1e820 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
1e830 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1e840 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61  de */.  int nSpa
1e850 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
1e860 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
1e870 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65  pace in bytes re
1e880 71 75 69 72 65 64 20 6f 6e 20 6c 65 61 66 20 2a  quired on leaf *
1e890 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b  /.  int nPrefix;
1e8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8b0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 72 65    /* Size of pre
1e8c0 66 69 78 20 73 68 61 72 65 64 20 77 69 74 68 20  fix shared with 
1e8d0 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 2a 2f  previous term */
1e8e0 0a 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 20  .  int nSuffix; 
1e8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e900 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 75 66 66   /* Size of suff
1e910 69 78 20 28 6e 54 65 72 6d 20 2d 20 6e 50 72 65  ix (nTerm - nPre
1e920 66 69 78 29 20 2a 2f 0a 20 20 4e 6f 64 65 57 72  fix) */.  NodeWr
1e930 69 74 65 72 20 2a 70 4c 65 61 66 3b 20 20 20 20  iter *pLeaf;    
1e940 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
1e950 74 20 75 73 65 64 20 74 6f 20 77 72 69 74 65 20  t used to write 
1e960 6c 65 61 66 20 6e 6f 64 65 73 20 2a 2f 0a 0a 20  leaf nodes */.. 
1e970 20 70 4c 65 61 66 20 3d 20 26 70 57 72 69 74 65   pLeaf = &pWrite
1e980 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 30  r->aNodeWriter[0
1e990 5d 3b 0a 20 20 6e 50 72 65 66 69 78 20 3d 20 66  ];.  nPrefix = f
1e9a0 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73  ts3PrefixCompres
1e9b0 73 28 70 4c 65 61 66 2d 3e 6b 65 79 2e 61 2c 20  s(pLeaf->key.a, 
1e9c0 70 4c 65 61 66 2d 3e 6b 65 79 2e 6e 2c 20 7a 54  pLeaf->key.n, zT
1e9d0 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 6e  erm, nTerm);.  n
1e9e0 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d 20 2d  Suffix = nTerm -
1e9f0 20 6e 50 72 65 66 69 78 3b 0a 0a 20 20 6e 53 70   nPrefix;..  nSp
1ea00 61 63 65 20 20 3d 20 73 71 6c 69 74 65 33 46 74  ace  = sqlite3Ft
1ea10 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 50 72 65  s3VarintLen(nPre
1ea20 66 69 78 29 3b 0a 20 20 6e 53 70 61 63 65 20 2b  fix);.  nSpace +
1ea30 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72  = sqlite3Fts3Var
1ea40 69 6e 74 4c 65 6e 28 6e 53 75 66 66 69 78 29 20  intLen(nSuffix) 
1ea50 2b 20 6e 53 75 66 66 69 78 3b 0a 20 20 6e 53 70  + nSuffix;.  nSp
1ea60 61 63 65 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ace += sqlite3Ft
1ea70 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 44 6f 63  s3VarintLen(nDoc
1ea80 6c 69 73 74 29 20 2b 20 6e 44 6f 63 6c 69 73 74  list) + nDoclist
1ea90 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
1eaa0 75 72 72 65 6e 74 20 62 6c 6f 63 6b 20 69 73 20  urrent block is 
1eab0 6e 6f 74 20 65 6d 70 74 79 2c 20 61 6e 64 20 69  not empty, and i
1eac0 66 20 61 64 64 69 6e 67 20 74 68 69 73 20 74 65  f adding this te
1ead0 72 6d 2f 64 6f 63 6c 69 73 74 0a 20 20 2a 2a 20  rm/doclist.  ** 
1eae0 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 62  to the current b
1eaf0 6c 6f 63 6b 20 77 6f 75 6c 64 20 6d 61 6b 65 20  lock would make 
1eb00 69 74 20 6c 61 72 67 65 72 20 74 68 61 6e 20 46  it larger than F
1eb10 74 73 33 54 61 62 6c 65 2e 6e 4e 6f 64 65 53 69  ts3Table.nNodeSi
1eb20 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 2c 20 77  ze.  ** bytes, w
1eb30 72 69 74 65 20 74 68 69 73 20 62 6c 6f 63 6b 20  rite this block 
1eb40 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
1eb50 61 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4c  ase. */.  if( pL
1eb60 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 3e 30 20 26  eaf->block.n>0 &
1eb70 26 20 28 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e  & (pLeaf->block.
1eb80 6e 20 2b 20 6e 53 70 61 63 65 29 3e 70 2d 3e 6e  n + nSpace)>p->n
1eb90 4e 6f 64 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  NodeSize ){.    
1eba0 72 63 20 3d 20 66 74 73 33 57 72 69 74 65 53 65  rc = fts3WriteSe
1ebb0 67 6d 65 6e 74 28 70 2c 20 70 4c 65 61 66 2d 3e  gment(p, pLeaf->
1ebc0 69 42 6c 6f 63 6b 2c 20 70 4c 65 61 66 2d 3e 62  iBlock, pLeaf->b
1ebd0 6c 6f 63 6b 2e 61 2c 20 70 4c 65 61 66 2d 3e 62  lock.a, pLeaf->b
1ebe0 6c 6f 63 6b 2e 6e 29 3b 0a 20 20 20 20 70 57 72  lock.n);.    pWr
1ebf0 69 74 65 72 2d 3e 6e 57 6f 72 6b 2b 2b 3b 0a 0a  iter->nWork++;..
1ec00 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 63      /* Add the c
1ec10 75 72 72 65 6e 74 20 74 65 72 6d 20 74 6f 20 74  urrent term to t
1ec20 68 65 20 70 61 72 65 6e 74 20 6e 6f 64 65 2e 20  he parent node. 
1ec30 54 68 65 20 74 65 72 6d 20 61 64 64 65 64 20 74  The term added t
1ec40 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61  o the .    ** pa
1ec50 72 65 6e 74 20 6d 75 73 74 3a 0a 20 20 20 20 2a  rent must:.    *
1ec60 2a 0a 20 20 20 20 2a 2a 20 20 20 61 29 20 62 65  *.    **   a) be
1ec70 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1ec80 65 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20 6f  e largest term o
1ec90 6e 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20  n the leaf node 
1eca0 6a 75 73 74 20 77 72 69 74 74 65 6e 0a 20 20 20  just written.   
1ecb0 20 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20   **      to the 
1ecc0 64 61 74 61 62 61 73 65 20 28 73 74 69 6c 6c 20  database (still 
1ecd0 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 4c 65  available in pLe
1ece0 61 66 2d 3e 6b 65 79 29 2c 20 61 6e 64 0a 20 20  af->key), and.  
1ecf0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 62 29    **.    **   b)
1ed00 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   be less than or
1ed10 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 65   equal to the te
1ed20 72 6d 20 61 62 6f 75 74 20 74 6f 20 62 65 20 61  rm about to be a
1ed30 64 64 65 64 20 74 6f 20 74 68 65 20 6e 65 77 0a  dded to the new.
1ed40 20 20 20 20 2a 2a 20 20 20 20 20 20 6c 65 61 66      **      leaf
1ed50 20 6e 6f 64 65 20 28 7a 54 65 72 6d 2f 6e 54 65   node (zTerm/nTe
1ed60 72 6d 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  rm)..    **.    
1ed70 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
1ed80 73 2c 20 69 74 20 6d 75 73 74 20 62 65 20 74 68  s, it must be th
1ed90 65 20 70 72 65 66 69 78 20 6f 66 20 7a 54 65 72  e prefix of zTer
1eda0 6d 20 31 20 62 79 74 65 20 6c 6f 6e 67 65 72 20  m 1 byte longer 
1edb0 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  than.    ** the 
1edc0 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 28 69  common prefix (i
1edd0 66 20 61 6e 79 29 20 6f 66 20 7a 54 65 72 6d 20  f any) of zTerm 
1ede0 61 6e 64 20 70 57 72 69 74 65 72 2d 3e 7a 54 65  and pWriter->zTe
1edf0 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  rm..    */.    i
1ee00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ee10 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
1ee20 74 73 33 49 6e 63 72 6d 65 72 67 65 50 75 73 68  ts3IncrmergePush
1ee30 28 70 2c 20 70 57 72 69 74 65 72 2c 20 7a 54 65  (p, pWriter, zTe
1ee40 72 6d 2c 20 6e 50 72 65 66 69 78 2b 31 29 3b 0a  rm, nPrefix+1);.
1ee50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
1ee60 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
1ee70 74 20 6f 75 74 70 75 74 20 62 6c 6f 63 6b 20 2a  t output block *
1ee80 2f 0a 20 20 20 20 70 4c 65 61 66 2d 3e 69 42 6c  /.    pLeaf->iBl
1ee90 6f 63 6b 2b 2b 3b 0a 20 20 20 20 70 4c 65 61 66  ock++;.    pLeaf
1eea0 2d 3e 6b 65 79 2e 6e 20 3d 20 30 3b 0a 20 20 20  ->key.n = 0;.   
1eeb0 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 20   pLeaf->block.n 
1eec0 3d 20 30 3b 0a 0a 20 20 20 20 6e 53 75 66 66 69  = 0;..    nSuffi
1eed0 78 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 6e  x = nTerm;.    n
1eee0 53 70 61 63 65 20 20 3d 20 31 3b 0a 20 20 20 20  Space  = 1;.    
1eef0 6e 53 70 61 63 65 20 2b 3d 20 73 71 6c 69 74 65  nSpace += sqlite
1ef00 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e  3Fts3VarintLen(n
1ef10 53 75 66 66 69 78 29 20 2b 20 6e 53 75 66 66 69  Suffix) + nSuffi
1ef20 78 3b 0a 20 20 20 20 6e 53 70 61 63 65 20 2b 3d  x;.    nSpace +=
1ef30 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69   sqlite3Fts3Vari
1ef40 6e 74 4c 65 6e 28 6e 44 6f 63 6c 69 73 74 29 20  ntLen(nDoclist) 
1ef50 2b 20 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a  + nDoclist;.  }.
1ef60 0a 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65  .  blobGrowBuffe
1ef70 72 28 26 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2c  r(&pLeaf->block,
1ef80 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 20   pLeaf->block.n 
1ef90 2b 20 6e 53 70 61 63 65 2c 20 26 72 63 29 3b 0a  + nSpace, &rc);.
1efa0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1efb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
1efc0 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 3d 3d  pLeaf->block.n==
1efd0 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 61 66  0 ){.      pLeaf
1efe0 2d 3e 62 6c 6f 63 6b 2e 6e 20 3d 20 31 3b 0a 20  ->block.n = 1;. 
1eff0 20 20 20 20 20 70 4c 65 61 66 2d 3e 62 6c 6f 63       pLeaf->bloc
1f000 6b 2e 61 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20  k.a[0] = '\0';. 
1f010 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 66 74     }.    rc = ft
1f020 73 33 41 70 70 65 6e 64 54 6f 4e 6f 64 65 28 0a  s3AppendToNode(.
1f030 20 20 20 20 20 20 20 20 26 70 4c 65 61 66 2d 3e          &pLeaf->
1f040 62 6c 6f 63 6b 2c 20 26 70 4c 65 61 66 2d 3e 6b  block, &pLeaf->k
1f050 65 79 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  ey, zTerm, nTerm
1f060 2c 20 61 44 6f 63 6c 69 73 74 2c 20 6e 44 6f 63  , aDoclist, nDoc
1f070 6c 69 73 74 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  list.    );.  }.
1f080 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f090 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1f0a0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
1f0b0 6f 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 64 79  o release all dy
1f0c0 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 20  namic resources 
1f0d0 68 65 6c 64 20 62 79 20 74 68 65 0a 2a 2a 20 6d  held by the.** m
1f0e0 65 72 67 65 2d 77 72 69 74 65 72 20 6f 62 6a 65  erge-writer obje
1f0f0 63 74 20 70 57 72 69 74 65 72 2c 20 61 6e 64 20  ct pWriter, and 
1f100 69 66 20 6e 6f 20 65 72 72 6f 72 20 68 61 73 20  if no error has 
1f110 6f 63 63 75 72 72 65 64 2c 20 74 6f 20 66 6c 75  occurred, to flu
1f120 73 68 0a 2a 2a 20 61 6c 6c 20 6f 75 74 73 74 61  sh.** all outsta
1f130 6e 64 69 6e 67 20 6e 6f 64 65 20 62 75 66 66 65  nding node buffe
1f140 72 73 20 68 65 6c 64 20 62 79 20 70 57 72 69 74  rs held by pWrit
1f150 65 72 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  er to disk..**.*
1f160 2a 20 49 66 20 2a 70 52 63 20 69 73 20 6e 6f 74  * If *pRc is not
1f170 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20   SQLITE_OK when 
1f180 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1f190 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 6e 6f   called, then no
1f1a0 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d   attempt.** is m
1f1b0 61 64 65 20 74 6f 20 77 72 69 74 65 20 61 6e 79  ade to write any
1f1c0 20 64 61 74 61 20 74 6f 20 64 69 73 6b 2e 20 49   data to disk. I
1f1d0 6e 73 74 65 61 64 2c 20 74 68 69 73 20 66 75 6e  nstead, this fun
1f1e0 63 74 69 6f 6e 20 73 65 72 76 65 73 20 6f 6e 6c  ction serves onl
1f1f0 79 0a 2a 2a 20 74 6f 20 72 65 6c 65 61 73 65 20  y.** to release 
1f200 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 73 6f  outstanding reso
1f210 75 72 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  urces..**.** Oth
1f220 65 72 77 69 73 65 2c 20 69 66 20 2a 70 52 63 20  erwise, if *pRc 
1f230 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 53 51 4c  is initially SQL
1f240 49 54 45 5f 4f 4b 20 61 6e 64 20 61 6e 20 65 72  ITE_OK and an er
1f250 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
1f260 0a 2a 2a 20 66 6c 75 73 68 69 6e 67 20 62 75 66  .** flushing buf
1f270 66 65 72 73 20 74 6f 20 64 69 73 6b 2c 20 2a 70  fers to disk, *p
1f280 52 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  Rc is set to an 
1f290 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1f2a0 65 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75  e before.** retu
1f2b0 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
1f2c0 20 76 6f 69 64 20 66 74 73 33 49 6e 63 72 6d 65   void fts3Incrme
1f2d0 72 67 65 52 65 6c 65 61 73 65 28 0a 20 20 46 74  rgeRelease(.  Ft
1f2e0 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
1f2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f300 20 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64   FTS3 table hand
1f310 6c 65 20 2a 2f 0a 20 20 49 6e 63 72 6d 65 72 67  le */.  Incrmerg
1f320 65 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  eWriter *pWriter
1f330 2c 20 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65  ,       /* Merge
1f340 2d 77 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a  -writer object *
1f350 2f 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20  /.  int *pRc    
1f360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f370 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45      /* IN/OUT: E
1f380 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 29 7b 0a  rror code */.){.
1f390 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1f3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3b0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
1f3c0 72 61 74 65 20 74 68 72 6f 75 67 68 20 6e 6f 6e  rate through non
1f3d0 2d 72 6f 6f 74 20 6c 61 79 65 72 73 20 2a 2f 0a  -root layers */.
1f3e0 20 20 69 6e 74 20 69 52 6f 6f 74 3b 20 20 20 20    int iRoot;    
1f3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f400 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 6f    /* Index of ro
1f410 6f 74 20 69 6e 20 70 57 72 69 74 65 72 2d 3e 61  ot in pWriter->a
1f420 4e 6f 64 65 57 72 69 74 65 72 20 2a 2f 0a 20 20  NodeWriter */.  
1f430 4e 6f 64 65 57 72 69 74 65 72 20 2a 70 52 6f 6f  NodeWriter *pRoo
1f440 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1f450 2f 2a 20 4e 6f 64 65 57 72 69 74 65 72 20 66 6f  /* NodeWriter fo
1f460 72 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20  r root node */. 
1f470 20 69 6e 74 20 72 63 20 3d 20 2a 70 52 63 3b 20   int rc = *pRc; 
1f480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f490 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a   /* Error code *
1f4a0 2f 0a 0a 20 20 2f 2a 20 53 65 74 20 69 52 6f 6f  /..  /* Set iRoo
1f4b0 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 69  t to the index i
1f4c0 6e 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65  n pWriter->aNode
1f4d0 57 72 69 74 65 72 5b 5d 20 6f 66 20 74 68 65 20  Writer[] of the 
1f4e0 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 0a  output segment .
1f4f0 20 20 2a 2a 20 72 6f 6f 74 20 6e 6f 64 65 2e 20    ** root node. 
1f500 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 66  If the segment f
1f510 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
1f520 61 20 73 69 6e 67 6c 65 20 6c 65 61 66 20 6e 6f  a single leaf no
1f530 64 65 2c 20 69 52 6f 6f 74 0a 20 20 2a 2a 20 77  de, iRoot.  ** w
1f540 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 30 2e  ill be set to 0.
1f550 20 49 66 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64   If the root nod
1f560 65 20 69 73 20 74 68 65 20 70 61 72 65 6e 74 20  e is the parent 
1f570 6f 66 20 74 68 65 20 6c 65 61 76 65 73 2c 20 69  of the leaves, i
1f580 52 6f 6f 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  Root.  ** will b
1f590 65 20 31 2e 20 41 6e 64 20 73 6f 20 6f 6e 2e 20  e 1. And so on. 
1f5a0 20 2a 2f 0a 20 20 66 6f 72 28 69 52 6f 6f 74 3d   */.  for(iRoot=
1f5b0 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42  FTS_MAX_APPENDAB
1f5c0 4c 45 5f 48 45 49 47 48 54 2d 31 3b 20 69 52 6f  LE_HEIGHT-1; iRo
1f5d0 6f 74 3e 3d 30 3b 20 69 52 6f 6f 74 2d 2d 29 7b  ot>=0; iRoot--){
1f5e0 0a 20 20 20 20 4e 6f 64 65 57 72 69 74 65 72 20  .    NodeWriter 
1f5f0 2a 70 4e 6f 64 65 20 3d 20 26 70 57 72 69 74 65  *pNode = &pWrite
1f600 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 69  r->aNodeWriter[i
1f610 52 6f 6f 74 5d 3b 0a 20 20 20 20 69 66 28 20 70  Root];.    if( p
1f620 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 3e 30 20  Node->block.n>0 
1f630 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73  ) break;.    ass
1f640 65 72 74 28 20 2a 70 52 63 20 7c 7c 20 70 4e 6f  ert( *pRc || pNo
1f650 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 41 6c 6c 6f 63  de->block.nAlloc
1f660 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
1f670 74 28 20 2a 70 52 63 20 7c 7c 20 70 4e 6f 64 65  t( *pRc || pNode
1f680 2d 3e 6b 65 79 2e 6e 41 6c 6c 6f 63 3d 3d 30 20  ->key.nAlloc==0 
1f690 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1f6a0 72 65 65 28 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b  ree(pNode->block
1f6b0 2e 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  .a);.    sqlite3
1f6c0 5f 66 72 65 65 28 70 4e 6f 64 65 2d 3e 6b 65 79  _free(pNode->key
1f6d0 2e 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45  .a);.  }..  /* E
1f6e0 6d 70 74 79 20 6f 75 74 70 75 74 20 73 65 67 6d  mpty output segm
1f6f0 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61 20 6e  ent. This is a n
1f700 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 69  o-op. */.  if( i
1f710 52 6f 6f 74 3c 30 20 29 20 72 65 74 75 72 6e 3b  Root<0 ) return;
1f720 0a 0a 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72  ..  /* The entir
1f730 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  e output segment
1f740 20 66 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c   fits on a singl
1f750 65 20 6e 6f 64 65 2e 20 4e 6f 72 6d 61 6c 6c 79  e node. Normally
1f760 2c 20 74 68 69 73 20 6d 65 61 6e 73 0a 20 20 2a  , this means.  *
1f770 2a 20 74 68 65 20 6e 6f 64 65 20 77 6f 75 6c 64  * the node would
1f780 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20   be stored as a 
1f790 62 6c 6f 62 20 69 6e 20 74 68 65 20 22 72 6f 6f  blob in the "roo
1f7a0 74 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  t" column of the
1f7b0 20 25 5f 73 65 67 64 69 72 0a 20 20 2a 2a 20 74   %_segdir.  ** t
1f7c0 61 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 74  able. However, t
1f7d0 68 69 73 20 69 73 20 6e 6f 74 20 70 65 72 6d 69  his is not permi
1f7e0 74 74 65 64 20 69 6e 20 74 68 69 73 20 63 61 73  tted in this cas
1f7f0 65 2e 20 54 68 65 20 70 72 6f 62 6c 65 6d 20 69  e. The problem i
1f800 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 73 70 61  s that .  ** spa
1f810 63 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ce has already b
1f820 65 65 6e 20 72 65 73 65 72 76 65 64 20 69 6e 20  een reserved in 
1f830 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74  the %_segments t
1f840 61 62 6c 65 2c 20 61 6e 64 20 73 6f 20 74 68 65  able, and so the
1f850 20 0a 20 20 2a 2a 20 73 74 61 72 74 5f 62 6c 6f   .  ** start_blo
1f860 63 6b 20 61 6e 64 20 65 6e 64 5f 62 6c 6f 63 6b  ck and end_block
1f870 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 25   fields of the %
1f880 5f 73 65 67 64 69 72 20 74 61 62 6c 65 20 6d 75  _segdir table mu
1f890 73 74 20 62 65 20 70 6f 70 75 6c 61 74 65 64 2e  st be populated.
1f8a0 20 0a 20 20 2a 2a 20 41 6e 64 2c 20 62 79 20 64   .  ** And, by d
1f8b0 65 73 69 67 6e 20 6f 72 20 62 79 20 61 63 63 69  esign or by acci
1f8c0 64 65 6e 74 2c 20 72 65 6c 65 61 73 65 64 20 76  dent, released v
1f8d0 65 72 73 69 6f 6e 73 20 6f 66 20 46 54 53 20 63  ersions of FTS c
1f8e0 61 6e 6e 6f 74 20 68 61 6e 64 6c 65 20 0a 20 20  annot handle .  
1f8f0 2a 2a 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74  ** segments that
1f900 20 66 69 74 20 65 6e 74 69 72 65 6c 79 20 6f 6e   fit entirely on
1f910 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 77   the root node w
1f920 69 74 68 20 73 74 61 72 74 5f 62 6c 6f 63 6b 21  ith start_block!
1f930 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  =0..  **.  ** In
1f940 73 74 65 61 64 2c 20 63 72 65 61 74 65 20 61 20  stead, create a 
1f950 73 79 6e 74 68 65 74 69 63 20 72 6f 6f 74 20 6e  synthetic root n
1f960 6f 64 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ode that contain
1f970 73 20 6e 6f 74 68 69 6e 67 20 62 75 74 20 61 20  s nothing but a 
1f980 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f  .  ** pointer to
1f990 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6e 74   the single cont
1f9a0 65 6e 74 20 6e 6f 64 65 2e 20 53 6f 20 74 68 61  ent node. So tha
1f9b0 74 20 74 68 65 20 73 65 67 6d 65 6e 74 20 63 6f  t the segment co
1f9c0 6e 73 69 73 74 73 20 6f 66 20 61 0a 20 20 2a 2a  nsists of a.  **
1f9d0 20 73 69 6e 67 6c 65 20 6c 65 61 66 20 61 6e 64   single leaf and
1f9e0 20 61 20 73 69 6e 67 6c 65 20 69 6e 74 65 72 69   a single interi
1f9f0 6f 72 20 28 72 6f 6f 74 29 20 6e 6f 64 65 2e 0a  or (root) node..
1fa00 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 64 6f 3a 20    **.  ** Todo: 
1fa10 42 65 74 74 65 72 20 6d 69 67 68 74 20 62 65 20  Better might be 
1fa20 74 6f 20 64 65 66 65 72 20 61 6c 6c 6f 63 61 74  to defer allocat
1fa30 69 6e 67 20 73 70 61 63 65 20 69 6e 20 74 68 65  ing space in the
1fa40 20 25 5f 73 65 67 6d 65 6e 74 73 20 0a 20 20 2a   %_segments .  *
1fa50 2a 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 77 65  * table until we
1fa60 20 61 72 65 20 73 75 72 65 20 69 74 20 69 73 20   are sure it is 
1fa70 6e 65 65 64 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  needed..  */.  i
1fa80 66 28 20 69 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20  f( iRoot==0 ){. 
1fa90 20 20 20 42 6c 6f 62 20 2a 70 42 6c 6f 63 6b 20     Blob *pBlock 
1faa0 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64  = &pWriter->aNod
1fab0 65 57 72 69 74 65 72 5b 31 5d 2e 62 6c 6f 63 6b  eWriter[1].block
1fac0 3b 0a 20 20 20 20 62 6c 6f 62 47 72 6f 77 42 75  ;.    blobGrowBu
1fad0 66 66 65 72 28 70 42 6c 6f 63 6b 2c 20 31 20 2b  ffer(pBlock, 1 +
1fae0 20 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58   FTS3_VARINT_MAX
1faf0 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20  , &rc);.    if( 
1fb00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1fb10 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b 2d 3e 61  .      pBlock->a
1fb20 5b 30 5d 20 3d 20 30 78 30 31 3b 0a 20 20 20 20  [0] = 0x01;.    
1fb30 20 20 70 42 6c 6f 63 6b 2d 3e 6e 20 3d 20 31 20    pBlock->n = 1 
1fb40 2b 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74  + sqlite3Fts3Put
1fb50 56 61 72 69 6e 74 28 0a 20 20 20 20 20 20 20 20  Varint(.        
1fb60 20 20 26 70 42 6c 6f 63 6b 2d 3e 61 5b 31 5d 2c    &pBlock->a[1],
1fb70 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57   pWriter->aNodeW
1fb80 72 69 74 65 72 5b 30 5d 2e 69 42 6c 6f 63 6b 0a  riter[0].iBlock.
1fb90 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
1fba0 20 20 20 69 52 6f 6f 74 20 3d 20 31 3b 0a 20 20     iRoot = 1;.  
1fbb0 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 26 70 57 72  }.  pRoot = &pWr
1fbc0 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65  iter->aNodeWrite
1fbd0 72 5b 69 52 6f 6f 74 5d 3b 0a 0a 20 20 2f 2a 20  r[iRoot];..  /* 
1fbe0 46 6c 75 73 68 20 61 6c 6c 20 63 75 72 72 65 6e  Flush all curren
1fbf0 74 6c 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  tly outstanding 
1fc00 6e 6f 64 65 73 20 74 6f 20 64 69 73 6b 2e 20 2a  nodes to disk. *
1fc10 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 69  /.  for(i=0; i<i
1fc20 52 6f 6f 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Root; i++){.    
1fc30 4e 6f 64 65 57 72 69 74 65 72 20 2a 70 4e 6f 64  NodeWriter *pNod
1fc40 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 4e  e = &pWriter->aN
1fc50 6f 64 65 57 72 69 74 65 72 5b 69 5d 3b 0a 20 20  odeWriter[i];.  
1fc60 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 62 6c 6f    if( pNode->blo
1fc70 63 6b 2e 6e 3e 30 20 26 26 20 72 63 3d 3d 53 51  ck.n>0 && rc==SQ
1fc80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1fc90 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65 53   rc = fts3WriteS
1fca0 65 67 6d 65 6e 74 28 70 2c 20 70 4e 6f 64 65 2d  egment(p, pNode-
1fcb0 3e 69 42 6c 6f 63 6b 2c 20 70 4e 6f 64 65 2d 3e  >iBlock, pNode->
1fcc0 62 6c 6f 63 6b 2e 61 2c 20 70 4e 6f 64 65 2d 3e  block.a, pNode->
1fcd0 62 6c 6f 63 6b 2e 6e 29 3b 0a 20 20 20 20 7d 0a  block.n);.    }.
1fce0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1fcf0 28 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 29  (pNode->block.a)
1fd00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1fd10 65 65 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e 61 29  ee(pNode->key.a)
1fd20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
1fd30 65 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 72  e the %_segdir r
1fd40 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 69 66 28 20  ecord. */.  if( 
1fd50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1fd60 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 57 72  .    rc = fts3Wr
1fd70 69 74 65 53 65 67 64 69 72 28 70 2c 20 0a 20 20  iteSegdir(p, .  
1fd80 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69        pWriter->i
1fd90 41 62 73 4c 65 76 65 6c 2b 31 2c 20 20 20 20 20  AbsLevel+1,     
1fda0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 65 76            /* lev
1fdb0 65 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57  el */.        pW
1fdc0 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 20 20 20  riter->iIdx,    
1fdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fde0 20 20 2f 2a 20 69 64 78 20 2a 2f 0a 20 20 20 20    /* idx */.    
1fdf0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 53 74      pWriter->iSt
1fe00 61 72 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  art,            
1fe10 20 20 20 20 20 20 20 20 2f 2a 20 73 74 61 72 74          /* start
1fe20 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  _block */.      
1fe30 20 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65    pWriter->aNode
1fe40 57 72 69 74 65 72 5b 30 5d 2e 69 42 6c 6f 63 6b  Writer[0].iBlock
1fe50 2c 20 20 20 20 20 2f 2a 20 6c 65 61 76 65 73 5f  ,     /* leaves_
1fe60 65 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20  end_block */.   
1fe70 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 45       pWriter->iE
1fe80 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nd,             
1fe90 20 20 20 20 20 20 20 20 20 2f 2a 20 65 6e 64 5f           /* end_
1fea0 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20  block */.       
1feb0 20 70 52 6f 6f 74 2d 3e 62 6c 6f 63 6b 2e 61 2c   pRoot->block.a,
1fec0 20 70 52 6f 6f 74 2d 3e 62 6c 6f 63 6b 2e 6e 20   pRoot->block.n 
1fed0 20 20 20 20 20 2f 2a 20 72 6f 6f 74 20 2a 2f 0a       /* root */.
1fee0 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c      );.  }.  sql
1fef0 69 74 65 33 5f 66 72 65 65 28 70 52 6f 6f 74 2d  ite3_free(pRoot-
1ff00 3e 62 6c 6f 63 6b 2e 61 29 3b 0a 20 20 73 71 6c  >block.a);.  sql
1ff10 69 74 65 33 5f 66 72 65 65 28 70 52 6f 6f 74 2d  ite3_free(pRoot-
1ff20 3e 6b 65 79 2e 61 29 3b 0a 0a 20 20 2a 70 52 63  >key.a);..  *pRc
1ff30 20 3d 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   = rc;.}../*.** 
1ff40 43 6f 6d 70 61 72 65 20 74 68 65 20 74 65 72 6d  Compare the term
1ff50 20 69 6e 20 62 75 66 66 65 72 20 7a 4c 68 73 20   in buffer zLhs 
1ff60 28 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6e  (size in bytes n
1ff70 4c 68 73 29 20 77 69 74 68 20 74 68 61 74 20 69  Lhs) with that i
1ff80 6e 0a 2a 2a 20 7a 52 68 73 20 28 73 69 7a 65 20  n.** zRhs (size 
1ff90 69 6e 20 62 79 74 65 73 20 6e 52 68 73 29 20 75  in bytes nRhs) u
1ffa0 73 69 6e 67 20 6d 65 6d 63 6d 70 2e 20 49 66 20  sing memcmp. If 
1ffb0 6f 6e 65 20 74 65 72 6d 20 69 73 20 61 20 70 72  one term is a pr
1ffc0 65 66 69 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6f  efix of.** the o
1ffd0 74 68 65 72 2c 20 69 74 20 69 73 20 63 6f 6e 73  ther, it is cons
1ffe0 69 64 65 72 65 64 20 74 6f 20 62 65 20 73 6d 61  idered to be sma
1fff0 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 6f 74  ller than the ot
20000 68 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  her..**.** Retur
20010 6e 20 2d 76 65 20 69 66 20 7a 4c 68 73 20 69 73  n -ve if zLhs is
20020 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 7a 52   smaller than zR
20030 68 73 2c 20 30 20 69 66 20 69 74 20 69 73 20 65  hs, 0 if it is e
20040 71 75 61 6c 2c 20 6f 72 20 2b 76 65 0a 2a 2a 20  qual, or +ve.** 
20050 69 66 20 69 74 20 69 73 20 67 72 65 61 74 65 72  if it is greater
20060 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20070 66 74 73 33 54 65 72 6d 43 6d 70 28 0a 20 20 63  fts3TermCmp(.  c
20080 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 68 73 2c  onst char *zLhs,
20090 20 69 6e 74 20 6e 4c 68 73 2c 20 20 20 20 20 2f   int nLhs,     /
200a0 2a 20 4c 48 53 20 6f 66 20 63 6f 6d 70 61 72 69  * LHS of compari
200b0 73 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  son */.  const c
200c0 68 61 72 20 2a 7a 52 68 73 2c 20 69 6e 74 20 6e  har *zRhs, int n
200d0 52 68 73 20 20 20 20 20 20 2f 2a 20 52 48 53 20  Rhs      /* RHS 
200e0 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f  of comparison */
200f0 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d  .){.  int nCmp =
20100 20 4d 49 4e 28 6e 4c 68 73 2c 20 6e 52 68 73 29   MIN(nLhs, nRhs)
20110 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20  ;.  int res;..  
20120 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 7a 4c 68  res = memcmp(zLh
20130 73 2c 20 7a 52 68 73 2c 20 6e 43 6d 70 29 3b 0a  s, zRhs, nCmp);.
20140 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72    if( res==0 ) r
20150 65 73 20 3d 20 6e 4c 68 73 20 2d 20 6e 52 68 73  es = nLhs - nRhs
20160 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  ;..  return res;
20170 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79  .}.../*.** Query
20180 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 65   to see if the e
20190 6e 74 72 79 20 69 6e 20 74 68 65 20 25 5f 73 65  ntry in the %_se
201a0 67 6d 65 6e 74 73 20 74 61 62 6c 65 20 77 69 74  gments table wit
201b0 68 20 62 6c 6f 63 6b 69 64 20 69 45 6e 64 20 69  h blockid iEnd i
201c0 73 20 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66 20 6e  s .** NULL. If n
201d0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61  o error occurs a
201e0 6e 64 20 74 68 65 20 65 6e 74 72 79 20 69 73 20  nd the entry is 
201f0 4e 55 4c 4c 2c 20 73 65 74 20 2a 70 62 52 65 73  NULL, set *pbRes
20200 20 31 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74   1 before.** ret
20210 75 72 6e 69 6e 67 2e 20 4f 74 68 65 72 77 69 73  urning. Otherwis
20220 65 2c 20 73 65 74 20 2a 70 62 52 65 73 20 74 6f  e, set *pbRes to
20230 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69   0. .**.** Or, i
20240 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
20250 73 20 77 68 69 6c 65 20 71 75 65 72 79 69 6e 67  s while querying
20260 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 72   the database, r
20270 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
20280 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  .** error code. 
20290 54 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65 20  The final value 
202a0 6f 66 20 2a 70 62 52 65 73 20 69 73 20 75 6e 64  of *pbRes is und
202b0 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63  efined in this c
202c0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
202d0 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  is used to test 
202e0 69 66 20 61 20 73 65 67 6d 65 6e 74 20 69 73 20  if a segment is 
202f0 61 6e 20 22 61 70 70 65 6e 64 61 62 6c 65 22 20  an "appendable" 
20300 73 65 67 6d 65 6e 74 2e 20 49 66 20 69 74 0a 2a  segment. If it.*
20310 2a 20 69 73 2c 20 74 68 65 6e 20 61 20 4e 55 4c  * is, then a NUL
20320 4c 20 65 6e 74 72 79 20 68 61 73 20 62 65 65 6e  L entry has been
20330 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74   inserted into t
20340 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61  he %_segments ta
20350 62 6c 65 0a 2a 2a 20 77 69 74 68 20 62 6c 6f 63  ble.** with bloc
20360 6b 69 64 20 25 5f 73 65 67 64 69 72 2e 65 6e 64  kid %_segdir.end
20370 5f 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  _block..*/.stati
20380 63 20 69 6e 74 20 66 74 73 33 49 73 41 70 70 65  c int fts3IsAppe
20390 6e 64 61 62 6c 65 28 46 74 73 33 54 61 62 6c 65  ndable(Fts3Table
203a0 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74   *p, sqlite3_int
203b0 36 34 20 69 45 6e 64 2c 20 69 6e 74 20 2a 70 62  64 iEnd, int *pb
203c0 52 65 73 29 7b 0a 20 20 69 6e 74 20 62 52 65 73  Res){.  int bRes
203d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
203e0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
203f0 74 20 74 6f 20 73 65 74 20 2a 70 62 52 65 73 20  t to set *pbRes 
20400 74 6f 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  to */.  sqlite3_
20410 73 74 6d 74 20 2a 70 43 68 65 63 6b 20 3d 20 30  stmt *pCheck = 0
20420 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65  ;       /* State
20430 6d 65 6e 74 20 74 6f 20 71 75 65 72 79 20 64 61  ment to query da
20440 74 61 62 61 73 65 20 77 69 74 68 20 2a 2f 0a 20  tabase with */. 
20450 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
20460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20470 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
20480 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53  */..  rc = fts3S
20490 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45  qlStmt(p, SQL_SE
204a0 47 4d 45 4e 54 5f 49 53 5f 41 50 50 45 4e 44 41  GMENT_IS_APPENDA
204b0 42 4c 45 2c 20 26 70 43 68 65 63 6b 2c 20 30 29  BLE, &pCheck, 0)
204c0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
204d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
204e0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
204f0 70 43 68 65 63 6b 2c 20 31 2c 20 69 45 6e 64 29  pCheck, 1, iEnd)
20500 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
20510 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
20520 65 70 28 70 43 68 65 63 6b 29 20 29 20 62 52 65  ep(pCheck) ) bRe
20530 73 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20  s = 1;.    rc = 
20540 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 43  sqlite3_reset(pC
20550 68 65 63 6b 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  heck);.  }.  .  
20560 2a 70 62 52 65 73 20 3d 20 62 52 65 73 3b 0a 20  *pbRes = bRes;. 
20570 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20580 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
20590 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
205a0 6e 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61  n initializing a
205b0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65  n incremental-me
205c0 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  rge operation..*
205d0 2a 20 49 74 20 63 68 65 63 6b 73 20 69 66 20 74  * It checks if t
205e0 68 65 20 65 78 69 73 74 69 6e 67 20 73 65 67 6d  he existing segm
205f0 65 6e 74 20 77 69 74 68 20 69 6e 64 65 78 20 76  ent with index v
20600 61 6c 75 65 20 69 49 64 78 20 61 74 20 61 62 73  alue iIdx at abs
20610 6f 6c 75 74 65 20 6c 65 76 65 6c 20 0a 2a 2a 20  olute level .** 
20620 28 69 41 62 73 4c 65 76 65 6c 2b 31 29 20 63 61  (iAbsLevel+1) ca
20630 6e 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f  n be appended to
20640 20 62 79 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   by the incremen
20650 74 61 6c 20 6d 65 72 67 65 2e 20 49 66 20 69 74  tal merge. If it
20660 20 63 61 6e 2c 20 74 68 65 0a 2a 2a 20 6d 65 72   can, the.** mer
20670 67 65 2d 77 72 69 74 65 72 20 6f 62 6a 65 63 74  ge-writer object
20680 20 2a 70 57 72 69 74 65 72 20 69 73 20 69 6e 69   *pWriter is ini
20690 74 69 61 6c 69 7a 65 64 20 74 6f 20 77 72 69 74  tialized to writ
206a0 65 20 74 6f 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 41  e to it..**.** A
206b0 6e 20 65 78 69 73 74 69 6e 67 20 73 65 67 6d 65  n existing segme
206c0 6e 74 20 63 61 6e 20 62 65 20 61 70 70 65 6e 64  nt can be append
206d0 65 64 20 74 6f 20 62 79 20 61 6e 20 69 6e 63 72  ed to by an incr
206e0 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 69 66  emental merge if
206f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 74 20 77  :.**.**   * It w
20700 61 73 20 69 6e 69 74 69 61 6c 6c 79 20 63 72 65  as initially cre
20710 61 74 65 64 20 61 73 20 61 6e 20 61 70 70 65 6e  ated as an appen
20720 64 61 62 6c 65 20 73 65 67 6d 65 6e 74 20 28 77  dable segment (w
20730 69 74 68 20 61 6c 6c 20 72 65 71 75 69 72 65 64  ith all required
20740 0a 2a 2a 20 20 20 20 20 73 70 61 63 65 20 70 72  .**     space pr
20750 65 2d 61 6c 6c 6f 63 61 74 65 64 29 2c 20 61 6e  e-allocated), an
20760 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  d.**.**   * The 
20770 66 69 72 73 74 20 6b 65 79 20 72 65 61 64 20 66  first key read f
20780 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 28 61  rom the input (a
20790 72 67 75 6d 65 6e 74 73 20 7a 4b 65 79 20 61 6e  rguments zKey an
207a0 64 20 6e 4b 65 79 29 20 69 73 20 0a 2a 2a 20 20  d nKey) is .**  
207b0 20 20 20 67 72 65 61 74 65 72 20 74 68 61 6e 20     greater than 
207c0 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20  the largest key 
207d0 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
207e0 20 69 6e 20 74 68 65 20 70 6f 74 65 6e 74 69 61   in the potentia
207f0 6c 0a 2a 2a 20 20 20 20 20 6f 75 74 70 75 74 20  l.**     output 
20800 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  segment..*/.stat
20810 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72 6d  ic int fts3Incrm
20820 65 72 67 65 4c 6f 61 64 28 0a 20 20 46 74 73 33  ergeLoad(.  Fts3
20830 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
20840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
20850 74 73 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  ts3 table handle
20860 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
20870 74 36 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 20  t64 iAbsLevel,  
20880 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74        /* Absolut
20890 65 20 6c 65 76 65 6c 20 6f 66 20 69 6e 70 75 74  e level of input
208a0 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69   segments */.  i
208b0 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20  nt iIdx,        
208c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
208d0 2a 20 49 6e 64 65 78 20 6f 66 20 63 61 6e 64 69  * Index of candi
208e0 64 61 74 65 20 6f 75 74 70 75 74 20 73 65 67 6d  date output segm
208f0 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ent */.  const c
20900 68 61 72 20 2a 7a 4b 65 79 2c 20 20 20 20 20 20  har *zKey,      
20910 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
20920 74 20 6b 65 79 20 74 6f 20 77 72 69 74 65 20 2a  t key to write *
20930 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20  /.  int nKey,   
20940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20950 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20960 20 62 79 74 65 73 20 69 6e 20 6e 4b 65 79 20 2a   bytes in nKey *
20970 2f 0a 20 20 49 6e 63 72 6d 65 72 67 65 57 72 69  /.  IncrmergeWri
20980 74 65 72 20 2a 70 57 72 69 74 65 72 20 20 20 20  ter *pWriter    
20990 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
209a0 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  this object */.)
209b0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
209c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209d0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
209e0 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
209f0 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 20 3d 20  stmt *pSelect = 
20a00 30 3b 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43  0;      /* SELEC
20a10 54 20 74 6f 20 72 65 61 64 20 25 5f 73 65 67 64  T to read %_segd
20a20 69 72 20 65 6e 74 72 79 20 2a 2f 0a 0a 20 20 72  ir entry */..  r
20a30 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
20a40 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 45  p, SQL_SELECT_SE
20a50 47 44 49 52 2c 20 26 70 53 65 6c 65 63 74 2c 20  GDIR, &pSelect, 
20a60 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
20a70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
20a80 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 53 74  qlite3_int64 iSt
20a90 61 72 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  art = 0;     /* 
20aa0 56 61 6c 75 65 20 6f 66 20 25 5f 73 65 67 64 69  Value of %_segdi
20ab0 72 2e 73 74 61 72 74 5f 62 6c 6f 63 6b 20 2a 2f  r.start_block */
20ac0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
20ad0 36 34 20 69 4c 65 61 66 45 6e 64 20 3d 20 30 3b  64 iLeafEnd = 0;
20ae0 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 25     /* Value of %
20af0 5f 73 65 67 64 69 72 2e 6c 65 61 76 65 73 5f 65  _segdir.leaves_e
20b00 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  nd_block */.    
20b10 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45  sqlite3_int64 iE
20b20 6e 64 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  nd = 0;       /*
20b30 20 56 61 6c 75 65 20 6f 66 20 25 5f 73 65 67 64   Value of %_segd
20b40 69 72 2e 65 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a  ir.end_block */.
20b50 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
20b60 61 52 6f 6f 74 20 3d 20 30 3b 20 20 20 20 20 20  aRoot = 0;      
20b70 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
20b80 25 5f 73 65 67 64 69 72 2e 72 6f 6f 74 20 62 75  %_segdir.root bu
20b90 66 66 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ffer */.    int 
20ba0 6e 52 6f 6f 74 20 3d 20 30 3b 20 20 20 20 20 20  nRoot = 0;      
20bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
20bc0 65 20 6f 66 20 61 52 6f 6f 74 5b 5d 20 69 6e 20  e of aRoot[] in 
20bd0 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74  bytes */.    int
20be0 20 72 63 32 3b 20 20 20 20 20 20 20 20 20 20 20   rc2;           
20bf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
20c00 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
20c10 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29 20 2a  qlite3_reset() *
20c20 2f 0a 20 20 20 20 69 6e 74 20 62 41 70 70 65 6e  /.    int bAppen
20c30 64 61 62 6c 65 20 3d 20 30 3b 20 20 20 20 20 20  dable = 0;      
20c40 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72      /* Set to tr
20c50 75 65 20 69 66 20 73 65 67 6d 65 6e 74 20 69 73  ue if segment is
20c60 20 61 70 70 65 6e 64 61 62 6c 65 20 2a 2f 0a 0a   appendable */..
20c70 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
20c80 25 5f 73 65 67 64 69 72 20 65 6e 74 72 79 20 66  %_segdir entry f
20c90 6f 72 20 69 6e 64 65 78 20 69 49 64 78 20 61 62  or index iIdx ab
20ca0 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 28 69 41  solute level (iA
20cb0 62 73 4c 65 76 65 6c 2b 31 29 20 2a 2f 0a 20 20  bsLevel+1) */.  
20cc0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
20cd0 6e 74 36 34 28 70 53 65 6c 65 63 74 2c 20 31 2c  nt64(pSelect, 1,
20ce0 20 69 41 62 73 4c 65 76 65 6c 2b 31 29 3b 0a 20   iAbsLevel+1);. 
20cf0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
20d00 69 6e 74 28 70 53 65 6c 65 63 74 2c 20 32 2c 20  int(pSelect, 2, 
20d10 69 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 73  iIdx);.    if( s
20d20 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c  qlite3_step(pSel
20d30 65 63 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  ect)==SQLITE_ROW
20d40 20 29 7b 0a 20 20 20 20 20 20 69 53 74 61 72 74   ){.      iStart
20d50 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
20d60 6e 5f 69 6e 74 36 34 28 70 53 65 6c 65 63 74 2c  n_int64(pSelect,
20d70 20 31 29 3b 0a 20 20 20 20 20 20 69 4c 65 61 66   1);.      iLeaf
20d80 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  End = sqlite3_co
20d90 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 65 6c 65  lumn_int64(pSele
20da0 63 74 2c 20 32 29 3b 0a 20 20 20 20 20 20 69 45  ct, 2);.      iE
20db0 6e 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  nd = sqlite3_col
20dc0 75 6d 6e 5f 69 6e 74 36 34 28 70 53 65 6c 65 63  umn_int64(pSelec
20dd0 74 2c 20 33 29 3b 0a 20 20 20 20 20 20 6e 52 6f  t, 3);.      nRo
20de0 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ot = sqlite3_col
20df0 75 6d 6e 5f 62 79 74 65 73 28 70 53 65 6c 65 63  umn_bytes(pSelec
20e00 74 2c 20 34 29 3b 0a 20 20 20 20 20 20 61 52 6f  t, 4);.      aRo
20e10 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ot = sqlite3_col
20e20 75 6d 6e 5f 62 6c 6f 62 28 70 53 65 6c 65 63 74  umn_blob(pSelect
20e30 2c 20 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 4);.    }else{
20e40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
20e50 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 65 6c  lite3_reset(pSel
20e60 65 63 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ect);.    }..   
20e70 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68   /* Check for th
20e80 65 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 6d 61  e zero-length ma
20e90 72 6b 65 72 20 69 6e 20 74 68 65 20 25 5f 73 65  rker in the %_se
20ea0 67 6d 65 6e 74 73 20 74 61 62 6c 65 20 2a 2f 0a  gments table */.
20eb0 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 73 41      rc = fts3IsA
20ec0 70 70 65 6e 64 61 62 6c 65 28 70 2c 20 69 45 6e  ppendable(p, iEn
20ed0 64 2c 20 26 62 41 70 70 65 6e 64 61 62 6c 65 29  d, &bAppendable)
20ee0 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
20ef0 74 68 61 74 20 7a 4b 65 79 2f 6e 4b 65 79 20 69  that zKey/nKey i
20f00 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
20f10 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 74 68  e largest key th
20f20 65 20 63 61 6e 64 69 64 61 74 65 20 2a 2f 0a 20  e candidate */. 
20f30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20f40 45 5f 4f 4b 20 26 26 20 62 41 70 70 65 6e 64 61  E_OK && bAppenda
20f50 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ble ){.      cha
20f60 72 20 2a 61 4c 65 61 66 20 3d 20 30 3b 0a 20 20  r *aLeaf = 0;.  
20f70 20 20 20 20 69 6e 74 20 6e 4c 65 61 66 20 3d 20      int nLeaf = 
20f80 30 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73  0;..      rc = s
20f90 71 6c 69 74 65 33 46 74 73 33 52 65 61 64 42 6c  qlite3Fts3ReadBl
20fa0 6f 63 6b 28 70 2c 20 69 4c 65 61 66 45 6e 64 2c  ock(p, iLeafEnd,
20fb0 20 26 61 4c 65 61 66 2c 20 26 6e 4c 65 61 66 2c   &aLeaf, &nLeaf,
20fc0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
20fd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20fe0 20 20 20 20 20 20 20 20 4e 6f 64 65 52 65 61 64          NodeRead
20ff0 65 72 20 72 65 61 64 65 72 3b 0a 20 20 20 20 20  er reader;.     
21000 20 20 20 66 6f 72 28 72 63 20 3d 20 6e 6f 64 65     for(rc = node
21010 52 65 61 64 65 72 49 6e 69 74 28 26 72 65 61 64  ReaderInit(&read
21020 65 72 2c 20 61 4c 65 61 66 2c 20 6e 4c 65 61 66  er, aLeaf, nLeaf
21030 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
21040 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21050 72 65 61 64 65 72 2e 61 4e 6f 64 65 3b 0a 20 20  reader.aNode;.  
21060 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e            rc = n
21070 6f 64 65 52 65 61 64 65 72 4e 65 78 74 28 26 72  odeReaderNext(&r
21080 65 61 64 65 72 29 0a 20 20 20 20 20 20 20 20 29  eader).        )
21090 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
210a0 72 74 28 20 72 65 61 64 65 72 2e 61 4e 6f 64 65  rt( reader.aNode
210b0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
210c0 20 20 20 20 20 20 69 66 28 20 66 74 73 33 54 65        if( fts3Te
210d0 72 6d 43 6d 70 28 7a 4b 65 79 2c 20 6e 4b 65 79  rmCmp(zKey, nKey
210e0 2c 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 61 2c  , reader.term.a,
210f0 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 6e 29 3c   reader.term.n)<
21100 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
21110 62 41 70 70 65 6e 64 61 62 6c 65 20 3d 20 30 3b  bAppendable = 0;
21120 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21130 20 20 20 6e 6f 64 65 52 65 61 64 65 72 52 65 6c     nodeReaderRel
21140 65 61 73 65 28 26 72 65 61 64 65 72 29 3b 0a 20  ease(&reader);. 
21150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
21160 69 74 65 33 5f 66 72 65 65 28 61 4c 65 61 66 29  ite3_free(aLeaf)
21170 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
21180 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
21190 26 20 62 41 70 70 65 6e 64 61 62 6c 65 20 29 7b  & bAppendable ){
211a0 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20  .      /* It is 
211b0 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 70 70 65  possible to appe
211c0 6e 64 20 74 6f 20 74 68 69 73 20 73 65 67 6d 65  nd to this segme
211d0 6e 74 2e 20 53 65 74 20 75 70 20 74 68 65 20 49  nt. Set up the I
211e0 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72 0a 20  ncrmergeWriter. 
211f0 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74       ** object t
21200 6f 20 64 6f 20 73 6f 2e 20 20 2a 2f 0a 20 20 20  o do so.  */.   
21210 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
21220 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 28 69  int nHeight = (i
21230 6e 74 29 61 52 6f 6f 74 5b 30 5d 3b 0a 20 20 20  nt)aRoot[0];.   
21240 20 20 20 4e 6f 64 65 57 72 69 74 65 72 20 2a 70     NodeWriter *p
21250 4e 6f 64 65 3b 0a 0a 20 20 20 20 20 20 70 57 72  Node;..      pWr
21260 69 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74 20 3d  iter->nLeafEst =
21270 20 28 69 6e 74 29 28 28 69 45 6e 64 20 2d 20 69   (int)((iEnd - i
21280 53 74 61 72 74 29 20 2b 20 31 29 2f 46 54 53 5f  Start) + 1)/FTS_
21290 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c 45 5f 48  MAX_APPENDABLE_H
212a0 45 49 47 48 54 3b 0a 20 20 20 20 20 20 70 57 72  EIGHT;.      pWr
212b0 69 74 65 72 2d 3e 69 53 74 61 72 74 20 3d 20 69  iter->iStart = i
212c0 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70 57 72  Start;.      pWr
212d0 69 74 65 72 2d 3e 69 45 6e 64 20 3d 20 69 45 6e  iter->iEnd = iEn
212e0 64 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72  d;.      pWriter
212f0 2d 3e 69 41 62 73 4c 65 76 65 6c 20 3d 20 69 41  ->iAbsLevel = iA
21300 62 73 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20 70  bsLevel;.      p
21310 57 72 69 74 65 72 2d 3e 69 49 64 78 20 3d 20 69  Writer->iIdx = i
21320 49 64 78 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  Idx;..      for(
21330 69 3d 6e 48 65 69 67 68 74 2b 31 3b 20 69 3c 46  i=nHeight+1; i<F
21340 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c  TS_MAX_APPENDABL
21350 45 5f 48 45 49 47 48 54 3b 20 69 2b 2b 29 7b 0a  E_HEIGHT; i++){.
21360 20 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d          pWriter-
21370 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 69 5d 2e  >aNodeWriter[i].
21380 69 42 6c 6f 63 6b 20 3d 20 70 57 72 69 74 65 72  iBlock = pWriter
21390 2d 3e 69 53 74 61 72 74 20 2b 20 69 2a 70 57 72  ->iStart + i*pWr
213a0 69 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74 3b 0a  iter->nLeafEst;.
213b0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
213c0 4e 6f 64 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Node = &pWriter-
213d0 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 6e 48 65  >aNodeWriter[nHe
213e0 69 67 68 74 5d 3b 0a 20 20 20 20 20 20 70 4e 6f  ight];.      pNo
213f0 64 65 2d 3e 69 42 6c 6f 63 6b 20 3d 20 70 57 72  de->iBlock = pWr
21400 69 74 65 72 2d 3e 69 53 74 61 72 74 20 2b 20 70  iter->iStart + p
21410 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74  Writer->nLeafEst
21420 2a 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 20 20  *nHeight;.      
21430 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28 26  blobGrowBuffer(&
21440 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2c 20 4d 41  pNode->block, MA
21450 58 28 6e 52 6f 6f 74 2c 20 70 2d 3e 6e 4e 6f 64  X(nRoot, p->nNod
21460 65 53 69 7a 65 29 2c 20 26 72 63 29 3b 0a 20 20  eSize), &rc);.  
21470 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21480 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
21490 20 6d 65 6d 63 70 79 28 70 4e 6f 64 65 2d 3e 62   memcpy(pNode->b
214a0 6c 6f 63 6b 2e 61 2c 20 61 52 6f 6f 74 2c 20 6e  lock.a, aRoot, n
214b0 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Root);.        p
214c0 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 20 3d 20  Node->block.n = 
214d0 6e 52 6f 6f 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  nRoot;.      }..
214e0 20 20 20 20 20 20 66 6f 72 28 69 3d 6e 48 65 69        for(i=nHei
214f0 67 68 74 3b 20 69 3e 3d 30 20 26 26 20 72 63 3d  ght; i>=0 && rc=
21500 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2d 2d 29  =SQLITE_OK; i--)
21510 7b 0a 20 20 20 20 20 20 20 20 4e 6f 64 65 52 65  {.        NodeRe
21520 61 64 65 72 20 72 65 61 64 65 72 3b 0a 20 20 20  ader reader;.   
21530 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 26 70 57       pNode = &pW
21540 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74  riter->aNodeWrit
21550 65 72 5b 69 5d 3b 0a 0a 20 20 20 20 20 20 20 20  er[i];..        
21560 72 63 20 3d 20 6e 6f 64 65 52 65 61 64 65 72 49  rc = nodeReaderI
21570 6e 69 74 28 26 72 65 61 64 65 72 2c 20 70 4e 6f  nit(&reader, pNo
21580 64 65 2d 3e 62 6c 6f 63 6b 2e 61 2c 20 70 4e 6f  de->block.a, pNo
21590 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 29 3b 0a 20 20  de->block.n);.  
215a0 20 20 20 20 20 20 77 68 69 6c 65 28 20 72 65 61        while( rea
215b0 64 65 72 2e 61 4e 6f 64 65 20 26 26 20 72 63 3d  der.aNode && rc=
215c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
215d0 3d 20 6e 6f 64 65 52 65 61 64 65 72 4e 65 78 74  = nodeReaderNext
215e0 28 26 72 65 61 64 65 72 29 3b 0a 20 20 20 20 20  (&reader);.     
215f0 20 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65     blobGrowBuffe
21600 72 28 26 70 4e 6f 64 65 2d 3e 6b 65 79 2c 20 72  r(&pNode->key, r
21610 65 61 64 65 72 2e 74 65 72 6d 2e 6e 2c 20 26 72  eader.term.n, &r
21620 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
21630 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21640 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
21650 79 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e 61 2c 20  y(pNode->key.a, 
21660 72 65 61 64 65 72 2e 74 65 72 6d 2e 61 2c 20 72  reader.term.a, r
21670 65 61 64 65 72 2e 74 65 72 6d 2e 6e 29 3b 0a 20  eader.term.n);. 
21680 20 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e           pNode->
21690 6b 65 79 2e 6e 20 3d 20 72 65 61 64 65 72 2e 74  key.n = reader.t
216a0 65 72 6d 2e 6e 3b 0a 20 20 20 20 20 20 20 20 20  erm.n;.         
216b0 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20   if( i>0 ){.    
216c0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 61 42          char *aB
216d0 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  lock = 0;.      
216e0 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 63 6b        int nBlock
216f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
21700 20 20 70 4e 6f 64 65 20 3d 20 26 70 57 72 69 74    pNode = &pWrit
21710 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b  er->aNodeWriter[
21720 69 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  i-1];.          
21730 20 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b 20    pNode->iBlock 
21740 3d 20 72 65 61 64 65 72 2e 69 43 68 69 6c 64 3b  = reader.iChild;
21750 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
21760 3d 20 73 71 6c 69 74 65 33 46 74 73 33 52 65 61  = sqlite3Fts3Rea
21770 64 42 6c 6f 63 6b 28 70 2c 20 72 65 61 64 65 72  dBlock(p, reader
21780 2e 69 43 68 69 6c 64 2c 20 26 61 42 6c 6f 63 6b  .iChild, &aBlock
21790 2c 20 26 6e 42 6c 6f 63 6b 2c 20 30 29 3b 0a 20  , &nBlock, 0);. 
217a0 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 47             blobG
217b0 72 6f 77 42 75 66 66 65 72 28 26 70 4e 6f 64 65  rowBuffer(&pNode
217c0 2d 3e 62 6c 6f 63 6b 2c 20 4d 41 58 28 6e 42 6c  ->block, MAX(nBl
217d0 6f 63 6b 2c 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a  ock, p->nNodeSiz
217e0 65 29 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  e), &rc);.      
217f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
21800 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21810 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
21820 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 2c 20  pNode->block.a, 
21830 61 42 6c 6f 63 6b 2c 20 6e 42 6c 6f 63 6b 29 3b  aBlock, nBlock);
21840 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
21850 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 20 3d 20  Node->block.n = 
21860 6e 42 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  nBlock;.        
21870 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21880 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
21890 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20 20  Block);.        
218a0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
218b0 20 20 20 20 20 20 6e 6f 64 65 52 65 61 64 65 72        nodeReader
218c0 52 65 6c 65 61 73 65 28 26 72 65 61 64 65 72 29  Release(&reader)
218d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
218e0 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
218f0 65 33 5f 72 65 73 65 74 28 70 53 65 6c 65 63 74  e3_reset(pSelect
21900 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
21910 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
21920 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  rc2;.  }..  retu
21930 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21940 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6c 61  Determine the la
21950 72 67 65 73 74 20 73 65 67 6d 65 6e 74 20 69 6e  rgest segment in
21960 64 65 78 20 76 61 6c 75 65 20 74 68 61 74 20 65  dex value that e
21970 78 69 73 74 73 20 77 69 74 68 69 6e 20 61 62 73  xists within abs
21980 6f 6c 75 74 65 0a 2a 2a 20 6c 65 76 65 6c 20 69  olute.** level i
21990 41 62 73 4c 65 76 65 6c 2b 31 2e 20 49 66 20 6e  AbsLevel+1. If n
219a0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
219b0 73 65 74 20 2a 70 69 49 64 78 20 74 6f 20 74 68  set *piIdx to th
219c0 69 73 20 76 61 6c 75 65 20 70 6c 75 73 0a 2a 2a  is value plus.**
219d0 20 6f 6e 65 20 62 65 66 6f 72 65 20 72 65 74 75   one before retu
219e0 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e  rning SQLITE_OK.
219f0 20 4f 72 2c 20 69 66 20 74 68 65 72 65 20 61 72   Or, if there ar
21a00 65 20 6e 6f 20 73 65 67 6d 65 6e 74 73 20 61 74  e no segments at
21a10 20 61 6c 6c 20 0a 2a 2a 20 77 69 74 68 69 6e 20   all .** within 
21a20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c 2c  level iAbsLevel,
21a30 20 73 65 74 20 2a 70 69 49 64 78 20 74 6f 20 7a   set *piIdx to z
21a40 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ero..**.** If an
21a50 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
21a60 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
21a70 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20  error code. The 
21a80 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 0a 2a  final value of.*
21a90 2a 20 2a 70 69 49 64 78 20 69 73 20 75 6e 64 65  * *piIdx is unde
21aa0 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  fined in this ca
21ab0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
21ac0 74 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 4f  t fts3IncrmergeO
21ad0 75 74 70 75 74 49 64 78 28 20 0a 20 20 46 74 73  utputIdx( .  Fts
21ae0 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
21af0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21b00 46 54 53 20 54 61 62 6c 65 20 68 61 6e 64 6c 65  FTS Table handle
21b10 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
21b20 74 36 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 20  t64 iAbsLevel,  
21b30 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74        /* Absolut
21b40 65 20 69 6e 64 65 78 20 6f 66 20 69 6e 70 75 74  e index of input
21b50 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69   segments */.  i
21b60 6e 74 20 2a 70 69 49 64 78 20 20 20 20 20 20 20  nt *piIdx       
21b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21b80 2a 20 4f 55 54 3a 20 4e 65 78 74 20 66 72 65 65  * OUT: Next free
21b90 20 69 6e 64 65 78 20 61 74 20 69 41 62 73 4c 65   index at iAbsLe
21ba0 76 65 6c 2b 31 20 2a 2f 0a 29 7b 0a 20 20 69 6e  vel+1 */.){.  in
21bb0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
21bc0 73 74 6d 74 20 2a 70 4f 75 74 70 75 74 49 64 78  stmt *pOutputIdx
21bd0 20 3d 20 30 3b 20 20 20 2f 2a 20 53 51 4c 20 75   = 0;   /* SQL u
21be0 73 65 64 20 74 6f 20 66 69 6e 64 20 6f 75 74 70  sed to find outp
21bf0 75 74 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 72  ut index */..  r
21c00 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
21c10 70 2c 20 53 51 4c 5f 4e 45 58 54 5f 53 45 47 4d  p, SQL_NEXT_SEGM
21c20 45 4e 54 5f 49 4e 44 45 58 2c 20 26 70 4f 75 74  ENT_INDEX, &pOut
21c30 70 75 74 49 64 78 2c 20 30 29 3b 0a 20 20 69 66  putIdx, 0);.  if
21c40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21c50 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
21c60 69 6e 64 5f 69 6e 74 36 34 28 70 4f 75 74 70 75  ind_int64(pOutpu
21c70 74 49 64 78 2c 20 31 2c 20 69 41 62 73 4c 65 76  tIdx, 1, iAbsLev
21c80 65 6c 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  el+1);.    sqlit
21c90 65 33 5f 73 74 65 70 28 70 4f 75 74 70 75 74 49  e3_step(pOutputI
21ca0 64 78 29 3b 0a 20 20 20 20 2a 70 69 49 64 78 20  dx);.    *piIdx 
21cb0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
21cc0 5f 69 6e 74 28 70 4f 75 74 70 75 74 49 64 78 2c  _int(pOutputIdx,
21cd0 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   0);.    rc = sq
21ce0 6c 69 74 65 33 5f 72 65 73 65 74 28 70 4f 75 74  lite3_reset(pOut
21cf0 70 75 74 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20  putIdx);.  }..  
21d00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21d10 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e   .** Allocate an
21d20 20 61 70 70 65 6e 64 61 62 6c 65 20 6f 75 74 70   appendable outp
21d30 75 74 20 73 65 67 6d 65 6e 74 20 6f 6e 20 61 62  ut segment on ab
21d40 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 69 41 62  solute level iAb
21d50 73 4c 65 76 65 6c 2b 31 0a 2a 2a 20 77 69 74 68  sLevel+1.** with
21d60 20 69 64 78 20 76 61 6c 75 65 20 69 49 64 78 2e   idx value iIdx.
21d70 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 25 5f  .**.** In the %_
21d80 73 65 67 64 69 72 20 74 61 62 6c 65 2c 20 61 20  segdir table, a 
21d90 73 65 67 6d 65 6e 74 20 69 73 20 64 65 66 69 6e  segment is defin
21da0 65 64 20 62 79 20 74 68 65 20 76 61 6c 75 65 73  ed by the values
21db0 20 69 6e 20 74 68 72 65 65 0a 2a 2a 20 63 6f 6c   in three.** col
21dc0 75 6d 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  umns:.**.**     
21dd0 73 74 61 72 74 5f 62 6c 6f 63 6b 0a 2a 2a 20 20  start_block.**  
21de0 20 20 20 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c     leaves_end_bl
21df0 6f 63 6b 0a 2a 2a 20 20 20 20 20 65 6e 64 5f 62  ock.**     end_b
21e00 6c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  lock.**.** When 
21e10 61 6e 20 61 70 70 65 6e 64 61 62 6c 65 20 73 65  an appendable se
21e20 67 6d 65 6e 74 20 69 73 20 61 6c 6c 6f 63 61 74  gment is allocat
21e30 65 64 2c 20 69 74 20 69 73 20 65 73 74 69 6d 61  ed, it is estima
21e40 74 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ted that the.** 
21e50 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
21e60 66 20 6c 65 61 66 20 62 6c 6f 63 6b 73 20 74 68  f leaf blocks th
21e70 61 74 20 6d 61 79 20 62 65 20 72 65 71 75 69 72  at may be requir
21e80 65 64 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  ed is the sum of
21e90 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
21ea0 66 20 6c 65 61 66 20 62 6c 6f 63 6b 73 20 63 6f  f leaf blocks co
21eb0 6e 73 75 6d 65 64 20 62 79 20 74 68 65 20 69 6e  nsumed by the in
21ec0 70 75 74 20 73 65 67 6d 65 6e 74 73 2c 20 70 6c  put segments, pl
21ed0 75 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  us the number.**
21ee0 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e   of input segmen
21ef0 74 73 2c 20 6d 75 6c 74 69 70 6c 69 65 64 20 62  ts, multiplied b
21f00 79 20 74 77 6f 2e 20 54 68 69 73 20 76 61 6c 75  y two. This valu
21f10 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 73  e is stored in s
21f20 74 61 63 6b 20 0a 2a 2a 20 76 61 72 69 61 62 6c  tack .** variabl
21f30 65 20 6e 4c 65 61 66 45 73 74 2e 0a 2a 2a 0a 2a  e nLeafEst..**.*
21f40 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 31 36 2a  * A total of 16*
21f50 6e 4c 65 61 66 45 73 74 20 62 6c 6f 63 6b 73 20  nLeafEst blocks 
21f60 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 77 68  are allocated wh
21f70 65 6e 20 61 6e 20 61 70 70 65 6e 64 61 62 6c 65  en an appendable
21f80 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 69 73 20 63   segment.** is c
21f90 72 65 61 74 65 64 20 28 28 31 20 2b 20 65 6e 64  reated ((1 + end
21fa0 5f 62 6c 6f 63 6b 20 2d 20 73 74 61 72 74 5f 62  _block - start_b
21fb0 6c 6f 63 6b 29 3d 3d 31 36 2a 6e 4c 65 61 66 45  lock)==16*nLeafE
21fc0 73 74 29 2e 20 54 68 65 20 63 6f 6e 74 69 67 75  st). The contigu
21fd0 6f 75 73 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20  ous.** array of 
21fe0 6c 65 61 66 20 6e 6f 64 65 73 20 73 74 61 72 74  leaf nodes start
21ff0 73 20 61 74 20 74 68 65 20 66 69 72 73 74 20 62  s at the first b
22000 6c 6f 63 6b 20 61 6c 6c 6f 63 61 74 65 64 2e 20  lock allocated. 
22010 54 68 65 20 61 72 72 61 79 0a 2a 2a 20 6f 66 20  The array.** of 
22020 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 73 20 74  interior nodes t
22030 68 61 74 20 61 72 65 20 70 61 72 65 6e 74 73 20  hat are parents 
22040 6f 66 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65  of the leaf node
22050 73 20 73 74 61 72 74 20 61 74 20 62 6c 6f 63 6b  s start at block
22060 0a 2a 2a 20 28 73 74 61 72 74 5f 62 6c 6f 63 6b  .** (start_block
22070 20 2b 20 28 31 20 2b 20 65 6e 64 5f 62 6c 6f 63   + (1 + end_bloc
22080 6b 20 2d 20 73 74 61 72 74 5f 62 6c 6f 63 6b 29  k - start_block)
22090 20 2f 20 31 36 29 2e 20 41 6e 64 20 73 6f 20 6f   / 16). And so o
220a0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  n..**.** In the 
220b0 61 63 74 75 61 6c 20 63 6f 64 65 20 62 65 6c 6f  actual code belo
220c0 77 2c 20 74 68 65 20 76 61 6c 75 65 20 22 31 36  w, the value "16
220d0 22 20 69 73 20 72 65 70 6c 61 63 65 64 20 77 69  " is replaced wi
220e0 74 68 20 74 68 65 20 0a 2a 2a 20 70 72 65 2d 70  th the .** pre-p
220f0 72 6f 63 65 73 73 6f 72 20 6d 61 63 72 6f 20 46  rocessor macro F
22100 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c  TS_MAX_APPENDABL
22110 45 5f 48 45 49 47 48 54 2e 0a 2a 2f 0a 73 74 61  E_HEIGHT..*/.sta
22120 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72  tic int fts3Incr
22130 6d 65 72 67 65 57 72 69 74 65 72 28 20 0a 20 20  mergeWriter( .  
22140 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
22150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22160 2f 2a 20 46 74 73 33 20 74 61 62 6c 65 20 68 61  /* Fts3 table ha
22170 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ndle */.  sqlite
22180 33 5f 69 6e 74 36 34 20 69 41 62 73 4c 65 76 65  3_int64 iAbsLeve
22190 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 62 73  l,        /* Abs
221a0 6f 6c 75 74 65 20 6c 65 76 65 6c 20 6f 66 20 69  olute level of i
221b0 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f  nput segments */
221c0 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20  .  int iIdx,    
221d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221e0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e     /* Index of n
221f0 65 77 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e  ew output segmen
22200 74 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69  t */.  Fts3Multi
22210 53 65 67 52 65 61 64 65 72 20 2a 70 43 73 72 2c  SegReader *pCsr,
22220 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
22230 20 74 68 61 74 20 64 61 74 61 20 77 69 6c 6c 20   that data will 
22240 62 65 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  be read from */.
22250 20 20 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65    IncrmergeWrite
22260 72 20 2a 70 57 72 69 74 65 72 20 20 20 20 20 20  r *pWriter      
22270 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
22280 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  is object */.){.
22290 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
222a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222b0 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
222c0 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
222d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222e0 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
222f0 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
22300 69 6e 74 20 6e 4c 65 61 66 45 73 74 20 3d 20 30  int nLeafEst = 0
22310 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22320 2f 2a 20 42 6c 6f 63 6b 73 20 61 6c 6c 6f 63 61  /* Blocks alloca
22330 74 65 64 20 66 6f 72 20 6c 65 61 66 20 6e 6f 64  ted for leaf nod
22340 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  es */.  sqlite3_
22350 73 74 6d 74 20 2a 70 4c 65 61 66 45 73 74 20 3d  stmt *pLeafEst =
22360 20 30 3b 20 20 20 20 20 2f 2a 20 53 51 4c 20 75   0;     /* SQL u
22370 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
22380 20 6e 4c 65 61 66 45 73 74 20 2a 2f 0a 20 20 73   nLeafEst */.  s
22390 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 46 69  qlite3_stmt *pFi
223a0 72 73 74 42 6c 6f 63 6b 20 3d 20 30 3b 20 20 2f  rstBlock = 0;  /
223b0 2a 20 53 51 4c 20 75 73 65 64 20 74 6f 20 64 65  * SQL used to de
223c0 74 65 72 6d 69 6e 65 20 66 69 72 73 74 20 62 6c  termine first bl
223d0 6f 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 43 61 6c  ock */..  /* Cal
223e0 63 75 6c 61 74 65 20 6e 4c 65 61 66 45 73 74 2e  culate nLeafEst.
223f0 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73 33 53   */.  rc = fts3S
22400 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 4d 41  qlStmt(p, SQL_MA
22410 58 5f 4c 45 41 46 5f 4e 4f 44 45 5f 45 53 54 49  X_LEAF_NODE_ESTI
22420 4d 41 54 45 2c 20 26 70 4c 65 61 66 45 73 74 2c  MATE, &pLeafEst,
22430 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
22440 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22450 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
22460 36 34 28 70 4c 65 61 66 45 73 74 2c 20 31 2c 20  64(pLeafEst, 1, 
22470 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20  iAbsLevel);.    
22480 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
22490 36 34 28 70 4c 65 61 66 45 73 74 2c 20 32 2c 20  64(pLeafEst, 2, 
224a0 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 29 3b  pCsr->nSegment);
224b0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
224c0 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
224d0 70 28 70 4c 65 61 66 45 73 74 29 20 29 7b 0a 20  p(pLeafEst) ){. 
224e0 20 20 20 20 20 6e 4c 65 61 66 45 73 74 20 3d 20       nLeafEst = 
224f0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
22500 6e 74 28 70 4c 65 61 66 45 73 74 2c 20 30 29 3b  nt(pLeafEst, 0);
22510 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
22520 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 4c  sqlite3_reset(pL
22530 65 61 66 45 73 74 29 3b 0a 20 20 7d 0a 20 20 69  eafEst);.  }.  i
22540 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22550 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
22560 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68   /* Calculate th
22570 65 20 66 69 72 73 74 20 62 6c 6f 63 6b 20 74 6f  e first block to
22580 20 75 73 65 20 69 6e 20 74 68 65 20 6f 75 74 70   use in the outp
22590 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ut segment */.  
225a0 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
225b0 28 70 2c 20 53 51 4c 5f 4e 45 58 54 5f 53 45 47  (p, SQL_NEXT_SEG
225c0 4d 45 4e 54 53 5f 49 44 2c 20 26 70 46 69 72 73  MENTS_ID, &pFirs
225d0 74 42 6c 6f 63 6b 2c 20 30 29 3b 0a 20 20 69 66  tBlock, 0);.  if
225e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
225f0 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  ){.    if( SQLIT
22600 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
22610 74 65 70 28 70 46 69 72 73 74 42 6c 6f 63 6b 29  tep(pFirstBlock)
22620 20 29 7b 0a 20 20 20 20 20 20 70 57 72 69 74 65   ){.      pWrite
22630 72 2d 3e 69 53 74 61 72 74 20 3d 20 73 71 6c 69  r->iStart = sqli
22640 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
22650 28 70 46 69 72 73 74 42 6c 6f 63 6b 2c 20 30 29  (pFirstBlock, 0)
22660 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d  ;.      pWriter-
22670 3e 69 45 6e 64 20 3d 20 70 57 72 69 74 65 72 2d  >iEnd = pWriter-
22680 3e 69 53 74 61 72 74 20 2d 20 31 3b 0a 20 20 20  >iStart - 1;.   
22690 20 20 20 70 57 72 69 74 65 72 2d 3e 69 45 6e 64     pWriter->iEnd
226a0 20 2b 3d 20 6e 4c 65 61 66 45 73 74 20 2a 20 46   += nLeafEst * F
226b0 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c  TS_MAX_APPENDABL
226c0 45 5f 48 45 49 47 48 54 3b 0a 20 20 20 20 7d 0a  E_HEIGHT;.    }.
226d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
226e0 5f 72 65 73 65 74 28 70 46 69 72 73 74 42 6c 6f  _reset(pFirstBlo
226f0 63 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ck);.  }.  if( r
22700 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
22710 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
22720 49 6e 73 65 72 74 20 74 68 65 20 6d 61 72 6b 65  Insert the marke
22730 72 20 69 6e 20 74 68 65 20 25 5f 73 65 67 6d 65  r in the %_segme
22740 6e 74 73 20 74 61 62 6c 65 20 74 6f 20 6d 61 6b  nts table to mak
22750 65 20 73 75 72 65 20 6e 6f 62 6f 64 79 20 74 72  e sure nobody tr
22760 69 65 73 0a 20 20 2a 2a 20 74 6f 20 73 74 65 61  ies.  ** to stea
22770 6c 20 74 68 65 20 73 70 61 63 65 20 6a 75 73 74  l the space just
22780 20 61 6c 6c 6f 63 61 74 65 64 2e 20 54 68 69 73   allocated. This
22790 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 74 6f   is also used to
227a0 20 69 64 65 6e 74 69 66 79 20 0a 20 20 2a 2a 20   identify .  ** 
227b0 61 70 70 65 6e 64 61 62 6c 65 20 73 65 67 6d 65  appendable segme
227c0 6e 74 73 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20  nts.  */.  rc = 
227d0 66 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74  fts3WriteSegment
227e0 28 70 2c 20 70 57 72 69 74 65 72 2d 3e 69 45 6e  (p, pWriter->iEn
227f0 64 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  d, 0, 0);.  if( 
22800 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
22810 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 57  return rc;..  pW
22820 72 69 74 65 72 2d 3e 69 41 62 73 4c 65 76 65 6c  riter->iAbsLevel
22830 20 3d 20 69 41 62 73 4c 65 76 65 6c 3b 0a 20 20   = iAbsLevel;.  
22840 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 45 73  pWriter->nLeafEs
22850 74 20 3d 20 6e 4c 65 61 66 45 73 74 3b 0a 20 20  t = nLeafEst;.  
22860 70 57 72 69 74 65 72 2d 3e 69 49 64 78 20 3d 20  pWriter->iIdx = 
22870 69 49 64 78 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  iIdx;..  /* Set 
22880 75 70 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  up the array of 
22890 4e 6f 64 65 57 72 69 74 65 72 20 6f 62 6a 65 63  NodeWriter objec
228a0 74 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  ts */.  for(i=0;
228b0 20 69 3c 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e   i<FTS_MAX_APPEN
228c0 44 41 42 4c 45 5f 48 45 49 47 48 54 3b 20 69 2b  DABLE_HEIGHT; i+
228d0 2b 29 7b 0a 20 20 20 20 70 57 72 69 74 65 72 2d  +){.    pWriter-
228e0 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 69 5d 2e  >aNodeWriter[i].
228f0 69 42 6c 6f 63 6b 20 3d 20 70 57 72 69 74 65 72  iBlock = pWriter
22900 2d 3e 69 53 74 61 72 74 20 2b 20 69 2a 70 57 72  ->iStart + i*pWr
22910 69 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74 3b 0a  iter->nLeafEst;.
22920 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
22930 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
22940 20 52 65 6d 6f 76 65 20 61 6e 20 65 6e 74 72 79   Remove an entry
22950 20 66 72 6f 6d 20 74 68 65 20 25 5f 73 65 67 64   from the %_segd
22960 69 72 20 74 61 62 6c 65 2e 20 54 68 69 73 20 69  ir table. This i
22970 6e 76 6f 6c 76 65 73 20 72 75 6e 6e 69 6e 67 20  nvolves running 
22980 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  the .** followin
22990 67 20 74 77 6f 20 73 74 61 74 65 6d 65 6e 74 73  g two statements
229a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 44 45 4c 45 54 45  :.**.**   DELETE
229b0 20 46 52 4f 4d 20 25 5f 73 65 67 64 69 72 20 57   FROM %_segdir W
229c0 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3a 69 41  HERE level = :iA
229d0 62 73 4c 65 76 65 6c 20 41 4e 44 20 69 64 78 20  bsLevel AND idx 
229e0 3d 20 3a 69 49 64 78 0a 2a 2a 20 20 20 55 50 44  = :iIdx.**   UPD
229f0 41 54 45 20 25 5f 73 65 67 64 69 72 20 53 45 54  ATE %_segdir SET
22a00 20 69 64 78 20 3d 20 69 64 78 20 2d 20 31 20 57   idx = idx - 1 W
22a10 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3a 69 41  HERE level = :iA
22a20 62 73 4c 65 76 65 6c 20 41 4e 44 20 69 64 78 20  bsLevel AND idx 
22a30 3e 20 3a 69 49 64 78 0a 2a 2a 0a 2a 2a 20 54 68  > :iIdx.**.** Th
22a40 65 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  e DELETE stateme
22a50 6e 74 20 72 65 6d 6f 76 65 73 20 74 68 65 20 73  nt removes the s
22a60 70 65 63 69 66 69 63 20 25 5f 73 65 67 64 69 72  pecific %_segdir
22a70 20 6c 65 76 65 6c 2e 20 54 68 65 20 55 50 44 41   level. The UPDA
22a80 54 45 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  TE .** statement
22a90 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
22aa0 65 20 72 65 6d 61 69 6e 69 6e 67 20 73 65 67 6d  e remaining segm
22ab0 65 6e 74 73 20 68 61 76 65 20 63 6f 6e 74 69 67  ents have contig
22ac0 75 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64  uously allocated
22ad0 0a 2a 2a 20 69 64 78 20 76 61 6c 75 65 73 2e 0a  .** idx values..
22ae0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
22af0 73 33 52 65 6d 6f 76 65 53 65 67 64 69 72 45 6e  s3RemoveSegdirEn
22b00 74 72 79 28 0a 20 20 46 74 73 33 54 61 62 6c 65  try(.  Fts3Table
22b10 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
22b20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74         /* FTS3 t
22b30 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
22b40 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
22b50 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  AbsLevel,       
22b60 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65 76   /* Absolute lev
22b70 65 6c 20 74 6f 20 64 65 6c 65 74 65 20 66 72 6f  el to delete fro
22b80 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20  m */.  int iIdx 
22b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ba0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
22bb0 6f 66 20 25 5f 73 65 67 64 69 72 20 65 6e 74 72  of %_segdir entr
22bc0 79 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 29  y to delete */.)
22bd0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
22be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bf0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
22c00 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
22c10 73 74 6d 74 20 2a 70 44 65 6c 65 74 65 20 3d 20  stmt *pDelete = 
22c20 30 3b 20 20 20 20 20 20 2f 2a 20 44 45 4c 45 54  0;      /* DELET
22c30 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a  E statement */..
22c40 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
22c50 6d 74 28 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45  mt(p, SQL_DELETE
22c60 5f 53 45 47 44 49 52 5f 45 4e 54 52 59 2c 20 26  _SEGDIR_ENTRY, &
22c70 70 44 65 6c 65 74 65 2c 20 30 29 3b 0a 20 20 69  pDelete, 0);.  i
22c80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22c90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
22ca0 62 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c 65  bind_int64(pDele
22cb0 74 65 2c 20 31 2c 20 69 41 62 73 4c 65 76 65 6c  te, 1, iAbsLevel
22cc0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  );.    sqlite3_b
22cd0 69 6e 64 5f 69 6e 74 28 70 44 65 6c 65 74 65 2c  ind_int(pDelete,
22ce0 20 32 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 73   2, iIdx);.    s
22cf0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 44 65 6c  qlite3_step(pDel
22d00 65 74 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ete);.    rc = s
22d10 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 44 65  qlite3_reset(pDe
22d20 6c 65 74 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  lete);.  }..  re
22d30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
22d40 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65  * One or more se
22d50 67 6d 65 6e 74 73 20 68 61 76 65 20 6a 75 73 74  gments have just
22d60 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 66 72   been removed fr
22d70 6f 6d 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65  om absolute leve
22d80 6c 20 69 41 62 73 4c 65 76 65 6c 2e 0a 2a 2a 20  l iAbsLevel..** 
22d90 55 70 64 61 74 65 20 74 68 65 20 27 69 64 78 27  Update the 'idx'
22da0 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 72   values of the r
22db0 65 6d 61 69 6e 69 6e 67 20 73 65 67 6d 65 6e 74  emaining segment
22dc0 73 20 69 6e 20 74 68 65 20 6c 65 76 65 6c 20 73  s in the level s
22dd0 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 69 64  o that.** the id
22de0 78 20 76 61 6c 75 65 73 20 61 72 65 20 61 20 63  x values are a c
22df0 6f 6e 74 69 67 75 6f 75 73 20 73 65 71 75 65 6e  ontiguous sequen
22e00 63 65 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d  ce starting from
22e10 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
22e20 74 20 66 74 73 33 52 65 70 61 63 6b 53 65 67 64  t fts3RepackSegd
22e30 69 72 4c 65 76 65 6c 28 0a 20 20 46 74 73 33 54  irLevel(.  Fts3T
22e40 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
22e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
22e60 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  S3 table handle 
22e70 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
22e80 36 34 20 69 41 62 73 4c 65 76 65 6c 20 20 20 20  64 iAbsLevel    
22e90 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65       /* Absolute
22ea0 20 6c 65 76 65 6c 20 74 6f 20 72 65 70 61 63 6b   level to repack
22eb0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
22ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
22ee0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
22ef0 20 2a 61 49 64 78 20 3d 20 30 3b 20 20 20 20 20   *aIdx = 0;     
22f00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22f10 41 72 72 61 79 20 6f 66 20 72 65 6d 61 69 6e 69  Array of remaini
22f20 6e 67 20 69 64 78 20 76 61 6c 75 65 73 20 2a 2f  ng idx values */
22f30 0a 20 20 69 6e 74 20 6e 49 64 78 20 3d 20 30 3b  .  int nIdx = 0;
22f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f50 20 20 20 2f 2a 20 56 61 6c 69 64 20 65 6e 74 72     /* Valid entr
22f60 69 65 73 20 69 6e 20 61 49 64 78 5b 5d 20 2a 2f  ies in aIdx[] */
22f70 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20  .  int nAlloc = 
22f80 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
22f90 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
22fa0 73 69 7a 65 20 6f 66 20 61 49 64 78 5b 5d 20 2a  size of aIdx[] *
22fb0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fd0 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
22fe0 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 73 71  variable */.  sq
22ff0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c  lite3_stmt *pSel
23000 65 63 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  ect = 0;      /*
23010 20 53 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   Select statemen
23020 74 20 74 6f 20 72 65 61 64 20 69 64 78 20 76 61  t to read idx va
23030 6c 75 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lues */.  sqlite
23040 33 5f 73 74 6d 74 20 2a 70 55 70 64 61 74 65 20  3_stmt *pUpdate 
23050 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 55 70 64  = 0;      /* Upd
23060 61 74 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ate statement to
23070 20 6d 6f 64 69 66 79 20 69 64 78 20 76 61 6c 75   modify idx valu
23080 65 73 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74  es */..  rc = ft
23090 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
230a0 5f 53 45 4c 45 43 54 5f 49 4e 44 45 58 45 53 2c  _SELECT_INDEXES,
230b0 20 26 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20   &pSelect, 0);. 
230c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
230d0 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  OK ){.    int rc
230e0 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  2;.    sqlite3_b
230f0 69 6e 64 5f 69 6e 74 36 34 28 70 53 65 6c 65 63  ind_int64(pSelec
23100 74 2c 20 31 2c 20 69 41 62 73 4c 65 76 65 6c 29  t, 1, iAbsLevel)
23110 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c  ;.    while( SQL
23120 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
23130 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29 20 29  _step(pSelect) )
23140 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 49 64 78  {.      if( nIdx
23150 3e 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  >=nAlloc ){.    
23160 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 3b 0a 20      int *aNew;. 
23170 20 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 2b 3d         nAlloc +=
23180 20 31 36 3b 0a 20 20 20 20 20 20 20 20 61 4e 65   16;.        aNe
23190 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
231a0 6c 6f 63 28 61 49 64 78 2c 20 6e 41 6c 6c 6f 63  loc(aIdx, nAlloc
231b0 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20  *sizeof(int));. 
231c0 20 20 20 20 20 20 20 69 66 28 20 21 61 4e 65 77         if( !aNew
231d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
231e0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
231f0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
23200 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23210 20 20 20 20 61 49 64 78 20 3d 20 61 4e 65 77 3b      aIdx = aNew;
23220 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
23230 49 64 78 5b 6e 49 64 78 2b 2b 5d 20 3d 20 73 71  Idx[nIdx++] = sq
23240 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
23250 28 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  (pSelect, 0);.  
23260 20 20 7d 0a 20 20 20 20 72 63 32 20 3d 20 73 71    }.    rc2 = sq
23270 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 65 6c  lite3_reset(pSel
23280 65 63 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ect);.    if( rc
23290 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
232a0 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 69   = rc2;.  }..  i
232b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
232c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
232d0 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
232e0 53 48 49 46 54 5f 53 45 47 44 49 52 5f 45 4e 54  SHIFT_SEGDIR_ENT
232f0 52 59 2c 20 26 70 55 70 64 61 74 65 2c 20 30 29  RY, &pUpdate, 0)
23300 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
23310 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23320 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
23330 74 36 34 28 70 55 70 64 61 74 65 2c 20 32 2c 20  t64(pUpdate, 2, 
23340 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a  iAbsLevel);.  }.
23350 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49  .  assert( p->bI
23360 67 6e 6f 72 65 53 61 76 65 70 6f 69 6e 74 3d 3d  gnoreSavepoint==
23370 30 20 29 3b 0a 20 20 70 2d 3e 62 49 67 6e 6f 72  0 );.  p->bIgnor
23380 65 53 61 76 65 70 6f 69 6e 74 20 3d 20 31 3b 0a  eSavepoint = 1;.
23390 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
233a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 49  QLITE_OK && i<nI
233b0 64 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  dx; i++){.    if
233c0 28 20 61 49 64 78 5b 69 5d 21 3d 69 20 29 7b 0a  ( aIdx[i]!=i ){.
233d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
233e0 6e 64 5f 69 6e 74 28 70 55 70 64 61 74 65 2c 20  nd_int(pUpdate, 
233f0 33 2c 20 61 49 64 78 5b 69 5d 29 3b 0a 20 20 20  3, aIdx[i]);.   
23400 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
23410 69 6e 74 28 70 55 70 64 61 74 65 2c 20 31 2c 20  int(pUpdate, 1, 
23420 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  i);.      sqlite
23430 33 5f 73 74 65 70 28 70 55 70 64 61 74 65 29 3b  3_step(pUpdate);
23440 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
23450 74 65 33 5f 72 65 73 65 74 28 70 55 70 64 61 74  te3_reset(pUpdat
23460 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
23470 70 2d 3e 62 49 67 6e 6f 72 65 53 61 76 65 70 6f  p->bIgnoreSavepo
23480 69 6e 74 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69  int = 0;..  sqli
23490 74 65 33 5f 66 72 65 65 28 61 49 64 78 29 3b 0a  te3_free(aIdx);.
234a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
234b0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
234c0 53 74 61 72 74 4e 6f 64 65 28 42 6c 6f 62 20 2a  StartNode(Blob *
234d0 70 4e 6f 64 65 2c 20 69 6e 74 20 69 48 65 69 67  pNode, int iHeig
234e0 68 74 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ht, sqlite3_int6
234f0 34 20 69 43 68 69 6c 64 29 7b 0a 20 20 70 4e 6f  4 iChild){.  pNo
23500 64 65 2d 3e 61 5b 30 5d 20 3d 20 28 63 68 61 72  de->a[0] = (char
23510 29 69 48 65 69 67 68 74 3b 0a 20 20 69 66 28 20  )iHeight;.  if( 
23520 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 61 73  iChild ){.    as
23530 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 6e 41 6c  sert( pNode->nAl
23540 6c 6f 63 3e 3d 31 2b 73 71 6c 69 74 65 33 46 74  loc>=1+sqlite3Ft
23550 73 33 56 61 72 69 6e 74 4c 65 6e 28 69 43 68 69  s3VarintLen(iChi
23560 6c 64 29 20 29 3b 0a 20 20 20 20 70 4e 6f 64 65  ld) );.    pNode
23570 2d 3e 6e 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ->n = 1 + sqlite
23580 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26  3Fts3PutVarint(&
23590 70 4e 6f 64 65 2d 3e 61 5b 31 5d 2c 20 69 43 68  pNode->a[1], iCh
235a0 69 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ild);.  }else{. 
235b0 20 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65     assert( pNode
235c0 2d 3e 6e 41 6c 6c 6f 63 3e 3d 31 20 29 3b 0a 20  ->nAlloc>=1 );. 
235d0 20 20 20 70 4e 6f 64 65 2d 3e 6e 20 3d 20 31 3b     pNode->n = 1;
235e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
235f0 65 20 66 69 72 73 74 20 74 77 6f 20 61 72 67 75  e first two argu
23600 6d 65 6e 74 73 20 61 72 65 20 61 20 70 6f 69 6e  ments are a poin
23610 74 65 72 20 74 6f 20 61 6e 64 20 74 68 65 20 73  ter to and the s
23620 69 7a 65 20 6f 66 20 61 20 73 65 67 6d 65 6e 74  ize of a segment
23630 20 62 2d 74 72 65 65 0a 2a 2a 20 6e 6f 64 65 2e   b-tree.** node.
23640 20 54 68 65 20 6e 6f 64 65 20 6d 61 79 20 62 65   The node may be
23650 20 61 20 6c 65 61 66 20 6f 72 20 61 6e 20 69 6e   a leaf or an in
23660 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 0a 2a 2a 0a  ternal node..**.
23670 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
23680 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 6e   creates a new n
23690 6f 64 65 20 69 6d 61 67 65 20 69 6e 20 62 6c 6f  ode image in blo
236a0 62 20 6f 62 6a 65 63 74 20 2a 70 4e 65 77 20 62  b object *pNew b
236b0 79 20 63 6f 70 79 69 6e 67 0a 2a 2a 20 61 6c 6c  y copying.** all
236c0 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20   terms that are 
236d0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
236e0 65 71 75 61 6c 20 74 6f 20 7a 54 65 72 6d 2f 6e  equal to zTerm/n
236f0 54 65 72 6d 20 28 66 6f 72 20 6c 65 61 66 20 6e  Term (for leaf n
23700 6f 64 65 73 29 0a 2a 2a 20 6f 72 20 67 72 65 61  odes).** or grea
23710 74 65 72 20 74 68 61 6e 20 7a 54 65 72 6d 2f 6e  ter than zTerm/n
23720 54 65 72 6d 20 28 66 6f 72 20 69 6e 74 65 72 6e  Term (for intern
23730 61 6c 20 6e 6f 64 65 73 29 20 66 72 6f 6d 20 61  al nodes) from a
23740 4e 6f 64 65 2f 6e 4e 6f 64 65 2e 0a 2a 2f 0a 73  Node/nNode..*/.s
23750 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 54 72  tatic int fts3Tr
23760 75 6e 63 61 74 65 4e 6f 64 65 28 0a 20 20 63 6f  uncateNode(.  co
23770 6e 73 74 20 63 68 61 72 20 2a 61 4e 6f 64 65 2c  nst char *aNode,
23780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23790 20 43 75 72 72 65 6e 74 20 6e 6f 64 65 20 69 6d   Current node im
237a0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 6f  age */.  int nNo
237b0 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
237c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
237d0 20 6f 66 20 61 4e 6f 64 65 20 69 6e 20 62 79 74   of aNode in byt
237e0 65 73 20 2a 2f 0a 20 20 42 6c 6f 62 20 2a 70 4e  es */.  Blob *pN
237f0 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ew,             
23800 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
23810 57 72 69 74 65 20 6e 65 77 20 6e 6f 64 65 20 69  Write new node i
23820 6d 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  mage here */.  c
23830 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
23840 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
23850 2a 20 4f 6d 69 74 20 61 6c 6c 20 74 65 72 6d 73  * Omit all terms
23860 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
23870 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72  is */.  int nTer
23880 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
23890 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
238a0 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65  of zTerm in byte
238b0 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  s */.  sqlite3_i
238c0 6e 74 36 34 20 2a 70 69 42 6c 6f 63 6b 20 20 20  nt64 *piBlock   
238d0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42         /* OUT: B
238e0 6c 6f 63 6b 20 6e 75 6d 62 65 72 20 69 6e 20 6e  lock number in n
238f0 65 78 74 20 6c 61 79 65 72 20 64 6f 77 6e 20 2a  ext layer down *
23900 2f 0a 29 7b 0a 20 20 4e 6f 64 65 52 65 61 64 65  /.){.  NodeReade
23910 72 20 72 65 61 64 65 72 3b 20 20 20 20 20 20 20  r reader;       
23920 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 65 72         /* Reader
23930 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 42 6c 6f   object */.  Blo
23940 62 20 70 72 65 76 20 3d 20 7b 30 2c 20 30 2c 20  b prev = {0, 0, 
23950 30 7d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0};          /* 
23960 50 72 65 76 69 6f 75 73 20 74 65 72 6d 20 77 72  Previous term wr
23970 69 74 74 65 6e 20 74 6f 20 6e 65 77 20 6e 6f 64  itten to new nod
23980 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
23990 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
239a0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
239b0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 62   code */.  int b
239c0 4c 65 61 66 20 3d 20 61 4e 6f 64 65 5b 30 5d 3d  Leaf = aNode[0]=
239d0 3d 27 5c 30 27 3b 20 20 20 20 20 2f 2a 20 54 72  ='\0';     /* Tr
239e0 75 65 20 66 6f 72 20 61 20 6c 65 61 66 20 6e 6f  ue for a leaf no
239f0 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  de */..  /* Allo
23a00 63 61 74 65 20 72 65 71 75 69 72 65 64 20 6f 75  cate required ou
23a10 74 70 75 74 20 73 70 61 63 65 20 2a 2f 0a 20 20  tput space */.  
23a20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28 70  blobGrowBuffer(p
23a30 4e 65 77 2c 20 6e 4e 6f 64 65 2c 20 26 72 63 29  New, nNode, &rc)
23a40 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
23a50 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
23a60 63 3b 0a 20 20 70 4e 65 77 2d 3e 6e 20 3d 20 30  c;.  pNew->n = 0
23a70 3b 0a 0a 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65  ;..  /* Populate
23a80 20 6e 65 77 20 6e 6f 64 65 20 62 75 66 66 65 72   new node buffer
23a90 20 2a 2f 0a 20 20 66 6f 72 28 72 63 20 3d 20 6e   */.  for(rc = n
23aa0 6f 64 65 52 65 61 64 65 72 49 6e 69 74 28 26 72  odeReaderInit(&r
23ab0 65 61 64 65 72 2c 20 61 4e 6f 64 65 2c 20 6e 4e  eader, aNode, nN
23ac0 6f 64 65 29 3b 20 0a 20 20 20 20 20 20 72 63 3d  ode); .      rc=
23ad0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65  =SQLITE_OK && re
23ae0 61 64 65 72 2e 61 4e 6f 64 65 3b 20 0a 20 20 20  ader.aNode; .   
23af0 20 20 20 72 63 20 3d 20 6e 6f 64 65 52 65 61 64     rc = nodeRead
23b00 65 72 4e 65 78 74 28 26 72 65 61 64 65 72 29 0a  erNext(&reader).
23b10 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4e 65    ){.    if( pNe
23b20 77 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  w->n==0 ){.     
23b30 20 69 6e 74 20 72 65 73 20 3d 20 66 74 73 33 54   int res = fts3T
23b40 65 72 6d 43 6d 70 28 72 65 61 64 65 72 2e 74 65  ermCmp(reader.te
23b50 72 6d 2e 61 2c 20 72 65 61 64 65 72 2e 74 65 72  rm.a, reader.ter
23b60 6d 2e 6e 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  m.n, zTerm, nTer
23b70 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  m);.      if( re
23b80 73 3c 30 20 7c 7c 20 28 62 4c 65 61 66 3d 3d 30  s<0 || (bLeaf==0
23b90 20 26 26 20 72 65 73 3d 3d 30 29 20 29 20 63 6f   && res==0) ) co
23ba0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 74  ntinue;.      ft
23bb0 73 33 53 74 61 72 74 4e 6f 64 65 28 70 4e 65 77  s3StartNode(pNew
23bc0 2c 20 28 69 6e 74 29 61 4e 6f 64 65 5b 30 5d 2c  , (int)aNode[0],
23bd0 20 72 65 61 64 65 72 2e 69 43 68 69 6c 64 29 3b   reader.iChild);
23be0 0a 20 20 20 20 20 20 2a 70 69 42 6c 6f 63 6b 20  .      *piBlock 
23bf0 3d 20 72 65 61 64 65 72 2e 69 43 68 69 6c 64 3b  = reader.iChild;
23c00 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
23c10 66 74 73 33 41 70 70 65 6e 64 54 6f 4e 6f 64 65  fts3AppendToNode
23c20 28 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2c 20  (.        pNew, 
23c30 26 70 72 65 76 2c 20 72 65 61 64 65 72 2e 74 65  &prev, reader.te
23c40 72 6d 2e 61 2c 20 72 65 61 64 65 72 2e 74 65 72  rm.a, reader.ter
23c50 6d 2e 6e 2c 0a 20 20 20 20 20 20 20 20 72 65 61  m.n,.        rea
23c60 64 65 72 2e 61 44 6f 63 6c 69 73 74 2c 20 72 65  der.aDoclist, re
23c70 61 64 65 72 2e 6e 44 6f 63 6c 69 73 74 0a 20 20  ader.nDoclist.  
23c80 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21    );.    if( rc!
23c90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65  =SQLITE_OK ) bre
23ca0 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e  ak;.  }.  if( pN
23cb0 65 77 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  ew->n==0 ){.    
23cc0 66 74 73 33 53 74 61 72 74 4e 6f 64 65 28 70 4e  fts3StartNode(pN
23cd0 65 77 2c 20 28 69 6e 74 29 61 4e 6f 64 65 5b 30  ew, (int)aNode[0
23ce0 5d 2c 20 72 65 61 64 65 72 2e 69 43 68 69 6c 64  ], reader.iChild
23cf0 29 3b 0a 20 20 20 20 2a 70 69 42 6c 6f 63 6b 20  );.    *piBlock 
23d00 3d 20 72 65 61 64 65 72 2e 69 43 68 69 6c 64 3b  = reader.iChild;
23d10 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
23d20 4e 65 77 2d 3e 6e 3c 3d 70 4e 65 77 2d 3e 6e 41  New->n<=pNew->nA
23d30 6c 6c 6f 63 20 29 3b 0a 0a 20 20 6e 6f 64 65 52  lloc );..  nodeR
23d40 65 61 64 65 72 52 65 6c 65 61 73 65 28 26 72 65  eaderRelease(&re
23d50 61 64 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ader);.  sqlite3
23d60 5f 66 72 65 65 28 70 72 65 76 2e 61 29 3b 0a 20  _free(prev.a);. 
23d70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
23d80 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20  *.** Remove all 
23d90 74 65 72 6d 73 20 73 6d 61 6c 6c 65 72 20 74 68  terms smaller th
23da0 61 6e 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 20 66  an zTerm/nTerm f
23db0 72 6f 6d 20 73 65 67 6d 65 6e 74 20 69 49 64 78  rom segment iIdx
23dc0 20 69 6e 20 61 62 73 6f 6c 75 74 65 20 0a 2a 2a   in absolute .**
23dd0 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c   level iAbsLevel
23de0 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c  . This may invol
23df0 76 65 20 64 65 6c 65 74 69 6e 67 20 65 6e 74 72  ve deleting entr
23e00 69 65 73 20 66 72 6f 6d 20 74 68 65 20 25 5f 73  ies from the %_s
23e10 65 67 6d 65 6e 74 73 0a 2a 2a 20 74 61 62 6c 65  egments.** table
23e20 2c 20 61 6e 64 20 6d 6f 64 69 66 79 69 6e 67 20  , and modifying 
23e30 65 78 69 73 74 69 6e 67 20 65 6e 74 72 69 65 73  existing entries
23e40 20 69 6e 20 62 6f 74 68 20 74 68 65 20 25 5f 73   in both the %_s
23e50 65 67 6d 65 6e 74 73 20 61 6e 64 20 25 5f 73 65  egments and %_se
23e60 67 64 69 72 0a 2a 2a 20 74 61 62 6c 65 73 2e 0a  gdir.** tables..
23e70 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
23e80 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
23e90 68 65 20 73 65 67 6d 65 6e 74 20 69 73 20 75 70  he segment is up
23ea0 64 61 74 65 64 20 73 75 63 63 65 73 73 66 75 6c  dated successful
23eb0 6c 79 2e 20 4f 72 20 61 6e 0a 2a 2a 20 53 51 4c  ly. Or an.** SQL
23ec0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ite error code o
23ed0 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
23ee0 74 69 63 20 69 6e 74 20 66 74 73 33 54 72 75 6e  tic int fts3Trun
23ef0 63 61 74 65 53 65 67 6d 65 6e 74 28 0a 20 20 46  cateSegment(.  F
23f00 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
23f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23f20 2a 20 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e  * FTS3 table han
23f30 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dle */.  sqlite3
23f40 5f 69 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c  _int64 iAbsLevel
23f50 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f  ,        /* Abso
23f60 6c 75 74 65 20 6c 65 76 65 6c 20 6f 66 20 73 65  lute level of se
23f70 67 6d 65 6e 74 20 74 6f 20 6d 6f 64 69 66 79 20  gment to modify 
23f80 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20  */.  int iIdx,  
23f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fa0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 77 69       /* Index wi
23fb0 74 68 69 6e 20 6c 65 76 65 6c 20 6f 66 20 73 65  thin level of se
23fc0 67 6d 65 6e 74 20 74 6f 20 6d 6f 64 69 66 79 20  gment to modify 
23fd0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
23fe0 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  *zTerm,         
23ff0 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
24000 65 72 6d 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  erms smaller tha
24010 6e 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20  n this */.  int 
24020 6e 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20  nTerm           
24030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
24040 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
24050 20 62 75 66 66 65 72 20 7a 54 65 72 6d 20 2a 2f   buffer zTerm */
24060 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
24070 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
24080 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
24090 63 6f 64 65 20 2a 2f 0a 20 20 42 6c 6f 62 20 72  code */.  Blob r
240a0 6f 6f 74 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20  oot = {0,0,0};  
240b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
240c0 20 72 6f 6f 74 20 70 61 67 65 20 69 6d 61 67 65   root page image
240d0 20 2a 2f 0a 20 20 42 6c 6f 62 20 62 6c 6f 63 6b   */.  Blob block
240e0 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 20 20   = {0,0,0};     
240f0 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
24100 75 73 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68  used for any oth
24110 65 72 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 73 71  er block */.  sq
24120 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 42 6c 6f  lite3_int64 iBlo
24130 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ck = 0;       /*
24140 20 42 6c 6f 63 6b 20 69 64 20 2a 2f 0a 20 20 73   Block id */.  s
24150 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4e 65  qlite3_int64 iNe
24160 77 53 74 61 72 74 20 3d 20 30 3b 20 20 20 20 2f  wStart = 0;    /
24170 2a 20 4e 65 77 20 76 61 6c 75 65 20 66 6f 72 20  * New value for 
24180 69 53 74 61 72 74 42 6c 6f 63 6b 20 2a 2f 0a 20  iStartBlock */. 
24190 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
241a0 4f 6c 64 53 74 61 72 74 20 3d 20 30 3b 20 20 20  OldStart = 0;   
241b0 20 2f 2a 20 4f 6c 64 20 76 61 6c 75 65 20 66 6f   /* Old value fo
241c0 72 20 69 53 74 61 72 74 42 6c 6f 63 6b 20 2a 2f  r iStartBlock */
241d0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
241e0 2a 70 46 65 74 63 68 20 3d 20 30 3b 20 20 20 20  *pFetch = 0;    
241f0 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
24200 75 73 65 64 20 74 6f 20 66 65 74 63 68 20 73 65  used to fetch se
24210 67 64 69 72 20 2a 2f 0a 0a 20 20 72 63 20 3d 20  gdir */..  rc = 
24220 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
24230 51 4c 5f 53 45 4c 45 43 54 5f 53 45 47 44 49 52  QL_SELECT_SEGDIR
24240 2c 20 26 70 46 65 74 63 68 2c 20 30 29 3b 0a 20  , &pFetch, 0);. 
24250 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24260 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  OK ){.    int rc
24270 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
24280 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
24290 65 33 5f 72 65 73 65 74 28 29 20 72 65 74 75 72  e3_reset() retur
242a0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 73 71  n code */.    sq
242b0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
242c0 28 70 46 65 74 63 68 2c 20 31 2c 20 69 41 62 73  (pFetch, 1, iAbs
242d0 4c 65 76 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69  Level);.    sqli
242e0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 46 65  te3_bind_int(pFe
242f0 74 63 68 2c 20 32 2c 20 69 49 64 78 29 3b 0a 20  tch, 2, iIdx);. 
24300 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
24310 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
24320 70 46 65 74 63 68 29 20 29 7b 0a 20 20 20 20 20  pFetch) ){.     
24330 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 52 6f   const char *aRo
24340 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ot = sqlite3_col
24350 75 6d 6e 5f 62 6c 6f 62 28 70 46 65 74 63 68 2c  umn_blob(pFetch,
24360 20 34 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e   4);.      int n
24370 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f 63  Root = sqlite3_c
24380 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 46 65 74  olumn_bytes(pFet
24390 63 68 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 4f  ch, 4);.      iO
243a0 6c 64 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65  ldStart = sqlite
243b0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
243c0 46 65 74 63 68 2c 20 31 29 3b 0a 20 20 20 20 20  Fetch, 1);.     
243d0 20 72 63 20 3d 20 66 74 73 33 54 72 75 6e 63 61   rc = fts3Trunca
243e0 74 65 4e 6f 64 65 28 61 52 6f 6f 74 2c 20 6e 52  teNode(aRoot, nR
243f0 6f 6f 74 2c 20 26 72 6f 6f 74 2c 20 7a 54 65 72  oot, &root, zTer
24400 6d 2c 20 6e 54 65 72 6d 2c 20 26 69 42 6c 6f 63  m, nTerm, &iBloc
24410 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  k);.    }.    rc
24420 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  2 = sqlite3_rese
24430 74 28 70 46 65 74 63 68 29 3b 0a 20 20 20 20 69  t(pFetch);.    i
24440 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24450 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d   ) rc = rc2;.  }
24460 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ..  while( rc==S
24470 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 42 6c 6f  QLITE_OK && iBlo
24480 63 6b 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  ck ){.    char *
24490 61 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20  aBlock = 0;.    
244a0 69 6e 74 20 6e 42 6c 6f 63 6b 20 3d 20 30 3b 0a  int nBlock = 0;.
244b0 20 20 20 20 69 4e 65 77 53 74 61 72 74 20 3d 20      iNewStart = 
244c0 69 42 6c 6f 63 6b 3b 0a 0a 20 20 20 20 72 63 20  iBlock;..    rc 
244d0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 52 65 61  = sqlite3Fts3Rea
244e0 64 42 6c 6f 63 6b 28 70 2c 20 69 42 6c 6f 63 6b  dBlock(p, iBlock
244f0 2c 20 26 61 42 6c 6f 63 6b 2c 20 26 6e 42 6c 6f  , &aBlock, &nBlo
24500 63 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ck, 0);.    if( 
24510 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24520 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33  .      rc = fts3
24530 54 72 75 6e 63 61 74 65 4e 6f 64 65 28 61 42 6c  TruncateNode(aBl
24540 6f 63 6b 2c 20 6e 42 6c 6f 63 6b 2c 20 26 62 6c  ock, nBlock, &bl
24550 6f 63 6b 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  ock, zTerm, nTer
24560 6d 2c 20 26 69 42 6c 6f 63 6b 29 3b 0a 20 20 20  m, &iBlock);.   
24570 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
24580 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24590 20 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65    rc = fts3Write
245a0 53 65 67 6d 65 6e 74 28 70 2c 20 69 4e 65 77 53  Segment(p, iNewS
245b0 74 61 72 74 2c 20 62 6c 6f 63 6b 2e 61 2c 20 62  tart, block.a, b
245c0 6c 6f 63 6b 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20  lock.n);.    }. 
245d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
245e0 61 42 6c 6f 63 6b 29 3b 0a 20 20 7d 0a 0a 20 20  aBlock);.  }..  
245f0 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65 77  /* Variable iNew
24600 53 74 61 72 74 20 6e 6f 77 20 63 6f 6e 74 61 69  Start now contai
24610 6e 73 20 74 68 65 20 66 69 72 73 74 20 76 61 6c  ns the first val
24620 69 64 20 6c 65 61 66 20 6e 6f 64 65 2e 20 2a 2f  id leaf node. */
24630 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
24640 45 5f 4f 4b 20 26 26 20 69 4e 65 77 53 74 61 72  E_OK && iNewStar
24650 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
24660 5f 73 74 6d 74 20 2a 70 44 65 6c 20 3d 20 30 3b  _stmt *pDel = 0;
24670 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71  .    rc = fts3Sq
24680 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 44 45 4c  lStmt(p, SQL_DEL
24690 45 54 45 5f 53 45 47 4d 45 4e 54 53 5f 52 41 4e  ETE_SEGMENTS_RAN
246a0 47 45 2c 20 26 70 44 65 6c 2c 20 30 29 3b 0a 20  GE, &pDel, 0);. 
246b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
246c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
246d0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
246e0 28 70 44 65 6c 2c 20 31 2c 20 69 4f 6c 64 53 74  (pDel, 1, iOldSt
246f0 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  art);.      sqli
24700 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
24710 44 65 6c 2c 20 32 2c 20 69 4e 65 77 53 74 61 72  Del, 2, iNewStar
24720 74 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t-1);.      sqli
24730 74 65 33 5f 73 74 65 70 28 70 44 65 6c 29 3b 0a  te3_step(pDel);.
24740 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
24750 65 33 5f 72 65 73 65 74 28 70 44 65 6c 29 3b 0a  e3_reset(pDel);.
24760 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
24770 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24780 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
24790 6d 74 20 2a 70 43 68 6f 6d 70 20 3d 20 30 3b 0a  mt *pChomp = 0;.
247a0 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c      rc = fts3Sql
247b0 53 74 6d 74 28 70 2c 20 53 51 4c 5f 43 48 4f 4d  Stmt(p, SQL_CHOM
247c0 50 5f 53 45 47 44 49 52 2c 20 26 70 43 68 6f 6d  P_SEGDIR, &pChom
247d0 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  p, 0);.    if( r
247e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
247f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
24800 6e 64 5f 69 6e 74 36 34 28 70 43 68 6f 6d 70 2c  nd_int64(pChomp,
24810 20 31 2c 20 69 4e 65 77 53 74 61 72 74 29 3b 0a   1, iNewStart);.
24820 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
24830 6e 64 5f 62 6c 6f 62 28 70 43 68 6f 6d 70 2c 20  nd_blob(pChomp, 
24840 32 2c 20 72 6f 6f 74 2e 61 2c 20 72 6f 6f 74 2e  2, root.a, root.
24850 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  n, SQLITE_STATIC
24860 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24870 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 43 68 6f  _bind_int64(pCho
24880 6d 70 2c 20 33 2c 20 69 41 62 73 4c 65 76 65 6c  mp, 3, iAbsLevel
24890 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
248a0 5f 62 69 6e 64 5f 69 6e 74 28 70 43 68 6f 6d 70  _bind_int(pChomp
248b0 2c 20 34 2c 20 69 49 64 78 29 3b 0a 20 20 20 20  , 4, iIdx);.    
248c0 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
248d0 43 68 6f 6d 70 29 3b 0a 20 20 20 20 20 20 72 63  Chomp);.      rc
248e0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
248f0 28 70 43 68 6f 6d 70 29 3b 0a 20 20 20 20 7d 0a  (pChomp);.    }.
24900 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66    }..  sqlite3_f
24910 72 65 65 28 72 6f 6f 74 2e 61 29 3b 0a 20 20 73  ree(root.a);.  s
24920 71 6c 69 74 65 33 5f 66 72 65 65 28 62 6c 6f 63  qlite3_free(bloc
24930 6b 2e 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  k.a);.  return r
24940 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
24950 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
24960 6c 65 64 20 61 66 74 65 72 20 61 6e 20 69 6e 63  led after an inc
24970 72 6d 65 6e 74 61 6c 2d 6d 65 72 67 65 20 6f 70  rmental-merge op
24980 65 72 61 74 69 6f 6e 20 68 61 73 20 72 75 6e 20  eration has run 
24990 74 6f 0a 2a 2a 20 6d 65 72 67 65 20 28 6f 72 20  to.** merge (or 
249a0 70 61 72 74 69 61 6c 6c 79 20 6d 65 72 67 65 29  partially merge)
249b0 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 67   two or more seg
249c0 6d 65 6e 74 73 20 66 72 6f 6d 20 61 62 73 6f 6c  ments from absol
249d0 75 74 65 20 6c 65 76 65 6c 0a 2a 2a 20 69 41 62  ute level.** iAb
249e0 73 4c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 45 61  sLevel..**.** Ea
249f0 63 68 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  ch input segment
24a00 20 69 73 20 65 69 74 68 65 72 20 72 65 6d 6f 76   is either remov
24a10 65 64 20 66 72 6f 6d 20 74 68 65 20 64 62 20 63  ed from the db c
24a20 6f 6d 70 6c 65 74 65 6c 79 20 28 69 66 20 61 6c  ompletely (if al
24a30 6c 20 6f 66 0a 2a 2a 20 69 74 73 20 64 61 74 61  l of.** its data
24a40 20 77 61 73 20 63 6f 70 69 65 64 20 74 6f 20 74   was copied to t
24a50 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e  he output segmen
24a60 74 20 62 79 20 74 68 65 20 69 6e 63 72 6d 65 72  t by the incrmer
24a70 67 65 20 6f 70 65 72 61 74 69 6f 6e 29 0a 2a 2a  ge operation).**
24a80 20 6f 72 20 6d 6f 64 69 66 69 65 64 20 69 6e 20   or modified in 
24a90 70 6c 61 63 65 20 73 6f 20 74 68 61 74 20 69 74  place so that it
24aa0 20 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f 6e 74 61   no longer conta
24ab0 69 6e 73 20 74 68 6f 73 65 20 65 6e 74 72 69 65  ins those entrie
24ac0 73 20 74 68 61 74 0a 2a 2a 20 68 61 76 65 20 62  s that.** have b
24ad0 65 65 6e 20 64 75 70 6c 69 63 61 74 65 64 20 69  een duplicated i
24ae0 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67  n the output seg
24af0 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
24b00 69 6e 74 20 66 74 73 33 49 6e 63 72 6d 65 72 67  int fts3Incrmerg
24b10 65 43 68 6f 6d 70 28 0a 20 20 46 74 73 33 54 61  eChomp(.  Fts3Ta
24b20 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
24b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
24b40 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   table handle */
24b50 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
24b60 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 20   iAbsLevel,     
24b70 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c     /* Absolute l
24b80 65 76 65 6c 20 63 6f 6e 74 61 69 6e 69 6e 67 20  evel containing 
24b90 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74  segments */.  Ft
24ba0 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
24bb0 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 2f 2a   *pCsr,       /*
24bc0 20 43 68 6f 6d 70 20 61 6c 6c 20 73 65 67 6d 65   Chomp all segme
24bd0 6e 74 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68  nts opened by th
24be0 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69  is cursor */.  i
24bf0 6e 74 20 2a 70 6e 52 65 6d 20 20 20 20 20 20 20  nt *pnRem       
24c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24c10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  * Number of segm
24c20 65 6e 74 73 20 6e 6f 74 20 64 65 6c 65 74 65 64  ents not deleted
24c30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
24c40 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 30 3b 0a    int nRem = 0;.
24c50 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
24c60 45 5f 4f 4b 3b 0a 0a 20 20 66 6f 72 28 69 3d 70  E_OK;..  for(i=p
24c70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 2d 31 3b  Csr->nSegment-1;
24c80 20 69 3e 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c   i>=0 && rc==SQL
24c90 49 54 45 5f 4f 4b 3b 20 69 2d 2d 29 7b 0a 20 20  ITE_OK; i--){.  
24ca0 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
24cb0 2a 70 53 65 67 20 3d 20 30 3b 0a 20 20 20 20 69  *pSeg = 0;.    i
24cc0 6e 74 20 6a 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  nt j;..    /* Fi
24cd0 6e 64 20 74 68 65 20 46 74 73 33 53 65 67 52 65  nd the Fts3SegRe
24ce0 61 64 65 72 20 6f 62 6a 65 63 74 20 77 69 74 68  ader object with
24cf0 20 46 74 73 33 53 65 67 52 65 61 64 65 72 2e 69   Fts3SegReader.i
24d00 49 64 78 3d 3d 69 2e 20 49 74 20 69 73 20 68 69  Idx==i. It is hi
24d10 64 69 6e 67 0a 20 20 20 20 2a 2a 20 73 6f 6d 65  ding.    ** some
24d20 77 68 65 72 65 20 69 6e 20 74 68 65 20 70 43 73  where in the pCs
24d30 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 5d 20 61  r->apSegment[] a
24d40 72 72 61 79 2e 20 20 2a 2f 0a 20 20 20 20 66 6f  rray.  */.    fo
24d50 72 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c  r(j=0; ALWAYS(j<
24d60 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 29 3b  pCsr->nSegment);
24d70 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 65   j++){.      pSe
24d80 67 20 3d 20 70 43 73 72 2d 3e 61 70 53 65 67 6d  g = pCsr->apSegm
24d90 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66  ent[j];.      if
24da0 28 20 70 53 65 67 2d 3e 69 49 64 78 3d 3d 69 20  ( pSeg->iIdx==i 
24db0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
24dc0 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 43 73     assert( j<pCs
24dd0 72 2d 3e 6e 53 65 67 6d 65 6e 74 20 26 26 20 70  r->nSegment && p
24de0 53 65 67 2d 3e 69 49 64 78 3d 3d 69 20 29 3b 0a  Seg->iIdx==i );.
24df0 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 61  .    if( pSeg->a
24e00 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Node==0 ){.     
24e10 20 2f 2a 20 53 65 67 2d 72 65 61 64 65 72 20 69   /* Seg-reader i
24e20 73 20 61 74 20 45 4f 46 2e 20 52 65 6d 6f 76 65  s at EOF. Remove
24e30 20 74 68 65 20 65 6e 74 69 72 65 20 69 6e 70 75   the entire inpu
24e40 74 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20  t segment. */.  
24e50 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 65 6c      rc = fts3Del
24e60 65 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 53  eteSegment(p, pS
24e70 65 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  eg);.      if( r
24e80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
24e90 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
24ea0 33 52 65 6d 6f 76 65 53 65 67 64 69 72 45 6e 74  3RemoveSegdirEnt
24eb0 72 79 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 2c  ry(p, iAbsLevel,
24ec0 20 70 53 65 67 2d 3e 69 49 64 78 29 3b 0a 20 20   pSeg->iIdx);.  
24ed0 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 6e 52      }.      *pnR
24ee0 65 6d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  em = 0;.    }els
24ef0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e{.      /* The 
24f00 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67  incremental merg
24f10 65 20 64 69 64 20 6e 6f 74 20 63 6f 70 79 20 61  e did not copy a
24f20 6c 6c 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d  ll the data from
24f30 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20   this .      ** 
24f40 73 65 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 75  segment to the u
24f50 70 70 65 72 20 6c 65 76 65 6c 2e 20 54 68 65 20  pper level. The 
24f60 73 65 67 6d 65 6e 74 20 69 73 20 6d 6f 64 69 66  segment is modif
24f70 69 65 64 20 69 6e 20 70 6c 61 63 65 0a 20 20 20  ied in place.   
24f80 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 69 74     ** so that it
24f90 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 6b 65 79   contains no key
24fa0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 7a  s smaller than z
24fb0 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 2a 2f 20 0a  Term/nTerm. */ .
24fc0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
24fd0 20 2a 7a 54 65 72 6d 20 3d 20 70 53 65 67 2d 3e   *zTerm = pSeg->
24fe0 7a 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74  zTerm;.      int
24ff0 20 6e 54 65 72 6d 20 3d 20 70 53 65 67 2d 3e 6e   nTerm = pSeg->n
25000 54 65 72 6d 3b 0a 20 20 20 20 20 20 72 63 20 3d  Term;.      rc =
25010 20 66 74 73 33 54 72 75 6e 63 61 74 65 53 65 67   fts3TruncateSeg
25020 6d 65 6e 74 28 70 2c 20 69 41 62 73 4c 65 76 65  ment(p, iAbsLeve
25030 6c 2c 20 70 53 65 67 2d 3e 69 49 64 78 2c 20 7a  l, pSeg->iIdx, z
25040 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20  Term, nTerm);.  
25050 20 20 20 20 6e 52 65 6d 2b 2b 3b 0a 20 20 20 20      nRem++;.    
25060 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  }.  }..  if( rc=
25070 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 52  =SQLITE_OK && nR
25080 65 6d 21 3d 70 43 73 72 2d 3e 6e 53 65 67 6d 65  em!=pCsr->nSegme
25090 6e 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  nt ){.    rc = f
250a0 74 73 33 52 65 70 61 63 6b 53 65 67 64 69 72 4c  ts3RepackSegdirL
250b0 65 76 65 6c 28 70 2c 20 69 41 62 73 4c 65 76 65  evel(p, iAbsLeve
250c0 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 52 65  l);.  }..  *pnRe
250d0 6d 20 3d 20 6e 52 65 6d 3b 0a 20 20 72 65 74 75  m = nRem;.  retu
250e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
250f0 53 74 6f 72 65 20 61 6e 20 69 6e 63 72 2d 6d 65  Store an incr-me
25100 72 67 65 20 68 69 6e 74 20 69 6e 20 74 68 65 20  rge hint in the 
25110 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
25120 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72  tic int fts3Incr
25130 6d 65 72 67 65 48 69 6e 74 53 74 6f 72 65 28 46  mergeHintStore(F
25140 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 42 6c 6f  ts3Table *p, Blo
25150 62 20 2a 70 48 69 6e 74 29 7b 0a 20 20 73 71 6c  b *pHint){.  sql
25160 69 74 65 33 5f 73 74 6d 74 20 2a 70 52 65 70 6c  ite3_stmt *pRepl
25170 61 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ace = 0;.  int r
25180 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
25190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
251a0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
251b0 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
251c0 28 70 2c 20 53 51 4c 5f 52 45 50 4c 41 43 45 5f  (p, SQL_REPLACE_
251d0 53 54 41 54 2c 20 26 70 52 65 70 6c 61 63 65 2c  STAT, &pReplace,
251e0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
251f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25200 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
25210 28 70 52 65 70 6c 61 63 65 2c 20 31 2c 20 46 54  (pReplace, 1, FT
25220 53 5f 53 54 41 54 5f 49 4e 43 52 4d 45 52 47 45  S_STAT_INCRMERGE
25230 48 49 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  HINT);.    sqlit
25240 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 52 65  e3_bind_blob(pRe
25250 70 6c 61 63 65 2c 20 32 2c 20 70 48 69 6e 74 2d  place, 2, pHint-
25260 3e 61 2c 20 70 48 69 6e 74 2d 3e 6e 2c 20 53 51  >a, pHint->n, SQ
25270 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
25280 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
25290 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20 72 63  Replace);.    rc
252a0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
252b0 28 70 52 65 70 6c 61 63 65 29 3b 0a 20 20 7d 0a  (pReplace);.  }.
252c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
252d0 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 61 6e 20 69  ./*.** Load an i
252e0 6e 63 72 2d 6d 65 72 67 65 20 68 69 6e 74 20 66  ncr-merge hint f
252f0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
25300 2e 20 54 68 65 20 69 6e 63 72 2d 6d 65 72 67 65  . The incr-merge
25310 20 68 69 6e 74 2c 20 69 66 20 6f 6e 65 20 0a 2a   hint, if one .*
25320 2a 20 65 78 69 73 74 73 2c 20 69 73 20 73 74 6f  * exists, is sto
25330 72 65 64 20 69 6e 20 74 68 65 20 72 6f 77 69 64  red in the rowid
25340 3d 3d 31 20 72 6f 77 20 6f 66 20 74 68 65 20 25  ==1 row of the %
25350 5f 73 74 61 74 20 74 61 62 6c 65 2e 0a 2a 2a 0a  _stat table..**.
25360 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
25370 2c 20 70 6f 70 75 6c 61 74 65 20 62 6c 6f 62 20  , populate blob 
25380 2a 70 48 69 6e 74 20 77 69 74 68 20 74 68 65 20  *pHint with the 
25390 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
253a0 74 68 65 20 25 5f 73 74 61 74 0a 2a 2a 20 74 61  the %_stat.** ta
253b0 62 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ble and return S
253c0 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77  QLITE_OK. Otherw
253d0 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  ise, if an error
253e0 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
253f0 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72 72  an.** SQLite err
25400 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
25410 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72 6d  ic int fts3Incrm
25420 65 72 67 65 48 69 6e 74 4c 6f 61 64 28 46 74 73  ergeHintLoad(Fts
25430 33 54 61 62 6c 65 20 2a 70 2c 20 42 6c 6f 62 20  3Table *p, Blob 
25440 2a 70 48 69 6e 74 29 7b 0a 20 20 73 71 6c 69 74  *pHint){.  sqlit
25450 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74  e3_stmt *pSelect
25460 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
25470 0a 20 20 70 48 69 6e 74 2d 3e 6e 20 3d 20 30 3b  .  pHint->n = 0;
25480 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
25490 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43  tmt(p, SQL_SELEC
254a0 54 5f 53 54 41 54 2c 20 26 70 53 65 6c 65 63 74  T_STAT, &pSelect
254b0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
254c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
254d0 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 73 71   int rc2;.    sq
254e0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
254f0 53 65 6c 65 63 74 2c 20 31 2c 20 46 54 53 5f 53  Select, 1, FTS_S
25500 54 41 54 5f 49 4e 43 52 4d 45 52 47 45 48 49 4e  TAT_INCRMERGEHIN
25510 54 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  T);.    if( SQLI
25520 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
25530 73 74 65 70 28 70 53 65 6c 65 63 74 29 20 29 7b  step(pSelect) ){
25540 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
25550 72 20 2a 61 48 69 6e 74 20 3d 20 73 71 6c 69 74  r *aHint = sqlit
25560 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
25570 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
25580 20 20 69 6e 74 20 6e 48 69 6e 74 20 3d 20 73 71    int nHint = sq
25590 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
255a0 65 73 28 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  es(pSelect, 0);.
255b0 20 20 20 20 20 20 69 66 28 20 61 48 69 6e 74 20        if( aHint 
255c0 29 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 47  ){.        blobG
255d0 72 6f 77 42 75 66 66 65 72 28 70 48 69 6e 74 2c  rowBuffer(pHint,
255e0 20 6e 48 69 6e 74 2c 20 26 72 63 29 3b 0a 20 20   nHint, &rc);.  
255f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
25600 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25610 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 6e       memcpy(pHin
25620 74 2d 3e 61 2c 20 61 48 69 6e 74 2c 20 6e 48 69  t->a, aHint, nHi
25630 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  nt);.          p
25640 48 69 6e 74 2d 3e 6e 20 3d 20 6e 48 69 6e 74 3b  Hint->n = nHint;
25650 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25660 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 32   }.    }.    rc2
25670 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
25680 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69  (pSelect);.    i
25690 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
256a0 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d   ) rc = rc2;.  }
256b0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
256c0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20  ../*.** If *pRc 
256d0 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b  is not SQLITE_OK
256e0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
256f0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
25700 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  t is a no-op..**
25710 20 4f 74 68 65 72 77 69 73 65 2c 20 61 70 70 65   Otherwise, appe
25720 6e 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74  nd an entry to t
25730 68 65 20 68 69 6e 74 20 73 74 6f 72 65 64 20 69  he hint stored i
25740 6e 20 62 6c 6f 62 20 2a 70 48 69 6e 74 2e 20 45  n blob *pHint. E
25750 61 63 68 20 65 6e 74 72 79 0a 2a 2a 20 63 6f 6e  ach entry.** con
25760 73 69 73 74 73 20 6f 66 20 74 77 6f 20 76 61 72  sists of two var
25770 69 6e 74 73 2c 20 74 68 65 20 61 62 73 6f 6c 75  ints, the absolu
25780 74 65 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20  te level number 
25790 6f 66 20 74 68 65 20 69 6e 70 75 74 20 73 65 67  of the input seg
257a0 6d 65 6e 74 73 20 0a 2a 2a 20 61 6e 64 20 74 68  ments .** and th
257b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75  e number of inpu
257c0 74 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  t segments..**.*
257d0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
257e0 20 6c 65 61 76 65 20 2a 70 52 63 20 73 65 74 20   leave *pRc set 
257f0 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  to SQLITE_OK and
25800 20 72 65 74 75 72 6e 2e 20 49 66 20 61 6e 20 65   return. If an e
25810 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
25820 73 65 74 20 2a 70 52 63 20 74 6f 20 61 6e 20 53  set *pRc to an S
25830 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
25840 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
25850 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
25860 64 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 48  d fts3IncrmergeH
25870 69 6e 74 50 75 73 68 28 0a 20 20 42 6c 6f 62 20  intPush(.  Blob 
25880 2a 70 48 69 6e 74 2c 20 20 20 20 20 20 20 20 20  *pHint,         
25890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 69             /* Hi
258a0 6e 74 20 62 6c 6f 62 20 74 6f 20 61 70 70 65 6e  nt blob to appen
258b0 64 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 69 41  d to */.  i64 iA
258c0 62 73 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20  bsLevel,        
258d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
258e0 73 74 20 76 61 72 69 6e 74 20 74 6f 20 73 74 6f  st varint to sto
258f0 72 65 20 69 6e 20 68 69 6e 74 20 2a 2f 0a 20 20  re in hint */.  
25900 69 6e 74 20 6e 49 6e 70 75 74 2c 20 20 20 20 20  int nInput,     
25910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25920 2f 2a 20 53 65 63 6f 6e 64 20 76 61 72 69 6e 74  /* Second varint
25930 20 74 6f 20 73 74 6f 72 65 20 69 6e 20 68 69 6e   to store in hin
25940 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63 20  t */.  int *pRc 
25950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25960 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
25970 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  : Error code */.
25980 29 7b 0a 20 20 62 6c 6f 62 47 72 6f 77 42 75 66  ){.  blobGrowBuf
25990 66 65 72 28 70 48 69 6e 74 2c 20 70 48 69 6e 74  fer(pHint, pHint
259a0 2d 3e 6e 20 2b 20 32 2a 46 54 53 33 5f 56 41 52  ->n + 2*FTS3_VAR
259b0 49 4e 54 5f 4d 41 58 2c 20 70 52 63 29 3b 0a 20  INT_MAX, pRc);. 
259c0 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
259d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 48 69 6e  E_OK ){.    pHin
259e0 74 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46  t->n += sqlite3F
259f0 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 48  ts3PutVarint(&pH
25a00 69 6e 74 2d 3e 61 5b 70 48 69 6e 74 2d 3e 6e 5d  int->a[pHint->n]
25a10 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20  , iAbsLevel);.  
25a20 20 20 70 48 69 6e 74 2d 3e 6e 20 2b 3d 20 73 71    pHint->n += sq
25a30 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69  lite3Fts3PutVari
25a40 6e 74 28 26 70 48 69 6e 74 2d 3e 61 5b 70 48 69  nt(&pHint->a[pHi
25a50 6e 74 2d 3e 6e 5d 2c 20 28 69 36 34 29 6e 49 6e  nt->n], (i64)nIn
25a60 70 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  put);.  }.}../*.
25a70 2a 2a 20 52 65 61 64 20 74 68 65 20 6c 61 73 74  ** Read the last
25a80 20 65 6e 74 72 79 20 28 6d 6f 73 74 20 72 65 63   entry (most rec
25a90 65 6e 74 6c 79 20 70 75 73 68 65 64 29 20 66 72  ently pushed) fr
25aa0 6f 6d 20 74 68 65 20 68 69 6e 74 20 62 6c 6f 62  om the hint blob
25ab0 20 2a 70 48 69 6e 74 0a 2a 2a 20 61 6e 64 20 74   *pHint.** and t
25ac0 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 65  hen remove the e
25ad0 6e 74 72 79 2e 20 57 72 69 74 65 20 74 68 65 20  ntry. Write the 
25ae0 74 77 6f 20 76 61 6c 75 65 73 20 72 65 61 64 20  two values read 
25af0 74 6f 20 2a 70 69 41 62 73 4c 65 76 65 6c 20 61  to *piAbsLevel a
25b00 6e 64 20 0a 2a 2a 20 2a 70 6e 49 6e 70 75 74 20  nd .** *pnInput 
25b10 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
25b20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72  ..**.** If no er
25b30 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
25b40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  rn SQLITE_OK. If
25b50 20 74 68 65 20 68 69 6e 74 20 62 6c 6f 62 20 69   the hint blob i
25b60 6e 20 2a 70 48 69 6e 74 20 64 6f 65 73 0a 2a 2a  n *pHint does.**
25b70 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 74 20   not contain at 
25b80 6c 65 61 73 74 20 74 77 6f 20 76 61 6c 69 64 20  least two valid 
25b90 76 61 72 69 6e 74 73 2c 20 72 65 74 75 72 6e 20  varints, return 
25ba0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56  SQLITE_CORRUPT_V
25bb0 54 41 42 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  TAB..*/.static i
25bc0 6e 74 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65  nt fts3Incrmerge
25bd0 48 69 6e 74 50 6f 70 28 42 6c 6f 62 20 2a 70 48  HintPop(Blob *pH
25be0 69 6e 74 2c 20 69 36 34 20 2a 70 69 41 62 73 4c  int, i64 *piAbsL
25bf0 65 76 65 6c 2c 20 69 6e 74 20 2a 70 6e 49 6e 70  evel, int *pnInp
25c00 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  ut){.  const int
25c10 20 6e 48 69 6e 74 20 3d 20 70 48 69 6e 74 2d 3e   nHint = pHint->
25c20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  n;.  int i;..  i
25c30 20 3d 20 70 48 69 6e 74 2d 3e 6e 2d 32 3b 0a 20   = pHint->n-2;. 
25c40 20 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20 28   while( i>0 && (
25c50 70 48 69 6e 74 2d 3e 61 5b 69 2d 31 5d 20 26 20  pHint->a[i-1] & 
25c60 30 78 38 30 29 20 29 20 69 2d 2d 3b 0a 20 20 77  0x80) ) i--;.  w
25c70 68 69 6c 65 28 20 69 3e 30 20 26 26 20 28 70 48  hile( i>0 && (pH
25c80 69 6e 74 2d 3e 61 5b 69 2d 31 5d 20 26 20 30 78  int->a[i-1] & 0x
25c90 38 30 29 20 29 20 69 2d 2d 3b 0a 0a 20 20 70 48  80) ) i--;..  pH
25ca0 69 6e 74 2d 3e 6e 20 3d 20 69 3b 0a 20 20 69 20  int->n = i;.  i 
25cb0 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65  += sqlite3Fts3Ge
25cc0 74 56 61 72 69 6e 74 28 26 70 48 69 6e 74 2d 3e  tVarint(&pHint->
25cd0 61 5b 69 5d 2c 20 70 69 41 62 73 4c 65 76 65 6c  a[i], piAbsLevel
25ce0 29 3b 0a 20 20 69 20 2b 3d 20 73 71 6c 69 74 65  );.  i += sqlite
25cf0 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 33 32  3Fts3GetVarint32
25d00 28 26 70 48 69 6e 74 2d 3e 61 5b 69 5d 2c 20 70  (&pHint->a[i], p
25d10 6e 49 6e 70 75 74 29 3b 0a 20 20 69 66 28 20 69  nInput);.  if( i
25d20 21 3d 6e 48 69 6e 74 20 29 20 72 65 74 75 72 6e  !=nHint ) return
25d30 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
25d40 56 54 41 42 3b 0a 0a 20 20 72 65 74 75 72 6e 20  VTAB;..  return 
25d50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
25d60 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 61 6e 20  *.** Attempt an 
25d70 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67  incremental merg
25d80 65 20 74 68 61 74 20 77 72 69 74 65 73 20 6e 4d  e that writes nM
25d90 65 72 67 65 20 6c 65 61 66 20 62 6c 6f 63 6b 73  erge leaf blocks
25da0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ..**.** Incremen
25db0 74 61 6c 20 6d 65 72 67 65 73 20 68 61 70 70 65  tal merges happe
25dc0 6e 20 6e 4d 69 6e 20 73 65 67 6d 65 6e 74 73 20  n nMin segments 
25dd0 61 74 20 61 20 74 69 6d 65 2e 20 54 68 65 20 74  at a time. The t
25de0 77 6f 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 74  wo.** segments t
25df0 6f 20 62 65 20 6d 65 72 67 65 64 20 61 72 65 20  o be merged are 
25e00 74 68 65 20 6e 4d 69 6e 20 6f 6c 64 65 73 74 20  the nMin oldest 
25e10 73 65 67 6d 65 6e 74 73 20 28 74 68 65 20 6f 6e  segments (the on
25e20 65 73 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 73  es with.** the s
25e30 6d 61 6c 6c 65 73 74 20 69 6e 64 65 78 65 73 29  mallest indexes)
25e40 20 69 6e 20 74 68 65 20 68 69 67 68 65 73 74 20   in the highest 
25e50 6c 65 76 65 6c 20 74 68 61 74 20 63 6f 6e 74 61  level that conta
25e60 69 6e 73 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  ins at least.** 
25e70 6e 4d 69 6e 20 73 65 67 6d 65 6e 74 73 2e 20 4d  nMin segments. M
25e80 75 6c 74 69 70 6c 65 20 6d 65 72 67 65 73 20 6d  ultiple merges m
25e90 69 67 68 74 20 6f 63 63 75 72 20 69 6e 20 61 6e  ight occur in an
25ea0 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
25eb0 65 20 74 68 65 20 0a 2a 2a 20 71 75 6f 74 61 20  e the .** quota 
25ec0 6f 66 20 6e 4d 65 72 67 65 20 6c 65 61 66 20 62  of nMerge leaf b
25ed0 6c 6f 63 6b 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  locks..*/.int sq
25ee0 6c 69 74 65 33 46 74 73 33 49 6e 63 72 6d 65 72  lite3Fts3Incrmer
25ef0 67 65 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  ge(Fts3Table *p,
25f00 20 69 6e 74 20 6e 4d 65 72 67 65 2c 20 69 6e 74   int nMerge, int
25f10 20 6e 4d 69 6e 29 7b 0a 20 20 69 6e 74 20 72 63   nMin){.  int rc
25f20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
25f40 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
25f50 74 20 6e 52 65 6d 20 3d 20 6e 4d 65 72 67 65 3b  t nRem = nMerge;
25f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25f70 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   Number of leaf 
25f80 70 61 67 65 73 20 79 65 74 20 74 6f 20 20 62 65  pages yet to  be
25f90 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 46 74   written */.  Ft
25fa0 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
25fb0 20 2a 70 43 73 72 3b 20 20 20 20 20 20 20 2f 2a   *pCsr;       /*
25fc0 20 43 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20   Cursor used to 
25fd0 72 65 61 64 20 69 6e 70 75 74 20 64 61 74 61 20  read input data 
25fe0 2a 2f 0a 20 20 46 74 73 33 53 65 67 46 69 6c 74  */.  Fts3SegFilt
25ff0 65 72 20 2a 70 46 69 6c 74 65 72 3b 20 20 20 20  er *pFilter;    
26000 20 20 20 20 20 2f 2a 20 46 69 6c 74 65 72 20 75       /* Filter u
26010 73 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  sed with cursor 
26020 70 43 73 72 20 2a 2f 0a 20 20 49 6e 63 72 6d 65  pCsr */.  Incrme
26030 72 67 65 57 72 69 74 65 72 20 2a 70 57 72 69 74  rgeWriter *pWrit
26040 65 72 3b 20 20 20 20 20 20 20 2f 2a 20 57 72 69  er;       /* Wri
26050 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
26060 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b 20 20 20  int nSeg = 0;   
26070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26080 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70  /* Number of inp
26090 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  ut segments */. 
260a0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
260b0 41 62 73 4c 65 76 65 6c 20 3d 20 30 3b 20 20 20  AbsLevel = 0;   
260c0 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65 76   /* Absolute lev
260d0 65 6c 20 6e 75 6d 62 65 72 20 74 6f 20 77 6f 72  el number to wor
260e0 6b 20 6f 6e 20 2a 2f 0a 20 20 42 6c 6f 62 20 68  k on */.  Blob h
260f0 69 6e 74 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b  int = {0, 0, 0};
26100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 69 6e            /* Hin
26110 74 20 72 65 61 64 20 66 72 6f 6d 20 25 5f 73 74  t read from %_st
26120 61 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  at table */.  in
26130 74 20 62 44 69 72 74 79 48 69 6e 74 20 3d 20 30  t bDirtyHint = 0
26140 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
26150 20 54 72 75 65 20 69 66 20 62 6c 6f 62 20 27 68   True if blob 'h
26160 69 6e 74 27 20 68 61 73 20 62 65 65 6e 20 6d 6f  int' has been mo
26170 64 69 66 69 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  dified */..  /* 
26180 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
26190 6f 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20 66  or the cursor, f
261a0 69 6c 74 65 72 20 61 6e 64 20 77 72 69 74 65 72  ilter and writer
261b0 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 63 6f   objects */.  co
261c0 6e 73 74 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d  nst int nAlloc =
261d0 20 73 69 7a 65 6f 66 28 2a 70 43 73 72 29 20 2b   sizeof(*pCsr) +
261e0 20 73 69 7a 65 6f 66 28 2a 70 46 69 6c 74 65 72   sizeof(*pFilter
261f0 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 57 72 69  ) + sizeof(*pWri
26200 74 65 72 29 3b 0a 20 20 70 57 72 69 74 65 72 20  ter);.  pWriter 
26210 3d 20 28 49 6e 63 72 6d 65 72 67 65 57 72 69 74  = (IncrmergeWrit
26220 65 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  er *)sqlite3_mal
26230 6c 6f 63 28 6e 41 6c 6c 6f 63 29 3b 0a 20 20 69  loc(nAlloc);.  i
26240 66 28 20 21 70 57 72 69 74 65 72 20 29 20 72 65  f( !pWriter ) re
26250 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
26260 4d 3b 0a 20 20 70 46 69 6c 74 65 72 20 3d 20 28  M;.  pFilter = (
26270 46 74 73 33 53 65 67 46 69 6c 74 65 72 20 2a 29  Fts3SegFilter *)
26280 26 70 57 72 69 74 65 72 5b 31 5d 3b 0a 20 20 70  &pWriter[1];.  p
26290 43 73 72 20 3d 20 28 46 74 73 33 4d 75 6c 74 69  Csr = (Fts3Multi
262a0 53 65 67 52 65 61 64 65 72 20 2a 29 26 70 46 69  SegReader *)&pFi
262b0 6c 74 65 72 5b 31 5d 3b 0a 0a 20 20 72 63 20 3d  lter[1];..  rc =
262c0 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 48 69   fts3IncrmergeHi
262d0 6e 74 4c 6f 61 64 28 70 2c 20 26 68 69 6e 74 29  ntLoad(p, &hint)
262e0 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
262f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 52 65 6d  QLITE_OK && nRem
26300 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  >0 ){.    const 
26310 69 36 34 20 6e 4d 6f 64 20 3d 20 46 54 53 33 5f  i64 nMod = FTS3_
26320 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 20  SEGDIR_MAXLEVEL 
26330 2a 20 70 2d 3e 6e 49 6e 64 65 78 3b 0a 20 20 20  * p->nIndex;.   
26340 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
26350 46 69 6e 64 4c 65 76 65 6c 20 3d 20 30 3b 20 2f  FindLevel = 0; /
26360 2a 20 53 51 4c 20 75 73 65 64 20 74 6f 20 64 65  * SQL used to de
26370 74 65 72 6d 69 6e 65 20 69 41 62 73 4c 65 76 65  termine iAbsLeve
26380 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 55 73  l */.    int bUs
26390 65 48 69 6e 74 20 3d 20 30 3b 20 20 20 20 20 20  eHint = 0;      
263a0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
263b0 66 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  f attempting to 
263c0 61 70 70 65 6e 64 20 2a 2f 0a 0a 20 20 20 20 2f  append */..    /
263d0 2a 20 53 65 61 72 63 68 20 74 68 65 20 25 5f 73  * Search the %_s
263e0 65 67 64 69 72 20 74 61 62 6c 65 20 66 6f 72 20  egdir table for 
263f0 74 68 65 20 61 62 73 6f 6c 75 74 65 20 6c 65 76  the absolute lev
26400 65 6c 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c  el with the smal
26410 6c 65 73 74 0a 20 20 20 20 2a 2a 20 72 65 6c 61  lest.    ** rela
26420 74 69 76 65 20 6c 65 76 65 6c 20 6e 75 6d 62 65  tive level numbe
26430 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  r that contains 
26440 61 74 20 6c 65 61 73 74 20 6e 4d 69 6e 20 73 65  at least nMin se
26450 67 6d 65 6e 74 73 2c 20 69 66 20 61 6e 79 2e 0a  gments, if any..
26460 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 69 73      ** If one is
26470 20 66 6f 75 6e 64 2c 20 73 65 74 20 69 41 62 73   found, set iAbs
26480 4c 65 76 65 6c 20 74 6f 20 74 68 65 20 61 62 73  Level to the abs
26490 6f 6c 75 74 65 20 6c 65 76 65 6c 20 6e 75 6d 62  olute level numb
264a0 65 72 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6e 53  er and.    ** nS
264b0 65 67 20 74 6f 20 6e 4d 69 6e 2e 20 49 66 20 6e  eg to nMin. If n
264c0 6f 20 6c 65 76 65 6c 20 77 69 74 68 20 61 74 20  o level with at 
264d0 6c 65 61 73 74 20 6e 4d 69 6e 20 73 65 67 6d 65  least nMin segme
264e0 6e 74 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  nts can be found
264f0 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 6e 53  , .    ** set nS
26500 65 67 20 74 6f 20 2d 31 2e 0a 20 20 20 20 2a 2f  eg to -1..    */
26510 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71  .    rc = fts3Sq
26520 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 46 49 4e  lStmt(p, SQL_FIN
26530 44 5f 4d 45 52 47 45 5f 4c 45 56 45 4c 2c 20 26  D_MERGE_LEVEL, &
26540 70 46 69 6e 64 4c 65 76 65 6c 2c 20 30 29 3b 0a  pFindLevel, 0);.
26550 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
26560 5f 69 6e 74 28 70 46 69 6e 64 4c 65 76 65 6c 2c  _int(pFindLevel,
26570 20 31 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 69   1, nMin);.    i
26580 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  f( sqlite3_step(
26590 70 46 69 6e 64 4c 65 76 65 6c 29 3d 3d 53 51 4c  pFindLevel)==SQL
265a0 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
265b0 20 69 41 62 73 4c 65 76 65 6c 20 3d 20 73 71 6c   iAbsLevel = sql
265c0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
265d0 34 28 70 46 69 6e 64 4c 65 76 65 6c 2c 20 30 29  4(pFindLevel, 0)
265e0 3b 0a 20 20 20 20 20 20 6e 53 65 67 20 3d 20 6e  ;.      nSeg = n
265f0 4d 69 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Min;.    }else{.
26600 20 20 20 20 20 20 6e 53 65 67 20 3d 20 2d 31 3b        nSeg = -1;
26610 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
26620 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 46  sqlite3_reset(pF
26630 69 6e 64 4c 65 76 65 6c 29 3b 0a 0a 20 20 20 20  indLevel);..    
26640 2f 2a 20 49 66 20 74 68 65 20 68 69 6e 74 20 72  /* If the hint r
26650 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 73  ead from the %_s
26660 74 61 74 20 74 61 62 6c 65 20 69 73 20 6e 6f 74  tat table is not
26670 20 65 6d 70 74 79 2c 20 63 68 65 63 6b 20 69 66   empty, check if
26680 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61 73 74   the.    ** last
26690 20 65 6e 74 72 79 20 69 6e 20 69 74 20 73 70 65   entry in it spe
266a0 63 69 66 69 65 73 20 61 20 72 65 6c 61 74 69 76  cifies a relativ
266b0 65 20 6c 65 76 65 6c 20 73 6d 61 6c 6c 65 72 20  e level smaller 
266c0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 20 20  than or equal.  
266d0 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 65 76 65    ** to the leve
266e0 6c 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  l identified by 
266f0 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 20  the block above 
26700 28 69 66 20 61 6e 79 29 2e 20 49 66 20 73 6f 2c  (if any). If so,
26710 20 74 68 69 73 20 0a 20 20 20 20 2a 2a 20 69 74   this .    ** it
26720 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  eration of the l
26730 6f 6f 70 20 77 69 6c 6c 20 77 6f 72 6b 20 6f 6e  oop will work on
26740 20 6d 65 72 67 69 6e 67 20 61 74 20 74 68 65 20   merging at the 
26750 68 69 6e 74 65 64 20 6c 65 76 65 6c 2e 0a 20 20  hinted level..  
26760 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
26770 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 68 69  =SQLITE_OK && hi
26780 6e 74 2e 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e  nt.n ){.      in
26790 74 20 6e 48 69 6e 74 20 3d 20 68 69 6e 74 2e 6e  t nHint = hint.n
267a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
267b0 69 6e 74 36 34 20 69 48 69 6e 74 41 62 73 4c 65  int64 iHintAbsLe
267c0 76 65 6c 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  vel = 0;      /*
267d0 20 48 69 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20   Hint level */. 
267e0 20 20 20 20 20 69 6e 74 20 6e 48 69 6e 74 53 65       int nHintSe
267f0 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
26800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 69             /* Hi
26810 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67  nt number of seg
26820 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 20 20 20 20  ments */..      
26830 72 63 20 3d 20 66 74 73 33 49 6e 63 72 6d 65 72  rc = fts3Incrmer
26840 67 65 48 69 6e 74 50 6f 70 28 26 68 69 6e 74 2c  geHintPop(&hint,
26850 20 26 69 48 69 6e 74 41 62 73 4c 65 76 65 6c 2c   &iHintAbsLevel,
26860 20 26 6e 48 69 6e 74 53 65 67 29 3b 0a 20 20 20   &nHintSeg);.   
26870 20 20 20 69 66 28 20 6e 53 65 67 3c 30 20 7c 7c     if( nSeg<0 ||
26880 20 28 69 41 62 73 4c 65 76 65 6c 20 25 20 6e 4d   (iAbsLevel % nM
26890 6f 64 29 20 3e 3d 20 28 69 48 69 6e 74 41 62 73  od) >= (iHintAbs
268a0 4c 65 76 65 6c 20 25 20 6e 4d 6f 64 29 20 29 7b  Level % nMod) ){
268b0 0a 20 20 20 20 20 20 20 20 69 41 62 73 4c 65 76  .        iAbsLev
268c0 65 6c 20 3d 20 69 48 69 6e 74 41 62 73 4c 65 76  el = iHintAbsLev
268d0 65 6c 3b 0a 20 20 20 20 20 20 20 20 6e 53 65 67  el;.        nSeg
268e0 20 3d 20 6e 48 69 6e 74 53 65 67 3b 0a 20 20 20   = nHintSeg;.   
268f0 20 20 20 20 20 62 55 73 65 48 69 6e 74 20 3d 20       bUseHint = 
26900 31 3b 0a 20 20 20 20 20 20 20 20 62 44 69 72 74  1;.        bDirt
26910 79 48 69 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20  yHint = 1;.     
26920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26930 2f 2a 20 54 68 69 73 20 75 6e 64 6f 65 73 20 74  /* This undoes t
26940 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 65  he effect of the
26950 20 48 69 6e 74 50 6f 70 28 29 20 61 62 6f 76 65   HintPop() above
26960 20 2d 20 73 6f 20 74 68 61 74 20 6e 6f 20 65 6e   - so that no en
26970 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  try.        ** i
26980 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
26990 68 65 20 68 69 6e 74 20 62 6c 6f 62 2e 20 20 2a  he hint blob.  *
269a0 2f 0a 20 20 20 20 20 20 20 20 68 69 6e 74 2e 6e  /.        hint.n
269b0 20 3d 20 6e 48 69 6e 74 3b 0a 20 20 20 20 20 20   = nHint;.      
269c0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
269d0 49 66 20 6e 53 65 67 20 69 73 20 6c 65 73 73 20  If nSeg is less 
269e0 74 68 61 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20  that zero, then 
269f0 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 65 76 65  there is no leve
26a00 6c 20 77 69 74 68 20 61 74 20 6c 65 61 73 74 0a  l with at least.
26a10 20 20 20 20 2a 2a 20 6e 4d 69 6e 20 73 65 67 6d      ** nMin segm
26a20 65 6e 74 73 20 61 6e 64 20 6e 6f 20 68 69 6e 74  ents and no hint
26a30 20 69 6e 20 74 68 65 20 25 5f 73 74 61 74 20 74   in the %_stat t
26a40 61 62 6c 65 2e 20 4e 6f 20 77 6f 72 6b 20 74 6f  able. No work to
26a50 20 64 6f 2e 0a 20 20 20 20 2a 2a 20 45 78 69 74   do..    ** Exit
26a60 20 65 61 72 6c 79 20 69 6e 20 74 68 69 73 20 63   early in this c
26a70 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ase.  */.    if(
26a80 20 6e 53 65 67 3c 30 20 29 20 62 72 65 61 6b 3b   nSeg<0 ) break;
26a90 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20  ..    /* Open a 
26aa0 63 75 72 73 6f 72 20 74 6f 20 69 74 65 72 61 74  cursor to iterat
26ab0 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f  e through the co
26ac0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6f 6c  ntents of the ol
26ad0 64 65 73 74 20 6e 53 65 67 20 0a 20 20 20 20 2a  dest nSeg .    *
26ae0 2a 20 69 6e 64 65 78 65 73 20 6f 66 20 61 62 73  * indexes of abs
26af0 6f 6c 75 74 65 20 6c 65 76 65 6c 20 69 41 62 73  olute level iAbs
26b00 4c 65 76 65 6c 2e 20 49 66 20 74 68 69 73 20 63  Level. If this c
26b10 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64 20  ursor is opened 
26b20 75 73 69 6e 67 20 0a 20 20 20 20 2a 2a 20 74 68  using .    ** th
26b30 65 20 27 68 69 6e 74 27 20 70 61 72 61 6d 65 74  e 'hint' paramet
26b40 65 72 73 2c 20 69 74 20 69 73 20 70 6f 73 73 69  ers, it is possi
26b50 62 6c 65 20 74 68 61 74 20 74 68 65 72 65 20 61  ble that there a
26b60 72 65 20 6c 65 73 73 20 74 68 61 6e 20 6e 53 65  re less than nSe
26b70 67 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74  g.    ** segment
26b80 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 6c  s available in l
26b90 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c 2e 20  evel iAbsLevel. 
26ba0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 6e 6f  In this case, no
26bb0 20 77 6f 72 6b 20 69 73 0a 20 20 20 20 2a 2a 20   work is.    ** 
26bc0 64 6f 6e 65 20 6f 6e 20 69 41 62 73 4c 65 76 65  done on iAbsLeve
26bd0 6c 20 2d 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  l - fall through
26be0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65   to the next ite
26bf0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f  ration of the lo
26c00 6f 70 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 74  op .    ** to st
26c10 61 72 74 20 77 6f 72 6b 20 6f 6e 20 73 6f 6d 65  art work on some
26c20 20 6f 74 68 65 72 20 6c 65 76 65 6c 2e 20 20 2a   other level.  *
26c30 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 57 72  /.    memset(pWr
26c40 69 74 65 72 2c 20 30 2c 20 6e 41 6c 6c 6f 63 29  iter, 0, nAlloc)
26c50 3b 0a 20 20 20 20 70 46 69 6c 74 65 72 2d 3e 66  ;.    pFilter->f
26c60 6c 61 67 73 20 3d 20 46 54 53 33 5f 53 45 47 4d  lags = FTS3_SEGM
26c70 45 4e 54 5f 52 45 51 55 49 52 45 5f 50 4f 53 3b  ENT_REQUIRE_POS;
26c80 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
26c90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26ca0 72 63 20 3d 20 66 74 73 33 49 6e 63 72 6d 65 72  rc = fts3Incrmer
26cb0 67 65 43 73 72 28 70 2c 20 69 41 62 73 4c 65 76  geCsr(p, iAbsLev
26cc0 65 6c 2c 20 6e 53 65 67 2c 20 70 43 73 72 29 3b  el, nSeg, pCsr);
26cd0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
26ce0 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20  QLITE_OK==rc && 
26cf0 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d  pCsr->nSegment==
26d00 6e 53 65 67 0a 20 20 20 20 20 26 26 20 53 51 4c  nSeg.     && SQL
26d10 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71  ITE_OK==(rc = sq
26d20 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64  lite3Fts3SegRead
26d30 65 72 53 74 61 72 74 28 70 2c 20 70 43 73 72 2c  erStart(p, pCsr,
26d40 20 70 46 69 6c 74 65 72 29 29 0a 20 20 20 20 20   pFilter)).     
26d50 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 28  && SQLITE_ROW==(
26d60 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
26d70 53 65 67 52 65 61 64 65 72 53 74 65 70 28 70 2c  SegReaderStep(p,
26d80 20 70 43 73 72 29 29 0a 20 20 20 20 29 7b 0a 20   pCsr)).    ){. 
26d90 20 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20       int iIdx = 
26da0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
26db0 20 2f 2a 20 4c 61 72 67 65 73 74 20 69 64 78 20   /* Largest idx 
26dc0 69 6e 20 6c 65 76 65 6c 20 28 69 41 62 73 4c 65  in level (iAbsLe
26dd0 76 65 6c 2b 31 29 20 2a 2f 0a 20 20 20 20 20 20  vel+1) */.      
26de0 72 63 20 3d 20 66 74 73 33 49 6e 63 72 6d 65 72  rc = fts3Incrmer
26df0 67 65 4f 75 74 70 75 74 49 64 78 28 70 2c 20 69  geOutputIdx(p, i
26e00 41 62 73 4c 65 76 65 6c 2c 20 26 69 49 64 78 29  AbsLevel, &iIdx)
26e10 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
26e20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26e30 20 20 20 20 20 69 66 28 20 62 55 73 65 48 69 6e       if( bUseHin
26e40 74 20 26 26 20 69 49 64 78 3e 30 20 29 7b 0a 20  t && iIdx>0 ){. 
26e50 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
26e60 68 61 72 20 2a 7a 4b 65 79 20 3d 20 70 43 73 72  har *zKey = pCsr
26e70 2d 3e 7a 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  ->zTerm;.       
26e80 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 43     int nKey = pC
26e90 73 72 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20  sr->nTerm;.     
26ea0 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e       rc = fts3In
26eb0 63 72 6d 65 72 67 65 4c 6f 61 64 28 70 2c 20 69  crmergeLoad(p, i
26ec0 41 62 73 4c 65 76 65 6c 2c 20 69 49 64 78 2d 31  AbsLevel, iIdx-1
26ed0 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 57  , zKey, nKey, pW
26ee0 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  riter);.        
26ef0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
26f00 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72 6d 65   rc = fts3Incrme
26f10 72 67 65 57 72 69 74 65 72 28 70 2c 20 69 41 62  rgeWriter(p, iAb
26f20 73 4c 65 76 65 6c 2c 20 69 49 64 78 2c 20 70 43  sLevel, iIdx, pC
26f30 73 72 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  sr, pWriter);.  
26f40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
26f50 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
26f60 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 57 72 69  QLITE_OK && pWri
26f70 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74 20 29 7b  ter->nLeafEst ){
26f80 0a 20 20 20 20 20 20 20 20 66 74 73 33 4c 6f 67  .        fts3Log
26f90 4d 65 72 67 65 28 6e 53 65 67 2c 20 69 41 62 73  Merge(nSeg, iAbs
26fa0 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 20 20  Level);.        
26fb0 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72  do {.          r
26fc0 63 20 3d 20 66 74 73 33 49 6e 63 72 6d 65 72 67  c = fts3Incrmerg
26fd0 65 41 70 70 65 6e 64 28 70 2c 20 70 57 72 69 74  eAppend(p, pWrit
26fe0 65 72 2c 20 70 43 73 72 29 3b 0a 20 20 20 20 20  er, pCsr);.     
26ff0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
27000 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71  ITE_OK ) rc = sq
27010 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64  lite3Fts3SegRead
27020 65 72 53 74 65 70 28 70 2c 20 70 43 73 72 29 3b  erStep(p, pCsr);
27030 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
27040 57 72 69 74 65 72 2d 3e 6e 57 6f 72 6b 3e 3d 6e  Writer->nWork>=n
27050 52 65 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  Rem && rc==SQLIT
27060 45 5f 52 4f 57 20 29 20 72 63 20 3d 20 53 51 4c  E_ROW ) rc = SQL
27070 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
27080 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
27090 54 45 5f 52 4f 57 20 29 3b 0a 0a 20 20 20 20 20  TE_ROW );..     
270a0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 6f 72 20     /* Update or 
270b0 64 65 6c 65 74 65 20 74 68 65 20 69 6e 70 75 74  delete the input
270c0 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   segments */.   
270d0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
270e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
270f0 20 20 20 20 6e 52 65 6d 20 2d 3d 20 28 31 20 2b      nRem -= (1 +
27100 20 70 57 72 69 74 65 72 2d 3e 6e 57 6f 72 6b 29   pWriter->nWork)
27110 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
27120 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 43 68   fts3IncrmergeCh
27130 6f 6d 70 28 70 2c 20 69 41 62 73 4c 65 76 65 6c  omp(p, iAbsLevel
27140 2c 20 70 43 73 72 2c 20 26 6e 53 65 67 29 3b 0a  , pCsr, &nSeg);.
27150 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 53            if( nS
27160 65 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  eg!=0 ){.       
27170 20 20 20 20 20 62 44 69 72 74 79 48 69 6e 74 20       bDirtyHint 
27180 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
27190 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 48 69   fts3IncrmergeHi
271a0 6e 74 50 75 73 68 28 26 68 69 6e 74 2c 20 69 41  ntPush(&hint, iA
271b0 62 73 4c 65 76 65 6c 2c 20 6e 53 65 67 2c 20 26  bsLevel, nSeg, &
271c0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rc);.          }
271d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
271e0 20 7d 0a 0a 20 20 20 20 20 20 66 74 73 33 49 6e   }..      fts3In
271f0 63 72 6d 65 72 67 65 52 65 6c 65 61 73 65 28 70  crmergeRelease(p
27200 2c 20 70 57 72 69 74 65 72 2c 20 26 72 63 29 3b  , pWriter, &rc);
27210 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
27220 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72  te3Fts3SegReader
27230 46 69 6e 69 73 68 28 70 43 73 72 29 3b 0a 20 20  Finish(pCsr);.  
27240 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  }..  /* Write th
27250 65 20 68 69 6e 74 20 76 61 6c 75 65 73 20 69 6e  e hint values in
27260 74 6f 20 74 68 65 20 25 5f 73 74 61 74 20 74 61  to the %_stat ta
27270 62 6c 65 20 66 6f 72 20 74 68 65 20 6e 65 78 74  ble for the next
27280 20 69 6e 63 72 2d 6d 65 72 67 65 72 20 2a 2f 0a   incr-merger */.
27290 20 20 69 66 28 20 62 44 69 72 74 79 48 69 6e 74    if( bDirtyHint
272a0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
272b0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  K ){.    rc = ft
272c0 73 33 49 6e 63 72 6d 65 72 67 65 48 69 6e 74 53  s3IncrmergeHintS
272d0 74 6f 72 65 28 70 2c 20 26 68 69 6e 74 29 3b 0a  tore(p, &hint);.
272e0 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66    }..  sqlite3_f
272f0 72 65 65 28 70 57 72 69 74 65 72 29 3b 0a 20 20  ree(pWriter);.  
27300 73 71 6c 69 74 65 33 5f 66 72 65 65 28 68 69 6e  sqlite3_free(hin
27310 74 2e 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  t.a);.  return r
27320 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  c;.}../*.** Conv
27330 65 72 74 20 74 68 65 20 74 65 78 74 20 62 65 67  ert the text beg
27340 69 6e 6e 69 6e 67 20 61 74 20 2a 70 7a 20 69 6e  inning at *pz in
27350 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e  to an integer an
27360 64 20 72 65 74 75 72 6e 0a 2a 2a 20 69 74 73 20  d return.** its 
27370 76 61 6c 75 65 2e 20 20 41 64 76 61 6e 63 65 20  value.  Advance 
27380 2a 70 7a 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  *pz to point to 
27390 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63  the first charac
273a0 74 65 72 20 70 61 73 74 0a 2a 2a 20 74 68 65 20  ter past.** the 
273b0 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74  integer..*/.stat
273c0 69 63 20 69 6e 74 20 66 74 73 33 47 65 74 69 6e  ic int fts3Getin
273d0 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70  t(const char **p
273e0 7a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  z){.  const char
273f0 20 2a 7a 20 3d 20 2a 70 7a 3b 0a 20 20 69 6e 74   *z = *pz;.  int
27400 20 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28   i = 0;.  while(
27410 20 28 2a 7a 29 3e 3d 27 30 27 20 26 26 20 28 2a   (*z)>='0' && (*
27420 7a 29 3c 3d 27 39 27 20 29 20 69 20 3d 20 31 30  z)<='9' ) i = 10
27430 2a 69 20 2b 20 2a 28 7a 2b 2b 29 20 2d 20 27 30  *i + *(z++) - '0
27440 27 3b 0a 20 20 2a 70 7a 20 3d 20 7a 3b 0a 20 20  ';.  *pz = z;.  
27450 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a  return i;.}../*.
27460 2a 2a 20 50 72 6f 63 65 73 73 20 73 74 61 74 65  ** Process state
27470 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72  ments of the for
27480 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49 4e 53 45  m:.**.**    INSE
27490 52 54 20 49 4e 54 4f 20 74 61 62 6c 65 28 74 61  RT INTO table(ta
274a0 62 6c 65 29 20 56 41 4c 55 45 53 28 27 6d 65 72  ble) VALUES('mer
274b0 67 65 3d 41 2c 42 27 29 3b 0a 2a 2a 0a 2a 2a 20  ge=A,B');.**.** 
274c0 41 20 61 6e 64 20 42 20 61 72 65 20 69 6e 74 65  A and B are inte
274d0 67 65 72 73 20 74 68 61 74 20 64 65 63 6f 64 65  gers that decode
274e0 20 74 6f 20 62 65 20 74 68 65 20 6e 75 6d 62 65   to be the numbe
274f0 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 0a  r of leaf pages.
27500 2a 2a 20 77 72 69 74 74 65 6e 20 66 6f 72 20 74  ** written for t
27510 68 65 20 6d 65 72 67 65 2c 20 61 6e 64 20 74 68  he merge, and th
27520 65 20 6d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72  e minimum number
27530 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20   of segments on 
27540 61 20 6c 65 76 65 6c 0a 2a 2a 20 62 65 66 6f 72  a level.** befor
27550 65 20 69 74 20 77 69 6c 6c 20 62 65 20 73 65 6c  e it will be sel
27560 65 63 74 65 64 20 66 6f 72 20 61 20 6d 65 72 67  ected for a merg
27570 65 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  e, respectively.
27580 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
27590 74 73 33 44 6f 49 6e 63 72 6d 65 72 67 65 28 0a  ts3DoIncrmerge(.
275a0 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
275b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275c0 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20    /* FTS3 table 
275d0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  handle */.  cons
275e0 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 20 20  t char *zParam  
275f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
27600 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
27610 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
27620 22 41 2c 42 22 20 2a 2f 0a 29 7b 0a 20 20 69 6e  "A,B" */.){.  in
27630 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e  t rc;.  int nMin
27640 20 3d 20 28 46 54 53 33 5f 4d 45 52 47 45 5f 43   = (FTS3_MERGE_C
27650 4f 55 4e 54 20 2f 20 32 29 3b 0a 20 20 69 6e 74  OUNT / 2);.  int
27660 20 6e 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 63   nMerge = 0;.  c
27670 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 7a  onst char *z = z
27680 50 61 72 61 6d 3b 0a 0a 20 20 2f 2a 20 52 65 61  Param;..  /* Rea
27690 64 20 74 68 65 20 66 69 72 73 74 20 69 6e 74 65  d the first inte
276a0 67 65 72 20 76 61 6c 75 65 20 2a 2f 0a 20 20 6e  ger value */.  n
276b0 4d 65 72 67 65 20 3d 20 66 74 73 33 47 65 74 69  Merge = fts3Geti
276c0 6e 74 28 26 7a 29 3b 0a 0a 20 20 2f 2a 20 49 66  nt(&z);..  /* If
276d0 20 74 68 65 20 66 69 72 73 74 20 69 6e 74 65 67   the first integ
276e0 65 72 20 76 61 6c 75 65 20 69 73 20 66 6f 6c 6c  er value is foll
276f0 6f 77 65 64 20 62 79 20 61 20 27 2c 27 2c 20 20  owed by a ',',  
27700 72 65 61 64 20 74 68 65 20 73 65 63 6f 6e 64 0a  read the second.
27710 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 76 61 6c    ** integer val
27720 75 65 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 5b 30  ue. */.  if( z[0
27730 5d 3d 3d 27 2c 27 20 26 26 20 7a 5b 31 5d 21 3d  ]==',' && z[1]!=
27740 27 5c 30 27 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b  '\0' ){.    z++;
27750 0a 20 20 20 20 6e 4d 69 6e 20 3d 20 66 74 73 33  .    nMin = fts3
27760 47 65 74 69 6e 74 28 26 7a 29 3b 0a 20 20 7d 0a  Getint(&z);.  }.
27770 0a 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 5c 30  .  if( z[0]!='\0
27780 27 20 7c 7c 20 6e 4d 69 6e 3c 32 20 29 7b 0a 20  ' || nMin<2 ){. 
27790 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
277a0 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RROR;.  }else{. 
277b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
277c0 4b 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 62  K;.    if( !p->b
277d0 48 61 73 53 74 61 74 20 29 7b 0a 20 20 20 20 20  HasStat ){.     
277e0 20 61 73 73 65 72 74 28 20 70 2d 3e 62 46 74 73   assert( p->bFts
277f0 34 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  4==0 );.      sq
27800 6c 69 74 65 33 46 74 73 33 43 72 65 61 74 65 53  lite3Fts3CreateS
27810 74 61 74 54 61 62 6c 65 28 26 72 63 2c 20 70 29  tatTable(&rc, p)
27820 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
27830 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27840 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
27850 74 65 33 46 74 73 33 49 6e 63 72 6d 65 72 67 65  te3Fts3Incrmerge
27860 28 70 2c 20 6e 4d 65 72 67 65 2c 20 6e 4d 69 6e  (p, nMerge, nMin
27870 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
27880 69 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73  ite3Fts3Segments
27890 43 6c 6f 73 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Close(p);.  }.  
278a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
278b0 0a 2a 2a 20 50 72 6f 63 65 73 73 20 73 74 61 74  .** Process stat
278c0 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 66 6f  ements of the fo
278d0 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49 4e 53  rm:.**.**    INS
278e0 45 52 54 20 49 4e 54 4f 20 74 61 62 6c 65 28 74  ERT INTO table(t
278f0 61 62 6c 65 29 20 56 41 4c 55 45 53 28 27 61 75  able) VALUES('au
27900 74 6f 6d 65 72 67 65 3d 58 27 29 3b 0a 2a 2a 0a  tomerge=X');.**.
27910 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 6e  ** where X is an
27920 20 69 6e 74 65 67 65 72 2e 20 20 58 3d 3d 30 20   integer.  X==0 
27930 6d 65 61 6e 73 20 74 6f 20 74 75 72 6e 20 61 75  means to turn au
27940 74 6f 6d 65 72 67 65 20 6f 66 66 2e 20 20 58 21  tomerge off.  X!
27950 3d 30 20 6d 65 61 6e 73 0a 2a 2a 20 74 75 72 6e  =0 means.** turn
27960 20 69 74 20 6f 6e 2e 20 20 54 68 65 20 73 65 74   it on.  The set
27970 74 69 6e 67 20 69 73 20 70 65 72 73 69 73 74 65  ting is persiste
27980 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
27990 74 20 66 74 73 33 44 6f 41 75 74 6f 69 6e 63 72  t fts3DoAutoincr
279a0 6d 65 72 67 65 28 0a 20 20 46 74 73 33 54 61 62  merge(.  Fts3Tab
279b0 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
279c0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33           /* FTS3
279d0 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   table handle */
279e0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
279f0 50 61 72 61 6d 20 20 20 20 20 20 20 20 20 20 20  Param           
27a00 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e     /* Nul-termin
27a10 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74  ated string cont
27a20 61 69 6e 69 6e 67 20 62 6f 6f 6c 65 61 6e 20 2a  aining boolean *
27a30 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
27a40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c  SQLITE_OK;.  sql
27a50 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
27a60 20 3d 20 30 3b 0a 20 20 70 2d 3e 62 41 75 74 6f   = 0;.  p->bAuto
27a70 69 6e 63 72 6d 65 72 67 65 20 3d 20 66 74 73 33  incrmerge = fts3
27a80 47 65 74 69 6e 74 28 26 7a 50 61 72 61 6d 29 21  Getint(&zParam)!
27a90 3d 30 3b 0a 20 20 69 66 28 20 21 70 2d 3e 62 48  =0;.  if( !p->bH
27aa0 61 73 53 74 61 74 20 29 7b 0a 20 20 20 20 61 73  asStat ){.    as
27ab0 73 65 72 74 28 20 70 2d 3e 62 46 74 73 34 3d 3d  sert( p->bFts4==
27ac0 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
27ad0 46 74 73 33 43 72 65 61 74 65 53 74 61 74 54 61  Fts3CreateStatTa
27ae0 62 6c 65 28 26 72 63 2c 20 70 29 3b 0a 20 20 20  ble(&rc, p);.   
27af0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
27b00 20 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20   rc;.  }.  rc = 
27b10 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
27b20 51 4c 5f 52 45 50 4c 41 43 45 5f 53 54 41 54 2c  QL_REPLACE_STAT,
27b30 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69   &pStmt, 0);.  i
27b40 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
27b50 63 3b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69  c;;.  sqlite3_bi
27b60 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 2c  nd_int(pStmt, 1,
27b70 20 46 54 53 5f 53 54 41 54 5f 41 55 54 4f 49 4e   FTS_STAT_AUTOIN
27b80 43 52 4d 45 52 47 45 29 3b 0a 20 20 73 71 6c 69  CRMERGE);.  sqli
27b90 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74  te3_bind_int(pSt
27ba0 6d 74 2c 20 32 2c 20 70 2d 3e 62 41 75 74 6f 69  mt, 2, p->bAutoi
27bb0 6e 63 72 6d 65 72 67 65 29 3b 0a 20 20 73 71 6c  ncrmerge);.  sql
27bc0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
27bd0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
27be0 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
27bf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27c00 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 36 34  *.** Return a 64
27c10 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 66 6f  -bit checksum fo
27c20 72 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20  r the FTS index 
27c30 65 6e 74 72 79 20 73 70 65 63 69 66 69 65 64 20  entry specified 
27c40 62 79 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65  by the.** argume
27c50 6e 74 73 20 74 6f 20 74 68 69 73 20 66 75 6e 63  nts to this func
27c60 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
27c70 75 36 34 20 66 74 73 33 43 68 65 63 6b 73 75 6d  u64 fts3Checksum
27c80 45 6e 74 72 79 28 0a 20 20 63 6f 6e 73 74 20 63  Entry(.  const c
27c90 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20  har *zTerm,     
27ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
27cb0 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f  ter to buffer co
27cc0 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d 20 2a 2f  ntaining term */
27cd0 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20  .  int nTerm,   
27ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27cf0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54     /* Size of zT
27d00 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  erm in bytes */.
27d10 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20    int iLangid,  
27d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d30 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64    /* Language id
27d40 20 66 6f 72 20 63 75 72 72 65 6e 74 20 72 6f 77   for current row
27d50 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 78   */.  int iIndex
27d60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27d70 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 28        /* Index (
27d80 30 2e 2e 46 74 73 33 54 61 62 6c 65 2e 6e 49 6e  0..Fts3Table.nIn
27d90 64 65 78 2d 31 29 20 2a 2f 0a 20 20 69 36 34 20  dex-1) */.  i64 
27da0 69 44 6f 63 69 64 2c 20 20 20 20 20 20 20 20 20  iDocid,         
27db0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
27dc0 6f 63 69 64 20 66 6f 72 20 63 75 72 72 65 6e 74  ocid for current
27dd0 20 72 6f 77 2e 20 2a 2f 0a 20 20 69 6e 74 20 69   row. */.  int i
27de0 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
27df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
27e00 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  lumn number */. 
27e10 20 69 6e 74 20 69 50 6f 73 20 20 20 20 20 20 20   int iPos       
27e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e30 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 2a 2f 0a   /* Position */.
27e40 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 36  ){.  int i;.  u6
27e50 34 20 72 65 74 20 3d 20 28 75 36 34 29 69 44 6f  4 ret = (u64)iDo
27e60 63 69 64 3b 0a 0a 20 20 72 65 74 20 2b 3d 20 28  cid;..  ret += (
27e70 72 65 74 3c 3c 33 29 20 2b 20 69 4c 61 6e 67 69  ret<<3) + iLangi
27e80 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74  d;.  ret += (ret
27e90 3c 3c 33 29 20 2b 20 69 49 6e 64 65 78 3b 0a 20  <<3) + iIndex;. 
27ea0 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29   ret += (ret<<3)
27eb0 20 2b 20 69 43 6f 6c 3b 0a 20 20 72 65 74 20 2b   + iCol;.  ret +
27ec0 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 50 6f  = (ret<<3) + iPo
27ed0 73 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  s;.  for(i=0; i<
27ee0 6e 54 65 72 6d 3b 20 69 2b 2b 29 20 72 65 74 20  nTerm; i++) ret 
27ef0 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 7a 54  += (ret<<3) + zT
27f00 65 72 6d 5b 69 5d 3b 0a 0a 20 20 72 65 74 75 72  erm[i];..  retur
27f10 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
27f20 52 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75  Return a checksu
27f30 6d 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73  m of all entries
27f40 20 69 6e 20 74 68 65 20 46 54 53 20 69 6e 64 65   in the FTS inde
27f50 78 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  x that correspon
27f60 64 20 74 6f 0a 2a 2a 20 6c 61 6e 67 75 61 67 65  d to.** language
27f70 20 69 64 20 69 4c 61 6e 67 69 64 2e 20 54 68 65   id iLangid. The
27f80 20 63 68 65 63 6b 73 75 6d 20 69 73 20 63 61 6c   checksum is cal
27f90 63 75 6c 61 74 65 64 20 62 79 20 58 4f 52 69 6e  culated by XORin
27fa0 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 0a  g the checksums.
27fb0 2a 2a 20 6f 66 20 65 61 63 68 20 69 6e 64 69 76  ** of each indiv
27fc0 69 64 75 61 6c 20 65 6e 74 72 79 20 28 73 65 65  idual entry (see
27fd0 20 66 74 73 33 43 68 65 63 6b 73 75 6d 45 6e 74   fts3ChecksumEnt
27fe0 72 79 28 29 29 20 74 6f 67 65 74 68 65 72 2e 0a  ry()) together..
27ff0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
28000 66 75 6c 2c 20 74 68 65 20 63 68 65 63 6b 73 75  ful, the checksu
28010 6d 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72  m value is retur
28020 6e 65 64 20 61 6e 64 20 2a 70 52 63 20 73 65 74  ned and *pRc set
28030 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a   to SQLITE_OK..*
28040 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
28050 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
28060 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20   *pRc is set to 
28070 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
28080 63 6f 64 65 2e 20 54 68 65 0a 2a 2a 20 72 65 74  code. The.** ret
28090 75 72 6e 20 76 61 6c 75 65 20 69 73 20 75 6e 64  urn value is und
280a0 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63  efined in this c
280b0 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ase..*/.static u
280c0 36 34 20 66 74 73 33 43 68 65 63 6b 73 75 6d 49  64 fts3ChecksumI
280d0 6e 64 65 78 28 0a 20 20 46 74 73 33 54 61 62 6c  ndex(.  Fts3Tabl
280e0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
280f0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20          /* FTS3 
28100 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
28110 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20    int iLangid,  
28120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28130 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64    /* Language id
28140 20 74 6f 20 72 65 74 75 72 6e 20 63 6b 73 75 6d   to return cksum
28150 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 49   for */.  int iI
28160 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
28170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
28180 65 78 20 74 6f 20 63 6b 73 75 6d 20 28 30 2e 2e  ex to cksum (0..
28190 70 2d 3e 6e 49 6e 64 65 78 2d 31 29 20 2a 2f 0a  p->nIndex-1) */.
281a0 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20 20 20    int *pRc      
281b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281c0 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
281d0 20 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 46 74   code */.){.  Ft
281e0 73 33 53 65 67 46 69 6c 74 65 72 20 66 69 6c 74  s3SegFilter filt
281f0 65 72 3b 0a 20 20 46 74 73 33 4d 75 6c 74 69 53  er;.  Fts3MultiS
28200 65 67 52 65 61 64 65 72 20 63 73 72 3b 0a 20 20  egReader csr;.  
28210 69 6e 74 20 72 63 3b 0a 20 20 75 36 34 20 63 6b  int rc;.  u64 ck
28220 73 75 6d 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  sum = 0;..  asse
28230 72 74 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  rt( *pRc==SQLITE
28240 5f 4f 4b 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74  _OK );..  memset
28250 28 26 66 69 6c 74 65 72 2c 20 30 2c 20 73 69 7a  (&filter, 0, siz
28260 65 6f 66 28 66 69 6c 74 65 72 29 29 3b 0a 20 20  eof(filter));.  
28270 6d 65 6d 73 65 74 28 26 63 73 72 2c 20 30 2c 20  memset(&csr, 0, 
28280 73 69 7a 65 6f 66 28 63 73 72 29 29 3b 0a 20 20  sizeof(csr));.  
28290 66 69 6c 74 65 72 2e 66 6c 61 67 73 20 3d 20 20  filter.flags =  
282a0 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 52 45 51  FTS3_SEGMENT_REQ
282b0 55 49 52 45 5f 50 4f 53 7c 46 54 53 33 5f 53 45  UIRE_POS|FTS3_SE
282c0 47 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d 50  GMENT_IGNORE_EMP
282d0 54 59 3b 0a 20 20 66 69 6c 74 65 72 2e 66 6c 61  TY;.  filter.fla
282e0 67 73 20 7c 3d 20 46 54 53 33 5f 53 45 47 4d 45  gs |= FTS3_SEGME
282f0 4e 54 5f 53 43 41 4e 3b 0a 0a 20 20 72 63 20 3d  NT_SCAN;..  rc =
28300 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
28310 65 61 64 65 72 43 75 72 73 6f 72 28 0a 20 20 20  eaderCursor(.   
28320 20 20 20 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69     p, iLangid, i
28330 49 6e 64 65 78 2c 20 46 54 53 33 5f 53 45 47 43  Index, FTS3_SEGC
28340 55 52 53 4f 52 5f 41 4c 4c 2c 20 30 2c 20 30 2c  URSOR_ALL, 0, 0,
28350 20 30 2c 20 31 2c 26 63 73 72 0a 20 20 29 3b 0a   0, 1,&csr.  );.
28360 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28370 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
28380 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
28390 61 64 65 72 53 74 61 72 74 28 70 2c 20 26 63 73  aderStart(p, &cs
283a0 72 2c 20 26 66 69 6c 74 65 72 29 3b 0a 20 20 7d  r, &filter);.  }
283b0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
283c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 77 68 69  TE_OK ){.    whi
283d0 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  le( SQLITE_ROW==
283e0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73  (rc = sqlite3Fts
283f0 33 53 65 67 52 65 61 64 65 72 53 74 65 70 28 70  3SegReaderStep(p
28400 2c 20 26 63 73 72 29 29 20 29 7b 0a 20 20 20 20  , &csr)) ){.    
28410 20 20 63 68 61 72 20 2a 70 43 73 72 20 3d 20 63    char *pCsr = c
28420 73 72 2e 61 44 6f 63 6c 69 73 74 3b 0a 20 20 20  sr.aDoclist;.   
28430 20 20 20 63 68 61 72 20 2a 70 45 6e 64 20 3d 20     char *pEnd = 
28440 26 70 43 73 72 5b 63 73 72 2e 6e 44 6f 63 6c 69  &pCsr[csr.nDocli
28450 73 74 5d 3b 0a 0a 20 20 20 20 20 20 69 36 34 20  st];..      i64 
28460 69 44 6f 63 69 64 20 3d 20 30 3b 0a 20 20 20 20  iDocid = 0;.    
28470 20 20 69 36 34 20 69 43 6f 6c 20 3d 20 30 3b 0a    i64 iCol = 0;.
28480 20 20 20 20 20 20 69 36 34 20 69 50 6f 73 20 3d        i64 iPos =
28490 20 30 3b 0a 0a 20 20 20 20 20 20 70 43 73 72 20   0;..      pCsr 
284a0 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65  += sqlite3Fts3Ge
284b0 74 56 61 72 69 6e 74 28 70 43 73 72 2c 20 26 69  tVarint(pCsr, &i
284c0 44 6f 63 69 64 29 3b 0a 20 20 20 20 20 20 77 68  Docid);.      wh
284d0 69 6c 65 28 20 70 43 73 72 3c 70 45 6e 64 20 29  ile( pCsr<pEnd )
284e0 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 56  {.        i64 iV
284f0 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  al = 0;.        
28500 70 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 46  pCsr += sqlite3F
28510 74 73 33 47 65 74 56 61 72 69 6e 74 28 70 43 73  ts3GetVarint(pCs
28520 72 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 20  r, &iVal);.     
28530 20 20 20 69 66 28 20 70 43 73 72 3c 70 45 6e 64     if( pCsr<pEnd
28540 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
28550 28 20 69 56 61 6c 3d 3d 30 20 7c 7c 20 69 56 61  ( iVal==0 || iVa
28560 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  l==1 ){.        
28570 20 20 20 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20      iCol = 0;.  
28580 20 20 20 20 20 20 20 20 20 20 69 50 6f 73 20 3d            iPos =
28590 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
285a0 69 66 28 20 69 56 61 6c 20 29 7b 0a 20 20 20 20  if( iVal ){.    
285b0 20 20 20 20 20 20 20 20 20 20 70 43 73 72 20 2b            pCsr +
285c0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74  = sqlite3Fts3Get
285d0 56 61 72 69 6e 74 28 70 43 73 72 2c 20 26 69 43  Varint(pCsr, &iC
285e0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ol);.           
285f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
28600 20 20 20 20 20 20 70 43 73 72 20 2b 3d 20 73 71        pCsr += sq
28610 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
28620 6e 74 28 70 43 73 72 2c 20 26 69 56 61 6c 29 3b  nt(pCsr, &iVal);
28630 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
28640 44 6f 63 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20  Docid += iVal;. 
28650 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
28660 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
28670 20 20 20 20 20 20 20 20 20 20 69 50 6f 73 20 2b            iPos +
28680 3d 20 28 69 56 61 6c 20 2d 20 32 29 3b 0a 20 20  = (iVal - 2);.  
28690 20 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20            cksum 
286a0 3d 20 63 6b 73 75 6d 20 5e 20 66 74 73 33 43 68  = cksum ^ fts3Ch
286b0 65 63 6b 73 75 6d 45 6e 74 72 79 28 0a 20 20 20  ecksumEntry(.   
286c0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 73 72               csr
286d0 2e 7a 54 65 72 6d 2c 20 63 73 72 2e 6e 54 65 72  .zTerm, csr.nTer
286e0 6d 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64  m, iLangid, iInd
286f0 65 78 2c 20 69 44 6f 63 69 64 2c 0a 20 20 20 20  ex, iDocid,.    
28700 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
28710 29 69 43 6f 6c 2c 20 28 69 6e 74 29 69 50 6f 73  )iCol, (int)iPos
28720 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a  .            );.
28730 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28740 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
28750 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
28760 33 46 74 73 33 53 65 67 52 65 61 64 65 72 46 69  3Fts3SegReaderFi
28770 6e 69 73 68 28 26 63 73 72 29 3b 0a 0a 20 20 2a  nish(&csr);..  *
28780 70 52 63 20 3d 20 72 63 3b 0a 20 20 72 65 74 75  pRc = rc;.  retu
28790 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a  rn cksum;.}../*.
287a0 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  ** Check if the 
287b0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
287c0 46 54 53 20 69 6e 64 65 78 20 6d 61 74 63 68 20  FTS index match 
287d0 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
287e0 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63  ents of the.** c
287f0 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e 20 49 66  ontent table. If
28800 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
28810 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
28820 73 20 64 6f 20 6d 61 74 63 68 2c 20 73 65 74 20  s do match, set 
28830 2a 70 62 4f 6b 0a 2a 2a 20 74 6f 20 74 72 75 65  *pbOk.** to true
28840 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
28850 54 45 5f 4f 4b 2e 20 4f 72 20 69 66 20 74 68 65  TE_OK. Or if the
28860 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74   contents do not
28870 20 6d 61 74 63 68 2c 20 73 65 74 20 2a 70 62 4f   match, set *pbO
28880 6b 0a 2a 2a 20 74 6f 20 66 61 6c 73 65 20 62 65  k.** to false be
28890 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
288a0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
288b0 72 20 6f 63 63 75 72 73 20 28 65 2e 67 2e 20 61  r occurs (e.g. a
288c0 6e 20 4f 4f 4d 20 6f 72 20 49 4f 20 65 72 72 6f  n OOM or IO erro
288d0 72 29 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51  r), return an SQ
288e0 4c 69 74 65 20 65 72 72 6f 72 20 0a 2a 2a 20 63  Lite error .** c
288f0 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 20 76  ode. The final v
28900 61 6c 75 65 20 6f 66 20 2a 70 62 4f 6b 20 69 73  alue of *pbOk is
28910 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
28920 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  is case..*/.stat
28930 69 63 20 69 6e 74 20 66 74 73 33 49 6e 74 65 67  ic int fts3Integ
28940 72 69 74 79 43 68 65 63 6b 28 46 74 73 33 54 61  rityCheck(Fts3Ta
28950 62 6c 65 20 2a 70 2c 20 69 6e 74 20 2a 70 62 4f  ble *p, int *pbO
28960 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
28970 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
28980 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
28990 63 6f 64 65 20 2a 2f 0a 20 20 75 36 34 20 63 6b  code */.  u64 ck
289a0 73 75 6d 31 20 3d 20 30 3b 20 20 20 20 20 20 20  sum1 = 0;       
289b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
289c0 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 46  cksum based on F
289d0 54 53 20 69 6e 64 65 78 20 63 6f 6e 74 65 6e 74  TS index content
289e0 73 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73 75 6d  s */.  u64 cksum
289f0 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  2 = 0;          
28a00 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
28a10 75 6d 20 62 61 73 65 64 20 6f 6e 20 25 5f 63 6f  um based on %_co
28a20 6e 74 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 2a  ntent contents *
28a30 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
28a40 20 2a 70 41 6c 6c 4c 61 6e 67 69 64 20 3d 20 30   *pAllLangid = 0
28a50 3b 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74  ;   /* Statement
28a60 20 74 6f 20 72 65 74 75 72 6e 20 61 6c 6c 20 6c   to return all l
28a70 61 6e 67 75 61 67 65 2d 69 64 73 20 2a 2f 0a 0a  anguage-ids */..
28a80 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
28a90 63 61 6c 63 75 6c 61 74 65 73 20 74 68 65 20 63  calculates the c
28aa0 68 65 63 6b 73 75 6d 20 61 63 63 6f 72 64 69 6e  hecksum accordin
28ab0 67 20 74 6f 20 74 68 65 20 46 54 53 20 69 6e 64  g to the FTS ind
28ac0 65 78 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74  ex. */.  rc = ft
28ad0 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
28ae0 5f 53 45 4c 45 43 54 5f 41 4c 4c 5f 4c 41 4e 47  _SELECT_ALL_LANG
28af0 49 44 2c 20 26 70 41 6c 6c 4c 61 6e 67 69 64 2c  ID, &pAllLangid,
28b00 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
28b10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28b20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 73 71 6c  int rc2;.    sql
28b30 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 41  ite3_bind_int(pA
28b40 6c 6c 4c 61 6e 67 69 64 2c 20 31 2c 20 70 2d 3e  llLangid, 1, p->
28b50 6e 49 6e 64 65 78 29 3b 0a 20 20 20 20 77 68 69  nIndex);.    whi
28b60 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
28b70 4b 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 65  K && sqlite3_ste
28b80 70 28 70 41 6c 6c 4c 61 6e 67 69 64 29 3d 3d 53  p(pAllLangid)==S
28b90 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
28ba0 20 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 20 3d     int iLangid =
28bb0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
28bc0 69 6e 74 28 70 41 6c 6c 4c 61 6e 67 69 64 2c 20  int(pAllLangid, 
28bd0 30 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  0);.      int i;
28be0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
28bf0 69 3c 70 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b  i<p->nIndex; i++
28c00 29 7b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  ){.        cksum
28c10 31 20 3d 20 63 6b 73 75 6d 31 20 5e 20 66 74 73  1 = cksum1 ^ fts
28c20 33 43 68 65 63 6b 73 75 6d 49 6e 64 65 78 28 70  3ChecksumIndex(p
28c30 2c 20 69 4c 61 6e 67 69 64 2c 20 69 2c 20 26 72  , iLangid, i, &r
28c40 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
28c50 7d 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  }.    rc2 = sqli
28c60 74 65 33 5f 72 65 73 65 74 28 70 41 6c 6c 4c 61  te3_reset(pAllLa
28c70 6e 67 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72  ngid);.    if( r
28c80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
28c90 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20  c = rc2;.  }..  
28ca0 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 63 61  /* This block ca
28cb0 6c 63 75 6c 61 74 65 73 20 74 68 65 20 63 68 65  lculates the che
28cc0 63 6b 73 75 6d 20 61 63 63 6f 72 64 69 6e 67 20  cksum according 
28cd0 74 6f 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74  to the %_content
28ce0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 72 63 20 3d   table */.  rc =
28cf0 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
28d00 53 51 4c 5f 53 45 4c 45 43 54 5f 41 4c 4c 5f 4c  SQL_SELECT_ALL_L
28d10 41 4e 47 49 44 2c 20 26 70 41 6c 6c 4c 61 6e 67  ANGID, &pAllLang
28d20 69 64 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  id, 0);.  if( rc
28d30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28d40 20 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e     sqlite3_token
28d50 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73  izer_module cons
28d60 74 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 2d 3e  t *pModule = p->
28d70 70 54 6f 6b 65 6e 69 7a 65 72 2d 3e 70 4d 6f 64  pTokenizer->pMod
28d80 75 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ule;.    sqlite3
28d90 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
28da0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c  ;.    char *zSql
28db0 3b 0a 20 20 20 0a 20 20 20 20 7a 53 71 6c 20 3d  ;.   .    zSql =
28dc0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
28dd0 28 22 53 45 4c 45 43 54 20 25 73 22 20 2c 20 70  ("SELECT %s" , p
28de0 2d 3e 7a 52 65 61 64 45 78 70 72 6c 69 73 74 29  ->zReadExprlist)
28df0 3b 0a 20 20 20 20 69 66 28 20 21 7a 53 71 6c 20  ;.    if( !zSql 
28e00 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
28e10 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
28e20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
28e30 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
28e40 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
28e50 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
28e60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
28e70 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
28e80 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  }..    while( rc
28e90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
28ea0 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
28eb0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
28ec0 7b 0a 20 20 20 20 20 20 69 36 34 20 69 44 6f 63  {.      i64 iDoc
28ed0 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  id = sqlite3_col
28ee0 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
28ef0 20 30 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69   0);.      int i
28f00 4c 61 6e 67 20 3d 20 6c 61 6e 67 69 64 46 72 6f  Lang = langidFro
28f10 6d 53 65 6c 65 63 74 28 70 2c 20 70 53 74 6d 74  mSelect(p, pStmt
28f20 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  );.      int iCo
28f30 6c 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 43  l;..      for(iC
28f40 6f 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ol=0; rc==SQLITE
28f50 5f 4f 4b 20 26 26 20 69 43 6f 6c 3c 70 2d 3e 6e  _OK && iCol<p->n
28f60 43 6f 6c 75 6d 6e 3b 20 69 43 6f 6c 2b 2b 29 7b  Column; iCol++){
28f70 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
28f80 68 61 72 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f  har *zText = (co
28f90 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74  nst char *)sqlit
28fa0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
28fb0 53 74 6d 74 2c 20 69 43 6f 6c 2b 31 29 3b 0a 20  Stmt, iCol+1);. 
28fc0 20 20 20 20 20 20 20 69 6e 74 20 6e 54 65 78 74         int nText
28fd0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
28fe0 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69  n_bytes(pStmt, i
28ff0 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  Col+1);.        
29000 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65  sqlite3_tokenize
29010 72 5f 63 75 72 73 6f 72 20 2a 70 54 20 3d 20 30  r_cursor *pT = 0
29020 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ;..        rc = 
29030 73 71 6c 69 74 65 33 46 74 73 33 4f 70 65 6e 54  sqlite3Fts3OpenT
29040 6f 6b 65 6e 69 7a 65 72 28 70 2d 3e 70 54 6f 6b  okenizer(p->pTok
29050 65 6e 69 7a 65 72 2c 20 69 4c 61 6e 67 2c 20 7a  enizer, iLang, z
29060 54 65 78 74 2c 20 6e 54 65 78 74 2c 20 26 70 54  Text, nText, &pT
29070 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  );.        while
29080 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29090 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  ){.          cha
290a0 72 20 63 6f 6e 73 74 20 2a 7a 54 6f 6b 65 6e 3b  r const *zToken;
290b0 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
290c0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 6f 6b 65   containing toke
290d0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  n */.          i
290e0 6e 74 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 20 20  nt nToken = 0;  
290f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
29100 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
29110 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  oken */.        
29120 20 20 69 6e 74 20 69 44 75 6d 31 20 3d 20 30 2c    int iDum1 = 0,
29130 20 69 44 75 6d 32 20 3d 20 30 3b 20 2f 2a 20 44   iDum2 = 0; /* D
29140 75 6d 6d 79 20 76 61 72 69 61 62 6c 65 73 20 2a  ummy variables *
29150 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  /.          int 
29160 69 50 6f 73 20 3d 20 30 3b 20 20 20 20 20 20 20  iPos = 0;       
29170 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f        /* Positio
29180 6e 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20 7a 54  n of token in zT
29190 65 78 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ext */..        
291a0 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e    rc = pModule->
291b0 78 4e 65 78 74 28 70 54 2c 20 26 7a 54 6f 6b 65  xNext(pT, &zToke
291c0 6e 2c 20 26 6e 54 6f 6b 65 6e 2c 20 26 69 44 75  n, &nToken, &iDu
291d0 6d 31 2c 20 26 69 44 75 6d 32 2c 20 26 69 50 6f  m1, &iDum2, &iPo
291e0 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  s);.          if
291f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29200 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
29210 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  nt i;.          
29220 20 20 63 6b 73 75 6d 32 20 3d 20 63 6b 73 75 6d    cksum2 = cksum
29230 32 20 5e 20 66 74 73 33 43 68 65 63 6b 73 75 6d  2 ^ fts3Checksum
29240 45 6e 74 72 79 28 0a 20 20 20 20 20 20 20 20 20  Entry(.         
29250 20 20 20 20 20 20 20 7a 54 6f 6b 65 6e 2c 20 6e         zToken, n
29260 54 6f 6b 65 6e 2c 20 69 4c 61 6e 67 2c 20 30 2c  Token, iLang, 0,
29270 20 69 44 6f 63 69 64 2c 20 69 43 6f 6c 2c 20 69   iDocid, iCol, i
29280 50 6f 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  Pos.            
29290 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
292a0 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 49 6e  or(i=1; i<p->nIn
292b0 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  dex; i++){.     
292c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
292d0 61 49 6e 64 65 78 5b 69 5d 2e 6e 50 72 65 66 69  aIndex[i].nPrefi
292e0 78 3c 3d 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  x<=nToken ){.   
292f0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6b 73               cks
29300 75 6d 32 20 3d 20 63 6b 73 75 6d 32 20 5e 20 66  um2 = cksum2 ^ f
29310 74 73 33 43 68 65 63 6b 73 75 6d 45 6e 74 72 79  ts3ChecksumEntry
29320 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
29330 20 20 20 20 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 61      zToken, p->a
29340 49 6e 64 65 78 5b 69 5d 2e 6e 50 72 65 66 69 78  Index[i].nPrefix
29350 2c 20 69 4c 61 6e 67 2c 20 69 2c 20 69 44 6f 63  , iLang, i, iDoc
29360 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 0a 20  id, iCol, iPos. 
29370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29                 )
29380 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
29390 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
293a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
293b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
293c0 28 20 70 54 20 29 20 70 4d 6f 64 75 6c 65 2d 3e  ( pT ) pModule->
293d0 78 43 6c 6f 73 65 28 70 54 29 3b 0a 20 20 20 20  xClose(pT);.    
293e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
293f0 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53  TE_DONE ) rc = S
29400 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
29410 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  }.    }..    sql
29420 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
29430 74 6d 74 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 62  tmt);.  }..  *pb
29440 4f 6b 20 3d 20 28 63 6b 73 75 6d 31 3d 3d 63 6b  Ok = (cksum1==ck
29450 73 75 6d 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sum2);.  return 
29460 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e  rc;.}../*.** Run
29470 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63   the integrity-c
29480 68 65 63 6b 2e 20 49 66 20 6e 6f 20 65 72 72 6f  heck. If no erro
29490 72 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  r occurs and the
294a0 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
294b0 73 20 6f 66 0a 2a 2a 20 74 68 65 20 46 54 53 20  s of.** the FTS 
294c0 69 6e 64 65 78 20 61 72 65 20 63 6f 72 72 65 63  index are correc
294d0 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
294e0 5f 4f 4b 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  _OK. Or, if the 
294f0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
29500 2a 2a 20 46 54 53 20 69 6e 64 65 78 20 61 72 65  ** FTS index are
29510 20 69 6e 63 6f 72 72 65 63 74 2c 20 72 65 74 75   incorrect, retu
29520 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
29530 54 5f 56 54 41 42 2e 0a 2a 2a 0a 2a 2a 20 4f 72  T_VTAB..**.** Or
29540 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 28 65  , if an error (e
29550 2e 67 2e 20 61 6e 20 4f 4f 4d 20 6f 72 20 49 4f  .g. an OOM or IO
29560 20 65 72 72 6f 72 29 20 6f 63 63 75 72 73 2c 20   error) occurs, 
29570 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
29580 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e   .** error code.
29590 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67  .**.** The integ
295a0 72 69 74 79 2d 63 68 65 63 6b 20 77 6f 72 6b 73  rity-check works
295b0 20 61 73 20 66 6f 6c 6c 6f 77 73 2e 20 46 6f 72   as follows. For
295c0 20 65 61 63 68 20 74 6f 6b 65 6e 20 61 6e 64 20   each token and 
295d0 69 6e 64 65 78 65 64 20 74 6f 6b 65 6e 0a 2a 2a  indexed token.**
295e0 20 70 72 65 66 69 78 20 69 6e 20 74 68 65 20 64   prefix in the d
295f0 6f 63 75 6d 65 6e 74 20 73 65 74 2c 20 61 20 36  ocument set, a 6
29600 34 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 69  4-bit checksum i
29610 73 20 63 61 6c 63 75 6c 61 74 65 64 20 28 62 79  s calculated (by
29620 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 66 74 73 33   code.** in fts3
29630 43 68 65 63 6b 73 75 6d 45 6e 74 72 79 28 29 29  ChecksumEntry())
29640 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 66 6f   based on the fo
29650 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
29660 20 20 20 2b 20 54 68 65 20 69 6e 64 65 78 20 6e     + The index n
29670 75 6d 62 65 72 20 28 30 20 66 6f 72 20 74 68 65  umber (0 for the
29680 20 6d 61 69 6e 20 69 6e 64 65 78 2c 20 31 20 66   main index, 1 f
29690 6f 72 20 74 68 65 20 66 69 72 73 74 20 70 72 65  or the first pre
296a0 66 69 78 0a 2a 2a 20 20 20 20 20 20 20 69 6e 64  fix.**       ind
296b0 65 78 20 65 74 63 2e 29 2c 0a 2a 2a 20 20 20 20  ex etc.),.**    
296c0 20 2b 20 54 68 65 20 74 6f 6b 65 6e 20 28 6f 72   + The token (or
296d0 20 74 6f 6b 65 6e 20 70 72 65 66 69 78 29 20 74   token prefix) t
296e0 65 78 74 20 69 74 73 65 6c 66 2c 20 0a 2a 2a 20  ext itself, .** 
296f0 20 20 20 20 2b 20 54 68 65 20 6c 61 6e 67 75 61      + The langua
29700 67 65 2d 69 64 20 6f 66 20 74 68 65 20 72 6f 77  ge-id of the row
29710 20 69 74 20 61 70 70 65 61 72 73 20 69 6e 2c 0a   it appears in,.
29720 2a 2a 20 20 20 20 20 2b 20 54 68 65 20 64 6f 63  **     + The doc
29730 69 64 20 6f 66 20 74 68 65 20 72 6f 77 20 69 74  id of the row it
29740 20 61 70 70 65 61 72 73 20 69 6e 2c 0a 2a 2a 20   appears in,.** 
29750 20 20 20 20 2b 20 54 68 65 20 63 6f 6c 75 6d 6e      + The column
29760 20 69 74 20 61 70 70 65 61 72 73 20 69 6e 2c 20   it appears in, 
29770 61 6e 64 0a 2a 2a 20 20 20 20 20 2b 20 54 68 65  and.**     + The
29780 20 74 6f 6b 65 6e 73 20 70 6f 73 69 74 69 6f 6e   tokens position
29790 20 77 69 74 68 69 6e 20 74 68 61 74 20 63 6f 6c   within that col
297a0 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  umn..**.** The c
297b0 68 65 63 6b 73 75 6d 73 20 66 6f 72 20 61 6c 6c  hecksums for all
297c0 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
297d0 69 6e 64 65 78 20 61 72 65 20 58 4f 52 65 64 20  index are XORed 
297e0 74 6f 67 65 74 68 65 72 20 74 6f 20 63 72 65 61  together to crea
297f0 74 65 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 63  te.** a single c
29800 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20  hecksum for the 
29810 65 6e 74 69 72 65 20 69 6e 64 65 78 2e 0a 2a 2a  entire index..**
29820 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67 72 69 74  .** The integrit
29830 79 2d 63 68 65 63 6b 20 63 6f 64 65 20 63 61 6c  y-check code cal
29840 63 75 6c 61 74 65 73 20 74 68 65 20 73 61 6d 65  culates the same
29850 20 63 68 65 63 6b 73 75 6d 20 69 6e 20 74 77 6f   checksum in two
29860 20 77 61 79 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   ways:.**.**    
29870 20 31 2e 20 42 79 20 73 63 61 6e 6e 69 6e 67 20   1. By scanning 
29880 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
29890 74 68 65 20 46 54 53 20 69 6e 64 65 78 2c 20 61  the FTS index, a
298a0 6e 64 20 0a 2a 2a 20 20 20 20 20 32 2e 20 42 79  nd .**     2. By
298b0 20 73 63 61 6e 6e 69 6e 67 20 61 6e 64 20 74 6f   scanning and to
298c0 6b 65 6e 69 7a 69 6e 67 20 74 68 65 20 63 6f 6e  kenizing the con
298d0 74 65 6e 74 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tent table..**.*
298e0 2a 20 49 66 20 74 68 65 20 74 77 6f 20 63 68 65  * If the two che
298f0 63 6b 73 75 6d 73 20 61 72 65 20 69 64 65 6e 74  cksums are ident
29900 69 63 61 6c 2c 20 74 68 65 20 69 6e 74 65 67 72  ical, the integr
29910 69 74 79 2d 63 68 65 63 6b 20 69 73 20 64 65 65  ity-check is dee
29920 6d 65 64 20 74 6f 20 68 61 76 65 0a 2a 2a 20 70  med to have.** p
29930 61 73 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  assed..*/.static
29940 20 69 6e 74 20 66 74 73 33 44 6f 49 6e 74 65 67   int fts3DoInteg
29950 72 69 74 79 43 68 65 63 6b 28 0a 20 20 46 74 73  rityCheck(.  Fts
29960 33 54 61 62 6c 65 20 2a 70 20 20 20 20 20 20 20  3Table *p       
29970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29980 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c  FTS3 table handl
29990 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
299a0 3b 0a 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b  ;.  int bOk = 0;
299b0 0a 20 20 72 63 20 3d 20 66 74 73 33 49 6e 74 65  .  rc = fts3Inte
299c0 67 72 69 74 79 43 68 65 63 6b 28 70 2c 20 26 62  grityCheck(p, &b
299d0 4f 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  Ok);.  if( rc==S
299e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 3d  QLITE_OK && bOk=
299f0 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  =0 ) rc = SQLITE
29a00 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20  _CORRUPT_VTAB;. 
29a10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
29a20 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20 61 20 27 73  *.** Handle a 's
29a30 70 65 63 69 61 6c 27 20 49 4e 53 45 52 54 20 6f  pecial' INSERT o
29a40 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
29a50 2a 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  *   "INSERT INTO
29a60 20 74 62 6c 28 74 62 6c 29 20 56 41 4c 55 45 53   tbl(tbl) VALUES
29a70 28 3c 65 78 70 72 3e 29 22 0a 2a 2a 0a 2a 2a 20  (<expr>)".**.** 
29a80 41 72 67 75 6d 65 6e 74 20 70 56 61 6c 20 63 6f  Argument pVal co
29a90 6e 74 61 69 6e 73 20 74 68 65 20 72 65 73 75 6c  ntains the resul
29aa0 74 20 6f 66 20 3c 65 78 70 72 3e 2e 20 43 75 72  t of <expr>. Cur
29ab0 72 65 6e 74 6c 79 20 74 68 65 20 6f 6e 6c 79 20  rently the only 
29ac0 0a 2a 2a 20 6d 65 61 6e 69 6e 67 66 75 6c 20 76  .** meaningful v
29ad0 61 6c 75 65 20 74 6f 20 69 6e 73 65 72 74 20 69  alue to insert i
29ae0 73 20 74 68 65 20 74 65 78 74 20 27 6f 70 74 69  s the text 'opti
29af0 6d 69 7a 65 27 2e 0a 2a 2f 0a 73 74 61 74 69 63  mize'..*/.static
29b00 20 69 6e 74 20 66 74 73 33 53 70 65 63 69 61 6c   int fts3Special
29b10 49 6e 73 65 72 74 28 46 74 73 33 54 61 62 6c 65  Insert(Fts3Table
29b20 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c   *p, sqlite3_val
29b30 75 65 20 2a 70 56 61 6c 29 7b 0a 20 20 69 6e 74  ue *pVal){.  int
29b40 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
29b50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29b60 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
29b70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61   const char *zVa
29b80 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  l = (const char 
29b90 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
29ba0 74 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 69 6e  text(pVal);.  in
29bb0 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33  t nVal = sqlite3
29bc0 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61  _value_bytes(pVa
29bd0 6c 29 3b 0a 0a 20 20 69 66 28 20 21 7a 56 61 6c  l);..  if( !zVal
29be0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
29bf0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
29c00 65 6c 73 65 20 69 66 28 20 6e 56 61 6c 3d 3d 38  else if( nVal==8
29c10 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73   && 0==sqlite3_s
29c20 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22 6f  trnicmp(zVal, "o
29c30 70 74 69 6d 69 7a 65 22 2c 20 38 29 20 29 7b 0a  ptimize", 8) ){.
29c40 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 6f 4f      rc = fts3DoO
29c50 70 74 69 6d 69 7a 65 28 70 2c 20 30 29 3b 0a 20  ptimize(p, 0);. 
29c60 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 61 6c 3d   }else if( nVal=
29c70 3d 37 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  =7 && 0==sqlite3
29c80 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20  _strnicmp(zVal, 
29c90 22 72 65 62 75 69 6c 64 22 2c 20 37 29 20 29 7b  "rebuild", 7) ){
29ca0 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 6f  .    rc = fts3Do
29cb0 52 65 62 75 69 6c 64 28 70 29 3b 0a 20 20 7d 65  Rebuild(p);.  }e
29cc0 6c 73 65 20 69 66 28 20 6e 56 61 6c 3d 3d 31 35  lse if( nVal==15
29cd0 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73   && 0==sqlite3_s
29ce0 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22 69  trnicmp(zVal, "i
29cf0 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 22 2c  ntegrity-check",
29d00 20 31 35 29 20 29 7b 0a 20 20 20 20 72 63 20 3d   15) ){.    rc =
29d10 20 66 74 73 33 44 6f 49 6e 74 65 67 72 69 74 79   fts3DoIntegrity
29d20 43 68 65 63 6b 28 70 29 3b 0a 20 20 7d 65 6c 73  Check(p);.  }els
29d30 65 20 69 66 28 20 6e 56 61 6c 3e 36 20 26 26 20  e if( nVal>6 && 
29d40 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  0==sqlite3_strni
29d50 63 6d 70 28 7a 56 61 6c 2c 20 22 6d 65 72 67 65  cmp(zVal, "merge
29d60 3d 22 2c 20 36 29 20 29 7b 0a 20 20 20 20 72 63  =", 6) ){.    rc
29d70 20 3d 20 66 74 73 33 44 6f 49 6e 63 72 6d 65 72   = fts3DoIncrmer
29d80 67 65 28 70 2c 20 26 7a 56 61 6c 5b 36 5d 29 3b  ge(p, &zVal[6]);
29d90 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 61  .  }else if( nVa
29da0 6c 3e 31 30 20 26 26 20 30 3d 3d 73 71 6c 69 74  l>10 && 0==sqlit
29db0 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c  e3_strnicmp(zVal
29dc0 2c 20 22 61 75 74 6f 6d 65 72 67 65 3d 22 2c 20  , "automerge=", 
29dd0 31 30 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  10) ){.    rc = 
29de0 66 74 73 33 44 6f 41 75 74 6f 69 6e 63 72 6d 65  fts3DoAutoincrme
29df0 72 67 65 28 70 2c 20 26 7a 56 61 6c 5b 31 30 5d  rge(p, &zVal[10]
29e00 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
29e10 5f 54 45 53 54 0a 20 20 7d 65 6c 73 65 20 69 66  _TEST.  }else if
29e20 28 20 6e 56 61 6c 3e 39 20 26 26 20 30 3d 3d 73  ( nVal>9 && 0==s
29e30 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
29e40 7a 56 61 6c 2c 20 22 6e 6f 64 65 73 69 7a 65 3d  zVal, "nodesize=
29e50 22 2c 20 39 29 20 29 7b 0a 20 20 20 20 70 2d 3e  ", 9) ){.    p->
29e60 6e 4e 6f 64 65 53 69 7a 65 20 3d 20 61 74 6f 69  nNodeSize = atoi
29e70 28 26 7a 56 61 6c 5b 39 5d 29 3b 0a 20 20 20 20  (&zVal[9]);.    
29e80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
29e90 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 61 6c    }else if( nVal
29ea0 3e 31 31 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  >11 && 0==sqlite
29eb0 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c  3_strnicmp(zVal,
29ec0 20 22 6d 61 78 70 65 6e 64 69 6e 67 3d 22 2c 20   "maxpending=", 
29ed0 39 29 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4d 61  9) ){.    p->nMa
29ee0 78 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 61  xPendingData = a
29ef0 74 6f 69 28 26 7a 56 61 6c 5b 31 31 5d 29 3b 0a  toi(&zVal[11]);.
29f00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
29f10 4f 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  OK;.#endif.  }el
29f20 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
29f30 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
29f40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
29f50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
29f60 49 53 41 42 4c 45 5f 46 54 53 34 5f 44 45 46 45  ISABLE_FTS4_DEFE
29f70 52 52 45 44 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  RRED./*.** Delet
29f80 65 20 61 6c 6c 20 63 61 63 68 65 64 20 64 65 66  e all cached def
29f90 65 72 72 65 64 20 64 6f 63 6c 69 73 74 73 2e 20  erred doclists. 
29fa0 44 65 66 65 72 72 65 64 20 64 6f 63 6c 69 73 74  Deferred doclist
29fb0 73 20 61 72 65 20 63 61 63 68 65 64 0a 2a 2a 20  s are cached.** 
29fc0 28 61 6c 6c 6f 63 61 74 65 64 29 20 62 79 20 74  (allocated) by t
29fd0 68 65 20 73 71 6c 69 74 65 33 46 74 73 33 43 61  he sqlite3Fts3Ca
29fe0 63 68 65 44 65 66 65 72 72 65 64 44 6f 63 6c 69  cheDeferredDocli
29ff0 73 74 73 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  sts() function..
2a000 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
2a010 74 73 33 46 72 65 65 44 65 66 65 72 72 65 64 44  ts3FreeDeferredD
2a020 6f 63 6c 69 73 74 73 28 46 74 73 33 43 75 72 73  oclists(Fts3Curs
2a030 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 46 74 73  or *pCsr){.  Fts
2a040 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a  3DeferredToken *
2a050 70 44 65 66 3b 0a 20 20 66 6f 72 28 70 44 65 66  pDef;.  for(pDef
2a060 3d 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64  =pCsr->pDeferred
2a070 3b 20 70 44 65 66 3b 20 70 44 65 66 3d 70 44 65  ; pDef; pDef=pDe
2a080 66 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 66  f->pNext){.    f
2a090 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 44 65  ts3PendingListDe
2a0a0 6c 65 74 65 28 70 44 65 66 2d 3e 70 4c 69 73 74  lete(pDef->pList
2a0b0 29 3b 0a 20 20 20 20 70 44 65 66 2d 3e 70 4c 69  );.    pDef->pLi
2a0c0 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  st = 0;.  }.}../
2a0d0 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 65 6e  *.** Free all en
2a0e0 74 72 69 65 73 20 69 6e 20 74 68 65 20 70 43 73  tries in the pCs
2a0f0 72 2d 3e 70 44 65 66 66 65 72 65 64 20 6c 69 73  r->pDeffered lis
2a100 74 2e 20 45 6e 74 72 69 65 73 20 61 72 65 20 61  t. Entries are a
2a110 64 64 65 64 20 74 6f 20 0a 2a 2a 20 74 68 69 73  dded to .** this
2a120 20 6c 69 73 74 20 75 73 69 6e 67 20 73 71 6c 69   list using sqli
2a130 74 65 33 46 74 73 33 44 65 66 65 72 54 6f 6b 65  te3Fts3DeferToke
2a140 6e 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  n()..*/.void sql
2a150 69 74 65 33 46 74 73 33 46 72 65 65 44 65 66 65  ite3Fts3FreeDefe
2a160 72 72 65 64 54 6f 6b 65 6e 73 28 46 74 73 33 43  rredTokens(Fts3C
2a170 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20  ursor *pCsr){.  
2a180 46 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65  Fts3DeferredToke
2a190 6e 20 2a 70 44 65 66 3b 0a 20 20 46 74 73 33 44  n *pDef;.  Fts3D
2a1a0 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70 4e  eferredToken *pN
2a1b0 65 78 74 3b 0a 20 20 66 6f 72 28 70 44 65 66 3d  ext;.  for(pDef=
2a1c0 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64 3b  pCsr->pDeferred;
2a1d0 20 70 44 65 66 3b 20 70 44 65 66 3d 70 4e 65 78   pDef; pDef=pNex
2a1e0 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
2a1f0 70 44 65 66 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pDef->pNext;.   
2a200 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74   fts3PendingList
2a210 44 65 6c 65 74 65 28 70 44 65 66 2d 3e 70 4c 69  Delete(pDef->pLi
2a220 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
2a230 5f 66 72 65 65 28 70 44 65 66 29 3b 0a 20 20 7d  _free(pDef);.  }
2a240 0a 20 20 70 43 73 72 2d 3e 70 44 65 66 65 72 72  .  pCsr->pDeferr
2a250 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ed = 0;.}../*.**
2a260 20 47 65 6e 65 72 61 74 65 20 64 65 66 65 72 72   Generate deferr
2a270 65 64 2d 64 6f 63 6c 69 73 74 73 20 66 6f 72 20  ed-doclists for 
2a280 61 6c 6c 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68  all tokens in th
2a290 65 20 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65  e pCsr->pDeferre
2a2a0 64 20 6c 69 73 74 0a 2a 2a 20 62 61 73 65 64 20  d list.** based 
2a2b0 6f 6e 20 74 68 65 20 72 6f 77 20 74 68 61 74 20  on the row that 
2a2c0 70 43 73 72 20 63 75 72 72 65 6e 74 6c 79 20 70  pCsr currently p
2a2d0 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20  oints to..**.** 
2a2e0 41 20 64 65 66 65 72 72 65 64 2d 64 6f 63 6c 69  A deferred-docli
2a2f0 73 74 20 69 73 20 6c 69 6b 65 20 61 6e 79 20 6f  st is like any o
2a300 74 68 65 72 20 64 6f 63 6c 69 73 74 20 77 69 74  ther doclist wit
2a310 68 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 72  h position infor
2a320 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 63 6c 75 64  mation.** includ
2a330 65 64 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  ed, except that 
2a340 69 74 20 6f 6e 6c 79 20 63 6f 6e 74 61 69 6e 73  it only contains
2a350 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 20 73   entries for a s
2a360 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
2a370 0a 2a 2a 20 74 61 62 6c 65 2c 20 6e 6f 74 20 66  .** table, not f
2a380 6f 72 20 61 6c 6c 20 72 6f 77 73 2e 0a 2a 2f 0a  or all rows..*/.
2a390 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 43  int sqlite3Fts3C
2a3a0 61 63 68 65 44 65 66 65 72 72 65 64 44 6f 63 6c  acheDeferredDocl
2a3b0 69 73 74 73 28 46 74 73 33 43 75 72 73 6f 72 20  ists(Fts3Cursor 
2a3c0 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCsr){.  int rc
2a3d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2a3e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2a3f0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 66  urn code */.  if
2a400 28 20 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65  ( pCsr->pDeferre
2a410 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20  d ){.    int i; 
2a420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a430 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
2a440 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
2a450 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  h table columns 
2a460 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  */.    sqlite3_i
2a470 6e 74 36 34 20 69 44 6f 63 69 64 3b 20 20 20 20  nt64 iDocid;    
2a480 20 20 20 20 20 2f 2a 20 44 6f 63 69 64 20 6f 66       /* Docid of
2a490 20 74 68 65 20 72 6f 77 20 70 43 73 72 20 70 6f   the row pCsr po
2a4a0 69 6e 74 73 20 74 6f 20 2a 2f 0a 20 20 20 20 46  ints to */.    F
2a4b0 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e  ts3DeferredToken
2a4c0 20 2a 70 44 65 66 3b 20 20 20 20 20 20 2f 2a 20   *pDef;      /* 
2a4d0 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
2a4e0 74 68 72 6f 75 67 68 20 64 65 66 65 72 72 65 64  through deferred
2a4f0 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20 0a 20 20   tokens */.  .  
2a500 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20 3d    Fts3Table *p =
2a510 20 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43   (Fts3Table *)pC
2a520 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a  sr->base.pVtab;.
2a530 20 20 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65      sqlite3_toke
2a540 6e 69 7a 65 72 20 2a 70 54 20 3d 20 70 2d 3e 70  nizer *pT = p->p
2a550 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 20 20 73  Tokenizer;.    s
2a560 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
2a570 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73 74 20 2a 70  _module const *p
2a580 4d 6f 64 75 6c 65 20 3d 20 70 54 2d 3e 70 4d 6f  Module = pT->pMo
2a590 64 75 6c 65 3b 0a 20 20 20 0a 20 20 20 20 61 73  dule;.   .    as
2a5a0 73 65 72 74 28 20 70 43 73 72 2d 3e 69 73 52 65  sert( pCsr->isRe
2a5b0 71 75 69 72 65 53 65 65 6b 3d 3d 30 20 29 3b 0a  quireSeek==0 );.
2a5c0 20 20 20 20 69 44 6f 63 69 64 20 3d 20 73 71 6c      iDocid = sql
2a5d0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
2a5e0 34 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20 30  4(pCsr->pStmt, 0
2a5f0 29 3b 0a 20 20 0a 20 20 20 20 66 6f 72 28 69 3d  );.  .    for(i=
2a600 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 20  0; i<p->nColumn 
2a610 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
2a620 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; i++){.      co
2a630 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 20  nst char *zText 
2a640 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
2a650 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
2a660 65 78 74 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c  ext(pCsr->pStmt,
2a670 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c   i+1);.      sql
2a680 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 63  ite3_tokenizer_c
2a690 75 72 73 6f 72 20 2a 70 54 43 20 3d 20 30 3b 0a  ursor *pTC = 0;.
2a6a0 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71    .      rc = sq
2a6b0 6c 69 74 65 33 46 74 73 33 4f 70 65 6e 54 6f 6b  lite3Fts3OpenTok
2a6c0 65 6e 69 7a 65 72 28 70 54 2c 20 70 43 73 72 2d  enizer(pT, pCsr-
2a6d0 3e 69 4c 61 6e 67 69 64 2c 20 7a 54 65 78 74 2c  >iLangid, zText,
2a6e0 20 2d 31 2c 20 26 70 54 43 29 3b 0a 20 20 20 20   -1, &pTC);.    
2a6f0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
2a700 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2a710 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54    char const *zT
2a720 6f 6b 65 6e 3b 20 20 20 20 20 20 20 2f 2a 20 42  oken;       /* B
2a730 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
2a740 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20   token */.      
2a750 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 3d 20 30    int nToken = 0
2a760 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
2a770 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
2a780 6e 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 20  n token */.     
2a790 20 20 20 69 6e 74 20 69 44 75 6d 31 20 3d 20 30     int iDum1 = 0
2a7a0 2c 20 69 44 75 6d 32 20 3d 20 30 3b 20 2f 2a 20  , iDum2 = 0; /* 
2a7b0 44 75 6d 6d 79 20 76 61 72 69 61 62 6c 65 73 20  Dummy variables 
2a7c0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
2a7d0 50 6f 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Pos = 0;        
2a7e0 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
2a7f0 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20 7a 54 65   of token in zTe
2a800 78 74 20 2a 2f 0a 20 20 0a 20 20 20 20 20 20 20  xt */.  .       
2a810 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78   rc = pModule->x
2a820 4e 65 78 74 28 70 54 43 2c 20 26 7a 54 6f 6b 65  Next(pTC, &zToke
2a830 6e 2c 20 26 6e 54 6f 6b 65 6e 2c 20 26 69 44 75  n, &nToken, &iDu
2a840 6d 31 2c 20 26 69 44 75 6d 32 2c 20 26 69 50 6f  m1, &iDum2, &iPo
2a850 73 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  s);.        for(
2a860 70 44 65 66 3d 70 43 73 72 2d 3e 70 44 65 66 65  pDef=pCsr->pDefe
2a870 72 72 65 64 3b 20 70 44 65 66 20 26 26 20 72 63  rred; pDef && rc
2a880 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 44 65  ==SQLITE_OK; pDe
2a890 66 3d 70 44 65 66 2d 3e 70 4e 65 78 74 29 7b 0a  f=pDef->pNext){.
2a8a0 20 20 20 20 20 20 20 20 20 20 46 74 73 33 50 68            Fts3Ph
2a8b0 72 61 73 65 54 6f 6b 65 6e 20 2a 70 50 54 20 3d  raseToken *pPT =
2a8c0 20 70 44 65 66 2d 3e 70 54 6f 6b 65 6e 3b 0a 20   pDef->pToken;. 
2a8d0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44           if( (pD
2a8e0 65 66 2d 3e 69 43 6f 6c 3e 3d 70 2d 3e 6e 43 6f  ef->iCol>=p->nCo
2a8f0 6c 75 6d 6e 20 7c 7c 20 70 44 65 66 2d 3e 69 43  lumn || pDef->iC
2a900 6f 6c 3d 3d 69 29 0a 20 20 20 20 20 20 20 20 20  ol==i).         
2a910 20 20 26 26 20 28 70 50 54 2d 3e 62 46 69 72 73    && (pPT->bFirs
2a920 74 3d 3d 30 20 7c 7c 20 69 50 6f 73 3d 3d 30 29  t==0 || iPos==0)
2a930 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
2a940 70 50 54 2d 3e 6e 3d 3d 6e 54 6f 6b 65 6e 20 7c  pPT->n==nToken |
2a950 7c 20 28 70 50 54 2d 3e 69 73 50 72 65 66 69 78  | (pPT->isPrefix
2a960 20 26 26 20 70 50 54 2d 3e 6e 3c 6e 54 6f 6b 65   && pPT->n<nToke
2a970 6e 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 26  n)).           &
2a980 26 20 28 30 3d 3d 6d 65 6d 63 6d 70 28 7a 54 6f  & (0==memcmp(zTo
2a990 6b 65 6e 2c 20 70 50 54 2d 3e 7a 2c 20 70 50 54  ken, pPT->z, pPT
2a9a0 2d 3e 6e 29 29 0a 20 20 20 20 20 20 20 20 20 20  ->n)).          
2a9b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
2a9c0 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70  ts3PendingListAp
2a9d0 70 65 6e 64 28 26 70 44 65 66 2d 3e 70 4c 69 73  pend(&pDef->pLis
2a9e0 74 2c 20 69 44 6f 63 69 64 2c 20 69 2c 20 69 50  t, iDocid, i, iP
2a9f0 6f 73 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  os, &rc);.      
2aa00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2aa10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2aa20 28 20 70 54 43 20 29 20 70 4d 6f 64 75 6c 65 2d  ( pTC ) pModule-
2aa30 3e 78 43 6c 6f 73 65 28 70 54 43 29 3b 0a 20 20  >xClose(pTC);.  
2aa40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2aa50 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53  TE_DONE ) rc = S
2aa60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2aa70 20 20 0a 20 20 20 20 66 6f 72 28 70 44 65 66 3d    .    for(pDef=
2aa80 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64 3b  pCsr->pDeferred;
2aa90 20 70 44 65 66 20 26 26 20 72 63 3d 3d 53 51 4c   pDef && rc==SQL
2aaa0 49 54 45 5f 4f 4b 3b 20 70 44 65 66 3d 70 44 65  ITE_OK; pDef=pDe
2aab0 66 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  f->pNext){.     
2aac0 20 69 66 28 20 70 44 65 66 2d 3e 70 4c 69 73 74   if( pDef->pList
2aad0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2aae0 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74   fts3PendingList
2aaf0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 44  AppendVarint(&pD
2ab00 65 66 2d 3e 70 4c 69 73 74 2c 20 30 29 3b 0a 20  ef->pList, 0);. 
2ab10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2ab20 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2ab30 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
2ab40 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 4c 69  3DeferredTokenLi
2ab50 73 74 28 0a 20 20 46 74 73 33 44 65 66 65 72 72  st(.  Fts3Deferr
2ab60 65 64 54 6f 6b 65 6e 20 2a 70 2c 20 0a 20 20 63  edToken *p, .  c
2ab70 68 61 72 20 2a 2a 70 70 44 61 74 61 2c 20 0a 20  har **ppData, . 
2ab80 20 69 6e 74 20 2a 70 6e 44 61 74 61 0a 29 7b 0a   int *pnData.){.
2ab90 20 20 63 68 61 72 20 2a 70 52 65 74 3b 0a 20 20    char *pRet;.  
2aba0 69 6e 74 20 6e 53 6b 69 70 3b 0a 20 20 73 71 6c  int nSkip;.  sql
2abb0 69 74 65 33 5f 69 6e 74 36 34 20 64 75 6d 6d 79  ite3_int64 dummy
2abc0 3b 0a 0a 20 20 2a 70 70 44 61 74 61 20 3d 20 30  ;..  *ppData = 0
2abd0 3b 0a 20 20 2a 70 6e 44 61 74 61 20 3d 20 30 3b  ;.  *pnData = 0;
2abe0 0a 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 73 74  ..  if( p->pList
2abf0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
2ac00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2ac10 0a 0a 20 20 70 52 65 74 20 3d 20 28 63 68 61 72  ..  pRet = (char
2ac20 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
2ac30 63 28 70 2d 3e 70 4c 69 73 74 2d 3e 6e 44 61 74  c(p->pList->nDat
2ac40 61 29 3b 0a 20 20 69 66 28 20 21 70 52 65 74 20  a);.  if( !pRet 
2ac50 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2ac60 4e 4f 4d 45 4d 3b 0a 0a 20 20 6e 53 6b 69 70 20  NOMEM;..  nSkip 
2ac70 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74  = sqlite3Fts3Get
2ac80 56 61 72 69 6e 74 28 70 2d 3e 70 4c 69 73 74 2d  Varint(p->pList-
2ac90 3e 61 44 61 74 61 2c 20 26 64 75 6d 6d 79 29 3b  >aData, &dummy);
2aca0 0a 20 20 2a 70 6e 44 61 74 61 20 3d 20 70 2d 3e  .  *pnData = p->
2acb0 70 4c 69 73 74 2d 3e 6e 44 61 74 61 20 2d 20 6e  pList->nData - n
2acc0 53 6b 69 70 3b 0a 20 20 2a 70 70 44 61 74 61 20  Skip;.  *ppData 
2acd0 3d 20 70 52 65 74 3b 0a 20 20 0a 20 20 6d 65 6d  = pRet;.  .  mem
2ace0 63 70 79 28 70 52 65 74 2c 20 26 70 2d 3e 70 4c  cpy(pRet, &p->pL
2acf0 69 73 74 2d 3e 61 44 61 74 61 5b 6e 53 6b 69 70  ist->aData[nSkip
2ad00 5d 2c 20 2a 70 6e 44 61 74 61 29 3b 0a 20 20 72  ], *pnData);.  r
2ad10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2ad20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
2ad30 20 65 6e 74 72 79 20 66 6f 72 20 74 6f 6b 65 6e   entry for token
2ad40 20 70 54 6f 6b 65 6e 20 74 6f 20 74 68 65 20 70   pToken to the p
2ad50 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64 20 6c  Csr->pDeferred l
2ad60 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ist..*/.int sqli
2ad70 74 65 33 46 74 73 33 44 65 66 65 72 54 6f 6b 65  te3Fts3DeferToke
2ad80 6e 28 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20  n(.  Fts3Cursor 
2ad90 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20 20  *pCsr,          
2ada0 20 20 20 20 20 2f 2a 20 46 74 73 33 20 74 61 62       /* Fts3 tab
2adb0 6c 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 46  le cursor */.  F
2adc0 74 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a  ts3PhraseToken *
2add0 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 2f  pToken,        /
2ade0 2a 20 54 6f 6b 65 6e 20 74 6f 20 64 65 66 65 72  * Token to defer
2adf0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20   */.  int iCol  
2ae00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae10 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
2ae20 74 68 61 74 20 74 6f 6b 65 6e 20 6d 75 73 74 20  that token must 
2ae30 61 70 70 65 61 72 20 69 6e 20 28 6f 72 20 2d 31  appear in (or -1
2ae40 29 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 44 65  ) */.){.  Fts3De
2ae50 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70 44 65  ferredToken *pDe
2ae60 66 65 72 72 65 64 3b 0a 20 20 70 44 65 66 65 72  ferred;.  pDefer
2ae70 72 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  red = sqlite3_ma
2ae80 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 44 65  lloc(sizeof(*pDe
2ae90 66 65 72 72 65 64 29 29 3b 0a 20 20 69 66 28 20  ferred));.  if( 
2aea0 21 70 44 65 66 65 72 72 65 64 20 29 7b 0a 20 20  !pDeferred ){.  
2aeb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2aec0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d  NOMEM;.  }.  mem
2aed0 73 65 74 28 70 44 65 66 65 72 72 65 64 2c 20 30  set(pDeferred, 0
2aee0 2c 20 73 69 7a 65 6f 66 28 2a 70 44 65 66 65 72  , sizeof(*pDefer
2aef0 72 65 64 29 29 3b 0a 20 20 70 44 65 66 65 72 72  red));.  pDeferr
2af00 65 64 2d 3e 70 54 6f 6b 65 6e 20 3d 20 70 54 6f  ed->pToken = pTo
2af10 6b 65 6e 3b 0a 20 20 70 44 65 66 65 72 72 65 64  ken;.  pDeferred
2af20 2d 3e 70 4e 65 78 74 20 3d 20 70 43 73 72 2d 3e  ->pNext = pCsr->
2af30 70 44 65 66 65 72 72 65 64 3b 20 0a 20 20 70 44  pDeferred; .  pD
2af40 65 66 65 72 72 65 64 2d 3e 69 43 6f 6c 20 3d 20  eferred->iCol = 
2af50 69 43 6f 6c 3b 0a 20 20 70 43 73 72 2d 3e 70 44  iCol;.  pCsr->pD
2af60 65 66 65 72 72 65 64 20 3d 20 70 44 65 66 65 72  eferred = pDefer
2af70 72 65 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  red;..  assert( 
2af80 70 54 6f 6b 65 6e 2d 3e 70 44 65 66 65 72 72 65  pToken->pDeferre
2af90 64 3d 3d 30 20 29 3b 0a 20 20 70 54 6f 6b 65 6e  d==0 );.  pToken
2afa0 2d 3e 70 44 65 66 65 72 72 65 64 20 3d 20 70 44  ->pDeferred = pD
2afb0 65 66 65 72 72 65 64 3b 0a 0a 20 20 72 65 74 75  eferred;..  retu
2afc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2afd0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 51  #endif../*.** SQ
2afe0 4c 69 74 65 20 76 61 6c 75 65 20 70 52 6f 77 69  Lite value pRowi
2aff0 64 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72  d contains the r
2b000 6f 77 69 64 20 6f 66 20 61 20 72 6f 77 20 74 68  owid of a row th
2b010 61 74 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  at may or may no
2b020 74 20 62 65 0a 2a 2a 20 70 72 65 73 65 6e 74 20  t be.** present 
2b030 69 6e 20 74 68 65 20 46 54 53 33 20 74 61 62 6c  in the FTS3 tabl
2b040 65 2e 20 49 66 20 69 74 20 69 73 2c 20 64 65 6c  e. If it is, del
2b050 65 74 65 20 69 74 20 61 6e 64 20 61 64 6a 75 73  ete it and adjus
2b060 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  t the contents.*
2b070 2a 20 6f 66 20 73 75 62 73 69 64 75 61 72 79 20  * of subsiduary 
2b080 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
2b090 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a  accordingly..*/.
2b0a0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 44  static int fts3D
2b0b0 65 6c 65 74 65 42 79 52 6f 77 69 64 28 0a 20 20  eleteByRowid(.  
2b0c0 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 0a 20  Fts3Table *p, . 
2b0d0 20 69 36 34 20 69 52 6f 77 69 64 2c 0a 20 20 69   i64 iRowid,.  i
2b0e0 6e 74 20 2a 70 6e 43 68 6e 67 2c 20 20 20 20 20  nt *pnChng,     
2b0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b100 2a 20 49 4e 2f 4f 55 54 3a 20 44 65 63 72 65 6d  * IN/OUT: Decrem
2b110 65 6e 74 20 69 66 20 72 6f 77 20 69 73 20 64 65  ent if row is de
2b120 6c 65 74 65 64 20 2a 2f 0a 20 20 75 33 32 20 2a  leted */.  u32 *
2b130 61 53 7a 44 65 6c 0a 29 7b 0a 20 20 69 6e 74 20  aSzDel.){.  int 
2b140 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2b150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2b160 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2b170 69 6e 74 20 62 46 6f 75 6e 64 20 3d 20 30 3b 20  int bFound = 0; 
2b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b190 2f 2a 20 54 72 75 65 20 69 66 20 2a 70 52 6f 77  /* True if *pRow
2b1a0 69 64 20 72 65 61 6c 6c 79 20 69 73 20 69 6e 20  id really is in 
2b1b0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20  the table */..  
2b1c0 66 74 73 33 44 65 6c 65 74 65 54 65 72 6d 73 28  fts3DeleteTerms(
2b1d0 26 72 63 2c 20 70 2c 20 69 52 6f 77 69 64 2c 20  &rc, p, iRowid, 
2b1e0 61 53 7a 44 65 6c 2c 20 26 62 46 6f 75 6e 64 29  aSzDel, &bFound)
2b1f0 3b 0a 20 20 69 66 28 20 62 46 6f 75 6e 64 20 26  ;.  if( bFound &
2b200 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
2b210 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 45 6d 70  ){.    int isEmp
2b220 74 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ty = 0;         
2b230 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 69 6e 67       /* Deleting
2b240 20 2a 70 52 6f 77 69 64 20 6c 65 61 76 65 73 20   *pRowid leaves 
2b250 74 68 65 20 74 61 62 6c 65 20 65 6d 70 74 79 20  the table empty 
2b260 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  */.    rc = fts3
2b270 49 73 45 6d 70 74 79 28 70 2c 20 69 52 6f 77 69  IsEmpty(p, iRowi
2b280 64 2c 20 26 69 73 45 6d 70 74 79 29 3b 0a 20 20  d, &isEmpty);.  
2b290 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2b2a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
2b2b0 20 69 73 45 6d 70 74 79 20 29 7b 0a 20 20 20 20   isEmpty ){.    
2b2c0 20 20 20 20 2f 2a 20 44 65 6c 65 74 69 6e 67 20      /* Deleting 
2b2d0 74 68 69 73 20 72 6f 77 20 6d 65 61 6e 73 20 74  this row means t
2b2e0 68 65 20 77 68 6f 6c 65 20 74 61 62 6c 65 20 69  he whole table i
2b2f0 73 20 65 6d 70 74 79 2e 20 49 6e 20 74 68 69 73  s empty. In this
2b300 20 63 61 73 65 0a 20 20 20 20 20 20 20 20 2a 2a   case.        **
2b310 20 64 65 6c 65 74 65 20 74 68 65 20 63 6f 6e 74   delete the cont
2b320 65 6e 74 73 20 6f 66 20 61 6c 6c 20 74 68 72 65  ents of all thre
2b330 65 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 72  e tables and thr
2b340 6f 77 20 61 77 61 79 20 61 6e 79 0a 20 20 20 20  ow away any.    
2b350 20 20 20 20 2a 2a 20 64 61 74 61 20 69 6e 20 74      ** data in t
2b360 68 65 20 70 65 6e 64 69 6e 67 54 65 72 6d 73 20  he pendingTerms 
2b370 68 61 73 68 20 74 61 62 6c 65 2e 20 20 2a 2f 0a  hash table.  */.
2b380 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
2b390 33 44 65 6c 65 74 65 41 6c 6c 28 70 2c 20 31 29  3DeleteAll(p, 1)
2b3a0 3b 0a 20 20 20 20 20 20 20 20 2a 70 6e 43 68 6e  ;.        *pnChn
2b3b0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6d  g = 0;.        m
2b3c0 65 6d 73 65 74 28 61 53 7a 44 65 6c 2c 20 30 2c  emset(aSzDel, 0,
2b3d0 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2a 20 28   sizeof(u32) * (
2b3e0 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 20 2a 20  p->nColumn+1) * 
2b3f0 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  2);.      }else{
2b400 0a 20 20 20 20 20 20 20 20 2a 70 6e 43 68 6e 67  .        *pnChng
2b410 20 3d 20 2a 70 6e 43 68 6e 67 20 2d 20 31 3b 0a   = *pnChng - 1;.
2b420 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a          if( p->z
2b430 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d 30 20 29 7b  ContentTbl==0 ){
2b440 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33 53  .          fts3S
2b450 71 6c 45 78 65 63 49 36 34 28 26 72 63 2c 20 70  qlExecI64(&rc, p
2b460 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 43 4f 4e  , SQL_DELETE_CON
2b470 54 45 4e 54 2c 20 69 52 6f 77 69 64 29 3b 0a 20  TENT, iRowid);. 
2b480 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b490 20 69 66 28 20 70 2d 3e 62 48 61 73 44 6f 63 73   if( p->bHasDocs
2b4a0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
2b4b0 20 66 74 73 33 53 71 6c 45 78 65 63 49 36 34 28   fts3SqlExecI64(
2b4c0 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c 45  &rc, p, SQL_DELE
2b4d0 54 45 5f 44 4f 43 53 49 5a 45 2c 20 69 52 6f 77  TE_DOCSIZE, iRow
2b4e0 69 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  id);.        }. 
2b4f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2b500 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2b510 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
2b520 61 20 64 6f 63 69 64 20 28 69 44 6f 63 69 64 29  a docid (iDocid)
2b530 20 61 6e 64 20 61 20 6c 61 6e 67 75 61 67 65 20   and a language 
2b540 69 64 20 28 69 4c 61 6e 67 69 64 29 20 74 6f 20  id (iLangid) to 
2b550 61 20 72 6f 77 69 64 2c 0a 2a 2a 20 61 63 63 6f  a rowid,.** acco
2b560 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6e  rding to the con
2b570 66 69 67 75 72 65 64 20 6c 61 6e 67 75 61 67 65  figured language
2b580 69 64 5f 62 69 74 73 3d 20 76 61 6c 75 65 20 62  id_bits= value b
2b590 65 6c 6f 6e 67 69 6e 67 20 74 6f 0a 2a 2a 20 46  elonging to.** F
2b5a0 54 53 20 74 61 62 6c 65 20 2a 70 2e 0a 2a 2f 0a  TS table *p..*/.
2b5b0 69 36 34 20 73 71 6c 69 74 65 33 46 74 73 33 44  i64 sqlite3Fts3D
2b5c0 6f 63 69 64 54 6f 52 6f 77 69 64 28 46 74 73 33  ocidToRowid(Fts3
2b5d0 54 61 62 6c 65 20 2a 70 2c 20 69 36 34 20 69 44  Table *p, i64 iD
2b5e0 6f 63 69 64 2c 20 69 6e 74 20 69 4c 61 6e 67 69  ocid, int iLangi
2b5f0 64 29 7b 0a 20 20 69 36 34 20 69 52 6f 77 69 64  d){.  i64 iRowid
2b600 20 3d 20 69 44 6f 63 69 64 3b 0a 20 20 69 66 28   = iDocid;.  if(
2b610 20 70 2d 3e 6e 4c 61 6e 67 75 61 67 65 69 64 42   p->nLanguageidB
2b620 69 74 73 20 29 7b 0a 20 20 20 20 69 52 6f 77 69  its ){.    iRowi
2b630 64 20 3d 20 28 69 52 6f 77 69 64 20 3c 3c 20 70  d = (iRowid << p
2b640 2d 3e 6e 4c 61 6e 67 75 61 67 65 69 64 42 69 74  ->nLanguageidBit
2b650 73 29 20 2b 20 69 4c 61 6e 67 69 64 3b 0a 20 20  s) + iLangid;.  
2b660 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 6f 77 69  }.  return iRowi
2b670 64 3b 0a 7d 0a 0a 69 36 34 20 73 71 6c 69 74 65  d;.}..i64 sqlite
2b680 33 46 74 73 33 52 6f 77 69 64 54 6f 44 6f 63 69  3Fts3RowidToDoci
2b690 64 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20  d(Fts3Table *p, 
2b6a0 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 72  i64 iRowid){.  r
2b6b0 65 74 75 72 6e 20 28 69 52 6f 77 69 64 20 3e 3e  eturn (iRowid >>
2b6c0 20 70 2d 3e 6e 4c 61 6e 67 75 61 67 65 69 64 42   p->nLanguageidB
2b6d0 69 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  its);.}../*.** T
2b6e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
2b6f0 73 20 74 68 65 20 77 6f 72 6b 20 66 6f 72 20 74  s the work for t
2b700 68 65 20 78 55 70 64 61 74 65 20 6d 65 74 68 6f  he xUpdate metho
2b710 64 20 6f 66 20 46 54 53 33 20 76 69 72 74 75 61  d of FTS3 virtua
2b720 6c 0a 2a 2a 20 74 61 62 6c 65 73 2e 20 54 68 65  l.** tables. The
2b730 20 73 63 68 65 6d 61 20 6f 66 20 74 68 65 20 76   schema of the v
2b740 69 72 74 75 61 6c 20 74 61 62 6c 65 20 62 65 69  irtual table bei
2b750 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52  ng:.**.**     CR
2b760 45 41 54 45 20 54 41 42 4c 45 20 3c 74 61 62 6c  EATE TABLE <tabl
2b770 65 20 6e 61 6d 65 3e 28 20 0a 2a 2a 20 20 20 20  e name>( .**    
2b780 20 20 20 3c 75 73 65 72 20 63 6f 6c 75 6d 6e 73     <user columns
2b790 3e 2c 0a 2a 2a 20 20 20 20 20 20 20 3c 74 61 62  >,.**       <tab
2b7a0 6c 65 20 6e 61 6d 65 3e 20 48 49 44 44 45 4e 2c  le name> HIDDEN,
2b7b0 20 0a 2a 2a 20 20 20 20 20 20 20 64 6f 63 69 64   .**       docid
2b7c0 20 48 49 44 44 45 4e 2c 20 0a 2a 2a 20 20 20 20   HIDDEN, .**    
2b7d0 20 20 20 3c 6c 61 6e 67 69 64 3e 20 48 49 44 44     <langid> HIDD
2b7e0 45 4e 0a 2a 2a 20 20 20 20 20 29 3b 0a 2a 2a 0a  EN.**     );.**.
2b7f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
2b800 73 33 55 70 64 61 74 65 4d 65 74 68 6f 64 28 0a  s3UpdateMethod(.
2b810 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
2b820 70 56 74 61 62 2c 20 20 20 20 20 20 20 20 20 20  pVtab,          
2b830 20 20 2f 2a 20 46 54 53 33 20 76 74 61 62 20 6f    /* FTS3 vtab o
2b840 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  bject */.  int n
2b850 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
2b860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2b870 7a 65 20 6f 66 20 61 72 67 75 6d 65 6e 74 20 61  ze of argument a
2b880 72 72 61 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rray */.  sqlite
2b890 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c  3_value **apVal,
2b8a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
2b8b0 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  ay of arguments 
2b8c0 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  */.  sqlite_int6
2b8d0 34 20 2a 70 52 6f 77 69 64 20 20 20 20 20 20 20  4 *pRowid       
2b8e0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 68 65       /* OUT: The
2b8f0 20 61 66 66 65 63 74 65 64 20 28 6f 72 20 65 66   affected (or ef
2b900 66 65 63 74 65 64 29 20 72 6f 77 69 64 20 2a 2f  fected) rowid */
2b910 0a 29 7b 0a 20 20 46 74 73 33 54 61 62 6c 65 20  .){.  Fts3Table 
2b920 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65 20  *p = (Fts3Table 
2b930 2a 29 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72  *)pVtab;.  int r
2b940 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2b950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2b960 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69  turn Code */.  i
2b970 6e 74 20 69 73 52 65 6d 6f 76 65 20 3d 20 30 3b  nt isRemove = 0;
2b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b990 2a 20 54 72 75 65 20 66 6f 72 20 61 6e 20 55 50  * True for an UP
2b9a0 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 2a  DATE or DELETE *
2b9b0 2f 0a 20 20 75 33 32 20 2a 61 53 7a 49 6e 73 20  /.  u32 *aSzIns 
2b9c0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2b9d0 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20      /* Sizes of 
2b9e0 69 6e 73 65 72 74 65 64 20 64 6f 63 75 6d 65 6e  inserted documen
2b9f0 74 73 20 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a  ts */.  u32 *aSz
2ba00 44 65 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Del = 0;        
2ba10 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73          /* Sizes
2ba20 20 6f 66 20 64 65 6c 65 74 65 64 20 64 6f 63 75   of deleted docu
2ba30 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  ments */.  int n
2ba40 43 68 6e 67 20 3d 20 30 3b 20 20 20 20 20 20 20  Chng = 0;       
2ba50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
2ba60 74 20 63 68 61 6e 67 65 20 69 6e 20 6e 75 6d 62  t change in numb
2ba70 65 72 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20  er of documents 
2ba80 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 73 65 72 74  */.  int bInsert
2ba90 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Done = 0;.  int 
2baa0 69 4c 61 6e 67 69 64 20 3d 20 30 3b 0a 0a 20 20  iLangid = 0;..  
2bab0 61 73 73 65 72 74 28 20 70 2d 3e 70 53 65 67 6d  assert( p->pSegm
2bac0 65 6e 74 73 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ents==0 );.  ass
2bad0 65 72 74 28 20 0a 20 20 20 20 20 20 6e 41 72 67  ert( .      nArg
2bae0 3d 3d 31 20 20 20 20 20 20 20 20 20 20 20 20 20  ==1             
2baf0 20 20 20 20 20 20 20 20 2f 2a 20 44 45 4c 45 54          /* DELET
2bb00 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a  E operations */.
2bb10 20 20 20 7c 7c 20 6e 41 72 67 3d 3d 28 32 20 2b     || nArg==(2 +
2bb20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b 20 33 29   p->nColumn + 3)
2bb30 20 20 2f 2a 20 49 4e 53 45 52 54 20 6f 72 20 55    /* INSERT or U
2bb40 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 73  PDATE operations
2bb50 20 2a 2f 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 43   */.  );..  /* C
2bb60 68 65 63 6b 20 66 6f 72 20 61 20 22 73 70 65 63  heck for a "spec
2bb70 69 61 6c 22 20 49 4e 53 45 52 54 20 6f 70 65 72  ial" INSERT oper
2bb80 61 74 69 6f 6e 2e 20 4f 6e 65 20 6f 66 20 74 68  ation. One of th
2bb90 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a  e form:.  **.  *
2bba0 2a 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  *   INSERT INTO 
2bbb0 78 79 7a 28 78 79 7a 29 20 56 41 4c 55 45 53 28  xyz(xyz) VALUES(
2bbc0 27 63 6f 6d 6d 61 6e 64 27 29 3b 0a 20 20 2a 2f  'command');.  */
2bbd0 0a 20 20 69 66 28 20 6e 41 72 67 3e 31 20 0a 20  .  if( nArg>1 . 
2bbe0 20 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c    && sqlite3_val
2bbf0 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 30 5d  ue_type(apVal[0]
2bc00 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 0a  )==SQLITE_NULL .
2bc10 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61     && sqlite3_va
2bc20 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 70  lue_type(apVal[p
2bc30 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 5d 29 21 3d 53  ->nColumn+2])!=S
2bc40 51 4c 49 54 45 5f 4e 55 4c 4c 20 0a 20 20 29 7b  QLITE_NULL .  ){
2bc50 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 70  .    rc = fts3Sp
2bc60 65 63 69 61 6c 49 6e 73 65 72 74 28 70 2c 20 61  ecialInsert(p, a
2bc70 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  pVal[p->nColumn+
2bc80 32 5d 29 3b 0a 20 20 20 20 67 6f 74 6f 20 75 70  2]);.    goto up
2bc90 64 61 74 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  date_out;.  }.. 
2bca0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
2bcb0 6e 20 49 4e 53 45 52 54 20 6f 72 20 55 50 44 41  n INSERT or UPDA
2bcc0 54 45 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74  TE, check that t
2bcd0 68 65 20 6e 65 77 20 76 61 6c 75 65 20 66 6f 72  he new value for
2bce0 20 74 68 65 0a 20 20 2a 2a 20 6c 61 6e 67 75 61   the.  ** langua
2bcf0 67 65 69 64 20 69 73 20 77 69 74 68 69 6e 20 72  geid is within r
2bd00 61 6e 67 65 2e 20 41 20 6c 61 6e 67 75 61 67 65  ange. A language
2bd10 69 64 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20  id can never be 
2bd20 61 20 6e 65 67 61 74 69 76 65 20 0a 20 20 2a 2a  a negative .  **
2bd30 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65 20 6c   value. If the l
2bd40 61 6e 67 75 61 67 65 69 64 5f 62 69 74 73 20 6f  anguageid_bits o
2bd50 70 74 69 6f 6e 20 77 61 73 20 73 70 65 63 69 66  ption was specif
2bd60 69 65 64 20 77 68 65 6e 20 74 68 69 73 20 74 61  ied when this ta
2bd70 62 6c 65 20 0a 20 20 2a 2a 20 77 61 73 20 63 72  ble .  ** was cr
2bd80 65 61 74 65 64 2c 20 69 74 20 6d 75 73 74 20 61  eated, it must a
2bd90 6c 73 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e  lso be less than
2bda0 20 28 32 20 5e 20 6e 4c 61 6e 67 75 61 67 65 69   (2 ^ nLanguagei
2bdb0 64 42 69 74 73 29 2e 20 20 0a 20 20 2a 2a 0a 20  dBits).  .  **. 
2bdc0 20 2a 2a 20 41 6c 73 6f 20 63 68 65 63 6b 20 74   ** Also check t
2bdd0 68 61 74 20 69 66 20 61 20 6e 6f 6e 2d 7a 65 72  hat if a non-zer
2bde0 6f 20 6c 61 6e 67 75 61 67 65 69 64 5f 62 69 74  o languageid_bit
2bdf0 73 20 76 61 6c 75 65 20 77 61 73 20 63 6f 6e 66  s value was conf
2be00 69 67 75 72 65 64 2c 0a 20 20 2a 2a 20 74 68 65  igured,.  ** the
2be10 20 73 70 65 63 69 66 69 65 64 20 72 6f 77 69 64   specified rowid
2be20 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 4e   value must be N
2be30 55 4c 4c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ULL..  */.  if( 
2be40 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20 20 69 4c  nArg>1 ){.    iL
2be50 61 6e 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  angid = sqlite3_
2be60 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b  value_int(apVal[
2be70 32 20 2b 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b  2 + p->nColumn +
2be80 20 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 4c   2]);.    if( iL
2be90 61 6e 67 69 64 3c 30 20 7c 7c 20 28 70 2d 3e 6e  angid<0 || (p->n
2bea0 4c 61 6e 67 75 61 67 65 69 64 42 69 74 73 20 26  LanguageidBits &
2beb0 26 20 69 4c 61 6e 67 69 64 3e 3d 28 31 3c 3c 70  & iLangid>=(1<<p
2bec0 2d 3e 6e 4c 61 6e 67 75 61 67 65 69 64 42 69 74  ->nLanguageidBit
2bed0 73 29 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  s)) ){.      rc 
2bee0 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  = SQLITE_CONSTRA
2bef0 49 4e 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  INT;.      goto 
2bf00 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20  update_out;.    
2bf10 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4c  }..    if( p->nL
2bf20 61 6e 67 75 61 67 65 69 64 42 69 74 73 20 0a 20  anguageidBits . 
2bf30 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 76      && sqlite3_v
2bf40 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b  alue_type(apVal[
2bf50 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  0])==SQLITE_NULL
2bf60 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
2bf70 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61  _value_type(apVa
2bf80 6c 5b 31 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55  l[1])!=SQLITE_NU
2bf90 4c 4c 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  LL.    ){.      
2bfa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
2bfb0 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 67 6f  TRAINT;.      go
2bfc0 74 6f 20 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20  to update_out;. 
2bfd0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
2bfe0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 74 6f  llocate space to
2bff0 20 68 6f 6c 64 20 74 68 65 20 63 68 61 6e 67 65   hold the change
2c000 20 69 6e 20 64 6f 63 75 6d 65 6e 74 20 73 69 7a   in document siz
2c010 65 73 20 2a 2f 0a 20 20 61 53 7a 44 65 6c 20 3d  es */.  aSzDel =
2c020 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
2c030 20 73 69 7a 65 6f 66 28 61 53 7a 44 65 6c 5b 30   sizeof(aSzDel[0
2c040 5d 29 2a 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31  ])*(p->nColumn+1
2c050 29 2a 32 20 29 3b 0a 20 20 69 66 28 20 61 53 7a  )*2 );.  if( aSz
2c060 44 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  Del==0 ){.    rc
2c070 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2c080 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65  .    goto update
2c090 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 61 53 7a 49  _out;.  }.  aSzI
2c0a0 6e 73 20 3d 20 26 61 53 7a 44 65 6c 5b 70 2d 3e  ns = &aSzDel[p->
2c0b0 6e 43 6f 6c 75 6d 6e 2b 31 5d 3b 0a 20 20 6d 65  nColumn+1];.  me
2c0c0 6d 73 65 74 28 61 53 7a 44 65 6c 2c 20 30 2c 20  mset(aSzDel, 0, 
2c0d0 73 69 7a 65 6f 66 28 61 53 7a 44 65 6c 5b 30 5d  sizeof(aSzDel[0]
2c0e0 29 2a 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29  )*(p->nColumn+1)
2c0f0 2a 32 29 3b 0a 0a 20 20 72 63 20 3d 20 66 74 73  *2);..  rc = fts
2c100 33 57 72 69 74 65 6c 6f 63 6b 28 70 29 3b 0a 20  3Writelock(p);. 
2c110 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c120 4f 4b 20 29 20 67 6f 74 6f 20 75 70 64 61 74 65  OK ) goto update
2c130 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  _out;..  /* If t
2c140 68 69 73 20 69 73 20 61 6e 20 49 4e 53 45 52 54  his is an INSERT
2c150 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 61   operation, or a
2c160 6e 20 55 50 44 41 54 45 20 74 68 61 74 20 6d 6f  n UPDATE that mo
2c170 64 69 66 69 65 73 20 74 68 65 20 72 6f 77 69 64  difies the rowid
2c180 0a 20 20 2a 2a 20 76 61 6c 75 65 2c 20 74 68 65  .  ** value, the
2c190 6e 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  n this operation
2c1a0 20 72 65 71 75 69 72 65 73 20 63 6f 6e 73 74 72   requires constr
2c1b0 61 69 6e 74 20 68 61 6e 64 6c 69 6e 67 2e 0a 20  aint handling.. 
2c1c0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
2c1d0 6f 6e 2d 63 6f 6e 66 6c 69 63 74 20 6d 6f 64 65  on-conflict mode
2c1e0 20 69 73 20 52 45 50 4c 41 43 45 2c 20 74 68 69   is REPLACE, thi
2c1f0 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
2c200 20 65 78 69 73 74 69 6e 67 20 72 6f 77 0a 20 20   existing row.  
2c210 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 64 65 6c  ** should be del
2c220 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  eted from the da
2c230 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 69 6e  tabase before in
2c240 73 65 72 74 69 6e 67 20 74 68 65 20 6e 65 77 20  serting the new 
2c250 72 6f 77 2e 20 4f 72 2c 0a 20 20 2a 2a 20 69 66  row. Or,.  ** if
2c260 20 74 68 65 20 6f 6e 2d 63 6f 6e 66 6c 69 63 74   the on-conflict
2c270 20 6d 6f 64 65 20 69 73 20 6f 74 68 65 72 20 74   mode is other t
2c280 68 61 6e 20 52 45 50 4c 41 43 45 2c 20 74 68 65  han REPLACE, the
2c290 6e 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6d 75  n this method mu
2c2a0 73 74 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74  st.  ** detect t
2c2b0 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6e 64 20  he conflict and 
2c2c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2c2d0 4e 53 54 52 41 49 4e 54 20 62 65 66 6f 72 65 20  NSTRAINT before 
2c2e0 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 20 20 2a  beginning to.  *
2c2f0 2a 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74  * modify the dat
2c300 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  abase file..  */
2c310 0a 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26  .  if( nArg>1 &&
2c320 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d   p->zContentTbl=
2c330 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 6e  =0 ){.    /* Fin
2c340 64 20 74 68 65 20 76 61 6c 75 65 20 6f 62 6a 65  d the value obje
2c350 63 74 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  ct that holds th
2c360 65 20 6e 65 77 20 72 6f 77 69 64 20 76 61 6c 75  e new rowid valu
2c370 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
2c380 33 5f 76 61 6c 75 65 20 2a 70 4e 65 77 44 6f 63  3_value *pNewDoc
2c390 69 64 20 3d 20 61 70 56 61 6c 5b 33 2b 70 2d 3e  id = apVal[3+p->
2c3a0 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 69 66  nColumn];.    if
2c3b0 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
2c3c0 74 79 70 65 28 70 4e 65 77 44 6f 63 69 64 29 3d  type(pNewDocid)=
2c3d0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a  =SQLITE_NULL ){.
2c3e0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 4c 61        if( p->nLa
2c3f0 6e 67 75 61 67 65 69 64 42 69 74 73 20 29 7b 0a  nguageidBits ){.
2c400 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2c410 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
2c420 20 20 20 20 20 20 20 20 67 6f 74 6f 20 75 70 64          goto upd
2c430 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ate_out;.      }
2c440 0a 20 20 20 20 20 20 70 4e 65 77 44 6f 63 69 64  .      pNewDocid
2c450 20 3d 20 61 70 56 61 6c 5b 31 5d 3b 0a 20 20 20   = apVal[1];.   
2c460 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
2c470 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70  e3_value_type(ap
2c480 56 61 6c 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f  Val[0])==SQLITE_
2c490 4e 55 4c 4c 20 0a 20 20 20 20 20 20 20 20 20 20  NULL .          
2c4a0 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   && sqlite3_valu
2c4b0 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 31 5d 29  e_type(apVal[1])
2c4c0 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 0a 20  !=SQLITE_NULL . 
2c4d0 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
2c4e0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2c4f0 20 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65       goto update
2c500 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
2c510 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
2c520 75 65 5f 74 79 70 65 28 70 4e 65 77 44 6f 63 69  ue_type(pNewDoci
2c530 64 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  d)!=SQLITE_NULL 
2c540 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 20 3d  ){.      int e =
2c550 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e   sqlite3_value_n
2c560 75 6d 65 72 69 63 5f 74 79 70 65 28 70 4e 65 77  umeric_type(pNew
2c570 44 6f 63 69 64 29 3b 0a 20 20 20 20 20 20 69 36  Docid);.      i6
2c580 34 20 69 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  4 iRowid = sqlit
2c590 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 70  e3_value_int64(p
2c5a0 4e 65 77 44 6f 63 69 64 29 3b 0a 0a 20 20 20 20  NewDocid);..    
2c5b0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
2c5c0 74 68 65 20 76 61 6c 75 65 20 73 70 65 63 69 66  the value specif
2c5d0 69 65 64 20 62 79 20 74 68 65 20 75 73 65 72 20  ied by the user 
2c5e0 6d 61 79 20 62 65 20 6c 6f 73 73 6c 65 73 73 6c  may be losslessl
2c5f0 79 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65  y.      ** conve
2c600 72 74 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 67  rted to an integ
2c610 65 72 2e 20 49 66 20 6e 6f 74 2c 20 72 65 74 75  er. If not, retu
2c620 72 6e 20 61 20 22 64 61 74 61 20 6d 69 73 6d 61  rn a "data misma
2c630 74 63 68 22 20 65 72 72 6f 72 2e 20 20 2a 2f 0a  tch" error.  */.
2c640 20 20 20 20 20 20 69 66 28 20 28 65 21 3d 53 51        if( (e!=SQ
2c650 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 20 20  LITE_INTEGER).  
2c660 20 20 20 20 20 26 26 20 28 65 21 3d 53 51 4c 49       && (e!=SQLI
2c670 54 45 5f 46 4c 4f 41 54 20 7c 7c 20 28 64 6f 75  TE_FLOAT || (dou
2c680 62 6c 65 29 69 52 6f 77 69 64 21 3d 73 71 6c 69  ble)iRowid!=sqli
2c690 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
2c6a0 28 70 4e 65 77 44 6f 63 69 64 29 29 0a 20 20 20  (pNewDocid)).   
2c6b0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63     ){.        rc
2c6c0 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54   = SQLITE_MISMAT
2c6d0 43 48 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  CH;.        goto
2c6e0 20 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20 20 20   update_out;.   
2c6f0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
2c700 70 2d 3e 6e 4c 61 6e 67 75 61 67 65 69 64 42 69  p->nLanguageidBi
2c710 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ts ){.        /*
2c720 20 43 68 65 63 6b 20 66 6f 72 20 61 6e 20 6f 75   Check for an ou
2c730 74 2d 6f 66 2d 72 61 6e 67 65 20 64 6f 63 69 64  t-of-range docid
2c740 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 20   value. */.     
2c750 20 20 20 69 66 28 20 69 52 6f 77 69 64 3e 3d 28     if( iRowid>=(
2c760 28 69 36 34 29 31 20 3c 3c 20 28 36 33 20 2d 20  (i64)1 << (63 - 
2c770 70 2d 3e 6e 4c 61 6e 67 75 61 67 65 69 64 42 69  p->nLanguageidBi
2c780 74 73 29 29 20 0a 20 20 20 20 20 20 20 20 20 7c  ts)) .         |
2c790 7c 20 69 52 6f 77 69 64 3c 2d 31 2a 28 28 69 36  | iRowid<-1*((i6
2c7a0 34 29 31 20 3c 3c 20 28 36 33 20 2d 20 70 2d 3e  4)1 << (63 - p->
2c7b0 6e 4c 61 6e 67 75 61 67 65 69 64 42 69 74 73 29  nLanguageidBits)
2c7c0 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ) .        ){.  
2c7d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2c7e0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
2c7f0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 75            goto u
2c800 70 64 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 20  pdate_out;.     
2c810 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 52     }..        iR
2c820 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 46 74  owid = sqlite3Ft
2c830 73 33 44 6f 63 69 64 54 6f 52 6f 77 69 64 28 70  s3DocidToRowid(p
2c840 2c 20 69 52 6f 77 69 64 2c 20 69 4c 61 6e 67 69  , iRowid, iLangi
2c850 64 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  d);.      }..   
2c860 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76     if( sqlite3_v
2c870 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b  alue_type(apVal[
2c880 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  0])==SQLITE_NULL
2c890 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74  .       || sqlit
2c8a0 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
2c8b0 70 56 61 6c 5b 30 5d 29 21 3d 69 52 6f 77 69 64  pVal[0])!=iRowid
2c8c0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
2c8d0 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 77    /* The new row
2c8e0 69 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28  id is not NULL (
2c8f0 69 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  in this case the
2c900 20 72 6f 77 69 64 20 77 69 6c 6c 20 62 65 0a 20   rowid will be. 
2c910 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61         ** automa
2c920 74 69 63 61 6c 6c 79 20 61 73 73 69 67 6e 65 64  tically assigned
2c930 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
2c940 20 63 68 61 6e 63 65 20 6f 66 20 61 20 63 6f 6e   chance of a con
2c950 66 6c 69 63 74 29 2c 20 61 6e 64 20 0a 20 20 20  flict), and .   
2c960 20 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74       ** the stat
2c970 65 6d 65 6e 74 20 69 73 20 65 69 74 68 65 72 20  ement is either 
2c980 61 6e 20 49 4e 53 45 52 54 20 6f 72 20 61 6e 20  an INSERT or an 
2c990 55 50 44 41 54 45 20 74 68 61 74 20 6d 6f 64 69  UPDATE that modi
2c9a0 66 69 65 73 20 74 68 65 0a 20 20 20 20 20 20 20  fies the.       
2c9b0 20 2a 2a 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e   ** rowid column
2c9c0 2e 20 53 6f 20 69 66 20 74 68 65 20 63 6f 6e 66  . So if the conf
2c9d0 6c 69 63 74 20 6d 6f 64 65 20 69 73 20 52 45 50  lict mode is REP
2c9e0 4c 41 43 45 2c 20 74 68 65 6e 20 64 65 6c 65 74  LACE, then delet
2c9f0 65 20 61 6e 79 0a 20 20 20 20 20 20 20 20 2a 2a  e any.        **
2ca00 20 65 78 69 73 74 69 6e 67 20 72 6f 77 20 77 69   existing row wi
2ca10 74 68 20 72 6f 77 69 64 3d 70 4e 65 77 52 6f 77  th rowid=pNewRow
2ca20 69 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a  id. .        **.
2ca30 20 20 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69          ** Or, i
2ca40 66 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 6d  f the conflict m
2ca50 6f 64 65 20 69 73 20 6e 6f 74 20 52 45 50 4c 41  ode is not REPLA
2ca60 43 45 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e  CE, insert the n
2ca70 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 0a  ew record into .
2ca80 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 25          ** the %
2ca90 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e 20  _content table. 
2caa0 49 66 20 77 65 20 68 69 74 20 74 68 65 20 64 75  If we hit the du
2cab0 70 6c 69 63 61 74 65 20 72 6f 77 69 64 20 63 6f  plicate rowid co
2cac0 6e 73 74 72 61 69 6e 74 20 28 6f 72 20 0a 20 20  nstraint (or .  
2cad0 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 6f 74 68        ** any oth
2cae0 65 72 20 65 72 72 6f 72 29 20 77 68 69 6c 65 20  er error) while 
2caf0 64 6f 69 6e 67 20 73 6f 2c 20 72 65 74 75 72 6e  doing so, return
2cb00 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
2cb10 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2cb20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   ** This branch 
2cb30 6d 61 79 20 61 6c 73 6f 20 72 75 6e 20 69 66 20  may also run if 
2cb40 70 4e 65 77 52 6f 77 69 64 20 63 6f 6e 74 61 69  pNewRowid contai
2cb50 6e 73 20 61 20 76 61 6c 75 65 20 74 68 61 74 20  ns a value that 
2cb60 63 61 6e 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a  cannot.        *
2cb70 2a 20 62 65 20 6c 6f 73 73 6c 65 73 73 6c 79 20  * be losslessly 
2cb80 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61 6e 20  converted to an 
2cb90 69 6e 74 65 67 65 72 2e 20 49 6e 20 74 68 69 73  integer. In this
2cba0 20 63 61 73 65 2c 20 74 68 65 20 65 76 65 6e 74   case, the event
2cbb0 75 61 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ual .        ** 
2cbc0 63 61 6c 6c 20 74 6f 20 66 74 73 33 49 6e 73 65  call to fts3Inse
2cbd0 72 74 44 61 74 61 28 29 20 28 65 69 74 68 65 72  rtData() (either
2cbe0 20 6a 75 73 74 20 62 65 6c 6f 77 20 6f 72 20 66   just below or f
2cbf0 75 72 74 68 65 72 20 6f 6e 20 69 6e 20 74 68 69  urther on in thi
2cc00 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e  s.        ** fun
2cc10 63 74 69 6f 6e 29 20 77 69 6c 6c 20 72 65 74 75  ction) will retu
2cc20 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54  rn SQLITE_MISMAT
2cc30 43 48 2e 20 49 66 20 66 74 73 33 44 65 6c 65 74  CH. If fts3Delet
2cc40 65 42 79 52 6f 77 69 64 20 69 73 20 0a 20 20 20  eByRowid is .   
2cc50 20 20 20 20 20 2a 2a 20 69 6e 76 6f 6b 65 64 2c       ** invoked,
2cc60 20 69 74 20 77 69 6c 6c 20 64 65 6c 65 74 65 20   it will delete 
2cc70 7a 65 72 6f 20 72 6f 77 73 20 28 73 69 6e 63 65  zero rows (since
2cc80 20 6e 6f 20 72 6f 77 20 77 69 6c 6c 20 68 61 76   no row will hav
2cc90 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 63  e.        ** doc
2cca0 69 64 3d 24 70 4e 65 77 52 6f 77 69 64 20 69 66  id=$pNewRowid if
2ccb0 20 24 70 4e 65 77 52 6f 77 69 64 20 69 73 20 6e   $pNewRowid is n
2ccc0 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61  ot an integer va
2ccd0 6c 75 65 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f  lue)..        */
2cce0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
2ccf0 69 74 65 33 5f 76 74 61 62 5f 6f 6e 5f 63 6f 6e  ite3_vtab_on_con
2cd00 66 6c 69 63 74 28 70 2d 3e 64 62 29 3d 3d 53 51  flict(p->db)==SQ
2cd10 4c 49 54 45 5f 52 45 50 4c 41 43 45 20 29 7b 0a  LITE_REPLACE ){.
2cd20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 66            rc = f
2cd30 74 73 33 44 65 6c 65 74 65 42 79 52 6f 77 69 64  ts3DeleteByRowid
2cd40 28 70 2c 20 69 52 6f 77 69 64 2c 20 26 6e 43 68  (p, iRowid, &nCh
2cd50 6e 67 2c 20 61 53 7a 44 65 6c 29 3b 0a 20 20 20  ng, aSzDel);.   
2cd60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2cd70 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 49        rc = fts3I
2cd80 6e 73 65 72 74 44 61 74 61 28 70 2c 20 61 70 56  nsertData(p, apV
2cd90 61 6c 2c 20 30 2c 20 69 52 6f 77 69 64 29 3b 0a  al, 0, iRowid);.
2cda0 20 20 20 20 20 20 20 20 20 20 62 49 6e 73 65 72            bInser
2cdb0 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  tDone = 1;.     
2cdc0 20 20 20 20 20 2a 70 52 6f 77 69 64 20 3d 20 69       *pRowid = i
2cdd0 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d  Rowid;.        }
2cde0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2cdf0 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
2ce00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
2ce10 74 6f 20 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20  to update_out;. 
2ce20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
2ce30 20 69 73 20 61 20 44 45 4c 45 54 45 20 6f 72 20   is a DELETE or 
2ce40 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e  UPDATE operation
2ce50 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 6c 64  , remove the old
2ce60 20 72 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 69 66   record. */.  if
2ce70 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
2ce80 74 79 70 65 28 61 70 56 61 6c 5b 30 5d 29 21 3d  type(apVal[0])!=
2ce90 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20  SQLITE_NULL ){. 
2cea0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2ceb0 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70  e3_value_type(ap
2cec0 56 61 6c 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f  Val[0])==SQLITE_
2ced0 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 72  INTEGER );.    r
2cee0 63 20 3d 20 66 74 73 33 44 65 6c 65 74 65 42 79  c = fts3DeleteBy
2cef0 52 6f 77 69 64 28 70 2c 20 73 71 6c 69 74 65 33  Rowid(p, sqlite3
2cf00 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 56  _value_int64(apV
2cf10 61 6c 5b 30 5d 29 2c 20 26 6e 43 68 6e 67 2c 20  al[0]), &nChng, 
2cf20 61 53 7a 44 65 6c 29 3b 0a 20 20 20 20 69 73 52  aSzDel);.    isR
2cf30 65 6d 6f 76 65 20 3d 20 31 3b 0a 20 20 7d 0a 20  emove = 1;.  }. 
2cf40 20 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69   .  /* If this i
2cf50 73 20 61 6e 20 49 4e 53 45 52 54 20 6f 72 20 55  s an INSERT or U
2cf60 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 2c  PDATE operation,
2cf70 20 69 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   insert the new 
2cf80 72 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 69 66 28  record. */.  if(
2cf90 20 6e 41 72 67 3e 31 20 26 26 20 72 63 3d 3d 53   nArg>1 && rc==S
2cfa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2cfb0 69 66 28 20 62 49 6e 73 65 72 74 44 6f 6e 65 3d  if( bInsertDone=
2cfc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
2cfd0 20 66 74 73 33 49 6e 73 65 72 74 44 61 74 61 28   fts3InsertData(
2cfe0 70 2c 20 61 70 56 61 6c 2c 20 70 52 6f 77 69 64  p, apVal, pRowid
2cff0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2d000 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  rc==SQLITE_CONST
2d010 52 41 49 4e 54 20 26 26 20 70 2d 3e 7a 43 6f 6e  RAINT && p->zCon
2d020 74 65 6e 74 54 62 6c 3d 3d 30 20 29 7b 0a 20 20  tentTbl==0 ){.  
2d030 20 20 20 20 20 20 72 63 20 3d 20 46 54 53 5f 43        rc = FTS_C
2d040 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 20  ORRUPT_VTAB;.   
2d050 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2d060 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2d070 20 26 26 20 28 21 69 73 52 65 6d 6f 76 65 20 7c   && (!isRemove |
2d080 7c 20 2a 70 52 6f 77 69 64 21 3d 70 2d 3e 69 50  | *pRowid!=p->iP
2d090 72 65 76 44 6f 63 69 64 20 29 20 29 7b 0a 20 20  revDocid ) ){.  
2d0a0 20 20 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e      rc = fts3Pen
2d0b0 64 69 6e 67 54 65 72 6d 73 44 6f 63 69 64 28 70  dingTermsDocid(p
2d0c0 2c 20 69 4c 61 6e 67 69 64 2c 20 2a 70 52 6f 77  , iLangid, *pRow
2d0d0 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  id);.    }.    i
2d0e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2d0f0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2d100 28 20 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 3d  ( p->iPrevDocid=
2d110 3d 2a 70 52 6f 77 69 64 20 29 3b 0a 20 20 20 20  =*pRowid );.    
2d120 20 20 72 63 20 3d 20 66 74 73 33 49 6e 73 65 72    rc = fts3Inser
2d130 74 54 65 72 6d 73 28 70 2c 20 69 4c 61 6e 67 69  tTerms(p, iLangi
2d140 64 2c 20 61 70 56 61 6c 2c 20 61 53 7a 49 6e 73  d, apVal, aSzIns
2d150 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2d160 20 70 2d 3e 62 48 61 73 44 6f 63 73 69 7a 65 20   p->bHasDocsize 
2d170 29 7b 0a 20 20 20 20 20 20 66 74 73 33 49 6e 73  ){.      fts3Ins
2d180 65 72 74 44 6f 63 73 69 7a 65 28 26 72 63 2c 20  ertDocsize(&rc, 
2d190 70 2c 20 61 53 7a 49 6e 73 29 3b 0a 20 20 20 20  p, aSzIns);.    
2d1a0 7d 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20  }.    nChng++;. 
2d1b0 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 62 46 74   }..  if( p->bFt
2d1c0 73 34 20 29 7b 0a 20 20 20 20 66 74 73 33 55 70  s4 ){.    fts3Up
2d1d0 64 61 74 65 44 6f 63 54 6f 74 61 6c 73 28 26 72  dateDocTotals(&r
2d1e0 63 2c 20 70 2c 20 61 53 7a 49 6e 73 2c 20 61 53  c, p, aSzIns, aS
2d1f0 7a 44 65 6c 2c 20 6e 43 68 6e 67 29 3b 0a 20 20  zDel, nChng);.  
2d200 7d 0a 0a 20 75 70 64 61 74 65 5f 6f 75 74 3a 0a  }.. update_out:.
2d210 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
2d220 53 7a 44 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65  SzDel);.  sqlite
2d230 33 46 74 73 33 53 65 67 6d 65 6e 74 73 43 6c 6f  3Fts3SegmentsClo
2d240 73 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  se(p);.  return 
2d250 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 46 6c  rc;.}../* .** Fl
2d260 75 73 68 20 61 6e 79 20 64 61 74 61 20 69 6e 20  ush any data in 
2d270 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d  the pending-term
2d280 73 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20  s hash table to 
2d290 64 69 73 6b 2e 20 49 66 20 73 75 63 63 65 73 73  disk. If success
2d2a0 66 75 6c 2c 0a 2a 2a 20 6d 65 72 67 65 20 61 6c  ful,.** merge al
2d2b0 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68  l segments in th
2d2c0 65 20 64 61 74 61 62 61 73 65 20 28 69 6e 63 6c  e database (incl
2d2d0 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 73 65  uding the new se
2d2e0 67 6d 65 6e 74 2c 20 69 66 20 0a 2a 2a 20 74 68  gment, if .** th
2d2f0 65 72 65 20 77 61 73 20 61 6e 79 20 64 61 74 61  ere was any data
2d300 20 74 6f 20 66 6c 75 73 68 29 20 69 6e 74 6f 20   to flush) into 
2d310 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74  a single segment
2d320 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
2d330 33 46 74 73 33 4f 70 74 69 6d 69 7a 65 28 46 74  3Fts3Optimize(Ft
2d340 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69  s3Table *p){.  i
2d350 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  nt rc;.  rc = sq
2d360 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
2d370 2c 20 22 53 41 56 45 50 4f 49 4e 54 20 66 74 73  , "SAVEPOINT fts
2d380 33 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  3", 0, 0, 0);.  
2d390 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2d3a0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  K ){.    rc = ft
2d3b0 73 33 44 6f 4f 70 74 69 6d 69 7a 65 28 70 2c 20  s3DoOptimize(p, 
2d3c0 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  1);.    if( rc==
2d3d0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d  SQLITE_OK || rc=
2d3e0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
2d3f0 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20        int rc2 = 
2d400 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
2d410 64 62 2c 20 22 52 45 4c 45 41 53 45 20 66 74 73  db, "RELEASE fts
2d420 33 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  3", 0, 0, 0);.  
2d430 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
2d440 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
2d450 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  2;.    }else{.  
2d460 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
2d470 28 70 2d 3e 64 62 2c 20 22 52 4f 4c 4c 42 41 43  (p->db, "ROLLBAC
2d480 4b 20 54 4f 20 66 74 73 33 22 2c 20 30 2c 20 30  K TO fts3", 0, 0
2d490 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
2d4a0 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
2d4b0 22 52 45 4c 45 41 53 45 20 66 74 73 33 22 2c 20  "RELEASE fts3", 
2d4c0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, 0, 0);.    }.
2d4d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 46 74 73    }.  sqlite3Fts
2d4e0 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28 70  3SegmentsClose(p
2d4f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2d500 7d 0a 0a 23 65 6e 64 69 66 0a                    }..#endif.