/ Hex Artifact Content
Login

Artifact cdead226658c3e67c12b334407dfb952de0c3c811f2980c57211fea902e45aaa:


0000: 2f 2a 0a 2a 2a 20 32 30 30 39 20 4f 63 74 20 32  /*.** 2009 Oct 2
0010: 33 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  3.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 69 73 20 70 61 72 74 20 6f 66   file is part of
0190: 20 74 68 65 20 53 51 4c 69 74 65 20 46 54 53 33   the SQLite FTS3
01a0: 20 65 78 74 65 6e 73 69 6f 6e 20 6d 6f 64 75 6c   extension modul
01b0: 65 2e 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c  e. Specifically,
01c0: 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 20 63 6f  .** this file co
01d0: 6e 74 61 69 6e 73 20 63 6f 64 65 20 74 6f 20 69  ntains code to i
01e0: 6e 73 65 72 74 2c 20 75 70 64 61 74 65 20 61 6e  nsert, update an
01f0: 64 20 64 65 6c 65 74 65 20 72 6f 77 73 20 66 72  d delete rows fr
0200: 6f 6d 20 46 54 53 33 0a 2a 2a 20 74 61 62 6c 65  om FTS3.** table
0210: 73 2e 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61  s. It also conta
0220: 69 6e 73 20 63 6f 64 65 20 74 6f 20 6d 65 72 67  ins code to merg
0230: 65 20 46 54 53 33 20 62 2d 74 72 65 65 20 73 65  e FTS3 b-tree se
0240: 67 6d 65 6e 74 73 2e 20 53 6f 6d 65 0a 2a 2a 20  gments. Some.** 
0250: 6f 66 20 74 68 65 20 73 75 62 2d 72 6f 75 74 69  of the sub-routi
0260: 6e 65 73 20 75 73 65 64 20 74 6f 20 6d 65 72 67  nes used to merg
0270: 65 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20 61  e segments are a
0280: 6c 73 6f 20 75 73 65 64 20 62 79 20 74 68 65 20  lso used by the 
0290: 71 75 65 72 79 20 0a 2a 2a 20 63 6f 64 65 20 69  query .** code i
02a0: 6e 20 66 74 73 33 2e 63 2e 0a 2a 2f 0a 0a 23 69  n fts3.c..*/..#i
02b0: 6e 63 6c 75 64 65 20 22 66 74 73 33 49 6e 74 2e  nclude "fts3Int.
02c0: 68 22 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  h".#if !defined(
02d0: 53 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20  SQLITE_CORE) || 
02e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
02f0: 4e 41 42 4c 45 5f 46 54 53 33 29 0a 0a 23 69 6e  NABLE_FTS3)..#in
0300: 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e  clude <string.h>
0310: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  .#include <asser
0320: 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  t.h>.#include <s
0330: 74 64 6c 69 62 2e 68 3e 0a 0a 0a 23 64 65 66 69  tdlib.h>...#defi
0340: 6e 65 20 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e  ne FTS_MAX_APPEN
0350: 44 41 42 4c 45 5f 48 45 49 47 48 54 20 31 36 0a  DABLE_HEIGHT 16.
0360: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 66 75 6c 6c  ./*.** When full
0370: 2d 74 65 78 74 20 69 6e 64 65 78 20 6e 6f 64 65  -text index node
0380: 73 20 61 72 65 20 6c 6f 61 64 65 64 20 66 72 6f  s are loaded fro
0390: 6d 20 64 69 73 6b 2c 20 74 68 65 20 62 75 66 66  m disk, the buff
03a0: 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20  er that they.** 
03b0: 61 72 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20  are loaded into 
03c0: 68 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  has the followin
03d0: 67 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  g number of byte
03e0: 73 20 6f 66 20 70 61 64 64 69 6e 67 20 61 74 20  s of padding at 
03f0: 74 68 65 20 65 6e 64 20 0a 2a 2a 20 6f 66 20 69  the end .** of i
0400: 74 2e 20 69 2e 65 2e 20 69 66 20 61 20 66 75 6c  t. i.e. if a ful
0410: 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 6e 6f 64  l-text index nod
0420: 65 20 69 73 20 39 30 30 20 62 79 74 65 73 20 69  e is 900 bytes i
0430: 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 61 20 62  n size, then a b
0440: 75 66 66 65 72 0a 2a 2a 20 6f 66 20 39 32 30 20  uffer.** of 920 
0450: 62 79 74 65 73 20 69 73 20 61 6c 6c 6f 63 61 74  bytes is allocat
0460: 65 64 20 66 6f 72 20 69 74 2e 0a 2a 2a 0a 2a 2a  ed for it..**.**
0470: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
0480: 20 69 66 20 77 65 20 68 61 76 65 20 61 20 70 6f   if we have a po
0490: 69 6e 74 65 72 20 69 6e 74 6f 20 61 20 62 75 66  inter into a buf
04a0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e  fer containing n
04b0: 6f 64 65 20 64 61 74 61 2c 0a 2a 2a 20 69 74 20  ode data,.** it 
04c0: 69 73 20 61 6c 77 61 79 73 20 73 61 66 65 20 74  is always safe t
04d0: 6f 20 72 65 61 64 20 75 70 20 74 6f 20 74 77 6f  o read up to two
04e0: 20 76 61 72 69 6e 74 73 20 66 72 6f 6d 20 69 74   varints from it
04f0: 20 77 69 74 68 6f 75 74 20 72 69 73 6b 69 6e 67   without risking
0500: 20 61 6e 0a 2a 2a 20 6f 76 65 72 72 65 61 64 2c   an.** overread,
0510: 20 65 76 65 6e 20 69 66 20 74 68 65 20 6e 6f 64   even if the nod
0520: 65 20 64 61 74 61 20 69 73 20 63 6f 72 72 75 70  e data is corrup
0530: 74 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ted..*/.#define 
0540: 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49 4e  FTS3_NODE_PADDIN
0550: 47 20 28 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d  G (FTS3_VARINT_M
0560: 41 58 2a 32 29 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64  AX*2)../*.** Und
0570: 65 72 20 63 65 72 74 61 69 6e 20 63 69 72 63 75  er certain circu
0580: 6d 73 74 61 6e 63 65 73 2c 20 62 2d 74 72 65 65  mstances, b-tree
0590: 20 6e 6f 64 65 73 20 28 64 6f 63 6c 69 73 74 73   nodes (doclists
05a0: 29 20 63 61 6e 20 62 65 20 6c 6f 61 64 65 64 20  ) can be loaded 
05b0: 69 6e 74 6f 0a 2a 2a 20 6d 65 6d 6f 72 79 20 69  into.** memory i
05c0: 6e 63 72 65 6d 65 6e 74 61 6c 6c 79 20 69 6e 73  ncrementally ins
05d0: 74 65 61 64 20 6f 66 20 61 6c 6c 20 61 74 20 6f  tead of all at o
05e0: 6e 63 65 2e 20 54 68 69 73 20 63 61 6e 20 62 65  nce. This can be
05f0: 20 61 20 62 69 67 20 70 65 72 66 6f 72 6d 61 6e   a big performan
0600: 63 65 0a 2a 2a 20 77 69 6e 20 28 72 65 64 75 63  ce.** win (reduc
0610: 65 64 20 49 4f 20 61 6e 64 20 43 50 55 29 20 69  ed IO and CPU) i
0620: 66 20 53 51 4c 69 74 65 20 73 74 6f 70 73 20 63  f SQLite stops c
0630: 61 6c 6c 69 6e 67 20 74 68 65 20 76 69 72 74 75  alling the virtu
0640: 61 6c 20 74 61 62 6c 65 20 78 4e 65 78 74 28 29  al table xNext()
0650: 0a 2a 2a 20 6d 65 74 68 6f 64 20 62 65 66 6f 72  .** method befor
0660: 65 20 72 65 74 72 69 65 76 69 6e 67 20 61 6c 6c  e retrieving all
0670: 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 28   query results (
0680: 61 73 20 6d 61 79 20 68 61 70 70 65 6e 2c 20 66  as may happen, f
0690: 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 69  or example,.** i
06a0: 66 20 61 20 71 75 65 72 79 20 68 61 73 20 61 20  f a query has a 
06b0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 29 2e 0a 2a  LIMIT clause)..*
06c0: 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 61 6c  *.** Incremental
06d0: 20 6c 6f 61 64 69 6e 67 20 69 73 20 75 73 65 64   loading is used
06e0: 20 66 6f 72 20 62 2d 74 72 65 65 20 6e 6f 64 65   for b-tree node
06f0: 73 20 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e  s FTS3_NODE_CHUN
0700: 4b 5f 54 48 52 45 53 48 4f 4c 44 20 0a 2a 2a 20  K_THRESHOLD .** 
0710: 62 79 74 65 73 20 61 6e 64 20 6c 61 72 67 65 72  bytes and larger
0720: 2e 20 4e 6f 64 65 73 20 61 72 65 20 6c 6f 61 64  . Nodes are load
0730: 65 64 20 69 6e 20 63 68 75 6e 6b 73 20 6f 66 20  ed in chunks of 
0740: 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 53  FTS3_NODE_CHUNKS
0750: 49 5a 45 20 62 79 74 65 73 2e 0a 2a 2a 20 54 68  IZE bytes..** Th
0760: 65 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  e code is writte
0770: 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 68 61  n so that the ha
0780: 72 64 20 6c 6f 77 65 72 2d 6c 69 6d 69 74 20 66  rd lower-limit f
0790: 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 73 65  or each of these
07a0: 20 76 61 6c 75 65 73 20 0a 2a 2a 20 69 73 20 31   values .** is 1
07b0: 2e 20 43 6c 65 61 72 6c 79 20 73 75 63 68 20 73  . Clearly such s
07c0: 6d 61 6c 6c 20 76 61 6c 75 65 73 20 77 6f 75 6c  mall values woul
07d0: 64 20 62 65 20 69 6e 65 66 66 69 63 69 65 6e 74  d be inefficient
07e0: 2c 20 62 75 74 20 63 61 6e 20 62 65 20 75 73 65  , but can be use
07f0: 66 75 6c 20 0a 2a 2a 20 66 6f 72 20 74 65 73 74  ful .** for test
0800: 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2a  ing purposes..**
0810: 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 6f 64 75  .** If this modu
0820: 6c 65 20 69 73 20 62 75 69 6c 74 20 77 69 74 68  le is built with
0830: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 64 65 66   SQLITE_TEST def
0840: 69 6e 65 64 2c 20 74 68 65 73 65 20 63 6f 6e 73  ined, these cons
0850: 74 61 6e 74 73 20 6d 61 79 0a 2a 2a 20 62 65 20  tants may.** be 
0860: 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75  overridden at ru
0870: 6e 74 69 6d 65 20 66 6f 72 20 74 65 73 74 69 6e  ntime for testin
0880: 67 20 70 75 72 70 6f 73 65 73 2e 20 46 69 6c 65  g purposes. File
0890: 20 66 74 73 33 5f 74 65 73 74 2e 63 20 63 6f 6e   fts3_test.c con
08a0: 74 61 69 6e 73 0a 2a 2a 20 61 20 54 63 6c 20 69  tains.** a Tcl i
08b0: 6e 74 65 72 66 61 63 65 20 74 6f 20 72 65 61 64  nterface to read
08c0: 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 76   and write the v
08d0: 61 6c 75 65 73 2e 0a 2a 2f 0a 23 69 66 64 65 66  alues..*/.#ifdef
08e0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
08f0: 20 74 65 73 74 5f 66 74 73 33 5f 6e 6f 64 65 5f   test_fts3_node_
0900: 63 68 75 6e 6b 73 69 7a 65 20 3d 20 28 34 2a 31  chunksize = (4*1
0910: 30 32 34 29 3b 0a 69 6e 74 20 74 65 73 74 5f 66  024);.int test_f
0920: 74 73 33 5f 6e 6f 64 65 5f 63 68 75 6e 6b 5f 74  ts3_node_chunk_t
0930: 68 72 65 73 68 6f 6c 64 20 3d 20 28 34 2a 31 30  hreshold = (4*10
0940: 32 34 29 2a 34 3b 0a 23 20 64 65 66 69 6e 65 20  24)*4;.# define 
0950: 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 53  FTS3_NODE_CHUNKS
0960: 49 5a 45 20 20 20 20 20 20 20 74 65 73 74 5f 66  IZE       test_f
0970: 74 73 33 5f 6e 6f 64 65 5f 63 68 75 6e 6b 73 69  ts3_node_chunksi
0980: 7a 65 0a 23 20 64 65 66 69 6e 65 20 46 54 53 33  ze.# define FTS3
0990: 5f 4e 4f 44 45 5f 43 48 55 4e 4b 5f 54 48 52 45  _NODE_CHUNK_THRE
09a0: 53 48 4f 4c 44 20 74 65 73 74 5f 66 74 73 33 5f  SHOLD test_fts3_
09b0: 6e 6f 64 65 5f 63 68 75 6e 6b 5f 74 68 72 65 73  node_chunk_thres
09c0: 68 6f 6c 64 0a 23 65 6c 73 65 0a 23 20 64 65 66  hold.#else.# def
09d0: 69 6e 65 20 46 54 53 33 5f 4e 4f 44 45 5f 43 48  ine FTS3_NODE_CH
09e0: 55 4e 4b 53 49 5a 45 20 28 34 2a 31 30 32 34 29  UNKSIZE (4*1024)
09f0: 20 0a 23 20 64 65 66 69 6e 65 20 46 54 53 33 5f   .# define FTS3_
0a00: 4e 4f 44 45 5f 43 48 55 4e 4b 5f 54 48 52 45 53  NODE_CHUNK_THRES
0a10: 48 4f 4c 44 20 28 46 54 53 33 5f 4e 4f 44 45 5f  HOLD (FTS3_NODE_
0a20: 43 48 55 4e 4b 53 49 5a 45 2a 34 29 0a 23 65 6e  CHUNKSIZE*4).#en
0a30: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  dif../*.** The t
0a40: 77 6f 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d  wo values that m
0a50: 61 79 20 62 65 20 6d 65 61 6e 69 6e 67 66 75 6c  ay be meaningful
0a60: 6c 79 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 20  ly bound to the 
0a70: 3a 31 20 70 61 72 61 6d 65 74 65 72 20 69 6e 0a  :1 parameter in.
0a80: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 53 51  ** statements SQ
0a90: 4c 5f 52 45 50 4c 41 43 45 5f 53 54 41 54 20 61  L_REPLACE_STAT a
0aa0: 6e 64 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 54  nd SQL_SELECT_ST
0ab0: 41 54 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46  AT..*/.#define F
0ac0: 54 53 5f 53 54 41 54 5f 44 4f 43 54 4f 54 41 4c  TS_STAT_DOCTOTAL
0ad0: 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20        0.#define 
0ae0: 46 54 53 5f 53 54 41 54 5f 49 4e 43 52 4d 45 52  FTS_STAT_INCRMER
0af0: 47 45 48 49 4e 54 20 31 0a 23 64 65 66 69 6e 65  GEHINT 1.#define
0b00: 20 46 54 53 5f 53 54 41 54 5f 41 55 54 4f 49 4e   FTS_STAT_AUTOIN
0b10: 43 52 4d 45 52 47 45 20 32 0a 0a 2f 2a 0a 2a 2a  CRMERGE 2../*.**
0b20: 20 49 66 20 46 54 53 5f 4c 4f 47 5f 4d 45 52 47   If FTS_LOG_MERG
0b30: 45 53 20 69 73 20 64 65 66 69 6e 65 64 2c 20 63  ES is defined, c
0b40: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  all sqlite3_log(
0b50: 29 20 74 6f 20 72 65 70 6f 72 74 20 65 61 63 68  ) to report each
0b60: 20 61 75 74 6f 6d 61 74 69 63 0a 2a 2a 20 61 6e   automatic.** an
0b70: 64 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  d incremental me
0b80: 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 20 74 68  rge operation th
0b90: 61 74 20 74 61 6b 65 73 20 70 6c 61 63 65 2e 20  at takes place. 
0ba0: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
0bb0: 20 0a 2a 2a 20 64 65 62 75 67 67 69 6e 67 20 46   .** debugging F
0bc0: 54 53 20 6f 6e 6c 79 2c 20 69 74 20 73 68 6f 75  TS only, it shou
0bd0: 6c 64 20 6e 6f 74 20 75 73 75 61 6c 6c 79 20 62  ld not usually b
0be0: 65 20 74 75 72 6e 65 64 20 6f 6e 20 69 6e 20 70  e turned on in p
0bf0: 72 6f 64 75 63 74 69 6f 6e 0a 2a 2a 20 73 79 73  roduction.** sys
0c00: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  tems..*/.#ifdef 
0c10: 46 54 53 33 5f 4c 4f 47 5f 4d 45 52 47 45 53 0a  FTS3_LOG_MERGES.
0c20: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
0c30: 4c 6f 67 4d 65 72 67 65 28 69 6e 74 20 6e 4d 65  LogMerge(int nMe
0c40: 72 67 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  rge, sqlite3_int
0c50: 36 34 20 69 41 62 73 4c 65 76 65 6c 29 7b 0a 20  64 iAbsLevel){. 
0c60: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
0c70: 49 54 45 5f 4f 4b 2c 20 22 25 64 2d 77 61 79 20  ITE_OK, "%d-way 
0c80: 6d 65 72 67 65 20 66 72 6f 6d 20 6c 65 76 65 6c  merge from level
0c90: 20 25 64 22 2c 20 6e 4d 65 72 67 65 2c 20 28 69   %d", nMerge, (i
0ca0: 6e 74 29 69 41 62 73 4c 65 76 65 6c 29 3b 0a 7d  nt)iAbsLevel);.}
0cb0: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 66  .#else.#define f
0cc0: 74 73 33 4c 6f 67 4d 65 72 67 65 28 78 2c 20 79  ts3LogMerge(x, y
0cd0: 29 0a 23 65 6e 64 69 66 0a 0a 0a 74 79 70 65 64  ).#endif...typed
0ce0: 65 66 20 73 74 72 75 63 74 20 50 65 6e 64 69 6e  ef struct Pendin
0cf0: 67 4c 69 73 74 20 50 65 6e 64 69 6e 67 4c 69 73  gList PendingLis
0d00: 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  t;.typedef struc
0d10: 74 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 53 65  t SegmentNode Se
0d20: 67 6d 65 6e 74 4e 6f 64 65 3b 0a 74 79 70 65 64  gmentNode;.typed
0d30: 65 66 20 73 74 72 75 63 74 20 53 65 67 6d 65 6e  ef struct Segmen
0d40: 74 57 72 69 74 65 72 20 53 65 67 6d 65 6e 74 57  tWriter SegmentW
0d50: 72 69 74 65 72 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  riter;../*.** An
0d60: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
0d70: 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 61 74 61 20   following data 
0d80: 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65  structure is use
0d90: 64 20 74 6f 20 62 75 69 6c 64 20 64 6f 63 6c 69  d to build docli
0da0: 73 74 73 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74  sts.** increment
0db0: 61 6c 6c 79 2e 20 53 65 65 20 66 75 6e 63 74 69  ally. See functi
0dc0: 6f 6e 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69  on fts3PendingLi
0dd0: 73 74 41 70 70 65 6e 64 28 29 20 66 6f 72 20 64  stAppend() for d
0de0: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 73 74 72 75 63  etails..*/.struc
0df0: 74 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 7b 0a  t PendingList {.
0e00: 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20 20 63    int nData;.  c
0e10: 68 61 72 20 2a 61 44 61 74 61 3b 0a 20 20 69 6e  har *aData;.  in
0e20: 74 20 6e 53 70 61 63 65 3b 0a 20 20 73 71 6c 69  t nSpace;.  sqli
0e30: 74 65 33 5f 69 6e 74 36 34 20 69 4c 61 73 74 44  te3_int64 iLastD
0e40: 6f 63 69 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ocid;.  sqlite3_
0e50: 69 6e 74 36 34 20 69 4c 61 73 74 43 6f 6c 3b 0a  int64 iLastCol;.
0e60: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
0e70: 69 4c 61 73 74 50 6f 73 3b 0a 7d 3b 0a 0a 0a 2f  iLastPos;.};.../
0e80: 2a 0a 2a 2a 20 45 61 63 68 20 63 75 72 73 6f 72  *.** Each cursor
0e90: 20 68 61 73 20 61 20 28 70 6f 73 73 69 62 6c 79   has a (possibly
0ea0: 20 65 6d 70 74 79 29 20 6c 69 6e 6b 65 64 20 6c   empty) linked l
0eb0: 69 73 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ist of the follo
0ec0: 77 69 6e 67 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f  wing objects..*/
0ed0: 0a 73 74 72 75 63 74 20 46 74 73 33 44 65 66 65  .struct Fts3Defe
0ee0: 72 72 65 64 54 6f 6b 65 6e 20 7b 0a 20 20 46 74  rredToken {.  Ft
0ef0: 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70  s3PhraseToken *p
0f00: 54 6f 6b 65 6e 3b 20 20 20 20 20 20 20 20 2f 2a  Token;        /*
0f10: 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 6f 72 72   Pointer to corr
0f20: 65 73 70 6f 6e 64 69 6e 67 20 65 78 70 72 20 74  esponding expr t
0f30: 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43  oken */.  int iC
0f40: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
0f50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
0f60: 75 6d 6e 20 74 6f 6b 65 6e 20 6d 75 73 74 20 6f  umn token must o
0f70: 63 63 75 72 20 69 6e 20 2a 2f 0a 20 20 46 74 73  ccur in */.  Fts
0f80: 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a  3DeferredToken *
0f90: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20  pNext;       /* 
0fa0: 4e 65 78 74 20 69 6e 20 6c 69 73 74 20 6f 66 20  Next in list of 
0fb0: 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 73 20  deferred tokens 
0fc0: 2a 2f 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73 74  */.  PendingList
0fd0: 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20   *pList;        
0fe0: 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20       /* Doclist 
0ff0: 69 73 20 61 73 73 65 6d 62 6c 65 64 20 68 65 72  is assembled her
1000: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  e */.};../*.** A
1010: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
1020: 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
1030: 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
1040: 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 72 6d  through the term
1050: 73 20 6f 6e 0a 2a 2a 20 61 20 63 6f 6e 74 69 67  s on.** a contig
1060: 75 6f 75 73 20 73 65 74 20 6f 66 20 73 65 67 6d  uous set of segm
1070: 65 6e 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20  ent b-tree leaf 
1080: 6e 6f 64 65 73 2e 20 41 6c 74 68 6f 75 67 68 20  nodes. Although 
1090: 74 68 65 20 64 65 74 61 69 6c 73 20 6f 66 0a 2a  the details of.*
10a0: 2a 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  * this structure
10b0: 20 61 72 65 20 6f 6e 6c 79 20 6d 61 6e 69 70 75   are only manipu
10c0: 6c 61 74 65 64 20 62 79 20 63 6f 64 65 20 69 6e  lated by code in
10d0: 20 74 68 69 73 20 66 69 6c 65 2c 20 6f 70 61 71   this file, opaq
10e0: 75 65 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 6f 66  ue handles.** of
10f0: 20 74 79 70 65 20 46 74 73 33 53 65 67 52 65 61   type Fts3SegRea
1100: 64 65 72 2a 20 61 72 65 20 61 6c 73 6f 20 75 73  der* are also us
1110: 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20 66 74  ed by code in ft
1120: 73 33 2e 63 20 74 6f 20 69 74 65 72 61 74 65 20  s3.c to iterate 
1130: 74 68 72 6f 75 67 68 0a 2a 2a 20 74 65 72 6d 73  through.** terms
1140: 20 77 68 65 6e 20 71 75 65 72 79 69 6e 67 20 74   when querying t
1150: 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  he full-text ind
1160: 65 78 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e  ex. See function
1170: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69 74  s:.**.**   sqlit
1180: 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 4e  e3Fts3SegReaderN
1190: 65 77 28 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ew().**   sqlite
11a0: 33 46 74 73 33 53 65 67 52 65 61 64 65 72 46 72  3Fts3SegReaderFr
11b0: 65 65 28 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ee().**   sqlite
11c0: 33 46 74 73 33 53 65 67 52 65 61 64 65 72 49 74  3Fts3SegReaderIt
11d0: 65 72 61 74 65 28 29 0a 2a 2a 0a 2a 2a 20 4d 65  erate().**.** Me
11e0: 74 68 6f 64 73 20 75 73 65 64 20 74 6f 20 6d 61  thods used to ma
11f0: 6e 69 70 75 6c 61 74 65 20 46 74 73 33 53 65 67  nipulate Fts3Seg
1200: 52 65 61 64 65 72 20 73 74 72 75 63 74 75 72 65  Reader structure
1210: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 66 74 73 33 53  s:.**.**   fts3S
1220: 65 67 52 65 61 64 65 72 4e 65 78 74 28 29 0a 2a  egReaderNext().*
1230: 2a 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65  *   fts3SegReade
1240: 72 46 69 72 73 74 44 6f 63 69 64 28 29 0a 2a 2a  rFirstDocid().**
1250: 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72     fts3SegReader
1260: 4e 65 78 74 44 6f 63 69 64 28 29 0a 2a 2f 0a 73  NextDocid().*/.s
1270: 74 72 75 63 74 20 46 74 73 33 53 65 67 52 65 61  truct Fts3SegRea
1280: 64 65 72 20 7b 0a 20 20 69 6e 74 20 69 49 64 78  der {.  int iIdx
1290: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12a0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
12b0: 20 77 69 74 68 69 6e 20 6c 65 76 65 6c 2c 20 6f   within level, o
12c0: 72 20 30 78 37 46 46 46 46 46 46 46 20 66 6f 72  r 0x7FFFFFFF for
12d0: 20 50 54 20 2a 2f 0a 20 20 75 38 20 62 4c 6f 6f   PT */.  u8 bLoo
12e0: 6b 75 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  kup;            
12f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1300: 20 66 6f 72 20 61 20 6c 6f 6f 6b 75 70 20 6f 6e   for a lookup on
1310: 6c 79 20 2a 2f 0a 20 20 75 38 20 72 6f 6f 74 4f  ly */.  u8 rootO
1320: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
1330: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1340: 66 6f 72 20 61 20 72 6f 6f 74 2d 6f 6e 6c 79 20  for a root-only 
1350: 72 65 61 64 65 72 20 2a 2f 0a 0a 20 20 73 71 6c  reader */..  sql
1360: 69 74 65 33 5f 69 6e 74 36 34 20 69 53 74 61 72  ite3_int64 iStar
1370: 74 42 6c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20  tBlock;      /* 
1380: 52 6f 77 69 64 20 6f 66 20 66 69 72 73 74 20 6c  Rowid of first l
1390: 65 61 66 20 62 6c 6f 63 6b 20 74 6f 20 74 72 61  eaf block to tra
13a0: 76 65 72 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  verse */.  sqlit
13b0: 65 33 5f 69 6e 74 36 34 20 69 4c 65 61 66 45 6e  e3_int64 iLeafEn
13c0: 64 42 6c 6f 63 6b 3b 20 20 20 20 2f 2a 20 52 6f  dBlock;    /* Ro
13d0: 77 69 64 20 6f 66 20 66 69 6e 61 6c 20 6c 65 61  wid of final lea
13e0: 66 20 62 6c 6f 63 6b 20 74 6f 20 74 72 61 76 65  f block to trave
13f0: 72 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rse */.  sqlite3
1400: 5f 69 6e 74 36 34 20 69 45 6e 64 42 6c 6f 63 6b  _int64 iEndBlock
1410: 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  ;        /* Rowi
1420: 64 20 6f 66 20 66 69 6e 61 6c 20 62 6c 6f 63 6b  d of final block
1430: 20 69 6e 20 73 65 67 6d 65 6e 74 20 28 6f 72 20   in segment (or 
1440: 30 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  0) */.  sqlite3_
1450: 69 6e 74 36 34 20 69 43 75 72 72 65 6e 74 42 6c  int64 iCurrentBl
1460: 6f 63 6b 3b 20 20 20 20 2f 2a 20 43 75 72 72 65  ock;    /* Curre
1470: 6e 74 20 6c 65 61 66 20 62 6c 6f 63 6b 20 28 6f  nt leaf block (o
1480: 72 20 30 29 20 2a 2f 0a 0a 20 20 63 68 61 72 20  r 0) */..  char 
1490: 2a 61 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  *aNode;         
14a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
14b0: 69 6e 74 65 72 20 74 6f 20 6e 6f 64 65 20 64 61  inter to node da
14c0: 74 61 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  ta (or NULL) */.
14d0: 20 20 69 6e 74 20 6e 4e 6f 64 65 3b 20 20 20 20    int nNode;    
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
1500: 66 65 72 20 61 74 20 61 4e 6f 64 65 20 28 6f 72  fer at aNode (or
1510: 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f   0) */.  int nPo
1520: 70 75 6c 61 74 65 3b 20 20 20 20 20 20 20 20 20  pulate;         
1530: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e           /* If >
1540: 30 2c 20 62 79 74 65 73 20 6f 66 20 62 75 66 66  0, bytes of buff
1550: 65 72 20 61 4e 6f 64 65 5b 5d 20 6c 6f 61 64 65  er aNode[] loade
1560: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62  d */.  sqlite3_b
1570: 6c 6f 62 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20  lob *pBlob;     
1580: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74         /* If not
1590: 20 4e 55 4c 4c 2c 20 62 6c 6f 62 20 68 61 6e 64   NULL, blob hand
15a0: 6c 65 20 74 6f 20 72 65 61 64 20 6e 6f 64 65 20  le to read node 
15b0: 2a 2f 0a 0a 20 20 46 74 73 33 48 61 73 68 45 6c  */..  Fts3HashEl
15c0: 65 6d 20 2a 2a 70 70 4e 65 78 74 45 6c 65 6d 3b  em **ppNextElem;
15d0: 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73  ..  /* Variables
15e0: 20 73 65 74 20 62 79 20 66 74 73 33 53 65 67 52   set by fts3SegR
15f0: 65 61 64 65 72 4e 65 78 74 28 29 2e 20 54 68 65  eaderNext(). The
1600: 73 65 20 6d 61 79 20 62 65 20 72 65 61 64 20 64  se may be read d
1610: 69 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20  irectly.  ** by 
1620: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65 79  the caller. They
1630: 20 61 72 65 20 76 61 6c 69 64 20 66 72 6f 6d 20   are valid from 
1640: 74 68 65 20 74 69 6d 65 20 53 65 67 6d 65 6e 74  the time Segment
1650: 52 65 61 64 65 72 4e 65 77 28 29 20 72 65 74 75  ReaderNew() retu
1660: 72 6e 73 0a 20 20 2a 2a 20 75 6e 74 69 6c 20 53  rns.  ** until S
1670: 65 67 6d 65 6e 74 52 65 61 64 65 72 4e 65 78 74  egmentReaderNext
1680: 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74  () returns somet
1690: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
16a0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 2a 2a 20 28  SQLITE_OK.  ** (
16b0: 69 2e 65 2e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  i.e. SQLITE_DONE
16c0: 29 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  )..  */.  int nT
16d0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
16e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
16f0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
1700: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a  current term */.
1710: 20 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20    char *zTerm;  
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1730: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1740: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a  current term */.
1750: 20 20 69 6e 74 20 6e 54 65 72 6d 41 6c 6c 6f 63    int nTermAlloc
1760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1770: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
1780: 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 62 75 66  ize of zTerm buf
1790: 66 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  fer */.  char *a
17a0: 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20  Doclist;        
17b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
17c0: 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 20 6f  ter to doclist o
17d0: 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  f current entry 
17e0: 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73  */.  int nDoclis
17f0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1800: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1810: 64 6f 63 6c 69 73 74 20 69 6e 20 63 75 72 72 65  doclist in curre
1820: 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 0a 20 20 2f  nt entry */..  /
1830: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1840: 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 75 73  variables are us
1850: 65 64 20 62 79 20 66 74 73 33 53 65 67 52 65 61  ed by fts3SegRea
1860: 64 65 72 4e 65 78 74 44 6f 63 69 64 28 29 20 74  derNextDocid() t
1870: 6f 20 69 74 65 72 61 74 65 20 0a 20 20 2a 2a 20  o iterate .  ** 
1880: 74 68 72 6f 75 67 68 20 74 68 65 20 63 75 72 72  through the curr
1890: 65 6e 74 20 64 6f 63 6c 69 73 74 20 28 61 44 6f  ent doclist (aDo
18a0: 63 6c 69 73 74 2f 6e 44 6f 63 6c 69 73 74 29 2e  clist/nDoclist).
18b0: 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 4f  .  */.  char *pO
18c0: 66 66 73 65 74 4c 69 73 74 3b 0a 20 20 69 6e 74  ffsetList;.  int
18d0: 20 6e 4f 66 66 73 65 74 4c 69 73 74 3b 20 20 20   nOffsetList;   
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18f0: 46 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20 70  For descending p
1900: 65 6e 64 69 6e 67 20 73 65 67 2d 72 65 61 64 65  ending seg-reade
1910: 72 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 71 6c  rs only */.  sql
1920: 69 74 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 69  ite3_int64 iDoci
1930: 64 3b 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 66  d;.};..#define f
1940: 74 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65  ts3SegReaderIsPe
1950: 6e 64 69 6e 67 28 70 29 20 28 28 70 29 2d 3e 70  nding(p) ((p)->p
1960: 70 4e 65 78 74 45 6c 65 6d 21 3d 30 29 0a 23 64  pNextElem!=0).#d
1970: 65 66 69 6e 65 20 66 74 73 33 53 65 67 52 65 61  efine fts3SegRea
1980: 64 65 72 49 73 52 6f 6f 74 4f 6e 6c 79 28 70 29  derIsRootOnly(p)
1990: 20 28 28 70 29 2d 3e 72 6f 6f 74 4f 6e 6c 79 21   ((p)->rootOnly!
19a0: 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  =0)../*.** An in
19b0: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
19c0: 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64  tructure is used
19d0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 73 65 67   to create a seg
19e0: 6d 65 6e 74 20 62 2d 74 72 65 65 20 69 6e 20 74  ment b-tree in t
19f0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  he.** database. 
1a00: 54 68 65 20 69 6e 74 65 72 6e 61 6c 20 64 65 74  The internal det
1a10: 61 69 6c 73 20 6f 66 20 74 68 69 73 20 74 79 70  ails of this typ
1a20: 65 20 61 72 65 20 6f 6e 6c 79 20 61 63 63 65 73  e are only acces
1a30: 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 66 6f  sed by the.** fo
1a40: 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
1a50: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 66 74 73 33 53  s:.**.**   fts3S
1a60: 65 67 57 72 69 74 65 72 41 64 64 28 29 0a 2a 2a  egWriterAdd().**
1a70: 20 20 20 66 74 73 33 53 65 67 57 72 69 74 65 72     fts3SegWriter
1a80: 46 6c 75 73 68 28 29 0a 2a 2a 20 20 20 66 74 73  Flush().**   fts
1a90: 33 53 65 67 57 72 69 74 65 72 46 72 65 65 28 29  3SegWriterFree()
1aa0: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 65 67 6d 65  .*/.struct Segme
1ab0: 6e 74 57 72 69 74 65 72 20 7b 0a 20 20 53 65 67  ntWriter {.  Seg
1ac0: 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65 3b  mentNode *pTree;
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ae0: 50 6f 69 6e 74 65 72 20 74 6f 20 69 6e 74 65 72  Pointer to inter
1af0: 69 6f 72 20 74 72 65 65 20 73 74 72 75 63 74 75  ior tree structu
1b00: 72 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  re */.  sqlite3_
1b10: 69 6e 74 36 34 20 69 46 69 72 73 74 3b 20 20 20  int64 iFirst;   
1b20: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1b30: 20 73 6c 6f 74 20 69 6e 20 25 5f 73 65 67 6d 65   slot in %_segme
1b40: 6e 74 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  nts written */. 
1b50: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1b60: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  Free;           
1b70: 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73 6c   /* Next free sl
1b80: 6f 74 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73  ot in %_segments
1b90: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 72   */.  char *zTer
1ba0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1bb0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1bc0: 20 74 6f 20 70 72 65 76 69 6f 75 73 20 74 65 72   to previous ter
1bd0: 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  m buffer */.  in
1be0: 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20  t nTerm;        
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c00: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1c10: 20 69 6e 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 69   in zTerm */.  i
1c20: 6e 74 20 6e 4d 61 6c 6c 6f 63 3b 20 20 20 20 20  nt nMalloc;     
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c40: 2a 20 53 69 7a 65 20 6f 66 20 6d 61 6c 6c 6f 63  * Size of malloc
1c50: 27 64 20 62 75 66 66 65 72 20 61 74 20 7a 4d 61  'd buffer at zMa
1c60: 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lloc */.  char *
1c70: 7a 4d 61 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20  zMalloc;        
1c80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6c            /* Mal
1c90: 6c 6f 63 27 64 20 73 70 61 63 65 20 28 70 6f 73  loc'd space (pos
1ca0: 73 69 62 6c 79 29 20 75 73 65 64 20 66 6f 72 20  sibly) used for 
1cb0: 7a 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e  zTerm */.  int n
1cc0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1cd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1ce0: 7a 65 20 6f 66 20 61 6c 6c 6f 63 61 74 69 6f 6e  ze of allocation
1cf0: 20 61 74 20 61 44 61 74 61 20 2a 2f 0a 20 20 69   at aData */.  i
1d00: 6e 74 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20  nt nData;       
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d20: 2a 20 42 79 74 65 73 20 6f 66 20 64 61 74 61 20  * Bytes of data 
1d30: 69 6e 20 61 44 61 74 61 20 2a 2f 0a 20 20 63 68  in aData */.  ch
1d40: 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20  ar *aData;      
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d60: 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 6c 6f 63   Pointer to bloc
1d70: 6b 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20  k from malloc() 
1d80: 2a 2f 0a 20 20 69 36 34 20 6e 4c 65 61 66 44 61  */.  i64 nLeafDa
1d90: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
1da0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1db0: 66 20 62 79 74 65 73 20 6f 66 20 6c 65 61 66 20  f bytes of leaf 
1dc0: 64 61 74 61 20 77 72 69 74 74 65 6e 20 2a 2f 0a  data written */.
1dd0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 79 70 65 20 53  };../*.** Type S
1de0: 65 67 6d 65 6e 74 4e 6f 64 65 20 69 73 20 75 73  egmentNode is us
1df0: 65 64 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77  ed by the follow
1e00: 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74 69  ing three functi
1e10: 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a  ons to create.**
1e20: 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 70 61   the interior pa
1e30: 72 74 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e  rt of the segmen
1e40: 74 20 62 2b 2d 74 72 65 65 20 73 74 72 75 63 74  t b+-tree struct
1e50: 75 72 65 73 20 28 65 76 65 72 79 74 68 69 6e 67  ures (everything
1e60: 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 65 20 6c   except.** the l
1e70: 65 61 66 20 6e 6f 64 65 73 29 2e 20 54 68 65 73  eaf nodes). Thes
1e80: 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  e functions and 
1e90: 74 79 70 65 20 61 72 65 20 6f 6e 6c 79 20 65 76  type are only ev
1ea0: 65 72 20 75 73 65 64 20 62 79 20 63 6f 64 65 0a  er used by code.
1eb0: 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 66 74  ** within the ft
1ec0: 73 33 53 65 67 57 72 69 74 65 72 58 58 58 28 29  s3SegWriterXXX()
1ed0: 20 66 61 6d 69 6c 79 20 6f 66 20 66 75 6e 63 74   family of funct
1ee0: 69 6f 6e 73 20 64 65 73 63 72 69 62 65 64 20 61  ions described a
1ef0: 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 66 74  bove..**.**   ft
1f00: 73 33 4e 6f 64 65 41 64 64 54 65 72 6d 28 29 0a  s3NodeAddTerm().
1f10: 2a 2a 20 20 20 66 74 73 33 4e 6f 64 65 57 72 69  **   fts3NodeWri
1f20: 74 65 28 29 0a 2a 2a 20 20 20 66 74 73 33 4e 6f  te().**   fts3No
1f30: 64 65 46 72 65 65 28 29 0a 2a 2a 0a 2a 2a 20 57  deFree().**.** W
1f40: 68 65 6e 20 61 20 62 2b 74 72 65 65 20 69 73 20  hen a b+tree is 
1f50: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
1f60: 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20  atabase (either 
1f70: 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61  as a result of a
1f80: 20 6d 65 72 67 65 0a 2a 2a 20 6f 72 20 74 68 65   merge.** or the
1f90: 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 74   pending-terms t
1fa0: 61 62 6c 65 20 62 65 69 6e 67 20 66 6c 75 73 68  able being flush
1fb0: 65 64 29 2c 20 6c 65 61 76 65 73 20 61 72 65 20  ed), leaves are 
1fc0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1fd0: 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
1fe0: 6c 65 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  le as soon as th
1ff0: 65 79 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c  ey are completel
2000: 79 20 70 6f 70 75 6c 61 74 65 64 2e 20 54 68 65  y populated. The
2010: 20 69 6e 74 65 72 69 6f 72 20 6f 66 0a 2a 2a 20   interior of.** 
2020: 74 68 65 20 74 72 65 65 20 69 73 20 61 73 73 65  the tree is asse
2030: 6d 62 6c 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  mbled in memory 
2040: 61 6e 64 20 77 72 69 74 74 65 6e 20 6f 75 74 20  and written out 
2050: 6f 6e 6c 79 20 6f 6e 63 65 20 61 6c 6c 20 6c 65  only once all le
2060: 61 76 65 73 20 68 61 76 65 0a 2a 2a 20 62 65 65  aves have.** bee
2070: 6e 20 70 6f 70 75 6c 61 74 65 64 20 61 6e 64 20  n populated and 
2080: 73 74 6f 72 65 64 2e 20 54 68 69 73 20 69 73 20  stored. This is 
2090: 4f 6b 2c 20 61 73 20 74 68 65 20 62 2b 2d 74 72  Ok, as the b+-tr
20a0: 65 65 20 66 61 6e 6f 75 74 20 69 73 20 75 73 75  ee fanout is usu
20b0: 61 6c 6c 79 0a 2a 2a 20 76 65 72 79 20 6c 61 72  ally.** very lar
20c0: 67 65 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ge, meaning that
20d0: 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6f 66   the interior of
20e0: 20 74 68 65 20 74 72 65 65 20 63 6f 6e 73 75 6d   the tree consum
20f0: 65 73 20 72 65 6c 61 74 69 76 65 6c 79 20 0a 2a  es relatively .*
2100: 2a 20 6c 69 74 74 6c 65 20 6d 65 6d 6f 72 79 2e  * little memory.
2110: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 65 67 6d 65  .*/.struct Segme
2120: 6e 74 4e 6f 64 65 20 7b 0a 20 20 53 65 67 6d 65  ntNode {.  Segme
2130: 6e 74 4e 6f 64 65 20 2a 70 50 61 72 65 6e 74 3b  ntNode *pParent;
2140: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2150: 72 65 6e 74 20 6e 6f 64 65 20 28 6f 72 20 4e 55  rent node (or NU
2160: 4c 4c 20 66 6f 72 20 72 6f 6f 74 20 6e 6f 64 65  LL for root node
2170: 29 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e 6f  ) */.  SegmentNo
2180: 64 65 20 2a 70 52 69 67 68 74 3b 20 20 20 20 20  de *pRight;     
2190: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
21a0: 72 20 74 6f 20 72 69 67 68 74 2d 73 69 62 6c 69  r to right-sibli
21b0: 6e 67 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e  ng */.  SegmentN
21c0: 6f 64 65 20 2a 70 4c 65 66 74 6d 6f 73 74 3b 20  ode *pLeftmost; 
21d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
21e0: 65 72 20 74 6f 20 6c 65 66 74 2d 6d 6f 73 74 20  er to left-most 
21f0: 6e 6f 64 65 20 6f 66 20 74 68 69 73 20 64 65 70  node of this dep
2200: 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6e 74  th */.  int nEnt
2210: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ry;             
2220: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2230: 72 20 6f 66 20 74 65 72 6d 73 20 77 72 69 74 74  r of terms writt
2240: 65 6e 20 74 6f 20 6e 6f 64 65 20 73 6f 20 66 61  en to node so fa
2250: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65  r */.  char *zTe
2260: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
2270: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
2280: 72 20 74 6f 20 70 72 65 76 69 6f 75 73 20 74 65  r to previous te
2290: 72 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  rm buffer */.  i
22a0: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
22d0: 73 20 69 6e 20 7a 54 65 72 6d 20 2a 2f 0a 20 20  s in zTerm */.  
22e0: 69 6e 74 20 6e 4d 61 6c 6c 6f 63 3b 20 20 20 20  int nMalloc;    
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 6c 6c 6f  /* Size of mallo
2310: 63 27 64 20 62 75 66 66 65 72 20 61 74 20 7a 4d  c'd buffer at zM
2320: 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20  alloc */.  char 
2330: 2a 7a 4d 61 6c 6c 6f 63 3b 20 20 20 20 20 20 20  *zMalloc;       
2340: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
2350: 6c 6c 6f 63 27 64 20 73 70 61 63 65 20 28 70 6f  lloc'd space (po
2360: 73 73 69 62 6c 79 29 20 75 73 65 64 20 66 6f 72  ssibly) used for
2370: 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20   zTerm */.  int 
2380: 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  nData;          
2390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
23a0: 79 74 65 73 20 6f 66 20 76 61 6c 69 64 20 64 61  ytes of valid da
23b0: 74 61 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63  ta so far */.  c
23c0: 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20  har *aData;     
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23e0: 2a 20 4e 6f 64 65 20 64 61 74 61 20 2a 2f 0a 7d  * Node data */.}
23f0: 3b 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 20 76  ;../*.** Valid v
2400: 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 73 65  alues for the se
2410: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
2420: 20 66 74 73 33 53 71 6c 53 74 6d 74 28 29 2e 0a   fts3SqlStmt()..
2430: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44  */.#define SQL_D
2440: 45 4c 45 54 45 5f 43 4f 4e 54 45 4e 54 20 20 20  ELETE_CONTENT   
2450: 20 20 20 20 20 20 20 20 20 20 30 0a 23 64 65 66            0.#def
2460: 69 6e 65 20 53 51 4c 5f 49 53 5f 45 4d 50 54 59  ine SQL_IS_EMPTY
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 53 51 4c     1.#define SQL
2490: 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 43 4f 4e 54  _DELETE_ALL_CONT
24a0: 45 4e 54 20 20 20 20 20 20 20 20 20 32 20 0a 23  ENT         2 .#
24b0: 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54  define SQL_DELET
24c0: 45 5f 41 4c 4c 5f 53 45 47 4d 45 4e 54 53 20 20  E_ALL_SEGMENTS  
24d0: 20 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20        3.#define 
24e0: 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 53  SQL_DELETE_ALL_S
24f0: 45 47 44 49 52 20 20 20 20 20 20 20 20 20 20 34  EGDIR          4
2500: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c  .#define SQL_DEL
2510: 45 54 45 5f 41 4c 4c 5f 44 4f 43 53 49 5a 45 20  ETE_ALL_DOCSIZE 
2520: 20 20 20 20 20 20 20 20 35 0a 23 64 65 66 69 6e          5.#defin
2530: 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c  e SQL_DELETE_ALL
2540: 5f 53 54 41 54 20 20 20 20 20 20 20 20 20 20 20  _STAT           
2550: 20 36 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53   6.#define SQL_S
2560: 45 4c 45 43 54 5f 43 4f 4e 54 45 4e 54 5f 42 59  ELECT_CONTENT_BY
2570: 5f 52 4f 57 49 44 20 20 20 20 37 0a 23 64 65 66  _ROWID    7.#def
2580: 69 6e 65 20 53 51 4c 5f 4e 45 58 54 5f 53 45 47  ine SQL_NEXT_SEG
2590: 4d 45 4e 54 5f 49 4e 44 45 58 20 20 20 20 20 20  MENT_INDEX      
25a0: 20 20 20 38 0a 23 64 65 66 69 6e 65 20 53 51 4c     8.#define SQL
25b0: 5f 49 4e 53 45 52 54 5f 53 45 47 4d 45 4e 54 53  _INSERT_SEGMENTS
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 39 0a 23 64              9.#d
25d0: 65 66 69 6e 65 20 53 51 4c 5f 4e 45 58 54 5f 53  efine SQL_NEXT_S
25e0: 45 47 4d 45 4e 54 53 5f 49 44 20 20 20 20 20 20  EGMENTS_ID      
25f0: 20 20 20 20 31 30 0a 23 64 65 66 69 6e 65 20 53      10.#define S
2600: 51 4c 5f 49 4e 53 45 52 54 5f 53 45 47 44 49 52  QL_INSERT_SEGDIR
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 31 0a               11.
2620: 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45  #define SQL_SELE
2630: 43 54 5f 4c 45 56 45 4c 20 20 20 20 20 20 20 20  CT_LEVEL        
2640: 20 20 20 20 20 20 31 32 0a 23 64 65 66 69 6e 65        12.#define
2650: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c 45 56 45   SQL_SELECT_LEVE
2660: 4c 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20 31  L_RANGE        1
2670: 33 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45  3.#define SQL_SE
2680: 4c 45 43 54 5f 4c 45 56 45 4c 5f 43 4f 55 4e 54  LECT_LEVEL_COUNT
2690: 20 20 20 20 20 20 20 20 31 34 0a 23 64 65 66 69          14.#defi
26a0: 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 45  ne SQL_SELECT_SE
26b0: 47 44 49 52 5f 4d 41 58 5f 4c 45 56 45 4c 20 20  GDIR_MAX_LEVEL  
26c0: 20 31 35 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f   15.#define SQL_
26d0: 44 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 4c 45  DELETE_SEGDIR_LE
26e0: 56 45 4c 20 20 20 20 20 20 20 31 36 0a 23 64 65  VEL       16.#de
26f0: 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f  fine SQL_DELETE_
2700: 53 45 47 4d 45 4e 54 53 5f 52 41 4e 47 45 20 20  SEGMENTS_RANGE  
2710: 20 20 20 31 37 0a 23 64 65 66 69 6e 65 20 53 51     17.#define SQ
2720: 4c 5f 43 4f 4e 54 45 4e 54 5f 49 4e 53 45 52 54  L_CONTENT_INSERT
2730: 20 20 20 20 20 20 20 20 20 20 20 20 31 38 0a 23              18.#
2740: 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54  define SQL_DELET
2750: 45 5f 44 4f 43 53 49 5a 45 20 20 20 20 20 20 20  E_DOCSIZE       
2760: 20 20 20 20 20 31 39 0a 23 64 65 66 69 6e 65 20       19.#define 
2770: 53 51 4c 5f 52 45 50 4c 41 43 45 5f 44 4f 43 53  SQL_REPLACE_DOCS
2780: 49 5a 45 20 20 20 20 20 20 20 20 20 20 20 32 30  IZE           20
2790: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c  .#define SQL_SEL
27a0: 45 43 54 5f 44 4f 43 53 49 5a 45 20 20 20 20 20  ECT_DOCSIZE     
27b0: 20 20 20 20 20 20 20 32 31 0a 23 64 65 66 69 6e         21.#defin
27c0: 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 54 41  e SQL_SELECT_STA
27d0: 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T               
27e0: 32 32 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 52  22.#define SQL_R
27f0: 45 50 4c 41 43 45 5f 53 54 41 54 20 20 20 20 20  EPLACE_STAT     
2800: 20 20 20 20 20 20 20 20 20 32 33 0a 0a 23 64 65           23..#de
2810: 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f  fine SQL_SELECT_
2820: 41 4c 4c 5f 50 52 45 46 49 58 5f 4c 45 56 45 4c  ALL_PREFIX_LEVEL
2830: 20 20 20 32 34 0a 23 64 65 66 69 6e 65 20 53 51     24.#define SQ
2840: 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 54 45 52  L_DELETE_ALL_TER
2850: 4d 53 5f 53 45 47 44 49 52 20 20 20 32 35 0a 23  MS_SEGDIR   25.#
2860: 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54  define SQL_DELET
2870: 45 5f 53 45 47 44 49 52 5f 52 41 4e 47 45 20 20  E_SEGDIR_RANGE  
2880: 20 20 20 20 20 32 36 0a 23 64 65 66 69 6e 65 20       26.#define 
2890: 53 51 4c 5f 53 45 4c 45 43 54 5f 41 4c 4c 5f 4c  SQL_SELECT_ALL_L
28a0: 41 4e 47 49 44 20 20 20 20 20 20 20 20 20 32 37  ANGID         27
28b0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 46 49 4e  .#define SQL_FIN
28c0: 44 5f 4d 45 52 47 45 5f 4c 45 56 45 4c 20 20 20  D_MERGE_LEVEL   
28d0: 20 20 20 20 20 20 20 32 38 0a 23 64 65 66 69 6e         28.#defin
28e0: 65 20 53 51 4c 5f 4d 41 58 5f 4c 45 41 46 5f 4e  e SQL_MAX_LEAF_N
28f0: 4f 44 45 5f 45 53 54 49 4d 41 54 45 20 20 20 20  ODE_ESTIMATE    
2900: 32 39 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44  29.#define SQL_D
2910: 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 45 4e 54  ELETE_SEGDIR_ENT
2920: 52 59 20 20 20 20 20 20 20 33 30 0a 23 64 65 66  RY       30.#def
2930: 69 6e 65 20 53 51 4c 5f 53 48 49 46 54 5f 53 45  ine SQL_SHIFT_SE
2940: 47 44 49 52 5f 45 4e 54 52 59 20 20 20 20 20 20  GDIR_ENTRY      
2950: 20 20 33 31 0a 23 64 65 66 69 6e 65 20 53 51 4c    31.#define SQL
2960: 5f 53 45 4c 45 43 54 5f 53 45 47 44 49 52 20 20  _SELECT_SEGDIR  
2970: 20 20 20 20 20 20 20 20 20 20 20 33 32 0a 23 64             32.#d
2980: 65 66 69 6e 65 20 53 51 4c 5f 43 48 4f 4d 50 5f  efine SQL_CHOMP_
2990: 53 45 47 44 49 52 20 20 20 20 20 20 20 20 20 20  SEGDIR          
29a0: 20 20 20 20 33 33 0a 23 64 65 66 69 6e 65 20 53      33.#define S
29b0: 51 4c 5f 53 45 47 4d 45 4e 54 5f 49 53 5f 41 50  QL_SEGMENT_IS_AP
29c0: 50 45 4e 44 41 42 4c 45 20 20 20 20 20 33 34 0a  PENDABLE     34.
29d0: 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45  #define SQL_SELE
29e0: 43 54 5f 49 4e 44 45 58 45 53 20 20 20 20 20 20  CT_INDEXES      
29f0: 20 20 20 20 20 20 33 35 0a 23 64 65 66 69 6e 65        35.#define
2a00: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4d 58 4c 45   SQL_SELECT_MXLE
2a10: 56 45 4c 20 20 20 20 20 20 20 20 20 20 20 20 33  VEL            3
2a20: 36 0a 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53  6..#define SQL_S
2a30: 45 4c 45 43 54 5f 4c 45 56 45 4c 5f 52 41 4e 47  ELECT_LEVEL_RANG
2a40: 45 32 20 20 20 20 20 20 20 33 37 0a 23 64 65 66  E2       37.#def
2a50: 69 6e 65 20 53 51 4c 5f 55 50 44 41 54 45 5f 4c  ine SQL_UPDATE_L
2a60: 45 56 45 4c 5f 49 44 58 20 20 20 20 20 20 20 20  EVEL_IDX        
2a70: 20 20 33 38 0a 23 64 65 66 69 6e 65 20 53 51 4c    38.#define SQL
2a80: 5f 55 50 44 41 54 45 5f 4c 45 56 45 4c 20 20 20  _UPDATE_LEVEL   
2a90: 20 20 20 20 20 20 20 20 20 20 20 33 39 0a 0a 2f             39../
2aa0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2ab0: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6f 62  on is used to ob
2ac0: 74 61 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 70  tain an SQLite p
2ad0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
2ae0: 74 20 68 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72 20  t handle.** for 
2af0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 64  the statement id
2b00: 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20  entified by the 
2b10: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
2b20: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a   If successful,.
2b30: 2a 2a 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  ** *pp is set to
2b40: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
2b50: 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20  tatement handle 
2b60: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
2b70: 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72  turned..** Other
2b80: 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20  wise, an SQLite 
2b90: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2ba0: 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69  turned and *pp i
2bb0: 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a  s set to 0..**.*
2bc0: 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 61 70  * If argument ap
2bd0: 56 61 6c 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  Val is not NULL,
2be0: 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 70 6f   then it must po
2bf0: 69 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20  int to an array 
2c00: 77 69 74 68 0a 2a 2a 20 61 74 20 6c 65 61 73 74  with.** at least
2c10: 20 61 73 20 6d 61 6e 79 20 65 6e 74 72 69 65 73   as many entries
2c20: 20 61 73 20 74 68 65 20 72 65 71 75 65 73 74 65   as the requeste
2c30: 64 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20  d statement has 
2c40: 62 6f 75 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65  bound .** parame
2c50: 74 65 72 73 2e 20 54 68 65 20 76 61 6c 75 65 73  ters. The values
2c60: 20 61 72 65 20 62 6f 75 6e 64 20 74 6f 20 74 68   are bound to th
2c70: 65 20 73 74 61 74 65 6d 65 6e 74 73 20 70 61 72  e statements par
2c80: 61 6d 65 74 65 72 73 20 62 65 66 6f 72 65 0a 2a  ameters before.*
2c90: 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  * returning..*/.
2ca0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53  static int fts3S
2cb0: 71 6c 53 74 6d 74 28 0a 20 20 46 74 73 33 54 61  qlStmt(.  Fts3Ta
2cc0: 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
2cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
2ce0: 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
2cf0: 65 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74 6d 74  e */.  int eStmt
2d00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d10: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
2d20: 20 74 68 65 20 53 51 4c 5f 58 58 58 20 63 6f 6e   the SQL_XXX con
2d30: 73 74 61 6e 74 73 20 61 62 6f 76 65 20 2a 2f 0a  stants above */.
2d40: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2d50: 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pp,            
2d60: 20 20 2f 2a 20 4f 55 54 3a 20 53 74 61 74 65 6d    /* OUT: Statem
2d70: 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ent handle */.  
2d80: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
2d90: 61 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20  apVal           
2da0: 2f 2a 20 56 61 6c 75 65 73 20 74 6f 20 62 69 6e  /* Values to bin
2db0: 64 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 20 2a  d to statement *
2dc0: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
2dd0: 72 20 2a 61 7a 53 71 6c 5b 5d 20 3d 20 7b 0a 2f  r *azSql[] = {./
2de0: 2a 20 30 20 20 2a 2f 20 20 22 44 45 4c 45 54 45  * 0  */  "DELETE
2df0: 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 63 6f 6e   FROM %Q.'%q_con
2e00: 74 65 6e 74 27 20 57 48 45 52 45 20 72 6f 77 69  tent' WHERE rowi
2e10: 64 20 3d 20 3f 22 2c 0a 2f 2a 20 31 20 20 2a 2f  d = ?",./* 1  */
2e20: 20 20 22 53 45 4c 45 43 54 20 4e 4f 54 20 45 58    "SELECT NOT EX
2e30: 49 53 54 53 28 53 45 4c 45 43 54 20 64 6f 63 69  ISTS(SELECT doci
2e40: 64 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 63 6f  d FROM %Q.'%q_co
2e50: 6e 74 65 6e 74 27 20 57 48 45 52 45 20 72 6f 77  ntent' WHERE row
2e60: 69 64 21 3d 3f 29 22 2c 0a 2f 2a 20 32 20 20 2a  id!=?)",./* 2  *
2e70: 2f 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  /  "DELETE FROM 
2e80: 25 51 2e 27 25 71 5f 63 6f 6e 74 65 6e 74 27 22  %Q.'%q_content'"
2e90: 2c 0a 2f 2a 20 33 20 20 2a 2f 20 20 22 44 45 4c  ,./* 3  */  "DEL
2ea0: 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  ETE FROM %Q.'%q_
2eb0: 73 65 67 6d 65 6e 74 73 27 22 2c 0a 2f 2a 20 34  segments'",./* 4
2ec0: 20 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46 52    */  "DELETE FR
2ed0: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72  OM %Q.'%q_segdir
2ee0: 27 22 2c 0a 2f 2a 20 35 20 20 2a 2f 20 20 22 44  '",./* 5  */  "D
2ef0: 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25  ELETE FROM %Q.'%
2f00: 71 5f 64 6f 63 73 69 7a 65 27 22 2c 0a 2f 2a 20  q_docsize'",./* 
2f10: 36 20 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46  6  */  "DELETE F
2f20: 52 4f 4d 20 25 51 2e 27 25 71 5f 73 74 61 74 27  ROM %Q.'%q_stat'
2f30: 22 2c 0a 2f 2a 20 37 20 20 2a 2f 20 20 22 53 45  ",./* 7  */  "SE
2f40: 4c 45 43 54 20 25 73 20 57 48 45 52 45 20 72 6f  LECT %s WHERE ro
2f50: 77 69 64 3d 3f 22 2c 0a 2f 2a 20 38 20 20 2a 2f  wid=?",./* 8  */
2f60: 20 20 22 53 45 4c 45 43 54 20 28 53 45 4c 45 43    "SELECT (SELEC
2f70: 54 20 6d 61 78 28 69 64 78 29 20 46 52 4f 4d 20  T max(idx) FROM 
2f80: 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57  %Q.'%q_segdir' W
2f90: 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f 29 20  HERE level = ?) 
2fa0: 2b 20 31 22 2c 0a 2f 2a 20 39 20 20 2a 2f 20 20  + 1",./* 9  */  
2fb0: 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 51  "REPLACE INTO %Q
2fc0: 2e 27 25 71 5f 73 65 67 6d 65 6e 74 73 27 28 62  .'%q_segments'(b
2fd0: 6c 6f 63 6b 69 64 2c 20 62 6c 6f 63 6b 29 20 56  lockid, block) V
2fe0: 41 4c 55 45 53 28 3f 2c 20 3f 29 22 2c 0a 2f 2a  ALUES(?, ?)",./*
2ff0: 20 31 30 20 2a 2f 20 20 22 53 45 4c 45 43 54 20   10 */  "SELECT 
3000: 63 6f 61 6c 65 73 63 65 28 28 53 45 4c 45 43 54  coalesce((SELECT
3010: 20 6d 61 78 28 62 6c 6f 63 6b 69 64 29 20 46 52   max(blockid) FR
3020: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 6d 65 6e  OM %Q.'%q_segmen
3030: 74 73 27 29 20 2b 20 31 2c 20 31 29 22 2c 0a 2f  ts') + 1, 1)",./
3040: 2a 20 31 31 20 2a 2f 20 20 22 52 45 50 4c 41 43  * 11 */  "REPLAC
3050: 45 20 49 4e 54 4f 20 25 51 2e 27 25 71 5f 73 65  E INTO %Q.'%q_se
3060: 67 64 69 72 27 20 56 41 4c 55 45 53 28 3f 2c 3f  gdir' VALUES(?,?
3070: 2c 3f 2c 3f 2c 3f 2c 3f 29 22 2c 0a 0a 20 20 20  ,?,?,?,?)",..   
3080: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
3090: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6f 72 64   segments in ord
30a0: 65 72 20 66 72 6f 6d 20 6f 6c 64 65 73 74 20 74  er from oldest t
30b0: 6f 20 6e 65 77 65 73 74 2e 2a 2f 20 0a 2f 2a 20  o newest.*/ ./* 
30c0: 31 32 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 69  12 */  "SELECT i
30d0: 64 78 2c 20 73 74 61 72 74 5f 62 6c 6f 63 6b 2c  dx, start_block,
30e0: 20 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63   leaves_end_bloc
30f0: 6b 2c 20 65 6e 64 5f 62 6c 6f 63 6b 2c 20 72 6f  k, end_block, ro
3100: 6f 74 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ot ".           
3110: 20 22 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65   "FROM %Q.'%q_se
3120: 67 64 69 72 27 20 57 48 45 52 45 20 6c 65 76 65  gdir' WHERE leve
3130: 6c 20 3d 20 3f 20 4f 52 44 45 52 20 42 59 20 69  l = ? ORDER BY i
3140: 64 78 20 41 53 43 22 2c 0a 2f 2a 20 31 33 20 2a  dx ASC",./* 13 *
3150: 2f 20 20 22 53 45 4c 45 43 54 20 69 64 78 2c 20  /  "SELECT idx, 
3160: 73 74 61 72 74 5f 62 6c 6f 63 6b 2c 20 6c 65 61  start_block, lea
3170: 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 2c 20 65  ves_end_block, e
3180: 6e 64 5f 62 6c 6f 63 6b 2c 20 72 6f 6f 74 20 22  nd_block, root "
3190: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 46 52  .            "FR
31a0: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72  OM %Q.'%q_segdir
31b0: 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20 42 45  ' WHERE level BE
31c0: 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 22 0a 20  TWEEN ? AND ?". 
31d0: 20 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45             "ORDE
31e0: 52 20 42 59 20 6c 65 76 65 6c 20 44 45 53 43 2c  R BY level DESC,
31f0: 20 69 64 78 20 41 53 43 22 2c 0a 0a 2f 2a 20 31   idx ASC",../* 1
3200: 34 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 63 6f  4 */  "SELECT co
3210: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 51 2e 27  unt(*) FROM %Q.'
3220: 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52 45  %q_segdir' WHERE
3230: 20 6c 65 76 65 6c 20 3d 20 3f 22 2c 0a 2f 2a 20   level = ?",./* 
3240: 31 35 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 6d  15 */  "SELECT m
3250: 61 78 28 6c 65 76 65 6c 29 20 46 52 4f 4d 20 25  ax(level) FROM %
3260: 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57 48  Q.'%q_segdir' WH
3270: 45 52 45 20 6c 65 76 65 6c 20 42 45 54 57 45 45  ERE level BETWEE
3280: 4e 20 3f 20 41 4e 44 20 3f 22 2c 0a 0a 2f 2a 20  N ? AND ?",../* 
3290: 31 36 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46  16 */  "DELETE F
32a0: 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69  ROM %Q.'%q_segdi
32b0: 72 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d  r' WHERE level =
32c0: 20 3f 22 2c 0a 2f 2a 20 31 37 20 2a 2f 20 20 22   ?",./* 17 */  "
32d0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 27  DELETE FROM %Q.'
32e0: 25 71 5f 73 65 67 6d 65 6e 74 73 27 20 57 48 45  %q_segments' WHE
32f0: 52 45 20 62 6c 6f 63 6b 69 64 20 42 45 54 57 45  RE blockid BETWE
3300: 45 4e 20 3f 20 41 4e 44 20 3f 22 2c 0a 2f 2a 20  EN ? AND ?",./* 
3310: 31 38 20 2a 2f 20 20 22 49 4e 53 45 52 54 20 49  18 */  "INSERT I
3320: 4e 54 4f 20 25 51 2e 27 25 71 5f 63 6f 6e 74 65  NTO %Q.'%q_conte
3330: 6e 74 27 20 56 41 4c 55 45 53 28 25 73 29 22 2c  nt' VALUES(%s)",
3340: 0a 2f 2a 20 31 39 20 2a 2f 20 20 22 44 45 4c 45  ./* 19 */  "DELE
3350: 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 64  TE FROM %Q.'%q_d
3360: 6f 63 73 69 7a 65 27 20 57 48 45 52 45 20 64 6f  ocsize' WHERE do
3370: 63 69 64 20 3d 20 3f 22 2c 0a 2f 2a 20 32 30 20  cid = ?",./* 20 
3380: 2a 2f 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54  */  "REPLACE INT
3390: 4f 20 25 51 2e 27 25 71 5f 64 6f 63 73 69 7a 65  O %Q.'%q_docsize
33a0: 27 20 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 0a  ' VALUES(?,?)",.
33b0: 2f 2a 20 32 31 20 2a 2f 20 20 22 53 45 4c 45 43  /* 21 */  "SELEC
33c0: 54 20 73 69 7a 65 20 46 52 4f 4d 20 25 51 2e 27  T size FROM %Q.'
33d0: 25 71 5f 64 6f 63 73 69 7a 65 27 20 57 48 45 52  %q_docsize' WHER
33e0: 45 20 64 6f 63 69 64 3d 3f 22 2c 0a 2f 2a 20 32  E docid=?",./* 2
33f0: 32 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 76 61  2 */  "SELECT va
3400: 6c 75 65 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  lue FROM %Q.'%q_
3410: 73 74 61 74 27 20 57 48 45 52 45 20 69 64 3d 3f  stat' WHERE id=?
3420: 22 2c 0a 2f 2a 20 32 33 20 2a 2f 20 20 22 52 45  ",./* 23 */  "RE
3430: 50 4c 41 43 45 20 49 4e 54 4f 20 25 51 2e 27 25  PLACE INTO %Q.'%
3440: 71 5f 73 74 61 74 27 20 56 41 4c 55 45 53 28 3f  q_stat' VALUES(?
3450: 2c 3f 29 22 2c 0a 2f 2a 20 32 34 20 2a 2f 20 20  ,?)",./* 24 */  
3460: 22 22 2c 0a 2f 2a 20 32 35 20 2a 2f 20 20 22 22  "",./* 25 */  ""
3470: 2c 0a 0a 2f 2a 20 32 36 20 2a 2f 20 22 44 45 4c  ,../* 26 */ "DEL
3480: 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  ETE FROM %Q.'%q_
3490: 73 65 67 64 69 72 27 20 57 48 45 52 45 20 6c 65  segdir' WHERE le
34a0: 76 65 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e  vel BETWEEN ? AN
34b0: 44 20 3f 22 2c 0a 2f 2a 20 32 37 20 2a 2f 20 22  D ?",./* 27 */ "
34c0: 53 45 4c 45 43 54 20 3f 20 55 4e 49 4f 4e 20 53  SELECT ? UNION S
34d0: 45 4c 45 43 54 20 6c 65 76 65 6c 20 2f 20 28 31  ELECT level / (1
34e0: 30 32 34 20 2a 20 3f 29 20 46 52 4f 4d 20 25 51  024 * ?) FROM %Q
34f0: 2e 27 25 71 5f 73 65 67 64 69 72 27 22 2c 0a 0a  .'%q_segdir'",..
3500: 2f 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  /* This statemen
3510: 74 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  t is used to det
3520: 65 72 6d 69 6e 65 20 77 68 69 63 68 20 6c 65 76  ermine which lev
3530: 65 6c 20 74 6f 20 72 65 61 64 20 74 68 65 20 69  el to read the i
3540: 6e 70 75 74 20 66 72 6f 6d 0a 2a 2a 20 77 68 65  nput from.** whe
3550: 6e 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 6e 20  n performing an 
3560: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67  incremental merg
3570: 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68  e. It returns th
3580: 65 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c  e absolute level
3590: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 74 68   number.** of th
35a0: 65 20 6f 6c 64 65 73 74 20 6c 65 76 65 6c 20 69  e oldest level i
35b0: 6e 20 74 68 65 20 64 62 20 74 68 61 74 20 63 6f  n the db that co
35c0: 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20  ntains at least 
35d0: 3f 20 73 65 67 6d 65 6e 74 73 2e 20 4f 72 2c 0a  ? segments. Or,.
35e0: 2a 2a 20 69 66 20 6e 6f 20 6c 65 76 65 6c 20 69  ** if no level i
35f0: 6e 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20  n the FTS index 
3600: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
3610: 61 6e 20 3f 20 73 65 67 6d 65 6e 74 73 2c 20 74  an ? segments, t
3620: 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  he statement.** 
3630: 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 72 6f 77  returns zero row
3640: 73 2e 20 20 2a 2f 0a 2f 2a 20 32 38 20 2a 2f 20  s.  */./* 28 */ 
3650: 22 53 45 4c 45 43 54 20 6c 65 76 65 6c 20 46 52  "SELECT level FR
3660: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72  OM %Q.'%q_segdir
3670: 27 20 47 52 4f 55 50 20 42 59 20 6c 65 76 65 6c  ' GROUP BY level
3680: 20 48 41 56 49 4e 47 20 63 6f 75 6e 74 28 2a 29   HAVING count(*)
3690: 3e 3d 3f 22 0a 20 20 20 20 20 20 20 20 20 22 20  >=?".         " 
36a0: 20 4f 52 44 45 52 20 42 59 20 28 6c 65 76 65 6c   ORDER BY (level
36b0: 20 25 25 20 31 30 32 34 29 20 41 53 43 20 4c 49   %% 1024) ASC LI
36c0: 4d 49 54 20 31 22 2c 0a 0a 2f 2a 20 45 73 74 69  MIT 1",../* Esti
36d0: 6d 61 74 65 20 74 68 65 20 75 70 70 65 72 20 6c  mate the upper l
36e0: 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62  imit on the numb
36f0: 65 72 20 6f 66 20 6c 65 61 66 20 6e 6f 64 65 73  er of leaf nodes
3700: 20 69 6e 20 61 20 6e 65 77 20 73 65 67 6d 65 6e   in a new segmen
3710: 74 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20  t.** created by 
3720: 6d 65 72 67 69 6e 67 20 74 68 65 20 6f 6c 64 65  merging the olde
3730: 73 74 20 3a 32 20 73 65 67 6d 65 6e 74 73 20 66  st :2 segments f
3740: 72 6f 6d 20 61 62 73 6f 6c 75 74 65 20 6c 65 76  rom absolute lev
3750: 65 6c 20 3a 31 2e 20 53 65 65 20 0a 2a 2a 20 66  el :1. See .** f
3760: 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 46  unction sqlite3F
3770: 74 73 33 49 6e 63 72 6d 65 72 67 65 28 29 20 66  ts3Incrmerge() f
3780: 6f 72 20 64 65 74 61 69 6c 73 2e 20 20 2a 2f 0a  or details.  */.
3790: 2f 2a 20 32 39 20 2a 2f 20 22 53 45 4c 45 43 54  /* 29 */ "SELECT
37a0: 20 32 20 2a 20 74 6f 74 61 6c 28 31 20 2b 20 6c   2 * total(1 + l
37b0: 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20  eaves_end_block 
37c0: 2d 20 73 74 61 72 74 5f 62 6c 6f 63 6b 29 20 22  - start_block) "
37d0: 0a 20 20 20 20 20 20 20 20 20 22 20 20 46 52 4f  .         "  FRO
37e0: 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27  M %Q.'%q_segdir'
37f0: 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f   WHERE level = ?
3800: 20 41 4e 44 20 69 64 78 20 3c 20 3f 22 2c 0a 0a   AND idx < ?",..
3810: 2f 2a 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45  /* SQL_DELETE_SE
3820: 47 44 49 52 5f 45 4e 54 52 59 0a 2a 2a 20 20 20  GDIR_ENTRY.**   
3830: 44 65 6c 65 74 65 20 74 68 65 20 25 5f 73 65 67  Delete the %_seg
3840: 64 69 72 20 65 6e 74 72 79 20 6f 6e 20 61 62 73  dir entry on abs
3850: 6f 6c 75 74 65 20 6c 65 76 65 6c 20 3a 31 20 77  olute level :1 w
3860: 69 74 68 20 69 6e 64 65 78 20 3a 32 2e 20 20 2a  ith index :2.  *
3870: 2f 0a 2f 2a 20 33 30 20 2a 2f 20 22 44 45 4c 45  /./* 30 */ "DELE
3880: 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73  TE FROM %Q.'%q_s
3890: 65 67 64 69 72 27 20 57 48 45 52 45 20 6c 65 76  egdir' WHERE lev
38a0: 65 6c 20 3d 20 3f 20 41 4e 44 20 69 64 78 20 3d  el = ? AND idx =
38b0: 20 3f 22 2c 0a 0a 2f 2a 20 53 51 4c 5f 53 48 49   ?",../* SQL_SHI
38c0: 46 54 5f 53 45 47 44 49 52 5f 45 4e 54 52 59 0a  FT_SEGDIR_ENTRY.
38d0: 2a 2a 20 20 20 4d 6f 64 69 66 79 20 74 68 65 20  **   Modify the 
38e0: 69 64 78 20 76 61 6c 75 65 20 66 6f 72 20 74 68  idx value for th
38f0: 65 20 73 65 67 6d 65 6e 74 20 77 69 74 68 20 69  e segment with i
3900: 64 78 3d 3a 33 20 6f 6e 20 61 62 73 6f 6c 75 74  dx=:3 on absolut
3910: 65 20 6c 65 76 65 6c 20 3a 32 0a 2a 2a 20 20 20  e level :2.**   
3920: 74 6f 20 3a 31 2e 20 20 2a 2f 0a 2f 2a 20 33 31  to :1.  */./* 31
3930: 20 2a 2f 20 22 55 50 44 41 54 45 20 25 51 2e 27   */ "UPDATE %Q.'
3940: 25 71 5f 73 65 67 64 69 72 27 20 53 45 54 20 69  %q_segdir' SET i
3950: 64 78 20 3d 20 3f 20 57 48 45 52 45 20 6c 65 76  dx = ? WHERE lev
3960: 65 6c 3d 3f 20 41 4e 44 20 69 64 78 3d 3f 22 2c  el=? AND idx=?",
3970: 0a 0a 2f 2a 20 53 51 4c 5f 53 45 4c 45 43 54 5f  ../* SQL_SELECT_
3980: 53 45 47 44 49 52 0a 2a 2a 20 20 20 52 65 61 64  SEGDIR.**   Read
3990: 20 61 20 73 69 6e 67 6c 65 20 65 6e 74 72 79 20   a single entry 
39a0: 66 72 6f 6d 20 74 68 65 20 25 5f 73 65 67 64 69  from the %_segdi
39b0: 72 20 74 61 62 6c 65 2e 20 54 68 65 20 65 6e 74  r table. The ent
39c0: 72 79 20 66 72 6f 6d 20 61 62 73 6f 6c 75 74 65  ry from absolute
39d0: 20 0a 2a 2a 20 20 20 6c 65 76 65 6c 20 3a 31 20   .**   level :1 
39e0: 77 69 74 68 20 69 6e 64 65 78 20 76 61 6c 75 65  with index value
39f0: 20 3a 32 2e 20 20 2a 2f 0a 2f 2a 20 33 32 20 2a   :2.  */./* 32 *
3a00: 2f 20 20 22 53 45 4c 45 43 54 20 69 64 78 2c 20  /  "SELECT idx, 
3a10: 73 74 61 72 74 5f 62 6c 6f 63 6b 2c 20 6c 65 61  start_block, lea
3a20: 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 2c 20 65  ves_end_block, e
3a30: 6e 64 5f 62 6c 6f 63 6b 2c 20 72 6f 6f 74 20 22  nd_block, root "
3a40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 46 52  .            "FR
3a50: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72  OM %Q.'%q_segdir
3a60: 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20  ' WHERE level = 
3a70: 3f 20 41 4e 44 20 69 64 78 20 3d 20 3f 22 2c 0a  ? AND idx = ?",.
3a80: 0a 2f 2a 20 53 51 4c 5f 43 48 4f 4d 50 5f 53 45  ./* SQL_CHOMP_SE
3a90: 47 44 49 52 0a 2a 2a 20 20 20 55 70 64 61 74 65  GDIR.**   Update
3aa0: 20 74 68 65 20 73 74 61 72 74 5f 62 6c 6f 63 6b   the start_block
3ab0: 20 28 3a 31 29 20 61 6e 64 20 72 6f 6f 74 20 28   (:1) and root (
3ac0: 3a 32 29 20 66 69 65 6c 64 73 20 6f 66 20 74 68  :2) fields of th
3ad0: 65 20 25 5f 73 65 67 64 69 72 0a 2a 2a 20 20 20  e %_segdir.**   
3ae0: 65 6e 74 72 79 20 6c 6f 63 61 74 65 64 20 6f 6e  entry located on
3af0: 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20   absolute level 
3b00: 3a 33 20 77 69 74 68 20 69 6e 64 65 78 20 3a 34  :3 with index :4
3b10: 2e 20 20 2a 2f 0a 2f 2a 20 33 33 20 2a 2f 20 20  .  */./* 33 */  
3b20: 22 55 50 44 41 54 45 20 25 51 2e 27 25 71 5f 73  "UPDATE %Q.'%q_s
3b30: 65 67 64 69 72 27 20 53 45 54 20 73 74 61 72 74  egdir' SET start
3b40: 5f 62 6c 6f 63 6b 20 3d 20 3f 2c 20 72 6f 6f 74  _block = ?, root
3b50: 20 3d 20 3f 22 0a 20 20 20 20 20 20 20 20 20 20   = ?".          
3b60: 20 20 22 57 48 45 52 45 20 6c 65 76 65 6c 20 3d    "WHERE level =
3b70: 20 3f 20 41 4e 44 20 69 64 78 20 3d 20 3f 22 2c   ? AND idx = ?",
3b80: 0a 0a 2f 2a 20 53 51 4c 5f 53 45 47 4d 45 4e 54  ../* SQL_SEGMENT
3b90: 5f 49 53 5f 41 50 50 45 4e 44 41 42 4c 45 0a 2a  _IS_APPENDABLE.*
3ba0: 2a 20 20 20 52 65 74 75 72 6e 20 61 20 73 69 6e  *   Return a sin
3bb0: 67 6c 65 20 72 6f 77 20 69 66 20 74 68 65 20 73  gle row if the s
3bc0: 65 67 6d 65 6e 74 20 77 69 74 68 20 65 6e 64 5f  egment with end_
3bd0: 62 6c 6f 63 6b 3d 3f 20 69 73 20 61 70 70 65 6e  block=? is appen
3be0: 64 61 62 6c 65 2e 20 4f 72 0a 2a 2a 20 20 20 6e  dable. Or.**   n
3bf0: 6f 20 72 6f 77 73 20 6f 74 68 65 72 77 69 73 65  o rows otherwise
3c00: 2e 20 20 2a 2f 0a 2f 2a 20 33 34 20 2a 2f 20 20  .  */./* 34 */  
3c10: 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 25  "SELECT 1 FROM %
3c20: 51 2e 27 25 71 5f 73 65 67 6d 65 6e 74 73 27 20  Q.'%q_segments' 
3c30: 57 48 45 52 45 20 62 6c 6f 63 6b 69 64 3d 3f 20  WHERE blockid=? 
3c40: 41 4e 44 20 62 6c 6f 63 6b 20 49 53 20 4e 55 4c  AND block IS NUL
3c50: 4c 22 2c 0a 0a 2f 2a 20 53 51 4c 5f 53 45 4c 45  L",../* SQL_SELE
3c60: 43 54 5f 49 4e 44 45 58 45 53 0a 2a 2a 20 20 20  CT_INDEXES.**   
3c70: 52 65 74 75 72 6e 20 74 68 65 20 6c 69 73 74 20  Return the list 
3c80: 6f 66 20 76 61 6c 69 64 20 73 65 67 6d 65 6e 74  of valid segment
3c90: 20 69 6e 64 65 78 65 73 20 66 6f 72 20 61 62 73   indexes for abs
3ca0: 6f 6c 75 74 65 20 6c 65 76 65 6c 20 3f 20 20 2a  olute level ?  *
3cb0: 2f 0a 2f 2a 20 33 35 20 2a 2f 20 20 22 53 45 4c  /./* 35 */  "SEL
3cc0: 45 43 54 20 69 64 78 20 46 52 4f 4d 20 25 51 2e  ECT idx FROM %Q.
3cd0: 27 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52  '%q_segdir' WHER
3ce0: 45 20 6c 65 76 65 6c 3d 3f 20 4f 52 44 45 52 20  E level=? ORDER 
3cf0: 42 59 20 31 20 41 53 43 22 2c 0a 0a 2f 2a 20 53  BY 1 ASC",../* S
3d00: 51 4c 5f 53 45 4c 45 43 54 5f 4d 58 4c 45 56 45  QL_SELECT_MXLEVE
3d10: 4c 0a 2a 2a 20 20 20 52 65 74 75 72 6e 20 74 68  L.**   Return th
3d20: 65 20 6c 61 72 67 65 73 74 20 72 65 6c 61 74 69  e largest relati
3d30: 76 65 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20  ve level in the 
3d40: 46 54 53 20 69 6e 64 65 78 20 6f 72 20 69 6e 64  FTS index or ind
3d50: 65 78 65 73 2e 20 20 2a 2f 0a 2f 2a 20 33 36 20  exes.  */./* 36 
3d60: 2a 2f 20 20 22 53 45 4c 45 43 54 20 6d 61 78 28  */  "SELECT max(
3d70: 20 6c 65 76 65 6c 20 25 25 20 31 30 32 34 20 29   level %% 1024 )
3d80: 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67   FROM %Q.'%q_seg
3d90: 64 69 72 27 22 2c 0a 0a 20 20 20 20 20 20 20 20  dir'",..        
3da0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 73 65 67 6d    /* Return segm
3db0: 65 6e 74 73 20 69 6e 20 6f 72 64 65 72 20 66 72  ents in order fr
3dc0: 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77  om oldest to new
3dd0: 65 73 74 2e 2a 2f 20 0a 2f 2a 20 33 37 20 2a 2f  est.*/ ./* 37 */
3de0: 20 20 22 53 45 4c 45 43 54 20 6c 65 76 65 6c 2c    "SELECT level,
3df0: 20 69 64 78 2c 20 65 6e 64 5f 62 6c 6f 63 6b 20   idx, end_block 
3e00: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 46  ".            "F
3e10: 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69  ROM %Q.'%q_segdi
3e20: 72 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20 42  r' WHERE level B
3e30: 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 20 22  ETWEEN ? AND ? "
3e40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 52  .            "OR
3e50: 44 45 52 20 42 59 20 6c 65 76 65 6c 20 44 45 53  DER BY level DES
3e60: 43 2c 20 69 64 78 20 41 53 43 22 2c 0a 0a 20 20  C, idx ASC",..  
3e70: 20 20 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74          /* Updat
3e80: 65 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73 65  e statements use
3e90: 64 20 77 68 69 6c 65 20 70 72 6f 6d 6f 74 69 6e  d while promotin
3ea0: 67 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 2f 2a  g segments */./*
3eb0: 20 33 38 20 2a 2f 20 20 22 55 50 44 41 54 45 20   38 */  "UPDATE 
3ec0: 4f 52 20 46 41 49 4c 20 25 51 2e 27 25 71 5f 73  OR FAIL %Q.'%q_s
3ed0: 65 67 64 69 72 27 20 53 45 54 20 6c 65 76 65 6c  egdir' SET level
3ee0: 3d 2d 31 2c 69 64 78 3d 3f 20 22 0a 20 20 20 20  =-1,idx=? ".    
3ef0: 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 6c          "WHERE l
3f00: 65 76 65 6c 3d 3f 20 41 4e 44 20 69 64 78 3d 3f  evel=? AND idx=?
3f10: 22 2c 0a 2f 2a 20 33 39 20 2a 2f 20 20 22 55 50  ",./* 39 */  "UP
3f20: 44 41 54 45 20 4f 52 20 46 41 49 4c 20 25 51 2e  DATE OR FAIL %Q.
3f30: 27 25 71 5f 73 65 67 64 69 72 27 20 53 45 54 20  '%q_segdir' SET 
3f40: 6c 65 76 65 6c 3d 3f 20 57 48 45 52 45 20 6c 65  level=? WHERE le
3f50: 76 65 6c 3d 2d 31 22 0a 0a 20 20 7d 3b 0a 20 20  vel=-1"..  };.  
3f60: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
3f70: 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  OK;.  sqlite3_st
3f80: 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 61 73  mt *pStmt;..  as
3f90: 73 65 72 74 28 20 53 69 7a 65 6f 66 41 72 72 61  sert( SizeofArra
3fa0: 79 28 61 7a 53 71 6c 29 3d 3d 53 69 7a 65 6f 66  y(azSql)==Sizeof
3fb0: 41 72 72 61 79 28 70 2d 3e 61 53 74 6d 74 29 20  Array(p->aStmt) 
3fc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 53 74  );.  assert( eSt
3fd0: 6d 74 3c 53 69 7a 65 6f 66 41 72 72 61 79 28 61  mt<SizeofArray(a
3fe0: 7a 53 71 6c 29 20 26 26 20 65 53 74 6d 74 3e 3d  zSql) && eStmt>=
3ff0: 30 20 29 3b 0a 20 20 0a 20 20 70 53 74 6d 74 20  0 );.  .  pStmt 
4000: 3d 20 70 2d 3e 61 53 74 6d 74 5b 65 53 74 6d 74  = p->aStmt[eStmt
4010: 5d 3b 0a 20 20 69 66 28 20 21 70 53 74 6d 74 20  ];.  if( !pStmt 
4020: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  ){.    char *zSq
4030: 6c 3b 0a 20 20 20 20 69 66 28 20 65 53 74 6d 74  l;.    if( eStmt
4040: 3d 3d 53 51 4c 5f 43 4f 4e 54 45 4e 54 5f 49 4e  ==SQL_CONTENT_IN
4050: 53 45 52 54 20 29 7b 0a 20 20 20 20 20 20 7a 53  SERT ){.      zS
4060: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
4070: 69 6e 74 66 28 61 7a 53 71 6c 5b 65 53 74 6d 74  intf(azSql[eStmt
4080: 5d 2c 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e  ], p->zDb, p->zN
4090: 61 6d 65 2c 20 70 2d 3e 7a 57 72 69 74 65 45 78  ame, p->zWriteEx
40a0: 70 72 6c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c  prlist);.    }el
40b0: 73 65 20 69 66 28 20 65 53 74 6d 74 3d 3d 53 51  se if( eStmt==SQ
40c0: 4c 5f 53 45 4c 45 43 54 5f 43 4f 4e 54 45 4e 54  L_SELECT_CONTENT
40d0: 5f 42 59 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  _BY_ROWID ){.   
40e0: 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
40f0: 33 5f 6d 70 72 69 6e 74 66 28 61 7a 53 71 6c 5b  3_mprintf(azSql[
4100: 65 53 74 6d 74 5d 2c 20 70 2d 3e 7a 52 65 61 64  eStmt], p->zRead
4110: 45 78 70 72 6c 69 73 74 29 3b 0a 20 20 20 20 7d  Exprlist);.    }
4120: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c  else{.      zSql
4130: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
4140: 74 66 28 61 7a 53 71 6c 5b 65 53 74 6d 74 5d 2c  tf(azSql[eStmt],
4150: 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d   p->zDb, p->zNam
4160: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
4170: 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20  ( !zSql ){.     
4180: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
4190: 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
41a0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
41b0: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
41c0: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
41d0: 53 74 6d 74 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  Stmt, NULL);.   
41e0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
41f0: 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  zSql);.      ass
4200: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
4210: 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 20 29  OK || pStmt==0 )
4220: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 53 74 6d 74  ;.      p->aStmt
4230: 5b 65 53 74 6d 74 5d 20 3d 20 70 53 74 6d 74 3b  [eStmt] = pStmt;
4240: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4250: 20 61 70 56 61 6c 20 29 7b 0a 20 20 20 20 69 6e   apVal ){.    in
4260: 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 50 61  t i;.    int nPa
4270: 72 61 6d 20 3d 20 73 71 6c 69 74 65 33 5f 62 69  ram = sqlite3_bi
4280: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75  nd_parameter_cou
4290: 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 66  nt(pStmt);.    f
42a0: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
42b0: 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 50 61 72 61  TE_OK && i<nPara
42c0: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  m; i++){.      r
42d0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
42e0: 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c 20 69 2b  _value(pStmt, i+
42f0: 31 2c 20 61 70 56 61 6c 5b 69 5d 29 3b 0a 20 20  1, apVal[i]);.  
4300: 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70 20 3d 20    }.  }.  *pp = 
4310: 70 53 74 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20  pStmt;.  return 
4320: 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69  rc;.}...static i
4330: 6e 74 20 66 74 73 33 53 65 6c 65 63 74 44 6f 63  nt fts3SelectDoc
4340: 73 69 7a 65 28 0a 20 20 46 74 73 33 54 61 62 6c  size(.  Fts3Tabl
4350: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
4360: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20          /* FTS3 
4370: 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
4380: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
4390: 69 44 6f 63 69 64 2c 20 20 20 20 20 20 20 20 20  iDocid,         
43a0: 20 20 2f 2a 20 44 6f 63 69 64 20 74 6f 20 62 69    /* Docid to bi
43b0: 6e 64 20 66 6f 72 20 53 51 4c 5f 53 45 4c 45 43  nd for SQL_SELEC
43c0: 54 5f 44 4f 43 53 49 5a 45 20 2a 2f 0a 20 20 73  T_DOCSIZE */.  s
43d0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70  qlite3_stmt **pp
43e0: 53 74 6d 74 20 20 20 20 20 20 20 20 20 20 20 2f  Stmt           /
43f0: 2a 20 4f 55 54 3a 20 53 74 61 74 65 6d 65 6e 74  * OUT: Statement
4400: 20 68 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a 20 20   handle */.){.  
4410: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
4420: 74 6d 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tmt = 0;        
4430: 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 72 65 71  /* Statement req
4440: 75 65 73 74 65 64 20 66 72 6f 6d 20 66 74 73 33  uested from fts3
4450: 53 71 6c 53 74 6d 74 28 29 20 2a 2f 0a 20 20 69  SqlStmt() */.  i
4460: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
4470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4480: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
4490: 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c  ..  rc = fts3Sql
44a0: 53 74 6d 74 28 70 54 61 62 2c 20 53 51 4c 5f 53  Stmt(pTab, SQL_S
44b0: 45 4c 45 43 54 5f 44 4f 43 53 49 5a 45 2c 20 26  ELECT_DOCSIZE, &
44c0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
44d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
44e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  {.    sqlite3_bi
44f0: 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  nd_int64(pStmt, 
4500: 31 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 20 20  1, iDocid);.    
4510: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
4520: 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66  p(pStmt);.    if
4530: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57  ( rc!=SQLITE_ROW
4540: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   || sqlite3_colu
4550: 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 30  mn_type(pStmt, 0
4560: 29 21 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29  )!=SQLITE_BLOB )
4570: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
4580: 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
4590: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
45a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
45b0: 3d 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 54  = FTS_CORRUPT_VT
45c0: 41 42 3b 0a 20 20 20 20 20 20 70 53 74 6d 74 20  AB;.      pStmt 
45d0: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
45e0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
45f0: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
4600: 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 70 53 74  .  *ppStmt = pSt
4610: 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  mt;.  return rc;
4620: 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .}..int sqlite3F
4630: 74 73 33 53 65 6c 65 63 74 44 6f 63 74 6f 74 61  ts3SelectDoctota
4640: 6c 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  l(.  Fts3Table *
4650: 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  pTab,           
4660: 20 20 20 20 20 2f 2a 20 46 74 73 33 20 74 61 62       /* Fts3 tab
4670: 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73  le handle */.  s
4680: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70  qlite3_stmt **pp
4690: 53 74 6d 74 20 20 20 20 20 20 20 20 20 20 20 2f  Stmt           /
46a0: 2a 20 4f 55 54 3a 20 53 74 61 74 65 6d 65 6e 74  * OUT: Statement
46b0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a 20 20   handle */.){.  
46c0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
46d0: 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  tmt = 0;.  int r
46e0: 63 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71  c;.  rc = fts3Sq
46f0: 6c 53 74 6d 74 28 70 54 61 62 2c 20 53 51 4c 5f  lStmt(pTab, SQL_
4700: 53 45 4c 45 43 54 5f 53 54 41 54 2c 20 26 70 53  SELECT_STAT, &pS
4710: 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tmt, 0);.  if( r
4720: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
4730: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
4740: 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 2c 20 46  _int(pStmt, 1, F
4750: 54 53 5f 53 54 41 54 5f 44 4f 43 54 4f 54 41 4c  TS_STAT_DOCTOTAL
4760: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
4770: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 21 3d  e3_step(pStmt)!=
4780: 53 51 4c 49 54 45 5f 52 4f 57 0a 20 20 20 20 20  SQLITE_ROW.     
4790: 7c 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  || sqlite3_colum
47a0: 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 30 29  n_type(pStmt, 0)
47b0: 21 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 0a 20 20  !=SQLITE_BLOB.  
47c0: 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20    ){.      rc = 
47d0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
47e0: 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tmt);.      if( 
47f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
4800: 72 63 20 3d 20 46 54 53 5f 43 4f 52 52 55 50 54  rc = FTS_CORRUPT
4810: 5f 56 54 41 42 3b 0a 20 20 20 20 20 20 70 53 74  _VTAB;.      pSt
4820: 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  mt = 0;.    }.  
4830: 7d 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 70 53  }.  *ppStmt = pS
4840: 74 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  tmt;.  return rc
4850: 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.}..int sqlite3
4860: 46 74 73 33 53 65 6c 65 63 74 44 6f 63 73 69 7a  Fts3SelectDocsiz
4870: 65 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  e(.  Fts3Table *
4880: 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  pTab,           
4890: 20 20 20 20 20 2f 2a 20 46 74 73 33 20 74 61 62       /* Fts3 tab
48a0: 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73  le handle */.  s
48b0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 6f  qlite3_int64 iDo
48c0: 63 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  cid,           /
48d0: 2a 20 44 6f 63 69 64 20 74 6f 20 72 65 61 64 20  * Docid to read 
48e0: 73 69 7a 65 20 64 61 74 61 20 66 6f 72 20 2a 2f  size data for */
48f0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
4900: 2a 2a 70 70 53 74 6d 74 20 20 20 20 20 20 20 20  **ppStmt        
4910: 20 20 20 2f 2a 20 4f 55 54 3a 20 53 74 61 74 65     /* OUT: State
4920: 6d 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 29  ment handle */.)
4930: 7b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 33 53  {.  return fts3S
4940: 65 6c 65 63 74 44 6f 63 73 69 7a 65 28 70 54 61  electDocsize(pTa
4950: 62 2c 20 69 44 6f 63 69 64 2c 20 70 70 53 74 6d  b, iDocid, ppStm
4960: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d  t);.}../*.** Sim
4970: 69 6c 61 72 20 74 6f 20 66 74 73 33 53 71 6c 53  ilar to fts3SqlS
4980: 74 6d 74 28 29 2e 20 45 78 63 65 70 74 2c 20 61  tmt(). Except, a
4990: 66 74 65 72 20 62 69 6e 64 69 6e 67 20 74 68 65  fter binding the
49a0: 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e 0a 2a   parameters in.*
49b0: 2a 20 61 72 72 61 79 20 61 70 56 61 6c 5b 5d 20  * array apVal[] 
49c0: 74 6f 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  to the SQL state
49d0: 6d 65 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20  ment identified 
49e0: 62 79 20 65 53 74 6d 74 2c 20 74 68 65 20 73 74  by eStmt, the st
49f0: 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 73 20 65 78  atement.** is ex
4a00: 65 63 75 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  ecuted..**.** Re
4a10: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20  turns SQLITE_OK 
4a20: 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
4a30: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
4a40: 20 65 78 65 63 75 74 65 64 2c 20 6f 72 20 61 6e   executed, or an
4a50: 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72  .** SQLite error
4a60: 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
4a70: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4a80: 66 74 73 33 53 71 6c 45 78 65 63 28 0a 20 20 69  fts3SqlExec(.  i
4a90: 6e 74 20 2a 70 52 43 2c 20 20 20 20 20 20 20 20  nt *pRC,        
4aa0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
4ab0: 74 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33  t code */.  Fts3
4ac0: 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
4ad0: 20 20 20 20 20 2f 2a 20 54 68 65 20 46 54 53 33       /* The FTS3
4ae0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
4af0: 65 53 74 6d 74 2c 20 20 20 20 20 20 20 20 20 20  eStmt,          
4b00: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
4b10: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 76   statement to ev
4b20: 61 6c 75 61 74 65 20 2a 2f 0a 20 20 73 71 6c 69  aluate */.  sqli
4b30: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
4b40: 6c 20 20 20 20 2f 2a 20 50 61 72 61 6d 65 74 65  l    /* Paramete
4b50: 72 73 20 74 6f 20 62 69 6e 64 20 2a 2f 0a 29 7b  rs to bind */.){
4b60: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
4b70: 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63  *pStmt;.  int rc
4b80: 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ;.  if( *pRC ) r
4b90: 65 74 75 72 6e 3b 0a 20 20 72 63 20 3d 20 66 74  eturn;.  rc = ft
4ba0: 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 65 53 74  s3SqlStmt(p, eSt
4bb0: 6d 74 2c 20 26 70 53 74 6d 74 2c 20 61 70 56 61  mt, &pStmt, apVa
4bc0: 6c 29 3b 20 0a 20 20 69 66 28 20 72 63 3d 3d 53  l); .  if( rc==S
4bd0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4be0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
4bf0: 6d 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  mt);.    rc = sq
4c00: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
4c10: 74 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 43 20 3d  t);.  }.  *pRC =
4c20: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
4c30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 6e 73  his function ens
4c40: 75 72 65 73 20 74 68 61 74 20 74 68 65 20 63 61  ures that the ca
4c50: 6c 6c 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65  ller has obtaine
4c60: 64 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 0a  d an exclusive .
4c70: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
4c80: 74 61 62 6c 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  table-lock on th
4c90: 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65  e %_segdir table
4ca0: 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
4cb0: 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20 77 72  ed before .** wr
4cc0: 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68  iting data to th
4cd0: 65 20 66 74 73 33 20 74 61 62 6c 65 2e 20 49 66  e fts3 table. If
4ce0: 20 74 68 69 73 20 6c 6f 63 6b 20 69 73 20 6e 6f   this lock is no
4cf0: 74 20 61 63 71 75 69 72 65 64 20 66 69 72 73 74  t acquired first
4d00: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61  , then.** the ca
4d10: 6c 6c 65 72 20 6d 61 79 20 65 6e 64 20 75 70 20  ller may end up 
4d20: 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 74 61  attempting to ta
4d30: 6b 65 20 74 68 69 73 20 6c 6f 63 6b 20 61 73 20  ke this lock as 
4d40: 70 61 72 74 20 6f 66 20 63 6f 6d 6d 69 74 74 69  part of committi
4d50: 6e 67 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74  ng.** a transact
4d60: 69 6f 6e 2c 20 63 61 75 73 69 6e 67 20 53 51 4c  ion, causing SQL
4d70: 69 74 65 20 74 6f 20 72 65 74 75 72 6e 20 53 51  ite to return SQ
4d80: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 6f 72 20 0a  LITE_LOCKED or .
4d90: 2a 2a 20 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  ** LOCKED_SHARED
4da0: 43 41 43 48 45 74 6f 20 61 20 43 4f 4d 4d 49 54  CACHEto a COMMIT
4db0: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
4dc0: 49 74 20 69 73 20 62 65 73 74 20 74 6f 20 61 76  It is best to av
4dd0: 6f 69 64 20 74 68 69 73 20 62 65 63 61 75 73 65  oid this because
4de0: 20 69 66 20 46 54 53 33 20 72 65 74 75 72 6e 73   if FTS3 returns
4df0: 20 61 6e 79 20 65 72 72 6f 72 20 77 68 65 6e 20   any error when 
4e00: 0a 2a 2a 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  .** committing a
4e10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
4e20: 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74  e whole transact
4e30: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c  ion will be roll
4e40: 65 64 20 62 61 63 6b 2e 20 0a 2a 2a 20 41 6e 64  ed back. .** And
4e50: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 77 68 61   this is not wha
4e60: 74 20 75 73 65 72 73 20 65 78 70 65 63 74 20 77  t users expect w
4e70: 68 65 6e 20 74 68 65 79 20 67 65 74 20 53 51 4c  hen they get SQL
4e80: 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
4e90: 44 43 41 43 48 45 2e 20 0a 2a 2a 20 49 74 20 63  DCACHE. .** It c
4ea0: 61 6e 20 73 74 69 6c 6c 20 68 61 70 70 65 6e 20  an still happen 
4eb0: 69 66 20 74 68 65 20 75 73 65 72 20 6c 6f 63 6b  if the user lock
4ec0: 73 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  s the underlying
4ed0: 20 74 61 62 6c 65 73 20 64 69 72 65 63 74 6c 79   tables directly
4ee0: 20 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20   .** instead of 
4ef0: 61 63 63 65 73 73 69 6e 67 20 74 68 65 6d 20 76  accessing them v
4f00: 69 61 20 46 54 53 2e 0a 2a 2f 0a 73 74 61 74 69  ia FTS..*/.stati
4f10: 63 20 69 6e 74 20 66 74 73 33 57 72 69 74 65 6c  c int fts3Writel
4f20: 6f 63 6b 28 46 74 73 33 54 61 62 6c 65 20 2a 70  ock(Fts3Table *p
4f30: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
4f40: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66  LITE_OK;.  .  if
4f50: 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74  ( p->nPendingDat
4f60: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  a==0 ){.    sqli
4f70: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
4f80: 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71  .    rc = fts3Sq
4f90: 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 44 45 4c  lStmt(p, SQL_DEL
4fa0: 45 54 45 5f 53 45 47 44 49 52 5f 4c 45 56 45 4c  ETE_SEGDIR_LEVEL
4fb0: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
4fc0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4fd0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
4fe0: 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70  ite3_bind_null(p
4ff0: 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  Stmt, 1);.      
5000: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
5010: 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  mt);.      rc = 
5020: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
5030: 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tmt);.    }.  }.
5040: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5050: 0a 2f 2a 0a 2a 2a 20 46 54 53 20 6d 61 69 6e 74  ./*.** FTS maint
5060: 61 69 6e 73 20 61 20 73 65 70 61 72 61 74 65 20  ains a separate 
5070: 69 6e 64 65 78 65 73 20 66 6f 72 20 65 61 63 68  indexes for each
5080: 20 6c 61 6e 67 75 61 67 65 2d 69 64 20 28 61 20   language-id (a 
5090: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 29 2e  32-bit integer).
50a0: 0a 2a 2a 20 57 69 74 68 69 6e 20 65 61 63 68 20  .** Within each 
50b0: 6c 61 6e 67 75 61 67 65 20 69 64 2c 20 61 20 73  language id, a s
50c0: 65 70 61 72 61 74 65 20 69 6e 64 65 78 20 69 73  eparate index is
50d0: 20 6d 61 69 6e 74 61 69 6e 65 64 20 74 6f 20 73   maintained to s
50e0: 74 6f 72 65 20 74 68 65 0a 2a 2a 20 64 6f 63 75  tore the.** docu
50f0: 6d 65 6e 74 20 74 65 72 6d 73 2c 20 61 6e 64 20  ment terms, and 
5100: 65 61 63 68 20 63 6f 6e 66 69 67 75 72 65 64 20  each configured 
5110: 70 72 65 66 69 78 20 73 69 7a 65 20 28 63 6f 6e  prefix size (con
5120: 66 69 67 75 72 65 64 20 74 68 65 20 46 54 53 20  figured the FTS 
5130: 0a 2a 2a 20 22 70 72 65 66 69 78 3d 22 20 6f 70  .** "prefix=" op
5140: 74 69 6f 6e 29 2e 20 41 6e 64 20 65 61 63 68 20  tion). And each 
5150: 69 6e 64 65 78 20 63 6f 6e 73 69 73 74 73 20 6f  index consists o
5160: 66 20 6d 75 6c 74 69 70 6c 65 20 6c 65 76 65 6c  f multiple level
5170: 73 20 28 22 72 65 6c 61 74 69 76 65 0a 2a 2a 20  s ("relative.** 
5180: 6c 65 76 65 6c 73 22 29 2e 0a 2a 2a 0a 2a 2a 20  levels")..**.** 
5190: 41 6c 6c 20 74 68 72 65 65 20 6f 66 20 74 68 65  All three of the
51a0: 73 65 20 76 61 6c 75 65 73 20 28 74 68 65 20 6c  se values (the l
51b0: 61 6e 67 75 61 67 65 20 69 64 2c 20 74 68 65 20  anguage id, the 
51c0: 73 70 65 63 69 66 69 63 20 69 6e 64 65 78 20 61  specific index a
51d0: 6e 64 20 74 68 65 0a 2a 2a 20 6c 65 76 65 6c 20  nd the.** level 
51e0: 77 69 74 68 69 6e 20 74 68 65 20 69 6e 64 65 78  within the index
51f0: 29 20 61 72 65 20 65 6e 63 6f 64 65 64 20 69 6e  ) are encoded in
5200: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
5210: 76 61 6c 75 65 73 20 73 74 6f 72 65 64 0a 2a 2a  values stored.**
5220: 20 69 6e 20 74 68 65 20 25 5f 73 65 67 64 69 72   in the %_segdir
5230: 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2e 20   table on disk. 
5240: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
5250: 20 75 73 65 64 20 74 6f 20 63 6f 6e 76 65 72 74   used to convert
5260: 20 74 68 72 65 65 0a 2a 2a 20 73 65 70 61 72 61   three.** separa
5270: 74 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 76 61 6c  te component val
5280: 75 65 73 20 69 6e 74 6f 20 74 68 65 20 73 69 6e  ues into the sin
5290: 67 6c 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67  gle 64-bit integ
52a0: 65 72 20 76 61 6c 75 65 20 74 68 61 74 0a 2a 2a  er value that.**
52b0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
52c0: 71 75 65 72 79 20 74 68 65 20 25 5f 73 65 67 64  query the %_segd
52d0: 69 72 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ir table..**.** 
52e0: 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 65 61  Specifically, ea
52f0: 63 68 20 6c 61 6e 67 75 61 67 65 2d 69 64 2f 69  ch language-id/i
5300: 6e 64 65 78 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ndex combination
5310: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 31 30   is allocated 10
5320: 32 34 20 0a 2a 2a 20 36 34 2d 62 69 74 20 69 6e  24 .** 64-bit in
5330: 74 65 67 65 72 20 6c 65 76 65 6c 20 76 61 6c 75  teger level valu
5340: 65 73 20 28 22 61 62 73 6f 6c 75 74 65 20 6c 65  es ("absolute le
5350: 76 65 6c 73 22 29 2e 20 54 68 65 20 6d 61 69 6e  vels"). The main
5360: 20 74 65 72 6d 73 20 69 6e 64 65 78 0a 2a 2a 20   terms index.** 
5370: 66 6f 72 20 6c 61 6e 67 75 61 67 65 2d 69 64 20  for language-id 
5380: 30 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 76 61  0 is allocate va
5390: 6c 75 65 73 20 30 2d 31 30 32 33 2e 20 54 68 65  lues 0-1023. The
53a0: 20 66 69 72 73 74 20 70 72 65 66 69 78 20 69 6e   first prefix in
53b0: 64 65 78 0a 2a 2a 20 28 69 66 20 61 6e 79 29 20  dex.** (if any) 
53c0: 66 6f 72 20 6c 61 6e 67 75 61 67 65 2d 69 64 20  for language-id 
53d0: 30 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 76  0 is allocated v
53e0: 61 6c 75 65 73 20 31 30 32 34 2d 32 30 34 37 2e  alues 1024-2047.
53f0: 20 41 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 20 4c   And so on..** L
5400: 61 6e 67 75 61 67 65 20 31 20 69 6e 64 65 78 65  anguage 1 indexe
5410: 73 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 20  s are allocated 
5420: 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
5430: 6f 77 69 6e 67 20 6c 61 6e 67 75 61 67 65 20 30  owing language 0
5440: 2e 0a 2a 2a 0a 2a 2a 20 53 6f 2c 20 66 6f 72 20  ..**.** So, for 
5450: 61 20 73 79 73 74 65 6d 20 77 69 74 68 20 6e 50  a system with nP
5460: 72 65 66 69 78 20 70 72 65 66 69 78 20 69 6e 64  refix prefix ind
5470: 65 78 65 73 20 63 6f 6e 66 69 67 75 72 65 64 2c  exes configured,
5480: 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 0a 2a 2a   the block of.**
5490: 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 73   absolute levels
54a0: 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
54b0: 73 20 74 6f 20 6c 61 6e 67 75 61 67 65 2d 69 64  s to language-id
54c0: 20 69 4c 61 6e 67 69 64 20 61 6e 64 20 69 6e 64   iLangid and ind
54d0: 65 78 20 0a 2a 2a 20 69 49 6e 64 65 78 20 73 74  ex .** iIndex st
54e0: 61 72 74 73 20 61 74 20 61 62 73 6f 6c 75 74 65  arts at absolute
54f0: 20 6c 65 76 65 6c 20 28 28 69 4c 61 6e 67 69 64   level ((iLangid
5500: 20 2a 20 28 6e 50 72 65 66 69 78 2b 31 29 20 2b   * (nPrefix+1) +
5510: 20 69 49 6e 64 65 78 29 20 2a 20 31 30 32 34 29   iIndex) * 1024)
5520: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
5530: 74 65 33 5f 69 6e 74 36 34 20 67 65 74 41 62 73  te3_int64 getAbs
5540: 6f 6c 75 74 65 4c 65 76 65 6c 28 0a 20 20 46 74  oluteLevel(.  Ft
5550: 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
5560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5570: 20 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64   FTS3 table hand
5580: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e  le */.  int iLan
5590: 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  gid,            
55a0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75          /* Langu
55b0: 61 67 65 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20  age id */.  int 
55c0: 69 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20  iIndex,         
55d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
55e0: 6e 64 65 78 20 69 6e 20 70 2d 3e 61 49 6e 64 65  ndex in p->aInde
55f0: 78 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  x[] */.  int iLe
5600: 76 65 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  vel             
5610: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65           /* Leve
5620: 6c 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f  l of segments */
5630: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  .){.  sqlite3_in
5640: 74 36 34 20 69 42 61 73 65 3b 20 20 20 20 20 20  t64 iBase;      
5650: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
5660: 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 66 6f  bsolute level fo
5670: 72 20 69 4c 61 6e 67 69 64 2f 69 49 6e 64 65 78  r iLangid/iIndex
5680: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 4c   */.  assert( iL
5690: 61 6e 67 69 64 3e 3d 30 20 29 3b 0a 20 20 61 73  angid>=0 );.  as
56a0: 73 65 72 74 28 20 70 2d 3e 6e 49 6e 64 65 78 3e  sert( p->nIndex>
56b0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
56c0: 49 6e 64 65 78 3e 3d 30 20 26 26 20 69 49 6e 64  Index>=0 && iInd
56d0: 65 78 3c 70 2d 3e 6e 49 6e 64 65 78 20 29 3b 0a  ex<p->nIndex );.
56e0: 0a 20 20 69 42 61 73 65 20 3d 20 28 28 73 71 6c  .  iBase = ((sql
56f0: 69 74 65 33 5f 69 6e 74 36 34 29 69 4c 61 6e 67  ite3_int64)iLang
5700: 69 64 20 2a 20 70 2d 3e 6e 49 6e 64 65 78 20 2b  id * p->nIndex +
5710: 20 69 49 6e 64 65 78 29 20 2a 20 46 54 53 33 5f   iIndex) * FTS3_
5720: 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 3b  SEGDIR_MAXLEVEL;
5730: 0a 20 20 72 65 74 75 72 6e 20 69 42 61 73 65 20  .  return iBase 
5740: 2b 20 69 4c 65 76 65 6c 3b 0a 7d 0a 0a 2f 2a 0a  + iLevel;.}../*.
5750: 2a 2a 20 53 65 74 20 2a 70 70 53 74 6d 74 20 74  ** Set *ppStmt t
5760: 6f 20 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61  o a statement ha
5770: 6e 64 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65  ndle that may be
5780: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
5790: 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20   through.** all 
57a0: 72 6f 77 73 20 69 6e 20 74 68 65 20 25 5f 73 65  rows in the %_se
57b0: 67 64 69 72 20 74 61 62 6c 65 2c 20 66 72 6f 6d  gdir table, from
57c0: 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77 65 73   oldest to newes
57d0: 74 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  t. If successful
57e0: 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49  ,.** return SQLI
57f0: 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 65 72 72  TE_OK. If an err
5800: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
5810: 70 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74  preparing the st
5820: 61 74 65 6d 65 6e 74 2c 20 0a 2a 2a 20 72 65 74  atement, .** ret
5830: 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
5840: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
5850: 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  There is only ev
5860: 65 72 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  er one instance 
5870: 6f 66 20 74 68 69 73 20 53 51 4c 20 73 74 61 74  of this SQL stat
5880: 65 6d 65 6e 74 20 63 6f 6d 70 69 6c 65 64 20 66  ement compiled f
5890: 6f 72 0a 2a 2a 20 65 61 63 68 20 46 54 53 33 20  or.** each FTS3 
58a0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
58b0: 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
58c0: 6e 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ns the following
58d0: 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68   columns from th
58e0: 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65  e %_segdir table
58f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 69 64 78  :.**.**   0: idx
5900: 0a 2a 2a 20 20 20 31 3a 20 73 74 61 72 74 5f 62  .**   1: start_b
5910: 6c 6f 63 6b 0a 2a 2a 20 20 20 32 3a 20 6c 65 61  lock.**   2: lea
5920: 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 0a 2a 2a  ves_end_block.**
5930: 20 20 20 33 3a 20 65 6e 64 5f 62 6c 6f 63 6b 0a     3: end_block.
5940: 2a 2a 20 20 20 34 3a 20 72 6f 6f 74 0a 2a 2f 0a  **   4: root.*/.
5950: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 41  int sqlite3Fts3A
5960: 6c 6c 53 65 67 64 69 72 73 28 0a 20 20 46 74 73  llSegdirs(.  Fts
5970: 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
5980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5990: 46 54 53 33 20 74 61 62 6c 65 20 2a 2f 0a 20 20  FTS3 table */.  
59a0: 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20 20 20  int iLangid,    
59b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59c0: 2f 2a 20 4c 61 6e 67 75 61 67 65 20 62 65 69 6e  /* Language bein
59d0: 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 69  g queried */.  i
59e0: 6e 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20 20  nt iIndex,      
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5a00: 2a 20 49 6e 64 65 78 20 66 6f 72 20 70 2d 3e 61  * Index for p->a
5a10: 49 6e 64 65 78 5b 5d 20 2a 2f 0a 20 20 69 6e 74  Index[] */.  int
5a20: 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20   iLevel,        
5a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5a40: 4c 65 76 65 6c 20 74 6f 20 73 65 6c 65 63 74 20  Level to select 
5a50: 28 72 65 6c 61 74 69 76 65 20 6c 65 76 65 6c 29  (relative level)
5a60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
5a70: 6d 74 20 2a 2a 70 70 53 74 6d 74 20 20 20 20 20  mt **ppStmt     
5a80: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 6f        /* OUT: Co
5a90: 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
5aa0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
5ab0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
5ac0: 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 61  *pStmt = 0;..  a
5ad0: 73 73 65 72 74 28 20 69 4c 65 76 65 6c 3d 3d 46  ssert( iLevel==F
5ae0: 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c  TS3_SEGCURSOR_AL
5af0: 4c 20 7c 7c 20 69 4c 65 76 65 6c 3e 3d 30 20 29  L || iLevel>=0 )
5b00: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 76  ;.  assert( iLev
5b10: 65 6c 3c 46 54 53 33 5f 53 45 47 44 49 52 5f 4d  el<FTS3_SEGDIR_M
5b20: 41 58 4c 45 56 45 4c 20 29 3b 0a 20 20 61 73 73  AXLEVEL );.  ass
5b30: 65 72 74 28 20 69 49 6e 64 65 78 3e 3d 30 20 26  ert( iIndex>=0 &
5b40: 26 20 69 49 6e 64 65 78 3c 70 2d 3e 6e 49 6e 64  & iIndex<p->nInd
5b50: 65 78 20 29 3b 0a 0a 20 20 69 66 28 20 69 4c 65  ex );..  if( iLe
5b60: 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20  vel<0 ){.    /* 
5b70: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 25  "SELECT * FROM %
5b80: 5f 73 65 67 64 69 72 20 57 48 45 52 45 20 6c 65  _segdir WHERE le
5b90: 76 65 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e  vel BETWEEN ? AN
5ba0: 44 20 3f 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e  D ? ORDER BY ...
5bb0: 22 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74  " */.    rc = ft
5bc0: 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
5bd0: 5f 53 45 4c 45 43 54 5f 4c 45 56 45 4c 5f 52 41  _SELECT_LEVEL_RA
5be0: 4e 47 45 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  NGE, &pStmt, 0);
5bf0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
5c00: 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20  ITE_OK ){ .     
5c10: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
5c20: 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 67 65  t64(pStmt, 1, ge
5c30: 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70  tAbsoluteLevel(p
5c40: 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
5c50: 78 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 73 71  x, 0));.      sq
5c60: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
5c70: 28 70 53 74 6d 74 2c 20 32 2c 20 0a 20 20 20 20  (pStmt, 2, .    
5c80: 20 20 20 20 20 20 67 65 74 41 62 73 6f 6c 75 74        getAbsolut
5c90: 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69  eLevel(p, iLangi
5ca0: 64 2c 20 69 49 6e 64 65 78 2c 20 46 54 53 33 5f  d, iIndex, FTS3_
5cb0: 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 2d  SEGDIR_MAXLEVEL-
5cc0: 31 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  1).      );.    
5cd0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
5ce0: 2a 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  * "SELECT * FROM
5cf0: 20 25 5f 73 65 67 64 69 72 20 57 48 45 52 45 20   %_segdir WHERE 
5d00: 6c 65 76 65 6c 20 3d 20 3f 20 4f 52 44 45 52 20  level = ? ORDER 
5d10: 42 59 20 2e 2e 2e 22 20 2a 2f 0a 20 20 20 20 72  BY ..." */.    r
5d20: 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28  c = fts3SqlStmt(
5d30: 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c 45  p, SQL_SELECT_LE
5d40: 56 45 4c 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  VEL, &pStmt, 0);
5d50: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
5d60: 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20  ITE_OK ){ .     
5d70: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
5d80: 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 67 65  t64(pStmt, 1, ge
5d90: 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70  tAbsoluteLevel(p
5da0: 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
5db0: 78 2c 69 4c 65 76 65 6c 29 29 3b 0a 20 20 20 20  x,iLevel));.    
5dc0: 7d 0a 20 20 7d 0a 20 20 2a 70 70 53 74 6d 74 20  }.  }.  *ppStmt 
5dd0: 3d 20 70 53 74 6d 74 3b 0a 20 20 72 65 74 75 72  = pStmt;.  retur
5de0: 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
5df0: 41 70 70 65 6e 64 20 61 20 73 69 6e 67 6c 65 20  Append a single 
5e00: 76 61 72 69 6e 74 20 74 6f 20 61 20 50 65 6e 64  varint to a Pend
5e10: 69 6e 67 4c 69 73 74 20 62 75 66 66 65 72 2e 20  ingList buffer. 
5e20: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
5e30: 75 72 6e 65 64 0a 2a 2a 20 69 66 20 73 75 63 63  urned.** if succ
5e40: 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
5e50: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
5e60: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
5e70: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
5e80: 6c 73 6f 20 73 65 72 76 65 73 20 74 6f 20 61 6c  lso serves to al
5e90: 6c 6f 63 61 74 65 20 74 68 65 20 50 65 6e 64 69  locate the Pendi
5ea0: 6e 67 4c 69 73 74 20 73 74 72 75 63 74 75 72 65  ngList structure
5eb0: 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 46 6f 72 20   itself..** For 
5ec0: 65 78 61 6d 70 6c 65 2c 20 74 6f 20 63 72 65 61  example, to crea
5ed0: 74 65 20 61 20 6e 65 77 20 50 65 6e 64 69 6e 67  te a new Pending
5ee0: 4c 69 73 74 20 73 74 72 75 63 74 75 72 65 20 63  List structure c
5ef0: 6f 6e 74 61 69 6e 69 6e 67 20 74 77 6f 0a 2a 2a  ontaining two.**
5f00: 20 76 61 72 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20   varints:.**.** 
5f10: 20 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70    PendingList *p
5f20: 20 3d 20 30 3b 0a 2a 2a 20 20 20 66 74 73 33 50   = 0;.**   fts3P
5f30: 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64  endingListAppend
5f40: 56 61 72 69 6e 74 28 26 70 2c 20 31 29 3b 0a 2a  Varint(&p, 1);.*
5f50: 2a 20 20 20 66 74 73 33 50 65 6e 64 69 6e 67 4c  *   fts3PendingL
5f60: 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e 74 28  istAppendVarint(
5f70: 26 70 2c 20 32 29 3b 0a 2a 2f 0a 73 74 61 74 69  &p, 2);.*/.stati
5f80: 63 20 69 6e 74 20 66 74 73 33 50 65 6e 64 69 6e  c int fts3Pendin
5f90: 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e  gListAppendVarin
5fa0: 74 28 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73 74  t(.  PendingList
5fb0: 20 2a 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20   **pp,          
5fc0: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
5fd0: 50 6f 69 6e 74 65 72 20 74 6f 20 50 65 6e 64 69  Pointer to Pendi
5fe0: 6e 67 4c 69 73 74 20 73 74 72 75 63 74 20 2a 2f  ngList struct */
5ff0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
6000: 20 69 20 20 20 20 20 20 20 20 20 20 20 20 20 20   i              
6010: 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 61     /* Value to a
6020: 70 70 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f  ppend to data */
6030: 0a 29 7b 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73  .){.  PendingLis
6040: 74 20 2a 70 20 3d 20 2a 70 70 3b 0a 0a 20 20 2f  t *p = *pp;..  /
6050: 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 67 72  * Allocate or gr
6060: 6f 77 20 74 68 65 20 50 65 6e 64 69 6e 67 4c 69  ow the PendingLi
6070: 73 74 20 61 73 20 72 65 71 75 69 72 65 64 2e 20  st as required. 
6080: 2a 2f 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  */.  if( !p ){. 
6090: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d     p = sqlite3_m
60a0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 29  alloc(sizeof(*p)
60b0: 20 2b 20 31 30 30 29 3b 0a 20 20 20 20 69 66 28   + 100);.    if(
60c0: 20 21 70 20 29 7b 0a 20 20 20 20 20 20 72 65 74   !p ){.      ret
60d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
60e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e  ;.    }.    p->n
60f0: 53 70 61 63 65 20 3d 20 31 30 30 3b 0a 20 20 20  Space = 100;.   
6100: 20 70 2d 3e 61 44 61 74 61 20 3d 20 28 63 68 61   p->aData = (cha
6110: 72 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 70  r *)&p[1];.    p
6120: 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d  ->nData = 0;.  }
6130: 0a 20 20 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e  .  else if( p->n
6140: 44 61 74 61 2b 46 54 53 33 5f 56 41 52 49 4e 54  Data+FTS3_VARINT
6150: 5f 4d 41 58 2b 31 3e 70 2d 3e 6e 53 70 61 63 65  _MAX+1>p->nSpace
6160: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77   ){.    int nNew
6170: 20 3d 20 70 2d 3e 6e 53 70 61 63 65 20 2a 20 32   = p->nSpace * 2
6180: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
6190: 33 5f 72 65 61 6c 6c 6f 63 28 70 2c 20 73 69 7a  3_realloc(p, siz
61a0: 65 6f 66 28 2a 70 29 20 2b 20 6e 4e 65 77 29 3b  eof(*p) + nNew);
61b0: 0a 20 20 20 20 69 66 28 20 21 70 20 29 7b 0a 20  .    if( !p ){. 
61c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
61d0: 65 28 2a 70 70 29 3b 0a 20 20 20 20 20 20 2a 70  e(*pp);.      *p
61e0: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  p = 0;.      ret
61f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
6200: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e  ;.    }.    p->n
6210: 53 70 61 63 65 20 3d 20 6e 4e 65 77 3b 0a 20 20  Space = nNew;.  
6220: 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 28 63 68    p->aData = (ch
6230: 61 72 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 7d 0a  ar *)&p[1];.  }.
6240: 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65  .  /* Append the
6250: 20 6e 65 77 20 73 65 72 69 61 6c 69 7a 65 64 20   new serialized 
6260: 76 61 72 69 6e 74 20 74 6f 20 74 68 65 20 65 6e  varint to the en
6270: 64 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 20 2a  d of the list. *
6280: 2f 0a 20 20 70 2d 3e 6e 44 61 74 61 20 2b 3d 20  /.  p->nData += 
6290: 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
62a0: 72 69 6e 74 28 26 70 2d 3e 61 44 61 74 61 5b 70  rint(&p->aData[p
62b0: 2d 3e 6e 44 61 74 61 5d 2c 20 69 29 3b 0a 20 20  ->nData], i);.  
62c0: 70 2d 3e 61 44 61 74 61 5b 70 2d 3e 6e 44 61 74  p->aData[p->nDat
62d0: 61 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 2a 70 70  a] = '\0';.  *pp
62e0: 20 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e 20 53   = p;.  return S
62f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
6300: 2a 2a 20 41 64 64 20 61 20 64 6f 63 69 64 2f 63  ** Add a docid/c
6310: 6f 6c 75 6d 6e 2f 70 6f 73 69 74 69 6f 6e 20 65  olumn/position e
6320: 6e 74 72 79 20 74 6f 20 61 20 50 65 6e 64 69 6e  ntry to a Pendin
6330: 67 4c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e  gList structure.
6340: 20 4e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 73 20   Non-zero.** is 
6350: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
6360: 73 74 72 75 63 74 75 72 65 20 69 73 20 73 71 6c  structure is sql
6370: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 65 64 20 61  ite3_realloced a
6380: 73 20 70 61 72 74 20 6f 66 20 61 64 64 69 6e 67  s part of adding
6390: 0a 2a 2a 20 74 68 65 20 65 6e 74 72 79 2e 20 4f  .** the entry. O
63a0: 74 68 65 72 77 69 73 65 2c 20 7a 65 72 6f 2e 0a  therwise, zero..
63b0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
63c0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
63d0: 52 63 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  Rc is set to SQL
63e0: 49 54 45 5f 4e 4f 4d 45 4d 20 62 65 66 6f 72 65  ITE_NOMEM before
63f0: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 5a   returning..** Z
6400: 65 72 6f 20 69 73 20 61 6c 77 61 79 73 20 72 65  ero is always re
6410: 74 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63  turned in this c
6420: 61 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ase. Otherwise, 
6430: 69 66 20 6e 6f 20 4f 4f 4d 20 65 72 72 6f 72 20  if no OOM error 
6440: 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73  occurs,.** it is
6450: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
6460: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
6470: 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74   fts3PendingList
6480: 41 70 70 65 6e 64 28 0a 20 20 50 65 6e 64 69 6e  Append(.  Pendin
6490: 67 4c 69 73 74 20 2a 2a 70 70 2c 20 20 20 20 20  gList **pp,     
64a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
64b0: 4f 55 54 3a 20 50 65 6e 64 69 6e 67 4c 69 73 74  OUT: PendingList
64c0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
64d0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44  sqlite3_int64 iD
64e0: 6f 63 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  ocid,           
64f0: 2f 2a 20 44 6f 63 69 64 20 66 6f 72 20 65 6e 74  /* Docid for ent
6500: 72 79 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 73  ry to add */.  s
6510: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 43 6f  qlite3_int64 iCo
6520: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
6530: 2a 20 43 6f 6c 75 6d 6e 20 66 6f 72 20 65 6e 74  * Column for ent
6540: 72 79 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 73  ry to add */.  s
6550: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 6f  qlite3_int64 iPo
6560: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
6570: 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 65  * Position of te
6580: 72 6d 20 66 6f 72 20 65 6e 74 72 79 20 74 6f 20  rm for entry to 
6590: 61 64 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  add */.  int *pR
65a0: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
65b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
65c0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
65d0: 29 7b 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73 74  ){.  PendingList
65e0: 20 2a 70 20 3d 20 2a 70 70 3b 0a 20 20 69 6e 74   *p = *pp;.  int
65f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
6600: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 20 7c  ..  assert( !p |
6610: 7c 20 70 2d 3e 69 4c 61 73 74 44 6f 63 69 64 3c  | p->iLastDocid<
6620: 3d 69 44 6f 63 69 64 20 29 3b 0a 0a 20 20 69 66  =iDocid );..  if
6630: 28 20 21 70 20 7c 7c 20 70 2d 3e 69 4c 61 73 74  ( !p || p->iLast
6640: 44 6f 63 69 64 21 3d 69 44 6f 63 69 64 20 29 7b  Docid!=iDocid ){
6650: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
6660: 36 34 20 69 44 65 6c 74 61 20 3d 20 69 44 6f 63  64 iDelta = iDoc
6670: 69 64 20 2d 20 28 70 20 3f 20 70 2d 3e 69 4c 61  id - (p ? p->iLa
6680: 73 74 44 6f 63 69 64 20 3a 20 30 29 3b 0a 20 20  stDocid : 0);.  
6690: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
66a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 44 61 74   assert( p->nDat
66b0: 61 3c 70 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 20  a<p->nSpace );. 
66c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
66d0: 61 44 61 74 61 5b 70 2d 3e 6e 44 61 74 61 5d 3d  aData[p->nData]=
66e0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  =0 );.      p->n
66f0: 44 61 74 61 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Data++;.    }.  
6700: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
6710: 3d 28 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69  =(rc = fts3Pendi
6720: 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69  ngListAppendVari
6730: 6e 74 28 26 70 2c 20 69 44 65 6c 74 61 29 29 20  nt(&p, iDelta)) 
6740: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 65  ){.      goto pe
6750: 6e 64 69 6e 67 6c 69 73 74 61 70 70 65 6e 64 5f  ndinglistappend_
6760: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
6770: 2d 3e 69 4c 61 73 74 43 6f 6c 20 3d 20 2d 31 3b  ->iLastCol = -1;
6780: 0a 20 20 20 20 70 2d 3e 69 4c 61 73 74 50 6f 73  .    p->iLastPos
6790: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 69 4c 61   = 0;.    p->iLa
67a0: 73 74 44 6f 63 69 64 20 3d 20 69 44 6f 63 69 64  stDocid = iDocid
67b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c  ;.  }.  if( iCol
67c0: 3e 30 20 26 26 20 70 2d 3e 69 4c 61 73 74 43 6f  >0 && p->iLastCo
67d0: 6c 21 3d 69 43 6f 6c 20 29 7b 0a 20 20 20 20 69  l!=iCol ){.    i
67e0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
67f0: 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 4c  c = fts3PendingL
6800: 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e 74 28  istAppendVarint(
6810: 26 70 2c 20 31 29 29 0a 20 20 20 20 20 7c 7c 20  &p, 1)).     || 
6820: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(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 69 43 6f 6c 29 29 0a 20 20 20 20 29 7b 0a 20   iCol)).    ){. 
6860: 20 20 20 20 20 67 6f 74 6f 20 70 65 6e 64 69 6e       goto pendin
6870: 67 6c 69 73 74 61 70 70 65 6e 64 5f 6f 75 74 3b  glistappend_out;
6880: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 4c  .    }.    p->iL
6890: 61 73 74 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20  astCol = iCol;. 
68a0: 20 20 20 70 2d 3e 69 4c 61 73 74 50 6f 73 20 3d     p->iLastPos =
68b0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43   0;.  }.  if( iC
68c0: 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ol>=0 ){.    ass
68d0: 65 72 74 28 20 69 50 6f 73 3e 70 2d 3e 69 4c 61  ert( iPos>p->iLa
68e0: 73 74 50 6f 73 20 7c 7c 20 28 69 50 6f 73 3d 3d  stPos || (iPos==
68f0: 30 20 26 26 20 70 2d 3e 69 4c 61 73 74 50 6f 73  0 && p->iLastPos
6900: 3d 3d 30 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  ==0) );.    rc =
6910: 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74   fts3PendingList
6920: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2c  AppendVarint(&p,
6930: 20 32 2b 69 50 6f 73 2d 70 2d 3e 69 4c 61 73 74   2+iPos-p->iLast
6940: 50 6f 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Pos);.    if( rc
6950: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6960: 20 20 20 20 20 70 2d 3e 69 4c 61 73 74 50 6f 73       p->iLastPos
6970: 20 3d 20 69 50 6f 73 3b 0a 20 20 20 20 7d 0a 20   = iPos;.    }. 
6980: 20 7d 0a 0a 20 70 65 6e 64 69 6e 67 6c 69 73 74   }.. pendinglist
6990: 61 70 70 65 6e 64 5f 6f 75 74 3a 0a 20 20 2a 70  append_out:.  *p
69a0: 52 63 20 3d 20 72 63 3b 0a 20 20 69 66 28 20 70  Rc = rc;.  if( p
69b0: 21 3d 2a 70 70 20 29 7b 0a 20 20 20 20 2a 70 70  !=*pp ){.    *pp
69c0: 20 3d 20 70 3b 0a 20 20 20 20 72 65 74 75 72 6e   = p;.    return
69d0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
69e0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65   0;.}../*.** Fre
69f0: 65 20 61 20 50 65 6e 64 69 6e 67 4c 69 73 74 20  e a PendingList 
6a00: 6f 62 6a 65 63 74 20 61 6c 6c 6f 63 61 74 65 64  object allocated
6a10: 20 62 79 20 66 74 73 33 50 65 6e 64 69 6e 67 4c   by fts3PendingL
6a20: 69 73 74 41 70 70 65 6e 64 28 29 2e 0a 2a 2f 0a  istAppend()..*/.
6a30: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
6a40: 50 65 6e 64 69 6e 67 4c 69 73 74 44 65 6c 65 74  PendingListDelet
6a50: 65 28 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70  e(PendingList *p
6a60: 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  List){.  sqlite3
6a70: 5f 66 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  _free(pList);.}.
6a80: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e  ./*.** Add an en
6a90: 74 72 79 20 74 6f 20 6f 6e 65 20 6f 66 20 74 68  try to one of th
6aa0: 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20  e pending-terms 
6ab0: 68 61 73 68 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a  hash tables..*/.
6ac0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 50  static int fts3P
6ad0: 65 6e 64 69 6e 67 54 65 72 6d 73 41 64 64 4f 6e  endingTermsAddOn
6ae0: 65 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  e(.  Fts3Table *
6af0: 70 2c 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 0a 20  p,.  int iCol,. 
6b00: 20 69 6e 74 20 69 50 6f 73 2c 0a 20 20 46 74 73   int iPos,.  Fts
6b10: 33 48 61 73 68 20 2a 70 48 61 73 68 2c 20 20 20  3Hash *pHash,   
6b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6b30: 50 65 6e 64 69 6e 67 20 74 65 72 6d 73 20 68 61  Pending terms ha
6b40: 73 68 20 74 61 62 6c 65 20 74 6f 20 61 64 64 20  sh table to add 
6b50: 65 6e 74 72 79 20 74 6f 20 2a 2f 0a 20 20 63 6f  entry to */.  co
6b60: 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e  nst char *zToken
6b70: 2c 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 0a 29  ,.  int nToken.)
6b80: 7b 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73 74 20  {.  PendingList 
6b90: 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 63  *pList;.  int rc
6ba0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
6bb0: 20 70 4c 69 73 74 20 3d 20 28 50 65 6e 64 69 6e   pList = (Pendin
6bc0: 67 4c 69 73 74 20 2a 29 66 74 73 33 48 61 73 68  gList *)fts3Hash
6bd0: 46 69 6e 64 28 70 48 61 73 68 2c 20 7a 54 6f 6b  Find(pHash, zTok
6be0: 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 69  en, nToken);.  i
6bf0: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
6c00: 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20  p->nPendingData 
6c10: 2d 3d 20 28 70 4c 69 73 74 2d 3e 6e 44 61 74 61  -= (pList->nData
6c20: 20 2b 20 6e 54 6f 6b 65 6e 20 2b 20 73 69 7a 65   + nToken + size
6c30: 6f 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d 29  of(Fts3HashElem)
6c40: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 74 73  );.  }.  if( fts
6c50: 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65  3PendingListAppe
6c60: 6e 64 28 26 70 4c 69 73 74 2c 20 70 2d 3e 69 50  nd(&pList, p->iP
6c70: 72 65 76 44 6f 63 69 64 2c 20 69 43 6f 6c 2c 20  revDocid, iCol, 
6c80: 69 50 6f 73 2c 20 26 72 63 29 20 29 7b 0a 20 20  iPos, &rc) ){.  
6c90: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 66 74 73    if( pList==fts
6ca0: 33 48 61 73 68 49 6e 73 65 72 74 28 70 48 61 73  3HashInsert(pHas
6cb0: 68 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  h, zToken, nToke
6cc0: 6e 2c 20 70 4c 69 73 74 29 20 29 7b 0a 20 20 20  n, pList) ){.   
6cd0: 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69     /* Malloc fai
6ce0: 6c 65 64 20 77 68 69 6c 65 20 69 6e 73 65 72 74  led while insert
6cf0: 69 6e 67 20 74 68 65 20 6e 65 77 20 65 6e 74 72  ing the new entr
6d00: 79 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  y. This can only
6d10: 20 0a 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65   .      ** happe
6d20: 6e 20 69 66 20 74 68 65 72 65 20 77 61 73 20 6e  n if there was n
6d30: 6f 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  o previous entry
6d40: 20 66 6f 72 20 74 68 69 73 20 74 6f 6b 65 6e 2e   for this token.
6d50: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
6d60: 61 73 73 65 72 74 28 20 30 3d 3d 66 74 73 33 48  assert( 0==fts3H
6d70: 61 73 68 46 69 6e 64 28 70 48 61 73 68 2c 20 7a  ashFind(pHash, z
6d80: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 20 29  Token, nToken) )
6d90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
6da0: 66 72 65 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  free(pList);.   
6db0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
6dc0: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
6dd0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6de0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 50  _OK ){.    p->nP
6df0: 65 6e 64 69 6e 67 44 61 74 61 20 2b 3d 20 28 70  endingData += (p
6e00: 4c 69 73 74 2d 3e 6e 44 61 74 61 20 2b 20 6e 54  List->nData + nT
6e10: 6f 6b 65 6e 20 2b 20 73 69 7a 65 6f 66 28 46 74  oken + sizeof(Ft
6e20: 73 33 48 61 73 68 45 6c 65 6d 29 29 3b 0a 20 20  s3HashElem));.  
6e30: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6e40: 0a 0a 2f 2a 0a 2a 2a 20 54 6f 6b 65 6e 69 7a 65  ../*.** Tokenize
6e50: 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61   the nul-termina
6e60: 74 65 64 20 73 74 72 69 6e 67 20 7a 54 65 78 74  ted string zText
6e70: 20 61 6e 64 20 61 64 64 20 61 6c 6c 20 74 6f 6b   and add all tok
6e80: 65 6e 73 20 74 6f 20 74 68 65 0a 2a 2a 20 70 65  ens to the.** pe
6e90: 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68  nding-terms hash
6ea0: 2d 74 61 62 6c 65 2e 20 54 68 65 20 64 6f 63 69  -table. The doci
6eb0: 64 20 75 73 65 64 20 69 73 20 74 68 61 74 20 63  d used is that c
6ec0: 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
6ed0: 69 6e 0a 2a 2a 20 70 2d 3e 69 50 72 65 76 44 6f  in.** p->iPrevDo
6ee0: 63 69 64 2c 20 61 6e 64 20 74 68 65 20 63 6f 6c  cid, and the col
6ef0: 75 6d 6e 20 69 73 20 73 70 65 63 69 66 69 65 64  umn is specified
6f00: 20 62 79 20 61 72 67 75 6d 65 6e 74 20 69 43 6f   by argument iCo
6f10: 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  l..**.** If succ
6f20: 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
6f30: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
6f40: 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c  therwise, an SQL
6f50: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
6f60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
6f70: 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 41 64  s3PendingTermsAd
6f80: 64 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  d(.  Fts3Table *
6f90: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
6fa0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 69 6e       /* Table in
6fb0: 74 6f 20 77 68 69 63 68 20 74 65 78 74 20 77 69  to which text wi
6fc0: 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 2a  ll be inserted *
6fd0: 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c  /.  int iLangid,
6fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ff0: 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20      /* Language 
7000: 69 64 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 63  id to use */.  c
7010: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
7020: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7030: 2a 20 54 65 78 74 20 6f 66 20 64 6f 63 75 6d 65  * Text of docume
7040: 6e 74 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  nt to be inserte
7050: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  d */.  int iCol,
7060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7070: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
7080: 20 69 6e 74 6f 20 77 68 69 63 68 20 74 65 78 74   into which text
7090: 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74   is being insert
70a0: 65 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 6e 57  ed */.  u32 *pnW
70b0: 6f 72 64 20 20 20 20 20 20 20 20 20 20 20 20 20  ord             
70c0: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
70d0: 54 3a 20 49 6e 63 72 2e 20 62 79 20 6e 75 6d 62  T: Incr. by numb
70e0: 65 72 20 74 6f 6b 65 6e 73 20 69 6e 73 65 72 74  er tokens insert
70f0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ed */.){.  int r
7100: 63 3b 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20  c;.  int iStart 
7110: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20  = 0;.  int iEnd 
7120: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 50 6f 73 20  = 0;.  int iPos 
7130: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 6f 72 64  = 0;.  int nWord
7140: 20 3d 20 30 3b 0a 0a 20 20 63 68 61 72 20 63 6f   = 0;..  char co
7150: 6e 73 74 20 2a 7a 54 6f 6b 65 6e 3b 0a 20 20 69  nst *zToken;.  i
7160: 6e 74 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 0a  nt nToken = 0;..
7170: 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69    sqlite3_tokeni
7180: 7a 65 72 20 2a 70 54 6f 6b 65 6e 69 7a 65 72 20  zer *pTokenizer 
7190: 3d 20 70 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 3b  = p->pTokenizer;
71a0: 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e  .  sqlite3_token
71b0: 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73  izer_module cons
71c0: 74 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 54 6f  t *pModule = pTo
71d0: 6b 65 6e 69 7a 65 72 2d 3e 70 4d 6f 64 75 6c 65  kenizer->pModule
71e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65  ;.  sqlite3_toke
71f0: 6e 69 7a 65 72 5f 63 75 72 73 6f 72 20 2a 70 43  nizer_cursor *pC
7200: 73 72 3b 0a 20 20 69 6e 74 20 28 2a 78 4e 65 78  sr;.  int (*xNex
7210: 74 29 28 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e  t)(sqlite3_token
7220: 69 7a 65 72 5f 63 75 72 73 6f 72 20 2a 70 43 75  izer_cursor *pCu
7230: 72 73 6f 72 2c 0a 20 20 20 20 20 20 63 6f 6e 73  rsor,.      cons
7240: 74 20 63 68 61 72 2a 2a 2c 69 6e 74 2a 2c 69 6e  t char**,int*,in
7250: 74 2a 2c 69 6e 74 2a 2c 69 6e 74 2a 29 3b 0a 0a  t*,int*,int*);..
7260: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
7270: 69 7a 65 72 20 26 26 20 70 4d 6f 64 75 6c 65 20  izer && pModule 
7280: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
7290: 75 73 65 72 20 68 61 73 20 69 6e 73 65 72 74 65  user has inserte
72a0: 64 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20  d a NULL value, 
72b0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  this function ma
72c0: 79 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  y be called with
72d0: 0a 20 20 2a 2a 20 7a 54 65 78 74 3d 3d 30 2e 20  .  ** zText==0. 
72e0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 64  In this case, ad
72f0: 64 20 7a 65 72 6f 20 74 6f 6b 65 6e 20 65 6e 74  d zero token ent
7300: 72 69 65 73 20 74 6f 20 74 68 65 20 68 61 73 68  ries to the hash
7310: 20 74 61 62 6c 65 20 61 6e 64 20 0a 20 20 2a 2a   table and .  **
7320: 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a   return early. *
7330: 2f 0a 20 20 69 66 28 20 7a 54 65 78 74 3d 3d 30  /.  if( zText==0
7340: 20 29 7b 0a 20 20 20 20 2a 70 6e 57 6f 72 64 20   ){.    *pnWord 
7350: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
7360: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
7370: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
7380: 73 33 4f 70 65 6e 54 6f 6b 65 6e 69 7a 65 72 28  s3OpenTokenizer(
7390: 70 54 6f 6b 65 6e 69 7a 65 72 2c 20 69 4c 61 6e  pTokenizer, iLan
73a0: 67 69 64 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20  gid, zText, -1, 
73b0: 26 70 43 73 72 29 3b 0a 20 20 69 66 28 20 72 63  &pCsr);.  if( rc
73c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
73d0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
73e0: 7d 0a 0a 20 20 78 4e 65 78 74 20 3d 20 70 4d 6f  }..  xNext = pMo
73f0: 64 75 6c 65 2d 3e 78 4e 65 78 74 3b 0a 20 20 77  dule->xNext;.  w
7400: 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 4f 4b 3d  hile( SQLITE_OK=
7410: 3d 72 63 0a 20 20 20 20 20 20 26 26 20 53 51 4c  =rc.      && SQL
7420: 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 78 4e  ITE_OK==(rc = xN
7430: 65 78 74 28 70 43 73 72 2c 20 26 7a 54 6f 6b 65  ext(pCsr, &zToke
7440: 6e 2c 20 26 6e 54 6f 6b 65 6e 2c 20 26 69 53 74  n, &nToken, &iSt
7450: 61 72 74 2c 20 26 69 45 6e 64 2c 20 26 69 50 6f  art, &iEnd, &iPo
7460: 73 29 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  s)).  ){.    int
7470: 20 69 3b 0a 20 20 20 20 69 66 28 20 69 50 6f 73   i;.    if( iPos
7480: 3e 3d 6e 57 6f 72 64 20 29 20 6e 57 6f 72 64 20  >=nWord ) nWord 
7490: 3d 20 69 50 6f 73 2b 31 3b 0a 0a 20 20 20 20 2f  = iPos+1;..    /
74a0: 2a 20 50 6f 73 69 74 69 6f 6e 73 20 63 61 6e 6e  * Positions cann
74b0: 6f 74 20 62 65 20 6e 65 67 61 74 69 76 65 3b 20  ot be negative; 
74c0: 77 65 20 75 73 65 20 2d 31 20 61 73 20 61 20 74  we use -1 as a t
74d0: 65 72 6d 69 6e 61 74 6f 72 20 69 6e 74 65 72 6e  erminator intern
74e0: 61 6c 6c 79 2e 0a 20 20 20 20 2a 2a 20 54 6f 6b  ally..    ** Tok
74f0: 65 6e 73 20 6d 75 73 74 20 68 61 76 65 20 61 20  ens must have a 
7500: 6e 6f 6e 2d 7a 65 72 6f 20 6c 65 6e 67 74 68 2e  non-zero length.
7510: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
7520: 69 50 6f 73 3c 30 20 7c 7c 20 21 7a 54 6f 6b 65  iPos<0 || !zToke
7530: 6e 20 7c 7c 20 6e 54 6f 6b 65 6e 3c 3d 30 20 29  n || nToken<=0 )
7540: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
7550: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
7560: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
7570: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 65     /* Add the te
7580: 72 6d 20 74 6f 20 74 68 65 20 74 65 72 6d 73 20  rm to the terms 
7590: 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 72 63 20  index */.    rc 
75a0: 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72  = fts3PendingTer
75b0: 6d 73 41 64 64 4f 6e 65 28 0a 20 20 20 20 20 20  msAddOne(.      
75c0: 20 20 70 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c    p, iCol, iPos,
75d0: 20 26 70 2d 3e 61 49 6e 64 65 78 5b 30 5d 2e 68   &p->aIndex[0].h
75e0: 50 65 6e 64 69 6e 67 2c 20 7a 54 6f 6b 65 6e 2c  Pending, zToken,
75f0: 20 6e 54 6f 6b 65 6e 0a 20 20 20 20 29 3b 0a 20   nToken.    );. 
7600: 20 20 20 0a 20 20 20 20 2f 2a 20 41 64 64 20 74     .    /* Add t
7610: 68 65 20 74 65 72 6d 20 74 6f 20 65 61 63 68 20  he term to each 
7620: 6f 66 20 74 68 65 20 70 72 65 66 69 78 20 69 6e  of the prefix in
7630: 64 65 78 65 73 20 74 68 61 74 20 69 74 20 69 73  dexes that it is
7640: 20 6e 6f 74 20 74 6f 6f 20 0a 20 20 20 20 2a 2a   not too .    **
7650: 20 73 68 6f 72 74 20 66 6f 72 2e 20 2a 2f 0a 20   short for. */. 
7660: 20 20 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d     for(i=1; rc==
7670: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70  SQLITE_OK && i<p
7680: 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a  ->nIndex; i++){.
7690: 20 20 20 20 20 20 73 74 72 75 63 74 20 46 74 73        struct Fts
76a0: 33 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d  3Index *pIndex =
76b0: 20 26 70 2d 3e 61 49 6e 64 65 78 5b 69 5d 3b 0a   &p->aIndex[i];.
76c0: 20 20 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e        if( nToken
76d0: 3c 70 49 6e 64 65 78 2d 3e 6e 50 72 65 66 69 78  <pIndex->nPrefix
76e0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
76f0: 20 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64     rc = fts3Pend
7700: 69 6e 67 54 65 72 6d 73 41 64 64 4f 6e 65 28 0a  ingTermsAddOne(.
7710: 20 20 20 20 20 20 20 20 20 20 70 2c 20 69 43 6f            p, iCo
7720: 6c 2c 20 69 50 6f 73 2c 20 26 70 49 6e 64 65 78  l, iPos, &pIndex
7730: 2d 3e 68 50 65 6e 64 69 6e 67 2c 20 7a 54 6f 6b  ->hPending, zTok
7740: 65 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e 50 72 65  en, pIndex->nPre
7750: 66 69 78 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  fix.      );.   
7760: 20 7d 0a 20 20 7d 0a 0a 20 20 70 4d 6f 64 75 6c   }.  }..  pModul
7770: 65 2d 3e 78 43 6c 6f 73 65 28 70 43 73 72 29 3b  e->xClose(pCsr);
7780: 0a 20 20 2a 70 6e 57 6f 72 64 20 2b 3d 20 6e 57  .  *pnWord += nW
7790: 6f 72 64 3b 0a 20 20 72 65 74 75 72 6e 20 28 72  ord;.  return (r
77a0: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f  c==SQLITE_DONE ?
77b0: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29   SQLITE_OK : rc)
77c0: 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 43 61 6c 6c  ;.}../* .** Call
77d0: 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
77e0: 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  n indicates that
77f0: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
7800: 73 20 74 6f 20 0a 2a 2a 20 66 74 73 33 50 65 6e  s to .** fts3Pen
7810: 64 69 6e 67 54 65 72 6d 73 41 64 64 28 29 20 61  dingTermsAdd() a
7820: 72 65 20 74 6f 20 61 64 64 20 74 65 72 6d 2f 70  re to add term/p
7830: 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 70 61 69  osition-list pai
7840: 72 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 63 6f  rs for the.** co
7850: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 6f  ntents of the do
7860: 63 75 6d 65 6e 74 20 77 69 74 68 20 64 6f 63 69  cument with doci
7870: 64 20 69 44 6f 63 69 64 2e 0a 2a 2f 0a 73 74 61  d iDocid..*/.sta
7880: 74 69 63 20 69 6e 74 20 66 74 73 33 50 65 6e 64  tic int fts3Pend
7890: 69 6e 67 54 65 72 6d 73 44 6f 63 69 64 28 0a 20  ingTermsDocid(. 
78a0: 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 2f 2a 20 46 75 6c 6c 2d 74 65 78 74 20 74 61   /* Full-text ta
78d0: 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
78e0: 69 6e 74 20 62 44 65 6c 65 74 65 2c 20 20 20 20  int bDelete,    
78f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7900: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
7910: 6f 70 20 69 73 20 61 20 64 65 6c 65 74 65 20 2a  op is a delete *
7920: 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c  /.  int iLangid,
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7940: 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20      /* Language 
7950: 69 64 20 6f 66 20 72 6f 77 20 62 65 69 6e 67 20  id of row being 
7960: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 73 71 6c  written */.  sql
7970: 69 74 65 5f 69 6e 74 36 34 20 69 44 6f 63 69 64  ite_int64 iDocid
7980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7990: 44 6f 63 69 64 20 6f 66 20 72 6f 77 20 62 65 69  Docid of row bei
79a0: 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 29 7b  ng written */.){
79b0: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 6e 67  .  assert( iLang
79c0: 69 64 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  id>=0 );.  asser
79d0: 74 28 20 62 44 65 6c 65 74 65 3d 3d 31 20 7c 7c  t( bDelete==1 ||
79e0: 20 62 44 65 6c 65 74 65 3d 3d 30 20 29 3b 0a 0a   bDelete==0 );..
79f0: 20 20 2f 2a 20 54 4f 44 4f 28 73 68 65 73 73 29    /* TODO(shess)
7a00: 20 45 78 70 6c 6f 72 65 20 77 68 65 74 68 65 72   Explore whether
7a10: 20 70 61 72 74 69 61 6c 6c 79 20 66 6c 75 73 68   partially flush
7a20: 69 6e 67 20 74 68 65 20 62 75 66 66 65 72 20 6f  ing the buffer o
7a30: 6e 0a 20 20 2a 2a 20 66 6f 72 63 65 64 2d 66 6c  n.  ** forced-fl
7a40: 75 73 68 20 77 6f 75 6c 64 20 70 72 6f 76 69 64  ush would provid
7a50: 65 20 62 65 74 74 65 72 20 70 65 72 66 6f 72 6d  e better perform
7a60: 61 6e 63 65 2e 20 20 49 20 73 75 73 70 65 63 74  ance.  I suspect
7a70: 20 74 68 61 74 20 69 66 0a 20 20 2a 2a 20 77 65   that if.  ** we
7a80: 20 6f 72 64 65 72 65 64 20 74 68 65 20 64 6f 63   ordered the doc
7a90: 6c 69 73 74 73 20 62 79 20 73 69 7a 65 20 61 6e  lists by size an
7aa0: 64 20 66 6c 75 73 68 65 64 20 74 68 65 20 6c 61  d flushed the la
7ab0: 72 67 65 73 74 20 75 6e 74 69 6c 20 74 68 65 0a  rgest until the.
7ac0: 20 20 2a 2a 20 62 75 66 66 65 72 20 77 61 73 20    ** buffer was 
7ad0: 68 61 6c 66 20 65 6d 70 74 79 2c 20 74 68 61 74  half empty, that
7ae0: 20 77 6f 75 6c 64 20 6c 65 74 20 74 68 65 20 6c   would let the l
7af0: 65 73 73 20 66 72 65 71 75 65 6e 74 20 74 65 72  ess frequent ter
7b00: 6d 73 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 65  ms.  ** generate
7b10: 20 6c 6f 6e 67 65 72 20 64 6f 63 6c 69 73 74 73   longer doclists
7b20: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44 6f  ..  */.  if( iDo
7b30: 63 69 64 3c 70 2d 3e 69 50 72 65 76 44 6f 63 69  cid<p->iPrevDoci
7b40: 64 20 0a 20 20 20 7c 7c 20 28 69 44 6f 63 69 64  d .   || (iDocid
7b50: 3d 3d 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 20  ==p->iPrevDocid 
7b60: 26 26 20 70 2d 3e 62 50 72 65 76 44 65 6c 65 74  && p->bPrevDelet
7b70: 65 3d 3d 30 29 0a 20 20 20 7c 7c 20 70 2d 3e 69  e==0).   || p->i
7b80: 50 72 65 76 4c 61 6e 67 69 64 21 3d 69 4c 61 6e  PrevLangid!=iLan
7b90: 67 69 64 0a 20 20 20 7c 7c 20 70 2d 3e 6e 50 65  gid.   || p->nPe
7ba0: 6e 64 69 6e 67 44 61 74 61 3e 70 2d 3e 6e 4d 61  ndingData>p->nMa
7bb0: 78 50 65 6e 64 69 6e 67 44 61 74 61 20 0a 20 20  xPendingData .  
7bc0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
7bd0: 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69  sqlite3Fts3Pendi
7be0: 6e 67 54 65 72 6d 73 46 6c 75 73 68 28 70 29 3b  ngTermsFlush(p);
7bf0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
7c00: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
7c10: 72 63 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 50 72  rc;.  }.  p->iPr
7c20: 65 76 44 6f 63 69 64 20 3d 20 69 44 6f 63 69 64  evDocid = iDocid
7c30: 3b 0a 20 20 70 2d 3e 69 50 72 65 76 4c 61 6e 67  ;.  p->iPrevLang
7c40: 69 64 20 3d 20 69 4c 61 6e 67 69 64 3b 0a 20 20  id = iLangid;.  
7c50: 70 2d 3e 62 50 72 65 76 44 65 6c 65 74 65 20 3d  p->bPrevDelete =
7c60: 20 62 44 65 6c 65 74 65 3b 0a 20 20 72 65 74 75   bDelete;.  retu
7c70: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
7c80: 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 74  ./*.** Discard t
7c90: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
7ca0: 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73  he pending-terms
7cb0: 20 68 61 73 68 20 74 61 62 6c 65 73 2e 20 0a 2a   hash tables. .*
7cc0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
7cd0: 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 43 6c  s3PendingTermsCl
7ce0: 65 61 72 28 46 74 73 33 54 61 62 6c 65 20 2a 70  ear(Fts3Table *p
7cf0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
7d00: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 6e 64  r(i=0; i<p->nInd
7d10: 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74  ex; i++){.    Ft
7d20: 73 33 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65  s3HashElem *pEle
7d30: 6d 3b 0a 20 20 20 20 46 74 73 33 48 61 73 68 20  m;.    Fts3Hash 
7d40: 2a 70 48 61 73 68 20 3d 20 26 70 2d 3e 61 49 6e  *pHash = &p->aIn
7d50: 64 65 78 5b 69 5d 2e 68 50 65 6e 64 69 6e 67 3b  dex[i].hPending;
7d60: 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d 66  .    for(pElem=f
7d70: 74 73 33 48 61 73 68 46 69 72 73 74 28 70 48 61  ts3HashFirst(pHa
7d80: 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
7d90: 6d 3d 66 74 73 33 48 61 73 68 4e 65 78 74 28 70  m=fts3HashNext(p
7da0: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 50 65  Elem)){.      Pe
7db0: 6e 64 69 6e 67 4c 69 73 74 20 2a 70 4c 69 73 74  ndingList *pList
7dc0: 20 3d 20 28 50 65 6e 64 69 6e 67 4c 69 73 74 20   = (PendingList 
7dd0: 2a 29 66 74 73 33 48 61 73 68 44 61 74 61 28 70  *)fts3HashData(p
7de0: 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 66 74 73  Elem);.      fts
7df0: 33 50 65 6e 64 69 6e 67 4c 69 73 74 44 65 6c 65  3PendingListDele
7e00: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  te(pList);.    }
7e10: 0a 20 20 20 20 66 74 73 33 48 61 73 68 43 6c 65  .    fts3HashCle
7e20: 61 72 28 70 48 61 73 68 29 3b 0a 20 20 7d 0a 20  ar(pHash);.  }. 
7e30: 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61   p->nPendingData
7e40: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
7e50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
7e60: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 78 55  called by the xU
7e70: 70 64 61 74 65 28 29 20 6d 65 74 68 6f 64 20 61  pdate() method a
7e80: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 49 4e 53  s part of an INS
7e90: 45 52 54 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ERT.** operation
7ea0: 2e 20 49 74 20 61 64 64 73 20 65 6e 74 72 69 65  . It adds entrie
7eb0: 73 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20  s for each term 
7ec0: 69 6e 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  in the new recor
7ed0: 64 20 74 6f 20 74 68 65 0a 2a 2a 20 70 65 6e 64  d to the.** pend
7ee0: 69 6e 67 54 65 72 6d 73 20 68 61 73 68 20 74 61  ingTerms hash ta
7ef0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ble..**.** Argum
7f00: 65 6e 74 20 61 70 56 61 6c 20 69 73 20 74 68 65  ent apVal is the
7f10: 20 73 61 6d 65 20 61 73 20 74 68 65 20 73 69 6d   same as the sim
7f20: 69 6c 61 72 6c 79 20 6e 61 6d 65 64 20 61 72 67  ilarly named arg
7f30: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 0a  ument passed to.
7f40: 2a 2a 20 66 74 73 33 49 6e 73 65 72 74 44 61 74  ** fts3InsertDat
7f50: 61 28 29 2e 20 50 61 72 61 6d 65 74 65 72 20 69  a(). Parameter i
7f60: 44 6f 63 69 64 20 69 73 20 74 68 65 20 64 6f 63  Docid is the doc
7f70: 69 64 20 6f 66 20 74 68 65 20 6e 65 77 20 72 6f  id of the new ro
7f80: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  w..*/.static int
7f90: 20 66 74 73 33 49 6e 73 65 72 74 54 65 72 6d 73   fts3InsertTerms
7fa0: 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
7fb0: 2c 20 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64  , .  int iLangid
7fc0: 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  , .  sqlite3_val
7fd0: 75 65 20 2a 2a 61 70 56 61 6c 2c 20 0a 20 20 75  ue **apVal, .  u
7fe0: 33 32 20 2a 61 53 7a 0a 29 7b 0a 20 20 69 6e 74  32 *aSz.){.  int
7ff0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
8000: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8010: 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
8020: 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 32 3b 20  e */.  for(i=2; 
8030: 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 3b 20  i<p->nColumn+2; 
8040: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43  i++){.    int iC
8050: 6f 6c 20 3d 20 69 2d 32 3b 0a 20 20 20 20 69 66  ol = i-2;.    if
8060: 28 20 70 2d 3e 61 62 4e 6f 74 69 6e 64 65 78 65  ( p->abNotindexe
8070: 64 5b 69 43 6f 6c 5d 3d 3d 30 20 29 7b 0a 20 20  d[iCol]==0 ){.  
8080: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
8090: 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63  zText = (const c
80a0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  har *)sqlite3_va
80b0: 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 69  lue_text(apVal[i
80c0: 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  ]);.      int rc
80d0: 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65   = fts3PendingTe
80e0: 72 6d 73 41 64 64 28 70 2c 20 69 4c 61 6e 67 69  rmsAdd(p, iLangi
80f0: 64 2c 20 7a 54 65 78 74 2c 20 69 43 6f 6c 2c 20  d, zText, iCol, 
8100: 26 61 53 7a 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20  &aSz[iCol]);.   
8110: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
8120: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
8130: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
8140: 20 7d 0a 20 20 20 20 20 20 61 53 7a 5b 70 2d 3e   }.      aSz[p->
8150: 6e 43 6f 6c 75 6d 6e 5d 20 2b 3d 20 73 71 6c 69  nColumn] += sqli
8160: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
8170: 61 70 56 61 6c 5b 69 5d 29 3b 0a 20 20 20 20 7d  apVal[i]);.    }
8180: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
8190: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
81a0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
81b0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
81c0: 20 78 55 70 64 61 74 65 28 29 20 6d 65 74 68 6f   xUpdate() metho
81d0: 64 20 66 6f 72 20 61 6e 20 49 4e 53 45 52 54 20  d for an INSERT 
81e0: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68  operation..** Th
81f0: 65 20 61 70 56 61 6c 20 70 61 72 61 6d 65 74 65  e apVal paramete
8200: 72 20 69 73 20 70 61 73 73 65 64 20 61 20 63 6f  r is passed a co
8210: 70 79 20 6f 66 20 74 68 65 20 61 70 56 61 6c 20  py of the apVal 
8220: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
8230: 62 79 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20  by.** SQLite to 
8240: 74 68 65 20 78 55 70 64 61 74 65 28 29 20 6d 65  the xUpdate() me
8250: 74 68 6f 64 2e 20 69 2e 65 3a 0a 2a 2a 0a 2a 2a  thod. i.e:.**.**
8260: 20 20 20 61 70 56 61 6c 5b 30 5d 20 20 20 20 20     apVal[0]     
8270: 20 20 20 20 20 20 20 20 20 20 20 4e 6f 74 20 75             Not u
8280: 73 65 64 20 66 6f 72 20 49 4e 53 45 52 54 2e 0a  sed for INSERT..
8290: 2a 2a 20 20 20 61 70 56 61 6c 5b 31 5d 20 20 20  **   apVal[1]   
82a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 77               row
82b0: 69 64 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 32 5d  id.**   apVal[2]
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82d0: 4c 65 66 74 2d 6d 6f 73 74 20 75 73 65 72 2d 64  Left-most user-d
82e0: 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a  efined column.**
82f0: 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 61 70 56 61     ....**   apVa
8300: 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 5d 20  l[p->nColumn+1] 
8310: 20 20 20 20 52 69 67 68 74 2d 6d 6f 73 74 20 75      Right-most u
8320: 73 65 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 75  ser-defined colu
8330: 6d 6e 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 70 2d  mn.**   apVal[p-
8340: 3e 6e 43 6f 6c 75 6d 6e 2b 32 5d 20 20 20 20 20  >nColumn+2]     
8350: 48 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 20 77 69  Hidden column wi
8360: 74 68 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  th same name as 
8370: 74 61 62 6c 65 0a 2a 2a 20 20 20 61 70 56 61 6c  table.**   apVal
8380: 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 33 5d 20 20  [p->nColumn+3]  
8390: 20 20 20 48 69 64 64 65 6e 20 22 64 6f 63 69 64     Hidden "docid
83a0: 22 20 63 6f 6c 75 6d 6e 20 28 61 6c 69 61 73 20  " column (alias 
83b0: 66 6f 72 20 72 6f 77 69 64 29 0a 2a 2a 20 20 20  for rowid).**   
83c0: 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e  apVal[p->nColumn
83d0: 2b 34 5d 20 20 20 20 20 48 69 64 64 65 6e 20 6c  +4]     Hidden l
83e0: 61 6e 67 75 61 67 65 69 64 20 63 6f 6c 75 6d 6e  anguageid column
83f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
8400: 74 73 33 49 6e 73 65 72 74 44 61 74 61 28 0a 20  ts3InsertData(. 
8410: 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
8420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8430: 20 2f 2a 20 46 75 6c 6c 2d 74 65 78 74 20 74 61   /* Full-text ta
8440: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
8450: 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20  _value **apVal, 
8460: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
8470: 79 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 69  y of values to i
8480: 6e 73 65 72 74 20 2a 2f 0a 20 20 73 71 6c 69 74  nsert */.  sqlit
8490: 65 33 5f 69 6e 74 36 34 20 2a 70 69 44 6f 63 69  e3_int64 *piDoci
84a0: 64 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  d          /* OU
84b0: 54 3a 20 44 6f 63 69 64 20 66 6f 72 20 72 6f 77  T: Docid for row
84c0: 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64 20 2a   just inserted *
84d0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
84e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84f0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
8500: 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
8510: 65 33 5f 73 74 6d 74 20 2a 70 43 6f 6e 74 65 6e  e3_stmt *pConten
8520: 74 49 6e 73 65 72 74 3b 20 20 20 2f 2a 20 49 4e  tInsert;   /* IN
8530: 53 45 52 54 20 49 4e 54 4f 20 25 5f 63 6f 6e 74  SERT INTO %_cont
8540: 65 6e 74 20 56 41 4c 55 45 53 28 2e 2e 2e 29 20  ent VALUES(...) 
8550: 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 7a 43 6f  */..  if( p->zCo
8560: 6e 74 65 6e 74 54 62 6c 20 29 7b 0a 20 20 20 20  ntentTbl ){.    
8570: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
8580: 52 6f 77 69 64 20 3d 20 61 70 56 61 6c 5b 70 2d  Rowid = apVal[p-
8590: 3e 6e 43 6f 6c 75 6d 6e 2b 33 5d 3b 0a 20 20 20  >nColumn+3];.   
85a0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
85b0: 75 65 5f 74 79 70 65 28 70 52 6f 77 69 64 29 3d  ue_type(pRowid)=
85c0: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a  =SQLITE_NULL ){.
85d0: 20 20 20 20 20 20 70 52 6f 77 69 64 20 3d 20 61        pRowid = a
85e0: 70 56 61 6c 5b 31 5d 3b 0a 20 20 20 20 7d 0a 20  pVal[1];.    }. 
85f0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76     if( sqlite3_v
8600: 61 6c 75 65 5f 74 79 70 65 28 70 52 6f 77 69 64  alue_type(pRowid
8610: 29 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  )!=SQLITE_INTEGE
8620: 52 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  R ){.      retur
8630: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
8640: 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  INT;.    }.    *
8650: 70 69 44 6f 63 69 64 20 3d 20 73 71 6c 69 74 65  piDocid = sqlite
8660: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 70 52  3_value_int64(pR
8670: 6f 77 69 64 29 3b 0a 20 20 20 20 72 65 74 75 72  owid);.    retur
8680: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
8690: 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
86a0: 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  e statement hand
86b0: 6c 65 20 75 73 65 64 20 74 6f 20 69 6e 73 65 72  le used to inser
86c0: 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20  t data into the 
86d0: 25 5f 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 74  %_content.  ** t
86e0: 61 62 6c 65 2e 20 54 68 65 20 53 51 4c 20 66 6f  able. The SQL fo
86f0: 72 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  r this statement
8700: 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   is:.  **.  **  
8710: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 5f 63   INSERT INTO %_c
8720: 6f 6e 74 65 6e 74 20 56 41 4c 55 45 53 28 3f 2c  ontent VALUES(?,
8730: 20 3f 2c 20 3f 2c 20 2e 2e 2e 29 0a 20 20 2a 2a   ?, ?, ...).  **
8740: 0a 20 20 2a 2a 20 54 68 65 20 73 74 61 74 65 6d  .  ** The statem
8750: 65 6e 74 20 66 65 61 74 75 72 65 73 20 4e 20 27  ent features N '
8760: 3f 27 20 76 61 72 69 61 62 6c 65 73 2c 20 77 68  ?' variables, wh
8770: 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ere N is the num
8780: 62 65 72 20 6f 66 20 75 73 65 72 0a 20 20 2a 2a  ber of user.  **
8790: 20 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73   defined columns
87a0: 20 69 6e 20 74 68 65 20 46 54 53 33 20 74 61 62   in the FTS3 tab
87b0: 6c 65 2c 20 70 6c 75 73 20 6f 6e 65 20 66 6f 72  le, plus one for
87c0: 20 74 68 65 20 64 6f 63 69 64 20 66 69 65 6c 64   the docid field
87d0: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74  ..  */.  rc = ft
87e0: 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
87f0: 5f 43 4f 4e 54 45 4e 54 5f 49 4e 53 45 52 54 2c  _CONTENT_INSERT,
8800: 20 26 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74   &pContentInsert
8810: 2c 20 26 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20  , &apVal[1]);.  
8820: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
8830: 4b 20 26 26 20 70 2d 3e 7a 4c 61 6e 67 75 61 67  K && p->zLanguag
8840: 65 69 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  eid ){.    rc = 
8850: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
8860: 28 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 74 65  (.        pConte
8870: 6e 74 49 6e 73 65 72 74 2c 20 70 2d 3e 6e 43 6f  ntInsert, p->nCo
8880: 6c 75 6d 6e 2b 32 2c 20 0a 20 20 20 20 20 20 20  lumn+2, .       
8890: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
88a0: 6e 74 28 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c  nt(apVal[p->nCol
88b0: 75 6d 6e 2b 34 5d 29 0a 20 20 20 20 29 3b 0a 20  umn+4]).    );. 
88c0: 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
88d0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
88e0: 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20  rc;..  /* There 
88f0: 69 73 20 61 20 71 75 69 72 6b 20 68 65 72 65 2e  is a quirk here.
8900: 20 54 68 65 20 75 73 65 72 73 20 49 4e 53 45 52   The users INSER
8910: 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20  T statement may 
8920: 68 61 76 65 20 73 70 65 63 69 66 69 65 64 0a 20  have specified. 
8930: 20 2a 2a 20 61 20 76 61 6c 75 65 20 66 6f 72 20   ** a value for 
8940: 74 68 65 20 22 72 6f 77 69 64 22 20 66 69 65 6c  the "rowid" fiel
8950: 64 2c 20 66 6f 72 20 74 68 65 20 22 64 6f 63 69  d, for the "doci
8960: 64 22 20 66 69 65 6c 64 2c 20 6f 72 20 66 6f 72  d" field, or for
8970: 20 62 6f 74 68 2e 0a 20 20 2a 2a 20 57 68 69 63   both..  ** Whic
8980: 68 20 69 73 20 61 20 70 72 6f 62 6c 65 6d 2c 20  h is a problem, 
8990: 73 69 6e 63 65 20 22 72 6f 77 69 64 22 20 61 6e  since "rowid" an
89a0: 64 20 22 64 6f 63 69 64 22 20 61 72 65 20 61 6c  d "docid" are al
89b0: 69 61 73 65 73 20 66 6f 72 20 74 68 65 0a 20 20  iases for the.  
89c0: 2a 2a 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 46  ** same value. F
89d0: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  or example:.  **
89e0: 0a 20 20 2a 2a 20 20 20 49 4e 53 45 52 54 20 49  .  **   INSERT I
89f0: 4e 54 4f 20 66 74 73 33 74 62 6c 28 72 6f 77 69  NTO fts3tbl(rowi
8a00: 64 2c 20 64 6f 63 69 64 29 20 56 41 4c 55 45 53  d, docid) VALUES
8a10: 28 31 2c 20 32 29 3b 0a 20 20 2a 2a 0a 20 20 2a  (1, 2);.  **.  *
8a20: 2a 20 49 6e 20 46 54 53 33 2c 20 74 68 69 73 20  * In FTS3, this 
8a30: 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 49 74 20  is an error. It 
8a40: 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 73  is an error to s
8a50: 70 65 63 69 66 79 20 6e 6f 6e 2d 4e 55 4c 4c 20  pecify non-NULL 
8a60: 76 61 6c 75 65 73 0a 20 20 2a 2a 20 66 6f 72 20  values.  ** for 
8a70: 62 6f 74 68 20 64 6f 63 69 64 20 61 6e 64 20 73  both docid and s
8a80: 6f 6d 65 20 6f 74 68 65 72 20 72 6f 77 69 64 20  ome other rowid 
8a90: 61 6c 69 61 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  alias..  */.  if
8aa0: 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73  ( SQLITE_NULL!=s
8ab0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
8ac0: 65 28 61 70 56 61 6c 5b 33 2b 70 2d 3e 6e 43 6f  e(apVal[3+p->nCo
8ad0: 6c 75 6d 6e 5d 29 20 29 7b 0a 20 20 20 20 69 66  lumn]) ){.    if
8ae0: 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73  ( SQLITE_NULL==s
8af0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
8b00: 65 28 61 70 56 61 6c 5b 30 5d 29 0a 20 20 20 20  e(apVal[0]).    
8b10: 20 26 26 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21   && SQLITE_NULL!
8b20: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  =sqlite3_value_t
8b30: 79 70 65 28 61 70 56 61 6c 5b 31 5d 29 0a 20 20  ype(apVal[1]).  
8b40: 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20    ){.      /* A 
8b50: 72 6f 77 69 64 2f 64 6f 63 69 64 20 63 6f 6e 66  rowid/docid conf
8b60: 6c 69 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72  lict. */.      r
8b70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
8b80: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  OR;.    }.    rc
8b90: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
8ba0: 76 61 6c 75 65 28 70 43 6f 6e 74 65 6e 74 49 6e  value(pContentIn
8bb0: 73 65 72 74 2c 20 31 2c 20 61 70 56 61 6c 5b 33  sert, 1, apVal[3
8bc0: 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 29 3b 0a 20  +p->nColumn]);. 
8bd0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
8be0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
8bf0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 65 63  ;.  }..  /* Exec
8c00: 75 74 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ute the statemen
8c10: 74 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20  t to insert the 
8c20: 72 65 63 6f 72 64 2e 20 53 65 74 20 2a 70 69 44  record. Set *piD
8c30: 6f 63 69 64 20 74 6f 20 74 68 65 20 0a 20 20 2a  ocid to the .  *
8c40: 2a 20 6e 65 77 20 64 6f 63 69 64 20 76 61 6c 75  * new docid valu
8c50: 65 2e 20 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  e. .  */.  sqlit
8c60: 65 33 5f 73 74 65 70 28 70 43 6f 6e 74 65 6e 74  e3_step(pContent
8c70: 49 6e 73 65 72 74 29 3b 0a 20 20 72 63 20 3d 20  Insert);.  rc = 
8c80: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 43  sqlite3_reset(pC
8c90: 6f 6e 74 65 6e 74 49 6e 73 65 72 74 29 3b 0a 0a  ontentInsert);..
8ca0: 20 20 2a 70 69 44 6f 63 69 64 20 3d 20 73 71 6c    *piDocid = sql
8cb0: 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
8cc0: 5f 72 6f 77 69 64 28 70 2d 3e 64 62 29 3b 0a 20  _rowid(p->db);. 
8cd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
8ce0: 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c  ./*.** Remove al
8cf0: 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  l data from the 
8d00: 46 54 53 33 20 74 61 62 6c 65 2e 20 43 6c 65 61  FTS3 table. Clea
8d10: 72 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  r the hash table
8d20: 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 70   containing.** p
8d30: 65 6e 64 69 6e 67 20 74 65 72 6d 73 2e 0a 2a 2f  ending terms..*/
8d40: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
8d50: 44 65 6c 65 74 65 41 6c 6c 28 46 74 73 33 54 61  DeleteAll(Fts3Ta
8d60: 62 6c 65 20 2a 70 2c 20 69 6e 74 20 62 43 6f 6e  ble *p, int bCon
8d70: 74 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  tent){.  int rc 
8d80: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
8d90: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
8da0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
8db0: 20 44 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e   Discard the con
8dc0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 65 6e  tents of the pen
8dd0: 64 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20  ding-terms hash 
8de0: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69  table. */.  sqli
8df0: 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65  te3Fts3PendingTe
8e00: 72 6d 73 43 6c 65 61 72 28 70 29 3b 0a 0a 20 20  rmsClear(p);..  
8e10: 2f 2a 20 44 65 6c 65 74 65 20 65 76 65 72 79 74  /* Delete everyt
8e20: 68 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 73 68  hing from the sh
8e30: 61 64 6f 77 20 74 61 62 6c 65 73 2e 20 45 78 63  adow tables. Exc
8e40: 65 70 74 2c 20 6c 65 61 76 65 20 25 5f 63 6f 6e  ept, leave %_con
8e50: 74 65 6e 74 20 61 73 0a 20 20 2a 2a 20 69 73 20  tent as.  ** is 
8e60: 69 66 20 62 43 6f 6e 74 65 6e 74 20 69 73 20 66  if bContent is f
8e70: 61 6c 73 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65  alse.  */.  asse
8e80: 72 74 28 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54  rt( p->zContentT
8e90: 62 6c 3d 3d 30 20 7c 7c 20 62 43 6f 6e 74 65 6e  bl==0 || bConten
8ea0: 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 62 43  t==0 );.  if( bC
8eb0: 6f 6e 74 65 6e 74 20 29 20 66 74 73 33 53 71 6c  ontent ) fts3Sql
8ec0: 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53 51 4c  Exec(&rc, p, SQL
8ed0: 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 43 4f 4e 54  _DELETE_ALL_CONT
8ee0: 45 4e 54 2c 20 30 29 3b 0a 20 20 66 74 73 33 53  ENT, 0);.  fts3S
8ef0: 71 6c 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53  qlExec(&rc, p, S
8f00: 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 53 45  QL_DELETE_ALL_SE
8f10: 47 4d 45 4e 54 53 2c 20 30 29 3b 0a 20 20 66 74  GMENTS, 0);.  ft
8f20: 73 33 53 71 6c 45 78 65 63 28 26 72 63 2c 20 70  s3SqlExec(&rc, p
8f30: 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c  , SQL_DELETE_ALL
8f40: 5f 53 45 47 44 49 52 2c 20 30 29 3b 0a 20 20 69  _SEGDIR, 0);.  i
8f50: 66 28 20 70 2d 3e 62 48 61 73 44 6f 63 73 69 7a  f( p->bHasDocsiz
8f60: 65 20 29 7b 0a 20 20 20 20 66 74 73 33 53 71 6c  e ){.    fts3Sql
8f70: 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53 51 4c  Exec(&rc, p, SQL
8f80: 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 44 4f 43 53  _DELETE_ALL_DOCS
8f90: 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  IZE, 0);.  }.  i
8fa0: 66 28 20 70 2d 3e 62 48 61 73 53 74 61 74 20 29  f( p->bHasStat )
8fb0: 7b 0a 20 20 20 20 66 74 73 33 53 71 6c 45 78 65  {.    fts3SqlExe
8fc0: 63 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45  c(&rc, p, SQL_DE
8fd0: 4c 45 54 45 5f 41 4c 4c 5f 53 54 41 54 2c 20 30  LETE_ALL_STAT, 0
8fe0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
8ff0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a  rc;.}../*.**.*/.
9000: 73 74 61 74 69 63 20 69 6e 74 20 6c 61 6e 67 69  static int langi
9010: 64 46 72 6f 6d 53 65 6c 65 63 74 28 46 74 73 33  dFromSelect(Fts3
9020: 54 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69 74 65  Table *p, sqlite
9030: 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 29  3_stmt *pSelect)
9040: 7b 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 20  {.  int iLangid 
9050: 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 4c  = 0;.  if( p->zL
9060: 61 6e 67 75 61 67 65 69 64 20 29 20 69 4c 61 6e  anguageid ) iLan
9070: 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  gid = sqlite3_co
9080: 6c 75 6d 6e 5f 69 6e 74 28 70 53 65 6c 65 63 74  lumn_int(pSelect
9090: 2c 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 3b  , p->nColumn+1);
90a0: 0a 20 20 72 65 74 75 72 6e 20 69 4c 61 6e 67 69  .  return iLangi
90b0: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  d;.}../*.** The 
90c0: 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 69 6e  first element in
90d0: 20 74 68 65 20 61 70 56 61 6c 5b 5d 20 61 72 72   the apVal[] arr
90e0: 61 79 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  ay is assumed to
90f0: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 64 6f 63   contain the doc
9100: 69 64 0a 2a 2a 20 28 61 6e 20 69 6e 74 65 67 65  id.** (an intege
9110: 72 29 20 6f 66 20 61 20 72 6f 77 20 61 62 6f 75  r) of a row abou
9120: 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e  t to be deleted.
9130: 20 52 65 6d 6f 76 65 20 61 6c 6c 20 74 65 72 6d   Remove all term
9140: 73 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 75  s from the.** fu
9150: 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e 0a 2a  ll-text index..*
9160: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
9170: 73 33 44 65 6c 65 74 65 54 65 72 6d 73 28 20 0a  s3DeleteTerms( .
9180: 20 20 69 6e 74 20 2a 70 52 43 2c 20 20 20 20 20    int *pRC,     
9190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
91a0: 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  ult code */.  Ft
91b0: 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
91c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 54 53        /* The FTS
91d0: 20 74 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65   table to delete
91e0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 73 71 6c 69 74   from */.  sqlit
91f0: 65 33 5f 76 61 6c 75 65 20 2a 70 52 6f 77 69 64  e3_value *pRowid
9200: 2c 20 20 2f 2a 20 54 68 65 20 64 6f 63 69 64 20  ,  /* The docid 
9210: 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f  to be deleted */
9220: 0a 20 20 75 33 32 20 2a 61 53 7a 2c 20 20 20 20  .  u32 *aSz,    
9230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
9240: 7a 65 73 20 6f 66 20 64 65 6c 65 74 65 64 20 64  zes of deleted d
9250: 6f 63 75 6d 65 6e 74 20 77 72 69 74 74 65 6e 20  ocument written 
9260: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  here */.  int *p
9270: 62 46 6f 75 6e 64 20 20 20 20 20 20 20 20 20 20  bFound          
9280: 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f    /* OUT: Set to
9290: 20 74 72 75 65 20 69 66 20 72 6f 77 20 72 65 61   true if row rea
92a0: 6c 6c 79 20 64 6f 65 73 20 65 78 69 73 74 20 2a  lly does exist *
92b0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
92c0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
92d0: 53 65 6c 65 63 74 3b 0a 0a 20 20 61 73 73 65 72  Select;..  asser
92e0: 74 28 20 2a 70 62 46 6f 75 6e 64 3d 3d 30 20 29  t( *pbFound==0 )
92f0: 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ;.  if( *pRC ) r
9300: 65 74 75 72 6e 3b 0a 20 20 72 63 20 3d 20 66 74  eturn;.  rc = ft
9310: 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
9320: 5f 53 45 4c 45 43 54 5f 43 4f 4e 54 45 4e 54 5f  _SELECT_CONTENT_
9330: 42 59 5f 52 4f 57 49 44 2c 20 26 70 53 65 6c 65  BY_ROWID, &pSele
9340: 63 74 2c 20 26 70 52 6f 77 69 64 29 3b 0a 20 20  ct, &pRowid);.  
9350: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
9360: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c  K ){.    if( SQL
9370: 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
9380: 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29 20 29  _step(pSelect) )
9390: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
93a0: 20 20 20 20 20 69 6e 74 20 69 4c 61 6e 67 69 64       int iLangid
93b0: 20 3d 20 6c 61 6e 67 69 64 46 72 6f 6d 53 65 6c   = langidFromSel
93c0: 65 63 74 28 70 2c 20 70 53 65 6c 65 63 74 29 3b  ect(p, pSelect);
93d0: 0a 20 20 20 20 20 20 69 36 34 20 69 44 6f 63 69  .      i64 iDoci
93e0: 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
93f0: 6d 6e 5f 69 6e 74 36 34 28 70 53 65 6c 65 63 74  mn_int64(pSelect
9400: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , 0);.      rc =
9410: 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d   fts3PendingTerm
9420: 73 44 6f 63 69 64 28 70 2c 20 31 2c 20 69 4c 61  sDocid(p, 1, iLa
9430: 6e 67 69 64 2c 20 69 44 6f 63 69 64 29 3b 0a 20  ngid, iDocid);. 
9440: 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 72 63       for(i=1; rc
9450: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
9460: 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  <=p->nColumn; i+
9470: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
9480: 69 43 6f 6c 20 3d 20 69 2d 31 3b 0a 20 20 20 20  iCol = i-1;.    
9490: 20 20 20 20 69 66 28 20 70 2d 3e 61 62 4e 6f 74      if( p->abNot
94a0: 69 6e 64 65 78 65 64 5b 69 43 6f 6c 5d 3d 3d 30  indexed[iCol]==0
94b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
94c0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 20  nst char *zText 
94d0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
94e0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
94f0: 65 78 74 28 70 53 65 6c 65 63 74 2c 20 69 29 3b  ext(pSelect, i);
9500: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
9510: 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73  fts3PendingTerms
9520: 41 64 64 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20  Add(p, iLangid, 
9530: 7a 54 65 78 74 2c 20 2d 31 2c 20 26 61 53 7a 5b  zText, -1, &aSz[
9540: 69 43 6f 6c 5d 29 3b 0a 20 20 20 20 20 20 20 20  iCol]);.        
9550: 20 20 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e    aSz[p->nColumn
9560: 5d 20 2b 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ] += sqlite3_col
9570: 75 6d 6e 5f 62 79 74 65 73 28 70 53 65 6c 65 63  umn_bytes(pSelec
9580: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  t, i);.        }
9590: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
95a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
95b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
95c0: 74 65 33 5f 72 65 73 65 74 28 70 53 65 6c 65 63  te3_reset(pSelec
95d0: 74 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 43  t);.        *pRC
95e0: 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72   = rc;.        r
95f0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
9600: 20 20 20 20 20 2a 70 62 46 6f 75 6e 64 20 3d 20       *pbFound = 
9610: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  1;.    }.    rc 
9620: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
9630: 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 65 6c 73  pSelect);.  }els
9640: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  e{.    sqlite3_r
9650: 65 73 65 74 28 70 53 65 6c 65 63 74 29 3b 0a 20  eset(pSelect);. 
9660: 20 7d 0a 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a   }.  *pRC = rc;.
9670: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64  }../*.** Forward
9680: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 6f 20   declaration to 
9690: 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20  account for the 
96a0: 63 69 72 63 75 6c 61 72 20 64 65 70 65 6e 64 65  circular depende
96b0: 6e 63 79 20 62 65 74 77 65 65 6e 0a 2a 2a 20 66  ncy between.** f
96c0: 75 6e 63 74 69 6f 6e 73 20 66 74 73 33 53 65 67  unctions fts3Seg
96d0: 6d 65 6e 74 4d 65 72 67 65 28 29 20 61 6e 64 20  mentMerge() and 
96e0: 66 74 73 33 41 6c 6c 6f 63 61 74 65 53 65 67 64  fts3AllocateSegd
96f0: 69 72 49 64 78 28 29 2e 0a 2a 2f 0a 73 74 61 74  irIdx()..*/.stat
9700: 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 6d 65  ic int fts3Segme
9710: 6e 74 4d 65 72 67 65 28 46 74 73 33 54 61 62 6c  ntMerge(Fts3Tabl
9720: 65 20 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69  e *, int, int, i
9730: 6e 74 29 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  nt);../* .** Thi
9740: 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  s function alloc
9750: 61 74 65 73 20 61 20 6e 65 77 20 6c 65 76 65 6c  ates a new level
9760: 20 69 4c 65 76 65 6c 20 69 6e 64 65 78 20 69 6e   iLevel index in
9770: 20 74 68 65 20 73 65 67 64 69 72 20 74 61 62 6c   the segdir tabl
9780: 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 69  e..** Usually, i
9790: 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6c 6f 63  ndexes are alloc
97a0: 61 74 65 64 20 77 69 74 68 69 6e 20 61 20 6c 65  ated within a le
97b0: 76 65 6c 20 73 65 71 75 65 6e 74 69 61 6c 6c 79  vel sequentially
97c0: 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 77 69 74   starting.** wit
97d0: 68 20 30 2c 20 73 6f 20 74 68 65 20 61 6c 6c 6f  h 0, so the allo
97e0: 63 61 74 65 64 20 69 6e 64 65 78 20 69 73 20 6f  cated index is o
97f0: 6e 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ne greater than 
9800: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
9810: 65 64 0a 2a 2a 20 62 79 3a 0a 2a 2a 0a 2a 2a 20  ed.** by:.**.** 
9820: 20 20 53 45 4c 45 43 54 20 6d 61 78 28 69 64 78    SELECT max(idx
9830: 29 20 46 52 4f 4d 20 25 5f 73 65 67 64 69 72 20  ) FROM %_segdir 
9840: 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3a 69  WHERE level = :i
9850: 4c 65 76 65 6c 0a 2a 2a 0a 2a 2a 20 48 6f 77 65  Level.**.** Howe
9860: 76 65 72 2c 20 69 66 20 74 68 65 72 65 20 61 72  ver, if there ar
9870: 65 20 61 6c 72 65 61 64 79 20 46 54 53 33 5f 4d  e already FTS3_M
9880: 45 52 47 45 5f 43 4f 55 4e 54 20 69 6e 64 65 78  ERGE_COUNT index
9890: 65 73 20 61 74 20 74 68 65 20 72 65 71 75 65 73  es at the reques
98a0: 74 65 64 0a 2a 2a 20 6c 65 76 65 6c 2c 20 74 68  ted.** level, th
98b0: 65 79 20 61 72 65 20 6d 65 72 67 65 64 20 69 6e  ey are merged in
98c0: 74 6f 20 61 20 73 69 6e 67 6c 65 20 6c 65 76 65  to a single leve
98d0: 6c 20 28 69 4c 65 76 65 6c 2b 31 29 20 73 65 67  l (iLevel+1) seg
98e0: 6d 65 6e 74 20 61 6e 64 20 74 68 65 20 0a 2a 2a  ment and the .**
98f0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78   allocated index
9900: 20 69 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   is 0..**.** If 
9910: 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 69 49  successful, *piI
9920: 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  dx is set to the
9930: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78   allocated index
9940: 20 73 6c 6f 74 20 61 6e 64 20 53 51 4c 49 54 45   slot and SQLITE
9950: 5f 4f 4b 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  _OK.** returned.
9960: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53   Otherwise, an S
9970: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
9980: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
9990: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
99a0: 41 6c 6c 6f 63 61 74 65 53 65 67 64 69 72 49 64  AllocateSegdirId
99b0: 78 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  x(.  Fts3Table *
99c0: 70 2c 20 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69  p, .  int iLangi
99d0: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
99e0: 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67        /* Languag
99f0: 65 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49  e id */.  int iI
9a00: 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
9a10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
9a20: 65 78 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65 78  ex for p->aIndex
9a30: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c   */.  int iLevel
9a40: 2c 20 0a 20 20 69 6e 74 20 2a 70 69 49 64 78 0a  , .  int *piIdx.
9a50: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a70: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
9a80: 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
9a90: 5f 73 74 6d 74 20 2a 70 4e 65 78 74 49 64 78 3b  _stmt *pNextIdx;
9aa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72           /* Quer
9ab0: 79 20 66 6f 72 20 6e 65 78 74 20 69 64 78 20 61  y for next idx a
9ac0: 74 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 2a  t level iLevel *
9ad0: 2f 0a 20 20 69 6e 74 20 69 4e 65 78 74 20 3d 20  /.  int iNext = 
9ae0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
9af0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
9b00: 20 71 75 65 72 79 20 70 4e 65 78 74 49 64 78 20   query pNextIdx 
9b10: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c  */..  assert( iL
9b20: 61 6e 67 69 64 3e 3d 30 20 29 3b 0a 20 20 61 73  angid>=0 );.  as
9b30: 73 65 72 74 28 20 70 2d 3e 6e 49 6e 64 65 78 3e  sert( p->nIndex>
9b40: 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  =1 );..  /* Set 
9b50: 76 61 72 69 61 62 6c 65 20 69 4e 65 78 74 20 74  variable iNext t
9b60: 6f 20 74 68 65 20 6e 65 78 74 20 61 76 61 69 6c  o the next avail
9b70: 61 62 6c 65 20 73 65 67 64 69 72 20 69 6e 64 65  able segdir inde
9b80: 78 20 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65  x at level iLeve
9b90: 6c 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73  l. */.  rc = fts
9ba0: 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
9bb0: 4e 45 58 54 5f 53 45 47 4d 45 4e 54 5f 49 4e 44  NEXT_SEGMENT_IND
9bc0: 45 58 2c 20 26 70 4e 65 78 74 49 64 78 2c 20 30  EX, &pNextIdx, 0
9bd0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
9be0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
9bf0: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
9c00: 28 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74 49  (.        pNextI
9c10: 64 78 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c 75  dx, 1, getAbsolu
9c20: 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67  teLevel(p, iLang
9c30: 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65 76  id, iIndex, iLev
9c40: 65 6c 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  el).    );.    i
9c50: 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
9c60: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 4e 65 78  qlite3_step(pNex
9c70: 74 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 69  tIdx) ){.      i
9c80: 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 5f 63  Next = sqlite3_c
9c90: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 4e 65 78 74 49  olumn_int(pNextI
9ca0: 64 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  dx, 0);.    }.  
9cb0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
9cc0: 65 73 65 74 28 70 4e 65 78 74 49 64 78 29 3b 0a  eset(pNextIdx);.
9cd0: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
9ce0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9cf0: 2f 2a 20 49 66 20 69 4e 65 78 74 20 69 73 20 46  /* If iNext is F
9d00: 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 2c  TS3_MERGE_COUNT,
9d10: 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
9d20: 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 69 73   level iLevel is
9d30: 20 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a 20   already.    ** 
9d40: 66 75 6c 6c 2c 20 6d 65 72 67 65 20 61 6c 6c 20  full, merge all 
9d50: 73 65 67 6d 65 6e 74 73 20 69 6e 20 6c 65 76 65  segments in leve
9d60: 6c 20 69 4c 65 76 65 6c 20 69 6e 74 6f 20 61 20  l iLevel into a 
9d70: 73 69 6e 67 6c 65 20 69 4c 65 76 65 6c 2b 31 0a  single iLevel+1.
9d80: 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 61      ** segment a
9d90: 6e 64 20 61 6c 6c 6f 63 61 74 65 20 28 6e 65 77  nd allocate (new
9da0: 6c 79 20 66 72 65 65 64 29 20 69 6e 64 65 78 20  ly freed) index 
9db0: 30 20 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65  0 at level iLeve
9dc0: 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  l. Otherwise,.  
9dd0: 20 20 2a 2a 20 69 66 20 69 4e 65 78 74 20 69 73    ** if iNext is
9de0: 20 6c 65 73 73 20 74 68 61 6e 20 46 54 53 33 5f   less than FTS3_
9df0: 4d 45 52 47 45 5f 43 4f 55 4e 54 2c 20 61 6c 6c  MERGE_COUNT, all
9e00: 6f 63 61 74 65 20 69 6e 64 65 78 20 69 4e 65 78  ocate index iNex
9e10: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
9e20: 28 20 69 4e 65 78 74 3e 3d 46 54 53 33 5f 4d 45  ( iNext>=FTS3_ME
9e30: 52 47 45 5f 43 4f 55 4e 54 20 29 7b 0a 20 20 20  RGE_COUNT ){.   
9e40: 20 20 20 66 74 73 33 4c 6f 67 4d 65 72 67 65 28     fts3LogMerge(
9e50: 31 36 2c 20 67 65 74 41 62 73 6f 6c 75 74 65 4c  16, getAbsoluteL
9e60: 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c  evel(p, iLangid,
9e70: 20 69 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 29   iIndex, iLevel)
9e80: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  );.      rc = ft
9e90: 73 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 70  s3SegmentMerge(p
9ea0: 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
9eb0: 78 2c 20 69 4c 65 76 65 6c 29 3b 0a 20 20 20 20  x, iLevel);.    
9ec0: 20 20 2a 70 69 49 64 78 20 3d 20 30 3b 0a 20 20    *piIdx = 0;.  
9ed0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
9ee0: 70 69 49 64 78 20 3d 20 69 4e 65 78 74 3b 0a 20  piIdx = iNext;. 
9ef0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
9f00: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
9f10: 54 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74  The %_segments t
9f20: 61 62 6c 65 20 69 73 20 64 65 63 6c 61 72 65 64  able is declared
9f30: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
9f40: 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
9f50: 45 20 25 5f 73 65 67 6d 65 6e 74 73 28 62 6c 6f  E %_segments(blo
9f60: 63 6b 69 64 20 49 4e 54 45 47 45 52 20 50 52 49  ckid INTEGER PRI
9f70: 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20  MARY KEY, block 
9f80: 42 4c 4f 42 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73  BLOB).**.** This
9f90: 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20   function reads 
9fa0: 64 61 74 61 20 66 72 6f 6d 20 61 20 73 69 6e 67  data from a sing
9fb0: 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 25 5f  le row of the %_
9fc0: 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 2e 20  segments table. 
9fd0: 54 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  The.** specific 
9fe0: 72 6f 77 20 69 73 20 69 64 65 6e 74 69 66 69 65  row is identifie
9ff0: 64 20 62 79 20 74 68 65 20 69 42 6c 6f 63 6b 69  d by the iBlocki
a000: 64 20 70 61 72 61 6d 65 74 65 72 2e 20 49 66 20  d parameter. If 
a010: 70 61 42 6c 6f 62 20 69 73 20 6e 6f 74 0a 2a 2a  paBlob is not.**
a020: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 61 20 62 75   NULL, then a bu
a030: 66 66 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  ffer is allocate
a040: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  d using sqlite3_
a050: 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 70  malloc() and pop
a060: 75 6c 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ulated.** with t
a070: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
a080: 68 65 20 62 6c 6f 62 20 73 74 6f 72 65 64 20 69  he blob stored i
a090: 6e 20 74 68 65 20 22 62 6c 6f 63 6b 22 20 63 6f  n the "block" co
a0a0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20  lumn of the .** 
a0b0: 69 64 65 6e 74 69 66 69 65 64 20 74 61 62 6c 65  identified table
a0c0: 20 72 6f 77 20 69 73 2e 20 57 68 65 74 68 65 72   row is. Whether
a0d0: 20 6f 72 20 6e 6f 74 20 70 61 42 6c 6f 62 20 69   or not paBlob i
a0e0: 73 20 4e 55 4c 4c 2c 20 2a 70 6e 42 6c 6f 62 20  s NULL, *pnBlob 
a0f0: 69 73 20 73 65 74 0a 2a 2a 20 74 6f 20 74 68 65  is set.** to the
a100: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f   size of the blo
a110: 62 20 69 6e 20 62 79 74 65 73 20 62 65 66 6f 72  b in bytes befor
a120: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
a130: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
a140: 63 63 75 72 73 2c 20 6f 72 20 74 68 65 20 74 61  ccurs, or the ta
a150: 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ble does not con
a160: 74 61 69 6e 20 74 68 65 20 73 70 65 63 69 66 69  tain the specifi
a170: 65 64 20 72 6f 77 2c 0a 2a 2a 20 61 6e 20 53 51  ed row,.** an SQ
a180: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
a190: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
a1a0: 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
a1b0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
a1c0: 66 0a 2a 2a 20 70 61 42 6c 6f 62 20 69 73 20 6e  f.** paBlob is n
a1d0: 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  on-NULL, then it
a1e0: 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
a1f0: 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
a200: 6c 6c 65 72 20 74 6f 0a 2a 2a 20 65 76 65 6e 74  ller to.** event
a210: 75 61 6c 6c 79 20 66 72 65 65 20 74 68 65 20 72  ually free the r
a220: 65 74 75 72 6e 65 64 20 62 75 66 66 65 72 2e 0a  eturned buffer..
a230: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
a240: 69 6f 6e 20 6d 61 79 20 6c 65 61 76 65 20 61 6e  ion may leave an
a250: 20 6f 70 65 6e 20 73 71 6c 69 74 65 33 5f 62 6c   open sqlite3_bl
a260: 6f 62 2a 20 68 61 6e 64 6c 65 20 69 6e 20 74 68  ob* handle in th
a270: 65 0a 2a 2a 20 46 74 73 33 54 61 62 6c 65 2e 70  e.** Fts3Table.p
a280: 53 65 67 6d 65 6e 74 73 20 76 61 72 69 61 62 6c  Segments variabl
a290: 65 2e 20 54 68 69 73 20 68 61 6e 64 6c 65 20 69  e. This handle i
a2a0: 73 20 72 65 75 73 65 64 20 62 79 20 73 75 62 73  s reused by subs
a2b0: 65 71 75 65 6e 74 20 63 61 6c 6c 73 0a 2a 2a 20  equent calls.** 
a2c0: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
a2d0: 2e 20 54 68 65 20 68 61 6e 64 6c 65 20 6d 61 79  . The handle may
a2e0: 20 62 65 20 63 6c 6f 73 65 64 20 62 79 20 63 61   be closed by ca
a2f0: 6c 6c 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c  lling the.** sql
a300: 69 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73  ite3Fts3Segments
a310: 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  Close() function
a320: 2e 20 52 65 75 73 69 6e 67 20 61 20 62 6c 6f 62  . Reusing a blob
a330: 20 68 61 6e 64 6c 65 20 69 73 20 61 20 68 61 6e   handle is a han
a340: 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63  dy.** performanc
a350: 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2c 20 62  e improvement, b
a360: 75 74 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64  ut the blob hand
a370: 6c 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  le should always
a380: 20 62 65 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 65   be closed.** be
a390: 66 6f 72 65 20 63 6f 6e 74 72 6f 6c 20 69 73 20  fore control is 
a3a0: 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
a3b0: 75 73 65 72 20 28 74 6f 20 70 72 65 76 65 6e 74  user (to prevent
a3c0: 20 61 20 6c 6f 63 6b 20 62 65 69 6e 67 20 68 65   a lock being he
a3d0: 6c 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74  ld.** on the dat
a3e0: 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 6c  abase file for l
a3f0: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 65 63 65 73  onger than neces
a400: 73 61 72 79 29 2e 20 54 68 75 73 2c 20 61 6e 79  sary). Thus, any
a410: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 2a   virtual table.*
a420: 2a 20 6d 65 74 68 6f 64 20 28 78 46 69 6c 74 65  * method (xFilte
a430: 72 20 65 74 63 2e 29 20 74 68 61 74 20 6d 61 79  r etc.) that may
a440: 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64   directly or ind
a450: 69 72 65 63 74 6c 79 20 63 61 6c 6c 20 74 68 69  irectly call thi
a460: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  s function.** mu
a470: 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 46  st call sqlite3F
a480: 74 73 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65  ts3SegmentsClose
a490: 28 29 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  () before return
a4a0: 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
a4b0: 74 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b  te3Fts3ReadBlock
a4c0: 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
a4d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a4e0: 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c      /* FTS3 tabl
a4f0: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71  e handle */.  sq
a500: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 42 6c 6f  lite3_int64 iBlo
a510: 63 6b 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a  ckid,         /*
a520: 20 41 63 63 65 73 73 20 74 68 65 20 72 6f 77 20   Access the row 
a530: 77 69 74 68 20 62 6c 6f 63 6b 69 64 3d 24 69 42  with blockid=$iB
a540: 6c 6f 63 6b 69 64 20 2a 2f 0a 20 20 63 68 61 72  lockid */.  char
a550: 20 2a 2a 70 61 42 6c 6f 62 2c 20 20 20 20 20 20   **paBlob,      
a560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
a570: 55 54 3a 20 42 6c 6f 62 20 64 61 74 61 20 69 6e  UT: Blob data in
a580: 20 6d 61 6c 6c 6f 63 27 64 20 62 75 66 66 65 72   malloc'd buffer
a590: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 6c 6f   */.  int *pnBlo
a5a0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
a5b0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69        /* OUT: Si
a5c0: 7a 65 20 6f 66 20 62 6c 6f 62 20 64 61 74 61 20  ze of blob data 
a5d0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 61 64  */.  int *pnLoad
a5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5f0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42 79 74       /* OUT: Byt
a600: 65 73 20 61 63 74 75 61 6c 6c 79 20 6c 6f 61 64  es actually load
a610: 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ed */.){.  int r
a620: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
a630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
a640: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
a650: 2f 2a 20 70 6e 42 6c 6f 62 20 6d 75 73 74 20 62  /* pnBlob must b
a660: 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 70 61 42 6c  e non-NULL. paBl
a670: 6f 62 20 6d 61 79 20 62 65 20 4e 55 4c 4c 20 6f  ob may be NULL o
a680: 72 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 2a 2f 0a 20  r non-NULL. */. 
a690: 20 61 73 73 65 72 74 28 20 70 6e 42 6c 6f 62 20   assert( pnBlob 
a6a0: 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 53 65  );..  if( p->pSe
a6b0: 67 6d 65 6e 74 73 20 29 7b 0a 20 20 20 20 72 63  gments ){.    rc
a6c0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
a6d0: 72 65 6f 70 65 6e 28 70 2d 3e 70 53 65 67 6d 65  reopen(p->pSegme
a6e0: 6e 74 73 2c 20 69 42 6c 6f 63 6b 69 64 29 3b 0a  nts, iBlockid);.
a6f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
a700: 20 30 3d 3d 70 2d 3e 7a 53 65 67 6d 65 6e 74 73   0==p->zSegments
a710: 54 62 6c 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Tbl ){.      p->
a720: 7a 53 65 67 6d 65 6e 74 73 54 62 6c 20 3d 20 73  zSegmentsTbl = s
a730: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
a740: 25 73 5f 73 65 67 6d 65 6e 74 73 22 2c 20 70 2d  %s_segments", p-
a750: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  >zName);.      i
a760: 66 28 20 30 3d 3d 70 2d 3e 7a 53 65 67 6d 65 6e  f( 0==p->zSegmen
a770: 74 73 54 62 6c 20 29 20 72 65 74 75 72 6e 20 53  tsTbl ) return S
a780: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
a790: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
a7a0: 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 0a 20  te3_blob_open(. 
a7b0: 20 20 20 20 20 20 70 2d 3e 64 62 2c 20 70 2d 3e        p->db, p->
a7c0: 7a 44 62 2c 20 70 2d 3e 7a 53 65 67 6d 65 6e 74  zDb, p->zSegment
a7d0: 73 54 62 6c 2c 20 22 62 6c 6f 63 6b 22 2c 20 69  sTbl, "block", i
a7e0: 42 6c 6f 63 6b 69 64 2c 20 30 2c 20 26 70 2d 3e  Blockid, 0, &p->
a7f0: 70 53 65 67 6d 65 6e 74 73 0a 20 20 20 20 29 3b  pSegments.    );
a800: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
a810: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a820: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 71 6c   int nByte = sql
a830: 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28  ite3_blob_bytes(
a840: 70 2d 3e 70 53 65 67 6d 65 6e 74 73 29 3b 0a 20  p->pSegments);. 
a850: 20 20 20 2a 70 6e 42 6c 6f 62 20 3d 20 6e 42 79     *pnBlob = nBy
a860: 74 65 3b 0a 20 20 20 20 69 66 28 20 70 61 42 6c  te;.    if( paBl
a870: 6f 62 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  ob ){.      char
a880: 20 2a 61 42 79 74 65 20 3d 20 73 71 6c 69 74 65   *aByte = sqlite
a890: 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 20 2b  3_malloc(nByte +
a8a0: 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49   FTS3_NODE_PADDI
a8b0: 4e 47 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  NG);.      if( !
a8c0: 61 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20  aByte ){.       
a8d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
a8e0: 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
a8f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 6e 4c  .        if( pnL
a900: 6f 61 64 20 26 26 20 6e 42 79 74 65 3e 28 46 54  oad && nByte>(FT
a910: 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 5f 54 48  S3_NODE_CHUNK_TH
a920: 52 45 53 48 4f 4c 44 29 20 29 7b 0a 20 20 20 20  RESHOLD) ){.    
a930: 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 46 54        nByte = FT
a940: 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 53 49 5a  S3_NODE_CHUNKSIZ
a950: 45 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e  E;.          *pn
a960: 4c 6f 61 64 20 3d 20 6e 42 79 74 65 3b 0a 20 20  Load = nByte;.  
a970: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a980: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
a990: 62 5f 72 65 61 64 28 70 2d 3e 70 53 65 67 6d 65  b_read(p->pSegme
a9a0: 6e 74 73 2c 20 61 42 79 74 65 2c 20 6e 42 79 74  nts, aByte, nByt
a9b0: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6d  e, 0);.        m
a9c0: 65 6d 73 65 74 28 26 61 42 79 74 65 5b 6e 42 79  emset(&aByte[nBy
a9d0: 74 65 5d 2c 20 30 2c 20 46 54 53 33 5f 4e 4f 44  te], 0, FTS3_NOD
a9e0: 45 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 20 20  E_PADDING);.    
a9f0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
aa00: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
aa10: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
aa20: 61 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20  aByte);.        
aa30: 20 20 61 42 79 74 65 20 3d 20 30 3b 0a 20 20 20    aByte = 0;.   
aa40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
aa50: 20 20 20 20 20 2a 70 61 42 6c 6f 62 20 3d 20 61       *paBlob = a
aa60: 42 79 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Byte;.    }.  }.
aa70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
aa80: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
aa90: 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 61 74 20   blob handle at 
aaa0: 70 2d 3e 70 53 65 67 6d 65 6e 74 73 2c 20 69 66  p->pSegments, if
aab0: 20 69 74 20 69 73 20 6f 70 65 6e 2e 20 53 65 65   it is open. See
aac0: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 0a   comments above.
aad0: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 46 74  ** the sqlite3Ft
aae0: 73 33 52 65 61 64 42 6c 6f 63 6b 28 29 20 66 75  s3ReadBlock() fu
aaf0: 6e 63 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69  nction for detai
ab00: 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ls..*/.void sqli
ab10: 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73 43  te3Fts3SegmentsC
ab20: 6c 6f 73 65 28 46 74 73 33 54 61 62 6c 65 20 2a  lose(Fts3Table *
ab30: 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c  p){.  sqlite3_bl
ab40: 6f 62 5f 63 6c 6f 73 65 28 70 2d 3e 70 53 65 67  ob_close(p->pSeg
ab50: 6d 65 6e 74 73 29 3b 0a 20 20 70 2d 3e 70 53 65  ments);.  p->pSe
ab60: 67 6d 65 6e 74 73 20 3d 20 30 3b 0a 7d 0a 20 20  gments = 0;.}.  
ab70: 20 20 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74    .static int ft
ab80: 73 33 53 65 67 52 65 61 64 65 72 49 6e 63 72 52  s3SegReaderIncrR
ab90: 65 61 64 28 46 74 73 33 53 65 67 52 65 61 64 65  ead(Fts3SegReade
aba0: 72 20 2a 70 52 65 61 64 65 72 29 7b 0a 20 20 69  r *pReader){.  i
abb0: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
abc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
abd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
abe0: 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69  s to read */.  i
abf0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ac10: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
ac20: 0a 0a 20 20 6e 52 65 61 64 20 3d 20 4d 49 4e 28  ..  nRead = MIN(
ac30: 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 20 2d  pReader->nNode -
ac40: 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c   pReader->nPopul
ac50: 61 74 65 2c 20 46 54 53 33 5f 4e 4f 44 45 5f 43  ate, FTS3_NODE_C
ac60: 48 55 4e 4b 53 49 5a 45 29 3b 0a 20 20 72 63 20  HUNKSIZE);.  rc 
ac70: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  = sqlite3_blob_r
ac80: 65 61 64 28 0a 20 20 20 20 20 20 70 52 65 61 64  ead(.      pRead
ac90: 65 72 2d 3e 70 42 6c 6f 62 2c 20 0a 20 20 20 20  er->pBlob, .    
aca0: 20 20 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64    &pReader->aNod
acb0: 65 5b 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75  e[pReader->nPopu
acc0: 6c 61 74 65 5d 2c 0a 20 20 20 20 20 20 6e 52 65  late],.      nRe
acd0: 61 64 2c 0a 20 20 20 20 20 20 70 52 65 61 64 65  ad,.      pReade
ace0: 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 0a 20 20 29  r->nPopulate.  )
acf0: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
ad00: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 52  ITE_OK ){.    pR
ad10: 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65  eader->nPopulate
ad20: 20 2b 3d 20 6e 52 65 61 64 3b 0a 20 20 20 20 6d   += nRead;.    m
ad30: 65 6d 73 65 74 28 26 70 52 65 61 64 65 72 2d 3e  emset(&pReader->
ad40: 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e  aNode[pReader->n
ad50: 50 6f 70 75 6c 61 74 65 5d 2c 20 30 2c 20 46 54  Populate], 0, FT
ad60: 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49 4e 47 29  S3_NODE_PADDING)
ad70: 3b 0a 20 20 20 20 69 66 28 20 70 52 65 61 64 65  ;.    if( pReade
ad80: 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 3d 3d 70 52  r->nPopulate==pR
ad90: 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 20 29 7b 0a  eader->nNode ){.
ada0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c        sqlite3_bl
adb0: 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61 64 65 72  ob_close(pReader
adc0: 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20  ->pBlob);.      
add0: 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 20 3d  pReader->pBlob =
ade0: 20 30 3b 0a 20 20 20 20 20 20 70 52 65 61 64 65   0;.      pReade
adf0: 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 20 3d 20 30  r->nPopulate = 0
ae00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
ae10: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
ae20: 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65  ic int fts3SegRe
ae30: 61 64 65 72 52 65 71 75 69 72 65 28 46 74 73 33  aderRequire(Fts3
ae40: 53 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64  SegReader *pRead
ae50: 65 72 2c 20 63 68 61 72 20 2a 70 46 72 6f 6d 2c  er, char *pFrom,
ae60: 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69   int nByte){.  i
ae70: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
ae80: 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 52  K;.  assert( !pR
ae90: 65 61 64 65 72 2d 3e 70 42 6c 6f 62 20 0a 20 20  eader->pBlob .  
aea0: 20 20 20 20 20 7c 7c 20 28 70 46 72 6f 6d 3e 3d       || (pFrom>=
aeb0: 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20 26  pReader->aNode &
aec0: 26 20 70 46 72 6f 6d 3c 26 70 52 65 61 64 65 72  & pFrom<&pReader
aed0: 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d  ->aNode[pReader-
aee0: 3e 6e 4e 6f 64 65 5d 29 0a 20 20 29 3b 0a 20 20  >nNode]).  );.  
aef0: 77 68 69 6c 65 28 20 70 52 65 61 64 65 72 2d 3e  while( pReader->
af00: 70 42 6c 6f 62 20 26 26 20 72 63 3d 3d 53 51 4c  pBlob && rc==SQL
af10: 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20 26 26 20  ITE_OK .     && 
af20: 20 28 70 46 72 6f 6d 20 2d 20 70 52 65 61 64 65   (pFrom - pReade
af30: 72 2d 3e 61 4e 6f 64 65 20 2b 20 6e 42 79 74 65  r->aNode + nByte
af40: 29 3e 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75  )>pReader->nPopu
af50: 6c 61 74 65 0a 20 20 29 7b 0a 20 20 20 20 72 63  late.  ){.    rc
af60: 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72   = fts3SegReader
af70: 49 6e 63 72 52 65 61 64 28 70 52 65 61 64 65 72  IncrRead(pReader
af80: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
af90: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
afa0: 20 61 6e 20 46 74 73 33 53 65 67 52 65 61 64 65   an Fts3SegReade
afb0: 72 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  r cursor to poin
afc0: 74 20 61 74 20 45 4f 46 2e 0a 2a 2f 0a 73 74 61  t at EOF..*/.sta
afd0: 74 69 63 20 76 6f 69 64 20 66 74 73 33 53 65 67  tic void fts3Seg
afe0: 52 65 61 64 65 72 53 65 74 45 6f 66 28 46 74 73  ReaderSetEof(Fts
aff0: 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67  3SegReader *pSeg
b000: 29 7b 0a 20 20 69 66 28 20 21 66 74 73 33 53 65  ){.  if( !fts3Se
b010: 67 52 65 61 64 65 72 49 73 52 6f 6f 74 4f 6e 6c  gReaderIsRootOnl
b020: 79 28 70 53 65 67 29 20 29 7b 0a 20 20 20 20 73  y(pSeg) ){.    s
b030: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 67  qlite3_free(pSeg
b040: 2d 3e 61 4e 6f 64 65 29 3b 0a 20 20 20 20 73 71  ->aNode);.    sq
b050: 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65  lite3_blob_close
b060: 28 70 53 65 67 2d 3e 70 42 6c 6f 62 29 3b 0a 20  (pSeg->pBlob);. 
b070: 20 20 20 70 53 65 67 2d 3e 70 42 6c 6f 62 20 3d     pSeg->pBlob =
b080: 20 30 3b 0a 20 20 7d 0a 20 20 70 53 65 67 2d 3e   0;.  }.  pSeg->
b090: 61 4e 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  aNode = 0;.}../*
b0a0: 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65  .** Move the ite
b0b0: 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
b0c0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
b0d0: 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 74  nt to the next t
b0e0: 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 73 65  erm in the.** se
b0f0: 67 6d 65 6e 74 2e 20 49 66 20 73 75 63 63 65 73  gment. If succes
b100: 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
b110: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
b120: 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 78 74  there is no next
b130: 20 74 65 72 6d 2c 0a 2a 2a 20 53 51 4c 49 54 45   term,.** SQLITE
b140: 5f 44 4f 4e 45 2e 20 4f 74 68 65 72 77 69 73 65  _DONE. Otherwise
b150: 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
b160: 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
b170: 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61  c int fts3SegRea
b180: 64 65 72 4e 65 78 74 28 0a 20 20 46 74 73 33 54  derNext(.  Fts3T
b190: 61 62 6c 65 20 2a 70 2c 20 0a 20 20 46 74 73 33  able *p, .  Fts3
b1a0: 53 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64  SegReader *pRead
b1b0: 65 72 2c 0a 20 20 69 6e 74 20 62 49 6e 63 72 0a  er,.  int bIncr.
b1c0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
b1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1e0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
b1f0: 6f 64 65 20 6f 66 20 76 61 72 69 6f 75 73 20 73  ode of various s
b200: 75 62 2d 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20  ub-routines */. 
b210: 20 63 68 61 72 20 2a 70 4e 65 78 74 3b 20 20 20   char *pNext;   
b220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b230: 20 2f 2a 20 43 75 72 73 6f 72 20 76 61 72 69 61   /* Cursor varia
b240: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72  ble */.  int nPr
b250: 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20  efix;           
b260: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b270: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
b280: 65 72 6d 20 70 72 65 66 69 78 20 2a 2f 0a 20 20  erm prefix */.  
b290: 69 6e 74 20 6e 53 75 66 66 69 78 3b 20 20 20 20  int nSuffix;    
b2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
b2c0: 65 73 20 69 6e 20 74 65 72 6d 20 73 75 66 66 69  es in term suffi
b2d0: 78 20 2a 2f 0a 0a 20 20 69 66 28 20 21 70 52 65  x */..  if( !pRe
b2e0: 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20 29  ader->aDoclist )
b2f0: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 52  {.    pNext = pR
b300: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 3b 0a 20 20  eader->aNode;.  
b310: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 78 74  }else{.    pNext
b320: 20 3d 20 26 70 52 65 61 64 65 72 2d 3e 61 44 6f   = &pReader->aDo
b330: 63 6c 69 73 74 5b 70 52 65 61 64 65 72 2d 3e 6e  clist[pReader->n
b340: 44 6f 63 6c 69 73 74 5d 3b 0a 20 20 7d 0a 0a 20  Doclist];.  }.. 
b350: 20 69 66 28 20 21 70 4e 65 78 74 20 7c 7c 20 70   if( !pNext || p
b360: 4e 65 78 74 3e 3d 26 70 52 65 61 64 65 72 2d 3e  Next>=&pReader->
b370: 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e  aNode[pReader->n
b380: 4e 6f 64 65 5d 20 29 7b 0a 0a 20 20 20 20 69 66  Node] ){..    if
b390: 28 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49  ( fts3SegReaderI
b3a0: 73 50 65 6e 64 69 6e 67 28 70 52 65 61 64 65 72  sPending(pReader
b3b0: 29 20 29 7b 0a 20 20 20 20 20 20 46 74 73 33 48  ) ){.      Fts3H
b3c0: 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 20 3d  ashElem *pElem =
b3d0: 20 2a 28 70 52 65 61 64 65 72 2d 3e 70 70 4e 65   *(pReader->ppNe
b3e0: 78 74 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 73  xtElem);.      s
b3f0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65 61  qlite3_free(pRea
b400: 64 65 72 2d 3e 61 4e 6f 64 65 29 3b 0a 20 20 20  der->aNode);.   
b410: 20 20 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64     pReader->aNod
b420: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  e = 0;.      if(
b430: 20 70 45 6c 65 6d 20 29 7b 0a 20 20 20 20 20 20   pElem ){.      
b440: 20 20 63 68 61 72 20 2a 61 43 6f 70 79 3b 0a 20    char *aCopy;. 
b450: 20 20 20 20 20 20 20 50 65 6e 64 69 6e 67 4c 69         PendingLi
b460: 73 74 20 2a 70 4c 69 73 74 20 3d 20 28 50 65 6e  st *pList = (Pen
b470: 64 69 6e 67 4c 69 73 74 20 2a 29 66 74 73 33 48  dingList *)fts3H
b480: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
b490: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70          int nCop
b4a0: 79 20 3d 20 70 4c 69 73 74 2d 3e 6e 44 61 74 61  y = pList->nData
b4b0: 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 52 65 61  +1;.        pRea
b4c0: 64 65 72 2d 3e 7a 54 65 72 6d 20 3d 20 28 63 68  der->zTerm = (ch
b4d0: 61 72 20 2a 29 66 74 73 33 48 61 73 68 4b 65 79  ar *)fts3HashKey
b4e0: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 20  (pElem);.       
b4f0: 20 70 52 65 61 64 65 72 2d 3e 6e 54 65 72 6d 20   pReader->nTerm 
b500: 3d 20 66 74 73 33 48 61 73 68 4b 65 79 73 69 7a  = fts3HashKeysiz
b510: 65 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20  e(pElem);.      
b520: 20 20 61 43 6f 70 79 20 3d 20 28 63 68 61 72 2a    aCopy = (char*
b530: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
b540: 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20  nCopy);.        
b550: 69 66 28 20 21 61 43 6f 70 79 20 29 20 72 65 74  if( !aCopy ) ret
b560: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
b570: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
b580: 28 61 43 6f 70 79 2c 20 70 4c 69 73 74 2d 3e 61  (aCopy, pList->a
b590: 44 61 74 61 2c 20 6e 43 6f 70 79 29 3b 0a 20 20  Data, nCopy);.  
b5a0: 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e        pReader->n
b5b0: 4e 6f 64 65 20 3d 20 70 52 65 61 64 65 72 2d 3e  Node = pReader->
b5c0: 6e 44 6f 63 6c 69 73 74 20 3d 20 6e 43 6f 70 79  nDoclist = nCopy
b5d0: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64 65  ;.        pReade
b5e0: 72 2d 3e 61 4e 6f 64 65 20 3d 20 70 52 65 61 64  r->aNode = pRead
b5f0: 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20 61  er->aDoclist = a
b600: 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 70 52  Copy;.        pR
b610: 65 61 64 65 72 2d 3e 70 70 4e 65 78 74 45 6c 65  eader->ppNextEle
b620: 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  m++;.        ass
b630: 65 72 74 28 20 70 52 65 61 64 65 72 2d 3e 61 4e  ert( pReader->aN
b640: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ode );.      }. 
b650: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
b660: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  TE_OK;.    }..  
b670: 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72 53    fts3SegReaderS
b680: 65 74 45 6f 66 28 70 52 65 61 64 65 72 29 3b 0a  etEof(pReader);.
b690: 0a 20 20 20 20 2f 2a 20 49 66 20 69 43 75 72 72  .    /* If iCurr
b6a0: 65 6e 74 42 6c 6f 63 6b 3e 3d 69 4c 65 61 66 45  entBlock>=iLeafE
b6b0: 6e 64 42 6c 6f 63 6b 2c 20 74 68 69 73 20 69 73  ndBlock, this is
b6c0: 20 61 6e 20 45 4f 46 20 63 6f 6e 64 69 74 69 6f   an EOF conditio
b6d0: 6e 2e 20 41 6c 6c 20 6c 65 61 66 20 0a 20 20 20  n. All leaf .   
b6e0: 20 2a 2a 20 62 6c 6f 63 6b 73 20 68 61 76 65 20   ** blocks have 
b6f0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 74 72 61  already been tra
b700: 76 65 72 73 65 64 2e 20 20 2a 2f 0a 20 20 20 20  versed.  */.    
b710: 61 73 73 65 72 74 28 20 70 52 65 61 64 65 72 2d  assert( pReader-
b720: 3e 69 43 75 72 72 65 6e 74 42 6c 6f 63 6b 3c 3d  >iCurrentBlock<=
b730: 70 52 65 61 64 65 72 2d 3e 69 4c 65 61 66 45 6e  pReader->iLeafEn
b740: 64 42 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  dBlock );.    if
b750: 28 20 70 52 65 61 64 65 72 2d 3e 69 43 75 72 72  ( pReader->iCurr
b760: 65 6e 74 42 6c 6f 63 6b 3e 3d 70 52 65 61 64 65  entBlock>=pReade
b770: 72 2d 3e 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b  r->iLeafEndBlock
b780: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
b790: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
b7a0: 7d 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  }..    rc = sqli
b7b0: 74 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b  te3Fts3ReadBlock
b7c0: 28 0a 20 20 20 20 20 20 20 20 70 2c 20 2b 2b 70  (.        p, ++p
b7d0: 52 65 61 64 65 72 2d 3e 69 43 75 72 72 65 6e 74  Reader->iCurrent
b7e0: 42 6c 6f 63 6b 2c 20 26 70 52 65 61 64 65 72 2d  Block, &pReader-
b7f0: 3e 61 4e 6f 64 65 2c 20 26 70 52 65 61 64 65 72  >aNode, &pReader
b800: 2d 3e 6e 4e 6f 64 65 2c 20 0a 20 20 20 20 20 20  ->nNode, .      
b810: 20 20 28 62 49 6e 63 72 20 3f 20 26 70 52 65 61    (bIncr ? &pRea
b820: 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 20 3a  der->nPopulate :
b830: 20 30 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69   0).    );.    i
b840: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
b850: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
b860: 20 20 61 73 73 65 72 74 28 20 70 52 65 61 64 65    assert( pReade
b870: 72 2d 3e 70 42 6c 6f 62 3d 3d 30 20 29 3b 0a 20  r->pBlob==0 );. 
b880: 20 20 20 69 66 28 20 62 49 6e 63 72 20 26 26 20     if( bIncr && 
b890: 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61  pReader->nPopula
b8a0: 74 65 3c 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64  te<pReader->nNod
b8b0: 65 20 29 7b 0a 20 20 20 20 20 20 70 52 65 61 64  e ){.      pRead
b8c0: 65 72 2d 3e 70 42 6c 6f 62 20 3d 20 70 2d 3e 70  er->pBlob = p->p
b8d0: 53 65 67 6d 65 6e 74 73 3b 0a 20 20 20 20 20 20  Segments;.      
b8e0: 70 2d 3e 70 53 65 67 6d 65 6e 74 73 20 3d 20 30  p->pSegments = 0
b8f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 78  ;.    }.    pNex
b900: 74 20 3d 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f  t = pReader->aNo
b910: 64 65 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  de;.  }..  asser
b920: 74 28 20 21 66 74 73 33 53 65 67 52 65 61 64 65  t( !fts3SegReade
b930: 72 49 73 50 65 6e 64 69 6e 67 28 70 52 65 61 64  rIsPending(pRead
b940: 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 66  er) );..  rc = f
b950: 74 73 33 53 65 67 52 65 61 64 65 72 52 65 71 75  ts3SegReaderRequ
b960: 69 72 65 28 70 52 65 61 64 65 72 2c 20 70 4e 65  ire(pReader, pNe
b970: 78 74 2c 20 46 54 53 33 5f 56 41 52 49 4e 54 5f  xt, FTS3_VARINT_
b980: 4d 41 58 2a 32 29 3b 0a 20 20 69 66 28 20 72 63  MAX*2);.  if( rc
b990: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
b9a0: 74 75 72 6e 20 72 63 3b 0a 20 20 0a 20 20 2f 2a  turn rc;.  .  /*
b9b0: 20 42 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   Because of the 
b9c0: 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49 4e  FTS3_NODE_PADDIN
b9d0: 47 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69  G bytes of paddi
b9e0: 6e 67 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ng, the followin
b9f0: 67 20 69 73 20 0a 20 20 2a 2a 20 73 61 66 65 20  g is .  ** safe 
ba00: 28 6e 6f 20 72 69 73 6b 20 6f 66 20 6f 76 65 72  (no risk of over
ba10: 72 65 61 64 29 20 65 76 65 6e 20 69 66 20 74 68  read) even if th
ba20: 65 20 6e 6f 64 65 20 64 61 74 61 20 69 73 20 63  e node data is c
ba30: 6f 72 72 75 70 74 65 64 2e 20 2a 2f 0a 20 20 70  orrupted. */.  p
ba40: 4e 65 78 74 20 2b 3d 20 66 74 73 33 47 65 74 56  Next += fts3GetV
ba50: 61 72 69 6e 74 33 32 28 70 4e 65 78 74 2c 20 26  arint32(pNext, &
ba60: 6e 50 72 65 66 69 78 29 3b 0a 20 20 70 4e 65 78  nPrefix);.  pNex
ba70: 74 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72 69  t += fts3GetVari
ba80: 6e 74 33 32 28 70 4e 65 78 74 2c 20 26 6e 53 75  nt32(pNext, &nSu
ba90: 66 66 69 78 29 3b 0a 20 20 69 66 28 20 6e 53 75  ffix);.  if( nSu
baa0: 66 66 69 78 3c 3d 30 20 0a 20 20 20 7c 7c 20 28  ffix<=0 .   || (
bab0: 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b  &pReader->aNode[
bac0: 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 5d 20  pReader->nNode] 
bad0: 2d 20 70 4e 65 78 74 29 3c 6e 53 75 66 66 69 78  - pNext)<nSuffix
bae0: 0a 20 20 20 7c 7c 20 6e 50 72 65 66 69 78 3e 70  .   || nPrefix>p
baf0: 52 65 61 64 65 72 2d 3e 6e 54 65 72 6d 41 6c 6c  Reader->nTermAll
bb00: 6f 63 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  oc.  ){.    retu
bb10: 72 6e 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56  rn FTS_CORRUPT_V
bb20: 54 41 42 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  TAB;.  }..  /* B
bb30: 6f 74 68 20 6e 50 72 65 66 69 78 20 61 6e 64 20  oth nPrefix and 
bb40: 6e 53 75 66 66 69 78 20 77 65 72 65 20 72 65 61  nSuffix were rea
bb50: 64 20 62 79 20 66 74 73 33 47 65 74 56 61 72 69  d by fts3GetVari
bb60: 6e 74 33 32 28 29 20 61 6e 64 20 73 6f 20 61 72  nt32() and so ar
bb70: 65 0a 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 30  e.  ** between 0
bb80: 20 61 6e 64 20 30 78 37 46 46 46 46 46 46 46 2e   and 0x7FFFFFFF.
bb90: 20 42 75 74 20 74 68 65 20 73 75 6d 20 6f 66 20   But the sum of 
bba0: 74 68 65 20 74 77 6f 20 6d 61 79 20 63 61 75 73  the two may caus
bbb0: 65 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 6f  e integer.  ** o
bbc0: 76 65 72 66 6c 6f 77 20 2d 20 68 65 6e 63 65 20  verflow - hence 
bbd0: 74 68 65 20 28 69 36 34 29 20 63 61 73 74 73 2e  the (i64) casts.
bbe0: 20 20 2a 2f 0a 20 20 69 66 28 20 28 69 36 34 29    */.  if( (i64)
bbf0: 6e 50 72 65 66 69 78 2b 6e 53 75 66 66 69 78 3e  nPrefix+nSuffix>
bc00: 28 69 36 34 29 70 52 65 61 64 65 72 2d 3e 6e 54  (i64)pReader->nT
bc10: 65 72 6d 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ermAlloc ){.    
bc20: 69 36 34 20 6e 4e 65 77 20 3d 20 28 28 69 36 34  i64 nNew = ((i64
bc30: 29 6e 50 72 65 66 69 78 2b 6e 53 75 66 66 69 78  )nPrefix+nSuffix
bc40: 29 2a 32 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  )*2;.    char *z
bc50: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  New = sqlite3_re
bc60: 61 6c 6c 6f 63 36 34 28 70 52 65 61 64 65 72 2d  alloc64(pReader-
bc70: 3e 7a 54 65 72 6d 2c 20 6e 4e 65 77 29 3b 0a 20  >zTerm, nNew);. 
bc80: 20 20 20 69 66 28 20 21 7a 4e 65 77 20 29 7b 0a     if( !zNew ){.
bc90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
bca0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
bcb0: 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e 7a 54  .    pReader->zT
bcc0: 65 72 6d 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20  erm = zNew;.    
bcd0: 70 52 65 61 64 65 72 2d 3e 6e 54 65 72 6d 41 6c  pReader->nTermAl
bce0: 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 7d 0a  loc = nNew;.  }.
bcf0: 0a 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52  .  rc = fts3SegR
bd00: 65 61 64 65 72 52 65 71 75 69 72 65 28 70 52 65  eaderRequire(pRe
bd10: 61 64 65 72 2c 20 70 4e 65 78 74 2c 20 6e 53 75  ader, pNext, nSu
bd20: 66 66 69 78 2b 46 54 53 33 5f 56 41 52 49 4e 54  ffix+FTS3_VARINT
bd30: 5f 4d 41 58 29 3b 0a 20 20 69 66 28 20 72 63 21  _MAX);.  if( rc!
bd40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
bd50: 75 72 6e 20 72 63 3b 0a 0a 20 20 6d 65 6d 63 70  urn rc;..  memcp
bd60: 79 28 26 70 52 65 61 64 65 72 2d 3e 7a 54 65 72  y(&pReader->zTer
bd70: 6d 5b 6e 50 72 65 66 69 78 5d 2c 20 70 4e 65 78  m[nPrefix], pNex
bd80: 74 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 70  t, nSuffix);.  p
bd90: 52 65 61 64 65 72 2d 3e 6e 54 65 72 6d 20 3d 20  Reader->nTerm = 
bda0: 6e 50 72 65 66 69 78 2b 6e 53 75 66 66 69 78 3b  nPrefix+nSuffix;
bdb0: 0a 20 20 70 4e 65 78 74 20 2b 3d 20 6e 53 75 66  .  pNext += nSuf
bdc0: 66 69 78 3b 0a 20 20 70 4e 65 78 74 20 2b 3d 20  fix;.  pNext += 
bdd0: 66 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28  fts3GetVarint32(
bde0: 70 4e 65 78 74 2c 20 26 70 52 65 61 64 65 72 2d  pNext, &pReader-
bdf0: 3e 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 70 52  >nDoclist);.  pR
be00: 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20  eader->aDoclist 
be10: 3d 20 70 4e 65 78 74 3b 0a 20 20 70 52 65 61 64  = pNext;.  pRead
be20: 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20  er->pOffsetList 
be30: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  = 0;..  /* Check
be40: 20 74 68 61 74 20 74 68 65 20 64 6f 63 6c 69 73   that the doclis
be50: 74 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61  t does not appea
be60: 72 20 74 6f 20 65 78 74 65 6e 64 20 70 61 73 74  r to extend past
be70: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
be80: 20 20 2a 2a 20 62 2d 74 72 65 65 20 6e 6f 64 65    ** b-tree node
be90: 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65 20 66  . And that the f
bea0: 69 6e 61 6c 20 62 79 74 65 20 6f 66 20 74 68 65  inal byte of the
beb0: 20 64 6f 63 6c 69 73 74 20 69 73 20 30 78 30 30   doclist is 0x00
bec0: 2e 20 49 66 20 65 69 74 68 65 72 20 0a 20 20 2a  . If either .  *
bed0: 2a 20 6f 66 20 74 68 65 73 65 20 73 74 61 74 65  * of these state
bee0: 6d 65 6e 74 73 20 69 73 20 75 6e 74 72 75 65 2c  ments is untrue,
bef0: 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 73   then the data s
bf00: 74 72 75 63 74 75 72 65 20 69 73 20 63 6f 72 72  tructure is corr
bf10: 75 70 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  upt..  */.  if( 
bf20: 28 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65  (&pReader->aNode
bf30: 5b 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 5d  [pReader->nNode]
bf40: 20 2d 20 70 52 65 61 64 65 72 2d 3e 61 44 6f 63   - pReader->aDoc
bf50: 6c 69 73 74 29 3c 70 52 65 61 64 65 72 2d 3e 6e  list)<pReader->n
bf60: 44 6f 63 6c 69 73 74 0a 20 20 20 7c 7c 20 28 70  Doclist.   || (p
bf70: 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74  Reader->nPopulat
bf80: 65 3d 3d 30 20 26 26 20 70 52 65 61 64 65 72 2d  e==0 && pReader-
bf90: 3e 61 44 6f 63 6c 69 73 74 5b 70 52 65 61 64 65  >aDoclist[pReade
bfa0: 72 2d 3e 6e 44 6f 63 6c 69 73 74 2d 31 5d 29 0a  r->nDoclist-1]).
bfb0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
bfc0: 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41 42  FTS_CORRUPT_VTAB
bfd0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
bfe0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
bff0: 2a 2a 20 53 65 74 20 74 68 65 20 53 65 67 52 65  ** Set the SegRe
c000: 61 64 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  ader to point to
c010: 20 74 68 65 20 66 69 72 73 74 20 64 6f 63 69 64   the first docid
c020: 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20   in the doclist 
c030: 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
c040: 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  th the current t
c050: 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  erm..*/.static i
c060: 6e 74 20 66 74 73 33 53 65 67 52 65 61 64 65 72  nt fts3SegReader
c070: 46 69 72 73 74 44 6f 63 69 64 28 46 74 73 33 54  FirstDocid(Fts3T
c080: 61 62 6c 65 20 2a 70 54 61 62 2c 20 46 74 73 33  able *pTab, Fts3
c090: 53 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64  SegReader *pRead
c0a0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
c0b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
c0c0: 65 72 74 28 20 70 52 65 61 64 65 72 2d 3e 61 44  ert( pReader->aD
c0d0: 6f 63 6c 69 73 74 20 29 3b 0a 20 20 61 73 73 65  oclist );.  asse
c0e0: 72 74 28 20 21 70 52 65 61 64 65 72 2d 3e 70 4f  rt( !pReader->pO
c0f0: 66 66 73 65 74 4c 69 73 74 20 29 3b 0a 20 20 69  ffsetList );.  i
c100: 66 28 20 70 54 61 62 2d 3e 62 44 65 73 63 49 64  f( pTab->bDescId
c110: 78 20 26 26 20 66 74 73 33 53 65 67 52 65 61 64  x && fts3SegRead
c120: 65 72 49 73 50 65 6e 64 69 6e 67 28 70 52 65 61  erIsPending(pRea
c130: 64 65 72 29 20 29 7b 0a 20 20 20 20 75 38 20 62  der) ){.    u8 b
c140: 45 6f 66 20 3d 20 30 3b 0a 20 20 20 20 70 52 65  Eof = 0;.    pRe
c150: 61 64 65 72 2d 3e 69 44 6f 63 69 64 20 3d 20 30  ader->iDocid = 0
c160: 3b 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e  ;.    pReader->n
c170: 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 30 3b 0a  OffsetList = 0;.
c180: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 44      sqlite3Fts3D
c190: 6f 63 6c 69 73 74 50 72 65 76 28 30 2c 0a 20 20  oclistPrev(0,.  
c1a0: 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 61        pReader->a
c1b0: 44 6f 63 6c 69 73 74 2c 20 70 52 65 61 64 65 72  Doclist, pReader
c1c0: 2d 3e 6e 44 6f 63 6c 69 73 74 2c 20 26 70 52 65  ->nDoclist, &pRe
c1d0: 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73  ader->pOffsetLis
c1e0: 74 2c 20 0a 20 20 20 20 20 20 20 20 26 70 52 65  t, .        &pRe
c1f0: 61 64 65 72 2d 3e 69 44 6f 63 69 64 2c 20 26 70  ader->iDocid, &p
c200: 52 65 61 64 65 72 2d 3e 6e 4f 66 66 73 65 74 4c  Reader->nOffsetL
c210: 69 73 74 2c 20 26 62 45 6f 66 0a 20 20 20 20 29  ist, &bEof.    )
c220: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
c230: 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65  c = fts3SegReade
c240: 72 52 65 71 75 69 72 65 28 70 52 65 61 64 65 72  rRequire(pReader
c250: 2c 20 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c  , pReader->aDocl
c260: 69 73 74 2c 20 46 54 53 33 5f 56 41 52 49 4e 54  ist, FTS3_VARINT
c270: 5f 4d 41 58 29 3b 0a 20 20 20 20 69 66 28 20 72  _MAX);.    if( r
c280: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
c290: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71        int n = sq
c2a0: 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
c2b0: 6e 74 28 70 52 65 61 64 65 72 2d 3e 61 44 6f 63  nt(pReader->aDoc
c2c0: 6c 69 73 74 2c 20 26 70 52 65 61 64 65 72 2d 3e  list, &pReader->
c2d0: 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 20 20 70  iDocid);.      p
c2e0: 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c  Reader->pOffsetL
c2f0: 69 73 74 20 3d 20 26 70 52 65 61 64 65 72 2d 3e  ist = &pReader->
c300: 61 44 6f 63 6c 69 73 74 5b 6e 5d 3b 0a 20 20 20  aDoclist[n];.   
c310: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
c320: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  rc;.}../*.** Adv
c330: 61 6e 63 65 20 74 68 65 20 53 65 67 52 65 61 64  ance the SegRead
c340: 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  er to point to t
c350: 68 65 20 6e 65 78 74 20 64 6f 63 69 64 20 69 6e  he next docid in
c360: 20 74 68 65 20 64 6f 63 6c 69 73 74 0a 2a 2a 20   the doclist.** 
c370: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
c380: 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d  the current term
c390: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 61 72 67 75  ..** .** If argu
c3a0: 6d 65 6e 74 73 20 70 70 4f 66 66 73 65 74 4c 69  ments ppOffsetLi
c3b0: 73 74 20 61 6e 64 20 70 6e 4f 66 66 73 65 74 4c  st and pnOffsetL
c3c0: 69 73 74 20 61 72 65 20 6e 6f 74 20 4e 55 4c 4c  ist are not NULL
c3d0: 2c 20 74 68 65 6e 20 0a 2a 2a 20 2a 70 70 4f 66  , then .** *ppOf
c3e0: 66 73 65 74 4c 69 73 74 20 69 73 20 73 65 74 20  fsetList is set 
c3f0: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
c400: 66 69 72 73 74 20 63 6f 6c 75 6d 6e 2d 6f 66 66  first column-off
c410: 73 65 74 20 6c 69 73 74 0a 2a 2a 20 69 6e 20 74  set list.** in t
c420: 68 65 20 64 6f 63 6c 69 73 74 20 65 6e 74 72 79  he doclist entry
c430: 20 28 69 2e 65 2e 20 69 6d 6d 65 64 69 61 74 65   (i.e. immediate
c440: 6c 79 20 70 61 73 74 20 74 68 65 20 64 6f 63 69  ly past the doci
c450: 64 20 76 61 72 69 6e 74 29 2e 0a 2a 2a 20 2a 70  d varint)..** *p
c460: 6e 4f 66 66 73 65 74 4c 69 73 74 20 69 73 20 73  nOffsetList is s
c470: 65 74 20 74 6f 20 74 68 65 20 6c 65 6e 67 74 68  et to the length
c480: 20 6f 66 20 74 68 65 20 73 65 74 20 6f 66 20 63   of the set of c
c490: 6f 6c 75 6d 6e 2d 6f 66 66 73 65 74 0a 2a 2a 20  olumn-offset.** 
c4a0: 6c 69 73 74 73 2c 20 6e 6f 74 20 69 6e 63 6c 75  lists, not inclu
c4b0: 64 69 6e 67 20 74 68 65 20 6e 75 6c 2d 74 65 72  ding the nul-ter
c4c0: 6d 69 6e 61 74 6f 72 20 62 79 74 65 2e 20 46 6f  minator byte. Fo
c4d0: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2f 0a 73 74  r example:.*/.st
c4e0: 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67  atic int fts3Seg
c4f0: 52 65 61 64 65 72 4e 65 78 74 44 6f 63 69 64 28  ReaderNextDocid(
c500: 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 54  .  Fts3Table *pT
c510: 61 62 2c 0a 20 20 46 74 73 33 53 65 67 52 65 61  ab,.  Fts3SegRea
c520: 64 65 72 20 2a 70 52 65 61 64 65 72 2c 20 20 20  der *pReader,   
c530: 20 20 20 20 20 20 2f 2a 20 52 65 61 64 65 72 20        /* Reader 
c540: 74 6f 20 61 64 76 61 6e 63 65 20 74 6f 20 6e 65  to advance to ne
c550: 78 74 20 64 6f 63 69 64 20 2a 2f 0a 20 20 63 68  xt docid */.  ch
c560: 61 72 20 2a 2a 70 70 4f 66 66 73 65 74 4c 69 73  ar **ppOffsetLis
c570: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
c580: 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f   OUT: Pointer to
c590: 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
c5a0: 6e 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  n-list */.  int 
c5b0: 2a 70 6e 4f 66 66 73 65 74 4c 69 73 74 20 20 20  *pnOffsetList   
c5c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
c5d0: 55 54 3a 20 4c 65 6e 67 74 68 20 6f 66 20 2a 70  UT: Length of *p
c5e0: 70 4f 66 66 73 65 74 4c 69 73 74 20 69 6e 20 62  pOffsetList in b
c5f0: 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ytes */.){.  int
c600: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c610: 0a 20 20 63 68 61 72 20 2a 70 20 3d 20 70 52 65  .  char *p = pRe
c620: 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73  ader->pOffsetLis
c630: 74 3b 0a 20 20 63 68 61 72 20 63 20 3d 20 30 3b  t;.  char c = 0;
c640: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b  ..  assert( p );
c650: 0a 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 62 44  ..  if( pTab->bD
c660: 65 73 63 49 64 78 20 26 26 20 66 74 73 33 53 65  escIdx && fts3Se
c670: 67 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e 67  gReaderIsPending
c680: 28 70 52 65 61 64 65 72 29 20 29 7b 0a 20 20 20  (pReader) ){.   
c690: 20 2f 2a 20 41 20 70 65 6e 64 69 6e 67 2d 74 65   /* A pending-te
c6a0: 72 6d 73 20 73 65 67 2d 72 65 61 64 65 72 20 66  rms seg-reader f
c6b0: 6f 72 20 61 6e 20 46 54 53 34 20 74 61 62 6c 65  or an FTS4 table
c6c0: 20 74 68 61 74 20 75 73 65 73 20 6f 72 64 65 72   that uses order
c6d0: 3d 64 65 73 63 2e 0a 20 20 20 20 2a 2a 20 50 65  =desc..    ** Pe
c6e0: 6e 64 69 6e 67 2d 74 65 72 6d 73 20 64 6f 63 6c  nding-terms docl
c6f0: 69 73 74 73 20 61 72 65 20 61 6c 77 61 79 73 20  ists are always 
c700: 62 75 69 6c 74 20 75 70 20 69 6e 20 61 73 63 65  built up in asce
c710: 6e 64 69 6e 67 20 6f 72 64 65 72 2c 20 73 6f 0a  nding order, so.
c720: 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74      ** we have t
c730: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
c740: 68 20 74 68 65 6d 20 62 61 63 6b 77 61 72 64 73  h them backwards
c750: 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 75 38   here. */.    u8
c760: 20 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20 20 69   bEof = 0;.    i
c770: 66 28 20 70 70 4f 66 66 73 65 74 4c 69 73 74 20  f( ppOffsetList 
c780: 29 7b 0a 20 20 20 20 20 20 2a 70 70 4f 66 66 73  ){.      *ppOffs
c790: 65 74 4c 69 73 74 20 3d 20 70 52 65 61 64 65 72  etList = pReader
c7a0: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3b 0a 20  ->pOffsetList;. 
c7b0: 20 20 20 20 20 2a 70 6e 4f 66 66 73 65 74 4c 69       *pnOffsetLi
c7c0: 73 74 20 3d 20 70 52 65 61 64 65 72 2d 3e 6e 4f  st = pReader->nO
c7d0: 66 66 73 65 74 4c 69 73 74 20 2d 20 31 3b 0a 20  ffsetList - 1;. 
c7e0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
c7f0: 46 74 73 33 44 6f 63 6c 69 73 74 50 72 65 76 28  Fts3DoclistPrev(
c800: 30 2c 0a 20 20 20 20 20 20 20 20 70 52 65 61 64  0,.        pRead
c810: 65 72 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 70 52  er->aDoclist, pR
c820: 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 2c  eader->nDoclist,
c830: 20 26 70 2c 20 26 70 52 65 61 64 65 72 2d 3e 69   &p, &pReader->i
c840: 44 6f 63 69 64 2c 0a 20 20 20 20 20 20 20 20 26  Docid,.        &
c850: 70 52 65 61 64 65 72 2d 3e 6e 4f 66 66 73 65 74  pReader->nOffset
c860: 4c 69 73 74 2c 20 26 62 45 6f 66 0a 20 20 20 20  List, &bEof.    
c870: 29 3b 0a 20 20 20 20 69 66 28 20 62 45 6f 66 20  );.    if( bEof 
c880: 29 7b 0a 20 20 20 20 20 20 70 52 65 61 64 65 72  ){.      pReader
c890: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20  ->pOffsetList = 
c8a0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
c8b0: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 4f 66      pReader->pOf
c8c0: 66 73 65 74 4c 69 73 74 20 3d 20 70 3b 0a 20 20  fsetList = p;.  
c8d0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
c8e0: 20 63 68 61 72 20 2a 70 45 6e 64 20 3d 20 26 70   char *pEnd = &p
c8f0: 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74  Reader->aDoclist
c900: 5b 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69  [pReader->nDocli
c910: 73 74 5d 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 69  st];..    /* Poi
c920: 6e 74 65 72 20 70 20 63 75 72 72 65 6e 74 6c 79  nter p currently
c930: 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 66   points at the f
c940: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6e 20  irst byte of an 
c950: 6f 66 66 73 65 74 20 6c 69 73 74 2e 20 54 68 65  offset list. The
c960: 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  .    ** followin
c970: 67 20 62 6c 6f 63 6b 20 61 64 76 61 6e 63 65 73  g block advances
c980: 20 69 74 20 74 6f 20 70 6f 69 6e 74 20 6f 6e 65   it to point one
c990: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 65   byte past the e
c9a0: 6e 64 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  nd of.    ** the
c9b0: 20 73 61 6d 65 20 6f 66 66 73 65 74 20 6c 69 73   same offset lis
c9c0: 74 2e 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28  t. */.    while(
c9d0: 20 31 20 29 7b 0a 20 20 0a 20 20 20 20 20 20 2f   1 ){.  .      /
c9e0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
c9f0: 6c 69 6e 65 20 6f 66 20 63 6f 64 65 20 28 61 6e  line of code (an
ca00: 64 20 74 68 65 20 22 70 2b 2b 22 20 62 65 6c 6f  d the "p++" belo
ca10: 77 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f  w the while() lo
ca20: 6f 70 29 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  op) is.      ** 
ca30: 6e 6f 72 6d 61 6c 6c 79 20 61 6c 6c 20 74 68 61  normally all tha
ca40: 74 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  t is required to
ca50: 20 6d 6f 76 65 20 70 6f 69 6e 74 65 72 20 70 20   move pointer p 
ca60: 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 20 0a  to the desired .
ca70: 20 20 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f        ** positio
ca80: 6e 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  n. The exception
ca90: 20 69 73 20 69 66 20 74 68 69 73 20 6e 6f 64 65   is if this node
caa0: 20 69 73 20 62 65 69 6e 67 20 6c 6f 61 64 65 64   is being loaded
cab0: 20 66 72 6f 6d 20 64 69 73 6b 0a 20 20 20 20 20   from disk.     
cac0: 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c 6c   ** incrementall
cad0: 79 20 61 6e 64 20 70 6f 69 6e 74 65 72 20 22 70  y and pointer "p
cae0: 22 20 6e 6f 77 20 70 6f 69 6e 74 73 20 74 6f 20  " now points to 
caf0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70  the first byte p
cb00: 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ast.      ** the
cb10: 20 70 6f 70 75 6c 61 74 65 64 20 70 61 72 74 20   populated part 
cb20: 6f 66 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64  of pReader->aNod
cb30: 65 5b 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  e[]..      */.  
cb40: 20 20 20 20 77 68 69 6c 65 28 20 2a 70 20 7c 20      while( *p | 
cb50: 63 20 29 20 63 20 3d 20 2a 70 2b 2b 20 26 20 30  c ) c = *p++ & 0
cb60: 78 38 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  x80;.      asser
cb70: 74 28 20 2a 70 3d 3d 30 20 29 3b 0a 20 20 0a 20  t( *p==0 );.  . 
cb80: 20 20 20 20 20 69 66 28 20 70 52 65 61 64 65 72       if( pReader
cb90: 2d 3e 70 42 6c 6f 62 3d 3d 30 20 7c 7c 20 70 3c  ->pBlob==0 || p<
cba0: 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b  &pReader->aNode[
cbb0: 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61  pReader->nPopula
cbc0: 74 65 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  te] ) break;.   
cbd0: 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52     rc = fts3SegR
cbe0: 65 61 64 65 72 49 6e 63 72 52 65 61 64 28 70 52  eaderIncrRead(pR
cbf0: 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20 69 66  eader);.      if
cc00: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
cc10: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
cc20: 20 7d 0a 20 20 20 20 70 2b 2b 3b 0a 20 20 0a 20   }.    p++;.  . 
cc30: 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65     /* If require
cc40: 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  d, populate the 
cc50: 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  output variables
cc60: 20 77 69 74 68 20 61 20 70 6f 69 6e 74 65 72 20   with a pointer 
cc70: 74 6f 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  to and the.    *
cc80: 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 72  * size of the pr
cc90: 65 76 69 6f 75 73 20 6f 66 66 73 65 74 2d 6c 69  evious offset-li
cca0: 73 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  st..    */.    i
ccb0: 66 28 20 70 70 4f 66 66 73 65 74 4c 69 73 74 20  f( ppOffsetList 
ccc0: 29 7b 0a 20 20 20 20 20 20 2a 70 70 4f 66 66 73  ){.      *ppOffs
ccd0: 65 74 4c 69 73 74 20 3d 20 70 52 65 61 64 65 72  etList = pReader
cce0: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3b 0a 20  ->pOffsetList;. 
ccf0: 20 20 20 20 20 2a 70 6e 4f 66 66 73 65 74 4c 69       *pnOffsetLi
cd00: 73 74 20 3d 20 28 69 6e 74 29 28 70 20 2d 20 70  st = (int)(p - p
cd10: 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c  Reader->pOffsetL
cd20: 69 73 74 20 2d 20 31 29 3b 0a 20 20 20 20 7d 0a  ist - 1);.    }.
cd30: 0a 20 20 20 20 2f 2a 20 4c 69 73 74 20 6d 61 79  .    /* List may
cd40: 20 68 61 76 65 20 62 65 65 6e 20 65 64 69 74 65   have been edite
cd50: 64 20 69 6e 20 70 6c 61 63 65 20 62 79 20 66 74  d in place by ft
cd60: 73 33 45 76 61 6c 4e 65 61 72 54 72 69 6d 28 29  s3EvalNearTrim()
cd70: 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
cd80: 3c 70 45 6e 64 20 26 26 20 2a 70 3d 3d 30 20 29  <pEnd && *p==0 )
cd90: 20 70 2b 2b 3b 0a 20 20 0a 20 20 20 20 2f 2a 20   p++;.  .    /* 
cda0: 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
cdb0: 6d 6f 72 65 20 65 6e 74 72 69 65 73 20 69 6e 20  more entries in 
cdc0: 74 68 65 20 64 6f 63 6c 69 73 74 2c 20 73 65 74  the doclist, set
cdd0: 20 70 4f 66 66 73 65 74 4c 69 73 74 20 74 6f 0a   pOffsetList to.
cde0: 20 20 20 20 2a 2a 20 4e 55 4c 4c 2e 20 4f 74 68      ** NULL. Oth
cdf0: 65 72 77 69 73 65 2c 20 73 65 74 20 46 74 73 33  erwise, set Fts3
ce00: 53 65 67 52 65 61 64 65 72 2e 69 44 6f 63 69 64  SegReader.iDocid
ce10: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 6f 63   to the next doc
ce20: 69 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 46 74  id and.    ** Ft
ce30: 73 33 53 65 67 52 65 61 64 65 72 2e 70 4f 66 66  s3SegReader.pOff
ce40: 73 65 74 4c 69 73 74 20 74 6f 20 70 6f 69 6e 74  setList to point
ce50: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6f 66 66   to the next off
ce60: 73 65 74 20 6c 69 73 74 20 62 65 66 6f 72 65 0a  set list before.
ce70: 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 69 6e 67      ** returning
ce80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
ce90: 20 70 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20   p>=pEnd ){.    
cea0: 20 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73    pReader->pOffs
ceb0: 65 74 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  etList = 0;.    
cec0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
ced0: 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72 52  = fts3SegReaderR
cee0: 65 71 75 69 72 65 28 70 52 65 61 64 65 72 2c 20  equire(pReader, 
cef0: 70 2c 20 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d  p, FTS3_VARINT_M
cf00: 41 58 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  AX);.      if( r
cf10: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
cf20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
cf30: 69 6e 74 36 34 20 69 44 65 6c 74 61 3b 0a 20 20  int64 iDelta;.  
cf40: 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70        pReader->p
cf50: 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 70 20 2b  OffsetList = p +
cf60: 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56   sqlite3Fts3GetV
cf70: 61 72 69 6e 74 28 70 2c 20 26 69 44 65 6c 74 61  arint(p, &iDelta
cf80: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
cf90: 54 61 62 2d 3e 62 44 65 73 63 49 64 78 20 29 7b  Tab->bDescIdx ){
cfa0: 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 61 64  .          pRead
cfb0: 65 72 2d 3e 69 44 6f 63 69 64 20 2d 3d 20 69 44  er->iDocid -= iD
cfc0: 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 7d 65  elta;.        }e
cfd0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
cfe0: 52 65 61 64 65 72 2d 3e 69 44 6f 63 69 64 20 2b  Reader->iDocid +
cff0: 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  = iDelta;.      
d000: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
d010: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
d020: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 69  SQLITE_OK;.}...i
d030: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 4d 73  nt sqlite3Fts3Ms
d040: 72 4f 76 66 6c 28 0a 20 20 46 74 73 33 43 75 72  rOvfl(.  Fts3Cur
d050: 73 6f 72 20 2a 70 43 73 72 2c 20 0a 20 20 46 74  sor *pCsr, .  Ft
d060: 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
d070: 20 2a 70 4d 73 72 2c 0a 20 20 69 6e 74 20 2a 70   *pMsr,.  int *p
d080: 6e 4f 76 66 6c 0a 29 7b 0a 20 20 46 74 73 33 54  nOvfl.){.  Fts3T
d090: 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33 54  able *p = (Fts3T
d0a0: 61 62 6c 65 2a 29 70 43 73 72 2d 3e 62 61 73 65  able*)pCsr->base
d0b0: 2e 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 6e 4f  .pVtab;.  int nO
d0c0: 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  vfl = 0;.  int i
d0d0: 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  i;.  int rc = SQ
d0e0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 70  LITE_OK;.  int p
d0f0: 67 73 7a 20 3d 20 70 2d 3e 6e 50 67 73 7a 3b 0a  gsz = p->nPgsz;.
d100: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 46  .  assert( p->bF
d110: 74 73 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ts4 );.  assert(
d120: 20 70 67 73 7a 3e 30 20 29 3b 0a 0a 20 20 66 6f   pgsz>0 );..  fo
d130: 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  r(ii=0; rc==SQLI
d140: 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 4d 73 72  TE_OK && ii<pMsr
d150: 2d 3e 6e 53 65 67 6d 65 6e 74 3b 20 69 69 2b 2b  ->nSegment; ii++
d160: 29 7b 0a 20 20 20 20 46 74 73 33 53 65 67 52 65  ){.    Fts3SegRe
d170: 61 64 65 72 20 2a 70 52 65 61 64 65 72 20 3d 20  ader *pReader = 
d180: 70 4d 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b  pMsr->apSegment[
d190: 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 21 66 74  ii];.    if( !ft
d1a0: 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65 6e  s3SegReaderIsPen
d1b0: 64 69 6e 67 28 70 52 65 61 64 65 72 29 20 0a 20  ding(pReader) . 
d1c0: 20 20 20 20 26 26 20 21 66 74 73 33 53 65 67 52      && !fts3SegR
d1d0: 65 61 64 65 72 49 73 52 6f 6f 74 4f 6e 6c 79 28  eaderIsRootOnly(
d1e0: 70 52 65 61 64 65 72 29 20 0a 20 20 20 20 29 7b  pReader) .    ){
d1f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
d200: 6e 74 36 34 20 6a 6a 3b 0a 20 20 20 20 20 20 66  nt64 jj;.      f
d210: 6f 72 28 6a 6a 3d 70 52 65 61 64 65 72 2d 3e 69  or(jj=pReader->i
d220: 53 74 61 72 74 42 6c 6f 63 6b 3b 20 6a 6a 3c 3d  StartBlock; jj<=
d230: 70 52 65 61 64 65 72 2d 3e 69 4c 65 61 66 45 6e  pReader->iLeafEn
d240: 64 42 6c 6f 63 6b 3b 20 6a 6a 2b 2b 29 7b 0a 20  dBlock; jj++){. 
d250: 20 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62         int nBlob
d260: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
d270: 71 6c 69 74 65 33 46 74 73 33 52 65 61 64 42 6c  qlite3Fts3ReadBl
d280: 6f 63 6b 28 70 2c 20 6a 6a 2c 20 30 2c 20 26 6e  ock(p, jj, 0, &n
d290: 42 6c 6f 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  Blob, 0);.      
d2a0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d2b0: 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  _OK ) break;.   
d2c0: 20 20 20 20 20 69 66 28 20 28 6e 42 6c 6f 62 2b       if( (nBlob+
d2d0: 33 35 29 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20  35)>pgsz ){.    
d2e0: 20 20 20 20 20 20 6e 4f 76 66 6c 20 2b 3d 20 28        nOvfl += (
d2f0: 6e 42 6c 6f 62 20 2b 20 33 34 29 2f 70 67 73 7a  nBlob + 34)/pgsz
d300: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d310: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
d320: 2a 70 6e 4f 76 66 6c 20 3d 20 6e 4f 76 66 6c 3b  *pnOvfl = nOvfl;
d330: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d340: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
d350: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f  allocations asso
d360: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
d370: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
d380: 61 73 20 74 68 65 20 0a 2a 2a 20 73 65 63 6f 6e  as the .** secon
d390: 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76  d argument..*/.v
d3a0: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 33 53  oid sqlite3Fts3S
d3b0: 65 67 52 65 61 64 65 72 46 72 65 65 28 46 74 73  egReaderFree(Fts
d3c0: 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 65 61  3SegReader *pRea
d3d0: 64 65 72 29 7b 0a 20 20 69 66 28 20 70 52 65 61  der){.  if( pRea
d3e0: 64 65 72 20 29 7b 0a 20 20 20 20 69 66 28 20 21  der ){.    if( !
d3f0: 66 74 73 33 53 65 67 52 65 61 64 65 72 49 73 50  fts3SegReaderIsP
d400: 65 6e 64 69 6e 67 28 70 52 65 61 64 65 72 29 20  ending(pReader) 
d410: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
d420: 5f 66 72 65 65 28 70 52 65 61 64 65 72 2d 3e 7a  _free(pReader->z
d430: 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Term);.    }.   
d440: 20 69 66 28 20 21 66 74 73 33 53 65 67 52 65 61   if( !fts3SegRea
d450: 64 65 72 49 73 52 6f 6f 74 4f 6e 6c 79 28 70 52  derIsRootOnly(pR
d460: 65 61 64 65 72 29 20 29 7b 0a 20 20 20 20 20 20  eader) ){.      
d470: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65  sqlite3_free(pRe
d480: 61 64 65 72 2d 3e 61 4e 6f 64 65 29 3b 0a 20 20  ader->aNode);.  
d490: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
d4a0: 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61 64  blob_close(pRead
d4b0: 65 72 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 7d 0a  er->pBlob);.  }.
d4c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
d4d0: 52 65 61 64 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Reader);.}../*.*
d4e0: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
d4f0: 20 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63   SegReader objec
d500: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
d510: 33 46 74 73 33 53 65 67 52 65 61 64 65 72 4e 65  3Fts3SegReaderNe
d520: 77 28 0a 20 20 69 6e 74 20 69 41 67 65 2c 20 20  w(.  int iAge,  
d530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d540: 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20       /* Segment 
d550: 22 61 67 65 22 2e 20 2a 2f 0a 20 20 69 6e 74 20  "age". */.  int 
d560: 62 4c 6f 6f 6b 75 70 2c 20 20 20 20 20 20 20 20  bLookup,        
d570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
d580: 72 75 65 20 66 6f 72 20 61 20 6c 6f 6f 6b 75 70  rue for a lookup
d590: 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 71 6c 69 74   only */.  sqlit
d5a0: 65 33 5f 69 6e 74 36 34 20 69 53 74 61 72 74 4c  e3_int64 iStartL
d5b0: 65 61 66 2c 20 20 20 20 20 20 20 2f 2a 20 46 69  eaf,       /* Fi
d5c0: 72 73 74 20 6c 65 61 66 20 74 6f 20 74 72 61 76  rst leaf to trav
d5d0: 65 72 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  erse */.  sqlite
d5e0: 33 5f 69 6e 74 36 34 20 69 45 6e 64 4c 65 61 66  3_int64 iEndLeaf
d5f0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e  ,         /* Fin
d600: 61 6c 20 6c 65 61 66 20 74 6f 20 74 72 61 76 65  al leaf to trave
d610: 72 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rse */.  sqlite3
d620: 5f 69 6e 74 36 34 20 69 45 6e 64 42 6c 6f 63 6b  _int64 iEndBlock
d630: 2c 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 61  ,        /* Fina
d640: 6c 20 62 6c 6f 63 6b 20 6f 66 20 73 65 67 6d 65  l block of segme
d650: 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nt */.  const ch
d660: 61 72 20 2a 7a 52 6f 6f 74 2c 20 20 20 20 20 20  ar *zRoot,      
d670: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
d680: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 72 6f 6f  r containing roo
d690: 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  t node */.  int 
d6a0: 6e 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20  nRoot,          
d6b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
d6c0: 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 63 6f  ize of buffer co
d6d0: 6e 74 61 69 6e 69 6e 67 20 72 6f 6f 74 20 6e 6f  ntaining root no
d6e0: 64 65 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 52  de */.  Fts3SegR
d6f0: 65 61 64 65 72 20 2a 2a 70 70 52 65 61 64 65 72  eader **ppReader
d700: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
d710: 41 6c 6c 6f 63 61 74 65 64 20 46 74 73 33 53 65  Allocated Fts3Se
d720: 67 52 65 61 64 65 72 20 2a 2f 0a 29 7b 0a 20 20  gReader */.){.  
d730: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70  Fts3SegReader *p
d740: 52 65 61 64 65 72 3b 20 20 20 20 20 20 20 20 20  Reader;         
d750: 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  /* Newly allocat
d760: 65 64 20 53 65 67 52 65 61 64 65 72 20 6f 62 6a  ed SegReader obj
d770: 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ect */.  int nEx
d780: 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tra = 0;        
d790: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
d7a0: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 65  s to allocate se
d7b0: 67 6d 65 6e 74 20 72 6f 6f 74 20 6e 6f 64 65 20  gment root node 
d7c0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 53  */..  assert( iS
d7d0: 74 61 72 74 4c 65 61 66 3c 3d 69 45 6e 64 4c 65  tartLeaf<=iEndLe
d7e0: 61 66 20 29 3b 0a 20 20 69 66 28 20 69 53 74 61  af );.  if( iSta
d7f0: 72 74 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20  rtLeaf==0 ){.   
d800: 20 6e 45 78 74 72 61 20 3d 20 6e 52 6f 6f 74 20   nExtra = nRoot 
d810: 2b 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44  + FTS3_NODE_PADD
d820: 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 61  ING;.  }..  pRea
d830: 64 65 72 20 3d 20 28 46 74 73 33 53 65 67 52 65  der = (Fts3SegRe
d840: 61 64 65 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  ader *)sqlite3_m
d850: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46 74 73  alloc(sizeof(Fts
d860: 33 53 65 67 52 65 61 64 65 72 29 20 2b 20 6e 45  3SegReader) + nE
d870: 78 74 72 61 29 3b 0a 20 20 69 66 28 20 21 70 52  xtra);.  if( !pR
d880: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 72 65 74  eader ){.    ret
d890: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
d8a0: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
d8b0: 52 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f  Reader, 0, sizeo
d8c0: 66 28 46 74 73 33 53 65 67 52 65 61 64 65 72 29  f(Fts3SegReader)
d8d0: 29 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 69 49  );.  pReader->iI
d8e0: 64 78 20 3d 20 69 41 67 65 3b 0a 20 20 70 52 65  dx = iAge;.  pRe
d8f0: 61 64 65 72 2d 3e 62 4c 6f 6f 6b 75 70 20 3d 20  ader->bLookup = 
d900: 62 4c 6f 6f 6b 75 70 21 3d 30 3b 0a 20 20 70 52  bLookup!=0;.  pR
d910: 65 61 64 65 72 2d 3e 69 53 74 61 72 74 42 6c 6f  eader->iStartBlo
d920: 63 6b 20 3d 20 69 53 74 61 72 74 4c 65 61 66 3b  ck = iStartLeaf;
d930: 0a 20 20 70 52 65 61 64 65 72 2d 3e 69 4c 65 61  .  pReader->iLea
d940: 66 45 6e 64 42 6c 6f 63 6b 20 3d 20 69 45 6e 64  fEndBlock = iEnd
d950: 4c 65 61 66 3b 0a 20 20 70 52 65 61 64 65 72 2d  Leaf;.  pReader-
d960: 3e 69 45 6e 64 42 6c 6f 63 6b 20 3d 20 69 45 6e  >iEndBlock = iEn
d970: 64 42 6c 6f 63 6b 3b 0a 0a 20 20 69 66 28 20 6e  dBlock;..  if( n
d980: 45 78 74 72 61 20 29 7b 0a 20 20 20 20 2f 2a 20  Extra ){.    /* 
d990: 54 68 65 20 65 6e 74 69 72 65 20 73 65 67 6d 65  The entire segme
d9a0: 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  nt is stored in 
d9b0: 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 2a  the root node. *
d9c0: 2f 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e 61  /.    pReader->a
d9d0: 4e 6f 64 65 20 3d 20 28 63 68 61 72 20 2a 29 26  Node = (char *)&
d9e0: 70 52 65 61 64 65 72 5b 31 5d 3b 0a 20 20 20 20  pReader[1];.    
d9f0: 70 52 65 61 64 65 72 2d 3e 72 6f 6f 74 4f 6e 6c  pReader->rootOnl
da00: 79 20 3d 20 31 3b 0a 20 20 20 20 70 52 65 61 64  y = 1;.    pRead
da10: 65 72 2d 3e 6e 4e 6f 64 65 20 3d 20 6e 52 6f 6f  er->nNode = nRoo
da20: 74 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 52  t;.    memcpy(pR
da30: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 2c 20 7a 52  eader->aNode, zR
da40: 6f 6f 74 2c 20 6e 52 6f 6f 74 29 3b 0a 20 20 20  oot, nRoot);.   
da50: 20 6d 65 6d 73 65 74 28 26 70 52 65 61 64 65 72   memset(&pReader
da60: 2d 3e 61 4e 6f 64 65 5b 6e 52 6f 6f 74 5d 2c 20  ->aNode[nRoot], 
da70: 30 2c 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44  0, FTS3_NODE_PAD
da80: 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DING);.  }else{.
da90: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 69 43 75      pReader->iCu
daa0: 72 72 65 6e 74 42 6c 6f 63 6b 20 3d 20 69 53 74  rrentBlock = iSt
dab0: 61 72 74 4c 65 61 66 2d 31 3b 0a 20 20 7d 0a 20  artLeaf-1;.  }. 
dac0: 20 2a 70 70 52 65 61 64 65 72 20 3d 20 70 52 65   *ppReader = pRe
dad0: 61 64 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53  ader;.  return S
dae0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
daf0: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63 6f 6d  ** This is a com
db00: 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
db10: 20 75 73 65 64 20 61 73 20 61 20 71 73 6f 72 74   used as a qsort
db20: 28 29 20 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e  () callback when
db30: 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 61 6e 20 61   sorting.** an a
db40: 72 72 61 79 20 6f 66 20 70 65 6e 64 69 6e 67 20  rray of pending 
db50: 74 65 72 6d 73 20 62 79 20 74 65 72 6d 2e 20 54  terms by term. T
db60: 68 69 73 20 6f 63 63 75 72 73 20 61 73 20 70 61  his occurs as pa
db70: 72 74 20 6f 66 20 66 6c 75 73 68 69 6e 67 0a 2a  rt of flushing.*
db80: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * the contents o
db90: 66 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65  f the pending-te
dba0: 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65 20 74  rms hash table t
dbb0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  o the database..
dbc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
dbd0: 4c 49 54 45 5f 43 44 45 43 4c 20 66 74 73 33 43  LITE_CDECL fts3C
dbe0: 6f 6d 70 61 72 65 45 6c 65 6d 42 79 54 65 72 6d  ompareElemByTerm
dbf0: 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  (.  const void *
dc00: 6c 68 73 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69  lhs,.  const voi
dc10: 64 20 2a 72 68 73 0a 29 7b 0a 20 20 63 68 61 72  d *rhs.){.  char
dc20: 20 2a 7a 31 20 3d 20 66 74 73 33 48 61 73 68 4b   *z1 = fts3HashK
dc30: 65 79 28 2a 28 46 74 73 33 48 61 73 68 45 6c 65  ey(*(Fts3HashEle
dc40: 6d 20 2a 2a 29 6c 68 73 29 3b 0a 20 20 63 68 61  m **)lhs);.  cha
dc50: 72 20 2a 7a 32 20 3d 20 66 74 73 33 48 61 73 68  r *z2 = fts3Hash
dc60: 4b 65 79 28 2a 28 46 74 73 33 48 61 73 68 45 6c  Key(*(Fts3HashEl
dc70: 65 6d 20 2a 2a 29 72 68 73 29 3b 0a 20 20 69 6e  em **)rhs);.  in
dc80: 74 20 6e 31 20 3d 20 66 74 73 33 48 61 73 68 4b  t n1 = fts3HashK
dc90: 65 79 73 69 7a 65 28 2a 28 46 74 73 33 48 61 73  eysize(*(Fts3Has
dca0: 68 45 6c 65 6d 20 2a 2a 29 6c 68 73 29 3b 0a 20  hElem **)lhs);. 
dcb0: 20 69 6e 74 20 6e 32 20 3d 20 66 74 73 33 48 61   int n2 = fts3Ha
dcc0: 73 68 4b 65 79 73 69 7a 65 28 2a 28 46 74 73 33  shKeysize(*(Fts3
dcd0: 48 61 73 68 45 6c 65 6d 20 2a 2a 29 72 68 73 29  HashElem **)rhs)
dce0: 3b 0a 0a 20 20 69 6e 74 20 6e 20 3d 20 28 6e 31  ;..  int n = (n1
dcf0: 3c 6e 32 20 3f 20 6e 31 20 3a 20 6e 32 29 3b 0a  <n2 ? n1 : n2);.
dd00: 20 20 69 6e 74 20 63 20 3d 20 6d 65 6d 63 6d 70    int c = memcmp
dd10: 28 7a 31 2c 20 7a 32 2c 20 6e 29 3b 0a 20 20 69  (z1, z2, n);.  i
dd20: 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 63  f( c==0 ){.    c
dd30: 20 3d 20 6e 31 20 2d 20 6e 32 3b 0a 20 20 7d 0a   = n1 - n2;.  }.
dd40: 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f    return c;.}../
dd50: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
dd60: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c  on is used to al
dd70: 6c 6f 63 61 74 65 20 61 6e 20 46 74 73 33 53 65  locate an Fts3Se
dd80: 67 52 65 61 64 65 72 20 74 68 61 74 20 69 74 65  gReader that ite
dd90: 72 61 74 65 73 20 74 68 72 6f 75 67 68 0a 2a 2a  rates through.**
dda0: 20 61 20 73 75 62 73 65 74 20 6f 66 20 74 68 65   a subset of the
ddb0: 20 74 65 72 6d 73 20 73 74 6f 72 65 64 20 69 6e   terms stored in
ddc0: 20 74 68 65 20 46 74 73 33 54 61 62 6c 65 2e 70   the Fts3Table.p
ddd0: 65 6e 64 69 6e 67 54 65 72 6d 73 20 61 72 72 61  endingTerms arra
dde0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
ddf0: 69 73 50 72 65 66 69 78 49 74 65 72 20 70 61 72  isPrefixIter par
de00: 61 6d 65 74 65 72 20 69 73 20 7a 65 72 6f 2c 20  ameter is zero, 
de10: 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65  then the returne
de20: 64 20 53 65 67 52 65 61 64 65 72 20 69 74 65 72  d SegReader iter
de30: 61 74 65 73 0a 2a 2a 20 74 68 72 6f 75 67 68 20  ates.** through 
de40: 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65  each term in the
de50: 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 74   pending-terms t
de60: 61 62 6c 65 2e 20 4f 72 2c 20 69 66 20 69 73 50  able. Or, if isP
de70: 72 65 66 69 78 49 74 65 72 20 69 73 0a 2a 2a 20  refixIter is.** 
de80: 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 74 65  non-zero, it ite
de90: 72 61 74 65 73 20 74 68 72 6f 75 67 68 20 65 61  rates through ea
dea0: 63 68 20 74 65 72 6d 20 61 6e 64 20 69 74 73 20  ch term and its 
deb0: 70 72 65 66 69 78 65 73 2e 20 46 6f 72 20 65 78  prefixes. For ex
dec0: 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74 68 65  ample, if.** the
ded0: 20 70 65 6e 64 69 6e 67 20 74 65 72 6d 73 20 68   pending terms h
dee0: 61 73 68 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  ash table contai
def0: 6e 73 20 74 68 65 20 74 65 72 6d 73 20 22 73 71  ns the terms "sq
df00: 6c 69 74 65 22 2c 20 22 6d 79 73 71 6c 22 20 61  lite", "mysql" a
df10: 6e 64 0a 2a 2a 20 22 66 69 72 65 62 69 72 64 22  nd.** "firebird"
df20: 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65 72 61  , then the itera
df30: 74 6f 72 20 76 69 73 69 74 73 20 74 68 65 20 66  tor visits the f
df40: 6f 6c 6c 6f 77 69 6e 67 20 27 74 65 72 6d 73 27  ollowing 'terms'
df50: 20 28 69 6e 20 74 68 65 20 6f 72 64 65 72 0a 2a   (in the order.*
df60: 2a 20 73 68 6f 77 6e 29 3a 0a 2a 2a 0a 2a 2a 20  * shown):.**.** 
df70: 20 20 66 20 66 69 20 66 69 72 20 66 69 72 65 20    f fi fir fire 
df80: 66 69 72 65 62 20 66 69 72 65 62 69 20 66 69 72  fireb firebi fir
df90: 65 62 69 72 20 66 69 72 65 62 69 72 64 0a 2a 2a  ebir firebird.**
dfa0: 20 20 20 6d 20 6d 79 20 6d 79 73 20 6d 79 73 71     m my mys mysq
dfb0: 20 6d 79 73 71 6c 0a 2a 2a 20 20 20 73 20 73 71   mysql.**   s sq
dfc0: 20 73 71 6c 20 73 71 6c 69 20 73 71 6c 69 74 20   sql sqli sqlit 
dfd0: 73 71 6c 69 74 65 0a 2a 2a 0a 2a 2a 20 57 68 65  sqlite.**.** Whe
dfe0: 72 65 61 73 20 69 66 20 69 73 50 72 65 66 69 78  reas if isPrefix
dff0: 49 74 65 72 20 69 73 20 7a 65 72 6f 2c 20 74 68  Iter is zero, th
e000: 65 20 74 65 72 6d 73 20 76 69 73 69 74 65 64 20  e terms visited 
e010: 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 66 69 72  are:.**.**   fir
e020: 65 62 69 72 64 20 6d 79 73 71 6c 20 73 71 6c 69  ebird mysql sqli
e030: 74 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  te.*/.int sqlite
e040: 33 46 74 73 33 53 65 67 52 65 61 64 65 72 50 65  3Fts3SegReaderPe
e050: 6e 64 69 6e 67 28 0a 20 20 46 74 73 33 54 61 62  nding(.  Fts3Tab
e060: 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
e070: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74           /* Virt
e080: 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  ual table handle
e090: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 78   */.  int iIndex
e0a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e0b0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66        /* Index f
e0c0: 6f 72 20 70 2d 3e 61 49 6e 64 65 78 20 2a 2f 0a  or p->aIndex */.
e0d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
e0e0: 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
e0f0: 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 61    /* Term to sea
e100: 72 63 68 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  rch for */.  int
e110: 20 6e 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20   nTerm,         
e120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e130: 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 7a  Size of buffer z
e140: 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 50  Term */.  int bP
e150: 72 65 66 69 78 2c 20 20 20 20 20 20 20 20 20 20  refix,          
e160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
e170: 65 20 66 6f 72 20 61 20 70 72 65 66 69 78 20 69  e for a prefix i
e180: 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 46 74 73  terator */.  Fts
e190: 33 53 65 67 52 65 61 64 65 72 20 2a 2a 70 70 52  3SegReader **ppR
e1a0: 65 61 64 65 72 20 20 20 20 20 20 20 20 2f 2a 20  eader        /* 
e1b0: 4f 55 54 3a 20 53 65 67 52 65 61 64 65 72 20 66  OUT: SegReader f
e1c0: 6f 72 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73  or pending-terms
e1d0: 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 53 65 67   */.){.  Fts3Seg
e1e0: 52 65 61 64 65 72 20 2a 70 52 65 61 64 65 72 20  Reader *pReader 
e1f0: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 74 73 33  = 0;     /* Fts3
e200: 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74  SegReader object
e210: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
e220: 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 70 45  Fts3HashElem *pE
e230: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e240: 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
e250: 61 62 6c 65 20 2a 2f 0a 20 20 46 74 73 33 48 61  able */.  Fts3Ha
e260: 73 68 45 6c 65 6d 20 2a 2a 61 45 6c 65 6d 20 3d  shElem **aElem =
e270: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 72   0;       /* Arr
e280: 61 79 20 6f 66 20 74 65 72 6d 20 68 61 73 68 20  ay of term hash 
e290: 65 6e 74 72 69 65 73 20 74 6f 20 73 63 61 6e 20  entries to scan 
e2a0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 6c 65 6d 20 3d  */.  int nElem =
e2b0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
e2c0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
e2d0: 61 72 72 61 79 20 61 74 20 61 45 6c 65 6d 20 2a  array at aElem *
e2e0: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
e2f0: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
e300: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
e310: 64 65 20 2a 2f 0a 20 20 46 74 73 33 48 61 73 68  de */.  Fts3Hash
e320: 20 2a 70 48 61 73 68 3b 0a 0a 20 20 70 48 61 73   *pHash;..  pHas
e330: 68 20 3d 20 26 70 2d 3e 61 49 6e 64 65 78 5b 69  h = &p->aIndex[i
e340: 49 6e 64 65 78 5d 2e 68 50 65 6e 64 69 6e 67 3b  Index].hPending;
e350: 0a 20 20 69 66 28 20 62 50 72 65 66 69 78 20 29  .  if( bPrefix )
e360: 7b 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63  {.    int nAlloc
e370: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
e380: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
e390: 6c 6c 6f 63 61 74 65 64 20 61 72 72 61 79 20 61  llocated array a
e3a0: 74 20 61 45 6c 65 6d 20 2a 2f 0a 0a 20 20 20 20  t aElem */..    
e3b0: 66 6f 72 28 70 45 3d 66 74 73 33 48 61 73 68 46  for(pE=fts3HashF
e3c0: 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 3b  irst(pHash); pE;
e3d0: 20 70 45 3d 66 74 73 33 48 61 73 68 4e 65 78 74   pE=fts3HashNext
e3e0: 28 70 45 29 29 7b 0a 20 20 20 20 20 20 63 68 61  (pE)){.      cha
e3f0: 72 20 2a 7a 4b 65 79 20 3d 20 28 63 68 61 72 20  r *zKey = (char 
e400: 2a 29 66 74 73 33 48 61 73 68 4b 65 79 28 70 45  *)fts3HashKey(pE
e410: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65  );.      int nKe
e420: 79 20 3d 20 66 74 73 33 48 61 73 68 4b 65 79 73  y = fts3HashKeys
e430: 69 7a 65 28 70 45 29 3b 0a 20 20 20 20 20 20 69  ize(pE);.      i
e440: 66 28 20 6e 54 65 72 6d 3d 3d 30 20 7c 7c 20 28  f( nTerm==0 || (
e450: 6e 4b 65 79 3e 3d 6e 54 65 72 6d 20 26 26 20 30  nKey>=nTerm && 0
e460: 3d 3d 6d 65 6d 63 6d 70 28 7a 4b 65 79 2c 20 7a  ==memcmp(zKey, z
e470: 54 65 72 6d 2c 20 6e 54 65 72 6d 29 29 20 29 7b  Term, nTerm)) ){
e480: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 45 6c  .        if( nEl
e490: 65 6d 3d 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  em==nAlloc ){.  
e4a0: 20 20 20 20 20 20 20 20 46 74 73 33 48 61 73 68          Fts3Hash
e4b0: 45 6c 65 6d 20 2a 2a 61 45 6c 65 6d 32 3b 0a 20  Elem **aElem2;. 
e4c0: 20 20 20 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20           nAlloc 
e4d0: 2b 3d 20 31 36 3b 0a 20 20 20 20 20 20 20 20 20  += 16;.         
e4e0: 20 61 45 6c 65 6d 32 20 3d 20 28 46 74 73 33 48   aElem2 = (Fts3H
e4f0: 61 73 68 45 6c 65 6d 20 2a 2a 29 73 71 6c 69 74  ashElem **)sqlit
e500: 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20  e3_realloc(.    
e510: 20 20 20 20 20 20 20 20 20 20 61 45 6c 65 6d 2c            aElem,
e520: 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 46   nAlloc*sizeof(F
e530: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 29 0a 20  ts3HashElem *). 
e540: 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
e550: 20 20 20 20 20 20 69 66 28 20 21 61 45 6c 65 6d        if( !aElem
e560: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
e570: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
e580: 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM;.            
e590: 6e 45 6c 65 6d 20 3d 20 30 3b 0a 20 20 20 20 20  nElem = 0;.     
e5a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e5b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e5c0: 20 20 20 20 61 45 6c 65 6d 20 3d 20 61 45 6c 65      aElem = aEle
e5d0: 6d 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  m2;.        }.. 
e5e0: 20 20 20 20 20 20 20 61 45 6c 65 6d 5b 6e 45 6c         aElem[nEl
e5f0: 65 6d 2b 2b 5d 20 3d 20 70 45 3b 0a 20 20 20 20  em++] = pE;.    
e600: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
e610: 2a 20 49 66 20 6d 6f 72 65 20 74 68 61 6e 20 6f  * If more than o
e620: 6e 65 20 74 65 72 6d 20 6d 61 74 63 68 65 73 20  ne term matches 
e630: 74 68 65 20 70 72 65 66 69 78 2c 20 73 6f 72 74  the prefix, sort
e640: 20 74 68 65 20 46 74 73 33 48 61 73 68 45 6c 65   the Fts3HashEle
e650: 6d 0a 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 73  m.    ** objects
e660: 20 69 6e 20 74 65 72 6d 20 6f 72 64 65 72 20 75   in term order u
e670: 73 69 6e 67 20 71 73 6f 72 74 28 29 2e 20 54 68  sing qsort(). Th
e680: 69 73 20 75 73 65 73 20 74 68 65 20 73 61 6d 65  is uses the same
e690: 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20   comparison.    
e6a0: 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 61 73 20 69  ** callback as i
e6b0: 73 20 75 73 65 64 20 77 68 65 6e 20 66 6c 75 73  s used when flus
e6c0: 68 69 6e 67 20 74 65 72 6d 73 20 74 6f 20 64 69  hing terms to di
e6d0: 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  sk..    */.    i
e6e0: 66 28 20 6e 45 6c 65 6d 3e 31 20 29 7b 0a 20 20  f( nElem>1 ){.  
e6f0: 20 20 20 20 71 73 6f 72 74 28 61 45 6c 65 6d 2c      qsort(aElem,
e700: 20 6e 45 6c 65 6d 2c 20 73 69 7a 65 6f 66 28 46   nElem, sizeof(F
e710: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 29 2c 20  ts3HashElem *), 
e720: 66 74 73 33 43 6f 6d 70 61 72 65 45 6c 65 6d 42  fts3CompareElemB
e730: 79 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20  yTerm);.    }.. 
e740: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
e750: 68 65 20 71 75 65 72 79 20 69 73 20 61 20 73 69  he query is a si
e760: 6d 70 6c 65 20 74 65 72 6d 20 6c 6f 6f 6b 75 70  mple term lookup
e770: 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 74   that matches at
e780: 20 6d 6f 73 74 20 6f 6e 65 20 74 65 72 6d 20 69   most one term i
e790: 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64  n.    ** the ind
e7a0: 65 78 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 20  ex. All that is 
e7b0: 72 65 71 75 69 72 65 64 20 69 73 20 61 20 73 74  required is a st
e7c0: 72 61 69 67 68 74 20 68 61 73 68 2d 6c 6f 6f 6b  raight hash-look
e7d0: 75 70 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  up. .    **.    
e7e0: 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 73  ** Because the s
e7f0: 74 61 63 6b 20 61 64 64 72 65 73 73 20 6f 66 20  tack address of 
e800: 70 45 20 6d 61 79 20 62 65 20 61 63 63 65 73 73  pE may be access
e810: 65 64 20 76 69 61 20 74 68 65 20 61 45 6c 65 6d  ed via the aElem
e820: 20 70 6f 69 6e 74 65 72 0a 20 20 20 20 2a 2a 20   pointer.    ** 
e830: 62 65 6c 6f 77 2c 20 74 68 65 20 22 46 74 73 33  below, the "Fts3
e840: 48 61 73 68 45 6c 65 6d 20 2a 70 45 22 20 6d 75  HashElem *pE" mu
e850: 73 74 20 62 65 20 64 65 63 6c 61 72 65 64 20 73  st be declared s
e860: 6f 20 74 68 61 74 20 69 74 20 69 73 20 76 61 6c  o that it is val
e870: 69 64 0a 20 20 20 20 2a 2a 20 77 69 74 68 69 6e  id.    ** within
e880: 20 74 68 69 73 20 65 6e 74 69 72 65 20 66 75 6e   this entire fun
e890: 63 74 69 6f 6e 2c 20 6e 6f 74 20 6a 75 73 74 20  ction, not just 
e8a0: 74 68 69 73 20 22 65 6c 73 65 7b 2e 2e 2e 7d 22  this "else{...}"
e8b0: 20 62 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20   block..    */. 
e8c0: 20 20 20 70 45 20 3d 20 66 74 73 33 48 61 73 68     pE = fts3Hash
e8d0: 46 69 6e 64 45 6c 65 6d 28 70 48 61 73 68 2c 20  FindElem(pHash, 
e8e0: 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  zTerm, nTerm);. 
e8f0: 20 20 20 69 66 28 20 70 45 20 29 7b 0a 20 20 20     if( pE ){.   
e900: 20 20 20 61 45 6c 65 6d 20 3d 20 26 70 45 3b 0a     aElem = &pE;.
e910: 20 20 20 20 20 20 6e 45 6c 65 6d 20 3d 20 31 3b        nElem = 1;
e920: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
e930: 28 20 6e 45 6c 65 6d 3e 30 20 29 7b 0a 20 20 20  ( nElem>0 ){.   
e940: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a   int nByte = siz
e950: 65 6f 66 28 46 74 73 33 53 65 67 52 65 61 64 65  eof(Fts3SegReade
e960: 72 29 20 2b 20 28 6e 45 6c 65 6d 2b 31 29 2a 73  r) + (nElem+1)*s
e970: 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68 45 6c  izeof(Fts3HashEl
e980: 65 6d 20 2a 29 3b 0a 20 20 20 20 70 52 65 61 64  em *);.    pRead
e990: 65 72 20 3d 20 28 46 74 73 33 53 65 67 52 65 61  er = (Fts3SegRea
e9a0: 64 65 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  der *)sqlite3_ma
e9b0: 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 20  lloc(nByte);.   
e9c0: 20 69 66 28 20 21 70 52 65 61 64 65 72 20 29 7b   if( !pReader ){
e9d0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
e9e0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
e9f0: 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lse{.      memse
ea00: 74 28 70 52 65 61 64 65 72 2c 20 30 2c 20 6e 42  t(pReader, 0, nB
ea10: 79 74 65 29 3b 0a 20 20 20 20 20 20 70 52 65 61  yte);.      pRea
ea20: 64 65 72 2d 3e 69 49 64 78 20 3d 20 30 78 37 46  der->iIdx = 0x7F
ea30: 46 46 46 46 46 46 3b 0a 20 20 20 20 20 20 70 52  FFFFFF;.      pR
ea40: 65 61 64 65 72 2d 3e 70 70 4e 65 78 74 45 6c 65  eader->ppNextEle
ea50: 6d 20 3d 20 28 46 74 73 33 48 61 73 68 45 6c 65  m = (Fts3HashEle
ea60: 6d 20 2a 2a 29 26 70 52 65 61 64 65 72 5b 31 5d  m **)&pReader[1]
ea70: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
ea80: 52 65 61 64 65 72 2d 3e 70 70 4e 65 78 74 45 6c  Reader->ppNextEl
ea90: 65 6d 2c 20 61 45 6c 65 6d 2c 20 6e 45 6c 65 6d  em, aElem, nElem
eaa0: 2a 73 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68  *sizeof(Fts3Hash
eab0: 45 6c 65 6d 20 2a 29 29 3b 0a 20 20 20 20 7d 0a  Elem *));.    }.
eac0: 20 20 7d 0a 0a 20 20 69 66 28 20 62 50 72 65 66    }..  if( bPref
ead0: 69 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ix ){.    sqlite
eae0: 33 5f 66 72 65 65 28 61 45 6c 65 6d 29 3b 0a 20  3_free(aElem);. 
eaf0: 20 7d 0a 20 20 2a 70 70 52 65 61 64 65 72 20 3d   }.  *ppReader =
eb00: 20 70 52 65 61 64 65 72 3b 0a 20 20 72 65 74 75   pReader;.  retu
eb10: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
eb20: 43 6f 6d 70 61 72 65 20 74 68 65 20 65 6e 74 72  Compare the entr
eb30: 69 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ies pointed to b
eb40: 79 20 74 77 6f 20 46 74 73 33 53 65 67 52 65 61  y two Fts3SegRea
eb50: 64 65 72 20 73 74 72 75 63 74 75 72 65 73 2e 20  der structures. 
eb60: 0a 2a 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69  .** Comparison i
eb70: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
eb80: 0a 2a 2a 20 20 20 31 29 20 45 4f 46 20 69 73 20  .**   1) EOF is 
eb90: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e 6f 74  greater than not
eba0: 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29   EOF..**.**   2)
ebb0: 20 54 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   The current ter
ebc0: 6d 73 20 28 69 66 20 61 6e 79 29 20 61 72 65 20  ms (if any) are 
ebd0: 63 6f 6d 70 61 72 65 64 20 75 73 69 6e 67 20 6d  compared using m
ebe0: 65 6d 63 6d 70 28 29 2e 20 49 66 20 6f 6e 65 0a  emcmp(). If one.
ebf0: 2a 2a 20 20 20 20 20 20 74 65 72 6d 20 69 73 20  **      term is 
ec00: 61 20 70 72 65 66 69 78 20 6f 66 20 61 6e 6f 74  a prefix of anot
ec10: 68 65 72 2c 20 74 68 65 20 6c 6f 6e 67 65 72 20  her, the longer 
ec20: 74 65 72 6d 20 69 73 20 63 6f 6e 73 69 64 65 72  term is consider
ec30: 65 64 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c  ed the.**      l
ec40: 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 33  arger..**.**   3
ec50: 29 20 42 79 20 73 65 67 6d 65 6e 74 20 61 67 65  ) By segment age
ec60: 2e 20 41 6e 20 6f 6c 64 65 72 20 73 65 67 6d 65  . An older segme
ec70: 6e 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  nt is considered
ec80: 20 6c 61 72 67 65 72 2e 0a 2a 2f 0a 73 74 61 74   larger..*/.stat
ec90: 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65  ic int fts3SegRe
eca0: 61 64 65 72 43 6d 70 28 46 74 73 33 53 65 67 52  aderCmp(Fts3SegR
ecb0: 65 61 64 65 72 20 2a 70 4c 68 73 2c 20 46 74 73  eader *pLhs, Fts
ecc0: 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 68 73  3SegReader *pRhs
ecd0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
ece0: 66 28 20 70 4c 68 73 2d 3e 61 4e 6f 64 65 20 26  f( pLhs->aNode &
ecf0: 26 20 70 52 68 73 2d 3e 61 4e 6f 64 65 20 29 7b  & pRhs->aNode ){
ed00: 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 70  .    int rc2 = p
ed10: 4c 68 73 2d 3e 6e 54 65 72 6d 20 2d 20 70 52 68  Lhs->nTerm - pRh
ed20: 73 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 69 66  s->nTerm;.    if
ed30: 28 20 72 63 32 3c 30 20 29 7b 0a 20 20 20 20 20  ( rc2<0 ){.     
ed40: 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 68   rc = memcmp(pLh
ed50: 73 2d 3e 7a 54 65 72 6d 2c 20 70 52 68 73 2d 3e  s->zTerm, pRhs->
ed60: 7a 54 65 72 6d 2c 20 70 4c 68 73 2d 3e 6e 54 65  zTerm, pLhs->nTe
ed70: 72 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rm);.    }else{.
ed80: 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d        rc = memcm
ed90: 70 28 70 4c 68 73 2d 3e 7a 54 65 72 6d 2c 20 70  p(pLhs->zTerm, p
eda0: 52 68 73 2d 3e 7a 54 65 72 6d 2c 20 70 52 68 73  Rhs->zTerm, pRhs
edb0: 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a  ->nTerm);.    }.
edc0: 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b      if( rc==0 ){
edd0: 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
ede0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
edf0: 20 20 20 20 72 63 20 3d 20 28 70 4c 68 73 2d 3e      rc = (pLhs->
ee00: 61 4e 6f 64 65 3d 3d 30 29 20 2d 20 28 70 52 68  aNode==0) - (pRh
ee10: 73 2d 3e 61 4e 6f 64 65 3d 3d 30 29 3b 0a 20 20  s->aNode==0);.  
ee20: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  }.  if( rc==0 ){
ee30: 0a 20 20 20 20 72 63 20 3d 20 70 52 68 73 2d 3e  .    rc = pRhs->
ee40: 69 49 64 78 20 2d 20 70 4c 68 73 2d 3e 69 49 64  iIdx - pLhs->iId
ee50: 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  x;.  }.  assert(
ee60: 20 72 63 21 3d 30 20 29 3b 0a 20 20 72 65 74 75   rc!=0 );.  retu
ee70: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
ee80: 41 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6d 70  A different comp
ee90: 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
eea0: 66 6f 72 20 53 65 67 52 65 61 64 65 72 20 73 74  for SegReader st
eeb0: 72 75 63 74 75 72 65 73 2e 20 49 6e 20 74 68 69  ructures. In thi
eec0: 73 0a 2a 2a 20 76 65 72 73 69 6f 6e 2c 20 69 74  s.** version, it
eed0: 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
eee0: 20 65 61 63 68 20 53 65 67 52 65 61 64 65 72 20   each SegReader 
eef0: 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74  points to an ent
ef00: 72 79 20 69 6e 0a 2a 2a 20 61 20 64 6f 63 6c 69  ry in.** a docli
ef10: 73 74 20 66 6f 72 20 69 64 65 6e 74 69 63 61 6c  st for identical
ef20: 20 74 65 72 6d 73 2e 20 43 6f 6d 70 61 72 69 73   terms. Comparis
ef30: 6f 6e 20 69 73 20 6d 61 64 65 20 61 73 20 66 6f  on is made as fo
ef40: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  llows:.**.**   1
ef50: 29 20 45 4f 46 20 28 65 6e 64 20 6f 66 20 64 6f  ) EOF (end of do
ef60: 63 6c 69 73 74 20 69 6e 20 74 68 69 73 20 63 61  clist in this ca
ef70: 73 65 29 20 69 73 20 67 72 65 61 74 65 72 20 74  se) is greater t
ef80: 68 61 6e 20 6e 6f 74 20 45 4f 46 2e 0a 2a 2a 0a  han not EOF..**.
ef90: 2a 2a 20 20 20 32 29 20 42 79 20 63 75 72 72 65  **   2) By curre
efa0: 6e 74 20 64 6f 63 69 64 2e 0a 2a 2a 0a 2a 2a 20  nt docid..**.** 
efb0: 20 20 33 29 20 42 79 20 73 65 67 6d 65 6e 74 20    3) By segment 
efc0: 61 67 65 2e 20 41 6e 20 6f 6c 64 65 72 20 73 65  age. An older se
efd0: 67 6d 65 6e 74 20 69 73 20 63 6f 6e 73 69 64 65  gment is conside
efe0: 72 65 64 20 6c 61 72 67 65 72 2e 0a 2a 2f 0a 73  red larger..*/.s
eff0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65  tatic int fts3Se
f000: 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d  gReaderDoclistCm
f010: 70 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20  p(Fts3SegReader 
f020: 2a 70 4c 68 73 2c 20 46 74 73 33 53 65 67 52 65  *pLhs, Fts3SegRe
f030: 61 64 65 72 20 2a 70 52 68 73 29 7b 0a 20 20 69  ader *pRhs){.  i
f040: 6e 74 20 72 63 20 3d 20 28 70 4c 68 73 2d 3e 70  nt rc = (pLhs->p
f050: 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30 29 2d 28  OffsetList==0)-(
f060: 70 52 68 73 2d 3e 70 4f 66 66 73 65 74 4c 69 73  pRhs->pOffsetLis
f070: 74 3d 3d 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  t==0);.  if( rc=
f080: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4c  =0 ){.    if( pL
f090: 68 73 2d 3e 69 44 6f 63 69 64 3d 3d 70 52 68 73  hs->iDocid==pRhs
f0a0: 2d 3e 69 44 6f 63 69 64 20 29 7b 0a 20 20 20 20  ->iDocid ){.    
f0b0: 20 20 72 63 20 3d 20 70 52 68 73 2d 3e 69 49 64    rc = pRhs->iId
f0c0: 78 20 2d 20 70 4c 68 73 2d 3e 69 49 64 78 3b 0a  x - pLhs->iIdx;.
f0d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f0e0: 20 72 63 20 3d 20 28 70 4c 68 73 2d 3e 69 44 6f   rc = (pLhs->iDo
f0f0: 63 69 64 20 3e 20 70 52 68 73 2d 3e 69 44 6f 63  cid > pRhs->iDoc
f100: 69 64 29 20 3f 20 31 20 3a 20 2d 31 3b 0a 20 20  id) ? 1 : -1;.  
f110: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
f120: 28 20 70 4c 68 73 2d 3e 61 4e 6f 64 65 20 26 26  ( pLhs->aNode &&
f130: 20 70 52 68 73 2d 3e 61 4e 6f 64 65 20 29 3b 0a   pRhs->aNode );.
f140: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73    return rc;.}.s
f150: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65  tatic int fts3Se
f160: 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d  gReaderDoclistCm
f170: 70 52 65 76 28 46 74 73 33 53 65 67 52 65 61 64  pRev(Fts3SegRead
f180: 65 72 20 2a 70 4c 68 73 2c 20 46 74 73 33 53 65  er *pLhs, Fts3Se
f190: 67 52 65 61 64 65 72 20 2a 70 52 68 73 29 7b 0a  gReader *pRhs){.
f1a0: 20 20 69 6e 74 20 72 63 20 3d 20 28 70 4c 68 73    int rc = (pLhs
f1b0: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30  ->pOffsetList==0
f1c0: 29 2d 28 70 52 68 73 2d 3e 70 4f 66 66 73 65 74  )-(pRhs->pOffset
f1d0: 4c 69 73 74 3d 3d 30 29 3b 0a 20 20 69 66 28 20  List==0);.  if( 
f1e0: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  rc==0 ){.    if(
f1f0: 20 70 4c 68 73 2d 3e 69 44 6f 63 69 64 3d 3d 70   pLhs->iDocid==p
f200: 52 68 73 2d 3e 69 44 6f 63 69 64 20 29 7b 0a 20  Rhs->iDocid ){. 
f210: 20 20 20 20 20 72 63 20 3d 20 70 52 68 73 2d 3e       rc = pRhs->
f220: 69 49 64 78 20 2d 20 70 4c 68 73 2d 3e 69 49 64  iIdx - pLhs->iId
f230: 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  x;.    }else{.  
f240: 20 20 20 20 72 63 20 3d 20 28 70 4c 68 73 2d 3e      rc = (pLhs->
f250: 69 44 6f 63 69 64 20 3c 20 70 52 68 73 2d 3e 69  iDocid < pRhs->i
f260: 44 6f 63 69 64 29 20 3f 20 31 20 3a 20 2d 31 3b  Docid) ? 1 : -1;
f270: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
f280: 65 72 74 28 20 70 4c 68 73 2d 3e 61 4e 6f 64 65  ert( pLhs->aNode
f290: 20 26 26 20 70 52 68 73 2d 3e 61 4e 6f 64 65 20   && pRhs->aNode 
f2a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
f2b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
f2c0: 20 74 68 65 20 74 65 72 6d 20 74 68 61 74 20 74   the term that t
f2d0: 68 65 20 46 74 73 33 53 65 67 52 65 61 64 65 72  he Fts3SegReader
f2e0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
f2f0: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
f300: 6d 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  ment.** points t
f310: 6f 20 77 69 74 68 20 74 68 65 20 74 65 72 6d 20  o with the term 
f320: 73 70 65 63 69 66 69 65 64 20 62 79 20 61 72 67  specified by arg
f330: 75 6d 65 6e 74 73 20 7a 54 65 72 6d 20 61 6e 64  uments zTerm and
f340: 20 6e 54 65 72 6d 2e 20 0a 2a 2a 0a 2a 2a 20 49   nTerm. .**.** I
f350: 66 20 74 68 65 20 70 53 65 67 20 69 74 65 72 61  f the pSeg itera
f360: 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
f370: 74 20 45 4f 46 2c 20 72 65 74 75 72 6e 20 30 2e  t EOF, return 0.
f380: 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
f390: 72 6e 0a 2a 2a 20 2d 76 65 20 69 66 20 74 68 65  rn.** -ve if the
f3a0: 20 70 53 65 67 20 74 65 72 6d 20 69 73 20 6c 65   pSeg term is le
f3b0: 73 73 20 74 68 61 6e 20 7a 54 65 72 6d 2f 6e 54  ss than zTerm/nT
f3c0: 65 72 6d 2c 20 30 20 69 66 20 74 68 65 20 74 77  erm, 0 if the tw
f3d0: 6f 20 74 65 72 6d 73 20 61 72 65 0a 2a 2a 20 65  o terms are.** e
f3e0: 71 75 61 6c 2c 20 6f 72 20 2b 76 65 20 69 66 20  qual, or +ve if 
f3f0: 74 68 65 20 70 53 65 67 20 74 65 72 6d 20 69 73  the pSeg term is
f400: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 54   greater than zT
f410: 65 72 6d 2f 6e 54 65 72 6d 2e 0a 2a 2f 0a 73 74  erm/nTerm..*/.st
f420: 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67  atic int fts3Seg
f430: 52 65 61 64 65 72 54 65 72 6d 43 6d 70 28 0a 20  ReaderTermCmp(. 
f440: 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a   Fts3SegReader *
f450: 70 53 65 67 2c 20 20 20 20 20 20 20 20 20 20 20  pSeg,           
f460: 20 2f 2a 20 53 65 67 6d 65 6e 74 20 72 65 61 64   /* Segment read
f470: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  er object */.  c
f480: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
f490: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
f4a0: 2a 20 54 65 72 6d 20 74 6f 20 63 6f 6d 70 61 72  * Term to compar
f4b0: 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  e to */.  int nT
f4c0: 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  erm             
f4d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
f4e0: 65 20 6f 66 20 74 65 72 6d 20 7a 54 65 72 6d 20  e of term zTerm 
f4f0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20  in bytes */.){. 
f500: 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20   int res = 0;.  
f510: 69 66 28 20 70 53 65 67 2d 3e 61 4e 6f 64 65 20  if( pSeg->aNode 
f520: 29 7b 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d  ){.    if( pSeg-
f530: 3e 6e 54 65 72 6d 3e 6e 54 65 72 6d 20 29 7b 0a  >nTerm>nTerm ){.
f540: 20 20 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63        res = memc
f550: 6d 70 28 70 53 65 67 2d 3e 7a 54 65 72 6d 2c 20  mp(pSeg->zTerm, 
f560: 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  zTerm, nTerm);. 
f570: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f580: 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 53 65  res = memcmp(pSe
f590: 67 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65 72 6d 2c  g->zTerm, zTerm,
f5a0: 20 70 53 65 67 2d 3e 6e 54 65 72 6d 29 3b 0a 20   pSeg->nTerm);. 
f5b0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 73     }.    if( res
f5c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73  ==0 ){.      res
f5d0: 20 3d 20 70 53 65 67 2d 3e 6e 54 65 72 6d 2d 6e   = pSeg->nTerm-n
f5e0: 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Term;.    }.  }.
f5f0: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
f600: 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
f610: 61 70 53 65 67 6d 65 6e 74 20 69 73 20 61 6e 20  apSegment is an 
f620: 61 72 72 61 79 20 6f 66 20 6e 53 65 67 6d 65 6e  array of nSegmen
f630: 74 20 65 6c 65 6d 65 6e 74 73 2e 20 49 74 20 69  t elements. It i
f640: 73 20 6b 6e 6f 77 6e 20 74 68 61 74 0a 2a 2a 20  s known that.** 
f650: 74 68 65 20 66 69 6e 61 6c 20 28 6e 53 65 67 6d  the final (nSegm
f660: 65 6e 74 2d 6e 53 75 73 70 65 63 74 29 20 6d 65  ent-nSuspect) me
f670: 6d 62 65 72 73 20 61 72 65 20 61 6c 72 65 61 64  mbers are alread
f680: 79 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  y in sorted orde
f690: 72 0a 2a 2a 20 28 61 63 63 6f 72 64 69 6e 67 20  r.** (according 
f6a0: 74 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  to the compariso
f6b0: 6e 20 66 75 6e 63 74 69 6f 6e 20 70 72 6f 76 69  n function provi
f6c0: 64 65 64 29 2e 20 54 68 69 73 20 66 75 6e 63 74  ded). This funct
f6d0: 69 6f 6e 20 73 68 75 66 66 6c 65 73 0a 2a 2a 20  ion shuffles.** 
f6e0: 74 68 65 20 61 72 72 61 79 20 61 72 6f 75 6e 64  the array around
f6f0: 20 75 6e 74 69 6c 20 61 6c 6c 20 65 6e 74 72 69   until all entri
f700: 65 73 20 61 72 65 20 69 6e 20 73 6f 72 74 65 64  es are in sorted
f710: 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
f720: 63 20 76 6f 69 64 20 66 74 73 33 53 65 67 52 65  c void fts3SegRe
f730: 61 64 65 72 53 6f 72 74 28 0a 20 20 46 74 73 33  aderSort(.  Fts3
f740: 53 65 67 52 65 61 64 65 72 20 2a 2a 61 70 53 65  SegReader **apSe
f750: 67 6d 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20  gment,          
f760: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
f770: 72 61 79 20 74 6f 20 73 6f 72 74 20 65 6e 74 72  ray to sort entr
f780: 69 65 73 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20  ies of */.  int 
f790: 6e 53 65 67 6d 65 6e 74 2c 20 20 20 20 20 20 20  nSegment,       
f7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
f7c0: 7a 65 20 6f 66 20 61 70 53 65 67 6d 65 6e 74 20  ze of apSegment 
f7d0: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  array */.  int n
f7e0: 53 75 73 70 65 63 74 2c 20 20 20 20 20 20 20 20  Suspect,        
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
f810: 6f 72 74 65 64 20 65 6e 74 72 79 20 63 6f 75 6e  orted entry coun
f820: 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 6d  t */.  int (*xCm
f830: 70 29 28 46 74 73 33 53 65 67 52 65 61 64 65 72  p)(Fts3SegReader
f840: 20 2a 2c 20 46 74 73 33 53 65 67 52 65 61 64 65   *, Fts3SegReade
f850: 72 20 2a 29 20 20 2f 2a 20 43 6f 6d 70 61 72 69  r *)  /* Compari
f860: 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  son function */.
f870: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
f880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f890: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
f8a0: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20   variable */..  
f8b0: 61 73 73 65 72 74 28 20 6e 53 75 73 70 65 63 74  assert( nSuspect
f8c0: 3c 3d 6e 53 65 67 6d 65 6e 74 20 29 3b 0a 0a 20  <=nSegment );.. 
f8d0: 20 69 66 28 20 6e 53 75 73 70 65 63 74 3d 3d 6e   if( nSuspect==n
f8e0: 53 65 67 6d 65 6e 74 20 29 20 6e 53 75 73 70 65  Segment ) nSuspe
f8f0: 63 74 2d 2d 3b 0a 20 20 66 6f 72 28 69 3d 6e 53  ct--;.  for(i=nS
f900: 75 73 70 65 63 74 2d 31 3b 20 69 3e 3d 30 3b 20  uspect-1; i>=0; 
f910: 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b  i--){.    int j;
f920: 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c  .    for(j=i; j<
f930: 28 6e 53 65 67 6d 65 6e 74 2d 31 29 3b 20 6a 2b  (nSegment-1); j+
f940: 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 33 53 65  +){.      Fts3Se
f950: 67 52 65 61 64 65 72 20 2a 70 54 6d 70 3b 0a 20  gReader *pTmp;. 
f960: 20 20 20 20 20 69 66 28 20 78 43 6d 70 28 61 70       if( xCmp(ap
f970: 53 65 67 6d 65 6e 74 5b 6a 5d 2c 20 61 70 53 65  Segment[j], apSe
f980: 67 6d 65 6e 74 5b 6a 2b 31 5d 29 3c 30 20 29 20  gment[j+1])<0 ) 
f990: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6d  break;.      pTm
f9a0: 70 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 6a 2b  p = apSegment[j+
f9b0: 31 5d 3b 0a 20 20 20 20 20 20 61 70 53 65 67 6d  1];.      apSegm
f9c0: 65 6e 74 5b 6a 2b 31 5d 20 3d 20 61 70 53 65 67  ent[j+1] = apSeg
f9d0: 6d 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 20 20 61  ment[j];.      a
f9e0: 70 53 65 67 6d 65 6e 74 5b 6a 5d 20 3d 20 70 54  pSegment[j] = pT
f9f0: 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  mp;.    }.  }..#
fa00: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
fa10: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
fa20: 65 20 6c 69 73 74 20 72 65 61 6c 6c 79 20 69 73  e list really is
fa30: 20 73 6f 72 74 65 64 20 6e 6f 77 2e 20 2a 2f 0a   sorted now. */.
fa40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 6e 53    for(i=0; i<(nS
fa50: 75 73 70 65 63 74 2d 31 29 3b 20 69 2b 2b 29 7b  uspect-1); i++){
fa60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 78 43 6d  .    assert( xCm
fa70: 70 28 61 70 53 65 67 6d 65 6e 74 5b 69 5d 2c 20  p(apSegment[i], 
fa80: 61 70 53 65 67 6d 65 6e 74 5b 69 2b 31 5d 29 3c  apSegment[i+1])<
fa90: 30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  0 );.  }.#endif.
faa0: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 49 6e 73 65 72 74  }../* .** Insert
fab0: 20 61 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74   a record into t
fac0: 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61  he %_segments ta
fad0: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
fae0: 6e 74 20 66 74 73 33 57 72 69 74 65 53 65 67 6d  nt fts3WriteSegm
faf0: 65 6e 74 28 0a 20 20 46 74 73 33 54 61 62 6c 65  ent(.  Fts3Table
fb00: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
fb10: 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61         /* Virtua
fb20: 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  l table handle *
fb30: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
fb40: 34 20 69 42 6c 6f 63 6b 2c 20 20 20 20 20 20 20  4 iBlock,       
fb50: 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 69 64 20      /* Block id 
fb60: 66 6f 72 20 6e 65 77 20 62 6c 6f 63 6b 20 2a 2f  for new block */
fb70: 0a 20 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20  .  char *z,     
fb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb90: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
fba0: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
fbb0: 6e 67 20 62 6c 6f 63 6b 20 64 61 74 61 20 2a 2f  ng block data */
fbc0: 0a 20 20 69 6e 74 20 6e 20 20 20 20 20 20 20 20  .  int n        
fbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbe0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75     /* Size of bu
fbf0: 66 66 65 72 20 7a 20 69 6e 20 62 79 74 65 73 20  ffer z in bytes 
fc00: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
fc10: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
fc20: 6e 74 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  nt rc = fts3SqlS
fc30: 74 6d 74 28 70 2c 20 53 51 4c 5f 49 4e 53 45 52  tmt(p, SQL_INSER
fc40: 54 5f 53 45 47 4d 45 4e 54 53 2c 20 26 70 53 74  T_SEGMENTS, &pSt
fc50: 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  mt, 0);.  if( rc
fc60: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
fc70: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
fc80: 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20  int64(pStmt, 1, 
fc90: 69 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 73 71 6c  iBlock);.    sql
fca0: 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
fcb0: 53 74 6d 74 2c 20 32 2c 20 7a 2c 20 6e 2c 20 53  Stmt, 2, z, n, S
fcc0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
fcd0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
fce0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 72 63 20 3d  pStmt);.    rc =
fcf0: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
fd00: 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Stmt);.  }.  ret
fd10: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
fd20: 20 46 69 6e 64 20 74 68 65 20 6c 61 72 67 65 73   Find the larges
fd30: 74 20 72 65 6c 61 74 69 76 65 20 6c 65 76 65 6c  t relative level
fd40: 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 74   number in the t
fd50: 61 62 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73  able. If success
fd60: 66 75 6c 2c 20 73 65 74 0a 2a 2a 20 2a 70 6e 4d  ful, set.** *pnM
fd70: 61 78 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65  ax to this value
fd80: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
fd90: 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65  TE_OK. Otherwise
fda0: 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  , if an error oc
fdb0: 63 75 72 73 2c 0a 2a 2a 20 73 65 74 20 2a 70 6e  curs,.** set *pn
fdc0: 4d 61 78 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20  Max to zero and 
fdd0: 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
fde0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
fdf0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 4d  int sqlite3Fts3M
fe00: 61 78 4c 65 76 65 6c 28 46 74 73 33 54 61 62 6c  axLevel(Fts3Tabl
fe10: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78  e *p, int *pnMax
fe20: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
fe30: 6e 74 20 6d 78 4c 65 76 65 6c 20 3d 20 30 3b 0a  nt mxLevel = 0;.
fe40: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
fe50: 70 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 72 63  pStmt = 0;..  rc
fe60: 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
fe70: 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4d 58 4c  , SQL_SELECT_MXL
fe80: 45 56 45 4c 2c 20 26 70 53 74 6d 74 2c 20 30 29  EVEL, &pStmt, 0)
fe90: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
fea0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
feb0: 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
fec0: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
fed0: 20 29 7b 0a 20 20 20 20 20 20 6d 78 4c 65 76 65   ){.      mxLeve
fee0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
fef0: 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29  mn_int(pStmt, 0)
ff00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
ff10: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
ff20: 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 2a 70 6e  Stmt);.  }.  *pn
ff30: 4d 61 78 20 3d 20 6d 78 4c 65 76 65 6c 3b 0a 20  Max = mxLevel;. 
ff40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ff50: 2a 20 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 72  * .** Insert a r
ff60: 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 25  ecord into the %
ff70: 5f 73 65 67 64 69 72 20 74 61 62 6c 65 2e 0a 2a  _segdir table..*
ff80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
ff90: 33 57 72 69 74 65 53 65 67 64 69 72 28 0a 20 20  3WriteSegdir(.  
ffa0: 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
ffb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffc0: 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  /* Virtual table
ffd0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c   handle */.  sql
ffe0: 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 65 76 65  ite3_int64 iLeve
fff0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l,           /* 
10000 56 61 6c 75 65 20 66 6f 72 20 22 6c 65 76 65 6c  Value for "level
10010 22 20 66 69 65 6c 64 20 28 61 62 73 6f 6c 75 74  " field (absolut
10020 65 20 6c 65 76 65 6c 29 20 2a 2f 0a 20 20 69 6e  e level) */.  in
10030 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20 20  t iIdx,         
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10050 20 56 61 6c 75 65 20 66 6f 72 20 22 69 64 78 22   Value for "idx"
10060 20 66 69 65 6c 64 20 2a 2f 0a 20 20 73 71 6c 69   field */.  sqli
10070 74 65 33 5f 69 6e 74 36 34 20 69 53 74 61 72 74  te3_int64 iStart
10080 42 6c 6f 63 6b 2c 20 20 20 20 20 20 2f 2a 20 56  Block,      /* V
10090 61 6c 75 65 20 66 6f 72 20 22 73 74 61 72 74 5f  alue for "start_
100a0 62 6c 6f 63 6b 22 20 66 69 65 6c 64 20 2a 2f 0a  block" field */.
100b0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
100c0 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 2c 20 20  iLeafEndBlock,  
100d0 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22    /* Value for "
100e0 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b  leaves_end_block
100f0 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 73 71 6c  " field */.  sql
10100 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 42  ite3_int64 iEndB
10110 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 2f 2a 20  lock,        /* 
10120 56 61 6c 75 65 20 66 6f 72 20 22 65 6e 64 5f 62  Value for "end_b
10130 6c 6f 63 6b 22 20 66 69 65 6c 64 20 2a 2f 0a 20  lock" field */. 
10140 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
10150 4c 65 61 66 44 61 74 61 2c 20 20 20 20 20 20 20  LeafData,       
10160 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6c 65 61   /* Bytes of lea
10170 66 20 64 61 74 61 20 69 6e 20 73 65 67 6d 65 6e  f data in segmen
10180 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 6f  t */.  char *zRo
10190 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ot,             
101a0 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 62 20 76         /* Blob v
101b0 61 6c 75 65 20 66 6f 72 20 22 72 6f 6f 74 22 20  alue for "root" 
101c0 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  field */.  int n
101d0 52 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20 20  Root            
101e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
101f0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
10200 20 62 75 66 66 65 72 20 7a 52 6f 6f 74 20 2a 2f   buffer zRoot */
10210 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
10220 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
10230 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
10240 74 28 70 2c 20 53 51 4c 5f 49 4e 53 45 52 54 5f  t(p, SQL_INSERT_
10250 53 45 47 44 49 52 2c 20 26 70 53 74 6d 74 2c 20  SEGDIR, &pStmt, 
10260 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
10270 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
10280 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
10290 34 28 70 53 74 6d 74 2c 20 31 2c 20 69 4c 65 76  4(pStmt, 1, iLev
102a0 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  el);.    sqlite3
102b0 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c  _bind_int(pStmt,
102c0 20 32 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 73   2, iIdx);.    s
102d0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
102e0 34 28 70 53 74 6d 74 2c 20 33 2c 20 69 53 74 61  4(pStmt, 3, iSta
102f0 72 74 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 73 71  rtBlock);.    sq
10300 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
10310 28 70 53 74 6d 74 2c 20 34 2c 20 69 4c 65 61 66  (pStmt, 4, iLeaf
10320 45 6e 64 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 69  EndBlock);.    i
10330 66 28 20 6e 4c 65 61 66 44 61 74 61 3d 3d 30 20  f( nLeafData==0 
10340 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10350 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d  _bind_int64(pStm
10360 74 2c 20 35 2c 20 69 45 6e 64 42 6c 6f 63 6b 29  t, 5, iEndBlock)
10370 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10380 20 20 20 63 68 61 72 20 2a 7a 45 6e 64 20 3d 20     char *zEnd = 
10390 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
103a0 22 25 6c 6c 64 20 25 6c 6c 64 22 2c 20 69 45 6e  "%lld %lld", iEn
103b0 64 42 6c 6f 63 6b 2c 20 6e 4c 65 61 66 44 61 74  dBlock, nLeafDat
103c0 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  a);.      if( !z
103d0 45 6e 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  End ) return SQL
103e0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
103f0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
10400 78 74 28 70 53 74 6d 74 2c 20 35 2c 20 7a 45 6e  xt(pStmt, 5, zEn
10410 64 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66  d, -1, sqlite3_f
10420 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ree);.    }.    
10430 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
10440 62 28 70 53 74 6d 74 2c 20 36 2c 20 7a 52 6f 6f  b(pStmt, 6, zRoo
10450 74 2c 20 6e 52 6f 6f 74 2c 20 53 51 4c 49 54 45  t, nRoot, SQLITE
10460 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71  _STATIC);.    sq
10470 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
10480 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
10490 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
104a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
104b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
104c0 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
104d0 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78  he common prefix
104e0 20 28 69 66 20 61 6e 79 29 20 73 68 61 72 65 64   (if any) shared
104f0 20 62 79 20 7a 50 72 65 76 20 61 6e 64 0a 2a 2a   by zPrev and.**
10500 20 7a 4e 65 78 74 2c 20 69 6e 20 62 79 74 65 73   zNext, in bytes
10510 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 0a  . For example, .
10520 2a 2a 0a 2a 2a 20 20 20 66 74 73 33 50 72 65 66  **.**   fts3Pref
10530 69 78 43 6f 6d 70 72 65 73 73 28 22 61 62 63 22  ixCompress("abc"
10540 2c 20 33 2c 20 22 61 62 63 64 65 66 22 2c 20 36  , 3, "abcdef", 6
10550 29 20 20 20 2f 2f 20 72 65 74 75 72 6e 73 20 33  )   // returns 3
10560 0a 2a 2a 20 20 20 66 74 73 33 50 72 65 66 69 78  .**   fts3Prefix
10570 43 6f 6d 70 72 65 73 73 28 22 61 62 58 22 2c 20  Compress("abX", 
10580 33 2c 20 22 61 62 63 64 65 66 22 2c 20 36 29 20  3, "abcdef", 6) 
10590 20 20 2f 2f 20 72 65 74 75 72 6e 73 20 32 0a 2a    // returns 2.*
105a0 2a 20 20 20 66 74 73 33 50 72 65 66 69 78 43 6f  *   fts3PrefixCo
105b0 6d 70 72 65 73 73 28 22 61 62 58 22 2c 20 33 2c  mpress("abX", 3,
105c0 20 22 58 62 63 64 65 66 22 2c 20 36 29 20 20 20   "Xbcdef", 6)   
105d0 2f 2f 20 72 65 74 75 72 6e 73 20 30 0a 2a 2f 0a  // returns 0.*/.
105e0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 50  static int fts3P
105f0 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 0a 20  refixCompress(. 
10600 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72   const char *zPr
10610 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ev,             
10620 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
10630 69 6e 69 6e 67 20 70 72 65 76 69 6f 75 73 20 74  ining previous t
10640 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72  erm */.  int nPr
10650 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ev,             
10660 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
10670 20 6f 66 20 62 75 66 66 65 72 20 7a 50 72 65 76   of buffer zPrev
10680 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
10690 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 78 74  onst char *zNext
106a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
106b0 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
106c0 69 6e 67 20 6e 65 78 74 20 74 65 72 6d 20 2a 2f  ing next term */
106d0 0a 20 20 69 6e 74 20 6e 4e 65 78 74 20 20 20 20  .  int nNext    
106e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106f0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75     /* Size of bu
10700 66 66 65 72 20 7a 4e 65 78 74 20 69 6e 20 62 79  ffer zNext in by
10710 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tes */.){.  int 
10720 6e 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  n;.  UNUSED_PARA
10730 4d 45 54 45 52 28 6e 4e 65 78 74 29 3b 0a 20 20  METER(nNext);.  
10740 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 50 72 65 76  for(n=0; n<nPrev
10750 20 26 26 20 7a 50 72 65 76 5b 6e 5d 3d 3d 7a 4e   && zPrev[n]==zN
10760 65 78 74 5b 6e 5d 3b 20 6e 2b 2b 29 3b 0a 20 20  ext[n]; n++);.  
10770 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
10780 2a 2a 20 41 64 64 20 74 65 72 6d 20 7a 54 65 72  ** Add term zTer
10790 6d 20 74 6f 20 74 68 65 20 53 65 67 6d 65 6e 74  m to the Segment
107a0 4e 6f 64 65 2e 20 49 74 20 69 73 20 67 75 61 72  Node. It is guar
107b0 61 6e 74 65 65 64 20 74 68 61 74 20 7a 54 65 72  anteed that zTer
107c0 6d 20 69 73 20 6c 61 72 67 65 72 0a 2a 2a 20 28  m is larger.** (
107d0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 6d 65 6d  according to mem
107e0 63 6d 70 29 20 74 68 61 6e 20 74 68 65 20 70 72  cmp) than the pr
107f0 65 76 69 6f 75 73 20 74 65 72 6d 2e 0a 2a 2f 0a  evious term..*/.
10800 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 4e  static int fts3N
10810 6f 64 65 41 64 64 54 65 72 6d 28 0a 20 20 46 74  odeAddTerm(.  Ft
10820 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20  s3Table *p,     
10830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10840 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68   Virtual table h
10850 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 65 67 6d 65  andle */.  Segme
10860 6e 74 4e 6f 64 65 20 2a 2a 70 70 54 72 65 65 2c  ntNode **ppTree,
10870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
10880 2f 4f 55 54 3a 20 53 65 67 6d 65 6e 74 4e 6f 64  /OUT: SegmentNod
10890 65 20 68 61 6e 64 6c 65 20 2a 2f 20 0a 20 20 69  e handle */ .  i
108a0 6e 74 20 69 73 43 6f 70 79 54 65 72 6d 2c 20 20  nt isCopyTerm,  
108b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
108c0 2a 20 54 72 75 65 20 69 66 20 7a 54 65 72 6d 2f  * True if zTerm/
108d0 6e 54 65 72 6d 20 69 73 20 74 72 61 6e 73 69 65  nTerm is transie
108e0 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nt */.  const ch
108f0 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20  ar *zTerm,      
10900 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
10910 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e  er to buffer con
10920 74 61 69 6e 69 6e 67 20 74 65 72 6d 20 2a 2f 0a  taining term */.
10930 20 20 69 6e 74 20 6e 54 65 72 6d 20 20 20 20 20    int nTerm     
10940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10950 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72    /* Size of ter
10960 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b  m in bytes */.){
10970 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a  .  SegmentNode *
10980 70 54 72 65 65 20 3d 20 2a 70 70 54 72 65 65 3b  pTree = *ppTree;
10990 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 53 65 67  .  int rc;.  Seg
109a0 6d 65 6e 74 4e 6f 64 65 20 2a 70 4e 65 77 3b 0a  mentNode *pNew;.
109b0 0a 20 20 2f 2a 20 46 69 72 73 74 20 74 72 79 20  .  /* First try 
109c0 74 6f 20 61 70 70 65 6e 64 20 74 68 65 20 74 65  to append the te
109d0 72 6d 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  rm to the curren
109e0 74 20 6e 6f 64 65 2e 20 52 65 74 75 72 6e 20 65  t node. Return e
109f0 61 72 6c 79 20 69 66 20 0a 20 20 2a 2a 20 74 68  arly if .  ** th
10a00 69 73 20 69 73 20 70 6f 73 73 69 62 6c 65 2e 0a  is is possible..
10a10 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 72 65 65    */.  if( pTree
10a20 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 44 61 74   ){.    int nDat
10a30 61 20 3d 20 70 54 72 65 65 2d 3e 6e 44 61 74 61  a = pTree->nData
10a40 3b 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74  ;     /* Current
10a50 20 73 69 7a 65 20 6f 66 20 6e 6f 64 65 20 69 6e   size of node in
10a60 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e   bytes */.    in
10a70 74 20 6e 52 65 71 20 3d 20 6e 44 61 74 61 3b 20  t nReq = nData; 
10a80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10a90 65 71 75 69 72 65 64 20 73 70 61 63 65 20 61 66  equired space af
10aa0 74 65 72 20 61 64 64 69 6e 67 20 7a 54 65 72 6d  ter adding zTerm
10ab0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 72 65   */.    int nPre
10ac0 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  fix;            
10ad0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
10ae0 6f 66 20 62 79 74 65 73 20 6f 66 20 70 72 65 66  of bytes of pref
10af0 69 78 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 2a  ix compression *
10b00 2f 0a 20 20 20 20 69 6e 74 20 6e 53 75 66 66 69  /.    int nSuffi
10b10 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
10b20 20 20 20 20 2f 2a 20 53 75 66 66 69 78 20 6c 65      /* Suffix le
10b30 6e 67 74 68 20 2a 2f 0a 0a 20 20 20 20 6e 50 72  ngth */..    nPr
10b40 65 66 69 78 20 3d 20 66 74 73 33 50 72 65 66 69  efix = fts3Prefi
10b50 78 43 6f 6d 70 72 65 73 73 28 70 54 72 65 65 2d  xCompress(pTree-
10b60 3e 7a 54 65 72 6d 2c 20 70 54 72 65 65 2d 3e 6e  >zTerm, pTree->n
10b70 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  Term, zTerm, nTe
10b80 72 6d 29 3b 0a 20 20 20 20 6e 53 75 66 66 69 78  rm);.    nSuffix
10b90 20 3d 20 6e 54 65 72 6d 2d 6e 50 72 65 66 69 78   = nTerm-nPrefix
10ba0 3b 0a 0a 20 20 20 20 6e 52 65 71 20 2b 3d 20 73  ;..    nReq += s
10bb0 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e 74  qlite3Fts3Varint
10bc0 4c 65 6e 28 6e 50 72 65 66 69 78 29 2b 73 71 6c  Len(nPrefix)+sql
10bd0 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65  ite3Fts3VarintLe
10be0 6e 28 6e 53 75 66 66 69 78 29 2b 6e 53 75 66 66  n(nSuffix)+nSuff
10bf0 69 78 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 71  ix;.    if( nReq
10c00 3c 3d 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20 7c  <=p->nNodeSize |
10c10 7c 20 21 70 54 72 65 65 2d 3e 7a 54 65 72 6d 20  | !pTree->zTerm 
10c20 29 7b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 52  ){..      if( nR
10c30 65 71 3e 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 20  eq>p->nNodeSize 
10c40 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  ){.        /* An
10c50 20 75 6e 75 73 75 61 6c 20 63 61 73 65 3a 20 74   unusual case: t
10c60 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
10c70 20 74 65 72 6d 20 74 6f 20 62 65 20 61 64 64 65   term to be adde
10c80 64 20 74 6f 20 74 68 65 20 6e 6f 64 65 0a 20 20  d to the node.  
10c90 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65        ** and the
10ca0 20 73 74 61 74 69 63 20 6e 6f 64 65 20 62 75 66   static node buf
10cb0 66 65 72 20 28 70 2d 3e 6e 4e 6f 64 65 53 69 7a  fer (p->nNodeSiz
10cc0 65 20 62 79 74 65 73 29 20 69 73 20 6e 6f 74 20  e bytes) is not 
10cd0 6c 61 72 67 65 0a 20 20 20 20 20 20 20 20 2a 2a  large.        **
10ce0 20 65 6e 6f 75 67 68 2e 20 55 73 65 20 61 20 73   enough. Use a s
10cf0 65 70 61 72 61 74 65 6c 79 20 6d 61 6c 6c 6f 63  eparately malloc
10d00 65 64 20 62 75 66 66 65 72 20 69 6e 73 74 65 61  ed buffer instea
10d10 64 20 54 68 69 73 20 77 61 73 74 65 73 0a 20 20  d This wastes.  
10d20 20 20 20 20 20 20 2a 2a 20 70 2d 3e 6e 4e 6f 64        ** p->nNod
10d30 65 53 69 7a 65 20 62 79 74 65 73 2c 20 62 75 74  eSize bytes, but
10d40 20 73 69 6e 63 65 20 74 68 69 73 20 73 63 65 6e   since this scen
10d50 61 72 69 6f 20 6f 6e 6c 79 20 63 6f 6d 65 73 20  ario only comes 
10d60 61 62 6f 75 74 20 77 68 65 6e 0a 20 20 20 20 20  about when.     
10d70 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
10d80 73 65 20 63 6f 6e 74 61 69 6e 20 74 77 6f 20 74  se contain two t
10d90 65 72 6d 73 20 74 68 61 74 20 73 68 61 72 65 20  erms that share 
10da0 61 20 70 72 65 66 69 78 20 6f 66 20 61 6c 6d 6f  a prefix of almo
10db0 73 74 20 32 4b 42 2c 20 0a 20 20 20 20 20 20 20  st 2KB, .       
10dc0 20 2a 2a 20 74 68 69 73 20 69 73 20 6e 6f 74 20   ** this is not 
10dd0 65 78 70 65 63 74 65 64 20 74 6f 20 62 65 20 61  expected to be a
10de0 20 73 65 72 69 6f 75 73 20 70 72 6f 62 6c 65 6d   serious problem
10df0 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  . .        */.  
10e00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
10e10 72 65 65 2d 3e 61 44 61 74 61 3d 3d 28 63 68 61  ree->aData==(cha
10e20 72 20 2a 29 26 70 54 72 65 65 5b 31 5d 20 29 3b  r *)&pTree[1] );
10e30 0a 20 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e  .        pTree->
10e40 61 44 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29  aData = (char *)
10e50 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
10e60 52 65 71 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Req);.        if
10e70 28 20 21 70 54 72 65 65 2d 3e 61 44 61 74 61 20  ( !pTree->aData 
10e80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
10e90 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
10ea0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10eb0 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
10ec0 54 72 65 65 2d 3e 7a 54 65 72 6d 20 29 7b 0a 20  Tree->zTerm ){. 
10ed0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20         /* There 
10ee0 69 73 20 6e 6f 20 70 72 65 66 69 78 2d 6c 65 6e  is no prefix-len
10ef0 67 74 68 20 66 69 65 6c 64 20 66 6f 72 20 66 69  gth field for fi
10f00 72 73 74 20 74 65 72 6d 20 69 6e 20 61 20 6e 6f  rst term in a no
10f10 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 44  de */.        nD
10f20 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ata += sqlite3Ft
10f30 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 54 72  s3PutVarint(&pTr
10f40 65 65 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d  ee->aData[nData]
10f50 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 20 20  , nPrefix);.    
10f60 20 20 7d 0a 0a 20 20 20 20 20 20 6e 44 61 74 61    }..      nData
10f70 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50   += sqlite3Fts3P
10f80 75 74 56 61 72 69 6e 74 28 26 70 54 72 65 65 2d  utVarint(&pTree-
10f90 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 6e  >aData[nData], n
10fa0 53 75 66 66 69 78 29 3b 0a 20 20 20 20 20 20 6d  Suffix);.      m
10fb0 65 6d 63 70 79 28 26 70 54 72 65 65 2d 3e 61 44  emcpy(&pTree->aD
10fc0 61 74 61 5b 6e 44 61 74 61 5d 2c 20 26 7a 54 65  ata[nData], &zTe
10fd0 72 6d 5b 6e 50 72 65 66 69 78 5d 2c 20 6e 53 75  rm[nPrefix], nSu
10fe0 66 66 69 78 29 3b 0a 20 20 20 20 20 20 70 54 72  ffix);.      pTr
10ff0 65 65 2d 3e 6e 44 61 74 61 20 3d 20 6e 44 61 74  ee->nData = nDat
11000 61 20 2b 20 6e 53 75 66 66 69 78 3b 0a 20 20 20  a + nSuffix;.   
11010 20 20 20 70 54 72 65 65 2d 3e 6e 45 6e 74 72 79     pTree->nEntry
11020 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69  ++;..      if( i
11030 73 43 6f 70 79 54 65 72 6d 20 29 7b 0a 20 20 20  sCopyTerm ){.   
11040 20 20 20 20 20 69 66 28 20 70 54 72 65 65 2d 3e       if( pTree->
11050 6e 4d 61 6c 6c 6f 63 3c 6e 54 65 72 6d 20 29 7b  nMalloc<nTerm ){
11060 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
11070 2a 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f  *zNew = sqlite3_
11080 72 65 61 6c 6c 6f 63 28 70 54 72 65 65 2d 3e 7a  realloc(pTree->z
11090 4d 61 6c 6c 6f 63 2c 20 6e 54 65 72 6d 2a 32 29  Malloc, nTerm*2)
110a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
110b0 21 7a 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20  !zNew ){.       
110c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
110d0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
110e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
110f0 70 54 72 65 65 2d 3e 6e 4d 61 6c 6c 6f 63 20 3d  pTree->nMalloc =
11100 20 6e 54 65 72 6d 2a 32 3b 0a 20 20 20 20 20 20   nTerm*2;.      
11110 20 20 20 20 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c      pTree->zMall
11120 6f 63 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20 20  oc = zNew;.     
11130 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72     }.        pTr
11140 65 65 2d 3e 7a 54 65 72 6d 20 3d 20 70 54 72 65  ee->zTerm = pTre
11150 65 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20  e->zMalloc;.    
11160 20 20 20 20 6d 65 6d 63 70 79 28 70 54 72 65 65      memcpy(pTree
11170 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20  ->zTerm, zTerm, 
11180 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  nTerm);.        
11190 70 54 72 65 65 2d 3e 6e 54 65 72 6d 20 3d 20 6e  pTree->nTerm = n
111a0 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Term;.      }els
111b0 65 7b 0a 20 20 20 20 20 20 20 20 70 54 72 65 65  e{.        pTree
111c0 2d 3e 7a 54 65 72 6d 20 3d 20 28 63 68 61 72 20  ->zTerm = (char 
111d0 2a 29 7a 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  *)zTerm;.       
111e0 20 70 54 72 65 65 2d 3e 6e 54 65 72 6d 20 3d 20   pTree->nTerm = 
111f0 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  nTerm;.      }. 
11200 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11210 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
11220 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f  ..  /* If contro
11230 6c 20 66 6c 6f 77 73 20 74 6f 20 68 65 72 65 2c  l flows to here,
11240 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73   it was not poss
11250 69 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 7a  ible to append z
11260 54 65 72 6d 20 74 6f 20 74 68 65 0a 20 20 2a 2a  Term to the.  **
11270 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 2e 20 43   current node. C
11280 72 65 61 74 65 20 61 20 6e 65 77 20 6e 6f 64 65  reate a new node
11290 20 28 61 20 72 69 67 68 74 2d 73 69 62 6c 69 6e   (a right-siblin
112a0 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  g of the current
112b0 20 6e 6f 64 65 29 2e 0a 20 20 2a 2a 20 49 66 20   node)..  ** If 
112c0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
112d0 74 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 74 72  t node in the tr
112e0 65 65 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20  ee, the term is 
112f0 61 64 64 65 64 20 74 6f 20 69 74 2e 0a 20 20 2a  added to it..  *
11300 2a 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65  *.  ** Otherwise
11310 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f  , the term is no
11320 74 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6e  t added to the n
11330 65 77 20 6e 6f 64 65 2c 20 69 74 20 69 73 20 6c  ew node, it is l
11340 65 66 74 20 65 6d 70 74 79 20 66 6f 72 0a 20 20  eft empty for.  
11350 2a 2a 20 6e 6f 77 2e 20 49 6e 73 74 65 61 64 2c  ** now. Instead,
11360 20 74 68 65 20 74 65 72 6d 20 69 73 20 69 6e 73   the term is ins
11370 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 70  erted into the p
11380 61 72 65 6e 74 20 6f 66 20 70 54 72 65 65 2e 20  arent of pTree. 
11390 49 66 20 70 54 72 65 65 20 0a 20 20 2a 2a 20 68  If pTree .  ** h
113a0 61 73 20 6e 6f 20 70 61 72 65 6e 74 2c 20 6f 6e  as no parent, on
113b0 65 20 69 73 20 63 72 65 61 74 65 64 20 68 65 72  e is created her
113c0 65 2e 0a 20 20 2a 2f 0a 20 20 70 4e 65 77 20 3d  e..  */.  pNew =
113d0 20 28 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 29   (SegmentNode *)
113e0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
113f0 69 7a 65 6f 66 28 53 65 67 6d 65 6e 74 4e 6f 64  izeof(SegmentNod
11400 65 29 20 2b 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a  e) + p->nNodeSiz
11410 65 29 3b 0a 20 20 69 66 28 20 21 70 4e 65 77 20  e);.  if( !pNew 
11420 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
11430 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
11440 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30    memset(pNew, 0
11450 2c 20 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e 74  , sizeof(Segment
11460 4e 6f 64 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  Node));.  pNew->
11470 6e 44 61 74 61 20 3d 20 31 20 2b 20 46 54 53 33  nData = 1 + FTS3
11480 5f 56 41 52 49 4e 54 5f 4d 41 58 3b 0a 20 20 70  _VARINT_MAX;.  p
11490 4e 65 77 2d 3e 61 44 61 74 61 20 3d 20 28 63 68  New->aData = (ch
114a0 61 72 20 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 0a  ar *)&pNew[1];..
114b0 20 20 69 66 28 20 70 54 72 65 65 20 29 7b 0a 20    if( pTree ){. 
114c0 20 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a     SegmentNode *
114d0 70 50 61 72 65 6e 74 20 3d 20 70 54 72 65 65 2d  pParent = pTree-
114e0 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 72 63  >pParent;.    rc
114f0 20 3d 20 66 74 73 33 4e 6f 64 65 41 64 64 54 65   = fts3NodeAddTe
11500 72 6d 28 70 2c 20 26 70 50 61 72 65 6e 74 2c 20  rm(p, &pParent, 
11510 69 73 43 6f 70 79 54 65 72 6d 2c 20 7a 54 65 72  isCopyTerm, zTer
11520 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69  m, nTerm);.    i
11530 66 28 20 70 54 72 65 65 2d 3e 70 50 61 72 65 6e  f( pTree->pParen
11540 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 54  t==0 ){.      pT
11550 72 65 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70  ree->pParent = p
11560 50 61 72 65 6e 74 3b 0a 20 20 20 20 7d 0a 20 20  Parent;.    }.  
11570 20 20 70 54 72 65 65 2d 3e 70 52 69 67 68 74 20    pTree->pRight 
11580 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77  = pNew;.    pNew
11590 2d 3e 70 4c 65 66 74 6d 6f 73 74 20 3d 20 70 54  ->pLeftmost = pT
115a0 72 65 65 2d 3e 70 4c 65 66 74 6d 6f 73 74 3b 0a  ree->pLeftmost;.
115b0 20 20 20 20 70 4e 65 77 2d 3e 70 50 61 72 65 6e      pNew->pParen
115c0 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 20  t = pParent;.   
115d0 20 70 4e 65 77 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d   pNew->zMalloc =
115e0 20 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 3b   pTree->zMalloc;
115f0 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4d 61 6c 6c  .    pNew->nMall
11600 6f 63 20 3d 20 70 54 72 65 65 2d 3e 6e 4d 61 6c  oc = pTree->nMal
11610 6c 6f 63 3b 0a 20 20 20 20 70 54 72 65 65 2d 3e  loc;.    pTree->
11620 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d  zMalloc = 0;.  }
11630 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  else{.    pNew->
11640 70 4c 65 66 74 6d 6f 73 74 20 3d 20 70 4e 65 77  pLeftmost = pNew
11650 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 4e  ;.    rc = fts3N
11660 6f 64 65 41 64 64 54 65 72 6d 28 70 2c 20 26 70  odeAddTerm(p, &p
11670 4e 65 77 2c 20 69 73 43 6f 70 79 54 65 72 6d 2c  New, isCopyTerm,
11680 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 20   zTerm, nTerm); 
11690 0a 20 20 7d 0a 0a 20 20 2a 70 70 54 72 65 65 20  .  }..  *ppTree 
116a0 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e  = pNew;.  return
116b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65   rc;.}../*.** He
116c0 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f  lper function fo
116d0 72 20 66 74 73 33 4e 6f 64 65 57 72 69 74 65 28  r fts3NodeWrite(
116e0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
116f0 20 66 74 73 33 54 72 65 65 46 69 6e 69 73 68 4e   fts3TreeFinishN
11700 6f 64 65 28 0a 20 20 53 65 67 6d 65 6e 74 4e 6f  ode(.  SegmentNo
11710 64 65 20 2a 70 54 72 65 65 2c 20 0a 20 20 69 6e  de *pTree, .  in
11720 74 20 69 48 65 69 67 68 74 2c 20 0a 20 20 73 71  t iHeight, .  sq
11730 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 65 66  lite3_int64 iLef
11740 74 43 68 69 6c 64 0a 29 7b 0a 20 20 69 6e 74 20  tChild.){.  int 
11750 6e 53 74 61 72 74 3b 0a 20 20 61 73 73 65 72 74  nStart;.  assert
11760 28 20 69 48 65 69 67 68 74 3e 3d 31 20 26 26 20  ( iHeight>=1 && 
11770 69 48 65 69 67 68 74 3c 31 32 38 20 29 3b 0a 20  iHeight<128 );. 
11780 20 6e 53 74 61 72 74 20 3d 20 46 54 53 33 5f 56   nStart = FTS3_V
11790 41 52 49 4e 54 5f 4d 41 58 20 2d 20 73 71 6c 69  ARINT_MAX - sqli
117a0 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e  te3Fts3VarintLen
117b0 28 69 4c 65 66 74 43 68 69 6c 64 29 3b 0a 20 20  (iLeftChild);.  
117c0 70 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e 53 74  pTree->aData[nSt
117d0 61 72 74 5d 20 3d 20 28 63 68 61 72 29 69 48 65  art] = (char)iHe
117e0 69 67 68 74 3b 0a 20 20 73 71 6c 69 74 65 33 46  ight;.  sqlite3F
117f0 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 54  ts3PutVarint(&pT
11800 72 65 65 2d 3e 61 44 61 74 61 5b 6e 53 74 61 72  ree->aData[nStar
11810 74 2b 31 5d 2c 20 69 4c 65 66 74 43 68 69 6c 64  t+1], iLeftChild
11820 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 53 74 61  );.  return nSta
11830 72 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  rt;.}../*.** Wri
11840 74 65 20 74 68 65 20 62 75 66 66 65 72 20 66 6f  te the buffer fo
11850 72 20 74 68 65 20 73 65 67 6d 65 6e 74 20 6e 6f  r the segment no
11860 64 65 20 70 54 72 65 65 20 61 6e 64 20 61 6c 6c  de pTree and all
11870 20 6f 66 20 69 74 73 20 70 65 65 72 73 20 74 6f   of its peers to
11880 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
11890 2e 20 54 68 65 6e 20 63 61 6c 6c 20 74 68 69 73  . Then call this
118a0 20 66 75 6e 63 74 69 6f 6e 20 72 65 63 75 72 73   function recurs
118b0 69 76 65 6c 79 20 74 6f 20 77 72 69 74 65 20 74  ively to write t
118c0 68 65 20 70 61 72 65 6e 74 20 6f 66 20 0a 2a 2a  he parent of .**
118d0 20 70 54 72 65 65 20 61 6e 64 20 69 74 73 20 70   pTree and its p
118e0 65 65 72 73 20 74 6f 20 74 68 65 20 64 61 74 61  eers to the data
118f0 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63  base. .**.** Exc
11900 65 70 74 2c 20 69 66 20 70 54 72 65 65 20 69 73  ept, if pTree is
11910 20 61 20 72 6f 6f 74 20 6e 6f 64 65 2c 20 64 6f   a root node, do
11920 20 6e 6f 74 20 77 72 69 74 65 20 69 74 20 74 6f   not write it to
11930 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
11940 6e 73 74 65 61 64 2c 0a 2a 2a 20 73 65 74 20 6f  nstead,.** set o
11950 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20  utput variables 
11960 2a 70 61 52 6f 6f 74 20 61 6e 64 20 2a 70 6e 52  *paRoot and *pnR
11970 6f 6f 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  oot to contain t
11980 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 0a 2a 2a  he root node..**
11990 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
119a0 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
119b0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6f 75 74  returned and out
119c0 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70 69  put variable *pi
119d0 4c 61 73 74 20 69 73 0a 2a 2a 20 73 65 74 20 74  Last is.** set t
119e0 6f 20 74 68 65 20 6c 61 72 67 65 73 74 20 62 6c  o the largest bl
119f0 6f 63 6b 69 64 20 77 72 69 74 74 65 6e 20 74 6f  ockid written to
11a00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 6f   the database (o
11a10 72 20 7a 65 72 6f 20 69 66 20 6e 6f 0a 2a 2a 20  r zero if no.** 
11a20 62 6c 6f 63 6b 73 20 77 65 72 65 20 77 72 69 74  blocks were writ
11a30 74 65 6e 20 74 6f 20 74 68 65 20 64 62 29 2e 20  ten to the db). 
11a40 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51  Otherwise, an SQ
11a50 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
11a60 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  is .** returned.
11a70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
11a80 74 73 33 4e 6f 64 65 57 72 69 74 65 28 0a 20 20  ts3NodeWrite(.  
11a90 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
11aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ab0 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  /* Virtual table
11ac0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 65 67   handle */.  Seg
11ad0 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65 2c  mentNode *pTree,
11ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11af0 53 65 67 6d 65 6e 74 4e 6f 64 65 20 68 61 6e 64  SegmentNode hand
11b00 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 48 65 69  le */.  int iHei
11b10 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ght,            
11b20 20 20 20 20 20 20 20 20 2f 2a 20 48 65 69 67 68          /* Heigh
11b30 74 20 6f 66 20 74 68 69 73 20 6e 6f 64 65 20 69  t of this node i
11b40 6e 20 74 72 65 65 20 2a 2f 0a 20 20 73 71 6c 69  n tree */.  sqli
11b50 74 65 33 5f 69 6e 74 36 34 20 69 4c 65 61 66 2c  te3_int64 iLeaf,
11b60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
11b70 6c 6f 63 6b 20 69 64 20 6f 66 20 66 69 72 73 74  lock id of first
11b80 20 6c 65 61 66 20 6e 6f 64 65 20 2a 2f 0a 20 20   leaf node */.  
11b90 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 46  sqlite3_int64 iF
11ba0 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ree,            
11bb0 2f 2a 20 42 6c 6f 63 6b 20 69 64 20 6f 66 20 6e  /* Block id of n
11bc0 65 78 74 20 66 72 65 65 20 73 6c 6f 74 20 69 6e  ext free slot in
11bd0 20 25 5f 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20   %_segments */. 
11be0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
11bf0 70 69 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20  piLast,         
11c00 20 2f 2a 20 4f 55 54 3a 20 42 6c 6f 63 6b 20 69   /* OUT: Block i
11c10 64 20 6f 66 20 6c 61 73 74 20 65 6e 74 72 79 20  d of last entry 
11c20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 63 68 61  written */.  cha
11c30 72 20 2a 2a 70 61 52 6f 6f 74 2c 20 20 20 20 20  r **paRoot,     
11c40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11c50 4f 55 54 3a 20 44 61 74 61 20 66 6f 72 20 72 6f  OUT: Data for ro
11c60 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  ot node */.  int
11c70 20 2a 70 6e 52 6f 6f 74 20 20 20 20 20 20 20 20   *pnRoot        
11c80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11c90 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 72 6f 6f  OUT: Size of roo
11ca0 74 20 6e 6f 64 65 20 69 6e 20 62 79 74 65 73 20  t node in bytes 
11cb0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
11cc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
11cd0 66 28 20 21 70 54 72 65 65 2d 3e 70 50 61 72 65  f( !pTree->pPare
11ce0 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 52 6f 6f  nt ){.    /* Roo
11cf0 74 20 6e 6f 64 65 20 6f 66 20 74 68 65 20 74 72  t node of the tr
11d00 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ee. */.    int n
11d10 53 74 61 72 74 20 3d 20 66 74 73 33 54 72 65 65  Start = fts3Tree
11d20 46 69 6e 69 73 68 4e 6f 64 65 28 70 54 72 65 65  FinishNode(pTree
11d30 2c 20 69 48 65 69 67 68 74 2c 20 69 4c 65 61 66  , iHeight, iLeaf
11d40 29 3b 0a 20 20 20 20 2a 70 69 4c 61 73 74 20 3d  );.    *piLast =
11d50 20 69 46 72 65 65 2d 31 3b 0a 20 20 20 20 2a 70   iFree-1;.    *p
11d60 6e 52 6f 6f 74 20 3d 20 70 54 72 65 65 2d 3e 6e  nRoot = pTree->n
11d70 44 61 74 61 20 2d 20 6e 53 74 61 72 74 3b 0a 20  Data - nStart;. 
11d80 20 20 20 2a 70 61 52 6f 6f 74 20 3d 20 26 70 54     *paRoot = &pT
11d90 72 65 65 2d 3e 61 44 61 74 61 5b 6e 53 74 61 72  ree->aData[nStar
11da0 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t];.  }else{.   
11db0 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 49   SegmentNode *pI
11dc0 74 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ter;.    sqlite3
11dd0 5f 69 6e 74 36 34 20 69 4e 65 78 74 46 72 65 65  _int64 iNextFree
11de0 20 3d 20 69 46 72 65 65 3b 0a 20 20 20 20 73 71   = iFree;.    sq
11df0 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4e 65 78  lite3_int64 iNex
11e00 74 4c 65 61 66 20 3d 20 69 4c 65 61 66 3b 0a 20  tLeaf = iLeaf;. 
11e10 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 54 72     for(pIter=pTr
11e20 65 65 2d 3e 70 4c 65 66 74 6d 6f 73 74 3b 20 70  ee->pLeftmost; p
11e30 49 74 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49  Iter && rc==SQLI
11e40 54 45 5f 4f 4b 3b 20 70 49 74 65 72 3d 70 49 74  TE_OK; pIter=pIt
11e50 65 72 2d 3e 70 52 69 67 68 74 29 7b 0a 20 20 20  er->pRight){.   
11e60 20 20 20 69 6e 74 20 6e 53 74 61 72 74 20 3d 20     int nStart = 
11e70 66 74 73 33 54 72 65 65 46 69 6e 69 73 68 4e 6f  fts3TreeFinishNo
11e80 64 65 28 70 49 74 65 72 2c 20 69 48 65 69 67 68  de(pIter, iHeigh
11e90 74 2c 20 69 4e 65 78 74 4c 65 61 66 29 3b 0a 20  t, iNextLeaf);. 
11ea0 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65 20       int nWrite 
11eb0 3d 20 70 49 74 65 72 2d 3e 6e 44 61 74 61 20 2d  = pIter->nData -
11ec0 20 6e 53 74 61 72 74 3b 0a 20 20 0a 20 20 20 20   nStart;.  .    
11ed0 20 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65    rc = fts3Write
11ee0 53 65 67 6d 65 6e 74 28 70 2c 20 69 4e 65 78 74  Segment(p, iNext
11ef0 46 72 65 65 2c 20 26 70 49 74 65 72 2d 3e 61 44  Free, &pIter->aD
11f00 61 74 61 5b 6e 53 74 61 72 74 5d 2c 20 6e 57 72  ata[nStart], nWr
11f10 69 74 65 29 3b 0a 20 20 20 20 20 20 69 4e 65 78  ite);.      iNex
11f20 74 46 72 65 65 2b 2b 3b 0a 20 20 20 20 20 20 69  tFree++;.      i
11f30 4e 65 78 74 4c 65 61 66 20 2b 3d 20 28 70 49 74  NextLeaf += (pIt
11f40 65 72 2d 3e 6e 45 6e 74 72 79 2b 31 29 3b 0a 20  er->nEntry+1);. 
11f50 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
11f60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11f70 20 20 20 20 61 73 73 65 72 74 28 20 69 4e 65 78      assert( iNex
11f80 74 4c 65 61 66 3d 3d 69 46 72 65 65 20 29 3b 0a  tLeaf==iFree );.
11f90 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 4e        rc = fts3N
11fa0 6f 64 65 57 72 69 74 65 28 0a 20 20 20 20 20 20  odeWrite(.      
11fb0 20 20 20 20 70 2c 20 70 54 72 65 65 2d 3e 70 50      p, pTree->pP
11fc0 61 72 65 6e 74 2c 20 69 48 65 69 67 68 74 2b 31  arent, iHeight+1
11fd0 2c 20 69 46 72 65 65 2c 20 69 4e 65 78 74 46 72  , iFree, iNextFr
11fe0 65 65 2c 20 70 69 4c 61 73 74 2c 20 70 61 52 6f  ee, piLast, paRo
11ff0 6f 74 2c 20 70 6e 52 6f 6f 74 0a 20 20 20 20 20  ot, pnRoot.     
12000 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   );.    }.  }.. 
12010 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12020 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65  *.** Free all me
12030 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  mory allocations
12040 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
12050 20 74 68 65 20 74 72 65 65 20 70 54 72 65 65 2e   the tree pTree.
12060 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12070 66 74 73 33 4e 6f 64 65 46 72 65 65 28 53 65 67  fts3NodeFree(Seg
12080 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65 29  mentNode *pTree)
12090 7b 0a 20 20 69 66 28 20 70 54 72 65 65 20 29 7b  {.  if( pTree ){
120a0 0a 20 20 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65  .    SegmentNode
120b0 20 2a 70 20 3d 20 70 54 72 65 65 2d 3e 70 4c 65   *p = pTree->pLe
120c0 66 74 6d 6f 73 74 3b 0a 20 20 20 20 66 74 73 33  ftmost;.    fts3
120d0 4e 6f 64 65 46 72 65 65 28 70 2d 3e 70 50 61 72  NodeFree(p->pPar
120e0 65 6e 74 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ent);.    while(
120f0 20 70 20 29 7b 0a 20 20 20 20 20 20 53 65 67 6d   p ){.      Segm
12100 65 6e 74 4e 6f 64 65 20 2a 70 52 69 67 68 74 20  entNode *pRight 
12110 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  = p->pRight;.   
12120 20 20 20 69 66 28 20 70 2d 3e 61 44 61 74 61 21     if( p->aData!
12130 3d 28 63 68 61 72 20 2a 29 26 70 5b 31 5d 20 29  =(char *)&p[1] )
12140 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12150 33 5f 66 72 65 65 28 70 2d 3e 61 44 61 74 61 29  3_free(p->aData)
12160 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12170 61 73 73 65 72 74 28 20 70 52 69 67 68 74 3d 3d  assert( pRight==
12180 30 20 7c 7c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 3d  0 || p->zMalloc=
12190 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
121a0 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 4d 61 6c  te3_free(p->zMal
121b0 6c 6f 63 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  loc);.      sqli
121c0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
121d0 20 20 20 70 20 3d 20 70 52 69 67 68 74 3b 0a 20     p = pRight;. 
121e0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
121f0 2a 20 41 64 64 20 61 20 74 65 72 6d 20 74 6f 20  * Add a term to 
12200 74 68 65 20 73 65 67 6d 65 6e 74 20 62 65 69 6e  the segment bein
12210 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  g constructed by
12220 20 74 68 65 20 53 65 67 6d 65 6e 74 57 72 69 74   the SegmentWrit
12230 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 2a 70 70  er object.** *pp
12240 57 72 69 74 65 72 2e 20 57 68 65 6e 20 61 64 64  Writer. When add
12250 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 74 65  ing the first te
12260 72 6d 20 74 6f 20 61 20 73 65 67 6d 65 6e 74 2c  rm to a segment,
12270 20 2a 70 70 57 72 69 74 65 72 20 73 68 6f 75 6c   *ppWriter shoul
12280 64 0a 2a 2a 20 62 65 20 70 61 73 73 65 64 20 4e  d.** be passed N
12290 55 4c 4c 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ULL. This functi
122a0 6f 6e 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74 65  on will allocate
122b0 20 61 20 6e 65 77 20 53 65 67 6d 65 6e 74 57 72   a new SegmentWr
122c0 69 74 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 61  iter object.** a
122d0 6e 64 20 72 65 74 75 72 6e 20 69 74 20 76 69 61  nd return it via
122e0 20 74 68 65 20 69 6e 70 75 74 2f 6f 75 74 70 75   the input/outpu
122f0 74 20 76 61 72 69 61 62 6c 65 20 2a 70 70 57 72  t variable *ppWr
12300 69 74 65 72 20 69 6e 20 74 68 69 73 20 63 61 73  iter in this cas
12310 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  e..**.** If succ
12320 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
12330 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
12340 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c  therwise, an SQL
12350 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
12360 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
12370 73 33 53 65 67 57 72 69 74 65 72 41 64 64 28 0a  s3SegWriterAdd(.
12380 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
12390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123a0 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
123b0 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53  le handle */.  S
123c0 65 67 6d 65 6e 74 57 72 69 74 65 72 20 2a 2a 70  egmentWriter **p
123d0 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 2f  pWriter,       /
123e0 2a 20 49 4e 2f 4f 55 54 3a 20 53 65 67 6d 65 6e  * IN/OUT: Segmen
123f0 74 57 72 69 74 65 72 20 68 61 6e 64 6c 65 20 2a  tWriter handle *
12400 2f 20 0a 20 20 69 6e 74 20 69 73 43 6f 70 79 54  / .  int isCopyT
12410 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
12420 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
12430 62 75 66 66 65 72 20 7a 54 65 72 6d 20 6d 75 73  buffer zTerm mus
12440 74 20 62 65 20 63 6f 70 69 65 64 20 2a 2f 0a 20  t be copied */. 
12450 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
12460 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
12470 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
12480 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
12490 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e   term */.  int n
124a0 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
124b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
124c0 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e 20 62 79  ze of term in by
124d0 74 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  tes */.  const c
124e0 68 61 72 20 2a 61 44 6f 63 6c 69 73 74 2c 20 20  har *aDoclist,  
124f0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
12500 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f  ter to buffer co
12510 6e 74 61 69 6e 69 6e 67 20 64 6f 63 6c 69 73 74  ntaining doclist
12520 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f 63 6c 69   */.  int nDocli
12530 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
12540 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
12550 20 64 6f 63 6c 69 73 74 20 69 6e 20 62 79 74 65   doclist in byte
12560 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  s */.){.  int nP
12570 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20  refix;          
12580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
12590 65 20 6f 66 20 74 65 72 6d 20 70 72 65 66 69 78  e of term prefix
125a0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
125b0 6e 74 20 6e 53 75 66 66 69 78 3b 20 20 20 20 20  nt nSuffix;     
125c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
125d0 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 73  * Size of term s
125e0 75 66 66 69 78 20 69 6e 20 62 79 74 65 73 20 2a  uffix in bytes *
125f0 2f 0a 20 20 69 6e 74 20 6e 52 65 71 3b 20 20 20  /.  int nReq;   
12600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12610 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
12620 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
12630 6f 6e 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a  on leaf page */.
12640 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20 20 53    int nData;.  S
12650 65 67 6d 65 6e 74 57 72 69 74 65 72 20 2a 70 57  egmentWriter *pW
12660 72 69 74 65 72 20 3d 20 2a 70 70 57 72 69 74 65  riter = *ppWrite
12670 72 3b 0a 0a 20 20 69 66 28 20 21 70 57 72 69 74  r;..  if( !pWrit
12680 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  er ){.    int rc
12690 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
126a0 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 20 20  mt *pStmt;..    
126b0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
126c0 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 73 74  SegmentWriter st
126d0 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 70  ructure */.    p
126e0 57 72 69 74 65 72 20 3d 20 28 53 65 67 6d 65 6e  Writer = (Segmen
126f0 74 57 72 69 74 65 72 20 2a 29 73 71 6c 69 74 65  tWriter *)sqlite
12700 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
12710 53 65 67 6d 65 6e 74 57 72 69 74 65 72 29 29 3b  SegmentWriter));
12720 0a 20 20 20 20 69 66 28 20 21 70 57 72 69 74 65  .    if( !pWrite
12730 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  r ) return SQLIT
12740 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d  E_NOMEM;.    mem
12750 73 65 74 28 70 57 72 69 74 65 72 2c 20 30 2c 20  set(pWriter, 0, 
12760 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e 74 57 72  sizeof(SegmentWr
12770 69 74 65 72 29 29 3b 0a 20 20 20 20 2a 70 70 57  iter));.    *ppW
12780 72 69 74 65 72 20 3d 20 70 57 72 69 74 65 72 3b  riter = pWriter;
12790 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  ..    /* Allocat
127a0 65 20 61 20 62 75 66 66 65 72 20 69 6e 20 77 68  e a buffer in wh
127b0 69 63 68 20 74 6f 20 61 63 63 75 6d 75 6c 61 74  ich to accumulat
127c0 65 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 70 57  e data */.    pW
127d0 72 69 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 28  riter->aData = (
127e0 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  char *)sqlite3_m
127f0 61 6c 6c 6f 63 28 70 2d 3e 6e 4e 6f 64 65 53 69  alloc(p->nNodeSi
12800 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 57  ze);.    if( !pW
12810 72 69 74 65 72 2d 3e 61 44 61 74 61 20 29 20 72  riter->aData ) r
12820 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
12830 45 4d 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d  EM;.    pWriter-
12840 3e 6e 53 69 7a 65 20 3d 20 70 2d 3e 6e 4e 6f 64  >nSize = p->nNod
12850 65 53 69 7a 65 3b 0a 0a 20 20 20 20 2f 2a 20 46  eSize;..    /* F
12860 69 6e 64 20 74 68 65 20 6e 65 78 74 20 66 72 65  ind the next fre
12870 65 20 62 6c 6f 63 6b 69 64 20 69 6e 20 74 68 65  e blockid in the
12880 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c   %_segments tabl
12890 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74  e */.    rc = ft
128a0 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c  s3SqlStmt(p, SQL
128b0 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54 53 5f 49  _NEXT_SEGMENTS_I
128c0 44 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  D, &pStmt, 0);. 
128d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
128e0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
128f0 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
12900 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
12910 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
12920 20 20 20 70 57 72 69 74 65 72 2d 3e 69 46 72 65     pWriter->iFre
12930 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
12940 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
12950 30 29 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65  0);.      pWrite
12960 72 2d 3e 69 46 69 72 73 74 20 3d 20 70 57 72 69  r->iFirst = pWri
12970 74 65 72 2d 3e 69 46 72 65 65 3b 0a 20 20 20 20  ter->iFree;.    
12980 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
12990 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
129a0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
129b0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
129c0 72 63 3b 0a 20 20 7d 0a 20 20 6e 44 61 74 61 20  rc;.  }.  nData 
129d0 3d 20 70 57 72 69 74 65 72 2d 3e 6e 44 61 74 61  = pWriter->nData
129e0 3b 0a 0a 20 20 6e 50 72 65 66 69 78 20 3d 20 66  ;..  nPrefix = f
129f0 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73  ts3PrefixCompres
12a00 73 28 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d  s(pWriter->zTerm
12a10 2c 20 70 57 72 69 74 65 72 2d 3e 6e 54 65 72 6d  , pWriter->nTerm
12a20 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b  , zTerm, nTerm);
12a30 0a 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65  .  nSuffix = nTe
12a40 72 6d 2d 6e 50 72 65 66 69 78 3b 0a 0a 20 20 2f  rm-nPrefix;..  /
12a50 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
12a60 20 6d 61 6e 79 20 62 79 74 65 73 20 61 72 65 20   many bytes are 
12a70 72 65 71 75 69 72 65 64 20 62 79 20 74 68 69 73  required by this
12a80 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20   new entry */.  
12a90 6e 52 65 71 20 3d 20 73 71 6c 69 74 65 33 46 74  nReq = sqlite3Ft
12aa0 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 50 72 65  s3VarintLen(nPre
12ab0 66 69 78 29 20 2b 20 20 20 20 2f 2a 20 76 61 72  fix) +    /* var
12ac0 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  int containing p
12ad0 72 65 66 69 78 20 73 69 7a 65 20 2a 2f 0a 20 20  refix size */.  
12ae0 20 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72    sqlite3Fts3Var
12af0 69 6e 74 4c 65 6e 28 6e 53 75 66 66 69 78 29 20  intLen(nSuffix) 
12b00 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 76 61 72  +         /* var
12b10 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73  int containing s
12b20 75 66 66 69 78 20 73 69 7a 65 20 2a 2f 0a 20 20  uffix size */.  
12b30 20 20 6e 53 75 66 66 69 78 20 2b 20 20 20 20 20    nSuffix +     
12b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72            /* Ter
12b60 6d 20 73 75 66 66 69 78 20 2a 2f 0a 20 20 20 20  m suffix */.    
12b70 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e  sqlite3Fts3Varin
12b80 74 4c 65 6e 28 6e 44 6f 63 6c 69 73 74 29 20 2b  tLen(nDoclist) +
12b90 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
12ba0 6f 66 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20  of doclist */.  
12bb0 20 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20    nDoclist;     
12bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63            /* Doc
12be0 6c 69 73 74 20 64 61 74 61 20 2a 2f 0a 0a 20 20  list data */..  
12bf0 69 66 28 20 6e 44 61 74 61 3e 30 20 26 26 20 6e  if( nData>0 && n
12c00 44 61 74 61 2b 6e 52 65 71 3e 70 2d 3e 6e 4e 6f  Data+nReq>p->nNo
12c10 64 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e  deSize ){.    in
12c20 74 20 72 63 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  t rc;..    /* Th
12c30 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 6e  e current leaf n
12c40 6f 64 65 20 69 73 20 66 75 6c 6c 2e 20 57 72 69  ode is full. Wri
12c50 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65  te it out to the
12c60 20 64 61 74 61 62 61 73 65 2e 20 2a 2f 0a 20 20   database. */.  
12c70 20 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65    rc = fts3Write
12c80 53 65 67 6d 65 6e 74 28 70 2c 20 70 57 72 69 74  Segment(p, pWrit
12c90 65 72 2d 3e 69 46 72 65 65 2b 2b 2c 20 70 57 72  er->iFree++, pWr
12ca0 69 74 65 72 2d 3e 61 44 61 74 61 2c 20 6e 44 61  iter->aData, nDa
12cb0 74 61 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ta);.    if( rc!
12cc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
12cd0 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6e  urn rc;.    p->n
12ce0 4c 65 61 66 41 64 64 2b 2b 3b 0a 0a 20 20 20 20  LeafAdd++;..    
12cf0 2f 2a 20 41 64 64 20 74 68 65 20 63 75 72 72 65  /* Add the curre
12d00 6e 74 20 74 65 72 6d 20 74 6f 20 74 68 65 20 69  nt term to the i
12d10 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20 74 72 65  nterior node tre
12d20 65 2e 20 54 68 65 20 74 65 72 6d 20 61 64 64 65  e. The term adde
12d30 64 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  d to.    ** the 
12d40 69 6e 74 65 72 69 6f 72 20 74 72 65 65 20 6d 75  interior tree mu
12d50 73 74 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  st:.    **.    *
12d60 2a 20 20 20 61 29 20 62 65 20 67 72 65 61 74 65  *   a) be greate
12d70 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65  r than the large
12d80 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 6c  st term on the l
12d90 65 61 66 20 6e 6f 64 65 20 6a 75 73 74 20 77 72  eaf node just wr
12da0 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 20 20 20  itten.    **    
12db0 20 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73    to the databas
12dc0 65 20 28 73 74 69 6c 6c 20 61 76 61 69 6c 61 62  e (still availab
12dd0 6c 65 20 69 6e 20 70 57 72 69 74 65 72 2d 3e 7a  le in pWriter->z
12de0 54 65 72 6d 29 2c 20 61 6e 64 0a 20 20 20 20 2a  Term), and.    *
12df0 2a 0a 20 20 20 20 2a 2a 20 20 20 62 29 20 62 65  *.    **   b) be
12e00 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
12e10 75 61 6c 20 74 6f 20 74 68 65 20 74 65 72 6d 20  ual to the term 
12e20 61 62 6f 75 74 20 74 6f 20 62 65 20 61 64 64 65  about to be adde
12e30 64 20 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20  d to the new.   
12e40 20 2a 2a 20 20 20 20 20 20 6c 65 61 66 20 6e 6f   **      leaf no
12e50 64 65 20 28 7a 54 65 72 6d 2f 6e 54 65 72 6d 29  de (zTerm/nTerm)
12e60 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
12e70 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
12e80 69 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 70  it must be the p
12e90 72 65 66 69 78 20 6f 66 20 7a 54 65 72 6d 20 31  refix of zTerm 1
12ea0 20 62 79 74 65 20 6c 6f 6e 67 65 72 20 74 68 61   byte longer tha
12eb0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6d  n.    ** the com
12ec0 6d 6f 6e 20 70 72 65 66 69 78 20 28 69 66 20 61  mon prefix (if a
12ed0 6e 79 29 20 6f 66 20 7a 54 65 72 6d 20 61 6e 64  ny) of zTerm and
12ee0 20 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d 2e   pWriter->zTerm.
12ef0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
12f00 72 74 28 20 6e 50 72 65 66 69 78 3c 6e 54 65 72  rt( nPrefix<nTer
12f10 6d 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 74  m );.    rc = ft
12f20 73 33 4e 6f 64 65 41 64 64 54 65 72 6d 28 70 2c  s3NodeAddTerm(p,
12f30 20 26 70 57 72 69 74 65 72 2d 3e 70 54 72 65 65   &pWriter->pTree
12f40 2c 20 69 73 43 6f 70 79 54 65 72 6d 2c 20 7a 54  , isCopyTerm, zT
12f50 65 72 6d 2c 20 6e 50 72 65 66 69 78 2b 31 29 3b  erm, nPrefix+1);
12f60 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
12f70 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
12f80 72 63 3b 0a 0a 20 20 20 20 6e 44 61 74 61 20 3d  rc;..    nData =
12f90 20 30 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d   0;.    pWriter-
12fa0 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 0a 20 20 20  >nTerm = 0;..   
12fb0 20 6e 50 72 65 66 69 78 20 3d 20 30 3b 0a 20 20   nPrefix = 0;.  
12fc0 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72    nSuffix = nTer
12fd0 6d 3b 0a 20 20 20 20 6e 52 65 71 20 3d 20 31 20  m;.    nReq = 1 
12fe0 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13000 2a 20 76 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e  * varint contain
13010 69 6e 67 20 70 72 65 66 69 78 20 73 69 7a 65 20  ing prefix size 
13020 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
13030 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 54  Fts3VarintLen(nT
13040 65 72 6d 29 20 2b 20 20 20 20 20 20 20 20 20 2f  erm) +         /
13050 2a 20 76 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e  * varint contain
13060 69 6e 67 20 73 75 66 66 69 78 20 73 69 7a 65 20  ing suffix size 
13070 2a 2f 0a 20 20 20 20 20 20 6e 54 65 72 6d 20 2b  */.      nTerm +
13080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
130a0 2a 20 54 65 72 6d 20 73 75 66 66 69 78 20 2a 2f  * Term suffix */
130b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
130c0 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 44 6f 63  s3VarintLen(nDoc
130d0 6c 69 73 74 29 20 2b 20 20 20 20 20 20 2f 2a 20  list) +      /* 
130e0 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20  Size of doclist 
130f0 2a 2f 0a 20 20 20 20 20 20 6e 44 6f 63 6c 69 73  */.      nDoclis
13100 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
13110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13120 2a 20 44 6f 63 6c 69 73 74 20 64 61 74 61 20 2a  * Doclist data *
13130 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72  /.  }..  /* Incr
13140 65 61 73 65 20 74 68 65 20 74 6f 74 61 6c 20 6e  ease the total n
13150 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
13160 72 69 74 74 65 6e 20 74 6f 20 61 63 63 6f 75 6e  ritten to accoun
13170 74 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e  t for the new en
13180 74 72 79 2e 20 2a 2f 0a 20 20 70 57 72 69 74 65  try. */.  pWrite
13190 72 2d 3e 6e 4c 65 61 66 44 61 74 61 20 2b 3d 20  r->nLeafData += 
131a0 6e 52 65 71 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  nReq;..  /* If t
131b0 68 65 20 62 75 66 66 65 72 20 63 75 72 72 65 6e  he buffer curren
131c0 74 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 69 73  tly allocated is
131d0 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74   too small for t
131e0 68 69 73 20 65 6e 74 72 79 2c 20 72 65 61 6c 6c  his entry, reall
131f0 6f 63 0a 20 20 2a 2a 20 74 68 65 20 62 75 66 66  oc.  ** the buff
13200 65 72 20 74 6f 20 6d 61 6b 65 20 69 74 20 6c 61  er to make it la
13210 72 67 65 20 65 6e 6f 75 67 68 2e 0a 20 20 2a 2f  rge enough..  */
13220 0a 20 20 69 66 28 20 6e 52 65 71 3e 70 57 72 69  .  if( nReq>pWri
13230 74 65 72 2d 3e 6e 53 69 7a 65 20 29 7b 0a 20 20  ter->nSize ){.  
13240 20 20 63 68 61 72 20 2a 61 4e 65 77 20 3d 20 73    char *aNew = s
13250 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
13260 57 72 69 74 65 72 2d 3e 61 44 61 74 61 2c 20 6e  Writer->aData, n
13270 52 65 71 29 3b 0a 20 20 20 20 69 66 28 20 21 61  Req);.    if( !a
13280 4e 65 77 20 29 20 72 65 74 75 72 6e 20 53 51 4c  New ) return SQL
13290 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70  ITE_NOMEM;.    p
132a0 57 72 69 74 65 72 2d 3e 61 44 61 74 61 20 3d 20  Writer->aData = 
132b0 61 4e 65 77 3b 0a 20 20 20 20 70 57 72 69 74 65  aNew;.    pWrite
132c0 72 2d 3e 6e 53 69 7a 65 20 3d 20 6e 52 65 71 3b  r->nSize = nReq;
132d0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
132e0 44 61 74 61 2b 6e 52 65 71 3c 3d 70 57 72 69 74  Data+nReq<=pWrit
132f0 65 72 2d 3e 6e 53 69 7a 65 20 29 3b 0a 0a 20 20  er->nSize );..  
13300 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 70 72  /* Append the pr
13310 65 66 69 78 2d 63 6f 6d 70 72 65 73 73 65 64 20  efix-compressed 
13320 74 65 72 6d 20 61 6e 64 20 64 6f 63 6c 69 73 74  term and doclist
13330 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 2e 20   to the buffer. 
13340 2a 2f 0a 20 20 6e 44 61 74 61 20 2b 3d 20 73 71  */.  nData += sq
13350 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69  lite3Fts3PutVari
13360 6e 74 28 26 70 57 72 69 74 65 72 2d 3e 61 44 61  nt(&pWriter->aDa
13370 74 61 5b 6e 44 61 74 61 5d 2c 20 6e 50 72 65 66  ta[nData], nPref
13380 69 78 29 3b 0a 20 20 6e 44 61 74 61 20 2b 3d 20  ix);.  nData += 
13390 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
133a0 72 69 6e 74 28 26 70 57 72 69 74 65 72 2d 3e 61  rint(&pWriter->a
133b0 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 6e 53 75  Data[nData], nSu
133c0 66 66 69 78 29 3b 0a 20 20 6d 65 6d 63 70 79 28  ffix);.  memcpy(
133d0 26 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 5b  &pWriter->aData[
133e0 6e 44 61 74 61 5d 2c 20 26 7a 54 65 72 6d 5b 6e  nData], &zTerm[n
133f0 50 72 65 66 69 78 5d 2c 20 6e 53 75 66 66 69 78  Prefix], nSuffix
13400 29 3b 0a 20 20 6e 44 61 74 61 20 2b 3d 20 6e 53  );.  nData += nS
13410 75 66 66 69 78 3b 0a 20 20 6e 44 61 74 61 20 2b  uffix;.  nData +
13420 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74  = sqlite3Fts3Put
13430 56 61 72 69 6e 74 28 26 70 57 72 69 74 65 72 2d  Varint(&pWriter-
13440 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 6e  >aData[nData], n
13450 44 6f 63 6c 69 73 74 29 3b 0a 20 20 6d 65 6d 63  Doclist);.  memc
13460 70 79 28 26 70 57 72 69 74 65 72 2d 3e 61 44 61  py(&pWriter->aDa
13470 74 61 5b 6e 44 61 74 61 5d 2c 20 61 44 6f 63 6c  ta[nData], aDocl
13480 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a  ist, nDoclist);.
13490 20 20 70 57 72 69 74 65 72 2d 3e 6e 44 61 74 61    pWriter->nData
134a0 20 3d 20 6e 44 61 74 61 20 2b 20 6e 44 6f 63 6c   = nData + nDocl
134b0 69 73 74 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20  ist;..  /* Save 
134c0 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d  the current term
134d0 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20   so that it can 
134e0 62 65 20 75 73 65 64 20 74 6f 20 70 72 65 66 69  be used to prefi
134f0 78 2d 63 6f 6d 70 72 65 73 73 20 74 68 65 20 6e  x-compress the n
13500 65 78 74 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65  ext..  ** If the
13510 20 69 73 43 6f 70 79 54 65 72 6d 20 70 61 72 61   isCopyTerm para
13520 6d 65 74 65 72 20 69 73 20 74 72 75 65 2c 20 74  meter is true, t
13530 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70  hen the buffer p
13540 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 20 20 2a  ointed to by.  *
13550 2a 20 7a 54 65 72 6d 20 69 73 20 74 72 61 6e 73  * zTerm is trans
13560 69 65 6e 74 2c 20 73 6f 20 74 61 6b 65 20 61 20  ient, so take a 
13570 63 6f 70 79 20 6f 66 20 74 68 65 20 74 65 72 6d  copy of the term
13580 20 64 61 74 61 2e 20 4f 74 68 65 72 77 69 73 65   data. Otherwise
13590 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 73 74 6f 72  , just.  ** stor
135a0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
135b0 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  pointer..  */.  
135c0 69 66 28 20 69 73 43 6f 70 79 54 65 72 6d 20 29  if( isCopyTerm )
135d0 7b 0a 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3e  {.    if( nTerm>
135e0 70 57 72 69 74 65 72 2d 3e 6e 4d 61 6c 6c 6f 63  pWriter->nMalloc
135f0 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
13600 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72  zNew = sqlite3_r
13610 65 61 6c 6c 6f 63 28 70 57 72 69 74 65 72 2d 3e  ealloc(pWriter->
13620 7a 4d 61 6c 6c 6f 63 2c 20 6e 54 65 72 6d 2a 32  zMalloc, nTerm*2
13630 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4e  );.      if( !zN
13640 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ew ){.        re
13650 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
13660 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
13670 20 70 57 72 69 74 65 72 2d 3e 6e 4d 61 6c 6c 6f   pWriter->nMallo
13680 63 20 3d 20 6e 54 65 72 6d 2a 32 3b 0a 20 20 20  c = nTerm*2;.   
13690 20 20 20 70 57 72 69 74 65 72 2d 3e 7a 4d 61 6c     pWriter->zMal
136a0 6c 6f 63 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20  loc = zNew;.    
136b0 20 20 70 57 72 69 74 65 72 2d 3e 7a 54 65 72 6d    pWriter->zTerm
136c0 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20 7d 0a 20   = zNew;.    }. 
136d0 20 20 20 61 73 73 65 72 74 28 20 70 57 72 69 74     assert( pWrit
136e0 65 72 2d 3e 7a 54 65 72 6d 3d 3d 70 57 72 69 74  er->zTerm==pWrit
136f0 65 72 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 3b 0a 20  er->zMalloc );. 
13700 20 20 20 6d 65 6d 63 70 79 28 70 57 72 69 74 65     memcpy(pWrite
13710 72 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65 72 6d 2c  r->zTerm, zTerm,
13720 20 6e 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65   nTerm);.  }else
13730 7b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 7a  {.    pWriter->z
13740 54 65 72 6d 20 3d 20 28 63 68 61 72 20 2a 29 7a  Term = (char *)z
13750 54 65 72 6d 3b 0a 20 20 7d 0a 20 20 70 57 72 69  Term;.  }.  pWri
13760 74 65 72 2d 3e 6e 54 65 72 6d 20 3d 20 6e 54 65  ter->nTerm = nTe
13770 72 6d 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  rm;..  return SQ
13780 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
13790 2a 20 46 6c 75 73 68 20 61 6c 6c 20 64 61 74 61  * Flush all data
137a0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
137b0 20 74 68 65 20 53 65 67 6d 65 6e 74 57 72 69 74   the SegmentWrit
137c0 65 72 20 6f 62 6a 65 63 74 20 70 57 72 69 74 65  er object pWrite
137d0 72 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61  r to the.** data
137e0 62 61 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74  base. This funct
137f0 69 6f 6e 20 6d 75 73 74 20 62 65 20 63 61 6c 6c  ion must be call
13800 65 64 20 61 66 74 65 72 20 61 6c 6c 20 74 65 72  ed after all ter
13810 6d 73 20 68 61 76 65 20 62 65 65 6e 20 61 64 64  ms have been add
13820 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73 65 67  ed.** to the seg
13830 6d 65 6e 74 20 75 73 69 6e 67 20 66 74 73 33 53  ment using fts3S
13840 65 67 57 72 69 74 65 72 41 64 64 28 29 2e 20 49  egWriterAdd(). I
13850 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  f successful, SQ
13860 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a 20 72 65  LITE_OK is.** re
13870 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
13880 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  e, an SQLite err
13890 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
138a0 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 57 72  ic int fts3SegWr
138b0 69 74 65 72 46 6c 75 73 68 28 0a 20 20 46 74 73  iterFlush(.  Fts
138c0 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
138d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
138e0 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  Virtual table ha
138f0 6e 64 6c 65 20 2a 2f 0a 20 20 53 65 67 6d 65 6e  ndle */.  Segmen
13900 74 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  tWriter *pWriter
13910 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67  ,         /* Seg
13920 6d 65 6e 74 57 72 69 74 65 72 20 74 6f 20 66 6c  mentWriter to fl
13930 75 73 68 20 74 6f 20 74 68 65 20 64 62 20 2a 2f  ush to the db */
13940 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
13950 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20   iLevel,        
13960 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20     /* Value for 
13970 27 6c 65 76 65 6c 27 20 63 6f 6c 75 6d 6e 20 6f  'level' column o
13980 66 20 25 5f 73 65 67 64 69 72 20 2a 2f 0a 20 20  f %_segdir */.  
13990 69 6e 74 20 69 49 64 78 20 20 20 20 20 20 20 20  int iIdx        
139a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139b0 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 27 69 64  /* Value for 'id
139c0 78 27 20 63 6f 6c 75 6d 6e 20 6f 66 20 25 5f 73  x' column of %_s
139d0 65 67 64 69 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e  egdir */.){.  in
139e0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
139f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13a00 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
13a10 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 70    if( pWriter->p
13a20 54 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Tree ){.    sqli
13a30 74 65 33 5f 69 6e 74 36 34 20 69 4c 61 73 74 20  te3_int64 iLast 
13a40 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4c 61 72  = 0;      /* Lar
13a50 67 65 73 74 20 62 6c 6f 63 6b 20 69 64 20 77 72  gest block id wr
13a60 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73  itten to databas
13a70 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
13a80 5f 69 6e 74 36 34 20 69 4c 61 73 74 4c 65 61 66  _int64 iLastLeaf
13a90 3b 20 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73  ;      /* Larges
13aa0 74 20 6c 65 61 66 20 62 6c 6f 63 6b 20 69 64 20  t leaf block id 
13ab0 77 72 69 74 74 65 6e 20 74 6f 20 64 62 20 2a 2f  written to db */
13ac0 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 6f 6f 74  .    char *zRoot
13ad0 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20   = NULL;        
13ae0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
13af0 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
13b00 6e 67 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a  ng root node */.
13b10 20 20 20 20 69 6e 74 20 6e 52 6f 6f 74 20 3d 20      int nRoot = 
13b20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
13b30 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
13b40 66 65 72 20 7a 52 6f 6f 74 20 2a 2f 0a 0a 20 20  fer zRoot */..  
13b50 20 20 69 4c 61 73 74 4c 65 61 66 20 3d 20 70 57    iLastLeaf = pW
13b60 72 69 74 65 72 2d 3e 69 46 72 65 65 3b 0a 20 20  riter->iFree;.  
13b70 20 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65    rc = fts3Write
13b80 53 65 67 6d 65 6e 74 28 70 2c 20 70 57 72 69 74  Segment(p, pWrit
13b90 65 72 2d 3e 69 46 72 65 65 2b 2b 2c 20 70 57 72  er->iFree++, pWr
13ba0 69 74 65 72 2d 3e 61 44 61 74 61 2c 20 70 57 72  iter->aData, pWr
13bb0 69 74 65 72 2d 3e 6e 44 61 74 61 29 3b 0a 20 20  iter->nData);.  
13bc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13bd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
13be0 3d 20 66 74 73 33 4e 6f 64 65 57 72 69 74 65 28  = fts3NodeWrite(
13bf0 70 2c 20 70 57 72 69 74 65 72 2d 3e 70 54 72 65  p, pWriter->pTre
13c00 65 2c 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20  e, 1,.          
13c10 70 57 72 69 74 65 72 2d 3e 69 46 69 72 73 74 2c  pWriter->iFirst,
13c20 20 70 57 72 69 74 65 72 2d 3e 69 46 72 65 65 2c   pWriter->iFree,
13c30 20 26 69 4c 61 73 74 2c 20 26 7a 52 6f 6f 74 2c   &iLast, &zRoot,
13c40 20 26 6e 52 6f 6f 74 29 3b 0a 20 20 20 20 7d 0a   &nRoot);.    }.
13c50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
13c60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
13c70 63 20 3d 20 66 74 73 33 57 72 69 74 65 53 65 67  c = fts3WriteSeg
13c80 64 69 72 28 70 2c 20 69 4c 65 76 65 6c 2c 20 69  dir(p, iLevel, i
13c90 49 64 78 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Idx, .          
13ca0 70 57 72 69 74 65 72 2d 3e 69 46 69 72 73 74 2c  pWriter->iFirst,
13cb0 20 69 4c 61 73 74 4c 65 61 66 2c 20 69 4c 61 73   iLastLeaf, iLas
13cc0 74 2c 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61  t, pWriter->nLea
13cd0 66 44 61 74 61 2c 20 7a 52 6f 6f 74 2c 20 6e 52  fData, zRoot, nR
13ce0 6f 6f 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  oot);.    }.  }e
13cf0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
13d00 65 6e 74 69 72 65 20 74 72 65 65 20 66 69 74 73  entire tree fits
13d10 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64   on the root nod
13d20 65 2e 20 57 72 69 74 65 20 69 74 20 74 6f 20 74  e. Write it to t
13d30 68 65 20 73 65 67 64 69 72 20 74 61 62 6c 65 2e  he segdir table.
13d40 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73   */.    rc = fts
13d50 33 57 72 69 74 65 53 65 67 64 69 72 28 70 2c 20  3WriteSegdir(p, 
13d60 69 4c 65 76 65 6c 2c 20 69 49 64 78 2c 20 0a 20  iLevel, iIdx, . 
13d70 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20         0, 0, 0, 
13d80 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61  pWriter->nLeafDa
13d90 74 61 2c 20 70 57 72 69 74 65 72 2d 3e 61 44 61  ta, pWriter->aDa
13da0 74 61 2c 20 70 57 72 69 74 65 72 2d 3e 6e 44 61  ta, pWriter->nDa
13db0 74 61 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4c  ta);.  }.  p->nL
13dc0 65 61 66 41 64 64 2b 2b 3b 0a 20 20 72 65 74 75  eafAdd++;.  retu
13dd0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13de0 52 65 6c 65 61 73 65 20 61 6c 6c 20 6d 65 6d 6f  Release all memo
13df0 72 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 53  ry held by the S
13e00 65 67 6d 65 6e 74 57 72 69 74 65 72 20 6f 62 6a  egmentWriter obj
13e10 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
13e20 65 20 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75  e .** first argu
13e30 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
13e40 76 6f 69 64 20 66 74 73 33 53 65 67 57 72 69 74  void fts3SegWrit
13e50 65 72 46 72 65 65 28 53 65 67 6d 65 6e 74 57 72  erFree(SegmentWr
13e60 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a  iter *pWriter){.
13e70 20 20 69 66 28 20 70 57 72 69 74 65 72 20 29 7b    if( pWriter ){
13e80 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
13e90 65 28 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61  e(pWriter->aData
13ea0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
13eb0 72 65 65 28 70 57 72 69 74 65 72 2d 3e 7a 4d 61  ree(pWriter->zMa
13ec0 6c 6c 6f 63 29 3b 0a 20 20 20 20 66 74 73 33 4e  lloc);.    fts3N
13ed0 6f 64 65 46 72 65 65 28 70 57 72 69 74 65 72 2d  odeFree(pWriter-
13ee0 3e 70 54 72 65 65 29 3b 0a 20 20 20 20 73 71 6c  >pTree);.    sql
13ef0 69 74 65 33 5f 66 72 65 65 28 70 57 72 69 74 65  ite3_free(pWrite
13f00 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
13f10 20 54 68 65 20 66 69 72 73 74 20 76 61 6c 75 65   The first value
13f20 20 69 6e 20 74 68 65 20 61 70 56 61 6c 5b 5d 20   in the apVal[] 
13f30 61 72 72 61 79 20 69 73 20 61 73 73 75 6d 65 64  array is assumed
13f40 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69   to contain an i
13f50 6e 74 65 67 65 72 2e 0a 2a 2a 20 54 68 69 73 20  nteger..** This 
13f60 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69  function tests i
13f70 66 20 74 68 65 72 65 20 65 78 69 73 74 20 61 6e  f there exist an
13f80 79 20 64 6f 63 75 6d 65 6e 74 73 20 77 69 74 68  y documents with
13f90 20 64 6f 63 69 64 20 76 61 6c 75 65 73 20 74 68   docid values th
13fa0 61 74 0a 2a 2a 20 61 72 65 20 64 69 66 66 65 72  at.** are differ
13fb0 65 6e 74 20 66 72 6f 6d 20 74 68 61 74 20 69 6e  ent from that in
13fc0 74 65 67 65 72 2e 20 69 2e 65 2e 20 69 66 20 64  teger. i.e. if d
13fd0 65 6c 65 74 69 6e 67 20 74 68 65 20 64 6f 63 75  eleting the docu
13fe0 6d 65 6e 74 20 77 69 74 68 20 64 6f 63 69 64 0a  ment with docid.
13ff0 2a 2a 20 70 52 6f 77 69 64 20 77 6f 75 6c 64 20  ** pRowid would 
14000 6d 65 61 6e 20 74 68 65 20 46 54 53 33 20 74 61  mean the FTS3 ta
14010 62 6c 65 20 77 65 72 65 20 65 6d 70 74 79 2e 0a  ble were empty..
14020 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
14030 66 75 6c 2c 20 2a 70 69 73 45 6d 70 74 79 20 69  ful, *pisEmpty i
14040 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66  s set to true if
14050 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
14060 70 74 79 20 65 78 63 65 70 74 20 66 6f 72 0a 2a  pty except for.*
14070 2a 20 64 6f 63 75 6d 65 6e 74 20 70 52 6f 77 69  * document pRowi
14080 64 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  d, or false othe
14090 72 77 69 73 65 2c 20 61 6e 64 20 53 51 4c 49 54  rwise, and SQLIT
140a0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
140b0 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  . If an.** error
140c0 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69   occurs, an SQLi
140d0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
140e0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
140f0 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 73 45  atic int fts3IsE
14100 6d 70 74 79 28 46 74 73 33 54 61 62 6c 65 20 2a  mpty(Fts3Table *
14110 70 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  p, sqlite3_value
14120 20 2a 70 52 6f 77 69 64 2c 20 69 6e 74 20 2a 70   *pRowid, int *p
14130 69 73 45 6d 70 74 79 29 7b 0a 20 20 73 71 6c 69  isEmpty){.  sqli
14140 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
14150 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
14160 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 20   p->zContentTbl 
14170 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 75 73 69  ){.    /* If usi
14180 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 3d 78  ng the content=x
14190 78 78 20 6f 70 74 69 6f 6e 2c 20 61 73 73 75 6d  xx option, assum
141a0 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6e  e the table is n
141b0 65 76 65 72 20 65 6d 70 74 79 20 2a 2f 0a 20 20  ever empty */.  
141c0 20 20 2a 70 69 73 45 6d 70 74 79 20 3d 20 30 3b    *pisEmpty = 0;
141d0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
141e0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
141f0 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
14200 6d 74 28 70 2c 20 53 51 4c 5f 49 53 5f 45 4d 50  mt(p, SQL_IS_EMP
14210 54 59 2c 20 26 70 53 74 6d 74 2c 20 26 70 52 6f  TY, &pStmt, &pRo
14220 77 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  wid);.    if( rc
14230 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14240 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
14250 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
14260 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
14270 20 20 20 20 2a 70 69 73 45 6d 70 74 79 20 3d 20      *pisEmpty = 
14280 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
14290 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  nt(pStmt, 0);.  
142a0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
142b0 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
142c0 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Stmt);.    }.  }
142d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
142e0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 6e 4d 61  ./*.** Set *pnMa
142f0 78 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73 74  x to the largest
14300 20 73 65 67 6d 65 6e 74 20 6c 65 76 65 6c 20 69   segment level i
14310 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
14320 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  or the index.** 
14330 69 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 53 65  iIndex..**.** Se
14340 67 6d 65 6e 74 20 6c 65 76 65 6c 73 20 61 72 65  gment levels are
14350 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 27   stored in the '
14360 6c 65 76 65 6c 27 20 63 6f 6c 75 6d 6e 20 6f 66  level' column of
14370 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61   the %_segdir ta
14380 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ble..**.** Retur
14390 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
143a0 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
143b0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
143c0 64 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  de if not..*/.st
143d0 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67  atic int fts3Seg
143e0 6d 65 6e 74 4d 61 78 4c 65 76 65 6c 28 0a 20 20  mentMaxLevel(.  
143f0 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 0a 20  Fts3Table *p, . 
14400 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 0a 20 20   int iLangid,.  
14410 69 6e 74 20 69 49 6e 64 65 78 2c 20 0a 20 20 73  int iIndex, .  s
14420 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 6e  qlite3_int64 *pn
14430 4d 61 78 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  Max.){.  sqlite3
14440 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
14450 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
14460 28 20 69 49 6e 64 65 78 3e 3d 30 20 26 26 20 69  ( iIndex>=0 && i
14470 49 6e 64 65 78 3c 70 2d 3e 6e 49 6e 64 65 78 20  Index<p->nIndex 
14480 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 70 53 74  );..  /* Set pSt
14490 6d 74 20 74 6f 20 74 68 65 20 63 6f 6d 70 69 6c  mt to the compil
144a0 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 3a 0a 20  ed version of:. 
144b0 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c 45 43   **.  **   SELEC
144c0 54 20 6d 61 78 28 6c 65 76 65 6c 29 20 46 52 4f  T max(level) FRO
144d0 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27  M %Q.'%q_segdir'
144e0 20 57 48 45 52 45 20 6c 65 76 65 6c 20 42 45 54   WHERE level BET
144f0 57 45 45 4e 20 3f 20 41 4e 44 20 3f 0a 20 20 2a  WEEN ? AND ?.  *
14500 2a 0a 20 20 2a 2a 20 28 31 30 32 34 20 69 73 20  *.  ** (1024 is 
14510 61 63 74 75 61 6c 6c 79 20 74 68 65 20 76 61 6c  actually the val
14520 75 65 20 6f 66 20 6d 61 63 72 6f 20 46 54 53 33  ue of macro FTS3
14530 5f 53 45 47 44 49 52 5f 50 52 45 46 49 58 4c 45  _SEGDIR_PREFIXLE
14540 56 45 4c 5f 53 54 52 29 2e 0a 20 20 2a 2f 0a 20  VEL_STR)..  */. 
14550 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
14560 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f  t(p, SQL_SELECT_
14570 53 45 47 44 49 52 5f 4d 41 58 5f 4c 45 56 45 4c  SEGDIR_MAX_LEVEL
14580 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
14590 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
145a0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
145b0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
145c0 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 67 65  t64(pStmt, 1, ge
145d0 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70  tAbsoluteLevel(p
145e0 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
145f0 78 2c 20 30 29 29 3b 0a 20 20 73 71 6c 69 74 65  x, 0));.  sqlite
14600 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74  3_bind_int64(pSt
14610 6d 74 2c 20 32 2c 20 0a 20 20 20 20 20 20 67 65  mt, 2, .      ge
14620 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70  tAbsoluteLevel(p
14630 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65  , iLangid, iInde
14640 78 2c 20 46 54 53 33 5f 53 45 47 44 49 52 5f 4d  x, FTS3_SEGDIR_M
14650 41 58 4c 45 56 45 4c 2d 31 29 0a 20 20 29 3b 0a  AXLEVEL-1).  );.
14660 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
14670 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
14680 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 2a 70 6e  Stmt) ){.    *pn
14690 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Max = sqlite3_co
146a0 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
146b0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
146c0 72 6e 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74  rn sqlite3_reset
146d0 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pStmt);.}../*.*
146e0 2a 20 69 41 62 73 4c 65 76 65 6c 20 69 73 20 61  * iAbsLevel is a
146f0 6e 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c  n absolute level
14700 20 74 68 61 74 20 6d 61 79 20 62 65 20 61 73 73   that may be ass
14710 75 6d 65 64 20 74 6f 20 65 78 69 73 74 20 77 69  umed to exist wi
14720 74 68 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61  thin.** the data
14730 62 61 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74  base. This funct
14740 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 69 74  ion checks if it
14750 20 69 73 20 74 68 65 20 6c 61 72 67 65 73 74 20   is the largest 
14760 6c 65 76 65 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20  level number.** 
14770 77 69 74 68 69 6e 20 69 74 73 20 69 6e 64 65 78  within its index
14780 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72  . Assuming no er
14790 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 62 4d  ror occurs, *pbM
147a0 61 78 20 69 73 20 73 65 74 20 74 6f 20 31 20 69  ax is set to 1 i
147b0 66 0a 2a 2a 20 69 41 62 73 4c 65 76 65 6c 20 69  f.** iAbsLevel i
147c0 73 20 69 6e 64 65 65 64 20 74 68 65 20 6c 61 72  s indeed the lar
147d0 67 65 73 74 20 6c 65 76 65 6c 2c 20 6f 72 20 30  gest level, or 0
147e0 20 6f 74 68 65 72 77 69 73 65 2c 20 61 6e 64 20   otherwise, and 
147f0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
14800 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
14810 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
14820 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
14830 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 0a  eturned and the.
14840 2a 2a 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f  ** final value o
14850 66 20 2a 70 62 4d 61 78 20 69 73 20 75 6e 64 65  f *pbMax is unde
14860 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
14870 20 69 6e 74 20 66 74 73 33 53 65 67 6d 65 6e 74   int fts3Segment
14880 49 73 4d 61 78 4c 65 76 65 6c 28 46 74 73 33 54  IsMaxLevel(Fts3T
14890 61 62 6c 65 20 2a 70 2c 20 69 36 34 20 69 41 62  able *p, i64 iAb
148a0 73 4c 65 76 65 6c 2c 20 69 6e 74 20 2a 70 62 4d  sLevel, int *pbM
148b0 61 78 29 7b 0a 0a 20 20 2f 2a 20 53 65 74 20 70  ax){..  /* Set p
148c0 53 74 6d 74 20 74 6f 20 74 68 65 20 63 6f 6d 70  Stmt to the comp
148d0 69 6c 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 3a  iled version of:
148e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c  .  **.  **   SEL
148f0 45 43 54 20 6d 61 78 28 6c 65 76 65 6c 29 20 46  ECT max(level) F
14900 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69  ROM %Q.'%q_segdi
14910 72 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20 42  r' WHERE level B
14920 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 0a 20  ETWEEN ? AND ?. 
14930 20 2a 2a 0a 20 20 2a 2a 20 28 31 30 32 34 20 69   **.  ** (1024 i
14940 73 20 61 63 74 75 61 6c 6c 79 20 74 68 65 20 76  s actually the v
14950 61 6c 75 65 20 6f 66 20 6d 61 63 72 6f 20 46 54  alue of macro FT
14960 53 33 5f 53 45 47 44 49 52 5f 50 52 45 46 49 58  S3_SEGDIR_PREFIX
14970 4c 45 56 45 4c 5f 53 54 52 29 2e 0a 20 20 2a 2f  LEVEL_STR)..  */
14980 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
14990 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63  *pStmt;.  int rc
149a0 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
149b0 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 45 47  , SQL_SELECT_SEG
149c0 44 49 52 5f 4d 41 58 5f 4c 45 56 45 4c 2c 20 26  DIR_MAX_LEVEL, &
149d0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
149e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
149f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 73 71   return rc;.  sq
14a00 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
14a10 28 70 53 74 6d 74 2c 20 31 2c 20 69 41 62 73 4c  (pStmt, 1, iAbsL
14a20 65 76 65 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74  evel+1);.  sqlit
14a30 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
14a40 74 6d 74 2c 20 32 2c 20 0a 20 20 20 20 20 20 28  tmt, 2, .      (
14a50 28 69 41 62 73 4c 65 76 65 6c 2f 46 54 53 33 5f  (iAbsLevel/FTS3_
14a60 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 29  SEGDIR_MAXLEVEL)
14a70 2b 31 29 20 2a 20 46 54 53 33 5f 53 45 47 44 49  +1) * FTS3_SEGDI
14a80 52 5f 4d 41 58 4c 45 56 45 4c 0a 20 20 29 3b 0a  R_MAXLEVEL.  );.
14a90 0a 20 20 2a 70 62 4d 61 78 20 3d 20 30 3b 0a 20  .  *pbMax = 0;. 
14aa0 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
14ab0 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
14ac0 74 6d 74 29 20 29 7b 0a 20 20 20 20 2a 70 62 4d  tmt) ){.    *pbM
14ad0 61 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ax = sqlite3_col
14ae0 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20  umn_type(pStmt, 
14af0 30 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b  0)==SQLITE_NULL;
14b00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
14b10 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
14b20 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  t);.}../*.** Del
14b30 65 74 65 20 61 6c 6c 20 65 6e 74 72 69 65 73 20  ete all entries 
14b40 69 6e 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74  in the %_segment
14b50 73 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74  s table associat
14b60 65 64 20 77 69 74 68 20 74 68 65 20 73 65 67 6d  ed with the segm
14b70 65 6e 74 0a 2a 2a 20 6f 70 65 6e 65 64 20 77 69  ent.** opened wi
14b80 74 68 20 73 65 67 2d 72 65 61 64 65 72 20 70 53  th seg-reader pS
14b90 65 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  eg. This functio
14ba0 6e 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63  n does not affec
14bb0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  t the contents.*
14bc0 2a 20 6f 66 20 74 68 65 20 25 5f 73 65 67 64 69  * of the %_segdi
14bd0 72 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  r table..*/.stat
14be0 69 63 20 69 6e 74 20 66 74 73 33 44 65 6c 65 74  ic int fts3Delet
14bf0 65 53 65 67 6d 65 6e 74 28 0a 20 20 46 74 73 33  eSegment(.  Fts3
14c00 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
14c10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
14c20 54 53 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  TS table handle 
14c30 2a 2f 0a 20 20 46 74 73 33 53 65 67 52 65 61 64  */.  Fts3SegRead
14c40 65 72 20 2a 70 53 65 67 20 20 20 20 20 20 20 20  er *pSeg        
14c50 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20       /* Segment 
14c60 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 29 7b 0a  to delete */.){.
14c70 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14c80 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
14c90 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
14ca0 20 2a 2f 0a 20 20 69 66 28 20 70 53 65 67 2d 3e   */.  if( pSeg->
14cb0 69 53 74 61 72 74 42 6c 6f 63 6b 20 29 7b 0a 20  iStartBlock ){. 
14cc0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
14cd0 2a 70 44 65 6c 65 74 65 3b 20 20 20 20 20 20 20  *pDelete;       
14ce0 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   /* SQL statemen
14cf0 74 20 74 6f 20 64 65 6c 65 74 65 20 72 6f 77 73  t to delete rows
14d00 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73   */.    rc = fts
14d10 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
14d20 44 45 4c 45 54 45 5f 53 45 47 4d 45 4e 54 53 5f  DELETE_SEGMENTS_
14d30 52 41 4e 47 45 2c 20 26 70 44 65 6c 65 74 65 2c  RANGE, &pDelete,
14d40 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
14d50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14d60 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
14d70 5f 69 6e 74 36 34 28 70 44 65 6c 65 74 65 2c 20  _int64(pDelete, 
14d80 31 2c 20 70 53 65 67 2d 3e 69 53 74 61 72 74 42  1, pSeg->iStartB
14d90 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  lock);.      sql
14da0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
14db0 70 44 65 6c 65 74 65 2c 20 32 2c 20 70 53 65 67  pDelete, 2, pSeg
14dc0 2d 3e 69 45 6e 64 42 6c 6f 63 6b 29 3b 0a 20 20  ->iEndBlock);.  
14dd0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
14de0 28 70 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 20  (pDelete);.     
14df0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
14e00 73 65 74 28 70 44 65 6c 65 74 65 29 3b 0a 20 20  set(pDelete);.  
14e10 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
14e20 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
14e30 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
14e40 73 65 64 20 61 66 74 65 72 20 6d 65 72 67 69 6e  sed after mergin
14e50 67 20 6d 75 6c 74 69 70 6c 65 20 73 65 67 6d 65  g multiple segme
14e60 6e 74 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  nts into a singl
14e70 65 20 6c 61 72 67 65 0a 2a 2a 20 73 65 67 6d 65  e large.** segme
14e80 6e 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  nt to delete the
14e90 20 6f 6c 64 2c 20 6e 6f 77 20 72 65 64 75 6e 64   old, now redund
14ea0 61 6e 74 2c 20 73 65 67 6d 65 6e 74 20 62 2d 74  ant, segment b-t
14eb0 72 65 65 73 2e 20 53 70 65 63 69 66 69 63 61 6c  rees. Specifical
14ec0 6c 79 2c 0a 2a 2a 20 69 74 3a 0a 2a 2a 20 0a 2a  ly,.** it:.** .*
14ed0 2a 20 20 20 31 29 20 44 65 6c 65 74 65 73 20 61  *   1) Deletes a
14ee0 6c 6c 20 25 5f 73 65 67 6d 65 6e 74 73 20 65 6e  ll %_segments en
14ef0 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 73 65  tries for the se
14f00 67 6d 65 6e 74 73 20 61 73 73 6f 63 69 61 74 65  gments associate
14f10 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 20 20  d with .**      
14f20 65 61 63 68 20 6f 66 20 74 68 65 20 53 65 67 52  each of the SegR
14f30 65 61 64 65 72 20 6f 62 6a 65 63 74 73 20 69 6e  eader objects in
14f40 20 74 68 65 20 61 72 72 61 79 20 70 61 73 73 65   the array passe
14f50 64 20 61 73 20 74 68 65 20 74 68 69 72 64 20 0a  d as the third .
14f60 2a 2a 20 20 20 20 20 20 61 72 67 75 6d 65 6e 74  **      argument
14f70 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 32 29  , and.**.**   2)
14f80 20 64 65 6c 65 74 65 73 20 61 6c 6c 20 25 5f 73   deletes all %_s
14f90 65 67 64 69 72 20 65 6e 74 72 69 65 73 20 77 69  egdir entries wi
14fa0 74 68 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2c  th level iLevel,
14fb0 20 6f 72 20 61 6c 6c 20 25 5f 73 65 67 64 69 72   or all %_segdir
14fc0 0a 2a 2a 20 20 20 20 20 20 65 6e 74 72 69 65 73  .**      entries
14fd0 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6c   regardless of l
14fe0 65 76 65 6c 20 69 66 20 28 69 4c 65 76 65 6c 3c  evel if (iLevel<
14ff0 30 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  0)..**.** SQLITE
15000 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
15010 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
15020 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69  therwise an SQLi
15030 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
15040 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
15050 33 44 65 6c 65 74 65 53 65 67 64 69 72 28 0a 20  3DeleteSegdir(. 
15060 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
15070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15080 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
15090 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  e handle */.  in
150a0 74 20 69 4c 61 6e 67 69 64 2c 20 20 20 20 20 20  t iLangid,      
150b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
150c0 20 4c 61 6e 67 75 61 67 65 20 69 64 20 2a 2f 0a   Language id */.
150d0 20 20 69 6e 74 20 69 49 6e 64 65 78 2c 20 20 20    int iIndex,   
150e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150f0 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20 70    /* Index for p
15100 2d 3e 61 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ->aIndex */.  in
15110 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  t iLevel,       
15120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15130 20 4c 65 76 65 6c 20 6f 66 20 25 5f 73 65 67 64   Level of %_segd
15140 69 72 20 65 6e 74 72 69 65 73 20 74 6f 20 64 65  ir entries to de
15150 6c 65 74 65 20 2a 2f 0a 20 20 46 74 73 33 53 65  lete */.  Fts3Se
15160 67 52 65 61 64 65 72 20 2a 2a 61 70 53 65 67 6d  gReader **apSegm
15170 65 6e 74 2c 20 20 20 20 20 20 2f 2a 20 41 72 72  ent,      /* Arr
15180 61 79 20 6f 66 20 53 65 67 52 65 61 64 65 72 20  ay of SegReader 
15190 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 69 6e 74  objects */.  int
151a0 20 6e 52 65 61 64 65 72 20 20 20 20 20 20 20 20   nReader        
151b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
151c0 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70  Size of array ap
151d0 53 65 67 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  Segment */.){.  
151e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
151f0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
15200 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
15210 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
15220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15230 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
15240 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 73 71  variable */.  sq
15250 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c  lite3_stmt *pDel
15260 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  ete = 0;      /*
15270 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74   SQL statement t
15280 6f 20 64 65 6c 65 74 65 20 72 6f 77 73 20 2a 2f  o delete rows */
15290 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d  ..  for(i=0; rc=
152a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
152b0 6e 52 65 61 64 65 72 3b 20 69 2b 2b 29 7b 0a 20  nReader; i++){. 
152c0 20 20 20 72 63 20 3d 20 66 74 73 33 44 65 6c 65     rc = fts3Dele
152d0 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 61 70 53  teSegment(p, apS
152e0 65 67 6d 65 6e 74 5b 69 5d 29 3b 0a 20 20 7d 0a  egment[i]);.  }.
152f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15300 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
15310 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  n rc;.  }..  ass
15320 65 72 74 28 20 69 4c 65 76 65 6c 3e 3d 30 20 7c  ert( iLevel>=0 |
15330 7c 20 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53  | iLevel==FTS3_S
15340 45 47 43 55 52 53 4f 52 5f 41 4c 4c 20 29 3b 0a  EGCURSOR_ALL );.
15350 20 20 69 66 28 20 69 4c 65 76 65 6c 3d 3d 46 54    if( iLevel==FT
15360 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c  S3_SEGCURSOR_ALL
15370 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
15380 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
15390 44 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 52 41  DELETE_SEGDIR_RA
153a0 4e 47 45 2c 20 26 70 44 65 6c 65 74 65 2c 20 30  NGE, &pDelete, 0
153b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
153c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
153d0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
153e0 6e 74 36 34 28 70 44 65 6c 65 74 65 2c 20 31 2c  nt64(pDelete, 1,
153f0 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65   getAbsoluteLeve
15400 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49  l(p, iLangid, iI
15410 6e 64 65 78 2c 20 30 29 29 3b 0a 20 20 20 20 20  ndex, 0));.     
15420 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
15430 74 36 34 28 70 44 65 6c 65 74 65 2c 20 32 2c 20  t64(pDelete, 2, 
15440 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 41 62  .          getAb
15450 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69  soluteLevel(p, i
15460 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20  Langid, iIndex, 
15470 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c  FTS3_SEGDIR_MAXL
15480 45 56 45 4c 2d 31 29 0a 20 20 20 20 20 20 29 3b  EVEL-1).      );
15490 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
154a0 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c      rc = fts3Sql
154b0 53 74 6d 74 28 70 2c 20 53 51 4c 5f 44 45 4c 45  Stmt(p, SQL_DELE
154c0 54 45 5f 53 45 47 44 49 52 5f 4c 45 56 45 4c 2c  TE_SEGDIR_LEVEL,
154d0 20 26 70 44 65 6c 65 74 65 2c 20 30 29 3b 0a 20   &pDelete, 0);. 
154e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
154f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
15500 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
15510 28 0a 20 20 20 20 20 20 20 20 20 20 70 44 65 6c  (.          pDel
15520 65 74 65 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c  ete, 1, getAbsol
15530 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e  uteLevel(p, iLan
15540 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65  gid, iIndex, iLe
15550 76 65 6c 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  vel).      );.  
15560 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
15570 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15580 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
15590 28 70 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 72  (pDelete);.    r
155a0 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
155b0 74 28 70 44 65 6c 65 74 65 29 3b 0a 20 20 7d 0a  t(pDelete);.  }.
155c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
155d0 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  ./*.** When this
155e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
155f0 6c 65 64 2c 20 62 75 66 66 65 72 20 2a 70 70 4c  led, buffer *ppL
15600 69 73 74 20 28 73 69 7a 65 20 2a 70 6e 4c 69 73  ist (size *pnLis
15610 74 20 62 79 74 65 73 29 20 63 6f 6e 74 61 69 6e  t bytes) contain
15620 73 20 0a 2a 2a 20 61 20 70 6f 73 69 74 69 6f 6e  s .** a position
15630 20 6c 69 73 74 20 74 68 61 74 20 6d 61 79 20 28   list that may (
15640 6f 72 20 6d 61 79 20 6e 6f 74 29 20 66 65 61 74  or may not) feat
15650 75 72 65 20 6d 75 6c 74 69 70 6c 65 20 63 6f 6c  ure multiple col
15660 75 6d 6e 73 2e 20 54 68 69 73 0a 2a 2a 20 66 75  umns. This.** fu
15670 6e 63 74 69 6f 6e 20 61 64 6a 75 73 74 73 20 74  nction adjusts t
15680 68 65 20 70 6f 69 6e 74 65 72 20 2a 70 70 4c 69  he pointer *ppLi
15690 73 74 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74  st and the lengt
156a0 68 20 2a 70 6e 4c 69 73 74 20 73 6f 20 74 68 61  h *pnList so tha
156b0 74 20 74 68 65 79 0a 2a 2a 20 69 64 65 6e 74 69  t they.** identi
156c0 66 79 20 74 68 65 20 73 75 62 73 65 74 20 6f 66  fy the subset of
156d0 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
156e0 73 74 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  st that correspo
156f0 6e 64 73 20 74 6f 20 63 6f 6c 75 6d 6e 20 69 43  nds to column iC
15700 6f 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ol..**.** If the
15710 72 65 20 61 72 65 20 6e 6f 20 65 6e 74 72 69 65  re are no entrie
15720 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 70  s in the input p
15730 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72  osition list for
15740 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20 74 68   column iCol, th
15750 65 6e 0a 2a 2a 20 2a 70 6e 4c 69 73 74 20 69 73  en.** *pnList is
15760 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 62 65 66   set to zero bef
15770 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
15780 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
15790 72 20 62 5a 65 72 6f 20 69 73 20 6e 6f 6e 2d 7a  r bZero is non-z
157a0 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 70 61  ero, then any pa
157b0 72 74 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  rt of the input 
157c0 6c 69 73 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a  list following.*
157d0 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  * the end of the
157e0 20 6f 75 74 70 75 74 20 6c 69 73 74 20 69 73 20   output list is 
157f0 7a 65 72 6f 65 64 20 62 65 66 6f 72 65 20 72 65  zeroed before re
15800 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
15810 69 63 20 76 6f 69 64 20 66 74 73 33 43 6f 6c 75  ic void fts3Colu
15820 6d 6e 46 69 6c 74 65 72 28 0a 20 20 69 6e 74 20  mnFilter(.  int 
15830 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  iCol,           
15840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
15850 6f 6c 75 6d 6e 20 74 6f 20 66 69 6c 74 65 72 20  olumn to filter 
15860 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 5a 65 72  on */.  int bZer
15870 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
15880 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20          /* Zero 
15890 6f 75 74 20 61 6e 79 74 68 69 6e 67 20 66 6f 6c  out anything fol
158a0 6c 6f 77 69 6e 67 20 2a 70 70 4c 69 73 74 20 2a  lowing *ppList *
158b0 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 4c 69 73  /.  char **ppLis
158c0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
158d0 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50      /* IN/OUT: P
158e0 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73 69 74 69  ointer to positi
158f0 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  on list */.  int
15900 20 2a 70 6e 4c 69 73 74 20 20 20 20 20 20 20 20   *pnList        
15910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15920 49 4e 2f 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20  IN/OUT: Size of 
15930 62 75 66 66 65 72 20 2a 70 70 4c 69 73 74 20 69  buffer *ppList i
15940 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20  n bytes */.){.  
15950 63 68 61 72 20 2a 70 4c 69 73 74 20 3d 20 2a 70  char *pList = *p
15960 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 4c 69  pList;.  int nLi
15970 73 74 20 3d 20 2a 70 6e 4c 69 73 74 3b 0a 20 20  st = *pnList;.  
15980 63 68 61 72 20 2a 70 45 6e 64 20 3d 20 26 70 4c  char *pEnd = &pL
15990 69 73 74 5b 6e 4c 69 73 74 5d 3b 0a 20 20 69 6e  ist[nList];.  in
159a0 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 0a  t iCurrent = 0;.
159b0 20 20 63 68 61 72 20 2a 70 20 3d 20 70 4c 69 73    char *p = pLis
159c0 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 43  t;..  assert( iC
159d0 6f 6c 3e 3d 30 20 29 3b 0a 20 20 77 68 69 6c 65  ol>=0 );.  while
159e0 28 20 31 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ( 1 ){.    char 
159f0 63 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  c = 0;.    while
15a00 28 20 70 3c 70 45 6e 64 20 26 26 20 28 63 20 7c  ( p<pEnd && (c |
15a10 20 2a 70 29 26 30 78 46 45 20 29 20 63 20 3d 20   *p)&0xFE ) c = 
15a20 2a 70 2b 2b 20 26 20 30 78 38 30 3b 0a 20 20 0a  *p++ & 0x80;.  .
15a30 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 69 43      if( iCol==iC
15a40 75 72 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  urrent ){.      
15a50 6e 4c 69 73 74 20 3d 20 28 69 6e 74 29 28 70 20  nList = (int)(p 
15a60 2d 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  - pList);.      
15a70 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
15a80 20 20 6e 4c 69 73 74 20 2d 3d 20 28 69 6e 74 29    nList -= (int)
15a90 28 70 20 2d 20 70 4c 69 73 74 29 3b 0a 20 20 20  (p - pList);.   
15aa0 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20 20   pList = p;.    
15ab0 69 66 28 20 6e 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( nList==0 ){.
15ac0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15ad0 20 7d 0a 20 20 20 20 70 20 3d 20 26 70 4c 69 73   }.    p = &pLis
15ae0 74 5b 31 5d 3b 0a 20 20 20 20 70 20 2b 3d 20 66  t[1];.    p += f
15af0 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 70  ts3GetVarint32(p
15b00 2c 20 26 69 43 75 72 72 65 6e 74 29 3b 0a 20 20  , &iCurrent);.  
15b10 7d 0a 0a 20 20 69 66 28 20 62 5a 65 72 6f 20 26  }..  if( bZero &
15b20 26 20 26 70 4c 69 73 74 5b 6e 4c 69 73 74 5d 21  & &pList[nList]!
15b30 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 6d 65 6d  =pEnd ){.    mem
15b40 73 65 74 28 26 70 4c 69 73 74 5b 6e 4c 69 73 74  set(&pList[nList
15b50 5d 2c 20 30 2c 20 70 45 6e 64 20 2d 20 26 70 4c  ], 0, pEnd - &pL
15b60 69 73 74 5b 6e 4c 69 73 74 5d 29 3b 0a 20 20 7d  ist[nList]);.  }
15b70 0a 20 20 2a 70 70 4c 69 73 74 20 3d 20 70 4c 69  .  *ppList = pLi
15b80 73 74 3b 0a 20 20 2a 70 6e 4c 69 73 74 20 3d 20  st;.  *pnList = 
15b90 6e 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nList;.}../*.** 
15ba0 43 61 63 68 65 20 64 61 74 61 20 69 6e 20 74 68  Cache data in th
15bb0 65 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65  e Fts3MultiSegRe
15bc0 61 64 65 72 2e 61 42 75 66 66 65 72 5b 5d 20 62  ader.aBuffer[] b
15bd0 75 66 66 65 72 20 28 6f 76 65 72 77 72 69 74 69  uffer (overwriti
15be0 6e 67 20 61 6e 79 0a 2a 2a 20 65 78 69 73 74 69  ng any.** existi
15bf0 6e 67 20 64 61 74 61 29 2e 20 47 72 6f 77 20 74  ng data). Grow t
15c00 68 65 20 62 75 66 66 65 72 20 69 66 20 72 65 71  he buffer if req
15c10 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  uired..**.** If 
15c20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
15c30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74  rn SQLITE_OK. Ot
15c40 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 4f  herwise, if an O
15c50 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  OM error is enco
15c60 75 6e 74 65 72 65 64 0a 2a 2a 20 74 72 79 69 6e  untered.** tryin
15c70 67 20 74 6f 20 72 65 73 69 7a 65 20 74 68 65 20  g to resize the 
15c80 62 75 66 66 65 72 2c 20 72 65 74 75 72 6e 20 53  buffer, return S
15c90 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a  QLITE_NOMEM..*/.
15ca0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 4d  static int fts3M
15cb0 73 72 42 75 66 66 65 72 44 61 74 61 28 0a 20 20  srBufferData(.  
15cc0 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
15cd0 65 72 20 2a 70 4d 73 72 2c 20 20 20 20 20 20 20  er *pMsr,       
15ce0 2f 2a 20 4d 75 6c 74 69 2d 73 65 67 6d 65 6e 74  /* Multi-segment
15cf0 2d 72 65 61 64 65 72 20 68 61 6e 64 6c 65 20 2a  -reader handle *
15d00 2f 0a 20 20 63 68 61 72 20 2a 70 4c 69 73 74 2c  /.  char *pList,
15d10 0a 20 20 69 6e 74 20 6e 4c 69 73 74 0a 29 7b 0a  .  int nList.){.
15d20 20 20 69 66 28 20 6e 4c 69 73 74 3e 70 4d 73 72    if( nList>pMsr
15d30 2d 3e 6e 42 75 66 66 65 72 20 29 7b 0a 20 20 20  ->nBuffer ){.   
15d40 20 63 68 61 72 20 2a 70 4e 65 77 3b 0a 20 20 20   char *pNew;.   
15d50 20 70 4d 73 72 2d 3e 6e 42 75 66 66 65 72 20 3d   pMsr->nBuffer =
15d60 20 6e 4c 69 73 74 2a 32 3b 0a 20 20 20 20 70 4e   nList*2;.    pN
15d70 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ew = (char *)sql
15d80 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4d 73  ite3_realloc(pMs
15d90 72 2d 3e 61 42 75 66 66 65 72 2c 20 70 4d 73 72  r->aBuffer, pMsr
15da0 2d 3e 6e 42 75 66 66 65 72 29 3b 0a 20 20 20 20  ->nBuffer);.    
15db0 69 66 28 20 21 70 4e 65 77 20 29 20 72 65 74 75  if( !pNew ) retu
15dc0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
15dd0 0a 20 20 20 20 70 4d 73 72 2d 3e 61 42 75 66 66  .    pMsr->aBuff
15de0 65 72 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a  er = pNew;.  }..
15df0 20 20 6d 65 6d 63 70 79 28 70 4d 73 72 2d 3e 61    memcpy(pMsr->a
15e00 42 75 66 66 65 72 2c 20 70 4c 69 73 74 2c 20 6e  Buffer, pList, n
15e10 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  List);.  return 
15e20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e  SQLITE_OK;.}..in
15e30 74 20 73 71 6c 69 74 65 33 46 74 73 33 4d 73 72  t sqlite3Fts3Msr
15e40 49 6e 63 72 4e 65 78 74 28 0a 20 20 46 74 73 33  IncrNext(.  Fts3
15e50 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
15e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
15e70 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
15e80 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c  dle */.  Fts3Mul
15e90 74 69 53 65 67 52 65 61 64 65 72 20 2a 70 4d 73  tiSegReader *pMs
15ea0 72 2c 20 20 20 20 20 20 20 2f 2a 20 4d 75 6c 74  r,       /* Mult
15eb0 69 2d 73 65 67 6d 65 6e 74 2d 72 65 61 64 65 72  i-segment-reader
15ec0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c   handle */.  sql
15ed0 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 44 6f  ite3_int64 *piDo
15ee0 63 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  cid,         /* 
15ef0 4f 55 54 3a 20 44 6f 63 69 64 20 76 61 6c 75 65  OUT: Docid value
15f00 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 61 50   */.  char **paP
15f10 6f 73 6c 69 73 74 2c 20 20 20 20 20 20 20 20 20  oslist,         
15f20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f        /* OUT: Po
15f30 69 6e 74 65 72 20 74 6f 20 70 6f 73 69 74 69 6f  inter to positio
15f40 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  n list */.  int 
15f50 2a 70 6e 50 6f 73 6c 69 73 74 20 20 20 20 20 20  *pnPoslist      
15f60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
15f70 55 54 3a 20 53 69 7a 65 20 6f 66 20 70 6f 73 69  UT: Size of posi
15f80 74 69 6f 6e 20 6c 69 73 74 20 69 6e 20 62 79 74  tion list in byt
15f90 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  es */.){.  int n
15fa0 4d 65 72 67 65 20 3d 20 70 4d 73 72 2d 3e 6e 41  Merge = pMsr->nA
15fb0 64 76 61 6e 63 65 3b 0a 20 20 46 74 73 33 53 65  dvance;.  Fts3Se
15fc0 67 52 65 61 64 65 72 20 2a 2a 61 70 53 65 67 6d  gReader **apSegm
15fd0 65 6e 74 20 3d 20 70 4d 73 72 2d 3e 61 70 53 65  ent = pMsr->apSe
15fe0 67 6d 65 6e 74 3b 0a 20 20 69 6e 74 20 28 2a 78  gment;.  int (*x
15ff0 43 6d 70 29 28 46 74 73 33 53 65 67 52 65 61 64  Cmp)(Fts3SegRead
16000 65 72 20 2a 2c 20 46 74 73 33 53 65 67 52 65 61  er *, Fts3SegRea
16010 64 65 72 20 2a 29 20 3d 20 28 0a 20 20 20 20 70  der *) = (.    p
16020 2d 3e 62 44 65 73 63 49 64 78 20 3f 20 66 74 73  ->bDescIdx ? fts
16030 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73  3SegReaderDoclis
16040 74 43 6d 70 52 65 76 20 3a 20 66 74 73 33 53 65  tCmpRev : fts3Se
16050 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d  gReaderDoclistCm
16060 70 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 6e 4d  p.  );..  if( nM
16070 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  erge==0 ){.    *
16080 70 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b 0a 20  paPoslist = 0;. 
16090 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
160a0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  _OK;.  }..  whil
160b0 65 28 20 31 20 29 7b 0a 20 20 20 20 46 74 73 33  e( 1 ){.    Fts3
160c0 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67 3b  SegReader *pSeg;
160d0 0a 20 20 20 20 70 53 65 67 20 3d 20 70 4d 73 72  .    pSeg = pMsr
160e0 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 30 5d 3b 0a  ->apSegment[0];.
160f0 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70  .    if( pSeg->p
16100 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30 20 29 7b  OffsetList==0 ){
16110 0a 20 20 20 20 20 20 2a 70 61 50 6f 73 6c 69 73  .      *paPoslis
16120 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  t = 0;.      bre
16130 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ak;.    }else{. 
16140 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
16150 20 20 20 63 68 61 72 20 2a 70 4c 69 73 74 3b 0a     char *pList;.
16160 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 73 74 3b        int nList;
16170 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
16180 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
16190 34 20 69 44 6f 63 69 64 20 3d 20 61 70 53 65 67  4 iDocid = apSeg
161a0 6d 65 6e 74 5b 30 5d 2d 3e 69 44 6f 63 69 64 3b  ment[0]->iDocid;
161b0 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  ..      rc = fts
161c0 33 53 65 67 52 65 61 64 65 72 4e 65 78 74 44 6f  3SegReaderNextDo
161d0 63 69 64 28 70 2c 20 61 70 53 65 67 6d 65 6e 74  cid(p, apSegment
161e0 5b 30 5d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c  [0], &pList, &nL
161f0 69 73 74 29 3b 0a 20 20 20 20 20 20 6a 20 3d 20  ist);.      j = 
16200 31 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  1;.      while( 
16210 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20  rc==SQLITE_OK . 
16220 20 20 20 20 20 20 20 26 26 20 6a 3c 6e 4d 65 72         && j<nMer
16230 67 65 0a 20 20 20 20 20 20 20 20 26 26 20 61 70  ge.        && ap
16240 53 65 67 6d 65 6e 74 5b 6a 5d 2d 3e 70 4f 66 66  Segment[j]->pOff
16250 73 65 74 4c 69 73 74 0a 20 20 20 20 20 20 20 20  setList.        
16260 26 26 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2d  && apSegment[j]-
16270 3e 69 44 6f 63 69 64 3d 3d 69 44 6f 63 69 64 0a  >iDocid==iDocid.
16280 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
16290 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61   rc = fts3SegRea
162a0 64 65 72 4e 65 78 74 44 6f 63 69 64 28 70 2c 20  derNextDocid(p, 
162b0 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2c 20 30 2c  apSegment[j], 0,
162c0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b   0);.        j++
162d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
162e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
162f0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
16300 20 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64       fts3SegRead
16310 65 72 53 6f 72 74 28 70 4d 73 72 2d 3e 61 70 53  erSort(pMsr->apS
16320 65 67 6d 65 6e 74 2c 20 6e 4d 65 72 67 65 2c 20  egment, nMerge, 
16330 6a 2c 20 78 43 6d 70 29 3b 0a 0a 20 20 20 20 20  j, xCmp);..     
16340 20 69 66 28 20 6e 4c 69 73 74 3e 30 20 26 26 20   if( nList>0 && 
16350 66 74 73 33 53 65 67 52 65 61 64 65 72 49 73 50  fts3SegReaderIsP
16360 65 6e 64 69 6e 67 28 61 70 53 65 67 6d 65 6e 74  ending(apSegment
16370 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
16380 72 63 20 3d 20 66 74 73 33 4d 73 72 42 75 66 66  rc = fts3MsrBuff
16390 65 72 44 61 74 61 28 70 4d 73 72 2c 20 70 4c 69  erData(pMsr, pLi
163a0 73 74 2c 20 6e 4c 69 73 74 2b 31 29 3b 0a 20 20  st, nList+1);.  
163b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
163c0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
163d0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73   rc;.        ass
163e0 65 72 74 28 20 28 70 4d 73 72 2d 3e 61 42 75 66  ert( (pMsr->aBuf
163f0 66 65 72 5b 6e 4c 69 73 74 5d 20 26 20 30 78 46  fer[nList] & 0xF
16400 45 29 3d 3d 30 78 30 30 20 29 3b 0a 20 20 20 20  E)==0x00 );.    
16410 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4d 73 72      pList = pMsr
16420 2d 3e 61 42 75 66 66 65 72 3b 0a 20 20 20 20 20  ->aBuffer;.     
16430 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 4d   }..      if( pM
16440 73 72 2d 3e 69 43 6f 6c 46 69 6c 74 65 72 3e 3d  sr->iColFilter>=
16450 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  0 ){.        fts
16460 33 43 6f 6c 75 6d 6e 46 69 6c 74 65 72 28 70 4d  3ColumnFilter(pM
16470 73 72 2d 3e 69 43 6f 6c 46 69 6c 74 65 72 2c 20  sr->iColFilter, 
16480 31 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73  1, &pList, &nLis
16490 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  t);.      }..   
164a0 20 20 20 69 66 28 20 6e 4c 69 73 74 3e 30 20 29     if( nList>0 )
164b0 7b 0a 20 20 20 20 20 20 20 20 2a 70 61 50 6f 73  {.        *paPos
164c0 6c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  list = pList;.  
164d0 20 20 20 20 20 20 2a 70 69 44 6f 63 69 64 20 3d        *piDocid =
164e0 20 69 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20   iDocid;.       
164f0 20 2a 70 6e 50 6f 73 6c 69 73 74 20 3d 20 6e 4c   *pnPoslist = nL
16500 69 73 74 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ist;.        bre
16510 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
16520 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
16530 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74  SQLITE_OK;.}..st
16540 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67  atic int fts3Seg
16550 52 65 61 64 65 72 53 74 61 72 74 28 0a 20 20 46  ReaderStart(.  F
16560 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
16570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16580 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * Virtual table 
16590 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33  handle */.  Fts3
165a0 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a  MultiSegReader *
165b0 70 43 73 72 2c 20 20 20 20 20 20 20 2f 2a 20 43  pCsr,       /* C
165c0 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  ursor object */.
165d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
165e0 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
165f0 20 20 2f 2a 20 54 65 72 6d 20 73 65 61 72 63 68    /* Term search
16600 65 64 20 66 6f 72 20 28 6f 72 20 4e 55 4c 4c 29  ed for (or NULL)
16610 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 20   */.  int nTerm 
16620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16630 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
16640 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65  of zTerm in byte
16650 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
16660 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 70 43  .  int nSeg = pC
16670 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 0a 20  sr->nSegment;.. 
16680 20 2f 2a 20 49 66 20 74 68 65 20 46 74 73 33 53   /* If the Fts3S
16690 65 67 46 69 6c 74 65 72 20 64 65 66 69 6e 65 73  egFilter defines
166a0 20 61 20 73 70 65 63 69 66 69 63 20 74 65 72 6d   a specific term
166b0 20 28 6f 72 20 74 65 72 6d 20 70 72 65 66 69 78   (or term prefix
166c0 29 20 74 6f 20 73 65 61 72 63 68 20 0a 20 20 2a  ) to search .  *
166d0 2a 20 66 6f 72 2c 20 74 68 65 6e 20 61 64 76 61  * for, then adva
166e0 6e 63 65 20 65 61 63 68 20 73 65 67 6d 65 6e 74  nce each segment
166f0 20 69 74 65 72 61 74 6f 72 20 75 6e 74 69 6c 20   iterator until 
16700 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 74  it points to a t
16710 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 65 71 75 61  erm of.  ** equa
16720 6c 20 6f 72 20 67 72 65 61 74 65 72 20 76 61 6c  l or greater val
16730 75 65 20 74 68 61 6e 20 74 68 65 20 73 70 65 63  ue than the spec
16740 69 66 69 65 64 20 74 65 72 6d 2e 20 54 68 69 73  ified term. This
16750 20 70 72 65 76 65 6e 74 73 20 6d 61 6e 79 0a 20   prevents many. 
16760 20 2a 2a 20 75 6e 6e 65 63 65 73 73 61 72 79 20   ** unnecessary 
16770 6d 65 72 67 65 2f 73 6f 72 74 20 6f 70 65 72 61  merge/sort opera
16780 74 69 6f 6e 73 20 66 6f 72 20 74 68 65 20 63 61  tions for the ca
16790 73 65 20 77 68 65 72 65 20 73 69 6e 67 6c 65 20  se where single 
167a0 73 65 67 6d 65 6e 74 0a 20 20 2a 2a 20 62 2d 74  segment.  ** b-t
167b0 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 20 63  ree leaf nodes c
167c0 6f 6e 74 61 69 6e 20 6d 6f 72 65 20 74 68 61 6e  ontain more than
167d0 20 6f 6e 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a   one term..  */.
167e0 20 20 66 6f 72 28 69 3d 30 3b 20 70 43 73 72 2d    for(i=0; pCsr-
167f0 3e 62 52 65 73 74 61 72 74 3d 3d 30 20 26 26 20  >bRestart==0 && 
16800 69 3c 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74  i<pCsr->nSegment
16810 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
16820 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 46 74 73  res = 0;.    Fts
16830 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67  3SegReader *pSeg
16840 20 3d 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65   = pCsr->apSegme
16850 6e 74 5b 69 5d 3b 0a 20 20 20 20 64 6f 20 7b 0a  nt[i];.    do {.
16860 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 66        int rc = f
16870 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 78 74  ts3SegReaderNext
16880 28 70 2c 20 70 53 65 67 2c 20 30 29 3b 0a 20 20  (p, pSeg, 0);.  
16890 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
168a0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
168b0 63 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 7a  c;.    }while( z
168c0 54 65 72 6d 20 26 26 20 28 72 65 73 20 3d 20 66  Term && (res = f
168d0 74 73 33 53 65 67 52 65 61 64 65 72 54 65 72 6d  ts3SegReaderTerm
168e0 43 6d 70 28 70 53 65 67 2c 20 7a 54 65 72 6d 2c  Cmp(pSeg, zTerm,
168f0 20 6e 54 65 72 6d 29 29 3c 30 20 29 3b 0a 0a 20   nTerm))<0 );.. 
16900 20 20 20 69 66 28 20 70 53 65 67 2d 3e 62 4c 6f     if( pSeg->bLo
16910 6f 6b 75 70 20 26 26 20 72 65 73 21 3d 30 20 29  okup && res!=0 )
16920 7b 0a 20 20 20 20 20 20 66 74 73 33 53 65 67 52  {.      fts3SegR
16930 65 61 64 65 72 53 65 74 45 6f 66 28 70 53 65 67  eaderSetEof(pSeg
16940 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  );.    }.  }.  f
16950 74 73 33 53 65 67 52 65 61 64 65 72 53 6f 72 74  ts3SegReaderSort
16960 28 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74  (pCsr->apSegment
16970 2c 20 6e 53 65 67 2c 20 6e 53 65 67 2c 20 66 74  , nSeg, nSeg, ft
16980 73 33 53 65 67 52 65 61 64 65 72 43 6d 70 29 3b  s3SegReaderCmp);
16990 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
169a0 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c  E_OK;.}..int sql
169b0 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
169c0 72 53 74 61 72 74 28 0a 20 20 46 74 73 33 54 61  rStart(.  Fts3Ta
169d0 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
169e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
169f0 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
16a00 65 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69  e */.  Fts3Multi
16a10 53 65 67 52 65 61 64 65 72 20 2a 70 43 73 72 2c  SegReader *pCsr,
16a20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
16a30 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
16a40 33 53 65 67 46 69 6c 74 65 72 20 2a 70 46 69 6c  3SegFilter *pFil
16a50 74 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ter          /* 
16a60 52 65 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20  Restrictions on 
16a70 72 61 6e 67 65 20 6f 66 20 69 74 65 72 61 74 69  range of iterati
16a80 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 70 43 73 72 2d  on */.){.  pCsr-
16a90 3e 70 46 69 6c 74 65 72 20 3d 20 70 46 69 6c 74  >pFilter = pFilt
16aa0 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  er;.  return fts
16ab0 33 53 65 67 52 65 61 64 65 72 53 74 61 72 74 28  3SegReaderStart(
16ac0 70 2c 20 70 43 73 72 2c 20 70 46 69 6c 74 65 72  p, pCsr, pFilter
16ad0 2d 3e 7a 54 65 72 6d 2c 20 70 46 69 6c 74 65 72  ->zTerm, pFilter
16ae0 2d 3e 6e 54 65 72 6d 29 3b 0a 7d 0a 0a 69 6e 74  ->nTerm);.}..int
16af0 20 73 71 6c 69 74 65 33 46 74 73 33 4d 73 72 49   sqlite3Fts3MsrI
16b00 6e 63 72 53 74 61 72 74 28 0a 20 20 46 74 73 33  ncrStart(.  Fts3
16b10 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
16b20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
16b30 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
16b40 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c  dle */.  Fts3Mul
16b50 74 69 53 65 67 52 65 61 64 65 72 20 2a 70 43 73  tiSegReader *pCs
16b60 72 2c 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73  r,       /* Curs
16b70 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  or object */.  i
16b80 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
16b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16ba0 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 6d 61 74 63  * Column to matc
16bb0 68 20 6f 6e 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74  h on. */.  const
16bc0 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20   char *zTerm,   
16bd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
16be0 72 6d 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  rm to iterate th
16bf0 72 6f 75 67 68 20 61 20 64 6f 63 6c 69 73 74 20  rough a doclist 
16c00 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  for */.  int nTe
16c10 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rm              
16c20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
16c30 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a  er of bytes in z
16c40 54 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  Term */.){.  int
16c50 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   i;.  int rc;.  
16c60 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 70  int nSegment = p
16c70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20  Csr->nSegment;. 
16c80 20 69 6e 74 20 28 2a 78 43 6d 70 29 28 46 74 73   int (*xCmp)(Fts
16c90 33 53 65 67 52 65 61 64 65 72 20 2a 2c 20 46 74  3SegReader *, Ft
16ca0 73 33 53 65 67 52 65 61 64 65 72 20 2a 29 20 3d  s3SegReader *) =
16cb0 20 28 0a 20 20 20 20 70 2d 3e 62 44 65 73 63 49   (.    p->bDescI
16cc0 64 78 20 3f 20 66 74 73 33 53 65 67 52 65 61 64  dx ? fts3SegRead
16cd0 65 72 44 6f 63 6c 69 73 74 43 6d 70 52 65 76 20  erDoclistCmpRev 
16ce0 3a 20 66 74 73 33 53 65 67 52 65 61 64 65 72 44  : fts3SegReaderD
16cf0 6f 63 6c 69 73 74 43 6d 70 0a 20 20 29 3b 0a 0a  oclistCmp.  );..
16d00 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
16d10 70 46 69 6c 74 65 72 3d 3d 30 20 29 3b 0a 20 20  pFilter==0 );.  
16d20 61 73 73 65 72 74 28 20 7a 54 65 72 6d 20 26 26  assert( zTerm &&
16d30 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f   nTerm>0 );..  /
16d40 2a 20 41 64 76 61 6e 63 65 20 65 61 63 68 20 73  * Advance each s
16d50 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 20  egment iterator 
16d60 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20  until it points 
16d70 74 6f 20 74 68 65 20 74 65 72 6d 20 7a 54 65 72  to the term zTer
16d80 6d 2f 6e 54 65 72 6d 2e 20 2a 2f 0a 20 20 72 63  m/nTerm. */.  rc
16d90 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72   = fts3SegReader
16da0 53 74 61 72 74 28 70 2c 20 70 43 73 72 2c 20 7a  Start(p, pCsr, z
16db0 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20  Term, nTerm);.  
16dc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16dd0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
16de0 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 68    /* Determine h
16df0 6f 77 20 6d 61 6e 79 20 6f 66 20 74 68 65 20 73  ow many of the s
16e00 65 67 6d 65 6e 74 73 20 61 63 74 75 61 6c 6c 79  egments actually
16e10 20 70 6f 69 6e 74 20 74 6f 20 7a 54 65 72 6d 2f   point to zTerm/
16e20 6e 54 65 72 6d 2e 20 2a 2f 0a 20 20 66 6f 72 28  nTerm. */.  for(
16e30 69 3d 30 3b 20 69 3c 6e 53 65 67 6d 65 6e 74 3b  i=0; i<nSegment;
16e40 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 33 53   i++){.    Fts3S
16e50 65 67 52 65 61 64 65 72 20 2a 70 53 65 67 20 3d  egReader *pSeg =
16e60 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74   pCsr->apSegment
16e70 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 21 70 53  [i];.    if( !pS
16e80 65 67 2d 3e 61 4e 6f 64 65 20 7c 7c 20 66 74 73  eg->aNode || fts
16e90 33 53 65 67 52 65 61 64 65 72 54 65 72 6d 43 6d  3SegReaderTermCm
16ea0 70 28 70 53 65 67 2c 20 7a 54 65 72 6d 2c 20 6e  p(pSeg, zTerm, n
16eb0 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 20 20 62  Term) ){.      b
16ec0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
16ed0 20 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65    pCsr->nAdvance
16ee0 20 3d 20 69 3b 0a 0a 20 20 2f 2a 20 41 64 76 61   = i;..  /* Adva
16ef0 6e 63 65 20 65 61 63 68 20 6f 66 20 74 68 65 20  nce each of the 
16f00 73 65 67 6d 65 6e 74 73 20 74 6f 20 70 6f 69 6e  segments to poin
16f10 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 64  t to the first d
16f20 6f 63 69 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  ocid. */.  for(i
16f30 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 41 64 76  =0; i<pCsr->nAdv
16f40 61 6e 63 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ance; i++){.    
16f50 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64  rc = fts3SegRead
16f60 65 72 46 69 72 73 74 44 6f 63 69 64 28 70 2c 20  erFirstDocid(p, 
16f70 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b  pCsr->apSegment[
16f80 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  i]);.    if( rc!
16f90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
16fa0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 66 74  urn rc;.  }.  ft
16fb0 73 33 53 65 67 52 65 61 64 65 72 53 6f 72 74 28  s3SegReaderSort(
16fc0 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 2c  pCsr->apSegment,
16fd0 20 69 2c 20 69 2c 20 78 43 6d 70 29 3b 0a 0a 20   i, i, xCmp);.. 
16fe0 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3c 30 20   assert( iCol<0 
16ff0 7c 7c 20 69 43 6f 6c 3c 70 2d 3e 6e 43 6f 6c 75  || iCol<p->nColu
17000 6d 6e 20 29 3b 0a 20 20 70 43 73 72 2d 3e 69 43  mn );.  pCsr->iC
17010 6f 6c 46 69 6c 74 65 72 20 3d 20 69 43 6f 6c 3b  olFilter = iCol;
17020 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
17030 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
17040 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
17050 63 61 6c 6c 65 64 20 6f 6e 20 61 20 4d 75 6c 74  called on a Mult
17060 69 53 65 67 52 65 61 64 65 72 20 74 68 61 74 20  iSegReader that 
17070 68 61 73 20 62 65 65 6e 20 73 74 61 72 74 65 64  has been started
17080 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
17090 33 46 74 73 33 4d 73 72 49 6e 63 72 53 74 61 72  3Fts3MsrIncrStar
170a0 74 28 29 2e 20 4f 6e 65 20 6f 72 20 6d 6f 72 65  t(). One or more
170b0 20 63 61 6c 6c 73 20 74 6f 20 4d 73 72 49 6e 63   calls to MsrInc
170c0 72 4e 65 78 74 28 29 20 6d 61 79 20 61 6c 73 6f  rNext() may also
170d0 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 6d 61  .** have been ma
170e0 64 65 2e 20 43 61 6c 6c 69 6e 67 20 74 68 69 73  de. Calling this
170f0 20 66 75 6e 63 74 69 6f 6e 20 70 75 74 73 20 74   function puts t
17100 68 65 20 4d 75 6c 74 69 53 65 67 52 65 61 64 65  he MultiSegReade
17110 72 20 69 6e 20 73 75 63 68 0a 2a 2a 20 61 20 73  r in such.** a s
17120 74 61 74 65 20 74 68 61 74 20 69 66 20 74 68 65  tate that if the
17130 20 6e 65 78 74 20 74 77 6f 20 63 61 6c 6c 73 20   next two calls 
17140 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c  are:.**.**   sql
17150 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
17160 72 53 74 61 72 74 28 29 0a 2a 2a 20 20 20 73 71  rStart().**   sq
17170 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64  lite3Fts3SegRead
17180 65 72 53 74 65 70 28 29 0a 2a 2a 0a 2a 2a 20 74  erStep().**.** t
17190 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20 64  hen the entire d
171a0 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 65 20 74  oclist for the t
171b0 65 72 6d 20 69 73 20 61 76 61 69 6c 61 62 6c 65  erm is available
171c0 20 69 6e 20 0a 2a 2a 20 4d 75 6c 74 69 53 65 67   in .** MultiSeg
171d0 52 65 61 64 65 72 2e 61 44 6f 63 6c 69 73 74 2f  Reader.aDoclist/
171e0 6e 44 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 69 6e 74  nDoclist..*/.int
171f0 20 73 71 6c 69 74 65 33 46 74 73 33 4d 73 72 49   sqlite3Fts3MsrI
17200 6e 63 72 52 65 73 74 61 72 74 28 46 74 73 33 4d  ncrRestart(Fts3M
17210 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70  ultiSegReader *p
17220 43 73 72 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  Csr){.  int i;  
17230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17240 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
17250 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
17260 67 68 20 73 65 67 6d 65 6e 74 2d 72 65 61 64 65  gh segment-reade
17270 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  rs */..  assert(
17280 20 70 43 73 72 2d 3e 7a 54 65 72 6d 3d 3d 30 20   pCsr->zTerm==0 
17290 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 73  );.  assert( pCs
172a0 72 2d 3e 6e 54 65 72 6d 3d 3d 30 20 29 3b 0a 20  r->nTerm==0 );. 
172b0 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 61   assert( pCsr->a
172c0 44 6f 63 6c 69 73 74 3d 3d 30 20 29 3b 0a 20 20  Doclist==0 );.  
172d0 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 6e 44  assert( pCsr->nD
172e0 6f 63 6c 69 73 74 3d 3d 30 20 29 3b 0a 0a 20 20  oclist==0 );..  
172f0 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65 20 3d  pCsr->nAdvance =
17300 20 30 3b 0a 20 20 70 43 73 72 2d 3e 62 52 65 73   0;.  pCsr->bRes
17310 74 61 72 74 20 3d 20 31 3b 0a 20 20 66 6f 72 28  tart = 1;.  for(
17320 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 53 65  i=0; i<pCsr->nSe
17330 67 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  gment; i++){.   
17340 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74   pCsr->apSegment
17350 5b 69 5d 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74  [i]->pOffsetList
17360 20 3d 20 30 3b 0a 20 20 20 20 70 43 73 72 2d 3e   = 0;.    pCsr->
17370 61 70 53 65 67 6d 65 6e 74 5b 69 5d 2d 3e 6e 4f  apSegment[i]->nO
17380 66 66 73 65 74 4c 69 73 74 20 3d 20 30 3b 0a 20  ffsetList = 0;. 
17390 20 20 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65     pCsr->apSegme
173a0 6e 74 5b 69 5d 2d 3e 69 44 6f 63 69 64 20 3d 20  nt[i]->iDocid = 
173b0 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  0;.  }..  return
173c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
173d0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 53  int sqlite3Fts3S
173e0 65 67 52 65 61 64 65 72 53 74 65 70 28 0a 20 20  egReaderStep(.  
173f0 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
17400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17410 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  /* Virtual table
17420 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73   handle */.  Fts
17430 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20  3MultiSegReader 
17440 2a 70 43 73 72 20 20 20 20 20 20 20 20 2f 2a 20  *pCsr        /* 
17450 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  Cursor object */
17460 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
17470 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 6e 74  QLITE_OK;..  int
17480 20 69 73 49 67 6e 6f 72 65 45 6d 70 74 79 20 3d   isIgnoreEmpty =
17490 20 20 28 70 43 73 72 2d 3e 70 46 69 6c 74 65 72    (pCsr->pFilter
174a0 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 33 5f 53  ->flags & FTS3_S
174b0 45 47 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d  EGMENT_IGNORE_EM
174c0 50 54 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  PTY);.  int isRe
174d0 71 75 69 72 65 50 6f 73 20 3d 20 20 20 28 70 43  quirePos =   (pC
174e0 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e 66 6c 61  sr->pFilter->fla
174f0 67 73 20 26 20 46 54 53 33 5f 53 45 47 4d 45 4e  gs & FTS3_SEGMEN
17500 54 5f 52 45 51 55 49 52 45 5f 50 4f 53 29 3b 0a  T_REQUIRE_POS);.
17510 20 20 69 6e 74 20 69 73 43 6f 6c 46 69 6c 74 65    int isColFilte
17520 72 20 3d 20 20 20 20 28 70 43 73 72 2d 3e 70 46  r =    (pCsr->pF
17530 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  ilter->flags & F
17540 54 53 33 5f 53 45 47 4d 45 4e 54 5f 43 4f 4c 55  TS3_SEGMENT_COLU
17550 4d 4e 5f 46 49 4c 54 45 52 29 3b 0a 20 20 69 6e  MN_FILTER);.  in
17560 74 20 69 73 50 72 65 66 69 78 20 3d 20 20 20 20  t isPrefix =    
17570 20 20 20 28 70 43 73 72 2d 3e 70 46 69 6c 74 65     (pCsr->pFilte
17580 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 33 5f  r->flags & FTS3_
17590 53 45 47 4d 45 4e 54 5f 50 52 45 46 49 58 29 3b  SEGMENT_PREFIX);
175a0 0a 20 20 69 6e 74 20 69 73 53 63 61 6e 20 3d 20  .  int isScan = 
175b0 20 20 20 20 20 20 20 20 28 70 43 73 72 2d 3e 70          (pCsr->p
175c0 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26 20  Filter->flags & 
175d0 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 53 43 41  FTS3_SEGMENT_SCA
175e0 4e 29 3b 0a 20 20 69 6e 74 20 69 73 46 69 72 73  N);.  int isFirs
175f0 74 20 3d 20 20 20 20 20 20 20 20 28 70 43 73 72  t =        (pCsr
17600 2d 3e 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73  ->pFilter->flags
17610 20 26 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f   & FTS3_SEGMENT_
17620 46 49 52 53 54 29 3b 0a 0a 20 20 46 74 73 33 53  FIRST);..  Fts3S
17630 65 67 52 65 61 64 65 72 20 2a 2a 61 70 53 65 67  egReader **apSeg
17640 6d 65 6e 74 20 3d 20 70 43 73 72 2d 3e 61 70 53  ment = pCsr->apS
17650 65 67 6d 65 6e 74 3b 0a 20 20 69 6e 74 20 6e 53  egment;.  int nS
17660 65 67 6d 65 6e 74 20 3d 20 70 43 73 72 2d 3e 6e  egment = pCsr->n
17670 53 65 67 6d 65 6e 74 3b 0a 20 20 46 74 73 33 53  Segment;.  Fts3S
17680 65 67 46 69 6c 74 65 72 20 2a 70 46 69 6c 74 65  egFilter *pFilte
17690 72 20 3d 20 70 43 73 72 2d 3e 70 46 69 6c 74 65  r = pCsr->pFilte
176a0 72 3b 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70 29  r;.  int (*xCmp)
176b0 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a  (Fts3SegReader *
176c0 2c 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20  , Fts3SegReader 
176d0 2a 29 20 3d 20 28 0a 20 20 20 20 70 2d 3e 62 44  *) = (.    p->bD
176e0 65 73 63 49 64 78 20 3f 20 66 74 73 33 53 65 67  escIdx ? fts3Seg
176f0 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70  ReaderDoclistCmp
17700 52 65 76 20 3a 20 66 74 73 33 53 65 67 52 65 61  Rev : fts3SegRea
17710 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 0a 20 20  derDoclistCmp.  
17720 29 3b 0a 0a 20 20 69 66 28 20 70 43 73 72 2d 3e  );..  if( pCsr->
17730 6e 53 65 67 6d 65 6e 74 3d 3d 30 20 29 20 72 65  nSegment==0 ) re
17740 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17750 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 6e 74 20  .  do {.    int 
17760 6e 4d 65 72 67 65 3b 0a 20 20 20 20 69 6e 74 20  nMerge;.    int 
17770 69 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41 64 76  i;.  .    /* Adv
17780 61 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 70  ance the first p
17790 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65 20 65 6e  Csr->nAdvance en
177a0 74 72 69 65 73 20 69 6e 20 74 68 65 20 61 70 53  tries in the apS
177b0 65 67 6d 65 6e 74 5b 5d 20 61 72 72 61 79 0a 20  egment[] array. 
177c0 20 20 20 2a 2a 20 66 6f 72 77 61 72 64 2e 20 54     ** forward. T
177d0 68 65 6e 20 73 6f 72 74 20 74 68 65 20 6c 69 73  hen sort the lis
177e0 74 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 63 75  t in order of cu
177f0 72 72 65 6e 74 20 74 65 72 6d 20 61 67 61 69 6e  rrent term again
17800 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  .  .    */.    f
17810 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e  or(i=0; i<pCsr->
17820 6e 41 64 76 61 6e 63 65 3b 20 69 2b 2b 29 7b 0a  nAdvance; i++){.
17830 20 20 20 20 20 20 46 74 73 33 53 65 67 52 65 61        Fts3SegRea
17840 64 65 72 20 2a 70 53 65 67 20 3d 20 61 70 53 65  der *pSeg = apSe
17850 67 6d 65 6e 74 5b 69 5d 3b 0a 20 20 20 20 20 20  gment[i];.      
17860 69 66 28 20 70 53 65 67 2d 3e 62 4c 6f 6f 6b 75  if( pSeg->bLooku
17870 70 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  p ){.        fts
17880 33 53 65 67 52 65 61 64 65 72 53 65 74 45 6f 66  3SegReaderSetEof
17890 28 70 53 65 67 29 3b 0a 20 20 20 20 20 20 7d 65  (pSeg);.      }e
178a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
178b0 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e  = fts3SegReaderN
178c0 65 78 74 28 70 2c 20 70 53 65 67 2c 20 30 29 3b  ext(p, pSeg, 0);
178d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
178e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
178f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
17900 20 20 7d 0a 20 20 20 20 66 74 73 33 53 65 67 52    }.    fts3SegR
17910 65 61 64 65 72 53 6f 72 74 28 61 70 53 65 67 6d  eaderSort(apSegm
17920 65 6e 74 2c 20 6e 53 65 67 6d 65 6e 74 2c 20 70  ent, nSegment, p
17930 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65 2c 20 66  Csr->nAdvance, f
17940 74 73 33 53 65 67 52 65 61 64 65 72 43 6d 70 29  ts3SegReaderCmp)
17950 3b 0a 20 20 20 20 70 43 73 72 2d 3e 6e 41 64 76  ;.    pCsr->nAdv
17960 61 6e 63 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  ance = 0;..    /
17970 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 73 65 67  * If all the seg
17980 2d 72 65 61 64 65 72 73 20 61 72 65 20 61 74 20  -readers are at 
17990 45 4f 46 2c 20 77 65 27 72 65 20 66 69 6e 69 73  EOF, we're finis
179a0 68 65 64 2e 20 72 65 74 75 72 6e 20 53 51 4c 49  hed. return SQLI
179b0 54 45 5f 4f 4b 2e 20 2a 2f 0a 20 20 20 20 61 73  TE_OK. */.    as
179c0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
179d0 5f 4f 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 61  _OK );.    if( a
179e0 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 61 4e 6f  pSegment[0]->aNo
179f0 64 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a  de==0 ) break;..
17a00 20 20 20 20 70 43 73 72 2d 3e 6e 54 65 72 6d 20      pCsr->nTerm 
17a10 3d 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e  = apSegment[0]->
17a20 6e 54 65 72 6d 3b 0a 20 20 20 20 70 43 73 72 2d  nTerm;.    pCsr-
17a30 3e 7a 54 65 72 6d 20 3d 20 61 70 53 65 67 6d 65  >zTerm = apSegme
17a40 6e 74 5b 30 5d 2d 3e 7a 54 65 72 6d 3b 0a 0a 20  nt[0]->zTerm;.. 
17a50 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
17a60 20 61 20 70 72 65 66 69 78 2d 73 65 61 72 63 68   a prefix-search
17a70 2c 20 61 6e 64 20 69 66 20 74 68 65 20 74 65 72  , and if the ter
17a80 6d 20 74 68 61 74 20 61 70 53 65 67 6d 65 6e 74  m that apSegment
17a90 5b 30 5d 20 70 6f 69 6e 74 73 0a 20 20 20 20 2a  [0] points.    *
17aa0 2a 20 74 6f 20 64 6f 65 73 20 6e 6f 74 20 73 68  * to does not sh
17ab0 61 72 65 20 61 20 73 75 66 66 69 78 20 77 69 74  are a suffix wit
17ac0 68 20 70 46 69 6c 74 65 72 2d 3e 7a 54 65 72 6d  h pFilter->zTerm
17ad0 2f 6e 54 65 72 6d 2c 20 74 68 65 6e 20 61 6c 6c  /nTerm, then all
17ae0 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65   .    ** require
17af0 64 20 63 61 6c 6c 62 61 63 6b 73 20 68 61 76 65  d callbacks have
17b00 20 62 65 65 6e 20 6d 61 64 65 2e 20 49 6e 20 74   been made. In t
17b10 68 69 73 20 63 61 73 65 20 65 78 69 74 20 65 61  his case exit ea
17b20 72 6c 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  rly..    **.    
17b30 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 66  ** Similarly, if
17b40 20 74 68 69 73 20 69 73 20 61 20 73 65 61 72 63   this is a searc
17b50 68 20 66 6f 72 20 61 6e 20 65 78 61 63 74 20 6d  h for an exact m
17b60 61 74 63 68 2c 20 61 6e 64 20 74 68 65 20 66 69  atch, and the fi
17b70 72 73 74 20 74 65 72 6d 0a 20 20 20 20 2a 2a 20  rst term.    ** 
17b80 6f 66 20 73 65 67 6d 65 6e 74 20 61 70 53 65 67  of segment apSeg
17b90 6d 65 6e 74 5b 30 5d 20 69 73 20 6e 6f 74 20 61  ment[0] is not a
17ba0 20 6d 61 74 63 68 2c 20 65 78 69 74 20 65 61 72   match, exit ear
17bb0 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ly..    */.    i
17bc0 66 28 20 70 46 69 6c 74 65 72 2d 3e 7a 54 65 72  f( pFilter->zTer
17bd0 6d 20 26 26 20 21 69 73 53 63 61 6e 20 29 7b 0a  m && !isScan ){.
17be0 20 20 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e        if( pCsr->
17bf0 6e 54 65 72 6d 3c 70 46 69 6c 74 65 72 2d 3e 6e  nTerm<pFilter->n
17c00 54 65 72 6d 20 0a 20 20 20 20 20 20 20 7c 7c 20  Term .       || 
17c10 28 21 69 73 50 72 65 66 69 78 20 26 26 20 70 43  (!isPrefix && pC
17c20 73 72 2d 3e 6e 54 65 72 6d 3e 70 46 69 6c 74 65  sr->nTerm>pFilte
17c30 72 2d 3e 6e 54 65 72 6d 29 0a 20 20 20 20 20 20  r->nTerm).      
17c40 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 43 73 72 2d   || memcmp(pCsr-
17c50 3e 7a 54 65 72 6d 2c 20 70 46 69 6c 74 65 72 2d  >zTerm, pFilter-
17c60 3e 7a 54 65 72 6d 2c 20 70 46 69 6c 74 65 72 2d  >zTerm, pFilter-
17c70 3e 6e 54 65 72 6d 29 20 0a 20 20 20 20 20 20 29  >nTerm) .      )
17c80 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
17c90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
17ca0 20 20 20 20 6e 4d 65 72 67 65 20 3d 20 31 3b 0a      nMerge = 1;.
17cb0 20 20 20 20 77 68 69 6c 65 28 20 6e 4d 65 72 67      while( nMerg
17cc0 65 3c 6e 53 65 67 6d 65 6e 74 20 0a 20 20 20 20  e<nSegment .    
17cd0 20 20 20 20 26 26 20 61 70 53 65 67 6d 65 6e 74      && apSegment
17ce0 5b 6e 4d 65 72 67 65 5d 2d 3e 61 4e 6f 64 65 0a  [nMerge]->aNode.
17cf0 20 20 20 20 20 20 20 20 26 26 20 61 70 53 65 67          && apSeg
17d00 6d 65 6e 74 5b 6e 4d 65 72 67 65 5d 2d 3e 6e 54  ment[nMerge]->nT
17d10 65 72 6d 3d 3d 70 43 73 72 2d 3e 6e 54 65 72 6d  erm==pCsr->nTerm
17d20 20 0a 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d   .        && 0==
17d30 6d 65 6d 63 6d 70 28 70 43 73 72 2d 3e 7a 54 65  memcmp(pCsr->zTe
17d40 72 6d 2c 20 61 70 53 65 67 6d 65 6e 74 5b 6e 4d  rm, apSegment[nM
17d50 65 72 67 65 5d 2d 3e 7a 54 65 72 6d 2c 20 70 43  erge]->zTerm, pC
17d60 73 72 2d 3e 6e 54 65 72 6d 29 0a 20 20 20 20 29  sr->nTerm).    )
17d70 7b 0a 20 20 20 20 20 20 6e 4d 65 72 67 65 2b 2b  {.      nMerge++
17d80 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
17d90 65 72 74 28 20 69 73 49 67 6e 6f 72 65 45 6d 70  ert( isIgnoreEmp
17da0 74 79 20 7c 7c 20 28 69 73 52 65 71 75 69 72 65  ty || (isRequire
17db0 50 6f 73 20 26 26 20 21 69 73 43 6f 6c 46 69 6c  Pos && !isColFil
17dc0 74 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ter) );.    if( 
17dd0 6e 4d 65 72 67 65 3d 3d 31 20 0a 20 20 20 20 20  nMerge==1 .     
17de0 26 26 20 21 69 73 49 67 6e 6f 72 65 45 6d 70 74  && !isIgnoreEmpt
17df0 79 20 0a 20 20 20 20 20 26 26 20 21 69 73 46 69  y .     && !isFi
17e00 72 73 74 20 0a 20 20 20 20 20 26 26 20 28 70 2d  rst .     && (p-
17e10 3e 62 44 65 73 63 49 64 78 3d 3d 30 20 7c 7c 20  >bDescIdx==0 || 
17e20 66 74 73 33 53 65 67 52 65 61 64 65 72 49 73 50  fts3SegReaderIsP
17e30 65 6e 64 69 6e 67 28 61 70 53 65 67 6d 65 6e 74  ending(apSegment
17e40 5b 30 5d 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a  [0])==0).    ){.
17e50 20 20 20 20 20 20 70 43 73 72 2d 3e 6e 44 6f 63        pCsr->nDoc
17e60 6c 69 73 74 20 3d 20 61 70 53 65 67 6d 65 6e 74  list = apSegment
17e70 5b 30 5d 2d 3e 6e 44 6f 63 6c 69 73 74 3b 0a 20  [0]->nDoclist;. 
17e80 20 20 20 20 20 69 66 28 20 66 74 73 33 53 65 67       if( fts3Seg
17e90 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28  ReaderIsPending(
17ea0 61 70 53 65 67 6d 65 6e 74 5b 30 5d 29 20 29 7b  apSegment[0]) ){
17eb0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74  .        rc = ft
17ec0 73 33 4d 73 72 42 75 66 66 65 72 44 61 74 61 28  s3MsrBufferData(
17ed0 70 43 73 72 2c 20 61 70 53 65 67 6d 65 6e 74 5b  pCsr, apSegment[
17ee0 30 5d 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 70 43  0]->aDoclist, pC
17ef0 73 72 2d 3e 6e 44 6f 63 6c 69 73 74 29 3b 0a 20  sr->nDoclist);. 
17f00 20 20 20 20 20 20 20 70 43 73 72 2d 3e 61 44 6f         pCsr->aDo
17f10 63 6c 69 73 74 20 3d 20 70 43 73 72 2d 3e 61 42  clist = pCsr->aB
17f20 75 66 66 65 72 3b 0a 20 20 20 20 20 20 7d 65 6c  uffer;.      }el
17f30 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 73 72  se{.        pCsr
17f40 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20 61 70 53  ->aDoclist = apS
17f50 65 67 6d 65 6e 74 5b 30 5d 2d 3e 61 44 6f 63 6c  egment[0]->aDocl
17f60 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ist;.      }.   
17f70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17f80 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c 49  E_OK ) rc = SQLI
17f90 54 45 5f 52 4f 57 3b 0a 20 20 20 20 7d 65 6c 73  TE_ROW;.    }els
17fa0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 44 6f  e{.      int nDo
17fb0 63 6c 69 73 74 20 3d 20 30 3b 20 20 20 20 20 20  clist = 0;      
17fc0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
17fd0 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20  doclist */.     
17fe0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
17ff0 50 72 65 76 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Prev = 0;    /* 
18000 50 72 65 76 69 6f 75 73 20 64 6f 63 69 64 20 73  Previous docid s
18010 74 6f 72 65 64 20 69 6e 20 64 6f 63 6c 69 73 74  tored in doclist
18020 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   */..      /* Th
18030 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 6f  e current term o
18040 66 20 74 68 65 20 66 69 72 73 74 20 6e 4d 65 72  f the first nMer
18050 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ge entries in th
18060 65 20 61 72 72 61 79 0a 20 20 20 20 20 20 2a 2a  e array.      **
18070 20 6f 66 20 46 74 73 33 53 65 67 52 65 61 64 65   of Fts3SegReade
18080 72 20 6f 62 6a 65 63 74 73 20 69 73 20 74 68 65  r objects is the
18090 20 73 61 6d 65 2e 20 54 68 65 20 64 6f 63 6c 69   same. The docli
180a0 73 74 73 20 6d 75 73 74 20 62 65 20 6d 65 72 67  sts must be merg
180b0 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ed.      ** and 
180c0 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 72 65  a single term re
180d0 74 75 72 6e 65 64 20 77 69 74 68 20 74 68 65 20  turned with the 
180e0 6d 65 72 67 65 64 20 64 6f 63 6c 69 73 74 2e 0a  merged doclist..
180f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66        */.      f
18100 6f 72 28 69 3d 30 3b 20 69 3c 6e 4d 65 72 67 65  or(i=0; i<nMerge
18110 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
18120 66 74 73 33 53 65 67 52 65 61 64 65 72 46 69 72  fts3SegReaderFir
18130 73 74 44 6f 63 69 64 28 70 2c 20 61 70 53 65 67  stDocid(p, apSeg
18140 6d 65 6e 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20  ment[i]);.      
18150 7d 0a 20 20 20 20 20 20 66 74 73 33 53 65 67 52  }.      fts3SegR
18160 65 61 64 65 72 53 6f 72 74 28 61 70 53 65 67 6d  eaderSort(apSegm
18170 65 6e 74 2c 20 6e 4d 65 72 67 65 2c 20 6e 4d 65  ent, nMerge, nMe
18180 72 67 65 2c 20 78 43 6d 70 29 3b 0a 20 20 20 20  rge, xCmp);.    
18190 20 20 77 68 69 6c 65 28 20 61 70 53 65 67 6d 65    while( apSegme
181a0 6e 74 5b 30 5d 2d 3e 70 4f 66 66 73 65 74 4c 69  nt[0]->pOffsetLi
181b0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  st ){.        in
181c0 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
181d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
181e0 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 68  r of segments th
181f0 61 74 20 73 68 61 72 65 20 61 20 64 6f 63 69 64  at share a docid
18200 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
18210 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20   *pList = 0;.   
18220 20 20 20 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d       int nList =
18230 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
18240 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 73  nByte;.        s
18250 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 6f  qlite3_int64 iDo
18260 63 69 64 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b  cid = apSegment[
18270 30 5d 2d 3e 69 44 6f 63 69 64 3b 0a 20 20 20 20  0]->iDocid;.    
18280 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65      fts3SegReade
18290 72 4e 65 78 74 44 6f 63 69 64 28 70 2c 20 61 70  rNextDocid(p, ap
182a0 53 65 67 6d 65 6e 74 5b 30 5d 2c 20 26 70 4c 69  Segment[0], &pLi
182b0 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20  st, &nList);.   
182c0 20 20 20 20 20 6a 20 3d 20 31 3b 0a 20 20 20 20       j = 1;.    
182d0 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 6e 4d 65      while( j<nMe
182e0 72 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  rge.            
182f0 26 26 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2d  && apSegment[j]-
18300 3e 70 4f 66 66 73 65 74 4c 69 73 74 0a 20 20 20  >pOffsetList.   
18310 20 20 20 20 20 20 20 20 20 26 26 20 61 70 53 65           && apSe
18320 67 6d 65 6e 74 5b 6a 5d 2d 3e 69 44 6f 63 69 64  gment[j]->iDocid
18330 3d 3d 69 44 6f 63 69 64 0a 20 20 20 20 20 20 20  ==iDocid.       
18340 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74   ){.          ft
18350 73 33 53 65 67 52 65 61 64 65 72 4e 65 78 74 44  s3SegReaderNextD
18360 6f 63 69 64 28 70 2c 20 61 70 53 65 67 6d 65 6e  ocid(p, apSegmen
18370 74 5b 6a 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20  t[j], 0, 0);.   
18380 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
18390 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
183a0 66 28 20 69 73 43 6f 6c 46 69 6c 74 65 72 20 29  f( isColFilter )
183b0 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33  {.          fts3
183c0 43 6f 6c 75 6d 6e 46 69 6c 74 65 72 28 70 46 69  ColumnFilter(pFi
183d0 6c 74 65 72 2d 3e 69 43 6f 6c 2c 20 30 2c 20 26  lter->iCol, 0, &
183e0 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a  pList, &nList);.
183f0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
18400 20 20 20 69 66 28 20 21 69 73 49 67 6e 6f 72 65     if( !isIgnore
18410 45 6d 70 74 79 20 7c 7c 20 6e 4c 69 73 74 3e 30  Empty || nList>0
18420 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f   ){..          /
18430 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20  * Calculate the 
18440 27 64 6f 63 69 64 27 20 64 65 6c 74 61 20 76 61  'docid' delta va
18450 6c 75 65 20 74 6f 20 77 72 69 74 65 20 69 6e 74  lue to write int
18460 6f 20 74 68 65 20 6d 65 72 67 65 64 20 0a 20 20  o the merged .  
18470 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69          ** docli
18480 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  st. */.         
18490 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
184a0 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 20  Delta;.         
184b0 20 69 66 28 20 70 2d 3e 62 44 65 73 63 49 64 78   if( p->bDescIdx
184c0 20 26 26 20 6e 44 6f 63 6c 69 73 74 3e 30 20 29   && nDoclist>0 )
184d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 44  {.            iD
184e0 65 6c 74 61 20 3d 20 69 50 72 65 76 20 2d 20 69  elta = iPrev - i
184f0 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20 20  Docid;.         
18500 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18510 20 20 20 20 69 44 65 6c 74 61 20 3d 20 69 44 6f      iDelta = iDo
18520 63 69 64 20 2d 20 69 50 72 65 76 3b 0a 20 20 20  cid - iPrev;.   
18530 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18540 20 20 20 61 73 73 65 72 74 28 20 69 44 65 6c 74     assert( iDelt
18550 61 3e 30 20 7c 7c 20 28 6e 44 6f 63 6c 69 73 74  a>0 || (nDoclist
18560 3d 3d 30 20 26 26 20 69 44 65 6c 74 61 3d 3d 69  ==0 && iDelta==i
18570 44 6f 63 69 64 29 20 29 3b 0a 20 20 20 20 20 20  Docid) );.      
18580 20 20 20 20 61 73 73 65 72 74 28 20 6e 44 6f 63      assert( nDoc
18590 6c 69 73 74 3e 30 20 7c 7c 20 69 44 65 6c 74 61  list>0 || iDelta
185a0 3d 3d 69 44 6f 63 69 64 20 29 3b 0a 0a 20 20 20  ==iDocid );..   
185b0 20 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 73         nByte = s
185c0 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e 74  qlite3Fts3Varint
185d0 4c 65 6e 28 69 44 65 6c 74 61 29 20 2b 20 28 69  Len(iDelta) + (i
185e0 73 52 65 71 75 69 72 65 50 6f 73 3f 6e 4c 69 73  sRequirePos?nLis
185f0 74 2b 31 3a 30 29 3b 0a 20 20 20 20 20 20 20 20  t+1:0);.        
18600 20 20 69 66 28 20 6e 44 6f 63 6c 69 73 74 2b 6e    if( nDoclist+n
18610 42 79 74 65 3e 70 43 73 72 2d 3e 6e 42 75 66 66  Byte>pCsr->nBuff
18620 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  er ){.          
18630 20 20 63 68 61 72 20 2a 61 4e 65 77 3b 0a 20 20    char *aNew;.  
18640 20 20 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e            pCsr->
18650 6e 42 75 66 66 65 72 20 3d 20 28 6e 44 6f 63 6c  nBuffer = (nDocl
18660 69 73 74 2b 6e 42 79 74 65 29 2a 32 3b 0a 20 20  ist+nByte)*2;.  
18670 20 20 20 20 20 20 20 20 20 20 61 4e 65 77 20 3d            aNew =
18680 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
18690 28 70 43 73 72 2d 3e 61 42 75 66 66 65 72 2c 20  (pCsr->aBuffer, 
186a0 70 43 73 72 2d 3e 6e 42 75 66 66 65 72 29 3b 0a  pCsr->nBuffer);.
186b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
186c0 21 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20  !aNew ){.       
186d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
186e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
186f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18700 20 20 20 20 20 20 70 43 73 72 2d 3e 61 42 75 66        pCsr->aBuf
18710 66 65 72 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20  fer = aNew;.    
18720 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
18730 20 20 20 69 66 28 20 69 73 46 69 72 73 74 20 29     if( isFirst )
18740 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  {.            ch
18750 61 72 20 2a 61 20 3d 20 26 70 43 73 72 2d 3e 61  ar *a = &pCsr->a
18760 42 75 66 66 65 72 5b 6e 44 6f 63 6c 69 73 74 5d  Buffer[nDoclist]
18770 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
18780 74 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20  t nWrite;.      
18790 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
187a0 20 20 6e 57 72 69 74 65 20 3d 20 73 71 6c 69 74    nWrite = sqlit
187b0 65 33 46 74 73 33 46 69 72 73 74 46 69 6c 74 65  e3Fts3FirstFilte
187c0 72 28 69 44 65 6c 74 61 2c 20 70 4c 69 73 74 2c  r(iDelta, pList,
187d0 20 6e 4c 69 73 74 2c 20 61 29 3b 0a 20 20 20 20   nList, a);.    
187e0 20 20 20 20 20 20 20 20 69 66 28 20 6e 57 72 69          if( nWri
187f0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  te ){.          
18800 20 20 20 20 69 50 72 65 76 20 3d 20 69 44 6f 63      iPrev = iDoc
18810 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  id;.            
18820 20 20 6e 44 6f 63 6c 69 73 74 20 2b 3d 20 6e 57    nDoclist += nW
18830 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20  rite;.          
18840 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
18850 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
18860 20 6e 44 6f 63 6c 69 73 74 20 2b 3d 20 73 71 6c   nDoclist += sql
18870 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e  ite3Fts3PutVarin
18880 74 28 26 70 43 73 72 2d 3e 61 42 75 66 66 65 72  t(&pCsr->aBuffer
18890 5b 6e 44 6f 63 6c 69 73 74 5d 2c 20 69 44 65 6c  [nDoclist], iDel
188a0 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ta);.           
188b0 20 69 50 72 65 76 20 3d 20 69 44 6f 63 69 64 3b   iPrev = iDocid;
188c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
188d0 20 69 73 52 65 71 75 69 72 65 50 6f 73 20 29 7b   isRequirePos ){
188e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  .              m
188f0 65 6d 63 70 79 28 26 70 43 73 72 2d 3e 61 42 75  emcpy(&pCsr->aBu
18900 66 66 65 72 5b 6e 44 6f 63 6c 69 73 74 5d 2c 20  ffer[nDoclist], 
18910 70 4c 69 73 74 2c 20 6e 4c 69 73 74 29 3b 0a 20  pList, nList);. 
18920 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 44 6f               nDo
18930 63 6c 69 73 74 20 2b 3d 20 6e 4c 69 73 74 3b 0a  clist += nList;.
18940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
18950 73 72 2d 3e 61 42 75 66 66 65 72 5b 6e 44 6f 63  sr->aBuffer[nDoc
18960 6c 69 73 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a  list++] = '\0';.
18970 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
18980 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18990 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 74 73    }..        fts
189a0 33 53 65 67 52 65 61 64 65 72 53 6f 72 74 28 61  3SegReaderSort(a
189b0 70 53 65 67 6d 65 6e 74 2c 20 6e 4d 65 72 67 65  pSegment, nMerge
189c0 2c 20 6a 2c 20 78 43 6d 70 29 3b 0a 20 20 20 20  , j, xCmp);.    
189d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 44    }.      if( nD
189e0 6f 63 6c 69 73 74 3e 30 20 29 7b 0a 20 20 20 20  oclist>0 ){.    
189f0 20 20 20 20 70 43 73 72 2d 3e 61 44 6f 63 6c 69      pCsr->aDocli
18a00 73 74 20 3d 20 70 43 73 72 2d 3e 61 42 75 66 66  st = pCsr->aBuff
18a10 65 72 3b 0a 20 20 20 20 20 20 20 20 70 43 73 72  er;.        pCsr
18a20 2d 3e 6e 44 6f 63 6c 69 73 74 20 3d 20 6e 44 6f  ->nDoclist = nDo
18a30 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 72  clist;.        r
18a40 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a  c = SQLITE_ROW;.
18a50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18a60 20 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65    pCsr->nAdvance
18a70 20 3d 20 6e 4d 65 72 67 65 3b 0a 20 20 7d 77 68   = nMerge;.  }wh
18a80 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
18a90 4f 4b 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  OK );..  return 
18aa0 72 63 3b 0a 7d 0a 0a 0a 76 6f 69 64 20 73 71 6c  rc;.}...void sql
18ab0 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
18ac0 72 46 69 6e 69 73 68 28 0a 20 20 46 74 73 33 4d  rFinish(.  Fts3M
18ad0 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70  ultiSegReader *p
18ae0 43 73 72 20 20 20 20 20 20 20 2f 2a 20 43 75 72  Csr       /* Cur
18af0 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  sor object */.){
18b00 0a 20 20 69 66 28 20 70 43 73 72 20 29 7b 0a 20  .  if( pCsr ){. 
18b10 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
18b20 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e  r(i=0; i<pCsr->n
18b30 53 65 67 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20  Segment; i++){. 
18b40 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33       sqlite3Fts3
18b50 53 65 67 52 65 61 64 65 72 46 72 65 65 28 70 43  SegReaderFree(pC
18b60 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69 5d  sr->apSegment[i]
18b70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
18b80 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e  ite3_free(pCsr->
18b90 61 70 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20  apSegment);.    
18ba0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73  sqlite3_free(pCs
18bb0 72 2d 3e 61 42 75 66 66 65 72 29 3b 0a 0a 20 20  r->aBuffer);..  
18bc0 20 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74    pCsr->nSegment
18bd0 20 3d 20 30 3b 0a 20 20 20 20 70 43 73 72 2d 3e   = 0;.    pCsr->
18be0 61 70 53 65 67 6d 65 6e 74 20 3d 20 30 3b 0a 20  apSegment = 0;. 
18bf0 20 20 20 70 43 73 72 2d 3e 61 42 75 66 66 65 72     pCsr->aBuffer
18c00 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
18c10 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 22 65  ** Decode the "e
18c20 6e 64 5f 62 6c 6f 63 6b 22 20 66 69 65 6c 64 2c  nd_block" field,
18c30 20 73 65 6c 65 63 74 65 64 20 62 79 20 63 6f 6c   selected by col
18c40 75 6d 6e 20 69 43 6f 6c 20 6f 66 20 74 68 65 20  umn iCol of the 
18c50 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65  SELECT .** state
18c60 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74  ment passed as t
18c70 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
18c80 74 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 65  t. .**.** The "e
18c90 6e 64 5f 62 6c 6f 63 6b 22 20 66 69 65 6c 64 20  nd_block" field 
18ca0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 69 74 68  may contain eith
18cb0 65 72 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 6f  er an integer, o
18cc0 72 20 61 20 74 65 78 74 20 66 69 65 6c 64 0a 2a  r a text field.*
18cd0 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
18ce0 20 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61   text representa
18cf0 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6e 6f 6e 2d  tion of two non-
18d00 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72  negative integer
18d10 73 20 73 65 70 61 72 61 74 65 64 20 0a 2a 2a 20  s separated .** 
18d20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  by one or more s
18d30 70 61 63 65 20 28 30 78 32 30 29 20 63 68 61 72  pace (0x20) char
18d40 61 63 74 65 72 73 2e 20 49 6e 20 74 68 65 20 66  acters. In the f
18d50 69 72 73 74 20 63 61 73 65 2c 20 73 65 74 20 2a  irst case, set *
18d60 70 69 45 6e 64 42 6c 6f 63 6b 20 0a 2a 2a 20 74  piEndBlock .** t
18d70 6f 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  o the integer va
18d80 6c 75 65 20 61 6e 64 20 2a 70 6e 42 79 74 65 20  lue and *pnByte 
18d90 74 6f 20 7a 65 72 6f 20 62 65 66 6f 72 65 20 72  to zero before r
18da0 65 74 75 72 6e 69 6e 67 2e 20 49 6e 20 74 68 65  eturning. In the
18db0 20 73 65 63 6f 6e 64 2c 20 0a 2a 2a 20 73 65 74   second, .** set
18dc0 20 2a 70 69 45 6e 64 42 6c 6f 63 6b 20 74 6f 20   *piEndBlock to 
18dd0 74 68 65 20 66 69 72 73 74 20 76 61 6c 75 65 20  the first value 
18de0 61 6e 64 20 2a 70 6e 42 79 74 65 20 74 6f 20 74  and *pnByte to t
18df0 68 65 20 73 65 63 6f 6e 64 2e 0a 2a 2f 0a 73 74  he second..*/.st
18e00 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 52 65  atic void fts3Re
18e10 61 64 45 6e 64 42 6c 6f 63 6b 46 69 65 6c 64 28  adEndBlockField(
18e20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
18e30 2a 70 53 74 6d 74 2c 20 0a 20 20 69 6e 74 20 69  *pStmt, .  int i
18e40 43 6f 6c 2c 20 0a 20 20 69 36 34 20 2a 70 69 45  Col, .  i64 *piE
18e50 6e 64 42 6c 6f 63 6b 2c 0a 20 20 69 36 34 20 2a  ndBlock,.  i64 *
18e60 70 6e 42 79 74 65 0a 29 7b 0a 20 20 63 6f 6e 73  pnByte.){.  cons
18e70 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
18e80 2a 7a 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33  *zText = sqlite3
18e90 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
18ea0 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 69 66 28  mt, iCol);.  if(
18eb0 20 7a 54 65 78 74 20 29 7b 0a 20 20 20 20 69 6e   zText ){.    in
18ec0 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 69 4d 75  t i;.    int iMu
18ed0 6c 20 3d 20 31 3b 0a 20 20 20 20 69 36 34 20 69  l = 1;.    i64 i
18ee0 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  Val = 0;.    for
18ef0 28 69 3d 30 3b 20 7a 54 65 78 74 5b 69 5d 3e 3d  (i=0; zText[i]>=
18f00 27 30 27 20 26 26 20 7a 54 65 78 74 5b 69 5d 3c  '0' && zText[i]<
18f10 3d 27 39 27 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ='9'; i++){.    
18f20 20 20 69 56 61 6c 20 3d 20 69 56 61 6c 2a 31 30    iVal = iVal*10
18f30 20 2b 20 28 7a 54 65 78 74 5b 69 5d 20 2d 20 27   + (zText[i] - '
18f40 30 27 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  0');.    }.    *
18f50 70 69 45 6e 64 42 6c 6f 63 6b 20 3d 20 69 56 61  piEndBlock = iVa
18f60 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 54  l;.    while( zT
18f70 65 78 74 5b 69 5d 3d 3d 27 20 27 20 29 20 69 2b  ext[i]==' ' ) i+
18f80 2b 3b 0a 20 20 20 20 69 56 61 6c 20 3d 20 30 3b  +;.    iVal = 0;
18f90 0a 20 20 20 20 69 66 28 20 7a 54 65 78 74 5b 69  .    if( zText[i
18fa0 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]=='-' ){.      
18fb0 69 2b 2b 3b 0a 20 20 20 20 20 20 69 4d 75 6c 20  i++;.      iMul 
18fc0 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
18fd0 66 6f 72 28 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 3b  for(/* no-op */;
18fe0 20 7a 54 65 78 74 5b 69 5d 3e 3d 27 30 27 20 26   zText[i]>='0' &
18ff0 26 20 7a 54 65 78 74 5b 69 5d 3c 3d 27 39 27 3b  & zText[i]<='9';
19000 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 56 61   i++){.      iVa
19010 6c 20 3d 20 69 56 61 6c 2a 31 30 20 2b 20 28 7a  l = iVal*10 + (z
19020 54 65 78 74 5b 69 5d 20 2d 20 27 30 27 29 3b 0a  Text[i] - '0');.
19030 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e 42 79 74      }.    *pnByt
19040 65 20 3d 20 28 69 56 61 6c 20 2a 20 28 69 36 34  e = (iVal * (i64
19050 29 69 4d 75 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  )iMul);.  }.}...
19060 2f 2a 0a 2a 2a 20 41 20 73 65 67 6d 65 6e 74 20  /*.** A segment 
19070 6f 66 20 73 69 7a 65 20 6e 42 79 74 65 20 62 79  of size nByte by
19080 74 65 73 20 68 61 73 20 6a 75 73 74 20 62 65 65  tes has just bee
19090 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 61 62 73  n written to abs
190a0 6f 6c 75 74 65 20 6c 65 76 65 6c 0a 2a 2a 20 69  olute level.** i
190b0 41 62 73 4c 65 76 65 6c 2e 20 50 72 6f 6d 6f 74  AbsLevel. Promot
190c0 65 20 61 6e 79 20 73 65 67 6d 65 6e 74 73 20 74  e any segments t
190d0 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 70 72  hat should be pr
190e0 6f 6d 6f 74 65 64 20 61 73 20 61 20 72 65 73 75  omoted as a resu
190f0 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  lt..*/.static in
19100 74 20 66 74 73 33 50 72 6f 6d 6f 74 65 53 65 67  t fts3PromoteSeg
19110 6d 65 6e 74 73 28 0a 20 20 46 74 73 33 54 61 62  ments(.  Fts3Tab
19120 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  le *p,          
19130 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20           /* FTS 
19140 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
19150 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
19160 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 20 20  iAbsLevel,      
19170 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65    /* Absolute le
19180 76 65 6c 20 6a 75 73 74 20 75 70 64 61 74 65 64  vel just updated
19190 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
191a0 74 36 34 20 6e 42 79 74 65 20 20 20 20 20 20 20  t64 nByte       
191b0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
191c0 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 61 74 20   new segment at 
191d0 69 41 62 73 4c 65 76 65 6c 20 2a 2f 0a 29 7b 0a  iAbsLevel */.){.
191e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
191f0 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 5f  E_OK;.  sqlite3_
19200 73 74 6d 74 20 2a 70 52 61 6e 67 65 3b 0a 0a 20  stmt *pRange;.. 
19210 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
19220 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f  t(p, SQL_SELECT_
19230 4c 45 56 45 4c 5f 52 41 4e 47 45 32 2c 20 26 70  LEVEL_RANGE2, &p
19240 52 61 6e 67 65 2c 20 30 29 3b 0a 0a 20 20 69 66  Range, 0);..  if
19250 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19260 29 7b 0a 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d  ){.    int bOk =
19270 20 30 3b 0a 20 20 20 20 69 36 34 20 69 4c 61 73   0;.    i64 iLas
19280 74 20 3d 20 28 69 41 62 73 4c 65 76 65 6c 2f 46  t = (iAbsLevel/F
19290 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45  TS3_SEGDIR_MAXLE
192a0 56 45 4c 20 2b 20 31 29 20 2a 20 46 54 53 33 5f  VEL + 1) * FTS3_
192b0 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 20  SEGDIR_MAXLEVEL 
192c0 2d 20 31 3b 0a 20 20 20 20 69 36 34 20 6e 4c 69  - 1;.    i64 nLi
192d0 6d 69 74 20 3d 20 28 6e 42 79 74 65 2a 33 29 2f  mit = (nByte*3)/
192e0 32 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20  2;..    /* Loop 
192f0 74 68 72 6f 75 67 68 20 61 6c 6c 20 65 6e 74 72  through all entr
19300 69 65 73 20 69 6e 20 74 68 65 20 25 5f 73 65 67  ies in the %_seg
19310 64 69 72 20 74 61 62 6c 65 20 63 6f 72 72 65 73  dir table corres
19320 70 6f 6e 64 69 6e 67 20 74 6f 20 0a 20 20 20 20  ponding to .    
19330 2a 2a 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74  ** segments in t
19340 68 69 73 20 69 6e 64 65 78 20 6f 6e 20 6c 65 76  his index on lev
19350 65 6c 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  els greater than
19360 20 69 41 62 73 4c 65 76 65 6c 2e 20 49 66 20 74   iAbsLevel. If t
19370 68 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 61  here is.    ** a
19380 74 20 6c 65 61 73 74 20 6f 6e 65 20 73 75 63 68  t least one such
19390 20 73 65 67 6d 65 6e 74 2c 20 61 6e 64 20 69 74   segment, and it
193a0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
193b0 64 65 74 65 72 6d 69 6e 65 20 74 68 61 74 20 61  determine that a
193c0 6c 6c 20 0a 20 20 20 20 2a 2a 20 73 75 63 68 20  ll .    ** such 
193d0 73 65 67 6d 65 6e 74 73 20 61 72 65 20 73 6d 61  segments are sma
193e0 6c 6c 65 72 20 74 68 61 6e 20 6e 4c 69 6d 69 74  ller than nLimit
193f0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
19400 74 68 65 79 20 77 69 6c 6c 20 62 65 20 0a 20 20  they will be .  
19410 20 20 2a 2a 20 70 72 6f 6d 6f 74 65 64 20 74 6f    ** promoted to
19420 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c   level iAbsLevel
19430 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  .  */.    sqlite
19440 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 52 61  3_bind_int64(pRa
19450 6e 67 65 2c 20 31 2c 20 69 41 62 73 4c 65 76 65  nge, 1, iAbsLeve
19460 6c 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l+1);.    sqlite
19470 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 52 61  3_bind_int64(pRa
19480 6e 67 65 2c 20 32 2c 20 69 4c 61 73 74 29 3b 0a  nge, 2, iLast);.
19490 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54      while( SQLIT
194a0 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
194b0 74 65 70 28 70 52 61 6e 67 65 29 20 29 7b 0a 20  tep(pRange) ){. 
194c0 20 20 20 20 20 69 36 34 20 6e 53 69 7a 65 20 3d       i64 nSize =
194d0 20 30 2c 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20   0, dummy;.     
194e0 20 66 74 73 33 52 65 61 64 45 6e 64 42 6c 6f 63   fts3ReadEndBloc
194f0 6b 46 69 65 6c 64 28 70 52 61 6e 67 65 2c 20 32  kField(pRange, 2
19500 2c 20 26 64 75 6d 6d 79 2c 20 26 6e 53 69 7a 65  , &dummy, &nSize
19510 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 53 69  );.      if( nSi
19520 7a 65 3c 3d 30 20 7c 7c 20 6e 53 69 7a 65 3e 6e  ze<=0 || nSize>n
19530 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
19540 20 2f 2a 20 49 66 20 6e 53 69 7a 65 3d 3d 30 2c   /* If nSize==0,
19550 20 74 68 65 6e 20 74 68 65 20 25 5f 73 65 67 64   then the %_segd
19560 69 72 2e 65 6e 64 5f 62 6c 6f 63 6b 20 66 69 65  ir.end_block fie
19570 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6e 6f 74 20  ld does not not 
19580 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
19590 61 69 6e 20 61 20 73 69 7a 65 20 76 61 6c 75 65  ain a size value
195a0 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  . This happens i
195b0 66 20 69 74 20 77 61 73 20 77 72 69 74 74 65 6e  f it was written
195c0 20 62 79 20 61 6e 0a 20 20 20 20 20 20 20 20 2a   by an.        *
195d0 2a 20 6f 6c 64 20 76 65 72 73 69 6f 6e 20 6f 66  * old version of
195e0 20 46 54 53 2e 20 49 6e 20 74 68 69 73 20 63 61   FTS. In this ca
195f0 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  se it is not pos
19600 73 69 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69  sible to determi
19610 6e 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ne.        ** th
19620 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73 65  e size of the se
19630 67 6d 65 6e 74 2c 20 61 6e 64 20 73 6f 20 73 65  gment, and so se
19640 67 6d 65 6e 74 20 70 72 6f 6d 6f 74 69 6f 6e 20  gment promotion 
19650 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 20  does not.       
19660 20 2a 2a 20 74 61 6b 65 20 70 6c 61 63 65 2e 20   ** take place. 
19670 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f 6b 20   */.        bOk 
19680 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 0;.        bre
19690 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
196a0 20 20 62 4f 6b 20 3d 20 31 3b 0a 20 20 20 20 7d    bOk = 1;.    }
196b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
196c0 33 5f 72 65 73 65 74 28 70 52 61 6e 67 65 29 3b  3_reset(pRange);
196d0 0a 0a 20 20 20 20 69 66 28 20 62 4f 6b 20 29 7b  ..    if( bOk ){
196e0 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20  .      int iIdx 
196f0 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
19700 65 33 5f 73 74 6d 74 20 2a 70 55 70 64 61 74 65  e3_stmt *pUpdate
19710 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  1 = 0;.      sql
19720 69 74 65 33 5f 73 74 6d 74 20 2a 70 55 70 64 61  ite3_stmt *pUpda
19730 74 65 32 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  te2 = 0;..      
19740 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19750 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
19760 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
19770 20 53 51 4c 5f 55 50 44 41 54 45 5f 4c 45 56 45   SQL_UPDATE_LEVE
19780 4c 5f 49 44 58 2c 20 26 70 55 70 64 61 74 65 31  L_IDX, &pUpdate1
19790 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
197a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
197b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
197c0 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
197d0 74 28 70 2c 20 53 51 4c 5f 55 50 44 41 54 45 5f  t(p, SQL_UPDATE_
197e0 4c 45 56 45 4c 2c 20 26 70 55 70 64 61 74 65 32  LEVEL, &pUpdate2
197f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 0);.      }.. 
19800 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
19810 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 20  ITE_OK ){..     
19820 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
19830 67 68 20 61 6c 6c 20 25 5f 73 65 67 64 69 72 20  gh all %_segdir 
19840 65 6e 74 72 69 65 73 20 66 6f 72 20 73 65 67 6d  entries for segm
19850 65 6e 74 73 20 69 6e 20 74 68 69 73 20 69 6e 64  ents in this ind
19860 65 78 20 77 69 74 68 0a 20 20 20 20 20 20 20 20  ex with.        
19870 2a 2a 20 6c 65 76 65 6c 73 20 65 71 75 61 6c 20  ** levels equal 
19880 74 6f 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  to or greater th
19890 61 6e 20 69 41 62 73 4c 65 76 65 6c 2e 20 41 73  an iAbsLevel. As
198a0 20 65 61 63 68 20 65 6e 74 72 79 20 69 73 20 76   each entry is v
198b0 69 73 69 74 65 64 2c 0a 20 20 20 20 20 20 20 20  isited,.        
198c0 2a 2a 20 75 70 64 61 74 65 64 20 69 74 20 74 6f  ** updated it to
198d0 20 73 65 74 20 28 6c 65 76 65 6c 20 3d 20 2d 31   set (level = -1
198e0 29 20 61 6e 64 20 28 69 64 78 20 3d 20 4e 29 2c  ) and (idx = N),
198f0 20 77 68 65 72 65 20 4e 20 69 73 20 30 20 66 6f   where N is 0 fo
19900 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  r the.        **
19910 20 6f 6c 64 65 73 74 20 73 65 67 6d 65 6e 74 20   oldest segment 
19920 69 6e 20 74 68 65 20 72 61 6e 67 65 2c 20 31 20  in the range, 1 
19930 66 6f 72 20 74 68 65 20 6e 65 78 74 20 6f 6c 64  for the next old
19940 65 73 74 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 0a  est, and so on..
19950 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
19960 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77     ** In other w
19970 6f 72 64 73 2c 20 6d 6f 76 65 20 61 6c 6c 20 73  ords, move all s
19980 65 67 6d 65 6e 74 73 20 62 65 69 6e 67 20 70 72  egments being pr
19990 6f 6d 6f 74 65 64 20 74 6f 20 6c 65 76 65 6c 20  omoted to level 
199a0 2d 31 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  -1,.        ** s
199b0 65 74 74 69 6e 67 20 74 68 65 20 22 69 64 78 22  etting the "idx"
199c0 20 66 69 65 6c 64 73 20 61 73 20 61 70 70 72 6f   fields as appro
199d0 70 72 69 61 74 65 20 74 6f 20 6b 65 65 70 20 74  priate to keep t
199e0 68 65 6d 20 69 6e 20 74 68 65 20 73 61 6d 65 0a  hem in the same.
199f0 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72          ** order
19a00 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  . The contents o
19a10 66 20 6c 65 76 65 6c 20 2d 31 20 28 77 68 69 63  f level -1 (whic
19a20 68 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2c  h is never used,
19a30 20 65 78 63 65 70 74 0a 20 20 20 20 20 20 20 20   except.        
19a40 2a 2a 20 74 72 61 6e 73 69 65 6e 74 6c 79 20 68  ** transiently h
19a50 65 72 65 29 2c 20 77 69 6c 6c 20 62 65 20 6d 6f  ere), will be mo
19a60 76 65 64 20 62 61 63 6b 20 74 6f 20 6c 65 76 65  ved back to leve
19a70 6c 20 69 41 62 73 4c 65 76 65 6c 20 62 65 6c 6f  l iAbsLevel belo
19a80 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  w.  */.        s
19a90 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
19aa0 34 28 70 52 61 6e 67 65 2c 20 31 2c 20 69 41 62  4(pRange, 1, iAb
19ab0 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 20  sLevel);.       
19ac0 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52   while( SQLITE_R
19ad0 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
19ae0 28 70 52 61 6e 67 65 29 20 29 7b 0a 20 20 20 20  (pRange) ){.    
19af0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
19b00 6e 64 5f 69 6e 74 28 70 55 70 64 61 74 65 31 2c  nd_int(pUpdate1,
19b10 20 31 2c 20 69 49 64 78 2b 2b 29 3b 0a 20 20 20   1, iIdx++);.   
19b20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
19b30 69 6e 64 5f 69 6e 74 28 70 55 70 64 61 74 65 31  ind_int(pUpdate1
19b40 2c 20 32 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  , 2, sqlite3_col
19b50 75 6d 6e 5f 69 6e 74 28 70 52 61 6e 67 65 2c 20  umn_int(pRange, 
19b60 30 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  0));.          s
19b70 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
19b80 70 55 70 64 61 74 65 31 2c 20 33 2c 20 73 71 6c  pUpdate1, 3, sql
19b90 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
19ba0 70 52 61 6e 67 65 2c 20 31 29 29 3b 0a 20 20 20  pRange, 1));.   
19bb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
19bc0 74 65 70 28 70 55 70 64 61 74 65 31 29 3b 0a 20  tep(pUpdate1);. 
19bd0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
19be0 6c 69 74 65 33 5f 72 65 73 65 74 28 70 55 70 64  lite3_reset(pUpd
19bf0 61 74 65 31 29 3b 0a 20 20 20 20 20 20 20 20 20  ate1);.         
19c00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19c10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
19c20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28    sqlite3_reset(
19c30 70 52 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 20  pRange);.       
19c40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19c50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
19c60 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
19c70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19c80 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
19c90 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
19ca0 70 52 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d  pRange);.      }
19cb0 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20  ..      /* Move 
19cc0 6c 65 76 65 6c 20 2d 31 20 74 6f 20 6c 65 76 65  level -1 to leve
19cd0 6c 20 69 41 62 73 4c 65 76 65 6c 20 2a 2f 0a 20  l iAbsLevel */. 
19ce0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
19cf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19d00 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
19d10 6e 74 36 34 28 70 55 70 64 61 74 65 32 2c 20 31  nt64(pUpdate2, 1
19d20 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20  , iAbsLevel);.  
19d30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
19d40 65 70 28 70 55 70 64 61 74 65 32 29 3b 0a 20 20  ep(pUpdate2);.  
19d50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19d60 65 33 5f 72 65 73 65 74 28 70 55 70 64 61 74 65  e3_reset(pUpdate
19d70 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
19d80 7d 0a 20 20 7d 0a 0a 0a 20 20 72 65 74 75 72 6e  }.  }...  return
19d90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65   rc;.}../*.** Me
19da0 72 67 65 20 61 6c 6c 20 6c 65 76 65 6c 20 69 4c  rge all level iL
19db0 65 76 65 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e  evel segments in
19dc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
19dd0 74 6f 20 61 20 73 69 6e 67 6c 65 20 0a 2a 2a 20  to a single .** 
19de0 69 4c 65 76 65 6c 2b 31 20 73 65 67 6d 65 6e 74  iLevel+1 segment
19df0 2e 20 4f 72 2c 20 69 66 20 69 4c 65 76 65 6c 3c  . Or, if iLevel<
19e00 30 2c 20 6d 65 72 67 65 20 61 6c 6c 20 73 65 67  0, merge all seg
19e10 6d 65 6e 74 73 20 69 6e 74 6f 20 61 0a 2a 2a 20  ments into a.** 
19e20 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 20 77  single segment w
19e30 69 74 68 20 61 20 6c 65 76 65 6c 20 65 71 75 61  ith a level equa
19e40 6c 20 74 6f 20 74 68 65 20 6e 75 6d 65 72 69 63  l to the numeric
19e50 61 6c 6c 79 20 6c 61 72 67 65 73 74 20 6c 65 76  ally largest lev
19e60 65 6c 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  el .** currently
19e70 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
19e80 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
19e90 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  If this function
19ea0 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
19eb0 69 4c 65 76 65 6c 3c 30 2c 20 62 75 74 20 74 68  iLevel<0, but th
19ec0 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 0a  ere is only one.
19ed0 2a 2a 20 73 65 67 6d 65 6e 74 20 69 6e 20 74 68  ** segment in th
19ee0 65 20 64 61 74 61 62 61 73 65 2c 20 53 51 4c 49  e database, SQLI
19ef0 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
19f00 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ned immediately.
19f10 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
19f20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  if successful, S
19f30 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
19f40 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  rned. If an erro
19f50 72 20 6f 63 63 75 72 73 2c 20 0a 2a 2a 20 61 6e  r occurs, .** an
19f60 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
19f70 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
19f80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
19f90 73 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 0a  s3SegmentMerge(.
19fa0 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
19fb0 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20  .  int iLangid, 
19fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fd0 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69     /* Language i
19fe0 64 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20  d to merge */.  
19ff0 69 6e 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20  int iIndex,     
1a000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a010 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 61  /* Index in p->a
1a020 49 6e 64 65 78 5b 5d 20 74 6f 20 6d 65 72 67 65  Index[] to merge
1a030 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c   */.  int iLevel
1a040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a050 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74        /* Level t
1a060 6f 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20  o merge */.){.  
1a070 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a090 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1a0a0 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30  /.  int iIdx = 0
1a0b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a0c0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1a0d0 6e 65 77 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  new segment */. 
1a0e0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1a0f0 4e 65 77 4c 65 76 65 6c 20 3d 20 30 3b 20 20 20  NewLevel = 0;   
1a100 20 2f 2a 20 4c 65 76 65 6c 2f 69 6e 64 65 78 20   /* Level/index 
1a110 74 6f 20 63 72 65 61 74 65 20 6e 65 77 20 73 65  to create new se
1a120 67 6d 65 6e 74 20 61 74 20 2a 2f 0a 20 20 53 65  gment at */.  Se
1a130 67 6d 65 6e 74 57 72 69 74 65 72 20 2a 70 57 72  gmentWriter *pWr
1a140 69 74 65 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a  iter = 0;     /*
1a150 20 55 73 65 64 20 74 6f 20 77 72 69 74 65 20 74   Used to write t
1a160 68 65 20 6e 65 77 2c 20 6d 65 72 67 65 64 2c 20  he new, merged, 
1a170 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73  segment */.  Fts
1a180 33 53 65 67 46 69 6c 74 65 72 20 66 69 6c 74 65  3SegFilter filte
1a190 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
1a1a0 53 65 67 6d 65 6e 74 20 74 65 72 6d 20 66 69 6c  Segment term fil
1a1b0 74 65 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f  ter condition */
1a1c0 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52  .  Fts3MultiSegR
1a1d0 65 61 64 65 72 20 63 73 72 3b 20 20 20 20 20 20  eader csr;      
1a1e0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
1a1f0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
1a200 6c 65 76 65 6c 28 73 29 20 2a 2f 0a 20 20 69 6e  level(s) */.  in
1a210 74 20 62 49 67 6e 6f 72 65 45 6d 70 74 79 20 3d  t bIgnoreEmpty =
1a220 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1a230 20 54 72 75 65 20 74 6f 20 69 67 6e 6f 72 65 20   True to ignore 
1a240 65 6d 70 74 79 20 73 65 67 6d 65 6e 74 73 20 2a  empty segments *
1a250 2f 0a 20 20 69 36 34 20 69 4d 61 78 4c 65 76 65  /.  i64 iMaxLeve
1a260 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
1a270 20 20 20 20 2f 2a 20 4d 61 78 20 6c 65 76 65 6c      /* Max level
1a280 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73   number for this
1a290 20 69 6e 64 65 78 2f 6c 61 6e 67 69 64 20 2a 2f   index/langid */
1a2a0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 76  ..  assert( iLev
1a2b0 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53  el==FTS3_SEGCURS
1a2c0 4f 52 5f 41 4c 4c 0a 20 20 20 20 20 20 20 7c 7c  OR_ALL.       ||
1a2d0 20 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45   iLevel==FTS3_SE
1a2e0 47 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 0a  GCURSOR_PENDING.
1a2f0 20 20 20 20 20 20 20 7c 7c 20 69 4c 65 76 65 6c         || iLevel
1a300 3e 3d 30 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  >=0.  );.  asser
1a310 74 28 20 69 4c 65 76 65 6c 3c 46 54 53 33 5f 53  t( iLevel<FTS3_S
1a320 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 20 29  EGDIR_MAXLEVEL )
1a330 3b 0a 20 20 61 73 73 65 72 74 28 20 69 49 6e 64  ;.  assert( iInd
1a340 65 78 3e 3d 30 20 26 26 20 69 49 6e 64 65 78 3c  ex>=0 && iIndex<
1a350 70 2d 3e 6e 49 6e 64 65 78 20 29 3b 0a 0a 20 20  p->nIndex );..  
1a360 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
1a370 53 65 67 52 65 61 64 65 72 43 75 72 73 6f 72 28  SegReaderCursor(
1a380 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64  p, iLangid, iInd
1a390 65 78 2c 20 69 4c 65 76 65 6c 2c 20 30 2c 20 30  ex, iLevel, 0, 0
1a3a0 2c 20 31 2c 20 30 2c 20 26 63 73 72 29 3b 0a 20  , 1, 0, &csr);. 
1a3b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a3c0 4f 4b 20 7c 7c 20 63 73 72 2e 6e 53 65 67 6d 65  OK || csr.nSegme
1a3d0 6e 74 3d 3d 30 20 29 20 67 6f 74 6f 20 66 69 6e  nt==0 ) goto fin
1a3e0 69 73 68 65 64 3b 0a 0a 20 20 69 66 28 20 69 4c  ished;..  if( iL
1a3f0 65 76 65 6c 21 3d 46 54 53 33 5f 53 45 47 43 55  evel!=FTS3_SEGCU
1a400 52 53 4f 52 5f 50 45 4e 44 49 4e 47 20 29 7b 0a  RSOR_PENDING ){.
1a410 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67      rc = fts3Seg
1a420 6d 65 6e 74 4d 61 78 4c 65 76 65 6c 28 70 2c 20  mentMaxLevel(p, 
1a430 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c  iLangid, iIndex,
1a440 20 26 69 4d 61 78 4c 65 76 65 6c 29 3b 0a 20 20   &iMaxLevel);.  
1a450 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a460 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69 73  _OK ) goto finis
1a470 68 65 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  hed;.  }..  if( 
1a480 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47  iLevel==FTS3_SEG
1a490 43 55 52 53 4f 52 5f 41 4c 4c 20 29 7b 0a 20 20  CURSOR_ALL ){.  
1a4a0 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 69    /* This call i
1a4b0 73 20 74 6f 20 6d 65 72 67 65 20 61 6c 6c 20 73  s to merge all s
1a4c0 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 64  egments in the d
1a4d0 61 74 61 62 61 73 65 20 74 6f 20 61 20 73 69 6e  atabase to a sin
1a4e0 67 6c 65 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65  gle.    ** segme
1a4f0 6e 74 2e 20 54 68 65 20 6c 65 76 65 6c 20 6f 66  nt. The level of
1a500 20 74 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74   the new segment
1a510 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65   is equal to the
1a520 20 6e 75 6d 65 72 69 63 61 6c 6c 79 0a 20 20 20   numerically.   
1a530 20 2a 2a 20 67 72 65 61 74 65 73 74 20 73 65 67   ** greatest seg
1a540 6d 65 6e 74 20 6c 65 76 65 6c 20 63 75 72 72 65  ment level curre
1a550 6e 74 6c 79 20 70 72 65 73 65 6e 74 20 69 6e 20  ntly present in 
1a560 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72  the database for
1a570 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 6e 64   this.    ** ind
1a580 65 78 2e 20 54 68 65 20 69 64 78 20 6f 66 20 74  ex. The idx of t
1a590 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 69  he new segment i
1a5a0 73 20 61 6c 77 61 79 73 20 30 2e 20 20 2a 2f 0a  s always 0.  */.
1a5b0 20 20 20 20 69 66 28 20 63 73 72 2e 6e 53 65 67      if( csr.nSeg
1a5c0 6d 65 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20  ment==1 ){.     
1a5d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
1a5e0 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 69  E;.      goto fi
1a5f0 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20  nished;.    }.  
1a600 20 20 69 4e 65 77 4c 65 76 65 6c 20 3d 20 69 4d    iNewLevel = iM
1a610 61 78 4c 65 76 65 6c 3b 0a 20 20 20 20 62 49 67  axLevel;.    bIg
1a620 6e 6f 72 65 45 6d 70 74 79 20 3d 20 31 3b 0a 0a  noreEmpty = 1;..
1a630 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1a640 54 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20  This call is to 
1a650 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d 65 6e  merge all segmen
1a660 74 73 20 61 74 20 6c 65 76 65 6c 20 69 4c 65 76  ts at level iLev
1a670 65 6c 2e 20 66 69 6e 64 20 74 68 65 20 6e 65 78  el. find the nex
1a680 74 0a 20 20 20 20 2a 2a 20 61 76 61 69 6c 61 62  t.    ** availab
1a690 6c 65 20 73 65 67 6d 65 6e 74 20 69 6e 64 65 78  le segment index
1a6a0 20 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c   at level iLevel
1a6b0 2b 31 2e 20 54 68 65 20 63 61 6c 6c 20 74 6f 0a  +1. The call to.
1a6c0 20 20 20 20 2a 2a 20 66 74 73 33 41 6c 6c 6f 63      ** fts3Alloc
1a6d0 61 74 65 53 65 67 64 69 72 49 64 78 28 29 20 77  ateSegdirIdx() w
1a6e0 69 6c 6c 20 6d 65 72 67 65 20 74 68 65 20 73 65  ill merge the se
1a6f0 67 6d 65 6e 74 73 20 61 74 20 6c 65 76 65 6c 20  gments at level 
1a700 69 4c 65 76 65 6c 2b 31 20 74 6f 20 0a 20 20 20  iLevel+1 to .   
1a710 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 4c 65   ** a single iLe
1a720 76 65 6c 2b 32 20 73 65 67 6d 65 6e 74 20 69 66  vel+2 segment if
1a730 20 6e 65 63 65 73 73 61 72 79 2e 20 20 2a 2f 0a   necessary.  */.
1a740 20 20 20 20 61 73 73 65 72 74 28 20 46 54 53 33      assert( FTS3
1a750 5f 53 45 47 43 55 52 53 4f 52 5f 50 45 4e 44 49  _SEGCURSOR_PENDI
1a760 4e 47 3d 3d 2d 31 20 29 3b 0a 20 20 20 20 69 4e  NG==-1 );.    iN
1a770 65 77 4c 65 76 65 6c 20 3d 20 67 65 74 41 62 73  ewLevel = getAbs
1a780 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c  oluteLevel(p, iL
1a790 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69  angid, iIndex, i
1a7a0 4c 65 76 65 6c 2b 31 29 3b 0a 20 20 20 20 72 63  Level+1);.    rc
1a7b0 20 3d 20 66 74 73 33 41 6c 6c 6f 63 61 74 65 53   = fts3AllocateS
1a7c0 65 67 64 69 72 49 64 78 28 70 2c 20 69 4c 61 6e  egdirIdx(p, iLan
1a7d0 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65  gid, iIndex, iLe
1a7e0 76 65 6c 2b 31 2c 20 26 69 49 64 78 29 3b 0a 20  vel+1, &iIdx);. 
1a7f0 20 20 20 62 49 67 6e 6f 72 65 45 6d 70 74 79 20     bIgnoreEmpty 
1a800 3d 20 28 69 4c 65 76 65 6c 21 3d 46 54 53 33 5f  = (iLevel!=FTS3_
1a810 53 45 47 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e  SEGCURSOR_PENDIN
1a820 47 29 20 26 26 20 28 69 4e 65 77 4c 65 76 65 6c  G) && (iNewLevel
1a830 3e 69 4d 61 78 4c 65 76 65 6c 29 3b 0a 20 20 7d  >iMaxLevel);.  }
1a840 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1a850 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69  E_OK ) goto fini
1a860 73 68 65 64 3b 0a 0a 20 20 61 73 73 65 72 74 28  shed;..  assert(
1a870 20 63 73 72 2e 6e 53 65 67 6d 65 6e 74 3e 30 20   csr.nSegment>0 
1a880 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4e 65  );.  assert( iNe
1a890 77 4c 65 76 65 6c 3e 3d 67 65 74 41 62 73 6f 6c  wLevel>=getAbsol
1a8a0 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e  uteLevel(p, iLan
1a8b0 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 30 29 20  gid, iIndex, 0) 
1a8c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4e 65  );.  assert( iNe
1a8d0 77 4c 65 76 65 6c 3c 67 65 74 41 62 73 6f 6c 75  wLevel<getAbsolu
1a8e0 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67  teLevel(p, iLang
1a8f0 69 64 2c 20 69 49 6e 64 65 78 2c 46 54 53 33 5f  id, iIndex,FTS3_
1a900 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 29  SEGDIR_MAXLEVEL)
1a910 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66   );..  memset(&f
1a920 69 6c 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  ilter, 0, sizeof
1a930 28 46 74 73 33 53 65 67 46 69 6c 74 65 72 29 29  (Fts3SegFilter))
1a940 3b 0a 20 20 66 69 6c 74 65 72 2e 66 6c 61 67 73  ;.  filter.flags
1a950 20 3d 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f   = FTS3_SEGMENT_
1a960 52 45 51 55 49 52 45 5f 50 4f 53 3b 0a 20 20 66  REQUIRE_POS;.  f
1a970 69 6c 74 65 72 2e 66 6c 61 67 73 20 7c 3d 20 28  ilter.flags |= (
1a980 62 49 67 6e 6f 72 65 45 6d 70 74 79 20 3f 20 46  bIgnoreEmpty ? F
1a990 54 53 33 5f 53 45 47 4d 45 4e 54 5f 49 47 4e 4f  TS3_SEGMENT_IGNO
1a9a0 52 45 5f 45 4d 50 54 59 20 3a 20 30 29 3b 0a 0a  RE_EMPTY : 0);..
1a9b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
1a9c0 73 33 53 65 67 52 65 61 64 65 72 53 74 61 72 74  s3SegReaderStart
1a9d0 28 70 2c 20 26 63 73 72 2c 20 26 66 69 6c 74 65  (p, &csr, &filte
1a9e0 72 29 3b 0a 20 20 77 68 69 6c 65 28 20 53 51 4c  r);.  while( SQL
1a9f0 49 54 45 5f 4f 4b 3d 3d 72 63 20 29 7b 0a 20 20  ITE_OK==rc ){.  
1aa00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
1aa10 73 33 53 65 67 52 65 61 64 65 72 53 74 65 70 28  s3SegReaderStep(
1aa20 70 2c 20 26 63 73 72 29 3b 0a 20 20 20 20 69 66  p, &csr);.    if
1aa30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57  ( rc!=SQLITE_ROW
1aa40 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 72 63   ) break;.    rc
1aa50 20 3d 20 66 74 73 33 53 65 67 57 72 69 74 65 72   = fts3SegWriter
1aa60 41 64 64 28 70 2c 20 26 70 57 72 69 74 65 72 2c  Add(p, &pWriter,
1aa70 20 31 2c 20 0a 20 20 20 20 20 20 20 20 63 73 72   1, .        csr
1aa80 2e 7a 54 65 72 6d 2c 20 63 73 72 2e 6e 54 65 72  .zTerm, csr.nTer
1aa90 6d 2c 20 63 73 72 2e 61 44 6f 63 6c 69 73 74 2c  m, csr.aDoclist,
1aaa0 20 63 73 72 2e 6e 44 6f 63 6c 69 73 74 29 3b 0a   csr.nDoclist);.
1aab0 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
1aac0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66  LITE_OK ) goto f
1aad0 69 6e 69 73 68 65 64 3b 0a 20 20 61 73 73 65 72  inished;.  asser
1aae0 74 28 20 70 57 72 69 74 65 72 20 7c 7c 20 62 49  t( pWriter || bI
1aaf0 67 6e 6f 72 65 45 6d 70 74 79 20 29 3b 0a 0a 20  gnoreEmpty );.. 
1ab00 20 69 66 28 20 69 4c 65 76 65 6c 21 3d 46 54 53   if( iLevel!=FTS
1ab10 33 5f 53 45 47 43 55 52 53 4f 52 5f 50 45 4e 44  3_SEGCURSOR_PEND
1ab20 49 4e 47 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ING ){.    rc = 
1ab30 66 74 73 33 44 65 6c 65 74 65 53 65 67 64 69 72  fts3DeleteSegdir
1ab40 28 0a 20 20 20 20 20 20 20 20 70 2c 20 69 4c 61  (.        p, iLa
1ab50 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c  ngid, iIndex, iL
1ab60 65 76 65 6c 2c 20 63 73 72 2e 61 70 53 65 67 6d  evel, csr.apSegm
1ab70 65 6e 74 2c 20 63 73 72 2e 6e 53 65 67 6d 65 6e  ent, csr.nSegmen
1ab80 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  t.    );.    if(
1ab90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1aba0 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a   goto finished;.
1abb0 20 20 7d 0a 20 20 69 66 28 20 70 57 72 69 74 65    }.  if( pWrite
1abc0 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  r ){.    rc = ft
1abd0 73 33 53 65 67 57 72 69 74 65 72 46 6c 75 73 68  s3SegWriterFlush
1abe0 28 70 2c 20 70 57 72 69 74 65 72 2c 20 69 4e 65  (p, pWriter, iNe
1abf0 77 4c 65 76 65 6c 2c 20 69 49 64 78 29 3b 0a 20  wLevel, iIdx);. 
1ac00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ac10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
1ac20 28 20 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53  ( iLevel==FTS3_S
1ac30 45 47 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47  EGCURSOR_PENDING
1ac40 20 7c 7c 20 69 4e 65 77 4c 65 76 65 6c 3c 69 4d   || iNewLevel<iM
1ac50 61 78 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20 20  axLevel ){.     
1ac60 20 20 20 72 63 20 3d 20 66 74 73 33 50 72 6f 6d     rc = fts3Prom
1ac70 6f 74 65 53 65 67 6d 65 6e 74 73 28 70 2c 20 69  oteSegments(p, i
1ac80 4e 65 77 4c 65 76 65 6c 2c 20 70 57 72 69 74 65  NewLevel, pWrite
1ac90 72 2d 3e 6e 4c 65 61 66 44 61 74 61 29 3b 0a 20  r->nLeafData);. 
1aca0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1acb0 0a 0a 20 66 69 6e 69 73 68 65 64 3a 0a 20 20 66  .. finished:.  f
1acc0 74 73 33 53 65 67 57 72 69 74 65 72 46 72 65 65  ts3SegWriterFree
1acd0 28 70 57 72 69 74 65 72 29 3b 0a 20 20 73 71 6c  (pWriter);.  sql
1ace0 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
1acf0 72 46 69 6e 69 73 68 28 26 63 73 72 29 3b 0a 20  rFinish(&csr);. 
1ad00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1ad10 2f 2a 20 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65  /* .** Flush the
1ad20 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 65 6e   contents of pen
1ad30 64 69 6e 67 54 65 72 6d 73 20 74 6f 20 6c 65 76  dingTerms to lev
1ad40 65 6c 20 30 20 73 65 67 6d 65 6e 74 73 2e 20 0a  el 0 segments. .
1ad50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
1ad60 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 46 6c  s3PendingTermsFl
1ad70 75 73 68 28 46 74 73 33 54 61 62 6c 65 20 2a 70  ush(Fts3Table *p
1ad80 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1ad90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
1ada0 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 66 6f 72  ;.        .  for
1adb0 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
1adc0 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 49 6e 64  _OK && i<p->nInd
1add0 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63  ex; i++){.    rc
1ade0 20 3d 20 66 74 73 33 53 65 67 6d 65 6e 74 4d 65   = fts3SegmentMe
1adf0 72 67 65 28 70 2c 20 70 2d 3e 69 50 72 65 76 4c  rge(p, p->iPrevL
1ae00 61 6e 67 69 64 2c 20 69 2c 20 46 54 53 33 5f 53  angid, i, FTS3_S
1ae10 45 47 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47  EGCURSOR_PENDING
1ae20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1ae30 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20  QLITE_DONE ) rc 
1ae40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
1ae50 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 50 65  .  sqlite3Fts3Pe
1ae60 6e 64 69 6e 67 54 65 72 6d 73 43 6c 65 61 72 28  ndingTermsClear(
1ae70 70 29 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d  p);..  /* Determ
1ae80 69 6e 65 20 74 68 65 20 61 75 74 6f 2d 69 6e 63  ine the auto-inc
1ae90 72 2d 6d 65 72 67 65 20 73 65 74 74 69 6e 67 20  r-merge setting 
1aea0 69 66 20 75 6e 6b 6e 6f 77 6e 2e 20 20 49 66 20  if unknown.  If 
1aeb0 65 6e 61 62 6c 65 64 2c 0a 20 20 2a 2a 20 65 73  enabled,.  ** es
1aec0 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
1aed0 72 20 6f 66 20 6c 65 61 66 20 62 6c 6f 63 6b 73  r of leaf blocks
1aee0 20 6f 66 20 63 6f 6e 74 65 6e 74 20 74 6f 20 62   of content to b
1aef0 65 20 77 72 69 74 74 65 6e 0a 20 20 2a 2f 0a 20  e written.  */. 
1af00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1af10 4f 4b 20 26 26 20 70 2d 3e 62 48 61 73 53 74 61  OK && p->bHasSta
1af20 74 0a 20 20 20 26 26 20 70 2d 3e 6e 41 75 74 6f  t.   && p->nAuto
1af30 69 6e 63 72 6d 65 72 67 65 3d 3d 30 78 66 66 20  incrmerge==0xff 
1af40 26 26 20 70 2d 3e 6e 4c 65 61 66 41 64 64 3e 30  && p->nLeafAdd>0
1af50 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
1af60 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
1af70 30 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  0;.    rc = fts3
1af80 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53  SqlStmt(p, SQL_S
1af90 45 4c 45 43 54 5f 53 54 41 54 2c 20 26 70 53 74  ELECT_STAT, &pSt
1afa0 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mt, 0);.    if( 
1afb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1afc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
1afd0 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31  ind_int(pStmt, 1
1afe0 2c 20 46 54 53 5f 53 54 41 54 5f 41 55 54 4f 49  , FTS_STAT_AUTOI
1aff0 4e 43 52 4d 45 52 47 45 29 3b 0a 20 20 20 20 20  NCRMERGE);.     
1b000 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
1b010 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ep(pStmt);.     
1b020 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b030 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ROW ){.        p
1b040 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d 65 72 67 65  ->nAutoincrmerge
1b050 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
1b060 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b  n_int(pStmt, 0);
1b070 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
1b080 6e 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 3d 3d  nAutoincrmerge==
1b090 31 20 29 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72  1 ) p->nAutoincr
1b0a0 6d 65 72 67 65 20 3d 20 38 3b 0a 20 20 20 20 20  merge = 8;.     
1b0b0 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
1b0c0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
1b0d0 20 20 20 20 20 20 70 2d 3e 6e 41 75 74 6f 69 6e        p->nAutoin
1b0e0 63 72 6d 65 72 67 65 20 3d 20 30 3b 0a 20 20 20  crmerge = 0;.   
1b0f0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
1b100 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
1b110 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tmt);.    }.  }.
1b120 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b130 2f 2a 0a 2a 2a 20 45 6e 63 6f 64 65 20 4e 20 69  /*.** Encode N i
1b140 6e 74 65 67 65 72 73 20 61 73 20 76 61 72 69 6e  ntegers as varin
1b150 74 73 20 69 6e 74 6f 20 61 20 62 6c 6f 62 2e 0a  ts into a blob..
1b160 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1b170 74 73 33 45 6e 63 6f 64 65 49 6e 74 41 72 72 61  ts3EncodeIntArra
1b180 79 28 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  y(.  int N,     
1b190 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1b1a0 75 6d 62 65 72 20 6f 66 20 69 6e 74 65 67 65 72  umber of integer
1b1b0 73 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20  s to encode */. 
1b1c0 20 75 33 32 20 2a 61 2c 20 20 20 20 20 20 20 20   u32 *a,        
1b1d0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67      /* The integ
1b1e0 65 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 63  er values */.  c
1b1f0 68 61 72 20 2a 7a 42 75 66 2c 20 20 20 20 20 20  har *zBuf,      
1b200 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 42    /* Write the B
1b210 4c 4f 42 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  LOB here */.  in
1b220 74 20 2a 70 4e 42 75 66 20 20 20 20 20 20 20 20  t *pNBuf        
1b230 20 2f 2a 20 57 72 69 74 65 20 6e 75 6d 62 65 72   /* Write number
1b240 20 6f 66 20 62 79 74 65 73 20 69 66 20 7a 42 75   of bytes if zBu
1b250 66 5b 5d 20 75 73 65 64 20 68 65 72 65 20 2a 2f  f[] used here */
1b260 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  .){.  int i, j;.
1b270 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 4e    for(i=j=0; i<N
1b280 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6a 20 2b 3d  ; i++){.    j +=
1b290 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56   sqlite3Fts3PutV
1b2a0 61 72 69 6e 74 28 26 7a 42 75 66 5b 6a 5d 2c 20  arint(&zBuf[j], 
1b2b0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 61  (sqlite3_int64)a
1b2c0 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 2a 70 4e 42  [i]);.  }.  *pNB
1b2d0 75 66 20 3d 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  uf = j;.}../*.**
1b2e0 20 44 65 63 6f 64 65 20 61 20 62 6c 6f 62 20 6f   Decode a blob o
1b2f0 66 20 76 61 72 69 6e 74 73 20 69 6e 74 6f 20 4e  f varints into N
1b300 20 69 6e 74 65 67 65 72 73 0a 2a 2f 0a 73 74 61   integers.*/.sta
1b310 74 69 63 20 76 6f 69 64 20 66 74 73 33 44 65 63  tic void fts3Dec
1b320 6f 64 65 49 6e 74 41 72 72 61 79 28 0a 20 20 69  odeIntArray(.  i
1b330 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
1b340 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
1b350 6f 66 20 69 6e 74 65 67 65 72 73 20 74 6f 20 64  of integers to d
1b360 65 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 2a  ecode */.  u32 *
1b370 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  a,            /*
1b380 20 57 72 69 74 65 20 74 68 65 20 69 6e 74 65 67   Write the integ
1b390 65 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 63  er values */.  c
1b3a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 75 66 2c  onst char *zBuf,
1b3b0 20 20 2f 2a 20 54 68 65 20 42 4c 4f 42 20 63 6f    /* The BLOB co
1b3c0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 72  ntaining the var
1b3d0 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ints */.  int nB
1b3e0 75 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  uf           /* 
1b3f0 73 69 7a 65 20 6f 66 20 74 68 65 20 42 4c 4f 42  size of the BLOB
1b400 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
1b410 6a 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  j;.  UNUSED_PARA
1b420 4d 45 54 45 52 28 6e 42 75 66 29 3b 0a 20 20 66  METER(nBuf);.  f
1b430 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 4e 3b 20 69  or(i=j=0; i<N; i
1b440 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
1b450 5f 69 6e 74 36 34 20 78 3b 0a 20 20 20 20 6a 20  _int64 x;.    j 
1b460 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65  += sqlite3Fts3Ge
1b470 74 56 61 72 69 6e 74 28 26 7a 42 75 66 5b 6a 5d  tVarint(&zBuf[j]
1b480 2c 20 26 78 29 3b 0a 20 20 20 20 61 73 73 65 72  , &x);.    asser
1b490 74 28 6a 3c 3d 6e 42 75 66 29 3b 0a 20 20 20 20  t(j<=nBuf);.    
1b4a0 61 5b 69 5d 20 3d 20 28 75 33 32 29 28 78 20 26  a[i] = (u32)(x &
1b4b0 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
1b4c0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  }.}../*.** Inser
1b4d0 74 20 74 68 65 20 73 69 7a 65 73 20 28 69 6e 20  t the sizes (in 
1b4e0 74 6f 6b 65 6e 73 29 20 66 6f 72 20 65 61 63 68  tokens) for each
1b4f0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 64   column of the d
1b500 6f 63 75 6d 65 6e 74 0a 2a 2a 20 77 69 74 68 20  ocument.** with 
1b510 64 6f 63 69 64 20 65 71 75 61 6c 20 74 6f 20 70  docid equal to p
1b520 2d 3e 69 50 72 65 76 44 6f 63 69 64 2e 20 20 54  ->iPrevDocid.  T
1b530 68 65 20 73 69 7a 65 73 20 61 72 65 20 65 6e 63  he sizes are enc
1b540 6f 64 65 64 20 61 73 0a 2a 2a 20 61 20 62 6c 6f  oded as.** a blo
1b550 62 20 6f 66 20 76 61 72 69 6e 74 73 2e 0a 2a 2f  b of varints..*/
1b560 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1b570 33 49 6e 73 65 72 74 44 6f 63 73 69 7a 65 28 0a  3InsertDocsize(.
1b580 20 20 69 6e 74 20 2a 70 52 43 2c 20 20 20 20 20    int *pRC,     
1b590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5a0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1b5b0 20 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c 65 20   */.  Fts3Table 
1b5c0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1b5d0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 69        /* Table i
1b5e0 6e 74 6f 20 77 68 69 63 68 20 74 6f 20 69 6e 73  nto which to ins
1b5f0 65 72 74 20 2a 2f 0a 20 20 75 33 32 20 2a 61 53  ert */.  u32 *aS
1b600 7a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z               
1b610 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1b620 73 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e  s of each column
1b630 2c 20 69 6e 20 74 6f 6b 65 6e 73 20 2a 2f 0a 29  , in tokens */.)
1b640 7b 0a 20 20 63 68 61 72 20 2a 70 42 6c 6f 62 3b  {.  char *pBlob;
1b650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b660 54 68 65 20 42 4c 4f 42 20 65 6e 63 6f 64 69 6e  The BLOB encodin
1b670 67 20 6f 66 20 74 68 65 20 64 6f 63 75 6d 65 6e  g of the documen
1b680 74 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20  t size */.  int 
1b690 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20  nBlob;          
1b6a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1b6b0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 42  f bytes in the B
1b6c0 4c 4f 42 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  LOB */.  sqlite3
1b6d0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20  _stmt *pStmt;   
1b6e0 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75    /* Statement u
1b6f0 73 65 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68  sed to insert th
1b700 65 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20  e encoding */.  
1b710 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1b720 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
1b730 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  lt code from sub
1b740 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
1b750 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
1b760 6e 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 73 71 6c  n;.  pBlob = sql
1b770 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 31 30 2a  ite3_malloc( 10*
1b780 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  p->nColumn );.  
1b790 69 66 28 20 70 42 6c 6f 62 3d 3d 30 20 29 7b 0a  if( pBlob==0 ){.
1b7a0 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
1b7b0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74  E_NOMEM;.    ret
1b7c0 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 74 73 33 45  urn;.  }.  fts3E
1b7d0 6e 63 6f 64 65 49 6e 74 41 72 72 61 79 28 70 2d  ncodeIntArray(p-
1b7e0 3e 6e 43 6f 6c 75 6d 6e 2c 20 61 53 7a 2c 20 70  >nColumn, aSz, p
1b7f0 42 6c 6f 62 2c 20 26 6e 42 6c 6f 62 29 3b 0a 20  Blob, &nBlob);. 
1b800 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
1b810 74 28 70 2c 20 53 51 4c 5f 52 45 50 4c 41 43 45  t(p, SQL_REPLACE
1b820 5f 44 4f 43 53 49 5a 45 2c 20 26 70 53 74 6d 74  _DOCSIZE, &pStmt
1b830 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
1b840 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
1b850 65 65 28 70 42 6c 6f 62 29 3b 0a 20 20 20 20 2a  ee(pBlob);.    *
1b860 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRC = rc;.    re
1b870 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
1b880 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
1b890 53 74 6d 74 2c 20 31 2c 20 70 2d 3e 69 50 72 65  Stmt, 1, p->iPre
1b8a0 76 44 6f 63 69 64 29 3b 0a 20 20 73 71 6c 69 74  vDocid);.  sqlit
1b8b0 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74  e3_bind_blob(pSt
1b8c0 6d 74 2c 20 32 2c 20 70 42 6c 6f 62 2c 20 6e 42  mt, 2, pBlob, nB
1b8d0 6c 6f 62 2c 20 73 71 6c 69 74 65 33 5f 66 72 65  lob, sqlite3_fre
1b8e0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  e);.  sqlite3_st
1b8f0 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 2a 70 52  ep(pStmt);.  *pR
1b900 43 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  C = sqlite3_rese
1b910 74 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a  t(pStmt);.}../*.
1b920 2a 2a 20 52 65 63 6f 72 64 20 30 20 6f 66 20 74  ** Record 0 of t
1b930 68 65 20 25 5f 73 74 61 74 20 74 61 62 6c 65 20  he %_stat table 
1b940 63 6f 6e 74 61 69 6e 73 20 61 20 62 6c 6f 62 20  contains a blob 
1b950 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 4e 20  consisting of N 
1b960 76 61 72 69 6e 74 73 2c 0a 2a 2a 20 77 68 65 72  varints,.** wher
1b970 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
1b980 72 20 6f 66 20 75 73 65 72 20 64 65 66 69 6e 65  r of user define
1b990 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  d columns in the
1b9a0 20 66 74 73 33 20 74 61 62 6c 65 20 70 6c 75 73   fts3 table plus
1b9b0 0a 2a 2a 20 74 77 6f 2e 20 49 66 20 6e 43 6f 6c  .** two. If nCol
1b9c0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1b9d0 66 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63  f user defined c
1b9e0 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 76 61 6c  olumns, then val
1b9f0 75 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 76  ues of the .** v
1ba00 61 72 69 6e 74 73 20 61 72 65 20 73 65 74 20 61  arints are set a
1ba10 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
1ba20 20 20 20 56 61 72 69 6e 74 20 30 3a 20 20 20 20     Varint 0:    
1ba30 20 20 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20     Total number 
1ba40 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
1ba50 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61  able..**.**   Va
1ba60 72 69 6e 74 20 31 2e 2e 6e 43 6f 6c 3a 20 46 6f  rint 1..nCol: Fo
1ba70 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2c 20 74  r each column, t
1ba80 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
1ba90 6f 66 20 74 6f 6b 65 6e 73 20 73 74 6f 72 65 64  of tokens stored
1baa0 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   in.**          
1bab0 20 20 20 20 20 20 20 20 20 74 68 65 20 63 6f 6c           the col
1bac0 75 6d 6e 20 66 6f 72 20 61 6c 6c 20 72 6f 77 73  umn for all rows
1bad0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
1bae0 2a 0a 2a 2a 20 20 20 56 61 72 69 6e 74 20 31 2b  *.**   Varint 1+
1baf0 6e 43 6f 6c 3a 20 20 54 68 65 20 74 6f 74 61 6c  nCol:  The total
1bb00 20 73 69 7a 65 2c 20 69 6e 20 62 79 74 65 73 2c   size, in bytes,
1bb10 20 6f 66 20 61 6c 6c 20 74 65 78 74 20 76 61 6c   of all text val
1bb20 75 65 73 20 69 6e 20 61 6c 6c 0a 2a 2a 20 20 20  ues in all.**   
1bb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb40 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 6c 6c 20 72  columns of all r
1bb50 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ows of the table
1bb60 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ..**.*/.static v
1bb70 6f 69 64 20 66 74 73 33 55 70 64 61 74 65 44 6f  oid fts3UpdateDo
1bb80 63 54 6f 74 61 6c 73 28 0a 20 20 69 6e 74 20 2a  cTotals(.  int *
1bb90 70 52 43 2c 20 20 20 20 20 20 20 20 20 20 20 20  pRC,            
1bba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1bbb0 65 20 72 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  e result code */
1bbc0 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
1bbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbe0 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e     /* Table bein
1bbf0 67 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 75  g updated */.  u
1bc00 33 32 20 2a 61 53 7a 49 6e 73 2c 20 20 20 20 20  32 *aSzIns,     
1bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bc20 2a 20 53 69 7a 65 20 69 6e 63 72 65 61 73 65 73  * Size increases
1bc30 20 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a 44 65   */.  u32 *aSzDe
1bc40 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1bc50 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 64 65        /* Size de
1bc60 63 72 65 61 73 65 73 20 2a 2f 0a 20 20 69 6e 74  creases */.  int
1bc70 20 6e 43 68 6e 67 20 20 20 20 20 20 20 20 20 20   nChng          
1bc80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bc90 43 68 61 6e 67 65 20 69 6e 20 74 68 65 20 6e 75  Change in the nu
1bca0 6d 62 65 72 20 6f 66 20 64 6f 63 75 6d 65 6e 74  mber of document
1bcb0 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  s */.){.  char *
1bcc0 70 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20  pBlob;          
1bcd0 20 20 20 2f 2a 20 53 74 6f 72 61 67 65 20 66 6f     /* Storage fo
1bce0 72 20 42 4c 4f 42 20 77 72 69 74 74 65 6e 20 69  r BLOB written i
1bcf0 6e 74 6f 20 25 5f 73 74 61 74 20 2a 2f 0a 20 20  nto %_stat */.  
1bd00 69 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20  int nBlob;      
1bd10 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1bd20 20 6f 66 20 42 4c 4f 42 20 77 72 69 74 74 65 6e   of BLOB written
1bd30 20 69 6e 74 6f 20 25 5f 73 74 61 74 20 2a 2f 0a   into %_stat */.
1bd40 20 20 75 33 32 20 2a 61 3b 20 20 20 20 20 20 20    u32 *a;       
1bd50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
1bd60 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20  ray of integers 
1bd70 74 68 61 74 20 62 65 63 6f 6d 65 73 20 74 68 65  that becomes the
1bd80 20 42 4c 4f 42 20 2a 2f 0a 20 20 73 71 6c 69 74   BLOB */.  sqlit
1bd90 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20  e3_stmt *pStmt; 
1bda0 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
1bdb0 20 66 6f 72 20 72 65 61 64 69 6e 67 20 61 6e 64   for reading and
1bdc0 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e   writing */.  in
1bdd0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
1bde0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
1bdf0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
1be00 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1be10 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1be20 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63  ode from subfunc
1be30 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 63 6f 6e 73  tions */..  cons
1be40 74 20 69 6e 74 20 6e 53 74 61 74 20 3d 20 70 2d  t int nStat = p-
1be50 3e 6e 43 6f 6c 75 6d 6e 2b 32 3b 0a 0a 20 20 69  >nColumn+2;..  i
1be60 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
1be70 3b 0a 20 20 61 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  a = sqlite3_
1be80 6d 61 6c 6c 6f 63 28 20 28 73 69 7a 65 6f 66 28  malloc( (sizeof(
1be90 75 33 32 29 2b 31 30 29 2a 6e 53 74 61 74 20 29  u32)+10)*nStat )
1bea0 3b 0a 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a  ;.  if( a==0 ){.
1beb0 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
1bec0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74  E_NOMEM;.    ret
1bed0 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 42 6c 6f 62  urn;.  }.  pBlob
1bee0 20 3d 20 28 63 68 61 72 2a 29 26 61 5b 6e 53 74   = (char*)&a[nSt
1bef0 61 74 5d 3b 0a 20 20 72 63 20 3d 20 66 74 73 33  at];.  rc = fts3
1bf00 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53  SqlStmt(p, SQL_S
1bf10 45 4c 45 43 54 5f 53 54 41 54 2c 20 26 70 53 74  ELECT_STAT, &pSt
1bf20 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  mt, 0);.  if( rc
1bf30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1bf40 66 72 65 65 28 61 29 3b 0a 20 20 20 20 2a 70 52  free(a);.    *pR
1bf50 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  C = rc;.    retu
1bf60 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
1bf70 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74  3_bind_int(pStmt
1bf80 2c 20 31 2c 20 46 54 53 5f 53 54 41 54 5f 44 4f  , 1, FTS_STAT_DO
1bf90 43 54 4f 54 41 4c 29 3b 0a 20 20 69 66 28 20 73  CTOTAL);.  if( s
1bfa0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
1bfb0 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
1bfc0 7b 0a 20 20 20 20 66 74 73 33 44 65 63 6f 64 65  {.    fts3Decode
1bfd0 49 6e 74 41 72 72 61 79 28 6e 53 74 61 74 2c 20  IntArray(nStat, 
1bfe0 61 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  a,.         sqli
1bff0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
1c000 70 53 74 6d 74 2c 20 30 29 2c 0a 20 20 20 20 20  pStmt, 0),.     
1c010 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75      sqlite3_colu
1c020 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
1c030 30 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0));.  }else{.  
1c040 20 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 73    memset(a, 0, s
1c050 69 7a 65 6f 66 28 75 33 32 29 2a 28 6e 53 74 61  izeof(u32)*(nSta
1c060 74 29 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  t) );.  }.  rc =
1c070 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
1c080 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 21  Stmt);.  if( rc!
1c090 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c0a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
1c0b0 29 3b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63  );.    *pRC = rc
1c0c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1c0d0 7d 0a 20 20 69 66 28 20 6e 43 68 6e 67 3c 30 20  }.  if( nChng<0 
1c0e0 26 26 20 61 5b 30 5d 3c 28 75 33 32 29 28 2d 6e  && a[0]<(u32)(-n
1c0f0 43 68 6e 67 29 20 29 7b 0a 20 20 20 20 61 5b 30  Chng) ){.    a[0
1c100 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ] = 0;.  }else{.
1c110 20 20 20 20 61 5b 30 5d 20 2b 3d 20 6e 43 68 6e      a[0] += nChn
1c120 67 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  g;.  }.  for(i=0
1c130 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31  ; i<p->nColumn+1
1c140 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 33 32 20  ; i++){.    u32 
1c150 78 20 3d 20 61 5b 69 2b 31 5d 3b 0a 20 20 20 20  x = a[i+1];.    
1c160 69 66 28 20 78 2b 61 53 7a 49 6e 73 5b 69 5d 20  if( x+aSzIns[i] 
1c170 3c 20 61 53 7a 44 65 6c 5b 69 5d 20 29 7b 0a 20  < aSzDel[i] ){. 
1c180 20 20 20 20 20 78 20 3d 20 30 3b 0a 20 20 20 20       x = 0;.    
1c190 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 78 20 3d  }else{.      x =
1c1a0 20 78 20 2b 20 61 53 7a 49 6e 73 5b 69 5d 20 2d   x + aSzIns[i] -
1c1b0 20 61 53 7a 44 65 6c 5b 69 5d 3b 0a 20 20 20 20   aSzDel[i];.    
1c1c0 7d 0a 20 20 20 20 61 5b 69 2b 31 5d 20 3d 20 78  }.    a[i+1] = x
1c1d0 3b 0a 20 20 7d 0a 20 20 66 74 73 33 45 6e 63 6f  ;.  }.  fts3Enco
1c1e0 64 65 49 6e 74 41 72 72 61 79 28 6e 53 74 61 74  deIntArray(nStat
1c1f0 2c 20 61 2c 20 70 42 6c 6f 62 2c 20 26 6e 42 6c  , a, pBlob, &nBl
1c200 6f 62 29 3b 0a 20 20 72 63 20 3d 20 66 74 73 33  ob);.  rc = fts3
1c210 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 52  SqlStmt(p, SQL_R
1c220 45 50 4c 41 43 45 5f 53 54 41 54 2c 20 26 70 53  EPLACE_STAT, &pS
1c230 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tmt, 0);.  if( r
1c240 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
1c250 5f 66 72 65 65 28 61 29 3b 0a 20 20 20 20 2a 70  _free(a);.    *p
1c260 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74  RC = rc;.    ret
1c270 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
1c280 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d  e3_bind_int(pStm
1c290 74 2c 20 31 2c 20 46 54 53 5f 53 54 41 54 5f 44  t, 1, FTS_STAT_D
1c2a0 4f 43 54 4f 54 41 4c 29 3b 0a 20 20 73 71 6c 69  OCTOTAL);.  sqli
1c2b0 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53  te3_bind_blob(pS
1c2c0 74 6d 74 2c 20 32 2c 20 70 42 6c 6f 62 2c 20 6e  tmt, 2, pBlob, n
1c2d0 42 6c 6f 62 2c 20 53 51 4c 49 54 45 5f 53 54 41  Blob, SQLITE_STA
1c2e0 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TIC);.  sqlite3_
1c2f0 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 2a  step(pStmt);.  *
1c300 70 52 43 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  pRC = sqlite3_re
1c310 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 73 71  set(pStmt);.  sq
1c320 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 7d  lite3_free(a);.}
1c330 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 68  ../*.** Merge th
1c340 65 20 65 6e 74 69 72 65 20 64 61 74 61 62 61 73  e entire databas
1c350 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  e so that there 
1c360 69 73 20 6f 6e 65 20 73 65 67 6d 65 6e 74 20 66  is one segment f
1c370 6f 72 20 65 61 63 68 20 0a 2a 2a 20 69 49 6e 64  or each .** iInd
1c380 65 78 2f 69 4c 61 6e 67 69 64 20 63 6f 6d 62 69  ex/iLangid combi
1c390 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nation..*/.stati
1c3a0 63 20 69 6e 74 20 66 74 73 33 44 6f 4f 70 74 69  c int fts3DoOpti
1c3b0 6d 69 7a 65 28 46 74 73 33 54 61 62 6c 65 20 2a  mize(Fts3Table *
1c3c0 70 2c 20 69 6e 74 20 62 52 65 74 75 72 6e 44 6f  p, int bReturnDo
1c3d0 6e 65 29 7b 0a 20 20 69 6e 74 20 62 53 65 65 6e  ne){.  int bSeen
1c3e0 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Done = 0;.  int 
1c3f0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  rc;.  sqlite3_st
1c400 6d 74 20 2a 70 41 6c 6c 4c 61 6e 67 69 64 20 3d  mt *pAllLangid =
1c410 20 30 3b 0a 0a 20 20 72 63 20 3d 20 66 74 73 33   0;..  rc = fts3
1c420 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53  SqlStmt(p, SQL_S
1c430 45 4c 45 43 54 5f 41 4c 4c 5f 4c 41 4e 47 49 44  ELECT_ALL_LANGID
1c440 2c 20 26 70 41 6c 6c 4c 61 6e 67 69 64 2c 20 30  , &pAllLangid, 0
1c450 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1c460 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
1c470 74 20 72 63 32 3b 0a 20 20 20 20 73 71 6c 69 74  t rc2;.    sqlit
1c480 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 41 6c 6c  e3_bind_int(pAll
1c490 4c 61 6e 67 69 64 2c 20 31 2c 20 70 2d 3e 69 50  Langid, 1, p->iP
1c4a0 72 65 76 4c 61 6e 67 69 64 29 3b 0a 20 20 20 20  revLangid);.    
1c4b0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
1c4c0 28 70 41 6c 6c 4c 61 6e 67 69 64 2c 20 32 2c 20  (pAllLangid, 2, 
1c4d0 70 2d 3e 6e 49 6e 64 65 78 29 3b 0a 20 20 20 20  p->nIndex);.    
1c4e0 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73  while( sqlite3_s
1c4f0 74 65 70 28 70 41 6c 6c 4c 61 6e 67 69 64 29 3d  tep(pAllLangid)=
1c500 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
1c510 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1c520 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 20 3d 20    int iLangid = 
1c530 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
1c540 6e 74 28 70 41 6c 6c 4c 61 6e 67 69 64 2c 20 30  nt(pAllLangid, 0
1c550 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
1c560 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
1c570 26 26 20 69 3c 70 2d 3e 6e 49 6e 64 65 78 3b 20  && i<p->nIndex; 
1c580 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 63  i++){.        rc
1c590 20 3d 20 66 74 73 33 53 65 67 6d 65 6e 74 4d 65   = fts3SegmentMe
1c5a0 72 67 65 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20  rge(p, iLangid, 
1c5b0 69 2c 20 46 54 53 33 5f 53 45 47 43 55 52 53 4f  i, FTS3_SEGCURSO
1c5c0 52 5f 41 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20  R_ALL);.        
1c5d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
1c5e0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
1c5f0 20 62 53 65 65 6e 44 6f 6e 65 20 3d 20 31 3b 0a   bSeenDone = 1;.
1c600 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1c610 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1c620 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1c630 7d 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  }.    rc2 = sqli
1c640 74 65 33 5f 72 65 73 65 74 28 70 41 6c 6c 4c 61  te3_reset(pAllLa
1c650 6e 67 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72  ngid);.    if( r
1c660 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
1c670 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20  c = rc2;.  }..  
1c680 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 6d 65  sqlite3Fts3Segme
1c690 6e 74 73 43 6c 6f 73 65 28 70 29 3b 0a 20 20 73  ntsClose(p);.  s
1c6a0 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e  qlite3Fts3Pendin
1c6b0 67 54 65 72 6d 73 43 6c 65 61 72 28 70 29 3b 0a  gTermsClear(p);.
1c6c0 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
1c6d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 52 65 74  QLITE_OK && bRet
1c6e0 75 72 6e 44 6f 6e 65 20 26 26 20 62 53 65 65 6e  urnDone && bSeen
1c6f0 44 6f 6e 65 29 20 3f 20 53 51 4c 49 54 45 5f 44  Done) ? SQLITE_D
1c700 4f 4e 45 20 3a 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  ONE : rc;.}../*.
1c710 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1c720 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
1c730 74 68 65 20 75 73 65 72 20 65 78 65 63 75 74 65  the user execute
1c740 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
1c750 73 74 61 74 65 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a  statement:.**.**
1c760 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1c770 20 3c 74 62 6c 3e 28 3c 74 62 6c 3e 29 20 56 41   <tbl>(<tbl>) VA
1c780 4c 55 45 53 28 27 72 65 62 75 69 6c 64 27 29 3b  LUES('rebuild');
1c790 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 6e 74 69 72  .**.** The entir
1c7a0 65 20 46 54 53 20 69 6e 64 65 78 20 69 73 20 64  e FTS index is d
1c7b0 69 73 63 61 72 64 65 64 20 61 6e 64 20 72 65 62  iscarded and reb
1c7c0 75 69 6c 74 2e 20 49 66 20 74 68 65 20 74 61 62  uilt. If the tab
1c7d0 6c 65 20 69 73 20 6f 6e 65 20 0a 2a 2a 20 63 72  le is one .** cr
1c7e0 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
1c7f0 63 6f 6e 74 65 6e 74 3d 78 78 78 20 6f 70 74 69  content=xxx opti
1c800 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 77  on, then the new
1c810 20 69 6e 64 65 78 20 69 73 20 62 61 73 65 64 20   index is based 
1c820 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  on.** the curren
1c830 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  t contents of th
1c840 65 20 78 78 78 20 74 61 62 6c 65 2e 20 4f 74 68  e xxx table. Oth
1c850 65 72 77 69 73 65 2c 20 69 74 20 69 73 20 72 65  erwise, it is re
1c860 62 75 69 6c 74 20 62 61 73 65 64 0a 2a 2a 20 6f  built based.** o
1c870 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
1c880 66 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20  f the %_content 
1c890 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
1c8a0 20 69 6e 74 20 66 74 73 33 44 6f 52 65 62 75 69   int fts3DoRebui
1c8b0 6c 64 28 46 74 73 33 54 61 62 6c 65 20 2a 70 29  ld(Fts3Table *p)
1c8c0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1c8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8e0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
1c8f0 64 65 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74  de */..  rc = ft
1c900 73 33 44 65 6c 65 74 65 41 6c 6c 28 70 2c 20 30  s3DeleteAll(p, 0
1c910 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1c920 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 33  ITE_OK ){.    u3
1c930 32 20 2a 61 53 7a 20 3d 20 30 3b 0a 20 20 20 20  2 *aSz = 0;.    
1c940 75 33 32 20 2a 61 53 7a 49 6e 73 20 3d 20 30 3b  u32 *aSzIns = 0;
1c950 0a 20 20 20 20 75 33 32 20 2a 61 53 7a 44 65 6c  .    u32 *aSzDel
1c960 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
1c970 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
1c980 30 3b 0a 20 20 20 20 69 6e 74 20 6e 45 6e 74 72  0;.    int nEntr
1c990 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43  y = 0;..    /* C
1c9a0 6f 6d 70 6f 73 65 20 61 6e 64 20 70 72 65 70 61  ompose and prepa
1c9b0 72 65 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  re an SQL statem
1c9c0 65 6e 74 20 74 6f 20 6c 6f 6f 70 20 74 68 72 6f  ent to loop thro
1c9d0 75 67 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ugh the content 
1c9e0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61  table */.    cha
1c9f0 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  r *zSql = sqlite
1ca00 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
1ca10 54 20 25 73 22 20 2c 20 70 2d 3e 7a 52 65 61 64  T %s" , p->zRead
1ca20 45 78 70 72 6c 69 73 74 29 3b 0a 20 20 20 20 69  Exprlist);.    i
1ca30 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20  f( !zSql ){.    
1ca40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1ca50 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
1ca60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1ca70 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
1ca80 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
1ca90 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
1caa0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
1cab0 71 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ql);.    }..    
1cac0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cad0 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  K ){.      int n
1cae0 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 75 33  Byte = sizeof(u3
1caf0 32 29 20 2a 20 28 70 2d 3e 6e 43 6f 6c 75 6d 6e  2) * (p->nColumn
1cb00 2b 31 29 2a 33 3b 0a 20 20 20 20 20 20 61 53 7a  +1)*3;.      aSz
1cb10 20 3d 20 28 75 33 32 20 2a 29 73 71 6c 69 74 65   = (u32 *)sqlite
1cb20 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b  3_malloc(nByte);
1cb30 0a 20 20 20 20 20 20 69 66 28 20 61 53 7a 3d 3d  .      if( aSz==
1cb40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1cb50 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1cb60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1cb70 20 20 20 20 20 6d 65 6d 73 65 74 28 61 53 7a 2c       memset(aSz,
1cb80 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20   0, nByte);.    
1cb90 20 20 20 20 61 53 7a 49 6e 73 20 3d 20 26 61 53      aSzIns = &aS
1cba0 7a 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 5d 3b  z[p->nColumn+1];
1cbb0 0a 20 20 20 20 20 20 20 20 61 53 7a 44 65 6c 20  .        aSzDel 
1cbc0 3d 20 26 61 53 7a 49 6e 73 5b 70 2d 3e 6e 43 6f  = &aSzIns[p->nCo
1cbd0 6c 75 6d 6e 2b 31 5d 3b 0a 20 20 20 20 20 20 7d  lumn+1];.      }
1cbe0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c  .    }..    whil
1cbf0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
1cc00 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
1cc10 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
1cc20 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  mt) ){.      int
1cc30 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74   iCol;.      int
1cc40 20 69 4c 61 6e 67 69 64 20 3d 20 6c 61 6e 67 69   iLangid = langi
1cc50 64 46 72 6f 6d 53 65 6c 65 63 74 28 70 2c 20 70  dFromSelect(p, p
1cc60 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20  Stmt);.      rc 
1cc70 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72  = fts3PendingTer
1cc80 6d 73 44 6f 63 69 64 28 70 2c 20 30 2c 20 69 4c  msDocid(p, 0, iL
1cc90 61 6e 67 69 64 2c 20 73 71 6c 69 74 65 33 5f 63  angid, sqlite3_c
1cca0 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d  olumn_int64(pStm
1ccb0 74 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 6d 65  t, 0));.      me
1ccc0 6d 73 65 74 28 61 53 7a 2c 20 30 2c 20 73 69 7a  mset(aSz, 0, siz
1ccd0 65 6f 66 28 61 53 7a 5b 30 5d 29 20 2a 20 28 70  eof(aSz[0]) * (p
1cce0 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 29 3b 0a 20  ->nColumn+1));. 
1ccf0 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b       for(iCol=0;
1cd00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1cd10 26 20 69 43 6f 6c 3c 70 2d 3e 6e 43 6f 6c 75 6d  & iCol<p->nColum
1cd20 6e 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  n; iCol++){.    
1cd30 20 20 20 20 69 66 28 20 70 2d 3e 61 62 4e 6f 74      if( p->abNot
1cd40 69 6e 64 65 78 65 64 5b 69 43 6f 6c 5d 3d 3d 30  indexed[iCol]==0
1cd50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
1cd60 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63  nst char *z = (c
1cd70 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 73 71 6c  onst char *) sql
1cd80 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
1cd90 28 70 53 74 6d 74 2c 20 69 43 6f 6c 2b 31 29 3b  (pStmt, iCol+1);
1cda0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1cdb0 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73  fts3PendingTerms
1cdc0 41 64 64 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20  Add(p, iLangid, 
1cdd0 7a 2c 20 69 43 6f 6c 2c 20 26 61 53 7a 5b 69 43  z, iCol, &aSz[iC
1cde0 6f 6c 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ol]);.          
1cdf0 61 53 7a 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20  aSz[p->nColumn] 
1ce00 2b 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  += sqlite3_colum
1ce10 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69  n_bytes(pStmt, i
1ce20 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  Col+1);.        
1ce30 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1ce40 69 66 28 20 70 2d 3e 62 48 61 73 44 6f 63 73 69  if( p->bHasDocsi
1ce50 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  ze ){.        ft
1ce60 73 33 49 6e 73 65 72 74 44 6f 63 73 69 7a 65 28  s3InsertDocsize(
1ce70 26 72 63 2c 20 70 2c 20 61 53 7a 29 3b 0a 20 20  &rc, p, aSz);.  
1ce80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1ce90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1cea0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ceb0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
1cec0 3b 0a 20 20 20 20 20 20 20 20 70 53 74 6d 74 20  ;.        pStmt 
1ced0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
1cee0 7b 0a 20 20 20 20 20 20 20 20 6e 45 6e 74 72 79  {.        nEntry
1cef0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ++;.        for(
1cf00 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 3d 70 2d  iCol=0; iCol<=p-
1cf10 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 43 6f 6c 2b 2b  >nColumn; iCol++
1cf20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53 7a  ){.          aSz
1cf30 49 6e 73 5b 69 43 6f 6c 5d 20 2b 3d 20 61 53 7a  Ins[iCol] += aSz
1cf40 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20  [iCol];.        
1cf50 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1cf60 20 20 20 20 69 66 28 20 70 2d 3e 62 46 74 73 34      if( p->bFts4
1cf70 20 29 7b 0a 20 20 20 20 20 20 66 74 73 33 55 70   ){.      fts3Up
1cf80 64 61 74 65 44 6f 63 54 6f 74 61 6c 73 28 26 72  dateDocTotals(&r
1cf90 63 2c 20 70 2c 20 61 53 7a 49 6e 73 2c 20 61 53  c, p, aSzIns, aS
1cfa0 7a 44 65 6c 2c 20 6e 45 6e 74 72 79 29 3b 0a 20  zDel, nEntry);. 
1cfb0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1cfc0 5f 66 72 65 65 28 61 53 7a 29 3b 0a 0a 20 20 20  _free(aSz);..   
1cfd0 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20   if( pStmt ){.  
1cfe0 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71      int rc2 = sq
1cff0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
1d000 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Stmt);.      if(
1d010 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d020 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  {.        rc = r
1d030 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c2;.      }.    
1d040 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
1d050 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
1d060 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 70 65 6e  is function open
1d070 73 20 61 20 63 75 72 73 6f 72 20 75 73 65 64 20  s a cursor used 
1d080 74 6f 20 72 65 61 64 20 74 68 65 20 69 6e 70 75  to read the inpu
1d090 74 20 64 61 74 61 20 66 6f 72 20 61 6e 20 0a 2a  t data for an .*
1d0a0 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  * incremental me
1d0b0 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53  rge operation. S
1d0c0 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 74 20  pecifically, it 
1d0d0 6f 70 65 6e 73 20 61 20 63 75 72 73 6f 72 20 74  opens a cursor t
1d0e0 6f 20 73 63 61 6e 0a 2a 2a 20 74 68 65 20 6f 6c  o scan.** the ol
1d0f0 64 65 73 74 20 6e 53 65 67 20 73 65 67 6d 65 6e  dest nSeg segmen
1d100 74 73 20 28 69 64 78 3d 30 20 74 68 72 6f 75 67  ts (idx=0 throug
1d110 68 20 69 64 78 3d 28 6e 53 65 67 2d 31 29 29 20  h idx=(nSeg-1)) 
1d120 69 6e 20 61 62 73 6f 6c 75 74 65 20 0a 2a 2a 20  in absolute .** 
1d130 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c 2e  level iAbsLevel.
1d140 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1d150 74 73 33 49 6e 63 72 6d 65 72 67 65 43 73 72 28  ts3IncrmergeCsr(
1d160 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
1d170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d180 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65     /* FTS3 table
1d190 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c   handle */.  sql
1d1a0 69 74 65 33 5f 69 6e 74 36 34 20 69 41 62 73 4c  ite3_int64 iAbsL
1d1b0 65 76 65 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  evel,        /* 
1d1c0 41 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 74  Absolute level t
1d1d0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
1d1e0 6e 53 65 67 2c 20 20 20 20 20 20 20 20 20 20 20  nSeg,           
1d1f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1d200 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
1d210 73 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20  s to merge */.  
1d220 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
1d230 65 72 20 2a 70 43 73 72 20 20 20 20 20 20 20 20  er *pCsr        
1d240 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65 63 74  /* Cursor object
1d250 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a   to populate */.
1d260 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1d270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d280 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
1d290 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
1d2a0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
1d2b0 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74  ;        /* Stat
1d2c0 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 72 65  ement used to re
1d2d0 61 64 20 25 5f 73 65 67 64 69 72 20 65 6e 74 72  ad %_segdir entr
1d2e0 79 20 2a 2f 20 20 0a 20 20 69 6e 74 20 6e 42 79  y */  .  int nBy
1d2f0 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
1d300 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
1d310 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 70  s allocated at p
1d320 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 5d  Csr->apSegment[]
1d330 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
1d340 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
1d350 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61   Fts3MultiSegRea
1d360 64 65 72 2e 61 43 73 72 5b 5d 20 61 72 72 61 79  der.aCsr[] array
1d370 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 70 43 73   */.  memset(pCs
1d380 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43  r, 0, sizeof(*pC
1d390 73 72 29 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20  sr));.  nByte = 
1d3a0 73 69 7a 65 6f 66 28 46 74 73 33 53 65 67 52 65  sizeof(Fts3SegRe
1d3b0 61 64 65 72 20 2a 29 20 2a 20 6e 53 65 67 3b 0a  ader *) * nSeg;.
1d3c0 20 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e    pCsr->apSegmen
1d3d0 74 20 3d 20 28 46 74 73 33 53 65 67 52 65 61 64  t = (Fts3SegRead
1d3e0 65 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 6d 61  er **)sqlite3_ma
1d3f0 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 0a 20 20  lloc(nByte);..  
1d400 69 66 28 20 70 43 73 72 2d 3e 61 70 53 65 67 6d  if( pCsr->apSegm
1d410 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ent==0 ){.    rc
1d420 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1d430 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65  .  }else{.    me
1d440 6d 73 65 74 28 70 43 73 72 2d 3e 61 70 53 65 67  mset(pCsr->apSeg
1d450 6d 65 6e 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b  ment, 0, nByte);
1d460 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71  .    rc = fts3Sq
1d470 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c  lStmt(p, SQL_SEL
1d480 45 43 54 5f 4c 45 56 45 4c 2c 20 26 70 53 74 6d  ECT_LEVEL, &pStm
1d490 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  t, 0);.  }.  if(
1d4a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d4b0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1d4c0 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 73 71   int rc2;.    sq
1d4d0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
1d4e0 28 70 53 74 6d 74 2c 20 31 2c 20 69 41 62 73 4c  (pStmt, 1, iAbsL
1d4f0 65 76 65 6c 29 3b 0a 20 20 20 20 61 73 73 65 72  evel);.    asser
1d500 74 28 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e  t( pCsr->nSegmen
1d510 74 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  t==0 );.    for(
1d520 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
1d530 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  OK && sqlite3_st
1d540 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
1d550 45 5f 52 4f 57 20 26 26 20 69 3c 6e 53 65 67 3b  E_ROW && i<nSeg;
1d560 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20   i++){.      rc 
1d570 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  = sqlite3Fts3Seg
1d580 52 65 61 64 65 72 4e 65 77 28 69 2c 20 30 2c 0a  ReaderNew(i, 0,.
1d590 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1d5a0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
1d5b0 53 74 6d 74 2c 20 31 29 2c 20 20 20 20 20 20 20  Stmt, 1),       
1d5c0 20 2f 2a 20 73 65 67 64 69 72 2e 73 74 61 72 74   /* segdir.start
1d5d0 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  _block */.      
1d5e0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75      sqlite3_colu
1d5f0 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
1d600 32 29 2c 20 20 20 20 20 20 20 20 2f 2a 20 73 65  2),        /* se
1d610 67 64 69 72 2e 6c 65 61 76 65 73 5f 65 6e 64 5f  gdir.leaves_end_
1d620 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20  block */.       
1d630 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
1d640 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 33  n_int64(pStmt, 3
1d650 29 2c 20 20 20 20 20 20 20 20 2f 2a 20 73 65 67  ),        /* seg
1d660 64 69 72 2e 65 6e 64 5f 62 6c 6f 63 6b 20 2a 2f  dir.end_block */
1d670 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1d680 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
1d690 53 74 6d 74 2c 20 34 29 2c 20 20 20 20 20 20 20  Stmt, 4),       
1d6a0 20 20 2f 2a 20 73 65 67 64 69 72 2e 72 6f 6f 74    /* segdir.root
1d6b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
1d6c0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
1d6d0 65 73 28 70 53 74 6d 74 2c 20 34 29 2c 20 20 20  es(pStmt, 4),   
1d6e0 20 20 20 20 20 2f 2a 20 73 65 67 64 69 72 2e 72       /* segdir.r
1d6f0 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  oot */.         
1d700 20 26 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e   &pCsr->apSegmen
1d710 74 5b 69 5d 0a 20 20 20 20 20 20 29 3b 0a 20 20  t[i].      );.  
1d720 20 20 20 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65      pCsr->nSegme
1d730 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nt++;.    }.    
1d740 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  rc2 = sqlite3_re
1d750 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  set(pStmt);.    
1d760 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d770 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20  K ) rc = rc2;.  
1d780 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1d790 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  }..typedef struc
1d7a0 74 20 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65  t IncrmergeWrite
1d7b0 72 20 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65  r IncrmergeWrite
1d7c0 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
1d7d0 74 20 4e 6f 64 65 57 72 69 74 65 72 20 4e 6f 64  t NodeWriter Nod
1d7e0 65 57 72 69 74 65 72 3b 0a 74 79 70 65 64 65 66  eWriter;.typedef
1d7f0 20 73 74 72 75 63 74 20 42 6c 6f 62 20 42 6c 6f   struct Blob Blo
1d800 62 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  b;.typedef struc
1d810 74 20 4e 6f 64 65 52 65 61 64 65 72 20 4e 6f 64  t NodeReader Nod
1d820 65 52 65 61 64 65 72 3b 0a 0a 2f 2a 0a 2a 2a 20  eReader;../*.** 
1d830 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
1d840 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
1d850 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20 61  ucture is used a
1d860 73 20 61 20 64 79 6e 61 6d 69 63 20 62 75 66 66  s a dynamic buff
1d870 65 72 0a 2a 2a 20 74 6f 20 62 75 69 6c 64 20 75  er.** to build u
1d880 70 20 6e 6f 64 65 73 20 6f 72 20 6f 74 68 65 72  p nodes or other
1d890 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 69   blobs of data i
1d8a0 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 75 6e  n..**.** The fun
1d8b0 63 74 69 6f 6e 20 62 6c 6f 62 47 72 6f 77 42 75  ction blobGrowBu
1d8c0 66 66 65 72 28 29 20 69 73 20 75 73 65 64 20 74  ffer() is used t
1d8d0 6f 20 65 78 74 65 6e 64 20 74 68 65 20 61 6c 6c  o extend the all
1d8e0 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75  ocation..*/.stru
1d8f0 63 74 20 42 6c 6f 62 20 7b 0a 20 20 63 68 61 72  ct Blob {.  char
1d900 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20 20   *a;            
1d910 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1d920 6f 69 6e 74 65 72 20 74 6f 20 61 6c 6c 6f 63 61  ointer to alloca
1d930 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  tion */.  int n;
1d940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1d960 62 65 72 20 6f 66 20 76 61 6c 69 64 20 62 79 74  ber of valid byt
1d970 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 61 5b  es of data in a[
1d980 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f  ] */.  int nAllo
1d990 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1d9a0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
1d9b0 74 65 64 20 73 69 7a 65 20 6f 66 20 61 5b 5d 20  ted size of a[] 
1d9c0 28 6e 41 6c 6c 6f 63 3e 3d 6e 29 20 2a 2f 0a 7d  (nAlloc>=n) */.}
1d9d0 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 73 74  ;../*.** This st
1d9e0 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20  ructure is used 
1d9f0 74 6f 20 62 75 69 6c 64 20 75 70 20 62 75 66 66  to build up buff
1da00 65 72 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73  ers containing s
1da10 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 0a 2a  egment b-tree .*
1da20 2a 20 6e 6f 64 65 73 20 28 62 6c 6f 63 6b 73 29  * nodes (blocks)
1da30 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4e 6f 64 65  ..*/.struct Node
1da40 57 72 69 74 65 72 20 7b 0a 20 20 73 71 6c 69 74  Writer {.  sqlit
1da50 65 33 5f 69 6e 74 36 34 20 69 42 6c 6f 63 6b 3b  e3_int64 iBlock;
1da60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
1da70 72 72 65 6e 74 20 62 6c 6f 63 6b 20 69 64 20 2a  rrent block id *
1da80 2f 0a 20 20 42 6c 6f 62 20 6b 65 79 3b 20 20 20  /.  Blob key;   
1da90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1daa0 20 20 20 20 2f 2a 20 4c 61 73 74 20 6b 65 79 20      /* Last key 
1dab0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 63  written to the c
1dac0 75 72 72 65 6e 74 20 62 6c 6f 63 6b 20 2a 2f 0a  urrent block */.
1dad0 20 20 42 6c 6f 62 20 62 6c 6f 63 6b 3b 20 20 20    Blob block;   
1dae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1daf0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 6c 6f    /* Current blo
1db00 63 6b 20 69 6d 61 67 65 20 2a 2f 0a 7d 3b 0a 0a  ck image */.};..
1db10 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20  /*.** An object 
1db20 6f 66 20 74 68 69 73 20 74 79 70 65 20 63 6f 6e  of this type con
1db30 74 61 69 6e 73 20 74 68 65 20 73 74 61 74 65 20  tains the state 
1db40 72 65 71 75 69 72 65 64 20 74 6f 20 63 72 65 61  required to crea
1db50 74 65 20 6f 72 20 61 70 70 65 6e 64 0a 2a 2a 20  te or append.** 
1db60 74 6f 20 61 6e 20 61 70 70 65 6e 64 61 62 6c 65  to an appendable
1db70 20 62 2d 74 72 65 65 20 73 65 67 6d 65 6e 74 2e   b-tree segment.
1db80 0a 2a 2f 0a 73 74 72 75 63 74 20 49 6e 63 72 6d  .*/.struct Incrm
1db90 65 72 67 65 57 72 69 74 65 72 20 7b 0a 20 20 69  ergeWriter {.  i
1dba0 6e 74 20 6e 4c 65 61 66 45 73 74 3b 20 20 20 20  nt nLeafEst;    
1dbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dbc0 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  * Space allocate
1dbd0 64 20 66 6f 72 20 6c 65 61 66 20 62 6c 6f 63 6b  d for leaf block
1dbe0 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b  s */.  int nWork
1dbf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dc00 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1dc10 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 66   of leaf pages f
1dc20 6c 75 73 68 65 64 20 2a 2f 0a 20 20 73 71 6c 69  lushed */.  sqli
1dc30 74 65 33 5f 69 6e 74 36 34 20 69 41 62 73 4c 65  te3_int64 iAbsLe
1dc40 76 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  vel;        /* A
1dc50 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 6f 66  bsolute level of
1dc60 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
1dc70 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 3b 20 20  */.  int iIdx;  
1dc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc90 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1dca0 20 2a 6f 75 74 70 75 74 2a 20 73 65 67 6d 65 6e   *output* segmen
1dcb0 74 20 69 6e 20 69 41 62 73 4c 65 76 65 6c 2b 31  t in iAbsLevel+1
1dcc0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
1dcd0 74 36 34 20 69 53 74 61 72 74 3b 20 20 20 20 20  t64 iStart;     
1dce0 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 6e        /* Block n
1dcf0 75 6d 62 65 72 20 6f 66 20 66 69 72 73 74 20 61  umber of first a
1dd00 6c 6c 6f 63 61 74 65 64 20 62 6c 6f 63 6b 20 2a  llocated block *
1dd10 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
1dd20 34 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20  4 iEnd;         
1dd30 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 6e 75 6d      /* Block num
1dd40 62 65 72 20 6f 66 20 6c 61 73 74 20 61 6c 6c 6f  ber of last allo
1dd50 63 61 74 65 64 20 62 6c 6f 63 6b 20 2a 2f 0a 20  cated block */. 
1dd60 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
1dd70 4c 65 61 66 44 61 74 61 3b 20 20 20 20 20 20 20  LeafData;       
1dd80 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6c 65 61   /* Bytes of lea
1dd90 66 20 70 61 67 65 20 64 61 74 61 20 73 6f 20 66  f page data so f
1dda0 61 72 20 2a 2f 0a 20 20 75 38 20 62 4e 6f 4c 65  ar */.  u8 bNoLe
1ddb0 61 66 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  afData;         
1ddc0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
1ddd0 75 65 2c 20 73 74 6f 72 65 20 30 20 66 6f 72 20  ue, store 0 for 
1dde0 73 65 67 6d 65 6e 74 20 73 69 7a 65 20 2a 2f 0a  segment size */.
1ddf0 20 20 4e 6f 64 65 57 72 69 74 65 72 20 61 4e 6f    NodeWriter aNo
1de00 64 65 57 72 69 74 65 72 5b 46 54 53 5f 4d 41 58  deWriter[FTS_MAX
1de10 5f 41 50 50 45 4e 44 41 42 4c 45 5f 48 45 49 47  _APPENDABLE_HEIG
1de20 48 54 5d 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  HT];.};../*.** A
1de30 6e 20 6f 62 6a 65 63 74 20 6f 66 20 74 68 65 20  n object of the 
1de40 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 69  following type i
1de50 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 64  s used to read d
1de60 61 74 61 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  ata from a singl
1de70 65 0a 2a 2a 20 46 54 53 20 73 65 67 6d 65 6e 74  e.** FTS segment
1de80 20 6e 6f 64 65 2e 20 53 65 65 20 74 68 65 20 66   node. See the f
1de90 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
1dea0 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 6e 6f  ns:.**.**     no
1deb0 64 65 52 65 61 64 65 72 49 6e 69 74 28 29 0a 2a  deReaderInit().*
1dec0 2a 20 20 20 20 20 6e 6f 64 65 52 65 61 64 65 72  *     nodeReader
1ded0 4e 65 78 74 28 29 0a 2a 2a 20 20 20 20 20 6e 6f  Next().**     no
1dee0 64 65 52 65 61 64 65 72 52 65 6c 65 61 73 65 28  deReaderRelease(
1def0 29 0a 2a 2f 0a 73 74 72 75 63 74 20 4e 6f 64 65  ).*/.struct Node
1df00 52 65 61 64 65 72 20 7b 0a 20 20 63 6f 6e 73 74  Reader {.  const
1df10 20 63 68 61 72 20 2a 61 4e 6f 64 65 3b 0a 20 20   char *aNode;.  
1df20 69 6e 74 20 6e 4e 6f 64 65 3b 0a 20 20 69 6e 74  int nNode;.  int
1df30 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20   iOff;          
1df40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1df50 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74 20 77  Current offset w
1df60 69 74 68 69 6e 20 61 4e 6f 64 65 5b 5d 20 2a 2f  ithin aNode[] */
1df70 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61  ..  /* Output va
1df80 72 69 61 62 6c 65 73 2e 20 43 6f 6e 74 61 69 6e  riables. Contain
1df90 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
1dfa0 6e 6f 64 65 20 65 6e 74 72 79 2e 20 2a 2f 0a 20  node entry. */. 
1dfb0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1dfc0 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20  Child;          
1dfd0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
1dfe0 68 69 6c 64 20 6e 6f 64 65 20 2a 2f 0a 20 20 42  hild node */.  B
1dff0 6c 6f 62 20 74 65 72 6d 3b 20 20 20 20 20 20 20  lob term;       
1e000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e010 2a 20 43 75 72 72 65 6e 74 20 74 65 72 6d 20 2a  * Current term *
1e020 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1e030 61 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20  aDoclist;       
1e040 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1e050 6f 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 69  o doclist */.  i
1e060 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20  nt nDoclist;    
1e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e080 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73  * Size of doclis
1e090 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 7d 3b  t in bytes */.};
1e0a0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20  ../*.** If *pRc 
1e0b0 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b  is not SQLITE_OK
1e0c0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
1e0d0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
1e0e0 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  t is a no-op..**
1e0f0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1e100 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74  he allocation at
1e110 20 70 42 6c 6f 62 2d 3e 61 20 69 73 20 6e 6f 74   pBlob->a is not
1e120 20 61 6c 72 65 61 64 79 20 61 74 20 6c 65 61 73   already at leas
1e130 74 20 6e 4d 69 6e 0a 2a 2a 20 62 79 74 65 73 20  t nMin.** bytes 
1e140 69 6e 20 73 69 7a 65 2c 20 65 78 74 65 6e 64 20  in size, extend 
1e150 28 72 65 61 6c 6c 6f 63 29 20 69 74 20 74 6f 20  (realloc) it to 
1e160 62 65 20 73 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  be so..**.** If 
1e170 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  an OOM error occ
1e180 75 72 73 2c 20 73 65 74 20 2a 70 52 63 20 74 6f  urs, set *pRc to
1e190 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e   SQLITE_NOMEM an
1e1a0 64 20 6c 65 61 76 65 20 70 42 6c 6f 62 2d 3e 61  d leave pBlob->a
1e1b0 0a 2a 2a 20 75 6e 6d 6f 64 69 66 69 65 64 2e 20  .** unmodified. 
1e1c0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
1e1d0 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 63  e allocation suc
1e1e0 63 65 65 64 73 2c 20 75 70 64 61 74 65 20 70 42  ceeds, update pB
1e1f0 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63 0a 2a 2a 20 74  lob->nAlloc.** t
1e200 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20 6e 65  o reflect the ne
1e210 77 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 42  w size of the pB
1e220 6c 6f 62 2d 3e 61 5b 5d 20 62 75 66 66 65 72 2e  lob->a[] buffer.
1e230 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e240 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28 42  blobGrowBuffer(B
1e250 6c 6f 62 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20  lob *pBlob, int 
1e260 6e 4d 69 6e 2c 20 69 6e 74 20 2a 70 52 63 29 7b  nMin, int *pRc){
1e270 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
1e280 49 54 45 5f 4f 4b 20 26 26 20 6e 4d 69 6e 3e 70  ITE_OK && nMin>p
1e290 42 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  Blob->nAlloc ){.
1e2a0 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d      int nAlloc =
1e2b0 20 6e 4d 69 6e 3b 0a 20 20 20 20 63 68 61 72 20   nMin;.    char 
1e2c0 2a 61 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  *a = (char *)sql
1e2d0 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 42 6c  ite3_realloc(pBl
1e2e0 6f 62 2d 3e 61 2c 20 6e 41 6c 6c 6f 63 29 3b 0a  ob->a, nAlloc);.
1e2f0 20 20 20 20 69 66 28 20 61 20 29 7b 0a 20 20 20      if( a ){.   
1e300 20 20 20 70 42 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63     pBlob->nAlloc
1e310 20 3d 20 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20   = nAlloc;.     
1e320 20 70 42 6c 6f 62 2d 3e 61 20 3d 20 61 3b 0a 20   pBlob->a = a;. 
1e330 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e340 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRc = SQLITE_NO
1e350 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  MEM;.    }.  }.}
1e360 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
1e370 74 6f 20 61 64 76 61 6e 63 65 20 74 68 65 20 6e  to advance the n
1e380 6f 64 65 2d 72 65 61 64 65 72 20 6f 62 6a 65 63  ode-reader objec
1e390 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
1e3a0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
1e3b0 6f 0a 2a 2a 20 74 68 65 20 6e 65 78 74 20 65 6e  o.** the next en
1e3c0 74 72 79 20 6f 6e 20 74 68 65 20 6e 6f 64 65 2e  try on the node.
1e3d0 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61   .**.** Return a
1e3e0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
1e3f0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
1e400 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73  (SQLITE_NOMEM is
1e410 20 70 6f 73 73 69 62 6c 65 29 2e 20 0a 2a 2a 20   possible). .** 
1e420 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e  Otherwise return
1e430 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74   SQLITE_OK. If t
1e440 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 78 74 20  here is no next 
1e450 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 6e 6f 64  entry on the nod
1e460 65 0a 2a 2a 20 28 65 2e 67 2e 20 62 65 63 61 75  e.** (e.g. becau
1e470 73 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 65  se the current e
1e480 6e 74 72 79 20 69 73 20 74 68 65 20 6c 61 73 74  ntry is the last
1e490 29 20 73 65 74 20 4e 6f 64 65 52 65 61 64 65 72  ) set NodeReader
1e4a0 2d 3e 61 4e 6f 64 65 20 74 6f 0a 2a 2a 20 4e 55  ->aNode to.** NU
1e4b0 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 45  LL to indicate E
1e4c0 4f 46 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70  OF. Otherwise, p
1e4d0 6f 70 75 6c 61 74 65 20 74 68 65 20 4e 6f 64 65  opulate the Node
1e4e0 52 65 61 64 65 72 20 73 74 72 75 63 74 75 72 65  Reader structure
1e4f0 20 6f 75 74 70 75 74 20 0a 2a 2a 20 76 61 72 69   output .** vari
1e500 61 62 6c 65 73 20 66 6f 72 20 74 68 65 20 6e 65  ables for the ne
1e510 77 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74  w entry..*/.stat
1e520 69 63 20 69 6e 74 20 6e 6f 64 65 52 65 61 64 65  ic int nodeReade
1e530 72 4e 65 78 74 28 4e 6f 64 65 52 65 61 64 65 72  rNext(NodeReader
1e540 20 2a 70 29 7b 0a 20 20 69 6e 74 20 62 46 69 72   *p){.  int bFir
1e550 73 74 20 3d 20 28 70 2d 3e 74 65 72 6d 2e 6e 3d  st = (p->term.n=
1e560 3d 30 29 3b 20 20 20 20 2f 2a 20 54 72 75 65 20  =0);    /* True 
1e570 66 6f 72 20 66 69 72 73 74 20 74 65 72 6d 20 6f  for first term o
1e580 6e 20 74 68 65 20 6e 6f 64 65 20 2a 2f 0a 20 20  n the node */.  
1e590 69 6e 74 20 6e 50 72 65 66 69 78 20 3d 20 30 3b  int nPrefix = 0;
1e5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5b0 2f 2a 20 42 79 74 65 73 20 74 6f 20 63 6f 70 79  /* Bytes to copy
1e5c0 20 66 72 6f 6d 20 70 72 65 76 69 6f 75 73 20 74   from previous t
1e5d0 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  erm */.  int nSu
1e5e0 66 66 69 78 20 3d 20 30 3b 20 20 20 20 20 20 20  ffix = 0;       
1e5f0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
1e600 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 74  s to append to t
1e610 68 65 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69  he prefix */.  i
1e620 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1e630 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
1e640 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1e650 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ..  assert( p->a
1e660 4e 6f 64 65 20 29 3b 0a 20 20 69 66 28 20 70 2d  Node );.  if( p-
1e670 3e 69 43 68 69 6c 64 20 26 26 20 62 46 69 72 73  >iChild && bFirs
1e680 74 3d 3d 30 20 29 20 70 2d 3e 69 43 68 69 6c 64  t==0 ) p->iChild
1e690 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66  ++;.  if( p->iOf
1e6a0 66 3e 3d 70 2d 3e 6e 4e 6f 64 65 20 29 7b 0a 20  f>=p->nNode ){. 
1e6b0 20 20 20 2f 2a 20 45 4f 46 20 2a 2f 0a 20 20 20     /* EOF */.   
1e6c0 20 70 2d 3e 61 4e 6f 64 65 20 3d 20 30 3b 0a 20   p->aNode = 0;. 
1e6d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
1e6e0 62 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20  bFirst==0 ){.   
1e6f0 20 20 20 70 2d 3e 69 4f 66 66 20 2b 3d 20 66 74     p->iOff += ft
1e700 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s3GetVarint32(&p
1e710 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f 66 66 5d  ->aNode[p->iOff]
1e720 2c 20 26 6e 50 72 65 66 69 78 29 3b 0a 20 20 20  , &nPrefix);.   
1e730 20 7d 0a 20 20 20 20 70 2d 3e 69 4f 66 66 20 2b   }.    p->iOff +
1e740 3d 20 66 74 73 33 47 65 74 56 61 72 69 6e 74 33  = fts3GetVarint3
1e750 32 28 26 70 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69  2(&p->aNode[p->i
1e760 4f 66 66 5d 2c 20 26 6e 53 75 66 66 69 78 29 3b  Off], &nSuffix);
1e770 0a 0a 20 20 20 20 69 66 28 20 6e 50 72 65 66 69  ..    if( nPrefi
1e780 78 3e 70 2d 3e 69 4f 66 66 20 7c 7c 20 6e 53 75  x>p->iOff || nSu
1e790 66 66 69 78 3e 70 2d 3e 6e 4e 6f 64 65 2d 70 2d  ffix>p->nNode-p-
1e7a0 3e 69 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72  >iOff ){.      r
1e7b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1e7c0 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 20 20 7d  RUPT_VTAB;.    }
1e7d0 0a 20 20 20 20 62 6c 6f 62 47 72 6f 77 42 75 66  .    blobGrowBuf
1e7e0 66 65 72 28 26 70 2d 3e 74 65 72 6d 2c 20 6e 50  fer(&p->term, nP
1e7f0 72 65 66 69 78 2b 6e 53 75 66 66 69 78 2c 20 26  refix+nSuffix, &
1e800 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  rc);.    if( rc=
1e810 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e820 20 20 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 74      memcpy(&p->t
1e830 65 72 6d 2e 61 5b 6e 50 72 65 66 69 78 5d 2c 20  erm.a[nPrefix], 
1e840 26 70 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f 66  &p->aNode[p->iOf
1e850 66 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20  f], nSuffix);.  
1e860 20 20 20 20 70 2d 3e 74 65 72 6d 2e 6e 20 3d 20      p->term.n = 
1e870 6e 50 72 65 66 69 78 2b 6e 53 75 66 66 69 78 3b  nPrefix+nSuffix;
1e880 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 20 2b  .      p->iOff +
1e890 3d 20 6e 53 75 66 66 69 78 3b 0a 20 20 20 20 20  = nSuffix;.     
1e8a0 20 69 66 28 20 70 2d 3e 69 43 68 69 6c 64 3d 3d   if( p->iChild==
1e8b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
1e8c0 69 4f 66 66 20 2b 3d 20 66 74 73 33 47 65 74 56  iOff += fts3GetV
1e8d0 61 72 69 6e 74 33 32 28 26 70 2d 3e 61 4e 6f 64  arint32(&p->aNod
1e8e0 65 5b 70 2d 3e 69 4f 66 66 5d 2c 20 26 70 2d 3e  e[p->iOff], &p->
1e8f0 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20  nDoclist);.     
1e900 20 20 20 69 66 28 20 28 70 2d 3e 6e 4e 6f 64 65     if( (p->nNode
1e910 2d 70 2d 3e 69 4f 66 66 29 3c 70 2d 3e 6e 44 6f  -p->iOff)<p->nDo
1e920 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  clist ){.       
1e930 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e940 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20  _CORRUPT_VTAB;. 
1e950 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e960 20 70 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20 26   p->aDoclist = &
1e970 70 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f 66 66  p->aNode[p->iOff
1e980 5d 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f  ];.        p->iO
1e990 66 66 20 2b 3d 20 70 2d 3e 6e 44 6f 63 6c 69 73  ff += p->nDoclis
1e9a0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1e9b0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1e9c0 70 2d 3e 69 4f 66 66 3c 3d 70 2d 3e 6e 4e 6f 64  p->iOff<=p->nNod
1e9d0 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  e );.  return rc
1e9e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
1e9f0 73 65 20 61 6c 6c 20 64 79 6e 61 6d 69 63 20 72  se all dynamic r
1ea00 65 73 6f 75 72 63 65 73 20 68 65 6c 64 20 62 79  esources held by
1ea10 20 6e 6f 64 65 2d 72 65 61 64 65 72 20 6f 62 6a   node-reader obj
1ea20 65 63 74 20 2a 70 2e 0a 2a 2f 0a 73 74 61 74 69  ect *p..*/.stati
1ea30 63 20 76 6f 69 64 20 6e 6f 64 65 52 65 61 64 65  c void nodeReade
1ea40 72 52 65 6c 65 61 73 65 28 4e 6f 64 65 52 65 61  rRelease(NodeRea
1ea50 64 65 72 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  der *p){.  sqlit
1ea60 65 33 5f 66 72 65 65 28 70 2d 3e 74 65 72 6d 2e  e3_free(p->term.
1ea70 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  a);.}../*.** Ini
1ea80 74 69 61 6c 69 7a 65 20 61 20 6e 6f 64 65 2d 72  tialize a node-r
1ea90 65 61 64 65 72 20 6f 62 6a 65 63 74 20 74 6f 20  eader object to 
1eaa0 72 65 61 64 20 74 68 65 20 6e 6f 64 65 20 69 6e  read the node in
1eab0 20 62 75 66 66 65 72 20 61 4e 6f 64 65 2f 6e 4e   buffer aNode/nN
1eac0 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ode..**.** If su
1ead0 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
1eae0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1eaf0 61 6e 64 20 74 68 65 20 4e 6f 64 65 52 65 61 64  and the NodeRead
1eb00 65 72 20 6f 62 6a 65 63 74 20 73 65 74 20 74 6f  er object set to
1eb10 20 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68   .** point to th
1eb20 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 6f 6e  e first entry on
1eb30 20 74 68 65 20 6e 6f 64 65 20 28 69 66 20 61 6e   the node (if an
1eb40 79 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  y). Otherwise, a
1eb50 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f  n SQLite.** erro
1eb60 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1eb70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1eb80 74 20 6e 6f 64 65 52 65 61 64 65 72 49 6e 69 74  t nodeReaderInit
1eb90 28 4e 6f 64 65 52 65 61 64 65 72 20 2a 70 2c 20  (NodeReader *p, 
1eba0 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 4e 6f 64  const char *aNod
1ebb0 65 2c 20 69 6e 74 20 6e 4e 6f 64 65 29 7b 0a 20  e, int nNode){. 
1ebc0 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
1ebd0 7a 65 6f 66 28 4e 6f 64 65 52 65 61 64 65 72 29  zeof(NodeReader)
1ebe0 29 3b 0a 20 20 70 2d 3e 61 4e 6f 64 65 20 3d 20  );.  p->aNode = 
1ebf0 61 4e 6f 64 65 3b 0a 20 20 70 2d 3e 6e 4e 6f 64  aNode;.  p->nNod
1ec00 65 20 3d 20 6e 4e 6f 64 65 3b 0a 0a 20 20 2f 2a  e = nNode;..  /*
1ec10 20 46 69 67 75 72 65 20 6f 75 74 20 69 66 20 74   Figure out if t
1ec20 68 69 73 20 69 73 20 61 20 6c 65 61 66 20 6f 72  his is a leaf or
1ec30 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64   an internal nod
1ec40 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 61  e. */.  if( p->a
1ec50 4e 6f 64 65 5b 30 5d 20 29 7b 0a 20 20 20 20 2f  Node[0] ){.    /
1ec60 2a 20 41 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  * An internal no
1ec70 64 65 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 4f  de. */.    p->iO
1ec80 66 66 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  ff = 1 + sqlite3
1ec90 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 26 70  Fts3GetVarint(&p
1eca0 2d 3e 61 4e 6f 64 65 5b 31 5d 2c 20 26 70 2d 3e  ->aNode[1], &p->
1ecb0 69 43 68 69 6c 64 29 3b 0a 20 20 7d 65 6c 73 65  iChild);.  }else
1ecc0 7b 0a 20 20 20 20 70 2d 3e 69 4f 66 66 20 3d 20  {.    p->iOff = 
1ecd0 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  1;.  }..  return
1ece0 20 6e 6f 64 65 52 65 61 64 65 72 4e 65 78 74 28   nodeReaderNext(
1ecf0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  p);.}../*.** Thi
1ed00 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1ed10 6c 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  lled while writi
1ed20 6e 67 20 61 6e 20 46 54 53 20 73 65 67 6d 65 6e  ng an FTS segmen
1ed30 74 20 65 61 63 68 20 74 69 6d 65 20 61 20 6c 65  t each time a le
1ed40 61 66 20 6f 0a 2a 2a 20 6e 6f 64 65 20 69 73 20  af o.** node is 
1ed50 66 69 6e 69 73 68 65 64 20 61 6e 64 20 77 72 69  finished and wri
1ed60 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 54 68  tten to disk. Th
1ed70 65 20 6b 65 79 20 28 7a 54 65 72 6d 2f 6e 54 65  e key (zTerm/nTe
1ed80 72 6d 29 20 69 73 20 67 75 61 72 61 6e 74 65 65  rm) is guarantee
1ed90 64 0a 2a 2a 20 74 6f 20 62 65 20 67 72 65 61 74  d.** to be great
1eda0 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67  er than the larg
1edb0 65 73 74 20 6b 65 79 20 6f 6e 20 74 68 65 20 6e  est key on the n
1edc0 6f 64 65 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ode just written
1edd0 2c 20 62 75 74 20 73 6d 61 6c 6c 65 72 0a 2a 2a  , but smaller.**
1ede0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1edf0 6f 20 74 68 65 20 66 69 72 73 74 20 6b 65 79 20  o the first key 
1ee00 74 68 61 74 20 77 69 6c 6c 20 62 65 20 77 72 69  that will be wri
1ee10 74 74 65 6e 20 74 6f 20 74 68 65 20 6e 65 78 74  tten to the next
1ee20 20 6c 65 61 66 0a 2a 2a 20 6e 6f 64 65 2e 0a 2a   leaf.** node..*
1ee30 2a 0a 2a 2a 20 54 68 65 20 62 6c 6f 63 6b 20 69  *.** The block i
1ee40 64 20 6f 66 20 74 68 65 20 6c 65 61 66 20 6e 6f  d of the leaf no
1ee50 64 65 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  de just written 
1ee60 74 6f 20 64 69 73 6b 20 6d 61 79 20 62 65 20 66  to disk may be f
1ee70 6f 75 6e 64 20 69 6e 0a 2a 2a 20 28 70 57 72 69  ound in.** (pWri
1ee80 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72  ter->aNodeWriter
1ee90 5b 30 5d 2e 69 42 6c 6f 63 6b 29 20 77 68 65 6e  [0].iBlock) when
1eea0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1eeb0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
1eec0 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72  tic int fts3Incr
1eed0 6d 65 72 67 65 50 75 73 68 28 0a 20 20 46 74 73  mergePush(.  Fts
1eee0 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
1eef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ef00 46 74 73 33 20 74 61 62 6c 65 20 68 61 6e 64 6c  Fts3 table handl
1ef10 65 20 2a 2f 0a 20 20 49 6e 63 72 6d 65 72 67 65  e */.  Incrmerge
1ef20 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
1ef30 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72         /* Writer
1ef40 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
1ef50 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20  st char *zTerm, 
1ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ef70 54 65 72 6d 20 74 6f 20 77 72 69 74 65 20 74 6f  Term to write to
1ef80 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 2a   internal node *
1ef90 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 20 20 20  /.  int nTerm   
1efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efb0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 61 74 20      /* Bytes at 
1efc0 7a 54 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 73 71  zTerm */.){.  sq
1efd0 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 74 72  lite3_int64 iPtr
1efe0 20 3d 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64   = pWriter->aNod
1eff0 65 57 72 69 74 65 72 5b 30 5d 2e 69 42 6c 6f 63  eWriter[0].iBloc
1f000 6b 3b 0a 20 20 69 6e 74 20 69 4c 61 79 65 72 3b  k;.  int iLayer;
1f010 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 72  ..  assert( nTer
1f020 6d 3e 30 20 29 3b 0a 20 20 66 6f 72 28 69 4c 61  m>0 );.  for(iLa
1f030 79 65 72 3d 31 3b 20 41 4c 57 41 59 53 28 69 4c  yer=1; ALWAYS(iL
1f040 61 79 65 72 3c 46 54 53 5f 4d 41 58 5f 41 50 50  ayer<FTS_MAX_APP
1f050 45 4e 44 41 42 4c 45 5f 48 45 49 47 48 54 29 3b  ENDABLE_HEIGHT);
1f060 20 69 4c 61 79 65 72 2b 2b 29 7b 0a 20 20 20 20   iLayer++){.    
1f070 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4e  sqlite3_int64 iN
1f080 65 78 74 50 74 72 20 3d 20 30 3b 0a 20 20 20 20  extPtr = 0;.    
1f090 4e 6f 64 65 57 72 69 74 65 72 20 2a 70 4e 6f 64  NodeWriter *pNod
1f0a0 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 4e  e = &pWriter->aN
1f0b0 6f 64 65 57 72 69 74 65 72 5b 69 4c 61 79 65 72  odeWriter[iLayer
1f0c0 5d 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ];.    int rc = 
1f0d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69  SQLITE_OK;.    i
1f0e0 6e 74 20 6e 50 72 65 66 69 78 3b 0a 20 20 20 20  nt nPrefix;.    
1f0f0 69 6e 74 20 6e 53 75 66 66 69 78 3b 0a 20 20 20  int nSuffix;.   
1f100 20 69 6e 74 20 6e 53 70 61 63 65 3b 0a 0a 20 20   int nSpace;..  
1f110 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
1f120 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 74  how much space t
1f130 68 65 20 6b 65 79 20 77 69 6c 6c 20 63 6f 6e 73  he key will cons
1f140 75 6d 65 20 69 66 20 69 74 20 69 73 20 77 72 69  ume if it is wri
1f150 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74  tten to.    ** t
1f160 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 20  he current node 
1f170 6f 66 20 6c 61 79 65 72 20 69 4c 61 79 65 72 2e  of layer iLayer.
1f180 20 44 75 65 20 74 6f 20 74 68 65 20 70 72 65 66   Due to the pref
1f190 69 78 20 63 6f 6d 70 72 65 73 73 69 6f 6e 2c 20  ix compression, 
1f1a0 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 70 61 63  .    ** the spac
1f1b0 65 20 72 65 71 75 69 72 65 64 20 63 68 61 6e 67  e required chang
1f1c0 65 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  es depending on 
1f1d0 77 68 69 63 68 20 6e 6f 64 65 20 74 68 65 20 6b  which node the k
1f1e0 65 79 20 69 73 20 74 6f 0a 20 20 20 20 2a 2a 20  ey is to.    ** 
1f1f0 62 65 20 61 64 64 65 64 20 74 6f 2e 20 20 2a 2f  be added to.  */
1f200 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20 66  .    nPrefix = f
1f210 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73  ts3PrefixCompres
1f220 73 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e 61 2c 20  s(pNode->key.a, 
1f230 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 2c 20 7a 54  pNode->key.n, zT
1f240 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20  erm, nTerm);.   
1f250 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d   nSuffix = nTerm
1f260 20 2d 20 6e 50 72 65 66 69 78 3b 0a 20 20 20 20   - nPrefix;.    
1f270 6e 53 70 61 63 65 20 20 3d 20 73 71 6c 69 74 65  nSpace  = sqlite
1f280 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e  3Fts3VarintLen(n
1f290 50 72 65 66 69 78 29 3b 0a 20 20 20 20 6e 53 70  Prefix);.    nSp
1f2a0 61 63 65 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ace += sqlite3Ft
1f2b0 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 53 75 66  s3VarintLen(nSuf
1f2c0 66 69 78 29 20 2b 20 6e 53 75 66 66 69 78 3b 0a  fix) + nSuffix;.
1f2d0 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e  .    if( pNode->
1f2e0 6b 65 79 2e 6e 3d 3d 30 20 7c 7c 20 28 70 4e 6f  key.n==0 || (pNo
1f2f0 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 20 2b 20 6e 53  de->block.n + nS
1f300 70 61 63 65 29 3c 3d 70 2d 3e 6e 4e 6f 64 65 53  pace)<=p->nNodeS
1f310 69 7a 65 20 29 7b 20 0a 20 20 20 20 20 20 2f 2a  ize ){ .      /*
1f320 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
1f330 6e 6f 64 65 20 6f 66 20 6c 61 79 65 72 20 69 4c  node of layer iL
1f340 61 79 65 72 20 63 6f 6e 74 61 69 6e 73 20 7a 65  ayer contains ze
1f350 72 6f 20 6b 65 79 73 2c 20 6f 72 20 69 66 20 61  ro keys, or if a
1f360 64 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74  dding.      ** t
1f370 68 65 20 6b 65 79 20 74 6f 20 69 74 20 77 69 6c  he key to it wil
1f380 6c 20 6e 6f 74 20 63 61 75 73 65 20 69 74 20 74  l not cause it t
1f390 6f 20 67 72 6f 77 20 74 6f 20 6c 61 72 67 65 72  o grow to larger
1f3a0 20 74 68 61 6e 20 6e 4e 6f 64 65 53 69 7a 65 20   than nNodeSize 
1f3b0 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20  .      ** bytes 
1f3c0 69 6e 20 73 69 7a 65 2c 20 77 72 69 74 65 20 74  in size, write t
1f3d0 68 65 20 6b 65 79 20 68 65 72 65 2e 20 20 2a 2f  he key here.  */
1f3e0 0a 0a 20 20 20 20 20 20 42 6c 6f 62 20 2a 70 42  ..      Blob *pB
1f3f0 6c 6b 20 3d 20 26 70 4e 6f 64 65 2d 3e 62 6c 6f  lk = &pNode->blo
1f400 63 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  ck;.      if( pB
1f410 6c 6b 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  lk->n==0 ){.    
1f420 20 20 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66      blobGrowBuff
1f430 65 72 28 70 42 6c 6b 2c 20 70 2d 3e 6e 4e 6f 64  er(pBlk, p->nNod
1f440 65 53 69 7a 65 2c 20 26 72 63 29 3b 0a 20 20 20  eSize, &rc);.   
1f450 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1f460 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f470 20 20 20 20 70 42 6c 6b 2d 3e 61 5b 30 5d 20 3d      pBlk->a[0] =
1f480 20 28 63 68 61 72 29 69 4c 61 79 65 72 3b 0a 20   (char)iLayer;. 
1f490 20 20 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e 6e           pBlk->n
1f4a0 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 46 74   = 1 + sqlite3Ft
1f4b0 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 42 6c  s3PutVarint(&pBl
1f4c0 6b 2d 3e 61 5b 31 5d 2c 20 69 50 74 72 29 3b 0a  k->a[1], iPtr);.
1f4d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f4e0 7d 0a 20 20 20 20 20 20 62 6c 6f 62 47 72 6f 77  }.      blobGrow
1f4f0 42 75 66 66 65 72 28 70 42 6c 6b 2c 20 70 42 6c  Buffer(pBlk, pBl
1f500 6b 2d 3e 6e 20 2b 20 6e 53 70 61 63 65 2c 20 26  k->n + nSpace, &
1f510 72 63 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 47  rc);.      blobG
1f520 72 6f 77 42 75 66 66 65 72 28 26 70 4e 6f 64 65  rowBuffer(&pNode
1f530 2d 3e 6b 65 79 2c 20 6e 54 65 72 6d 2c 20 26 72  ->key, nTerm, &r
1f540 63 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72  c);..      if( r
1f550 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1f560 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 6f 64          if( pNod
1f570 65 2d 3e 6b 65 79 2e 6e 20 29 7b 0a 20 20 20 20  e->key.n ){.    
1f580 20 20 20 20 20 20 70 42 6c 6b 2d 3e 6e 20 2b 3d        pBlk->n +=
1f590 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56   sqlite3Fts3PutV
1f5a0 61 72 69 6e 74 28 26 70 42 6c 6b 2d 3e 61 5b 70  arint(&pBlk->a[p
1f5b0 42 6c 6b 2d 3e 6e 5d 2c 20 6e 50 72 65 66 69 78  Blk->n], nPrefix
1f5c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1f5d0 20 20 20 20 20 70 42 6c 6b 2d 3e 6e 20 2b 3d 20       pBlk->n += 
1f5e0 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
1f5f0 72 69 6e 74 28 26 70 42 6c 6b 2d 3e 61 5b 70 42  rint(&pBlk->a[pB
1f600 6c 6b 2d 3e 6e 5d 2c 20 6e 53 75 66 66 69 78 29  lk->n], nSuffix)
1f610 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
1f620 28 26 70 42 6c 6b 2d 3e 61 5b 70 42 6c 6b 2d 3e  (&pBlk->a[pBlk->
1f630 6e 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50 72 65 66  n], &zTerm[nPref
1f640 69 78 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20  ix], nSuffix);. 
1f650 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e 6e 20 2b         pBlk->n +
1f660 3d 20 6e 53 75 66 66 69 78 3b 0a 0a 20 20 20 20  = nSuffix;..    
1f670 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 6f 64 65      memcpy(pNode
1f680 2d 3e 6b 65 79 2e 61 2c 20 7a 54 65 72 6d 2c 20  ->key.a, zTerm, 
1f690 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  nTerm);.        
1f6a0 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 20 3d 20 6e  pNode->key.n = n
1f6b0 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Term;.      }.  
1f6c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
1f6d0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6c 75  * Otherwise, flu
1f6e0 73 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e  sh the current n
1f6f0 6f 64 65 20 6f 66 20 6c 61 79 65 72 20 69 4c 61  ode of layer iLa
1f700 79 65 72 20 74 6f 20 64 69 73 6b 2e 0a 20 20 20  yer to disk..   
1f710 20 20 20 2a 2a 20 54 68 65 6e 20 61 6c 6c 6f 63     ** Then alloc
1f720 61 74 65 20 61 20 6e 65 77 2c 20 65 6d 70 74 79  ate a new, empty
1f730 20 73 69 62 6c 69 6e 67 20 6e 6f 64 65 2e 20 54   sibling node. T
1f740 68 65 20 6b 65 79 20 77 69 6c 6c 20 62 65 20 77  he key will be w
1f750 72 69 74 74 65 6e 0a 20 20 20 20 20 20 2a 2a 20  ritten.      ** 
1f760 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
1f770 6f 66 20 74 68 69 73 20 6e 6f 64 65 2e 20 2a 2f  of this node. */
1f780 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33  .      rc = fts3
1f790 57 72 69 74 65 53 65 67 6d 65 6e 74 28 70 2c 20  WriteSegment(p, 
1f7a0 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b 2c 20 70  pNode->iBlock, p
1f7b0 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 2c 20 70  Node->block.a, p
1f7c0 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 29 3b 0a  Node->block.n);.
1f7d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1f7e0 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 41 6c 6c  Node->block.nAll
1f7f0 6f 63 3e 3d 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65  oc>=p->nNodeSize
1f800 20 29 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d   );.      pNode-
1f810 3e 62 6c 6f 63 6b 2e 61 5b 30 5d 20 3d 20 28 63  >block.a[0] = (c
1f820 68 61 72 29 69 4c 61 79 65 72 3b 0a 20 20 20 20  har)iLayer;.    
1f830 20 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e    pNode->block.n
1f840 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 46 74   = 1 + sqlite3Ft
1f850 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 4e 6f  s3PutVarint(&pNo
1f860 64 65 2d 3e 62 6c 6f 63 6b 2e 61 5b 31 5d 2c 20  de->block.a[1], 
1f870 69 50 74 72 2b 31 29 3b 0a 0a 20 20 20 20 20 20  iPtr+1);..      
1f880 69 4e 65 78 74 50 74 72 20 3d 20 70 4e 6f 64 65  iNextPtr = pNode
1f890 2d 3e 69 42 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  ->iBlock;.      
1f8a0 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b 2b 2b 3b  pNode->iBlock++;
1f8b0 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 6b 65  .      pNode->ke
1f8c0 79 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  y.n = 0;.    }..
1f8d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f8e0 54 45 5f 4f 4b 20 7c 7c 20 69 4e 65 78 74 50 74  TE_OK || iNextPt
1f8f0 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  r==0 ) return rc
1f900 3b 0a 20 20 20 20 69 50 74 72 20 3d 20 69 4e 65  ;.    iPtr = iNe
1f910 78 74 50 74 72 3b 0a 20 20 7d 0a 0a 20 20 61 73  xtPtr;.  }..  as
1f920 73 65 72 74 28 20 30 20 29 3b 0a 20 20 72 65 74  sert( 0 );.  ret
1f930 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1f940 41 70 70 65 6e 64 20 61 20 74 65 72 6d 20 61 6e  Append a term an
1f950 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 64  d (optionally) d
1f960 6f 63 6c 69 73 74 20 74 6f 20 74 68 65 20 46 54  oclist to the FT
1f970 53 20 73 65 67 6d 65 6e 74 20 6e 6f 64 65 20 63  S segment node c
1f980 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 73 74 6f 72  urrently.** stor
1f990 65 64 20 69 6e 20 62 6c 6f 62 20 2a 70 4e 6f 64  ed in blob *pNod
1f9a0 65 2e 20 54 68 65 20 6e 6f 64 65 20 6e 65 65 64  e. The node need
1f9b0 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79   not contain any
1f9c0 20 74 65 72 6d 73 2c 20 62 75 74 20 74 68 65 0a   terms, but the.
1f9d0 2a 2a 20 68 65 61 64 65 72 20 6d 75 73 74 20 62  ** header must b
1f9e0 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65  e written before
1f9f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1fa00 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
1fa10 41 20 6e 6f 64 65 20 68 65 61 64 65 72 20 69 73  A node header is
1fa20 20 61 20 73 69 6e 67 6c 65 20 30 78 30 30 20 62   a single 0x00 b
1fa30 79 74 65 20 66 6f 72 20 61 20 6c 65 61 66 20 6e  yte for a leaf n
1fa40 6f 64 65 2c 20 6f 72 20 61 20 68 65 69 67 68 74  ode, or a height
1fa50 20 76 61 72 69 6e 74 0a 2a 2a 20 66 6f 6c 6c 6f   varint.** follo
1fa60 77 65 64 20 62 79 20 74 68 65 20 6c 65 66 74 2d  wed by the left-
1fa70 68 61 6e 64 2d 63 68 69 6c 64 20 76 61 72 69 6e  hand-child varin
1fa80 74 20 66 6f 72 20 61 6e 20 69 6e 74 65 72 6e 61  t for an interna
1fa90 6c 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  l node..**.** Th
1faa0 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 70 70  e term to be app
1fab0 65 6e 64 65 64 20 69 73 20 70 61 73 73 65 64 20  ended is passed 
1fac0 76 69 61 20 61 72 67 75 6d 65 6e 74 73 20 7a 54  via arguments zT
1fad0 65 72 6d 2f 6e 54 65 72 6d 2e 20 46 6f 72 20 61  erm/nTerm. For a
1fae0 20 0a 2a 2a 20 6c 65 61 66 20 6e 6f 64 65 2c 20   .** leaf node, 
1faf0 74 68 65 20 64 6f 63 6c 69 73 74 20 69 73 20 70  the doclist is p
1fb00 61 73 73 65 64 20 61 73 20 61 44 6f 63 6c 69 73  assed as aDoclis
1fb10 74 2f 6e 44 6f 63 6c 69 73 74 2e 20 46 6f 72 20  t/nDoclist. For 
1fb20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6e  an internal.** n
1fb30 6f 64 65 2c 20 62 6f 74 68 20 61 44 6f 63 6c 69  ode, both aDocli
1fb40 73 74 20 61 6e 64 20 6e 44 6f 63 6c 69 73 74 20  st and nDoclist 
1fb50 6d 75 73 74 20 62 65 20 70 61 73 73 65 64 20 30  must be passed 0
1fb60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
1fb70 69 7a 65 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ize of the value
1fb80 20 69 6e 20 62 6c 6f 62 20 70 50 72 65 76 20 69   in blob pPrev i
1fb90 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69  s zero, then thi
1fba0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a  s is the first.*
1fbb0 2a 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20 74  * term written t
1fbc0 6f 20 74 68 65 20 6e 6f 64 65 2e 20 4f 74 68 65  o the node. Othe
1fbd0 72 77 69 73 65 2c 20 70 50 72 65 76 20 63 6f 6e  rwise, pPrev con
1fbe0 74 61 69 6e 73 20 61 20 63 6f 70 79 20 6f 66 20  tains a copy of 
1fbf0 74 68 65 20 0a 2a 2a 20 70 72 65 76 69 6f 75 73  the .** previous
1fc00 20 74 65 72 6d 2e 20 42 65 66 6f 72 65 20 74 68   term. Before th
1fc10 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
1fc20 72 6e 73 2c 20 69 74 20 69 73 20 75 70 64 61 74  rns, it is updat
1fc30 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 0a  ed to contain a.
1fc40 2a 2a 20 63 6f 70 79 20 6f 66 20 7a 54 65 72 6d  ** copy of zTerm
1fc50 2f 6e 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 49 74  /nTerm..**.** It
1fc60 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
1fc70 20 74 68 65 20 62 75 66 66 65 72 20 61 73 73 6f   the buffer asso
1fc80 63 69 61 74 65 64 20 77 69 74 68 20 70 4e 6f 64  ciated with pNod
1fc90 65 20 69 73 20 61 6c 72 65 61 64 79 20 6c 61 72  e is already lar
1fca0 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 74 6f 20  ge.** enough to 
1fcb0 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20  accommodate the 
1fcc0 6e 65 77 20 65 6e 74 72 79 2e 20 54 68 65 20 62  new entry. The b
1fcd0 75 66 66 65 72 20 61 73 73 6f 63 69 61 74 65 64  uffer associated
1fce0 20 77 69 74 68 20 70 50 72 65 76 0a 2a 2a 20 69   with pPrev.** i
1fcf0 73 20 65 78 74 65 6e 64 65 64 20 62 79 20 74 68  s extended by th
1fd00 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 72  is function if r
1fd10 65 71 75 72 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  equrired..**.** 
1fd20 49 66 20 61 6e 20 65 72 72 6f 72 20 28 69 2e 65  If an error (i.e
1fd30 2e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 29  . OOM condition)
1fd40 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69   occurs, an SQLi
1fd50 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
1fd60 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f 74  .** returned. Ot
1fd70 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
1fd80 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
1fd90 74 20 66 74 73 33 41 70 70 65 6e 64 54 6f 4e 6f  t fts3AppendToNo
1fda0 64 65 28 0a 20 20 42 6c 6f 62 20 2a 70 4e 6f 64  de(.  Blob *pNod
1fdb0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1fdc0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
1fdd0 20 6e 6f 64 65 20 69 6d 61 67 65 20 74 6f 20 61   node image to a
1fde0 70 70 65 6e 64 20 74 6f 20 2a 2f 0a 20 20 42 6c  ppend to */.  Bl
1fdf0 6f 62 20 2a 70 50 72 65 76 2c 20 20 20 20 20 20  ob *pPrev,      
1fe00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fe10 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
1fe20 6e 67 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  ng previous term
1fe30 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 63 6f   written */.  co
1fe40 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c  nst char *zTerm,
1fe50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fe60 20 4e 65 77 20 74 65 72 6d 20 74 6f 20 77 72 69   New term to wri
1fe70 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72  te */.  int nTer
1fe80 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
1fe90 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1fea0 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65  of zTerm in byte
1feb0 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
1fec0 72 20 2a 61 44 6f 63 6c 69 73 74 2c 20 20 20 20  r *aDoclist,    
1fed0 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73         /* Doclis
1fee0 74 20 28 6f 72 20 4e 55 4c 4c 29 20 74 6f 20 77  t (or NULL) to w
1fef0 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44  rite */.  int nD
1ff00 6f 63 6c 69 73 74 20 20 20 20 20 20 20 20 20 20  oclist          
1ff10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1ff20 65 20 6f 66 20 61 44 6f 63 6c 69 73 74 20 69 6e  e of aDoclist in
1ff30 20 62 79 74 65 73 20 2a 2f 20 0a 29 7b 0a 20 20   bytes */ .){.  
1ff40 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1ff50 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
1ff60 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1ff70 2f 0a 20 20 69 6e 74 20 62 46 69 72 73 74 20 3d  /.  int bFirst =
1ff80 20 28 70 50 72 65 76 2d 3e 6e 3d 3d 30 29 3b 20   (pPrev->n==0); 
1ff90 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
1ffa0 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
1ffb0 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20 2a 2f   term written */
1ffc0 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20  .  int nPrefix; 
1ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffe0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65     /* Size of te
1fff0 72 6d 20 70 72 65 66 69 78 20 69 6e 20 62 79 74  rm prefix in byt
20000 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 66  es */.  int nSuf
20010 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  fix;            
20020 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
20030 6f 66 20 74 65 72 6d 20 73 75 66 66 69 78 20 69  of term suffix i
20040 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a  n bytes */..  /*
20050 20 4e 6f 64 65 20 6d 75 73 74 20 68 61 76 65 20   Node must have 
20060 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 74 61  already been sta
20070 72 74 65 64 2e 20 54 68 65 72 65 20 6d 75 73 74  rted. There must
20080 20 62 65 20 61 20 64 6f 63 6c 69 73 74 20 66 6f   be a doclist fo
20090 72 20 61 0a 20 20 2a 2a 20 6c 65 61 66 20 6e 6f  r a.  ** leaf no
200a0 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 6d 75  de, and there mu
200b0 73 74 20 6e 6f 74 20 62 65 20 61 20 64 6f 63 6c  st not be a docl
200c0 69 73 74 20 66 6f 72 20 61 6e 20 69 6e 74 65 72  ist for an inter
200d0 6e 61 6c 20 6e 6f 64 65 2e 20 20 2a 2f 0a 20 20  nal node.  */.  
200e0 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 6e  assert( pNode->n
200f0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
20100 28 70 4e 6f 64 65 2d 3e 61 5b 30 5d 3d 3d 27 5c  (pNode->a[0]=='\
20110 30 27 29 3d 3d 28 61 44 6f 63 6c 69 73 74 21 3d  0')==(aDoclist!=
20120 30 29 20 29 3b 0a 0a 20 20 62 6c 6f 62 47 72 6f  0) );..  blobGro
20130 77 42 75 66 66 65 72 28 70 50 72 65 76 2c 20 6e  wBuffer(pPrev, n
20140 54 65 72 6d 2c 20 26 72 63 29 3b 0a 20 20 69 66  Term, &rc);.  if
20150 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20160 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
20170 6e 50 72 65 66 69 78 20 3d 20 66 74 73 33 50 72  nPrefix = fts3Pr
20180 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70 50 72  efixCompress(pPr
20190 65 76 2d 3e 61 2c 20 70 50 72 65 76 2d 3e 6e 2c  ev->a, pPrev->n,
201a0 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   zTerm, nTerm);.
201b0 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72    nSuffix = nTer
201c0 6d 20 2d 20 6e 50 72 65 66 69 78 3b 0a 20 20 6d  m - nPrefix;.  m
201d0 65 6d 63 70 79 28 70 50 72 65 76 2d 3e 61 2c 20  emcpy(pPrev->a, 
201e0 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  zTerm, nTerm);. 
201f0 20 70 50 72 65 76 2d 3e 6e 20 3d 20 6e 54 65 72   pPrev->n = nTer
20200 6d 3b 0a 0a 20 20 69 66 28 20 62 46 69 72 73 74  m;..  if( bFirst
20210 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 6f 64 65  ==0 ){.    pNode
20220 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ->n += sqlite3Ft
20230 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 4e 6f  s3PutVarint(&pNo
20240 64 65 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d 2c  de->a[pNode->n],
20250 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 7d 0a 20   nPrefix);.  }. 
20260 20 70 4e 6f 64 65 2d 3e 6e 20 2b 3d 20 73 71 6c   pNode->n += sql
20270 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e  ite3Fts3PutVarin
20280 74 28 26 70 4e 6f 64 65 2d 3e 61 5b 70 4e 6f 64  t(&pNode->a[pNod
20290 65 2d 3e 6e 5d 2c 20 6e 53 75 66 66 69 78 29 3b  e->n], nSuffix);
202a0 0a 20 20 6d 65 6d 63 70 79 28 26 70 4e 6f 64 65  .  memcpy(&pNode
202b0 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d 2c 20 26  ->a[pNode->n], &
202c0 7a 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 2c 20  zTerm[nPrefix], 
202d0 6e 53 75 66 66 69 78 29 3b 0a 20 20 70 4e 6f 64  nSuffix);.  pNod
202e0 65 2d 3e 6e 20 2b 3d 20 6e 53 75 66 66 69 78 3b  e->n += nSuffix;
202f0 0a 0a 20 20 69 66 28 20 61 44 6f 63 6c 69 73 74  ..  if( aDoclist
20300 20 29 7b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e 6e   ){.    pNode->n
20310 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50   += sqlite3Fts3P
20320 75 74 56 61 72 69 6e 74 28 26 70 4e 6f 64 65 2d  utVarint(&pNode-
20330 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d 2c 20 6e 44  >a[pNode->n], nD
20340 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 6d 65 6d  oclist);.    mem
20350 63 70 79 28 26 70 4e 6f 64 65 2d 3e 61 5b 70 4e  cpy(&pNode->a[pN
20360 6f 64 65 2d 3e 6e 5d 2c 20 61 44 6f 63 6c 69 73  ode->n], aDoclis
20370 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20  t, nDoclist);.  
20380 20 20 70 4e 6f 64 65 2d 3e 6e 20 2b 3d 20 6e 44    pNode->n += nD
20390 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 61  oclist;.  }..  a
203a0 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 6e 3c  ssert( pNode->n<
203b0 3d 70 4e 6f 64 65 2d 3e 6e 41 6c 6c 6f 63 20 29  =pNode->nAlloc )
203c0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ;..  return SQLI
203d0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
203e0 41 70 70 65 6e 64 20 74 68 65 20 63 75 72 72 65  Append the curre
203f0 6e 74 20 74 65 72 6d 20 61 6e 64 20 64 6f 63 6c  nt term and docl
20400 69 73 74 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ist pointed to b
20410 79 20 63 75 72 73 6f 72 20 70 43 73 72 20 74 6f  y cursor pCsr to
20420 20 74 68 65 0a 2a 2a 20 61 70 70 65 6e 64 61 62   the.** appendab
20430 6c 65 20 62 2d 74 72 65 65 20 73 65 67 6d 65 6e  le b-tree segmen
20440 74 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  t opened for wri
20450 74 69 6e 67 20 62 79 20 70 57 72 69 74 65 72 2e  ting by pWriter.
20460 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
20470 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
20480 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
20490 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ite error code o
204a0 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
204b0 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72  tic int fts3Incr
204c0 6d 65 72 67 65 41 70 70 65 6e 64 28 0a 20 20 46  mergeAppend(.  F
204d0 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
204e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
204f0 2a 20 46 74 73 33 20 74 61 62 6c 65 20 68 61 6e  * Fts3 table han
20500 64 6c 65 20 2a 2f 0a 20 20 49 6e 63 72 6d 65 72  dle */.  Incrmer
20510 67 65 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  geWriter *pWrite
20520 72 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  r,       /* Writ
20530 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  er object */.  F
20540 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
20550 72 20 2a 70 43 73 72 20 20 20 20 20 20 20 20 2f  r *pCsr        /
20560 2a 20 43 75 72 73 6f 72 20 63 6f 6e 74 61 69 6e  * Cursor contain
20570 69 6e 67 20 74 65 72 6d 20 61 6e 64 20 64 6f 63  ing term and doc
20580 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  list */.){.  con
20590 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d  st char *zTerm =
205a0 20 70 43 73 72 2d 3e 7a 54 65 72 6d 3b 0a 20 20   pCsr->zTerm;.  
205b0 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70 43 73 72  int nTerm = pCsr
205c0 2d 3e 6e 54 65 72 6d 3b 0a 20 20 63 6f 6e 73 74  ->nTerm;.  const
205d0 20 63 68 61 72 20 2a 61 44 6f 63 6c 69 73 74 20   char *aDoclist 
205e0 3d 20 70 43 73 72 2d 3e 61 44 6f 63 6c 69 73 74  = pCsr->aDoclist
205f0 3b 0a 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74  ;.  int nDoclist
20600 20 3d 20 70 43 73 72 2d 3e 6e 44 6f 63 6c 69 73   = pCsr->nDoclis
20610 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
20620 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
20630 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
20640 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63  e */.  int nSpac
20650 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
20660 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 70       /* Total sp
20670 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65 71  ace in bytes req
20680 75 69 72 65 64 20 6f 6e 20 6c 65 61 66 20 2a 2f  uired on leaf */
20690 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20  .  int nPrefix; 
206a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206b0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 72 65 66   /* Size of pref
206c0 69 78 20 73 68 61 72 65 64 20 77 69 74 68 20 70  ix shared with p
206d0 72 65 76 69 6f 75 73 20 74 65 72 6d 20 2a 2f 0a  revious term */.
206e0 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 20 20    int nSuffix;  
206f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20700 2f 2a 20 53 69 7a 65 20 6f 66 20 73 75 66 66 69  /* Size of suffi
20710 78 20 28 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66  x (nTerm - nPref
20720 69 78 29 20 2a 2f 0a 20 20 4e 6f 64 65 57 72 69  ix) */.  NodeWri
20730 74 65 72 20 2a 70 4c 65 61 66 3b 20 20 20 20 20  ter *pLeaf;     
20740 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
20750 20 75 73 65 64 20 74 6f 20 77 72 69 74 65 20 6c   used to write l
20760 65 61 66 20 6e 6f 64 65 73 20 2a 2f 0a 0a 20 20  eaf nodes */..  
20770 70 4c 65 61 66 20 3d 20 26 70 57 72 69 74 65 72  pLeaf = &pWriter
20780 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 30 5d  ->aNodeWriter[0]
20790 3b 0a 20 20 6e 50 72 65 66 69 78 20 3d 20 66 74  ;.  nPrefix = ft
207a0 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73  s3PrefixCompress
207b0 28 70 4c 65 61 66 2d 3e 6b 65 79 2e 61 2c 20 70  (pLeaf->key.a, p
207c0 4c 65 61 66 2d 3e 6b 65 79 2e 6e 2c 20 7a 54 65  Leaf->key.n, zTe
207d0 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 6e 53  rm, nTerm);.  nS
207e0 75 66 66 69 78 20 3d 20 6e 54 65 72 6d 20 2d 20  uffix = nTerm - 
207f0 6e 50 72 65 66 69 78 3b 0a 0a 20 20 6e 53 70 61  nPrefix;..  nSpa
20800 63 65 20 20 3d 20 73 71 6c 69 74 65 33 46 74 73  ce  = sqlite3Fts
20810 33 56 61 72 69 6e 74 4c 65 6e 28 6e 50 72 65 66  3VarintLen(nPref
20820 69 78 29 3b 0a 20 20 6e 53 70 61 63 65 20 2b 3d  ix);.  nSpace +=
20830 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69   sqlite3Fts3Vari
20840 6e 74 4c 65 6e 28 6e 53 75 66 66 69 78 29 20 2b  ntLen(nSuffix) +
20850 20 6e 53 75 66 66 69 78 3b 0a 20 20 6e 53 70 61   nSuffix;.  nSpa
20860 63 65 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  ce += sqlite3Fts
20870 33 56 61 72 69 6e 74 4c 65 6e 28 6e 44 6f 63 6c  3VarintLen(nDocl
20880 69 73 74 29 20 2b 20 6e 44 6f 63 6c 69 73 74 3b  ist) + nDoclist;
20890 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
208a0 72 72 65 6e 74 20 62 6c 6f 63 6b 20 69 73 20 6e  rrent block is n
208b0 6f 74 20 65 6d 70 74 79 2c 20 61 6e 64 20 69 66  ot empty, and if
208c0 20 61 64 64 69 6e 67 20 74 68 69 73 20 74 65 72   adding this ter
208d0 6d 2f 64 6f 63 6c 69 73 74 0a 20 20 2a 2a 20 74  m/doclist.  ** t
208e0 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 6c  o the current bl
208f0 6f 63 6b 20 77 6f 75 6c 64 20 6d 61 6b 65 20 69  ock would make i
20900 74 20 6c 61 72 67 65 72 20 74 68 61 6e 20 46 74  t larger than Ft
20910 73 33 54 61 62 6c 65 2e 6e 4e 6f 64 65 53 69 7a  s3Table.nNodeSiz
20920 65 0a 20 20 2a 2a 20 62 79 74 65 73 2c 20 77 72  e.  ** bytes, wr
20930 69 74 65 20 74 68 69 73 20 62 6c 6f 63 6b 20 6f  ite this block o
20940 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
20950 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65  se. */.  if( pLe
20960 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 3e 30 20 26 26  af->block.n>0 &&
20970 20 28 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e   (pLeaf->block.n
20980 20 2b 20 6e 53 70 61 63 65 29 3e 70 2d 3e 6e 4e   + nSpace)>p->nN
20990 6f 64 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  odeSize ){.    r
209a0 63 20 3d 20 66 74 73 33 57 72 69 74 65 53 65 67  c = fts3WriteSeg
209b0 6d 65 6e 74 28 70 2c 20 70 4c 65 61 66 2d 3e 69  ment(p, pLeaf->i
209c0 42 6c 6f 63 6b 2c 20 70 4c 65 61 66 2d 3e 62 6c  Block, pLeaf->bl
209d0 6f 63 6b 2e 61 2c 20 70 4c 65 61 66 2d 3e 62 6c  ock.a, pLeaf->bl
209e0 6f 63 6b 2e 6e 29 3b 0a 20 20 20 20 70 57 72 69  ock.n);.    pWri
209f0 74 65 72 2d 3e 6e 57 6f 72 6b 2b 2b 3b 0a 0a 20  ter->nWork++;.. 
20a00 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 63 75     /* Add the cu
20a10 72 72 65 6e 74 20 74 65 72 6d 20 74 6f 20 74 68  rrent term to th
20a20 65 20 70 61 72 65 6e 74 20 6e 6f 64 65 2e 20 54  e parent node. T
20a30 68 65 20 74 65 72 6d 20 61 64 64 65 64 20 74 6f  he term added to
20a40 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 72   the .    ** par
20a50 65 6e 74 20 6d 75 73 74 3a 0a 20 20 20 20 2a 2a  ent must:.    **
20a60 0a 20 20 20 20 2a 2a 20 20 20 61 29 20 62 65 20  .    **   a) be 
20a70 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
20a80 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20 6f 6e   largest term on
20a90 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 6a   the leaf node j
20aa0 75 73 74 20 77 72 69 74 74 65 6e 0a 20 20 20 20  ust written.    
20ab0 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 64  **      to the d
20ac0 61 74 61 62 61 73 65 20 28 73 74 69 6c 6c 20 61  atabase (still a
20ad0 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 4c 65 61  vailable in pLea
20ae0 66 2d 3e 6b 65 79 29 2c 20 61 6e 64 0a 20 20 20  f->key), and.   
20af0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 62 29 20   **.    **   b) 
20b00 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  be less than or 
20b10 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 65 72  equal to the ter
20b20 6d 20 61 62 6f 75 74 20 74 6f 20 62 65 20 61 64  m about to be ad
20b30 64 65 64 20 74 6f 20 74 68 65 20 6e 65 77 0a 20  ded to the new. 
20b40 20 20 20 2a 2a 20 20 20 20 20 20 6c 65 61 66 20     **      leaf 
20b50 6e 6f 64 65 20 28 7a 54 65 72 6d 2f 6e 54 65 72  node (zTerm/nTer
20b60 6d 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  m)..    **.    *
20b70 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
20b80 2c 20 69 74 20 6d 75 73 74 20 62 65 20 74 68 65  , it must be the
20b90 20 70 72 65 66 69 78 20 6f 66 20 7a 54 65 72 6d   prefix of zTerm
20ba0 20 31 20 62 79 74 65 20 6c 6f 6e 67 65 72 20 74   1 byte longer t
20bb0 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  han.    ** the c
20bc0 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 28 69 66  ommon prefix (if
20bd0 20 61 6e 79 29 20 6f 66 20 7a 54 65 72 6d 20 61   any) of zTerm a
20be0 6e 64 20 70 57 72 69 74 65 72 2d 3e 7a 54 65 72  nd pWriter->zTer
20bf0 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  m..    */.    if
20c00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20c10 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  ){.      rc = ft
20c20 73 33 49 6e 63 72 6d 65 72 67 65 50 75 73 68 28  s3IncrmergePush(
20c30 70 2c 20 70 57 72 69 74 65 72 2c 20 7a 54 65 72  p, pWriter, zTer
20c40 6d 2c 20 6e 50 72 65 66 69 78 2b 31 29 3b 0a 20  m, nPrefix+1);. 
20c50 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 76     }..    /* Adv
20c60 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
20c70 20 6f 75 74 70 75 74 20 62 6c 6f 63 6b 20 2a 2f   output block */
20c80 0a 20 20 20 20 70 4c 65 61 66 2d 3e 69 42 6c 6f  .    pLeaf->iBlo
20c90 63 6b 2b 2b 3b 0a 20 20 20 20 70 4c 65 61 66 2d  ck++;.    pLeaf-
20ca0 3e 6b 65 79 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  >key.n = 0;.    
20cb0 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 20 3d  pLeaf->block.n =
20cc0 20 30 3b 0a 0a 20 20 20 20 6e 53 75 66 66 69 78   0;..    nSuffix
20cd0 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 6e 53   = nTerm;.    nS
20ce0 70 61 63 65 20 20 3d 20 31 3b 0a 20 20 20 20 6e  pace  = 1;.    n
20cf0 53 70 61 63 65 20 2b 3d 20 73 71 6c 69 74 65 33  Space += sqlite3
20d00 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 53  Fts3VarintLen(nS
20d10 75 66 66 69 78 29 20 2b 20 6e 53 75 66 66 69 78  uffix) + nSuffix
20d20 3b 0a 20 20 20 20 6e 53 70 61 63 65 20 2b 3d 20  ;.    nSpace += 
20d30 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e  sqlite3Fts3Varin
20d40 74 4c 65 6e 28 6e 44 6f 63 6c 69 73 74 29 20 2b  tLen(nDoclist) +
20d50 20 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a 0a   nDoclist;.  }..
20d60 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66    pWriter->nLeaf
20d70 44 61 74 61 20 2b 3d 20 6e 53 70 61 63 65 3b 0a  Data += nSpace;.
20d80 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 72    blobGrowBuffer
20d90 28 26 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2c 20  (&pLeaf->block, 
20da0 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 20 2b  pLeaf->block.n +
20db0 20 6e 53 70 61 63 65 2c 20 26 72 63 29 3b 0a 20   nSpace, &rc);. 
20dc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20dd0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4c  OK ){.    if( pL
20de0 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 3d 3d 30 20  eaf->block.n==0 
20df0 29 7b 0a 20 20 20 20 20 20 70 4c 65 61 66 2d 3e  ){.      pLeaf->
20e00 62 6c 6f 63 6b 2e 6e 20 3d 20 31 3b 0a 20 20 20  block.n = 1;.   
20e10 20 20 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e     pLeaf->block.
20e20 61 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  a[0] = '\0';.   
20e30 20 7d 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33   }.    rc = fts3
20e40 41 70 70 65 6e 64 54 6f 4e 6f 64 65 28 0a 20 20  AppendToNode(.  
20e50 20 20 20 20 20 20 26 70 4c 65 61 66 2d 3e 62 6c        &pLeaf->bl
20e60 6f 63 6b 2c 20 26 70 4c 65 61 66 2d 3e 6b 65 79  ock, &pLeaf->key
20e70 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , zTerm, nTerm, 
20e80 61 44 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c 69  aDoclist, nDocli
20e90 73 74 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20  st.    );.  }.. 
20ea0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20eb0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
20ec0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
20ed0 72 65 6c 65 61 73 65 20 61 6c 6c 20 64 79 6e 61  release all dyna
20ee0 6d 69 63 20 72 65 73 6f 75 72 63 65 73 20 68 65  mic resources he
20ef0 6c 64 20 62 79 20 74 68 65 0a 2a 2a 20 6d 65 72  ld by the.** mer
20f00 67 65 2d 77 72 69 74 65 72 20 6f 62 6a 65 63 74  ge-writer object
20f10 20 70 57 72 69 74 65 72 2c 20 61 6e 64 20 69 66   pWriter, and if
20f20 20 6e 6f 20 65 72 72 6f 72 20 68 61 73 20 6f 63   no error has oc
20f30 63 75 72 72 65 64 2c 20 74 6f 20 66 6c 75 73 68  curred, to flush
20f40 0a 2a 2a 20 61 6c 6c 20 6f 75 74 73 74 61 6e 64  .** all outstand
20f50 69 6e 67 20 6e 6f 64 65 20 62 75 66 66 65 72 73  ing node buffers
20f60 20 68 65 6c 64 20 62 79 20 70 57 72 69 74 65 72   held by pWriter
20f70 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
20f80 49 66 20 2a 70 52 63 20 69 73 20 6e 6f 74 20 53  If *pRc is not S
20f90 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68  QLITE_OK when th
20fa0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
20fb0 61 6c 6c 65 64 2c 20 74 68 65 6e 20 6e 6f 20 61  alled, then no a
20fc0 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
20fd0 65 20 74 6f 20 77 72 69 74 65 20 61 6e 79 20 64  e to write any d
20fe0 61 74 61 20 74 6f 20 64 69 73 6b 2e 20 49 6e 73  ata to disk. Ins
20ff0 74 65 61 64 2c 20 74 68 69 73 20 66 75 6e 63 74  tead, this funct
21000 69 6f 6e 20 73 65 72 76 65 73 20 6f 6e 6c 79 0a  ion serves only.
21010 2a 2a 20 74 6f 20 72 65 6c 65 61 73 65 20 6f 75  ** to release ou
21020 74 73 74 61 6e 64 69 6e 67 20 72 65 73 6f 75 72  tstanding resour
21030 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ces..**.** Other
21040 77 69 73 65 2c 20 69 66 20 2a 70 52 63 20 69 73  wise, if *pRc is
21050 20 69 6e 69 74 69 61 6c 6c 79 20 53 51 4c 49 54   initially SQLIT
21060 45 5f 4f 4b 20 61 6e 64 20 61 6e 20 65 72 72 6f  E_OK and an erro
21070 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 2a  r occurs while.*
21080 2a 20 66 6c 75 73 68 69 6e 67 20 62 75 66 66 65  * flushing buffe
21090 72 73 20 74 6f 20 64 69 73 6b 2c 20 2a 70 52 63  rs to disk, *pRc
210a0 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 53 51   is set to an SQ
210b0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
210c0 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e  before.** return
210d0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
210e0 6f 69 64 20 66 74 73 33 49 6e 63 72 6d 65 72 67  oid fts3Incrmerg
210f0 65 52 65 6c 65 61 73 65 28 0a 20 20 46 74 73 33  eRelease(.  Fts3
21100 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
21110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
21120 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  TS3 table handle
21130 20 2a 2f 0a 20 20 49 6e 63 72 6d 65 72 67 65 57   */.  IncrmergeW
21140 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20  riter *pWriter, 
21150 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65 2d 77        /* Merge-w
21160 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  riter object */.
21170 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20 20 20    int *pRc      
21180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21190 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72    /* IN/OUT: Err
211a0 6f 72 20 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20  or code */.){.  
211b0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
211c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211d0 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
211e0 74 65 20 74 68 72 6f 75 67 68 20 6e 6f 6e 2d 72  te through non-r
211f0 6f 6f 74 20 6c 61 79 65 72 73 20 2a 2f 0a 20 20  oot layers */.  
21200 69 6e 74 20 69 52 6f 6f 74 3b 20 20 20 20 20 20  int iRoot;      
21210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21220 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 6f 6f 74  /* Index of root
21230 20 69 6e 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f   in pWriter->aNo
21240 64 65 57 72 69 74 65 72 20 2a 2f 0a 20 20 4e 6f  deWriter */.  No
21250 64 65 57 72 69 74 65 72 20 2a 70 52 6f 6f 74 3b  deWriter *pRoot;
21260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21270 20 4e 6f 64 65 57 72 69 74 65 72 20 66 6f 72 20   NodeWriter for 
21280 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 69  root node */.  i
21290 6e 74 20 72 63 20 3d 20 2a 70 52 63 3b 20 20 20  nt rc = *pRc;   
212a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
212b0 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  * Error code */.
212c0 0a 20 20 2f 2a 20 53 65 74 20 69 52 6f 6f 74 20  .  /* Set iRoot 
212d0 74 6f 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  to the index in 
212e0 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72  pWriter->aNodeWr
212f0 69 74 65 72 5b 5d 20 6f 66 20 74 68 65 20 6f 75  iter[] of the ou
21300 74 70 75 74 20 73 65 67 6d 65 6e 74 20 0a 20 20  tput segment .  
21310 2a 2a 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 49 66  ** root node. If
21320 20 74 68 65 20 73 65 67 6d 65 6e 74 20 66 69 74   the segment fit
21330 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 61 20  s entirely on a 
21340 73 69 6e 67 6c 65 20 6c 65 61 66 20 6e 6f 64 65  single leaf node
21350 2c 20 69 52 6f 6f 74 0a 20 20 2a 2a 20 77 69 6c  , iRoot.  ** wil
21360 6c 20 62 65 20 73 65 74 20 74 6f 20 30 2e 20 49  l be set to 0. I
21370 66 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20  f the root node 
21380 69 73 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  is the parent of
21390 20 74 68 65 20 6c 65 61 76 65 73 2c 20 69 52 6f   the leaves, iRo
213a0 6f 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  ot.  ** will be 
213b0 31 2e 20 41 6e 64 20 73 6f 20 6f 6e 2e 20 20 2a  1. And so on.  *
213c0 2f 0a 20 20 66 6f 72 28 69 52 6f 6f 74 3d 46 54  /.  for(iRoot=FT
213d0 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c 45  S_MAX_APPENDABLE
213e0 5f 48 45 49 47 48 54 2d 31 3b 20 69 52 6f 6f 74  _HEIGHT-1; iRoot
213f0 3e 3d 30 3b 20 69 52 6f 6f 74 2d 2d 29 7b 0a 20  >=0; iRoot--){. 
21400 20 20 20 4e 6f 64 65 57 72 69 74 65 72 20 2a 70     NodeWriter *p
21410 4e 6f 64 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Node = &pWriter-
21420 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 69 52 6f  >aNodeWriter[iRo
21430 6f 74 5d 3b 0a 20 20 20 20 69 66 28 20 70 4e 6f  ot];.    if( pNo
21440 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 3e 30 20 29 20  de->block.n>0 ) 
21450 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72  break;.    asser
21460 74 28 20 2a 70 52 63 20 7c 7c 20 70 4e 6f 64 65  t( *pRc || pNode
21470 2d 3e 62 6c 6f 63 6b 2e 6e 41 6c 6c 6f 63 3d 3d  ->block.nAlloc==
21480 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
21490 20 2a 70 52 63 20 7c 7c 20 70 4e 6f 64 65 2d 3e   *pRc || pNode->
214a0 6b 65 79 2e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b  key.nAlloc==0 );
214b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
214c0 65 28 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61  e(pNode->block.a
214d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
214e0 72 65 65 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e 61  ree(pNode->key.a
214f0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6d 70  );.  }..  /* Emp
21500 74 79 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e  ty output segmen
21510 74 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  t. This is a no-
21520 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 69 52 6f  op. */.  if( iRo
21530 6f 74 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  ot<0 ) return;..
21540 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20    /* The entire 
21550 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 66  output segment f
21560 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  its on a single 
21570 6e 6f 64 65 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  node. Normally, 
21580 74 68 69 73 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  this means.  ** 
21590 74 68 65 20 6e 6f 64 65 20 77 6f 75 6c 64 20 62  the node would b
215a0 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 62 6c  e stored as a bl
215b0 6f 62 20 69 6e 20 74 68 65 20 22 72 6f 6f 74 22  ob in the "root"
215c0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 25   column of the %
215d0 5f 73 65 67 64 69 72 0a 20 20 2a 2a 20 74 61 62  _segdir.  ** tab
215e0 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 69  le. However, thi
215f0 73 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74 74  s is not permitt
21600 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
21610 20 54 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20   The problem is 
21620 74 68 61 74 20 0a 20 20 2a 2a 20 73 70 61 63 65  that .  ** space
21630 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
21640 6e 20 72 65 73 65 72 76 65 64 20 69 6e 20 74 68  n reserved in th
21650 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62  e %_segments tab
21660 6c 65 2c 20 61 6e 64 20 73 6f 20 74 68 65 20 0a  le, and so the .
21670 20 20 2a 2a 20 73 74 61 72 74 5f 62 6c 6f 63 6b    ** start_block
21680 20 61 6e 64 20 65 6e 64 5f 62 6c 6f 63 6b 20 66   and end_block f
21690 69 65 6c 64 73 20 6f 66 20 74 68 65 20 25 5f 73  ields of the %_s
216a0 65 67 64 69 72 20 74 61 62 6c 65 20 6d 75 73 74  egdir table must
216b0 20 62 65 20 70 6f 70 75 6c 61 74 65 64 2e 20 0a   be populated. .
216c0 20 20 2a 2a 20 41 6e 64 2c 20 62 79 20 64 65 73    ** And, by des
216d0 69 67 6e 20 6f 72 20 62 79 20 61 63 63 69 64 65  ign or by accide
216e0 6e 74 2c 20 72 65 6c 65 61 73 65 64 20 76 65 72  nt, released ver
216f0 73 69 6f 6e 73 20 6f 66 20 46 54 53 20 63 61 6e  sions of FTS can
21700 6e 6f 74 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a  not handle .  **
21710 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20 66   segments that f
21720 69 74 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74  it entirely on t
21730 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 77 69 74  he root node wit
21740 68 20 73 74 61 72 74 5f 62 6c 6f 63 6b 21 3d 30  h start_block!=0
21750 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 73 74  ..  **.  ** Inst
21760 65 61 64 2c 20 63 72 65 61 74 65 20 61 20 73 79  ead, create a sy
21770 6e 74 68 65 74 69 63 20 72 6f 6f 74 20 6e 6f 64  nthetic root nod
21780 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
21790 6e 6f 74 68 69 6e 67 20 62 75 74 20 61 20 0a 20  nothing but a . 
217a0 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74   ** pointer to t
217b0 68 65 20 73 69 6e 67 6c 65 20 63 6f 6e 74 65 6e  he single conten
217c0 74 20 6e 6f 64 65 2e 20 53 6f 20 74 68 61 74 20  t node. So that 
217d0 74 68 65 20 73 65 67 6d 65 6e 74 20 63 6f 6e 73  the segment cons
217e0 69 73 74 73 20 6f 66 20 61 0a 20 20 2a 2a 20 73  ists of a.  ** s
217f0 69 6e 67 6c 65 20 6c 65 61 66 20 61 6e 64 20 61  ingle leaf and a
21800 20 73 69 6e 67 6c 65 20 69 6e 74 65 72 69 6f 72   single interior
21810 20 28 72 6f 6f 74 29 20 6e 6f 64 65 2e 0a 20 20   (root) node..  
21820 2a 2a 0a 20 20 2a 2a 20 54 6f 64 6f 3a 20 42 65  **.  ** Todo: Be
21830 74 74 65 72 20 6d 69 67 68 74 20 62 65 20 74 6f  tter might be to
21840 20 64 65 66 65 72 20 61 6c 6c 6f 63 61 74 69 6e   defer allocatin
21850 67 20 73 70 61 63 65 20 69 6e 20 74 68 65 20 25  g space in the %
21860 5f 73 65 67 6d 65 6e 74 73 20 0a 20 20 2a 2a 20  _segments .  ** 
21870 74 61 62 6c 65 20 75 6e 74 69 6c 20 77 65 20 61  table until we a
21880 72 65 20 73 75 72 65 20 69 74 20 69 73 20 6e 65  re sure it is ne
21890 65 64 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  eded..  */.  if(
218a0 20 69 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20   iRoot==0 ){.   
218b0 20 42 6c 6f 62 20 2a 70 42 6c 6f 63 6b 20 3d 20   Blob *pBlock = 
218c0 26 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57  &pWriter->aNodeW
218d0 72 69 74 65 72 5b 31 5d 2e 62 6c 6f 63 6b 3b 0a  riter[1].block;.
218e0 20 20 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66      blobGrowBuff
218f0 65 72 28 70 42 6c 6f 63 6b 2c 20 31 20 2b 20 46  er(pBlock, 1 + F
21900 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 2c 20  TS3_VARINT_MAX, 
21910 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &rc);.    if( rc
21920 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21930 20 20 20 20 20 70 42 6c 6f 63 6b 2d 3e 61 5b 30       pBlock->a[0
21940 5d 20 3d 20 30 78 30 31 3b 0a 20 20 20 20 20 20  ] = 0x01;.      
21950 70 42 6c 6f 63 6b 2d 3e 6e 20 3d 20 31 20 2b 20  pBlock->n = 1 + 
21960 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
21970 72 69 6e 74 28 0a 20 20 20 20 20 20 20 20 20 20  rint(.          
21980 26 70 42 6c 6f 63 6b 2d 3e 61 5b 31 5d 2c 20 70  &pBlock->a[1], p
21990 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69  Writer->aNodeWri
219a0 74 65 72 5b 30 5d 2e 69 42 6c 6f 63 6b 0a 20 20  ter[0].iBlock.  
219b0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
219c0 20 69 52 6f 6f 74 20 3d 20 31 3b 0a 20 20 7d 0a   iRoot = 1;.  }.
219d0 20 20 70 52 6f 6f 74 20 3d 20 26 70 57 72 69 74    pRoot = &pWrit
219e0 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b  er->aNodeWriter[
219f0 69 52 6f 6f 74 5d 3b 0a 0a 20 20 2f 2a 20 46 6c  iRoot];..  /* Fl
21a00 75 73 68 20 61 6c 6c 20 63 75 72 72 65 6e 74 6c  ush all currentl
21a10 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6e 6f  y outstanding no
21a20 64 65 73 20 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a  des to disk. */.
21a30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 69 52 6f    for(i=0; i<iRo
21a40 6f 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4e 6f  ot; i++){.    No
21a50 64 65 57 72 69 74 65 72 20 2a 70 4e 6f 64 65 20  deWriter *pNode 
21a60 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64  = &pWriter->aNod
21a70 65 57 72 69 74 65 72 5b 69 5d 3b 0a 20 20 20 20  eWriter[i];.    
21a80 69 66 28 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b  if( pNode->block
21a90 2e 6e 3e 30 20 26 26 20 72 63 3d 3d 53 51 4c 49  .n>0 && rc==SQLI
21aa0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
21ab0 63 20 3d 20 66 74 73 33 57 72 69 74 65 53 65 67  c = fts3WriteSeg
21ac0 6d 65 6e 74 28 70 2c 20 70 4e 6f 64 65 2d 3e 69  ment(p, pNode->i
21ad0 42 6c 6f 63 6b 2c 20 70 4e 6f 64 65 2d 3e 62 6c  Block, pNode->bl
21ae0 6f 63 6b 2e 61 2c 20 70 4e 6f 64 65 2d 3e 62 6c  ock.a, pNode->bl
21af0 6f 63 6b 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  ock.n);.    }.  
21b00 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
21b10 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 29 3b 0a  Node->block.a);.
21b20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
21b30 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e 61 29 3b 0a  (pNode->key.a);.
21b40 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
21b50 74 68 65 20 25 5f 73 65 67 64 69 72 20 72 65 63  the %_segdir rec
21b60 6f 72 64 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  ord. */.  if( rc
21b70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21b80 20 20 20 72 63 20 3d 20 66 74 73 33 57 72 69 74     rc = fts3Writ
21b90 65 53 65 67 64 69 72 28 70 2c 20 0a 20 20 20 20  eSegdir(p, .    
21ba0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 41 62      pWriter->iAb
21bb0 73 4c 65 76 65 6c 2b 31 2c 20 20 20 20 20 20 20  sLevel+1,       
21bc0 20 20 20 20 20 20 20 20 2f 2a 20 6c 65 76 65 6c          /* level
21bd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57 72 69   */.        pWri
21be0 74 65 72 2d 3e 69 49 64 78 2c 20 20 20 20 20 20  ter->iIdx,      
21bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c00 2f 2a 20 69 64 78 20 2a 2f 0a 20 20 20 20 20 20  /* idx */.      
21c10 20 20 70 57 72 69 74 65 72 2d 3e 69 53 74 61 72    pWriter->iStar
21c20 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
21c30 20 20 20 20 20 20 2f 2a 20 73 74 61 72 74 5f 62        /* start_b
21c40 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
21c50 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72  pWriter->aNodeWr
21c60 69 74 65 72 5b 30 5d 2e 69 42 6c 6f 63 6b 2c 20  iter[0].iBlock, 
21c70 20 20 20 20 2f 2a 20 6c 65 61 76 65 73 5f 65 6e      /* leaves_en
21c80 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  d_block */.     
21c90 20 20 20 70 57 72 69 74 65 72 2d 3e 69 45 6e 64     pWriter->iEnd
21ca0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21cb0 20 20 20 20 20 20 20 2f 2a 20 65 6e 64 5f 62 6c         /* end_bl
21cc0 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 28  ock */.        (
21cd0 70 57 72 69 74 65 72 2d 3e 62 4e 6f 4c 65 61 66  pWriter->bNoLeaf
21ce0 44 61 74 61 3d 3d 30 20 3f 20 70 57 72 69 74 65  Data==0 ? pWrite
21cf0 72 2d 3e 6e 4c 65 61 66 44 61 74 61 20 3a 20 30  r->nLeafData : 0
21d00 29 2c 20 20 20 2f 2a 20 65 6e 64 5f 62 6c 6f 63  ),   /* end_bloc
21d10 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 52 6f  k */.        pRo
21d20 6f 74 2d 3e 62 6c 6f 63 6b 2e 61 2c 20 70 52 6f  ot->block.a, pRo
21d30 6f 74 2d 3e 62 6c 6f 63 6b 2e 6e 20 20 20 20 20  ot->block.n     
21d40 20 2f 2a 20 72 6f 6f 74 20 2a 2f 0a 20 20 20 20   /* root */.    
21d50 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
21d60 5f 66 72 65 65 28 70 52 6f 6f 74 2d 3e 62 6c 6f  _free(pRoot->blo
21d70 63 6b 2e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  ck.a);.  sqlite3
21d80 5f 66 72 65 65 28 70 52 6f 6f 74 2d 3e 6b 65 79  _free(pRoot->key
21d90 2e 61 29 3b 0a 0a 20 20 2a 70 52 63 20 3d 20 72  .a);..  *pRc = r
21da0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  c;.}../*.** Comp
21db0 61 72 65 20 74 68 65 20 74 65 72 6d 20 69 6e 20  are the term in 
21dc0 62 75 66 66 65 72 20 7a 4c 68 73 20 28 73 69 7a  buffer zLhs (siz
21dd0 65 20 69 6e 20 62 79 74 65 73 20 6e 4c 68 73 29  e in bytes nLhs)
21de0 20 77 69 74 68 20 74 68 61 74 20 69 6e 0a 2a 2a   with that in.**
21df0 20 7a 52 68 73 20 28 73 69 7a 65 20 69 6e 20 62   zRhs (size in b
21e00 79 74 65 73 20 6e 52 68 73 29 20 75 73 69 6e 67  ytes nRhs) using
21e10 20 6d 65 6d 63 6d 70 2e 20 49 66 20 6f 6e 65 20   memcmp. If one 
21e20 74 65 72 6d 20 69 73 20 61 20 70 72 65 66 69 78  term is a prefix
21e30 20 6f 66 0a 2a 2a 20 74 68 65 20 6f 74 68 65 72   of.** the other
21e40 2c 20 69 74 20 69 73 20 63 6f 6e 73 69 64 65 72  , it is consider
21e50 65 64 20 74 6f 20 62 65 20 73 6d 61 6c 6c 65 72  ed to be smaller
21e60 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2e   than the other.
21e70 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 2d 76  .**.** Return -v
21e80 65 20 69 66 20 7a 4c 68 73 20 69 73 20 73 6d 61  e if zLhs is sma
21e90 6c 6c 65 72 20 74 68 61 6e 20 7a 52 68 73 2c 20  ller than zRhs, 
21ea0 30 20 69 66 20 69 74 20 69 73 20 65 71 75 61 6c  0 if it is equal
21eb0 2c 20 6f 72 20 2b 76 65 0a 2a 2a 20 69 66 20 69  , or +ve.** if i
21ec0 74 20 69 73 20 67 72 65 61 74 65 72 2e 0a 2a 2f  t is greater..*/
21ed0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
21ee0 54 65 72 6d 43 6d 70 28 0a 20 20 63 6f 6e 73 74  TermCmp(.  const
21ef0 20 63 68 61 72 20 2a 7a 4c 68 73 2c 20 69 6e 74   char *zLhs, int
21f00 20 6e 4c 68 73 2c 20 20 20 20 20 2f 2a 20 4c 48   nLhs,     /* LH
21f10 53 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  S of comparison 
21f20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
21f30 2a 7a 52 68 73 2c 20 69 6e 74 20 6e 52 68 73 20  *zRhs, int nRhs 
21f40 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 63       /* RHS of c
21f50 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a  omparison */.){.
21f60 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e    int nCmp = MIN
21f70 28 6e 4c 68 73 2c 20 6e 52 68 73 29 3b 0a 20 20  (nLhs, nRhs);.  
21f80 69 6e 74 20 72 65 73 3b 0a 0a 20 20 72 65 73 20  int res;..  res 
21f90 3d 20 6d 65 6d 63 6d 70 28 7a 4c 68 73 2c 20 7a  = memcmp(zLhs, z
21fa0 52 68 73 2c 20 6e 43 6d 70 29 3b 0a 20 20 69 66  Rhs, nCmp);.  if
21fb0 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20 3d  ( res==0 ) res =
21fc0 20 6e 4c 68 73 20 2d 20 6e 52 68 73 3b 0a 0a 20   nLhs - nRhs;.. 
21fd0 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
21fe0 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20  ./*.** Query to 
21ff0 73 65 65 20 69 66 20 74 68 65 20 65 6e 74 72 79  see if the entry
22000 20 69 6e 20 74 68 65 20 25 5f 73 65 67 6d 65 6e   in the %_segmen
22010 74 73 20 74 61 62 6c 65 20 77 69 74 68 20 62 6c  ts table with bl
22020 6f 63 6b 69 64 20 69 45 6e 64 20 69 73 20 0a 2a  ockid iEnd is .*
22030 2a 20 4e 55 4c 4c 2e 20 49 66 20 6e 6f 20 65 72  * NULL. If no er
22040 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ror occurs and t
22050 68 65 20 65 6e 74 72 79 20 69 73 20 4e 55 4c 4c  he entry is NULL
22060 2c 20 73 65 74 20 2a 70 62 52 65 73 20 31 20 62  , set *pbRes 1 b
22070 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69  efore.** returni
22080 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73  ng. Otherwise, s
22090 65 74 20 2a 70 62 52 65 73 20 74 6f 20 30 2e 20  et *pbRes to 0. 
220a0 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 61 6e  .**.** Or, if an
220b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
220c0 69 6c 65 20 71 75 65 72 79 69 6e 67 20 74 68 65  ile querying the
220d0 20 64 61 74 61 62 61 73 65 2c 20 72 65 74 75 72   database, retur
220e0 6e 20 61 6e 20 53 51 4c 69 74 65 20 0a 2a 2a 20  n an SQLite .** 
220f0 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20  error code. The 
22100 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 2a  final value of *
22110 70 62 52 65 73 20 69 73 20 75 6e 64 65 66 69 6e  pbRes is undefin
22120 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
22130 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75  .**.** This is u
22140 73 65 64 20 74 6f 20 74 65 73 74 20 69 66 20 61  sed to test if a
22150 20 73 65 67 6d 65 6e 74 20 69 73 20 61 6e 20 22   segment is an "
22160 61 70 70 65 6e 64 61 62 6c 65 22 20 73 65 67 6d  appendable" segm
22170 65 6e 74 2e 20 49 66 20 69 74 0a 2a 2a 20 69 73  ent. If it.** is
22180 2c 20 74 68 65 6e 20 61 20 4e 55 4c 4c 20 65 6e  , then a NULL en
22190 74 72 79 20 68 61 73 20 62 65 65 6e 20 69 6e 73  try has been ins
221a0 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 25  erted into the %
221b0 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 0a  _segments table.
221c0 2a 2a 20 77 69 74 68 20 62 6c 6f 63 6b 69 64 20  ** with blockid 
221d0 25 5f 73 65 67 64 69 72 2e 65 6e 64 5f 62 6c 6f  %_segdir.end_blo
221e0 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
221f0 74 20 66 74 73 33 49 73 41 70 70 65 6e 64 61 62  t fts3IsAppendab
22200 6c 65 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  le(Fts3Table *p,
22210 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
22220 45 6e 64 2c 20 69 6e 74 20 2a 70 62 52 65 73 29  End, int *pbRes)
22230 7b 0a 20 20 69 6e 74 20 62 52 65 73 20 3d 20 30  {.  int bRes = 0
22240 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22250 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 74 6f      /* Result to
22260 20 73 65 74 20 2a 70 62 52 65 73 20 74 6f 20 2a   set *pbRes to *
22270 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
22280 20 2a 70 43 68 65 63 6b 20 3d 20 30 3b 20 20 20   *pCheck = 0;   
22290 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
222a0 20 74 6f 20 71 75 65 72 79 20 64 61 74 61 62 61   to query databa
222b0 73 65 20 77 69 74 68 20 2a 2f 0a 20 20 69 6e 74  se with */.  int
222c0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
222d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
222e0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
222f0 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74    rc = fts3SqlSt
22300 6d 74 28 70 2c 20 53 51 4c 5f 53 45 47 4d 45 4e  mt(p, SQL_SEGMEN
22310 54 5f 49 53 5f 41 50 50 45 4e 44 41 42 4c 45 2c  T_IS_APPENDABLE,
22320 20 26 70 43 68 65 63 6b 2c 20 30 29 3b 0a 20 20   &pCheck, 0);.  
22330 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22340 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
22350 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 43 68 65  _bind_int64(pChe
22360 63 6b 2c 20 31 2c 20 69 45 6e 64 29 3b 0a 20 20  ck, 1, iEnd);.  
22370 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
22380 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
22390 43 68 65 63 6b 29 20 29 20 62 52 65 73 20 3d 20  Check) ) bRes = 
223a0 31 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  1;.    rc = sqli
223b0 74 65 33 5f 72 65 73 65 74 28 70 43 68 65 63 6b  te3_reset(pCheck
223c0 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2a 70 62 52  );.  }.  .  *pbR
223d0 65 73 20 3d 20 62 52 65 73 3b 0a 20 20 72 65 74  es = bRes;.  ret
223e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
223f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
22400 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 6e  s called when in
22410 69 74 69 61 6c 69 7a 69 6e 67 20 61 6e 20 69 6e  itializing an in
22420 63 72 65 6d 65 6e 74 61 6c 2d 6d 65 72 67 65 20  cremental-merge 
22430 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49 74  operation..** It
22440 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 20 65   checks if the e
22450 78 69 73 74 69 6e 67 20 73 65 67 6d 65 6e 74 20  xisting segment 
22460 77 69 74 68 20 69 6e 64 65 78 20 76 61 6c 75 65  with index value
22470 20 69 49 64 78 20 61 74 20 61 62 73 6f 6c 75 74   iIdx at absolut
22480 65 20 6c 65 76 65 6c 20 0a 2a 2a 20 28 69 41 62  e level .** (iAb
22490 73 4c 65 76 65 6c 2b 31 29 20 63 61 6e 20 62 65  sLevel+1) can be
224a0 20 61 70 70 65 6e 64 65 64 20 74 6f 20 62 79 20   appended to by 
224b0 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  the incremental 
224c0 6d 65 72 67 65 2e 20 49 66 20 69 74 20 63 61 6e  merge. If it can
224d0 2c 20 74 68 65 0a 2a 2a 20 6d 65 72 67 65 2d 77  , the.** merge-w
224e0 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 70 57  riter object *pW
224f0 72 69 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c  riter is initial
22500 69 7a 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  ized to write to
22510 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78   it..**.** An ex
22520 69 73 74 69 6e 67 20 73 65 67 6d 65 6e 74 20 63  isting segment c
22530 61 6e 20 62 65 20 61 70 70 65 6e 64 65 64 20 74  an be appended t
22540 6f 20 62 79 20 61 6e 20 69 6e 63 72 65 6d 65 6e  o by an incremen
22550 74 61 6c 20 6d 65 72 67 65 20 69 66 3a 0a 2a 2a  tal merge if:.**
22560 0a 2a 2a 20 20 20 2a 20 49 74 20 77 61 73 20 69  .**   * It was i
22570 6e 69 74 69 61 6c 6c 79 20 63 72 65 61 74 65 64  nitially created
22580 20 61 73 20 61 6e 20 61 70 70 65 6e 64 61 62 6c   as an appendabl
22590 65 20 73 65 67 6d 65 6e 74 20 28 77 69 74 68 20  e segment (with 
225a0 61 6c 6c 20 72 65 71 75 69 72 65 64 0a 2a 2a 20  all required.** 
225b0 20 20 20 20 73 70 61 63 65 20 70 72 65 2d 61 6c      space pre-al
225c0 6c 6f 63 61 74 65 64 29 2c 20 61 6e 64 0a 2a 2a  located), and.**
225d0 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73  .**   * The firs
225e0 74 20 6b 65 79 20 72 65 61 64 20 66 72 6f 6d 20  t key read from 
225f0 74 68 65 20 69 6e 70 75 74 20 28 61 72 67 75 6d  the input (argum
22600 65 6e 74 73 20 7a 4b 65 79 20 61 6e 64 20 6e 4b  ents zKey and nK
22610 65 79 29 20 69 73 20 0a 2a 2a 20 20 20 20 20 67  ey) is .**     g
22620 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
22630 6c 61 72 67 65 73 74 20 6b 65 79 20 63 75 72 72  largest key curr
22640 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
22650 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 0a 2a 2a  the potential.**
22660 20 20 20 20 20 6f 75 74 70 75 74 20 73 65 67 6d       output segm
22670 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
22680 6e 74 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65  nt fts3Incrmerge
22690 4c 6f 61 64 28 0a 20 20 46 74 73 33 54 61 62 6c  Load(.  Fts3Tabl
226a0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
226b0 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73 33 20          /* Fts3 
226c0 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
226d0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
226e0 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 20 20  iAbsLevel,      
226f0 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65    /* Absolute le
22700 76 65 6c 20 6f 66 20 69 6e 70 75 74 20 73 65 67  vel of input seg
22710 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ments */.  int i
22720 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
22730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
22740 64 65 78 20 6f 66 20 63 61 6e 64 69 64 61 74 65  dex of candidate
22750 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20   output segment 
22760 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
22770 2a 7a 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20  *zKey,          
22780 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6b 65       /* First ke
22790 79 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  y to write */.  
227a0 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  int nKey,       
227b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
227d0 65 73 20 69 6e 20 6e 4b 65 79 20 2a 2f 0a 20 20  es in nKey */.  
227e0 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72 20  IncrmergeWriter 
227f0 2a 70 57 72 69 74 65 72 20 20 20 20 20 20 20 20  *pWriter        
22800 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73  /* Populate this
22810 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
22820 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
22830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22840 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
22850 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
22860 20 2a 70 53 65 6c 65 63 74 20 3d 20 30 3b 20 20   *pSelect = 0;  
22870 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f      /* SELECT to
22880 20 72 65 61 64 20 25 5f 73 65 67 64 69 72 20 65   read %_segdir e
22890 6e 74 72 79 20 2a 2f 0a 0a 20 20 72 63 20 3d 20  ntry */..  rc = 
228a0 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
228b0 51 4c 5f 53 45 4c 45 43 54 5f 53 45 47 44 49 52  QL_SELECT_SEGDIR
228c0 2c 20 26 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  , &pSelect, 0);.
228d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
228e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
228f0 65 33 5f 69 6e 74 36 34 20 69 53 74 61 72 74 20  e3_int64 iStart 
22900 3d 20 30 3b 20 20 20 20 20 2f 2a 20 56 61 6c 75  = 0;     /* Valu
22910 65 20 6f 66 20 25 5f 73 65 67 64 69 72 2e 73 74  e of %_segdir.st
22920 61 72 74 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20  art_block */.   
22930 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
22940 4c 65 61 66 45 6e 64 20 3d 20 30 3b 20 20 20 2f  LeafEnd = 0;   /
22950 2a 20 56 61 6c 75 65 20 6f 66 20 25 5f 73 65 67  * Value of %_seg
22960 64 69 72 2e 6c 65 61 76 65 73 5f 65 6e 64 5f 62  dir.leaves_end_b
22970 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 73 71 6c 69  lock */.    sqli
22980 74 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 20 3d  te3_int64 iEnd =
22990 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 6c   0;       /* Val
229a0 75 65 20 6f 66 20 25 5f 73 65 67 64 69 72 2e 65  ue of %_segdir.e
229b0 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  nd_block */.    
229c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 52 6f 6f  const char *aRoo
229d0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  t = 0;        /*
229e0 20 50 6f 69 6e 74 65 72 20 74 6f 20 25 5f 73 65   Pointer to %_se
229f0 67 64 69 72 2e 72 6f 6f 74 20 62 75 66 66 65 72  gdir.root buffer
22a00 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 6f 6f   */.    int nRoo
22a10 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
22a20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
22a30 20 61 52 6f 6f 74 5b 5d 20 69 6e 20 62 79 74 65   aRoot[] in byte
22a40 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 32  s */.    int rc2
22a50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22a60 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
22a70 20 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69 74   code from sqlit
22a80 65 33 5f 72 65 73 65 74 28 29 20 2a 2f 0a 20 20  e3_reset() */.  
22a90 20 20 69 6e 74 20 62 41 70 70 65 6e 64 61 62 6c    int bAppendabl
22aa0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
22ab0 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69  /* Set to true i
22ac0 66 20 73 65 67 6d 65 6e 74 20 69 73 20 61 70 70  f segment is app
22ad0 65 6e 64 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20  endable */..    
22ae0 2f 2a 20 52 65 61 64 20 74 68 65 20 25 5f 73 65  /* Read the %_se
22af0 67 64 69 72 20 65 6e 74 72 79 20 66 6f 72 20 69  gdir entry for i
22b00 6e 64 65 78 20 69 49 64 78 20 61 62 73 6f 6c 75  ndex iIdx absolu
22b10 74 65 20 6c 65 76 65 6c 20 28 69 41 62 73 4c 65  te level (iAbsLe
22b20 76 65 6c 2b 31 29 20 2a 2f 0a 20 20 20 20 73 71  vel+1) */.    sq
22b30 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
22b40 28 70 53 65 6c 65 63 74 2c 20 31 2c 20 69 41 62  (pSelect, 1, iAb
22b50 73 4c 65 76 65 6c 2b 31 29 3b 0a 20 20 20 20 73  sLevel+1);.    s
22b60 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
22b70 70 53 65 6c 65 63 74 2c 20 32 2c 20 69 49 64 78  pSelect, 2, iIdx
22b80 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
22b90 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29  e3_step(pSelect)
22ba0 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
22bb0 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
22bc0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
22bd0 74 36 34 28 70 53 65 6c 65 63 74 2c 20 31 29 3b  t64(pSelect, 1);
22be0 0a 20 20 20 20 20 20 69 4c 65 61 66 45 6e 64 20  .      iLeafEnd 
22bf0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
22c00 5f 69 6e 74 36 34 28 70 53 65 6c 65 63 74 2c 20  _int64(pSelect, 
22c10 32 29 3b 0a 20 20 20 20 20 20 66 74 73 33 52 65  2);.      fts3Re
22c20 61 64 45 6e 64 42 6c 6f 63 6b 46 69 65 6c 64 28  adEndBlockField(
22c30 70 53 65 6c 65 63 74 2c 20 33 2c 20 26 69 45 6e  pSelect, 3, &iEn
22c40 64 2c 20 26 70 57 72 69 74 65 72 2d 3e 6e 4c 65  d, &pWriter->nLe
22c50 61 66 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69  afData);.      i
22c60 66 28 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61  f( pWriter->nLea
22c70 66 44 61 74 61 3c 30 20 29 7b 0a 20 20 20 20 20  fData<0 ){.     
22c80 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61     pWriter->nLea
22c90 66 44 61 74 61 20 3d 20 70 57 72 69 74 65 72 2d  fData = pWriter-
22ca0 3e 6e 4c 65 61 66 44 61 74 61 20 2a 20 2d 31 3b  >nLeafData * -1;
22cb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
22cc0 57 72 69 74 65 72 2d 3e 62 4e 6f 4c 65 61 66 44  Writer->bNoLeafD
22cd0 61 74 61 20 3d 20 28 70 57 72 69 74 65 72 2d 3e  ata = (pWriter->
22ce0 6e 4c 65 61 66 44 61 74 61 3d 3d 30 29 3b 0a 20  nLeafData==0);. 
22cf0 20 20 20 20 20 6e 52 6f 6f 74 20 3d 20 73 71 6c       nRoot = sql
22d00 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
22d10 73 28 70 53 65 6c 65 63 74 2c 20 34 29 3b 0a 20  s(pSelect, 4);. 
22d20 20 20 20 20 20 61 52 6f 6f 74 20 3d 20 73 71 6c       aRoot = sql
22d30 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
22d40 28 70 53 65 6c 65 63 74 2c 20 34 29 3b 0a 20 20  (pSelect, 4);.  
22d50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
22d60 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 72 65  eturn sqlite3_re
22d70 73 65 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  set(pSelect);.  
22d80 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
22d90 6b 20 66 6f 72 20 74 68 65 20 7a 65 72 6f 2d 6c  k for the zero-l
22da0 65 6e 67 74 68 20 6d 61 72 6b 65 72 20 69 6e 20  ength marker in 
22db0 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74  the %_segments t
22dc0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d  able */.    rc =
22dd0 20 66 74 73 33 49 73 41 70 70 65 6e 64 61 62 6c   fts3IsAppendabl
22de0 65 28 70 2c 20 69 45 6e 64 2c 20 26 62 41 70 70  e(p, iEnd, &bApp
22df0 65 6e 64 61 62 6c 65 29 3b 0a 0a 20 20 20 20 2f  endable);..    /
22e00 2a 20 43 68 65 63 6b 20 74 68 61 74 20 7a 4b 65  * Check that zKe
22e10 79 2f 6e 4b 65 79 20 69 73 20 6c 61 72 67 65 72  y/nKey is larger
22e20 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73   than the larges
22e30 74 20 6b 65 79 20 74 68 65 20 63 61 6e 64 69 64  t key the candid
22e40 61 74 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  ate */.    if( r
22e50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
22e60 62 41 70 70 65 6e 64 61 62 6c 65 20 29 7b 0a 20  bAppendable ){. 
22e70 20 20 20 20 20 63 68 61 72 20 2a 61 4c 65 61 66       char *aLeaf
22e80 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
22e90 6e 4c 65 61 66 20 3d 20 30 3b 0a 0a 20 20 20 20  nLeaf = 0;..    
22ea0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
22eb0 73 33 52 65 61 64 42 6c 6f 63 6b 28 70 2c 20 69  s3ReadBlock(p, i
22ec0 4c 65 61 66 45 6e 64 2c 20 26 61 4c 65 61 66 2c  LeafEnd, &aLeaf,
22ed0 20 26 6e 4c 65 61 66 2c 20 30 29 3b 0a 20 20 20   &nLeaf, 0);.   
22ee0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22ef0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
22f00 4e 6f 64 65 52 65 61 64 65 72 20 72 65 61 64 65  NodeReader reade
22f10 72 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 72  r;.        for(r
22f20 63 20 3d 20 6e 6f 64 65 52 65 61 64 65 72 49 6e  c = nodeReaderIn
22f30 69 74 28 26 72 65 61 64 65 72 2c 20 61 4c 65 61  it(&reader, aLea
22f40 66 2c 20 6e 4c 65 61 66 29 3b 0a 20 20 20 20 20  f, nLeaf);.     
22f50 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
22f60 45 5f 4f 4b 20 26 26 20 72 65 61 64 65 72 2e 61  E_OK && reader.a
22f70 4e 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Node;.          
22f80 20 20 72 63 20 3d 20 6e 6f 64 65 52 65 61 64 65    rc = nodeReade
22f90 72 4e 65 78 74 28 26 72 65 61 64 65 72 29 0a 20  rNext(&reader). 
22fa0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
22fb0 20 20 20 20 61 73 73 65 72 74 28 20 72 65 61 64      assert( read
22fc0 65 72 2e 61 4e 6f 64 65 20 29 3b 0a 20 20 20 20  er.aNode );.    
22fd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
22fe0 28 20 66 74 73 33 54 65 72 6d 43 6d 70 28 7a 4b  ( fts3TermCmp(zK
22ff0 65 79 2c 20 6e 4b 65 79 2c 20 72 65 61 64 65 72  ey, nKey, reader
23000 2e 74 65 72 6d 2e 61 2c 20 72 65 61 64 65 72 2e  .term.a, reader.
23010 74 65 72 6d 2e 6e 29 3c 3d 30 20 29 7b 0a 20 20  term.n)<=0 ){.  
23020 20 20 20 20 20 20 20 20 62 41 70 70 65 6e 64 61          bAppenda
23030 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ble = 0;.       
23040 20 7d 0a 20 20 20 20 20 20 20 20 6e 6f 64 65 52   }.        nodeR
23050 65 61 64 65 72 52 65 6c 65 61 73 65 28 26 72 65  eaderRelease(&re
23060 61 64 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ader);.      }. 
23070 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
23080 65 28 61 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a  e(aLeaf);.    }.
23090 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
230a0 49 54 45 5f 4f 4b 20 26 26 20 62 41 70 70 65 6e  ITE_OK && bAppen
230b0 64 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 2f  dable ){.      /
230c0 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  * It is possible
230d0 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 74 68   to append to th
230e0 69 73 20 73 65 67 6d 65 6e 74 2e 20 53 65 74 20  is segment. Set 
230f0 75 70 20 74 68 65 20 49 6e 63 72 6d 65 72 67 65  up the Incrmerge
23100 57 72 69 74 65 72 0a 20 20 20 20 20 20 2a 2a 20  Writer.      ** 
23110 6f 62 6a 65 63 74 20 74 6f 20 64 6f 20 73 6f 2e  object to do so.
23120 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69    */.      int i
23130 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 48 65 69  ;.      int nHei
23140 67 68 74 20 3d 20 28 69 6e 74 29 61 52 6f 6f 74  ght = (int)aRoot
23150 5b 30 5d 3b 0a 20 20 20 20 20 20 4e 6f 64 65 57  [0];.      NodeW
23160 72 69 74 65 72 20 2a 70 4e 6f 64 65 3b 0a 0a 20  riter *pNode;.. 
23170 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c       pWriter->nL
23180 65 61 66 45 73 74 20 3d 20 28 69 6e 74 29 28 28  eafEst = (int)((
23190 69 45 6e 64 20 2d 20 69 53 74 61 72 74 29 20 2b  iEnd - iStart) +
231a0 20 31 29 2f 46 54 53 5f 4d 41 58 5f 41 50 50 45   1)/FTS_MAX_APPE
231b0 4e 44 41 42 4c 45 5f 48 45 49 47 48 54 3b 0a 20  NDABLE_HEIGHT;. 
231c0 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 53       pWriter->iS
231d0 74 61 72 74 20 3d 20 69 53 74 61 72 74 3b 0a 20  tart = iStart;. 
231e0 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 45       pWriter->iE
231f0 6e 64 20 3d 20 69 45 6e 64 3b 0a 20 20 20 20 20  nd = iEnd;.     
23200 20 70 57 72 69 74 65 72 2d 3e 69 41 62 73 4c 65   pWriter->iAbsLe
23210 76 65 6c 20 3d 20 69 41 62 73 4c 65 76 65 6c 3b  vel = iAbsLevel;
23220 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e  .      pWriter->
23230 69 49 64 78 20 3d 20 69 49 64 78 3b 0a 0a 20 20  iIdx = iIdx;..  
23240 20 20 20 20 66 6f 72 28 69 3d 6e 48 65 69 67 68      for(i=nHeigh
23250 74 2b 31 3b 20 69 3c 46 54 53 5f 4d 41 58 5f 41  t+1; i<FTS_MAX_A
23260 50 50 45 4e 44 41 42 4c 45 5f 48 45 49 47 48 54  PPENDABLE_HEIGHT
23270 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
23280 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72  pWriter->aNodeWr
23290 69 74 65 72 5b 69 5d 2e 69 42 6c 6f 63 6b 20 3d  iter[i].iBlock =
232a0 20 70 57 72 69 74 65 72 2d 3e 69 53 74 61 72 74   pWriter->iStart
232b0 20 2b 20 69 2a 70 57 72 69 74 65 72 2d 3e 6e 4c   + i*pWriter->nL
232c0 65 61 66 45 73 74 3b 0a 20 20 20 20 20 20 7d 0a  eafEst;.      }.
232d0 0a 20 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 26  .      pNode = &
232e0 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72  pWriter->aNodeWr
232f0 69 74 65 72 5b 6e 48 65 69 67 68 74 5d 3b 0a 20  iter[nHeight];. 
23300 20 20 20 20 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f       pNode->iBlo
23310 63 6b 20 3d 20 70 57 72 69 74 65 72 2d 3e 69 53  ck = pWriter->iS
23320 74 61 72 74 20 2b 20 70 57 72 69 74 65 72 2d 3e  tart + pWriter->
23330 6e 4c 65 61 66 45 73 74 2a 6e 48 65 69 67 68 74  nLeafEst*nHeight
23340 3b 0a 20 20 20 20 20 20 62 6c 6f 62 47 72 6f 77  ;.      blobGrow
23350 42 75 66 66 65 72 28 26 70 4e 6f 64 65 2d 3e 62  Buffer(&pNode->b
23360 6c 6f 63 6b 2c 20 4d 41 58 28 6e 52 6f 6f 74 2c  lock, MAX(nRoot,
23370 20 70 2d 3e 6e 4e 6f 64 65 53 69 7a 65 29 2c 20   p->nNodeSize), 
23380 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &rc);.      if( 
23390 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
233a0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
233b0 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 2c 20  pNode->block.a, 
233c0 61 52 6f 6f 74 2c 20 6e 52 6f 6f 74 29 3b 0a 20  aRoot, nRoot);. 
233d0 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 62 6c         pNode->bl
233e0 6f 63 6b 2e 6e 20 3d 20 6e 52 6f 6f 74 3b 0a 20  ock.n = nRoot;. 
233f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f       }..      fo
23400 72 28 69 3d 6e 48 65 69 67 68 74 3b 20 69 3e 3d  r(i=nHeight; i>=
23410 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 && rc==SQLITE_
23420 4f 4b 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  OK; i--){.      
23430 20 20 4e 6f 64 65 52 65 61 64 65 72 20 72 65 61    NodeReader rea
23440 64 65 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f  der;.        pNo
23450 64 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  de = &pWriter->a
23460 4e 6f 64 65 57 72 69 74 65 72 5b 69 5d 3b 0a 0a  NodeWriter[i];..
23470 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 6f 64          rc = nod
23480 65 52 65 61 64 65 72 49 6e 69 74 28 26 72 65 61  eReaderInit(&rea
23490 64 65 72 2c 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63  der, pNode->bloc
234a0 6b 2e 61 2c 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63  k.a, pNode->bloc
234b0 6b 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 77 68  k.n);.        wh
234c0 69 6c 65 28 20 72 65 61 64 65 72 2e 61 4e 6f 64  ile( reader.aNod
234d0 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
234e0 4f 4b 20 29 20 72 63 20 3d 20 6e 6f 64 65 52 65  OK ) rc = nodeRe
234f0 61 64 65 72 4e 65 78 74 28 26 72 65 61 64 65 72  aderNext(&reader
23500 29 3b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 47  );.        blobG
23510 72 6f 77 42 75 66 66 65 72 28 26 70 4e 6f 64 65  rowBuffer(&pNode
23520 2d 3e 6b 65 79 2c 20 72 65 61 64 65 72 2e 74 65  ->key, reader.te
23530 72 6d 2e 6e 2c 20 26 72 63 29 3b 0a 20 20 20 20  rm.n, &rc);.    
23540 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
23550 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
23560 20 20 20 6d 65 6d 63 70 79 28 70 4e 6f 64 65 2d     memcpy(pNode-
23570 3e 6b 65 79 2e 61 2c 20 72 65 61 64 65 72 2e 74  >key.a, reader.t
23580 65 72 6d 2e 61 2c 20 72 65 61 64 65 72 2e 74 65  erm.a, reader.te
23590 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  rm.n);.         
235a0 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 20 3d 20   pNode->key.n = 
235b0 72 65 61 64 65 72 2e 74 65 72 6d 2e 6e 3b 0a 20  reader.term.n;. 
235c0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
235d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
235e0 63 68 61 72 20 2a 61 42 6c 6f 63 6b 20 3d 20 30  char *aBlock = 0
235f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
23600 74 20 6e 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20  t nBlock = 0;.  
23610 20 20 20 20 20 20 20 20 20 20 70 4e 6f 64 65 20            pNode 
23620 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64  = &pWriter->aNod
23630 65 57 72 69 74 65 72 5b 69 2d 31 5d 3b 0a 20 20  eWriter[i-1];.  
23640 20 20 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d            pNode-
23650 3e 69 42 6c 6f 63 6b 20 3d 20 72 65 61 64 65 72  >iBlock = reader
23660 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20 20 20 20  .iChild;.       
23670 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
23680 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28 70  3Fts3ReadBlock(p
23690 2c 20 72 65 61 64 65 72 2e 69 43 68 69 6c 64 2c  , reader.iChild,
236a0 20 26 61 42 6c 6f 63 6b 2c 20 26 6e 42 6c 6f 63   &aBlock, &nBloc
236b0 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  k, 0);.         
236c0 20 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65     blobGrowBuffe
236d0 72 28 26 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2c  r(&pNode->block,
236e0 20 4d 41 58 28 6e 42 6c 6f 63 6b 2c 20 70 2d 3e   MAX(nBlock, p->
236f0 6e 4e 6f 64 65 53 69 7a 65 29 2c 20 26 72 63 29  nNodeSize), &rc)
23700 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
23710 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
23730 20 6d 65 6d 63 70 79 28 70 4e 6f 64 65 2d 3e 62   memcpy(pNode->b
23740 6c 6f 63 6b 2e 61 2c 20 61 42 6c 6f 63 6b 2c 20  lock.a, aBlock, 
23750 6e 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20  nBlock);.       
23760 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 62 6c         pNode->bl
23770 6f 63 6b 2e 6e 20 3d 20 6e 42 6c 6f 63 6b 3b 0a  ock.n = nBlock;.
23780 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
23790 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
237a0 33 5f 66 72 65 65 28 61 42 6c 6f 63 6b 29 3b 0a  3_free(aBlock);.
237b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
237c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 6f      }.        no
237d0 64 65 52 65 61 64 65 72 52 65 6c 65 61 73 65 28  deReaderRelease(
237e0 26 72 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20  &reader);.      
237f0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 32  }.    }..    rc2
23800 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
23810 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69  (pSelect);.    i
23820 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23830 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d   ) rc = rc2;.  }
23840 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
23850 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
23860 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 73 65  e the largest se
23870 67 6d 65 6e 74 20 69 6e 64 65 78 20 76 61 6c 75  gment index valu
23880 65 20 74 68 61 74 20 65 78 69 73 74 73 20 77 69  e that exists wi
23890 74 68 69 6e 20 61 62 73 6f 6c 75 74 65 0a 2a 2a  thin absolute.**
238a0 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c   level iAbsLevel
238b0 2b 31 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  +1. If no error 
238c0 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 69 49  occurs, set *piI
238d0 64 78 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65  dx to this value
238e0 20 70 6c 75 73 0a 2a 2a 20 6f 6e 65 20 62 65 66   plus.** one bef
238f0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51  ore returning SQ
23900 4c 49 54 45 5f 4f 4b 2e 20 4f 72 2c 20 69 66 20  LITE_OK. Or, if 
23910 74 68 65 72 65 20 61 72 65 20 6e 6f 20 73 65 67  there are no seg
23920 6d 65 6e 74 73 20 61 74 20 61 6c 6c 20 0a 2a 2a  ments at all .**
23930 20 77 69 74 68 69 6e 20 6c 65 76 65 6c 20 69 41   within level iA
23940 62 73 4c 65 76 65 6c 2c 20 73 65 74 20 2a 70 69  bsLevel, set *pi
23950 49 64 78 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a  Idx to zero..**.
23960 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
23970 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e  ccurs, return an
23980 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
23990 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 20 76 61  de. The final va
239a0 6c 75 65 20 6f 66 0a 2a 2a 20 2a 70 69 49 64 78  lue of.** *piIdx
239b0 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e   is undefined in
239c0 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73   this case..*/.s
239d0 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e  tatic int fts3In
239e0 63 72 6d 65 72 67 65 4f 75 74 70 75 74 49 64 78  crmergeOutputIdx
239f0 28 20 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  ( .  Fts3Table *
23a00 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
23a10 20 20 20 20 20 2f 2a 20 46 54 53 20 54 61 62 6c       /* FTS Tabl
23a20 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71  e handle */.  sq
23a30 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 41 62 73  lite3_int64 iAbs
23a40 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 2f 2a  Level,        /*
23a50 20 41 62 73 6f 6c 75 74 65 20 69 6e 64 65 78 20   Absolute index 
23a60 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  of input segment
23a70 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 49 64  s */.  int *piId
23a80 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x               
23a90 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
23aa0 65 78 74 20 66 72 65 65 20 69 6e 64 65 78 20 61  ext free index a
23ab0 74 20 69 41 62 73 4c 65 76 65 6c 2b 31 20 2a 2f  t iAbsLevel+1 */
23ac0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
23ad0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 4f  sqlite3_stmt *pO
23ae0 75 74 70 75 74 49 64 78 20 3d 20 30 3b 20 20 20  utputIdx = 0;   
23af0 2f 2a 20 53 51 4c 20 75 73 65 64 20 74 6f 20 66  /* SQL used to f
23b00 69 6e 64 20 6f 75 74 70 75 74 20 69 6e 64 65 78  ind output index
23b10 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73 33   */..  rc = fts3
23b20 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 4e  SqlStmt(p, SQL_N
23b30 45 58 54 5f 53 45 47 4d 45 4e 54 5f 49 4e 44 45  EXT_SEGMENT_INDE
23b40 58 2c 20 26 70 4f 75 74 70 75 74 49 64 78 2c 20  X, &pOutputIdx, 
23b50 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
23b60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
23b70 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
23b80 34 28 70 4f 75 74 70 75 74 49 64 78 2c 20 31 2c  4(pOutputIdx, 1,
23b90 20 69 41 62 73 4c 65 76 65 6c 2b 31 29 3b 0a 20   iAbsLevel+1);. 
23ba0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
23bb0 70 4f 75 74 70 75 74 49 64 78 29 3b 0a 20 20 20  pOutputIdx);.   
23bc0 20 2a 70 69 49 64 78 20 3d 20 73 71 6c 69 74 65   *piIdx = sqlite
23bd0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 4f 75  3_column_int(pOu
23be0 74 70 75 74 49 64 78 2c 20 30 29 3b 0a 20 20 20  tputIdx, 0);.   
23bf0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
23c00 73 65 74 28 70 4f 75 74 70 75 74 49 64 78 29 3b  set(pOutputIdx);
23c10 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
23c20 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c  c;.}../* .** All
23c30 6f 63 61 74 65 20 61 6e 20 61 70 70 65 6e 64 61  ocate an appenda
23c40 62 6c 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65  ble output segme
23c50 6e 74 20 6f 6e 20 61 62 73 6f 6c 75 74 65 20 6c  nt on absolute l
23c60 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c 2b 31  evel iAbsLevel+1
23c70 0a 2a 2a 20 77 69 74 68 20 69 64 78 20 76 61 6c  .** with idx val
23c80 75 65 20 69 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49  ue iIdx..**.** I
23c90 6e 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74  n the %_segdir t
23ca0 61 62 6c 65 2c 20 61 20 73 65 67 6d 65 6e 74 20  able, a segment 
23cb0 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 74 68  is defined by th
23cc0 65 20 76 61 6c 75 65 73 20 69 6e 20 74 68 72 65  e values in thre
23cd0 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 3a 0a 2a 2a  e.** columns:.**
23ce0 0a 2a 2a 20 20 20 20 20 73 74 61 72 74 5f 62 6c  .**     start_bl
23cf0 6f 63 6b 0a 2a 2a 20 20 20 20 20 6c 65 61 76 65  ock.**     leave
23d00 73 5f 65 6e 64 5f 62 6c 6f 63 6b 0a 2a 2a 20 20  s_end_block.**  
23d10 20 20 20 65 6e 64 5f 62 6c 6f 63 6b 0a 2a 2a 0a     end_block.**.
23d20 2a 2a 20 57 68 65 6e 20 61 6e 20 61 70 70 65 6e  ** When an appen
23d30 64 61 62 6c 65 20 73 65 67 6d 65 6e 74 20 69 73  dable segment is
23d40 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69   allocated, it i
23d50 73 20 65 73 74 69 6d 61 74 65 64 20 74 68 61 74  s estimated that
23d60 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20   the.** maximum 
23d70 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 62  number of leaf b
23d80 6c 6f 63 6b 73 20 74 68 61 74 20 6d 61 79 20 62  locks that may b
23d90 65 20 72 65 71 75 69 72 65 64 20 69 73 20 74 68  e required is th
23da0 65 20 73 75 6d 20 6f 66 20 74 68 65 0a 2a 2a 20  e sum of the.** 
23db0 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 62  number of leaf b
23dc0 6c 6f 63 6b 73 20 63 6f 6e 73 75 6d 65 64 20 62  locks consumed b
23dd0 79 20 74 68 65 20 69 6e 70 75 74 20 73 65 67 6d  y the input segm
23de0 65 6e 74 73 2c 20 70 6c 75 73 20 74 68 65 20 6e  ents, plus the n
23df0 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 69 6e 70 75  umber.** of inpu
23e00 74 20 73 65 67 6d 65 6e 74 73 2c 20 6d 75 6c 74  t segments, mult
23e10 69 70 6c 69 65 64 20 62 79 20 74 77 6f 2e 20 54  iplied by two. T
23e20 68 69 73 20 76 61 6c 75 65 20 69 73 20 73 74 6f  his value is sto
23e30 72 65 64 20 69 6e 20 73 74 61 63 6b 20 0a 2a 2a  red in stack .**
23e40 20 76 61 72 69 61 62 6c 65 20 6e 4c 65 61 66 45   variable nLeafE
23e50 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61  st..**.** A tota
23e60 6c 20 6f 66 20 31 36 2a 6e 4c 65 61 66 45 73 74  l of 16*nLeafEst
23e70 20 62 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f   blocks are allo
23e80 63 61 74 65 64 20 77 68 65 6e 20 61 6e 20 61 70  cated when an ap
23e90 70 65 6e 64 61 62 6c 65 20 73 65 67 6d 65 6e 74  pendable segment
23ea0 0a 2a 2a 20 69 73 20 63 72 65 61 74 65 64 20 28  .** is created (
23eb0 28 31 20 2b 20 65 6e 64 5f 62 6c 6f 63 6b 20 2d  (1 + end_block -
23ec0 20 73 74 61 72 74 5f 62 6c 6f 63 6b 29 3d 3d 31   start_block)==1
23ed0 36 2a 6e 4c 65 61 66 45 73 74 29 2e 20 54 68 65  6*nLeafEst). The
23ee0 20 63 6f 6e 74 69 67 75 6f 75 73 0a 2a 2a 20 61   contiguous.** a
23ef0 72 72 61 79 20 6f 66 20 6c 65 61 66 20 6e 6f 64  rray of leaf nod
23f00 65 73 20 73 74 61 72 74 73 20 61 74 20 74 68 65  es starts at the
23f10 20 66 69 72 73 74 20 62 6c 6f 63 6b 20 61 6c 6c   first block all
23f20 6f 63 61 74 65 64 2e 20 54 68 65 20 61 72 72 61  ocated. The arra
23f30 79 0a 2a 2a 20 6f 66 20 69 6e 74 65 72 69 6f 72  y.** of interior
23f40 20 6e 6f 64 65 73 20 74 68 61 74 20 61 72 65 20   nodes that are 
23f50 70 61 72 65 6e 74 73 20 6f 66 20 74 68 65 20 6c  parents of the l
23f60 65 61 66 20 6e 6f 64 65 73 20 73 74 61 72 74 20  eaf nodes start 
23f70 61 74 20 62 6c 6f 63 6b 0a 2a 2a 20 28 73 74 61  at block.** (sta
23f80 72 74 5f 62 6c 6f 63 6b 20 2b 20 28 31 20 2b 20  rt_block + (1 + 
23f90 65 6e 64 5f 62 6c 6f 63 6b 20 2d 20 73 74 61 72  end_block - star
23fa0 74 5f 62 6c 6f 63 6b 29 20 2f 20 31 36 29 2e 20  t_block) / 16). 
23fb0 41 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 0a 2a 2a  And so on..**.**
23fc0 20 49 6e 20 74 68 65 20 61 63 74 75 61 6c 20 63   In the actual c
23fd0 6f 64 65 20 62 65 6c 6f 77 2c 20 74 68 65 20 76  ode below, the v
23fe0 61 6c 75 65 20 22 31 36 22 20 69 73 20 72 65 70  alue "16" is rep
23ff0 6c 61 63 65 64 20 77 69 74 68 20 74 68 65 20 0a  laced with the .
24000 2a 2a 20 70 72 65 2d 70 72 6f 63 65 73 73 6f 72  ** pre-processor
24010 20 6d 61 63 72 6f 20 46 54 53 5f 4d 41 58 5f 41   macro FTS_MAX_A
24020 50 50 45 4e 44 41 42 4c 45 5f 48 45 49 47 48 54  PPENDABLE_HEIGHT
24030 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24040 66 74 73 33 49 6e 63 72 6d 65 72 67 65 57 72 69  fts3IncrmergeWri
24050 74 65 72 28 20 0a 20 20 46 74 73 33 54 61 62 6c  ter( .  Fts3Tabl
24060 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
24070 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73 33 20          /* Fts3 
24080 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
24090 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
240a0 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 20 20  iAbsLevel,      
240b0 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65    /* Absolute le
240c0 76 65 6c 20 6f 66 20 69 6e 70 75 74 20 73 65 67  vel of input seg
240d0 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ments */.  int i
240e0 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
240f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
24100 64 65 78 20 6f 66 20 6e 65 77 20 6f 75 74 70 75  dex of new outpu
24110 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46  t segment */.  F
24120 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
24130 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 2f  r *pCsr,       /
24140 2a 20 43 75 72 73 6f 72 20 74 68 61 74 20 64 61  * Cursor that da
24150 74 61 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20  ta will be read 
24160 66 72 6f 6d 20 2a 2f 0a 20 20 49 6e 63 72 6d 65  from */.  Incrme
24170 72 67 65 57 72 69 74 65 72 20 2a 70 57 72 69 74  rgeWriter *pWrit
24180 65 72 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 70  er        /* Pop
24190 75 6c 61 74 65 20 74 68 69 73 20 6f 62 6a 65 63  ulate this objec
241a0 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
241b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
241c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
241d0 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn Code */.  in
241e0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
241f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24200 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
24210 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61  le */.  int nLea
24220 66 45 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  fEst = 0;       
24230 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b          /* Block
24240 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
24250 6c 65 61 66 20 6e 6f 64 65 73 20 2a 2f 0a 20 20  leaf nodes */.  
24260 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 4c  sqlite3_stmt *pL
24270 65 61 66 45 73 74 20 3d 20 30 3b 20 20 20 20 20  eafEst = 0;     
24280 2f 2a 20 53 51 4c 20 75 73 65 64 20 74 6f 20 64  /* SQL used to d
24290 65 74 65 72 6d 69 6e 65 20 6e 4c 65 61 66 45 73  etermine nLeafEs
242a0 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  t */.  sqlite3_s
242b0 74 6d 74 20 2a 70 46 69 72 73 74 42 6c 6f 63 6b  tmt *pFirstBlock
242c0 20 3d 20 30 3b 20 20 2f 2a 20 53 51 4c 20 75 73   = 0;  /* SQL us
242d0 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
242e0 66 69 72 73 74 20 62 6c 6f 63 6b 20 2a 2f 0a 0a  first block */..
242f0 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 6e    /* Calculate n
24300 4c 65 61 66 45 73 74 2e 20 2a 2f 0a 20 20 72 63  LeafEst. */.  rc
24310 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
24320 2c 20 53 51 4c 5f 4d 41 58 5f 4c 45 41 46 5f 4e  , SQL_MAX_LEAF_N
24330 4f 44 45 5f 45 53 54 49 4d 41 54 45 2c 20 26 70  ODE_ESTIMATE, &p
24340 4c 65 61 66 45 73 74 2c 20 30 29 3b 0a 20 20 69  LeafEst, 0);.  i
24350 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24360 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
24370 62 69 6e 64 5f 69 6e 74 36 34 28 70 4c 65 61 66  bind_int64(pLeaf
24380 45 73 74 2c 20 31 2c 20 69 41 62 73 4c 65 76 65  Est, 1, iAbsLeve
24390 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
243a0 62 69 6e 64 5f 69 6e 74 36 34 28 70 4c 65 61 66  bind_int64(pLeaf
243b0 45 73 74 2c 20 32 2c 20 70 43 73 72 2d 3e 6e 53  Est, 2, pCsr->nS
243c0 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 69 66 28  egment);.    if(
243d0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
243e0 69 74 65 33 5f 73 74 65 70 28 70 4c 65 61 66 45  ite3_step(pLeafE
243f0 73 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 4c 65  st) ){.      nLe
24400 61 66 45 73 74 20 3d 20 73 71 6c 69 74 65 33 5f  afEst = sqlite3_
24410 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 4c 65 61 66  column_int(pLeaf
24420 45 73 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  Est, 0);.    }. 
24430 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
24440 72 65 73 65 74 28 70 4c 65 61 66 45 73 74 29 3b  reset(pLeafEst);
24450 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
24460 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
24470 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63  n rc;..  /* Calc
24480 75 6c 61 74 65 20 74 68 65 20 66 69 72 73 74 20  ulate the first 
24490 62 6c 6f 63 6b 20 74 6f 20 75 73 65 20 69 6e 20  block to use in 
244a0 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65  the output segme
244b0 6e 74 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73  nt */.  rc = fts
244c0 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
244d0 4e 45 58 54 5f 53 45 47 4d 45 4e 54 53 5f 49 44  NEXT_SEGMENTS_ID
244e0 2c 20 26 70 46 69 72 73 74 42 6c 6f 63 6b 2c 20  , &pFirstBlock, 
244f0 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
24500 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
24510 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
24520 71 6c 69 74 65 33 5f 73 74 65 70 28 70 46 69 72  qlite3_step(pFir
24530 73 74 42 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20  stBlock) ){.    
24540 20 20 70 57 72 69 74 65 72 2d 3e 69 53 74 61 72    pWriter->iStar
24550 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  t = sqlite3_colu
24560 6d 6e 5f 69 6e 74 36 34 28 70 46 69 72 73 74 42  mn_int64(pFirstB
24570 6c 6f 63 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  lock, 0);.      
24580 70 57 72 69 74 65 72 2d 3e 69 45 6e 64 20 3d 20  pWriter->iEnd = 
24590 70 57 72 69 74 65 72 2d 3e 69 53 74 61 72 74 20  pWriter->iStart 
245a0 2d 20 31 3b 0a 20 20 20 20 20 20 70 57 72 69 74  - 1;.      pWrit
245b0 65 72 2d 3e 69 45 6e 64 20 2b 3d 20 6e 4c 65 61  er->iEnd += nLea
245c0 66 45 73 74 20 2a 20 46 54 53 5f 4d 41 58 5f 41  fEst * FTS_MAX_A
245d0 50 50 45 4e 44 41 42 4c 45 5f 48 45 49 47 48 54  PPENDABLE_HEIGHT
245e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
245f0 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
24600 46 69 72 73 74 42 6c 6f 63 6b 29 3b 0a 20 20 7d  FirstBlock);.  }
24610 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
24620 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
24630 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74  ;..  /* Insert t
24640 68 65 20 6d 61 72 6b 65 72 20 69 6e 20 74 68 65  he marker in the
24650 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c   %_segments tabl
24660 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 6e  e to make sure n
24670 6f 62 6f 64 79 20 74 72 69 65 73 0a 20 20 2a 2a  obody tries.  **
24680 20 74 6f 20 73 74 65 61 6c 20 74 68 65 20 73 70   to steal the sp
24690 61 63 65 20 6a 75 73 74 20 61 6c 6c 6f 63 61 74  ace just allocat
246a0 65 64 2e 20 54 68 69 73 20 69 73 20 61 6c 73 6f  ed. This is also
246b0 20 75 73 65 64 20 74 6f 20 69 64 65 6e 74 69 66   used to identif
246c0 79 20 0a 20 20 2a 2a 20 61 70 70 65 6e 64 61 62  y .  ** appendab
246d0 6c 65 20 73 65 67 6d 65 6e 74 73 2e 20 20 2a 2f  le segments.  */
246e0 0a 20 20 72 63 20 3d 20 66 74 73 33 57 72 69 74  .  rc = fts3Writ
246f0 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 57 72 69  eSegment(p, pWri
24700 74 65 72 2d 3e 69 45 6e 64 2c 20 30 2c 20 30 29  ter->iEnd, 0, 0)
24710 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
24720 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
24730 63 3b 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e 69  c;..  pWriter->i
24740 41 62 73 4c 65 76 65 6c 20 3d 20 69 41 62 73 4c  AbsLevel = iAbsL
24750 65 76 65 6c 3b 0a 20 20 70 57 72 69 74 65 72 2d  evel;.  pWriter-
24760 3e 6e 4c 65 61 66 45 73 74 20 3d 20 6e 4c 65 61  >nLeafEst = nLea
24770 66 45 73 74 3b 0a 20 20 70 57 72 69 74 65 72 2d  fEst;.  pWriter-
24780 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a 0a 20  >iIdx = iIdx;.. 
24790 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 61   /* Set up the a
247a0 72 72 61 79 20 6f 66 20 4e 6f 64 65 57 72 69 74  rray of NodeWrit
247b0 65 72 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  er objects */.  
247c0 66 6f 72 28 69 3d 30 3b 20 69 3c 46 54 53 5f 4d  for(i=0; i<FTS_M
247d0 41 58 5f 41 50 50 45 4e 44 41 42 4c 45 5f 48 45  AX_APPENDABLE_HE
247e0 49 47 48 54 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  IGHT; i++){.    
247f0 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72  pWriter->aNodeWr
24800 69 74 65 72 5b 69 5d 2e 69 42 6c 6f 63 6b 20 3d  iter[i].iBlock =
24810 20 70 57 72 69 74 65 72 2d 3e 69 53 74 61 72 74   pWriter->iStart
24820 20 2b 20 69 2a 70 57 72 69 74 65 72 2d 3e 6e 4c   + i*pWriter->nL
24830 65 61 66 45 73 74 3b 0a 20 20 7d 0a 20 20 72 65  eafEst;.  }.  re
24840 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24850 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
24860 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  an entry from th
24870 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65  e %_segdir table
24880 2e 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20  . This involves 
24890 72 75 6e 6e 69 6e 67 20 74 68 65 20 0a 2a 2a 20  running the .** 
248a0 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 73 74  following two st
248b0 61 74 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20  atements:.**.** 
248c0 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f    DELETE FROM %_
248d0 73 65 67 64 69 72 20 57 48 45 52 45 20 6c 65 76  segdir WHERE lev
248e0 65 6c 20 3d 20 3a 69 41 62 73 4c 65 76 65 6c 20  el = :iAbsLevel 
248f0 41 4e 44 20 69 64 78 20 3d 20 3a 69 49 64 78 0a  AND idx = :iIdx.
24900 2a 2a 20 20 20 55 50 44 41 54 45 20 25 5f 73 65  **   UPDATE %_se
24910 67 64 69 72 20 53 45 54 20 69 64 78 20 3d 20 69  gdir SET idx = i
24920 64 78 20 2d 20 31 20 57 48 45 52 45 20 6c 65 76  dx - 1 WHERE lev
24930 65 6c 20 3d 20 3a 69 41 62 73 4c 65 76 65 6c 20  el = :iAbsLevel 
24940 41 4e 44 20 69 64 78 20 3e 20 3a 69 49 64 78 0a  AND idx > :iIdx.
24950 2a 2a 0a 2a 2a 20 54 68 65 20 44 45 4c 45 54 45  **.** The DELETE
24960 20 73 74 61 74 65 6d 65 6e 74 20 72 65 6d 6f 76   statement remov
24970 65 73 20 74 68 65 20 73 70 65 63 69 66 69 63 20  es the specific 
24980 25 5f 73 65 67 64 69 72 20 6c 65 76 65 6c 2e 20  %_segdir level. 
24990 54 68 65 20 55 50 44 41 54 45 20 0a 2a 2a 20 73  The UPDATE .** s
249a0 74 61 74 65 6d 65 6e 74 20 65 6e 73 75 72 65 73  tatement ensures
249b0 20 74 68 61 74 20 74 68 65 20 72 65 6d 61 69 6e   that the remain
249c0 69 6e 67 20 73 65 67 6d 65 6e 74 73 20 68 61 76  ing segments hav
249d0 65 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 61  e contiguously a
249e0 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 69 64 78 20  llocated.** idx 
249f0 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  values..*/.stati
24a00 63 20 69 6e 74 20 66 74 73 33 52 65 6d 6f 76 65  c int fts3Remove
24a10 53 65 67 64 69 72 45 6e 74 72 79 28 0a 20 20 46  SegdirEntry(.  F
24a20 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20  ts3Table *p,    
24a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24a40 2a 20 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e  * FTS3 table han
24a50 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dle */.  sqlite3
24a60 5f 69 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c  _int64 iAbsLevel
24a70 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f  ,        /* Abso
24a80 6c 75 74 65 20 6c 65 76 65 6c 20 74 6f 20 64 65  lute level to de
24a90 6c 65 74 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  lete from */.  i
24aa0 6e 74 20 69 49 64 78 20 20 20 20 20 20 20 20 20  nt iIdx         
24ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24ac0 2a 20 49 6e 64 65 78 20 6f 66 20 25 5f 73 65 67  * Index of %_seg
24ad0 64 69 72 20 65 6e 74 72 79 20 74 6f 20 64 65 6c  dir entry to del
24ae0 65 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ete */.){.  int 
24af0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
24b00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
24b10 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
24b20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44  sqlite3_stmt *pD
24b30 65 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20  elete = 0;      
24b40 2f 2a 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  /* DELETE statem
24b50 65 6e 74 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66  ent */..  rc = f
24b60 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51  ts3SqlStmt(p, SQ
24b70 4c 5f 44 45 4c 45 54 45 5f 53 45 47 44 49 52 5f  L_DELETE_SEGDIR_
24b80 45 4e 54 52 59 2c 20 26 70 44 65 6c 65 74 65 2c  ENTRY, &pDelete,
24b90 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
24ba0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24bb0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
24bc0 36 34 28 70 44 65 6c 65 74 65 2c 20 31 2c 20 69  64(pDelete, 1, i
24bd0 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20 73  AbsLevel);.    s
24be0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
24bf0 70 44 65 6c 65 74 65 2c 20 32 2c 20 69 49 64 78  pDelete, 2, iIdx
24c00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
24c10 74 65 70 28 70 44 65 6c 65 74 65 29 3b 0a 20 20  tep(pDelete);.  
24c20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72    rc = sqlite3_r
24c30 65 73 65 74 28 70 44 65 6c 65 74 65 29 3b 0a 20  eset(pDelete);. 
24c40 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
24c50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65 20 6f 72  .}../*.** One or
24c60 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 20 68   more segments h
24c70 61 76 65 20 6a 75 73 74 20 62 65 65 6e 20 72 65  ave just been re
24c80 6d 6f 76 65 64 20 66 72 6f 6d 20 61 62 73 6f 6c  moved from absol
24c90 75 74 65 20 6c 65 76 65 6c 20 69 41 62 73 4c 65  ute level iAbsLe
24ca0 76 65 6c 2e 0a 2a 2a 20 55 70 64 61 74 65 20 74  vel..** Update t
24cb0 68 65 20 27 69 64 78 27 20 76 61 6c 75 65 73 20  he 'idx' values 
24cc0 6f 66 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67  of the remaining
24cd0 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 65   segments in the
24ce0 20 6c 65 76 65 6c 20 73 6f 20 74 68 61 74 0a 2a   level so that.*
24cf0 2a 20 74 68 65 20 69 64 78 20 76 61 6c 75 65 73  * the idx values
24d00 20 61 72 65 20 61 20 63 6f 6e 74 69 67 75 6f 75   are a contiguou
24d10 73 20 73 65 71 75 65 6e 63 65 20 73 74 61 72 74  s sequence start
24d20 69 6e 67 20 66 72 6f 6d 20 30 2e 0a 2a 2f 0a 73  ing from 0..*/.s
24d30 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 52 65  tatic int fts3Re
24d40 70 61 63 6b 53 65 67 64 69 72 4c 65 76 65 6c 28  packSegdirLevel(
24d50 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
24d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d70 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65     /* FTS3 table
24d80 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c   handle */.  sql
24d90 69 74 65 33 5f 69 6e 74 36 34 20 69 41 62 73 4c  ite3_int64 iAbsL
24da0 65 76 65 6c 20 20 20 20 20 20 20 20 20 2f 2a 20  evel         /* 
24db0 41 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 74  Absolute level t
24dc0 6f 20 72 65 70 61 63 6b 20 2a 2f 0a 29 7b 0a 20  o repack */.){. 
24dd0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
24de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24df0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
24e00 2a 2f 0a 20 20 69 6e 74 20 2a 61 49 64 78 20 3d  */.  int *aIdx =
24e10 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
24e20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
24e30 20 72 65 6d 61 69 6e 69 6e 67 20 69 64 78 20 76   remaining idx v
24e40 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  alues */.  int n
24e50 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Idx = 0;        
24e60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
24e70 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61  lid entries in a
24e80 49 64 78 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  Idx[] */.  int n
24e90 41 6c 6c 6f 63 20 3d 20 30 3b 20 20 20 20 20 20  Alloc = 0;      
24ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
24eb0 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
24ec0 61 49 64 78 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  aIdx[] */.  int 
24ed0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
24ee0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
24ef0 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
24f00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
24f10 6d 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 30 3b  mt *pSelect = 0;
24f20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20        /* Select 
24f30 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 65 61  statement to rea
24f40 64 20 69 64 78 20 76 61 6c 75 65 73 20 2a 2f 0a  d idx values */.
24f50 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
24f60 70 55 70 64 61 74 65 20 3d 20 30 3b 20 20 20 20  pUpdate = 0;    
24f70 20 20 2f 2a 20 55 70 64 61 74 65 20 73 74 61 74    /* Update stat
24f80 65 6d 65 6e 74 20 74 6f 20 6d 6f 64 69 66 79 20  ement to modify 
24f90 69 64 78 20 76 61 6c 75 65 73 20 2a 2f 0a 0a 20  idx values */.. 
24fa0 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d   rc = fts3SqlStm
24fb0 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f  t(p, SQL_SELECT_
24fc0 49 4e 44 45 58 45 53 2c 20 26 70 53 65 6c 65 63  INDEXES, &pSelec
24fd0 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  t, 0);.  if( rc=
24fe0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24ff0 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 73    int rc2;.    s
25000 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
25010 34 28 70 53 65 6c 65 63 74 2c 20 31 2c 20 69 41  4(pSelect, 1, iA
25020 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20 77 68  bsLevel);.    wh
25030 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d  ile( SQLITE_ROW=
25040 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
25050 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
25060 69 66 28 20 6e 49 64 78 3e 3d 6e 41 6c 6c 6f 63  if( nIdx>=nAlloc
25070 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
25080 2a 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 6e  *aNew;.        n
25090 41 6c 6c 6f 63 20 2b 3d 20 31 36 3b 0a 20 20 20  Alloc += 16;.   
250a0 20 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69       aNew = sqli
250b0 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61 49 64 78  te3_realloc(aIdx
250c0 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28  , nAlloc*sizeof(
250d0 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 20 20 69  int));.        i
250e0 66 28 20 21 61 4e 65 77 20 29 7b 0a 20 20 20 20  f( !aNew ){.    
250f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25100 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
25110 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
25120 20 20 7d 0a 20 20 20 20 20 20 20 20 61 49 64 78    }.        aIdx
25130 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 7d   = aNew;.      }
25140 0a 20 20 20 20 20 20 61 49 64 78 5b 6e 49 64 78  .      aIdx[nIdx
25150 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ++] = sqlite3_co
25160 6c 75 6d 6e 5f 69 6e 74 28 70 53 65 6c 65 63 74  lumn_int(pSelect
25170 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
25180 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  rc2 = sqlite3_re
25190 73 65 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  set(pSelect);.  
251a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
251b0 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
251c0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
251d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
251e0 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74  rc = fts3SqlStmt
251f0 28 70 2c 20 53 51 4c 5f 53 48 49 46 54 5f 53 45  (p, SQL_SHIFT_SE
25200 47 44 49 52 5f 45 4e 54 52 59 2c 20 26 70 55 70  GDIR_ENTRY, &pUp
25210 64 61 74 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  date, 0);.  }.  
25220 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25230 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
25240 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 55 70 64  _bind_int64(pUpd
25250 61 74 65 2c 20 32 2c 20 69 41 62 73 4c 65 76 65  ate, 2, iAbsLeve
25260 6c 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  l);.  }..  asser
25270 74 28 20 70 2d 3e 62 49 67 6e 6f 72 65 53 61 76  t( p->bIgnoreSav
25280 65 70 6f 69 6e 74 3d 3d 30 20 29 3b 0a 20 20 70  epoint==0 );.  p
25290 2d 3e 62 49 67 6e 6f 72 65 53 61 76 65 70 6f 69  ->bIgnoreSavepoi
252a0 6e 74 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d  nt = 1;.  for(i=
252b0 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
252c0 20 26 26 20 69 3c 6e 49 64 78 3b 20 69 2b 2b 29   && i<nIdx; i++)
252d0 7b 0a 20 20 20 20 69 66 28 20 61 49 64 78 5b 69  {.    if( aIdx[i
252e0 5d 21 3d 69 20 29 7b 0a 20 20 20 20 20 20 73 71  ]!=i ){.      sq
252f0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
25300 55 70 64 61 74 65 2c 20 33 2c 20 61 49 64 78 5b  Update, 3, aIdx[
25310 69 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  i]);.      sqlit
25320 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 55 70 64  e3_bind_int(pUpd
25330 61 74 65 2c 20 31 2c 20 69 29 3b 0a 20 20 20 20  ate, 1, i);.    
25340 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
25350 55 70 64 61 74 65 29 3b 0a 20 20 20 20 20 20 72  Update);.      r
25360 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
25370 74 28 70 55 70 64 61 74 65 29 3b 0a 20 20 20 20  t(pUpdate);.    
25380 7d 0a 20 20 7d 0a 20 20 70 2d 3e 62 49 67 6e 6f  }.  }.  p->bIgno
25390 72 65 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  reSavepoint = 0;
253a0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
253b0 28 61 49 64 78 29 3b 0a 20 20 72 65 74 75 72 6e  (aIdx);.  return
253c0 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76   rc;.}..static v
253d0 6f 69 64 20 66 74 73 33 53 74 61 72 74 4e 6f 64  oid fts3StartNod
253e0 65 28 42 6c 6f 62 20 2a 70 4e 6f 64 65 2c 20 69  e(Blob *pNode, i
253f0 6e 74 20 69 48 65 69 67 68 74 2c 20 73 71 6c 69  nt iHeight, sqli
25400 74 65 33 5f 69 6e 74 36 34 20 69 43 68 69 6c 64  te3_int64 iChild
25410 29 7b 0a 20 20 70 4e 6f 64 65 2d 3e 61 5b 30 5d  ){.  pNode->a[0]
25420 20 3d 20 28 63 68 61 72 29 69 48 65 69 67 68 74   = (char)iHeight
25430 3b 0a 20 20 69 66 28 20 69 43 68 69 6c 64 20 29  ;.  if( iChild )
25440 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
25450 6f 64 65 2d 3e 6e 41 6c 6c 6f 63 3e 3d 31 2b 73  ode->nAlloc>=1+s
25460 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e 74  qlite3Fts3Varint
25470 4c 65 6e 28 69 43 68 69 6c 64 29 20 29 3b 0a 20  Len(iChild) );. 
25480 20 20 20 70 4e 6f 64 65 2d 3e 6e 20 3d 20 31 20     pNode->n = 1 
25490 2b 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74  + sqlite3Fts3Put
254a0 56 61 72 69 6e 74 28 26 70 4e 6f 64 65 2d 3e 61  Varint(&pNode->a
254b0 5b 31 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20  [1], iChild);.  
254c0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
254d0 74 28 20 70 4e 6f 64 65 2d 3e 6e 41 6c 6c 6f 63  t( pNode->nAlloc
254e0 3e 3d 31 20 29 3b 0a 20 20 20 20 70 4e 6f 64 65  >=1 );.    pNode
254f0 2d 3e 6e 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  ->n = 1;.  }.}..
25500 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
25510 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 61 72  two arguments ar
25520 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
25530 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  nd the size of a
25540 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 0a   segment b-tree.
25550 2a 2a 20 6e 6f 64 65 2e 20 54 68 65 20 6e 6f 64  ** node. The nod
25560 65 20 6d 61 79 20 62 65 20 61 20 6c 65 61 66 20  e may be a leaf 
25570 6f 72 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e  or an internal n
25580 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ode..**.** This 
25590 66 75 6e 63 74 69 6f 6e 20 63 72 65 61 74 65 73  function creates
255a0 20 61 20 6e 65 77 20 6e 6f 64 65 20 69 6d 61 67   a new node imag
255b0 65 20 69 6e 20 62 6c 6f 62 20 6f 62 6a 65 63 74  e in blob object
255c0 20 2a 70 4e 65 77 20 62 79 20 63 6f 70 79 69 6e   *pNew by copyin
255d0 67 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20 74  g.** all terms t
255e0 68 61 74 20 61 72 65 20 67 72 65 61 74 65 72 20  hat are greater 
255f0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
25600 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 20 28 66 6f   zTerm/nTerm (fo
25610 72 20 6c 65 61 66 20 6e 6f 64 65 73 29 0a 2a 2a  r leaf nodes).**
25620 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
25630 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 20 28 66 6f   zTerm/nTerm (fo
25640 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73  r internal nodes
25650 29 20 66 72 6f 6d 20 61 4e 6f 64 65 2f 6e 4e 6f  ) from aNode/nNo
25660 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
25670 74 20 66 74 73 33 54 72 75 6e 63 61 74 65 4e 6f  t fts3TruncateNo
25680 64 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  de(.  const char
25690 20 2a 61 4e 6f 64 65 2c 20 20 20 20 20 20 20 20   *aNode,        
256a0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
256b0 20 6e 6f 64 65 20 69 6d 61 67 65 20 2a 2f 0a 20   node image */. 
256c0 20 69 6e 74 20 6e 4e 6f 64 65 2c 20 20 20 20 20   int nNode,     
256d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256e0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 4e 6f 64   /* Size of aNod
256f0 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
25700 42 6c 6f 62 20 2a 70 4e 65 77 2c 20 20 20 20 20  Blob *pNew,     
25710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25720 2f 2a 20 4f 55 54 3a 20 57 72 69 74 65 20 6e 65  /* OUT: Write ne
25730 77 20 6e 6f 64 65 20 69 6d 61 67 65 20 68 65 72  w node image her
25740 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
25750 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20  r *zTerm,       
25760 20 20 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 61         /* Omit a
25770 6c 6c 20 74 65 72 6d 73 20 73 6d 61 6c 6c 65 72  ll terms smaller
25780 20 74 68 61 6e 20 74 68 69 73 20 2a 2f 0a 20 20   than this */.  
25790 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 20  int nTerm,      
257a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257b0 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65 72 6d  /* Size of zTerm
257c0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 73   in bytes */.  s
257d0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
257e0 42 6c 6f 63 6b 20 20 20 20 20 20 20 20 20 20 2f  Block          /
257f0 2a 20 4f 55 54 3a 20 42 6c 6f 63 6b 20 6e 75 6d  * OUT: Block num
25800 62 65 72 20 69 6e 20 6e 65 78 74 20 6c 61 79 65  ber in next laye
25810 72 20 64 6f 77 6e 20 2a 2f 0a 29 7b 0a 20 20 4e  r down */.){.  N
25820 6f 64 65 52 65 61 64 65 72 20 72 65 61 64 65 72  odeReader reader
25830 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
25840 2a 20 52 65 61 64 65 72 20 6f 62 6a 65 63 74 20  * Reader object 
25850 2a 2f 0a 20 20 42 6c 6f 62 20 70 72 65 76 20 3d  */.  Blob prev =
25860 20 7b 30 2c 20 30 2c 20 30 7d 3b 20 20 20 20 20   {0, 0, 0};     
25870 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
25880 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20 74 6f   term written to
25890 20 6e 65 77 20 6e 6f 64 65 20 2a 2f 0a 20 20 69   new node */.  i
258a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
258b0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
258c0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
258d0 0a 20 20 69 6e 74 20 62 4c 65 61 66 20 3d 20 61  .  int bLeaf = a
258e0 4e 6f 64 65 5b 30 5d 3d 3d 27 5c 30 27 3b 20 20  Node[0]=='\0';  
258f0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
25900 20 6c 65 61 66 20 6e 6f 64 65 20 2a 2f 0a 0a 20   leaf node */.. 
25910 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65 71   /* Allocate req
25920 75 69 72 65 64 20 6f 75 74 70 75 74 20 73 70 61  uired output spa
25930 63 65 20 2a 2f 0a 20 20 62 6c 6f 62 47 72 6f 77  ce */.  blobGrow
25940 42 75 66 66 65 72 28 70 4e 65 77 2c 20 6e 4e 6f  Buffer(pNew, nNo
25950 64 65 2c 20 26 72 63 29 3b 0a 20 20 69 66 28 20  de, &rc);.  if( 
25960 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
25970 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 4e 65  return rc;.  pNe
25980 77 2d 3e 6e 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  w->n = 0;..  /* 
25990 50 6f 70 75 6c 61 74 65 20 6e 65 77 20 6e 6f 64  Populate new nod
259a0 65 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 66 6f  e buffer */.  fo
259b0 72 28 72 63 20 3d 20 6e 6f 64 65 52 65 61 64 65  r(rc = nodeReade
259c0 72 49 6e 69 74 28 26 72 65 61 64 65 72 2c 20 61  rInit(&reader, a
259d0 4e 6f 64 65 2c 20 6e 4e 6f 64 65 29 3b 20 0a 20  Node, nNode); . 
259e0 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
259f0 4f 4b 20 26 26 20 72 65 61 64 65 72 2e 61 4e 6f  OK && reader.aNo
25a00 64 65 3b 20 0a 20 20 20 20 20 20 72 63 20 3d 20  de; .      rc = 
25a10 6e 6f 64 65 52 65 61 64 65 72 4e 65 78 74 28 26  nodeReaderNext(&
25a20 72 65 61 64 65 72 29 0a 20 20 29 7b 0a 20 20 20  reader).  ){.   
25a30 20 69 66 28 20 70 4e 65 77 2d 3e 6e 3d 3d 30 20   if( pNew->n==0 
25a40 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73  ){.      int res
25a50 20 3d 20 66 74 73 33 54 65 72 6d 43 6d 70 28 72   = fts3TermCmp(r
25a60 65 61 64 65 72 2e 74 65 72 6d 2e 61 2c 20 72 65  eader.term.a, re
25a70 61 64 65 72 2e 74 65 72 6d 2e 6e 2c 20 7a 54 65  ader.term.n, zTe
25a80 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20  rm, nTerm);.    
25a90 20 20 69 66 28 20 72 65 73 3c 30 20 7c 7c 20 28    if( res<0 || (
25aa0 62 4c 65 61 66 3d 3d 30 20 26 26 20 72 65 73 3d  bLeaf==0 && res=
25ab0 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  =0) ) continue;.
25ac0 20 20 20 20 20 20 66 74 73 33 53 74 61 72 74 4e        fts3StartN
25ad0 6f 64 65 28 70 4e 65 77 2c 20 28 69 6e 74 29 61  ode(pNew, (int)a
25ae0 4e 6f 64 65 5b 30 5d 2c 20 72 65 61 64 65 72 2e  Node[0], reader.
25af0 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 2a  iChild);.      *
25b00 70 69 42 6c 6f 63 6b 20 3d 20 72 65 61 64 65 72  piBlock = reader
25b10 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20 7d 0a 20  .iChild;.    }. 
25b20 20 20 20 72 63 20 3d 20 66 74 73 33 41 70 70 65     rc = fts3Appe
25b30 6e 64 54 6f 4e 6f 64 65 28 0a 20 20 20 20 20 20  ndToNode(.      
25b40 20 20 70 4e 65 77 2c 20 26 70 72 65 76 2c 20 72    pNew, &prev, r
25b50 65 61 64 65 72 2e 74 65 72 6d 2e 61 2c 20 72 65  eader.term.a, re
25b60 61 64 65 72 2e 74 65 72 6d 2e 6e 2c 0a 20 20 20  ader.term.n,.   
25b70 20 20 20 20 20 72 65 61 64 65 72 2e 61 44 6f 63       reader.aDoc
25b80 6c 69 73 74 2c 20 72 65 61 64 65 72 2e 6e 44 6f  list, reader.nDo
25b90 63 6c 69 73 74 0a 20 20 20 20 29 3b 0a 20 20 20  clist.    );.   
25ba0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
25bb0 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  OK ) break;.  }.
25bc0 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 3d 3d 30    if( pNew->n==0
25bd0 20 29 7b 0a 20 20 20 20 66 74 73 33 53 74 61 72   ){.    fts3Star
25be0 74 4e 6f 64 65 28 70 4e 65 77 2c 20 28 69 6e 74  tNode(pNew, (int
25bf0 29 61 4e 6f 64 65 5b 30 5d 2c 20 72 65 61 64 65  )aNode[0], reade
25c00 72 2e 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 2a  r.iChild);.    *
25c10 70 69 42 6c 6f 63 6b 20 3d 20 72 65 61 64 65 72  piBlock = reader
25c20 2e 69 43 68 69 6c 64 3b 0a 20 20 7d 0a 20 20 61  .iChild;.  }.  a
25c30 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 3c 3d  ssert( pNew->n<=
25c40 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a  pNew->nAlloc );.
25c50 0a 20 20 6e 6f 64 65 52 65 61 64 65 72 52 65 6c  .  nodeReaderRel
25c60 65 61 73 65 28 26 72 65 61 64 65 72 29 3b 0a 20  ease(&reader);. 
25c70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 72   sqlite3_free(pr
25c80 65 76 2e 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  ev.a);.  return 
25c90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  rc;.}../*.** Rem
25ca0 6f 76 65 20 61 6c 6c 20 74 65 72 6d 73 20 73 6d  ove all terms sm
25cb0 61 6c 6c 65 72 20 74 68 61 6e 20 7a 54 65 72 6d  aller than zTerm
25cc0 2f 6e 54 65 72 6d 20 66 72 6f 6d 20 73 65 67 6d  /nTerm from segm
25cd0 65 6e 74 20 69 49 64 78 20 69 6e 20 61 62 73 6f  ent iIdx in abso
25ce0 6c 75 74 65 20 0a 2a 2a 20 6c 65 76 65 6c 20 69  lute .** level i
25cf0 41 62 73 4c 65 76 65 6c 2e 20 54 68 69 73 20 6d  AbsLevel. This m
25d00 61 79 20 69 6e 76 6f 6c 76 65 20 64 65 6c 65 74  ay involve delet
25d10 69 6e 67 20 65 6e 74 72 69 65 73 20 66 72 6f 6d  ing entries from
25d20 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 0a   the %_segments.
25d30 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20 6d 6f  ** table, and mo
25d40 64 69 66 79 69 6e 67 20 65 78 69 73 74 69 6e 67  difying existing
25d50 20 65 6e 74 72 69 65 73 20 69 6e 20 62 6f 74 68   entries in both
25d60 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20   the %_segments 
25d70 61 6e 64 20 25 5f 73 65 67 64 69 72 0a 2a 2a 20  and %_segdir.** 
25d80 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51  tables..**.** SQ
25d90 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
25da0 6e 65 64 20 69 66 20 74 68 65 20 73 65 67 6d 65  ned if the segme
25db0 6e 74 20 69 73 20 75 70 64 61 74 65 64 20 73 75  nt is updated su
25dc0 63 63 65 73 73 66 75 6c 6c 79 2e 20 4f 72 20 61  ccessfully. Or a
25dd0 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72 72 6f  n.** SQLite erro
25de0 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  r code otherwise
25df0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25e00 66 74 73 33 54 72 75 6e 63 61 74 65 53 65 67 6d  fts3TruncateSegm
25e10 65 6e 74 28 0a 20 20 46 74 73 33 54 61 62 6c 65  ent(.  Fts3Table
25e20 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
25e30 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74         /* FTS3 t
25e40 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
25e50 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
25e60 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  AbsLevel,       
25e70 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65 76   /* Absolute lev
25e80 65 6c 20 6f 66 20 73 65 67 6d 65 6e 74 20 74 6f  el of segment to
25e90 20 6d 6f 64 69 66 79 20 2a 2f 0a 20 20 69 6e 74   modify */.  int
25ea0 20 69 49 64 78 2c 20 20 20 20 20 20 20 20 20 20   iIdx,          
25eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25ec0 49 6e 64 65 78 20 77 69 74 68 69 6e 20 6c 65 76  Index within lev
25ed0 65 6c 20 6f 66 20 73 65 67 6d 65 6e 74 20 74 6f  el of segment to
25ee0 20 6d 6f 64 69 66 79 20 2a 2f 0a 20 20 63 6f 6e   modify */.  con
25ef0 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20  st char *zTerm, 
25f00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25f10 52 65 6d 6f 76 65 20 74 65 72 6d 73 20 73 6d 61  Remove terms sma
25f20 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20 2a  ller than this *
25f30 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 20 20 20  /.  int nTerm   
25f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f50 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
25f60 62 79 74 65 73 20 69 6e 20 62 75 66 66 65 72 20  bytes in buffer 
25f70 7a 54 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e  zTerm */.){.  in
25f80 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
25f90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
25fa0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
25fb0 20 20 42 6c 6f 62 20 72 6f 6f 74 20 3d 20 7b 30    Blob root = {0
25fc0 2c 30 2c 30 7d 3b 20 20 20 20 20 20 20 20 20 20  ,0,0};          
25fd0 20 20 2f 2a 20 4e 65 77 20 72 6f 6f 74 20 70 61    /* New root pa
25fe0 67 65 20 69 6d 61 67 65 20 2a 2f 0a 20 20 42 6c  ge image */.  Bl
25ff0 6f 62 20 62 6c 6f 63 6b 20 3d 20 7b 30 2c 30 2c  ob block = {0,0,
26000 30 7d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0};           /*
26010 20 42 75 66 66 65 72 20 75 73 65 64 20 66 6f 72   Buffer used for
26020 20 61 6e 79 20 6f 74 68 65 72 20 62 6c 6f 63 6b   any other block
26030 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
26040 74 36 34 20 69 42 6c 6f 63 6b 20 3d 20 30 3b 20  t64 iBlock = 0; 
26050 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 69        /* Block i
26060 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  d */.  sqlite3_i
26070 6e 74 36 34 20 69 4e 65 77 53 74 61 72 74 20 3d  nt64 iNewStart =
26080 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20 76 61   0;    /* New va
26090 6c 75 65 20 66 6f 72 20 69 53 74 61 72 74 42 6c  lue for iStartBl
260a0 6f 63 6b 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ock */.  sqlite3
260b0 5f 69 6e 74 36 34 20 69 4f 6c 64 53 74 61 72 74  _int64 iOldStart
260c0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 6c 64 20   = 0;    /* Old 
260d0 76 61 6c 75 65 20 66 6f 72 20 69 53 74 61 72 74  value for iStart
260e0 42 6c 6f 63 6b 20 2a 2f 0a 20 20 73 71 6c 69 74  Block */.  sqlit
260f0 65 33 5f 73 74 6d 74 20 2a 70 46 65 74 63 68 20  e3_stmt *pFetch 
26100 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 53 74  = 0;       /* St
26110 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20  atement used to 
26120 66 65 74 63 68 20 73 65 67 64 69 72 20 2a 2f 0a  fetch segdir */.
26130 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53  .  rc = fts3SqlS
26140 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43  tmt(p, SQL_SELEC
26150 54 5f 53 45 47 44 49 52 2c 20 26 70 46 65 74 63  T_SEGDIR, &pFetc
26160 68 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  h, 0);.  if( rc=
26170 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26180 20 20 69 6e 74 20 72 63 32 3b 20 20 20 20 20 20    int rc2;      
26190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261a0 2f 2a 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74  /* sqlite3_reset
261b0 28 29 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  () return code *
261c0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  /.    sqlite3_bi
261d0 6e 64 5f 69 6e 74 36 34 28 70 46 65 74 63 68 2c  nd_int64(pFetch,
261e0 20 31 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a   1, iAbsLevel);.
261f0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
26200 5f 69 6e 74 28 70 46 65 74 63 68 2c 20 32 2c 20  _int(pFetch, 2, 
26210 69 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 53  iIdx);.    if( S
26220 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
26230 65 33 5f 73 74 65 70 28 70 46 65 74 63 68 29 20  e3_step(pFetch) 
26240 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
26250 68 61 72 20 2a 61 52 6f 6f 74 20 3d 20 73 71 6c  har *aRoot = sql
26260 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
26270 28 70 46 65 74 63 68 2c 20 34 29 3b 0a 20 20 20  (pFetch, 4);.   
26280 20 20 20 69 6e 74 20 6e 52 6f 6f 74 20 3d 20 73     int nRoot = s
26290 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
262a0 74 65 73 28 70 46 65 74 63 68 2c 20 34 29 3b 0a  tes(pFetch, 4);.
262b0 20 20 20 20 20 20 69 4f 6c 64 53 74 61 72 74 20        iOldStart 
262c0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
262d0 5f 69 6e 74 36 34 28 70 46 65 74 63 68 2c 20 31  _int64(pFetch, 1
262e0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  );.      rc = ft
262f0 73 33 54 72 75 6e 63 61 74 65 4e 6f 64 65 28 61  s3TruncateNode(a
26300 52 6f 6f 74 2c 20 6e 52 6f 6f 74 2c 20 26 72 6f  Root, nRoot, &ro
26310 6f 74 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  ot, zTerm, nTerm
26320 2c 20 26 69 42 6c 6f 63 6b 29 3b 0a 20 20 20 20  , &iBlock);.    
26330 7d 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  }.    rc2 = sqli
26340 74 65 33 5f 72 65 73 65 74 28 70 46 65 74 63 68  te3_reset(pFetch
26350 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
26360 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
26370 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  rc2;.  }..  whil
26380 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
26390 20 26 26 20 69 42 6c 6f 63 6b 20 29 7b 0a 20 20   && iBlock ){.  
263a0 20 20 63 68 61 72 20 2a 61 42 6c 6f 63 6b 20 3d    char *aBlock =
263b0 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 42 6c 6f   0;.    int nBlo
263c0 63 6b 20 3d 20 30 3b 0a 20 20 20 20 69 4e 65 77  ck = 0;.    iNew
263d0 53 74 61 72 74 20 3d 20 69 42 6c 6f 63 6b 3b 0a  Start = iBlock;.
263e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
263f0 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28 70  3Fts3ReadBlock(p
26400 2c 20 69 42 6c 6f 63 6b 2c 20 26 61 42 6c 6f 63  , iBlock, &aBloc
26410 6b 2c 20 26 6e 42 6c 6f 63 6b 2c 20 30 29 3b 0a  k, &nBlock, 0);.
26420 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
26430 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
26440 63 20 3d 20 66 74 73 33 54 72 75 6e 63 61 74 65  c = fts3Truncate
26450 4e 6f 64 65 28 61 42 6c 6f 63 6b 2c 20 6e 42 6c  Node(aBlock, nBl
26460 6f 63 6b 2c 20 26 62 6c 6f 63 6b 2c 20 7a 54 65  ock, &block, zTe
26470 72 6d 2c 20 6e 54 65 72 6d 2c 20 26 69 42 6c 6f  rm, nTerm, &iBlo
26480 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ck);.    }.    i
26490 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
264a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
264b0 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28  ts3WriteSegment(
264c0 70 2c 20 69 4e 65 77 53 74 61 72 74 2c 20 62 6c  p, iNewStart, bl
264d0 6f 63 6b 2e 61 2c 20 62 6c 6f 63 6b 2e 6e 29 3b  ock.a, block.n);
264e0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
264f0 65 33 5f 66 72 65 65 28 61 42 6c 6f 63 6b 29 3b  e3_free(aBlock);
26500 0a 20 20 7d 0a 0a 20 20 2f 2a 20 56 61 72 69 61  .  }..  /* Varia
26510 62 6c 65 20 69 4e 65 77 53 74 61 72 74 20 6e 6f  ble iNewStart no
26520 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66  w contains the f
26530 69 72 73 74 20 76 61 6c 69 64 20 6c 65 61 66 20  irst valid leaf 
26540 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72  node. */.  if( r
26550 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
26560 69 4e 65 77 53 74 61 72 74 20 29 7b 0a 20 20 20  iNewStart ){.   
26570 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
26580 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  Del = 0;.    rc 
26590 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c  = fts3SqlStmt(p,
265a0 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 4d   SQL_DELETE_SEGM
265b0 45 4e 54 53 5f 52 41 4e 47 45 2c 20 26 70 44 65  ENTS_RANGE, &pDe
265c0 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  l, 0);.    if( r
265d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
265e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
265f0 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c 2c 20 31  nd_int64(pDel, 1
26600 2c 20 69 4f 6c 64 53 74 61 72 74 29 3b 0a 20 20  , iOldStart);.  
26610 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
26620 5f 69 6e 74 36 34 28 70 44 65 6c 2c 20 32 2c 20  _int64(pDel, 2, 
26630 69 4e 65 77 53 74 61 72 74 2d 31 29 3b 0a 20 20  iNewStart-1);.  
26640 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
26650 28 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 72 63  (pDel);.      rc
26660 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
26670 28 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  (pDel);.    }.  
26680 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
26690 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
266a0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 43 68 6f  lite3_stmt *pCho
266b0 6d 70 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  mp = 0;.    rc =
266c0 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20   fts3SqlStmt(p, 
266d0 53 51 4c 5f 43 48 4f 4d 50 5f 53 45 47 44 49 52  SQL_CHOMP_SEGDIR
266e0 2c 20 26 70 43 68 6f 6d 70 2c 20 30 29 3b 0a 20  , &pChomp, 0);. 
266f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
26700 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
26710 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
26720 28 70 43 68 6f 6d 70 2c 20 31 2c 20 69 4e 65 77  (pChomp, 1, iNew
26730 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71  Start);.      sq
26740 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28  lite3_bind_blob(
26750 70 43 68 6f 6d 70 2c 20 32 2c 20 72 6f 6f 74 2e  pChomp, 2, root.
26760 61 2c 20 72 6f 6f 74 2e 6e 2c 20 53 51 4c 49 54  a, root.n, SQLIT
26770 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
26780 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
26790 74 36 34 28 70 43 68 6f 6d 70 2c 20 33 2c 20 69  t64(pChomp, 3, i
267a0 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20  AbsLevel);.     
267b0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
267c0 74 28 70 43 68 6f 6d 70 2c 20 34 2c 20 69 49 64  t(pChomp, 4, iId
267d0 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  x);.      sqlite
267e0 33 5f 73 74 65 70 28 70 43 68 6f 6d 70 29 3b 0a  3_step(pChomp);.
267f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26800 65 33 5f 72 65 73 65 74 28 70 43 68 6f 6d 70 29  e3_reset(pChomp)
26810 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
26820 71 6c 69 74 65 33 5f 66 72 65 65 28 72 6f 6f 74  qlite3_free(root
26830 2e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  .a);.  sqlite3_f
26840 72 65 65 28 62 6c 6f 63 6b 2e 61 29 3b 0a 20 20  ree(block.a);.  
26850 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
26860 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
26870 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  n is called afte
26880 72 20 61 6e 20 69 6e 63 72 6d 65 6e 74 61 6c 2d  r an incrmental-
26890 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 20  merge operation 
268a0 68 61 73 20 72 75 6e 20 74 6f 0a 2a 2a 20 6d 65  has run to.** me
268b0 72 67 65 20 28 6f 72 20 70 61 72 74 69 61 6c 6c  rge (or partiall
268c0 79 20 6d 65 72 67 65 29 20 74 77 6f 20 6f 72 20  y merge) two or 
268d0 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 20 66 72  more segments fr
268e0 6f 6d 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65  om absolute leve
268f0 6c 0a 2a 2a 20 69 41 62 73 4c 65 76 65 6c 2e 0a  l.** iAbsLevel..
26900 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 70 75 74  **.** Each input
26910 20 73 65 67 6d 65 6e 74 20 69 73 20 65 69 74 68   segment is eith
26920 65 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  er removed from 
26930 74 68 65 20 64 62 20 63 6f 6d 70 6c 65 74 65 6c  the db completel
26940 79 20 28 69 66 20 61 6c 6c 20 6f 66 0a 2a 2a 20  y (if all of.** 
26950 69 74 73 20 64 61 74 61 20 77 61 73 20 63 6f 70  its data was cop
26960 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ied to the outpu
26970 74 20 73 65 67 6d 65 6e 74 20 62 79 20 74 68 65  t segment by the
26980 20 69 6e 63 72 6d 65 72 67 65 20 6f 70 65 72 61   incrmerge opera
26990 74 69 6f 6e 29 0a 2a 2a 20 6f 72 20 6d 6f 64 69  tion).** or modi
269a0 66 69 65 64 20 69 6e 20 70 6c 61 63 65 20 73 6f  fied in place so
269b0 20 74 68 61 74 20 69 74 20 6e 6f 20 6c 6f 6e 67   that it no long
269c0 65 72 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f 73  er contains thos
269d0 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a 2a  e entries that.*
269e0 2a 20 68 61 76 65 20 62 65 65 6e 20 64 75 70 6c  * have been dupl
269f0 69 63 61 74 65 64 20 69 6e 20 74 68 65 20 6f 75  icated in the ou
26a00 74 70 75 74 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f  tput segment..*/
26a10 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
26a20 49 6e 63 72 6d 65 72 67 65 43 68 6f 6d 70 28 0a  IncrmergeChomp(.
26a30 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20    Fts3Table *p, 
26a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a50 20 20 2f 2a 20 46 54 53 20 74 61 62 6c 65 20 68    /* FTS table h
26a60 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  andle */.  sqlit
26a70 65 33 5f 69 6e 74 36 34 20 69 41 62 73 4c 65 76  e3_int64 iAbsLev
26a80 65 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 62  el,        /* Ab
26a90 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 63 6f 6e  solute level con
26aa0 74 61 69 6e 69 6e 67 20 73 65 67 6d 65 6e 74 73  taining segments
26ab0 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53   */.  Fts3MultiS
26ac0 65 67 52 65 61 64 65 72 20 2a 70 43 73 72 2c 20  egReader *pCsr, 
26ad0 20 20 20 20 20 20 2f 2a 20 43 68 6f 6d 70 20 61        /* Chomp a
26ae0 6c 6c 20 73 65 67 6d 65 6e 74 73 20 6f 70 65 6e  ll segments open
26af0 65 64 20 62 79 20 74 68 69 73 20 63 75 72 73 6f  ed by this curso
26b00 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 52 65  r */.  int *pnRe
26b10 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
26b20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
26b30 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 6e 6f 74   of segments not
26b40 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20   deleted */.){. 
26b50 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 52   int i;.  int nR
26b60 65 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  em = 0;.  int rc
26b70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
26b80 20 66 6f 72 28 69 3d 70 43 73 72 2d 3e 6e 53 65   for(i=pCsr->nSe
26b90 67 6d 65 6e 74 2d 31 3b 20 69 3e 3d 30 20 26 26  gment-1; i>=0 &&
26ba0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
26bb0 69 2d 2d 29 7b 0a 20 20 20 20 46 74 73 33 53 65  i--){.    Fts3Se
26bc0 67 52 65 61 64 65 72 20 2a 70 53 65 67 20 3d 20  gReader *pSeg = 
26bd0 30 3b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 0a 20  0;.    int j;.. 
26be0 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 46     /* Find the F
26bf0 74 73 33 53 65 67 52 65 61 64 65 72 20 6f 62 6a  ts3SegReader obj
26c00 65 63 74 20 77 69 74 68 20 46 74 73 33 53 65 67  ect with Fts3Seg
26c10 52 65 61 64 65 72 2e 69 49 64 78 3d 3d 69 2e 20  Reader.iIdx==i. 
26c20 49 74 20 69 73 20 68 69 64 69 6e 67 0a 20 20 20  It is hiding.   
26c30 20 2a 2a 20 73 6f 6d 65 77 68 65 72 65 20 69 6e   ** somewhere in
26c40 20 74 68 65 20 70 43 73 72 2d 3e 61 70 53 65 67   the pCsr->apSeg
26c50 6d 65 6e 74 5b 5d 20 61 72 72 61 79 2e 20 20 2a  ment[] array.  *
26c60 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 41  /.    for(j=0; A
26c70 4c 57 41 59 53 28 6a 3c 70 43 73 72 2d 3e 6e 53  LWAYS(j<pCsr->nS
26c80 65 67 6d 65 6e 74 29 3b 20 6a 2b 2b 29 7b 0a 20  egment); j++){. 
26c90 20 20 20 20 20 70 53 65 67 20 3d 20 70 43 73 72       pSeg = pCsr
26ca0 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 3b 0a  ->apSegment[j];.
26cb0 20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e        if( pSeg->
26cc0 69 49 64 78 3d 3d 69 20 29 20 62 72 65 61 6b 3b  iIdx==i ) break;
26cd0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
26ce0 74 28 20 6a 3c 70 43 73 72 2d 3e 6e 53 65 67 6d  t( j<pCsr->nSegm
26cf0 65 6e 74 20 26 26 20 70 53 65 67 2d 3e 69 49 64  ent && pSeg->iId
26d00 78 3d 3d 69 20 29 3b 0a 0a 20 20 20 20 69 66 28  x==i );..    if(
26d10 20 70 53 65 67 2d 3e 61 4e 6f 64 65 3d 3d 30 20   pSeg->aNode==0 
26d20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65 67 2d  ){.      /* Seg-
26d30 72 65 61 64 65 72 20 69 73 20 61 74 20 45 4f 46  reader is at EOF
26d40 2e 20 52 65 6d 6f 76 65 20 74 68 65 20 65 6e 74  . Remove the ent
26d50 69 72 65 20 69 6e 70 75 74 20 73 65 67 6d 65 6e  ire input segmen
26d60 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  t. */.      rc =
26d70 20 66 74 73 33 44 65 6c 65 74 65 53 65 67 6d 65   fts3DeleteSegme
26d80 6e 74 28 70 2c 20 70 53 65 67 29 3b 0a 20 20 20  nt(p, pSeg);.   
26d90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
26da0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
26db0 72 63 20 3d 20 66 74 73 33 52 65 6d 6f 76 65 53  rc = fts3RemoveS
26dc0 65 67 64 69 72 45 6e 74 72 79 28 70 2c 20 69 41  egdirEntry(p, iA
26dd0 62 73 4c 65 76 65 6c 2c 20 70 53 65 67 2d 3e 69  bsLevel, pSeg->i
26de0 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Idx);.      }.  
26df0 20 20 20 20 2a 70 6e 52 65 6d 20 3d 20 30 3b 0a      *pnRem = 0;.
26e00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26e10 20 2f 2a 20 54 68 65 20 69 6e 63 72 65 6d 65 6e   /* The incremen
26e20 74 61 6c 20 6d 65 72 67 65 20 64 69 64 20 6e 6f  tal merge did no
26e30 74 20 63 6f 70 79 20 61 6c 6c 20 74 68 65 20 64  t copy all the d
26e40 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 0a 20  ata from this . 
26e50 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20       ** segment 
26e60 74 6f 20 74 68 65 20 75 70 70 65 72 20 6c 65 76  to the upper lev
26e70 65 6c 2e 20 54 68 65 20 73 65 67 6d 65 6e 74 20  el. The segment 
26e80 69 73 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 70  is modified in p
26e90 6c 61 63 65 0a 20 20 20 20 20 20 2a 2a 20 73 6f  lace.      ** so
26ea0 20 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e   that it contain
26eb0 73 20 6e 6f 20 6b 65 79 73 20 73 6d 61 6c 6c 65  s no keys smalle
26ec0 72 20 74 68 61 6e 20 7a 54 65 72 6d 2f 6e 54 65  r than zTerm/nTe
26ed0 72 6d 2e 20 2a 2f 20 0a 20 20 20 20 20 20 63 6f  rm. */ .      co
26ee0 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20  nst char *zTerm 
26ef0 3d 20 70 53 65 67 2d 3e 7a 54 65 72 6d 3b 0a 20  = pSeg->zTerm;. 
26f00 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d       int nTerm =
26f10 20 70 53 65 67 2d 3e 6e 54 65 72 6d 3b 0a 20 20   pSeg->nTerm;.  
26f20 20 20 20 20 72 63 20 3d 20 66 74 73 33 54 72 75      rc = fts3Tru
26f30 6e 63 61 74 65 53 65 67 6d 65 6e 74 28 70 2c 20  ncateSegment(p, 
26f40 69 41 62 73 4c 65 76 65 6c 2c 20 70 53 65 67 2d  iAbsLevel, pSeg-
26f50 3e 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54  >iIdx, zTerm, nT
26f60 65 72 6d 29 3b 0a 20 20 20 20 20 20 6e 52 65 6d  erm);.      nRem
26f70 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ++;.    }.  }.. 
26f80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26f90 4f 4b 20 26 26 20 6e 52 65 6d 21 3d 70 43 73 72  OK && nRem!=pCsr
26fa0 2d 3e 6e 53 65 67 6d 65 6e 74 20 29 7b 0a 20 20  ->nSegment ){.  
26fb0 20 20 72 63 20 3d 20 66 74 73 33 52 65 70 61 63    rc = fts3Repac
26fc0 6b 53 65 67 64 69 72 4c 65 76 65 6c 28 70 2c 20  kSegdirLevel(p, 
26fd0 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a  iAbsLevel);.  }.
26fe0 0a 20 20 2a 70 6e 52 65 6d 20 3d 20 6e 52 65 6d  .  *pnRem = nRem
26ff0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
27000 0a 0a 2f 2a 0a 2a 2a 20 53 74 6f 72 65 20 61 6e  ../*.** Store an
27010 20 69 6e 63 72 2d 6d 65 72 67 65 20 68 69 6e 74   incr-merge hint
27020 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
27030 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27040 66 74 73 33 49 6e 63 72 6d 65 72 67 65 48 69 6e  fts3IncrmergeHin
27050 74 53 74 6f 72 65 28 46 74 73 33 54 61 62 6c 65  tStore(Fts3Table
27060 20 2a 70 2c 20 42 6c 6f 62 20 2a 70 48 69 6e 74   *p, Blob *pHint
27070 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
27080 74 20 2a 70 52 65 70 6c 61 63 65 20 3d 20 30 3b  t *pReplace = 0;
27090 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
270a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270b0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
270c0 65 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73  e */..  rc = fts
270d0 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f  3SqlStmt(p, SQL_
270e0 52 45 50 4c 41 43 45 5f 53 54 41 54 2c 20 26 70  REPLACE_STAT, &p
270f0 52 65 70 6c 61 63 65 2c 20 30 29 3b 0a 20 20 69  Replace, 0);.  i
27100 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27110 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
27120 62 69 6e 64 5f 69 6e 74 28 70 52 65 70 6c 61 63  bind_int(pReplac
27130 65 2c 20 31 2c 20 46 54 53 5f 53 54 41 54 5f 49  e, 1, FTS_STAT_I
27140 4e 43 52 4d 45 52 47 45 48 49 4e 54 29 3b 0a 20  NCRMERGEHINT);. 
27150 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
27160 62 6c 6f 62 28 70 52 65 70 6c 61 63 65 2c 20 32  blob(pReplace, 2
27170 2c 20 70 48 69 6e 74 2d 3e 61 2c 20 70 48 69 6e  , pHint->a, pHin
27180 74 2d 3e 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41  t->n, SQLITE_STA
27190 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
271a0 33 5f 73 74 65 70 28 70 52 65 70 6c 61 63 65 29  3_step(pReplace)
271b0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
271c0 65 33 5f 72 65 73 65 74 28 70 52 65 70 6c 61 63  e3_reset(pReplac
271d0 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  e);.  }..  retur
271e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
271f0 6f 61 64 20 61 6e 20 69 6e 63 72 2d 6d 65 72 67  oad an incr-merg
27200 65 20 68 69 6e 74 20 66 72 6f 6d 20 74 68 65 20  e hint from the 
27210 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 69 6e  database. The in
27220 63 72 2d 6d 65 72 67 65 20 68 69 6e 74 2c 20 69  cr-merge hint, i
27230 66 20 6f 6e 65 20 0a 2a 2a 20 65 78 69 73 74 73  f one .** exists
27240 2c 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  , is stored in t
27250 68 65 20 72 6f 77 69 64 3d 3d 31 20 72 6f 77 20  he rowid==1 row 
27260 6f 66 20 74 68 65 20 25 5f 73 74 61 74 20 74 61  of the %_stat ta
27270 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ble..**.** If su
27280 63 63 65 73 73 66 75 6c 2c 20 70 6f 70 75 6c 61  ccessful, popula
27290 74 65 20 62 6c 6f 62 20 2a 70 48 69 6e 74 20 77  te blob *pHint w
272a0 69 74 68 20 74 68 65 20 76 61 6c 75 65 20 72 65  ith the value re
272b0 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 73 74  ad from the %_st
272c0 61 74 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  at.** table and 
272d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
272e0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
272f0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
27300 20 72 65 74 75 72 6e 20 61 6e 0a 2a 2a 20 53 51   return an.** SQ
27310 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
27320 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
27330 74 73 33 49 6e 63 72 6d 65 72 67 65 48 69 6e 74  ts3IncrmergeHint
27340 4c 6f 61 64 28 46 74 73 33 54 61 62 6c 65 20 2a  Load(Fts3Table *
27350 70 2c 20 42 6c 6f 62 20 2a 70 48 69 6e 74 29 7b  p, Blob *pHint){
27360 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
27370 2a 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20  *pSelect = 0;.  
27380 69 6e 74 20 72 63 3b 0a 0a 20 20 70 48 69 6e 74  int rc;..  pHint
27390 2d 3e 6e 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  ->n = 0;.  rc = 
273a0 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
273b0 51 4c 5f 53 45 4c 45 43 54 5f 53 54 41 54 2c 20  QL_SELECT_STAT, 
273c0 26 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  &pSelect, 0);.  
273d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
273e0 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  K ){.    int rc2
273f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
27400 6e 64 5f 69 6e 74 28 70 53 65 6c 65 63 74 2c 20  nd_int(pSelect, 
27410 31 2c 20 46 54 53 5f 53 54 41 54 5f 49 4e 43 52  1, FTS_STAT_INCR
27420 4d 45 52 47 45 48 49 4e 54 29 3b 0a 20 20 20 20  MERGEHINT);.    
27430 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
27440 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65  sqlite3_step(pSe
27450 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 63  lect) ){.      c
27460 6f 6e 73 74 20 63 68 61 72 20 2a 61 48 69 6e 74  onst char *aHint
27470 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
27480 6e 5f 62 6c 6f 62 28 70 53 65 6c 65 63 74 2c 20  n_blob(pSelect, 
27490 30 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 48  0);.      int nH
274a0 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  int = sqlite3_co
274b0 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 65 6c 65  lumn_bytes(pSele
274c0 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ct, 0);.      if
274d0 28 20 61 48 69 6e 74 20 29 7b 0a 20 20 20 20 20  ( aHint ){.     
274e0 20 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65     blobGrowBuffe
274f0 72 28 70 48 69 6e 74 2c 20 6e 48 69 6e 74 2c 20  r(pHint, nHint, 
27500 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  &rc);.        if
27510 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
27530 63 70 79 28 70 48 69 6e 74 2d 3e 61 2c 20 61 48  cpy(pHint->a, aH
27540 69 6e 74 2c 20 6e 48 69 6e 74 29 3b 0a 20 20 20  int, nHint);.   
27550 20 20 20 20 20 20 20 70 48 69 6e 74 2d 3e 6e 20         pHint->n 
27560 3d 20 6e 48 69 6e 74 3b 0a 20 20 20 20 20 20 20  = nHint;.       
27570 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
27580 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
27590 65 33 5f 72 65 73 65 74 28 70 53 65 6c 65 63 74  e3_reset(pSelect
275a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
275b0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
275c0 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  rc2;.  }..  retu
275d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
275e0 49 66 20 2a 70 52 63 20 69 73 20 6e 6f 74 20 53  If *pRc is not S
275f0 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68  QLITE_OK when th
27600 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
27610 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
27620 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  o-op..** Otherwi
27630 73 65 2c 20 61 70 70 65 6e 64 20 61 6e 20 65 6e  se, append an en
27640 74 72 79 20 74 6f 20 74 68 65 20 68 69 6e 74 20  try to the hint 
27650 73 74 6f 72 65 64 20 69 6e 20 62 6c 6f 62 20 2a  stored in blob *
27660 70 48 69 6e 74 2e 20 45 61 63 68 20 65 6e 74 72  pHint. Each entr
27670 79 0a 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66  y.** consists of
27680 20 74 77 6f 20 76 61 72 69 6e 74 73 2c 20 74 68   two varints, th
27690 65 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c  e absolute level
276a0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
276b0 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 0a 2a  nput segments .*
276c0 2a 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  * and the number
276d0 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e   of input segmen
276e0 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  ts..**.** If suc
276f0 63 65 73 73 66 75 6c 2c 20 6c 65 61 76 65 20 2a  cessful, leave *
27700 70 52 63 20 73 65 74 20 74 6f 20 53 51 4c 49 54  pRc set to SQLIT
27710 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 2e  E_OK and return.
27720 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
27730 75 72 73 2c 0a 2a 2a 20 73 65 74 20 2a 70 52 63  urs,.** set *pRc
27740 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 65 72   to an SQLite er
27750 72 6f 72 20 63 6f 64 65 20 62 65 66 6f 72 65 20  ror code before 
27760 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
27770 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 49 6e  atic void fts3In
27780 63 72 6d 65 72 67 65 48 69 6e 74 50 75 73 68 28  crmergeHintPush(
27790 0a 20 20 42 6c 6f 62 20 2a 70 48 69 6e 74 2c 20  .  Blob *pHint, 
277a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277b0 20 20 20 2f 2a 20 48 69 6e 74 20 62 6c 6f 62 20     /* Hint blob 
277c0 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 2a 2f 0a  to append to */.
277d0 20 20 69 36 34 20 69 41 62 73 4c 65 76 65 6c 2c    i64 iAbsLevel,
277e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277f0 20 20 2f 2a 20 46 69 72 73 74 20 76 61 72 69 6e    /* First varin
27800 74 20 74 6f 20 73 74 6f 72 65 20 69 6e 20 68 69  t to store in hi
27810 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 70  nt */.  int nInp
27820 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
27830 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e          /* Secon
27840 64 20 76 61 72 69 6e 74 20 74 6f 20 73 74 6f 72  d varint to stor
27850 65 20 69 6e 20 68 69 6e 74 20 2a 2f 0a 20 20 69  e in hint */.  i
27860 6e 74 20 2a 70 52 63 20 20 20 20 20 20 20 20 20  nt *pRc         
27870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27880 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20  * IN/OUT: Error 
27890 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 62 6c 6f  code */.){.  blo
278a0 62 47 72 6f 77 42 75 66 66 65 72 28 70 48 69 6e  bGrowBuffer(pHin
278b0 74 2c 20 70 48 69 6e 74 2d 3e 6e 20 2b 20 32 2a  t, pHint->n + 2*
278c0 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 2c  FTS3_VARINT_MAX,
278d0 20 70 52 63 29 3b 0a 20 20 69 66 28 20 2a 70 52   pRc);.  if( *pR
278e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
278f0 20 20 20 20 70 48 69 6e 74 2d 3e 6e 20 2b 3d 20      pHint->n += 
27900 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
27910 72 69 6e 74 28 26 70 48 69 6e 74 2d 3e 61 5b 70  rint(&pHint->a[p
27920 48 69 6e 74 2d 3e 6e 5d 2c 20 69 41 62 73 4c 65  Hint->n], iAbsLe
27930 76 65 6c 29 3b 0a 20 20 20 20 70 48 69 6e 74 2d  vel);.    pHint-
27940 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  >n += sqlite3Fts
27950 33 50 75 74 56 61 72 69 6e 74 28 26 70 48 69 6e  3PutVarint(&pHin
27960 74 2d 3e 61 5b 70 48 69 6e 74 2d 3e 6e 5d 2c 20  t->a[pHint->n], 
27970 28 69 36 34 29 6e 49 6e 70 75 74 29 3b 0a 20 20  (i64)nInput);.  
27980 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  }.}../*.** Read 
27990 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 28  the last entry (
279a0 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 75  most recently pu
279b0 73 68 65 64 29 20 66 72 6f 6d 20 74 68 65 20 68  shed) from the h
279c0 69 6e 74 20 62 6c 6f 62 20 2a 70 48 69 6e 74 0a  int blob *pHint.
279d0 2a 2a 20 61 6e 64 20 74 68 65 6e 20 72 65 6d 6f  ** and then remo
279e0 76 65 20 74 68 65 20 65 6e 74 72 79 2e 20 57 72  ve the entry. Wr
279f0 69 74 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75  ite the two valu
27a00 65 73 20 72 65 61 64 20 74 6f 20 2a 70 69 41 62  es read to *piAb
27a10 73 4c 65 76 65 6c 20 61 6e 64 20 0a 2a 2a 20 2a  sLevel and .** *
27a20 70 6e 49 6e 70 75 74 20 62 65 66 6f 72 65 20 72  pnInput before r
27a30 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
27a40 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
27a50 72 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  rs, return SQLIT
27a60 45 5f 4f 4b 2e 20 49 66 20 74 68 65 20 68 69 6e  E_OK. If the hin
27a70 74 20 62 6c 6f 62 20 69 6e 20 2a 70 48 69 6e 74  t blob in *pHint
27a80 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e   does.** not con
27a90 74 61 69 6e 20 61 74 20 6c 65 61 73 74 20 74 77  tain at least tw
27aa0 6f 20 76 61 6c 69 64 20 76 61 72 69 6e 74 73 2c  o valid varints,
27ab0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
27ac0 4f 52 52 55 50 54 5f 56 54 41 42 2e 0a 2a 2f 0a  ORRUPT_VTAB..*/.
27ad0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49  static int fts3I
27ae0 6e 63 72 6d 65 72 67 65 48 69 6e 74 50 6f 70 28  ncrmergeHintPop(
27af0 42 6c 6f 62 20 2a 70 48 69 6e 74 2c 20 69 36 34  Blob *pHint, i64
27b00 20 2a 70 69 41 62 73 4c 65 76 65 6c 2c 20 69 6e   *piAbsLevel, in
27b10 74 20 2a 70 6e 49 6e 70 75 74 29 7b 0a 20 20 63  t *pnInput){.  c
27b20 6f 6e 73 74 20 69 6e 74 20 6e 48 69 6e 74 20 3d  onst int nHint =
27b30 20 70 48 69 6e 74 2d 3e 6e 3b 0a 20 20 69 6e 74   pHint->n;.  int
27b40 20 69 3b 0a 0a 20 20 69 20 3d 20 70 48 69 6e 74   i;..  i = pHint
27b50 2d 3e 6e 2d 32 3b 0a 20 20 77 68 69 6c 65 28 20  ->n-2;.  while( 
27b60 69 3e 30 20 26 26 20 28 70 48 69 6e 74 2d 3e 61  i>0 && (pHint->a
27b70 5b 69 2d 31 5d 20 26 20 30 78 38 30 29 20 29 20  [i-1] & 0x80) ) 
27b80 69 2d 2d 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e  i--;.  while( i>
27b90 30 20 26 26 20 28 70 48 69 6e 74 2d 3e 61 5b 69  0 && (pHint->a[i
27ba0 2d 31 5d 20 26 20 30 78 38 30 29 20 29 20 69 2d  -1] & 0x80) ) i-
27bb0 2d 3b 0a 0a 20 20 70 48 69 6e 74 2d 3e 6e 20 3d  -;..  pHint->n =
27bc0 20 69 3b 0a 20 20 69 20 2b 3d 20 73 71 6c 69 74   i;.  i += sqlit
27bd0 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28  e3Fts3GetVarint(
27be0 26 70 48 69 6e 74 2d 3e 61 5b 69 5d 2c 20 70 69  &pHint->a[i], pi
27bf0 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 69 20 2b  AbsLevel);.  i +
27c00 3d 20 66 74 73 33 47 65 74 56 61 72 69 6e 74 33  = fts3GetVarint3
27c10 32 28 26 70 48 69 6e 74 2d 3e 61 5b 69 5d 2c 20  2(&pHint->a[i], 
27c20 70 6e 49 6e 70 75 74 29 3b 0a 20 20 69 66 28 20  pnInput);.  if( 
27c30 69 21 3d 6e 48 69 6e 74 20 29 20 72 65 74 75 72  i!=nHint ) retur
27c40 6e 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 54  n FTS_CORRUPT_VT
27c50 41 42 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  AB;..  return SQ
27c60 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
27c70 2a 2a 20 41 74 74 65 6d 70 74 20 61 6e 20 69 6e  ** Attempt an in
27c80 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20  cremental merge 
27c90 74 68 61 74 20 77 72 69 74 65 73 20 6e 4d 65 72  that writes nMer
27ca0 67 65 20 6c 65 61 66 20 62 6c 6f 63 6b 73 2e 0a  ge leaf blocks..
27cb0 2a 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 61  **.** Incrementa
27cc0 6c 20 6d 65 72 67 65 73 20 68 61 70 70 65 6e 20  l merges happen 
27cd0 6e 4d 69 6e 20 73 65 67 6d 65 6e 74 73 20 61 74  nMin segments at
27ce0 20 61 20 74 69 6d 65 2e 20 54 68 65 20 73 65 67   a time. The seg
27cf0 6d 65 6e 74 73 20 0a 2a 2a 20 74 6f 20 62 65 20  ments .** to be 
27d00 6d 65 72 67 65 64 20 61 72 65 20 74 68 65 20 6e  merged are the n
27d10 4d 69 6e 20 6f 6c 64 65 73 74 20 73 65 67 6d 65  Min oldest segme
27d20 6e 74 73 20 28 74 68 65 20 6f 6e 65 73 20 77 69  nts (the ones wi
27d30 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  th the smallest 
27d40 0a 2a 2a 20 76 61 6c 75 65 73 20 66 6f 72 20 74  .** values for t
27d50 68 65 20 5f 73 65 67 64 69 72 2e 69 64 78 20 66  he _segdir.idx f
27d60 69 65 6c 64 29 20 69 6e 20 74 68 65 20 68 69 67  ield) in the hig
27d70 68 65 73 74 20 6c 65 76 65 6c 20 74 68 61 74 20  hest level that 
27d80 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20 61 74 20  contains .** at 
27d90 6c 65 61 73 74 20 6e 4d 69 6e 20 73 65 67 6d 65  least nMin segme
27da0 6e 74 73 2e 20 4d 75 6c 74 69 70 6c 65 20 6d 65  nts. Multiple me
27db0 72 67 65 73 20 6d 69 67 68 74 20 6f 63 63 75 72  rges might occur
27dc0 20 69 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 74   in an attempt t
27dd0 6f 20 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20  o .** write the 
27de0 71 75 6f 74 61 20 6f 66 20 6e 4d 65 72 67 65 20  quota of nMerge 
27df0 6c 65 61 66 20 62 6c 6f 63 6b 73 2e 0a 2a 2f 0a  leaf blocks..*/.
27e00 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 49  int sqlite3Fts3I
27e10 6e 63 72 6d 65 72 67 65 28 46 74 73 33 54 61 62  ncrmerge(Fts3Tab
27e20 6c 65 20 2a 70 2c 20 69 6e 74 20 6e 4d 65 72 67  le *p, int nMerg
27e30 65 2c 20 69 6e 74 20 6e 4d 69 6e 29 7b 0a 20 20  e, int nMin){.  
27e40 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
27e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e60 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
27e70 2f 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 6e  /.  int nRem = n
27e80 4d 65 72 67 65 3b 20 20 20 20 20 20 20 20 20 20  Merge;          
27e90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
27ea0 20 6c 65 61 66 20 70 61 67 65 73 20 79 65 74 20   leaf pages yet 
27eb0 74 6f 20 20 62 65 20 77 72 69 74 74 65 6e 20 2a  to  be written *
27ec0 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67  /.  Fts3MultiSeg
27ed0 52 65 61 64 65 72 20 2a 70 43 73 72 3b 20 20 20  Reader *pCsr;   
27ee0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 75 73      /* Cursor us
27ef0 65 64 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74  ed to read input
27f00 20 64 61 74 61 20 2a 2f 0a 20 20 46 74 73 33 53   data */.  Fts3S
27f10 65 67 46 69 6c 74 65 72 20 2a 70 46 69 6c 74 65  egFilter *pFilte
27f20 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  r;         /* Fi
27f30 6c 74 65 72 20 75 73 65 64 20 77 69 74 68 20 63  lter used with c
27f40 75 72 73 6f 72 20 70 43 73 72 20 2a 2f 0a 20 20  ursor pCsr */.  
27f50 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72 20  IncrmergeWriter 
27f60 2a 70 57 72 69 74 65 72 3b 20 20 20 20 20 20 20  *pWriter;       
27f70 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74  /* Writer object
27f80 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d   */.  int nSeg =
27f90 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
27fa0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
27fb0 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  of input segment
27fc0 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  s */.  sqlite3_i
27fd0 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c 20 3d  nt64 iAbsLevel =
27fe0 20 30 3b 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75   0;    /* Absolu
27ff0 74 65 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20  te level number 
28000 74 6f 20 77 6f 72 6b 20 6f 6e 20 2a 2f 0a 20 20  to work on */.  
28010 42 6c 6f 62 20 68 69 6e 74 20 3d 20 7b 30 2c 20  Blob hint = {0, 
28020 30 2c 20 30 7d 3b 20 20 20 20 20 20 20 20 20 20  0, 0};          
28030 2f 2a 20 48 69 6e 74 20 72 65 61 64 20 66 72 6f  /* Hint read fro
28040 6d 20 25 5f 73 74 61 74 20 74 61 62 6c 65 20 2a  m %_stat table *
28050 2f 0a 20 20 69 6e 74 20 62 44 69 72 74 79 48 69  /.  int bDirtyHi
28060 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
28070 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 62      /* True if b
28080 6c 6f 62 20 27 68 69 6e 74 27 20 68 61 73 20 62  lob 'hint' has b
28090 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a  een modified */.
280a0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
280b0 70 61 63 65 20 66 6f 72 20 74 68 65 20 63 75 72  pace for the cur
280c0 73 6f 72 2c 20 66 69 6c 74 65 72 20 61 6e 64 20  sor, filter and 
280d0 77 72 69 74 65 72 20 6f 62 6a 65 63 74 73 20 2a  writer objects *
280e0 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 41  /.  const int nA
280f0 6c 6c 6f 63 20 3d 20 73 69 7a 65 6f 66 28 2a 70  lloc = sizeof(*p
28100 43 73 72 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70  Csr) + sizeof(*p
28110 46 69 6c 74 65 72 29 20 2b 20 73 69 7a 65 6f 66  Filter) + sizeof
28120 28 2a 70 57 72 69 74 65 72 29 3b 0a 20 20 70 57  (*pWriter);.  pW
28130 72 69 74 65 72 20 3d 20 28 49 6e 63 72 6d 65 72  riter = (Incrmer
28140 67 65 57 72 69 74 65 72 20 2a 29 73 71 6c 69 74  geWriter *)sqlit
28150 65 33 5f 6d 61 6c 6c 6f 63 28 6e 41 6c 6c 6f 63  e3_malloc(nAlloc
28160 29 3b 0a 20 20 69 66 28 20 21 70 57 72 69 74 65  );.  if( !pWrite
28170 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  r ) return SQLIT
28180 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 46 69 6c 74  E_NOMEM;.  pFilt
28190 65 72 20 3d 20 28 46 74 73 33 53 65 67 46 69 6c  er = (Fts3SegFil
281a0 74 65 72 20 2a 29 26 70 57 72 69 74 65 72 5b 31  ter *)&pWriter[1
281b0 5d 3b 0a 20 20 70 43 73 72 20 3d 20 28 46 74 73  ];.  pCsr = (Fts
281c0 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20  3MultiSegReader 
281d0 2a 29 26 70 46 69 6c 74 65 72 5b 31 5d 3b 0a 0a  *)&pFilter[1];..
281e0 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72 6d    rc = fts3Incrm
281f0 65 72 67 65 48 69 6e 74 4c 6f 61 64 28 70 2c 20  ergeHintLoad(p, 
28200 26 68 69 6e 74 29 3b 0a 20 20 77 68 69 6c 65 28  &hint);.  while(
28210 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
28220 26 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20  & nRem>0 ){.    
28230 63 6f 6e 73 74 20 69 36 34 20 6e 4d 6f 64 20 3d  const i64 nMod =
28240 20 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 58   FTS3_SEGDIR_MAX
28250 4c 45 56 45 4c 20 2a 20 70 2d 3e 6e 49 6e 64 65  LEVEL * p->nInde
28260 78 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  x;.    sqlite3_s
28270 74 6d 74 20 2a 70 46 69 6e 64 4c 65 76 65 6c 20  tmt *pFindLevel 
28280 3d 20 30 3b 20 2f 2a 20 53 51 4c 20 75 73 65 64  = 0; /* SQL used
28290 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 41   to determine iA
282a0 62 73 4c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69  bsLevel */.    i
282b0 6e 74 20 62 55 73 65 48 69 6e 74 20 3d 20 30 3b  nt bUseHint = 0;
282c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
282d0 54 72 75 65 20 69 66 20 61 74 74 65 6d 70 74 69  True if attempti
282e0 6e 67 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a  ng to append */.
282f0 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30      int iIdx = 0
28300 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28310 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 69 64 78    /* Largest idx
28320 20 69 6e 20 6c 65 76 65 6c 20 28 69 41 62 73 4c   in level (iAbsL
28330 65 76 65 6c 2b 31 29 20 2a 2f 0a 0a 20 20 20 20  evel+1) */..    
28340 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 25 5f  /* Search the %_
28350 73 65 67 64 69 72 20 74 61 62 6c 65 20 66 6f 72  segdir table for
28360 20 74 68 65 20 61 62 73 6f 6c 75 74 65 20 6c 65   the absolute le
28370 76 65 6c 20 77 69 74 68 20 74 68 65 20 73 6d 61  vel with the sma
28380 6c 6c 65 73 74 0a 20 20 20 20 2a 2a 20 72 65 6c  llest.    ** rel
28390 61 74 69 76 65 20 6c 65 76 65 6c 20 6e 75 6d 62  ative level numb
283a0 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  er that contains
283b0 20 61 74 20 6c 65 61 73 74 20 6e 4d 69 6e 20 73   at least nMin s
283c0 65 67 6d 65 6e 74 73 2c 20 69 66 20 61 6e 79 2e  egments, if any.
283d0 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 69  .    ** If one i
283e0 73 20 66 6f 75 6e 64 2c 20 73 65 74 20 69 41 62  s found, set iAb
283f0 73 4c 65 76 65 6c 20 74 6f 20 74 68 65 20 61 62  sLevel to the ab
28400 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 6e 75 6d  solute level num
28410 62 65 72 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6e  ber and.    ** n
28420 53 65 67 20 74 6f 20 6e 4d 69 6e 2e 20 49 66 20  Seg to nMin. If 
28430 6e 6f 20 6c 65 76 65 6c 20 77 69 74 68 20 61 74  no level with at
28440 20 6c 65 61 73 74 20 6e 4d 69 6e 20 73 65 67 6d   least nMin segm
28450 65 6e 74 73 20 63 61 6e 20 62 65 20 66 6f 75 6e  ents can be foun
28460 64 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 6e  d, .    ** set n
28470 53 65 67 20 74 6f 20 2d 31 2e 0a 20 20 20 20 2a  Seg to -1..    *
28480 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53  /.    rc = fts3S
28490 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 46 49  qlStmt(p, SQL_FI
284a0 4e 44 5f 4d 45 52 47 45 5f 4c 45 56 45 4c 2c 20  ND_MERGE_LEVEL, 
284b0 26 70 46 69 6e 64 4c 65 76 65 6c 2c 20 30 29 3b  &pFindLevel, 0);
284c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
284d0 64 5f 69 6e 74 28 70 46 69 6e 64 4c 65 76 65 6c  d_int(pFindLevel
284e0 2c 20 31 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20  , 1, nMin);.    
284f0 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  if( sqlite3_step
28500 28 70 46 69 6e 64 4c 65 76 65 6c 29 3d 3d 53 51  (pFindLevel)==SQ
28510 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
28520 20 20 69 41 62 73 4c 65 76 65 6c 20 3d 20 73 71    iAbsLevel = sq
28530 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
28540 36 34 28 70 46 69 6e 64 4c 65 76 65 6c 2c 20 30  64(pFindLevel, 0
28550 29 3b 0a 20 20 20 20 20 20 6e 53 65 67 20 3d 20  );.      nSeg = 
28560 6e 4d 69 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nMin;.    }else{
28570 0a 20 20 20 20 20 20 6e 53 65 67 20 3d 20 2d 31  .      nSeg = -1
28580 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
28590 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
285a0 46 69 6e 64 4c 65 76 65 6c 29 3b 0a 0a 20 20 20  FindLevel);..   
285b0 20 2f 2a 20 49 66 20 74 68 65 20 68 69 6e 74 20   /* If the hint 
285c0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f  read from the %_
285d0 73 74 61 74 20 74 61 62 6c 65 20 69 73 20 6e 6f  stat table is no
285e0 74 20 65 6d 70 74 79 2c 20 63 68 65 63 6b 20 69  t empty, check i
285f0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61 73  f the.    ** las
28600 74 20 65 6e 74 72 79 20 69 6e 20 69 74 20 73 70  t entry in it sp
28610 65 63 69 66 69 65 73 20 61 20 72 65 6c 61 74 69  ecifies a relati
28620 76 65 20 6c 65 76 65 6c 20 73 6d 61 6c 6c 65 72  ve level smaller
28630 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 20   than or equal. 
28640 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 65 76     ** to the lev
28650 65 6c 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  el identified by
28660 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65   the block above
28670 20 28 69 66 20 61 6e 79 29 2e 20 49 66 20 73 6f   (if any). If so
28680 2c 20 74 68 69 73 20 0a 20 20 20 20 2a 2a 20 69  , this .    ** i
28690 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
286a0 6c 6f 6f 70 20 77 69 6c 6c 20 77 6f 72 6b 20 6f  loop will work o
286b0 6e 20 6d 65 72 67 69 6e 67 20 61 74 20 74 68 65  n merging at the
286c0 20 68 69 6e 74 65 64 20 6c 65 76 65 6c 2e 0a 20   hinted level.. 
286d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
286e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 68  ==SQLITE_OK && h
286f0 69 6e 74 2e 6e 20 29 7b 0a 20 20 20 20 20 20 69  int.n ){.      i
28700 6e 74 20 6e 48 69 6e 74 20 3d 20 68 69 6e 74 2e  nt nHint = hint.
28710 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  n;.      sqlite3
28720 5f 69 6e 74 36 34 20 69 48 69 6e 74 41 62 73 4c  _int64 iHintAbsL
28730 65 76 65 6c 20 3d 20 30 3b 20 20 20 20 20 20 2f  evel = 0;      /
28740 2a 20 48 69 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a  * Hint level */.
28750 20 20 20 20 20 20 69 6e 74 20 6e 48 69 6e 74 53        int nHintS
28760 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
28770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
28780 69 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  int number of se
28790 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 20 20 20  gments */..     
287a0 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72 6d 65   rc = fts3Incrme
287b0 72 67 65 48 69 6e 74 50 6f 70 28 26 68 69 6e 74  rgeHintPop(&hint
287c0 2c 20 26 69 48 69 6e 74 41 62 73 4c 65 76 65 6c  , &iHintAbsLevel
287d0 2c 20 26 6e 48 69 6e 74 53 65 67 29 3b 0a 20 20  , &nHintSeg);.  
287e0 20 20 20 20 69 66 28 20 6e 53 65 67 3c 30 20 7c      if( nSeg<0 |
287f0 7c 20 28 69 41 62 73 4c 65 76 65 6c 20 25 20 6e  | (iAbsLevel % n
28800 4d 6f 64 29 20 3e 3d 20 28 69 48 69 6e 74 41 62  Mod) >= (iHintAb
28810 73 4c 65 76 65 6c 20 25 20 6e 4d 6f 64 29 20 29  sLevel % nMod) )
28820 7b 0a 20 20 20 20 20 20 20 20 69 41 62 73 4c 65  {.        iAbsLe
28830 76 65 6c 20 3d 20 69 48 69 6e 74 41 62 73 4c 65  vel = iHintAbsLe
28840 76 65 6c 3b 0a 20 20 20 20 20 20 20 20 6e 53 65  vel;.        nSe
28850 67 20 3d 20 6e 48 69 6e 74 53 65 67 3b 0a 20 20  g = nHintSeg;.  
28860 20 20 20 20 20 20 62 55 73 65 48 69 6e 74 20 3d        bUseHint =
28870 20 31 3b 0a 20 20 20 20 20 20 20 20 62 44 69 72   1;.        bDir
28880 74 79 48 69 6e 74 20 3d 20 31 3b 0a 20 20 20 20  tyHint = 1;.    
28890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
288a0 20 2f 2a 20 54 68 69 73 20 75 6e 64 6f 65 73 20   /* This undoes 
288b0 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68  the effect of th
288c0 65 20 48 69 6e 74 50 6f 70 28 29 20 61 62 6f 76  e HintPop() abov
288d0 65 20 2d 20 73 6f 20 74 68 61 74 20 6e 6f 20 65  e - so that no e
288e0 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  ntry.        ** 
288f0 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
28900 74 68 65 20 68 69 6e 74 20 62 6c 6f 62 2e 20 20  the hint blob.  
28910 2a 2f 0a 20 20 20 20 20 20 20 20 68 69 6e 74 2e  */.        hint.
28920 6e 20 3d 20 6e 48 69 6e 74 3b 0a 20 20 20 20 20  n = nHint;.     
28930 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
28940 20 49 66 20 6e 53 65 67 20 69 73 20 6c 65 73 73   If nSeg is less
28950 20 74 68 61 74 20 7a 65 72 6f 2c 20 74 68 65 6e   that zero, then
28960 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 65 76   there is no lev
28970 65 6c 20 77 69 74 68 20 61 74 20 6c 65 61 73 74  el with at least
28980 0a 20 20 20 20 2a 2a 20 6e 4d 69 6e 20 73 65 67  .    ** nMin seg
28990 6d 65 6e 74 73 20 61 6e 64 20 6e 6f 20 68 69 6e  ments and no hin
289a0 74 20 69 6e 20 74 68 65 20 25 5f 73 74 61 74 20  t in the %_stat 
289b0 74 61 62 6c 65 2e 20 4e 6f 20 77 6f 72 6b 20 74  table. No work t
289c0 6f 20 64 6f 2e 0a 20 20 20 20 2a 2a 20 45 78 69  o do..    ** Exi
289d0 74 20 65 61 72 6c 79 20 69 6e 20 74 68 69 73 20  t early in this 
289e0 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  case.  */.    if
289f0 28 20 6e 53 65 67 3c 30 20 29 20 62 72 65 61 6b  ( nSeg<0 ) break
28a00 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61  ;..    /* Open a
28a10 20 63 75 72 73 6f 72 20 74 6f 20 69 74 65 72 61   cursor to itera
28a20 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 63  te through the c
28a30 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6f  ontents of the o
28a40 6c 64 65 73 74 20 6e 53 65 67 20 0a 20 20 20 20  ldest nSeg .    
28a50 2a 2a 20 69 6e 64 65 78 65 73 20 6f 66 20 61 62  ** indexes of ab
28a60 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 69 41 62  solute level iAb
28a70 73 4c 65 76 65 6c 2e 20 49 66 20 74 68 69 73 20  sLevel. If this 
28a80 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 65 64  cursor is opened
28a90 20 75 73 69 6e 67 20 0a 20 20 20 20 2a 2a 20 74   using .    ** t
28aa0 68 65 20 27 68 69 6e 74 27 20 70 61 72 61 6d 65  he 'hint' parame
28ab0 74 65 72 73 2c 20 69 74 20 69 73 20 70 6f 73 73  ters, it is poss
28ac0 69 62 6c 65 20 74 68 61 74 20 74 68 65 72 65 20  ible that there 
28ad0 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 6e 53  are less than nS
28ae0 65 67 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e  eg.    ** segmen
28af0 74 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ts available in 
28b00 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c 2e  level iAbsLevel.
28b10 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 6e   In this case, n
28b20 6f 20 77 6f 72 6b 20 69 73 0a 20 20 20 20 2a 2a  o work is.    **
28b30 20 64 6f 6e 65 20 6f 6e 20 69 41 62 73 4c 65 76   done on iAbsLev
28b40 65 6c 20 2d 20 66 61 6c 6c 20 74 68 72 6f 75 67  el - fall throug
28b50 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74  h to the next it
28b60 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  eration of the l
28b70 6f 6f 70 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73  oop .    ** to s
28b80 74 61 72 74 20 77 6f 72 6b 20 6f 6e 20 73 6f 6d  tart work on som
28b90 65 20 6f 74 68 65 72 20 6c 65 76 65 6c 2e 20 20  e other level.  
28ba0 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 57  */.    memset(pW
28bb0 72 69 74 65 72 2c 20 30 2c 20 6e 41 6c 6c 6f 63  riter, 0, nAlloc
28bc0 29 3b 0a 20 20 20 20 70 46 69 6c 74 65 72 2d 3e  );.    pFilter->
28bd0 66 6c 61 67 73 20 3d 20 46 54 53 33 5f 53 45 47  flags = FTS3_SEG
28be0 4d 45 4e 54 5f 52 45 51 55 49 52 45 5f 50 4f 53  MENT_REQUIRE_POS
28bf0 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
28c00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28c10 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72 6d    rc = fts3Incrm
28c20 65 72 67 65 4f 75 74 70 75 74 49 64 78 28 70 2c  ergeOutputIdx(p,
28c30 20 69 41 62 73 4c 65 76 65 6c 2c 20 26 69 49 64   iAbsLevel, &iId
28c40 78 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  x);.      assert
28c50 28 20 62 55 73 65 48 69 6e 74 3d 3d 31 20 7c 7c  ( bUseHint==1 ||
28c60 20 62 55 73 65 48 69 6e 74 3d 3d 30 20 29 3b 0a   bUseHint==0 );.
28c70 20 20 20 20 20 20 69 66 28 20 69 49 64 78 3d 3d        if( iIdx==
28c80 30 20 7c 7c 20 28 62 55 73 65 48 69 6e 74 20 26  0 || (bUseHint &
28c90 26 20 69 49 64 78 3d 3d 31 29 20 29 7b 0a 20 20  & iIdx==1) ){.  
28ca0 20 20 20 20 20 20 69 6e 74 20 62 49 67 6e 6f 72        int bIgnor
28cb0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  e = 0;.        r
28cc0 63 20 3d 20 66 74 73 33 53 65 67 6d 65 6e 74 49  c = fts3SegmentI
28cd0 73 4d 61 78 4c 65 76 65 6c 28 70 2c 20 69 41 62  sMaxLevel(p, iAb
28ce0 73 4c 65 76 65 6c 2b 31 2c 20 26 62 49 67 6e 6f  sLevel+1, &bIgno
28cf0 72 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  re);.        if(
28d00 20 62 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20   bIgnore ){.    
28d10 20 20 20 20 20 20 70 46 69 6c 74 65 72 2d 3e 66        pFilter->f
28d20 6c 61 67 73 20 7c 3d 20 46 54 53 33 5f 53 45 47  lags |= FTS3_SEG
28d30 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d 50 54  MENT_IGNORE_EMPT
28d40 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  Y;.        }.   
28d50 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
28d60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28d70 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
28d80 66 74 73 33 49 6e 63 72 6d 65 72 67 65 43 73 72  fts3IncrmergeCsr
28d90 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 2c 20 6e  (p, iAbsLevel, n
28da0 53 65 67 2c 20 70 43 73 72 29 3b 0a 20 20 20 20  Seg, pCsr);.    
28db0 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  }.    if( SQLITE
28dc0 5f 4f 4b 3d 3d 72 63 20 26 26 20 70 43 73 72 2d  _OK==rc && pCsr-
28dd0 3e 6e 53 65 67 6d 65 6e 74 3d 3d 6e 53 65 67 0a  >nSegment==nSeg.
28de0 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f       && SQLITE_O
28df0 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K==(rc = sqlite3
28e00 46 74 73 33 53 65 67 52 65 61 64 65 72 53 74 61  Fts3SegReaderSta
28e10 72 74 28 70 2c 20 70 43 73 72 2c 20 70 46 69 6c  rt(p, pCsr, pFil
28e20 74 65 72 29 29 0a 20 20 20 20 20 26 26 20 53 51  ter)).     && SQ
28e30 4c 49 54 45 5f 52 4f 57 3d 3d 28 72 63 20 3d 20  LITE_ROW==(rc = 
28e40 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
28e50 61 64 65 72 53 74 65 70 28 70 2c 20 70 43 73 72  aderStep(p, pCsr
28e60 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
28e70 69 66 28 20 62 55 73 65 48 69 6e 74 20 26 26 20  if( bUseHint && 
28e80 69 49 64 78 3e 30 20 29 7b 0a 20 20 20 20 20 20  iIdx>0 ){.      
28e90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b    const char *zK
28ea0 65 79 20 3d 20 70 43 73 72 2d 3e 7a 54 65 72 6d  ey = pCsr->zTerm
28eb0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4b  ;.        int nK
28ec0 65 79 20 3d 20 70 43 73 72 2d 3e 6e 54 65 72 6d  ey = pCsr->nTerm
28ed0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  ;.        rc = f
28ee0 74 73 33 49 6e 63 72 6d 65 72 67 65 4c 6f 61 64  ts3IncrmergeLoad
28ef0 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 2c 20 69  (p, iAbsLevel, i
28f00 49 64 78 2d 31 2c 20 7a 4b 65 79 2c 20 6e 4b 65  Idx-1, zKey, nKe
28f10 79 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  y, pWriter);.   
28f20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28f30 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72 6d    rc = fts3Incrm
28f40 65 72 67 65 57 72 69 74 65 72 28 70 2c 20 69 41  ergeWriter(p, iA
28f50 62 73 4c 65 76 65 6c 2c 20 69 49 64 78 2c 20 70  bsLevel, iIdx, p
28f60 43 73 72 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  Csr, pWriter);. 
28f70 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
28f80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28f90 26 26 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61  && pWriter->nLea
28fa0 66 45 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  fEst ){.        
28fb0 66 74 73 33 4c 6f 67 4d 65 72 67 65 28 6e 53 65  fts3LogMerge(nSe
28fc0 67 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20  g, iAbsLevel);. 
28fd0 20 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20         do {.    
28fe0 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 49        rc = fts3I
28ff0 6e 63 72 6d 65 72 67 65 41 70 70 65 6e 64 28 70  ncrmergeAppend(p
29000 2c 20 70 57 72 69 74 65 72 2c 20 70 43 73 72 29  , pWriter, pCsr)
29010 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29020 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
29030 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
29040 53 65 67 52 65 61 64 65 72 53 74 65 70 28 70 2c  SegReaderStep(p,
29050 20 70 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20   pCsr);.        
29060 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 6e    if( pWriter->n
29070 57 6f 72 6b 3e 3d 6e 52 65 6d 20 26 26 20 72 63  Work>=nRem && rc
29080 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 20 72  ==SQLITE_ROW ) r
29090 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
290a0 20 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 72         }while( r
290b0 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 3b  c==SQLITE_ROW );
290c0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 70 64  ..        /* Upd
290d0 61 74 65 20 6f 72 20 64 65 6c 65 74 65 20 74 68  ate or delete th
290e0 65 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73  e input segments
290f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
29100 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
29110 0a 20 20 20 20 20 20 20 20 20 20 6e 52 65 6d 20  .          nRem 
29120 2d 3d 20 28 31 20 2b 20 70 57 72 69 74 65 72 2d  -= (1 + pWriter-
29130 3e 6e 57 6f 72 6b 29 3b 0a 20 20 20 20 20 20 20  >nWork);.       
29140 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72     rc = fts3Incr
29150 6d 65 72 67 65 43 68 6f 6d 70 28 70 2c 20 69 41  mergeChomp(p, iA
29160 62 73 4c 65 76 65 6c 2c 20 70 43 73 72 2c 20 26  bsLevel, pCsr, &
29170 6e 53 65 67 29 3b 0a 20 20 20 20 20 20 20 20 20  nSeg);.         
29180 20 69 66 28 20 6e 53 65 67 21 3d 30 20 29 7b 0a   if( nSeg!=0 ){.
29190 20 20 20 20 20 20 20 20 20 20 20 20 62 44 69 72              bDir
291a0 74 79 48 69 6e 74 20 3d 20 31 3b 0a 20 20 20 20  tyHint = 1;.    
291b0 20 20 20 20 20 20 20 20 66 74 73 33 49 6e 63 72          fts3Incr
291c0 6d 65 72 67 65 48 69 6e 74 50 75 73 68 28 26 68  mergeHintPush(&h
291d0 69 6e 74 2c 20 69 41 62 73 4c 65 76 65 6c 2c 20  int, iAbsLevel, 
291e0 6e 53 65 67 2c 20 26 72 63 29 3b 0a 20 20 20 20  nSeg, &rc);.    
291f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29200 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
29210 20 69 66 28 20 6e 53 65 67 21 3d 30 20 29 7b 0a   if( nSeg!=0 ){.
29220 20 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d          pWriter-
29230 3e 6e 4c 65 61 66 44 61 74 61 20 3d 20 70 57 72  >nLeafData = pWr
29240 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61 74 61 20  iter->nLeafData 
29250 2a 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  * -1;.      }.  
29260 20 20 20 20 66 74 73 33 49 6e 63 72 6d 65 72 67      fts3Incrmerg
29270 65 52 65 6c 65 61 73 65 28 70 2c 20 70 57 72 69  eRelease(p, pWri
29280 74 65 72 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  ter, &rc);.     
29290 20 69 66 28 20 6e 53 65 67 3d 3d 30 20 26 26 20   if( nSeg==0 && 
292a0 70 57 72 69 74 65 72 2d 3e 62 4e 6f 4c 65 61 66  pWriter->bNoLeaf
292b0 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Data==0 ){.     
292c0 20 20 20 66 74 73 33 50 72 6f 6d 6f 74 65 53 65     fts3PromoteSe
292d0 67 6d 65 6e 74 73 28 70 2c 20 69 41 62 73 4c 65  gments(p, iAbsLe
292e0 76 65 6c 2b 31 2c 20 70 57 72 69 74 65 72 2d 3e  vel+1, pWriter->
292f0 6e 4c 65 61 66 44 61 74 61 29 3b 0a 20 20 20 20  nLeafData);.    
29300 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73    }.    }..    s
29310 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61  qlite3Fts3SegRea
29320 64 65 72 46 69 6e 69 73 68 28 70 43 73 72 29 3b  derFinish(pCsr);
29330 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65  .  }..  /* Write
29340 20 74 68 65 20 68 69 6e 74 20 76 61 6c 75 65 73   the hint values
29350 20 69 6e 74 6f 20 74 68 65 20 25 5f 73 74 61 74   into the %_stat
29360 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6e   table for the n
29370 65 78 74 20 69 6e 63 72 2d 6d 65 72 67 65 72 20  ext incr-merger 
29380 2a 2f 0a 20 20 69 66 28 20 62 44 69 72 74 79 48  */.  if( bDirtyH
29390 69 6e 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  int && rc==SQLIT
293a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
293b0 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 48 69   fts3IncrmergeHi
293c0 6e 74 53 74 6f 72 65 28 70 2c 20 26 68 69 6e 74  ntStore(p, &hint
293d0 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
293e0 33 5f 66 72 65 65 28 70 57 72 69 74 65 72 29 3b  3_free(pWriter);
293f0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
29400 68 69 6e 74 2e 61 29 3b 0a 20 20 72 65 74 75 72  hint.a);.  retur
29410 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
29420 6f 6e 76 65 72 74 20 74 68 65 20 74 65 78 74 20  onvert the text 
29430 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 2a 70 7a  beginning at *pz
29440 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65 72   into an integer
29450 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 69   and return.** i
29460 74 73 20 76 61 6c 75 65 2e 20 20 41 64 76 61 6e  ts value.  Advan
29470 63 65 20 2a 70 7a 20 74 6f 20 70 6f 69 6e 74 20  ce *pz to point 
29480 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 68 61  to the first cha
29490 72 61 63 74 65 72 20 70 61 73 74 0a 2a 2a 20 74  racter past.** t
294a0 68 65 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73  he integer..*/.s
294b0 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 47 65  tatic int fts3Ge
294c0 74 69 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20  tint(const char 
294d0 2a 2a 70 7a 29 7b 0a 20 20 63 6f 6e 73 74 20 63  **pz){.  const c
294e0 68 61 72 20 2a 7a 20 3d 20 2a 70 7a 3b 0a 20 20  har *z = *pz;.  
294f0 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 77 68 69  int i = 0;.  whi
29500 6c 65 28 20 28 2a 7a 29 3e 3d 27 30 27 20 26 26  le( (*z)>='0' &&
29510 20 28 2a 7a 29 3c 3d 27 39 27 20 29 20 69 20 3d   (*z)<='9' ) i =
29520 20 31 30 2a 69 20 2b 20 2a 28 7a 2b 2b 29 20 2d   10*i + *(z++) -
29530 20 27 30 27 3b 0a 20 20 2a 70 7a 20 3d 20 7a 3b   '0';.  *pz = z;
29540 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a  .  return i;.}..
29550 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 73 74  /*.** Process st
29560 61 74 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  atements of the 
29570 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49  form:.**.**    I
29580 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 62 6c 65  NSERT INTO table
29590 28 74 61 62 6c 65 29 20 56 41 4c 55 45 53 28 27  (table) VALUES('
295a0 6d 65 72 67 65 3d 41 2c 42 27 29 3b 0a 2a 2a 0a  merge=A,B');.**.
295b0 2a 2a 20 41 20 61 6e 64 20 42 20 61 72 65 20 69  ** A and B are i
295c0 6e 74 65 67 65 72 73 20 74 68 61 74 20 64 65 63  ntegers that dec
295d0 6f 64 65 20 74 6f 20 62 65 20 74 68 65 20 6e 75  ode to be the nu
295e0 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67  mber of leaf pag
295f0 65 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 66 6f  es.** written fo
29600 72 20 74 68 65 20 6d 65 72 67 65 2c 20 61 6e 64  r the merge, and
29610 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6e 75 6d   the minimum num
29620 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
29630 6f 6e 20 61 20 6c 65 76 65 6c 0a 2a 2a 20 62 65  on a level.** be
29640 66 6f 72 65 20 69 74 20 77 69 6c 6c 20 62 65 20  fore it will be 
29650 73 65 6c 65 63 74 65 64 20 66 6f 72 20 61 20 6d  selected for a m
29660 65 72 67 65 2c 20 72 65 73 70 65 63 74 69 76 65  erge, respective
29670 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
29680 74 20 66 74 73 33 44 6f 49 6e 63 72 6d 65 72 67  t fts3DoIncrmerg
29690 65 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  e(.  Fts3Table *
296a0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
296b0 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74 61 62       /* FTS3 tab
296c0 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  le handle */.  c
296d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61  onst char *zPara
296e0 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m              /
296f0 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  * Nul-terminated
29700 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
29710 6e 67 20 22 41 2c 42 22 20 2a 2f 0a 29 7b 0a 20  ng "A,B" */.){. 
29720 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
29730 4d 69 6e 20 3d 20 28 46 54 53 33 5f 4d 45 52 47  Min = (FTS3_MERG
29740 45 5f 43 4f 55 4e 54 20 2f 20 32 29 3b 0a 20 20  E_COUNT / 2);.  
29750 69 6e 74 20 6e 4d 65 72 67 65 20 3d 20 30 3b 0a  int nMerge = 0;.
29760 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
29770 3d 20 7a 50 61 72 61 6d 3b 0a 0a 20 20 2f 2a 20  = zParam;..  /* 
29780 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 69  Read the first i
29790 6e 74 65 67 65 72 20 76 61 6c 75 65 20 2a 2f 0a  nteger value */.
297a0 20 20 6e 4d 65 72 67 65 20 3d 20 66 74 73 33 47    nMerge = fts3G
297b0 65 74 69 6e 74 28 26 7a 29 3b 0a 0a 20 20 2f 2a  etint(&z);..  /*
297c0 20 49 66 20 74 68 65 20 66 69 72 73 74 20 69 6e   If the first in
297d0 74 65 67 65 72 20 76 61 6c 75 65 20 69 73 20 66  teger value is f
297e0 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 27 2c 27  ollowed by a ','
297f0 2c 20 20 72 65 61 64 20 74 68 65 20 73 65 63 6f  ,  read the seco
29800 6e 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20  nd.  ** integer 
29810 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 69 66 28 20  value. */.  if( 
29820 7a 5b 30 5d 3d 3d 27 2c 27 20 26 26 20 7a 5b 31  z[0]==',' && z[1
29830 5d 21 3d 27 5c 30 27 20 29 7b 0a 20 20 20 20 7a  ]!='\0' ){.    z
29840 2b 2b 3b 0a 20 20 20 20 6e 4d 69 6e 20 3d 20 66  ++;.    nMin = f
29850 74 73 33 47 65 74 69 6e 74 28 26 7a 29 3b 0a 20  ts3Getint(&z);. 
29860 20 7d 0a 0a 20 20 69 66 28 20 7a 5b 30 5d 21 3d   }..  if( z[0]!=
29870 27 5c 30 27 20 7c 7c 20 6e 4d 69 6e 3c 32 20 29  '\0' || nMin<2 )
29880 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
29890 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65  E_ERROR;.  }else
298a0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
298b0 45 5f 4f 4b 3b 0a 20 20 20 20 69 66 28 20 21 70  E_OK;.    if( !p
298c0 2d 3e 62 48 61 73 53 74 61 74 20 29 7b 0a 20 20  ->bHasStat ){.  
298d0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62      assert( p->b
298e0 46 74 73 34 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Fts4==0 );.     
298f0 20 73 71 6c 69 74 65 33 46 74 73 33 43 72 65 61   sqlite3Fts3Crea
29900 74 65 53 74 61 74 54 61 62 6c 65 28 26 72 63 2c  teStatTable(&rc,
29910 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   p);.    }.    i
29920 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
29930 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
29940 71 6c 69 74 65 33 46 74 73 33 49 6e 63 72 6d 65  qlite3Fts3Incrme
29950 72 67 65 28 70 2c 20 6e 4d 65 72 67 65 2c 20 6e  rge(p, nMerge, n
29960 4d 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Min);.    }.    
29970 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 6d 65  sqlite3Fts3Segme
29980 6e 74 73 43 6c 6f 73 65 28 70 29 3b 0a 20 20 7d  ntsClose(p);.  }
29990 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
299a0 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 73  ./*.** Process s
299b0 74 61 74 65 6d 65 6e 74 73 20 6f 66 20 74 68 65  tatements of the
299c0 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
299d0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 62 6c  INSERT INTO tabl
299e0 65 28 74 61 62 6c 65 29 20 56 41 4c 55 45 53 28  e(table) VALUES(
299f0 27 61 75 74 6f 6d 65 72 67 65 3d 58 27 29 3b 0a  'automerge=X');.
29a00 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73  **.** where X is
29a10 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 58 3d   an integer.  X=
29a20 3d 30 20 6d 65 61 6e 73 20 74 6f 20 74 75 72 6e  =0 means to turn
29a30 20 61 75 74 6f 6d 65 72 67 65 20 6f 66 66 2e 20   automerge off. 
29a40 20 58 21 3d 30 20 6d 65 61 6e 73 0a 2a 2a 20 74   X!=0 means.** t
29a50 75 72 6e 20 69 74 20 6f 6e 2e 20 20 54 68 65 20  urn it on.  The 
29a60 73 65 74 74 69 6e 67 20 69 73 20 70 65 72 73 69  setting is persi
29a70 73 74 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  stent..*/.static
29a80 20 69 6e 74 20 66 74 73 33 44 6f 41 75 74 6f 69   int fts3DoAutoi
29a90 6e 63 72 6d 65 72 67 65 28 0a 20 20 46 74 73 33  ncrmerge(.  Fts3
29aa0 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
29ab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
29ac0 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  TS3 table handle
29ad0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
29ae0 20 2a 7a 50 61 72 61 6d 20 20 20 20 20 20 20 20   *zParam        
29af0 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72        /* Nul-ter
29b00 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 63  minated string c
29b10 6f 6e 74 61 69 6e 69 6e 67 20 62 6f 6f 6c 65 61  ontaining boolea
29b20 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  n */.){.  int rc
29b30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
29b40 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
29b50 74 6d 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 41  tmt = 0;.  p->nA
29b60 75 74 6f 69 6e 63 72 6d 65 72 67 65 20 3d 20 66  utoincrmerge = f
29b70 74 73 33 47 65 74 69 6e 74 28 26 7a 50 61 72 61  ts3Getint(&zPara
29b80 6d 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 41 75  m);.  if( p->nAu
29b90 74 6f 69 6e 63 72 6d 65 72 67 65 3d 3d 31 20 7c  toincrmerge==1 |
29ba0 7c 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d 65  | p->nAutoincrme
29bb0 72 67 65 3e 46 54 53 33 5f 4d 45 52 47 45 5f 43  rge>FTS3_MERGE_C
29bc0 4f 55 4e 54 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  OUNT ){.    p->n
29bd0 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 20 3d 20  Autoincrmerge = 
29be0 38 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 2d  8;.  }.  if( !p-
29bf0 3e 62 48 61 73 53 74 61 74 20 29 7b 0a 20 20 20  >bHasStat ){.   
29c00 20 61 73 73 65 72 74 28 20 70 2d 3e 62 46 74 73   assert( p->bFts
29c10 34 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  4==0 );.    sqli
29c20 74 65 33 46 74 73 33 43 72 65 61 74 65 53 74 61  te3Fts3CreateSta
29c30 74 54 61 62 6c 65 28 26 72 63 2c 20 70 29 3b 0a  tTable(&rc, p);.
29c40 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
29c50 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 63  urn rc;.  }.  rc
29c60 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70   = fts3SqlStmt(p
29c70 2c 20 53 51 4c 5f 52 45 50 4c 41 43 45 5f 53 54  , SQL_REPLACE_ST
29c80 41 54 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  AT, &pStmt, 0);.
29c90 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
29ca0 6e 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  n rc;.  sqlite3_
29cb0 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20  bind_int(pStmt, 
29cc0 31 2c 20 46 54 53 5f 53 54 41 54 5f 41 55 54 4f  1, FTS_STAT_AUTO
29cd0 49 4e 43 52 4d 45 52 47 45 29 3b 0a 20 20 73 71  INCRMERGE);.  sq
29ce0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
29cf0 53 74 6d 74 2c 20 32 2c 20 70 2d 3e 6e 41 75 74  Stmt, 2, p->nAut
29d00 6f 69 6e 63 72 6d 65 72 67 65 29 3b 0a 20 20 73  oincrmerge);.  s
29d10 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
29d20 74 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  t);.  rc = sqlit
29d30 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
29d40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
29d50 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
29d60 36 34 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20  64-bit checksum 
29d70 66 6f 72 20 74 68 65 20 46 54 53 20 69 6e 64 65  for the FTS inde
29d80 78 20 65 6e 74 72 79 20 73 70 65 63 69 66 69 65  x entry specifie
29d90 64 20 62 79 20 74 68 65 0a 2a 2a 20 61 72 67 75  d by the.** argu
29da0 6d 65 6e 74 73 20 74 6f 20 74 68 69 73 20 66 75  ments to this fu
29db0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
29dc0 63 20 75 36 34 20 66 74 73 33 43 68 65 63 6b 73  c u64 fts3Checks
29dd0 75 6d 45 6e 74 72 79 28 0a 20 20 63 6f 6e 73 74  umEntry(.  const
29de0 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20   char *zTerm,   
29df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
29e00 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
29e10 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d 20  containing term 
29e20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20  */.  int nTerm, 
29e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e40 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
29e50 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a  zTerm in bytes *
29e60 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c  /.  int iLangid,
29e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e80 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20      /* Language 
29e90 69 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20 72  id for current r
29ea0 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64  ow */.  int iInd
29eb0 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ex,             
29ec0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
29ed0 20 28 30 2e 2e 46 74 73 33 54 61 62 6c 65 2e 6e   (0..Fts3Table.n
29ee0 49 6e 64 65 78 2d 31 29 20 2a 2f 0a 20 20 69 36  Index-1) */.  i6
29ef0 34 20 69 44 6f 63 69 64 2c 20 20 20 20 20 20 20  4 iDocid,       
29f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29f10 20 44 6f 63 69 64 20 66 6f 72 20 63 75 72 72 65   Docid for curre
29f20 6e 74 20 72 6f 77 2e 20 2a 2f 0a 20 20 69 6e 74  nt row. */.  int
29f30 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   iCol,          
29f40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29f50 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 2a 2f  Column number */
29f60 0a 20 20 69 6e 74 20 69 50 6f 73 20 20 20 20 20  .  int iPos     
29f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f80 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 2a     /* Position *
29f90 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
29fa0 75 36 34 20 72 65 74 20 3d 20 28 75 36 34 29 69  u64 ret = (u64)i
29fb0 44 6f 63 69 64 3b 0a 0a 20 20 72 65 74 20 2b 3d  Docid;..  ret +=
29fc0 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 4c 61 6e   (ret<<3) + iLan
29fd0 67 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72  gid;.  ret += (r
29fe0 65 74 3c 3c 33 29 20 2b 20 69 49 6e 64 65 78 3b  et<<3) + iIndex;
29ff0 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c  .  ret += (ret<<
2a000 33 29 20 2b 20 69 43 6f 6c 3b 0a 20 20 72 65 74  3) + iCol;.  ret
2a010 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 69   += (ret<<3) + i
2a020 50 6f 73 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Pos;.  for(i=0; 
2a030 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 20 72 65  i<nTerm; i++) re
2a040 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20  t += (ret<<3) + 
2a050 7a 54 65 72 6d 5b 69 5d 3b 0a 0a 20 20 72 65 74  zTerm[i];..  ret
2a060 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn ret;.}../*.*
2a070 2a 20 52 65 74 75 72 6e 20 61 20 63 68 65 63 6b  * Return a check
2a080 73 75 6d 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69  sum of all entri
2a090 65 73 20 69 6e 20 74 68 65 20 46 54 53 20 69 6e  es in the FTS in
2a0a0 64 65 78 20 74 68 61 74 20 63 6f 72 72 65 73 70  dex that corresp
2a0b0 6f 6e 64 20 74 6f 0a 2a 2a 20 6c 61 6e 67 75 61  ond to.** langua
2a0c0 67 65 20 69 64 20 69 4c 61 6e 67 69 64 2e 20 54  ge id iLangid. T
2a0d0 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 63  he checksum is c
2a0e0 61 6c 63 75 6c 61 74 65 64 20 62 79 20 58 4f 52  alculated by XOR
2a0f0 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ing the checksum
2a100 73 0a 2a 2a 20 6f 66 20 65 61 63 68 20 69 6e 64  s.** of each ind
2a110 69 76 69 64 75 61 6c 20 65 6e 74 72 79 20 28 73  ividual entry (s
2a120 65 65 20 66 74 73 33 43 68 65 63 6b 73 75 6d 45  ee fts3ChecksumE
2a130 6e 74 72 79 28 29 29 20 74 6f 67 65 74 68 65 72  ntry()) together
2a140 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
2a150 73 73 66 75 6c 2c 20 74 68 65 20 63 68 65 63 6b  ssful, the check
2a160 73 75 6d 20 76 61 6c 75 65 20 69 73 20 72 65 74  sum value is ret
2a170 75 72 6e 65 64 20 61 6e 64 20 2a 70 52 63 20 73  urned and *pRc s
2a180 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e  et to SQLITE_OK.
2a190 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
2a1a0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2a1b0 73 2c 20 2a 70 52 63 20 69 73 20 73 65 74 20 74  s, *pRc is set t
2a1c0 6f 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  o an SQLite erro
2a1d0 72 20 63 6f 64 65 2e 20 54 68 65 0a 2a 2a 20 72  r code. The.** r
2a1e0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 75  eturn value is u
2a1f0 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73  ndefined in this
2a200 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   case..*/.static
2a210 20 75 36 34 20 66 74 73 33 43 68 65 63 6b 73 75   u64 fts3Checksu
2a220 6d 49 6e 64 65 78 28 0a 20 20 46 74 73 33 54 61  mIndex(.  Fts3Ta
2a230 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
2a240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
2a250 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  3 table handle *
2a260 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c  /.  int iLangid,
2a270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a280 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20      /* Language 
2a290 69 64 20 74 6f 20 72 65 74 75 72 6e 20 63 6b 73  id to return cks
2a2a0 75 6d 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  um for */.  int 
2a2b0 69 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20  iIndex,         
2a2c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2a2d0 6e 64 65 78 20 74 6f 20 63 6b 73 75 6d 20 28 30  ndex to cksum (0
2a2e0 2e 2e 70 2d 3e 6e 49 6e 64 65 78 2d 31 29 20 2a  ..p->nIndex-1) *
2a2f0 2f 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20  /.  int *pRc    
2a300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a310 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75      /* OUT: Retu
2a320 72 6e 20 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20  rn code */.){.  
2a330 46 74 73 33 53 65 67 46 69 6c 74 65 72 20 66 69  Fts3SegFilter fi
2a340 6c 74 65 72 3b 0a 20 20 46 74 73 33 4d 75 6c 74  lter;.  Fts3Mult
2a350 69 53 65 67 52 65 61 64 65 72 20 63 73 72 3b 0a  iSegReader csr;.
2a360 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 36 34 20    int rc;.  u64 
2a370 63 6b 73 75 6d 20 3d 20 30 3b 0a 0a 20 20 61 73  cksum = 0;..  as
2a380 73 65 72 74 28 20 2a 70 52 63 3d 3d 53 51 4c 49  sert( *pRc==SQLI
2a390 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 6d 65 6d 73  TE_OK );..  mems
2a3a0 65 74 28 26 66 69 6c 74 65 72 2c 20 30 2c 20 73  et(&filter, 0, s
2a3b0 69 7a 65 6f 66 28 66 69 6c 74 65 72 29 29 3b 0a  izeof(filter));.
2a3c0 20 20 6d 65 6d 73 65 74 28 26 63 73 72 2c 20 30    memset(&csr, 0
2a3d0 2c 20 73 69 7a 65 6f 66 28 63 73 72 29 29 3b 0a  , sizeof(csr));.
2a3e0 20 20 66 69 6c 74 65 72 2e 66 6c 61 67 73 20 3d    filter.flags =
2a3f0 20 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 52    FTS3_SEGMENT_R
2a400 45 51 55 49 52 45 5f 50 4f 53 7c 46 54 53 33 5f  EQUIRE_POS|FTS3_
2a410 53 45 47 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f 45  SEGMENT_IGNORE_E
2a420 4d 50 54 59 3b 0a 20 20 66 69 6c 74 65 72 2e 66  MPTY;.  filter.f
2a430 6c 61 67 73 20 7c 3d 20 46 54 53 33 5f 53 45 47  lags |= FTS3_SEG
2a440 4d 45 4e 54 5f 53 43 41 4e 3b 0a 0a 20 20 72 63  MENT_SCAN;..  rc
2a450 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53 65   = sqlite3Fts3Se
2a460 67 52 65 61 64 65 72 43 75 72 73 6f 72 28 0a 20  gReaderCursor(. 
2a470 20 20 20 20 20 70 2c 20 69 4c 61 6e 67 69 64 2c       p, iLangid,
2a480 20 69 49 6e 64 65 78 2c 20 46 54 53 33 5f 53 45   iIndex, FTS3_SE
2a490 47 43 55 52 53 4f 52 5f 41 4c 4c 2c 20 30 2c 20  GCURSOR_ALL, 0, 
2a4a0 30 2c 20 30 2c 20 31 2c 26 63 73 72 0a 20 20 29  0, 0, 1,&csr.  )
2a4b0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2a4c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
2a4d0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67  = sqlite3Fts3Seg
2a4e0 52 65 61 64 65 72 53 74 61 72 74 28 70 2c 20 26  ReaderStart(p, &
2a4f0 63 73 72 2c 20 26 66 69 6c 74 65 72 29 3b 0a 20  csr, &filter);. 
2a500 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
2a510 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 77  LITE_OK ){.    w
2a520 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57  hile( SQLITE_ROW
2a530 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 46  ==(rc = sqlite3F
2a540 74 73 33 53 65 67 52 65 61 64 65 72 53 74 65 70  ts3SegReaderStep
2a550 28 70 2c 20 26 63 73 72 29 29 20 29 7b 0a 20 20  (p, &csr)) ){.  
2a560 20 20 20 20 63 68 61 72 20 2a 70 43 73 72 20 3d      char *pCsr =
2a570 20 63 73 72 2e 61 44 6f 63 6c 69 73 74 3b 0a 20   csr.aDoclist;. 
2a580 20 20 20 20 20 63 68 61 72 20 2a 70 45 6e 64 20       char *pEnd 
2a590 3d 20 26 70 43 73 72 5b 63 73 72 2e 6e 44 6f 63  = &pCsr[csr.nDoc
2a5a0 6c 69 73 74 5d 3b 0a 0a 20 20 20 20 20 20 69 36  list];..      i6
2a5b0 34 20 69 44 6f 63 69 64 20 3d 20 30 3b 0a 20 20  4 iDocid = 0;.  
2a5c0 20 20 20 20 69 36 34 20 69 43 6f 6c 20 3d 20 30      i64 iCol = 0
2a5d0 3b 0a 20 20 20 20 20 20 69 36 34 20 69 50 6f 73  ;.      i64 iPos
2a5e0 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 70 43 73   = 0;..      pCs
2a5f0 72 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  r += sqlite3Fts3
2a600 47 65 74 56 61 72 69 6e 74 28 70 43 73 72 2c 20  GetVarint(pCsr, 
2a610 26 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 20 20  &iDocid);.      
2a620 77 68 69 6c 65 28 20 70 43 73 72 3c 70 45 6e 64  while( pCsr<pEnd
2a630 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20   ){.        i64 
2a640 69 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  iVal = 0;.      
2a650 20 20 70 43 73 72 20 2b 3d 20 73 71 6c 69 74 65    pCsr += sqlite
2a660 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 70  3Fts3GetVarint(p
2a670 43 73 72 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20  Csr, &iVal);.   
2a680 20 20 20 20 20 69 66 28 20 70 43 73 72 3c 70 45       if( pCsr<pE
2a690 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nd ){.          
2a6a0 69 66 28 20 69 56 61 6c 3d 3d 30 20 7c 7c 20 69  if( iVal==0 || i
2a6b0 56 61 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Val==1 ){.      
2a6c0 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 30 3b 0a        iCol = 0;.
2a6d0 20 20 20 20 20 20 20 20 20 20 20 20 69 50 6f 73              iPos
2a6e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2a6f0 20 20 69 66 28 20 69 56 61 6c 20 29 7b 0a 20 20    if( iVal ){.  
2a700 20 20 20 20 20 20 20 20 20 20 20 20 70 43 73 72              pCsr
2a710 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47   += sqlite3Fts3G
2a720 65 74 56 61 72 69 6e 74 28 70 43 73 72 2c 20 26  etVarint(pCsr, &
2a730 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  iCol);.         
2a740 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a750 20 20 20 20 20 20 20 20 70 43 73 72 20 2b 3d 20          pCsr += 
2a760 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61  sqlite3Fts3GetVa
2a770 72 69 6e 74 28 70 43 73 72 2c 20 26 69 56 61 6c  rint(pCsr, &iVal
2a780 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2a790 20 69 44 6f 63 69 64 20 2b 3d 20 69 56 61 6c 3b   iDocid += iVal;
2a7a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2a7b0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2a7c0 20 20 20 20 20 20 20 20 20 20 20 20 69 50 6f 73              iPos
2a7d0 20 2b 3d 20 28 69 56 61 6c 20 2d 20 32 29 3b 0a   += (iVal - 2);.
2a7e0 20 20 20 20 20 20 20 20 20 20 20 20 63 6b 73 75              cksu
2a7f0 6d 20 3d 20 63 6b 73 75 6d 20 5e 20 66 74 73 33  m = cksum ^ fts3
2a800 43 68 65 63 6b 73 75 6d 45 6e 74 72 79 28 0a 20  ChecksumEntry(. 
2a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2a820 73 72 2e 7a 54 65 72 6d 2c 20 63 73 72 2e 6e 54  sr.zTerm, csr.nT
2a830 65 72 6d 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49  erm, iLangid, iI
2a840 6e 64 65 78 2c 20 69 44 6f 63 69 64 2c 0a 20 20  ndex, iDocid,.  
2a850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
2a860 6e 74 29 69 43 6f 6c 2c 20 28 69 6e 74 29 69 50  nt)iCol, (int)iP
2a870 6f 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  os.            )
2a880 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2a890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2a8a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
2a8b0 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72  te3Fts3SegReader
2a8c0 46 69 6e 69 73 68 28 26 63 73 72 29 3b 0a 0a 20  Finish(&csr);.. 
2a8d0 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 72 65   *pRc = rc;.  re
2a8e0 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f  turn cksum;.}../
2a8f0 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68  *.** Check if th
2a900 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2a910 65 20 46 54 53 20 69 6e 64 65 78 20 6d 61 74 63  e FTS index matc
2a920 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  h the current co
2a930 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ntents of the.**
2a940 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e 20   content table. 
2a950 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
2a960 72 73 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65  rs and the conte
2a970 6e 74 73 20 64 6f 20 6d 61 74 63 68 2c 20 73 65  nts do match, se
2a980 74 20 2a 70 62 4f 6b 0a 2a 2a 20 74 6f 20 74 72  t *pbOk.** to tr
2a990 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ue and return SQ
2a9a0 4c 49 54 45 5f 4f 4b 2e 20 4f 72 20 69 66 20 74  LITE_OK. Or if t
2a9b0 68 65 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e  he contents do n
2a9c0 6f 74 20 6d 61 74 63 68 2c 20 73 65 74 20 2a 70  ot match, set *p
2a9d0 62 4f 6b 0a 2a 2a 20 74 6f 20 66 61 6c 73 65 20  bOk.** to false 
2a9e0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2a9f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
2aa00 72 6f 72 20 6f 63 63 75 72 73 20 28 65 2e 67 2e  ror occurs (e.g.
2aa10 20 61 6e 20 4f 4f 4d 20 6f 72 20 49 4f 20 65 72   an OOM or IO er
2aa20 72 6f 72 29 2c 20 72 65 74 75 72 6e 20 61 6e 20  ror), return an 
2aa30 53 51 4c 69 74 65 20 65 72 72 6f 72 20 0a 2a 2a  SQLite error .**
2aa40 20 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c   code. The final
2aa50 20 76 61 6c 75 65 20 6f 66 20 2a 70 62 4f 6b 20   value of *pbOk 
2aa60 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  is undefined in 
2aa70 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74  this case..*/.st
2aa80 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 74  atic int fts3Int
2aa90 65 67 72 69 74 79 43 68 65 63 6b 28 46 74 73 33  egrityCheck(Fts3
2aaa0 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 2a 70  Table *p, int *p
2aab0 62 4f 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  bOk){.  int rc =
2aac0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2aad0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2aae0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 36 34 20  n code */.  u64 
2aaf0 63 6b 73 75 6d 31 20 3d 20 30 3b 20 20 20 20 20  cksum1 = 0;     
2ab00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2ab10 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e  hecksum based on
2ab20 20 46 54 53 20 69 6e 64 65 78 20 63 6f 6e 74 65   FTS index conte
2ab30 6e 74 73 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73  nts */.  u64 cks
2ab40 75 6d 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  um2 = 0;        
2ab50 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
2ab60 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 25 5f  ksum based on %_
2ab70 63 6f 6e 74 65 6e 74 20 63 6f 6e 74 65 6e 74 73  content contents
2ab80 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
2ab90 6d 74 20 2a 70 41 6c 6c 4c 61 6e 67 69 64 20 3d  mt *pAllLangid =
2aba0 20 30 3b 20 20 20 2f 2a 20 53 74 61 74 65 6d 65   0;   /* Stateme
2abb0 6e 74 20 74 6f 20 72 65 74 75 72 6e 20 61 6c 6c  nt to return all
2abc0 20 6c 61 6e 67 75 61 67 65 2d 69 64 73 20 2a 2f   language-ids */
2abd0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63  ..  /* This bloc
2abe0 6b 20 63 61 6c 63 75 6c 61 74 65 73 20 74 68 65  k calculates the
2abf0 20 63 68 65 63 6b 73 75 6d 20 61 63 63 6f 72 64   checksum accord
2ac00 69 6e 67 20 74 6f 20 74 68 65 20 46 54 53 20 69  ing to the FTS i
2ac10 6e 64 65 78 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ndex. */.  rc = 
2ac20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53  fts3SqlStmt(p, S
2ac30 51 4c 5f 53 45 4c 45 43 54 5f 41 4c 4c 5f 4c 41  QL_SELECT_ALL_LA
2ac40 4e 47 49 44 2c 20 26 70 41 6c 6c 4c 61 6e 67 69  NGID, &pAllLangi
2ac50 64 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  d, 0);.  if( rc=
2ac60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ac70 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 73    int rc2;.    s
2ac80 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
2ac90 70 41 6c 6c 4c 61 6e 67 69 64 2c 20 31 2c 20 70  pAllLangid, 1, p
2aca0 2d 3e 69 50 72 65 76 4c 61 6e 67 69 64 29 3b 0a  ->iPrevLangid);.
2acb0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
2acc0 5f 69 6e 74 28 70 41 6c 6c 4c 61 6e 67 69 64 2c  _int(pAllLangid,
2acd0 20 32 2c 20 70 2d 3e 6e 49 6e 64 65 78 29 3b 0a   2, p->nIndex);.
2ace0 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
2acf0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69  QLITE_OK && sqli
2ad00 74 65 33 5f 73 74 65 70 28 70 41 6c 6c 4c 61 6e  te3_step(pAllLan
2ad10 67 69 64 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  gid)==SQLITE_ROW
2ad20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c   ){.      int iL
2ad30 61 6e 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  angid = sqlite3_
2ad40 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 41 6c 6c 4c  column_int(pAllL
2ad50 61 6e 67 69 64 2c 20 30 29 3b 0a 20 20 20 20 20  angid, 0);.     
2ad60 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
2ad70 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 6e 64  r(i=0; i<p->nInd
2ad80 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ex; i++){.      
2ad90 20 20 63 6b 73 75 6d 31 20 3d 20 63 6b 73 75 6d    cksum1 = cksum
2ada0 31 20 5e 20 66 74 73 33 43 68 65 63 6b 73 75 6d  1 ^ fts3Checksum
2adb0 49 6e 64 65 78 28 70 2c 20 69 4c 61 6e 67 69 64  Index(p, iLangid
2adc0 2c 20 69 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  , i, &rc);.     
2add0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 32   }.    }.    rc2
2ade0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
2adf0 28 70 41 6c 6c 4c 61 6e 67 69 64 29 3b 0a 20 20  (pAllLangid);.  
2ae00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ae10 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
2ae20 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62    }..  /* This b
2ae30 6c 6f 63 6b 20 63 61 6c 63 75 6c 61 74 65 73 20  lock calculates 
2ae40 74 68 65 20 63 68 65 63 6b 73 75 6d 20 61 63 63  the checksum acc
2ae50 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 25 5f  ording to the %_
2ae60 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 2a 2f  content table */
2ae70 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2ae80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
2ae90 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f  te3_tokenizer_mo
2aea0 64 75 6c 65 20 63 6f 6e 73 74 20 2a 70 4d 6f 64  dule const *pMod
2aeb0 75 6c 65 20 3d 20 70 2d 3e 70 54 6f 6b 65 6e 69  ule = p->pTokeni
2aec0 7a 65 72 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20  zer->pModule;.  
2aed0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2aee0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 63  pStmt = 0;.    c
2aef0 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 0a 20  har *zSql;.   . 
2af00 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
2af10 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
2af20 54 20 25 73 22 20 2c 20 70 2d 3e 7a 52 65 61 64  T %s" , p->zRead
2af30 45 78 70 72 6c 69 73 74 29 3b 0a 20 20 20 20 69  Exprlist);.    i
2af40 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20  f( !zSql ){.    
2af50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2af60 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
2af70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2af80 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
2af90 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
2afa0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
2afb0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
2afc0 71 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ql);.    }..    
2afd0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
2afe0 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
2aff0 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
2b000 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
2b010 20 69 36 34 20 69 44 6f 63 69 64 20 3d 20 73 71   i64 iDocid = sq
2b020 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
2b030 36 34 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  64(pStmt, 0);.  
2b040 20 20 20 20 69 6e 74 20 69 4c 61 6e 67 20 3d 20      int iLang = 
2b050 6c 61 6e 67 69 64 46 72 6f 6d 53 65 6c 65 63 74  langidFromSelect
2b060 28 70 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20 20  (p, pStmt);.    
2b070 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20 20    int iCol;..   
2b080 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 72     for(iCol=0; r
2b090 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2b0a0 69 43 6f 6c 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b  iCol<p->nColumn;
2b0b0 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
2b0c0 20 20 69 66 28 20 70 2d 3e 61 62 4e 6f 74 69 6e    if( p->abNotin
2b0d0 64 65 78 65 64 5b 69 43 6f 6c 5d 3d 3d 30 20 29  dexed[iCol]==0 )
2b0e0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  {.          cons
2b0f0 74 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d 20  t char *zText = 
2b100 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
2b110 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
2b120 74 28 70 53 74 6d 74 2c 20 69 43 6f 6c 2b 31 29  t(pStmt, iCol+1)
2b130 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
2b140 6e 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33 5f  nText = sqlite3_
2b150 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
2b160 6d 74 2c 20 69 43 6f 6c 2b 31 29 3b 0a 20 20 20  mt, iCol+1);.   
2b170 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74         sqlite3_t
2b180 6f 6b 65 6e 69 7a 65 72 5f 63 75 72 73 6f 72 20  okenizer_cursor 
2b190 2a 70 54 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  *pT = 0;..      
2b1a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b1b0 46 74 73 33 4f 70 65 6e 54 6f 6b 65 6e 69 7a 65  Fts3OpenTokenize
2b1c0 72 28 70 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 2c  r(p->pTokenizer,
2b1d0 20 69 4c 61 6e 67 2c 20 7a 54 65 78 74 2c 20 6e   iLang, zText, n
2b1e0 54 65 78 74 2c 26 70 54 29 3b 0a 20 20 20 20 20  Text,&pT);.     
2b1f0 20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d       while( rc==
2b200 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b210 20 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f           char co
2b220 6e 73 74 20 2a 7a 54 6f 6b 65 6e 3b 20 20 20 20  nst *zToken;    
2b230 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
2b240 74 61 69 6e 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f  taining token */
2b250 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
2b260 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 20 20 20 20   nToken = 0;    
2b270 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2b280 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 6f 6b   of bytes in tok
2b290 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  en */.          
2b2a0 20 20 69 6e 74 20 69 44 75 6d 31 20 3d 20 30 2c    int iDum1 = 0,
2b2b0 20 69 44 75 6d 32 20 3d 20 30 3b 20 2f 2a 20 44   iDum2 = 0; /* D
2b2c0 75 6d 6d 79 20 76 61 72 69 61 62 6c 65 73 20 2a  ummy variables *
2b2d0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  /.            in
2b2e0 74 20 69 50 6f 73 20 3d 20 30 3b 20 20 20 20 20  t iPos = 0;     
2b2f0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74          /* Posit
2b300 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20  ion of token in 
2b310 7a 54 65 78 74 20 2a 2f 0a 0a 20 20 20 20 20 20  zText */..      
2b320 20 20 20 20 20 20 72 63 20 3d 20 70 4d 6f 64 75        rc = pModu
2b330 6c 65 2d 3e 78 4e 65 78 74 28 70 54 2c 20 26 7a  le->xNext(pT, &z
2b340 54 6f 6b 65 6e 2c 20 26 6e 54 6f 6b 65 6e 2c 20  Token, &nToken, 
2b350 26 69 44 75 6d 31 2c 20 26 69 44 75 6d 32 2c 20  &iDum1, &iDum2, 
2b360 26 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20  &iPos);.        
2b370 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b380 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2b390 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
2b3a0 20 20 20 20 20 20 20 20 20 20 20 20 63 6b 73 75              cksu
2b3b0 6d 32 20 3d 20 63 6b 73 75 6d 32 20 5e 20 66 74  m2 = cksum2 ^ ft
2b3c0 73 33 43 68 65 63 6b 73 75 6d 45 6e 74 72 79 28  s3ChecksumEntry(
2b3d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b3e0 20 20 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65     zToken, nToke
2b3f0 6e 2c 20 69 4c 61 6e 67 2c 20 30 2c 20 69 44 6f  n, iLang, 0, iDo
2b400 63 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 0a  cid, iCol, iPos.
2b410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 3b                );
2b420 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
2b430 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 49 6e  or(i=1; i<p->nIn
2b440 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  dex; i++){.     
2b450 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2b460 2d 3e 61 49 6e 64 65 78 5b 69 5d 2e 6e 50 72 65  ->aIndex[i].nPre
2b470 66 69 78 3c 3d 6e 54 6f 6b 65 6e 20 29 7b 0a 20  fix<=nToken ){. 
2b480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b490 20 63 6b 73 75 6d 32 20 3d 20 63 6b 73 75 6d 32   cksum2 = cksum2
2b4a0 20 5e 20 66 74 73 33 43 68 65 63 6b 73 75 6d 45   ^ fts3ChecksumE
2b4b0 6e 74 72 79 28 0a 20 20 20 20 20 20 20 20 20 20  ntry(.          
2b4c0 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 6b              zTok
2b4d0 65 6e 2c 20 70 2d 3e 61 49 6e 64 65 78 5b 69 5d  en, p->aIndex[i]
2b4e0 2e 6e 50 72 65 66 69 78 2c 20 69 4c 61 6e 67 2c  .nPrefix, iLang,
2b4f0 20 69 2c 20 69 44 6f 63 69 64 2c 20 69 43 6f 6c   i, iDocid, iCol
2b500 2c 20 69 50 6f 73 0a 20 20 20 20 20 20 20 20 20  , iPos.         
2b510 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
2b520 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2b530 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2b540 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b550 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b560 20 20 69 66 28 20 70 54 20 29 20 70 4d 6f 64 75    if( pT ) pModu
2b570 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 54 29 3b 0a  le->xClose(pT);.
2b580 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2b590 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20  ==SQLITE_DONE ) 
2b5a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2b5b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b5c0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  }.    }..    sql
2b5d0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
2b5e0 74 6d 74 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 62  tmt);.  }..  *pb
2b5f0 4f 6b 20 3d 20 28 63 6b 73 75 6d 31 3d 3d 63 6b  Ok = (cksum1==ck
2b600 73 75 6d 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sum2);.  return 
2b610 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e  rc;.}../*.** Run
2b620 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63   the integrity-c
2b630 68 65 63 6b 2e 20 49 66 20 6e 6f 20 65 72 72 6f  heck. If no erro
2b640 72 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  r occurs and the
2b650 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
2b660 73 20 6f 66 0a 2a 2a 20 74 68 65 20 46 54 53 20  s of.** the FTS 
2b670 69 6e 64 65 78 20 61 72 65 20 63 6f 72 72 65 63  index are correc
2b680 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
2b690 5f 4f 4b 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  _OK. Or, if the 
2b6a0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
2b6b0 2a 2a 20 46 54 53 20 69 6e 64 65 78 20 61 72 65  ** FTS index are
2b6c0 20 69 6e 63 6f 72 72 65 63 74 2c 20 72 65 74 75   incorrect, retu
2b6d0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2b6e0 54 5f 56 54 41 42 2e 0a 2a 2a 0a 2a 2a 20 4f 72  T_VTAB..**.** Or
2b6f0 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 28 65  , if an error (e
2b700 2e 67 2e 20 61 6e 20 4f 4f 4d 20 6f 72 20 49 4f  .g. an OOM or IO
2b710 20 65 72 72 6f 72 29 20 6f 63 63 75 72 73 2c 20   error) occurs, 
2b720 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
2b730 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e   .** error code.
2b740 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67  .**.** The integ
2b750 72 69 74 79 2d 63 68 65 63 6b 20 77 6f 72 6b 73  rity-check works
2b760 20 61 73 20 66 6f 6c 6c 6f 77 73 2e 20 46 6f 72   as follows. For
2b770 20 65 61 63 68 20 74 6f 6b 65 6e 20 61 6e 64 20   each token and 
2b780 69 6e 64 65 78 65 64 20 74 6f 6b 65 6e 0a 2a 2a  indexed token.**
2b790 20 70 72 65 66 69 78 20 69 6e 20 74 68 65 20 64   prefix in the d
2b7a0 6f 63 75 6d 65 6e 74 20 73 65 74 2c 20 61 20 36  ocument set, a 6
2b7b0 34 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 69  4-bit checksum i
2b7c0 73 20 63 61 6c 63 75 6c 61 74 65 64 20 28 62 79  s calculated (by
2b7d0 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 66 74 73 33   code.** in fts3
2b7e0 43 68 65 63 6b 73 75 6d 45 6e 74 72 79 28 29 29  ChecksumEntry())
2b7f0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 66 6f   based on the fo
2b800 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2b810 20 20 20 2b 20 54 68 65 20 69 6e 64 65 78 20 6e     + The index n
2b820 75 6d 62 65 72 20 28 30 20 66 6f 72 20 74 68 65  umber (0 for the
2b830 20 6d 61 69 6e 20 69 6e 64 65 78 2c 20 31 20 66   main index, 1 f
2b840 6f 72 20 74 68 65 20 66 69 72 73 74 20 70 72 65  or the first pre
2b850 66 69 78 0a 2a 2a 20 20 20 20 20 20 20 69 6e 64  fix.**       ind
2b860 65 78 20 65 74 63 2e 29 2c 0a 2a 2a 20 20 20 20  ex etc.),.**    
2b870 20 2b 20 54 68 65 20 74 6f 6b 65 6e 20 28 6f 72   + The token (or
2b880 20 74 6f 6b 65 6e 20 70 72 65 66 69 78 29 20 74   token prefix) t
2b890 65 78 74 20 69 74 73 65 6c 66 2c 20 0a 2a 2a 20  ext itself, .** 
2b8a0 20 20 20 20 2b 20 54 68 65 20 6c 61 6e 67 75 61      + The langua
2b8b0 67 65 2d 69 64 20 6f 66 20 74 68 65 20 72 6f 77  ge-id of the row
2b8c0 20 69 74 20 61 70 70 65 61 72 73 20 69 6e 2c 0a   it appears in,.
2b8d0 2a 2a 20 20 20 20 20 2b 20 54 68 65 20 64 6f 63  **     + The doc
2b8e0 69 64 20 6f 66 20 74 68 65 20 72 6f 77 20 69 74  id of the row it
2b8f0 20 61 70 70 65 61 72 73 20 69 6e 2c 0a 2a 2a 20   appears in,.** 
2b900 20 20 20 20 2b 20 54 68 65 20 63 6f 6c 75 6d 6e      + The column
2b910 20 69 74 20 61 70 70 65 61 72 73 20 69 6e 2c 20   it appears in, 
2b920 61 6e 64 0a 2a 2a 20 20 20 20 20 2b 20 54 68 65  and.**     + The
2b930 20 74 6f 6b 65 6e 73 20 70 6f 73 69 74 69 6f 6e   tokens position
2b940 20 77 69 74 68 69 6e 20 74 68 61 74 20 63 6f 6c   within that col
2b950 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  umn..**.** The c
2b960 68 65 63 6b 73 75 6d 73 20 66 6f 72 20 61 6c 6c  hecksums for all
2b970 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
2b980 69 6e 64 65 78 20 61 72 65 20 58 4f 52 65 64 20  index are XORed 
2b990 74 6f 67 65 74 68 65 72 20 74 6f 20 63 72 65 61  together to crea
2b9a0 74 65 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 63  te.** a single c
2b9b0 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20  hecksum for the 
2b9c0 65 6e 74 69 72 65 20 69 6e 64 65 78 2e 0a 2a 2a  entire index..**
2b9d0 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67 72 69 74  .** The integrit
2b9e0 79 2d 63 68 65 63 6b 20 63 6f 64 65 20 63 61 6c  y-check code cal
2b9f0 63 75 6c 61 74 65 73 20 74 68 65 20 73 61 6d 65  culates the same
2ba00 20 63 68 65 63 6b 73 75 6d 20 69 6e 20 74 77 6f   checksum in two
2ba10 20 77 61 79 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   ways:.**.**    
2ba20 20 31 2e 20 42 79 20 73 63 61 6e 6e 69 6e 67 20   1. By scanning 
2ba30 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2ba40 74 68 65 20 46 54 53 20 69 6e 64 65 78 2c 20 61  the FTS index, a
2ba50 6e 64 20 0a 2a 2a 20 20 20 20 20 32 2e 20 42 79  nd .**     2. By
2ba60 20 73 63 61 6e 6e 69 6e 67 20 61 6e 64 20 74 6f   scanning and to
2ba70 6b 65 6e 69 7a 69 6e 67 20 74 68 65 20 63 6f 6e  kenizing the con
2ba80 74 65 6e 74 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tent table..**.*
2ba90 2a 20 49 66 20 74 68 65 20 74 77 6f 20 63 68 65  * If the two che
2baa0 63 6b 73 75 6d 73 20 61 72 65 20 69 64 65 6e 74  cksums are ident
2bab0 69 63 61 6c 2c 20 74 68 65 20 69 6e 74 65 67 72  ical, the integr
2bac0 69 74 79 2d 63 68 65 63 6b 20 69 73 20 64 65 65  ity-check is dee
2bad0 6d 65 64 20 74 6f 20 68 61 76 65 0a 2a 2a 20 70  med to have.** p
2bae0 61 73 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  assed..*/.static
2baf0 20 69 6e 74 20 66 74 73 33 44 6f 49 6e 74 65 67   int fts3DoInteg
2bb00 72 69 74 79 43 68 65 63 6b 28 0a 20 20 46 74 73  rityCheck(.  Fts
2bb10 33 54 61 62 6c 65 20 2a 70 20 20 20 20 20 20 20  3Table *p       
2bb20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bb30 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c  FTS3 table handl
2bb40 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
2bb50 3b 0a 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b  ;.  int bOk = 0;
2bb60 0a 20 20 72 63 20 3d 20 66 74 73 33 49 6e 74 65  .  rc = fts3Inte
2bb70 67 72 69 74 79 43 68 65 63 6b 28 70 2c 20 26 62  grityCheck(p, &b
2bb80 4f 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  Ok);.  if( rc==S
2bb90 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 3d  QLITE_OK && bOk=
2bba0 3d 30 20 29 20 72 63 20 3d 20 46 54 53 5f 43 4f  =0 ) rc = FTS_CO
2bbb0 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 72 65  RRUPT_VTAB;.  re
2bbc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2bbd0 2a 20 48 61 6e 64 6c 65 20 61 20 27 73 70 65 63  * Handle a 'spec
2bbe0 69 61 6c 27 20 49 4e 53 45 52 54 20 6f 66 20 74  ial' INSERT of t
2bbf0 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
2bc00 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62   "INSERT INTO tb
2bc10 6c 28 74 62 6c 29 20 56 41 4c 55 45 53 28 3c 65  l(tbl) VALUES(<e
2bc20 78 70 72 3e 29 22 0a 2a 2a 0a 2a 2a 20 41 72 67  xpr>)".**.** Arg
2bc30 75 6d 65 6e 74 20 70 56 61 6c 20 63 6f 6e 74 61  ument pVal conta
2bc40 69 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f  ins the result o
2bc50 66 20 3c 65 78 70 72 3e 2e 20 43 75 72 72 65 6e  f <expr>. Curren
2bc60 74 6c 79 20 74 68 65 20 6f 6e 6c 79 20 0a 2a 2a  tly the only .**
2bc70 20 6d 65 61 6e 69 6e 67 66 75 6c 20 76 61 6c 75   meaningful valu
2bc80 65 20 74 6f 20 69 6e 73 65 72 74 20 69 73 20 74  e to insert is t
2bc90 68 65 20 74 65 78 74 20 27 6f 70 74 69 6d 69 7a  he text 'optimiz
2bca0 65 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e'..*/.static in
2bcb0 74 20 66 74 73 33 53 70 65 63 69 61 6c 49 6e 73  t fts3SpecialIns
2bcc0 65 72 74 28 46 74 73 33 54 61 62 6c 65 20 2a 70  ert(Fts3Table *p
2bcd0 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
2bce0 2a 70 56 61 6c 29 7b 0a 20 20 69 6e 74 20 72 63  *pVal){.  int rc
2bcf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2bd00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2bd10 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 63 6f  urn Code */.  co
2bd20 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d  nst char *zVal =
2bd30 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
2bd40 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
2bd50 74 28 70 56 61 6c 29 3b 0a 20 20 69 6e 74 20 6e  t(pVal);.  int n
2bd60 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Val = sqlite3_va
2bd70 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c 29 3b  lue_bytes(pVal);
2bd80 0a 0a 20 20 69 66 28 20 21 7a 56 61 6c 20 29 7b  ..  if( !zVal ){
2bd90 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2bda0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
2bdb0 65 20 69 66 28 20 6e 56 61 6c 3d 3d 38 20 26 26  e if( nVal==8 &&
2bdc0 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e   0==sqlite3_strn
2bdd0 69 63 6d 70 28 7a 56 61 6c 2c 20 22 6f 70 74 69  icmp(zVal, "opti
2bde0 6d 69 7a 65 22 2c 20 38 29 20 29 7b 0a 20 20 20  mize", 8) ){.   
2bdf0 20 72 63 20 3d 20 66 74 73 33 44 6f 4f 70 74 69   rc = fts3DoOpti
2be00 6d 69 7a 65 28 70 2c 20 30 29 3b 0a 20 20 7d 65  mize(p, 0);.  }e
2be10 6c 73 65 20 69 66 28 20 6e 56 61 6c 3d 3d 37 20  lse if( nVal==7 
2be20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  && 0==sqlite3_st
2be30 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22 72 65  rnicmp(zVal, "re
2be40 62 75 69 6c 64 22 2c 20 37 29 20 29 7b 0a 20 20  build", 7) ){.  
2be50 20 20 72 63 20 3d 20 66 74 73 33 44 6f 52 65 62    rc = fts3DoReb
2be60 75 69 6c 64 28 70 29 3b 0a 20 20 7d 65 6c 73 65  uild(p);.  }else
2be70 20 69 66 28 20 6e 56 61 6c 3d 3d 31 35 20 26 26   if( nVal==15 &&
2be80 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e   0==sqlite3_strn
2be90 69 63 6d 70 28 7a 56 61 6c 2c 20 22 69 6e 74 65  icmp(zVal, "inte
2bea0 67 72 69 74 79 2d 63 68 65 63 6b 22 2c 20 31 35  grity-check", 15
2beb0 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  ) ){.    rc = ft
2bec0 73 33 44 6f 49 6e 74 65 67 72 69 74 79 43 68 65  s3DoIntegrityChe
2bed0 63 6b 28 70 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ck(p);.  }else i
2bee0 66 28 20 6e 56 61 6c 3e 36 20 26 26 20 30 3d 3d  f( nVal>6 && 0==
2bef0 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
2bf00 28 7a 56 61 6c 2c 20 22 6d 65 72 67 65 3d 22 2c  (zVal, "merge=",
2bf10 20 36 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20   6) ){.    rc = 
2bf20 66 74 73 33 44 6f 49 6e 63 72 6d 65 72 67 65 28  fts3DoIncrmerge(
2bf30 70 2c 20 26 7a 56 61 6c 5b 36 5d 29 3b 0a 20 20  p, &zVal[6]);.  
2bf40 7d 65 6c 73 65 20 69 66 28 20 6e 56 61 6c 3e 31  }else if( nVal>1
2bf50 30 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f  0 && 0==sqlite3_
2bf60 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22  strnicmp(zVal, "
2bf70 61 75 74 6f 6d 65 72 67 65 3d 22 2c 20 31 30 29  automerge=", 10)
2bf80 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
2bf90 33 44 6f 41 75 74 6f 69 6e 63 72 6d 65 72 67 65  3DoAutoincrmerge
2bfa0 28 70 2c 20 26 7a 56 61 6c 5b 31 30 5d 29 3b 0a  (p, &zVal[10]);.
2bfb0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2bfc0 53 54 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  ST.  }else if( n
2bfd0 56 61 6c 3e 39 20 26 26 20 30 3d 3d 73 71 6c 69  Val>9 && 0==sqli
2bfe0 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61  te3_strnicmp(zVa
2bff0 6c 2c 20 22 6e 6f 64 65 73 69 7a 65 3d 22 2c 20  l, "nodesize=", 
2c000 39 29 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4e 6f  9) ){.    p->nNo
2c010 64 65 53 69 7a 65 20 3d 20 61 74 6f 69 28 26 7a  deSize = atoi(&z
2c020 56 61 6c 5b 39 5d 29 3b 0a 20 20 20 20 72 63 20  Val[9]);.    rc 
2c030 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
2c040 65 6c 73 65 20 69 66 28 20 6e 56 61 6c 3e 31 31  else if( nVal>11
2c050 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73   && 0==sqlite3_s
2c060 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22 6d  trnicmp(zVal, "m
2c070 61 78 70 65 6e 64 69 6e 67 3d 22 2c 20 39 29 20  axpending=", 9) 
2c080 29 7b 0a 20 20 20 20 70 2d 3e 6e 4d 61 78 50 65  ){.    p->nMaxPe
2c090 6e 64 69 6e 67 44 61 74 61 20 3d 20 61 74 6f 69  ndingData = atoi
2c0a0 28 26 7a 56 61 6c 5b 31 31 5d 29 3b 0a 20 20 20  (&zVal[11]);.   
2c0b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2c0c0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 61  .  }else if( nVa
2c0d0 6c 3e 32 31 20 26 26 20 30 3d 3d 73 71 6c 69 74  l>21 && 0==sqlit
2c0e0 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c  e3_strnicmp(zVal
2c0f0 2c 20 22 74 65 73 74 2d 6e 6f 2d 69 6e 63 72 2d  , "test-no-incr-
2c100 64 6f 63 6c 69 73 74 3d 22 2c 20 32 31 29 20 29  doclist=", 21) )
2c110 7b 0a 20 20 20 20 70 2d 3e 62 4e 6f 49 6e 63 72  {.    p->bNoIncr
2c120 44 6f 63 6c 69 73 74 20 3d 20 61 74 6f 69 28 26  Doclist = atoi(&
2c130 7a 56 61 6c 5b 32 31 5d 29 3b 0a 20 20 20 20 72  zVal[21]);.    r
2c140 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  c = SQLITE_OK;.#
2c150 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
2c160 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
2c170 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
2c180 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
2c190 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
2c1a0 45 5f 46 54 53 34 5f 44 45 46 45 52 52 45 44 0a  E_FTS4_DEFERRED.
2c1b0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c  /*.** Delete all
2c1c0 20 63 61 63 68 65 64 20 64 65 66 65 72 72 65 64   cached deferred
2c1d0 20 64 6f 63 6c 69 73 74 73 2e 20 44 65 66 65 72   doclists. Defer
2c1e0 72 65 64 20 64 6f 63 6c 69 73 74 73 20 61 72 65  red doclists are
2c1f0 20 63 61 63 68 65 64 0a 2a 2a 20 28 61 6c 6c 6f   cached.** (allo
2c200 63 61 74 65 64 29 20 62 79 20 74 68 65 20 73 71  cated) by the sq
2c210 6c 69 74 65 33 46 74 73 33 43 61 63 68 65 44 65  lite3Fts3CacheDe
2c220 66 65 72 72 65 64 44 6f 63 6c 69 73 74 73 28 29  ferredDoclists()
2c230 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   function..*/.vo
2c240 69 64 20 73 71 6c 69 74 65 33 46 74 73 33 46 72  id sqlite3Fts3Fr
2c250 65 65 44 65 66 65 72 72 65 64 44 6f 63 6c 69 73  eeDeferredDoclis
2c260 74 73 28 46 74 73 33 43 75 72 73 6f 72 20 2a 70  ts(Fts3Cursor *p
2c270 43 73 72 29 7b 0a 20 20 46 74 73 33 44 65 66 65  Csr){.  Fts3Defe
2c280 72 72 65 64 54 6f 6b 65 6e 20 2a 70 44 65 66 3b  rredToken *pDef;
2c290 0a 20 20 66 6f 72 28 70 44 65 66 3d 70 43 73 72  .  for(pDef=pCsr
2c2a0 2d 3e 70 44 65 66 65 72 72 65 64 3b 20 70 44 65  ->pDeferred; pDe
2c2b0 66 3b 20 70 44 65 66 3d 70 44 65 66 2d 3e 70 4e  f; pDef=pDef->pN
2c2c0 65 78 74 29 7b 0a 20 20 20 20 66 74 73 33 50 65  ext){.    fts3Pe
2c2d0 6e 64 69 6e 67 4c 69 73 74 44 65 6c 65 74 65 28  ndingListDelete(
2c2e0 70 44 65 66 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  pDef->pList);.  
2c2f0 20 20 70 44 65 66 2d 3e 70 4c 69 73 74 20 3d 20    pDef->pList = 
2c300 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
2c310 46 72 65 65 20 61 6c 6c 20 65 6e 74 72 69 65 73  Free all entries
2c320 20 69 6e 20 74 68 65 20 70 43 73 72 2d 3e 70 44   in the pCsr->pD
2c330 65 66 66 65 72 65 64 20 6c 69 73 74 2e 20 45 6e  effered list. En
2c340 74 72 69 65 73 20 61 72 65 20 61 64 64 65 64 20  tries are added 
2c350 74 6f 20 0a 2a 2a 20 74 68 69 73 20 6c 69 73 74  to .** this list
2c360 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 46 74   using sqlite3Ft
2c370 73 33 44 65 66 65 72 54 6f 6b 65 6e 28 29 2e 0a  s3DeferToken()..
2c380 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
2c390 74 73 33 46 72 65 65 44 65 66 65 72 72 65 64 54  ts3FreeDeferredT
2c3a0 6f 6b 65 6e 73 28 46 74 73 33 43 75 72 73 6f 72  okens(Fts3Cursor
2c3b0 20 2a 70 43 73 72 29 7b 0a 20 20 46 74 73 33 44   *pCsr){.  Fts3D
2c3c0 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70 44  eferredToken *pD
2c3d0 65 66 3b 0a 20 20 46 74 73 33 44 65 66 65 72 72  ef;.  Fts3Deferr
2c3e0 65 64 54 6f 6b 65 6e 20 2a 70 4e 65 78 74 3b 0a  edToken *pNext;.
2c3f0 20 20 66 6f 72 28 70 44 65 66 3d 70 43 73 72 2d    for(pDef=pCsr-
2c400 3e 70 44 65 66 65 72 72 65 64 3b 20 70 44 65 66  >pDeferred; pDef
2c410 3b 20 70 44 65 66 3d 70 4e 65 78 74 29 7b 0a 20  ; pDef=pNext){. 
2c420 20 20 20 70 4e 65 78 74 20 3d 20 70 44 65 66 2d     pNext = pDef-
2c430 3e 70 4e 65 78 74 3b 0a 20 20 20 20 66 74 73 33  >pNext;.    fts3
2c440 50 65 6e 64 69 6e 67 4c 69 73 74 44 65 6c 65 74  PendingListDelet
2c450 65 28 70 44 65 66 2d 3e 70 4c 69 73 74 29 3b 0a  e(pDef->pList);.
2c460 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2c470 28 70 44 65 66 29 3b 0a 20 20 7d 0a 20 20 70 43  (pDef);.  }.  pC
2c480 73 72 2d 3e 70 44 65 66 65 72 72 65 64 20 3d 20  sr->pDeferred = 
2c490 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  0;.}../*.** Gene
2c4a0 72 61 74 65 20 64 65 66 65 72 72 65 64 2d 64 6f  rate deferred-do
2c4b0 63 6c 69 73 74 73 20 66 6f 72 20 61 6c 6c 20 74  clists for all t
2c4c0 6f 6b 65 6e 73 20 69 6e 20 74 68 65 20 70 43 73  okens in the pCs
2c4d0 72 2d 3e 70 44 65 66 65 72 72 65 64 20 6c 69 73  r->pDeferred lis
2c4e0 74 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74 68  t.** based on th
2c4f0 65 20 72 6f 77 20 74 68 61 74 20 70 43 73 72 20  e row that pCsr 
2c500 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
2c510 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 41 20 64 65 66   to..**.** A def
2c520 65 72 72 65 64 2d 64 6f 63 6c 69 73 74 20 69 73  erred-doclist is
2c530 20 6c 69 6b 65 20 61 6e 79 20 6f 74 68 65 72 20   like any other 
2c540 64 6f 63 6c 69 73 74 20 77 69 74 68 20 70 6f 73  doclist with pos
2c550 69 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ition informatio
2c560 6e 0a 2a 2a 20 69 6e 63 6c 75 64 65 64 2c 20 65  n.** included, e
2c570 78 63 65 70 74 20 74 68 61 74 20 69 74 20 6f 6e  xcept that it on
2c580 6c 79 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72  ly contains entr
2c590 69 65 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ies for a single
2c5a0 20 72 6f 77 20 6f 66 20 74 68 65 0a 2a 2a 20 74   row of the.** t
2c5b0 61 62 6c 65 2c 20 6e 6f 74 20 66 6f 72 20 61 6c  able, not for al
2c5c0 6c 20 72 6f 77 73 2e 0a 2a 2f 0a 69 6e 74 20 73  l rows..*/.int s
2c5d0 71 6c 69 74 65 33 46 74 73 33 43 61 63 68 65 44  qlite3Fts3CacheD
2c5e0 65 66 65 72 72 65 64 44 6f 63 6c 69 73 74 73 28  eferredDoclists(
2c5f0 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72  Fts3Cursor *pCsr
2c600 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2c610 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2c620 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2c630 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20 70 43 73  ode */.  if( pCs
2c640 72 2d 3e 70 44 65 66 65 72 72 65 64 20 29 7b 0a  r->pDeferred ){.
2c650 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
2c660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c670 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
2c680 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 61 62  rate through tab
2c690 6c 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  le columns */.  
2c6a0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
2c6b0 69 44 6f 63 69 64 3b 20 20 20 20 20 20 20 20 20  iDocid;         
2c6c0 2f 2a 20 44 6f 63 69 64 20 6f 66 20 74 68 65 20  /* Docid of the 
2c6d0 72 6f 77 20 70 43 73 72 20 70 6f 69 6e 74 73 20  row pCsr points 
2c6e0 74 6f 20 2a 2f 0a 20 20 20 20 46 74 73 33 44 65  to */.    Fts3De
2c6f0 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70 44 65  ferredToken *pDe
2c700 66 3b 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20  f;      /* Used 
2c710 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
2c720 67 68 20 64 65 66 65 72 72 65 64 20 74 6f 6b 65  gh deferred toke
2c730 6e 73 20 2a 2f 0a 20 20 0a 20 20 20 20 46 74 73  ns */.  .    Fts
2c740 33 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73  3Table *p = (Fts
2c750 33 54 61 62 6c 65 20 2a 29 70 43 73 72 2d 3e 62  3Table *)pCsr->b
2c760 61 73 65 2e 70 56 74 61 62 3b 0a 20 20 20 20 73  ase.pVtab;.    s
2c770 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
2c780 20 2a 70 54 20 3d 20 70 2d 3e 70 54 6f 6b 65 6e   *pT = p->pToken
2c790 69 7a 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  izer;.    sqlite
2c7a0 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75  3_tokenizer_modu
2c7b0 6c 65 20 63 6f 6e 73 74 20 2a 70 4d 6f 64 75 6c  le const *pModul
2c7c0 65 20 3d 20 70 54 2d 3e 70 4d 6f 64 75 6c 65 3b  e = pT->pModule;
2c7d0 0a 20 20 20 0a 20 20 20 20 61 73 73 65 72 74 28  .   .    assert(
2c7e0 20 70 43 73 72 2d 3e 69 73 52 65 71 75 69 72 65   pCsr->isRequire
2c7f0 53 65 65 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Seek==0 );.    i
2c800 44 6f 63 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  Docid = sqlite3_
2c810 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 43 73  column_int64(pCs
2c820 72 2d 3e 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  r->pStmt, 0);.  
2c830 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2c840 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 72 63  p->nColumn && rc
2c850 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
2c860 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
2c870 61 62 4e 6f 74 69 6e 64 65 78 65 64 5b 69 5d 3d  abNotindexed[i]=
2c880 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =0 ){.        co
2c890 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 20  nst char *zText 
2c8a0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
2c8b0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
2c8c0 65 78 74 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c  ext(pCsr->pStmt,
2c8d0 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73   i+1);.        s
2c8e0 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
2c8f0 5f 63 75 72 73 6f 72 20 2a 70 54 43 20 3d 20 30  _cursor *pTC = 0
2c900 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ;..        rc = 
2c910 73 71 6c 69 74 65 33 46 74 73 33 4f 70 65 6e 54  sqlite3Fts3OpenT
2c920 6f 6b 65 6e 69 7a 65 72 28 70 54 2c 20 70 43 73  okenizer(pT, pCs
2c930 72 2d 3e 69 4c 61 6e 67 69 64 2c 20 7a 54 65 78  r->iLangid, zTex
2c940 74 2c 20 2d 31 2c 20 26 70 54 43 29 3b 0a 20 20  t, -1, &pTC);.  
2c950 20 20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d        while( rc=
2c960 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c970 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e          char con
2c980 73 74 20 2a 7a 54 6f 6b 65 6e 3b 20 20 20 20 20  st *zToken;     
2c990 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
2c9a0 61 69 6e 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a  aining token */.
2c9b0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 54            int nT
2c9c0 6f 6b 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  oken = 0;       
2c9d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2c9e0 20 62 79 74 65 73 20 69 6e 20 74 6f 6b 65 6e 20   bytes in token 
2c9f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  */.          int
2ca00 20 69 44 75 6d 31 20 3d 20 30 2c 20 69 44 75 6d   iDum1 = 0, iDum
2ca10 32 20 3d 20 30 3b 20 2f 2a 20 44 75 6d 6d 79 20  2 = 0; /* Dummy 
2ca20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20 20  variables */.   
2ca30 20 20 20 20 20 20 20 69 6e 74 20 69 50 6f 73 20         int iPos 
2ca40 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2ca50 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20   /* Position of 
2ca60 74 6f 6b 65 6e 20 69 6e 20 7a 54 65 78 74 20 2a  token in zText *
2ca70 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  /..          rc 
2ca80 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78 74  = pModule->xNext
2ca90 28 70 54 43 2c 20 26 7a 54 6f 6b 65 6e 2c 20 26  (pTC, &zToken, &
2caa0 6e 54 6f 6b 65 6e 2c 20 26 69 44 75 6d 31 2c 20  nToken, &iDum1, 
2cab0 26 69 44 75 6d 32 2c 20 26 69 50 6f 73 29 3b 0a  &iDum2, &iPos);.
2cac0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 70 44            for(pD
2cad0 65 66 3d 70 43 73 72 2d 3e 70 44 65 66 65 72 72  ef=pCsr->pDeferr
2cae0 65 64 3b 20 70 44 65 66 20 26 26 20 72 63 3d 3d  ed; pDef && rc==
2caf0 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 44 65 66 3d  SQLITE_OK; pDef=
2cb00 70 44 65 66 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pDef->pNext){.  
2cb10 20 20 20 20 20 20 20 20 20 20 46 74 73 33 50 68            Fts3Ph
2cb20 72 61 73 65 54 6f 6b 65 6e 20 2a 70 50 54 20 3d  raseToken *pPT =
2cb30 20 70 44 65 66 2d 3e 70 54 6f 6b 65 6e 3b 0a 20   pDef->pToken;. 
2cb40 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
2cb50 70 44 65 66 2d 3e 69 43 6f 6c 3e 3d 70 2d 3e 6e  pDef->iCol>=p->n
2cb60 43 6f 6c 75 6d 6e 20 7c 7c 20 70 44 65 66 2d 3e  Column || pDef->
2cb70 69 43 6f 6c 3d 3d 69 29 0a 20 20 20 20 20 20 20  iCol==i).       
2cb80 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 54           && (pPT
2cb90 2d 3e 62 46 69 72 73 74 3d 3d 30 20 7c 7c 20 69  ->bFirst==0 || i
2cba0 50 6f 73 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  Pos==0).        
2cbb0 20 20 20 20 20 20 20 20 26 26 20 28 70 50 54 2d          && (pPT-
2cbc0 3e 6e 3d 3d 6e 54 6f 6b 65 6e 20 7c 7c 20 28 70  >n==nToken || (p
2cbd0 50 54 2d 3e 69 73 50 72 65 66 69 78 20 26 26 20  PT->isPrefix && 
2cbe0 70 50 54 2d 3e 6e 3c 6e 54 6f 6b 65 6e 29 29 0a  pPT->n<nToken)).
2cbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc00 26 26 20 28 30 3d 3d 6d 65 6d 63 6d 70 28 7a 54  && (0==memcmp(zT
2cc10 6f 6b 65 6e 2c 20 70 50 54 2d 3e 7a 2c 20 70 50  oken, pPT->z, pP
2cc20 54 2d 3e 6e 29 29 0a 20 20 20 20 20 20 20 20 20  T->n)).         
2cc30 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2cc40 20 20 20 20 20 20 66 74 73 33 50 65 6e 64 69 6e        fts3Pendin
2cc50 67 4c 69 73 74 41 70 70 65 6e 64 28 26 70 44 65  gListAppend(&pDe
2cc60 66 2d 3e 70 4c 69 73 74 2c 20 69 44 6f 63 69 64  f->pList, iDocid
2cc70 2c 20 69 2c 20 69 50 6f 73 2c 20 26 72 63 29 3b  , i, iPos, &rc);
2cc80 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2cc90 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2cca0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2ccb0 20 70 54 43 20 29 20 70 4d 6f 64 75 6c 65 2d 3e   pTC ) pModule->
2ccc0 78 43 6c 6f 73 65 28 70 54 43 29 3b 0a 20 20 20  xClose(pTC);.   
2ccd0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2cce0 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20  ITE_DONE ) rc = 
2ccf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2cd00 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
2cd10 72 28 70 44 65 66 3d 70 43 73 72 2d 3e 70 44 65  r(pDef=pCsr->pDe
2cd20 66 65 72 72 65 64 3b 20 70 44 65 66 20 26 26 20  ferred; pDef && 
2cd30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70  rc==SQLITE_OK; p
2cd40 44 65 66 3d 70 44 65 66 2d 3e 70 4e 65 78 74 29  Def=pDef->pNext)
2cd50 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  {.      if( pDef
2cd60 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ->pList ){.     
2cd70 20 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64     rc = fts3Pend
2cd80 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 61 72  ingListAppendVar
2cd90 69 6e 74 28 26 70 44 65 66 2d 3e 70 4c 69 73 74  int(&pDef->pList
2cda0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
2cdb0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
2cdc0 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c  n rc;.}..int sql
2cdd0 69 74 65 33 46 74 73 33 44 65 66 65 72 72 65 64  ite3Fts3Deferred
2cde0 54 6f 6b 65 6e 4c 69 73 74 28 0a 20 20 46 74 73  TokenList(.  Fts
2cdf0 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a  3DeferredToken *
2ce00 70 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 70 44  p, .  char **ppD
2ce10 61 74 61 2c 20 0a 20 20 69 6e 74 20 2a 70 6e 44  ata, .  int *pnD
2ce20 61 74 61 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70  ata.){.  char *p
2ce30 52 65 74 3b 0a 20 20 69 6e 74 20 6e 53 6b 69 70  Ret;.  int nSkip
2ce40 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
2ce50 34 20 64 75 6d 6d 79 3b 0a 0a 20 20 2a 70 70 44  4 dummy;..  *ppD
2ce60 61 74 61 20 3d 20 30 3b 0a 20 20 2a 70 6e 44 61  ata = 0;.  *pnDa
2ce70 74 61 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ta = 0;..  if( p
2ce80 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ->pList==0 ){.  
2ce90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2cea0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20  OK;.  }..  pRet 
2ceb0 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
2cec0 33 5f 6d 61 6c 6c 6f 63 28 70 2d 3e 70 4c 69 73  3_malloc(p->pLis
2ced0 74 2d 3e 6e 44 61 74 61 29 3b 0a 20 20 69 66 28  t->nData);.  if(
2cee0 20 21 70 52 65 74 20 29 20 72 65 74 75 72 6e 20   !pRet ) return 
2cef0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20  SQLITE_NOMEM;.. 
2cf00 20 6e 53 6b 69 70 20 3d 20 73 71 6c 69 74 65 33   nSkip = sqlite3
2cf10 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 70 2d  Fts3GetVarint(p-
2cf20 3e 70 4c 69 73 74 2d 3e 61 44 61 74 61 2c 20 26  >pList->aData, &
2cf30 64 75 6d 6d 79 29 3b 0a 20 20 2a 70 6e 44 61 74  dummy);.  *pnDat
2cf40 61 20 3d 20 70 2d 3e 70 4c 69 73 74 2d 3e 6e 44  a = p->pList->nD
2cf50 61 74 61 20 2d 20 6e 53 6b 69 70 3b 0a 20 20 2a  ata - nSkip;.  *
2cf60 70 70 44 61 74 61 20 3d 20 70 52 65 74 3b 0a 20  ppData = pRet;. 
2cf70 20 0a 20 20 6d 65 6d 63 70 79 28 70 52 65 74 2c   .  memcpy(pRet,
2cf80 20 26 70 2d 3e 70 4c 69 73 74 2d 3e 61 44 61 74   &p->pList->aDat
2cf90 61 5b 6e 53 6b 69 70 5d 2c 20 2a 70 6e 44 61 74  a[nSkip], *pnDat
2cfa0 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  a);.  return SQL
2cfb0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2cfc0 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 66 6f   Add an entry fo
2cfd0 72 20 74 6f 6b 65 6e 20 70 54 6f 6b 65 6e 20 74  r token pToken t
2cfe0 6f 20 74 68 65 20 70 43 73 72 2d 3e 70 44 65 66  o the pCsr->pDef
2cff0 65 72 72 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 69  erred list..*/.i
2d000 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 44 65  nt sqlite3Fts3De
2d010 66 65 72 54 6f 6b 65 6e 28 0a 20 20 46 74 73 33  ferToken(.  Fts3
2d020 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20  Cursor *pCsr,   
2d030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2d040 74 73 33 20 74 61 62 6c 65 20 63 75 72 73 6f 72  ts3 table cursor
2d050 20 2a 2f 0a 20 20 46 74 73 33 50 68 72 61 73 65   */.  Fts3Phrase
2d060 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20  Token *pToken,  
2d070 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 74        /* Token t
2d080 6f 20 64 65 66 65 72 20 2a 2f 0a 20 20 69 6e 74  o defer */.  int
2d090 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20   iCol           
2d0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d0b0 43 6f 6c 75 6d 6e 20 74 68 61 74 20 74 6f 6b 65  Column that toke
2d0c0 6e 20 6d 75 73 74 20 61 70 70 65 61 72 20 69 6e  n must appear in
2d0d0 20 28 6f 72 20 2d 31 29 20 2a 2f 0a 29 7b 0a 20   (or -1) */.){. 
2d0e0 20 46 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b   Fts3DeferredTok
2d0f0 65 6e 20 2a 70 44 65 66 65 72 72 65 64 3b 0a 20  en *pDeferred;. 
2d100 20 70 44 65 66 65 72 72 65 64 20 3d 20 73 71 6c   pDeferred = sql
2d110 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
2d120 6f 66 28 2a 70 44 65 66 65 72 72 65 64 29 29 3b  of(*pDeferred));
2d130 0a 20 20 69 66 28 20 21 70 44 65 66 65 72 72 65  .  if( !pDeferre
2d140 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
2d150 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2d160 7d 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 66 65  }.  memset(pDefe
2d170 72 72 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  rred, 0, sizeof(
2d180 2a 70 44 65 66 65 72 72 65 64 29 29 3b 0a 20 20  *pDeferred));.  
2d190 70 44 65 66 65 72 72 65 64 2d 3e 70 54 6f 6b 65  pDeferred->pToke
2d1a0 6e 20 3d 20 70 54 6f 6b 65 6e 3b 0a 20 20 70 44  n = pToken;.  pD
2d1b0 65 66 65 72 72 65 64 2d 3e 70 4e 65 78 74 20 3d  eferred->pNext =
2d1c0 20 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64   pCsr->pDeferred
2d1d0 3b 20 0a 20 20 70 44 65 66 65 72 72 65 64 2d 3e  ; .  pDeferred->
2d1e0 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 70  iCol = iCol;.  p
2d1f0 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64 20 3d  Csr->pDeferred =
2d200 20 70 44 65 66 65 72 72 65 64 3b 0a 0a 20 20 61   pDeferred;..  a
2d210 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 70  ssert( pToken->p
2d220 44 65 66 65 72 72 65 64 3d 3d 30 20 29 3b 0a 20  Deferred==0 );. 
2d230 20 70 54 6f 6b 65 6e 2d 3e 70 44 65 66 65 72 72   pToken->pDeferr
2d240 65 64 20 3d 20 70 44 65 66 65 72 72 65 64 3b 0a  ed = pDeferred;.
2d250 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2d260 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
2d270 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 76 61 6c 75  *.** SQLite valu
2d280 65 20 70 52 6f 77 69 64 20 63 6f 6e 74 61 69 6e  e pRowid contain
2d290 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 61  s the rowid of a
2d2a0 20 72 6f 77 20 74 68 61 74 20 6d 61 79 20 6f 72   row that may or
2d2b0 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 70   may not be.** p
2d2c0 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 46 54  resent in the FT
2d2d0 53 33 20 74 61 62 6c 65 2e 20 49 66 20 69 74 20  S3 table. If it 
2d2e0 69 73 2c 20 64 65 6c 65 74 65 20 69 74 20 61 6e  is, delete it an
2d2f0 64 20 61 64 6a 75 73 74 20 74 68 65 20 63 6f 6e  d adjust the con
2d300 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 73 75 62 73  tents.** of subs
2d310 69 64 75 61 72 79 20 64 61 74 61 20 73 74 72 75  iduary data stru
2d320 63 74 75 72 65 73 20 61 63 63 6f 72 64 69 6e 67  ctures according
2d330 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
2d340 74 20 66 74 73 33 44 65 6c 65 74 65 42 79 52 6f  t fts3DeleteByRo
2d350 77 69 64 28 0a 20 20 46 74 73 33 54 61 62 6c 65  wid(.  Fts3Table
2d360 20 2a 70 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f   *p, .  sqlite3_
2d370 76 61 6c 75 65 20 2a 70 52 6f 77 69 64 2c 20 0a  value *pRowid, .
2d380 20 20 69 6e 74 20 2a 70 6e 43 68 6e 67 2c 20 20    int *pnChng,  
2d390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d3a0 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 44 65 63    /* IN/OUT: Dec
2d3b0 72 65 6d 65 6e 74 20 69 66 20 72 6f 77 20 69 73  rement if row is
2d3c0 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 33   deleted */.  u3
2d3d0 32 20 2a 61 53 7a 44 65 6c 0a 29 7b 0a 20 20 69  2 *aSzDel.){.  i
2d3e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2d3f0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
2d400 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2d410 0a 20 20 69 6e 74 20 62 46 6f 75 6e 64 20 3d 20  .  int bFound = 
2d420 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2d430 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2a 70     /* True if *p
2d440 52 6f 77 69 64 20 72 65 61 6c 6c 79 20 69 73 20  Rowid really is 
2d450 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
2d460 0a 20 20 66 74 73 33 44 65 6c 65 74 65 54 65 72  .  fts3DeleteTer
2d470 6d 73 28 26 72 63 2c 20 70 2c 20 70 52 6f 77 69  ms(&rc, p, pRowi
2d480 64 2c 20 61 53 7a 44 65 6c 2c 20 26 62 46 6f 75  d, aSzDel, &bFou
2d490 6e 64 29 3b 0a 20 20 69 66 28 20 62 46 6f 75 6e  nd);.  if( bFoun
2d4a0 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
2d4b0 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73  OK ){.    int is
2d4c0 45 6d 70 74 79 20 3d 20 30 3b 20 20 20 20 20 20  Empty = 0;      
2d4d0 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
2d4e0 69 6e 67 20 2a 70 52 6f 77 69 64 20 6c 65 61 76  ing *pRowid leav
2d4f0 65 73 20 74 68 65 20 74 61 62 6c 65 20 65 6d 70  es the table emp
2d500 74 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66  ty */.    rc = f
2d510 74 73 33 49 73 45 6d 70 74 79 28 70 2c 20 70 52  ts3IsEmpty(p, pR
2d520 6f 77 69 64 2c 20 26 69 73 45 6d 70 74 79 29 3b  owid, &isEmpty);
2d530 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2d540 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d550 69 66 28 20 69 73 45 6d 70 74 79 20 29 7b 0a 20  if( isEmpty ){. 
2d560 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 69         /* Deleti
2d570 6e 67 20 74 68 69 73 20 72 6f 77 20 6d 65 61 6e  ng this row mean
2d580 73 20 74 68 65 20 77 68 6f 6c 65 20 74 61 62 6c  s the whole tabl
2d590 65 20 69 73 20 65 6d 70 74 79 2e 20 49 6e 20 74  e is empty. In t
2d5a0 68 69 73 20 63 61 73 65 0a 20 20 20 20 20 20 20  his case.       
2d5b0 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 63   ** delete the c
2d5c0 6f 6e 74 65 6e 74 73 20 6f 66 20 61 6c 6c 20 74  ontents of all t
2d5d0 68 72 65 65 20 74 61 62 6c 65 73 20 61 6e 64 20  hree tables and 
2d5e0 74 68 72 6f 77 20 61 77 61 79 20 61 6e 79 0a 20  throw away any. 
2d5f0 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69         ** data i
2d600 6e 20 74 68 65 20 70 65 6e 64 69 6e 67 54 65 72  n the pendingTer
2d610 6d 73 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  ms hash table.  
2d620 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
2d630 66 74 73 33 44 65 6c 65 74 65 41 6c 6c 28 70 2c  fts3DeleteAll(p,
2d640 20 31 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 6e   1);.        *pn
2d650 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  Chng = 0;.      
2d660 20 20 6d 65 6d 73 65 74 28 61 53 7a 44 65 6c 2c    memset(aSzDel,
2d670 20 30 2c 20 73 69 7a 65 6f 66 28 75 33 32 29 20   0, sizeof(u32) 
2d680 2a 20 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29  * (p->nColumn+1)
2d690 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c   * 2);.      }el
2d6a0 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 6e 43  se{.        *pnC
2d6b0 68 6e 67 20 3d 20 2a 70 6e 43 68 6e 67 20 2d 20  hng = *pnChng - 
2d6c0 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  1;.        if( p
2d6d0 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d 30  ->zContentTbl==0
2d6e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74   ){.          ft
2d6f0 73 33 53 71 6c 45 78 65 63 28 26 72 63 2c 20 70  s3SqlExec(&rc, p
2d700 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 43 4f 4e  , SQL_DELETE_CON
2d710 54 45 4e 54 2c 20 26 70 52 6f 77 69 64 29 3b 0a  TENT, &pRowid);.
2d720 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d730 20 20 69 66 28 20 70 2d 3e 62 48 61 73 44 6f 63    if( p->bHasDoc
2d740 73 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  size ){.        
2d750 20 20 66 74 73 33 53 71 6c 45 78 65 63 28 26 72    fts3SqlExec(&r
2d760 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45  c, p, SQL_DELETE
2d770 5f 44 4f 43 53 49 5a 45 2c 20 26 70 52 6f 77 69  _DOCSIZE, &pRowi
2d780 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  d);.        }.  
2d790 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2d7a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2d7b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2d7c0 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 77 6f  tion does the wo
2d7d0 72 6b 20 66 6f 72 20 74 68 65 20 78 55 70 64 61  rk for the xUpda
2d7e0 74 65 20 6d 65 74 68 6f 64 20 6f 66 20 46 54 53  te method of FTS
2d7f0 33 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62  3 virtual.** tab
2d800 6c 65 73 2e 20 54 68 65 20 73 63 68 65 6d 61 20  les. The schema 
2d810 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  of the virtual t
2d820 61 62 6c 65 20 62 65 69 6e 67 3a 0a 2a 2a 0a 2a  able being:.**.*
2d830 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
2d840 4c 45 20 3c 74 61 62 6c 65 20 6e 61 6d 65 3e 28  LE <table name>(
2d850 20 0a 2a 2a 20 20 20 20 20 20 20 3c 75 73 65 72   .**       <user
2d860 20 63 6f 6c 75 6d 6e 73 3e 2c 0a 2a 2a 20 20 20   columns>,.**   
2d870 20 20 20 20 3c 74 61 62 6c 65 20 6e 61 6d 65 3e      <table name>
2d880 20 48 49 44 44 45 4e 2c 20 0a 2a 2a 20 20 20 20   HIDDEN, .**    
2d890 20 20 20 64 6f 63 69 64 20 48 49 44 44 45 4e 2c     docid HIDDEN,
2d8a0 20 0a 2a 2a 20 20 20 20 20 20 20 3c 6c 61 6e 67   .**       <lang
2d8b0 69 64 3e 20 48 49 44 44 45 4e 0a 2a 2a 20 20 20  id> HIDDEN.**   
2d8c0 20 20 29 3b 0a 2a 2a 0a 2a 2a 20 0a 2a 2f 0a 69    );.**.** .*/.i
2d8d0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 55 70  nt sqlite3Fts3Up
2d8e0 64 61 74 65 4d 65 74 68 6f 64 28 0a 20 20 73 71  dateMethod(.  sq
2d8f0 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
2d900 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
2d910 20 46 54 53 33 20 76 74 61 62 20 6f 62 6a 65 63   FTS3 vtab objec
2d920 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c  t */.  int nArg,
2d930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d940 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2d950 66 20 61 72 67 75 6d 65 6e 74 20 61 72 72 61 79  f argument array
2d960 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
2d970 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20 20 20 20  lue **apVal,    
2d980 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
2d990 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
2d9a0 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70   sqlite_int64 *p
2d9b0 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20  Rowid           
2d9c0 20 2f 2a 20 4f 55 54 3a 20 54 68 65 20 61 66 66   /* OUT: The aff
2d9d0 65 63 74 65 64 20 28 6f 72 20 65 66 66 65 63 74  ected (or effect
2d9e0 65 64 29 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a  ed) rowid */.){.
2d9f0 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20 3d    Fts3Table *p =
2da00 20 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 56   (Fts3Table *)pV
2da10 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  tab;.  int rc = 
2da20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2da30 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2da40 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   Code */.  int i
2da50 73 52 65 6d 6f 76 65 20 3d 20 30 3b 20 20 20 20  sRemove = 0;    
2da60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2da70 75 65 20 66 6f 72 20 61 6e 20 55 50 44 41 54 45  ue for an UPDATE
2da80 20 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20   or DELETE */.  
2da90 75 33 32 20 2a 61 53 7a 49 6e 73 20 3d 20 30 3b  u32 *aSzIns = 0;
2daa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dab0 2f 2a 20 53 69 7a 65 73 20 6f 66 20 69 6e 73 65  /* Sizes of inse
2dac0 72 74 65 64 20 64 6f 63 75 6d 65 6e 74 73 20 2a  rted documents *
2dad0 2f 0a 20 20 75 33 32 20 2a 61 53 7a 44 65 6c 20  /.  u32 *aSzDel 
2dae0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2daf0 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20      /* Sizes of 
2db00 64 65 6c 65 74 65 64 20 64 6f 63 75 6d 65 6e 74  deleted document
2db10 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 6e 67  s */.  int nChng
2db20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2db30 20 20 20 20 20 20 20 2f 2a 20 4e 65 74 20 63 68         /* Net ch
2db40 61 6e 67 65 20 69 6e 20 6e 75 6d 62 65 72 20 6f  ange in number o
2db50 66 20 64 6f 63 75 6d 65 6e 74 73 20 2a 2f 0a 20  f documents */. 
2db60 20 69 6e 74 20 62 49 6e 73 65 72 74 44 6f 6e 65   int bInsertDone
2db70 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 41 74 20 74   = 0;..  /* At t
2db80 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 75 73  his point it mus
2db90 74 20 62 65 20 6b 6e 6f 77 6e 20 69 66 20 74 68  t be known if th
2dba0 65 20 25 5f 73 74 61 74 20 74 61 62 6c 65 20 65  e %_stat table e
2dbb0 78 69 73 74 73 20 6f 72 20 6e 6f 74 2e 0a 20 20  xists or not..  
2dbc0 2a 2a 20 53 6f 20 62 48 61 73 53 74 61 74 20 6d  ** So bHasStat m
2dbd0 61 79 20 6e 6f 74 20 62 65 20 32 2e 20 20 2a 2f  ay not be 2.  */
2dbe0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 48  .  assert( p->bH
2dbf0 61 73 53 74 61 74 3d 3d 30 20 7c 7c 20 70 2d 3e  asStat==0 || p->
2dc00 62 48 61 73 53 74 61 74 3d 3d 31 20 29 3b 0a 0a  bHasStat==1 );..
2dc10 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 65    assert( p->pSe
2dc20 67 6d 65 6e 74 73 3d 3d 30 20 29 3b 0a 20 20 61  gments==0 );.  a
2dc30 73 73 65 72 74 28 20 0a 20 20 20 20 20 20 6e 41  ssert( .      nA
2dc40 72 67 3d 3d 31 20 20 20 20 20 20 20 20 20 20 20  rg==1           
2dc50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 45 4c            /* DEL
2dc60 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a  ETE operations *
2dc70 2f 0a 20 20 20 7c 7c 20 6e 41 72 67 3d 3d 28 32  /.   || nArg==(2
2dc80 20 2b 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b 20   + p->nColumn + 
2dc90 33 29 20 20 2f 2a 20 49 4e 53 45 52 54 20 6f 72  3)  /* INSERT or
2dca0 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f   UPDATE operatio
2dcb0 6e 73 20 2a 2f 0a 20 20 29 3b 0a 0a 20 20 2f 2a  ns */.  );..  /*
2dcc0 20 43 68 65 63 6b 20 66 6f 72 20 61 20 22 73 70   Check for a "sp
2dcd0 65 63 69 61 6c 22 20 49 4e 53 45 52 54 20 6f 70  ecial" INSERT op
2dce0 65 72 61 74 69 6f 6e 2e 20 4f 6e 65 20 6f 66 20  eration. One of 
2dcf0 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20  the form:.  **. 
2dd00 20 2a 2a 20 20 20 49 4e 53 45 52 54 20 49 4e 54   **   INSERT INT
2dd10 4f 20 78 79 7a 28 78 79 7a 29 20 56 41 4c 55 45  O xyz(xyz) VALUE
2dd20 53 28 27 63 6f 6d 6d 61 6e 64 27 29 3b 0a 20 20  S('command');.  
2dd30 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3e 31 20  */.  if( nArg>1 
2dd40 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 76  .   && sqlite3_v
2dd50 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b  alue_type(apVal[
2dd60 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  0])==SQLITE_NULL
2dd70 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f   .   && sqlite3_
2dd80 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c  value_type(apVal
2dd90 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 5d 29 21  [p->nColumn+2])!
2dda0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 0a 20 20  =SQLITE_NULL .  
2ddb0 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  ){.    rc = fts3
2ddc0 53 70 65 63 69 61 6c 49 6e 73 65 72 74 28 70 2c  SpecialInsert(p,
2ddd0 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d   apVal[p->nColum
2dde0 6e 2b 32 5d 29 3b 0a 20 20 20 20 67 6f 74 6f 20  n+2]);.    goto 
2ddf0 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20 20 7d 0a  update_out;.  }.
2de00 0a 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26  .  if( nArg>1 &&
2de10 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
2de20 6e 74 28 61 70 56 61 6c 5b 32 20 2b 20 70 2d 3e  nt(apVal[2 + p->
2de30 6e 43 6f 6c 75 6d 6e 20 2b 20 32 5d 29 3c 30 20  nColumn + 2])<0 
2de40 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
2de50 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
2de60 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f 6f     goto update_o
2de70 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c  ut;.  }..  /* Al
2de80 6c 6f 63 61 74 65 20 73 70 61 63 65 20 74 6f 20  locate space to 
2de90 68 6f 6c 64 20 74 68 65 20 63 68 61 6e 67 65 20  hold the change 
2dea0 69 6e 20 64 6f 63 75 6d 65 6e 74 20 73 69 7a 65  in document size
2deb0 73 20 2a 2f 0a 20 20 61 53 7a 44 65 6c 20 3d 20  s */.  aSzDel = 
2dec0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
2ded0 73 69 7a 65 6f 66 28 61 53 7a 44 65 6c 5b 30 5d  sizeof(aSzDel[0]
2dee0 29 2a 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29  )*(p->nColumn+1)
2def0 2a 32 20 29 3b 0a 20 20 69 66 28 20 61 53 7a 44  *2 );.  if( aSzD
2df00 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  el==0 ){.    rc 
2df10 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2df20 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65 5f      goto update_
2df30 6f 75 74 3b 0a 20 20 7d 0a 20 20 61 53 7a 49 6e  out;.  }.  aSzIn
2df40 73 20 3d 20 26 61 53 7a 44 65 6c 5b 70 2d 3e 6e  s = &aSzDel[p->n
2df50 43 6f 6c 75 6d 6e 2b 31 5d 3b 0a 20 20 6d 65 6d  Column+1];.  mem
2df60 73 65 74 28 61 53 7a 44 65 6c 2c 20 30 2c 20 73  set(aSzDel, 0, s
2df70 69 7a 65 6f 66 28 61 53 7a 44 65 6c 5b 30 5d 29  izeof(aSzDel[0])
2df80 2a 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 2a  *(p->nColumn+1)*
2df90 32 29 3b 0a 0a 20 20 72 63 20 3d 20 66 74 73 33  2);..  rc = fts3
2dfa0 57 72 69 74 65 6c 6f 63 6b 28 70 29 3b 0a 20 20  Writelock(p);.  
2dfb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2dfc0 4b 20 29 20 67 6f 74 6f 20 75 70 64 61 74 65 5f  K ) goto update_
2dfd0 6f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  out;..  /* If th
2dfe0 69 73 20 69 73 20 61 6e 20 49 4e 53 45 52 54 20  is is an INSERT 
2dff0 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 61 6e  operation, or an
2e000 20 55 50 44 41 54 45 20 74 68 61 74 20 6d 6f 64   UPDATE that mod
2e010 69 66 69 65 73 20 74 68 65 20 72 6f 77 69 64 0a  ifies the rowid.
2e020 20 20 2a 2a 20 76 61 6c 75 65 2c 20 74 68 65 6e    ** value, then
2e030 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
2e040 72 65 71 75 69 72 65 73 20 63 6f 6e 73 74 72 61  requires constra
2e050 69 6e 74 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20  int handling..  
2e060 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 6f  **.  ** If the o
2e070 6e 2d 63 6f 6e 66 6c 69 63 74 20 6d 6f 64 65 20  n-conflict mode 
2e080 69 73 20 52 45 50 4c 41 43 45 2c 20 74 68 69 73  is REPLACE, this
2e090 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
2e0a0 65 78 69 73 74 69 6e 67 20 72 6f 77 0a 20 20 2a  existing row.  *
2e0b0 2a 20 73 68 6f 75 6c 64 20 62 65 20 64 65 6c 65  * should be dele
2e0c0 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ted from the dat
2e0d0 61 62 61 73 65 20 62 65 66 6f 72 65 20 69 6e 73  abase before ins
2e0e0 65 72 74 69 6e 67 20 74 68 65 20 6e 65 77 20 72  erting the new r
2e0f0 6f 77 2e 20 4f 72 2c 0a 20 20 2a 2a 20 69 66 20  ow. Or,.  ** if 
2e100 74 68 65 20 6f 6e 2d 63 6f 6e 66 6c 69 63 74 20  the on-conflict 
2e110 6d 6f 64 65 20 69 73 20 6f 74 68 65 72 20 74 68  mode is other th
2e120 61 6e 20 52 45 50 4c 41 43 45 2c 20 74 68 65 6e  an REPLACE, then
2e130 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6d 75 73   this method mus
2e140 74 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68  t.  ** detect th
2e150 65 20 63 6f 6e 66 6c 69 63 74 20 61 6e 64 20 72  e conflict and r
2e160 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
2e170 53 54 52 41 49 4e 54 20 62 65 66 6f 72 65 20 62  STRAINT before b
2e180 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 20 20 2a 2a  eginning to.  **
2e190 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2e1a0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
2e1b0 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26 20    if( nArg>1 && 
2e1c0 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d  p->zContentTbl==
2e1d0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 6e 64  0 ){.    /* Find
2e1e0 20 74 68 65 20 76 61 6c 75 65 20 6f 62 6a 65 63   the value objec
2e1f0 74 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  t that holds the
2e200 20 6e 65 77 20 72 6f 77 69 64 20 76 61 6c 75 65   new rowid value
2e210 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
2e220 5f 76 61 6c 75 65 20 2a 70 4e 65 77 52 6f 77 69  _value *pNewRowi
2e230 64 20 3d 20 61 70 56 61 6c 5b 33 2b 70 2d 3e 6e  d = apVal[3+p->n
2e240 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 69 66 28  Column];.    if(
2e250 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
2e260 79 70 65 28 70 4e 65 77 52 6f 77 69 64 29 3d 3d  ype(pNewRowid)==
2e270 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20  SQLITE_NULL ){. 
2e280 20 20 20 20 20 70 4e 65 77 52 6f 77 69 64 20 3d       pNewRowid =
2e290 20 61 70 56 61 6c 5b 31 5d 3b 0a 20 20 20 20 7d   apVal[1];.    }
2e2a0 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ..    if( sqlite
2e2b0 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 4e 65  3_value_type(pNe
2e2c0 77 52 6f 77 69 64 29 21 3d 53 51 4c 49 54 45 5f  wRowid)!=SQLITE_
2e2d0 4e 55 4c 4c 20 26 26 20 28 20 0a 20 20 20 20 20  NULL && ( .     
2e2e0 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
2e2f0 5f 74 79 70 65 28 61 70 56 61 6c 5b 30 5d 29 3d  _type(apVal[0])=
2e300 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20 20 20  =SQLITE_NULL.   
2e310 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 76 61 6c    || sqlite3_val
2e320 75 65 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b 30  ue_int64(apVal[0
2e330 5d 29 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  ])!=sqlite3_valu
2e340 65 5f 69 6e 74 36 34 28 70 4e 65 77 52 6f 77 69  e_int64(pNewRowi
2e350 64 29 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20  d).    )){.     
2e360 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 77 69   /* The new rowi
2e370 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 69  d is not NULL (i
2e380 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
2e390 72 6f 77 69 64 20 77 69 6c 6c 20 62 65 0a 20 20  rowid will be.  
2e3a0 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
2e3b0 61 6c 6c 79 20 61 73 73 69 67 6e 65 64 20 61 6e  ally assigned an
2e3c0 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  d there is no ch
2e3d0 61 6e 63 65 20 6f 66 20 61 20 63 6f 6e 66 6c 69  ance of a confli
2e3e0 63 74 29 2c 20 61 6e 64 20 0a 20 20 20 20 20 20  ct), and .      
2e3f0 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
2e400 20 69 73 20 65 69 74 68 65 72 20 61 6e 20 49 4e   is either an IN
2e410 53 45 52 54 20 6f 72 20 61 6e 20 55 50 44 41 54  SERT or an UPDAT
2e420 45 20 74 68 61 74 20 6d 6f 64 69 66 69 65 73 20  E that modifies 
2e430 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77  the.      ** row
2e440 69 64 20 63 6f 6c 75 6d 6e 2e 20 53 6f 20 69 66  id column. So if
2e450 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 6d 6f   the conflict mo
2e460 64 65 20 69 73 20 52 45 50 4c 41 43 45 2c 20 74  de is REPLACE, t
2e470 68 65 6e 20 64 65 6c 65 74 65 20 61 6e 79 0a 20  hen delete any. 
2e480 20 20 20 20 20 2a 2a 20 65 78 69 73 74 69 6e 67       ** existing
2e490 20 72 6f 77 20 77 69 74 68 20 72 6f 77 69 64 3d   row with rowid=
2e4a0 70 4e 65 77 52 6f 77 69 64 2e 20 0a 20 20 20 20  pNewRowid. .    
2e4b0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 72    **.      ** Or
2e4c0 2c 20 69 66 20 74 68 65 20 63 6f 6e 66 6c 69 63  , if the conflic
2e4d0 74 20 6d 6f 64 65 20 69 73 20 6e 6f 74 20 52 45  t mode is not RE
2e4e0 50 4c 41 43 45 2c 20 69 6e 73 65 72 74 20 74 68  PLACE, insert th
2e4f0 65 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74  e new record int
2e500 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  o .      ** the 
2e510 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e  %_content table.
2e520 20 49 66 20 77 65 20 68 69 74 20 74 68 65 20 64   If we hit the d
2e530 75 70 6c 69 63 61 74 65 20 72 6f 77 69 64 20 63  uplicate rowid c
2e540 6f 6e 73 74 72 61 69 6e 74 20 28 6f 72 20 61 6e  onstraint (or an
2e550 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  y.      ** other
2e560 20 65 72 72 6f 72 29 20 77 68 69 6c 65 20 64 6f   error) while do
2e570 69 6e 67 20 73 6f 2c 20 72 65 74 75 72 6e 20 69  ing so, return i
2e580 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
2e590 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
2e5a0 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20 61 6c  is branch may al
2e5b0 73 6f 20 72 75 6e 20 69 66 20 70 4e 65 77 52 6f  so run if pNewRo
2e5c0 77 69 64 20 63 6f 6e 74 61 69 6e 73 20 61 20 76  wid contains a v
2e5d0 61 6c 75 65 20 74 68 61 74 20 63 61 6e 6e 6f 74  alue that cannot
2e5e0 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 6c 6f 73  .      ** be los
2e5f0 73 6c 65 73 73 6c 79 20 63 6f 6e 76 65 72 74 65  slessly converte
2e600 64 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e  d to an integer.
2e610 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
2e620 68 65 20 65 76 65 6e 74 75 61 6c 20 0a 20 20 20  he eventual .   
2e630 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 66 74     ** call to ft
2e640 73 33 49 6e 73 65 72 74 44 61 74 61 28 29 20 28  s3InsertData() (
2e650 65 69 74 68 65 72 20 6a 75 73 74 20 62 65 6c 6f  either just belo
2e660 77 20 6f 72 20 66 75 72 74 68 65 72 20 6f 6e 20  w or further on 
2e670 69 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a  in this.      **
2e680 20 66 75 6e 63 74 69 6f 6e 29 20 77 69 6c 6c 20   function) will 
2e690 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
2e6a0 53 4d 41 54 43 48 2e 20 49 66 20 66 74 73 33 44  SMATCH. If fts3D
2e6b0 65 6c 65 74 65 42 79 52 6f 77 69 64 20 69 73 20  eleteByRowid is 
2e6c0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 6f 6b 65  .      ** invoke
2e6d0 64 2c 20 69 74 20 77 69 6c 6c 20 64 65 6c 65 74  d, it will delet
2e6e0 65 20 7a 65 72 6f 20 72 6f 77 73 20 28 73 69 6e  e zero rows (sin
2e6f0 63 65 20 6e 6f 20 72 6f 77 20 77 69 6c 6c 20 68  ce no row will h
2e700 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 64 6f 63  ave.      ** doc
2e710 69 64 3d 24 70 4e 65 77 52 6f 77 69 64 20 69 66  id=$pNewRowid if
2e720 20 24 70 4e 65 77 52 6f 77 69 64 20 69 73 20 6e   $pNewRowid is n
2e730 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61  ot an integer va
2e740 6c 75 65 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lue)..      */. 
2e750 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2e760 5f 76 74 61 62 5f 6f 6e 5f 63 6f 6e 66 6c 69 63  _vtab_on_conflic
2e770 74 28 70 2d 3e 64 62 29 3d 3d 53 51 4c 49 54 45  t(p->db)==SQLITE
2e780 5f 52 45 50 4c 41 43 45 20 29 7b 0a 20 20 20 20  _REPLACE ){.    
2e790 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 65 6c      rc = fts3Del
2e7a0 65 74 65 42 79 52 6f 77 69 64 28 70 2c 20 70 4e  eteByRowid(p, pN
2e7b0 65 77 52 6f 77 69 64 2c 20 26 6e 43 68 6e 67 2c  ewRowid, &nChng,
2e7c0 20 61 53 7a 44 65 6c 29 3b 0a 20 20 20 20 20 20   aSzDel);.      
2e7d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
2e7e0 63 20 3d 20 66 74 73 33 49 6e 73 65 72 74 44 61  c = fts3InsertDa
2e7f0 74 61 28 70 2c 20 61 70 56 61 6c 2c 20 70 52 6f  ta(p, apVal, pRo
2e800 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 62 49  wid);.        bI
2e810 6e 73 65 72 74 44 6f 6e 65 20 3d 20 31 3b 0a 20  nsertDone = 1;. 
2e820 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2e830 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2e840 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
2e850 20 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20 20 7d   update_out;.  }
2e860 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
2e870 73 20 61 20 44 45 4c 45 54 45 20 6f 72 20 55 50  s a DELETE or UP
2e880 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 2c 20  DATE operation, 
2e890 72 65 6d 6f 76 65 20 74 68 65 20 6f 6c 64 20 72  remove the old r
2e8a0 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 69 66 28 20  ecord. */.  if( 
2e8b0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
2e8c0 70 65 28 61 70 56 61 6c 5b 30 5d 29 21 3d 53 51  pe(apVal[0])!=SQ
2e8d0 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20  LITE_NULL ){.   
2e8e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2e8f0 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61  _value_type(apVa
2e900 6c 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 49 4e  l[0])==SQLITE_IN
2e910 54 45 47 45 52 20 29 3b 0a 20 20 20 20 72 63 20  TEGER );.    rc 
2e920 3d 20 66 74 73 33 44 65 6c 65 74 65 42 79 52 6f  = fts3DeleteByRo
2e930 77 69 64 28 70 2c 20 61 70 56 61 6c 5b 30 5d 2c  wid(p, apVal[0],
2e940 20 26 6e 43 68 6e 67 2c 20 61 53 7a 44 65 6c 29   &nChng, aSzDel)
2e950 3b 0a 20 20 20 20 69 73 52 65 6d 6f 76 65 20 3d  ;.    isRemove =
2e960 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
2e970 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 49 4e  If this is an IN
2e980 53 45 52 54 20 6f 72 20 55 50 44 41 54 45 20 6f  SERT or UPDATE o
2e990 70 65 72 61 74 69 6f 6e 2c 20 69 6e 73 65 72 74  peration, insert
2e9a0 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 2e   the new record.
2e9b0 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3e 31   */.  if( nArg>1
2e9c0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2e9d0 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 61  K ){.    int iLa
2e9e0 6e 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76  ngid = sqlite3_v
2e9f0 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 32  alue_int(apVal[2
2ea00 20 2b 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b 20   + p->nColumn + 
2ea10 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 62 49 6e  2]);.    if( bIn
2ea20 73 65 72 74 44 6f 6e 65 3d 3d 30 20 29 7b 0a 20  sertDone==0 ){. 
2ea30 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e       rc = fts3In
2ea40 73 65 72 74 44 61 74 61 28 70 2c 20 61 70 56 61  sertData(p, apVa
2ea50 6c 2c 20 70 52 6f 77 69 64 29 3b 0a 20 20 20 20  l, pRowid);.    
2ea60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ea70 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70  _CONSTRAINT && p
2ea80 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d 30  ->zContentTbl==0
2ea90 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2eaa0 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41   FTS_CORRUPT_VTA
2eab0 42 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  B;.      }.    }
2eac0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2ead0 49 54 45 5f 4f 4b 20 26 26 20 28 21 69 73 52 65  ITE_OK && (!isRe
2eae0 6d 6f 76 65 20 7c 7c 20 2a 70 52 6f 77 69 64 21  move || *pRowid!
2eaf0 3d 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 20 29  =p->iPrevDocid )
2eb00 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
2eb10 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 44  ts3PendingTermsD
2eb20 6f 63 69 64 28 70 2c 20 30 2c 20 69 4c 61 6e 67  ocid(p, 0, iLang
2eb30 69 64 2c 20 2a 70 52 6f 77 69 64 29 3b 0a 20 20  id, *pRowid);.  
2eb40 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
2eb50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2eb60 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 50     assert( p->iP
2eb70 72 65 76 44 6f 63 69 64 3d 3d 2a 70 52 6f 77 69  revDocid==*pRowi
2eb80 64 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  d );.      rc = 
2eb90 66 74 73 33 49 6e 73 65 72 74 54 65 72 6d 73 28  fts3InsertTerms(
2eba0 70 2c 20 69 4c 61 6e 67 69 64 2c 20 61 70 56 61  p, iLangid, apVa
2ebb0 6c 2c 20 61 53 7a 49 6e 73 29 3b 0a 20 20 20 20  l, aSzIns);.    
2ebc0 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 48 61  }.    if( p->bHa
2ebd0 73 44 6f 63 73 69 7a 65 20 29 7b 0a 20 20 20 20  sDocsize ){.    
2ebe0 20 20 66 74 73 33 49 6e 73 65 72 74 44 6f 63 73    fts3InsertDocs
2ebf0 69 7a 65 28 26 72 63 2c 20 70 2c 20 61 53 7a 49  ize(&rc, p, aSzI
2ec00 6e 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  ns);.    }.    n
2ec10 43 68 6e 67 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69  Chng++;.  }..  i
2ec20 66 28 20 70 2d 3e 62 46 74 73 34 20 29 7b 0a 20  f( p->bFts4 ){. 
2ec30 20 20 20 66 74 73 33 55 70 64 61 74 65 44 6f 63     fts3UpdateDoc
2ec40 54 6f 74 61 6c 73 28 26 72 63 2c 20 70 2c 20 61  Totals(&rc, p, a
2ec50 53 7a 49 6e 73 2c 20 61 53 7a 44 65 6c 2c 20 6e  SzIns, aSzDel, n
2ec60 43 68 6e 67 29 3b 0a 20 20 7d 0a 0a 20 75 70 64  Chng);.  }.. upd
2ec70 61 74 65 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ate_out:.  sqlit
2ec80 65 33 5f 66 72 65 65 28 61 53 7a 44 65 6c 29 3b  e3_free(aSzDel);
2ec90 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65  .  sqlite3Fts3Se
2eca0 67 6d 65 6e 74 73 43 6c 6f 73 65 28 70 29 3b 0a  gmentsClose(p);.
2ecb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2ecc0 2f 2a 20 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79  /* .** Flush any
2ecd0 20 64 61 74 61 20 69 6e 20 74 68 65 20 70 65 6e   data in the pen
2ece0 64 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20  ding-terms hash 
2ecf0 74 61 62 6c 65 20 74 6f 20 64 69 73 6b 2e 20 49  table to disk. I
2ed00 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  f successful,.**
2ed10 20 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d 65   merge all segme
2ed20 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  nts in the datab
2ed30 61 73 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74  ase (including t
2ed40 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 2c 20  he new segment, 
2ed50 69 66 20 0a 2a 2a 20 74 68 65 72 65 20 77 61 73  if .** there was
2ed60 20 61 6e 79 20 64 61 74 61 20 74 6f 20 66 6c 75   any data to flu
2ed70 73 68 29 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  sh) into a singl
2ed80 65 20 73 65 67 6d 65 6e 74 2e 20 0a 2a 2f 0a 69  e segment. .*/.i
2ed90 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 4f 70  nt sqlite3Fts3Op
2eda0 74 69 6d 69 7a 65 28 46 74 73 33 54 61 62 6c 65  timize(Fts3Table
2edb0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
2edc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
2edd0 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 41 56 45  xec(p->db, "SAVE
2ede0 50 4f 49 4e 54 20 66 74 73 33 22 2c 20 30 2c 20  POINT fts3", 0, 
2edf0 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  0, 0);.  if( rc=
2ee00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ee10 20 20 72 63 20 3d 20 66 74 73 33 44 6f 4f 70 74    rc = fts3DoOpt
2ee20 69 6d 69 7a 65 28 70 2c 20 31 29 3b 0a 20 20 20  imize(p, 1);.   
2ee30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ee40 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  OK || rc==SQLITE
2ee50 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69  _DONE ){.      i
2ee60 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  nt rc2 = sqlite3
2ee70 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 52 45  _exec(p->db, "RE
2ee80 4c 45 41 53 45 20 66 74 73 33 22 2c 20 30 2c 20  LEASE fts3", 0, 
2ee90 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
2eea0 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
2eeb0 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20  ) rc = rc2;.    
2eec0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
2eed0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
2eee0 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 66 74   "ROLLBACK TO ft
2eef0 73 33 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  s3", 0, 0, 0);. 
2ef00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65       sqlite3_exe
2ef10 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c 45 41 53  c(p->db, "RELEAS
2ef20 45 20 66 74 73 33 22 2c 20 30 2c 20 30 2c 20 30  E fts3", 0, 0, 0
2ef30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
2ef40 71 6c 69 74 65 33 46 74 73 33 53 65 67 6d 65 6e  qlite3Fts3Segmen
2ef50 74 73 43 6c 6f 73 65 28 70 29 3b 0a 20 20 72 65  tsClose(p);.  re
2ef60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
2ef70 69 66 0a                                         if.